{ "cells": [ { "cell_type": "markdown", "metadata": { "id": "QHnVupBBn9eR" }, "source": [ "# Training and Evaluating FiftyOne Datasets with Detectron2\n", "\n", "FiftyOne has all of the building blocks necessary to develop high-quality datasets to train your models, as well as advanced model evaluation capabilities. To make use of these, FiftyOne easily integrates with your existing model training and inference pipelines. In this walktrhough we'll cover how you can use your FiftyOne datasets to train a model with [Detectron2](https://github.com/facebookresearch/detectron2), Facebook AI Reasearch's library for detection and segmentation algorithms.\n", "\n", "This walkthrough is based off of the [official Detectron2 tutorial](https://colab.research.google.com/drive/16jcaJoc6bCFAQ96jDe2HwtXj7BMD_-m5), augmented to load data to and from FiftyOne.\n", "\n", "\n", "Specifically, this walkthrough covers:\n", "\n", "- Loading a dataset from the FiftyOne Zoo, and splitting it into training/validation\n", "- Initializing a segmentation model from the detectron2 model zoo\n", "- Loading ground truth annotations from a FiftyOne dataset into a detectron2 model training pipeline and training the model\n", "- Loading predictions from a detectron2 model into a FiftyOne dataset\n", "- Evaluating model predictions in FiftyOne\n", "\n", "\n", "**So, what’s the takeaway?**\n", "\n", "By writing two simple functions, you can integrate FiftyOne into your Detectron2 model training and inference pipelines." ] }, { "cell_type": "markdown", "metadata": { "id": "sHAIvEZsgxyH" }, "source": [ "## Setup\n", "\n", "To get started, you need to install [FiftyOne](https://voxel51.com/docs/fiftyone/getting_started/install.html) and [detectron2](https://detectron2.readthedocs.io/en/latest/tutorials/install.html):" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "lG2a9JXZgvSh" }, "outputs": [], "source": [ "!pip install fiftyone" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "5xCYXOy_g2uh" }, "outputs": [], "source": [ "import fiftyone as fo\n", "import fiftyone.zoo as foz" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "FsePPpwZSmqt" }, "outputs": [], "source": [ "!python -m pip install pyyaml==5.1\n", "\n", "# Detectron2 has not released pre-built binaries for the latest pytorch (https://github.com/facebookresearch/detectron2/issues/4053)\n", "# so we install from source instead. This takes a few minutes.\n", "!python -m pip install 'git+https://github.com/facebookresearch/detectron2.git'\n", "\n", "# Install pre-built detectron2 that matches pytorch version, if released:\n", "# See https://detectron2.readthedocs.io/tutorials/install.html for instructions\n", "#!pip install detectron2 -f https://dl.fbaipublicfiles.com/detectron2/wheels/{CUDA_VERSION}/{TORCH_VERSION}/index.html" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "0d288Z2mF5dC", "outputId": "12d42152-f2d7-4d71-82dd-ff7ea3b0b1a8" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "nvcc: NVIDIA (R) Cuda compiler driver\n", "Copyright (c) 2005-2020 NVIDIA Corporation\n", "Built on Mon_Oct_12_20:09:46_PDT_2020\n", "Cuda compilation tools, release 11.1, V11.1.105\n", "Build cuda_11.1.TC455_06.29190527_0\n", "torch: 1.12 ; cuda: cu113\n", "detectron2: 0.6\n" ] } ], "source": [ "import torch, detectron2\n", "!nvcc --version\n", "TORCH_VERSION = \".\".join(torch.__version__.split(\".\")[:2])\n", "CUDA_VERSION = torch.__version__.split(\"+\")[-1]\n", "print(\"torch: \", TORCH_VERSION, \"; cuda: \", CUDA_VERSION)\n", "print(\"detectron2:\", detectron2.__version__)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "ZyAvNCJMmvFF" }, "outputs": [], "source": [ "# Setup detectron2 logger\n", "import detectron2\n", "from detectron2.utils.logger import setup_logger\n", "setup_logger()\n", "\n", "# import some common libraries\n", "import numpy as np\n", "import os, cv2\n", "\n", "# import some common detectron2 utilities\n", "from detectron2 import model_zoo\n", "from detectron2.engine import DefaultPredictor\n", "from detectron2.config import get_cfg\n", "from detectron2.data import MetadataCatalog, DatasetCatalog" ] }, { "cell_type": "markdown", "metadata": { "id": "b2bjrfb2LDeo" }, "source": [ "## Train on a FiftyOne dataset" ] }, { "cell_type": "markdown", "metadata": { "id": "tjbUIhSxUdm_" }, "source": [ "In this section, we show how to use a custom FiftyOne Dataset to train a detectron2 model.\n", "We'll train a license plate segmentation model from an existing model pre-trained on COCO dataset, available in detectron2's model zoo.\n", "\n", "Since the COCO dataset doesn't have a \"Vehicle registration plates\" category, we will be using segmentations of license plates from the Open Images v6 dataset in the [FiftyOne Dataset Zoo](https://voxel51.com/docs/fiftyone/user_guide/dataset_zoo/datasets.html#open-images-v6) to train the model to recognize this new category.\n", "\n", "\n", "## Prepare the dataset\n", "\n", "For this example, we will just use some of the samples from the official \"validation\" split of the dataset. To improve model performance, we could always add in more data from the official \"train\" split as well but that will take longer to train so we'll just stick to the \"validation\" split for this walkthrough." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "f1SnOsM9ijEq", "outputId": "6b8f7cde-951f-49f1-f5f1-b8deecf6f207" }, "outputs": [], "source": [ "dataset = foz.load_zoo_dataset(\n", " \"open-images-v6\", \n", " split=\"validation\", \n", " classes=[\"Vehicle registration plate\"], \n", " label_types=[\"segmentations\"],\n", " label_field=\"segmentations\",\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Specifying a `classes` when downloading a dataset from the zoo will ensure that only samples with one of the given classes will be present. However, these samples may still contain other labels, so we can use the powerful [filtering capability](https://voxel51.com/docs/fiftyone/user_guide/using_views.html#filtering) of FiftyOne to easily keep only the \"Vehicle registration plate\" labels.\n", "We will also untag these samples as \"validation\" and create our own split out of them." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "_PlG3hEuhVW0" }, "outputs": [], "source": [ "from fiftyone import ViewField as F\n", "\n", "# Remove other classes and existing tags\n", "dataset.filter_labels(\"segmentations\", F(\"label\") == \"Vehicle registration plate\").save()\n", "dataset.untag_samples(\"validation\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "gnFQLpvROpoL" }, "outputs": [], "source": [ "import fiftyone.utils.random as four\n", "\n", "four.random_split(dataset, {\"train\": 0.8, \"val\": 0.2})" ] }, { "cell_type": "markdown", "metadata": { "id": "tVJoOm6LVJwW" }, "source": [ "Next we will register the FiftyOne dataset to detectron2, following the [detectron2 custom dataset tutorial](https://detectron2.readthedocs.io/tutorials/datasets.html).\n", "Here, the dataset is in its custom format, therefore we write a function to parse it and prepare it into [detectron2's standard format](https://detectron2.readthedocs.io/en/latest/tutorials/datasets.html#standard-dataset-dicts).\n", "\n", "Note: In this example, we are specifically parsing the segmentations into bounding boxes and polylines. This function may require tweaks depending on the model being trained and the data it expects.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "PIbAM2pv-urF" }, "outputs": [], "source": [ "from detectron2.structures import BoxMode\n", "\n", "def get_fiftyone_dicts(samples):\n", " samples.compute_metadata()\n", "\n", " dataset_dicts = []\n", " for sample in samples.select_fields([\"id\", \"filepath\", \"metadata\", \"segmentations\"]):\n", " height = sample.metadata[\"height\"]\n", " width = sample.metadata[\"width\"]\n", " record = {}\n", " record[\"file_name\"] = sample.filepath\n", " record[\"image_id\"] = sample.id\n", " record[\"height\"] = height\n", " record[\"width\"] = width\n", " \n", " objs = []\n", " for det in sample.segmentations.detections:\n", " tlx, tly, w, h = det.bounding_box\n", " bbox = [int(tlx*width), int(tly*height), int(w*width), int(h*height)]\n", " fo_poly = det.to_polyline()\n", " poly = [(x*width, y*height) for x, y in fo_poly.points[0]]\n", " poly = [p for x in poly for p in x]\n", " obj = {\n", " \"bbox\": bbox,\n", " \"bbox_mode\": BoxMode.XYWH_ABS,\n", " \"segmentation\": [poly],\n", " \"category_id\": 0,\n", " }\n", " objs.append(obj)\n", "\n", " record[\"annotations\"] = objs\n", " dataset_dicts.append(record)\n", "\n", " return dataset_dicts\n", "\n", "for d in [\"train\", \"val\"]:\n", " view = dataset.match_tags(d)\n", " DatasetCatalog.register(\"fiftyone_\" + d, lambda view=view: get_fiftyone_dicts(view))\n", " MetadataCatalog.get(\"fiftyone_\" + d).set(thing_classes=[\"vehicle_registration_plate\"])\n", "\n", "metadata = MetadataCatalog.get(\"fiftyone_train\")" ] }, { "cell_type": "markdown", "metadata": { "id": "6ljbWTX0Wi8E" }, "source": [ "To verify the dataset is in correct format, let's visualize the annotations of the training set:\n", "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "OLsNgm-Zv-zM", "outputId": "cd200349-cb35-40e9-e253-cff402e98ded" }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [] }, { "data": { "text/html": [ "\n", "\n", "\n", "
\n", "
\n", " \n", "
\n", " \n", "
\n", "\n", "" ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dataset_dicts = get_fiftyone_dicts(dataset.match_tags(\"train\"))\n", "ids = [dd[\"image_id\"] for dd in dataset_dicts]\n", "\n", "view = dataset.select(ids)\n", "session = fo.launch_app(view)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "id": "juwgBJpSU186" }, "outputs": [], "source": [ "session.freeze() # screenshot the App" ] }, { "cell_type": "markdown", "metadata": { "id": "wlqXIXXhW8dA" }, "source": [ "## Load the model and train!\n", "\n", "Now, let's fine-tune a COCO-pretrained R50-FPN Mask R-CNN model on the FiftyOne dataset. It takes ~2 minutes to train 300 iterations on a P100 GPU.\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "7unkuuiqLdqd", "outputId": "771131b1-d68a-4cdf-e017-2969bc06e59a" }, "outputs": [], "source": [ "from detectron2.engine import DefaultTrainer\n", "\n", "cfg = get_cfg()\n", "cfg.merge_from_file(model_zoo.get_config_file(\"COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml\"))\n", "cfg.DATASETS.TRAIN = (\"fiftyone_train\",)\n", "cfg.DATASETS.TEST = ()\n", "cfg.DATALOADER.NUM_WORKERS = 2\n", "cfg.MODEL.WEIGHTS = model_zoo.get_checkpoint_url(\"COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml\") # Let training initialize from model zoo\n", "cfg.SOLVER.IMS_PER_BATCH = 2 # This is the real \"batch size\" commonly known to deep learning people\n", "cfg.SOLVER.BASE_LR = 0.00025 # pick a good LR\n", "cfg.SOLVER.MAX_ITER = 300 # 300 iterations seems good enough for this toy dataset; you will need to train longer for a practical dataset\n", "cfg.SOLVER.STEPS = [] # do not decay learning rate\n", "cfg.MODEL.ROI_HEADS.BATCH_SIZE_PER_IMAGE = 128 # The \"RoIHead batch size\". 128 is faster, and good enough for this toy dataset (default: 512)\n", "cfg.MODEL.ROI_HEADS.NUM_CLASSES = 1 # only has one class (Vehicle registration plate). (see https://detectron2.readthedocs.io/tutorials/datasets.html#update-the-config-for-new-datasets)\n", "# NOTE: this config means the number of classes, but a few popular unofficial tutorials incorrect uses num_classes+1 here.\n", "\n", "os.makedirs(cfg.OUTPUT_DIR, exist_ok=True)\n", "trainer = DefaultTrainer(cfg) \n", "trainer.resume_or_load(resume=False)\n", "trainer.train()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 856, "resources": { "https://localhost:6006/?tensorboardColab=true": { "data": "PCFkb2N0eXBlIGh0bWw+PG1ldGEgbmFtZT0idGItcmVsYXRpdmUtcm9vdCIgY29udGVudD0iLi8iPjwhZG9jdHlwZSBodG1sPjwhLS0KQGxpY2Vuc2UKQ29weXJpZ2h0IDIwMTkgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0+PGh0bWw+PGhlYWQ+PG1ldGEgY2hhcnNldD0idXRmLTgiPgo8dGl0bGU+VGVuc29yQm9hcmQ8L3RpdGxlPgo8bGluayByZWw9InNob3J0Y3V0IGljb24iIGhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBTVFBQUFERUNBWUFBQURBcG81ckFBQUFCSE5DU1ZRSUNBZ0lmQWhraUFBQUFBbHdTRmx6QUFCYWJnQUFXbTRCeFdzak9BQUFBQmwwUlZoMFUyOW1kSGRoY21VQWQzZDNMbWx1YTNOallYQmxMbTl5WjV2dVBCb0FBQmwwU1VSQlZIaWM3WjE1ZUZUVjNjYy92NXNGQ1ZSeHFWdHB0VlcyVmx4ZjYxcXRpcTBMOUdsOU5YVUJGRXBGUlRJaGhCQURDVGRBTUFFa0NZc0s3cUI5K2tENzJxZkJXaXZxVzdWYTY3NGlyZTlyYXhYMWJaVldaVEhML040LzVnNEdTR0R1ekwxejc1MDVuMzg0ek13NTU4dk0vWEsyM3prSERJR2ppemhQRjNGZTBEb01JRUVMeUdkMFBvT3dhQUF1Y1Y1YWgwVzVWUEI2a0xyeUdXT0lBRkNiL3ZTakVxZ0crdXp3S3dnZHdDMTBVQ2ZWL0RzWWhmbUxNVVFXVVJ1TEVrWUQ4eEVPMnY3R2pvWndQc3hIV014aElFdWxsSzVzNnN4bmpDR3loQzdnSkpSVzRDU2daeFAwbkg0Smk1aVU4N2pmR2czR0VMNmpUUXdFNWdHamtXN2ZkK3FHU0xLV0lzcGtNbS83SU5QZ1lBemhFMnBUUWgrcXNLZ0MrZ0x1VGJCcmVpdXdtSFlhWkRxZmVpcllBQmhEZUk0cVFpTVhBd3NRRHZQQUJEMmxOeUxVczRuYnhTYWV1V3BERW1NSUQ5RWJPUUZvUlRodCs0ditHQ0w1NTdOQXVjUjRLaTNCaGwwd2h2QUFiZUFRTEd4Z0FtRDVhb0x1NmNTZml2QUxsRXFKOFk1TDZZYWRNSWJJQUxVcHBvaHJFV1lqN0wzOWpld2FJcG5lakxLUXZXbVVjV3hMNlI5ZzJBVmppRFRSdVl6Q29nWDRCcEE5RTNSUDkveiszNEdaVXNiS1hxUWJkb014aEV1MGdhTVJtbEhPOXZBQi82T1RPdGtEUXlUU3lpTW81UkxqdFo3K0hZYWVzWUlXRUJYVVpqK2RTeXZ3UE1yWkhoVzdFV0VpbjNFYVV6a1ZvUlQ0bXljbEMrZGc4Ykl1WmFYZXdvR2VsSmtIbUJaaUQ2aE5JVVdNUjJrQUR2Q29WZGlLc0pqNHJ1c0p1cHdTUHFNS3FFS2M5WXZleWttOXprMUFFd2ZTTEtXMFkrZ1ZZNGpkb1BXY2cwVUx3bEhiWDh6Y0VHc1J5bVRhN2xlY3RZbUJGRGtyM095d3hwMk9JWkxwRFFoVDVUb2UyRjNkK1l3eFJBL29IQVpCdDdCc2IxcUZGeW1nWENyZHhTVHBJczRFV2hDTzNhWE05TFdzbzRDWVhNTWJiclRrQThZUTNWQ2IvZ2lWeUU1aDJaa1o0aU9FT1J5ZWZ0U3EybGdNWURUS2ZPQWdqM1Ixb054Q0lYVXkwWVNaSnpHR3dIbmdMT2VCNnlrc083MEhML0hBaVhmN0duUVovV252d2JEcGF3U2NNUFA5VEpnNUdFT2dzMU1JeTNiL3NLMGpUa3hxL09tU2FDdURVQnFRN1R2dHZPald2WWhRTHRma2Q1aDUzaHBDYlJkaDJhay9WQnRRS3FTRzMzZ3F0aGUwbFhPQUZ1QW9EOWRFMWxKQW1mdzBQOFBNODg0UWFsTUN6clJtcW1IWmUzNlFOaUUwOFRuTlltZDNXbE50Q3RtWDhZZ3pMZHk3UmpmcFJKaDVFUTN5ay93S004OGJReWdJZFZ5TXhRTFVaVmgyNys5M290eUpNRk5xK0lmWG10MmdpOWlQUW1ZQjF5RVVibjhqTTNPOGgxTERSRmFKb0o0S0RpbDVZUWl0NVFRa2c3RHNubDk3Rkl0eXFlWlZUOFZtaUM1aEtFb3o0aHhyNDAxWDZsbVVtRnpEMHg1S0RTVTViUWl0NFJDS3NORU13N0ozZk8wdGxCcVp5UnFQNVhxS0xtWVVRZ3ZpQkI5Q3B1WlE0RjQ2cUpKSmZPQ3AyQkNSazRaUW0ySTZQUXpMVHZ5WkNLL2VoeHVsak04OWx1d0xhbFBNL3M3M0FIdDcxRnBzUmxoSVlXNkdtZWVjSVhTRzUySFpjWVQ3RUtiSkRENzBWbTEyME9VY1FnYzI0clNVNE1YMzhoWkNqVXdJZDB2cGxwd3hoTjdBVUFwb0JzN3pjQXJ5R1pTWTFQR01oMUlEUTI5MnRyZ3FwM24ySFZrOFNwd3A4bE5lOFZCcVlFVGVFR3F6SHgzTVFyZ09uTm1Wekgvc2Q0RVoxT2JlN0lvcXdpM09JUWh3R09ERjk5V0pPTE50NDRPZGJjdVV5QnBDYlFycFlEeDRHcGE5QlZqQWwyaVNDclo2S0RkMDZISks2S1FLU1NITVBOVzB4U2JpTkxGM2RNUE1JMmtJclhGV2FMMEx5MWJnRnhRd1RXWjZ0RUVuSXVqaUZNTE0zYVlUWWVZVk1pNDdLL1plRWlsRDZFd0dFZmM4TFBzNUxNcWxqajk0cHpSNjZNMmM2VXhHN0JwbTdqYjl4V3ZyS0tSTXhyTGVPNlgrRWdsRHFPMUVlU3JWQ0gyMnY1R1pJVFlDOVdBTyswcWlOaFlITzRjeGR3OHpoMHpXYlJKUnZ4M1JDRE1QdFNIVXhtSXJvN0djSHdpOGFCWGFnVnNwWWFZNURySm5kQm45c2FqRWNzTE1JUk5ESkVtRW1mY05kNWg1YUEyaE4zUUx5L1p1R25VdFFreHMvdGREcVRtTDNzb2d4T21pWm02SVpQb0ZsSElaeHhOZWF2V0swQmxDcXhpSTFXMlFCMTYwQ2kraGxNc2NmdStwMkR4QlZ6RENpWTlLVEdKa1pvaGtlaTF4SnNzNC91cWwxa3dKalNIVXBvUXR6alFnOVBXb1ZVaHMzMXpQVWxrVDNtWTZDcWhOSVY5eFRoOFJKOHdjTWpFRUpLYTVsOUNYdVZMS1o5NHFUby9BRGFFZ1RPTml4RmtvY3YrbDlwUk9YRXZWVHAwMGhYOGdGeVgwZHZaRG1RVk1BZ295TkVReS9SNUNEYU9EWHdnTjFCQTZsUk93ZWduTFR0OFE2eERLWlk2NXVOQlA5RGFHQVl1UWJyZW5adjdiL1FtTG1JemVmcEpoMWduRUVGcnVoR1h2N3JSczkxL3FCdUpNbFhubXpLRnNvcmN6Q3B4Z1NtOWFkMFdjTVBOeDJROHp6Nm9obk83Uk5KUmFoUDQ5cW5EL3BYNE0xRlBFeldMVDZhMWlReXJvWGV4Rm5BcmdCcUMvUitPL1Q3Q1lReEdMc3hrR2t2VVdRaXM0emprTjc0d2VWYVJ1aUVSWWRoR1ZZdk4vZm1nMXVFT1hjd2lGUG9XWlg1R2RNUFBBeGhCYXlTaUVWdURycmcyaFBJb3dSZWJsUnNoeHJxRjNjd0pkenRqUXV6V2tSMUhLWmJTL1czYURIVlRiRkxPWmF4SG1BRi9hUVZIUFg4eGJXTlJJUTI1dFNzbEZWQkh1OWlITUhPNmtpSmxTNmsrWWVlRFRyZ0JheGFIQUxHQUMwbU5UbTlpMldFeWoyTG0zYlRHWDBlV1VVSnppYWVhcHB6ZWgxSE1veStRc2I4ZU5vVEJFRXEzaVA1eHUxS21Pc3NURzlpNnFaRUh1Ym16UEIvUTJCbExNUE5URE1ITjRFNHNLdVpRSHZkSVpLa09BTXhNMW5URUlGMk5oeXp4ZUNGcVR3VHYwTHI3cmhKa2ZzLzNGek0xeFAzRXE1WXJNWTlSQ1p3aEQ3cU0yRm9jN1llYVNRWmo1anVrT0xHNmhnMW9aelNmcGFqT0dNQVNHcnFZL1c3dWRaZzZadHhiQyt5ZzJGbmVrRTJadURHRUlITDJQUVhTbEVXYSt1elE4ajBXNWxQS2tHeTNHRUliUW9QZHdQc0lpaEtGQXBvYUF4S1gyRStUSDNKbXFCdGUza0dvNUU3U2NIN3JOWnpEc0NibVNCOW5LMGNCRTRKOWVGQWtjNmlhRCsydDVsU05SN3RjWTYvUjZ4OGtHZzBmSVJEcGtEQ3Zvd3hCZ01XUjNIMHM2aGloeVV1ZFF3Q3NhbzFXdjZ4YW9aekI0Z0pUeXNZd21ScHpod0crelZhOTdRMWpiRFFGUUJKUlJ4SHFOTWRZelZRYURnNHhsdll6bWZJUWZnUDk3NFROcElib3pFTGhIeTNqWWRLTU1maUNYMDBZUnc0QnlTSCtkWVUrNE53UTlHaUtCTUlJQ1h0WXBOS3JOWHVuTE1oaDJSVXBwbHl0b1JSZ0cvcHlsNWEwaEVoU2pUT2Rmdks0eFJxWWp5bURZSFhJWkc4R2Z2ZGQrR0NMSk54RGFkQXB0V3NuWDA2akhZTWc2WG8waGRzZEl1bmhkSzdCTk44b1FkaktkWlVxVnZpaXorSVRYdEpJTDA4aHZNR1NGYkxRUTNUbUNPR3UxZ2pZdDUvQU15akVZZk1IUE1jVHVHRWtCYjJpbDZVWVp3a1ZRaG9Ca04rcFRYdFZwWE9CUm1RWkRSZ1JwaUNSSG9qeWdVMm5UYXRPTk1nUkx0c2NRdlNPTXBKUFh0UXBiSjNlN0ZNVmd5Q0x1RFNFK0dTSkJDY29zK3ZDYVR1dDJacWpCa0NYQzBHWGFGZUZJNEVHdG9rMm5PbWY2R0F4WklKeUcrSUxFYkpUcFJobXlSTmdOQVZBQ3pLS0VWM1U2Mzg5eTNZWThJd3FHU0RJSStLMVcwNmJUK1ZwQUdndzVUcFFNa1VBWmliQmVxN0hWcGpoUUxZYWNJM3FHU0pEb1JtM2pWYTNtZTBHTE1lUU9VVFZFa3NFSUQra050T2tNdmhxMEdFUDBpYm9oa293a3pucXRNZDBvUTJia2lpRUErZ0d6YU9jVnJlSGNvTVVZb29rclEyamk0S2RDbjdSNHhSRGdkenJEZEtNTTduSFhRbHdkZWpOMFp5U3dYbWVhYmxSZUUzZDNHSUhiTGxOWXUwdTkwUTlsRmwyOHJETVpFYlFZUTFiWmpGTFBOaGE1eWVUT0VQdEd6aEFKbEtIQTczUW1LN1dHZzRLV1kvQVZCVmJSd1NDNURGdkd1YnVDelowaE9pTnFpQVFDaktHQURUcVRtTnFSNnY0WlVrSDVFeGFueWFXTWxURzhuMDRSN2d6UkZXbERKTmtIb1lVdW50TmFUZ3Rhak1FVDNrVzRra3M1V1VwNU9wT0MzQm5DcjgxQndYQU13aE5hWjdwUmtVWFpBdFJUd0dDNWxKVWltUjllNXM0UThad3lCQ1M3VVlXOHFYWEU5QklLZ2haa1NCRmhGVVVNbHN1d3BaU3QzaFhyQXIyZW9SU3czbFdwMFVxL2hEQkpiSjdDa0plNGF5R0tjcTZGMkpsamdTZlZacVhhSEJpMEdFUDJ5ZWN4Uk0rbzA0MkNEVnBQVEZlYmJsUStZUXpST3dOUVdsalBzenFiVTRJV1k4Z091YjVTN1FYSG9meEI2MW1wOC9oeTBHSU0vbUphaU5SSWRLTTYyYUJ6VERjcWwzRm5DTW43SUxsOVVWcll3SjkwTGljSExjYmdQYWJMbEE3SzhTaFA2UnpUamNvMVRKY3BmUkxkcUM3VGpjb2xUQXVST2ZzaXRQQVhudEhabkJTMEdFTm11RE5FZXJjSDVRZktDVmc4cFhOWnFUWUhCQzNIa0I2bWhmQVdDMkVNUld6UUJtSnFwN1ZuUFZSb013T0MxcEFKdXBxRDNYemU3USsyNXowRXJxS2pjcGI5Z0JhS2VWSWJPU1pvTWVtZ1N6aFVsN0tjWXVZRXJTVWRkQlZEOUdjOFFBZFQzZVJ6TzZoMk4rMXF6SEVLU2xuUUl0eWdOc1c2aEJnV2J5SmNUWG9uc3dTRzNzZStlaCtOV0x3QzdtK21jcmRyVENsSyt5SGZNZDltNERHZ2pTNmVvSWpIMEJ6ZGt4Q25QV2dKcWFMTEdJWFNDdEc3VjF4dExJNWdOTEFBMGcvTWRMdU5NcE14eE5zb0R3TnIyWWVIeFA3aVFkRktLb0Q3TWlnN3ZBZ2RRVXZZRTdxTVk0blRnbkptMEZyU1FlL2pMT0swSUJ5ZGFWbnVER0ZSNUdKUFVoZUovUVZyRWRya0pwN3Y3WU95a0o5cEpaZEREdDVoTGVGdElYUXArd04xeEprRTBWdEgwWlY4RFl1NUtHTzg2cDY3N3pMdG5zMkkweFVxNU5leWdBOWNLTG1lTHI1TDRnUyszRUhEMTBMb2NvcG81enJpMUNQc0U3UWV0K2hLK2lGTUE2YWo3T1hsV05XTEx0UGJDQThqdTNhRjNDQ04vRldyYUVDWmwzZ2huVkpDU01nTW9Zc1p3ZWUwQU44S1dvdGJWQkh1WlF4S0U3aWJUazJWZEF6eFJWY29UcHNzN3IwcjVKb1NGckNaVWhJNzEzSURLeHlHMEtVTXBvdEZLQmRHOFQ4YnZZc1RXVVVyK0xzM3haMGh1cmliSXVaTE14LzdJVVpzT3JXUzZ4Q2VwUHQwWDIvN29LTkJvR01JYldZQVFqVmRUSUhvUlN2clBYd0Z1QkVZVFJaK2ZWZUdrS1c4NlplUTdYVXM1R21keG5MZ1dyL3J5Z29CZFpuVXhtSkE1dE9RUWFHcjZjdFd5b0Fad0pleVZXODRGMTIyVVkzdzNoNC9GNFhXSW9CWkpyMkpzOWlIRjRCN2lLSVo3bUlVVzNnRHBaRXNtZ0ZDYWdoWndpZEFoYnRNL21qSm1DeTJFSG9UWDlWbVZtTHhLRVF2WkVUdjVIaTlpOGNSZmcwY0hvU0cwSjV2S2syczFtbU1SaGpsUHJNUGd0SWxDNGJRQmZURFlockNkR0F2dit2ekdyMkgvZW1pRGdsK1BTUzBoZ0RBNG5xVXM0RCthWmNSdkRsODZ6S3BJaXppWW9TRkVMMnJpblU1UlJSekhWM2hXUThKWlpjcGlUVHhEa0s5ZHdWNlZsTHErRFR0cWdzNWtVVThDYXdtaW1hNGt4RVU4UkpLQzRURERKQmxRNmhOb2JwOUxQdlNBcnpvdVpqc21HTVR5cXRlRnFoTkhLb0xXWTd3UitCVUw4dk9Cbm9IUS9SMkhuRGkycjRadEo2ZDhkMFFPcGsrT29VUldrRXJuL0F1VTdqS1RYNng2VVM1bXNTQ29ELzRZUTdsQXl6T2tocmU4S3pJaFZ4RUFYK0c2SVZsQStqdGpBZGVROXlIWldjTFg3NVVuVUpmbmNJb25jSktDdmtRZUJnb0F3NUNhTllxQnJvcFQrYnpISEN6SDFwM3JjeVRVdDZtZ085SU5TOTdVdG9YSEVPMFk3MkdFZkp4cTJmaXRKd0JLT2NpakVMNUVkQy9sNGRySDdxNEJWek9IaWt6RUg0RTdzeVVFZW1aNHpVSytiNU1aNlBIYWd4WklLTVdRaWV4djhZWXF6SGFVRDRrTWNBYnc1NW5oVVpxQlQ5MlU1Zk01MU1rOUx2UEhxZUEwNDBab290clEraGtCbW9aVjJ1TU5ncDVuOFJxNkVqY3hza0lTN1hTM1NxcU5ISS95cTljMWVNVmUyNHQxbExDZVZMTnY3T2d4dUFUN2k1dUwrY2lMTjVCV0U3Q0JKbnNvRHVBT00ydWN5bVRJT0NIYm1kektQZnlaUzZTQ3U5dXNqRUVnOXNydGZyaDVaeU1jTGxPNVlldXNzeG5JOG9zenpSa2lzVVN1cmhTSm9ZanpOdVFHY0ZQM1FrM2F6WDd1c3JUbHlYQUgvMFJsRElLMU1zTXlzUW1IckFXZzBjRWJ3ZzRoRTZhM0dRUW16Z1dFeUd3LzVXN1VLNlJXdXlBNmpmNFJCZ01BVEJCcC9FOU54bGtIcThBUzN6U3N6dmFFUzZUT2xZRVVMZkJaOEppQ0NIT2NyVmRCdkgxb1JaNDJ4OUpQYklaWVpUTVpFMFc2elJra2JBWUFvVEQyY3hjVjFsc3RqZ2h3OW5nWXl4R1NDMi95MUo5aGdBSWp5RVNUTmJwbk80bWc4empRZUFYUHVsSjhnN0NxVEl6OElHOHdXZkNaZ2lMT0xlcjdYS1RTeWVUZ1gvNUk0bjFGSEM2MUxMQnAvSU5JU0pzaGdBWXdtWnEzV1J3RGtTYjZZT1c1eWppVEpuSjM5TXRRQnM0eWt0QkJuOEpveUVBcXJTYUUxemxLT1lXNENrUE5UekdYcHd0TmZ3ajNRTDBScVlqVkhxb3llQXpZVFZFSVhIdTBLdFREdzBSbXpnRlhJTTNheE8vQWk2UTZYeWFiZ0hhd0d6bjFBaERoQWlySVFDT1lRQlZiakxJSEY1RjBvaVAycEc3Z1V2RVpsczZtVlVSYmFBRmNkZnRNNFNETUJzQ29GYW51enlEZEFzMjhEOXAxU1kwaWMwNHNlbE1KN3V1cG9CNTNBN0UwcXJmRURoaE4wUWY0QTY5SlBXalNhU1pyVTVFYk9vSWlsSXBOdFZ1QlNiUjFSVHdaKzRDeHFkYmhpRjR3bTRJVUU3aTYweDJrMFhtOFJEQ3oxUDhlQmN3UVdaemszdHhDZFNtbUQrekJtRk11bVVZd2tINERRRWdOR2cxUjdyS0U2Y2MyTFNIVDMxT1lyeHdaN3JTMUthRVF0cUFINlZiaGlFOFJNTVFVSUp5bTVzamJHUWVIOEp1dTBEL3dtS0V6T2IrZEVYcEF2bzVabkFWbUdnSUwxRXhCTUIzcWVhbnJuSTBjQnZ3WkEvdkpJNklzWHQ4THlYVVpnRGJXQWVjblc0Wmh2QVJKVU9Bc2tCbjhOVlVQeTZKVFR3VFNIU05raVNPaUxGNUtXMFpOZ2RTd0g4REo2ZGJoaUdjUk1zUXNEZGQzT29tZzh4bEE3RFErZXZyeFBtTzJMeVZyZ0MxT1pnQ0hpR0NwMnNiOWt6VURBRndnVlp6aGFzY2hjeEZ1WnNDVHBlR0ZPNmQ2QVdkeTJGWVBBRW1QaWxYQ2ZVcGFydWhWV3RZNXd5Yzk0aXo2and1a3dyVlpqQngxa0hxWFRaRDlJaGlDd0d3UDhyaWJGV21jeGlHeFdNWU0rUThVVFVFS0tWNkF4ZjVYbzNOOGNSNUhEalU3N29Nd1JOZFF5UllwamI3K1ZXNHp1WkVoSWVCQS95cXd4QXVvbTZJZzltV2ZzakY3dERabklueUNQaG5PRVA0aUxvaFFMaEtxem5QeXlLMW52T0o4eUJadmdIVEVEelJOd1NBc0Z5cnZIbDQxZVlIS1BjRGZiMG96eEF0Y3NNUThEVUt1VEhUUXJTT3k0QmZrZ2c3TitRaHVXSUlnR3QxQm1la20xbHRya2E0bCtpdXpSZzhJSmNNWWFIY3BsUGNkM1cwamtuQXJlVFc5MkZJZzF4N0FBWlQ0dTRBWXExak9zSlNOQVEzV2hzQ0o5Y01BY3BVcmVYRWxENDZpM293SjJQa01HK2cvTkpOQm5lRzZPSnhKUFJubXhZUTV3NjFlNy9pUzBGMEZxMG9kZGtVWnNnYW00QnFDamxPUnJzN2Z0VFZBRktXOFRmZyt6cUZFY1JwQVpjblltU1A0YlJ6QTFDLzh4dHFZOUhKQ3BTZkJLREw0Qzl4NEQ2S21DcWw2UjB3bDFhWFNacFp4MWFPUXlrbjZQdmVla09vMFZxR2QzOUpMNkdBVHU1RWpCbHlEdUZSTEk2VEt4aWJyaGtnZ3pHRXJLQkRGdE5LSjBjQWkwbWNYaEVtaW9semo5cUpWbEJ0aWhuS2FvUXJneFptOEpTM0VFcmxDczZSeTNrbDA4SXlIbFRMTWo2U1ZtSUl3NEdITWkzUFk0NmpnM0tkVEI4NldRUCtSOGNhc3NabW9KNU9oc3NWM2wxZzQ5a2lsTFN3SGpoUFkxeUNNQjg0M0t1eU0wS1l6VDVjQkp3U3RCU0RKeWh3TDUxVXlUZys4THB3ejZkZHBaVTFER0FJUWpud2lkZmxwMEZmakJseWhXZFJUcE94alBYRERPRFRPb1RZdEVzenJSUXhERmdCNXRwYVEwYThoM0lsWXpoSnJ1UnBQeXZ5ZFdGTzVyTlJtcGtJbkFUOHdjKzZERG5KVnFDSnZneVZxMWdwZ3ZwZFlWWUMyYVNaNXhTK1F3VVhBd3VBdzdKUnJ5SFNyRVdaTEZmeDEyeFdtclhRRFFHVlJhemhNNzZKVUUvQy9RYkR6cnlBY29aY3hTZ1psMTB6UUFDeFRMS0NMYklRbXdJR0E2dkEvMmJRRUFrK0FzcnB4N2RsSEU4RUpTS3c0RDZaejd0eUUyT0JVeEJ6M1cwZTB3RXNwcDBqWkJ5dFVocnNBbS9nMGE2eWtHZm94Mm5PQ25KS0I0OFpjb1oxd0xFeW5waE1ERWNJVU9DR2dNU0ZpYktBbFNoSE9PT0x6L2VZeVJCbE5tQnhvWXpuWEJuUEcwR0w2VTRvREpGRUZySlo1bU5Ud0ZHSWQ4dnhodER3TWNway9zNVJNbzdmQkMybUowSzVmMWdhZVFzbzFXck9kc0xNaCs4cGp5SDh5SVRNRDRMd20xQzFFRHNqalR4S0NjY2pUSVQwUTNvTmhsUUp0U0VBeEtaVEdsbUJNQVNsQ1dnUFdwTWhkd205SVpKSUk1dGtQdFhFT1JyQzJmODBSSi9JR0NLSnpHZUROSEloY0M2RWE0YkNFSDBpWjRnazBzZzZQdUpZSjh3OEZIUFlodWdUV1VPQXM0MTFIcTNBRWM0RkttSGJ4bXFJR0pFMlJCSzVrWS9rUm1MRU9SRjRQR2c5aHVpU0U0WklJbzI4S1BNNEUvZ0I4SGJRZWd6Ukk2Y01rVVFhYUdNTDMwS3BCajROV284aE91U2tJUUNrbWEweWp5WUtHWXFhYmF5RzFNaFpReVFSbTQzU3dFU1VreENlQ2xwUHhQZ3Y0dHN2dmM4TGN0NFFTYVNCNTVqTjZRaWx3RHRCNndrNWJ3TG55eVQrVXlibjExZ3Nid3dCempiVzJheWhnR0Vrem4zZEZyU21rUEV4U2puL1pMaE00cmRCaXdtQ3ZESkVFckhaSXJPeHNSZ0VyQ0lMcHptRW5FNWdCVVVNa2NtMGlrMW4wSUtDSWk4TmtVUnMzcFhaaktXTHM0Q1hndFlUQ01vanhEbE9Kak5SSnZMUG9PVUVUVjRiSW9uTTRmY0lKK1RaTnRhL0lKUktHU01reG10Qml3a0x4aEFPWWhNWG01WEFrWkRUMjFnL1E2a0hoc3Rrc3l0eFo0d2hka0pzUGhNYm13S0dRMDQ5TUhGZ0ZjcVJFc09Xc3B3MWZFYUVjZ3RwR0pCYS9nS1VhajNuQU0xRWV4dnJNeWd4S2VlWm9JV0VIZE5DN0FHWnhTTW94ME1rdDdHK0MxeEpqRk9NR1ZMREdDSUZ4S1pUNmxoQm5LRWtia3NLKzdUa0ZxQ2VPSU9sUER1SEJPY0t4aEF1RUp1UHBZNFlCUXhIZVRCb1BUMmd3QnE2K0taTXdaWUtjMzZ1Vzh3WUlnMmtoamVCQzNRT0kwaTBHTU1DbGdUQzgwQk1wcGhyQnpMQnRCQVpJTFdzNDhzY0UvQnRyTzhqVE9UZmZOdVlJWE9NSVRKRUp0SWh0YlJpY1FTUzFXMnM3Y0JpaWhncVUxZ2h0Z2x2OXdKakNJK1FHajZTR21MQXQ4SDM0OXpYWWpGTXBoS1RzbERjNDVjem1ER0V4OGdNWGdETzBMbU13cUxWNCtMZlJEaGJwdktZeCtVYURQNmpOaVhheUJsQjZ6Q2t6djhEUWQ3UXJNYkxSMUFBQUFBQVNVVk9SSzVDWUlJPSI+CjxsaW5rIHJlbD0iYXBwbGUtdG91Y2gtaWNvbiIgaHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFNUUFBQURFQ0FZQUFBREFwbzVyQUFBQUJITkNTVlFJQ0FnSWZBaGtpQUFBQUFsd1NGbHpBQUJhYmdBQVdtNEJ4V3NqT0FBQUFCbDBSVmgwVTI5bWRIZGhjbVVBZDNkM0xtbHVhM05qWVhCbExtOXlaNXZ1UEJvQUFCbDBTVVJCVkhpYzdaMTVlRlRWM2NjL3Y1c0ZDVlJ4cVZ0cHRWVzJWbHhmNjFxdGlxMEw5R2w5TlhVQkZFcEZSVEloaEJBRENUZEFNQUVrQ1lzSzdxQjkra0Q3MnFmQldpdnFXN1ZhNjc0aXJlOXJheFgxYlpWV1pUSEwvTjQvNWc0R1NHRHV6TDF6NzUwNW4zODR6TXc1NTh2TS9YSzIzemtIRElHaml6aFBGM0ZlMERvTUlFRUx5R2QwUG9Pd2FBQXVjVjVhaDBXNVZQQjZrTHJ5R1dPSUFGQ2IvdlNqRXFnRyt1endLd2dkd0MxMFVDZlYvRHNZaGZtTE1VUVdVUnVMRWtZRDh4RU8ydjdHam9ad1BzeEhXTXhoSUV1bGxLNXM2c3huakNHeWhDN2dKSlJXNENTZ1p4UDBuSDRKaTVpVTg3amZHZzNHRUw2alRRd0U1Z0dqa1c3ZmQrcUdTTEtXSXNwa01tLzdJTlBnWUF6aEUycFRRaCtxc0tnQytnTHVUYkJyZWl1d21IWWFaRHFmZWlyWUFCaERlSTRxUWlNWEF3c1FEdlBBQkQybE55TFVzNG5ieFNhZXVXcERFbU1JRDlFYk9RRm9SVGh0KzR2K0dDTDU1N05BdWNSNEtpM0JobDB3aHZBQWJlQVFMR3hnQW1ENWFvTHU2Y1NmaXZBTGxFcUo4WTVMNllhZE1JYklBTFVwcG9ockVXWWo3TDM5amV3YUlwbmVqTEtRdldtVWNXeEw2UjlnMkFWamlEVFJ1WXpDb2dYNEJwQTlFM1JQOS96KzM0R1pVc2JLWHFRYmRvTXhoRXUwZ2FNUm1sSE85dkFCLzZPVE90a0RReVRTeWlNbzVSTGp0WjcrSFlhZXNZSVdFQlhVWmorZFN5dndQTXJaSGhXN0VXRWluM0VhVXprVm9SVDRteWNsQytkZzhiSXVaYVhld29HZWxKa0htQlppRDZoTklVV01SMmtBRHZDb1ZkaUtzSmo0cnVzSnVwd1NQcU1LcUVLYzlZdmV5a205emsxQUV3ZlNMS1cwWStnVlk0amRvUFdjZzBVTHdsSGJYOHpjRUdzUnltVGE3bGVjdFltQkZEa3IzT3l3eHAyT0laTHBEUWhUNVRvZTJGM2QrWXd4UkEvb0hBWkJ0N0JzYjFxRkZ5bWdYQ3JkeFNUcElzNEVXaENPM2FYTTlMV3NvNENZWE1NYmJyVGtBOFlRM1ZDYi9naVZ5RTVoMlprWjRpT0VPUnllZnRTcTJsZ01ZRFRLZk9BZ2ozUjFvTnhDSVhVeTBZU1pKekdHd0huZ0xPZUI2eWtzTzcwSEwvSEFpWGY3R25RWi9XbnZ3YkRwYXdTY01QUDlUSmc1R0VPZ3MxTUl5M2Ivc0swalRreHEvT21TYUN1RFVCcVE3VHZ0dk9qV3ZZaFFMdGZrZDVoNTNocENiUmRoMmFrL1ZCdFFLcVNHMzNncXRoZTBsWE9BRnVBb0Q5ZEUxbEpBbWZ3MFA4UE04ODRRYWxNQ3pyUm1xbUhaZTM2UU5pRTA4VG5OWW1kM1dsTnRDdG1YOFlnekxkeTdSamZwUkpoNUVRM3lrL3dLTTg4YlF5Z0lkVnlNeFFMVVpWaDI3Kzkzb3R5Sk1GTnErSWZYbXQyZ2k5aVBRbVlCMXlFVWJuOGpNM084aDFMRFJGYUpvSjRLRGlsNVlRaXQ1UVFrZzdEc25sOTdGSXR5cWVaVlQ4Vm1pQzVoS0VvejRoeHI0MDFYNmxtVW1GekQweDVLRFNVNWJRaXQ0UkNLc05FTXc3SjNmTzB0bEJxWnlScVA1WHFLTG1ZVVFndmlCQjlDcHVaUTRGNDZxSkpKZk9DcDJCQ1JrNFpRbTJJNlBRekxUdnlaQ0svZWh4dWxqTTg5bHV3TGFsUE0vczczQUh0NzFGcHNSbGhJWVc2R21lZWNJWFNHNTJIWmNZVDdFS2JKREQ3MFZtMTIwT1VjUWdjMjRyU1U0TVgzOGhaQ2pVd0lkMHZwbHB3eGhON0FVQXBvQnM3emNBcnlHWlNZMVBHTWgxSURRMjkydHJncXAzbjJIVms4U3B3cDhsTmU4VkJxWUVUZUVHcXpIeDNNUXJnT25ObVZ6SC9zZDRFWjFPYmU3SW9xd2kzT0lRaHdHT0RGOTlXSk9MTnQ0NE9kYmN1VXlCcENiUXJwWUR4NEdwYTlCVmpBbDJpU0NyWjZLRGQwNkhKSzZLUUtTU0hNUE5XMHhTYmlOTEYzZE1QTUkya0lyWEZXYUwwTHkxYmdGeFF3VFdaNnRFRW5JdWppRk1MTTNhWVRZZVlWTWk0N0svWmVFaWxENkV3R0VmYzhMUHM1TE1xbGpqOTRwelI2Nk0yYzZVeEc3QnBtN2piOXhXdnJLS1JNeHJMZU82WCtFZ2xEcU8xRWVTclZDSDIydjVHWklUWUM5V0FPKzBxaU5oWUhPNGN4ZHc4emgweldiUkpSdngzUkNETVB0U0hVeG1Jcm83R2NId2k4YUJYYWdWc3BZYVk1RHJKbmRCbjlzYWpFY3NMTUlSTkRKRW1FbWZjTmQ1aDVhQTJoTjNRTHkvWnVHblV0UWt4cy90ZERxVG1MM3NvZ3hPbWlabTZJWlBvRmxISVp4eE5lYXZXSzBCbENxeGlJMVcyUUIxNjBDaStobE1zY2Z1K3AyRHhCVnpEQ2lZOUtUR0prWm9oa2VpMXhKc3M0L3VxbDFrd0pqU0hVcG9RdHpqUWc5UFdvVlVoczMxelBVbGtUM21ZNkNxaE5JVjl4VGg4Uko4d2NNakVFSkthNWw5Q1h1VkxLWjk0cVRvL0FEYUVnVE9OaXhGa29jditsOXBST1hFdlZUcDAwaFg4Z0Z5WDBkdlpEbVFWTUFnb3lORVF5L1I1Q0RhT0RYd2dOMUJBNmxST3dlZ25MVHQ4UTZ4REtaWTY1dU5CUDlEYUdBWXVRYnJlblp2N2IvUW1MbUl6ZWZwSmgxZ25FRUZydWhHWHY3clJzOTEvcUJ1Sk1sWG5tektGc29yY3pDcHhnU205YWQwV2NNUE54MlE4eno2b2huTzdSTkpSYWhQNDlxbkQvcFg0TTFGUEV6V0xUNmExaVF5cm9YZXhGbkFyZ0JxQy9SK08vVDdDWVF4R0xzeGtHa3ZVV1FpczR6amtONzR3ZVZhUnVpRVJZZGhHVll2Ti9mbWcxdUVPWGN3aUZQb1daWDVHZE1QUEF4aEJheVNpRVZ1RHJyZzJoUElvd1JlYmxSc2h4cnFGM2N3SmR6dGpRdXpXa1IxSEtaYlMvVzNhREhWVGJGTE9aYXhIbUFGL2FRVkhQWDh4YldOUklRMjV0U3NsRlZCSHU5aUhNSE82a2lKbFM2aytZZWVEVHJnQmF4YUhBTEdBQzBtTlRtOWkyV0V5ajJMbTNiVEdYMGVXVVVKemlhZWFwcHplaDFITW95K1FzYjhlTm9UQkVFcTNpUDV4dTFLbU9zc1RHOWk2cVpFSHVibXpQQi9RMkJsTE1QTlRETUhONEU0c0t1WlFIdmRJWktrT0FNeE0xblRFSUYyTmh5enhlQ0ZxVHdUdjBMcjdyaEprZnMvM0Z6TTF4UDNFcTVZck1ZOVJDWndoRDdxTTJGb2M3WWVhU1FaajVqdWtPTEc2aGcxb1p6U2ZwYWpPR01BU0dycVkvVzd1ZFpnNlp0eGJDK3lnMkZuZWtFMlp1REdFSUhMMlBRWFNsRVdhK3V6UThqMFc1bFBLa0d5M0dFSWJRb1Bkd1BzSWloS0ZBcG9hQXhLWDJFK1RIM0ptcUJ0ZTNrR281RTdTY0g3ck5aekRzQ2JtU0I5bkswY0JFNEo5ZUZBa2M2aWFEKzJ0NWxTTlI3dGNZNi9SNng4a0dnMGZJUkRwa0RDdm93eEJnTVdSM0gwczZoaWh5VXVkUXdDc2FvMVd2Nnhhb1p6QjRnSlR5c1l3bVJwemh3Ryt6VmE5N1ExamJEUUZRQkpSUnhIcU5NZFl6VlFhRGc0eGx2WXptZklRZmdQOTc0VE5wSWJvekVMaEh5M2pZZEtNTWZpQ1gwMFlSdzRCeVNIK2RZVSs0TndROUdpS0JNSUlDWHRZcE5Lck5YdW5MTWhoMlJVcHBseXRvUlJnRy9weWw1YTBoRWhTalRPZGZ2SzR4UnFZanltRFlIWElaRzhHZnZkZCtHQ0xKTnhEYWRBcHRXc25YMDZqSFlNZzZYbzBoZHNkSXVuaGRLN0JOTjhvUWRqS2RaVXFWdmlpeitJVFh0SklMMDhodk1HU0ZiTFFRM1RtQ09HdTFnall0NS9BTXlqRVlmTUhQTWNUdUdFa0JiMmlsNlVZWndrVlFob0JrTitwVFh0VnBYT0JSbVFaRFJnUnBpQ1JIb2p5Z1UyblRhdE9OTWdSTHRzY1F2U09NcEpQWHRRcGJKM2U3Rk1WZ3lDTHVEU0UrR1NKQkNjb3MrdkNhVHV0MlpxakJrQ1hDMEdYYUZlRkk0RUd0b2sybk9tZjZHQXhaSUp5RytJTEViSlRwUmhteVJOZ05BVkFDektLRVYzVTYzODl5M1lZOEl3cUdTRElJK0sxVzA2YlQrVnBBR2d3NVRwUU1rVUFaaWJCZXE3SFZwamhRTFlhY0kzcUdTSkRvUm0zalZhM21lMEdMTWVRT1VUVkVrc0VJRCtrTnRPa012aHEwR0VQMGlib2hrb3drem5xdE1kMG9RMmJraWlFQStnR3phT2NWcmVIY29NVVlvb2tyUTJqaTRLZENuN1I0eFJEZ2R6ckRkS01NN25IWFFsd2Rlak4wWnlTd1htZWFibFJlRTNkM0dJSGJMbE5ZdTB1OTBROWxGbDI4ckRNWkViUVlRMWJaakZMUE5oYTV5ZVRPRVB0R3poQUpsS0hBNzNRbUs3V0dnNEtXWS9BVkJWYlJ3U0M1REZ2R3VidUN6WjBoT2lOcWlBUUNqS0dBRFRxVG1OcVI2djRaVWtINUV4YW55YVdNbFRHOG4wNFI3Z3pSRldsREpOa0hvWVV1bnROYVRndGFqTUVUM2tXNGtrczVXVXA1T3BPQzNCbkNyODFCd1hBTXdoTmFaN3BSa1VYWkF0UlR3R0M1bEpVaW1SOWU1czRROFp3eUJDUzdVWVc4cVhYRTlCSUtnaFprU0JGaEZVVU1sc3V3cFpTdDNoWHJBcjJlb1JTdzNsV3AwVXEvaERCSmJKN0NrSmU0YXlHS2NxNkYySmxqZ1NmVlpxWGFIQmkwR0VQMnllY3hSTStvMDQyQ0RWcFBURmViYmxRK1lRelJPd05RV2xqUHN6cWJVNElXWThnT3ViNVM3UVhIb2Z4QjYxbXA4L2h5MEdJTS9tSmFpTlJJZEtNNjJhQnpURGNxbDNGbkNNbjdJTGw5VVZyWXdKOTBMaWNITGNiZ1BhYkxsQTdLOFNoUDZSelRqY28xVEpjcGZSTGRxQzdUamNvbFRBdVJPZnNpdFBBWG50SFpuQlMwR0VObXVETkVlcmNINVFmS0NWZzhwWE5acVRZSEJDM0hrQjZtaGZBV0MyRU1SV3pRQm1KcXA3Vm5QVlJvTXdPQzFwQUp1cHFEM1h6ZTdRKzI1ejBFcnFLamNwYjlnQmFLZVZJYk9TWm9NZW1nU3poVWw3S2NZdVlFclNVZGRCVkQ5R2M4UUFkVDNlUnpPNmgyTisxcXpIRUtTbG5RSXR5Z05zVzZoQmdXYnlKY1RYb25zd1NHM3NlK2VoK05XTHdDN20rbWNyZHJUQ2xLK3lIZk1kOW00REdnalM2ZW9JakgwQnpka3hDblBXZ0pxYUxMR0lYU0N0RzdWMXh0TEk1Z05MQUEwZy9NZEx1Tk1wTXh4TnNvRHdOcjJZZUh4UDdpUWRGS0tvRDdNaWc3dkFnZFFVdllFN3FNWTRuVGduSm0wRnJTUWUvakxPSzBJQnlkYVZudURHRlI1R0pQVWhlSi9RVnJFZHJrSnA3djdZT3lrSjlwSlpkRER0NWhMZUZ0SVhRcCt3TjF4SmtFMFZ0SDBaVjhEWXU1S0dPODZwNjc3ekx0bnMySTB4VXE1TmV5Z0E5Y0tMbWVMcjVMNGdTKzNFSEQxMExvY29wbzV6cmkxQ1BzRTdRZXQraEsraUZNQTZhajdPWGxXTldMTHRQYkNBOGp1M2FGM0NDTi9GV3JhRUNabDNnaG5WSkNTTWdNb1lzWndlZTBBTjhLV290YlZCSHVaUXhLRTdpYlRrMlZkQXp4UlZjb1Rwc3M3cjByNUpvU0ZyQ1pVaEk3MTNJREt4eUcwS1VNcG90RktCZEc4VDhidllzVFdVVXIrTHMzeFowaHVyaWJJdVpMTXgvN0lVWnNPcldTNnhDZXBQdDBYMi83b0tOQm9HTUliV1lBUWpWZFRJSG9SU3ZyUFh3RnVCRVlUUlorZlZlR2tLVzg2WmVRN1hVczVHbWR4bkxnV3Ivcnlnb0JkWm5VeG1KQTV0T1FRYUdyNmN0V3lvQVp3SmV5Vlc4NEYxMjJVWTN3M2g0L0Y0WFdJb0JaSnIySnM5aUhGNEI3aUtJWjdtSVVXM2dEcFpFc21nRkNhZ2had2lkQWhidE0vbWpKbUN5MkVIb1RYOVZtVm1MeEtFUXZaRVR2NUhpOWk4Y1JmZzBjSG9TRzBKNXZLazJzMW1tTVJoamxQck1QZ3RJbEM0YlFCZlREWWhyQ2RHQXZ2K3Z6R3IySC9lbWlEZ2wrUFNTMGhnREE0bnFVczREK2FaY1J2RGw4NnpLcElpemlZb1NGRUwycmluVTVSUlJ6SFYzaFdROEpaWmNwaVRUeERrSzlkd1Y2VmxMcStEVHRxZ3M1a1VVOENhd21pbWE0a3hFVThSSktDNFREREpCbFE2aE5vYnA5TFB2U0Fyem91WmpzbUdNVHlxdGVGcWhOSEtvTFdZN3dSK0JVTDh2T0Jub0hRL1IySG5EaTJyNFp0SjZkOGQwUU9waytPb1VSV2tFcm4vQXVVN2pLVFg2eDZVUzVtc1NDb0QvNFlRN2xBeXpPa2hyZThLekloVnhFQVgrRzZJVmxBK2p0akFkZVE5eUhaV2NMWDc1VW5VSmZuY0lvbmNKS0N2a1FlQmdvQXc1Q2FOWXFCcm9wVCtiekhIQ3pIMXAzcmN5VFV0Nm1nTzlJTlM5N1V0b1hIRU8wWTcyR0VmSnhxMmZpdEp3QktPY2lqRUw1RWRDL2w0ZHJIN3E0QlZ6T0hpa3pFSDRFN3N5VUVlbVo0elVLK2I1TVo2UEhhZ3haSUtNV1FpZXh2OFlZcXpIYVVENGtNY0FidzU1bmhVWnFCVDkyVTVmTTUxTWs5THZQSHFlQTA0MFpvb3RyUStoa0Jtb1pWMnVNTmdwNW44UnE2RWpjeHNrSVM3WFMzU3FxTkhJL3lxOWMxZU1WZTI0dDFsTENlVkxOdjdPZ3h1QVQ3aTV1TCtjaUxONUJXRTdDQkpuc29EdUFPTTJ1Y3ltVElPQ0hibWR6S1BmeVpTNlNDdTl1c2pFRWc5c3J0ZnJoNVp5TWNMbE81WWV1c3N4bkk4b3N6elJraXNVU3VyaFNKb1lqek51UUdjRlAzUWszYXpYN3VzclRseVhBSC8wUmxESUsxTXNNeXNRbUhyQVdnMGNFYndnNGhFNmEzR1FRbXpnV0V5R3cvNVc3VUs2Uld1eUE2amY0UkJnTUFUQkJwL0U5Tnhsa0hxOEFTM3pTc3p2YUVTNlRPbFlFVUxmQlo4SmlDQ0hPY3JWZEJ2SDFvUlo0Mng5SlBiSVpZWlRNWkUwVzZ6UmtrYkFZQW9URDJjeGNWMWxzdGpnaHc5bmdZeXhHU0MyL3kxSjloZ0FJanlFU1ROYnBuTzRtZzh6alFlQVhQdWxKOGc3Q3FUSXo4SUc4d1dmQ1pnaUxPTGVyN1hLVFN5ZVRnWC81STRuMUZIQzYxTExCcC9JTklTSnNoZ0FZd21acTNXUndEa1NiNllPVzV5amlUSm5KMzlNdFFCczR5a3RCQm44Sm95RUFxclNhRTF6bEtPWVc0Q2tQTlR6R1hwd3ROZndqM1FMMFJxWWpWSHFveWVBellUVkVJWEh1MEt0VER3MFJtemdGWElNM2F4Ty9BaTZRNlh5YWJnSGF3R3puMUFoRGhBaXJJUUNPWVFCVmJqTElIRjVGMG9pUDJwRzdnVXZFWmxzNm1WVVJiYUFGY2RmdE00U0RNQnNDb0ZhbnV6eURkQXMyOEQ5cDFTWTBpYzA0c2VsTUo3dXVwb0I1M0E3RTBxcmZFRGhoTjBRZjRBNjlKUFdqU2FTWnJVNUViT29JaWxJcE50VnVCU2JSMVJUd1orNEN4cWRiaGlGNHdtNElVRTdpNjB4MmswWG04UkRDejFQOGVCY3dRV1p6azN0eENkU21tRCt6Qm1GTXVtVVl3a0g0RFFFZ05HZzFSN3JLRTZjYzJMU0hUMzFPWXJ4d1o3clMxS2FFUXRxQUg2VmJoaUU4Uk1NUVVJSnltNXNqYkdRZUg4SnV1MEQvd21LRXpPYitkRVhwQXZvNVpuQVZtR2dJTDFFeEJNQjNxZWFucm5JMGNCdndaQS92Skk2SXNYdDhMeVhVWmdEYldBZWNuVzRaaHZBUkpVT0Fza0JuOE5WVVB5NkpUVHdUU0hTTmtpU09pTEY1S1cwWk5nZFN3SDhESjZkYmhpR2NSTXNRc0RkZDNPb21nOHhsQTdEUStldnJ4UG1PMkx5VnJnQzFPWmdDSGlHQ3Ayc2I5a3pVREFGd2dWWnpoYXNjaGN4RnVac0NUcGVHRk82ZDZBV2R5MkZZUEFFbVBpbFhDZlVwYXJ1aFZXdFk1d3ljOTRpejZqd3Vrd3JWWmpCeDFrSHFYVFpEOUloaUN3R3dQOHJpYkZXbWN4aUd4V01ZTStROFVUVUVLS1Y2QXhmNVhvM044Y1I1SERqVTc3b013Uk5kUXlSWXBqYjcrVlc0enVaRWhJZUJBL3lxd3hBdW9tNklnOW1XZnNqRjd0RFpuSW55Q1Bobk9FUDRpTG9oUUxoS3F6blB5eUsxbnZPSjh5Qlp2Z0hURUR6Uk53U0FzRnlydkhsNDFlWUhLUGNEZmIwb3p4QXRjc01ROERVS3VUSFRRclNPeTRCZmtnZzdOK1FodVdJSWdHdDFCbWVrbTFsdHJrYTRsK2l1elJnOElKY01ZYUhjcGxQY2QzVzBqa25BcmVUVzkyRklnMXg3QUFaVDR1NEFZcTFqT3NKU05BUTNXaHNDSjljTUFjcFVyZVhFbEQ0Nmkzb3dKMlBrTUcrZy9OSk5CbmVHNk9KeEpQUm5teFlRNXc2MWU3L2lTMEYwRnEwb2Rka1Vac2dhbTRCcUNqbE9ScnM3ZnRUVkFGS1c4VGZnK3pxRkVjUnBBWmNuWW1TUDRiUnpBMUMvOHh0cVk5SEpDcFNmQktETDRDOXg0RDZLbUNxbDZSMHdsMWFYU1pwWngxYU9ReWtuNlB2ZWVrT28wVnFHZDM5Skw2R0FUdTVFakJseUR1RlJMSTZUS3hpYnJoa2dnekdFcktCREZ0TktKMGNBaTBtY1hoRW1pb2x6ajlxSlZsQnRpaG5LYW9Rcmd4Wm04SlMzRUVybENzNlJ5M2tsMDhJeUhsVExNajZTVm1JSXc0R0hNaTNQWTQ2amczS2RUQjg2V1FQK1I4Y2Fzc1ptb0o1T2hzc1YzbDFnNDlraWxMU3dIamhQWTF5Q01CODQzS3V5TTBLWXpUNWNCSndTdEJTREp5aHdMNTFVeVRnKzhMcHd6NmRkcFpVMURHQUlRam53aWRmbHAwRmZqQmx5aFdkUlRwT3hqUFhERE9EVE9vVFl0RXN6clJReERGZ0I1dHBhUTBhOGgzSWxZemhKcnVScFB5dnlkV0ZPNXJOUm1wa0luQVQ4d2MrNkREbkpWcUNKdmd5VnExZ3BndnBkWVZZQzJhU1o1eFMrUXdVWEF3dUF3N0pScnlIU3JFV1pMRmZ4MTJ4V21yWFFEUUdWUmF6aE03NkpVRS9DL1FiRHpyeUFjb1pjeFNnWmwxMHpRQUN4VExLQ0xiSVFtd0lHQTZ2QS8yYlFFQWsrQXNycHg3ZGxIRThFSlNLdzRENlp6N3R5RTJPQlV4QnozVzBlMHdFc3BwMGpaQnl0VWhyc0FtL2cwYTZ5a0dmb3gybk9DbkpLQjQ4WmNvWjF3TEV5bnBoTURFY0lVT0NHZ01TRmliS0FsU2hIT09PTHovZVl5UkJsTm1CeG9Zem5YQm5QRzBHTDZVNG9ESkZFRnJKWjVtTlR3RkdJZDh2eGh0RHdNY3BrL3M1Uk1vN2ZCQzJtSjBLNWYxZ2FlUXNvMVdyT2RzTE1oKzhwanlIOHlJVE1ENEx3bTFDMUVEc2pqVHhLQ2NjalRJVDBRM29OaGxRSnRTRUF4S1pUR2xtQk1BU2xDV2dQV3BNaGR3bTlJWkpJSTV0a1B0WEVPUnJDMmY4MFJKL0lHQ0tKekdlRE5ISWhjQzZFYTRiQ0VIMGlaNGdrMHNnNlB1SllKOHc4RkhQWWh1Z1RXVU9BczQxMUhxM0FFYzRGS21IYnhtcUlHSkUyUkJLNWtZL2tSbUxFT1JGNFBHZzlodWlTRTRaSUlvMjhLUE00RS9nQjhIYlFlZ3pSSTZjTWtVUWFhR01MMzBLcEJqNE5XbzhoT3VTa0lRQ2ttYTB5anlZS0dZcWFiYXlHMU1oWlF5UVJtNDNTd0VTVWt4Q2VDbHBQeFBndjR0c3Z2YzhMY3Q0UVNhU0I1NWpONlFpbHdEdEI2d2s1YndMbnl5VCtVeWJuMTFnc2J3d0J6amJXMmF5aGdHRWt6bjNkRnJTbWtQRXhTam4vWkxoTTRyZEJpd21DdkRKRUVySFpJck94c1JnRXJDSUxwem1FbkU1Z0JVVU1rY20waWsxbjBJS0NJaThOa1VSczNwWFpqS1dMczRDWGd0WVRDTW9qeERsT0pqTlJKdkxQb09VRVRWNGJJb25NNGZjSUorVFpOdGEvSUpSS0dTTWt4bXRCaXdrTHhoQU9ZaE1YbTVYQWtaRFQyMWcvUTZrSGhzdGtzeXR4WjR3aGRrSnNQaE1ibXdLR1EwNDlNSEZnRmNxUkVzT1dzcHcxZkVhRWNndHBHSkJhL2dLVWFqM25BTTFFZXh2ck15Z3hLZWVab0lXRUhkTkM3QUdaeFNNb3gwTWt0N0crQzF4SmpGT01HVkxER0NJRnhLWlQ2bGhCbktFa2Jrc0srN1RrRnFDZU9JT2xQRHVIQk9jS3hoQXVFSnVQcFk0WUJReEhlVEJvUFQyZ3dCcTYrS1pNd1pZS2MzNnVXOHdZSWcya2hqZUJDM1FPSTBpMEdNTUNsZ1RDODBCTXBwaHJCekxCdEJBWklMV3M0OHNjRS9CdHJPOGpUT1RmZk51WUlYT01JVEpFSnRJaHRiUmljUVNTMVcyczdjQmlpaGdxVTFnaHRnbHY5d0pqQ0krUUdqNlNHbUxBdDhIMzQ5elhZakZNcGhLVHNsRGM0NWN6bURHRXg4Z01YZ0RPMExtTXdxTFY0K0xmUkRoYnB2S1l4K1VhRFA2ak5pWGF5QmxCNnpDa3p2OERRZDdRck1iTFIxQUFBQUFBU1VWT1JLNUNZSUk9Ij4KCjxzdHlsZT4KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by91WUVDTUtvSGNPOXgxd2RtYnlISW0zLV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8nKSwgbG9jYWwoJ1JvYm90by1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vc1RkYUE2ajBQc2I5MjBWanYtbXJ6SC1fa2Y2QnlZTzZDTFlkQjRIUUUtWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL19WWUZ4LXM4MjRrWHFfVWwyQkhxWUgtX2tmNkJ5WU82Q0xZZEI0SFFFLVkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL3RuajRTQjZETmJkYVFuc004Q0ZxQlgtX2tmNkJ5WU82Q0xZZEI0SFFFLVkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL29NTWdmWk1RdGhPcnlRbzluMjJkY3V2dkRpbjFwSzhhS3RlTHBlWjVjMEEud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL0tzX2NWeGlDaXdVV1ZzRldGQTNCam4tX2tmNkJ5WU82Q0xZZEI0SFFFLVkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8nKSwgbG9jYWwoJ1JvYm90by1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vTko0dnhsZ1d3V2JFc3YxOGRBaHFubi1fa2Y2QnlZTzZDTFlkQjRIUUUtWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9pc1otd2JDWE5LQWJuam82X1R3SFRvWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by83N0ZYRmpSYkd6TjRhQ3JTRmhsaDNvWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9qU04yQ0dWRGJjVnlDbmZKZmpTZGZJWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkJyksIGxvY2FsKCdSb2JvdG8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL1VYNmk0SnhRRG0zZlZUYzFDUHV3cW9YMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vZC02SVlwbE9Gb2NDYWNLenh3WFNPSkJ3MXhVMXJLcHRKal8wamFuczkyMC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by85N3VhaHhpcVpSb25jQmFDRUkzYVc0WDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vUHdaYy1ZYklMNDE0d0I5ckIxSUFQWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDMTRzWVlkSmc1ZFUycXpKRVZTdXRhMC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tQm9sZEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3Q2TmQ0Y2ZQUmhaUDQ0UTVRQWpjQ19acmFSMlRnOHcybHptN2tMTkwwLXcud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0N3dF9SbTY5MUxUZWJLZlkyWmtLU21JLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0MxQlcyNlF4cFNqLV9aS21feFQ0aFd3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0M0Z3A5UThnYllyaHFHbFJhdl9JWGZrLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0M2RThrTTR4V1IxXzFiWVVSUm9qUkdjLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tQm9sZEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3Q2TmQ0Y2ZQUmhaUDQ0UTVRQWpjQzlEaU5zUjVhLTlPZV9JdnB1OFhXbFkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09wWFVxVG8wVWdRUWhHal9TRmRMV0JrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9XeHJYSmEwQzNLZHRDN2xNYWZHNGRSa0F6NHJZbjQ3WnkycnZpZ1dRZjZ3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vY0RLaFJhWG5RVE9WYmFveHdkT3I5eGtBejRyWW40N1p5MnJ2aWdXUWY2dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vMWhaZjAyUE9BTmgzMmsyVmtnRW9VQmtBejRyWW40N1p5MnJ2aWdXUWY2dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdlBjeW5TTDBxSHFfNmRYN2xLVkJ5WFloamJTcHZjNDdlZTZ4Ul84MEhudy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdlN6dWxmS1NLMExMampmZWF4Y1JFaGtBejRyWW40N1p5MnJ2aWdXUWY2dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9LMjNjeFdWVHJJRkQ2REpzRVZpMDdSa0F6NHJZbjQ3WnkycnZpZ1dRZjZ3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCcpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0JyksIHVybCgvZm9udC1yb2JvdG8vRmw0eTBRZE94eXlUSEVHTVhYOGtjWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by8wZUM2ZmwwNmx1WEVZV3BCU0p2WENJWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvL0kzUzF3c2dTZzlZQ3VyVjZQVWtUT1lYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by8tTDE0SmswNm02cFVIQi01bVhRUW5ZWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCcpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0JyksIHVybCgvZm9udC1yb2JvdG8vSGdvMTNrLXRmU3BuMHFpMVNGZFVmWkJ3MXhVMXJLcHRKal8wamFuczkyMC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvL1BydTMzcWpTaHBaU21HM3o2Vll3bllYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvL05ZRFdCZEQ0Z0lxMjZHNVhZYkhzRklYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0IEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0SXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vN204bDdUbEZPLVMzVmtoSHVSMGF0MTRzWVlkSmc1ZFUycXpKRVZTdXRhMC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0IEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0SXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vN204bDdUbEZPLVMzVmtoSHVSMGF0X1pyYVIyVGc4dzJsem03a0xOTDAtdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0IEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0SXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vN204bDdUbEZPLVMzVmtoSHVSMGF0d3RfUm02OTFMVGViS2ZZMlprS1NtSS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTGlnaHRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by83bThsN1RsRk8tUzNWa2hIdVIwYXQxQlcyNlF4cFNqLV9aS21feFQ0aFd3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdDRncDlROGdiWXJocUdsUmF2X0lYZmsud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0IEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0SXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vN204bDdUbEZPLVMzVmtoSHVSMGF0NkU4a000eFdSMV8xYllVUlJvalJHYy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdDlEaU5zUjVhLTlPZV9JdnB1OFhXbFkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL29IaTMwa3dRV3ZwQ1dxQWh6SGNDU0lYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0nKSwgbG9jYWwoJ1JvYm90by1NZWRpdW0nKSwgdXJsKC9mb250LXJvYm90by9aTHFLZWVsWWJBVEc2MEVwWkJTRHk0WDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vbXg5VWNrNnVCNjNWSUtGWW5FTVhyWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vckd2SGRKbnIybDc1cWIwWU5EOU55SVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vUnhaSmRuemVvM1I1elNleGdlOFVVWkJ3MXhVMXJLcHRKal8wamFuczkyMC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vb09lRndaTmxyVGVmekxZbWxWVjFVSVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0nKSwgbG9jYWwoJ1JvYm90by1NZWRpdW0nKSwgdXJsKC9mb250LXJvYm90by9tYm1ocHJNSDY5Wmk2ZUVQQllWRmhZWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT0xmZkdCVGFGMFhGT1cxZ251SEYwVjRzWVlkSmc1ZFUycXpKRVZTdXRhMC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBmWnJhUjJUZzh3Mmx6bTdrTE5MMC13LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMFF0X1JtNjkxTFRlYktmWTJaa0tTbUkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBWQlcyNlF4cFNqLV9aS21feFQ0aFd3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT0xmZkdCVGFGMFhGT1cxZ251SEYwWWdwOVE4Z2JZcmhxR2xSYXZfSVhmay53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMGFFOGtNNHhXUjFfMWJZVVJSb2pSR2Mud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMGREaU5zUjVhLTlPZV9JdnB1OFhXbFkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubycpLCBsb2NhbCgnUm9ib3RvTW9uby1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vaE1xUE5Mc3VfZHl3TWE0Q19ERXBZMTRzWVlkSmc1ZFUycXpKRVZTdXRhMC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubycpLCBsb2NhbCgnUm9ib3RvTW9uby1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vaE1xUE5Mc3VfZHl3TWE0Q19ERXBZX1pyYVIyVGc4dzJsem03a0xOTDAtdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubycpLCBsb2NhbCgnUm9ib3RvTW9uby1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vaE1xUE5Mc3VfZHl3TWE0Q19ERXBZd3RfUm02OTFMVGViS2ZZMlprS1NtSS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vJyksIGxvY2FsKCdSb2JvdG9Nb25vLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9oTXFQTkxzdV9keXdNYTRDX0RFcFkxQlcyNlF4cFNqLV9aS21feFQ0aFd3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWTRncDlROGdiWXJocUdsUmF2X0lYZmsud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubycpLCBsb2NhbCgnUm9ib3RvTW9uby1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vaE1xUE5Mc3VfZHl3TWE0Q19ERXBZNkU4a000eFdSMV8xYllVUlJvalJHYy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWTlEaU5zUjVhLTlPZV9JdnB1OFhXbFkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubyBCb2xkJyksIGxvY2FsKCdSb2JvdG9Nb25vLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9ONGR1VmM5QzU4dXdQaVk4XzU5RnoxeC1NMUkxdzVPTWlxblZGOHhCTGhVLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGendYYUFYdXA1bVpsZks2eFJMcmhzY28ud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6d242V3F4by14d3hpbERYUFU4Y2hWVS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGejFUN2FKTEs2bktwbjM2SU13VGNNTWMud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubyBCb2xkJyksIGxvY2FsKCdSb2JvdG9Nb25vLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9ONGR1VmM5QzU4dXdQaVk4XzU5RnpfNzlfWnVVeENpZ00yRGVzcFRuRmF3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6NGdkOU9FUFVDTjNBZFlXMGU4dGF0NC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6OGJJUVNZWm5XTGFXQzlRTkNwVEtfVS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9Cjwvc3R5bGU+CgoKCjxzdHlsZT4ubWF0LWJhZGdlLWNvbnRlbnR7Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsIC5tYXQtYmFkZ2UtY29udGVudHtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2UgLm1hdC1iYWRnZS1jb250ZW50e2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDEsLm1hdC1oZWFkbGluZSwubWF0LXR5cG9ncmFwaHkgaDF7Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDIsLm1hdC10aXRsZSwubWF0LXR5cG9ncmFwaHkgaDJ7Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDMsLm1hdC1zdWJoZWFkaW5nLTIsLm1hdC10eXBvZ3JhcGh5IGgze2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0LC5tYXQtc3ViaGVhZGluZy0xLC5tYXQtdHlwb2dyYXBoeSBoNHtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNSwubWF0LXR5cG9ncmFwaHkgaDV7Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDYsLm1hdC10eXBvZ3JhcGh5IGg2e2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nLC5tYXQtYm9keS0ye2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keSwubWF0LWJvZHktMSwubWF0LXR5cG9ncmFwaHl7Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5IHAsLm1hdC1ib2R5LTEgcCwubWF0LXR5cG9ncmFwaHkgcHttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbCwubWF0LWNhcHRpb257Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTQsLm1hdC10eXBvZ3JhcGh5IC5tYXQtZGlzcGxheS00e2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktMywubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTN7Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMiwubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTJ7Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTEsLm1hdC10eXBvZ3JhcGh5IC5tYXQtZGlzcGxheS0xe2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJ7Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b24sLm1hdC1yYWlzZWQtYnV0dG9uLC5tYXQtaWNvbi1idXR0b24sLm1hdC1zdHJva2VkLWJ1dHRvbiwubWF0LWZsYXQtYnV0dG9uLC5tYXQtZmFiLC5tYXQtbWluaS1mYWJ7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGV7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZHtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxle2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyIC5tYXQtY2FyZC10aXRsZXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGUsLm1hdC1jYXJkLWNvbnRlbnR7Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveHtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXQgLm1hdC1jaGVja2JveC1sYWJlbHtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcHtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uLC5tYXQtY2hpcCAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29ue2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGV7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGx7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbCwubWF0LWZvb3Rlci1jZWxse2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJ7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWwsLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9ue2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlciB0aHtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGV7Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVye2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudHtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGR7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJ7cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29ue2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbiwubWF0LWZvcm0tZmllbGQtc3VmZml4IC5tYXQtaWNvbi1idXR0b257aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbiAubWF0LWljb24sLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb24tYnV0dG9uIC5tYXQtaWNvbntoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXh7cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcjpmb2N1cysubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJ7dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVse3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcntmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtd3JhcHBlcntwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1pbmZpeHtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcjpmb2N1cysubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGwrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXTpub3QoOmxhYmVsLXNob3duKSsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtbGFiZWx7dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJ7bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGwrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1pbmZpeHtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1pbmZpeHtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXIsLm1hdC1ncmlkLXRpbGUtZm9vdGVye2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlciAubWF0LWxpbmUsLm1hdC1ncmlkLXRpbGUtZm9vdGVyIC5tYXQtbGluZXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyIC5tYXQtbGluZTpudGgtY2hpbGQobisyKSwubWF0LWdyaWQtdGlsZS1mb290ZXIgLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50e21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVte2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3IsLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplIC5tYXQtc2VsZWN0LXRyaWdnZXJ7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9ue2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdHtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcntoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50e2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsLC5tYXQtc3RlcHBlci1ob3Jpem9udGFse2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWx7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3J7Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcntmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWR7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3Vwe2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1saW5re2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyLC5tYXQtdG9vbGJhciBoMSwubWF0LXRvb2xiYXIgaDIsLm1hdC10b29sYmFyIGgzLC5tYXQtdG9vbGJhciBoNCwubWF0LXRvb2xiYXIgaDUsLm1hdC10b29sYmFyIGg2e2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcHtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldHtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVte2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9ue2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3QtaXRlbXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3QtaXRlbSAubWF0LWxpbmV7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGluZTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3Qtb3B0aW9ue2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saW5le3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGluZTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZSAubWF0LXN1YmhlYWRlcntmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LWxpc3QtaXRlbXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saW5le3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9ue2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGluZXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LXN1YmhlYWRlcntmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9ue2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVse2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFye2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb257bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWV7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlLC5tYXQtbmVzdGVkLXRyZWUtbm9kZXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGV7b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVke292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudHtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtcmlwcGxlLWVsZW1lbnR7ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVue2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O3doaXRlLXNwYWNlOm5vd3JhcDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lciwuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJ7cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVye3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJ7ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3B7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmd7b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmd7b3BhY2l0eTouNn0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcHtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AsLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmd7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94e3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2t7cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemV7cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ3twYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94e3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0ey8qISovfUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5key8qISovfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWQ6LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWQ6bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc30ubWF0LWZvY3VzLWluZGljYXRvcntwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1kYy1mb2N1cy1pbmRpY2F0b3J7cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEpfS5tYXQtb3B0aW9ue2NvbG9yOiMyMTIxMjF9Lm1hdC1vcHRpb246aG92ZXI6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSwubWF0LW9wdGlvbjpmb2N1czpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1vcHRpb24ubWF0LWFjdGl2ZXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KTtjb2xvcjojMjEyMTIxfS5tYXQtb3B0aW9uLm1hdC1vcHRpb24tZGlzYWJsZWR7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHJpbWFyeSAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZjU3YzAwfS5tYXQtYWNjZW50IC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmZjk4MDB9Lm1hdC13YXJuIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmNDQzMzZ9Lm1hdC1vcHRncm91cC1sYWJlbHtjb2xvcjojNjE2MTYxfS5tYXQtb3B0Z3JvdXAtZGlzYWJsZWQgLm1hdC1vcHRncm91cC1sYWJlbHtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wc2V1ZG8tY2hlY2tib3h7Y29sb3I6IzYxNjE2MX0ubWF0LXBzZXVkby1jaGVja2JveDo6YWZ0ZXJ7Y29sb3I6I2ZmZn0ubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZHtjb2xvcjojYjBiMGIwfS5tYXQtcHJpbWFyeSAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLC5tYXQtcHJpbWFyeSAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRle2JhY2tncm91bmQ6I2Y1N2MwMH0ubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUsLm1hdC1hY2NlbnQgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCwubWF0LWFjY2VudCAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRle2JhY2tncm91bmQ6I2ZmOTgwMH0ubWF0LXdhcm4gLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCwubWF0LXdhcm4gLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZXtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZC5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkLC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZHtiYWNrZ3JvdW5kOiNiMGIwYjB9Lm1hdC1hcHAtYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWVsZXZhdGlvbi16MHtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejF7Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16Mntib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoze2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejR7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejV7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejZ7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo3e2JveC1zaGFkb3c6MHB4IDRweCA1cHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDdweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAycHggMTZweCAxcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16OHtib3gtc2hhZG93OjBweCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejl7Ym94LXNoYWRvdzowcHggNXB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOXB4IDEycHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMHtib3gtc2hhZG93OjBweCA2cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMHB4IDE0cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAxOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMXtib3gtc2hhZG93OjBweCA2cHggN3B4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMXB4IDE1cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAyMHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMntib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxM3tib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxM3B4IDE5cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNHB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNHtib3gtc2hhZG93OjBweCA3cHggOXB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNHB4IDIxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNXtib3gtc2hhZG93OjBweCA4cHggOXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNXB4IDIycHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAyOHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNntib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTd7Ym94LXNoYWRvdzowcHggOHB4IDExcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE3cHggMjZweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMycHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE4e2JveC1zaGFkb3c6MHB4IDlweCAxMXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOHB4IDI4cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxOXtib3gtc2hhZG93OjBweCA5cHggMTJweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTlweCAyOXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA3cHggMzZweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjB7Ym94LXNoYWRvdzowcHggMTBweCAxM3B4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMHB4IDMxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCAzOHB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMXtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIxcHggMzNweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDQwcHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIye2JveC1zaGFkb3c6MHB4IDEwcHggMTRweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjJweCAzNXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggNDJweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjN7Ym94LXNoYWRvdzowcHggMTFweCAxNHB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyM3B4IDM2cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyNHtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC10aGVtZS1sb2FkZWQtbWFya2Vye2Rpc3BsYXk6bm9uZX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbHtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbDpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbCAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWwgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcik6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojMjEyMTIxfS5tYXQtYmFkZ2V7cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1iYWRnZS1oaWRkZW4gLm1hdC1iYWRnZS1jb250ZW50e2Rpc3BsYXk6bm9uZX0ubWF0LWJhZGdlLWNvbnRlbnR7cG9zaXRpb246YWJzb2x1dGU7dGV4dC1hbGlnbjpjZW50ZXI7ZGlzcGxheTppbmxpbmUtYmxvY2s7Ym9yZGVyLXJhZGl1czo1MCU7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gMjAwbXMgZWFzZS1pbi1vdXQ7dHJhbnNmb3JtOnNjYWxlKDAuNik7b3ZlcmZsb3c6aGlkZGVuO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm5nLWFuaW1hdGUtZGlzYWJsZWQgLm1hdC1iYWRnZS1jb250ZW50LC5tYXQtYmFkZ2UtY29udGVudC5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1iYWRnZS1jb250ZW50Lm1hdC1iYWRnZS1hY3RpdmV7dHJhbnNmb3JtOm5vbmV9Lm1hdC1iYWRnZS1zbWFsbCAubWF0LWJhZGdlLWNvbnRlbnR7d2lkdGg6MTZweDtoZWlnaHQ6MTZweDtsaW5lLWhlaWdodDoxNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFib3ZlIC5tYXQtYmFkZ2UtY29udGVudHt0b3A6LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWxvdyAubWF0LWJhZGdlLWNvbnRlbnR7Ym90dG9tOi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi0xNnB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6YXV0bztyaWdodDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6LTE2cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LTE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi04cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDphdXRvO3JpZ2h0Oi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0Oi04cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LThweH0ubWF0LWJhZGdlLW1lZGl1bSAubWF0LWJhZGdlLWNvbnRlbnR7d2lkdGg6MjJweDtoZWlnaHQ6MjJweDtsaW5lLWhlaWdodDoyMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hYm92ZSAubWF0LWJhZGdlLWNvbnRlbnR7dG9wOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWxvdyAubWF0LWJhZGdlLWNvbnRlbnR7Ym90dG9tOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6LTIycHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6YXV0bztyaWdodDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0Oi0yMnB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0OmF1dG87bGVmdDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi0xMXB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0OmF1dG87cmlnaHQ6LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDotMTFweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LTExcHh9Lm1hdC1iYWRnZS1sYXJnZSAubWF0LWJhZGdlLWNvbnRlbnR7d2lkdGg6MjhweDtoZWlnaHQ6MjhweDtsaW5lLWhlaWdodDoyOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFib3ZlIC5tYXQtYmFkZ2UtY29udGVudHt0b3A6LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVsb3cgLm1hdC1iYWRnZS1jb250ZW50e2JvdHRvbTotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6LTI4cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDphdXRvO3JpZ2h0Oi0yOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDotMjhweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0OmF1dG87bGVmdDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6LTE0cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDphdXRvO3JpZ2h0Oi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDotMTRweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0OmF1dG87bGVmdDotMTRweH0ubWF0LWJhZGdlLWNvbnRlbnR7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNmNTdjMDB9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWJhZGdlLWNvbnRlbnR7b3V0bGluZTpzb2xpZCAxcHg7Ym9yZGVyLXJhZGl1czowfS5tYXQtYmFkZ2UtYWNjZW50IC5tYXQtYmFkZ2UtY29udGVudHtiYWNrZ3JvdW5kOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWJhZGdlLXdhcm4gLm1hdC1iYWRnZS1jb250ZW50e2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtYmFkZ2UtZGlzYWJsZWQgLm1hdC1iYWRnZS1jb250ZW50e2JhY2tncm91bmQ6I2JkYmRiZDtjb2xvcjojNzU3NTc1fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcntib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWJ1dHRvbiwubWF0LWljb24tYnV0dG9uLC5tYXQtc3Ryb2tlZC1idXR0b257Y29sb3I6aW5oZXJpdDtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50fS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5LC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnksLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeXtjb2xvcjojZjU3YzAwfS5tYXQtYnV0dG9uLm1hdC1hY2NlbnQsLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50LC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudHtjb2xvcjojZmY5ODAwfS5tYXQtYnV0dG9uLm1hdC13YXJuLC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm4sLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2Fybntjb2xvcjojZjQ0MzM2fS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1idXR0b24ubWF0LWFjY2VudC5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtYnV0dG9uLm1hdC13YXJuLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZC5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnkubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnQubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LWljb24tYnV0dG9uLm1hdC13YXJuLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1pY29uLWJ1dHRvbi5tYXQtYnV0dG9uLWRpc2FibGVkLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudC5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm4ubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1idXR0b24tZGlzYWJsZWQubWF0LWJ1dHRvbi1kaXNhYmxlZHtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYnV0dG9uLm1hdC13YXJuIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2FybiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm4gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1idXR0b24gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LWljb24tYnV0dG9uIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1zdHJva2VkLWJ1dHRvbiAubWF0LXJpcHBsZS1lbGVtZW50e29wYWNpdHk6LjE7YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kOiMwMDB9Lm1hdC1zdHJva2VkLWJ1dHRvbjpub3QoLm1hdC1idXR0b24tZGlzYWJsZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mbGF0LWJ1dHRvbiwubWF0LXJhaXNlZC1idXR0b24sLm1hdC1mYWIsLm1hdC1taW5pLWZhYntjb2xvcjojMjEyMTIxO2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5LC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeSwubWF0LWZhYi5tYXQtcHJpbWFyeSwubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5e2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50LC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50LC5tYXQtZmFiLm1hdC1hY2NlbnQsLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50e2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybiwubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm4sLm1hdC1mYWIubWF0LXdhcm4sLm1hdC1taW5pLWZhYi5tYXQtd2Fybntjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnkubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnQubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYnV0dG9uLWRpc2FibGVkLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnQubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm4ubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LXJhaXNlZC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZC5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtZmFiLm1hdC1wcmltYXJ5Lm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1mYWIubWF0LWFjY2VudC5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtZmFiLm1hdC13YXJuLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1mYWIubWF0LWJ1dHRvbi1kaXNhYmxlZC5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnkubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LW1pbmktZmFiLm1hdC1hY2NlbnQubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LW1pbmktZmFiLm1hdC13YXJuLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1taW5pLWZhYi5tYXQtYnV0dG9uLWRpc2FibGVkLm1hdC1idXR0b24tZGlzYWJsZWR7Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnksLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5LC5tYXQtZmFiLm1hdC1wcmltYXJ5LC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnl7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudCwubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudCwubWF0LWZhYi5tYXQtYWNjZW50LC5tYXQtbWluaS1mYWIubWF0LWFjY2VudHtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybiwubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm4sLm1hdC1mYWIubWF0LXdhcm4sLm1hdC1taW5pLWZhYi5tYXQtd2FybntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudC5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm4ubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LWZsYXQtYnV0dG9uLm1hdC1idXR0b24tZGlzYWJsZWQubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnkubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudC5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybi5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYnV0dG9uLWRpc2FibGVkLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1mYWIubWF0LXByaW1hcnkubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LWZhYi5tYXQtYWNjZW50Lm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1mYWIubWF0LXdhcm4ubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LWZhYi5tYXQtYnV0dG9uLWRpc2FibGVkLm1hdC1idXR0b24tZGlzYWJsZWQsLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeS5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtbWluaS1mYWIubWF0LWFjY2VudC5tYXQtYnV0dG9uLWRpc2FibGVkLC5tYXQtbWluaS1mYWIubWF0LXdhcm4ubWF0LWJ1dHRvbi1kaXNhYmxlZCwubWF0LW1pbmktZmFiLm1hdC1idXR0b24tZGlzYWJsZWQubWF0LWJ1dHRvbi1kaXNhYmxlZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1mYWIubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtZmFiLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LW1pbmktZmFiLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LWZhYi5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtbWluaS1mYWIubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtc3Ryb2tlZC1idXR0b246bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksLm1hdC1mbGF0LWJ1dHRvbjpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uOm5vdCgubWF0LWJ1dHRvbi1kaXNhYmxlZCk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZDpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWI6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksLm1hdC1taW5pLWZhYjpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWI6bm90KC5tYXQtYnV0dG9uLWRpc2FibGVkKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksLm1hdC1taW5pLWZhYjpub3QoLm1hdC1idXR0b24tZGlzYWJsZWQpOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiLm1hdC1idXR0b24tZGlzYWJsZWQ6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksLm1hdC1taW5pLWZhYi5tYXQtYnV0dG9uLWRpc2FibGVkOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZSwubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXB7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkLC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJke2JveC1zaGFkb3c6bm9uZX0ubWF0LWJ1dHRvbi10b2dnbGV7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtYnV0dG9uLXRvZ2dsZSAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZHtjb2xvcjojMjEyMTIxO2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1idXR0b24tdG9nZ2xlKy5tYXQtYnV0dG9uLXRvZ2dsZXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfVtkaXI9cnRsXSAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUrLm1hdC1idXR0b24tdG9nZ2xle2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWwgLm1hdC1idXR0b24tdG9nZ2xlKy5tYXQtYnV0dG9uLXRvZ2dsZXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpub25lO2JvcmRlci10b3A6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZHtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzYxNjE2MX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJke2NvbG9yOiMyMTIxMjF9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVke2NvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmR7YmFja2dyb3VuZDojZmZmfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2Vke2JhY2tncm91bmQtY29sb3I6I2JkYmRiZH0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkLC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJke2JvcmRlcjpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtYnV0dG9uLXRvZ2dsZS1sYWJlbC1jb250ZW50e2xpbmUtaGVpZ2h0OjQ4cHh9Lm1hdC1jYXJke2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtY2FyZDpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2FyZC5tYXQtY2FyZC1mbGF0Om5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNhcmQtc3VidGl0bGV7Y29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94LWZyYW1le2JvcmRlci1jb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3gtY2hlY2ttYXJre2ZpbGw6I2ZmZn0ubWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoe3N0cm9rZTojZmZmICFpbXBvcnRhbnR9Lm1hdC1jaGVja2JveC1taXhlZG1hcmt7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtcHJpbWFyeSAubWF0LWNoZWNrYm94LWJhY2tncm91bmQsLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC1wcmltYXJ5IC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1hY2NlbnQgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kLC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtYWNjZW50IC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC13YXJuIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCwubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LXdhcm4gLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWNoZWNrYm94LWRpc2FibGVkLm1hdC1jaGVja2JveC1jaGVja2VkIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCwubWF0LWNoZWNrYm94LWRpc2FibGVkLm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOiNiMGIwYjB9Lm1hdC1jaGVja2JveC1kaXNhYmxlZDpub3QoLm1hdC1jaGVja2JveC1jaGVja2VkKSAubWF0LWNoZWNrYm94LWZyYW1le2JvcmRlci1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWQgLm1hdC1jaGVja2JveC1sYWJlbHtjb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3ggLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1jaGVja2JveC1jaGVja2VkOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtY2hlY2tib3g6YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQ6I2Y1N2MwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWQ6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LWNoZWNrYm94OmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQ6I2ZmOTgwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWQ6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1jaGVja2JveDphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcHtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzIxMjEyMX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAgLm1hdC1jaGlwLXJlbW92ZXtjb2xvcjojMjEyMTIxO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwOm5vdCgubWF0LWNoaXAtZGlzYWJsZWQpOmFjdGl2ZXtib3gtc2hhZG93OjBweCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAzcHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcDpub3QoLm1hdC1jaGlwLWRpc2FibGVkKSAubWF0LWNoaXAtcmVtb3ZlOmhvdmVye29wYWNpdHk6LjU0fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1kaXNhYmxlZHtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcDo6YWZ0ZXJ7YmFja2dyb3VuZDojMDAwfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnkgLm1hdC1jaGlwLXJlbW92ZXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm57YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuIC5tYXQtY2hpcC1yZW1vdmV7Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnR7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnQgLm1hdC1jaGlwLXJlbW92ZXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtdGFibGV7YmFja2dyb3VuZDojZmZmfS5tYXQtdGFibGUgdGhlYWQsLm1hdC10YWJsZSB0Ym9keSwubWF0LXRhYmxlIHRmb290LG1hdC1oZWFkZXItcm93LG1hdC1yb3csbWF0LWZvb3Rlci1yb3csW21hdC1oZWFkZXItcm93XSxbbWF0LXJvd10sW21hdC1mb290ZXItcm93XSwubWF0LXRhYmxlLXN0aWNreXtiYWNrZ3JvdW5kOmluaGVyaXR9bWF0LXJvdyxtYXQtaGVhZGVyLXJvdyxtYXQtZm9vdGVyLXJvdyx0aC5tYXQtaGVhZGVyLWNlbGwsdGQubWF0LWNlbGwsdGQubWF0LWZvb3Rlci1jZWxse2JvcmRlci1ib3R0b20tY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtaGVhZGVyLWNlbGx7Y29sb3I6IzYxNjE2MX0ubWF0LWNlbGwsLm1hdC1mb290ZXItY2VsbHtjb2xvcjojMjEyMTIxfS5tYXQtY2FsZW5kYXItYXJyb3d7ZmlsbDpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZSwubWF0LWRhdGVwaWNrZXItY29udGVudCAubWF0LWNhbGVuZGFyLW5leHQtYnV0dG9uLC5tYXQtZGF0ZXBpY2tlci1jb250ZW50IC5tYXQtY2FsZW5kYXItcHJldmlvdXMtYnV0dG9ue2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcntjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXItZGl2aWRlcjo6YWZ0ZXJ7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVse2NvbG9yOiM2MTYxNjF9Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudCwubWF0LWRhdGUtcmFuZ2UtaW5wdXQtc2VwYXJhdG9ye2NvbG9yOiMyMTIxMjE7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZD4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpe2NvbG9yOiM3NTc1NzV9Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZGF0ZS1yYW5nZS1pbnB1dC1zZXBhcmF0b3J7Y29sb3I6Izc1NzU3NX0ubWF0LWNhbGVuZGFyLWJvZHktaW4tcHJldmlld3tjb2xvcjpyZ2JhKDAsMCwwLC4yNCl9Lm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkPi5tYXQtY2FsZW5kYXItYm9keS10b2RheTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMTgpfS5tYXQtY2FsZW5kYXItYm9keS1pbi1yYW5nZTo6YmVmb3Jle2JhY2tncm91bmQ6cmdiYSgyNDUsMTI0LDAsLjIpfS5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbCwubWF0LWNhbGVuZGFyLWJvZHktaW4tY29tcGFyaXNvbi1yYW5nZTo6YmVmb3Jle2JhY2tncm91bmQ6cmdiYSgyNDksMTcxLDAsLjIpfS5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWJyaWRnZS1zdGFydDo6YmVmb3JlLFtkaXI9cnRsXSAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1icmlkZ2UtZW5kOjpiZWZvcmV7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMjQ1LCAxMjQsIDAsIDAuMikgNTAlLCByZ2JhKDI0OSwgMTcxLCAwLCAwLjIpIDUwJSl9Lm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLWVuZDo6YmVmb3JlLFtkaXI9cnRsXSAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1icmlkZ2Utc3RhcnQ6OmJlZm9yZXtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCh0byBsZWZ0LCByZ2JhKDI0NSwgMTI0LCAwLCAwLjIpIDUwJSwgcmdiYSgyNDksIDE3MSwgMCwgMC4yKSA1MCUpfS5tYXQtY2FsZW5kYXItYm9keS1pbi1yYW5nZT4ubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwsLm1hdC1jYWxlbmRhci1ib2R5LWluLWNvbXBhcmlzb24tcmFuZ2UubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U6OmFmdGVye2JhY2tncm91bmQ6I2E4ZGFiNX0ubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQsLm1hdC1jYWxlbmRhci1ib2R5LWluLWNvbXBhcmlzb24tcmFuZ2U+Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQ6IzQ2YTM1ZX0ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ1LDEyNCwwLC40KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWNhbGVuZGFyLWJvZHktY2VsbDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3Zlcj4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpLC5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlPi5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnQ6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbCksLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZT4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjMpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50e2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LWluLXJhbmdlOjpiZWZvcmV7YmFja2dyb3VuZDpyZ2JhKDI1NSwxNTIsMCwuMil9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwsLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktaW4tY29tcGFyaXNvbi1yYW5nZTo6YmVmb3Jle2JhY2tncm91bmQ6cmdiYSgyNDksMTcxLDAsLjIpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLXN0YXJ0OjpiZWZvcmUsLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCBbZGlyPXJ0bF0gLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLWVuZDo6YmVmb3Jle2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDI1NSwgMTUyLCAwLCAwLjIpIDUwJSwgcmdiYSgyNDksIDE3MSwgMCwgMC4yKSA1MCUpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLWVuZDo6YmVmb3JlLC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgW2Rpcj1ydGxdIC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWJyaWRnZS1zdGFydDo6YmVmb3Jle2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIGxlZnQsIHJnYmEoMjU1LCAxNTIsIDAsIDAuMikgNTAlLCByZ2JhKDI0OSwgMTcxLCAwLCAwLjIpIDUwJSl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U+Lm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsLC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LWluLWNvbXBhcmlzb24tcmFuZ2UubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U6OmFmdGVye2JhY2tncm91bmQ6I2E4ZGFiNX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCwubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5tYXQtY2FsZW5kYXItYm9keS1pbi1jb21wYXJpc29uLXJhbmdlPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kOiM0NmEzNWV9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQ+Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjQpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktY2VsbDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3Zlcj4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpLC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmU+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsKSwubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmU+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U6OmJlZm9yZXtiYWNrZ3JvdW5kOnJnYmEoMjQ0LDY3LDU0LC4yKX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwsLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LWluLWNvbXBhcmlzb24tcmFuZ2U6OmJlZm9yZXtiYWNrZ3JvdW5kOnJnYmEoMjQ5LDE3MSwwLC4yKX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1icmlkZ2Utc3RhcnQ6OmJlZm9yZSwubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiBbZGlyPXJ0bF0gLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLWVuZDo6YmVmb3Jle2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDI0NCwgNjcsIDU0LCAwLjIpIDUwJSwgcmdiYSgyNDksIDE3MSwgMCwgMC4yKSA1MCUpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWJyaWRnZS1lbmQ6OmJlZm9yZSwubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiBbZGlyPXJ0bF0gLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLXN0YXJ0OjpiZWZvcmV7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gbGVmdCwgcmdiYSgyNDQsIDY3LCA1NCwgMC4yKSA1MCUsIHJnYmEoMjQ5LCAxNzEsIDAsIDAuMikgNTAlKX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U+Lm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsLC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1pbi1jb21wYXJpc29uLXJhbmdlLm1hdC1jYWxlbmRhci1ib2R5LWluLXJhbmdlOjphZnRlcntiYWNrZ3JvdW5kOiNhOGRhYjV9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkLC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1pbi1jb21wYXJpc29uLXJhbmdlPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kOiM0NmEzNWV9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZD4ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuNCl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGw6bm90KC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZCk6aG92ZXI+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsKSwubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAuY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZT4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpLC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmU+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC4zKX0ubWF0LWRhdGVwaWNrZXItY29udGVudC10b3VjaHtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmV7Y29sb3I6I2Y1N2MwMH0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtYWNjZW50e2NvbG9yOiNmZjk4MDB9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUubWF0LXdhcm57Y29sb3I6I2Y0NDMzNn0ubWF0LWRhdGUtcmFuZ2UtaW5wdXQtaW5uZXJbZGlzYWJsZWRde2NvbG9yOiM3NTc1NzV9Lm1hdC1kaWFsb2ctY29udGFpbmVye2JveC1zaGFkb3c6MHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRpdmlkZXJ7Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1kaXZpZGVyLXZlcnRpY2Fse2JvcmRlci1yaWdodC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1leHBhbnNpb24tcGFuZWx7YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1leHBhbnNpb24tcGFuZWw6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWFjdGlvbi1yb3d7Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1leHBhbnNpb24tcGFuZWwgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksLm1hdC1leHBhbnNpb24tcGFuZWwgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSwubWF0LWV4cGFuc2lvbi1wYW5lbDpub3QoLm1hdC1leHBhbmRlZCkgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyOmhvdmVyOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LWV4cGFuc2lvbi1wYW5lbDpub3QoLm1hdC1leHBhbmRlZCk6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI6aG92ZXJ7YmFja2dyb3VuZDojZmZmfX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGV7Y29sb3I6IzIxMjEyMX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb24sLm1hdC1leHBhbnNpb24taW5kaWNhdG9yOjphZnRlcntjb2xvcjojNjE2MTYxfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGUsLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0gLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9ue2NvbG9yOmluaGVyaXR9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVye2hlaWdodDo0OHB4fS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5tYXQtZXhwYW5kZWR7aGVpZ2h0OjY0cHh9Lm1hdC1mb3JtLWZpZWxkLWxhYmVse2NvbG9yOnJnYmEoOTcsOTcsOTcsLjYpfS5tYXQtaGludHtjb2xvcjpyZ2JhKDk3LDk3LDk3LC42KX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50e2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtd2Fybntjb2xvcjojZjQ0MzM2fS5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2Vye2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLXJpcHBsZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LWFjY2VudHtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LXdhcm57YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LWFjY2VudCAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWQ6bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKS5tYXQtd2FybiAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC1hY2NlbnQsLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXJ7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtcmlwcGxlLC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LWFjY2VudHtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1lcnJvcntjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtbGFiZWx7Y29sb3I6IzYxNjE2MX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1oaW50e2NvbG9yOiM2MTYxNjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC40MikgMCUsIHJnYmEoMCwgMCwgMCwgMC40MikgMzMlLCB0cmFuc3BhcmVudCAwJSk7YmFja2dyb3VuZC1zaXplOjRweCAxMDAlO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtZmxleHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC1mbGV4e2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2NvbG9yOiM3NTc1NzV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5le2NvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtYWNjZW50IC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtd2FybiAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtaW52YWxpZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtbGFiZWx7Y29sb3I6Izc1NzU3NX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5le2NvbG9yOnJnYmEoMCwwLDAsLjA2KX0ubWF0LWljb24ubWF0LXByaW1hcnl7Y29sb3I6I2Y1N2MwMH0ubWF0LWljb24ubWF0LWFjY2VudHtjb2xvcjojZmY5ODAwfS5tYXQtaWNvbi5tYXQtd2Fybntjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0IC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7Y29sb3I6IzYxNjE2MX0ubWF0LWlucHV0LWVsZW1lbnQ6ZGlzYWJsZWQsLm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb2xvcjojNzU3NTc1fS5tYXQtaW5wdXQtZWxlbWVudHtjYXJldC1jb2xvcjojZjU3YzAwfS5tYXQtaW5wdXQtZWxlbWVudDo6cGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudDo6LW1vei1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnQ6LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWZvcm0tZmllbGQubWF0LWFjY2VudCAubWF0LWlucHV0LWVsZW1lbnR7Y2FyZXQtY29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LXdhcm4gLm1hdC1pbnB1dC1lbGVtZW50LC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtaW5wdXQtZWxlbWVudHtjYXJldC1jb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb2xvcjojZjQ0MzM2fS5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1pdGVte2NvbG9yOiMyMTIxMjF9Lm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LW9wdGlvbntjb2xvcjojMjEyMTIxfS5tYXQtbGlzdC1iYXNlIC5tYXQtc3ViaGVhZGVye2NvbG9yOiM2MTYxNjF9Lm1hdC1saXN0LWl0ZW0tZGlzYWJsZWR7YmFja2dyb3VuZC1jb2xvcjojZWVlfS5tYXQtbGlzdC1vcHRpb246aG92ZXIsLm1hdC1saXN0LW9wdGlvbjpmb2N1cywubWF0LW5hdi1saXN0IC5tYXQtbGlzdC1pdGVtOmhvdmVyLC5tYXQtbmF2LWxpc3QgLm1hdC1saXN0LWl0ZW06Zm9jdXMsLm1hdC1hY3Rpb24tbGlzdCAubWF0LWxpc3QtaXRlbTpob3ZlciwubWF0LWFjdGlvbi1saXN0IC5tYXQtbGlzdC1pdGVtOmZvY3Vze2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uLC5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uOmhvdmVyLC5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uOmZvY3Vze2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtbWVudS1wYW5lbHtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1tZW51LXBhbmVsOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtbWVudS1pdGVte2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6IzIxMjEyMX0ubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF0sLm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRdIC5tYXQtbWVudS1zdWJtZW51LWljb24sLm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRdIC5tYXQtaWNvbi1uby1jb2xvcntjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1tZW51LWl0ZW0gLm1hdC1pY29uLW5vLWNvbG9yLC5tYXQtbWVudS1zdWJtZW51LWljb257Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtbWVudS1pdGVtOmhvdmVyOm5vdChbZGlzYWJsZWRdKSwubWF0LW1lbnUtaXRlbS5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdChbZGlzYWJsZWRdKSwubWF0LW1lbnUtaXRlbS5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoW2Rpc2FibGVkXSksLm1hdC1tZW51LWl0ZW0taGlnaGxpZ2h0ZWQ6bm90KFtkaXNhYmxlZF0pe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtcGFnaW5hdG9ye2JhY2tncm91bmQ6I2ZmZn0ubWF0LXBhZ2luYXRvciwubWF0LXBhZ2luYXRvci1wYWdlLXNpemUgLm1hdC1zZWxlY3QtdHJpZ2dlcntjb2xvcjojNjE2MTYxfS5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudCwubWF0LXBhZ2luYXRvci1pbmNyZW1lbnR7Ym9yZGVyLXRvcDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpO2JvcmRlci1yaWdodDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpfS5tYXQtcGFnaW5hdG9yLWZpcnN0LC5tYXQtcGFnaW5hdG9yLWxhc3R7Ym9yZGVyLXRvcDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpfS5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIC5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudCwubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXSAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnQsLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1wYWdpbmF0b3ItZmlyc3QsLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1wYWdpbmF0b3ItbGFzdHtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcGFnaW5hdG9yLWNvbnRhaW5lcnttaW4taGVpZ2h0OjU2cHh9Lm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZHtmaWxsOiNmZGRlYmZ9Lm1hdC1wcm9ncmVzcy1iYXItYnVmZmVye2JhY2tncm91bmQtY29sb3I6I2ZkZGViZn0ubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudCAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5ke2ZpbGw6I2ZmZTViZn0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50IC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZmU1YmZ9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudCAubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm4gLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZHtmaWxsOiNmY2QwY2R9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm4gLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVye2JhY2tncm91bmQtY29sb3I6I2ZjZDBjZH0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2FybiAubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1wcm9ncmVzcy1zcGlubmVyIGNpcmNsZSwubWF0LXNwaW5uZXIgY2lyY2xle3N0cm9rZTojZjU3YzAwfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtYWNjZW50IGNpcmNsZSwubWF0LXNwaW5uZXIubWF0LWFjY2VudCBjaXJjbGV7c3Ryb2tlOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC13YXJuIGNpcmNsZSwubWF0LXNwaW5uZXIubWF0LXdhcm4gY2lyY2xle3N0cm9rZTojZjQ0MzM2fS5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjojNjE2MTYxfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmFkaW8taW5uZXItY2lyY2xlLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmFkaW8tcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnQ6bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUsLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnk6YWN0aXZlIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGV7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1vdXRlci1jaXJjbGV7Ym9yZGVyLWNvbG9yOiNmZjk4MDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudCAubWF0LXJhZGlvLWlubmVyLWNpcmNsZSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtcmFkaW8tcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnQ6bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50OmFjdGl2ZSAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxle2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZXtib3JkZXItY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2FybiAubWF0LXJhZGlvLWlubmVyLWNpcmNsZSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2FybiAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50Om5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuOmFjdGl2ZSAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxle2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWQubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1vdXRlci1jaXJjbGUsLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8tcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8taW5uZXItY2lyY2xle2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZCAubWF0LXJhZGlvLWxhYmVsLWNvbnRlbnR7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtc2VsZWN0LXZhbHVle2NvbG9yOiMyMTIxMjF9Lm1hdC1zZWxlY3QtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtc2VsZWN0LWRpc2FibGVkIC5tYXQtc2VsZWN0LXZhbHVle2NvbG9yOiM3NTc1NzV9Lm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6IzYxNjE2MX0ubWF0LXNlbGVjdC1wYW5lbHtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1zZWxlY3QtcGFuZWw6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zZWxlY3QtcGFuZWwgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1wcmltYXJ5IC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnQgLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXdhcm4gLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1pbnZhbGlkIC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtZGlzYWJsZWQgLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6Izc1NzU3NX0ubWF0LWRyYXdlci1jb250YWluZXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXIubWF0LWRyYXdlci1wdXNoe2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWRyYXdlcjpub3QoLm1hdC1kcmF3ZXItc2lkZSl7Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kcmF3ZXItc2lkZXtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWRyYXdlci1zaWRlLm1hdC1kcmF3ZXItZW5ke2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdIC5tYXQtZHJhd2VyLXNpZGV7Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKTtib3JkZXItcmlnaHQ6bm9uZX1bZGlyPXJ0bF0gLm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZHtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLWJhY2tkcm9wLm1hdC1kcmF3ZXItc2hvd257YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC42KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtYmFye2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtYmFye2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtYmFye2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDQsNjcsNTQsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXNsaWRlLXRvZ2dsZTpub3QoLm1hdC1jaGVja2VkKSAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LXNsaWRlLXRvZ2dsZS10aHVtYntib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LXNsaWRlLXRvZ2dsZS1iYXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdHJhY2stZmlsbCwubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1wcmltYXJ5IC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dHtjb2xvcjojZmZmfS5tYXQtcHJpbWFyeSAubWF0LXNsaWRlci1mb2N1cy1yaW5ne2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjIpfS5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLXRyYWNrLWZpbGwsLm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7Y29sb3I6I2ZmZn0ubWF0LWFjY2VudCAubWF0LXNsaWRlci1mb2N1cy1yaW5ne2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjIpfS5tYXQtd2FybiAubWF0LXNsaWRlci10cmFjay1maWxsLC5tYXQtd2FybiAubWF0LXNsaWRlci10aHVtYiwubWF0LXdhcm4gLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtd2FybiAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e2NvbG9yOiNmZmZ9Lm1hdC13YXJuIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmd7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuMil9Lm1hdC1zbGlkZXI6aG92ZXIgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZCwubWF0LXNsaWRlci5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmQsLm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdHJhY2stZmlsbCwubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1kaXNhYmxlZDpob3ZlciAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZSAubWF0LXNsaWRlci1mb2N1cy1yaW5ne2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKSAubWF0LXNsaWRlci10aHVtYntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3ZlciAubWF0LXNsaWRlci10aHVtYiwubWF0LXNsaWRlci1taW4tdmFsdWU6bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1ie2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3Zlci5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRodW1iLC5tYXQtc2xpZGVyLW1pbi12YWx1ZTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10aHVtYntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLWhhcy10aWNrcyAubWF0LXNsaWRlci13cmFwcGVyOjphZnRlcntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuNyl9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10aWNrc3tiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpO2JhY2tncm91bmQtaW1hZ2U6LW1vei1yZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KDAuMDAwMWRlZywgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCl9Lm1hdC1zbGlkZXItdmVydGljYWwgLm1hdC1zbGlkZXItdGlja3N7YmFja2dyb3VuZC1pbWFnZTpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCl9Lm1hdC1zdGVwLWhlYWRlci5jZGsta2V5Ym9hcmQtZm9jdXNlZCwubWF0LXN0ZXAtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWQsLm1hdC1zdGVwLWhlYWRlcjpob3Zlcjpub3QoW2FyaWEtZGlzYWJsZWRdKSwubWF0LXN0ZXAtaGVhZGVyOmhvdmVyW2FyaWEtZGlzYWJsZWQ9ZmFsc2Vde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtc3RlcC1oZWFkZXI6aG92ZXJbYXJpYS1kaXNhYmxlZD10cnVlXXtjdXJzb3I6ZGVmYXVsdH1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtc3RlcC1oZWFkZXI6aG92ZXJ7YmFja2dyb3VuZDpub25lfX0ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1sYWJlbCwubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1vcHRpb25hbHtjb2xvcjojNjE2MTYxfS5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb257YmFja2dyb3VuZC1jb2xvcjojNjE2MTYxO2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtaWNvbi1zZWxlY3RlZCwubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1pY29uLXN0YXRlLWRvbmUsLm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1lZGl0e2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXIubWF0LWFjY2VudCAubWF0LXN0ZXAtaWNvbntjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXIubWF0LWFjY2VudCAubWF0LXN0ZXAtaWNvbi1zZWxlY3RlZCwubWF0LXN0ZXAtaGVhZGVyLm1hdC1hY2NlbnQgLm1hdC1zdGVwLWljb24tc3RhdGUtZG9uZSwubWF0LXN0ZXAtaGVhZGVyLm1hdC1hY2NlbnQgLm1hdC1zdGVwLWljb24tc3RhdGUtZWRpdHtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LXN0ZXAtaGVhZGVyLm1hdC13YXJuIC5tYXQtc3RlcC1pY29ue2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlci5tYXQtd2FybiAubWF0LXN0ZXAtaWNvbi1zZWxlY3RlZCwubWF0LXN0ZXAtaGVhZGVyLm1hdC13YXJuIC5tYXQtc3RlcC1pY29uLXN0YXRlLWRvbmUsLm1hdC1zdGVwLWhlYWRlci5tYXQtd2FybiAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1lZGl0e2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24tc3RhdGUtZXJyb3J7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtjb2xvcjojZjQ0MzM2fS5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWFjdGl2ZXtjb2xvcjojMjEyMTIxfS5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWVycm9ye2NvbG9yOiNmNDQzMzZ9Lm1hdC1zdGVwcGVyLWhvcml6b250YWwsLm1hdC1zdGVwcGVyLXZlcnRpY2Fse2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXN0ZXBwZXItdmVydGljYWwtbGluZTo6YmVmb3Jle2JvcmRlci1sZWZ0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXI6OmJlZm9yZSwubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXI6OmFmdGVyLC5tYXQtc3RlcHBlci1ob3Jpem9udGFsLWxpbmV7Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVye2hlaWdodDo3MnB4fS5tYXQtc3RlcHBlci1sYWJlbC1wb3NpdGlvbi1ib3R0b20gLm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyLC5tYXQtdmVydGljYWwtc3RlcHBlci1oZWFkZXJ7cGFkZGluZzoyNHB4IDI0cHh9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsLWxpbmU6OmJlZm9yZXt0b3A6LTE2cHg7Ym90dG9tOi0xNnB4fS5tYXQtc3RlcHBlci1sYWJlbC1wb3NpdGlvbi1ib3R0b20gLm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyOjphZnRlciwubWF0LXN0ZXBwZXItbGFiZWwtcG9zaXRpb24tYm90dG9tIC5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcjo6YmVmb3Jle3RvcDozNnB4fS5tYXQtc3RlcHBlci1sYWJlbC1wb3NpdGlvbi1ib3R0b20gLm1hdC1zdGVwcGVyLWhvcml6b250YWwtbGluZXt0b3A6MzZweH0ubWF0LXNvcnQtaGVhZGVyLWFycm93e2NvbG9yOiM2MTYxNjF9Lm1hdC10YWItbmF2LWJhciwubWF0LXRhYi1oZWFkZXJ7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgwLDAsMCwuMTIpfS5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlciAubWF0LXRhYi1uYXYtYmFyLC5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlciAubWF0LXRhYi1oZWFkZXJ7Ym9yZGVyLXRvcDoxcHggc29saWQgcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1ib3R0b206bm9uZX0ubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1saW5re2NvbG9yOiMyMTIxMjF9Lm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWR7Y29sb3I6Izc1NzU3NX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue2JvcmRlci1jb2xvcjojMjEyMTIxfS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOiM3NTc1NzV9Lm1hdC10YWItZ3JvdXBbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV0gLm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLW5hdi1iYXJbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV17Ym9yZGVyLWJvdHRvbTpub25lO2JvcmRlci10b3A6bm9uZX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNjcsMzgsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtaW5rLWJhciwubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5IC5tYXQtaW5rLWJhcntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXIgLm1hdC1pbmstYmFyLC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1pbmstYmFyLC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXIgLm1hdC1pbmstYmFyLC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyMjQsMTc4LC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtaW5rLWJhciwubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQgLm1hdC1pbmstYmFye2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIgLm1hdC1pbmstYmFyLC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtaW5rLWJhciwubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LWluay1iYXIsLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtd2FybiAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtd2FybiAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtd2FybiAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuIC5tYXQtaW5rLWJhciwubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuIC5tYXQtaW5rLWJhcntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC1pbmstYmFyLC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1pbmstYmFyLC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC1pbmstYmFyLC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNjcsMzgsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItbGluay1jb250YWluZXIsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb257YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC10YWItbGluaywubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXRhYi1saW5re2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmUsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXIgLm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmUsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlciAubWF0LWZvY3VzLWluZGljYXRvcjo6YmVmb3Jle2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXIgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXIgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24gLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIyNCwxNzgsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItbGluay1jb250YWluZXIsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb257YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWwsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmssLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmt7Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWR7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LWZvY3VzLWluZGljYXRvcjo6YmVmb3JlLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIgLm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmUsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmV7Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItbGluay1jb250YWluZXIsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb257YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC10YWItbGluaywubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXRhYi1saW5re2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmUsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmUsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlciAubWF0LWZvY3VzLWluZGljYXRvcjo6YmVmb3Jle2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24gLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRvb2xiYXJ7YmFja2dyb3VuZDojZjU3YzAwO2NvbG9yOiMyMTIxMjF9Lm1hdC10b29sYmFyLm1hdC1wcmltYXJ5e2JhY2tncm91bmQ6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtYWNjZW50e2JhY2tncm91bmQ6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtd2FybntiYWNrZ3JvdW5kOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSwubWF0LXRvb2xiYXIgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZSwubWF0LXRvb2xiYXIgLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC10b29sYmFyIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LXRvb2xiYXIgLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LXRvb2xiYXIgLm1hdC1zZWxlY3QtdmFsdWUsLm1hdC10b29sYmFyIC5tYXQtc2VsZWN0LWFycm93LC5tYXQtdG9vbGJhciAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6aW5oZXJpdH0ubWF0LXRvb2xiYXIgLm1hdC1pbnB1dC1lbGVtZW50e2NhcmV0LWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LXRvb2xiYXItbXVsdGlwbGUtcm93c3ttaW4taGVpZ2h0OjY0cHh9Lm1hdC10b29sYmFyLXJvdywubWF0LXRvb2xiYXItc2luZ2xlLXJvd3toZWlnaHQ6NjRweH1AbWVkaWEobWF4LXdpZHRoOiA1OTlweCl7Lm1hdC10b29sYmFyLW11bHRpcGxlLXJvd3N7bWluLWhlaWdodDo1NnB4fS5tYXQtdG9vbGJhci1yb3csLm1hdC10b29sYmFyLXNpbmdsZS1yb3d7aGVpZ2h0OjU2cHh9fS5tYXQtdG9vbHRpcHtiYWNrZ3JvdW5kOnJnYmEoOTcsOTcsOTcsLjkpfS5tYXQtdHJlZXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC10cmVlLW5vZGUsLm1hdC1uZXN0ZWQtdHJlZS1ub2Rle2NvbG9yOiMyMTIxMjF9Lm1hdC10cmVlLW5vZGV7bWluLWhlaWdodDo0OHB4fS5tYXQtc25hY2stYmFyLWNvbnRhaW5lcntjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KTtiYWNrZ3JvdW5kOiMzMjMyMzI7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbntjb2xvcjojZmY5ODAwfWJvZHl7b3ZlcmZsb3c6aGlkZGVufS5jZGstb3ZlcmxheS1jb250YWluZXJ7Y29udGFpbjpzdHJpY3R9YTpub3QoLm1hdC1idXR0b24sLm1hdC1pY29uLWJ1dHRvbil7Y29sb3I6IzE5NzZkMn1hOm5vdCgubWF0LWJ1dHRvbiwubWF0LWljb24tYnV0dG9uKTp2aXNpdGVke2NvbG9yOiM3YjFmYTJ9Ym9keS5kYXJrLW1vZGV7YmFja2dyb3VuZC1jb2xvcjojMzAzMDMwfWJvZHkuZGFyay1tb2RlIGE6bm90KC5tYXQtYnV0dG9uLC5tYXQtaWNvbi1idXR0b24pe2NvbG9yOiM0MmE1ZjV9Ym9keS5kYXJrLW1vZGUgYTpub3QoLm1hdC1idXR0b24sLm1hdC1pY29uLWJ1dHRvbik6dmlzaXRlZHtjb2xvcjojYmE2OGM4fWJvZHkuZGFyay1tb2RlIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX1ib2R5LmRhcmstbW9kZSAubWF0LW9wdGlvbntjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtb3B0aW9uOmhvdmVyOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC1vcHRpb246Zm9jdXM6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMjU1LDI1NSwyNTUsLjA0KX1ib2R5LmRhcmstbW9kZSAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMDQpfWJvZHkuZGFyay1tb2RlIC5tYXQtb3B0aW9uLm1hdC1hY3RpdmV7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4wNCk7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LW9wdGlvbi5tYXQtb3B0aW9uLWRpc2FibGVke2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjUpfWJvZHkuZGFyay1tb2RlIC5tYXQtcHJpbWFyeSAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtYWNjZW50IC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC13YXJuIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1vcHRncm91cC1sYWJlbHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LW9wdGdyb3VwLWRpc2FibGVkIC5tYXQtb3B0Z3JvdXAtbGFiZWx7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1wc2V1ZG8tY2hlY2tib3h7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9Ym9keS5kYXJrLW1vZGUgLm1hdC1wc2V1ZG8tY2hlY2tib3g6OmFmdGVye2NvbG9yOiMzMDMwMzB9Ym9keS5kYXJrLW1vZGUgLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWR7Y29sb3I6IzY4Njg2OH1ib2R5LmRhcmstbW9kZSAubWF0LXByaW1hcnkgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCxib2R5LmRhcmstbW9kZSAubWF0LXByaW1hcnkgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZXtiYWNrZ3JvdW5kOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCxib2R5LmRhcmstbW9kZSAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlLGJvZHkuZGFyay1tb2RlIC5tYXQtYWNjZW50IC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1hY2NlbnQgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZXtiYWNrZ3JvdW5kOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC13YXJuIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQsYm9keS5kYXJrLW1vZGUgLm1hdC13YXJuIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGV7YmFja2dyb3VuZDojZjQ0MzM2fWJvZHkuZGFyay1tb2RlIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWR7YmFja2dyb3VuZDojNjg2ODY4fWJvZHkuZGFyay1tb2RlIC5tYXQtYXBwLWJhY2tncm91bmQsYm9keS5kYXJrLW1vZGUubWF0LWFwcC1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6IzMwMzAzMDtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtZWxldmF0aW9uLXowe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWVsZXZhdGlvbi16MXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtZWxldmF0aW9uLXoye2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejN7Ym94LXNoYWRvdzowcHggM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWVsZXZhdGlvbi16NHtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWVsZXZhdGlvbi16NXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA1cHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWVsZXZhdGlvbi16Nntib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejd7Ym94LXNoYWRvdzowcHggNHB4IDVweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggN3B4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDJweCAxNnB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtZWxldmF0aW9uLXo4e2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWVsZXZhdGlvbi16OXtib3gtc2hhZG93OjBweCA1cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA5cHggMTJweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE2cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejEwe2JveC1zaGFkb3c6MHB4IDZweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEwcHggMTRweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDE4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejExe2JveC1zaGFkb3c6MHB4IDZweCA3cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDExcHggMTVweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDIwcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejEye2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejEze2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEzcHggMTlweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI0cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejE0e2JveC1zaGFkb3c6MHB4IDdweCA5cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE0cHggMjFweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI2cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejE1e2JveC1zaGFkb3c6MHB4IDhweCA5cHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE1cHggMjJweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDI4cHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejE2e2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtZWxldmF0aW9uLXoxN3tib3gtc2hhZG93OjBweCA4cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTdweCAyNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWVsZXZhdGlvbi16MTh7Ym94LXNoYWRvdzowcHggOXB4IDExcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE4cHggMjhweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggN3B4IDM0cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejE5e2JveC1zaGFkb3c6MHB4IDlweCAxMnB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOXB4IDI5cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNnB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtZWxldmF0aW9uLXoyMHtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIwcHggMzFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDM4cHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejIxe2JveC1zaGFkb3c6MHB4IDEwcHggMTNweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjFweCAzM3B4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggNDBweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWVsZXZhdGlvbi16MjJ7Ym94LXNoYWRvdzowcHggMTBweCAxNHB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMnB4IDM1cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCA0MnB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtZWxldmF0aW9uLXoyM3tib3gtc2hhZG93OjBweCAxMXB4IDE0cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIzcHggMzZweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ0cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1lbGV2YXRpb24tejI0e2JveC1zaGFkb3c6MHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXRoZW1lLWxvYWRlZC1tYXJrZXJ7ZGlzcGxheTpub25lfWJvZHkuZGFyay1tb2RlIC5tYXQtYXV0b2NvbXBsZXRlLXBhbmVse2JhY2tncm91bmQ6IzQyNDI0Mjtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1hY3RpdmUpOm5vdCg6aG92ZXIpe2JhY2tncm91bmQ6IzQyNDI0Mn1ib2R5LmRhcmstbW9kZSAubWF0LWF1dG9jb21wbGV0ZS1wYW5lbCAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1iYWRnZS1jb250ZW50e2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZWY2YzAwfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgYm9keS5kYXJrLW1vZGUgLm1hdC1iYWRnZS1jb250ZW50e291dGxpbmU6c29saWQgMXB4O2JvcmRlci1yYWRpdXM6MH1ib2R5LmRhcmstbW9kZSAubWF0LWJhZGdlLWFjY2VudCAubWF0LWJhZGdlLWNvbnRlbnR7YmFja2dyb3VuZDojZWY2YzAwO2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1iYWRnZS13YXJuIC5tYXQtYmFkZ2UtY29udGVudHtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LWJhZGdlLWRpc2FibGVkIC5tYXQtYmFkZ2UtY29udGVudHtiYWNrZ3JvdW5kOiM2ZTZlNmU7Y29sb3I6IzYxNjE2MX1ib2R5LmRhcmstbW9kZSAubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJ7Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZDojNDI0MjQyO2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1idXR0b24sYm9keS5kYXJrLW1vZGUgLm1hdC1pY29uLWJ1dHRvbixib2R5LmRhcmstbW9kZSAubWF0LXN0cm9rZWQtYnV0dG9ue2NvbG9yOmluaGVyaXQ7YmFja2dyb3VuZDp0cmFuc3BhcmVudH1ib2R5LmRhcmstbW9kZSAubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeSxib2R5LmRhcmstbW9kZSAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5LGJvZHkuZGFyay1tb2RlIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnl7Y29sb3I6I2VmNmMwMH1ib2R5LmRhcmstbW9kZSAubWF0LWJ1dHRvbi5tYXQtYWNjZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudCxib2R5LmRhcmstbW9kZSAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnR7Y29sb3I6I2VmNmMwMH1ib2R5LmRhcmstbW9kZSAubWF0LWJ1dHRvbi5tYXQtd2Fybixib2R5LmRhcmstbW9kZSAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuLGJvZHkuZGFyay1tb2RlIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm57Y29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLm1hdC1hY2NlbnQubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LWJ1dHRvbi5tYXQtd2Fybi5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLm1hdC1idXR0b24tZGlzYWJsZWQubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2Fybi5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtaWNvbi1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZC5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnkubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnQubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuLm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYnV0dG9uLWRpc2FibGVkLm1hdC1idXR0b24tZGlzYWJsZWR7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMyl9Ym9keS5kYXJrLW1vZGUgLm1hdC1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSxib2R5LmRhcmstbW9kZSAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksYm9keS5kYXJrLW1vZGUgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e2JhY2tncm91bmQtY29sb3I6I2VmNmMwMH1ib2R5LmRhcmstbW9kZSAubWF0LWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksYm9keS5kYXJrLW1vZGUgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksYm9keS5kYXJrLW1vZGUgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLm1hdC13YXJuIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksYm9keS5kYXJrLW1vZGUgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2FybiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LGJvZHkuZGFyay1tb2RlIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm4gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LGJvZHkuZGFyay1tb2RlIC5tYXQtaWNvbi1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LGJvZHkuZGFyay1tb2RlIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Ym9keS5kYXJrLW1vZGUgLm1hdC1idXR0b24gLm1hdC1yaXBwbGUtZWxlbWVudCxib2R5LmRhcmstbW9kZSAubWF0LWljb24tYnV0dG9uIC5tYXQtcmlwcGxlLWVsZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC1zdHJva2VkLWJ1dHRvbiAubWF0LXJpcHBsZS1lbGVtZW50e29wYWNpdHk6LjE7YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Ym9keS5kYXJrLW1vZGUgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1zdHJva2VkLWJ1dHRvbjpub3QoLm1hdC1idXR0b24tZGlzYWJsZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1mbGF0LWJ1dHRvbixib2R5LmRhcmstbW9kZSAubWF0LXJhaXNlZC1idXR0b24sYm9keS5kYXJrLW1vZGUgLm1hdC1mYWIsYm9keS5kYXJrLW1vZGUgLm1hdC1taW5pLWZhYntjb2xvcjojZmZmO2JhY2tncm91bmQtY29sb3I6IzQyNDI0Mn1ib2R5LmRhcmstbW9kZSAubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5LGJvZHkuZGFyay1tb2RlIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeSxib2R5LmRhcmstbW9kZSAubWF0LWZhYi5tYXQtcHJpbWFyeSxib2R5LmRhcmstbW9kZSAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5e2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtZmFiLm1hdC1hY2NlbnQsYm9keS5kYXJrLW1vZGUgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50e2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybixib2R5LmRhcmstbW9kZSAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm4sYm9keS5kYXJrLW1vZGUgLm1hdC1mYWIubWF0LXdhcm4sYm9keS5kYXJrLW1vZGUgLm1hdC1taW5pLWZhYi5tYXQtd2Fybntjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnkubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnQubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuLm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYnV0dG9uLWRpc2FibGVkLm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnQubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm4ubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LXJhaXNlZC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZC5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtZmFiLm1hdC1wcmltYXJ5Lm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1mYWIubWF0LWFjY2VudC5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtZmFiLm1hdC13YXJuLm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1mYWIubWF0LWJ1dHRvbi1kaXNhYmxlZC5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnkubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnQubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LW1pbmktZmFiLm1hdC13YXJuLm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1taW5pLWZhYi5tYXQtYnV0dG9uLWRpc2FibGVkLm1hdC1idXR0b24tZGlzYWJsZWR7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMyl9Ym9keS5kYXJrLW1vZGUgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeSxib2R5LmRhcmstbW9kZSAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnksYm9keS5kYXJrLW1vZGUgLm1hdC1mYWIubWF0LXByaW1hcnksYm9keS5kYXJrLW1vZGUgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeXtiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtZmFiLm1hdC1hY2NlbnQsYm9keS5kYXJrLW1vZGUgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50e2JhY2tncm91bmQtY29sb3I6I2VmNmMwMH1ib2R5LmRhcmstbW9kZSAubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuLGJvZHkuZGFyay1tb2RlIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybixib2R5LmRhcmstbW9kZSAubWF0LWZhYi5tYXQtd2Fybixib2R5LmRhcmstbW9kZSAubWF0LW1pbmktZmFiLm1hdC13YXJue2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybi5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtZmxhdC1idXR0b24ubWF0LWJ1dHRvbi1kaXNhYmxlZC5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuLm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1idXR0b24tZGlzYWJsZWQubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LWZhYi5tYXQtcHJpbWFyeS5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtZmFiLm1hdC1hY2NlbnQubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LWZhYi5tYXQtd2Fybi5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtZmFiLm1hdC1idXR0b24tZGlzYWJsZWQubWF0LWJ1dHRvbi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5Lm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50Lm1hdC1idXR0b24tZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1taW5pLWZhYi5tYXQtd2Fybi5tYXQtYnV0dG9uLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtbWluaS1mYWIubWF0LWJ1dHRvbi1kaXNhYmxlZC5tYXQtYnV0dG9uLWRpc2FibGVke2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudCxib2R5LmRhcmstbW9kZSAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudCxib2R5LmRhcmstbW9kZSAubWF0LWZhYi5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfWJvZHkuZGFyay1tb2RlIC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtcmlwcGxlLWVsZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC1mYWIubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtZmFiLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC1taW5pLWZhYi5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1zdHJva2VkLWJ1dHRvbjpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSxib2R5LmRhcmstbW9kZSAubWF0LWZsYXQtYnV0dG9uOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LXJhaXNlZC1idXR0b246bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LXJhaXNlZC1idXR0b246bm90KC5tYXQtYnV0dG9uLWRpc2FibGVkKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOHB4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYnV0dG9uLWRpc2FibGVkOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWZhYjpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSxib2R5LmRhcmstbW9kZSAubWF0LW1pbmktZmFiOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWZhYjpub3QoLm1hdC1idXR0b24tZGlzYWJsZWQpOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSxib2R5LmRhcmstbW9kZSAubWF0LW1pbmktZmFiOm5vdCgubWF0LWJ1dHRvbi1kaXNhYmxlZCk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1mYWIubWF0LWJ1dHRvbi1kaXNhYmxlZDpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSxib2R5LmRhcmstbW9kZSAubWF0LW1pbmktZmFiLm1hdC1idXR0b24tZGlzYWJsZWQ6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLGJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cHtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQsYm9keS5kYXJrLW1vZGUgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmR7Ym94LXNoYWRvdzpub25lfWJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLXRvZ2dsZXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC41KX1ib2R5LmRhcmstbW9kZSAubWF0LWJ1dHRvbi10b2dnbGUgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmR7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiM0MjQyNDJ9Ym9keS5kYXJrLW1vZGUgLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZC1jb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtYnV0dG9uLXRvZ2dsZSsubWF0LWJ1dHRvbi10b2dnbGV7Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMjU1LDI1NSwyNTUsLjEyKX1ib2R5LmRhcmstbW9kZSBbZGlyPXJ0bF0gLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1idXR0b24tdG9nZ2xlKy5tYXQtYnV0dG9uLXRvZ2dsZXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgyNTUsMjU1LDI1NSwuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1idXR0b24tdG9nZ2xlLXZlcnRpY2FsIC5tYXQtYnV0dG9uLXRvZ2dsZSsubWF0LWJ1dHRvbi10b2dnbGV7Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6bm9uZTtib3JkZXItdG9wOnNvbGlkIDFweCByZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWR7YmFja2dyb3VuZC1jb2xvcjojMjEyMTIxO2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfWJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmR7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWR7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMyk7YmFja2dyb3VuZC1jb2xvcjojMDAwfWJvZHkuZGFyay1tb2RlIC5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJke2JhY2tncm91bmQ6IzQyNDI0Mn1ib2R5LmRhcmstbW9kZSAubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZHtiYWNrZ3JvdW5kLWNvbG9yOiM0MjQyNDJ9Ym9keS5kYXJrLW1vZGUgLm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCxib2R5LmRhcmstbW9kZSAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZHtib3JkZXI6c29saWQgMXB4IHJnYmEoMjU1LDI1NSwyNTUsLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWNhcmR7YmFja2dyb3VuZDojNDI0MjQyO2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1jYXJkOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1jYXJkLm1hdC1jYXJkLWZsYXQ6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FyZC1zdWJ0aXRsZXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LWNoZWNrYm94LWZyYW1le2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LWNoZWNrYm94LWNoZWNrbWFya3tmaWxsOiMzMDMwMzB9Ym9keS5kYXJrLW1vZGUgLm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aHtzdHJva2U6IzMwMzAzMCAhaW1wb3J0YW50fWJvZHkuZGFyay1tb2RlIC5tYXQtY2hlY2tib3gtbWl4ZWRtYXJre2JhY2tncm91bmQtY29sb3I6IzMwMzAzMH1ib2R5LmRhcmstbW9kZSAubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXByaW1hcnkgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kLGJvZHkuZGFyay1tb2RlIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtcHJpbWFyeSAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtYWNjZW50IC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCxib2R5LmRhcmstbW9kZSAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LWFjY2VudCAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtd2FybiAubWF0LWNoZWNrYm94LWJhY2tncm91bmQsYm9keS5kYXJrLW1vZGUgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC13YXJuIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtY2hlY2tlZCAubWF0LWNoZWNrYm94LWJhY2tncm91bmQsYm9keS5kYXJrLW1vZGUgLm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZSAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojNjg2ODY4fWJvZHkuZGFyay1tb2RlIC5tYXQtY2hlY2tib3gtZGlzYWJsZWQ6bm90KC5tYXQtY2hlY2tib3gtY2hlY2tlZCkgLm1hdC1jaGVja2JveC1mcmFtZXtib3JkZXItY29sb3I6IzY4Njg2OH1ib2R5LmRhcmstbW9kZSAubWF0LWNoZWNrYm94LWRpc2FibGVkIC5tYXQtY2hlY2tib3gtbGFiZWx7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9Ym9keS5kYXJrLW1vZGUgLm1hdC1jaGVja2JveCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LWNoZWNrYm94LWNoZWNrZWQ6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC1jaGVja2JveDphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZDojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtY2hlY2tib3gtY2hlY2tlZDpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtY2hlY2tib3g6YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtYWNjZW50IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZDojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtY2hlY2tib3gtY2hlY2tlZDpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCxib2R5LmRhcmstbW9kZSAubWF0LWNoZWNrYm94OmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwe2JhY2tncm91bmQtY29sb3I6IzYxNjE2MTtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcCAubWF0LWNoaXAtcmVtb3Zle2NvbG9yOiNmZmY7b3BhY2l0eTouNH1ib2R5LmRhcmstbW9kZSAubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXA6bm90KC5tYXQtY2hpcC1kaXNhYmxlZCk6YWN0aXZle2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwOm5vdCgubWF0LWNoaXAtZGlzYWJsZWQpIC5tYXQtY2hpcC1yZW1vdmU6aG92ZXJ7b3BhY2l0eTouNTR9Ym9keS5kYXJrLW1vZGUgLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLWRpc2FibGVke29wYWNpdHk6LjR9Ym9keS5kYXJrLW1vZGUgLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwOjphZnRlcntiYWNrZ3JvdW5kOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5e2JhY2tncm91bmQtY29sb3I6I2VmNmMwMDtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeSAubWF0LWNoaXAtcmVtb3Zle2NvbG9yOiNmZmY7b3BhY2l0eTouNH1ib2R5LmRhcmstbW9kZSAubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfWJvZHkuZGFyay1tb2RlIC5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2FybntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzY7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm4gLm1hdC1jaGlwLXJlbW92ZXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Ym9keS5kYXJrLW1vZGUgLm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX1ib2R5LmRhcmstbW9kZSAubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudHtiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDA7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudCAubWF0LWNoaXAtcmVtb3Zle2NvbG9yOiNmZmY7b3BhY2l0eTouNH1ib2R5LmRhcmstbW9kZSAubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWJsZXtiYWNrZ3JvdW5kOiM0MjQyNDJ9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWJsZSB0aGVhZCxib2R5LmRhcmstbW9kZSAubWF0LXRhYmxlIHRib2R5LGJvZHkuZGFyay1tb2RlIC5tYXQtdGFibGUgdGZvb3QsYm9keS5kYXJrLW1vZGUgbWF0LWhlYWRlci1yb3csYm9keS5kYXJrLW1vZGUgbWF0LXJvdyxib2R5LmRhcmstbW9kZSBtYXQtZm9vdGVyLXJvdyxib2R5LmRhcmstbW9kZSBbbWF0LWhlYWRlci1yb3ddLGJvZHkuZGFyay1tb2RlIFttYXQtcm93XSxib2R5LmRhcmstbW9kZSBbbWF0LWZvb3Rlci1yb3ddLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFibGUtc3RpY2t5e2JhY2tncm91bmQ6aW5oZXJpdH1ib2R5LmRhcmstbW9kZSBtYXQtcm93LGJvZHkuZGFyay1tb2RlIG1hdC1oZWFkZXItcm93LGJvZHkuZGFyay1tb2RlIG1hdC1mb290ZXItcm93LGJvZHkuZGFyay1tb2RlIHRoLm1hdC1oZWFkZXItY2VsbCxib2R5LmRhcmstbW9kZSB0ZC5tYXQtY2VsbCxib2R5LmRhcmstbW9kZSB0ZC5tYXQtZm9vdGVyLWNlbGx7Ym9yZGVyLWJvdHRvbS1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1oZWFkZXItY2VsbHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LWNlbGwsYm9keS5kYXJrLW1vZGUgLm1hdC1mb290ZXItY2VsbHtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FsZW5kYXItYXJyb3d7ZmlsbDojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci10b2dnbGUsYm9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQgLm1hdC1jYWxlbmRhci1uZXh0LWJ1dHRvbixib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudCAubWF0LWNhbGVuZGFyLXByZXZpb3VzLWJ1dHRvbntjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVye2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjUpfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyLWRpdmlkZXI6OmFmdGVye2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FsZW5kYXItYm9keS1sYWJlbHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZS1yYW5nZS1pbnB1dC1zZXBhcmF0b3J7Y29sb3I6I2ZmZjtib3JkZXItY29sb3I6dHJhbnNwYXJlbnR9Ym9keS5kYXJrLW1vZGUgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkPi5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnQ6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbCl7Y29sb3I6IzYxNjE2MX1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1kYXRlLXJhbmdlLWlucHV0LXNlcGFyYXRvcntjb2xvcjojNjE2MTYxfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FsZW5kYXItYm9keS1pbi1wcmV2aWV3e2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjI0KX1ib2R5LmRhcmstbW9kZSAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbCl7Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjUpfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZD4ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbCl7Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjMpfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FsZW5kYXItYm9keS1pbi1yYW5nZTo6YmVmb3Jle2JhY2tncm91bmQ6cmdiYSgyMzksMTA4LDAsLjIpfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbCxib2R5LmRhcmstbW9kZSAubWF0LWNhbGVuZGFyLWJvZHktaW4tY29tcGFyaXNvbi1yYW5nZTo6YmVmb3Jle2JhY2tncm91bmQ6cmdiYSgyNDksMTcxLDAsLjIpfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWJyaWRnZS1zdGFydDo6YmVmb3JlLGJvZHkuZGFyay1tb2RlIFtkaXI9cnRsXSAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1icmlkZ2UtZW5kOjpiZWZvcmV7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMjM5LCAxMDgsIDAsIDAuMikgNTAlLCByZ2JhKDI0OSwgMTcxLCAwLCAwLjIpIDUwJSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLWVuZDo6YmVmb3JlLGJvZHkuZGFyay1tb2RlIFtkaXI9cnRsXSAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1icmlkZ2Utc3RhcnQ6OmJlZm9yZXtiYWNrZ3JvdW5kOmxpbmVhci1ncmFkaWVudCh0byBsZWZ0LCByZ2JhKDIzOSwgMTA4LCAwLCAwLjIpIDUwJSwgcmdiYSgyNDksIDE3MSwgMCwgMC4yKSA1MCUpfWJvZHkuZGFyay1tb2RlIC5tYXQtY2FsZW5kYXItYm9keS1pbi1yYW5nZT4ubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwsYm9keS5kYXJrLW1vZGUgLm1hdC1jYWxlbmRhci1ib2R5LWluLWNvbXBhcmlzb24tcmFuZ2UubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U6OmFmdGVye2JhY2tncm91bmQ6I2E4ZGFiNX1ib2R5LmRhcmstbW9kZSAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1jYWxlbmRhci1ib2R5LWluLWNvbXBhcmlzb24tcmFuZ2U+Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQ6IzQ2YTM1ZX1ib2R5LmRhcmstbW9kZSAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwO2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjM5LDEwOCwwLC40KX1ib2R5LmRhcmstbW9kZSAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LWNhbGVuZGFyLWJvZHktY2VsbDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3Zlcj4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpLGJvZHkuZGFyay1tb2RlIC5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlPi5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnQ6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbCksYm9keS5kYXJrLW1vZGUgLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZT4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyMzksMTA4LDAsLjMpfWJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50e2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6IzQyNDI0Mjtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LWluLXJhbmdlOjpiZWZvcmV7YmFja2dyb3VuZDpyZ2JhKDIzOSwxMDgsMCwuMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwsYm9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktaW4tY29tcGFyaXNvbi1yYW5nZTo6YmVmb3Jle2JhY2tncm91bmQ6cmdiYSgyNDksMTcxLDAsLjIpfWJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLXN0YXJ0OjpiZWZvcmUsYm9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCBbZGlyPXJ0bF0gLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLWVuZDo6YmVmb3Jle2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDIzOSwgMTA4LCAwLCAwLjIpIDUwJSwgcmdiYSgyNDksIDE3MSwgMCwgMC4yKSA1MCUpfWJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLWVuZDo6YmVmb3JlLGJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgW2Rpcj1ydGxdIC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWJyaWRnZS1zdGFydDo6YmVmb3Jle2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIGxlZnQsIHJnYmEoMjM5LCAxMDgsIDAsIDAuMikgNTAlLCByZ2JhKDI0OSwgMTcxLCAwLCAwLjIpIDUwJSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U+Lm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsLGJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LWluLWNvbXBhcmlzb24tcmFuZ2UubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U6OmFmdGVye2JhY2tncm91bmQ6I2E4ZGFiNX1ib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWlkZW50aWNhbC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCxib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5tYXQtY2FsZW5kYXItYm9keS1pbi1jb21wYXJpc29uLXJhbmdlPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kOiM0NmEzNWV9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwO2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQ+Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQtY29sb3I6cmdiYSgyMzksMTA4LDAsLjQpfWJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktY2VsbDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3Zlcj4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpLGJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmU+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsKSxib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmU+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjM5LDEwOCwwLC4zKX1ib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U6OmJlZm9yZXtiYWNrZ3JvdW5kOnJnYmEoMjQ0LDY3LDU0LC4yKX1ib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwsYm9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LWluLWNvbXBhcmlzb24tcmFuZ2U6OmJlZm9yZXtiYWNrZ3JvdW5kOnJnYmEoMjQ5LDE3MSwwLC4yKX1ib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1icmlkZ2Utc3RhcnQ6OmJlZm9yZSxib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiBbZGlyPXJ0bF0gLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLWVuZDo6YmVmb3Jle2JhY2tncm91bmQ6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDI0NCwgNjcsIDU0LCAwLjIpIDUwJSwgcmdiYSgyNDksIDE3MSwgMCwgMC4yKSA1MCUpfWJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1jb21wYXJpc29uLWJyaWRnZS1lbmQ6OmJlZm9yZSxib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiBbZGlyPXJ0bF0gLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24tYnJpZGdlLXN0YXJ0OjpiZWZvcmV7YmFja2dyb3VuZDpsaW5lYXItZ3JhZGllbnQodG8gbGVmdCwgcmdiYSgyNDQsIDY3LCA1NCwgMC4yKSA1MCUsIHJnYmEoMjQ5LCAxNzEsIDAsIDAuMikgNTAlKX1ib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktaW4tcmFuZ2U+Lm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsLGJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1pbi1jb21wYXJpc29uLXJhbmdlLm1hdC1jYWxlbmRhci1ib2R5LWluLXJhbmdlOjphZnRlcntiYWNrZ3JvdW5kOiNhOGRhYjV9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1pbi1jb21wYXJpc29uLXJhbmdlPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kOiM0NmEzNWV9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZD4ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuNCl9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGw6bm90KC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZCk6aG92ZXI+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsKSxib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAuY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZT4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktY29tcGFyaXNvbi1pZGVudGljYWwpLGJvZHkuZGFyay1tb2RlIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmU+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWNvbXBhcmlzb24taWRlbnRpY2FsKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC4zKX1ib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItY29udGVudC10b3VjaHtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmV7Y29sb3I6I2VmNmMwMH1ib2R5LmRhcmstbW9kZSAubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtYWNjZW50e2NvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUubWF0LXdhcm57Y29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LWRhdGUtcmFuZ2UtaW5wdXQtaW5uZXJbZGlzYWJsZWRde2NvbG9yOiM2MTYxNjF9Ym9keS5kYXJrLW1vZGUgLm1hdC1kaWFsb2ctY29udGFpbmVye2JveC1zaGFkb3c6MHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiM0MjQyNDI7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LWRpdmlkZXJ7Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1kaXZpZGVyLXZlcnRpY2Fse2JvcmRlci1yaWdodC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1leHBhbnNpb24tcGFuZWx7YmFja2dyb3VuZDojNDI0MjQyO2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1leHBhbnNpb24tcGFuZWw6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWFjdGlvbi1yb3d7Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1leHBhbnNpb24tcGFuZWwgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksYm9keS5kYXJrLW1vZGUgLm1hdC1leHBhbnNpb24tcGFuZWwgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSxib2R5LmRhcmstbW9kZSAubWF0LWV4cGFuc2lvbi1wYW5lbDpub3QoLm1hdC1leHBhbmRlZCkgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyOmhvdmVyOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSl7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXtib2R5LmRhcmstbW9kZSAubWF0LWV4cGFuc2lvbi1wYW5lbDpub3QoLm1hdC1leHBhbmRlZCk6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI6aG92ZXJ7YmFja2dyb3VuZDojNDI0MjQyfX1ib2R5LmRhcmstbW9kZSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGV7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb24sYm9keS5kYXJrLW1vZGUgLm1hdC1leHBhbnNpb24taW5kaWNhdG9yOjphZnRlcntjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4zKX1ib2R5LmRhcmstbW9kZSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGUsYm9keS5kYXJrLW1vZGUgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0gLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9ue2NvbG9yOmluaGVyaXR9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfWJvZHkuZGFyay1tb2RlIC5tYXQtaGludHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2NvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50e2NvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtd2Fybntjb2xvcjojZjQ0MzM2fWJvZHkuZGFyay1tb2RlIC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2Vye2NvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnR7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC13YXJue2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZDpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpIC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7Y29sb3I6I2VmNmMwMH1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZDpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC1hY2NlbnQgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LXdhcm4gLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb2xvcjojZjQ0MzM2fWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1sYWJlbHtjb2xvcjojZjQ0MzM2fWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1sYWJlbCAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2Vye2NvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZSxib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnR7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fWJvZHkuZGFyay1tb2RlIC5tYXQtZXJyb3J7Y29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWhpbnR7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpIDAlLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNykgMzMlLCB0cmFuc3BhcmVudCAwJSk7YmFja2dyb3VuZC1zaXplOjRweCAxMDAlO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNykgMCUsIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtZmxleHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLWZsZXh7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4wNSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC41KX1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC1sYWJlbHtjb2xvcjojNjE2MTYxfWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4zKX1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tjb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LWFjY2VudCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tjb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LXdhcm4gLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2t7Y29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWludmFsaWQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tjb2xvcjojZjQ0MzM2fWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2NvbG9yOiM2MTYxNjF9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xNSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1pY29uLm1hdC1wcmltYXJ5e2NvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1pY29uLm1hdC1hY2NlbnR7Y29sb3I6I2VmNmMwMH1ib2R5LmRhcmstbW9kZSAubWF0LWljb24ubWF0LXdhcm57Y29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdCAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfWJvZHkuZGFyay1tb2RlIC5tYXQtaW5wdXQtZWxlbWVudDpkaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye2NvbG9yOiM2MTYxNjF9Ym9keS5kYXJrLW1vZGUgLm1hdC1pbnB1dC1lbGVtZW50e2NhcmV0LWNvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1pbnB1dC1lbGVtZW50OjpwbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC41KX1ib2R5LmRhcmstbW9kZSAubWF0LWlucHV0LWVsZW1lbnQ6Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjUpfWJvZHkuZGFyay1tb2RlIC5tYXQtaW5wdXQtZWxlbWVudDotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1pbnB1dC1lbGVtZW50IG9wdGlvbntjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Ym9keS5kYXJrLW1vZGUgLm1hdC1pbnB1dC1lbGVtZW50IG9wdGlvbjpkaXNhYmxlZHtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLm1hdC1hY2NlbnQgLm1hdC1pbnB1dC1lbGVtZW50e2NhcmV0LWNvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLm1hdC13YXJuIC5tYXQtaW5wdXQtZWxlbWVudCxib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWlucHV0LWVsZW1lbnR7Y2FyZXQtY29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7Y29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LWxpc3QtYmFzZSAubWF0LWxpc3QtaXRlbXtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1vcHRpb257Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LWxpc3QtYmFzZSAubWF0LXN1YmhlYWRlcntjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LWxpc3QtaXRlbS1kaXNhYmxlZHtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1saXN0LW9wdGlvbjpob3Zlcixib2R5LmRhcmstbW9kZSAubWF0LWxpc3Qtb3B0aW9uOmZvY3VzLGJvZHkuZGFyay1tb2RlIC5tYXQtbmF2LWxpc3QgLm1hdC1saXN0LWl0ZW06aG92ZXIsYm9keS5kYXJrLW1vZGUgLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbTpmb2N1cyxib2R5LmRhcmstbW9kZSAubWF0LWFjdGlvbi1saXN0IC5tYXQtbGlzdC1pdGVtOmhvdmVyLGJvZHkuZGFyay1tb2RlIC5tYXQtYWN0aW9uLWxpc3QgLm1hdC1saXN0LWl0ZW06Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4wNCl9Ym9keS5kYXJrLW1vZGUgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb24sYm9keS5kYXJrLW1vZGUgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb246aG92ZXIsYm9keS5kYXJrLW1vZGUgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb246Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1tZW51LXBhbmVse2JhY2tncm91bmQ6IzQyNDI0Mn1ib2R5LmRhcmstbW9kZSAubWF0LW1lbnUtcGFuZWw6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1tZW51LWl0ZW17YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXSxib2R5LmRhcmstbW9kZSAubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF0gLm1hdC1tZW51LXN1Ym1lbnUtaWNvbixib2R5LmRhcmstbW9kZSAubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF0gLm1hdC1pY29uLW5vLWNvbG9ye2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjUpfWJvZHkuZGFyay1tb2RlIC5tYXQtbWVudS1pdGVtIC5tYXQtaWNvbi1uby1jb2xvcixib2R5LmRhcmstbW9kZSAubWF0LW1lbnUtc3VibWVudS1pY29ue2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1tZW51LWl0ZW06aG92ZXI6bm90KFtkaXNhYmxlZF0pLGJvZHkuZGFyay1tb2RlIC5tYXQtbWVudS1pdGVtLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KFtkaXNhYmxlZF0pLGJvZHkuZGFyay1tb2RlIC5tYXQtbWVudS1pdGVtLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdChbZGlzYWJsZWRdKSxib2R5LmRhcmstbW9kZSAubWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZDpub3QoW2Rpc2FibGVkXSl7YmFja2dyb3VuZDpyZ2JhKDI1NSwyNTUsMjU1LC4wNCl9Ym9keS5kYXJrLW1vZGUgLm1hdC1wYWdpbmF0b3J7YmFja2dyb3VuZDojNDI0MjQyfWJvZHkuZGFyay1tb2RlIC5tYXQtcGFnaW5hdG9yLGJvZHkuZGFyay1tb2RlIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZSAubWF0LXNlbGVjdC10cmlnZ2Vye2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfWJvZHkuZGFyay1tb2RlIC5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudCxib2R5LmRhcmstbW9kZSAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnR7Ym9yZGVyLXRvcDoycHggc29saWQgI2ZmZjtib3JkZXItcmlnaHQ6MnB4IHNvbGlkICNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1wYWdpbmF0b3ItZmlyc3QsYm9keS5kYXJrLW1vZGUgLm1hdC1wYWdpbmF0b3ItbGFzdHtib3JkZXItdG9wOjJweCBzb2xpZCAjZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIC5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudCxib2R5LmRhcmstbW9kZSAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXSAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1wYWdpbmF0b3ItZmlyc3QsYm9keS5kYXJrLW1vZGUgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1wYWdpbmF0b3ItbGFzdHtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZHtmaWxsOiM2MDNmMjR9Ym9keS5kYXJrLW1vZGUgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVye2JhY2tncm91bmQtY29sb3I6IzYwM2YyNH1ib2R5LmRhcmstbW9kZSAubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudCAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5ke2ZpbGw6IzYwM2YyNH1ib2R5LmRhcmstbW9kZSAubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50IC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcntiYWNrZ3JvdW5kLWNvbG9yOiM2MDNmMjR9Ym9keS5kYXJrLW1vZGUgLm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudCAubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm4gLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZHtmaWxsOiM2MTM1MzJ9Ym9keS5kYXJrLW1vZGUgLm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm4gLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVye2JhY2tncm91bmQtY29sb3I6IzYxMzUzMn1ib2R5LmRhcmstbW9kZSAubWF0LXByb2dyZXNzLWJhci5tYXQtd2FybiAubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1wcm9ncmVzcy1zcGlubmVyIGNpcmNsZSxib2R5LmRhcmstbW9kZSAubWF0LXNwaW5uZXIgY2lyY2xle3N0cm9rZTojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtYWNjZW50IGNpcmNsZSxib2R5LmRhcmstbW9kZSAubWF0LXNwaW5uZXIubWF0LWFjY2VudCBjaXJjbGV7c3Ryb2tlOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC13YXJuIGNpcmNsZSxib2R5LmRhcmstbW9kZSAubWF0LXNwaW5uZXIubWF0LXdhcm4gY2lyY2xle3N0cm9rZTojZjQ0MzM2fWJvZHkuZGFyay1tb2RlIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZXtib3JkZXItY29sb3I6I2VmNmMwMH1ib2R5LmRhcmstbW9kZSAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LXJhZGlvLWlubmVyLWNpcmNsZSxib2R5LmRhcmstbW9kZSAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50Om5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSxib2R5LmRhcmstbW9kZSAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlLGJvZHkuZGFyay1tb2RlIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5OmFjdGl2ZSAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxle2JhY2tncm91bmQtY29sb3I6I2VmNmMwMH1ib2R5LmRhcmstbW9kZSAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1yYWRpby1pbm5lci1jaXJjbGUsYm9keS5kYXJrLW1vZGUgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudCAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50Om5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSxib2R5LmRhcmstbW9kZSAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUsYm9keS5kYXJrLW1vZGUgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudDphY3RpdmUgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZXtiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1vdXRlci1jaXJjbGV7Ym9yZGVyLWNvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4gLm1hdC1yYWRpby1pbm5lci1jaXJjbGUsYm9keS5kYXJrLW1vZGUgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4gLm1hdC1yYWRpby1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudDpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksYm9keS5kYXJrLW1vZGUgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSxib2R5LmRhcmstbW9kZSAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2FybjphY3RpdmUgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkLm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlLGJvZHkuZGFyay1tb2RlIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8tcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8taW5uZXItY2lyY2xle2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8tbGFiZWwtY29udGVudHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC41KX1ib2R5LmRhcmstbW9kZSAubWF0LXJhZGlvLWJ1dHRvbiAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXNlbGVjdC12YWx1ZXtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtc2VsZWN0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjUpfWJvZHkuZGFyay1tb2RlIC5tYXQtc2VsZWN0LWRpc2FibGVkIC5tYXQtc2VsZWN0LXZhbHVle2NvbG9yOiM2MTYxNjF9Ym9keS5kYXJrLW1vZGUgLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyl9Ym9keS5kYXJrLW1vZGUgLm1hdC1zZWxlY3QtcGFuZWx7YmFja2dyb3VuZDojNDI0MjQyfWJvZHkuZGFyay1tb2RlIC5tYXQtc2VsZWN0LXBhbmVsOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtc2VsZWN0LXBhbmVsIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpe2JhY2tncm91bmQ6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtcHJpbWFyeSAubWF0LXNlbGVjdC1hcnJvd3tjb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtYWNjZW50IC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC13YXJuIC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1mb3JtLWZpZWxkIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtaW52YWxpZCAubWF0LXNlbGVjdC1hcnJvd3tjb2xvcjojZjQ0MzM2fWJvZHkuZGFyay1tb2RlIC5tYXQtZm9ybS1maWVsZCAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWRpc2FibGVkIC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOiM2MTYxNjF9Ym9keS5kYXJrLW1vZGUgLm1hdC1kcmF3ZXItY29udGFpbmVye2JhY2tncm91bmQtY29sb3I6IzMwMzAzMDtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtZHJhd2Vye2JhY2tncm91bmQtY29sb3I6IzQyNDI0Mjtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtZHJhd2VyLm1hdC1kcmF3ZXItcHVzaHtiYWNrZ3JvdW5kLWNvbG9yOiM0MjQyNDJ9Ym9keS5kYXJrLW1vZGUgLm1hdC1kcmF3ZXI6bm90KC5tYXQtZHJhd2VyLXNpZGUpe2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtZHJhd2VyLXNpZGV7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZHtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgyNTUsMjU1LDI1NSwuMTIpO2JvcmRlci1yaWdodDpub25lfWJvZHkuZGFyay1tb2RlIFtkaXI9cnRsXSAubWF0LWRyYXdlci1zaWRle2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDI1NSwyNTUsMjU1LC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9Ym9keS5kYXJrLW1vZGUgW2Rpcj1ydGxdIC5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmR7Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMjU1LDI1NSwyNTUsLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LWRyYXdlci1iYWNrZHJvcC5tYXQtZHJhd2VyLXNob3due2JhY2tncm91bmQtY29sb3I6cmdiYSgxODksMTg5LDE4OSwuNil9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjM5LDEwOCwwLC41NCl9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjM5LDEwOCwwLC41NCl9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fWJvZHkuZGFyay1tb2RlIC5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC41NCl9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZS10b2dnbGU6bm90KC5tYXQtY2hlY2tlZCkgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJ7Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kLWNvbG9yOiNiZGJkYmR9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZS10b2dnbGUtYmFye2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNSl9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjMpfWJvZHkuZGFyay1tb2RlIC5tYXQtcHJpbWFyeSAubWF0LXNsaWRlci10cmFjay1maWxsLGJvZHkuZGFyay1tb2RlIC5tYXQtcHJpbWFyeSAubWF0LXNsaWRlci10aHVtYixib2R5LmRhcmstbW9kZSAubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtcHJpbWFyeSAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1wcmltYXJ5IC5tYXQtc2xpZGVyLWZvY3VzLXJpbmd7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDIzOSwxMDgsMCwuMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItdHJhY2stZmlsbCxib2R5LmRhcmstbW9kZSAubWF0LWFjY2VudCAubWF0LXNsaWRlci10aHVtYixib2R5LmRhcmstbW9kZSAubWF0LWFjY2VudCAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dHtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLWZvY3VzLXJpbmd7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDIzOSwxMDgsMCwuMil9Ym9keS5kYXJrLW1vZGUgLm1hdC13YXJuIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGwsYm9keS5kYXJrLW1vZGUgLm1hdC13YXJuIC5tYXQtc2xpZGVyLXRodW1iLGJvZHkuZGFyay1tb2RlIC5tYXQtd2FybiAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC13YXJuIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXdhcm4gLm1hdC1zbGlkZXItZm9jdXMtcmluZ3tiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC4yKX1ib2R5LmRhcmstbW9kZSAubWF0LXNsaWRlcjpob3ZlciAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kLGJvZHkuZGFyay1tb2RlIC5tYXQtc2xpZGVyLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4zKX1ib2R5LmRhcmstbW9kZSAubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kLGJvZHkuZGFyay1tb2RlIC5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGwsYm9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4zKX1ib2R5LmRhcmstbW9kZSAubWF0LXNsaWRlci1kaXNhYmxlZDpob3ZlciAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMyl9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZXItbWluLXZhbHVlIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmd7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyAubWF0LXNsaWRlci10aHVtYixib2R5LmRhcmstbW9kZSAubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2JhY2tncm91bmQtY29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLGJvZHkuZGFyay1tb2RlIC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4zKX1ib2R5LmRhcmstbW9kZSAubWF0LXNsaWRlci1taW4tdmFsdWU6bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpIC5tYXQtc2xpZGVyLXRodW1ie2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4zKTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fWJvZHkuZGFyay1tb2RlIC5tYXQtc2xpZGVyLW1pbi12YWx1ZTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIgLm1hdC1zbGlkZXItdGh1bWIsYm9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYntib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMyl9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3Zlci5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRodW1iLGJvZHkuZGFyay1tb2RlIC5tYXQtc2xpZGVyLW1pbi12YWx1ZTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10aHVtYntib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMyl9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbGlkZXItaGFzLXRpY2tzIC5tYXQtc2xpZGVyLXdyYXBwZXI6OmFmdGVye2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KX1ib2R5LmRhcmstbW9kZSAubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXRpY2tze2JhY2tncm91bmQtaW1hZ2U6cmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjcpLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTotbW96LXJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQoMC4wMDAxZGVnLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KX1ib2R5LmRhcmstbW9kZSAubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci10aWNrc3tiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNyksIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KX1ib2R5LmRhcmstbW9kZSAubWF0LXN0ZXAtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkLGJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcC1oZWFkZXIuY2RrLXByb2dyYW0tZm9jdXNlZCxib2R5LmRhcmstbW9kZSAubWF0LXN0ZXAtaGVhZGVyOmhvdmVyOm5vdChbYXJpYS1kaXNhYmxlZF0pLGJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcC1oZWFkZXI6aG92ZXJbYXJpYS1kaXNhYmxlZD1mYWxzZV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4wNCl9Ym9keS5kYXJrLW1vZGUgLm1hdC1zdGVwLWhlYWRlcjpob3ZlclthcmlhLWRpc2FibGVkPXRydWVde2N1cnNvcjpkZWZhdWx0fUBtZWRpYShob3Zlcjogbm9uZSl7Ym9keS5kYXJrLW1vZGUgLm1hdC1zdGVwLWhlYWRlcjpob3ZlcntiYWNrZ3JvdW5kOm5vbmV9fWJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWxhYmVsLGJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLW9wdGlvbmFse2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpfWJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb257YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KTtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24tc2VsZWN0ZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1kb25lLGJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24tc3RhdGUtZWRpdHtiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDA7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXN0ZXAtaGVhZGVyLm1hdC1hY2NlbnQgLm1hdC1zdGVwLWljb257Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXN0ZXAtaGVhZGVyLm1hdC1hY2NlbnQgLm1hdC1zdGVwLWljb24tc2VsZWN0ZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1zdGVwLWhlYWRlci5tYXQtYWNjZW50IC5tYXQtc3RlcC1pY29uLXN0YXRlLWRvbmUsYm9keS5kYXJrLW1vZGUgLm1hdC1zdGVwLWhlYWRlci5tYXQtYWNjZW50IC5tYXQtc3RlcC1pY29uLXN0YXRlLWVkaXR7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwO2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1zdGVwLWhlYWRlci5tYXQtd2FybiAubWF0LXN0ZXAtaWNvbntjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcC1oZWFkZXIubWF0LXdhcm4gLm1hdC1zdGVwLWljb24tc2VsZWN0ZWQsYm9keS5kYXJrLW1vZGUgLm1hdC1zdGVwLWhlYWRlci5tYXQtd2FybiAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1kb25lLGJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcC1oZWFkZXIubWF0LXdhcm4gLm1hdC1zdGVwLWljb24tc3RhdGUtZWRpdHtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzY7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVycm9ye2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Y29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1hY3RpdmV7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1lcnJvcntjb2xvcjojZjQ0MzM2fWJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsLGJvZHkuZGFyay1tb2RlIC5tYXQtc3RlcHBlci12ZXJ0aWNhbHtiYWNrZ3JvdW5kLWNvbG9yOiM0MjQyNDJ9Ym9keS5kYXJrLW1vZGUgLm1hdC1zdGVwcGVyLXZlcnRpY2FsLWxpbmU6OmJlZm9yZXtib3JkZXItbGVmdC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyOjpiZWZvcmUsYm9keS5kYXJrLW1vZGUgLm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyOjphZnRlcixib2R5LmRhcmstbW9kZSAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbC1saW5le2JvcmRlci10b3AtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtc29ydC1oZWFkZXItYXJyb3d7Y29sb3I6I2M2YzZjNn1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWhlYWRlcntib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyIC5tYXQtdGFiLW5hdi1iYXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyIC5tYXQtdGFiLWhlYWRlcntib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LC4xMik7Ym9yZGVyLWJvdHRvbTpub25lfWJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWxhYmVsLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWxpbmt7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZHtjb2xvcjojNjE2MTYxfWJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6IzYxNjE2MX1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cFtjbGFzcyo9bWF0LWJhY2tncm91bmQtXSAubWF0LXRhYi1oZWFkZXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhcltjbGFzcyo9bWF0LWJhY2tncm91bmQtXXtib3JkZXItYm90dG9tOm5vbmU7Ym9yZGVyLXRvcDpub25lfWJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjUxLDE0MCwwLC4zKX1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeSAubWF0LWluay1iYXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtaW5rLWJhcixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeS5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtaW5rLWJhcixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtaW5rLWJhcixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1pbmstYmFye2JhY2tncm91bmQtY29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTEsMTQwLDAsLjMpfWJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQgLm1hdC1pbmstYmFyLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudCAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZWY2YzAwfWJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LWluay1iYXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1pbmstYmFyLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyIC5tYXQtaW5rLWJhcixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtaW5rLWJhcntiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjA1LDIxMCwuMyl9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC1pbmstYmFyLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4gLm1hdC1pbmstYmFye2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlciAubWF0LWluay1iYXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LWluay1iYXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlciAubWF0LWluay1iYXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtaW5rLWJhcntiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjUxLDE0MCwwLC4zKX1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlcixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlcixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItbGluay1jb250YWluZXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9ue2JhY2tncm91bmQtY29sb3I6I2VmNmMwMH1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1sYWJlbCxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmssYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1sYWJlbCxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC10YWItbGlua3tjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWQsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWR7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LWZvY3VzLWluZGljYXRvcjo6YmVmb3JlLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmUsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LWZvY3VzLWluZGljYXRvcjo6YmVmb3JlLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1oZWFkZXIgLm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZXtib3JkZXItY29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfWJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtcmlwcGxlLWVsZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeT4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24gLm1hdC1yaXBwbGUtZWxlbWVudCxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnk+Lm1hdC10YWItaGVhZGVyIC5tYXQtcmlwcGxlLWVsZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtcmlwcGxlLWVsZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1MSwxNDAsMCwuMyl9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlcixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItbGluay1jb250YWluZXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlcixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1saW5rLWNvbnRhaW5lcixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbntiYWNrZ3JvdW5kLWNvbG9yOiNlZjZjMDB9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1sYWJlbCxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC10YWItbGluayxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWwsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC10YWItbGlua3tjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmUsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LWZvY3VzLWluZGljYXRvcjo6YmVmb3JlLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXIgLm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZXtib3JkZXItY29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudD4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWhlYWRlciAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50Pi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtcmlwcGxlLWVsZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQ+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24gLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjA1LDIxMCwuMyl9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1saW5rLWNvbnRhaW5lcixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWxpbmstY29udGFpbmVyLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWwsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXRhYi1saW5rLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWwsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmt7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVke2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfWJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlciAubWF0LWZvY3VzLWluZGljYXRvcjo6YmVmb3JlLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1mb2N1cy1pbmRpY2F0b3I6OmJlZm9yZSxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItaGVhZGVyIC5tYXQtZm9jdXMtaW5kaWNhdG9yOjpiZWZvcmV7Ym9yZGVyLWNvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXIgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbixib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX1ib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlciAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC1yaXBwbGUtZWxlbWVudCxib2R5LmRhcmstbW9kZSAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIC5tYXQtcmlwcGxlLWVsZW1lbnQsYm9keS5kYXJrLW1vZGUgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuPi5tYXQtdGFiLWhlYWRlciAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1saW5rLWNvbnRhaW5lciAubWF0LXJpcHBsZS1lbGVtZW50LGJvZHkuZGFyay1tb2RlIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybj4ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtdG9vbGJhcntiYWNrZ3JvdW5kOiNlZjZjMDA7Y29sb3I6I2ZmZn1ib2R5LmRhcmstbW9kZSAubWF0LXRvb2xiYXIubWF0LXByaW1hcnl7YmFja2dyb3VuZDojZWY2YzAwO2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC10b29sYmFyLm1hdC1hY2NlbnR7YmFja2dyb3VuZDojZWY2YzAwO2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC10b29sYmFyLm1hdC13YXJue2JhY2tncm91bmQ6I2Y0NDMzNjtjb2xvcjojZmZmfWJvZHkuZGFyay1tb2RlIC5tYXQtdG9vbGJhciAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lLGJvZHkuZGFyay1tb2RlIC5tYXQtdG9vbGJhciAubWF0LWZvcm0tZmllbGQtcmlwcGxlLGJvZHkuZGFyay1tb2RlIC5tYXQtdG9vbGJhciAubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZXtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn1ib2R5LmRhcmstbW9kZSAubWF0LXRvb2xiYXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLGJvZHkuZGFyay1tb2RlIC5tYXQtdG9vbGJhciAubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLGJvZHkuZGFyay1tb2RlIC5tYXQtdG9vbGJhciAubWF0LXNlbGVjdC12YWx1ZSxib2R5LmRhcmstbW9kZSAubWF0LXRvb2xiYXIgLm1hdC1zZWxlY3QtYXJyb3csYm9keS5kYXJrLW1vZGUgLm1hdC10b29sYmFyIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LXNlbGVjdC1hcnJvd3tjb2xvcjppbmhlcml0fWJvZHkuZGFyay1tb2RlIC5tYXQtdG9vbGJhciAubWF0LWlucHV0LWVsZW1lbnR7Y2FyZXQtY29sb3I6Y3VycmVudENvbG9yfWJvZHkuZGFyay1tb2RlIC5tYXQtdG9vbHRpcHtiYWNrZ3JvdW5kOnJnYmEoOTcsOTcsOTcsLjkpfWJvZHkuZGFyay1tb2RlIC5tYXQtdHJlZXtiYWNrZ3JvdW5kOiM0MjQyNDJ9Ym9keS5kYXJrLW1vZGUgLm1hdC10cmVlLW5vZGUsYm9keS5kYXJrLW1vZGUgLm1hdC1uZXN0ZWQtdHJlZS1ub2Rle2NvbG9yOiNmZmZ9Ym9keS5kYXJrLW1vZGUgLm1hdC1zbmFjay1iYXItY29udGFpbmVye2NvbG9yOnJnYmEoMCwwLDAsLjg3KTtiYWNrZ3JvdW5kOiNmYWZhZmE7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfWJvZHkuZGFyay1tb2RlIC5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbntjb2xvcjppbmhlcml0fQo8L3N0eWxlPgoKPHN0eWxlPgogIGh0bWwsCiAgYm9keSB7CiAgICBtYXJnaW46IDA7CiAgICBwYWRkaW5nOiAwOwogICAgaGVpZ2h0OiAxMDAlOwogICAgZm9udC1mYW1pbHk6IFJvYm90bywgc2Fucy1zZXJpZjsKICAgIGNvbG9yOiB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpOwoKICAgIC8qIExlZ2FjeSBtZWNoYW5pc20gdG8gYXZvaWQgaXNzdWVzIHdpdGggc3VicGl4ZWwgYW50aS1hbGlhc2luZyBvbiBtYWNPUy4KICAgICAqCiAgICAgKiBJbiB0aGUgcGFzdCBbMV0sIG1hY09TIHN1YnBpeGVsIEFBIGNhdXNlZCBleGNlc3NpdmUgYm9sZGluZyBmb3IgbGlnaHQtb24tZGFyayB0ZXh0OyB0aGlzIHJ1bGUKICAgICAqIGF2b2lkcyB0aGF0IGJ5IHJlcXVlc3Rpbmcgbm9uLXN1YnBpeGVsIEFBIGFsd2F5cywgcmF0aGVyIHRoYW4gdGhlIGRlZmF1bHQgYmVoYXZpb3IsIHdoaWNoIGlzCiAgICAgKiB0byB1c2Ugc3VicGl4ZWwgQUEgd2hlbiBhdmFpbGFibGUuIFRoZSBvcmlnaW5hbCBpc3N1ZSB3YXMgImZpeGVkIiBieSByZW1vdmluZyBzdWJwaXhlbCBBQSBpbgogICAgICogbWFjT1MgMTQgKE1vamF2ZSksIGJ1dCBmb3IgbGVnYWN5IHJlYXNvbnMgdGhleSBwcmVzZXJ2ZWQgdGhlIGJvbGRpbmcgZWZmZWN0IGFzIGFuIG9wdGlvbi4KICAgICAqIENocm9tZSB0aGVuIGluIHR1cm4gdXBkYXRlZCBpdHMgZm9udCByZW5kZXJpbmcgdG8gYXBwbHkgdGhhdCBib2xkaW5nIGVmZmVjdCBbMl0sIHdoaWNoIG1lYW5zCiAgICAgKiB0aGF0IGV2ZW4gdGhvdWdoIHRoZSBgLXdlYmtpdC1mb250LXNtb290aGluZ2AgZG9jcyBbM10gc3VnZ2VzdCB0aGF0IHNldHRpbmcgYGFudGlhbGlhc2VkYAogICAgICogd291bGQgaGF2ZSBubyBlZmZlY3QgZm9yIHJlY2VudCB2ZXJzaW9ucyBvZiBtYWNPUywgaXQgc3RpbGwgaXMgbmVlZGVkIHRvIGF2b2lkIHRoZSBib2xkaW5nLgogICAgICoKICAgICAqIFsxXTogaHR0cDovL3d3dy5saWdodGVycmEuY29tL2FydGljbGVzL21hY29zeHRleHRhYWJ1Zy8KICAgICAqIFsyXTogaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9ODU4ODYxCiAgICAgKiBbM106IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9mb250LXNtb290aAogICAgICoKICAgICAqLwoKICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogIH0KICBub3NjcmlwdCB7CiAgICBkaXNwbGF5OiBibG9jazsKICAgIG1hcmdpbjogMCBhdXRvOwogICAgbWF4LXdpZHRoOiA2MDBweDsKICAgIHBhZGRpbmc6IDEwcHg7CiAgfQo8L3N0eWxlPgoKPC9oZWFkPjxib2R5Pjxub3NjcmlwdD4KICAgIDxoMT5UZW5zb3JCb2FyZCByZXF1aXJlcyBKYXZhU2NyaXB0PC9oMT4KICAgIDxwPlBsZWFzZSBlbmFibGUgSmF2YVNjcmlwdCBhbmQgcmVsb2FkIHRoaXMgcGFnZS48L3A+CiAgPC9ub3NjcmlwdD48dGItd2ViYXBwPjwvdGItd2ViYXBwPjxzY3JpcHQgc3JjPSJpbmRleC5qcz9fZmlsZV9oYXNoPTRhMzY2Y2JlIj48L3NjcmlwdD48L2JvZHk+PC9odG1sPg==", "headers": [ [ "content-type", "text/html; charset=utf-8" ] ], "ok": true, "status": 200, "status_text": "" }, "https://localhost:6006/data/environment": { "data": "eyJ2ZXJzaW9uIjogIjIuOC4wIiwgImRhdGFfbG9jYXRpb24iOiAib3V0cHV0IiwgIndpbmRvd190aXRsZSI6ICIiLCAiZXhwZXJpbWVudF9uYW1lIjogIiIsICJleHBlcmltZW50X2Rlc2NyaXB0aW9uIjogIiIsICJjcmVhdGlvbl90aW1lIjogMC4wLCAiZGVidWciOiB7ImRhdGFfcHJvdmlkZXIiOiAiR3JwY0RhdGFQcm92aWRlcihhZGRyPSdsb2NhbGhvc3Q6NDQ3MDEnKSIsICJmbGFncyI6IHsibG9nZGlyIjogIm91dHB1dCIsICJsb2dkaXJfc3BlYyI6ICIiLCAiaG9zdCI6IG51bGwsICJiaW5kX2FsbCI6IGZhbHNlLCAicG9ydCI6IG51bGwsICJyZXVzZV9wb3J0IjogZmFsc2UsICJsb2FkX2Zhc3QiOiAiYXV0byIsICJleHRyYV9kYXRhX3NlcnZlcl9mbGFncyI6ICIiLCAiZ3JwY19jcmVkc190eXBlIjogImxvY2FsIiwgImdycGNfZGF0YV9wcm92aWRlciI6ICIiLCAicHVyZ2Vfb3JwaGFuZWRfZGF0YSI6IHRydWUsICJkYiI6ICIiLCAiZGJfaW1wb3J0IjogZmFsc2UsICJpbnNwZWN0IjogZmFsc2UsICJ2ZXJzaW9uX3RiIjogZmFsc2UsICJ0YWciOiAiIiwgImV2ZW50X2ZpbGUiOiAiIiwgInBhdGhfcHJlZml4IjogIiIsICJ3aW5kb3dfdGl0bGUiOiAiIiwgIm1heF9yZWxvYWRfdGhyZWFkcyI6IDEsICJyZWxvYWRfaW50ZXJ2YWwiOiA1LjAsICJyZWxvYWRfdGFzayI6ICJhdXRvIiwgInJlbG9hZF9tdWx0aWZpbGUiOiBudWxsLCAicmVsb2FkX211bHRpZmlsZV9pbmFjdGl2ZV9zZWNzIjogODY0MDAsICJnZW5lcmljX2RhdGEiOiAiYXV0byIsICJzYW1wbGVzX3Blcl9wbHVnaW4iOiB7fSwgImN1c3RvbV9wcmVkaWN0X2ZuIjogIiIsICJ3aXRfZGF0YV9kaXIiOiAiIiwgIl9fdGVuc29yYm9hcmRfc3ViY29tbWFuZCI6ICJzZXJ2ZSJ9fX0=", "headers": [ [ "content-type", "application/json" ] ], "ok": true, "status": 200, "status_text": "" }, "https://localhost:6006/data/plugin/scalars/scalars?run=.&tag=data_time": { "data": "W1sxNjYxNDQwNTE2LjYxMzc1MzYsIDE5LCAwLjAwNzEwOTE5MDMzNzM1OTkwNV0sIFsxNjYxNDQwNTI0LjgxOTgyMjgsIDM5LCAwLjAwNjAyNDMzMDg1NDQxNTg5MzZdLCBbMTY2MTQ0MDUzMy40NDg0NTg3LCA1OSwgMC4wMDY5MDAyMDM4Nzk5MjI2MjhdLCBbMTY2MTQ0MDU0MS4zODQ4NTIsIDc5LCAwLjAwOTE5MjUxMTQzOTMyMzQyNV0sIFsxNjYxNDQwNTQ5LjgwNDM4NSwgOTksIDAuMDA4MjUyMTkwNDI1OTkyMDEyXSwgWzE2NjE0NDA1NTkuMjgyNDM2NCwgMTE5LCAwLjAwODEzMDE0NjE5MDUyNDEwMV0sIFsxNjYxNDQwNTY4LjQ0NTYyMzYsIDEzOSwgMC4wMDk2NTY5NDk5MDAwOTA2OTRdLCBbMTY2MTQ0MDU3Ny4yOTgzNzk3LCAxNTksIDAuMDA3NTM5MzA4NjI5OTMwMDE5XSwgWzE2NjE0NDA1ODUuODg3MjY5LCAxNzksIDAuMDA2NTg4MjE4MjY4MDA3MDRdLCBbMTY2MTQ0MDU5NC4zODczNzksIDE5OSwgMC4wMDY1MjcxNTYxMDM0MDIzNzZdLCBbMTY2MTQ0MDYwMy40MTk0OTY1LCAyMTksIDAuMDA3ODU5MjA3Njg5NzYyMTE1XSwgWzE2NjE0NDA2MTIuODUzNzkzOSwgMjM5LCAwLjAwNzQ2MDY3Nzk5NjI3NzgwOV0sIFsxNjYxNDQwNjIxLjkxMTg2NzEsIDI1OSwgMC4wMTA2NjcxNDA1OTU2MTQ5MV0sIFsxNjYxNDQwNjMxLjA2NjYwNiwgMjc5LCAwLjAwODQ2NzIyOTA4MzE4MDQyOF0sIFsxNjYxNDQwNjQxLjcyMjY1NzIsIDI5OSwgMC4wMDY0ODI4NDI4NDM5Nzk1OTddXQ==", "headers": [ [ "content-type", "application/json" ] ], "ok": true, "status": 200, "status_text": "" }, "https://localhost:6006/data/plugin/scalars/scalars?run=.&tag=eta_seconds": { "data": "W1sxNjYxNDQwNTE2LjYxNDU4NTksIDE5LCAxMjAuNzY5MjMzNzAzNjEzMjhdLCBbMTY2MTQ0MDUyNC44MjA0MDc0LCAzOSwgMTEyLjAzMjQ0NzgxNDk0MTRdLCBbMTY2MTQ0MDUzMy40NDkxMTYsIDU5LCAxMDMuMTAzMTY0NjcyODUxNTZdLCBbMTY2MTQ0MDU0MS4zODU1NzEsIDc5LCA5My44NzQyMzcwNjA1NDY4OF0sIFsxNjYxNDQwNTQ5LjgwNTA0MTYsIDk5LCA4NS4zNDAyMTc1OTAzMzIwM10sIFsxNjYxNDQwNTU5LjI4MzA1NTMsIDExOSwgNzcuMzI3Mzc3MzE5MzM1OTRdLCBbMTY2MTQ0MDU2OC40NDYyODU1LCAxMzksIDY4Ljk5OTc0ODIyOTk4MDQ3XSwgWzE2NjE0NDA1NzcuMjk4OTg1NSwgMTU5LCA2MC41MTkzMzY3MDA0Mzk0NV0sIFsxNjYxNDQwNTg1Ljg4Nzg2MzksIDE3OSwgNTEuODczNzE4MjYxNzE4NzVdLCBbMTY2MTQ0MDU5NC4zODc5OTcyLCAxOTksIDQzLjExMTkzMDg0NzE2Nzk3XSwgWzE2NjE0NDA2MDMuNDIwMTE3MSwgMjE5LCAzNC43MjczMjU0Mzk0NTMxMjVdLCBbMTY2MTQ0MDYxMi44NTQ0NTA1LCAyMzksIDI2LjMwMzg3MzA2MjEzMzc5XSwgWzE2NjE0NDA2MjEuOTEyNDY3NywgMjU5LCAxNy41NDY5NjI3MzgwMzcxMV0sIFsxNjYxNDQwNjMxLjA2NzI3MjQsIDI3OSwgOC43OTAwMDU2ODM4OTg5MjZdLCBbMTY2MTQ0MDY0MS43MjMyNTk3LCAyOTksIDAuMF1d", "headers": [ [ "content-type", "application/json" ] ], "ok": true, "status": 200, "status_text": "" }, "https://localhost:6006/data/plugin/scalars/scalars?run=.&tag=loss_box_reg": { "data": "W1sxNjYxNDQwNTE2LjYxNDQzNzMsIDE5LCAwLjAyNzAwMjQ2MTI1NDU5NjcxXSwgWzE2NjE0NDA1MjQuODIwMjk1LCAzOSwgMC4wNTY5ODAwODgzNTMxNTcwNF0sIFsxNjYxNDQwNTMzLjQ0ODk5NDQsIDU5LCAwLjA0ODU1OTQ3MTk2NDgzNjEyXSwgWzE2NjE0NDA1NDEuMzg1NDAxNSwgNzksIDAuMTQzNzgyNzk0NDc1NTU1NDJdLCBbMTY2MTQ0MDU0OS44MDQ5MjkzLCA5OSwgMC4yNTczMjY4NDEzNTQzNzAxXSwgWzE2NjE0NDA1NTkuMjgyOTQ0LCAxMTksIDAuMjc5ODYxODA3ODIzMTgxMTVdLCBbMTY2MTQ0MDU2OC40NDYxMzYyLCAxMzksIDAuMjg4NDM4MDgxNzQxMzMzXSwgWzE2NjE0NDA1NzcuMjk4ODc0NiwgMTU5LCAwLjMxMzUzMDg2MjMzMTM5MDRdLCBbMTY2MTQ0MDU4NS44ODc3NTMsIDE3OSwgMC4zMTY0NDQ1NDU5ODQyNjgyXSwgWzE2NjE0NDA1OTQuMzg3ODg0OSwgMTk5LCAwLjQxMzA5MTU3MDEzODkzMTNdLCBbMTY2MTQ0MDYwMy40MiwgMjE5LCAwLjMxNzg5MzYyNDMwNTcyNTFdLCBbMTY2MTQ0MDYxMi44NTQzMzk0LCAyMzksIDAuMjk3NDMwOTkyMTI2NDY0ODRdLCBbMTY2MTQ0MDYyMS45MTIzNTYxLCAyNTksIDAuMjI2MDAyNjc4Mjc1MTA4MzRdLCBbMTY2MTQ0MDYzMS4wNjcxNDUsIDI3OSwgMC4xOTgxMjUyMTMzODQ2MjgzXSwgWzE2NjE0NDA2NDEuNzIzMTQ4LCAyOTksIDAuMTczNzM3ODUzNzY1NDg3NjddXQ==", "headers": [ [ "content-type", "application/json" ] ], "ok": true, "status": 200, "status_text": "" }, "https://localhost:6006/data/plugin/scalars/scalars?run=.&tag=loss_cls": { "data": "W1sxNjYxNDQwNTE2LjYxNDQxNzMsIDE5LCAwLjYzMzYxMTQ0MDY1ODU2OTNdLCBbMTY2MTQ0MDUyNC44MjAyNzU4LCAzOSwgMC40NTAyMDYzOTg5NjM5MjgyXSwgWzE2NjE0NDA1MzMuNDQ4OTYyMiwgNTksIDAuMjU2NjM1NjY1ODkzNTU0N10sIFsxNjYxNDQwNTQxLjM4NTM3OSwgNzksIDAuMjA0MTMyNjc2MTI0NTcyNzVdLCBbMTY2MTQ0MDU0OS44MDQ5MDg4LCA5OSwgMC4yMDgzNjQ1OTEwMDI0NjQzXSwgWzE2NjE0NDA1NTkuMjgyOTIzNywgMTE5LCAwLjIwMDcxNjI1NzA5NTMzNjkxXSwgWzE2NjE0NDA1NjguNDQ2MTAyOSwgMTM5LCAwLjE1ODc5ODQ1NjE5MjAxNjZdLCBbMTY2MTQ0MDU3Ny4yOTg4NTUsIDE1OSwgMC4xMzY2NjQ0Nzk5NzA5MzJdLCBbMTY2MTQ0MDU4NS44ODc3MzM3LCAxNzksIDAuMTEwNDc1ODA4MzgyMDM0M10sIFsxNjYxNDQwNTk0LjM4Nzg2NSwgMTk5LCAwLjEwOTAyNzU3OTQyNjc2NTQ0XSwgWzE2NjE0NDA2MDMuNDE5OTgsIDIxOSwgMC4wNzM4ODA4NTEyNjg3NjgzMV0sIFsxNjYxNDQwNjEyLjg1NDMxODYsIDIzOSwgMC4wODgyMzczMTU0MTYzMzYwNl0sIFsxNjYxNDQwNjIxLjkxMjMzNjMsIDI1OSwgMC4wNzU4NjYyNjcwODUwNzUzOF0sIFsxNjYxNDQwNjMxLjA2NzEyNCwgMjc5LCAwLjA2NTg5MzgxMzk2NzcwNDc3XSwgWzE2NjE0NDA2NDEuNzIzMTI4NiwgMjk5LCAwLjA1NDAxNjk5NjE3NTA1MDczNV1d", "headers": [ [ "content-type", "application/json" ] ], "ok": true, "status": 200, "status_text": "" }, "https://localhost:6006/data/plugin/scalars/scalars?run=.&tag=loss_mask": { "data": "W1sxNjYxNDQwNTE2LjYxNDQ1NjIsIDE5LCAwLjY5MzIwMDgyNjY0NDg5NzVdLCBbMTY2MTQ0MDUyNC44MjAzMTQsIDM5LCAwLjYzODcyODIwMTM4OTMxMjddLCBbMTY2MTQ0MDUzMy40NDkwMTQyLCA1OSwgMC41Mzc2NjYwMjI3Nzc1NTc0XSwgWzE2NjE0NDA1NDEuMzg1NDIzLCA3OSwgMC40MTIwNDI2MTc3OTc4NTE1Nl0sIFsxNjYxNDQwNTQ5LjgwNDk0ODMsIDk5LCAwLjMzMTA0MDIzMzM3MzY0MTk3XSwgWzE2NjE0NDA1NTkuMjgyOTYyOCwgMTE5LCAwLjM1MDAwMzE1MzA4NTcwODZdLCBbMTY2MTQ0MDU2OC40NDYxNjUzLCAxMzksIDAuMjY4NDI4MTQ2ODM5MTQxODVdLCBbMTY2MTQ0MDU3Ny4yOTg4OTMsIDE1OSwgMC4yMzc4ODU4OTIzOTEyMDQ4M10sIFsxNjYxNDQwNTg1Ljg4Nzc3MTQsIDE3OSwgMC4yMTYyNDAzNDY0MzE3MzIxOF0sIFsxNjYxNDQwNTk0LjM4NzkwMzUsIDE5OSwgMC4xNzAzMzU4ODg4NjI2MDk4Nl0sIFsxNjYxNDQwNjAzLjQyMDAxODIsIDIxOSwgMC4xNTUxMDcwNTExMzQxMDk1XSwgWzE2NjE0NDA2MTIuODU0MzU4LCAyMzksIDAuMTYxNTY4OTY5NDg4MTQzOTJdLCBbMTY2MTQ0MDYyMS45MTIzNzQ1LCAyNTksIDAuMTUxMTk5ODYyMzYwOTU0MjhdLCBbMTY2MTQ0MDYzMS4wNjcxNjUxLCAyNzksIDAuMTM0NDQzNTIxNDk5NjMzOF0sIFsxNjYxNDQwNjQxLjcyMzE2NjUsIDI5OSwgMC4xNDE3NDAzMjIxMTMwMzcxXV0=", "headers": [ [ "content-type", "application/json" ] ], "ok": true, "status": 200, "status_text": "" }, "https://localhost:6006/data/plugin/scalars/scalars?run=.&tag=loss_rpn_cls": { "data": "W1sxNjYxNDQwNTE2LjYxNDQ3NDMsIDE5LCAwLjA5MzQyNzkyNjMwMTk1NjE4XSwgWzE2NjE0NDA1MjQuODIwMzMyLCAzOSwgMC4wNzk2MDc3ODQ3NDgwNzczOV0sIFsxNjYxNDQwNTMzLjQ0OTAzOTIsIDU5LCAwLjExOTc1MTc4MTIyNTIwNDQ3XSwgWzE2NjE0NDA1NDEuMzg1NDQ0NCwgNzksIDAuMDU3NTkyMzAyNTYwODA2Mjc0XSwgWzE2NjE0NDA1NDkuODA0OTY2NywgOTksIDAuMDMwNDcxNjY5NTEwMDA2OTA1XSwgWzE2NjE0NDA1NTkuMjgyOTgxLCAxMTksIDAuMDE5NjAxNDkwMzQ4NTc3NV0sIFsxNjYxNDQwNTY4LjQ0NjE5NzcsIDEzOSwgMC4wMjcwMTM0OTc0MjcxMDU5MDRdLCBbMTY2MTQ0MDU3Ny4yOTg5MTEzLCAxNTksIDAuMDIxMDI4MjA3NjE1MDE3ODldLCBbMTY2MTQ0MDU4NS44ODc3ODkyLCAxNzksIDAuMDE5MDg0NjEzNzcwMjQ2NTA2XSwgWzE2NjE0NDA1OTQuMzg3OTIxNiwgMTk5LCAwLjAxMDc0NTc3MDI5Nzk0NDU0Nl0sIFsxNjYxNDQwNjAzLjQyMDAzNTgsIDIxOSwgMC4wMTc2MzQyNjg4NTAwODgxMl0sIFsxNjYxNDQwNjEyLjg1NDM3NjYsIDIzOSwgMC4wMDg2NzU5NDk2NDgwMjI2NTJdLCBbMTY2MTQ0MDYyMS45MTIzOTI2LCAyNTksIDAuMDA4ODM4OTkzNDk3MTkyODZdLCBbMTY2MTQ0MDYzMS4wNjcxODQ3LCAyNzksIDAuMDEwOTk0NDE1NzMwMjM3OTZdLCBbMTY2MTQ0MDY0MS43MjMxODQ2LCAyOTksIDAuMDEyOTM5ODU3MzE4OTk3MzgzXV0=", "headers": [ [ "content-type", "application/json" ] ], "ok": true, "status": 200, "status_text": "" }, "https://localhost:6006/data/plugin/scalars/scalars?run=.&tag=loss_rpn_loc": { "data": "W1sxNjYxNDQwNTE2LjYxNDQ5MiwgMTksIDAuMDA3Mjc2OTE3ODA3NzU3ODU0NV0sIFsxNjYxNDQwNTI0LjgyMDM0OTcsIDM5LCAwLjAwNzMyMzA0NjIxNDg3ODU1OV0sIFsxNjYxNDQwNTMzLjQ0OTA1ODgsIDU5LCAwLjAwNjQ4MDE2MTEwMDYyNTk5Ml0sIFsxNjYxNDQwNTQxLjM4NTQ2NSwgNzksIDAuMDA3OTAzODE0MzE1Nzk1ODk4XSwgWzE2NjE0NDA1NDkuODA0OTg1LCA5OSwgMC4wMDU3NDIyNjM5ODAyMDk4MjddLCBbMTY2MTQ0MDU1OS4yODI5OTg4LCAxMTksIDAuMDA2Mzg0MzMwODAxNjY1NzgzXSwgWzE2NjE0NDA1NjguNDQ2MjI2NiwgMTM5LCAwLjAwNTA4MTUzMzQ1NDM1ODU3OF0sIFsxNjYxNDQwNTc3LjI5ODkyOTIsIDE1OSwgMC4wMDQ5OTE4MzY4NDU4NzQ3ODZdLCBbMTY2MTQ0MDU4NS44ODc4MDcsIDE3OSwgMC4wMDU1MzgwMDQ0NTA1MDAwMTE0XSwgWzE2NjE0NDA1OTQuMzg3OTQsIDE5OSwgMC4wMDU3Mzg0NjQ2NDk3NjY2ODRdLCBbMTY2MTQ0MDYwMy40MjAwNTM3LCAyMTksIDAuMDA1ODQyNjk4NzM3OTc4OTM1XSwgWzE2NjE0NDA2MTIuODU0Mzk0NywgMjM5LCAwLjAwNDk5MzA5NTk5Mzk5NTY2NjVdLCBbMTY2MTQ0MDYyMS45MTI0MTA3LCAyNTksIDAuMDAzODY2NTYzMDg1NDY2NjIzM10sIFsxNjYxNDQwNjMxLjA2NzIwMzUsIDI3OSwgMC4wMDM3Njg0NzYxOTE5MDgxMjFdLCBbMTY2MTQ0MDY0MS43MjMyMDI1LCAyOTksIDAuMDA1NDQ5MDAxNjc3MzM0MzA5XV0=", "headers": [ [ "content-type", "application/json" ] ], "ok": true, "status": 200, "status_text": "" }, "https://localhost:6006/data/plugin/scalars/tags": { "data": "eyIuIjogeyJldGFfc2Vjb25kcyI6IHsiZGlzcGxheU5hbWUiOiAiIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAicnBuL251bV9wb3NfYW5jaG9ycyI6IHsiZGlzcGxheU5hbWUiOiAiIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAidG90YWxfbG9zcyI6IHsiZGlzcGxheU5hbWUiOiAiIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAicm9pX2hlYWQvbnVtX2ZnX3NhbXBsZXMiOiB7ImRpc3BsYXlOYW1lIjogIiIsICJkZXNjcmlwdGlvbiI6ICIifSwgImxvc3NfcnBuX2xvYyI6IHsiZGlzcGxheU5hbWUiOiAiIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAidGltZSI6IHsiZGlzcGxheU5hbWUiOiAiIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAicnBuL251bV9uZWdfYW5jaG9ycyI6IHsiZGlzcGxheU5hbWUiOiAiIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAibWFza19yY25uL2ZhbHNlX3Bvc2l0aXZlIjogeyJkaXNwbGF5TmFtZSI6ICIiLCAiZGVzY3JpcHRpb24iOiAiIn0sICJkYXRhX3RpbWUiOiB7ImRpc3BsYXlOYW1lIjogIiIsICJkZXNjcmlwdGlvbiI6ICIifSwgImZhc3RfcmNubi9mYWxzZV9uZWdhdGl2ZSI6IHsiZGlzcGxheU5hbWUiOiAiIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAibWFza19yY25uL2FjY3VyYWN5IjogeyJkaXNwbGF5TmFtZSI6ICIiLCAiZGVzY3JpcHRpb24iOiAiIn0sICJsb3NzX2JveF9yZWciOiB7ImRpc3BsYXlOYW1lIjogIiIsICJkZXNjcmlwdGlvbiI6ICIifSwgImxvc3NfY2xzIjogeyJkaXNwbGF5TmFtZSI6ICIiLCAiZGVzY3JpcHRpb24iOiAiIn0sICJsb3NzX3Jwbl9jbHMiOiB7ImRpc3BsYXlOYW1lIjogIiIsICJkZXNjcmlwdGlvbiI6ICIifSwgImxyIjogeyJkaXNwbGF5TmFtZSI6ICIiLCAiZGVzY3JpcHRpb24iOiAiIn0sICJsb3NzX21hc2siOiB7ImRpc3BsYXlOYW1lIjogIiIsICJkZXNjcmlwdGlvbiI6ICIifSwgImZhc3RfcmNubi9mZ19jbHNfYWNjdXJhY3kiOiB7ImRpc3BsYXlOYW1lIjogIiIsICJkZXNjcmlwdGlvbiI6ICIifSwgImZhc3RfcmNubi9jbHNfYWNjdXJhY3kiOiB7ImRpc3BsYXlOYW1lIjogIiIsICJkZXNjcmlwdGlvbiI6ICIifSwgIm1hc2tfcmNubi9mYWxzZV9uZWdhdGl2ZSI6IHsiZGlzcGxheU5hbWUiOiAiIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAicm9pX2hlYWQvbnVtX2JnX3NhbXBsZXMiOiB7ImRpc3BsYXlOYW1lIjogIiIsICJkZXNjcmlwdGlvbiI6ICIifX19", "headers": [ [ "content-type", "application/json" ] ], "ok": true, "status": 200, "status_text": "" }, "https://localhost:6006/data/plugins_listing": { "data": "eyJzY2FsYXJzIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IHRydWUsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJzY2FsYXJzIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1zY2FsYXItZGFzaGJvYXJkIn19LCAiY3VzdG9tX3NjYWxhcnMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJDdXN0b20gU2NhbGFycyIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQifX0sICJpbWFnZXMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJpbWFnZXMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWltYWdlLWRhc2hib2FyZCJ9fSwgImF1ZGlvIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiYXVkaW8iLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWF1ZGlvLWRhc2hib2FyZCJ9fSwgImRlYnVnZ2VyLXYyIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiRGVidWdnZXIgVjIiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiTkdfQ09NUE9ORU5UIn19LCAiZ3JhcGhzIjogeyJkaXNhYmxlX3JlbG9hZCI6IHRydWUsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJncmFwaHMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWdyYXBoLWRhc2hib2FyZCJ9fSwgImRpc3RyaWJ1dGlvbnMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJkaXN0cmlidXRpb25zIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1kaXN0cmlidXRpb24tZGFzaGJvYXJkIn19LCAiaGlzdG9ncmFtcyI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogImhpc3RvZ3JhbXMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWhpc3RvZ3JhbS1kYXNoYm9hcmQifX0sICJ0ZXh0IjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAidGV4dCIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtdGV4dC1kYXNoYm9hcmQifX0sICJwcl9jdXJ2ZXMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJQUiBDdXJ2ZXMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLXByLWN1cnZlLWRhc2hib2FyZCJ9fSwgInByb2ZpbGVfcmVkaXJlY3QiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJQcm9maWxlIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1wcm9maWxlLXJlZGlyZWN0LWRhc2hib2FyZCJ9fSwgImhwYXJhbXMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJocGFyYW1zIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1ocGFyYW1zLWRhc2hib2FyZCJ9fSwgIm1lc2giOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJtZXNoIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJtZXNoLWRhc2hib2FyZCJ9fSwgInRpbWVzZXJpZXMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogdHJ1ZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogIlRpbWUgU2VyaWVzIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIk5HX0NPTVBPTkVOVCJ9fSwgInByb2plY3RvciI6IHsiZGlzYWJsZV9yZWxvYWQiOiB0cnVlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAicHJvamVjdG9yIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIklGUkFNRSIsICJtb2R1bGVfcGF0aCI6ICIvZGF0YS9wbHVnaW4vcHJvamVjdG9yL2luZGV4LmpzIn19LCAid2hhdGlmIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiV2hhdC1JZiBUb29sIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIklGUkFNRSIsICJtb2R1bGVfcGF0aCI6ICIvZGF0YS9wbHVnaW4vd2hhdGlmL2luZGV4LmpzIn19fQ==", "headers": [ [ "content-type", "application/json" ] ], "ok": true, "status": 200, "status_text": "" }, "https://localhost:6006/data/runs": { "data": "WyIuIl0=", "headers": [ [ "content-type", "application/json" ] ], "ok": true, "status": 200, "status_text": "" }, "https://localhost:6006/font-roboto/Hgo13k-tfSpn0qi1SFdUfZBw1xU1rKptJj_0jans920.woff2": { "data": "d09GMgABAAAAACp8AA4AAAAAUwAAACokAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGmQbmUAcg0oGYACGTBEMCu882RYLg14AATYCJAOHNgQgBYJ8ByAbB0Wzon60XsEcRckcrcr+ywTtCAu7vIkKUSLAEkX79qHYsVrOIXiSMp377A39RgODYjP02tCGSQRohCSzPDz5F++ZOzNvvxxoA3ZwF1dQBbkTWP2kVEVi7w/83Hp/Y6PDGnqCKCJlUaKURMVGDUdvMDJHVIg4QBAkokTKpsw6k0LdbmmVFEuwwOtQpqUCDdCJ2b0GBxDpf/9u9j+XQGQGIl+tEq1VOr0S2T2sZ9/yxZFpIOkgKdrXFN+0M4foFz9c20sDSrJUtd8OCK1oKHa27U18eptmu8+6n1sZZrwh1iFPj21mdFClKFNUq/93o939u+KbE5lkB2SZJB2R5cAGsWTqrUM7zIdYBXl6atOlKtOWiEXbpgo81PXj7dWfHuECB1Jm2+HuZL8f70TNAaYHlnBAUZgNm3JkGG03jk1xP/499lO/h8a025fRsa1BIErglKnQ8fHzfnMpUDgA2BYKi5NUIDQ4QIQIgYgWDRErFiJBAkSyZIhU6RBVaqF0ewuBQAEzgDkQoECEQIBppKlg2GIrPTMQ2TfEnwgiB/rjvUHkMOfAGyCCAZD/FKAcur//DWACClAwQAGBpUlB5GIAtizHa0ttKaeKQm2vQ3WjLhTVQKGY0BvBgRIKqVANlwisjyMh0ppQ1Deh+NGEqrmqWJVvR6sBXG61pUbIcN+o7fsN1YWeG1N63ISEowypb1sGWKzY8DpJ3CkSTjtHmhx5511wiQJFylRcoU2HHkPGTJiyYMWGLXuOcuTKV6Bbj3t69ek3YNCQYSNGTZsxa868FVu2PfTIczt27dl34I23EJdyAwMFfBTxUCZghQAEb+JI40oBPPzwTqYFqckPl/DRyMe08rXrBG3owhTmxS1yn3W+YpMv2NPI6flaXgooRLGrJy3cQy/60I8B12qP3ccaHmAdG67NXtvCNh7iEXawiz3s48D1olde4hVeu970wtsMwjaH99Tmno4VDtFZAeNSrlHIXYr5hnI+ssI6gwG6/lZhafUuYcKQGyyyk21O8pl0F5anRKe+hKRJzioM2PG5intH5jlnvABOsOE15+h57j1YUvnOZcECFrGE5QH5YHFhVcVk89DKF64D2tCFORWrpzfpHFxyGfkocG32wha28RCPBmallW9chzZ0YY50bGIL23iIR92j6eBkRZYtblimWt8BdrGHfRwMjMGVcXiQh0IUU5XwBm/wBm/wRsbArPTgGMKouGlGscxMtljtDPousId9HHCk8eGjnchRVvmebT6Bxp77ruYXziqNopPv7ulXENErGQ4s+RyvBEcuYqbr2GmL3GDVUKy+Fj7ZKiznRWelhByWnEOKchUiN+kQOtihuhEG0J8bccBhQuqyeXrnTrum1lzT8jWp2mttvd+rXmrFWQVIfwX5paKwooXeF1k1MKMFSTfeC7JJvONjX+SHa4rSa/WkWSiSb/fh3hfYv4gLkMKyVHDm+2ltX5m8yJ7Zj+T0P384/U+tXkEdC+GzK+QVhIv8inJt93vWy/aEFWd2g4oPFenBdtqonu5m1d3tTZW48eREz/uAHZAvcedZrc/Z2ZBl7ZbD+VW1lVH3UtjKlWmNTW66A2eK6YxQXGCt7o8ih+Tr9u/et9hB7qnKD2j5a5i4Z9KsXOmQ+czviLa92Z982e1vGSa/gQdzLk/G24L+OfYP7itOpkh5++FJX0EunXxrrYAP7qX7eG+L2sz/9h83iBO6mH7laRzKccmdjdbuSS2w9+gvrXKTz/at3rbWE5gza5LxXcakfbfXdMP6xUO5j0tdabfOe5ev7B89BnJbvZQWauCDDYLpIrhE4fmNdpIEBpLkMbtERT9r0CJMGx6mFx9hzMxRFh5nE59gx8F/UmJxOQqdUvxdSrdHznnugHke87CFcr5fBBHkUDiUWBQxhYnL7ZQICTGkZHFOVtIKkBMhL59LsrssCwVFKCpESS7KslGRk4ZYmjLSyvxqzTAFhmqCgSlEM5ORhbxsZGYnD3uZOcghpTDmeEdBeciHcr3VYKHCBoFwKLkY0WMAyuB/3IaMwpg2D7FgGYsVitms2oC1GfPb8giT520GOw6g0Rsxww33kQ83sgCGM3wFS44oZ1gUKQXJiXJelIuZA7EZFpjhhxdOWOFqsKraELpcEJRAw3BEM4cIS9lYZwxiC5jAdGQXC1HSRElvI7JkE8AQbvjghu/I5y6KAIAtKPRAwQxrYDw/guAGOsE7e7/wGsZi+ukydWme9zxdUpnlFWHcdBcNHJ3NTcyqyq1Mrh6ktI2hnrTtVQtpR0P9yp1NdLkOk6PJsGPejIsG6rax+x1B8gGx/3dnPpA8zNPdGS6AQ2nG60cE+fiDkZAZgArFfpACYdfq1hcvVOAKcZBlx1exPgowcdUHjmrjNRnlbeurgqLfPvZhR61kpJob9SfpQOg1EJ7ycT9eWB0N8FQRgGw66oOyZnCnVokV0Y9MCYsG9eo0atLspha32r0VRNb1baECBKJr067DHZ1QEHyOALWRiiQM6Nd1OVBWeGiuLyOEPpR6zFPA6sDmVoettzPUAlWw0jws/AU4YFQcgIPcDGibdDpcqEGDNV9WLeXh2bCAchCGogdsBIeBEDBThEr5t9agCYv2vfcPkSmmMRFb8XDMhxPBHcUdx4nhFHDquONwi8fz7x+YCadSleJzD5m05MCHU8SkNy9OCHd47Mvdl/yWuwRyBEsOg/wh+PTl26TwTf3p/B0RqEKRBXJh7fST5zENEFDpawHrYY+J1v7H63WjdZv64frlx4i1YNGSZSvixFt135oH1m1IkPiD9gknSfbCS6+89kaKt9gAJXsfe3UUa+YWFWOchEZuwb24FYuxL7kb9+EePIgj8RAexwPkCZyKJ/EiHiQv4X68jDfwFN7EWzgNb+N9vIAP8CHOwEf4HK+SL3AWvsSPeJv8hLPxM/7AJ/gTf+Ec/I3/8RWZ4DySwvflZW3R+c6yo7CT6ILyeEJ0UXm8I7q4PN4TXeIczxcWiC51jpcUlhZd7hwvKywvuqp8vJLo2vLxaqLrnOONhU1E15ePtxDdWD4+TnRT+XhxyM2+pcAIboFAYarPf2YX+CGpvIeFOPMLceFeq6w/gTgKoAOPf8ccgYGG2FEPQNWhofLt/UALE/2mIyCoiUWA8u69T4ycPEbW3F4KAyVXBYbCtFbWDIAcu3egbYgijIKBSmtD3rZHg70UQqd9HYL1m5HgXPSvCAYWDOYwKN7mdOwa82gYrBC4l+W7YTuzMlPOrQBlwS/rf4hsqNQT0ZlDuzeZesi9DmVE0YpagF3r3PY2r9MVxxBTw2Hco1tnXKeDMuJAF1gsIMfjOmbAN1QXPTaSPaYCbcTshjElittS+z/nIl4/b9ZtQGSp2g1zHq1K41Qq7QFeCq6YYH7Dc1act4bNyMpcOWb3gdM0dyI+PWsGO50zEbTHmFCU3YtPIP04/5T7OCK1C77qhjQKb+TGUupLBOix9GHsmjPRi4XI1AiCigGn2ZgTpNVfKSstJaBY0ohrqVDeESsYjADmyaEiQtD64s8Ll5k9zYqF67Ram0p57DSqUwp1KYL2qu0iZU4uuafHGZIUzA/Lbp1zH7cp+VncGlW+u15Bul4rudhswtRWUi+ttiILG20q/+z4wOwPqX+o9gZy2NehB66FNVd4NRro0wqm4aTRZO/iiU0XCpl4YpiHYW0aOeEH8nhtpJV6KtIKO8h74pAu7IpgKUkDYKbDl3dUHnW4w08ZXtMxr2jrw0QmQAtrbcEUdRrS9zvQ7u9W6ZKaqpIdPYcBZ0OfG7xnLXsSYjof7vz2Ab8AR+H4rujx0VQdMg3PM+cokxlNDuMJMWHaGNJ0Rfk+kAWTf1009M98UKgRNLn+y5AIhhvD5j7PKyKGSIyXtSqbH9XMK6Gf3cnYdAy85G7oXdgsD4irnbLXImb7v5s3q9X6r1HsSfXtaptuM9pu/wkHteuoCqHP95OsuN1HphiTTkLsaTN5ZnvaiRx4g3gGLpd/Yi4bLbK4pKJVuFnlZkG6Phpl7KRdA6SrPzFppuJzTWST5rbdgy5L0O4MJlaMC7r4dPbKxEIQmEzFlvfnruhciE7XzhrtnkOe0USojrcyvQeZQNpa/Zv9WoyHHeiuGrEKWY4fYbJraxfWRlMprZXocIL5lOaP/8zbtZLTcCxjYnGpWmCj1FRZ86AMand3Su7LE40xRdnVeUGzTA/dVbM8B5hoivq182/t2V/4mirsvY66MUq9uJDrI/g0Ot2gespzFY0XL7+SKcKExsowxTf6JqTl++Ic0Ok5PDvF4IxCK2qjkxpNDy4QtjMvMMYELnsoDMhe7AriwA4ekL0R21UGh9R70/+ZdCbZ1t6gs4yyUwCzDGFZ5XJqmDs5Asx0Le2pVHLjxclmg04GIdxQGUMnwdL8LFIBDsWoW3ktMIWwVhnP+4K6agDowkRGVZn8jsqOCBlqoKCYlTjJz3k1eODW10lDTcflpoMhxO4l6MrkQSRsdNbMPBo9bNEwPrOSdY6ezTs+lrZGmnpQY/ZZIC1DyjNjOjqHlpZRyyXNd+ZVEMoleF5+i9Vxwi1foWkjhI8lwzFbKbqEPY7idhBST44a75IK9XCsd7mzTsbOuNSwXvCSXSlRLY8tArQFhNT7n+U5KKjGuluuQ/ZkOccGNfHQysY5LL3hutJgXHpyhEP9zmOPaK8fLdSYhEwHuoLbogcvj2XudCGKXCynsEsLUlkBrOEYmQbLUW7gl0tzpqoAJgS55SycCwUTUxqeEosN32jpJNHJUg2MzYX0hse5st1NKhhUchjvkL7ApR6ioKFOEgMPwm+dk9rkGla1ajkHb8jlUGaeBBsW2Fa5mFEZBnTqgQtLmC7kHZzRoEH1BjoU9TWd+cyswCZCXQRO208HPaFk9UL5zFUf0zWnCrbDpCGR0swhjHlHWprAOZSksdvo51vt71uyWcnolYB0FTuT4fm1F49PRbA8XrgjlScpL4Dn6vndtJm/jkn9X3OR9fsWNuK+x+ekfHmC589NrdoMGrktOpNFk43qvZRnTTvP9zS2aOEm+3h2ZsKu+5T0mOZsb6mU3pKWWl+4/ZrZZUSXvhLoOI2i2WqKfS8O03WdTT28eU2AjhSHxLw7ypQ8PhCW7+SNpPBTCiTHkBmJMgTXOHeHc2FjD9q7na2WxKWa8Yk5HqujY3lyNItQQxKQzSTMW/NlNYgmwItXI2cuqmaGAFtJSeOyXAt5YPMsU9Eetk5dMQhV/eq78AM7ohXTU/AS/9O9Ep7WG1s17oShrQgNnEst9OGam5O8LGUOojRXOb4aQJp7GJGWL1zgQG0qFYlu8B/F+tnM4XtFrz77kQUzRT2Gp1WeOBsxdrozEryYyTMRuze2TcCmETjB3TJ1cNQ4ZAHzQNvuRQW2dEdzQHo8r3I9gflbwYhaMyM40VkBtURhRp+mw9yUSsks19NaH/TC330nLVdxRVYWp6q6aogZW5i+zlWTuif/GE/EmPgYjnB8YtJsmytjbBqKvxfd5k1nKkAixEIK1bB3blMaczMgwHpHM/7FTMexvWR5QTEuhYW6evbeSbd+IbboMFVAe8GynImOj5qeA5mvhjd1cSnRSK4BKtKxE8/7KgECClcH07ranaNROF2Zd7NSPN5om6XkLAC2mn5Ot6bcI4SnGLiiE47zBL6mXXjfr2k0cgwVFv7qId4RM2TCrd18jzs8y3QmtDm5arXv2itPt0lvtIeMAYY+hsbbAYaRO0Yj+D0reacKjdgnIfZoOJRLArdDYUx1XscH9BaOi87p9QHn+UDeS0aoMefXqVE0RreFD0UKekWu387+2XdNugWdJAwqXElQFNyie07f59F/9r2FWrftb4ohoAjbX4fupIy0TpVnmp0jJTWTMzfZZwgztzmHDibJZdXd6bTy3DBKVoJDcDnRINejdm6qnX0A3z/Ftv18nFLaSa+htRcA9n5hTGXzj8rmJK2o8uYwak1DihPWnkC2NHejOGnbu1PMTD3IbuKjZ2Mqm75VN6ZoPdQlOTI4bBAsunbRdiIEWpi5B7l+P9A5JxnoX76sQVhNxMLDoNa4qLOtKPVmZVhmXUoFNWPZJvse6Udk88RBZniWgf6CZcDS5/vtXmF9pUFNA7bNemqa+euPV0Yr8mM7ytF8kqEJdTGuf4x9dAy8PWxcAsKB42QAl7QNg3g+AVJ1t0jF62ZU7cNGV6WiO/DfVeTHlh2i68RcVWd6EbrrJsR8QJQe3mrXjKP00YWzRv1Jx4S9RceoRilH9RgI17P+jSaVgEDOC13vY266oWg/D8ZAtQicm57/45NmKmvSs1JmShC00+vb+zzkebtv+0oIxHBqytmEoGJKgsKXgNPwCf4JZGqdGDJa0nxoNAcpYT5i2LNEuOLvKP9M5eHG3iXUaYzcjuL2xo40+hQZ87P6X111zf/I56P/NzJWVdYi8AO6KIDBpWb7vr/LB8KZdp/OU2mOPVYpVZW0nDu9+WTqjek5/9ipp8udhIiPFXfyZv6AsJxwmHvRdaMI07Systy09tpEip/fvWk8dWJnvc8zjh5wJvFkandU7+eduZgN9+B7YZTU4dbCkpbygux7RV0UuBC9toPf8aX43lI/feJ3rMSJbRFVeVvYfKk5vkHyk30daFg2/vJftb/zZ3Hg9SrXQABXbkNhRmn5+N3Ktuli8/DTGsog39nryYE5I8vJpWjSYxMw9JzpAc1zZzwichkj9YGS6Nqiid7C+48l4NwJAyPvS9NaHjW1tCyCap232J53uFidjhKhH1TkL/vFtntLhJ8uGIzo/bO1vPp7sy8sazjitLdEZLtf54u1qFfrmBPeScOtUoM3BXpqK0p6a1CuGuEt9QlJjZWxUY0lyYnNpXDxWvUV+34CKaw/0v1ZQuaN1xMxMdufZUWIKYap1gLgfpoBzXnMYoQyQBP303jc/aWM1rnb2tD6GBZpd89EyLVRneXaQiNAOUD5mtc1jHQG8rI5E1JU+eVQZ1rz1DAg5yBBihnjI5eMjjqphMfRyJTsJCSQjNRsjjW2TEy1EJ37ksJ9HToT9I+3iot59LeAmHgL+FQjDNnOP1sS/J1D8Ly23sMDackfuec4qoP/DtB89ANO66nKXmYOMIi0pBZ+YJrnybUudFw1WRmNFvxeGqE0v23Xdqb9qGH8rKzHT/en7fWsIqz8D1siX33951w2Fakb/8NDa6JOj+VfSfQ1aVtSNV33AihVFeblFUQfD6IH4bUSJe2CXOdRE4ZuwNBbX30c6vMLrfc6EXGoeDhy+MfGY+9eM7/y7sqMRHppaSjBqAjVmBKf1hrXJge6HyeE9gQ+v6j+UZV4Cgb6RxLP/K2uf8Xxm/9x2Fl//MQrcUz7790zo8Oj3QLdvF+1BR2HqsvPjSSMlp09WnOP+7zWE759fmmGqF/cZ58AKI/cazLh9EgBDD3ek+VkEyhXNzY0UgFDT/BkvdAA+tK3rthw4ZtuMtdknYHh7nMyDqhn3LvCU1SRioXahrm3okwt9b5/V1KTK/xktHGKlEQPFLwPu6d6jz2fSlOlhYHB87MEuU562L8f3n2dvr/zaJJaXldekNp6FymDfytz08xfP2NuqRruEudECd5T+SDnvuihCxh6GPB30kXzMKKdmNrV0kOZk0X3GBxFx/610giGeeALVd7s8eMwui0l7/bkSSgYjCRPp5xDapr+XSZeyJ9Mk0VqjaAqVRw1EsrJ+FZicfbDabZC9HupheWXp1lB1siYx1r/sIM9mJ3//fiDn3tQR29TYcG99ptIOBjEJC9lyycaMO2b6Z4CYwHzelRNuiSM1fAcuaEZqUmTmQqFsqUZ4V3l0muJ1Lp9g4M8u//mS8yz2bSateRT3l7ssdL+kyElvbfTikeb2mzhCkIIaUobjXDXyfFsaeBZepC1SwqfpIblzd5paRjPpZDaUhO9pv3xFT4tPIvPisEnbjyKWrzXNtg8nwfaGlqfAaNFldX6ydMJdM7Tn0N25OaLwIJ9vp8Mj16HbnYvz3gszXZtwY2OCNrh2t+Jonv0YHpFJ8BYkuSzC+u8YzIk3jiZ85vndrgCxSMEzenBfLUB/2WcyOD/LyBYUIMeAeJy14vcc57Nf3iW20BtomZ/fPZ8Pgdc8g6titBwO2n/Uf/DraZlwzv3WA8h+wsMrzQ9H1vB0QciK4B9s0LQAcZuHUBj6EFi2LNBANgoXRXTJayuyNy1iDnPzqXA0w9sJB4EwkUc3i/+3odDbi98nglmghYPg6uK8YiVT+nQrfhy7N3Xm9RAWlxyeE2kDRmi3/fd7ly6g6qCMpw+23dzSl/Aaad3D9qR6QiSbQIZVGV5/jw51f88oIEhxxewQHb1oz8devwfhox6UPeiIKDC9xTxhfXsbm79SzhjFN6YhiUFMLj4VffZEtd+iP/8r5L0dSk+rX1/lbElgDGiviSyuv3l6onF9gPwFvv99PTwtn+LIxmw4MuQ4V/zpHdXEijYxbp3BY/sRn7brWwXNLwBFd6Ux4nUTwVnSin/r9MixvfZXqoxCHavfKl0ytZQ1NO5FDvAzfs7sXuctz6ZnaGkYRQ+bXS4dMTWN7YVqFcyuR5SdPUJ9UtAuaA2wFvs79NTw4/8b2NKfP9bfvl5ym/OTcH0mlZEye38BjqqNMm/4mHfzpl/kT2AeWzHv0u4lxFJ62fELRer4HTX06e1aRRGJ8iTkElJjyc1p5wK2iNrJReOUxQoaZeSna2nPq/XD9z3FXrzM8rSLhxHXPqk2ud7FJPFB9T7xcVuqbdCKS4ptowCWKCs+4aU5RfMTH7yy4DjHzYJcOUqoG8rOnc43wD15ctuw8QgOyx1hTINmaGpqVFIWzVz4BxlBVKikhL8qqLEIvYpCvuF3TvZreTa6XFDtoeqANaSpZT/H6akbbBK/RQuo/zcTkxfZ+vbkplGpn7UVMs9zQmG2c7X+XpXTv+cBdXjI76u+h4HlZwiA2aLhCkMbHk88vAkhoxebHpfeKPMU8KN8bRdhbNPQeMHPLNHt/3qMdm+O/MoYkFF6wP4/WJZaXyXv+54j0fSqdzDs6DpHUig71uc8S0OwwUfkBWCkJsOgyuycyB7ldea5n1MqdxAz884aq2+oXOrPZPiWB4eEkzzMDMOtlLQLjXVDTJLfljT3v+qK42C9agOTAgv8gF+vCH/U5enyzaqlnpHrzEzOD81ppJoqSuTLpP8cF412bv07a2OKWRsiNx2/ieD+gNOikIgvKnly8mjCqsrOAu7KVCh/Ae3naAzl5oSgYv3/CE/AQ/2HZUw3jsKBG5Xm5lZbl5rAm+tAhXex5zoot3giRBLl5v+RNPDxYZdPB0+3eQdpUUf3v1Ethq7d4YdXNasiBYnPeWzhONkYuGV2yDe1EoCTQ1z57WGsJwGmaZnvY8YDzwOMHvQ1fCsUVbY4LP+5bVvd6/f1fu4iz7xyQgE2PGAHcADk1pogz7x9M+QGnfza03ps66wQbNs/e69J5ijW5nxUW/TswYZMHD5nVc/GH097EJnpeUpWWuXIF9vyKvqS9CJU7Y1vqbiKHvRyj3cB261kSBQOIwpD3+8X2/eMr+a1I2ojSlMfgGMKXOjOZy7lL1ugdUjL/97vHK8R+AhZbuYc3IZU+Ktf1hz4pj4kFtXrV967Hm4SArb82ojxkz8fR7dTKJTD9/0dK2stFET83Kiw3PoJUyiVh6gSY/X15o08nteW1BcZmZeXklt2N6Ja25oNrOob6pNbalNb2oxt2xujW56uh7SWF1jbqEaQ02Jev8sJSr6SWrku5TUmHePEuFJYsw74Ngi3k+hvbtsTZgjWBHUqeouVi5zLtaX09+lQjk7moKeonyjgMbH226hKUSczTmn1Bu1vwY3fYYuql2K95sjI6ULrW2VvSl++ur2FfrOjrcIVjS8W2CaJ85cyjaVWIWMrD398Wyekj3YVVXXkxRgqGxfoFsuOSrbR7BML3znzRYUYG2q6VipO3PR9hCJLdbfwiU+qOUiMOUF/rxpndfr7zz2/IMEmjyOhTVVkl2rnTatd++frqssdH264RVZlW6bEF5N9CJ6Bss9DaVXy53saGwQbauX7Wivkz5Ob7h5srPinNmtmXvWOhNR2hP3rGfGOyx1libGdRY6LSFp6JWJhXdiUGyg2436kOpUZXNDe2MbguZ1LwyhLiYhLIuWoGgnbKFvdN5f8XVj9H52BChEx1AO3/GSBPwGxxIdcbIztJBS/v/EbKKjXu443eAEvVa+nV517njHzcbj9DrphQ/WLlqonLLQ8Pi0K1rCF4mFjGoJXITVbGsdbZtem05jD1MNc4vrnkgrnNO44u3sDeJuMx7p6W74DNpCVvYELTuNoGZlGWduqaZhbn3tqrU1iPEqJxISu0hd5YTyLpLAf5/V8GpQXKioe+Wyp4/2FSM9Q0t7K21PYln673QqAR8UQni21AVcd0wtjBAHLSUVc21jPUdtBU+nUio5KotMuKRrryFYJZFDKKPGRFdHuHupeBiZWdrpXqMtaANvF2TtC3oCd65C2J3w7uS4Iv/DASiKgg+2yPnWWrdFGDMZMFvQxETMfxQQdD91jfnv7lPA0KF67sSg0RPNx0YD8G2wli/frsw7Catv7at6UcHijBXj4QhYLPQqONCwUfPiAKZAYhF9IDuHPlDuUHS7Pzunra/Cm8HfN97D1T+W4hgQEDflnxgEYq1IqExQb6+PkUdsdHxqFDk9FQmkIHXLYzfbZyZvkTynaQlmmlgiop5oYD5r0O8DyHDFme3FZV/kpzsRugRw+gRtYfsBc5ksdpScMti144kW9gaG5vZ7OcqT2zAwwHu7eSdsy7wX5+RW4ZG00XnXLCfBeuSNT3NSvRrdc9/Ed4DQFdVyTEiheOyr4JjBHG6ZFzOxq4bpYp8feZkWpXJ/aXm+0qU1Mlbxvn3Uns9PV9Am6hTA0Mm5/uplg81CXc35aOCkuE8NbDQXDTSmKIg4akYJGUtfMnEfSLdKMsxe7ag16zwXKeqmVySnFpoT6aJs6dsVb5ug7xT+xMw+PNj2O1oGDLn4UieIik6KzjveqU09jZllD9vnUBxWcRE5ETF10Z7BbJkvOrrC6V7inoqufb6BY08/IBteX49MDz5v6UkJkrLIjFXNdLO9Z7soCck3Q5g80M4xpEsnCuM6RnkaqMeKK9tBtlPw7f+YghsVpL/TaRExq6HU50l779gn3Vr0FK5J/GxoeJoie30+Mslz/poY4aNWfeowRfY62pVfSMzkliOpqn25x926vdwNn976YxWuPY/bD9xX0TIQ/vOx+ZFRP1jNr3uEv+s5/QoH11l7LfeXOaKlIb+2E9OItqcMKh1cZlw1fd4Wkm9o9qsrCZmK6Jy2rZr+OfuAxf1q5zshOQE1UYuqqR9zoOq/9Dr7Hy1IAcZKil1g08N8y3s5CLOEdZmL7zPEURQo4JsJen18oaWfcxLZkCaFlnjur3ml8R28Wj9B9hyPJhPO69JC8QHsn4LY4wefMMLT8zvP2MBesozyaysxhbadohynGL6WFTG+92Pb6feRnvFPxSv+wXLGcclfkh5lXKYqRW8lp68z5QqbaXz8a3Xl2NdFwdGJ76rj3xe0n03E3J3mKY86mt3QDZJ3vrCQGrrqu3zY3/7VA0bzACNfHyNDP4n6eNf7XU/PQPbqVVkZNVW58xpXz8lcUwPpznkn30ATvUyfy+feXrJG2RHJFtJqoj3DElKqVy8Bxz6Plqx1ECoxiuxrp9METGa6mnLWFFRcbDB+GUj7ozlNbjAGQxEZvxSE951YhaKSa8gxm/ZRcQDLEFRKDWV1QdZ7Q7yrqQneCdE7ZYx3NDXDOxvDwWneWE+xUF6xUE9g66CLRUbNa57DmwyJFO1fdgTtPVOOR66G+9HGx4kgvCizV8AR//8Pn0RhDg1ZD9UO2QxxHDnzv2vcUWYi6bjPxIM3uzU2NbU1oBLTqkZQg92NOy53SLd6B24mpCvwEkLkI74jPn9c/myoT9VCckG0nCMu7qSc1KAkq++PFKi52VIc9kMJMBvk/NU2z627MPmw72jvvy5/N8gb8xvJF56Uw+VH7+qbt4rCayiA6TOBdkF3uyhQEnz9S5Gu62SNxpzGuNi8BqQyszr7dkKifBav9WANtAq1on/LDbAOt7r9P7D0ROr/XlzgibSK7PXszUBfTRMkJSOiUc8gMk06ccGWfGTn6kmHsKykoNBMWmJAUSjW1QOr7nhN43aHvqO9jemxdhD9fMRaWZBfxyY2MIVGDswrCouvqElRXXm4O4GK97rsoSAl7UDwMdV1JBga2ztA9vqNdZJP7561OYRpKGvZTmoIm7mou5eRY+PLyO7qpq6aQlNaNspumUGh1Kxg08Ur7gbVeH1VdcL1WjddviYFW93ruuY6ikrWmto6ltrAb6lpFR2Unh1MKa8ITcyuQ7I0V1bWZoAfzHnFkTpE1UHJUM7L2dNY3+lGpYMbPGjrJHQW/YkwHI4ur835+mEdld4u8gCr4fkBjPDkh1pCvMFeCotLs1Qy+226pKjn24lUOg+KlxZjYHX1+TUKeellRQATRk0xDG5Er1gb9mVr37qKlJV6V1OVB8+g0bkooqnybdB7XjXYWmUGgwMOUO1VyingyvEbQModoD7XT5BWWCisnii3SR2uFx9cTSCuRQOuIU2kmdwkLeRWSetBgQXuxGpOimlVLwJF8Y17UBl0p1non2nuqJ/Wq9mVUfSLqkPcFVKe53eHRKu6f8hVcA8qje40d4mX46y7eta7BzFwp6UD8TJlZSwrOEtONUmraBE5+wfiTvOvf6Y/iJHl1WxdFpBUKYqEgf0A3Gm+ES9LmUqqKudNDXKQdUA07FHEnSajf6Z0zDavZoazxAEYouWwJNrSDCDa9gDiThNDvKxUSFL7As0GQStXDOVzyUWIl2kCB0nG1MO0wSIABnYKuNEkemCPZ7G8mi1rAY5lYm0PBXeaZMvrjWVP5VeBlQy8tgGgqpfacIJ9V4L8f3KeiS+5K/ajSLaLlCYfjmjsjiq3qtYyAaqrWqXTwNBP7K3ccAOCO/+m96iI1pZc+USQs3etLtfmHLIDD/WmG6xYgLvyRwtQSjGKoqu3soz0SOndUxRKtxD1QsApXdA7qVjIgaGMgbvpRlZEfVoyYRRc0ekoaB+PFM+IDBEkUMxP7ES9DfYx3bi8zUZXgVzMxgI7KLuBWou2NDvzr7bmmpgHCEbzbv02EhSeb/bNSIsQZXJCYoPqydWMFIlMZwBLgnbP6Dw3XMFMDgAV/Rt5aI1DsQscJup1rhmwoctZGwAq+rdi4/kclLX7FxUk/OjM1Ucy6a+yD8QSvUcpqM/1bdorWNwAQEUwINuV4wqPZmYGqOjfxhyHm+hW+gAet+kRIFaeV/y1GD+UfmcSngKAxy63FACvH5NPf+L+rDGLTAkApkIBFDA6bMIGMHXDFfGvBiva1UN9P2ncTCu/bDfnC4pCT0ZrYN5IAvpLPu0NYrFDjnRpUUK04h1pcXRLEqXQIVNeyqpnHd2rU4B2eMIFamhEDPThVQxfWkWWDEpNUD99H3ntpLBazWxkwK/9g+Xbge4uK7Yr627p0KOmR1Jk9aYiIWp13Wl1Nku4GBjesLO3ZryEt7cPqzek8+ls/azaJPl+TXV779hIknLbc7HNEGrTbMprNVWcNK0uqDvTr4GQ0ObetLk1kpJ2jEPzR2zH2US9K813WLab0jIrr6xm4bw+G7B5JCi/4esblQ1LOhgx2qbZ7ICPbIJ294V1k9jABFfqLuk6D9eMbBm11MuY9jRzD5U1rO60Zovcstn3aT4NR6j0qWjrCNVP8oDnXVOU1TrUZi9s8LIEr6IVCxlNmVns0pOHpxWqwlqg6jrPtHxXUz5xwbOPqMUSa6WAPidgYAO34YLg2sJqpI27SbPHbnMPuNvoCoYx5q1BXktzvQWybhEqypTGUQjiyI1D9VUZVEGVyqtfUDFICi9ELtydSnEmEW5cw5N6GA/F8mV3UfXhjIjn4lzzqcQuxUZi2jLVNT3SzdaVoeLsoNihhwhYQguKIMIJKjB06cYuSyiCCCeowNDQtWFqk6luS9SWOiyobTG78hIGOjuEGWf+9R3YVGGY5Jpqak/MZjoi1Iao/bQjB5apfE7xDOYqfH22UxgmwSukdrNd4CDADzIIsIaBAMwCAXUMLASYggANacwA9gAvfRFCHPqicAi2o5vsDNAXQ0ycjgVpfroczIxQQ+IrhD9P7jwEwpElTebjwtFCkiER4QfWdoMrKf2qAtFvwsAD3rxQvAB4/oLhuZFigsQFSSASHD1KRpXtLgiRM2Dh8hfAk9/oG1Ktci5SlOS0F8WMdZZtswP5UnAuOshpKc58obuujIwnhcSf+7xEnlzh3ZDRw/d+jh5tajQYMKXhbL8+6azgxtKLmxoAAA==", "headers": [ [ "content-type", "font/woff2" ] ], "ok": true, "status": 200, "status_text": "" }, "https://localhost:6006/font-roboto/RxZJdnzeo3R5zSexge8UUZBw1xU1rKptJj_0jans920.woff2": { "data": "d09GMgABAAAAACokAA4AAAAAUkQAACnNAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGmQbmXocg0oGYACGTBEMCu1A1wwLg14AATYCJAOHNgQgBYMAByAbO0QF3Bhn2DiAgX12b1EEGwcBhTGLomxQFmT/lwnmGE77wayn0NBAJAPXITeLlQAVKYYKjM1mpr7CgS0HNgpkY1bqRLvLsXy3dA8XPXqvM/yN+w2v2FOlAb85QmOf5P7Az633/wJaSkUwMImTqgk4GDAic6S4MSrGqFakDCocigoYRBqEHnCIYBIGGExRT1Qeqv3690x3z90AwCasSP6ngswqFUVYHrB8VBQAKcYder52r1wzByMHJRZ//0+nNV9g+H/GsveOK0AqSpwZGZI47CReYMFvJOfQ2hTNUVES1lvdXXeyFKh29/XX4ACRY/9vTgMuqbMdO2B5UFAD4VG4vRkzpRE/HAS4Jss5uTZKgIn5b///mp923r+ZD/x22f0pcYRbsj0ne84XpsZN7mQyee9lwgszWcwvZJLFD4WkECjkFyHriuAA87NMWVUCV9VTC6S6tsdX+ApZK4nU+gqn6ipcefja71ffCTv/vpktBbH4Q8OmUzIhiS6SSKLxDYn4I3iKlCraxSKRmLCxMhnQLaUZLPeL70z9PLvdGe4aJpgghNJhdNDfIYfbP4Zrr4IRvQYW1AHHsRm/MoBA8QMAALCA4nacDoQBD4hYsRCpUiHSpUMwMSGyZUPkyoe4rB6qxyYEAgXAC0AAAgCBiIUA4KZAB3a3PfY7jNipySXnETvz4unnEjtv7bILiMECgG+hS5x7+iUX4AR8gRVUUNx1liijpQ3akVwcN9akGiFf5sfC53+NGKbR5WqKVWK9kAti+AS1eOOOyCvDaIwf8afMcFGbPJk65ZRuuRKVi5n34MXC5+eY8DF3ego/YaXaA/kGJCdNqR9aLDwevIQdJ0mKNBnyFChToUqNBoJTtOk4zZgJM5as2bDlwIkLV+48lSpzznk9evW57Y677uk3YNCQYfc98NAjk55Y9MySZa+9sWLVmnUbNiE0xggsAhGnnKBtjyf2QAgPTgoEFh8Jtbt2fBCTGwppEGEglZ5H9iEjajJmypb9zQ7WcvY+F29zpybfh8pFRalEVy+iPrfdcde9rn89b9acef9Z6HrqQ4ueWbLsjRWr1qx3vfW+d9770LXhbZuHCFeD868+CuUUv9RhOBpeRLDSKRtpW+4JClYxVTYdM1P8F5yw4yEH/bl6XJhQCcKlImFqL9vlsPiIpJtgDl7nnTDswuvDCv+DO1fDk/MxTTZl2ozHg0XCE4hnXuaoUGRvMwJjpuxnZEv+3pQmUBk753x56pZFeGbJ8s2IMhXxINvIiBgzZS/fU4ueWbJ8N5ZJIjmllGuC4g0HW6/PDdHeZGVFrFqzPhRHACMh5SpUzmRow4YNGzamMFQ4soqMGDNtbEWyl05HornGI/8uT9miZ5Ysd70RacWqNeumCoS86xhHXc3Jp1y9CINvDOn62prjoEx81Jz3IVIDWX7co1E3yT++FWYmuuNgIacdlV09TGcJJhPrX4ppsGwDXfCvkmLgAFmk6LCYxAftHyxYL1O0P9FCx9PR3lipv92N96FztJm7THzvXYCZF1CGmPHV7zjxlE+yUMyjYlkzeXrN1+XDXy7mZ4SaH3nFQ7Ww4uDmIe7T/PFaC3qFyJcS82v/iTr6GwvR3ze+XD27dfVbnYZQeRFxzohzSVz399nlr3kVWPXOwUJ5dHBrvN8bC/o9RRmDNlxKMCFjXvucAiWWoH0uC9Id0GRlZgrJ2SxOo/NX1BHQbaQBUf96uxZTd36ybZDQD2eu0GhiDfZmfDlc0VzFOlV8wKy9uuc9zoT+etNtsqFheWuKpVn11wnNyFUttlZgbJzVYnwrmDBpqX3O62J0xc3aVeaABaXbnkaGt5Tna0TncyyvCyiVfDTfNg2Tskx1qffMM0NtN69smvOiem3QnIGRMuk1rbqfMN9WYlYX54kVN9Zr843PpJvb6ivMNl+RmEB/BdWcgMMDITBSlFAjGMdJwzpJBRcNOoQYINvHmOh+Zu4HWLNzkAM9wsX9KDcejslxl1SqgpTK+nJ6LJP32jr7AVDWFUr1sbAX9oI4EVeZok7QfSSpICmKkKY4cpSbPOWhQPdQpggVKkKD8tGk3AhUzCkqSosK0Ka8dOguBhTPkHIg8915deAkWMcGli0ohh3l4ECFuVAublSIO+XiQfnlCI7BobVXOYT4INHaqwJUXCUV1+OO6HUPqn/XBA0YhnPfJMSUx7g9IXde/1qA99R9t0XLOL0eivXGOox6LVwgCIKWCEHQPYSoiOMCDwv1DyhKju6lTFGqFKXO+RXrwA1csBuEYRfwgABq5RhDmLJAVAIMYC0Me1CEI+XlzHGKeeAEnBafdFBUHkXlD0UUK7FHQxAEERAEEUvELYg9ALxA1QMUuICHcCSXIboBRsXRb32AMzlHPf3L87pFpik149XgSKLrYiABJiQbu7XX0EZ3qpa5pRm10HWgNpbmvXY2psKEBVBRiYumxxD0yfF+4RFhcOKf8uTBydDgQG9QA2iNNAqnhUWBFCuRLAAGylcAEIhW6rsQekPBdeKnxE2kSncIhFMQTwLtqlUHw4S5y9CmoHva/VBPrVxRoSAQJgJKgoic9kRheIYBERIBcwcACx1JTRqgQScM5u6itHBr0qhBsxat2rTrgDEjYrt2VZyzqFi6XHNdtxtQ2CIOaKHU/e2ri+Ee7MoA2fSUxbwhIBp/6EsBkrpI3jbygQfuiQiOrDHBHxAwqwyQgDwGALBLnUWCBAxYjpb9+Roy/wk3QM6CbfsB0CABSxQAnySXXv93+42ZtuaTv23HZhtjsRhL87XmG8w3mW8+33q+NN/tvsvue+KI0PgLi4TLN3UaMG7Gus+UbHrWnK8332j4spfb2B4r9owh3GMQ/P1r9sv3jkH4J/6/8X/35zeIF4eOyoczmc/Yz+9yx8tGBoAK8xg3HB/3Xk/VY2LM+/9p0k2ZNuOxJxgy/GvWnHn/WcCUORZ+dZZsb73z3gcbcmziBQDI4H0igCRkjW8HQ0ISbLrkpsva+aYOt3TqF2HAqN40JtW4af1pRo/H5k34z4I0Ty2b8twLDC+t+jetYVr3ydP0WaYvtr323Q9ZfvrtbfojJ/2tNjOyY0BujRxSHRqQl9GXAgoy+mFAYUY/DiiqJdZsXwtAMZBYr30DAKVAYqNqk4BzWWLzgAtZYuuAylpiWbUUUJUldguoyRKXBdRmiScCLuYjazwIlyBQnNDxd6jn4zYgH2sRfLeGyBuBeX8dvQgt3Aq6mTwCBwO5ip6gBxjoGBZbM34NE52ChI4XgbqSgsMohHqFmIhSL8HR1+qELePMETQQxH8ATAWSCRJ80KkVSFyshn4rVqc4xO4K9/sBbZUfGmjTrPCOlAJr8aYOsysMEbR4GDZjo5nqxAmguf2d+5ll4+q6dZTUZq1hMoksN66UXJTBBGyt+DrbhMcLq9Bk+7CpxVTXjuuYlC46w3z6kfH9bpWmwC9ElhFLbSMmAlXH7IyhWaYUCy19n4kkfj+MNwH1CXMxzHzrLGoTEVEJIpwww/SO24xCz4blyGgkPPISNVwJHMS8s9eaLgV7MO1MMFVxzgWKDObEffRpbR65hHZghKBm46hPHQIbxBUaIedU2SrMOQQSCxSYE85BZDigzEa1QKgIKEMqmHOWKIr7/orgvAATAUj2mnDy/ahrDOXUW7VsRjmHFUELlLgbeqsOaSaMtOVts1bo7cfGG5ZmMnzyvz7a9D8A49yfhKY0fT2zRlfuOMrMoba1d2Hf2SfChT0yvB6uDam/YVYHeti3rIR00JWgXBrYWqccXULUgWBDLc56ozkbZOKZwbkbwr43STuwCuPa2d9GGGB7Fc7RbV2Y1ryEAPZ+fo+bAVMVWitQuWZzibW7iEwCHXQ7lilW/mPjcU90+t1SKzITRy0tdDnD32eBJegGqTt8gwv7C7U0By0yLHifOEbuQI/HKbSqiN2A7cIrLxEuI4jzhl62d8SsW0WgmoflnBB4zekZkQIL7kLPmy8SnYVExDCJn/vsvX46iwidi74aH8QGlQbnqrSnHdb+O9sslbarcTLIeXWoS3vjlXrP/Atapqv5ib+Vp+qjuFwuDUd/fyHu9CVTIq+qFWJV1Ca09xxlk3lq/Sq37HDeHFvIRQz0Bit3uYQ2MH0kRGaKWNr6gj0uyh0nEF3uif0c7nh4lCgrKdH9hQwYPB6dSzZHuxICRr/dIPICn1SQxKhh5hC5lEbayfHCibqcyA3ZtYkTVgm64xjTZc9SxrTlX5q0if+LMeMTHtRHRueOGGKjMO15oLHaiPWlWmRl/IO10evXz7Uh09LcSPILgN4V8uqJuvCbsexNLzoP3QgU4zJftrAt4TZuhNhSaFJDq30QNy+xijFVzLR5y1ZKXp6namdX7u3I6Z6K8vco9tBP1UZPnALuwG2CMSEhWTElyCqRQIzcxyntYtKFHuO26n2pAIJzuhqKmVWMk0lxlhMvhrOMcQYnpoV7MSCclFSNxvg5F/MSasrgQr4o9P/8ce7LjPQpQTUxFy4xpt29wJlYCQSLskVnUbXUlJD+kq+gImoiUOysTerfknkgSGBDUDKkls/jNmRXBzLzuE4Pph76s3u6BjIpbNN2/uUtpLEO4NfUee3hd2ICHNJIbu7KwOJmXM0OKEjTZcEy+gJZO1A8QqI9juOkuT8zAuZZP3b47Ea8GRr/Yqom6GrAfgurEO3uc8eXUoGKktCRgBAsVnVIoJf9NmMuK5NrsY9ALjf2gU9eNkQ3qYUTAKnCxlt0ZamUlmPRKIzah/3WyZgfmmfwywWHYariaOMQdaAnLtycQZ5AEUKtcuPbwWIRiIXc0guTOqWrEHyCxSaVinmQAkGenh5YyHy4OjCmRFbrOukQ0opaxEEb9LTnu4pMNA5oajIR6FNAvzNYBLI5H1jCNkosMq20DStOahu6Tl25xsb5RqciLQK1kSpeRs15JKSgo+2DBNpTgyY1mugTZwLBQyFZ2LYikcEqfUfXzD5bqRfbmJc7cYYTstDGs2DiLeG4oBCqhtfubuK8OpzZGwftSZqHgjNcMqO0bGJkQTvYWwXWjfQkKZ/6Gt0O9Ma9RrPA7FkHm4ogchaY4T0BfhuQpl0SlqxIwD6dfNlAQepRTVGp5sm+1YGJbv55UKec+VpxVrICAWlg8rr/IVfIahPZWyD4cFFDlIMc+CTZ15JKxmYxJL5x33PQTi4/jNDXsEHs6OL1DQlR6YioBK1LayaotNggHdb6wZHpOYgdxN2h7EuKiQ2Cu82lamU02Q63JmZzS29vUgECR0IeX+G5RNlpnEnO7QNnchXLXsAOlQQHHeTBg7EsUtguvOiQEKbkgjf0n6GjHfqwIC4SWja8GiY+QtaysAIH+Xtc/S34rotjyJiIgZU5ikRm+iLHHqKCu1qwRWEv3fudKN0MuGkIb7vVjGeHHxCp9OWJ6ErT2plncvoXMmdytfNnJjFy1gw9xNMkd0saBFfI4o1358aFbq/Y7HG+0KmQY85AZYiQxA0RN7R7GoFWI0woIEO6jdfg5/lv1W9L8MdgGrzibDAjUzPbmi3IYPDcUi4SpawuXitn7HSA2yOtc0ts4mgYWjYsiSiVXBuGBQjXZXxxpS2Jq6yBdvXRk6hLpa/aV6B4YBjv08cEdkBW/TjBgnZNauhzxqZs3IZtaqmJYIwCdm2CuAwGScMv6WjknojNJSYEDVznSdIe4CUSKBCkndAmwd2jkRJS/wOiqKUozXfWEQvrk2GMFeh/k3cHmd+e5nwHpxKCSAEShab0a9gp/nOaf2S/o/xG9ll8TwiBm+JxaYSCbbEJObCxpFX4W0prjI5tAu+5849d5//w4G4tCb/Zm21f/T+Nbt3FsPz5tFFX9NlIbH+MUDEgQNPWNDZJoT5NdbIxox4IqtKPpOXydp7MulwVpi68NL3QjJdbr8VparAvCppfbCLx6mT+zMWP3/nLtb88S5po6i/tPz5fgrJign1I+C8ng+NvE7413p9rF168tNQhevfryFZSZJG3V0igtyMl6O9ysaVvgGqGS8vU4x6h4YtDo7tnP42xk5KyqVHRYYBXqWC0NOfkNTdnG6U3N+VkdtbnteAMzOxO65jaGRsbmNknmTiQDx9VYHY0ZGa1N+ST0xqbRVsbs1uw+hYOOkQjG1NTQ3NbbR0zW5Pf7ATySWpUAhnss/zDmi+ftaPolRu2TY+xLj7oy3F1rQgy9SGLmmrRS//lS2yb2xGz9qqistCVV0fiKdba0at0F5p/aiJS2moXkBRu+nbeQdPeSo9s6wkCN9L3MS9ieyHZcj2+9pNhhq58fh6l8yaHGNjLty5eiJdnZuh+NoqrBqvTz2Orv9swifLM8rOdS0p795yfyM/+IJ+ZrP3pVDKTYxpEhh8pOKo1y1L5Ha/zu0tFqbapOo5zFQVfP9S1p9gfZN4cTnie0LXRlfQ8qXwDaslp5pouMkwwuPsMOiE4aBZsOflG+ED4727GZgRNYxN9XVNjqrEZDCT0H52X7Qe9I/6E9zqfNz6qoQo7hPeaXz69V0QVtoQnI+7F0SO60X6TR2fG42gRPegI/N26X+yk+swhIP7btCIQRHWqtgyiJvtGpxYmsjNiZl/SSme/zt4Ji/uYe943oR5EfcllEZB2JjQoNCrSJzHSlR0ZfWs2gLH4Y3HYJ6Hd5x+6VMLVuBHe9WdPeF70sb1S6GFnUulRZzPjmYVAUOK4MXxDn61Pw5dKkhZ+SWJaEr0OQcdji2X+J/qSrn6ayTNrXK+e/51eTOBfc/d+4AuOj/SLTLiYk5FdGavnesQG1Hbfun/wIcp+umecGndz8Pmu/55jhWYX+XVxtsnULo8PN60YzgdNTK5k3ltIvMyZ3AAkf+lj/tJ/txSbX4a/APGYQkhYo4f8GZW4W9QBzMuFp9hX/bT43ghFd/nQxpC+T08fTX56yqdsHZrCmE1KDwtJSF6Kiz+44xkW1xdC9fcLpfWF0kDxtXdsSt3AG95nRWffzaXmLyFkYf0c3xov9MD9o/Po6sQzfuNk2yPGnpfTh58ktDOyE5tANdr8BVvFmjaoYk1lgw6b1+OBR5THfQ94Fx/8+pMaQh1UQ6ifwL0tQ7dm6M75BLKHm4+LQ5CXLRthbUwO33/58Fbd+Zq4GF0TpJCtdsrY6DQxgiXDv0ihT/A8P5cl7t3QuqBkyjQ1KTn3SXBi15Uk3FBBuF2KtIOuspLQaEZA2iKuQyBSJ5M4IjfcFcW5wfM5x+3gjWm7m5JfjmeNTykE/wmZd3no/oT7OI/gcnfKl+2fAYtdlacfU3kzjfOs1Tw9Dtic3BCSj8idAS1FWxWaDccRf9abIzQWp+/BxieuUAY4Fvs7MjriF3Ix8B/aoRRWwiT+2bfdReP76Bm04DfrWNneH9EMik9onGfaNlh0Le5++w/2ZydnfaE8OpE1Vawp0HL9y3Hc3o87gtUlOQUNrM/I29SN5u915eUZwlWyP5KdgzJtdaceGU/Xayq0jHL7rYg1jM/+QN5ab07+HAGdqByHgdsPegDH6nrUXeIA2teCTYJ/A45V8+hSlwlYwl2LgL3B127ta6hQQSejTE5FibMPfNr/6oc0nqOV9RXdiNwYw3YNWTseODkgBdYpsPNZbubQi/z2yPXYgYs7lzpH5DLsHv9+jP02v/J9dXKHGkUNC4hh0kGVWt851nI32nLbW34r7WccHf7nJBTdL39QUjEWHBhliem7iam4kUWM/VI0VWzF54bYrLdoykuh+WAdCb8fK+PiuvyukOrm4/sF1q+vzZfqCbVf7xJpP3caZmzmzhkItfsJtZYTYXYHu3UTaa7vAeS93ec+XGNz99/tivYf+A04luzXg78fz4tu/j75QCEzPykmujAvEVEH65Jr02lyNKefQ3Wlql8fGbLOE13d/MS/sdu3fjfXnfSd/UYPV1NLqlVBTPHgBw12eq/mS/JGElUMPfh2af/CphSmRNIYyekID2g8pnsxAz2DA4ljCfdZB9+sVmxGZE4l7UQVpGQkZAV7WpVSbP0mUzwbI2/umf9Uy0ktmcz+nVCXeYHBoIApdmVs5dfK0KN0MJ1jTb6V4v/+/3HuzUc7UyWlF4qOqYxBmdbeY2f3SIyyvkk0sHaD1eUgfqzRr9041pagnaRgtyT7OrL5i/+YoaCf4SxIlV5R5Dt26/HgsqTGbs3dJ4aWex4fg/DfFl2iB9MrRP+IHiyt2Aep97kfaNXLixA3Hh26BIdHZxoA79hwtwI4nlQAYsD6fAIv+xngqaASOJ5U3m0CvGMTiNs1dj2akplvk56fBM2U/vL+cpAoe/yAT243YP7wGJyNaa6b7M3ugJ5P5WQ7dz8v22AbItuZVvnAMfHeq3to+9sSKQdBtNMoyeD/R+mZme4Ohm42QDoitPNSevRecBYPdQnwwH4mKP7a2KvjnFt4VvzV6NrT2feIeRej4luQNtDocKUHY8xXMX60zvv+tDdcxzH7vnNIrQxuvcTdXMW4RdPdopNboUOSldQOFsf+X5cbbg+my7ABD0s8EaHpN++9V9z60pDUQyvXZ0zppZZHJ/eBk/D6wSNbB68k/HmVn7v8eR/qM8ydUV1FbwpipiUQvRYo3KSLfnG5AgnTQhyxZxLgCbOhu8G3e3y4m0gWxN2lq3Ze91rqXmKC9bGdjZMjvcEp3KHP9s1xfntFf+1DsIwqjmDUx+amJRsHUa/e+yz75Vsdoy+61DBxST+uNIZxF/YMj0Rn33TB5gyz+yK93DxKyKk4NuCBLZLZBDYiqmG4XvkGaaiTjRiGRrC3nlDZWN95kTQz4KQQi6bXidRmn02HhHsPXftVUw8Zq2PFQ3ei90GytP9z2iNCwEeeYYw9tWygNcxf7xxFBsbZA4HOnkG2QU4iZFhlT2Dv3SvRihZgE2D3CgGfQC8atsGlPWTfDXTy8S8lM1A2ASxOXEz88yar7JnAPu63nJfifq1kn1sVUvizxdmUfWc7q7+3Pq8/lp57B0io0K83MgPXKFSEDbjFl1xhlNSesZcn8F9wV1LuxpQT417qJp6jpvWBxfE/69JjN4KT+CgLgFtk7wRHtA69k9v61ph2h1pkELdhQCugMnrhH2W378pNmskrbMJbXIxjXrXKAVg8rkshfVe2kbzh2JT34fbNoY/9F9iGgW4OVn7GOhru2gd0rjhYxDqWfOkeyZj2PNvkvYG1p7v5evkagdicLkd/d7+bDv60TMsdmz3moqr+17qvcYDCAIWSOMrqnhy+y+6bauvSTuJiE1bh54v8tvhfe6mEf/fWE3aApGjZ9n5TiEqYWF97szYhxCBsdr5efn0LACd9+U1E7I/x/ndm/gy//TFjEV7YHj1bxoitPPcR2FT9cueJm5uemMURt70jqnhIHiQOhV88Ni8+YlkJXoFePnjPuVeD1wZfz6LXu5evKsrntqvjfi68andpd30zh/vZrg52fE2Av9cEYotXNTB/ZtZv2N+wfz+N+XNVQz73hlLXSu/Eq6FrQ69Gb19b6VYC82Eh1t3nBSYJ6hey9CROkMwC7QbbbiyWmTAIRel6hyVJthF20FL+GGGgiABNXYNsoqtHNtFQJ5vo6ZJNwKLDmR6Is1zBZI48KhZ/P/H+5uGHB5f2zz08dPPwq4mXNeI9/2GqVvCeNKrr2i51ILOS2mHH4K9mnrbrgfv7HtgEyYS74nsuj1dxfHnw89259ac93zyDgjycA1KDOL+ojwNpJqQ26eGDmsSU9LxCZpZv1ehEaH1hSV5hflFl1MBQJbWoNL+o9Byl9sGgd1VOXn6RRlp8TNjkXerSXVro5MfQh3eoz+9SQx/CEWFLnBef3f33FfI58uflZXdkVc6r5KhU/HC4LwiZfOKr4hOr26tgNDje0+rE9O3t4Bt9v31oYfoLhFfRs2LzPCzNM1z61G4r3Q1zuxDW0+xMVCRl+rUKPVz7zPPyEZtSlBwTn+NhY0d3SAscjHSuUAqzEjEVD5FMsPaxL5O7pvIiSo5mnekFuDkHJT1SNInkRyJF65EmFD78Ow0Gr+0qOi8T78x2n+m8N1tb115fXu3lauPkFpAZTYsOzHB1drbyaWA0lu8XbK27KFBXdciu8pBAI1Go5fwha4GmB33OJmMpxmN9zmV9zuSJoUGj8dvO4DkgQDKzTohOiwsOb4rpCFBOpuoaKSm08wV1pmRlXyhiaHnvs/JMlbI92pxNMQX7U4pOoHU4egIb30YCh4WrNVsLPJzAEY9FF+vzNvsutDETaXQd4n7l8Do86ZxA1eAlM10985qMQgM3bTVDQ4Ib5INKA+/V2qsgShuhXKhZOl8ZGlZZuVRdQ8lU1TdUVdE3pZBNg4zIID2c7jjuyFhg+I/7xy4IH/tlPWINXZV+ifuxkQEkGTsVgq6uWh+1uSKzsCr5bEiwv7dDbuRZEBgJs2Z4H7XTUSCeONrnWx+fVnglJpjOVCqTKqCwEgszW5PO9J3QV9E6PSbjnwFuIKwGu0XkhkFUn5CA5DmlUpoJMUJswgu8vSulNNZMbWgLcIvA4LRa4/w9P8f1Z+0w4FiQf59gbM40MSecMjcm6poagzbaUC5WEtxGq8Jn6RnKycgaHrHEHsoBpLKXMCFfEh4tDBxU70v3htT6BxuNLt4eqqm9O1zXifVxC7OycAkBLytvtzBLC7fQAKCVIfEqRUYWAcHOXhQPbzdnp2Df1e/efpwemno10dNQecXVzZzMFSWyraZhaMKISRWvjAnQIiGN33b7lu0RFVXWy1GmwPljo/uF75+3VgyMFcsEs5BTumOytJzw4Do1jEgggs2RjdXr2V2fbuJS3lK0OTQUSJorJwl3Xhst8HMoaCrZqh4ArVMDptOGyYd8CQ52mRutevc4Gv85c7D0mLlq8Lbo96oojSX65avg5sS44Ef21kk24Fhbi2vbiUWpz3PTYxGI27KeX9mcuj3f16Ij5q0fuZsoeZJo21VqlWXattAzZtV6wklh6GHSMTVvZ3uSooFLR6ZVppVT4oS5tauXVQ9mGyy8RH7nXiKazdkyWeNXq2s32971k109Apxco5z0vgiV7PSMvghnpDHHkdlN9EP2Lc6c8zXMbIrmoFGDgfrMabWUHkIm4cHjkUCE7mGo62ahdG3dNyl7V9LIwTOhsaByfO9vzmKbxkT8SnFezqvExFdZ5ZFrkwmMkkgXhebE2IdM89C2M4nWl6VNhjYVWczrdPPQgjXkb6pukZTTVJ6U1xQekTXeAaQow6+zX7e79I1No4xN9EmzWqZNsXU3CYaR3KUETWNjGzamzLVRHA8bFhT7Tw9XEMtm2t35ALnkU3NqsnxLtfq0t4zXqma7V5yNZZpukk6XlOOz+oEUJfT9tdxQEf3iHJfY0sHRrNHXx/Fb2Ma03mh2iGlsAhuiZsC3UTi2ibOklBdpIbQXCXKXN8c3Crv9Mvg7PeEwcNtIYb9vIK/GGT7Xy51TcFttsGsGXE784Jd7+TODRbS96R4K85voRlYrd05RDc25QNpQ0aLGUOcRMeZ7bkdGx/YbvpPoF87WjN5YekbPQCPzbgwts1dHoM+eniUcc2NfRGQsqKh84BkuryqrGuTjFy6E3QEy7slxrQl0L+8EemtSnMC0vC5RTp54WkFOR89HRw9Uae/Ck4q9JFOCTrWJnTCSK+MITyr31LzkrHLCSR4EG8XizVwYaGHFXA54BswA91eIN3NOQ4tr53ICg2agXTrO3C4JLS1dzAA3/2lgaSeZ22Wh1fcX+yBE7YyC73dikrljPqb84eJNX/8l4EzHeMbE+AXSY3yOe0RHB/rGRCFucEp0u6DpUIbwoYwm2HW95UX9rtguhJbQ/1cOQu3KLj9cx5W2inAPCfGH9P0pcPwQB9Ke354yH1IH759/xH5TGAfFH/kf9j9/uY2zzjffL8UPdLbCchm/u208JBNICr4x6JplVXLYYt+xiWz5qAhfL2/9ue45ZqDncpXLT/vzmYz0uG4oObvzx+8NN+eHRuJI8oBbZa8+R1MFHn98IlP+bIbNpDKnhJbvVeKqEqcWh9wmuIa+YTTXfRvYon2xpqWopLaltqKmpqO46GJ7bR9PCy0Kre1poUdgLgDPY5z+j4KHpud5z7rbdQGcMaE/7lIX+7bmwDtJuXzjnJ1w6SI5PTcjLuZKRV5qezri04u1jqIlauiR9EhkOHr0yIXiLA9eb0P9EBozP47eVMEsbW2sUnzyaf15ebOs7tG1Y8XJqiQDNSp0tNm0jdgkdZ+LgXNEaqRaulYK5VJsQV5dTEhKulakGjW4kpaaVkkTP6S65UKUp/wdbp1rdRhxkJT32gVrqroaLknM7MSYljpG7uUG5Nyp/54tvADh0sIYa582i6MGRrpEFWWiuab6KRJcy7vdejvud/wYOrmrQ3UPZzdAdj4bsl16trMHJwj9C8BBaPxKa5K4nayl8ATWSLdXfZuqajai9urlaXVLWl1S43gaFezUNHGc2viWGFVqfMapNI6ZqJrQkGIdrVlpSR2gMlMI5Rq69DmzV4hdMrcHAWfs9BAoTZU2Z769bOXxZc3VFkp4xWibBOFYwgTorrQA9CHSRO6XW+RWuU1ulzugk+IJJrd2XG6lfjva1JwnrQ15Fhg+vshoU78zxce0UticGgUkldh2f/wL0iv1vW3a8KS1TM8CWeMproOsp/4470mj6lkw1MdTho+p9Irw0VTODQiyMjyVlWFRVoYll3JHw5maAiAoawJL1qzs8owCRFg7UwQYHKuvA6APmyGAR8X+5eSiA+FGlKvISqHXVEyywqAtG9PLQDYOESOUrdi5bKecB7mT9W/92UnbzKds/CivQ1ggaPNaTYebto+Dm7It2LtszSNuSJ/mqPEUqaYzG67KzmDhcq440LVTrjHdCbAH3C3KLoZujDGxdgHfzSH/3ziKTf8HIG18azVlTW7R07J2d0c5mZEt3MkFd2eAu7W3sVJe7p0CX/6/fltthFVFKkqjtj7zaoWWRHyaxBAL0BcngJzxrUs1ANWoinudxTTyo7X3vEkF7WDJOkHMB/f2PmpRAYPiGEZh1PFXRQ6uOCwmCQHcLjO1QlaXT8roV1cmYLFRH/qIMoDdb6ZdyDqrc40JgDyupesAej3axsPANaHW0d+K3v6VKQO4dWcnBYyNfnCmBlndj15UYmvdLQVZXYXCAbDvSi53l78mgAvp6tvmI7ycB8vFRn4rC7Z0d8UzgaupqRsZLwDkzv5TIUDPRtu4pZzR/x9ttS/uo2IB5q++zRLVtCeAC/F3TemP0Fvzeym4EC8U3sW+Oa/B+37nEQDoFmu8ZrzdTlxV63fOfcsBAMDIT4LbAYC5ZvPd/8f+n1vebbmzALigAAAQwHHeYgTAdW6gdaFbBSKcajPz+Ekgi2VtdCuFUcG/XvOq0KvaX/LtBzg0FzbxQEo8IZXZxItGvw3ZH5eQQ0tmykBTWTCTZmJNLIkKSSU0YkCCXm33OCStrZMrQacrTnHJSMkVWjMprt2WUOdV1jUFdIKyYhLzf/dFofSrNUJPXZ0h23k0yS4yQ7itdzJmqjhwsrzqj+7MMqlnKY2qS+yyhGbcFLoA6XqJo95gFYoY6USEG+HNc6lmNUzcTbHsuFSqhFJgWYx5103ZxjzZymZTZ8QGj8RAxo2ShcMjb9pOU86KrQLkSLnRmOFGDjONFpx1CXp+s6dvOVx4h3IVL7nbxFUagep8f8S7NVocxKxEfnWDR6/hXkQ87T9Z9YNLZnCf9Dlmsfx8zbHCJMebeqYquSWXCc/YpjXvmnpUiazbSnKTQegpCAFh2s9hSjah52vufYbz9A+ryVFgrtCbZYzt0mfeGYLrgbJalzUNMqomgVWMVFks67y0EFM46+Y3I3DNNWVxTUwuiOvSaiYFqW2Ab7tDuU1RShGhKY6YnJTioazeKCeihEYwu6wmG9tUK49HpautZqJ1h+zsKPQcWAqIKVEnqsSSmJtqnhheK9M0WhgtmepO47uVyu7QWpqtDIeIjQmvctt4GOq3VGnMpi5Rs9OaD+OCoIJ9ijAlxEZ3q8K2cSvUZp3SmC0KHW3jbeojAD4qtIcFXFQPgB+g0B3g59viFAADqeUBeIDyWIQYj2NR/GIqMalKLI7FOYHJ8JDbG+VnZwxJhEixogQLFIRKghIFiqMigSxCBQ3lf2Jj4XzJMV2HhIZtGOJsxPx3x1+U6Iz5JTk2Ivg0hJqUYJ7IBqMJo7HA0wrlnUoclChnBYvwhxO5lcrUnXqV0epC08uiW50qEoH8CHRHjrfInPkG3P3JiRAlkIUK83VE+Guys6hlxhiJAQu2q5B9cEhhYPBIf8/JTwAA", "headers": [ [ "content-type", "font/woff2" ] ], "ok": true, "status": 200, "status_text": "" }, "https://localhost:6006/font-roboto/d-6IYplOFocCacKzxwXSOJBw1xU1rKptJj_0jans920.woff2": { "data": "d09GMgABAAAAACoMAA4AAAAAUsQAACm2AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGmQbmXocg0oGYACGTBEMCu5A1nULg14AATYCJAOHNgQgBYJ+ByAbIkSzoqzwsjiKkj2aj6JicZf9lwnmGDrzUL5ooaWgICnvqxcvLU1UUm052dq0PPEbkDL7t7A4c3dKponrEu8IjX2Sy0PoX9DLJNk9AHsAO6uC0MkqVZH48wM/t95fEVEDtBGpESMixmDAqNgYMLpGpmSIhFWEFSiIoIiFRIli3p2nHuksZyTDeXbXshPuAKlMlW53Zbg7HZue7/8N06wSlnxFE+rSAhYVkmR44D5FCo4yXQlcOX/hZsHaQuZYMcQ8fkufGldr+uACwqKNzkSGPbR7G1BVUZ3KOl0lGRYOQuDT2zTbfVpvBF5fojuuchvk6YE73cxV6dJS//W/1qu/X2vQGiTZDshHKx3JCpgmIwjIGl8FXKUCLIGkY12AuaMOqUzRXNWnLQmqS1HWqdIFnu/vG79/2raDcUAPMPAMtn38TkB/ouZjIAEmGGgThZmsWZkYwdIwtsYh6+N7ZqYra0NPaN1poDFKzhjB6Ep9/G4ZTnWidqQaNBB6+Y1RoPACsDkUTvsZQJjzgUiWDJEtGyJXLgQLC6JIEUSJMohOPVAu+QiBQAHTADNAgAKRDAGmosIAZt317VxBcvfkGAZI7h0THA6SB/jHRYIkDOBDaNj+e8ZEAjtwbBhGLXC2MFFLe6nWKwp1sS6WQ4VY39XdhkP/X4wChWLH4FC8KPFQDqMIiLjGjWJFabOIvvgn/jQ7N9ClKlWDRqlUq8XUxVp68cWGQ7/D+N36//YNN54bY0H9DUgUJtSPLQYOF25C9jvokMOOOE6FOg0EmrQR6dJnwJA1G3YcOXNB4obCkxdvvmrUqtfgksuuuOqa68ZNmDTlhpvue+ChRx6bteiVJa8t+2DFqjXrdnyE0M5bMIiE6TpAn6hZohBCyQ4q+IddgvVd259GlFOFNmHm+YZlbrMiWMMWJJCru+Uaj9zimRu8ySnLbXUJGnkTtMtp5Aqu4hquY1x71htzeI55LOCF9rJti3iFJbzGB6xgFWtY1zbasoktbGs7bfiYRnjlVP+hPoJCwSt7WIClnW8Rc4Vu7tDP12bBMR5M8483PCX8SrDD5C1uOcErZ0QkQ1pGyk5TrDylKDth8BBmTIBbLvMnBPCBG9uCt+WBq3CUc5cOYxpP8BQzexSGw49L58kUZJkbrABr2IJMeXnZ7NTgV8uoR4P2sg2LeIUlvK6OqM1GXCxzhxXBGrYgowwvsYhXWMLrdWPYEEahxosAu8OGlMtrXNyHhK8kWMUa1veMxZ95BFGHRjTRCLGDHexgBzsEexZimY2sYA1bh5RM5GSge4rzwqVs5y8Zi3iFJbzWPsS0glWsYV0g5P5oijmKkp9O3nw7kCfXGOc3/jcHxSZ3fc4WRHYgzYszl8Xt4s0nAnMbv+OWL1BmKuw9jcgRaflYdnZg5ZSinHQinwkpJtdyISq/Exs8UN0JBvTnxrwgTdysfiY754dWTK8Zted21jPU8/6ErTbDLJtDyepp3/I79jzdpwqjW9NkvFDxcrFn8ct7uyI/Nw20ef7NquSYG/mY2X3qX1lrwCxM5fcKo/9ELfnuZQg72j1T/muh/JezBlNxFtf0x58eYNG3oste6z3I1ae4pvIFyU8FzkQfejHes5fRm2qnDgIE807LfcaTOpsEUuLOw/wOZH8rylWi04VRGvkSdfjzXLcqGTZ0Ft8w4B8+d+iZ6+vzC6o0sWYSH/HEcH5jFetUsY0j935Npssg79F/4F6kHQmLa1Ms9Va9TLCHGVYlSVrgX3FCh77jG/+4Jd/AaEir86/WBqxJDUpC15D5baQ+bKJ1eAepuz3VUvN2vN56JxY2PSZ7AvMVJjZbZ/Wx571F+emsX0bLt4pUr261+xXWRibmZHFmW+n8uPjvZqdsHgYZaJrhAxFfgsQCHC4IflcVRfA32n6HYSjRwEGbwf3enCUJ1lCaXS7DmStZbirwzBVR+dinOD+oRqNDmr4ru+S145atI/8AunlBIbSLGGJIJak5i3JACQcVcEjEYbGU5XRcLiqKUhehoTBteejIiagkXcXpyU9fbgbyMRfHQjaWR5G4utgTpnSBQYJorrJxU4inHKgK8paDj7yKT2w/DkNMHU5SPxJDTCOU0qSUSznisnEoE/8JmHQT1n2PIabN4DRLObdnXsB5mYtY9Bq75SrGB+vQ4jU5EEAghAngKCphl/AJZwLlKIuirBh1UQiiaB15BevihAMRhOCDC/6lVKU1hC2fEJFAgwk0MkS4y81DLM9ndsFgDx65EKVUlLIqoko1UQkRQBgBhEPYRZxEAe6EEg8UHHAltutriGyg55hs2Ia9sP/pma3UcvNIgV4p7wPbWtuZ49ms4+I6jtZ3MR7rbeZo5+bGbm7taB/butgGVl5gXjGwzjQ6od7j9jgoKgIO/FOeB1A6gBbqD5oWvarVQfERMeBEXNJTXfov3YSsODZL10PI5bawcHipoWJqco0AdmG0Fahzlbqh2bDXCVXlnj+0tNzjd9JFoCEQNgJSIKK4OEEIjqMBwZ4QEBpHObSmwc1GiBZw3z09nPr16TVg0ElDThk+b/Qg+WyPShErzpjTzjjrnPNQEMJkgNr64xos6Fd0dVDm386rLwuJ+xGaHfI4sBiwjhfOBls4WgIeLDgTDv4A7DVuCsBDrgW0NfsYPDw0GIp54gptJc57XPaBKXbA6vAwxIFpZegI/5mdcMcTaz75i6gWUtyJxViaCOMl8bJ4BfwBPBFvhj8Cf9eCM/39C7yAR2e1EZPuemrdZ1JcdhbCi+OlD61TG8kfuUI0b+DMKZD/KL48Ms+I/9/7//zvc+8ypk6ZOG5Aj0fefn1zjikFLImVsdORlv+39+LZLrn3l/f7z5Fr2hNPzZiVJ98zc56bt+AFloK/wve6UJENm7Zs21HsI25A+fEeyGIo1rRLVExwDJpyHe7F9bgLuyt34z7cgwdxMB7C43hAeQLH40m8iAeVl3A/XsYbeApv4i2cgLfxPl7AB/gQJ+EjfI5XlS9wCr7Ej3hb+Qmn4mf8gU/wJ/7Cafgb/+MrZcAZSkrfq2UFjzO9ZWtpG4+z1HjC4xw13vE4V433PM7zTmY+8CwAzgeTOQ48F4ALwWQeaT6PS9TJgh6Xq5NFPa7wTtaQ1vS4Up2s63G1OjnC4xp1cpfHteqCM9mu+6jLZofKv/gMfuhW3pPiAU17HJjlQVDfAHEIQIeI+YlHYKEhpagtUCaan7BRoLDQThEoqCOLAJWzHoFQz5cnRaEgTFRYKkwRY+WMAUjjWkaXIJEwAoNOLUHcfDGMY644+bMo8P1hJLwSUN+asKZZ45uRjo1YMxyWKxyRtHwY9rOgmds0CKCF/jl3i3nj6npwDKJXOkiXSZbceUDhogx++TB31vdN6ZQnaxvAQgPbYXpfy/I6Gby5BrrAfAo57tf9GfB1tVXWWnuVU4GpY37ByDQpciH9rs9Fkp9P443DfcLcV8x96yyufmrJu5efcMIUsxvuc0q7GNZjpZHyRPs5yF+Nft3+yuA/6LcH2dFJjHAgZXAZJRIrN6goNldD9qlBbULVGSsaoh5oEK2LNnEsNozxNUMUkOcgY6GEwOWgXGdoIAytWzkWqXKsImVogtwlQ6QN8eIy43KaUgRlyCHLph1r2AI9X9Vp3ZzH4o1zI21kn+12int3NZc1cRD+pVws+BcrisPZ0GTWgzeWRs/8GTt0dqHtPLTxTW/D3C0Nb4WbLdHYNhtN3WpYVp50ki+pRNOGEQ3TGe1XMQgbZqEtbIgFv2GLob7lvxkOXHOrQVt7Ed5GWJeVDTwqrq9hZ66xSVL3jemdwJRJq1wbKtXMS5RsB3cd4wyxAPKkX7WsRqr4UBTVodqIhaMvIjaz6kPjla6hfx8DZaTPbfjoYxyuhqsJPQaOci4eSa7i9dxYeCq5d1aMAgpd2LR+JNLCmbR5fPmVlgbeuLah8bWrk7zjSbyg6uCwN0H2uIb1gvYbHvHHMPI78fT26Z1plmlY57237cR6slAinFkaTXsr8XAewr3w+momYZWzR5msF3pxUIdK5nei6fZM+2y4iu7NclQfbX/3oD9FtSFZjeVptS5YHdzJpO576objZkvUXNJktpdTQegVeg9Gzh5ZHQS/LZxulgBukUUnpQKlD+SqF0CN6zCTvb0ge2b2lOwzluW4B5tBiBIDlsULM1QhKCo1EytKj8N4somh9ur6hh11ciy3r59QPI4gw49GNFn7I8lyUorpYmXFzjZFpH0JWquDrEFBcpBGa8utTlysjL+82uit732iQ1pvhaCa2QM5MSLq0N1X7EzVecMmY510zPNyN+SKrEi8nktuL5OjLasS13VMy/usRnKieE17mxmz4I7q9uTejhz0H6VBrCCLktoO4Do0xSxgGguASIz1eDdRMHGDBqJH4xrWmfZU8FnFQKiplhMeNcfLAY7wkEeRkvNbHPtl1GhoqSMIr8zRc08vrfOrukNlnsFPH3XFAWJRHPJeKKpxULH9tiq5HwhfRkoogqAEVPNr/U1Gk4S0wo9pUSYUzhMD/Z2cKSKASmK6Q7XiprYN2yaK7MTN1lDiefZgXJDF/FFdp5SsqD0xumuYK3gTM/jD5bS40vIY0TEdlLp2etK4TCObfadRkLW26S3ICt+EabwQUb0NORjj9tOjnxs9HEXZAQfv8IxenpliLP26MSoQ+VEge76lti+2vQJFXjSImMBJx3JeyRNABXcr0jrwoOmkSCj8ow+n2qIquDBOM1bkfmRHQZxO66uEndYiMWz7Wg36SDwGTvrpVJ8M7WmLNRxIrMPxKynGGUzRXKIms/m16TyC3OwSC+PaSZzFqBVyXQfkAhKw2ODi0Q8bbOFZraQiMZYMOa193XxYXDO9SYRoLxcBkkPjzs36WsU8toTC1kPSKODcxrQN0RLjyLRGYOq4RmBPnDyqCNoi6dBIdQVIUEBK9wQVShR91SyrUlkWFbtzj5w13eK2As0rWE45U5zMAT982YojPiwMPrBKstKUGlMj0jMV1NsIworbxO3YX6FkvXjDXT7YnZ3giY5LPcMPCo4JoQPHhjEHWyI9+H5kBI7Jr2I9+t5IFpk+4lFZEfygX9jxrUCfWGTElirbElcxYKGs4GLzWiohxwyNi6K+CBbpYRU7/8WdHX+A4hbFFXkIf6XuFwodK7Yp3qX/QYZY7RAXjpn9tdnMGVqD4r83BTShxhFk7Dv29m2sUZsWbUA4pKLGbZGPPGjI6EQSrONDR103OGFBrMZiGP51aOrYVpprLdmIMnevqUA2g4lab3f2wt2O2dnVeztEQE1HIkZidCiJdDJyMNBV7+HYdDObwZ7Io2AGeZJ3vZI0s6ySFSg6wXlk+wuh4bCgL9DfL3KcmAxvo1uxtLlzSB2goNAWmSKvqtfOGRGdWHg5LkLOzkKGmFn7ZBPmULKaYlwt8nV4/YmGVWnhwAKUXjXS6hV2Zg4G3yG1GZvVT1HEQKvDK9Aw2sW1jP4ifj2x2E0Xs0YplhtsVEaRClGNl8uQ0ajYNQNZTdgRXNBE6H5tp+sv+fGrxNvsO8tz2cRj/q1d2Wwww4mV7VyCv4jm9lg6286I6NMyFpQcNGkvq4V2YYfaLZ7JhmUUSmamR0s+GYRiflL54FlmOlIgQaViIWKS5x0zaZlBvRgnzfLxqi/GMpaVV4zXW5ZliWVFPcc4jOTBaAJPjASuIvbLZ1nM4fZNaLjU2PHUB7gvgIBQ2o7YEXhLu61A6t80krAiF4C/rBsYkkz3cjJLN5ImOOVew3WXBhKDoQQaQKkbtzRiE4uO+8PY360dkcjskaGdYYSpzm3aQL6oE0RWUkwm4xF5qQuD65N63/eKXzz4u6tQLNff6J3+Pzu8epPi2nvxmg/2jtrxzyjFPQ2OngprCtnURD3WVrXyKG7A35twsKlr/wOzogN5v/vQdGLK8sTFvtKHU4iq1MYIm1X7BZJuSBdjr0b+u8bfnfoTinmaT5k/1TdA1T/TxdPvpXOrEzPMoCxgcGHhjMB8x8sx8bvfbsonBSSQXDyoLnbuXru+J1xpdK1Cr5PPnl0WvNt+55HIux+P5ROZGXRKMBWw3xpZw31lFcM9ZVYFw91l5SM9pRNYPTMrprG1gY2esTVRy9TKWC73eMFoT2n5SFeFFWuop6JyuLdoAq1laa+ZUmCnZ2rFNLUyRL6V2irFxZTagkVBMHOoPszIzbqRdHJ+7kL306mqkdG8KKf/FImxpT+kc0Zf/m9lQ+6gzbxAL29iwqg6srYOFNtQ90gGIhRv6x5tp9arZBlkbU00sHEEAUKEdM3Fg3OQ6ria3PrRoFhfq7kqvPumstzxzts1UVqNBXpbGqk16Ffgp72c3fnVsFhXq7GM3n0dJU842nW3Krre5kz8TMhrRi2BCOmGDoV4TjNNiHpLKFA5hXjBkDLD0cY8r3hWoi0cjgYep2FpjUKNdCy9QAguM+odFI1MkpGkd9/gLkRGvIeO/9Q31SG9zJxKtrCkks3NvFytLL1c4X7agjzr2AKYxngq/2u4t/tLB7WPW/V/3aVf2qh9eInzAT20EL8WVF/AGb9T4XTvXuQkyMt7UujbngtyYL12Z/67H43aaunvH+kVwGRFKuRnvFpPq3n/z8JtRtTbglobagyI11CaImkRXpQwfyopytNaPibl3FJw/jp26UZQcn+AUsrRpNGkG5Kbm4vCq9flXVJCPUPjGJ6Ln0+Abte+3s1eXXldMvf5/V8n9h1QLzVB4aHsIemDyp6ponaIZtzTbWSjLOHN65SGvPf0nCl0qiy7JyOIEkArzU5LzmWGfr8MWoSJXembqN3bYqOx8afH3/K9KU9ZfZdZviZpyBX28Qzd4c4SbL6wiLYaolRFd4V6x1THJ8ZWgZkIryKBV1XR7M7cFgaM847Rad1UFZpa6pnkG2zv7nC8n0pOPRumSlUJ66Zf+bn0fO6fRX51c9+IaG9qBNPPOzzaz4ceIfOK7BHi4uwRSHH3oPVQaKASY8GMbJhaZ39fkbb7Nq+08m1FKg8MhzNo7bY8FrD3ecTfOW4RZFmdWBPV6eMe1ZaUyGgECk3nnjhhJmJHDywORgFbGTsZrRXgGsPsgahmdMQ2vQyRYuA5Xmrae65DN0h7sMWG4ok4KiDjXxZm5zYfXSXb1vt4OdnZWnH660mrmXq6lXu6uXO4Wv4GQYSLOOffo9JNtzRrObPAks7q9u9C9wV6cuBuUVxFkPGWmjGHgyZJj5o6jx3mpxITCFPHbg6HcW7w+evm6JLO7zOW3X/i7rQKjT127kIblxyX0Ifzhbs/f/Xmz1YYZsdy5poW2qm6k6WdDr9gHI7NuAm62Uq8gUcN5VfHRBVExgzlZRkX8JAD2LE/HAIPboVHdPnvj5LKGkyd5Vr4iXAkFyH0hCCPe9MowWdvltGnA2Pc0mbBsWqVf0ubB8SNkqw9ZmsMBU9e+F+dR+yrEmcpK6O4vnYeeR+5U/6yqaQwgyOP81M9Oal8atDgoenDPt3jw+PAEXf9UdXY5VXkuf2biyunwWA50YjVs/cUsGPTX7u8jC5nkIxISmbyua+FSS+jE/6Sk99B+rnr0j1NOsizwMVqA+GBK2jFH5Lb+4TSCmOTTrSvwrL36vDmwKCl5S+B1/rgogJKTGsme7aSg7WDEkztY6D0fHgEn0tS5t7Glq0jWwvK4R7B/m7B8RFgbdnc3/H4HtTmnot5E41hyZseDobhz+l7g0xV8L1jYkF4MTN8cbmFY+UyI+K1+tPieXoyw+XjoeCCB6V9uePj7A9uX83k5FFwWb640GAqOXrxvNRwswnMWC00WUiOMHoyPYz547Da/bGxoXsLli3fdn9vaujcgWUYBoR16412zz+J+Utl8/t+oHFfuBPTosLC03MjESFwuXHxUa5SnOfe9fEBwj9WOlyTLcKfRFo/YjIosdXZuqw7OUSiC68JHs3+JTo1Jjg0Lj55D7ScM8iJnlpBnio/8z8k5F36J7S55SuT9ThXKSg9MiYymWpnWe5bfPiv3eaHk9dl5r8MCKVUPi87tocPT3QDu57r49eVrl/62gX22LGJT0dE0H+rCrX9QGmqojAn+Tea4z40hwn3WDrInR/TkasbswdHpIfbjPuoMGFMmffZdM+Vtzt5lNuVkw/D+QcOnb3C/92jf+bMa2+x3y7sPZO9hgcczMUrV1jJfOjgV+WvnklrmPj8Zo88dgzD8+Sr2SlQyJ8oB5x6+dsxYNsbA+hjBw/gjh0CeKPtovVtRYBof2lM1/C9tSPzs7LQKujAcoX8MwSKrg8+ChF0YVmzKCxuoP3pxdJTfy5+hnwDWzsPkrWLub68T2z7M8+8e1v3LjyHE4cdBATvGYVrt19hvOSpA01bczBdFsK8Vrg7FsbijsEADuQPBsZ133mnwI7H9ITWhxarM4c0oktKjxYJG4PKnFOgO2LFBxHxFx4FpW1wHcAI/cdxeOPhtzVkgg8hBYa5BIdU98r2B1eB8b7fy0dvt4XEH1IAHGB5YsJZJyfWlPA/GmmdwSxN5hCBmT8DfkK7RxS/Snenw1px7Zs/YkjCaR5aaSaj3zuprM3I63UIZ26SGz2WN7xaDPENDIPxkM65TuqFp/eu6bkJod5qa3SfcF+YWwgBs33/7hy/fyYgmSsYJ1qeNbMZ0Zr43kfHJnM0PKkpNjMlmhjI7L75WeV/PHtNfF9onnbAXZ2A7LCEQRCvuRVTNOKHaTwvP+ztSPHO1PZH5AEH8tChQFRQEzN2I9nauJOMTSikagoJJIWJ8Wev3zlra8q/qn0wtyRR9GFnvdtX+ufp0FCbb2+zIGlZCpt5sW4MJNhBhwLgQAHEVojsSTGlt2bse6J7no0NPZo+q3CGaunqlaOaCmvyp32sSR6pmsG/5YkgVktkT4utvHmq/z5y76r8Oaqji3eKXugveSIYH+hM/bVR1PRKmItvFbH+V0RpTvQoCs/WFNvFoMV3nG6I7w2nx/aA6azQf8tKUz1B0X/kAbvIzUELSx+89/ogBo9toHeHFKqFXtWgFz4B4wN/lw/eGQnJE2T+Aeyiwu9AZtfU6lH8v82MzsB8TdoEITgvKKITlL4e7T/WoxZ5S54owJblVtuk0gKXjhDC9GLFsp1+Vu5OTk3/mGqWN3B0Ils7GqureBIXjlhLrpCe1P6+cL9w1i9xIEAQbUdz9iC5GoB0nRnn5bnL0nrPjFUsXrlKeKpg1Szb5to44UcEPfv6yIW7yORt+auDTTWawX8UiPyA9rv3Qll0jiism1EG46misjExATPil0cDhu8td1KsdPT26Axw/jhvQlAXMDqoOUmaIGnJL7SagCagGu92aEppLCf5PXtraCT4aszFSZUmTxE7p68FVzYENnPG/m/f3QocAuvQ0CDG3Wdnnoyg78xdPvvhrJpWh62UfTGSMrt8xvOM14c5zGa9OnjxjAJufBTkbzcQ0NtzyxfcL7ivz6A3GrS1Os6onl2GiwvoOyNPzsy8ZPP2DQA7ksSVy+s1NhnavW0WRMtAh3nkyrn39Q6Zul1Npro2NDsYzNhDCX1WFzq/39SLXOpFZpFsxNnb3n78SOXkbJP01r3NKzLP5JZFF2fkr8m9u/e+S/rSa6SLHyEHhjiHBNdCu/xASCWoG2KLU/WtyvYU96iWAp2Y5q6dJtzygx+bT+b23k3Kkd08nE3c/P3Ylwk7YMof3pbx4GFrelZuaQWrMLD59iNGR0X1XqGssilm6kZTXEWNqVBTT297MOXfXFyKCtoxqQnhD8bjoiKVzP0SEsPvXY+NYoLg5w0UAtPequsY318cxcfiR/CiSqJqI2qxaqPfTO7rQiaPFEbqHuYHBqyn3l/opLCCr4wK3vmCyD5/iAePTJ9MZqyNoXGWMyPoUoRnHf1cJ7Ug5PKQ+Mynn3zv78u7p9DDIxPtzawjraP9b0R4N87E2BwONHexST342sRZ2dvA0yH+IIgRyAR7K30DW+swW5s0O5sZdU0nK6KugzVB4/TfCmA+69o40ml0be5c9Mj4XFv3qZ66Fj8vFwo1iAXM1PhgFtXDwymgN6+vTlrgZHc7f3eznGuTHH+fkeBgg5wzf/+DKx42d7Js7lzxePDouqfV7Ykpq7tXPcBrsinMzjktISeFFtmfNByinhlnbKWmcoonbCSrsKC5Il/PX8LJN/sQad9AId0WyLqqFNATSLiHSR0yBfILgat35n+Yh/9bLno6N7hINAwXZjCZ+tMqkT0403r+5qkOO2MT+9b8QhsfQw0LCyIVyoDQy3am/wywrYzFdHZGRrR1rLW1RDC6W/jYCWYWBA0zW7qlbZiVJRwhjVjtWTF+Mxz3HN1/C97G+G37wbkmRrEsMFVIYq6+asPHp+NOthbUdmQlWljGhrvVxPiCgHC0SyJFsUj1yIjM45CBlNyqkwnhiSzVukMVtAsZteVDeTHTCqYqGnpmitRkoIJgH+gKE7ZB8hYxKsMpIbBOK+yXPJEHa0qhFIZYKl2SB+wiFLM7rbH/nn/O8WftCGDHoOSSuRe5nEou9na1sPJ0AwpusE6yOvJCZh+uj+l8xETWBiNbDnxNj/ZdO9QWnyQEbEH+HeM3NCem+qzar95obbt+s3sEE0CNcHLwDAc/J39qhKMDlRECJ3Ly9bvbarQtpa2VWpvsPT0QJ3lkYm9+9vn2g2vtjY1+VOkD/ghFUdUVn4y4SsjmsRvvsyOp7h/7Z8eNN+DHzg5fEd0e8dAS0wGjODVtt9Bg/3FNFc0xdDirCuE4AUguzal19uSYu1ZeK9+7dSNMJ/W5pxdGi52tU6/mL5+5TSJm6Z5SYY5/s9ILbwT9ty4J07A/7OK6ubJ3Q9cOLINk8BjXWifsRmY+Yj0Q/voJ80VOHrBj+K/n3sZnx9/KSIxCYEDefunnx+WJtTtDDPqw/X49B3f7+vza06u3Fpxb5RIJK/7qyY4kK0NlMzdn47rEer+Ic44WFBezdswc2L8T/llcbWj2yD79yvPTna0/h77AgI6dE9nexcdCAy9Yh7n29FlsRHrUXWRuD7fR2sIZW5wcb58j56Zkd81Ka95QgzmnGqsUcL3HByJJ+tpOJqpqPZ6MGG5GhrSPWzAQRCT+YKHA5lSewMf6msrVjKx3hevfOacLw21VGuKY48n20Q1+sZY1Bzzffjx+Ovckwy56aNHUpSY6pjabmVgeEJp8rg3M1HQxa5huOTNPkpUl1cXc1MPFxtadtHVq0OOrEuwqbV7eGTJ7t9biXxGlLV8nCcuazpBn01V4nZxD9mgh/aP02J7xhph9zn/t5SFafAeYfiHM/oHM3wrA1qGguPTtuvN2Pxse199jHiF4ghDG+tPUL0+Uh3gjSOgTSh4Rqm7kRA3oD9fzC9eNpfYJxX3t9DLcNmR1W/vJ+IRy70TxUOq7L8EpwljfVXA50Jn833px03pJbX79PDL/HdlpK+dj5qSFkvPxzkoOV6x0XholbpbUFtXOCh9B49mamV0MenTHmROx3XRadDdxrMfeP5qPHiXpT/UHrbgN7rUTlScql/kPCg0AW/wxt+wEb2pOHIWcGevrnx4f46LUFtSmpDwSMAKawd+icxt9D3SEai1JKSLK/RxROc2+sg6JOq8kFPHKILCmUOBALkCV9K/W+4TNAbfi3rkiC1UxuNbsGTgD91Vks/bpqJrzu9ALlIDH8NSs3E7OR7W9WPgO+Hkv/rXiqeQaVNXCk/EA8Q16CazfYbnpYYysVCToaGhOGp2WlxoO9lyfyq+I5Qv16SvAf7Z5F756nf+pAk4y/ld5ObWWMY6Y6uqaZpqrrOJeqnQem5ok26/BxsG0wcYh/l96ojhajqziF285LylJvH2jY5ojGCq4+u74wvkE8elRQx7+WHpfMEk8vOsvHc5v8OCs0vO55yEFCkQF0DDHkzlsbvVbp42mwosfvCtydf3BXIOLHGC/KzQwI0Hc6lk33AzyayooxOkp8Cz+nWHOML714Fmlx2QeFk/msJVKmZYGzgfYZv6gtpXuNKGpo6+mrr0XqR5u7h6squ4eOvGQvZ4eiGbddtU0UgtGFQH/czz+71GoOaWf0v643ZOLFbQ7HTndNfcc3NIIDT+7nIRZW+Z5RbkpqYONJdln85CgabR5cFi0+il9tSP3QbF7/0B1FpnXw8woPCGvPDnuVEvhiaEuVK3+069bG82XHVUOpMYdM9ZXDYTTnTadL2wjB/oyod0wJlIrSzeL0ZVUVdmXxMjOITJ1mGGtiZxt8ZevOtNDnQ+VqhwvFQy3didb27uTYUnZRN0ptSQnN+l0X25lTx806r5YerEp0E33liEYkVoMsfbxNCWiuVY4dOScu3gu8ef6WkyzX1VVnbm8tWj21b827xXAoiD4lz9i7Pyt6nDQYjeJA37Ral/z+2QzEgCOrwXrb0HKMxeDvr9vUI3stCJywO4bN4ga0VrhO7BrfX8fo9rG96L565FJbRBtB7ClAVBGNYMFdGyA3WMjyFI5EBJi1Iqvhj1Zg/iC46vlHVeL0BKCbBBiF/IOQrbRY1ttECCa0Y9GZVA5qQwp6XBKGXaNTAkcCHQtaj/PArPCh2g6gfHlVmC567tXujMaK9K9qNYqim+pkw9qyeVW/pUPLzAzPzoIjC8lgeXyxtG1y8cCzZIVGI8YWJ4a4+jpaKmFKG9Y6rHJMoq6PKuoyw8VdXlOUZfXLJ3wrX9tCKUjCCzXP47uhqVPkksscwZ/DlDMm7VMeISS5dNJlWvkePomQAWebJZvA0vZGNbSyD4SEEptFVmItWQJ66Ova5VI2xPXng2PYC1uWWopVIYg9J2IS1iurSxSLHKzQpKd6kjYSEXC1iqSaw/Lw1duUDxkuzqPkvWOPvouljdBFpe94/SldWOqtTZ8YPcFIf8fW1L7P+Do/F5uNSqdoQY5O7809tJrR21BllZP12bBoB/UT3IF/fE+xgeMpsFe1RiuracaiQjXPktPJbOJVyxOgVXdi+URwMn5vceXwwjRHJN9jGWUxZl+CSEaz/5h5vw0YOHc7Nep+3CmkeKYRmmM8JclsvyKzljBBvoOY81EUVc4vzwV3AbV9qvfkgPa1mOdJJPn7xVQHmapzhPXtuYocCeGE7ePeeyHpi84VueWO095rAlFfQdOiGu9pyiOYEhDgfYjzNYAhwM0YP9Yc6jmwWRQrT+aAytaA9kRYLN9LgdAub3vYYE4m7zZisvRXP3SfhsNtOmxf5jEroHpCEAtg39O2HTw4SAIDT1scgjDmwI7BwFioZlex7GL+PR+Z5eYAgCPfYFlAXh9XN74T+X/51MWTBELwQEFUMD4gIEbYMozKs9AWAXEbF/fb6kgbWUYVollpEUVo3aLajeg9g2+3YhlsWUYT/wPZdah2kGq+dAp3yhWSZFBkhG/82ss92X0wwJG0AINQdCH71PtFibSQ4JOE6TZahU2BUn1l2Pjw2x7ALYuJafrcevqcloW8YDz1Fg+vb9KkNW1JIe6cCKRvWMU72POihWHt6arb0bbZt6+xryXzMR1XWyjv6DYRYi2L1DtJevQkVT9QKyBp2ZSqtWQ6KXRbJi1bFFNiUnLYdJIrOINmVbFvKUICzkRIZydZyEq5GSMPopqqWiNxcRHym+Nbe4rQzvO4aTXbFzA09+TboJEGgbQ84FtoodK4GD45VHoKuhhIqs1CWxTAnsx52aDMzCQ1dmAWq/xGVlwq2WK6l+wbzQZbs2GgoEqJaPZ8YhftPSXXCX6BbePSuo226ApjX0C4peCOiCh/gVyHxc8EuM6SuRTfzEf50M1I8Y9l3d7I79zQ8Foiklr4toqGbY8Jq1YdKhijSf4jbWQ6k+pcVJifSm+80LjSEpEeSuszCOW/5lUQ8xqzqrqMIl3Cvq2/MjACDqnWkU2fiG0Bh4tRk17Q7itkxlHJFPiP1oogCVUQIA5LKAOS800frEEAeawsNSLpqmGqSaT3Tl3tFR0SbXFdGUYimhesYS9Odo0rKnCmMZMHNUT1UxxE1HSTx4mh2oOeLC82drUrJ3CmDZF2GuFATQ0BPhBBVEOsBCA6UBArQgHAaYQAg1pHAB2AsddEdx8dkVhR98VTVTMoTG7Yh1QyHE+ZeSh8nJ1i6koTMli0IQKEwdPjQpVp+FZiiLwMwTv2VqkQMrc+AZGs4uHiHXiwWI1HiPBxoMo3+JRAhhxMFmZIShrxveFm088Fg0isn0oL1CnRTeYkVp+7mO07cw4TETHnZxYTZk/Jn+BwhKuzE6MUMdtNk2gYJFB3pNYx9mxZsqcAxJzx1ptUvlZcFlJF2QG", "headers": [ [ "content-type", "font/woff2" ] ], "ok": true, "status": 200, "status_text": "" }, "https://localhost:6006/font-roboto/oMMgfZMQthOryQo9n22dcuvvDin1pK8aKteLpeZ5c0A.woff2": { "data": "d09GMgABAAAAACn8AA4AAAAAUjgAACmjAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGmQbmUAcg0oGYACGTBEMCu1810YLg14AATYCJAOHNgQgBYJ0ByAbL0RFB2LYOGCA7DduwB2DjQOQz3hJ9n+ZwI0hWB/YxYSYMBRSFENBsWqrAkWbJBHpUKamYBECLd7YUy2OVYvlKX1dMf05+T/7LtU4wMKUW3v6cz1MLF0FGyHJLEG01r/VMHufgpZJIoGKBHQMKsYkFpgU4tsDmtv9xsaIGoiNiIJRtJKSElLSIdGjQuiRIypl0JtBlKISJSqZZnH/Oq0ZWaYZyYoPCFpukb7+N+xuwk6iBRZMI8WdlLQH1F3R7l157zoCyXjA9AD36nWBrP07PZhwgBLSeMnLEQ4VqJsqlv8siGuabsED3LeKFnxrugO3hMah9NJJ/ipRkvNo0bWSH6xvN8TX2qedvrqte1s1/yDEW6dCUB4tkIxQEeoDTSYMiiaAuBEGJLK/dSEgoaIi0Ua4CGXj/7vX2aa3YewLW7L1Fw6EC+fgxB/7NWWpMKZaUyFMhaxEyArLmA7J/62Zdje5MjlgYyvcOTf7ZycwswkX9oD2CklKoSNIzN4VWFXVET5/gKgKaO9USZgKCaxcreurQxDS1KS6SqUxAJqz+B+OtbQOoul9mcsgjITAKKN32318dn4Bhdn5t38EFHq8pCEUmUMECIAIFw4RKRIiRgxEnDiIBEkQpSqgdDmAQKCAVcCaECAgAiDACvyk0ex3gJounDg3gOACJy4k2DnDicusvN3gBBrAILTCpecT3AAH9C0NYpDo+7rNUJuyf/BUQ/cM42KIV0v11FyNhkyiUDj0XDKjjuX1lEnr9K7FjMnEPpZVifqZhCWKr4SbqzTQwLYaKjSBrueqpWpPjRbN9WixjymuFFH/CwqFBhYDRux4XXDRJZfdwE+IMBGibhEnQYq021SoUqPpHm069BkyZsKMhXQZsmTrQkH1yGNPPNWtR68+/Z4b8cJLr0x66515C1atWbdh05Z9BxC3mkNDHAcJeFI4TeKEYI8bP9Y44ePEm77r41+ewEGxRUrtUWZUuIsOetH6bTJql3HbzKjlpPZkximHvICSPiqPeMwTngZTLZpmhlleMxe8ac9b3jHPAmuss8EmW8F2u3bYZS/Yb9vBNIRJvask5+7FELPwimHcaoZ46yTaJ9WCSTY0DsjmwGD82Y7DoWmOfu1MGuY6fi64i8JTF1OyuErRYMJBFtuDaaussAMsMLJnmS0vuQHreu+JDYwyxjgTDXPAYsWQxpkTT6ltykCFu+glcU3S4tKxymCyyA7etO0t75hnoWEGSu1TRoW76JHEG97yjnkWzo2mioUhQSbYYOmYZg2ss8EmWw1jsBYFTyY55CV9Yp999tlnP46GGajhpolWtE5hDEphgsHaYdbBBptsWWTntaOdq59hH5i0BI2pTbJ9tW44FNXel24XIjwwjRl9q3SNYW6MMqPqdvrNMVySVP2Trj0U3CvhlYipV1w9cpuCyIgMoYoJ6uAoNADzvug45Zj7yoBXfrjWup4FNpUP90w83Gjmo+puO/m8JAbcN3D4dUpCw6N96EFl/RgLIB76ETisxR/w6aPfR7D+NjfOfbeHOYYeHrwM6cPqaG0C4EDa+qeN8E9UN/umlSM27Cex9S8bW/9cmENaN4plychcK2z/rnfLbrbSThvtiLBzSrZHuO7Wmpvu9U1ldbZfCTb4hlrtIxcAHO5g65ppXrrnhMPC1kvnK5fWHKkuAKxYS2ygcV0rlvjEtGOxglUm6USA2od7bZ7ZA0zgcMNXu6Vq96DjVnaFuUnt8GvYm+2/bLjrmx9odH8OHtYJcBgN/b8kxzn07RsPkp7oNsv+PxY7vLXhbI0B2O6kbBr78YIaGQ9mNpD/ZDn01If3Bh8OOu7XP4HYqD7kLYGVOfcyTk47aKYl0X7mMjiMDjPg7M42er6j3/abnabFTbZeexnmm/4ZPQMO37lXsuKw1GmniQNWEawkgpUo+P+g8bqExlXC6NwiDU+RkuNUiKeoeU+7RxcXffIw9p5jytx58d4L0uW4KO/t67osuGHVFr1lzLkJFBG7OIqjOKlO+kwUPh53gWwuEnGJGNdJ7wYZ8JOTEBHC5HCLTMRIT5wnSPAYSbKSIiNpslAk1h3SUiqP+NULp2hOtdHQAdF0S1ofe7ErOh/EMyMdczKLF9olnjsqE3JyqeeOygFPyuNJXV4ExVMo3X9j06MfxnOvIEZNoDdJXkZT5mC98R7x1gKc1fs01mxBk9dJBzawOQ5sKDkp7MUhWOFQrjBRrvMoIaKIEOVmyUxYL3rQ4QjYwQIGsIZUnapA3GVBSAIaNA5ND0QYkJFRiSHMgAOcYxIJoiQSJek+IlUaTgrBBg6wgcNx6IRwArCCIg8o0IFB0e4sQGgD2sfstj0Yi/vtsrpEq52XqxUx7wXavU9R5AbVfbV1p6EDtGWnJA/XVOMRsvo8RlPdHad9NxBpoVtpYHLL0QrVHnveFe6uwPf/7jyBq5c52luBaALJx8pX+LgSQAvlHBSU/jQISHSdPDXyK0T8EDNBpjzkeaygcCLzJqgiKV9QtldXCkW9eOkpVFBLmWjZoyokvMYGYuM3q7LDGjTAj7sPXGsYBaVQYdkTHmY1/zyKJHrVqlSqUatOvQaNHgpOvOwmgbx4I2vWolWbdigIDqeB6phIgQHjoSEEYoO3GfWG+xmO9H2b14EtgH09CwceqakEMmDjtbHwH1ywyEvghjwO6F0GGbeagAYru65f6TdFf8NxEZpQA3bCjcYxgDMmoUrc/1DdhozZ9MEhMsFlbnKRv254PFwOt8PD8DLMhvlhdVifRh0CAEy4lSj1fMkew8Zt+fiWtyg/Gs6H67an546+N+CsD3294PDnwOcHM058+/z/7Vt/15TJ8MUb+x/6/XXxtmRzAC4jjHlHw5q/XvcP1+XZL9e/HyHSqDHjJkyKEm3KtBmzXpsTI/YX7U0Txdm2Y9eeffEOMAIAZPHeNcAFkH5MT6DhJhQar4QOSmnAxmukk4d0404Pg1C8IcIZ7jem0m8c6GKCWZ7xmjkieMMCoyyyRBTLbDDlbRLDFh94430klk98Z5Uf/ITIL/6x7f0n3jtUBxqZCCT4yEItBRI1aiOQrFEfAiSN+hJI8bmP1LFAqs99ri4F0n3ua3UrkKW5HwRyNfeLQJ7PPVUzgXzNPRco1NwrgSLNvRYo1jyHQ6BkqJuBg+pwqVfwfijyRYUwvQnHv6TWp0PyKigaNh96H4GBhmyOegPVB40f59xGEvqhc+sAD9WxCKjVXrZAVDdIs68AhHKCotyajCaMMM33GHhE96JFqxBPQEEEoqpC8iJOGGL05OS/t6P7dswwoetDgYYOgzlyg98MT+zFf0ajcoEikxZ3w24atFBdBAG0lP/g72LZuroeHO2D0lGazKLkzmMauyiDCdhr2a5txrOVjSChgd2ova0t77MhhbcusVxATqdNzYG/FtlUbXRQPRO4OeZ3jE2LIpfa374QSXm/jXcJ1RlLGxZ+dBY1t4Brn0S4YIb5A885pd4Nm4nTxHTsncPU/uJFsrvfCo55+xh0RpRwlNVFmRZ5JT0a8vqz7YKjXITu0NETuTeLgWx0wlG1ZKwnE8zEIEPVAl29KW8grf5KvdJSAaHPwFwMFyKZcNGCzUM5o39uRYwWpCG2syOpPpQYJcOaFn+YiakAyoJBWW1PdQ3gky5Lyrv1Qu08YS8gSdFMp6Xw8V//1cwtjV/OeuogqHw10Ysw1TOlp8shZnahTTWfy4ZZH3Bv01/rq0FPiwuORTUH3Rr39SnJaRmeqQkMhbRqn4TlQFNuBzh2XJgnuDqHspyu0HjUXsMzfPUKBo4oQFl/59ra8oQdbCz13uBAOQ+7IIF6czUJA1lU66Bw5NYfWV31oNN7ypngGeWsuTqsEsrhFQEqG1WQZkIcz5vH8rsZjFklUsoKdqUiEv68IaVRHWA1ltQdWoR4IBbvBaMNWXDw7xohT2WjEINN7BucggQF7qiNneY8xhDhaJpbjN+TprJdqRJ68eUpZ5QTOoqiy71R/rGSuGKW/zv5f6bK+V+XqNf9bxu3tMVwufyHCz+PSnKjrh9+fWXoqLsUjumye4LFDWIi7dtumjw+brjklOBI+ScdTjXMTJQ4+jRhyjVAOkeCkt30cx/S2Z8qaXHhEDOrpWN7sCJd6FjeIVEmfARcWahxPLsI1sVRRvQyvF1z0BOqq/mw7dXZ5YiDWzSTRl1gQmV52yFfjGnz20KQxu571VcjSo6/lSSUtDza2mZJtR3ssJefgx5bpVWyM8HDYK/wkP5JPnL6UqVarauNUmfRkTOho3FTlGoP6PIFDRtZeBq6BcMRkGuIiNY4MYmDV0ujHNQz+aSb3NheHTbPCEeU8Mg3wvEIObtW60VLwLt7tL9LwT6HZUmRTfWEN7twFXImIwjFDI64QVhZ3NhBFt8eBbxHMZ8CaIe7H1C8xvXMdyxLPb6VIsSjjQ5Tu6SCqgAr05exOiWSIOmZeqYl2yAKsJ4IfFNStZo5LrDOMVUi2QHIrmqZ8dR/Sd8CWKfN1Wr8Mskb5eGEuUnILSj6pq4YSmagxspkGt6pTX8GqCojM8mUjwKb6kdQiWqQsEttHrQP39bBMb/jp+WMbYfEKRvFj3/DjHhrj/gV5E+5wKkhbQbvSCZBg9oF+S042qt+KCNAGgjS24pSDB1vg0HdlcYmpwORmpccTd0pV+zgEtazSNPfQ0pIHnElz5rKRywGsg04LtCsfnVCrglVCXW2UwSoJrdok1FMXuGCi+3BkEsTB73xIylxRo9pfLYQYxLuUC1A6WAXzk0miNkeiw1OG6sUC1JVAcxx+9QSh5gpb4ljMlXlQ8qQQ3dgkoicYMp93+rZewvB1cgE6qFuCI/w2OaxiJkb+/Jx6REGfgqeugr5MzGoCXlAhbvvgpRRatUGSqa0aT40UTVEIniStK2KkQNSWnadTS44MC0ZcShqn/tNbjSpzhJPWqmVtdIahqMy4JIurfISwFqdDknlN/ZkJWaJOfPmu0hCIViLEiCXeDo1fx31S8zs39RXB2funyM/h/4qJvzk1FE1AlLSBoRckNzDUC2Vie0A3dVydpP2+nlQlXWLmsM6kpxf2qNAnzxXE9I8zbaSdNBbUmBp9qN4v7SdxKEPSQw7OPKYqmGDHU1G25UrXOzQT8UESQ8gg7ZI7KplJNU1l8Ei8eqUd9TGu/Hq7MDh3qFLtVYpmTYB1RVu8jGGn+HIKixbp7pl08klbTB60qEpikY9sjLo9EaglvU96Bz3EvfEcLRjtkf+1rba2RopIJY4orU7uObY3Y9SlGnOR8UZRdWYYRWrEpkS6FgkfdvN4lxqew4RQe5mP6W+wnEkhvXYbXxIZd2qOGV+DxkBE9TT6D3p7Zq2VzJUAseOmluQLiocOOkAKDVWaXR015dYYhhgYrCcD6ml8QGDF/GOWXf4pN3DFIOvh2olo92vyup7stXa0MvaZcUB90LXMpfiqT0HdGwvKlR7KYetkJMa2zJ/eArTc+pPLwuQVoRD7jxII8nWDhElbFkfTa6MUhEyZ1g5yvyhBBlM5pzxUDZLT/37WD/EMrpTwTbt4IhlG7ZotGO0+OI4aZ8Go5MwWJcz21FJpnoSIFY/ccFOPVCPGOEsSkbF/PQIj5jGOrVbVnfwRTqNq6nNasQEQSYH7oLXLiW31UgXpk8J44vqKc0GKe+BUadt3wUGAkJHB7zFtQeGQxccdSieReslSPWf21E+PxPTi3gAyczhLgUOemFaBT28Nb0szb2eFfH0QV74/FTUWTUSxGVUnmvtGSxEF+eUJztVfeYpr5KlNEbYbqQ/w8UBwJAH0HamgKFli1D0/cDgt1aKRsyIiBkajPOqYfpIH2OmzjUXl2DjQBcnYNPzP23nDgeJTLHZjvA3F6eZS+qL+hBHp2CFSjh9r5hEHI5LWf8yYeu+fiXuj2dEpxTy4BSscCAS7mcaFpIjOC3TN15a8XSiiv1d5nw1J3XvVVdSdCXBLyTQ7X6UP791na9WoVPtyKsOfHdGN4V1cnOIkpCaGROZGQLYjJzIqtrI6Io6olJUVVV4RG1VQhxWw8BWVUnfSk9FQ88uQ89O+1zrjciqGmx1dYKSoDTFEzCaH0DKetZ6qpr6NipKhta6Pz/vyl71JjjIgm2Mo3dThbeljyxJqar/UU1W/8NoQ8MMt3tOGvIR8uHF1YdJ9djPRUuCiuyQgv0MsjKrmh7gbl1DWxUY4ZuThDq3YelD8tGWvyGgLy1vY6imbeEGLDOpHO7hsJgJURqr/sUfdMIUeQNS3akvcKdANyLxpG6ttwWvR5SKf+OeDogqLHnnfDSKVObzyPWhfkSuc08aOBScttLk84hUfq/nmw8c5a+vGV3LuuaOM8ilM73oei1b0HiQOciMcqb1WLAxXFpjymrKekl9Wf4AqqVC9FkHJbMIdHx1e6qd9XNg5NrO3gaSJT+J0MR/vZGQBOTgYj7stSKQKXNVXJDY31kSRgv+kF24ebC3cBUl1sW4FzlLSg6fQRYu7hOXE+KiplBr8IY64U2sYRs6DULU6B833EN1i/QIcale8TkFiZTnqB9vXuxNN79muxhd9Q6O2QgmRCCZ0QQ4jJKJnpTGv+v9oztv+iwCmx2v+PFGND0YOBw/gIUOqldmXGhMUkLkg/zYNCQBblntjGSPaFO1s10v9n8avPBleHDEAF69UZnZrVe/kugkTRzewS6vfEa97f0yw/q4iTWYFOobntaUn1ZEjgpQEKYF4W/NhTyv0Yd/jpcJkcNPVxmmV74yjU6gZf4ppenXaNNMkCyKPbn0FNpK3wWEJHdmZqV0gZyeMm+7ch9v5jGOnDmQHhB2JdRa3fDkj3rk9+T/0vjk3+XHvmFPPPktb7jXunTtve7t2X9N52URmJf7Oyv7Z1pSZER6MpvtCdeYGG/3KOJiemfEJYDQapiYQomOZSg1yG6ZmOa28yKIOPdT7qhorWaMNs35ggvr6G+bbL/MCjzP6ah2FK4FBKZTczOTe4A20vPvgNDZoDTV5MABkCq/LlcqJyNXIgcCLfEZqKciVoFpdFmDesA2F/EViFPTiYjRMXd1dPV1vB/kbEJBSleHOp5MjjQ3lda6OCtr5fRIdt1PHpfS7wyfXh9tfyRcLaIbr62anLqFf8lc4Y96mu5478FlTWmhS/jNdM+EJUwrPupOtsbzm0OtfvTfGH6QXPh6JozbrrScJ8y+FHD8bb/cUsVwggG/0BH0/sMvm6XGSpkVD6YkrWxDSTe7c+a4a9+DZXxyDkByItiaGDTEM0iu4ZkhD7Yc//CjBmoBQ54/eN/fc9+rwOayDzexK2zg39L2rRpGqZi8+EBartu5PKFZIS7+CS6kU6AePnpik+v3e5Sop2jiixQhuoqm7aMozvXeY41V+Vld4yx/kg4Gj7aU1KWcbDU7WvOfnqsuEoFnZqNFInyV/QiTCN5nZPE7+yH+3MbPICCNKvWjWSgsBAw5vWhq2g8k+yJtInsAQ44pGvpsA+o93SqOOAdyC3tVlhAy8kBF0JFz/cg210yPCDdP7xAzQPhtibvbpfSGstK9AlbQCoPe0sXS0v49hEVCL/h99hL428m9tBO/9ybefFp41hNCTIjwS8uEGDhR0dy1v7/a8ZixbckIvvJrm+BY0FLoZabrhRNHyKcHKnr6S5R8k83m9Hp++unpHLzlzRK4Kve1aWvrXsVreu2rvX03aKXVzpKkaavJDXQ1abeQV46TqbL0dQ1N9DUkmZmnCHqM41HHOAfqm/OfSS4K9QUz6i84iIkjPTGOf2D+8nwat/5Dv8AorzwlLqI8PxllC1r42qlofn899IsIf8EvSmxaRteT6WtFppluQF5yPm0H5ff4GW+Z9FRNX92p9/Tqd9zSLDHteYSAniPjaOrOBVJNenBsCSkb+ECP+P3O8mhOA355PmvXK+xFQG9UdVZuclGwu1FWoJPdy0Drcvdm9umtLDQhcfhBb1RfTnlOadBspjeo+OCnAYPvBgx+qug+qFaSF+EVYN6xnP1wEkFWlp++LWp8WFre0Fj0DuL/n6Bpnjw7SK47206egNWRk90XG/Don2Vs6T8vNHH1M59b7+U8Qm7CD/ByunG6sXvzNnHWWfcvykeYXlt9MTG7sG530/7m2uuFlxMrYDsd9PbtGZvUMz1npmGdh1sFsoXnUwTWI9iKfiQBd/t2N2CJ3TkBQNsVAKhoMpkPe40M8E5YoCEH5vQGfmL1womKR09WGi7PPrg0Ww9iYdkZ2RlwuuJtMcK7BBcPd0eHRbeWvGxLqAXqTpuelRfB0ybaRol6j5A1YOD7aIqKLv+cyWvA+jXRIN+IR2kxVXfYwMsK5FBsP9eu9rxyT8EF1wEWKFLu8fHLl9BdNE9SX8V1atZO69a2Rae/AqkIm3Q/WqMmGlOf6gEbtwUaPjhT5PVtLjaj4+Mb2sYmWofkGMekvJGec49yn4M576+9691P3cKFKYCFOpyXW+zQ432hn13YruyxGLJW4SftnAZi9gSosc+zc3/mKQ38O58cPrVzBK2+gC5uGYi3jtUUlPUwiB3He414ZJexpXEx0ybG5sFWfT2p3v0h5UmdzDJd5raIsZWDNWGLtFUPFrz/di73Drkl4PxquSd/fvrZZ8lGXN/CzTetITYrO97M7UHP010ByufOzPHYpntF73Xz6mKzJ4BDpzMwa9AAFfGC8hK8HdzdjWMteNXRFMACBfQo4pRhrmuuLiHGQS7OwNEm3nnrpJRAxg9haRk5nUd4rqtuIqKZvwlQvnr5B2uUXmrtq2WzUtE/4/MG9JI3MrBXiNP4+SaMrN1rFFFvsPC1xfjPUEa8HQkh9rGB9Paj1MH9rQ65PE6KOLC3iWNig/KfOSOIf67GfMXB/xbjSAusAv+Zivx/LyekzbMK/KXg2qreJCZVzg+31MwnxlW/AdlVth8r13oHPYLpKIB5W4vz80h43r/Ki+1Cd+ZPEWt0MjDa6fXRBZNgznu4PjDY4xZG61IHmLcUGnc/6sA2/98uWmrBVHSlfireILkspnAaLnllZAl0yOQBRbwNFWycUi36BPjPnrnroX1MokJHw0srermzqWv9SQZVLczV2s7TQEneUZ5Dql5P298gdeshJWLYxKPCkkJjGu9CcAzVhWM+MtgR0kixrIiMLHdQljK7YnBIZnzxIGkQC4Jhzs6hE41tz2Cgh/Lo+7NpxUJ2ijgZPv5e6b/95JiCeNKxKPEnoFBy6JYEhb1NPIvVS5gVLZzFXiHexaRzmaX/ciZ8f/ghfs6K04Vn9lfGr4zXLjxWnLNwwMzSf2XopPCKLdM8jwJjFru5w92zthddj52/PgJiWQHZJkReneNqucKR4OdKFmhZfzz8ZTp1+vM40vFwuUWQlzAud2JkrcqwymhjFIV/JQvyTJmAfZoJ+N8jMli6+a02nbZ7Oy9OjMvxEsgCzcvQNflhOnX6y8jjtpWHAqDxha6IOhen/EC4Jl3l3GUNHSfzEqSk81WCWsLtppJfvWrmXhZQW18D0xx9jJlqUfd4qETYpvvTGjZhQgafkY7vUHZbzg6fnD83/fwUmXuVspTJ2T2FyWx/XN5I63GlfZcnZbwABbhCdX+BCMQCRztfWViCQw9/PXj2dGGquds5NMjdMTw3BIe+XQgKHz2KIifGisKjY8Nj4hPt80dG3cvSssJj0zIL/foHivwzsiOJWbmuZS8G7IqSSZGx4qigIMJUf8Bqf6DHZNCww4C/h2e/370LcLb1uFDWjNsYJkShUiFYQa5XTjpYulI6hJZG+RykMR2lHn1G/U4FpdSmJxRdBX6lWNsa9NC6x7ObirfiPV5RkIjWrAJipbelUZLDuFT7jW430zx3aruBLP+dWNsq+uHFbfTKK0pIdV5CcgnBWvGmZowMl2aNkoelWBhXndFR1ROaeFVbxTsimlGyJ++R1dl1bBUN410Aq2cyj4Fgrmu8HNb/FBQ/6+U2lBQVPp7scCM/ncwvqS/PTLMx1zUxd44L8vR3jjM3NdWx+x/ZUHweXynDVll8vqGu8Cy+qrSEvaLoHKF2hGqkOhSmMkQ1GhlsNVAdHxpUHW03AMeeZr27emF+4UH27lV+DS7CscGKGiJCJQz29eFx0bnJMZJWx7VMAq8YXKAme2iDobSQOUis+FFx0aW3wWgO0UEYcqC8klL2moKzDfUF3Ozpp1v3V+2kexy5NREhQQ9kAgQgV0ofw5o6ReFmsSCgmx4UKCEGsqIq6pK28SC4wVlCKgHc+R6HjHwnh7Q8R6e0TAfHzMz/R0RV7oiJq6iK3lTVcFFVgYvp+i7ZLkXVReHZ4YXVHBxf5HPkoS7PwOXKcRc7RYG/knfv3BUrJFSl43JD3RycnHQ0mlJIwJpxX1dVSZL/2s4dMVXBS4XWZYHBcfn+DjcVjWWPZVwkOdUGE6MqQ5yLrmlIyN9RlhDyzEcMgX0Ilhl4M+GIsHgAlN3P9x6WyuamilfjCKYxdelayjMUwLyFGJzuJu7f7Azd/00mwJAhbe73yGi98ZCQDKdbc06kWRV7kLBOmvpCN67+ssKdiYb3eYVGr2+FWXvjgbbCpuhRX17+o54q1WJqr/CT3soyjK2lp66OOcFOw8bSU+eehStiCXerwfFiqIVPZw+9NYerF8HVNtjDhIKULL/oHJh51tpY/NDFQ1Y9rUcyfuzXrqbD6OMBXsyWwi8tV29iyJ05reyzGtnKR/C9emz+z7jmwVBZRVNJwzdQWUN5mq+koaJpVdXq8iy6yqyPuGeZl0zafNLtoDNDavVsevD9iqSi/0QqwislY/PVKvGcPNHOrWoRVqaAFlPHzQgeHU/j2wGzsc9NTgyZ92j6Owff3tA+2s01vBgVMGTKY54jycVZ/kHFWbEAz1AMxkd3qW0DLcUhD0YUhVTNH5H0YtWKR5o77rVdMbmcxxJzRcTZw0xbWMXicZp+3D2j+FFdc3snw7e8oLHMgYltldFbMUuqftSQXbjauLCk5+wa6OCY4HqvE0/61PbIq0lbQFtao1HfcXILdrzmsE2NTzMz/O++vx1b6H/bI0u5UOXIwbo3kuCqo+5oKoIW9sqoY40/cSYqOg2EFI/8pM01K/L++5oUE/suzH8pJt19ezQ8vNzf80ZfYuKbdGXr7ohI4w7+W0XvRR7GPw5TtsFGMh1ljFc2TS19Wp1Y1R8WkrPSBXKThptdmxZiMZHcSEhC/WAVfhwwcr7SgX+X40luZpeU04PtXvblyhQF/Vsipjjo8ahkBNuMvMzoEu2zdNNvX1KOr35j19ah76bT5CCXUPWWAnKE0fTiaUsooh6RfbKHelRxKnikgFYzB6HsX2YCM9SJNMSz/ssqC65lv/Nj4Uuu0I9mQUnmpKcdU7ILs0tj7zoyKjbVtwuWfCX+/94Sk+OeeUvayNj1EzzGdv7teY9ia8sHYh77OauEECO/xb50l7aRsh7yiJmnvfG/C9dZ/Dohrnh2tKNkLj62dEZufNYms+xIHPOJEGIm8Nu+p8/NrM2ozWX8xuIBPD5hBkHeJqaBPg2BAV2BAap6N+TkBfjlZa3lFAQEZRVBaGPeJTDa9FKrpVTDqUtFAkFYZ/8Es3NeFmJnz1y5JX8NWDfZHZVMQ1FpxC7v+5bDQJfB6aBkGo4ipXRGgI3lECSecFA2DkWl+lJs7ayfQ+JVByVjIiqHQqlwsZ6cv50bQmqFs+U44MppDNzcTU08Xcx4DVxdzc3c3AzhNC+SmMQXyc4XlQTMXu2zkGVMRpKQZChztf9XC2d/bUXwp8PQfa0Tld52Z9mL/U77/zx1HsPQEtwS1xLSQoc5xfXFKYaLvdSFx62CPIJ59CAkLC4MpFsS5LPlYWTu2FLT9tHnTzzqJLnygwU8/RycnM0XSAv1Ko2WUQhjE8Su9mzSeT5JKQc+HL7Q0N3ZbHdZEjBzlLlngRRjHMHL0cV8kbT46iml1KdRxEuEMJrPJpQ6HKgfYi0ferUX0wUKZdmNSQn59VCcXJ7XmJCUXY8UFGB74qPRra19CVHoNsCNDMfvAs3LzhHOtYW1fhg7f0xp0M7SWQZwjxBIXYwyO7JVVStzSjUsmRgQXJwSE1AVgrF9mM76elklVQVpdTVVlTrguZFrzMYI54dKhxF8Y1L8vItyoxKqKrOFflz46uUOuVPolSssPMdp696WUtcIvnMXKp40pVaZpg1GBBC/j6+vaLz42KnYn7Uv2klOxfL31Tv42mf5hISqKoiDwupi0rdVxYRF7oqF4k2b8OHmOv/1LY/vTvvDtz33k7HzTYwLDSgrDo/Lr0Cl7/5RIvvag6xIq8BC80t3JHU0NCUl7urIy6qow/BDX2R/8eCH/sKLD/7dvqB0/Tw9bdbyF/8BbA7/B8ACfv5RXi4s/FISFuuq3TPy/xld+aEw/7/MKFgNXAXhBB65quZ3mSNchXEMzjWjNmffEVy77YdFatbn0cri6o3s6doSBL/VEMh8d5R8AGqv7OXj7Ca4f4GMTaYvg+n0kAfMWAUnGXGbq5WubLETFC6/WIYgF1AL8uFFVasHdK2u0/W6QTfiIbHA5gvygmuF4A/RnOkT3Way54spBkO81cmv3dOk0ApZXJgOiMn5By5dK/gTcmD6RLyZLGPEyQCumQpztelDxEyeZUacZg8r6CL+WCHfqB23tFDzijCT7c2n2ArJAFtxcrcVQzi4EqKJ6RNUM9nAiJOvVkoJxLqiODYDRAJrtvBsknxFNpJyCU2M1VykPk3yDYNVohi3tQoHgVZp6OZCZDnjOkFDskq4nijcegh9PuvE5JKvQ50g+jd1bdeqZ1sdixjTOjCv6diLvkJ1nJdYR4410sawNoJ+zUjOShINpFgzFZyEmXM6HtqB8mpjAeduDMj/r/PZkuf+D7hl/haureDS0u+otzR8X3bZVuu5csq/2umBcedopEW8gHvF349HyjOhk4pHKvnj+bNyaIF8NLGTbM6MmQDumb/1qAmimZ+PBplWJmXh6LqSU9bIxFQDfVc/Ooi7qETTFD9xKpmamfyj8OaZZEJ1OAXGegvRs0KesdMf8OOk8lvar+fGgFrQByzkYE7awz8Q118VeWAeDX/e4QBmRp+xoE2+m7GMlofvvD/oaG9B4fka2H8Se6HrFqJLTH+wgH5KKNfdqN0JIDb2+w0mUSZMl/ar/dZgRnxZN8SfnmUeAnHhOHQfyB3h9xrb8lTF+40BiaA+G/tMsBstPAFki2qMQUS/5tcNCQScSy8XOQVfxRiEALnJ2ldCUowtWCR/bx1fBoCnf+puD8A7of3bP+v8X7X5l3kBy6EAAiwuW1oFsPzgUpZe2gHEfVPfVyJbQ+Pfi3eaa0BJkhD7gF+HchvzHPsXu7Bjn49F5zN8RXCq42hEmtMpgjdPSik1+KfGC9Rhhjki5BGFOh7P2jY+iolml5qNctvK6etiatjdxQ1O45ZT/UftEOE3bqvtRDIu1wZeAkdbRF7T2U5EBo1LadSY/qpN8LQwvoPx7dm69oGa7qbVQwQGv8Rx1KnFcVKDBsR6FEuP0M8z0krZRXo2dGVIpgrQZACxNubaIRKbn2lHsmgpZjlM0jyXZTtIjE+SYmfuBjMu9EnBAg0J7SSxU5jouEQW2Q64r7UQXTsi1rKzExqu1A+X6jlOatkw28nEF02OfXiKPKIS2pJjVzEZbbh3ISyxJ723GZchu0mFSaVLr173282DSdX1rOok5z8RfYdVfiCXH0hnhKAmyqsd8skpPf7wplGBVT7cT4/7Y57eJEJrEuNezyksAufPrcCIunfeVFXdJ2HqpdFkoZ1KqYlMukBm/Ja/KOWwUGBVA2qzUUANCRoyyqbbUiKXJc7FH9nO5zSHfEcye4+oFvHDWEbe54KHMapyEvmBaIey6DQ17eZMJ5Ccps8yPphAoIU0opigjziaqITS2h0IHAZOJg0ztFwK+wTcwrzSCwDrvIzxyBPmHfMMp0JDJH6JwCfgTFgBHAL+5BPz43dD42VNaMz8iDuhIZIjIvBGKEtHgB+QcNKFyZXG6iChNoVd1bfMfWhI0wE4A1wvQzAyX4bCzEmN3qWmgWUYfPyXYZ1S1F1muqjkufMQgMCRPQfeuAniJ9At5KbEXeAZLuxWVeHGxnWjrMG7WLQ1mFfOaLe47BD4atnWdUN2Z13y3lDgbc+HC6sgr7+IwIsjc7PHX98u5CYJ6wVv6hZ2bQUWvb15EHej0/q5rrPikXjbcGDnOhsJmr8hO7LRvBu4V/sNalTIU6RBh6Jrts38i4GTzfts3QMAAAA=", "headers": [ [ "content-type", "font/woff2" ] ], "ok": true, "status": 200, "status_text": "" }, "https://localhost:6006/icon_bundle.svg": { "data": "PD94bWwgdmVyc2lvbj0iMS4wIiA/Pjxzdmc+PGRlZnM+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBpZD0iYXJyb3dfZG93bndhcmRfMjRweCI+PHBhdGggZmlsbD0iIzAxMDEwMSIgZD0iTTIwIDEybC0xLjQxLTEuNDFMMTMgMTYuMTdWNGgtMnYxMi4xN2wtNS41OC01LjU5TDQgMTJsOCA4IDgtOHoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGlkPSJhcnJvd191cHdhcmRfMjRweCI+PHBhdGggZD0iTTQgMTJsMS40MSAxLjQxTDExIDcuODNWMjBoMlY3LjgzbDUuNTggNS41OUwyMCAxMmwtOC04LTggOHoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjQiIGlkPSJicmlnaHRuZXNzXzZfMjRweCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0yMCAxNS4zMUwyMy4zMSAxMiAyMCA4LjY5VjRoLTQuNjlMMTIgLjY5IDguNjkgNEg0djQuNjlMLjY5IDEyIDQgMTUuMzFWMjBoNC42OUwxMiAyMy4zMSAxNS4zMSAyMEgyMHYtNC42OXpNMTIgMThWNmMzLjMxIDAgNiAyLjY5IDYgNnMtMi42OSA2LTYgNnoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjQiIGlkPSJidWdfcmVwb3J0XzI0cHgiPjxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz48cGF0aCBkPSJNMjAgOGgtMi44MWMtLjQ1LS43OC0xLjA3LTEuNDUtMS44Mi0xLjk2TDE3IDQuNDEgMTUuNTkgM2wtMi4xNyAyLjE3QzEyLjk2IDUuMDYgMTIuNDkgNSAxMiA1Yy0uNDkgMC0uOTYuMDYtMS40MS4xN0w4LjQxIDMgNyA0LjQxbDEuNjIgMS42M0M3Ljg4IDYuNTUgNy4yNiA3LjIyIDYuODEgOEg0djJoMi4wOWMtLjA1LjMzLS4wOS42Ni0uMDkgMXYxSDR2MmgydjFjMCAuMzQuMDQuNjcuMDkgMUg0djJoMi44MWMxLjA0IDEuNzkgMi45NyAzIDUuMTkgM3M0LjE1LTEuMjEgNS4xOS0zSDIwdi0yaC0yLjA5Yy4wNS0uMzMuMDktLjY2LjA5LTF2LTFoMnYtMmgtMnYtMWMwLS4zNC0uMDQtLjY3LS4wOS0xSDIwVjh6bS02IDhoLTR2LTJoNHYyem0wLTRoLTR2LTJoNHYyeiIvPjwvc3ZnPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgaWQ9ImNhbmNlbF8yNHB4Ij48cGF0aCBkPSJNMTIgMkM2LjQ3IDIgMiA2LjQ3IDIgMTJzNC40NyAxMCAxMCAxMCAxMC00LjQ3IDEwLTEwUzE3LjUzIDIgMTIgMnptNSAxMy41OUwxNS41OSAxNyAxMiAxMy40MSA4LjQxIDE3IDcgMTUuNTkgMTAuNTkgMTIgNyA4LjQxIDguNDEgNyAxMiAxMC41OSAxNS41OSA3IDE3IDguNDEgMTMuNDEgMTIgMTcgMTUuNTl6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBpZD0iY2hldnJvbl9sZWZ0XzI0cHgiPjxwYXRoIGQ9Ik0xNS40MSA3LjQxTDE0IDZsLTYgNiA2IDYgMS40MS0xLjQxTDEwLjgzIDEyeiIvPjwvc3ZnPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgaWQ9ImNoZXZyb25fcmlnaHRfMjRweCI+PHBhdGggZD0iTTEwIDZMOC41OSA3LjQxIDEzLjE3IDEybC00LjU4IDQuNTlMMTAgMThsNi02eiIvPjwvc3ZnPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgaWQ9ImNsZWFyXzI0cHgiPjxwYXRoIGQ9Ik0xOSA2LjQxTDE3LjU5IDUgMTIgMTAuNTkgNi40MSA1IDUgNi40MSAxMC41OSAxMiA1IDE3LjU5IDYuNDEgMTkgMTIgMTMuNDEgMTcuNTkgMTkgMTkgMTcuNTkgMTMuNDEgMTJ6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBpZD0iY2xvc2VfMjRweCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xOSA2LjQxTDE3LjU5IDUgMTIgMTAuNTkgNi40MSA1IDUgNi40MSAxMC41OSAxMiA1IDE3LjU5IDYuNDEgMTkgMTIgMTMuNDEgMTcuNTkgMTkgMTkgMTcuNTkgMTMuNDEgMTJ6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBpZD0iY29udGVudF9jb3B5XzI0cHgiPjxwYXRoIGQ9Ik0xNiAxSDRjLTEuMSAwLTIgLjktMiAydjE0aDJWM2gxMlYxem0zIDRIOGMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxMWMxLjEgMCAyLS45IDItMlY3YzAtMS4xLS45LTItMi0yem0wIDE2SDhWN2gxMXYxNHoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMjQgMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBpZD0iZGFya19tb2RlXzI0cHgiPjxyZWN0IGZpbGw9Im5vbmUiIGhlaWdodD0iMjQiIHdpZHRoPSIyNCIvPjxwYXRoIGQ9Ik0xMiwzYy00Ljk3LDAtOSw0LjAzLTksOXM0LjAzLDksOSw5czktNC4wMyw5LTljMC0wLjQ2LTAuMDQtMC45Mi0wLjEtMS4zNmMtMC45OCwxLjM3LTIuNTgsMi4yNi00LjQsMi4yNiBjLTIuOTgsMC01LjQtMi40Mi01LjQtNS40YzAtMS44MSwwLjg5LTMuNDIsMi4yNi00LjRDMTIuOTIsMy4wNCwxMi40NiwzLDEyLDNMMTIsM3oiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGlkPSJkb25lXzI0cHgiPjxwYXRoIGQ9Ik05IDE2LjJMNC44IDEybC0xLjQgMS40TDkgMTkgMjEgN2wtMS40LTEuNEw5IDE2LjJ6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBpZD0iZHJhZ19pbmRpY2F0b3JfMjRweCI+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTExIDE4YzAgMS4xLS45IDItMiAycy0yLS45LTItMiAuOS0yIDItMiAyIC45IDIgMnptLTItOGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTAtNmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTYgNGMxLjEgMCAyLS45IDItMnMtLjktMi0yLTItMiAuOS0yIDIgLjkgMiAyIDJ6bTAgMmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTAgNmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBpZD0iZWRpdF8yNHB4Ij48cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTMgMTcuMjVWMjFoMy43NUwxNy44MSA5Ljk0bC0zLjc1LTMuNzVMMyAxNy4yNXpNMjAuNzEgNy4wNGMuMzktLjM5LjM5LTEuMDIgMC0xLjQxbC0yLjM0LTIuMzRjLS4zOS0uMzktMS4wMi0uMzktMS40MSAwbC0xLjgzIDEuODMgMy43NSAzLjc1IDEuODMtMS44M3oiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGlkPSJlcnJvcl8yNHB4Ij48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMSAxNWgtMnYtMmgydjJ6bTAtNGgtMlY3aDJ2NnoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGlkPSJleHBhbmRfbGVzc18yNHB4Ij48cGF0aCBkPSJNMTIgOGwtNiA2IDEuNDEgMS40MUwxMiAxMC44M2w0LjU5IDQuNThMMTggMTR6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBpZD0iZXhwYW5kX21vcmVfMjRweCI+PHBhdGggZD0iTTE2LjU5IDguNTlMMTIgMTMuMTcgNy40MSA4LjU5IDYgMTBsNiA2IDYtNnoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMjQgMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBpZD0iZmlsdGVyX2FsdF8yNHB4Ij48Zz48cGF0aCBkPSJNMCwwaDI0IE0yNCwyNEgwIiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTQuMjUsNS42MUM2LjI3LDguMiwxMCwxMywxMCwxM3Y2YzAsMC41NSwwLjQ1LDEsMSwxaDJjMC41NSwwLDEtMC40NSwxLTF2LTZjMCwwLDMuNzItNC44LDUuNzQtNy4zOSBDMjAuMjUsNC45NSwxOS43OCw0LDE4Ljk1LDRINS4wNEM0LjIxLDQsMy43NCw0Ljk1LDQuMjUsNS42MXoiLz48cGF0aCBkPSJNMCwwaDI0djI0SDBWMHoiIGZpbGw9Im5vbmUiLz48L2c+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBpZD0iZmxhZ18yNHB4Ij48cGF0aCBkPSJNMTQuNCA2TDE0IDRINXYxN2gydi03aDUuNmwuNCAyaDdWNnoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjQiIGlkPSJmdWxsc2NyZWVuXzI0cHgiPjxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz48cGF0aCBkPSJNNyAxNEg1djVoNXYtMkg3di0zem0tMi00aDJWN2gzVjVINXY1em0xMiA3aC0zdjJoNXYtNWgtMnYzek0xNCA1djJoM3YzaDJWNWgtNXoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjQiIGlkPSJmdWxsc2NyZWVuX2V4aXRfMjRweCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik01IDE2aDN2M2gydi01SDV2MnptMy04SDV2Mmg1VjVIOHYzem02IDExaDJ2LTNoM3YtMmgtNXY1em0yLTExVjVoLTJ2NWg1VjhoLTN6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBpZD0iZ2V0X2FwcF8yNHB4Ij48cGF0aCBkPSJNMTkgOWgtNFYzSDl2Nkg1bDcgNyA3LTd6TTUgMTh2MmgxNHYtMkg1eiIvPjwvc3ZnPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgaWQ9Imdyb3VwX3dvcmtfMjRweCI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6TTggMTcuNWMtMS4zOCAwLTIuNS0xLjEyLTIuNS0yLjVzMS4xMi0yLjUgMi41LTIuNSAyLjUgMS4xMiAyLjUgMi41LTEuMTIgMi41LTIuNSAyLjV6TTkuNSA4YzAtMS4zOCAxLjEyLTIuNSAyLjUtMi41czIuNSAxLjEyIDIuNSAyLjUtMS4xMiAyLjUtMi41IDIuNVM5LjUgOS4zOCA5LjUgOHptNi41IDkuNWMtMS4zOCAwLTIuNS0xLjEyLTIuNS0yLjVzMS4xMi0yLjUgMi41LTIuNSAyLjUgMS4xMiAyLjUgMi41LTEuMTIgMi41LTIuNSAyLjV6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBpZD0iaGVscF9vdXRsaW5lXzI0cHgiPjxwYXRoIGQ9Ik0xMSAxOGgydi0yaC0ydjJ6bTEtMTZDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4em0wLTE0Yy0yLjIxIDAtNCAxLjc5LTQgNGgyYzAtMS4xLjktMiAyLTJzMiAuOSAyIDJjMCAyLTMgMS43NS0zIDVoMmMwLTIuMjUgMy0yLjUgMy01IDAtMi4yMS0xLjc5LTQtNC00eiIvPjwvc3ZnPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgaWQ9ImltYWdlX3NlYXJjaF8yNHB4Ij48cGF0aCBkPSJNMCAwaDI0djI0SDB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTAgMGgyNHYyNEgwVjB6IiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTE4IDEzdjdINFY2aDUuMDJjLjA1LS43MS4yMi0xLjM4LjQ4LTJINGMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMnYtNWwtMi0yem0tMS41IDVoLTExbDIuNzUtMy41MyAxLjk2IDIuMzYgMi43NS0zLjU0em0yLjgtOS4xMWMuNDQtLjcuNy0xLjUxLjctMi4zOUMyMCA0LjAxIDE3Ljk5IDIgMTUuNSAyUzExIDQuMDEgMTEgNi41czIuMDEgNC41IDQuNDkgNC41Yy44OCAwIDEuNy0uMjYgMi4zOS0uN0wyMSAxMy40MiAyMi40MiAxMiAxOS4zIDguODl6TTE1LjUgOUMxNC4xMiA5IDEzIDcuODggMTMgNi41UzE0LjEyIDQgMTUuNSA0IDE4IDUuMTIgMTggNi41IDE2Ljg4IDkgMTUuNSA5eiIvPjwvc3ZnPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgaWQ9ImluZm9fb3V0bGluZV8yNHB4Ij48cGF0aCBkPSJNMTEgMTdoMnYtNmgtMnY2em0xLTE1QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHpNMTEgOWgyVjdoLTJ2MnoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMjQgMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBpZD0ia2VlcF8yNHB4Ij48Zz48cmVjdCBmaWxsPSJub25lIiBoZWlnaHQ9IjI0IiB3aWR0aD0iMjQiLz48L2c+PGc+PHBhdGggZD0iTTE2LDlWNGwxLDBjMC41NSwwLDEtMC40NSwxLTF2MGMwLTAuNTUtMC40NS0xLTEtMUg3QzYuNDUsMiw2LDIuNDUsNiwzdjAgYzAsMC41NSwwLjQ1LDEsMSwxbDEsMHY1YzAsMS42Ni0xLjM0LDMtMywzaDB2Mmg1Ljk3djdsMSwxbDEtMXYtN0gxOXYtMmgwQzE3LjM0LDEyLDE2LDEwLjY2LDE2LDl6IiBmaWxsLXJ1bGU9ImV2ZW5vZGQiLz48L2c+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgaWQ9ImtlZXBfb3V0bGluZV8yNHB4Ij48Zz48cmVjdCBmaWxsPSJub25lIiBoZWlnaHQ9IjI0IiB3aWR0aD0iMjQiLz48L2c+PGc+PHBhdGggZD0iTTE0LDR2NWMwLDEuMTIsMC4zNywyLjE2LDEsM0g5YzAuNjUtMC44NiwxLTEuOSwxLTNWNEgxNCBNMTcsMkg3QzYuNDUsMiw2LDIuNDUsNiwzYzAsMC41NSwwLjQ1LDEsMSwxYzAsMCwwLDAsMCwwbDEsMHY1IGMwLDEuNjYtMS4zNCwzLTMsM3YyaDUuOTd2N2wxLDFsMS0xdi03SDE5di0yYzAsMCwwLDAsMCwwYy0xLjY2LDAtMy0xLjM0LTMtM1Y0bDEsMGMwLDAsMCwwLDAsMGMwLjU1LDAsMS0wLjQ1LDEtMSBDMTgsMi40NSwxNy41NSwyLDE3LDJMMTcsMnoiLz48L2c+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgaWQ9ImxpZ2h0X21vZGVfMjRweCI+PHJlY3QgZmlsbD0ibm9uZSIgaGVpZ2h0PSIyNCIgd2lkdGg9IjI0Ii8+PHBhdGggZD0iTTEyLDdjLTIuNzYsMC01LDIuMjQtNSw1czIuMjQsNSw1LDVzNS0yLjI0LDUtNVMxNC43Niw3LDEyLDdMMTIsN3ogTTIsMTNsMiwwYzAuNTUsMCwxLTAuNDUsMS0xcy0wLjQ1LTEtMS0xbC0yLDAgYy0wLjU1LDAtMSwwLjQ1LTEsMVMxLjQ1LDEzLDIsMTN6IE0yMCwxM2wyLDBjMC41NSwwLDEtMC40NSwxLTFzLTAuNDUtMS0xLTFsLTIsMGMtMC41NSwwLTEsMC40NS0xLDFTMTkuNDUsMTMsMjAsMTN6IE0xMSwydjIgYzAsMC41NSwwLjQ1LDEsMSwxczEtMC40NSwxLTFWMmMwLTAuNTUtMC40NS0xLTEtMVMxMSwxLjQ1LDExLDJ6IE0xMSwyMHYyYzAsMC41NSwwLjQ1LDEsMSwxczEtMC40NSwxLTF2LTJjMC0wLjU1LTAuNDUtMS0xLTEgQzExLjQ1LDE5LDExLDE5LjQ1LDExLDIweiBNNS45OSw0LjU4Yy0wLjM5LTAuMzktMS4wMy0wLjM5LTEuNDEsMGMtMC4zOSwwLjM5LTAuMzksMS4wMywwLDEuNDFsMS4wNiwxLjA2IGMwLjM5LDAuMzksMS4wMywwLjM5LDEuNDEsMHMwLjM5LTEuMDMsMC0xLjQxTDUuOTksNC41OHogTTE4LjM2LDE2Ljk1Yy0wLjM5LTAuMzktMS4wMy0wLjM5LTEuNDEsMGMtMC4zOSwwLjM5LTAuMzksMS4wMywwLDEuNDEgbDEuMDYsMS4wNmMwLjM5LDAuMzksMS4wMywwLjM5LDEuNDEsMGMwLjM5LTAuMzksMC4zOS0xLjAzLDAtMS40MUwxOC4zNiwxNi45NXogTTE5LjQyLDUuOTljMC4zOS0wLjM5LDAuMzktMS4wMywwLTEuNDEgYy0wLjM5LTAuMzktMS4wMy0wLjM5LTEuNDEsMGwtMS4wNiwxLjA2Yy0wLjM5LDAuMzktMC4zOSwxLjAzLDAsMS40MXMxLjAzLDAuMzksMS40MSwwTDE5LjQyLDUuOTl6IE03LjA1LDE4LjM2IGMwLjM5LTAuMzksMC4zOS0xLjAzLDAtMS40MWMtMC4zOS0wLjM5LTEuMDMtMC4zOS0xLjQxLDBsLTEuMDYsMS4wNmMtMC4zOSwwLjM5LTAuMzksMS4wMywwLDEuNDFzMS4wMywwLjM5LDEuNDEsMEw3LjA1LDE4LjM2eiIvPjwvc3ZnPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBlbmFibGUtYmFja2dyb3VuZD0ibmV3IDAgMCAyNCAyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjQiIGlkPSJsaW5lX3dlaWdodF8yNHB4Ij48Zz48cmVjdCBmaWxsPSJub25lIiBoZWlnaHQ9IjI0IiB3aWR0aD0iMjQiIHg9IjAiLz48L2c+PGc+PGc+PGc+PHBhdGggZD0iTTMsMTdoMTh2LTJIM1YxN3ogTTMsMjBoMTh2LTFIM1YyMHogTTMsMTNoMTh2LTNIM1YxM3ogTTMsNHY0aDE4VjRIM3oiLz48L2c+PC9nPjwvZz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjQiIGlkPSJtb3JlX3ZlcnRfMjRweCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xMiA4YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMi0yIC45LTIgMiAuOSAyIDIgMnptMCAyYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptMCA2Yy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjQiIGlkPSJub3RpZmljYXRpb25zX25vbmVfMjRweCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xMiAyMmMxLjEgMCAyLS45IDItMmgtNGMwIDEuMS45IDIgMiAyem02LTZ2LTVjMC0zLjA3LTEuNjMtNS42NC00LjUtNi4zMlY0YzAtLjgzLS42Ny0xLjUtMS41LTEuNXMtMS41LjY3LTEuNSAxLjV2LjY4QzcuNjQgNS4zNiA2IDcuOTIgNiAxMXY1bC0yIDJ2MWgxNnYtMWwtMi0yem0tMiAxSDh2LTZjMC0yLjQ4IDEuNTEtNC41IDQtNC41czQgMi4wMiA0IDQuNXY2eiIvPjwvc3ZnPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgaWQ9InBhbGV0dGVfMjRweCI+PHBhdGggZD0iTTEyIDNjLTQuOTcgMC05IDQuMDMtOSA5czQuMDMgOSA5IDljLjgzIDAgMS41LS42NyAxLjUtMS41IDAtLjM5LS4xNS0uNzQtLjM5LTEuMDEtLjIzLS4yNi0uMzgtLjYxLS4zOC0uOTkgMC0uODMuNjctMS41IDEuNS0xLjVIMTZjMi43NiAwIDUtMi4yNCA1LTUgMC00LjQyLTQuMDMtOC05LTh6bS01LjUgOWMtLjgzIDAtMS41LS42Ny0xLjUtMS41UzUuNjcgOSA2LjUgOSA4IDkuNjcgOCAxMC41IDcuMzMgMTIgNi41IDEyem0zLTRDOC42NyA4IDggNy4zMyA4IDYuNVM4LjY3IDUgOS41IDVzMS41LjY3IDEuNSAxLjVTMTAuMzMgOCA5LjUgOHptNSAwYy0uODMgMC0xLjUtLjY3LTEuNS0xLjVTMTMuNjcgNSAxNC41IDVzMS41LjY3IDEuNSAxLjVTMTUuMzMgOCAxNC41IDh6bTMgNGMtLjgzIDAtMS41LS42Ny0xLjUtMS41UzE2LjY3IDkgMTcuNSA5czEuNS42NyAxLjUgMS41LS42NyAxLjUtMS41IDEuNXoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGlkPSJyZWZyZXNoXzI0cHgiPjxwYXRoIGQ9Ik0xNy42NSA2LjM1QzE2LjIgNC45IDE0LjIxIDQgMTIgNGMtNC40MiAwLTcuOTkgMy41OC03Ljk5IDhzMy41NyA4IDcuOTkgOGMzLjczIDAgNi44NC0yLjU1IDcuNzMtNmgtMi4wOGMtLjgyIDIuMzMtMy4wNCA0LTUuNjUgNC0zLjMxIDAtNi0yLjY5LTYtNnMyLjY5LTYgNi02YzEuNjYgMCAzLjE0LjY5IDQuMjIgMS43OEwxMyAxMWg3VjRsLTIuMzUgMi4zNXoiLz48L3N2Zz48c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIGlkPSJzZWFyY2hfMjRweCI+PHBhdGggZD0iTTE1LjUgMTRoLS43OWwtLjI4LS4yN0MxNS40MSAxMi41OSAxNiAxMS4xMSAxNiA5LjUgMTYgNS45MSAxMy4wOSAzIDkuNSAzUzMgNS45MSAzIDkuNSA1LjkxIDE2IDkuNSAxNmMxLjYxIDAgMy4wOS0uNTkgNC4yMy0xLjU3bC4yNy4yOHYuNzlsNSA0Ljk5TDIwLjQ5IDE5bC00Ljk5LTV6bS02IDBDNy4wMSAxNCA1IDExLjk5IDUgOS41UzcuMDEgNSA5LjUgNSAxNCA3LjAxIDE0IDkuNSAxMS45OSAxNCA5LjUgMTR6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBpZD0ic2V0dGluZ3NfMjRweCI+PHBhdGggZD0iTTE5LjQzIDEyLjk4Yy4wNC0uMzIuMDctLjY0LjA3LS45OHMtLjAzLS42Ni0uMDctLjk4bDIuMTEtMS42NWMuMTktLjE1LjI0LS40Mi4xMi0uNjRsLTItMy40NmMtLjEyLS4yMi0uMzktLjMtLjYxLS4yMmwtMi40OSAxYy0uNTItLjQtMS4wOC0uNzMtMS42OS0uOThsLS4zOC0yLjY1QzE0LjQ2IDIuMTggMTQuMjUgMiAxNCAyaC00Yy0uMjUgMC0uNDYuMTgtLjQ5LjQybC0uMzggMi42NWMtLjYxLjI1LTEuMTcuNTktMS42OS45OGwtMi40OS0xYy0uMjMtLjA5LS40OSAwLS42MS4yMmwtMiAzLjQ2Yy0uMTMuMjItLjA3LjQ5LjEyLjY0bDIuMTEgMS42NWMtLjA0LjMyLS4wNy42NS0uMDcuOThzLjAzLjY2LjA3Ljk4bC0yLjExIDEuNjVjLS4xOS4xNS0uMjQuNDItLjEyLjY0bDIgMy40NmMuMTIuMjIuMzkuMy42MS4yMmwyLjQ5LTFjLjUyLjQgMS4wOC43MyAxLjY5Ljk4bC4zOCAyLjY1Yy4wMy4yNC4yNC40Mi40OS40Mmg0Yy4yNSAwIC40Ni0uMTguNDktLjQybC4zOC0yLjY1Yy42MS0uMjUgMS4xNy0uNTkgMS42OS0uOThsMi40OSAxYy4yMy4wOS40OSAwIC42MS0uMjJsMi0zLjQ2Yy4xMi0uMjIuMDctLjQ5LS4xMi0uNjRsLTIuMTEtMS42NXpNMTIgMTUuNWMtMS45MyAwLTMuNS0xLjU3LTMuNS0zLjVzMS41Ny0zLjUgMy41LTMuNSAzLjUgMS41NyAzLjUgMy41LTEuNTcgMy41LTMuNSAzLjV6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBpZD0ic2V0dGluZ3NfYmFja3VwX3Jlc3RvcmVfMjRweCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xNCAxMmMwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDIgLjkgMiAyIDIgMi0uOSAyLTJ6bS0yLTljLTQuOTcgMC05IDQuMDMtOSA5SDBsNCA0IDQtNEg1YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS41MSAwLTIuOTEtLjQ5LTQuMDYtMS4zbC0xLjQyIDEuNDRDOC4wNCAyMC4zIDkuOTQgMjEgMTIgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0IiBpZD0ic2V0dGluZ3Nfb3ZlcnNjYW5fMjRweCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xMi4wMSA1LjVMMTAgOGg0bC0xLjk5LTIuNXpNMTggMTB2NGwyLjUtMS45OUwxOCAxMHpNNiAxMGwtMi41IDIuMDFMNiAxNHYtNHptOCA2aC00bDIuMDEgMi41TDE0IDE2em03LTEzSDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNi4wMUgzVjQuOTloMTh2MTQuMDJ6Ii8+PC9zdmc+PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBpZD0idmlzaWJpbGl0eV9vZmZfMjRweCI+PHBhdGggZD0iTTEyIDdjMi43NiAwIDUgMi4yNCA1IDUgMCAuNjUtLjEzIDEuMjYtLjM2IDEuODNsMi45MiAyLjkyYzEuNTEtMS4yNiAyLjctMi44OSAzLjQzLTQuNzUtMS43My00LjM5LTYtNy41LTExLTcuNS0xLjQgMC0yLjc0LjI1LTMuOTguN2wyLjE2IDIuMTZDMTAuNzQgNy4xMyAxMS4zNSA3IDEyIDd6TTIgNC4yN2wyLjI4IDIuMjguNDYuNDZDMy4wOCA4LjMgMS43OCAxMC4wMiAxIDEyYzEuNzMgNC4zOSA2IDcuNSAxMSA3LjUgMS41NSAwIDMuMDMtLjMgNC4zOC0uODRsLjQyLjQyTDE5LjczIDIyIDIxIDIwLjczIDMuMjcgMyAyIDQuMjd6TTcuNTMgOS44bDEuNTUgMS41NWMtLjA1LjIxLS4wOC40My0uMDguNjUgMCAxLjY2IDEuMzQgMyAzIDMgLjIyIDAgLjQ0LS4wMy42NS0uMDhsMS41NSAxLjU1Yy0uNjcuMzMtMS40MS41My0yLjIuNTMtMi43NiAwLTUtMi4yNC01LTUgMC0uNzkuMi0xLjUzLjUzLTIuMnptNC4zMS0uNzhsMy4xNSAzLjE1LjAyLS4xNmMwLTEuNjYtMS4zNC0zLTMtM2wtLjE3LjAxeiIvPjwvc3ZnPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCIgaWQ9Indhcm5pbmdfMjRweCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xIDIxaDIyTDEyIDIgMSAyMXptMTItM2gtMnYtMmgydjJ6bTAtNGgtMnYtNGgydjR6Ii8+PC9zdmc+PC9kZWZzPjwvc3ZnPgo=", "headers": [ [ "content-type", "image/svg+xml; charset=utf-8" ] ], "ok": true, "status": 200, "status_text": "" }, "https://localhost:6006/index.js?_file_hash=4a366cbe": { "data": "dmFyIENMT1NVUkVfTk9fREVQUyA9IHRydWU7CndpbmRvdy5wb2x5bWVyU2tpcExvYWRpbmdGb250Um9ib3RvID0gdHJ1ZTsKLyoqIHZpbTogZXQ6dHM9NDpzdz00OnN0cz00CiAqIEBsaWNlbnNlIFJlcXVpcmVKUyAyLjMuNiBDb3B5cmlnaHQgalF1ZXJ5IEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycy4KICogUmVsZWFzZWQgdW5kZXIgTUlUIGxpY2Vuc2UsIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXF1aXJlanMvcmVxdWlyZWpzL2Jsb2IvbWFzdGVyL0xJQ0VOU0UKICovCi8vTm90IHVzaW5nIHN0cmljdDogdW5ldmVuIHN0cmljdCBzdXBwb3J0IGluIGJyb3dzZXJzLCAjMzkyLCBhbmQgY2F1c2VzCi8vcHJvYmxlbXMgd2l0aCByZXF1aXJlanMuZXhlYygpL3RyYW5zcGlsZXIgcGx1Z2lucyB0aGF0IG1heSBub3QgYmUgc3RyaWN0LgovKmpzbGludCByZWdleHA6IHRydWUsIG5vbWVuOiB0cnVlLCBzbG9wcHk6IHRydWUgKi8KLypnbG9iYWwgd2luZG93LCBuYXZpZ2F0b3IsIGRvY3VtZW50LCBpbXBvcnRTY3JpcHRzLCBzZXRUaW1lb3V0LCBvcGVyYSAqLwoKdmFyIHJlcXVpcmVqcywgcmVxdWlyZSwgZGVmaW5lOwooZnVuY3Rpb24gKGdsb2JhbCwgc2V0VGltZW91dCkgewogICAgdmFyIHJlcSwgcywgaGVhZCwgYmFzZUVsZW1lbnQsIGRhdGFNYWluLCBzcmMsCiAgICAgICAgaW50ZXJhY3RpdmVTY3JpcHQsIGN1cnJlbnRseUFkZGluZ1NjcmlwdCwgbWFpblNjcmlwdCwgc3ViUGF0aCwKICAgICAgICB2ZXJzaW9uID0gJzIuMy42JywKICAgICAgICBjb21tZW50UmVnRXhwID0gL1wvXCpbXHNcU10qP1wqXC98KFteOiInPV18XilcL1wvLiokL21nLAogICAgICAgIGNqc1JlcXVpcmVSZWdFeHAgPSAvW14uXVxzKnJlcXVpcmVccypcKFxzKlsiJ10oW14nIlxzXSspWyInXVxzKlwpL2csCiAgICAgICAganNTdWZmaXhSZWdFeHAgPSAvXC5qcyQvLAogICAgICAgIGN1cnJEaXJSZWdFeHAgPSAvXlwuXC8vLAogICAgICAgIG9wID0gT2JqZWN0LnByb3RvdHlwZSwKICAgICAgICBvc3RyaW5nID0gb3AudG9TdHJpbmcsCiAgICAgICAgaGFzT3duID0gb3AuaGFzT3duUHJvcGVydHksCiAgICAgICAgaXNCcm93c2VyID0gISEodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93LmRvY3VtZW50KSwKICAgICAgICBpc1dlYldvcmtlciA9ICFpc0Jyb3dzZXIgJiYgdHlwZW9mIGltcG9ydFNjcmlwdHMgIT09ICd1bmRlZmluZWQnLAogICAgICAgIC8vUFMzIGluZGljYXRlcyBsb2FkZWQgYW5kIGNvbXBsZXRlLCBidXQgbmVlZCB0byB3YWl0IGZvciBjb21wbGV0ZQogICAgICAgIC8vc3BlY2lmaWNhbGx5LiBTZXF1ZW5jZSBpcyAnbG9hZGluZycsICdsb2FkZWQnLCBleGVjdXRpb24sCiAgICAgICAgLy8gdGhlbiAnY29tcGxldGUnLiBUaGUgVUEgY2hlY2sgaXMgdW5mb3J0dW5hdGUsIGJ1dCBub3Qgc3VyZSBob3cKICAgICAgICAvL3RvIGZlYXR1cmUgdGVzdCB3L28gY2F1c2luZyBwZXJmIGlzc3Vlcy4KICAgICAgICByZWFkeVJlZ0V4cCA9IGlzQnJvd3NlciAmJiBuYXZpZ2F0b3IucGxhdGZvcm0gPT09ICdQTEFZU1RBVElPTiAzJyA/CiAgICAgICAgICAgICAgICAgICAgICAvXmNvbXBsZXRlJC8gOiAvXihjb21wbGV0ZXxsb2FkZWQpJC8sCiAgICAgICAgZGVmQ29udGV4dE5hbWUgPSAnXycsCiAgICAgICAgLy9PaCB0aGUgdHJhZ2VkeSwgZGV0ZWN0aW5nIG9wZXJhLiBTZWUgdGhlIHVzYWdlIG9mIGlzT3BlcmEgZm9yIHJlYXNvbi4KICAgICAgICBpc09wZXJhID0gdHlwZW9mIG9wZXJhICE9PSAndW5kZWZpbmVkJyAmJiBvcGVyYS50b1N0cmluZygpID09PSAnW29iamVjdCBPcGVyYV0nLAogICAgICAgIGNvbnRleHRzID0ge30sCiAgICAgICAgY2ZnID0ge30sCiAgICAgICAgZ2xvYmFsRGVmUXVldWUgPSBbXSwKICAgICAgICB1c2VJbnRlcmFjdGl2ZSA9IGZhbHNlOwoKICAgIC8vQ291bGQgbWF0Y2ggc29tZXRoaW5nIGxpa2UgJykvL2NvbW1lbnQnLCBkbyBub3QgbG9zZSB0aGUgcHJlZml4IHRvIGNvbW1lbnQuCiAgICBmdW5jdGlvbiBjb21tZW50UmVwbGFjZShtYXRjaCwgc2luZ2xlUHJlZml4KSB7CiAgICAgICAgcmV0dXJuIHNpbmdsZVByZWZpeCB8fCAnJzsKICAgIH0KCiAgICBmdW5jdGlvbiBpc0Z1bmN0aW9uKGl0KSB7CiAgICAgICAgcmV0dXJuIG9zdHJpbmcuY2FsbChpdCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7CiAgICB9CgogICAgZnVuY3Rpb24gaXNBcnJheShpdCkgewogICAgICAgIHJldHVybiBvc3RyaW5nLmNhbGwoaXQpID09PSAnW29iamVjdCBBcnJheV0nOwogICAgfQoKICAgIC8qKgogICAgICogSGVscGVyIGZ1bmN0aW9uIGZvciBpdGVyYXRpbmcgb3ZlciBhbiBhcnJheS4gSWYgdGhlIGZ1bmMgcmV0dXJucwogICAgICogYSB0cnVlIHZhbHVlLCBpdCB3aWxsIGJyZWFrIG91dCBvZiB0aGUgbG9vcC4KICAgICAqLwogICAgZnVuY3Rpb24gZWFjaChhcnksIGZ1bmMpIHsKICAgICAgICBpZiAoYXJ5KSB7CiAgICAgICAgICAgIHZhciBpOwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJ5Lmxlbmd0aDsgaSArPSAxKSB7CiAgICAgICAgICAgICAgICBpZiAoYXJ5W2ldICYmIGZ1bmMoYXJ5W2ldLCBpLCBhcnkpKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gZm9yIGl0ZXJhdGluZyBvdmVyIGFuIGFycmF5IGJhY2t3YXJkcy4gSWYgdGhlIGZ1bmMKICAgICAqIHJldHVybnMgYSB0cnVlIHZhbHVlLCBpdCB3aWxsIGJyZWFrIG91dCBvZiB0aGUgbG9vcC4KICAgICAqLwogICAgZnVuY3Rpb24gZWFjaFJldmVyc2UoYXJ5LCBmdW5jKSB7CiAgICAgICAgaWYgKGFyeSkgewogICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgZm9yIChpID0gYXJ5Lmxlbmd0aCAtIDE7IGkgPiAtMTsgaSAtPSAxKSB7CiAgICAgICAgICAgICAgICBpZiAoYXJ5W2ldICYmIGZ1bmMoYXJ5W2ldLCBpLCBhcnkpKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gaGFzUHJvcChvYmosIHByb3ApIHsKICAgICAgICByZXR1cm4gaGFzT3duLmNhbGwob2JqLCBwcm9wKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRPd24ob2JqLCBwcm9wKSB7CiAgICAgICAgcmV0dXJuIGhhc1Byb3Aob2JqLCBwcm9wKSAmJiBvYmpbcHJvcF07CiAgICB9CgogICAgLyoqCiAgICAgKiBDeWNsZXMgb3ZlciBwcm9wZXJ0aWVzIGluIGFuIG9iamVjdCBhbmQgY2FsbHMgYSBmdW5jdGlvbiBmb3IgZWFjaAogICAgICogcHJvcGVydHkgdmFsdWUuIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgdHJ1dGh5IHZhbHVlLCB0aGVuIHRoZQogICAgICogaXRlcmF0aW9uIGlzIHN0b3BwZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVhY2hQcm9wKG9iaiwgZnVuYykgewogICAgICAgIHZhciBwcm9wOwogICAgICAgIGZvciAocHJvcCBpbiBvYmopIHsKICAgICAgICAgICAgaWYgKGhhc1Byb3Aob2JqLCBwcm9wKSkgewogICAgICAgICAgICAgICAgaWYgKGZ1bmMob2JqW3Byb3BdLCBwcm9wKSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogU2ltcGxlIGZ1bmN0aW9uIHRvIG1peCBpbiBwcm9wZXJ0aWVzIGZyb20gc291cmNlIGludG8gdGFyZ2V0LAogICAgICogYnV0IG9ubHkgaWYgdGFyZ2V0IGRvZXMgbm90IGFscmVhZHkgaGF2ZSBhIHByb3BlcnR5IG9mIHRoZSBzYW1lIG5hbWUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1peGluKHRhcmdldCwgc291cmNlLCBmb3JjZSwgZGVlcFN0cmluZ01peGluKSB7CiAgICAgICAgaWYgKHNvdXJjZSkgewogICAgICAgICAgICBlYWNoUHJvcChzb3VyY2UsIGZ1bmN0aW9uICh2YWx1ZSwgcHJvcCkgewogICAgICAgICAgICAgICAgaWYgKGZvcmNlIHx8ICFoYXNQcm9wKHRhcmdldCwgcHJvcCkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZGVlcFN0cmluZ01peGluICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIWlzQXJyYXkodmFsdWUpICYmICFpc0Z1bmN0aW9uKHZhbHVlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAhKHZhbHVlIGluc3RhbmNlb2YgUmVnRXhwKSkgewoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXRbcHJvcF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIG1peGluKHRhcmdldFtwcm9wXSwgdmFsdWUsIGZvcmNlLCBkZWVwU3RyaW5nTWl4aW4pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtwcm9wXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0YXJnZXQ7CiAgICB9CgogICAgLy9TaW1pbGFyIHRvIEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kLCBidXQgdGhlICd0aGlzJyBvYmplY3QgaXMgc3BlY2lmaWVkCiAgICAvL2ZpcnN0LCBzaW5jZSBpdCBpcyBlYXNpZXIgdG8gcmVhZC9maWd1cmUgb3V0IHdoYXQgJ3RoaXMnIHdpbGwgYmUuCiAgICBmdW5jdGlvbiBiaW5kKG9iaiwgZm4pIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkob2JqLCBhcmd1bWVudHMpOwogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2NyaXB0cygpIHsKICAgICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlZmF1bHRPbkVycm9yKGVycikgewogICAgICAgIHRocm93IGVycjsKICAgIH0KCiAgICAvL0FsbG93IGdldHRpbmcgYSBnbG9iYWwgdGhhdCBpcyBleHByZXNzZWQgaW4KICAgIC8vZG90IG5vdGF0aW9uLCBsaWtlICdhLmIuYycuCiAgICBmdW5jdGlvbiBnZXRHbG9iYWwodmFsdWUpIHsKICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9CiAgICAgICAgdmFyIGcgPSBnbG9iYWw7CiAgICAgICAgZWFjaCh2YWx1ZS5zcGxpdCgnLicpLCBmdW5jdGlvbiAocGFydCkgewogICAgICAgICAgICBnID0gZ1twYXJ0XTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gZzsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnN0cnVjdHMgYW4gZXJyb3Igd2l0aCBhIHBvaW50ZXIgdG8gYW4gVVJMIHdpdGggbW9yZSBpbmZvcm1hdGlvbi4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBpZCB0aGUgZXJyb3IgSUQgdGhhdCBtYXBzIHRvIGFuIElEIG9uIGEgd2ViIHBhZ2UuCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gbWVzc2FnZSBodW1hbiByZWFkYWJsZSBlcnJvci4KICAgICAqIEBwYXJhbSB7RXJyb3J9IFtlcnJdIHRoZSBvcmlnaW5hbCBlcnJvciwgaWYgdGhlcmUgaXMgb25lLgogICAgICoKICAgICAqIEByZXR1cm5zIHtFcnJvcn0KICAgICAqLwogICAgZnVuY3Rpb24gbWFrZUVycm9yKGlkLCBtc2csIGVyciwgcmVxdWlyZU1vZHVsZXMpIHsKICAgICAgICB2YXIgZSA9IG5ldyBFcnJvcihtc2cgKyAnXG5odHRwczovL3JlcXVpcmVqcy5vcmcvZG9jcy9lcnJvcnMuaHRtbCMnICsgaWQpOwogICAgICAgIGUucmVxdWlyZVR5cGUgPSBpZDsKICAgICAgICBlLnJlcXVpcmVNb2R1bGVzID0gcmVxdWlyZU1vZHVsZXM7CiAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICBlLm9yaWdpbmFsRXJyb3IgPSBlcnI7CiAgICAgICAgfQogICAgICAgIHJldHVybiBlOwogICAgfQoKICAgIGlmICh0eXBlb2YgZGVmaW5lICE9PSAndW5kZWZpbmVkJykgewogICAgICAgIC8vSWYgYSBkZWZpbmUgaXMgYWxyZWFkeSBpbiBwbGF5IHZpYSBhbm90aGVyIEFNRCBsb2FkZXIsCiAgICAgICAgLy9kbyBub3Qgb3ZlcndyaXRlLgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAodHlwZW9mIHJlcXVpcmVqcyAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICBpZiAoaXNGdW5jdGlvbihyZXF1aXJlanMpKSB7CiAgICAgICAgICAgIC8vRG8gbm90IG92ZXJ3cml0ZSBhbiBleGlzdGluZyByZXF1aXJlanMgaW5zdGFuY2UuCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY2ZnID0gcmVxdWlyZWpzOwogICAgICAgIHJlcXVpcmVqcyA9IHVuZGVmaW5lZDsKICAgIH0KCiAgICAvL0FsbG93IGZvciBhIHJlcXVpcmUgY29uZmlnIG9iamVjdAogICAgaWYgKHR5cGVvZiByZXF1aXJlICE9PSAndW5kZWZpbmVkJyAmJiAhaXNGdW5jdGlvbihyZXF1aXJlKSkgewogICAgICAgIC8vYXNzdW1lIGl0IGlzIGEgY29uZmlnIG9iamVjdC4KICAgICAgICBjZmcgPSByZXF1aXJlOwogICAgICAgIHJlcXVpcmUgPSB1bmRlZmluZWQ7CiAgICB9CgogICAgZnVuY3Rpb24gbmV3Q29udGV4dChjb250ZXh0TmFtZSkgewogICAgICAgIHZhciBpbkNoZWNrTG9hZGVkLCBNb2R1bGUsIGNvbnRleHQsIGhhbmRsZXJzLAogICAgICAgICAgICBjaGVja0xvYWRlZFRpbWVvdXRJZCwKICAgICAgICAgICAgY29uZmlnID0gewogICAgICAgICAgICAgICAgLy9EZWZhdWx0cy4gRG8gbm90IHNldCBhIGRlZmF1bHQgZm9yIG1hcAogICAgICAgICAgICAgICAgLy9jb25maWcgdG8gc3BlZWQgdXAgbm9ybWFsaXplKCksIHdoaWNoCiAgICAgICAgICAgICAgICAvL3dpbGwgcnVuIGZhc3RlciBpZiB0aGVyZSBpcyBubyBkZWZhdWx0LgogICAgICAgICAgICAgICAgd2FpdFNlY29uZHM6IDcsCiAgICAgICAgICAgICAgICBiYXNlVXJsOiAnLi8nLAogICAgICAgICAgICAgICAgcGF0aHM6IHt9LAogICAgICAgICAgICAgICAgYnVuZGxlczoge30sCiAgICAgICAgICAgICAgICBwa2dzOiB7fSwKICAgICAgICAgICAgICAgIHNoaW06IHt9LAogICAgICAgICAgICAgICAgY29uZmlnOiB7fQogICAgICAgICAgICB9LAogICAgICAgICAgICByZWdpc3RyeSA9IHt9LAogICAgICAgICAgICAvL3JlZ2lzdHJ5IG9mIGp1c3QgZW5hYmxlZCBtb2R1bGVzLCB0byBzcGVlZAogICAgICAgICAgICAvL2N5Y2xlIGJyZWFraW5nIGNvZGUgd2hlbiBsb3RzIG9mIG1vZHVsZXMKICAgICAgICAgICAgLy9hcmUgcmVnaXN0ZXJlZCwgYnV0IG5vdCBhY3RpdmF0ZWQuCiAgICAgICAgICAgIGVuYWJsZWRSZWdpc3RyeSA9IHt9LAogICAgICAgICAgICB1bmRlZkV2ZW50cyA9IHt9LAogICAgICAgICAgICBkZWZRdWV1ZSA9IFtdLAogICAgICAgICAgICBkZWZpbmVkID0ge30sCiAgICAgICAgICAgIHVybEZldGNoZWQgPSB7fSwKICAgICAgICAgICAgYnVuZGxlc01hcCA9IHt9LAogICAgICAgICAgICByZXF1aXJlQ291bnRlciA9IDEsCiAgICAgICAgICAgIHVubm9ybWFsaXplZENvdW50ZXIgPSAxOwoKICAgICAgICAvKioKICAgICAgICAgKiBUcmltcyB0aGUgLiBhbmQgLi4gZnJvbSBhbiBhcnJheSBvZiBwYXRoIHNlZ21lbnRzLgogICAgICAgICAqIEl0IHdpbGwga2VlcCBhIGxlYWRpbmcgcGF0aCBzZWdtZW50IGlmIGEgLi4gd2lsbCBiZWNvbWUKICAgICAgICAgKiB0aGUgZmlyc3QgcGF0aCBzZWdtZW50LCB0byBoZWxwIHdpdGggbW9kdWxlIG5hbWUgbG9va3VwcywKICAgICAgICAgKiB3aGljaCBhY3QgbGlrZSBwYXRocywgYnV0IGNhbiBiZSByZW1hcHBlZC4gQnV0IHRoZSBlbmQgcmVzdWx0LAogICAgICAgICAqIGFsbCBwYXRocyB0aGF0IHVzZSB0aGlzIGZ1bmN0aW9uIHNob3VsZCBsb29rIG5vcm1hbGl6ZWQuCiAgICAgICAgICogTk9URTogdGhpcyBtZXRob2QgTU9ESUZJRVMgdGhlIGlucHV0IGFycmF5LgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyeSB0aGUgYXJyYXkgb2YgcGF0aCBzZWdtZW50cy4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB0cmltRG90cyhhcnkpIHsKICAgICAgICAgICAgdmFyIGksIHBhcnQ7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhcnkubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHBhcnQgPSBhcnlbaV07CiAgICAgICAgICAgICAgICBpZiAocGFydCA9PT0gJy4nKSB7CiAgICAgICAgICAgICAgICAgICAgYXJ5LnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICAgICAgICBpIC09IDE7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnQgPT09ICcuLicpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZiBhdCB0aGUgc3RhcnQsIG9yIHByZXZpb3VzIHZhbHVlIGlzIHN0aWxsIC4uLAogICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgdGhlbSBzbyB0aGF0IHdoZW4gY29udmVydGVkIHRvIGEgcGF0aCBpdCBtYXkKICAgICAgICAgICAgICAgICAgICAvLyBzdGlsbCB3b3JrIHdoZW4gY29udmVydGVkIHRvIGEgcGF0aCwgZXZlbiB0aG91Z2gKICAgICAgICAgICAgICAgICAgICAvLyBhcyBhbiBJRCBpdCBpcyBsZXNzIHRoYW4gaWRlYWwuIEluIGxhcmdlciBwb2ludAogICAgICAgICAgICAgICAgICAgIC8vIHJlbGVhc2VzLCBtYXkgYmUgYmV0dGVyIHRvIGp1c3Qga2ljayBvdXQgYW4gZXJyb3IuCiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT09IDAgfHwgKGkgPT09IDEgJiYgYXJ5WzJdID09PSAnLi4nKSB8fCBhcnlbaSAtIDFdID09PSAnLi4nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXJ5LnNwbGljZShpIC0gMSwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgIGkgLT0gMjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEdpdmVuIGEgcmVsYXRpdmUgbW9kdWxlIG5hbWUsIGxpa2UgLi9zb21ldGhpbmcsIG5vcm1hbGl6ZSBpdCB0bwogICAgICAgICAqIGEgcmVhbCBuYW1lIHRoYXQgY2FuIGJlIG1hcHBlZCB0byBhIHBhdGguCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIHJlbGF0aXZlIG5hbWUKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gYmFzZU5hbWUgYSByZWFsIG5hbWUgdGhhdCB0aGUgbmFtZSBhcmcgaXMgcmVsYXRpdmUKICAgICAgICAgKiB0by4KICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGFwcGx5TWFwIGFwcGx5IHRoZSBtYXAgY29uZmlnIHRvIHRoZSB2YWx1ZS4gU2hvdWxkCiAgICAgICAgICogb25seSBiZSBkb25lIGlmIHRoaXMgbm9ybWFsaXphdGlvbiBpcyBmb3IgYSBkZXBlbmRlbmN5IElELgogICAgICAgICAqIEByZXR1cm5zIHtTdHJpbmd9IG5vcm1hbGl6ZWQgbmFtZQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZShuYW1lLCBiYXNlTmFtZSwgYXBwbHlNYXApIHsKICAgICAgICAgICAgdmFyIHBrZ01haW4sIG1hcFZhbHVlLCBuYW1lUGFydHMsIGksIGosIG5hbWVTZWdtZW50LCBsYXN0SW5kZXgsCiAgICAgICAgICAgICAgICBmb3VuZE1hcCwgZm91bmRJLCBmb3VuZFN0YXJNYXAsIHN0YXJJLCBub3JtYWxpemVkQmFzZVBhcnRzLAogICAgICAgICAgICAgICAgYmFzZVBhcnRzID0gKGJhc2VOYW1lICYmIGJhc2VOYW1lLnNwbGl0KCcvJykpLAogICAgICAgICAgICAgICAgbWFwID0gY29uZmlnLm1hcCwKICAgICAgICAgICAgICAgIHN0YXJNYXAgPSBtYXAgJiYgbWFwWycqJ107CgogICAgICAgICAgICAvL0FkanVzdCBhbnkgcmVsYXRpdmUgcGF0aHMuCiAgICAgICAgICAgIGlmIChuYW1lKSB7CiAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zcGxpdCgnLycpOwogICAgICAgICAgICAgICAgbGFzdEluZGV4ID0gbmFtZS5sZW5ndGggLSAxOwoKICAgICAgICAgICAgICAgIC8vIElmIHdhbnRpbmcgbm9kZSBJRCBjb21wYXRpYmlsaXR5LCBzdHJpcCAuanMgZnJvbSBlbmQKICAgICAgICAgICAgICAgIC8vIG9mIElEcy4gSGF2ZSB0byBkbyB0aGlzIGhlcmUsIGFuZCBub3QgaW4gbmFtZVRvVXJsCiAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIG5vZGUgYWxsb3dzIGVpdGhlciAuanMgb3Igbm9uIC5qcyB0byBtYXAKICAgICAgICAgICAgICAgIC8vIHRvIHNhbWUgZmlsZS4KICAgICAgICAgICAgICAgIGlmIChjb25maWcubm9kZUlkQ29tcGF0ICYmIGpzU3VmZml4UmVnRXhwLnRlc3QobmFtZVtsYXN0SW5kZXhdKSkgewogICAgICAgICAgICAgICAgICAgIG5hbWVbbGFzdEluZGV4XSA9IG5hbWVbbGFzdEluZGV4XS5yZXBsYWNlKGpzU3VmZml4UmVnRXhwLCAnJyk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gU3RhcnRzIHdpdGggYSAnLicgc28gbmVlZCB0aGUgYmFzZU5hbWUKICAgICAgICAgICAgICAgIGlmIChuYW1lWzBdLmNoYXJBdCgwKSA9PT0gJy4nICYmIGJhc2VQYXJ0cykgewogICAgICAgICAgICAgICAgICAgIC8vQ29udmVydCBiYXNlTmFtZSB0byBhcnJheSwgYW5kIGxvcCBvZmYgdGhlIGxhc3QgcGFydCwKICAgICAgICAgICAgICAgICAgICAvL3NvIHRoYXQgLiBtYXRjaGVzIHRoYXQgJ2RpcmVjdG9yeScgYW5kIG5vdCBuYW1lIG9mIHRoZSBiYXNlTmFtZSdzCiAgICAgICAgICAgICAgICAgICAgLy9tb2R1bGUuIEZvciBpbnN0YW5jZSwgYmFzZU5hbWUgb2YgJ29uZS90d28vdGhyZWUnLCBtYXBzIHRvCiAgICAgICAgICAgICAgICAgICAgLy8nb25lL3R3by90aHJlZS5qcycsIGJ1dCB3ZSB3YW50IHRoZSBkaXJlY3RvcnksICdvbmUvdHdvJyBmb3IKICAgICAgICAgICAgICAgICAgICAvL3RoaXMgbm9ybWFsaXphdGlvbi4KICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkQmFzZVBhcnRzID0gYmFzZVBhcnRzLnNsaWNlKDAsIGJhc2VQYXJ0cy5sZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgICAgICBuYW1lID0gbm9ybWFsaXplZEJhc2VQYXJ0cy5jb25jYXQobmFtZSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdHJpbURvdHMobmFtZSk7CiAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5qb2luKCcvJyk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vQXBwbHkgbWFwIGNvbmZpZyBpZiBhdmFpbGFibGUuCiAgICAgICAgICAgIGlmIChhcHBseU1hcCAmJiBtYXAgJiYgKGJhc2VQYXJ0cyB8fCBzdGFyTWFwKSkgewogICAgICAgICAgICAgICAgbmFtZVBhcnRzID0gbmFtZS5zcGxpdCgnLycpOwoKICAgICAgICAgICAgICAgIG91dGVyTG9vcDogZm9yIChpID0gbmFtZVBhcnRzLmxlbmd0aDsgaSA+IDA7IGkgLT0gMSkgewogICAgICAgICAgICAgICAgICAgIG5hbWVTZWdtZW50ID0gbmFtZVBhcnRzLnNsaWNlKDAsIGkpLmpvaW4oJy8nKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKGJhc2VQYXJ0cykgewogICAgICAgICAgICAgICAgICAgICAgICAvL0ZpbmQgdGhlIGxvbmdlc3QgYmFzZU5hbWUgc2VnbWVudCBtYXRjaCBpbiB0aGUgY29uZmlnLgogICAgICAgICAgICAgICAgICAgICAgICAvL1NvLCBkbyBqb2lucyBvbiB0aGUgYmlnZ2VzdCB0byBzbWFsbGVzdCBsZW5ndGhzIG9mIGJhc2VQYXJ0cy4KICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gYmFzZVBhcnRzLmxlbmd0aDsgaiA+IDA7IGogLT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwVmFsdWUgPSBnZXRPd24obWFwLCBiYXNlUGFydHMuc2xpY2UoMCwgaikuam9pbignLycpKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2Jhc2VOYW1lIHNlZ21lbnQgaGFzIGNvbmZpZywgZmluZCBpZiBpdCBoYXMgb25lIGZvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIG5hbWUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBWYWx1ZSA9IGdldE93bihtYXBWYWx1ZSwgbmFtZVNlZ21lbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtYXBWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL01hdGNoLCB1cGRhdGUgbmFtZSB0byB0aGUgbmV3IHZhbHVlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZE1hcCA9IG1hcFZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEkgPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhayBvdXRlckxvb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvL0NoZWNrIGZvciBhIHN0YXIgbWFwIG1hdGNoLCBidXQganVzdCBob2xkIG9uIHRvIGl0LAogICAgICAgICAgICAgICAgICAgIC8vaWYgdGhlcmUgaXMgYSBzaG9ydGVyIHNlZ21lbnQgbWF0Y2ggbGF0ZXIgaW4gYSBtYXRjaGluZwogICAgICAgICAgICAgICAgICAgIC8vY29uZmlnLCB0aGVuIGZhdm9yIG92ZXIgdGhpcyBzdGFyIG1hcC4KICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kU3Rhck1hcCAmJiBzdGFyTWFwICYmIGdldE93bihzdGFyTWFwLCBuYW1lU2VnbWVudCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRTdGFyTWFwID0gZ2V0T3duKHN0YXJNYXAsIG5hbWVTZWdtZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhckkgPSBpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoIWZvdW5kTWFwICYmIGZvdW5kU3Rhck1hcCkgewogICAgICAgICAgICAgICAgICAgIGZvdW5kTWFwID0gZm91bmRTdGFyTWFwOwogICAgICAgICAgICAgICAgICAgIGZvdW5kSSA9IHN0YXJJOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmIChmb3VuZE1hcCkgewogICAgICAgICAgICAgICAgICAgIG5hbWVQYXJ0cy5zcGxpY2UoMCwgZm91bmRJLCBmb3VuZE1hcCk7CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5hbWVQYXJ0cy5qb2luKCcvJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIElmIHRoZSBuYW1lIHBvaW50cyB0byBhIHBhY2thZ2UncyBuYW1lLCB1c2UKICAgICAgICAgICAgLy8gdGhlIHBhY2thZ2UgbWFpbiBpbnN0ZWFkLgogICAgICAgICAgICBwa2dNYWluID0gZ2V0T3duKGNvbmZpZy5wa2dzLCBuYW1lKTsKCiAgICAgICAgICAgIHJldHVybiBwa2dNYWluID8gcGtnTWFpbiA6IG5hbWU7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiByZW1vdmVTY3JpcHQobmFtZSkgewogICAgICAgICAgICBpZiAoaXNCcm93c2VyKSB7CiAgICAgICAgICAgICAgICBlYWNoKHNjcmlwdHMoKSwgZnVuY3Rpb24gKHNjcmlwdE5vZGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc2NyaXB0Tm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVxdWlyZW1vZHVsZScpID09PSBuYW1lICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHROb2RlLmdldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlY29udGV4dCcpID09PSBjb250ZXh0LmNvbnRleHROYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdE5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChzY3JpcHROb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGhhc1BhdGhGYWxsYmFjayhpZCkgewogICAgICAgICAgICB2YXIgcGF0aENvbmZpZyA9IGdldE93bihjb25maWcucGF0aHMsIGlkKTsKICAgICAgICAgICAgaWYgKHBhdGhDb25maWcgJiYgaXNBcnJheShwYXRoQ29uZmlnKSAmJiBwYXRoQ29uZmlnLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgIC8vUG9wIG9mZiB0aGUgZmlyc3QgYXJyYXkgdmFsdWUsIHNpbmNlIGl0IGZhaWxlZCwgYW5kCiAgICAgICAgICAgICAgICAvL3JldHJ5CiAgICAgICAgICAgICAgICBwYXRoQ29uZmlnLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICBjb250ZXh0LnJlcXVpcmUudW5kZWYoaWQpOwoKICAgICAgICAgICAgICAgIC8vQ3VzdG9tIHJlcXVpcmUgdGhhdCBkb2VzIG5vdCBkbyBtYXAgdHJhbnNsYXRpb24sIHNpbmNlCiAgICAgICAgICAgICAgICAvL0lEIGlzICJhYnNvbHV0ZSIsIGFscmVhZHkgbWFwcGVkL3Jlc29sdmVkLgogICAgICAgICAgICAgICAgY29udGV4dC5tYWtlUmVxdWlyZShudWxsLCB7CiAgICAgICAgICAgICAgICAgICAgc2tpcE1hcDogdHJ1ZQogICAgICAgICAgICAgICAgfSkoW2lkXSk7CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vVHVybnMgYSBwbHVnaW4hcmVzb3VyY2UgdG8gW3BsdWdpbiwgcmVzb3VyY2VdCiAgICAgICAgLy93aXRoIHRoZSBwbHVnaW4gYmVpbmcgdW5kZWZpbmVkIGlmIHRoZSBuYW1lCiAgICAgICAgLy9kaWQgbm90IGhhdmUgYSBwbHVnaW4gcHJlZml4LgogICAgICAgIGZ1bmN0aW9uIHNwbGl0UHJlZml4KG5hbWUpIHsKICAgICAgICAgICAgdmFyIHByZWZpeCwKICAgICAgICAgICAgICAgIGluZGV4ID0gbmFtZSA/IG5hbWUuaW5kZXhPZignIScpIDogLTE7CiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7CiAgICAgICAgICAgICAgICBwcmVmaXggPSBuYW1lLnN1YnN0cmluZygwLCBpbmRleCk7CiAgICAgICAgICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHJpbmcoaW5kZXggKyAxLCBuYW1lLmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFtwcmVmaXgsIG5hbWVdOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIG1vZHVsZSBtYXBwaW5nIHRoYXQgaW5jbHVkZXMgcGx1Z2luIHByZWZpeCwgbW9kdWxlCiAgICAgICAgICogbmFtZSwgYW5kIHBhdGguIElmIHBhcmVudE1vZHVsZU1hcCBpcyBwcm92aWRlZCBpdCB3aWxsCiAgICAgICAgICogYWxzbyBub3JtYWxpemUgdGhlIG5hbWUgdmlhIHJlcXVpcmUubm9ybWFsaXplKCkKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBtb2R1bGUgbmFtZQogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBbcGFyZW50TW9kdWxlTWFwXSBwYXJlbnQgbW9kdWxlIG1hcAogICAgICAgICAqIGZvciB0aGUgbW9kdWxlIG5hbWUsIHVzZWQgdG8gcmVzb2x2ZSByZWxhdGl2ZSBuYW1lcy4KICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGlzTm9ybWFsaXplZDogaXMgdGhlIElEIGFscmVhZHkgbm9ybWFsaXplZC4KICAgICAgICAgKiBUaGlzIGlzIHRydWUgaWYgdGhpcyBjYWxsIGlzIGRvbmUgZm9yIGEgZGVmaW5lKCkgbW9kdWxlIElELgogICAgICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gYXBwbHlNYXA6IGFwcGx5IHRoZSBtYXAgY29uZmlnIHRvIHRoZSBJRC4KICAgICAgICAgKiBTaG91bGQgb25seSBiZSB0cnVlIGlmIHRoaXMgbWFwIGlzIGZvciBhIGRlcGVuZGVuY3kuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIG1ha2VNb2R1bGVNYXAobmFtZSwgcGFyZW50TW9kdWxlTWFwLCBpc05vcm1hbGl6ZWQsIGFwcGx5TWFwKSB7CiAgICAgICAgICAgIHZhciB1cmwsIHBsdWdpbk1vZHVsZSwgc3VmZml4LCBuYW1lUGFydHMsCiAgICAgICAgICAgICAgICBwcmVmaXggPSBudWxsLAogICAgICAgICAgICAgICAgcGFyZW50TmFtZSA9IHBhcmVudE1vZHVsZU1hcCA/IHBhcmVudE1vZHVsZU1hcC5uYW1lIDogbnVsbCwKICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZSA9IG5hbWUsCiAgICAgICAgICAgICAgICBpc0RlZmluZSA9IHRydWUsCiAgICAgICAgICAgICAgICBub3JtYWxpemVkTmFtZSA9ICcnOwoKICAgICAgICAgICAgLy9JZiBubyBuYW1lLCB0aGVuIGl0IG1lYW5zIGl0IGlzIGEgcmVxdWlyZSBjYWxsLCBnZW5lcmF0ZSBhbgogICAgICAgICAgICAvL2ludGVybmFsIG5hbWUuCiAgICAgICAgICAgIGlmICghbmFtZSkgewogICAgICAgICAgICAgICAgaXNEZWZpbmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgIG5hbWUgPSAnX0ByJyArIChyZXF1aXJlQ291bnRlciArPSAxKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmFtZVBhcnRzID0gc3BsaXRQcmVmaXgobmFtZSk7CiAgICAgICAgICAgIHByZWZpeCA9IG5hbWVQYXJ0c1swXTsKICAgICAgICAgICAgbmFtZSA9IG5hbWVQYXJ0c1sxXTsKCiAgICAgICAgICAgIGlmIChwcmVmaXgpIHsKICAgICAgICAgICAgICAgIHByZWZpeCA9IG5vcm1hbGl6ZShwcmVmaXgsIHBhcmVudE5hbWUsIGFwcGx5TWFwKTsKICAgICAgICAgICAgICAgIHBsdWdpbk1vZHVsZSA9IGdldE93bihkZWZpbmVkLCBwcmVmaXgpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvL0FjY291bnQgZm9yIHJlbGF0aXZlIHBhdGhzIGlmIHRoZXJlIGlzIGEgYmFzZSBuYW1lLgogICAgICAgICAgICBpZiAobmFtZSkgewogICAgICAgICAgICAgICAgaWYgKHByZWZpeCkgewogICAgICAgICAgICAgICAgICAgIGlmIChpc05vcm1hbGl6ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZE5hbWUgPSBuYW1lOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGx1Z2luTW9kdWxlICYmIHBsdWdpbk1vZHVsZS5ub3JtYWxpemUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9QbHVnaW4gaXMgbG9hZGVkLCB1c2UgaXRzIG5vcm1hbGl6ZSBtZXRob2QuCiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWROYW1lID0gcGx1Z2luTW9kdWxlLm5vcm1hbGl6ZShuYW1lLCBmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShuYW1lLCBwYXJlbnROYW1lLCBhcHBseU1hcCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5lc3RlZCBwbHVnaW4gcmVmZXJlbmNlcywgdGhlbiBkbyBub3QgdHJ5IHRvCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSwgYXMgaXQgd2lsbCBub3Qgbm9ybWFsaXplIGNvcnJlY3RseS4gVGhpcwogICAgICAgICAgICAgICAgICAgICAgICAvLyBwbGFjZXMgYSByZXN0cmljdGlvbiBvbiByZXNvdXJjZUlkcywgYW5kIHRoZSBsb25nZXIKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVybSBzb2x1dGlvbiBpcyBub3QgdG8gbm9ybWFsaXplIHVudGlsIHBsdWdpbnMgYXJlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWRlZCBhbmQgYWxsIG5vcm1hbGl6YXRpb25zIHRvIGFsbG93IGZvciBhc3luYwogICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkaW5nIG9mIGEgbG9hZGVyIHBsdWdpbi4gQnV0IGZvciBub3csIGZpeGVzIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21tb24gdXNlcy4gRGV0YWlscyBpbiAjMTEzMQogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTmFtZSA9IG5hbWUuaW5kZXhPZignIScpID09PSAtMSA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplKG5hbWUsIHBhcmVudE5hbWUsIGFwcGx5TWFwKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vQSByZWd1bGFyIG1vZHVsZS4KICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTmFtZSA9IG5vcm1hbGl6ZShuYW1lLCBwYXJlbnROYW1lLCBhcHBseU1hcCk7CgogICAgICAgICAgICAgICAgICAgIC8vTm9ybWFsaXplZCBuYW1lIG1heSBiZSBhIHBsdWdpbiBJRCBkdWUgdG8gbWFwIGNvbmZpZwogICAgICAgICAgICAgICAgICAgIC8vYXBwbGljYXRpb24gaW4gbm9ybWFsaXplLiBUaGUgbWFwIGNvbmZpZyB2YWx1ZXMgbXVzdAogICAgICAgICAgICAgICAgICAgIC8vYWxyZWFkeSBiZSBub3JtYWxpemVkLCBzbyBkbyBub3QgbmVlZCB0byByZWRvIHRoYXQgcGFydC4KICAgICAgICAgICAgICAgICAgICBuYW1lUGFydHMgPSBzcGxpdFByZWZpeChub3JtYWxpemVkTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gbmFtZVBhcnRzWzBdOwogICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWROYW1lID0gbmFtZVBhcnRzWzFdOwogICAgICAgICAgICAgICAgICAgIGlzTm9ybWFsaXplZCA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIHVybCA9IGNvbnRleHQubmFtZVRvVXJsKG5vcm1hbGl6ZWROYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9JZiB0aGUgaWQgaXMgYSBwbHVnaW4gaWQgdGhhdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBpZiBpdCBuZWVkcwogICAgICAgICAgICAvL25vcm1hbGl6YXRpb24sIHN0YW1wIGl0IHdpdGggYSB1bmlxdWUgSUQgc28gdHdvIG1hdGNoaW5nIHJlbGF0aXZlCiAgICAgICAgICAgIC8vaWRzIHRoYXQgbWF5IGNvbmZsaWN0IGNhbiBiZSBzZXBhcmF0ZS4KICAgICAgICAgICAgc3VmZml4ID0gcHJlZml4ICYmICFwbHVnaW5Nb2R1bGUgJiYgIWlzTm9ybWFsaXplZCA/CiAgICAgICAgICAgICAgICAgICAgICdfdW5ub3JtYWxpemVkJyArICh1bm5vcm1hbGl6ZWRDb3VudGVyICs9IDEpIDoKICAgICAgICAgICAgICAgICAgICAgJyc7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgcHJlZml4OiBwcmVmaXgsCiAgICAgICAgICAgICAgICBuYW1lOiBub3JtYWxpemVkTmFtZSwKICAgICAgICAgICAgICAgIHBhcmVudE1hcDogcGFyZW50TW9kdWxlTWFwLAogICAgICAgICAgICAgICAgdW5ub3JtYWxpemVkOiAhIXN1ZmZpeCwKICAgICAgICAgICAgICAgIHVybDogdXJsLAogICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiBvcmlnaW5hbE5hbWUsCiAgICAgICAgICAgICAgICBpc0RlZmluZTogaXNEZWZpbmUsCiAgICAgICAgICAgICAgICBpZDogKHByZWZpeCA/CiAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCArICchJyArIG5vcm1hbGl6ZWROYW1lIDoKICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZE5hbWUpICsgc3VmZml4CiAgICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBnZXRNb2R1bGUoZGVwTWFwKSB7CiAgICAgICAgICAgIHZhciBpZCA9IGRlcE1hcC5pZCwKICAgICAgICAgICAgICAgIG1vZCA9IGdldE93bihyZWdpc3RyeSwgaWQpOwoKICAgICAgICAgICAgaWYgKCFtb2QpIHsKICAgICAgICAgICAgICAgIG1vZCA9IHJlZ2lzdHJ5W2lkXSA9IG5ldyBjb250ZXh0Lk1vZHVsZShkZXBNYXApOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gbW9kOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gb24oZGVwTWFwLCBuYW1lLCBmbikgewogICAgICAgICAgICB2YXIgaWQgPSBkZXBNYXAuaWQsCiAgICAgICAgICAgICAgICBtb2QgPSBnZXRPd24ocmVnaXN0cnksIGlkKTsKCiAgICAgICAgICAgIGlmIChoYXNQcm9wKGRlZmluZWQsIGlkKSAmJgogICAgICAgICAgICAgICAgICAgICghbW9kIHx8IG1vZC5kZWZpbmVFbWl0Q29tcGxldGUpKSB7CiAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gJ2RlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgZm4oZGVmaW5lZFtpZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbW9kID0gZ2V0TW9kdWxlKGRlcE1hcCk7CiAgICAgICAgICAgICAgICBpZiAobW9kLmVycm9yICYmIG5hbWUgPT09ICdlcnJvcicpIHsKICAgICAgICAgICAgICAgICAgICBmbihtb2QuZXJyb3IpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBtb2Qub24obmFtZSwgZm4pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBvbkVycm9yKGVyciwgZXJyYmFjaykgewogICAgICAgICAgICB2YXIgaWRzID0gZXJyLnJlcXVpcmVNb2R1bGVzLAogICAgICAgICAgICAgICAgbm90aWZpZWQgPSBmYWxzZTsKCiAgICAgICAgICAgIGlmIChlcnJiYWNrKSB7CiAgICAgICAgICAgICAgICBlcnJiYWNrKGVycik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBlYWNoKGlkcywgZnVuY3Rpb24gKGlkKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZCA9IGdldE93bihyZWdpc3RyeSwgaWQpOwogICAgICAgICAgICAgICAgICAgIGlmIChtb2QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9TZXQgZXJyb3Igb24gbW9kdWxlLCBzbyBpdCBza2lwcyB0aW1lb3V0IGNoZWNrcy4KICAgICAgICAgICAgICAgICAgICAgICAgbW9kLmVycm9yID0gZXJyOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kLmV2ZW50cy5lcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZpZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kLmVtaXQoJ2Vycm9yJywgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIGlmICghbm90aWZpZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXEub25FcnJvcihlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gdHJhbnNmZXIgZ2xvYmFsUXVldWUgaXRlbXMgdG8gdGhpcyBjb250ZXh0J3MKICAgICAgICAgKiBkZWZRdWV1ZS4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB0YWtlR2xvYmFsUXVldWUoKSB7CiAgICAgICAgICAgIC8vUHVzaCBhbGwgdGhlIGdsb2JhbERlZlF1ZXVlIGl0ZW1zIGludG8gdGhlIGNvbnRleHQncyBkZWZRdWV1ZQogICAgICAgICAgICBpZiAoZ2xvYmFsRGVmUXVldWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBlYWNoKGdsb2JhbERlZlF1ZXVlLCBmdW5jdGlvbihxdWV1ZUl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaWQgPSBxdWV1ZUl0ZW1bMF07CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5kZWZRdWV1ZU1hcFtpZF0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZWZRdWV1ZS5wdXNoKHF1ZXVlSXRlbSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGdsb2JhbERlZlF1ZXVlID0gW107CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGhhbmRsZXJzID0gewogICAgICAgICAgICAncmVxdWlyZSc6IGZ1bmN0aW9uIChtb2QpIHsKICAgICAgICAgICAgICAgIGlmIChtb2QucmVxdWlyZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2QucmVxdWlyZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChtb2QucmVxdWlyZSA9IGNvbnRleHQubWFrZVJlcXVpcmUobW9kLm1hcCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAnZXhwb3J0cyc6IGZ1bmN0aW9uIChtb2QpIHsKICAgICAgICAgICAgICAgIG1vZC51c2luZ0V4cG9ydHMgPSB0cnVlOwogICAgICAgICAgICAgICAgaWYgKG1vZC5tYXAuaXNEZWZpbmUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kLmV4cG9ydHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkZWZpbmVkW21vZC5tYXAuaWRdID0gbW9kLmV4cG9ydHMpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAobW9kLmV4cG9ydHMgPSBkZWZpbmVkW21vZC5tYXAuaWRdID0ge30pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ21vZHVsZSc6IGZ1bmN0aW9uIChtb2QpIHsKICAgICAgICAgICAgICAgIGlmIChtb2QubW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZC5tb2R1bGU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAobW9kLm1vZHVsZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IG1vZC5tYXAuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIHVyaTogbW9kLm1hcC51cmwsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZzogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldE93bihjb25maWcuY29uZmlnLCBtb2QubWFwLmlkKSB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogbW9kLmV4cG9ydHMgfHwgKG1vZC5leHBvcnRzID0ge30pCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiBjbGVhblJlZ2lzdHJ5KGlkKSB7CiAgICAgICAgICAgIC8vQ2xlYW4gdXAgbWFjaGluZXJ5IHVzZWQgZm9yIHdhaXRpbmcgbW9kdWxlcy4KICAgICAgICAgICAgZGVsZXRlIHJlZ2lzdHJ5W2lkXTsKICAgICAgICAgICAgZGVsZXRlIGVuYWJsZWRSZWdpc3RyeVtpZF07CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBicmVha0N5Y2xlKG1vZCwgdHJhY2VkLCBwcm9jZXNzZWQpIHsKICAgICAgICAgICAgdmFyIGlkID0gbW9kLm1hcC5pZDsKCiAgICAgICAgICAgIGlmIChtb2QuZXJyb3IpIHsKICAgICAgICAgICAgICAgIG1vZC5lbWl0KCdlcnJvcicsIG1vZC5lcnJvcik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0cmFjZWRbaWRdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGVhY2gobW9kLmRlcE1hcHMsIGZ1bmN0aW9uIChkZXBNYXAsIGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZGVwSWQgPSBkZXBNYXAuaWQsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlcCA9IGdldE93bihyZWdpc3RyeSwgZGVwSWQpOwoKICAgICAgICAgICAgICAgICAgICAvL09ubHkgZm9yY2UgdGhpbmdzIHRoYXQgaGF2ZSBub3QgY29tcGxldGVkCiAgICAgICAgICAgICAgICAgICAgLy9iZWluZyBkZWZpbmVkLCBzbyBzdGlsbCBpbiB0aGUgcmVnaXN0cnksCiAgICAgICAgICAgICAgICAgICAgLy9hbmQgb25seSBpZiBpdCBoYXMgbm90IGJlZW4gbWF0Y2hlZCB1cAogICAgICAgICAgICAgICAgICAgIC8vaW4gdGhlIG1vZHVsZSBhbHJlYWR5LgogICAgICAgICAgICAgICAgICAgIGlmIChkZXAgJiYgIW1vZC5kZXBNYXRjaGVkW2ldICYmICFwcm9jZXNzZWRbZGVwSWRdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRPd24odHJhY2VkLCBkZXBJZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZC5kZWZpbmVEZXAoaSwgZGVmaW5lZFtkZXBJZF0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kLmNoZWNrKCk7IC8vcGFzcyBmYWxzZT8KICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrQ3ljbGUoZGVwLCB0cmFjZWQsIHByb2Nlc3NlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHByb2Nlc3NlZFtpZF0gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBjaGVja0xvYWRlZCgpIHsKICAgICAgICAgICAgdmFyIGVyciwgdXNpbmdQYXRoRmFsbGJhY2ssCiAgICAgICAgICAgICAgICB3YWl0SW50ZXJ2YWwgPSBjb25maWcud2FpdFNlY29uZHMgKiAxMDAwLAogICAgICAgICAgICAgICAgLy9JdCBpcyBwb3NzaWJsZSB0byBkaXNhYmxlIHRoZSB3YWl0IGludGVydmFsIGJ5IHVzaW5nIHdhaXRTZWNvbmRzIG9mIDAuCiAgICAgICAgICAgICAgICBleHBpcmVkID0gd2FpdEludGVydmFsICYmIChjb250ZXh0LnN0YXJ0VGltZSArIHdhaXRJbnRlcnZhbCkgPCBuZXcgRGF0ZSgpLmdldFRpbWUoKSwKICAgICAgICAgICAgICAgIG5vTG9hZHMgPSBbXSwKICAgICAgICAgICAgICAgIHJlcUNhbGxzID0gW10sCiAgICAgICAgICAgICAgICBzdGlsbExvYWRpbmcgPSBmYWxzZSwKICAgICAgICAgICAgICAgIG5lZWRDeWNsZUNoZWNrID0gdHJ1ZTsKCiAgICAgICAgICAgIC8vRG8gbm90IGJvdGhlciBpZiB0aGlzIGNhbGwgd2FzIGEgcmVzdWx0IG9mIGEgY3ljbGUgYnJlYWsuCiAgICAgICAgICAgIGlmIChpbkNoZWNrTG9hZGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGluQ2hlY2tMb2FkZWQgPSB0cnVlOwoKICAgICAgICAgICAgLy9GaWd1cmUgb3V0IHRoZSBzdGF0ZSBvZiBhbGwgdGhlIG1vZHVsZXMuCiAgICAgICAgICAgIGVhY2hQcm9wKGVuYWJsZWRSZWdpc3RyeSwgZnVuY3Rpb24gKG1vZCkgewogICAgICAgICAgICAgICAgdmFyIG1hcCA9IG1vZC5tYXAsCiAgICAgICAgICAgICAgICAgICAgbW9kSWQgPSBtYXAuaWQ7CgogICAgICAgICAgICAgICAgLy9Ta2lwIHRoaW5ncyB0aGF0IGFyZSBub3QgZW5hYmxlZCBvciBpbiBlcnJvciBzdGF0ZS4KICAgICAgICAgICAgICAgIGlmICghbW9kLmVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFtYXAuaXNEZWZpbmUpIHsKICAgICAgICAgICAgICAgICAgICByZXFDYWxscy5wdXNoKG1vZCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFtb2QuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZSBtb2R1bGUgc2hvdWxkIGJlIGV4ZWN1dGVkLCBhbmQgaXQgaGFzIG5vdAogICAgICAgICAgICAgICAgICAgIC8vYmVlbiBpbml0ZWQgYW5kIHRpbWUgaXMgdXAsIHJlbWVtYmVyIGl0LgogICAgICAgICAgICAgICAgICAgIGlmICghbW9kLmluaXRlZCAmJiBleHBpcmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNQYXRoRmFsbGJhY2sobW9kSWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZ1BhdGhGYWxsYmFjayA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGlsbExvYWRpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9Mb2Fkcy5wdXNoKG1vZElkKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVNjcmlwdChtb2RJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtb2QuaW5pdGVkICYmIG1vZC5mZXRjaGVkICYmIG1hcC5pc0RlZmluZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdGlsbExvYWRpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1hcC5wcmVmaXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTm8gcmVhc29uIHRvIGtlZXAgbG9va2luZyBmb3IgdW5maW5pc2hlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9sb2FkaW5nLiBJZiB0aGUgb25seSBzdGlsbExvYWRpbmcgaXMgYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9wbHVnaW4gcmVzb3VyY2UgdGhvdWdoLCBrZWVwIGdvaW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9iZWNhdXNlIGl0IG1heSBiZSB0aGF0IGEgcGx1Z2luIHJlc291cmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2lzIHdhaXRpbmcgb24gYSBub24tcGx1Z2luIGN5Y2xlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChuZWVkQ3ljbGVDaGVjayA9IGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoZXhwaXJlZCAmJiBub0xvYWRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgLy9JZiB3YWl0IHRpbWUgZXhwaXJlZCwgdGhyb3cgZXJyb3Igb2YgdW5sb2FkZWQgbW9kdWxlcy4KICAgICAgICAgICAgICAgIGVyciA9IG1ha2VFcnJvcigndGltZW91dCcsICdMb2FkIHRpbWVvdXQgZm9yIG1vZHVsZXM6ICcgKyBub0xvYWRzLCBudWxsLCBub0xvYWRzKTsKICAgICAgICAgICAgICAgIGVyci5jb250ZXh0TmFtZSA9IGNvbnRleHQuY29udGV4dE5hbWU7CiAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihlcnIpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvL05vdCBleHBpcmVkLCBjaGVjayBmb3IgYSBjeWNsZS4KICAgICAgICAgICAgaWYgKG5lZWRDeWNsZUNoZWNrKSB7CiAgICAgICAgICAgICAgICBlYWNoKHJlcUNhbGxzLCBmdW5jdGlvbiAobW9kKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWtDeWNsZShtb2QsIHt9LCB7fSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9JZiBzdGlsbCB3YWl0aW5nIG9uIGxvYWRzLCBhbmQgdGhlIHdhaXRpbmcgbG9hZCBpcyBzb21ldGhpbmcKICAgICAgICAgICAgLy9vdGhlciB0aGFuIGEgcGx1Z2luIHJlc291cmNlLCBvciB0aGVyZSBhcmUgc3RpbGwgb3V0c3RhbmRpbmcKICAgICAgICAgICAgLy9zY3JpcHRzLCB0aGVuIGp1c3QgdHJ5IGJhY2sgbGF0ZXIuCiAgICAgICAgICAgIGlmICgoIWV4cGlyZWQgfHwgdXNpbmdQYXRoRmFsbGJhY2spICYmIHN0aWxsTG9hZGluZykgewogICAgICAgICAgICAgICAgLy9Tb21ldGhpbmcgaXMgc3RpbGwgd2FpdGluZyB0byBsb2FkLiBXYWl0IGZvciBpdCwgYnV0IG9ubHkKICAgICAgICAgICAgICAgIC8vaWYgYSB0aW1lb3V0IGlzIG5vdCBhbHJlYWR5IGluIGVmZmVjdC4KICAgICAgICAgICAgICAgIGlmICgoaXNCcm93c2VyIHx8IGlzV2ViV29ya2VyKSAmJiAhY2hlY2tMb2FkZWRUaW1lb3V0SWQpIHsKICAgICAgICAgICAgICAgICAgICBjaGVja0xvYWRlZFRpbWVvdXRJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBjaGVja0xvYWRlZFRpbWVvdXRJZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrTG9hZGVkKCk7CiAgICAgICAgICAgICAgICAgICAgfSwgNTApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBpbkNoZWNrTG9hZGVkID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBNb2R1bGUgPSBmdW5jdGlvbiAobWFwKSB7CiAgICAgICAgICAgIHRoaXMuZXZlbnRzID0gZ2V0T3duKHVuZGVmRXZlbnRzLCBtYXAuaWQpIHx8IHt9OwogICAgICAgICAgICB0aGlzLm1hcCA9IG1hcDsKICAgICAgICAgICAgdGhpcy5zaGltID0gZ2V0T3duKGNvbmZpZy5zaGltLCBtYXAuaWQpOwogICAgICAgICAgICB0aGlzLmRlcEV4cG9ydHMgPSBbXTsKICAgICAgICAgICAgdGhpcy5kZXBNYXBzID0gW107CiAgICAgICAgICAgIHRoaXMuZGVwTWF0Y2hlZCA9IFtdOwogICAgICAgICAgICB0aGlzLnBsdWdpbk1hcHMgPSB7fTsKICAgICAgICAgICAgdGhpcy5kZXBDb3VudCA9IDA7CgogICAgICAgICAgICAvKiB0aGlzLmV4cG9ydHMgdGhpcy5mYWN0b3J5CiAgICAgICAgICAgICAgIHRoaXMuZGVwTWFwcyA9IFtdLAogICAgICAgICAgICAgICB0aGlzLmVuYWJsZWQsIHRoaXMuZmV0Y2hlZAogICAgICAgICAgICAqLwogICAgICAgIH07CgogICAgICAgIE1vZHVsZS5wcm90b3R5cGUgPSB7CiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uIChkZXBNYXBzLCBmYWN0b3J5LCBlcnJiYWNrLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCiAgICAgICAgICAgICAgICAvL0RvIG5vdCBkbyBtb3JlIGluaXRzIGlmIGFscmVhZHkgZG9uZS4gQ2FuIGhhcHBlbiBpZiB0aGVyZQogICAgICAgICAgICAgICAgLy9hcmUgbXVsdGlwbGUgZGVmaW5lIGNhbGxzIGZvciB0aGUgc2FtZSBtb2R1bGUuIFRoYXQgaXMgbm90CiAgICAgICAgICAgICAgICAvL2Egbm9ybWFsLCBjb21tb24gY2FzZSwgYnV0IGl0IGlzIGFsc28gbm90IHVuZXhwZWN0ZWQuCiAgICAgICAgICAgICAgICBpZiAodGhpcy5pbml0ZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKCiAgICAgICAgICAgICAgICBpZiAoZXJyYmFjaykgewogICAgICAgICAgICAgICAgICAgIC8vUmVnaXN0ZXIgZm9yIGVycm9ycyBvbiB0aGlzIG1vZHVsZS4KICAgICAgICAgICAgICAgICAgICB0aGlzLm9uKCdlcnJvcicsIGVycmJhY2spOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmV2ZW50cy5lcnJvcikgewogICAgICAgICAgICAgICAgICAgIC8vSWYgbm8gZXJyYmFjayBhbHJlYWR5LCBidXQgdGhlcmUgYXJlIGVycm9yIGxpc3RlbmVycwogICAgICAgICAgICAgICAgICAgIC8vb24gdGhpcyBtb2R1bGUsIHNldCB1cCBhbiBlcnJiYWNrIHRvIHBhc3MgdG8gdGhlIGRlcHMuCiAgICAgICAgICAgICAgICAgICAgZXJyYmFjayA9IGJpbmQodGhpcywgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL0RvIGEgY29weSBvZiB0aGUgZGVwZW5kZW5jeSBhcnJheSwgc28gdGhhdAogICAgICAgICAgICAgICAgLy9zb3VyY2UgaW5wdXRzIGFyZSBub3QgbW9kaWZpZWQuIEZvciBleGFtcGxlCiAgICAgICAgICAgICAgICAvLyJzaGltIiBkZXBzIGFyZSBwYXNzZWQgaW4gaGVyZSBkaXJlY3RseSwgYW5kCiAgICAgICAgICAgICAgICAvL2RvaW5nIGEgZGlyZWN0IG1vZGlmaWNhdGlvbiBvZiB0aGUgZGVwTWFwcyBhcnJheQogICAgICAgICAgICAgICAgLy93b3VsZCBhZmZlY3QgdGhhdCBjb25maWcuCiAgICAgICAgICAgICAgICB0aGlzLmRlcE1hcHMgPSBkZXBNYXBzICYmIGRlcE1hcHMuc2xpY2UoMCk7CgogICAgICAgICAgICAgICAgdGhpcy5lcnJiYWNrID0gZXJyYmFjazsKCiAgICAgICAgICAgICAgICAvL0luZGljYXRlIHRoaXMgbW9kdWxlIGhhcyBiZSBpbml0aWFsaXplZAogICAgICAgICAgICAgICAgdGhpcy5pbml0ZWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgIHRoaXMuaWdub3JlID0gb3B0aW9ucy5pZ25vcmU7CgogICAgICAgICAgICAgICAgLy9Db3VsZCBoYXZlIG9wdGlvbiB0byBpbml0IHRoaXMgbW9kdWxlIGluIGVuYWJsZWQgbW9kZSwKICAgICAgICAgICAgICAgIC8vb3IgY291bGQgaGF2ZSBiZWVuIHByZXZpb3VzbHkgbWFya2VkIGFzIGVuYWJsZWQuIEhvd2V2ZXIsCiAgICAgICAgICAgICAgICAvL3RoZSBkZXBlbmRlbmNpZXMgYXJlIG5vdCBrbm93biB1bnRpbCBpbml0IGlzIGNhbGxlZC4gU28KICAgICAgICAgICAgICAgIC8vaWYgZW5hYmxlZCBwcmV2aW91c2x5LCBub3cgdHJpZ2dlciBkZXBlbmRlbmNpZXMgYXMgZW5hYmxlZC4KICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmVuYWJsZWQgfHwgdGhpcy5lbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgLy9FbmFibGUgdGhpcyBtb2R1bGUgYW5kIGRlcGVuZGVuY2llcy4KICAgICAgICAgICAgICAgICAgICAvL1dpbGwgY2FsbCB0aGlzLmNoZWNrKCkKICAgICAgICAgICAgICAgICAgICB0aGlzLmVuYWJsZSgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBkZWZpbmVEZXA6IGZ1bmN0aW9uIChpLCBkZXBFeHBvcnRzKSB7CiAgICAgICAgICAgICAgICAvL0JlY2F1c2Ugb2YgY3ljbGVzLCBkZWZpbmVkIGNhbGxiYWNrIGZvciBhIGdpdmVuCiAgICAgICAgICAgICAgICAvL2V4cG9ydCBjYW4gYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRlcE1hdGNoZWRbaV0pIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcE1hdGNoZWRbaV0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZGVwQ291bnQgLT0gMTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcEV4cG9ydHNbaV0gPSBkZXBFeHBvcnRzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgZmV0Y2g6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmZldGNoZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmZldGNoZWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgIGNvbnRleHQuc3RhcnRUaW1lID0gKG5ldyBEYXRlKCkpLmdldFRpbWUoKTsKCiAgICAgICAgICAgICAgICB2YXIgbWFwID0gdGhpcy5tYXA7CgogICAgICAgICAgICAgICAgLy9JZiB0aGUgbWFuYWdlciBpcyBmb3IgYSBwbHVnaW4gbWFuYWdlZCByZXNvdXJjZSwKICAgICAgICAgICAgICAgIC8vYXNrIHRoZSBwbHVnaW4gdG8gbG9hZCBpdCBub3cuCiAgICAgICAgICAgICAgICBpZiAodGhpcy5zaGltKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5tYWtlUmVxdWlyZSh0aGlzLm1hcCwgewogICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVCdWlsZENhbGxiYWNrOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSkodGhpcy5zaGltLmRlcHMgfHwgW10sIGJpbmQodGhpcywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwLnByZWZpeCA/IHRoaXMuY2FsbFBsdWdpbigpIDogdGhpcy5sb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvL1JlZ3VsYXIgZGVwZW5kZW5jeS4KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWFwLnByZWZpeCA/IHRoaXMuY2FsbFBsdWdpbigpIDogdGhpcy5sb2FkKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBsb2FkOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgdXJsID0gdGhpcy5tYXAudXJsOwoKICAgICAgICAgICAgICAgIC8vUmVndWxhciBkZXBlbmRlbmN5LgogICAgICAgICAgICAgICAgaWYgKCF1cmxGZXRjaGVkW3VybF0pIHsKICAgICAgICAgICAgICAgICAgICB1cmxGZXRjaGVkW3VybF0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGNvbnRleHQubG9hZCh0aGlzLm1hcC5pZCwgdXJsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDaGVja3MgaWYgdGhlIG1vZHVsZSBpcyByZWFkeSB0byBkZWZpbmUgaXRzZWxmLCBhbmQgaWYgc28sCiAgICAgICAgICAgICAqIGRlZmluZSBpdC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNoZWNrOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZW5hYmxlZCB8fCB0aGlzLmVuYWJsaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHZhciBlcnIsIGNqc01vZHVsZSwKICAgICAgICAgICAgICAgICAgICBpZCA9IHRoaXMubWFwLmlkLAogICAgICAgICAgICAgICAgICAgIGRlcEV4cG9ydHMgPSB0aGlzLmRlcEV4cG9ydHMsCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0cyA9IHRoaXMuZXhwb3J0cywKICAgICAgICAgICAgICAgICAgICBmYWN0b3J5ID0gdGhpcy5mYWN0b3J5OwoKICAgICAgICAgICAgICAgIGlmICghdGhpcy5pbml0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGZldGNoIGlmIG5vdCBhbHJlYWR5IGluIHRoZSBkZWZRdWV1ZS4KICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1Byb3AoY29udGV4dC5kZWZRdWV1ZU1hcCwgaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2goKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgdGhpcy5lcnJvcik7CiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLmRlZmluaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgLy9UaGUgZmFjdG9yeSBjb3VsZCB0cmlnZ2VyIGFub3RoZXIgcmVxdWlyZSBjYWxsCiAgICAgICAgICAgICAgICAgICAgLy90aGF0IHdvdWxkIHJlc3VsdCBpbiBjaGVja2luZyB0aGlzIG1vZHVsZSB0bwogICAgICAgICAgICAgICAgICAgIC8vZGVmaW5lIGl0c2VsZiBhZ2Fpbi4gSWYgYWxyZWFkeSBpbiB0aGUgcHJvY2VzcwogICAgICAgICAgICAgICAgICAgIC8vb2YgZG9pbmcgdGhhdCwgc2tpcCB0aGlzIHdvcmsuCiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWZpbmluZyA9IHRydWU7CgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlcENvdW50IDwgMSAmJiAhdGhpcy5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKGZhY3RvcnkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lmIHRoZXJlIGlzIGFuIGVycm9yIGxpc3RlbmVyLCBmYXZvciBwYXNzaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RvIHRoYXQgaW5zdGVhZCBvZiB0aHJvd2luZyBhbiBlcnJvci4gSG93ZXZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vb25seSBkbyBpdCBmb3IgZGVmaW5lKCknZCAgbW9kdWxlcy4gcmVxdWlyZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9lcnJiYWNrcyBzaG91bGQgbm90IGJlIGNhbGxlZCBmb3IgZmFpbHVyZXMgaW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhlaXIgY2FsbGJhY2tzICgjNjk5KS4gSG93ZXZlciBpZiBhIGdsb2JhbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9vbkVycm9yIGlzIHNldCwgdXNlIHRoYXQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHRoaXMuZXZlbnRzLmVycm9yICYmIHRoaXMubWFwLmlzRGVmaW5lKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5vbkVycm9yICE9PSBkZWZhdWx0T25FcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMgPSBjb250ZXh0LmV4ZWNDYihpZCwgZmFjdG9yeSwgZGVwRXhwb3J0cywgZXhwb3J0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cyA9IGNvbnRleHQuZXhlY0NiKGlkLCBmYWN0b3J5LCBkZXBFeHBvcnRzLCBleHBvcnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGYXZvciByZXR1cm4gdmFsdWUgb3ZlciBleHBvcnRzLiBJZiBub2RlL2NqcyBpbiBwbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiB3aWxsIG5vdCBoYXZlIGEgcmV0dXJuIHZhbHVlIGFueXdheS4gRmF2b3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vZHVsZS5leHBvcnRzIGFzc2lnbm1lbnQgb3ZlciBleHBvcnRzIG9iamVjdC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hcC5pc0RlZmluZSAmJiBleHBvcnRzID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjanNNb2R1bGUgPSB0aGlzLm1vZHVsZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2pzTW9kdWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMgPSBjanNNb2R1bGUuZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMudXNpbmdFeHBvcnRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZXhwb3J0cyBhbHJlYWR5IHNldCB0aGUgZGVmaW5lZCB2YWx1ZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cyA9IHRoaXMuZXhwb3J0czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5yZXF1aXJlTWFwID0gdGhpcy5tYXA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnJlcXVpcmVNb2R1bGVzID0gdGhpcy5tYXAuaXNEZWZpbmUgPyBbdGhpcy5tYXAuaWRdIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIucmVxdWlyZVR5cGUgPSB0aGlzLm1hcC5pc0RlZmluZSA/ICdkZWZpbmUnIDogJ3JlcXVpcmUnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbkVycm9yKCh0aGlzLmVycm9yID0gZXJyKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9KdXN0IGEgbGl0ZXJhbCB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0cyA9IGZhY3Rvcnk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwb3J0cyA9IGV4cG9ydHM7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXAuaXNEZWZpbmUgJiYgIXRoaXMuaWdub3JlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkW2lkXSA9IGV4cG9ydHM7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcS5vblJlc291cmNlTG9hZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciByZXNMb2FkTWFwcyA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2godGhpcy5kZXBNYXBzLCBmdW5jdGlvbiAoZGVwTWFwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc0xvYWRNYXBzLnB1c2goZGVwTWFwLm5vcm1hbGl6ZWRNYXAgfHwgZGVwTWFwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEub25SZXNvdXJjZUxvYWQoY29udGV4dCwgdGhpcy5tYXAsIHJlc0xvYWRNYXBzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy9DbGVhbiB1cAogICAgICAgICAgICAgICAgICAgICAgICBjbGVhblJlZ2lzdHJ5KGlkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5lZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvL0ZpbmlzaGVkIHRoZSBkZWZpbmUgc3RhZ2UuIEFsbG93IGNhbGxpbmcgY2hlY2sgYWdhaW4KICAgICAgICAgICAgICAgICAgICAvL3RvIGFsbG93IGRlZmluZSBub3RpZmljYXRpb25zIGJlbG93IGluIHRoZSBjYXNlIG9mIGEKICAgICAgICAgICAgICAgICAgICAvL2N5Y2xlLgogICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5pbmcgPSBmYWxzZTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGVmaW5lZCAmJiAhdGhpcy5kZWZpbmVFbWl0dGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5lRW1pdHRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZGVmaW5lZCcsIHRoaXMuZXhwb3J0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5lRW1pdENvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgY2FsbFBsdWdpbjogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIG1hcCA9IHRoaXMubWFwLAogICAgICAgICAgICAgICAgICAgIGlkID0gbWFwLmlkLAogICAgICAgICAgICAgICAgICAgIC8vTWFwIGFscmVhZHkgbm9ybWFsaXplZCB0aGUgcHJlZml4LgogICAgICAgICAgICAgICAgICAgIHBsdWdpbk1hcCA9IG1ha2VNb2R1bGVNYXAobWFwLnByZWZpeCk7CgogICAgICAgICAgICAgICAgLy9NYXJrIHRoaXMgYXMgYSBkZXBlbmRlbmN5IGZvciB0aGlzIHBsdWdpbiwgc28gaXQKICAgICAgICAgICAgICAgIC8vY2FuIGJlIHRyYWNlZCBmb3IgY3ljbGVzLgogICAgICAgICAgICAgICAgdGhpcy5kZXBNYXBzLnB1c2gocGx1Z2luTWFwKTsKCiAgICAgICAgICAgICAgICBvbihwbHVnaW5NYXAsICdkZWZpbmVkJywgYmluZCh0aGlzLCBmdW5jdGlvbiAocGx1Z2luKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxvYWQsIG5vcm1hbGl6ZWRNYXAsIG5vcm1hbGl6ZWRNb2QsCiAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZUlkID0gZ2V0T3duKGJ1bmRsZXNNYXAsIHRoaXMubWFwLmlkKSwKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHRoaXMubWFwLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5hbWUgPSB0aGlzLm1hcC5wYXJlbnRNYXAgPyB0aGlzLm1hcC5wYXJlbnRNYXAubmFtZSA6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsUmVxdWlyZSA9IGNvbnRleHQubWFrZVJlcXVpcmUobWFwLnBhcmVudE1hcCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlQnVpbGRDYWxsYmFjazogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy9JZiBjdXJyZW50IG1hcCBpcyBub3Qgbm9ybWFsaXplZCwgd2FpdCBmb3IgdGhhdAogICAgICAgICAgICAgICAgICAgIC8vbm9ybWFsaXplZCBuYW1lIHRvIGxvYWQgaW5zdGVhZCBvZiBjb250aW51aW5nLgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1hcC51bm5vcm1hbGl6ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9Ob3JtYWxpemUgdGhlIElEIGlmIHRoZSBwbHVnaW4gYWxsb3dzIGl0LgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGx1Z2luLm5vcm1hbGl6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHBsdWdpbi5ub3JtYWxpemUobmFtZSwgZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplKG5hbWUsIHBhcmVudE5hbWUsIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJlZml4IGFuZCBuYW1lIHNob3VsZCBhbHJlYWR5IGJlIG5vcm1hbGl6ZWQsIG5vIG5lZWQKICAgICAgICAgICAgICAgICAgICAgICAgLy9mb3IgYXBwbHlpbmcgbWFwIGNvbmZpZyBhZ2FpbiBlaXRoZXIuCiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRNYXAgPSBtYWtlTW9kdWxlTWFwKG1hcC5wcmVmaXggKyAnIScgKyBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcC5wYXJlbnRNYXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBvbihub3JtYWxpemVkTWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RlZmluZWQnLCBiaW5kKHRoaXMsIGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwLm5vcm1hbGl6ZWRNYXAgPSBub3JtYWxpemVkTWFwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdChbXSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFsdWU7IH0sIG51bGwsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CgogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTW9kID0gZ2V0T3duKHJlZ2lzdHJ5LCBub3JtYWxpemVkTWFwLmlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRNb2QpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vTWFyayB0aGlzIGFzIGEgZGVwZW5kZW5jeSBmb3IgdGhpcyBwbHVnaW4sIHNvIGl0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NhbiBiZSB0cmFjZWQgZm9yIGN5Y2xlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVwTWFwcy5wdXNoKG5vcm1hbGl6ZWRNYXApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmV2ZW50cy5lcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRNb2Qub24oJ2Vycm9yJywgYmluZCh0aGlzLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdCgnZXJyb3InLCBlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRNb2QuZW5hYmxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vSWYgYSBwYXRocyBjb25maWcsIHRoZW4ganVzdCBsb2FkIHRoYXQgZmlsZSBpbnN0ZWFkIHRvCiAgICAgICAgICAgICAgICAgICAgLy9yZXNvbHZlIHRoZSBwbHVnaW4sIGFzIGl0IGlzIGJ1aWx0IGludG8gdGhhdCBwYXRocyBsYXllci4KICAgICAgICAgICAgICAgICAgICBpZiAoYnVuZGxlSWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXAudXJsID0gY29udGV4dC5uYW1lVG9VcmwoYnVuZGxlSWQpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgbG9hZCA9IGJpbmQodGhpcywgZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdChbXSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gdmFsdWU7IH0sIG51bGwsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIGxvYWQuZXJyb3IgPSBiaW5kKHRoaXMsIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yID0gZXJyOwogICAgICAgICAgICAgICAgICAgICAgICBlcnIucmVxdWlyZU1vZHVsZXMgPSBbaWRdOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9SZW1vdmUgdGVtcCB1bm5vcm1hbGl6ZWQgbW9kdWxlcyBmb3IgdGhpcyBtb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vc2luY2UgdGhleSB3aWxsIG5ldmVyIGJlIHJlc29sdmVkIG90aGVyd2lzZSBub3cuCiAgICAgICAgICAgICAgICAgICAgICAgIGVhY2hQcm9wKHJlZ2lzdHJ5LCBmdW5jdGlvbiAobW9kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kLm1hcC5pZC5pbmRleE9mKGlkICsgJ191bm5vcm1hbGl6ZWQnKSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFuUmVnaXN0cnkobW9kLm1hcC5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvL0FsbG93IHBsdWdpbnMgdG8gbG9hZCBvdGhlciBjb2RlIHdpdGhvdXQgaGF2aW5nIHRvIGtub3cgdGhlCiAgICAgICAgICAgICAgICAgICAgLy9jb250ZXh0IG9yIGhvdyB0byAnY29tcGxldGUnIHRoZSBsb2FkLgogICAgICAgICAgICAgICAgICAgIGxvYWQuZnJvbVRleHQgPSBiaW5kKHRoaXMsIGZ1bmN0aW9uICh0ZXh0LCB0ZXh0QWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qanNsaW50IGV2aWw6IHRydWUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1vZHVsZU5hbWUgPSBtYXAubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZU1hcCA9IG1ha2VNb2R1bGVNYXAobW9kdWxlTmFtZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNJbnRlcmFjdGl2ZSA9IHVzZUludGVyYWN0aXZlOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9BcyBvZiAyLjEuMCwgc3VwcG9ydCBqdXN0IHBhc3NpbmcgdGhlIHRleHQsIHRvIHJlaW5mb3JjZQogICAgICAgICAgICAgICAgICAgICAgICAvL2Zyb21UZXh0IG9ubHkgYmVpbmcgY2FsbGVkIG9uY2UgcGVyIHJlc291cmNlLiBTdGlsbAogICAgICAgICAgICAgICAgICAgICAgICAvL3N1cHBvcnQgb2xkIHN0eWxlIG9mIHBhc3NpbmcgbW9kdWxlTmFtZSBidXQgZGlzY2FyZAogICAgICAgICAgICAgICAgICAgICAgICAvL3RoYXQgbW9kdWxlTmFtZSBpbiBmYXZvciBvZiB0aGUgaW50ZXJuYWwgcmVmLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dEFsdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHRleHRBbHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vVHVybiBvZmYgaW50ZXJhY3RpdmUgc2NyaXB0IG1hdGNoaW5nIGZvciBJRSBmb3IgYW55IGRlZmluZQogICAgICAgICAgICAgICAgICAgICAgICAvL2NhbGxzIGluIHRoZSB0ZXh0LCB0aGVuIHR1cm4gaXQgYmFjayBvbiBhdCB0aGUgZW5kLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzSW50ZXJhY3RpdmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUludGVyYWN0aXZlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vUHJpbWUgdGhlIHN5c3RlbSBieSBjcmVhdGluZyBhIG1vZHVsZSBpbnN0YW5jZSBmb3IKICAgICAgICAgICAgICAgICAgICAgICAgLy9pdC4KICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TW9kdWxlKG1vZHVsZU1hcCk7CgogICAgICAgICAgICAgICAgICAgICAgICAvL1RyYW5zZmVyIGFueSBjb25maWcgdG8gdGhpcyBvdGhlciBtb2R1bGUuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNQcm9wKGNvbmZpZy5jb25maWcsIGlkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNvbmZpZ1ttb2R1bGVOYW1lXSA9IGNvbmZpZy5jb25maWdbaWRdOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLmV4ZWModGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvbkVycm9yKG1ha2VFcnJvcignZnJvbXRleHRldmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zyb21UZXh0IGV2YWwgZm9yICcgKyBpZCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBmYWlsZWQ6ICcgKyBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWRdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNJbnRlcmFjdGl2ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlSW50ZXJhY3RpdmUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvL01hcmsgdGhpcyBhcyBhIGRlcGVuZGVuY3kgZm9yIHRoZSBwbHVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXNvdXJjZQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcE1hcHMucHVzaChtb2R1bGVNYXApOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9TdXBwb3J0IGFub255bW91cyBtb2R1bGVzLgogICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmNvbXBsZXRlTG9hZChtb2R1bGVOYW1lKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vQmluZCB0aGUgdmFsdWUgb2YgdGhhdCBtb2R1bGUgdG8gdGhlIHZhbHVlIGZvciB0aGlzCiAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVzb3VyY2UgSUQuCiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsUmVxdWlyZShbbW9kdWxlTmFtZV0sIGxvYWQpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAvL1VzZSBwYXJlbnROYW1lIGhlcmUgc2luY2UgdGhlIHBsdWdpbidzIG5hbWUgaXMgbm90IHJlbGlhYmxlLAogICAgICAgICAgICAgICAgICAgIC8vY291bGQgYmUgc29tZSB3ZWlyZCBzdHJpbmcgd2l0aCBubyBwYXRoIHRoYXQgYWN0dWFsbHkgd2FudHMgdG8KICAgICAgICAgICAgICAgICAgICAvL3JlZmVyZW5jZSB0aGUgcGFyZW50TmFtZSdzIHBhdGguCiAgICAgICAgICAgICAgICAgICAgcGx1Z2luLmxvYWQobWFwLm5hbWUsIGxvY2FsUmVxdWlyZSwgbG9hZCwgY29uZmlnKTsKICAgICAgICAgICAgICAgIH0pKTsKCiAgICAgICAgICAgICAgICBjb250ZXh0LmVuYWJsZShwbHVnaW5NYXAsIHRoaXMpOwogICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5NYXBzW3BsdWdpbk1hcC5pZF0gPSBwbHVnaW5NYXA7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBlbmFibGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGVuYWJsZWRSZWdpc3RyeVt0aGlzLm1hcC5pZF0gPSB0aGlzOwogICAgICAgICAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAvL1NldCBmbGFnIG1lbnRpb25pbmcgdGhhdCB0aGUgbW9kdWxlIGlzIGVuYWJsaW5nLAogICAgICAgICAgICAgICAgLy9zbyB0aGF0IGltbWVkaWF0ZSBjYWxscyB0byB0aGUgZGVmaW5lZCBjYWxsYmFja3MKICAgICAgICAgICAgICAgIC8vZm9yIGRlcGVuZGVuY2llcyBkbyBub3QgdHJpZ2dlciBpbmFkdmVydGVudCBsb2FkCiAgICAgICAgICAgICAgICAvL3dpdGggdGhlIGRlcENvdW50IHN0aWxsIGJlaW5nIHplcm8uCiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsaW5nID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICAvL0VuYWJsZSBlYWNoIGRlcGVuZGVuY3kKICAgICAgICAgICAgICAgIGVhY2godGhpcy5kZXBNYXBzLCBiaW5kKHRoaXMsIGZ1bmN0aW9uIChkZXBNYXAsIGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaWQsIG1vZCwgaGFuZGxlcjsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXBNYXAgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vRGVwZW5kZW5jeSBuZWVkcyB0byBiZSBjb252ZXJ0ZWQgdG8gYSBkZXBNYXAKICAgICAgICAgICAgICAgICAgICAgICAgLy9hbmQgd2lyZWQgdXAgdG8gdGhpcyBtb2R1bGUuCiAgICAgICAgICAgICAgICAgICAgICAgIGRlcE1hcCA9IG1ha2VNb2R1bGVNYXAoZGVwTWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLm1hcC5pc0RlZmluZSA/IHRoaXMubWFwIDogdGhpcy5tYXAucGFyZW50TWFwKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5za2lwTWFwKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXBNYXBzW2ldID0gZGVwTWFwOwoKICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlciA9IGdldE93bihoYW5kbGVycywgZGVwTWFwLmlkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcEV4cG9ydHNbaV0gPSBoYW5kbGVyKHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcENvdW50ICs9IDE7CgogICAgICAgICAgICAgICAgICAgICAgICBvbihkZXBNYXAsICdkZWZpbmVkJywgYmluZCh0aGlzLCBmdW5jdGlvbiAoZGVwRXhwb3J0cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudW5kZWZlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5lRGVwKGksIGRlcEV4cG9ydHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVjaygpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5lcnJiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbihkZXBNYXAsICdlcnJvcicsIGJpbmQodGhpcywgdGhpcy5lcnJiYWNrKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ldmVudHMuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIGRpcmVjdCBlcnJiYWNrIG9uIHRoaXMgbW9kdWxlLCBidXQgc29tZXRoaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbHNlIGlzIGxpc3RlbmluZyBmb3IgZXJyb3JzLCBzbyBiZSBzdXJlIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9wYWdhdGUgdGhlIGVycm9yIGNvcnJlY3RseS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uKGRlcE1hcCwgJ2Vycm9yJywgYmluZCh0aGlzLCBmdW5jdGlvbihlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWQgPSBkZXBNYXAuaWQ7CiAgICAgICAgICAgICAgICAgICAgbW9kID0gcmVnaXN0cnlbaWRdOwoKICAgICAgICAgICAgICAgICAgICAvL1NraXAgc3BlY2lhbCBtb2R1bGVzIGxpa2UgJ3JlcXVpcmUnLCAnZXhwb3J0cycsICdtb2R1bGUnCiAgICAgICAgICAgICAgICAgICAgLy9BbHNvLCBkb24ndCBjYWxsIGVuYWJsZSBpZiBpdCBpcyBhbHJlYWR5IGVuYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgLy9pbXBvcnRhbnQgaW4gY2lyY3VsYXIgZGVwZW5kZW5jeSBjYXNlcy4KICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1Byb3AoaGFuZGxlcnMsIGlkKSAmJiBtb2QgJiYgIW1vZC5lbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZW5hYmxlKGRlcE1hcCwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwoKICAgICAgICAgICAgICAgIC8vRW5hYmxlIGVhY2ggcGx1Z2luIHRoYXQgaXMgdXNlZCBpbgogICAgICAgICAgICAgICAgLy9hIGRlcGVuZGVuY3kKICAgICAgICAgICAgICAgIGVhY2hQcm9wKHRoaXMucGx1Z2luTWFwcywgYmluZCh0aGlzLCBmdW5jdGlvbiAocGx1Z2luTWFwKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG1vZCA9IGdldE93bihyZWdpc3RyeSwgcGx1Z2luTWFwLmlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kICYmICFtb2QuZW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmVuYWJsZShwbHVnaW5NYXAsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKCiAgICAgICAgICAgICAgICB0aGlzLmVuYWJsaW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgdGhpcy5jaGVjaygpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgb246IGZ1bmN0aW9uIChuYW1lLCBjYikgewogICAgICAgICAgICAgICAgdmFyIGNicyA9IHRoaXMuZXZlbnRzW25hbWVdOwogICAgICAgICAgICAgICAgaWYgKCFjYnMpIHsKICAgICAgICAgICAgICAgICAgICBjYnMgPSB0aGlzLmV2ZW50c1tuYW1lXSA9IFtdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2JzLnB1c2goY2IpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgZW1pdDogZnVuY3Rpb24gKG5hbWUsIGV2dCkgewogICAgICAgICAgICAgICAgZWFjaCh0aGlzLmV2ZW50c1tuYW1lXSwgZnVuY3Rpb24gKGNiKSB7CiAgICAgICAgICAgICAgICAgICAgY2IoZXZ0KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdlcnJvcicpIHsKICAgICAgICAgICAgICAgICAgICAvL05vdyB0aGF0IHRoZSBlcnJvciBoYW5kbGVyIHdhcyB0cmlnZ2VyZWQsIHJlbW92ZQogICAgICAgICAgICAgICAgICAgIC8vdGhlIGxpc3RlbmVycywgc2luY2UgdGhpcyBicm9rZW4gTW9kdWxlIGluc3RhbmNlCiAgICAgICAgICAgICAgICAgICAgLy9jYW4gc3RheSBhcm91bmQgZm9yIGEgd2hpbGUgaW4gdGhlIHJlZ2lzdHJ5LgogICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmV2ZW50c1tuYW1lXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIGNhbGxHZXRNb2R1bGUoYXJncykgewogICAgICAgICAgICAvL1NraXAgbW9kdWxlcyBhbHJlYWR5IGRlZmluZWQuCiAgICAgICAgICAgIGlmICghaGFzUHJvcChkZWZpbmVkLCBhcmdzWzBdKSkgewogICAgICAgICAgICAgICAgZ2V0TW9kdWxlKG1ha2VNb2R1bGVNYXAoYXJnc1swXSwgbnVsbCwgdHJ1ZSkpLmluaXQoYXJnc1sxXSwgYXJnc1syXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHJlbW92ZUxpc3RlbmVyKG5vZGUsIGZ1bmMsIG5hbWUsIGllTmFtZSkgewogICAgICAgICAgICAvL0Zhdm9yIGRldGFjaEV2ZW50IGJlY2F1c2Ugb2YgSUU5CiAgICAgICAgICAgIC8vaXNzdWUsIHNlZSBhdHRhY2hFdmVudC9hZGRFdmVudExpc3RlbmVyIGNvbW1lbnQgZWxzZXdoZXJlCiAgICAgICAgICAgIC8vaW4gdGhpcyBmaWxlLgogICAgICAgICAgICBpZiAobm9kZS5kZXRhY2hFdmVudCAmJiAhaXNPcGVyYSkgewogICAgICAgICAgICAgICAgLy9Qcm9iYWJseSBJRS4gSWYgbm90IGl0IHdpbGwgdGhyb3cgYW4gZXJyb3IsIHdoaWNoIHdpbGwgYmUKICAgICAgICAgICAgICAgIC8vdXNlZnVsIHRvIGtub3cuCiAgICAgICAgICAgICAgICBpZiAoaWVOYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgbm9kZS5kZXRhY2hFdmVudChpZU5hbWUsIGZ1bmMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKG5hbWUsIGZ1bmMsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogR2l2ZW4gYW4gZXZlbnQgZnJvbSBhIHNjcmlwdCBub2RlLCBnZXQgdGhlIHJlcXVpcmVqcyBpbmZvIGZyb20gaXQsCiAgICAgICAgICogYW5kIHRoZW4gcmVtb3ZlcyB0aGUgZXZlbnQgbGlzdGVuZXJzIG9uIHRoZSBub2RlLgogICAgICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2dAogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZ2V0U2NyaXB0RGF0YShldnQpIHsKICAgICAgICAgICAgLy9Vc2luZyBjdXJyZW50VGFyZ2V0IGluc3RlYWQgb2YgdGFyZ2V0IGZvciBGaXJlZm94IDIuMCdzIHNha2UuIE5vdAogICAgICAgICAgICAvL2FsbCBvbGQgYnJvd3NlcnMgd2lsbCBiZSBzdXBwb3J0ZWQsIGJ1dCB0aGlzIG9uZSB3YXMgZWFzeSBlbm91Z2gKICAgICAgICAgICAgLy90byBzdXBwb3J0IGFuZCBzdGlsbCBtYWtlcyBzZW5zZS4KICAgICAgICAgICAgdmFyIG5vZGUgPSBldnQuY3VycmVudFRhcmdldCB8fCBldnQuc3JjRWxlbWVudDsKCiAgICAgICAgICAgIC8vUmVtb3ZlIHRoZSBsaXN0ZW5lcnMgb25jZSBoZXJlLgogICAgICAgICAgICByZW1vdmVMaXN0ZW5lcihub2RlLCBjb250ZXh0Lm9uU2NyaXB0TG9hZCwgJ2xvYWQnLCAnb25yZWFkeXN0YXRlY2hhbmdlJyk7CiAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyKG5vZGUsIGNvbnRleHQub25TY3JpcHRFcnJvciwgJ2Vycm9yJyk7CgogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgbm9kZTogbm9kZSwKICAgICAgICAgICAgICAgIGlkOiBub2RlICYmIG5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXJlcXVpcmVtb2R1bGUnKQogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gaW50YWtlRGVmaW5lcygpIHsKICAgICAgICAgICAgdmFyIGFyZ3M7CgogICAgICAgICAgICAvL0FueSBkZWZpbmVkIG1vZHVsZXMgaW4gdGhlIGdsb2JhbCBxdWV1ZSwgaW50YWtlIHRoZW0gbm93LgogICAgICAgICAgICB0YWtlR2xvYmFsUXVldWUoKTsKCiAgICAgICAgICAgIC8vTWFrZSBzdXJlIGFueSByZW1haW5pbmcgZGVmUXVldWUgaXRlbXMgZ2V0IHByb3Blcmx5IHByb2Nlc3NlZC4KICAgICAgICAgICAgd2hpbGUgKGRlZlF1ZXVlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgYXJncyA9IGRlZlF1ZXVlLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICBpZiAoYXJnc1swXSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvbkVycm9yKG1ha2VFcnJvcignbWlzbWF0Y2gnLCAnTWlzbWF0Y2hlZCBhbm9ueW1vdXMgZGVmaW5lKCkgbW9kdWxlOiAnICsKICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1thcmdzLmxlbmd0aCAtIDFdKSk7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vYXJncyBhcmUgaWQsIGRlcHMsIGZhY3RvcnkuIFNob3VsZCBiZSBub3JtYWxpemVkIGJ5IHRoZQogICAgICAgICAgICAgICAgICAgIC8vZGVmaW5lKCkgZnVuY3Rpb24uCiAgICAgICAgICAgICAgICAgICAgY2FsbEdldE1vZHVsZShhcmdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjb250ZXh0LmRlZlF1ZXVlTWFwID0ge307CiAgICAgICAgfQoKICAgICAgICBjb250ZXh0ID0gewogICAgICAgICAgICBjb25maWc6IGNvbmZpZywKICAgICAgICAgICAgY29udGV4dE5hbWU6IGNvbnRleHROYW1lLAogICAgICAgICAgICByZWdpc3RyeTogcmVnaXN0cnksCiAgICAgICAgICAgIGRlZmluZWQ6IGRlZmluZWQsCiAgICAgICAgICAgIHVybEZldGNoZWQ6IHVybEZldGNoZWQsCiAgICAgICAgICAgIGRlZlF1ZXVlOiBkZWZRdWV1ZSwKICAgICAgICAgICAgZGVmUXVldWVNYXA6IHt9LAogICAgICAgICAgICBNb2R1bGU6IE1vZHVsZSwKICAgICAgICAgICAgbWFrZU1vZHVsZU1hcDogbWFrZU1vZHVsZU1hcCwKICAgICAgICAgICAgbmV4dFRpY2s6IHJlcS5uZXh0VGljaywKICAgICAgICAgICAgb25FcnJvcjogb25FcnJvciwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTZXQgYSBjb25maWd1cmF0aW9uIGZvciB0aGUgY29udGV4dC4KICAgICAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNmZyBjb25maWcgb2JqZWN0IHRvIGludGVncmF0ZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNvbmZpZ3VyZTogZnVuY3Rpb24gKGNmZykgewogICAgICAgICAgICAgICAgLy9NYWtlIHN1cmUgdGhlIGJhc2VVcmwgZW5kcyBpbiBhIHNsYXNoLgogICAgICAgICAgICAgICAgaWYgKGNmZy5iYXNlVXJsKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNmZy5iYXNlVXJsLmNoYXJBdChjZmcuYmFzZVVybC5sZW5ndGggLSAxKSAhPT0gJy8nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNmZy5iYXNlVXJsICs9ICcvJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gQ29udmVydCBvbGQgc3R5bGUgdXJsQXJncyBzdHJpbmcgdG8gYSBmdW5jdGlvbi4KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2ZnLnVybEFyZ3MgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHVybEFyZ3MgPSBjZmcudXJsQXJnczsKICAgICAgICAgICAgICAgICAgICBjZmcudXJsQXJncyA9IGZ1bmN0aW9uKGlkLCB1cmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1cmwuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJykgKyB1cmxBcmdzOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy9TYXZlIG9mZiB0aGUgcGF0aHMgc2luY2UgdGhleSByZXF1aXJlIHNwZWNpYWwgcHJvY2Vzc2luZywKICAgICAgICAgICAgICAgIC8vdGhleSBhcmUgYWRkaXRpdmUuCiAgICAgICAgICAgICAgICB2YXIgc2hpbSA9IGNvbmZpZy5zaGltLAogICAgICAgICAgICAgICAgICAgIG9ianMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBidW5kbGVzOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcDogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgZWFjaFByb3AoY2ZnLCBmdW5jdGlvbiAodmFsdWUsIHByb3ApIHsKICAgICAgICAgICAgICAgICAgICBpZiAob2Jqc1twcm9wXSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZ1twcm9wXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnW3Byb3BdID0ge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgbWl4aW4oY29uZmlnW3Byb3BdLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnW3Byb3BdID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy9SZXZlcnNlIG1hcCB0aGUgYnVuZGxlcwogICAgICAgICAgICAgICAgaWYgKGNmZy5idW5kbGVzKSB7CiAgICAgICAgICAgICAgICAgICAgZWFjaFByb3AoY2ZnLmJ1bmRsZXMsIGZ1bmN0aW9uICh2YWx1ZSwgcHJvcCkgewogICAgICAgICAgICAgICAgICAgICAgICBlYWNoKHZhbHVlLCBmdW5jdGlvbiAodikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHYgIT09IHByb3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGVzTWFwW3ZdID0gcHJvcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy9NZXJnZSBzaGltCiAgICAgICAgICAgICAgICBpZiAoY2ZnLnNoaW0pIHsKICAgICAgICAgICAgICAgICAgICBlYWNoUHJvcChjZmcuc2hpbSwgZnVuY3Rpb24gKHZhbHVlLCBpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAvL05vcm1hbGl6ZSB0aGUgc3RydWN0dXJlCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0FycmF5KHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwczogdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh2YWx1ZS5leHBvcnRzIHx8IHZhbHVlLmluaXQpICYmICF2YWx1ZS5leHBvcnRzRm4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLmV4cG9ydHNGbiA9IGNvbnRleHQubWFrZVNoaW1FeHBvcnRzKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBzaGltW2lkXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zaGltID0gc2hpbTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL0FkanVzdCBwYWNrYWdlcyBpZiBuZWNlc3NhcnkuCiAgICAgICAgICAgICAgICBpZiAoY2ZnLnBhY2thZ2VzKSB7CiAgICAgICAgICAgICAgICAgICAgZWFjaChjZmcucGFja2FnZXMsIGZ1bmN0aW9uIChwa2dPYmopIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGxvY2F0aW9uLCBuYW1lOwoKICAgICAgICAgICAgICAgICAgICAgICAgcGtnT2JqID0gdHlwZW9mIHBrZ09iaiA9PT0gJ3N0cmluZycgPyB7bmFtZTogcGtnT2JqfSA6IHBrZ09iajsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwa2dPYmoubmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gPSBwa2dPYmoubG9jYXRpb247CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnBhdGhzW25hbWVdID0gcGtnT2JqLmxvY2F0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvL1NhdmUgcG9pbnRlciB0byBtYWluIG1vZHVsZSBJRCBmb3IgcGtnIG5hbWUuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vUmVtb3ZlIGxlYWRpbmcgZG90IGluIG1haW4sIHNvIG1haW4gcGF0aHMgYXJlIG5vcm1hbGl6ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vYW5kIHJlbW92ZSBhbnkgdHJhaWxpbmcgLmpzLCBzaW5jZSBkaWZmZXJlbnQgcGFja2FnZQogICAgICAgICAgICAgICAgICAgICAgICAvL2VudnMgaGF2ZSBkaWZmZXJlbnQgY29udmVudGlvbnM6IHNvbWUgdXNlIGEgbW9kdWxlIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vc29tZSB1c2UgYSBmaWxlIG5hbWUuCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5wa2dzW25hbWVdID0gcGtnT2JqLm5hbWUgKyAnLycgKyAocGtnT2JqLm1haW4gfHwgJ21haW4nKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoY3VyckRpclJlZ0V4cCwgJycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShqc1N1ZmZpeFJlZ0V4cCwgJycpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vSWYgdGhlcmUgYXJlIGFueSAid2FpdGluZyB0byBleGVjdXRlIiBtb2R1bGVzIGluIHRoZSByZWdpc3RyeSwKICAgICAgICAgICAgICAgIC8vdXBkYXRlIHRoZSBtYXBzIGZvciB0aGVtLCBzaW5jZSB0aGVpciBpbmZvLCBsaWtlIFVSTHMgdG8gbG9hZCwKICAgICAgICAgICAgICAgIC8vbWF5IGhhdmUgY2hhbmdlZC4KICAgICAgICAgICAgICAgIGVhY2hQcm9wKHJlZ2lzdHJ5LCBmdW5jdGlvbiAobW9kLCBpZCkgewogICAgICAgICAgICAgICAgICAgIC8vSWYgbW9kdWxlIGFscmVhZHkgaGFzIGluaXQgY2FsbGVkLCBzaW5jZSBpdCBpcyB0b28KICAgICAgICAgICAgICAgICAgICAvL2xhdGUgdG8gbW9kaWZ5IHRoZW0sIGFuZCBpZ25vcmUgdW5ub3JtYWxpemVkIG9uZXMKICAgICAgICAgICAgICAgICAgICAvL3NpbmNlIHRoZXkgYXJlIHRyYW5zaWVudC4KICAgICAgICAgICAgICAgICAgICBpZiAoIW1vZC5pbml0ZWQgJiYgIW1vZC5tYXAudW5ub3JtYWxpemVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1vZC5tYXAgPSBtYWtlTW9kdWxlTWFwKGlkLCBudWxsLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvL0lmIGEgZGVwcyBhcnJheSBvciBhIGNvbmZpZyBjYWxsYmFjayBpcyBzcGVjaWZpZWQsIHRoZW4gY2FsbAogICAgICAgICAgICAgICAgLy9yZXF1aXJlIHdpdGggdGhvc2UgYXJncy4gVGhpcyBpcyB1c2VmdWwgd2hlbiByZXF1aXJlIGlzIGRlZmluZWQgYXMgYQogICAgICAgICAgICAgICAgLy9jb25maWcgb2JqZWN0IGJlZm9yZSByZXF1aXJlLmpzIGlzIGxvYWRlZC4KICAgICAgICAgICAgICAgIGlmIChjZmcuZGVwcyB8fCBjZmcuY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlcXVpcmUoY2ZnLmRlcHMgfHwgW10sIGNmZy5jYWxsYmFjayk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBtYWtlU2hpbUV4cG9ydHM6IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICAgICAgZnVuY3Rpb24gZm4oKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldDsKICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUuaW5pdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXQgPSB2YWx1ZS5pbml0LmFwcGx5KGdsb2JhbCwgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldCB8fCAodmFsdWUuZXhwb3J0cyAmJiBnZXRHbG9iYWwodmFsdWUuZXhwb3J0cykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGZuOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgbWFrZVJlcXVpcmU6IGZ1bmN0aW9uIChyZWxNYXAsIG9wdGlvbnMpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwoKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGxvY2FsUmVxdWlyZShkZXBzLCBjYWxsYmFjaywgZXJyYmFjaykgewogICAgICAgICAgICAgICAgICAgIHZhciBpZCwgbWFwLCByZXF1aXJlTW9kOwoKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5lbmFibGVCdWlsZENhbGxiYWNrICYmIGNhbGxiYWNrICYmIGlzRnVuY3Rpb24oY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLl9fcmVxdWlyZUpzQnVpbGQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkZXBzID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihjYWxsYmFjaykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSW52YWxpZCBjYWxsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ3JlcXVpcmVhcmdzJywgJ0ludmFsaWQgcmVxdWlyZSBjYWxsJyksIGVycmJhY2spOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvL0lmIHJlcXVpcmV8ZXhwb3J0c3xtb2R1bGUgYXJlIHJlcXVlc3RlZCwgZ2V0IHRoZQogICAgICAgICAgICAgICAgICAgICAgICAvL3ZhbHVlIGZvciB0aGVtIGZyb20gdGhlIHNwZWNpYWwgaGFuZGxlcnMuIENhdmVhdDoKICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIG9ubHkgd29ya3Mgd2hpbGUgbW9kdWxlIGlzIGJlaW5nIGRlZmluZWQuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWxNYXAgJiYgaGFzUHJvcChoYW5kbGVycywgZGVwcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoYW5kbGVyc1tkZXBzXShyZWdpc3RyeVtyZWxNYXAuaWRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy9TeW5jaHJvbm91cyBhY2Nlc3MgdG8gb25lIG1vZHVsZS4gSWYgcmVxdWlyZS5nZXQgaXMKICAgICAgICAgICAgICAgICAgICAgICAgLy9hdmFpbGFibGUgKGFzIGluIHRoZSBOb2RlIGFkYXB0ZXIpLCBwcmVmZXIgdGhhdC4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcS5nZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXEuZ2V0KGNvbnRleHQsIGRlcHMsIHJlbE1hcCwgbG9jYWxSZXF1aXJlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy9Ob3JtYWxpemUgbW9kdWxlIG5hbWUsIGlmIGl0IGNvbnRhaW5zIC4gb3IgLi4KICAgICAgICAgICAgICAgICAgICAgICAgbWFwID0gbWFrZU1vZHVsZU1hcChkZXBzLCByZWxNYXAsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSBtYXAuaWQ7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhc1Byb3AoZGVmaW5lZCwgaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ25vdGxvYWRlZCcsICdNb2R1bGUgbmFtZSAiJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIiBoYXMgbm90IGJlZW4gbG9hZGVkIHlldCBmb3IgY29udGV4dDogJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0TmFtZSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVsTWFwID8gJycgOiAnLiBVc2UgcmVxdWlyZShbXSknKSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWZpbmVkW2lkXTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vR3JhYiBkZWZpbmVzIHdhaXRpbmcgaW4gdGhlIGdsb2JhbCBxdWV1ZS4KICAgICAgICAgICAgICAgICAgICBpbnRha2VEZWZpbmVzKCk7CgogICAgICAgICAgICAgICAgICAgIC8vTWFyayBhbGwgdGhlIGRlcGVuZGVuY2llcyBhcyBuZWVkaW5nIHRvIGJlIGxvYWRlZC4KICAgICAgICAgICAgICAgICAgICBjb250ZXh0Lm5leHRUaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9Tb21lIGRlZmluZXMgY291bGQgaGF2ZSBiZWVuIGFkZGVkIHNpbmNlIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAvL3JlcXVpcmUgY2FsbCwgY29sbGVjdCB0aGVtLgogICAgICAgICAgICAgICAgICAgICAgICBpbnRha2VEZWZpbmVzKCk7CgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlTW9kID0gZ2V0TW9kdWxlKG1ha2VNb2R1bGVNYXAobnVsbCwgcmVsTWFwKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvL1N0b3JlIGlmIG1hcCBjb25maWcgc2hvdWxkIGJlIGFwcGxpZWQgdG8gdGhpcyByZXF1aXJlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vY2FsbCBmb3IgZGVwZW5kZW5jaWVzLgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlTW9kLnNraXBNYXAgPSBvcHRpb25zLnNraXBNYXA7CgogICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlTW9kLmluaXQoZGVwcywgY2FsbGJhY2ssIGVycmJhY2ssIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgICAgICBjaGVja0xvYWRlZCgpOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9jYWxSZXF1aXJlOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG1peGluKGxvY2FsUmVxdWlyZSwgewogICAgICAgICAgICAgICAgICAgIGlzQnJvd3NlcjogaXNCcm93c2VyLAoKICAgICAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAgICAgKiBDb252ZXJ0cyBhIG1vZHVsZSBuYW1lICsgLmV4dGVuc2lvbiBpbnRvIGFuIFVSTCBwYXRoLgogICAgICAgICAgICAgICAgICAgICAqICpSZXF1aXJlcyogdGhlIHVzZSBvZiBhIG1vZHVsZSBuYW1lLiBJdCBkb2VzIG5vdCBzdXBwb3J0IHVzaW5nCiAgICAgICAgICAgICAgICAgICAgICogcGxhaW4gVVJMcyBsaWtlIG5hbWVUb1VybC4KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICB0b1VybDogZnVuY3Rpb24gKG1vZHVsZU5hbWVQbHVzRXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IG1vZHVsZU5hbWVQbHVzRXh0Lmxhc3RJbmRleE9mKCcuJyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50ID0gbW9kdWxlTmFtZVBsdXNFeHQuc3BsaXQoJy8nKVswXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVsYXRpdmUgPSBzZWdtZW50ID09PSAnLicgfHwgc2VnbWVudCA9PT0gJy4uJzsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vSGF2ZSBhIGZpbGUgZXh0ZW5zaW9uIGFsaWFzLCBhbmQgaXQgaXMgbm90IHRoZQogICAgICAgICAgICAgICAgICAgICAgICAvL2RvdHMgZnJvbSBhIHJlbGF0aXZlIHBhdGguCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEgJiYgKCFpc1JlbGF0aXZlIHx8IGluZGV4ID4gMSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dCA9IG1vZHVsZU5hbWVQbHVzRXh0LnN1YnN0cmluZyhpbmRleCwgbW9kdWxlTmFtZVBsdXNFeHQubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZU5hbWVQbHVzRXh0ID0gbW9kdWxlTmFtZVBsdXNFeHQuc3Vic3RyaW5nKDAsIGluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQubmFtZVRvVXJsKG5vcm1hbGl6ZShtb2R1bGVOYW1lUGx1c0V4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsTWFwICYmIHJlbE1hcC5pZCwgdHJ1ZSksIGV4dCwgIHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgIGRlZmluZWQ6IGZ1bmN0aW9uIChpZCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFzUHJvcChkZWZpbmVkLCBtYWtlTW9kdWxlTWFwKGlkLCByZWxNYXAsIGZhbHNlLCB0cnVlKS5pZCk7CiAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkOiBmdW5jdGlvbiAoaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWQgPSBtYWtlTW9kdWxlTWFwKGlkLCByZWxNYXAsIGZhbHNlLCB0cnVlKS5pZDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhc1Byb3AoZGVmaW5lZCwgaWQpIHx8IGhhc1Byb3AocmVnaXN0cnksIGlkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvL09ubHkgYWxsb3cgdW5kZWYgb24gdG9wIGxldmVsIHJlcXVpcmUgY2FsbHMKICAgICAgICAgICAgICAgIGlmICghcmVsTWFwKSB7CiAgICAgICAgICAgICAgICAgICAgbG9jYWxSZXF1aXJlLnVuZGVmID0gZnVuY3Rpb24gKGlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vQmluZCBhbnkgd2FpdGluZyBkZWZpbmUoKSBjYWxscyB0byB0aGlzIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vZml4IGZvciAjNDA4CiAgICAgICAgICAgICAgICAgICAgICAgIHRha2VHbG9iYWxRdWV1ZSgpOwoKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1hcCA9IG1ha2VNb2R1bGVNYXAoaWQsIHJlbE1hcCwgdHJ1ZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2QgPSBnZXRPd24ocmVnaXN0cnksIGlkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZC51bmRlZmVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlU2NyaXB0KGlkKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBkZWZpbmVkW2lkXTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHVybEZldGNoZWRbbWFwLnVybF07CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB1bmRlZkV2ZW50c1tpZF07CgogICAgICAgICAgICAgICAgICAgICAgICAvL0NsZWFuIHF1ZXVlZCBkZWZpbmVzIHRvby4gR28gYmFja3dhcmRzCiAgICAgICAgICAgICAgICAgICAgICAgIC8vaW4gYXJyYXkgc28gdGhhdCB0aGUgc3BsaWNlcyBkbyBub3QKICAgICAgICAgICAgICAgICAgICAgICAgLy9tZXNzIHVwIHRoZSBpdGVyYXRpb24uCiAgICAgICAgICAgICAgICAgICAgICAgIGVhY2hSZXZlcnNlKGRlZlF1ZXVlLCBmdW5jdGlvbihhcmdzLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1swXSA9PT0gaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZRdWV1ZS5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgY29udGV4dC5kZWZRdWV1ZU1hcFtpZF07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0hvbGQgb24gdG8gbGlzdGVuZXJzIGluIGNhc2UgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL21vZHVsZSB3aWxsIGJlIGF0dGVtcHRlZCB0byBiZSByZWxvYWRlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy91c2luZyBhIGRpZmZlcmVudCBjb25maWcuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9kLmV2ZW50cy5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZWZFdmVudHNbaWRdID0gbW9kLmV2ZW50czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhblJlZ2lzdHJ5KGlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsUmVxdWlyZTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsZWQgdG8gZW5hYmxlIGEgbW9kdWxlIGlmIGl0IGlzIHN0aWxsIGluIHRoZSByZWdpc3RyeQogICAgICAgICAgICAgKiBhd2FpdGluZyBlbmFibGVtZW50LiBBIHNlY29uZCBhcmcsIHBhcmVudCwgdGhlIHBhcmVudCBtb2R1bGUsCiAgICAgICAgICAgICAqIGlzIHBhc3NlZCBpbiBmb3IgY29udGV4dCwgd2hlbiB0aGlzIG1ldGhvZCBpcyBvdmVycmlkZGVuIGJ5CiAgICAgICAgICAgICAqIHRoZSBvcHRpbWl6ZXIuIE5vdCBzaG93biBoZXJlIHRvIGtlZXAgY29kZSBjb21wYWN0LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZW5hYmxlOiBmdW5jdGlvbiAoZGVwTWFwKSB7CiAgICAgICAgICAgICAgICB2YXIgbW9kID0gZ2V0T3duKHJlZ2lzdHJ5LCBkZXBNYXAuaWQpOwogICAgICAgICAgICAgICAgaWYgKG1vZCkgewogICAgICAgICAgICAgICAgICAgIGdldE1vZHVsZShkZXBNYXApLmVuYWJsZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEludGVybmFsIG1ldGhvZCB1c2VkIGJ5IGVudmlyb25tZW50IGFkYXB0ZXJzIHRvIGNvbXBsZXRlIGEgbG9hZCBldmVudC4KICAgICAgICAgICAgICogQSBsb2FkIGV2ZW50IGNvdWxkIGJlIGEgc2NyaXB0IGxvYWQgb3IganVzdCBhIGxvYWQgcGFzcyBmcm9tIGEgc3luY2hyb25vdXMKICAgICAgICAgICAgICogbG9hZCBjYWxsLgogICAgICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbW9kdWxlTmFtZSB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIHRvIHBvdGVudGlhbGx5IGNvbXBsZXRlLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgY29tcGxldGVMb2FkOiBmdW5jdGlvbiAobW9kdWxlTmFtZSkgewogICAgICAgICAgICAgICAgdmFyIGZvdW5kLCBhcmdzLCBtb2QsCiAgICAgICAgICAgICAgICAgICAgc2hpbSA9IGdldE93bihjb25maWcuc2hpbSwgbW9kdWxlTmFtZSkgfHwge30sCiAgICAgICAgICAgICAgICAgICAgc2hFeHBvcnRzID0gc2hpbS5leHBvcnRzOwoKICAgICAgICAgICAgICAgIHRha2VHbG9iYWxRdWV1ZSgpOwoKICAgICAgICAgICAgICAgIHdoaWxlIChkZWZRdWV1ZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBhcmdzID0gZGVmUXVldWUuc2hpZnQoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoYXJnc1swXSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBhcmdzWzBdID0gbW9kdWxlTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiBhbHJlYWR5IGZvdW5kIGFuIGFub255bW91cyBtb2R1bGUgYW5kIGJvdW5kIGl0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdG8gdGhpcyBuYW1lLCB0aGVuIHRoaXMgaXMgc29tZSBvdGhlciBhbm9uIG1vZHVsZQogICAgICAgICAgICAgICAgICAgICAgICAvL3dhaXRpbmcgZm9yIGl0cyBjb21wbGV0ZUxvYWQgdG8gZmlyZS4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzWzBdID09PSBtb2R1bGVOYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vRm91bmQgbWF0Y2hpbmcgZGVmaW5lIGNhbGwgZm9yIHRoaXMgc2NyaXB0IQogICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBjYWxsR2V0TW9kdWxlKGFyZ3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGV4dC5kZWZRdWV1ZU1hcCA9IHt9OwoKICAgICAgICAgICAgICAgIC8vRG8gdGhpcyBhZnRlciB0aGUgY3ljbGUgb2YgY2FsbEdldE1vZHVsZSBpbiBjYXNlIHRoZSByZXN1bHQKICAgICAgICAgICAgICAgIC8vb2YgdGhvc2UgY2FsbHMvaW5pdCBjYWxscyBjaGFuZ2VzIHRoZSByZWdpc3RyeS4KICAgICAgICAgICAgICAgIG1vZCA9IGdldE93bihyZWdpc3RyeSwgbW9kdWxlTmFtZSk7CgogICAgICAgICAgICAgICAgaWYgKCFmb3VuZCAmJiAhaGFzUHJvcChkZWZpbmVkLCBtb2R1bGVOYW1lKSAmJiBtb2QgJiYgIW1vZC5pbml0ZWQpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnLmVuZm9yY2VEZWZpbmUgJiYgKCFzaEV4cG9ydHMgfHwgIWdldEdsb2JhbChzaEV4cG9ydHMpKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUGF0aEZhbGxiYWNrKG1vZHVsZU5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ25vZGVmaW5lJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ05vIGRlZmluZSBjYWxsIGZvciAnICsgbW9kdWxlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW21vZHVsZU5hbWVdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvL0Egc2NyaXB0IHRoYXQgZG9lcyBub3QgY2FsbCBkZWZpbmUoKSwgc28ganVzdCBzaW11bGF0ZQogICAgICAgICAgICAgICAgICAgICAgICAvL3RoZSBjYWxsIGZvciBpdC4KICAgICAgICAgICAgICAgICAgICAgICAgY2FsbEdldE1vZHVsZShbbW9kdWxlTmFtZSwgKHNoaW0uZGVwcyB8fCBbXSksIHNoaW0uZXhwb3J0c0ZuXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNoZWNrTG9hZGVkKCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ29udmVydHMgYSBtb2R1bGUgbmFtZSB0byBhIGZpbGUgcGF0aC4gU3VwcG9ydHMgY2FzZXMgd2hlcmUKICAgICAgICAgICAgICogbW9kdWxlTmFtZSBtYXkgYWN0dWFsbHkgYmUganVzdCBhbiBVUkwuCiAgICAgICAgICAgICAqIE5vdGUgdGhhdCBpdCAqKmRvZXMgbm90KiogY2FsbCBub3JtYWxpemUgb24gdGhlIG1vZHVsZU5hbWUsCiAgICAgICAgICAgICAqIGl0IGlzIGFzc3VtZWQgdG8gaGF2ZSBhbHJlYWR5IGJlZW4gbm9ybWFsaXplZC4gVGhpcyBpcyBhbgogICAgICAgICAgICAgKiBpbnRlcm5hbCBBUEksIG5vdCBhIHB1YmxpYyBvbmUuIFVzZSB0b1VybCBmb3IgdGhlIHB1YmxpYyBBUEkuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBuYW1lVG9Vcmw6IGZ1bmN0aW9uIChtb2R1bGVOYW1lLCBleHQsIHNraXBFeHQpIHsKICAgICAgICAgICAgICAgIHZhciBwYXRocywgc3ltcywgaSwgcGFyZW50TW9kdWxlLCB1cmwsCiAgICAgICAgICAgICAgICAgICAgcGFyZW50UGF0aCwgYnVuZGxlSWQsCiAgICAgICAgICAgICAgICAgICAgcGtnTWFpbiA9IGdldE93bihjb25maWcucGtncywgbW9kdWxlTmFtZSk7CgogICAgICAgICAgICAgICAgaWYgKHBrZ01haW4pIHsKICAgICAgICAgICAgICAgICAgICBtb2R1bGVOYW1lID0gcGtnTWFpbjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBidW5kbGVJZCA9IGdldE93bihidW5kbGVzTWFwLCBtb2R1bGVOYW1lKTsKCiAgICAgICAgICAgICAgICBpZiAoYnVuZGxlSWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5uYW1lVG9VcmwoYnVuZGxlSWQsIGV4dCwgc2tpcEV4dCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy9JZiBhIGNvbG9uIGlzIGluIHRoZSBVUkwsIGl0IGluZGljYXRlcyBhIHByb3RvY29sIGlzIHVzZWQgYW5kIGl0IGlzIGp1c3QKICAgICAgICAgICAgICAgIC8vYW4gVVJMIHRvIGEgZmlsZSwgb3IgaWYgaXQgc3RhcnRzIHdpdGggYSBzbGFzaCwgY29udGFpbnMgYSBxdWVyeSBhcmcgKGkuZS4gPykKICAgICAgICAgICAgICAgIC8vb3IgZW5kcyB3aXRoIC5qcywgdGhlbiBhc3N1bWUgdGhlIHVzZXIgbWVhbnQgdG8gdXNlIGFuIHVybCBhbmQgbm90IGEgbW9kdWxlIGlkLgogICAgICAgICAgICAgICAgLy9UaGUgc2xhc2ggaXMgaW1wb3J0YW50IGZvciBwcm90b2NvbC1sZXNzIFVSTHMgYXMgd2VsbCBhcyBmdWxsIHBhdGhzLgogICAgICAgICAgICAgICAgaWYgKHJlcS5qc0V4dFJlZ0V4cC50ZXN0KG1vZHVsZU5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgLy9KdXN0IGEgcGxhaW4gcGF0aCwgbm90IG1vZHVsZSBuYW1lIGxvb2t1cCwgc28ganVzdCByZXR1cm4gaXQuCiAgICAgICAgICAgICAgICAgICAgLy9BZGQgZXh0ZW5zaW9uIGlmIGl0IGlzIGluY2x1ZGVkLiBUaGlzIGlzIGEgYml0IHdvbmt5LCBvbmx5IG5vbi0uanMgdGhpbmdzIHBhc3MKICAgICAgICAgICAgICAgICAgICAvL2FuIGV4dGVuc2lvbiwgdGhpcyBtZXRob2QgcHJvYmFibHkgbmVlZHMgdG8gYmUgcmV3b3JrZWQuCiAgICAgICAgICAgICAgICAgICAgdXJsID0gbW9kdWxlTmFtZSArIChleHQgfHwgJycpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvL0EgbW9kdWxlIHRoYXQgbmVlZHMgdG8gYmUgY29udmVydGVkIHRvIGEgcGF0aC4KICAgICAgICAgICAgICAgICAgICBwYXRocyA9IGNvbmZpZy5wYXRoczsKCiAgICAgICAgICAgICAgICAgICAgc3ltcyA9IG1vZHVsZU5hbWUuc3BsaXQoJy8nKTsKICAgICAgICAgICAgICAgICAgICAvL0ZvciBlYWNoIG1vZHVsZSBuYW1lIHNlZ21lbnQsIHNlZSBpZiB0aGVyZSBpcyBhIHBhdGgKICAgICAgICAgICAgICAgICAgICAvL3JlZ2lzdGVyZWQgZm9yIGl0LiBTdGFydCB3aXRoIG1vc3Qgc3BlY2lmaWMgbmFtZQogICAgICAgICAgICAgICAgICAgIC8vYW5kIHdvcmsgdXAgZnJvbSBpdC4KICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSBzeW1zLmxlbmd0aDsgaSA+IDA7IGkgLT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRNb2R1bGUgPSBzeW1zLnNsaWNlKDAsIGkpLmpvaW4oJy8nKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFBhdGggPSBnZXRPd24ocGF0aHMsIHBhcmVudE1vZHVsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnRQYXRoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0lmIGFuIGFycmF5LCBpdCBtZWFucyB0aGVyZSBhcmUgYSBmZXcgY2hvaWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vQ2hvb3NlIHRoZSBvbmUgdGhhdCBpcyBkZXNpcmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheShwYXJlbnRQYXRoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFBhdGggPSBwYXJlbnRQYXRoWzBdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltcy5zcGxpY2UoMCwgaSwgcGFyZW50UGF0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy9Kb2luIHRoZSBwYXRoIHBhcnRzIHRvZ2V0aGVyLCB0aGVuIGZpZ3VyZSBvdXQgaWYgYmFzZVVybCBpcyBuZWVkZWQuCiAgICAgICAgICAgICAgICAgICAgdXJsID0gc3ltcy5qb2luKCcvJyk7CiAgICAgICAgICAgICAgICAgICAgdXJsICs9IChleHQgfHwgKC9eZGF0YVw6fF5ibG9iXDp8XD8vLnRlc3QodXJsKSB8fCBza2lwRXh0ID8gJycgOiAnLmpzJykpOwogICAgICAgICAgICAgICAgICAgIHVybCA9ICh1cmwuY2hhckF0KDApID09PSAnLycgfHwgdXJsLm1hdGNoKC9eW1x3XCtcLlwtXSs6LykgPyAnJyA6IGNvbmZpZy5iYXNlVXJsKSArIHVybDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnLnVybEFyZ3MgJiYgIS9eYmxvYlw6Ly50ZXN0KHVybCkgPwogICAgICAgICAgICAgICAgICAgICAgIHVybCArIGNvbmZpZy51cmxBcmdzKG1vZHVsZU5hbWUsIHVybCkgOiB1cmw7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvL0RlbGVnYXRlcyB0byByZXEubG9hZC4gQnJva2VuIG91dCBhcyBhIHNlcGFyYXRlIGZ1bmN0aW9uIHRvCiAgICAgICAgICAgIC8vYWxsb3cgb3ZlcnJpZGluZyBpbiB0aGUgb3B0aW1pemVyLgogICAgICAgICAgICBsb2FkOiBmdW5jdGlvbiAoaWQsIHVybCkgewogICAgICAgICAgICAgICAgcmVxLmxvYWQoY29udGV4dCwgaWQsIHVybCk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRXhlY3V0ZXMgYSBtb2R1bGUgY2FsbGJhY2sgZnVuY3Rpb24uIEJyb2tlbiBvdXQgYXMgYSBzZXBhcmF0ZSBmdW5jdGlvbgogICAgICAgICAgICAgKiBzb2xlbHkgdG8gYWxsb3cgdGhlIGJ1aWxkIHN5c3RlbSB0byBzZXF1ZW5jZSB0aGUgZmlsZXMgaW4gdGhlIGJ1aWx0CiAgICAgICAgICAgICAqIGxheWVyIGluIHRoZSByaWdodCBzZXF1ZW5jZS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGV4ZWNDYjogZnVuY3Rpb24gKG5hbWUsIGNhbGxiYWNrLCBhcmdzLCBleHBvcnRzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkoZXhwb3J0cywgYXJncyk7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogY2FsbGJhY2sgZm9yIHNjcmlwdCBsb2FkcywgdXNlZCB0byBjaGVjayBzdGF0dXMgb2YgbG9hZGluZy4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHBhcmFtIHtFdmVudH0gZXZ0IHRoZSBldmVudCBmcm9tIHRoZSBicm93c2VyIGZvciB0aGUgc2NyaXB0CiAgICAgICAgICAgICAqIHRoYXQgd2FzIGxvYWRlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uU2NyaXB0TG9hZDogZnVuY3Rpb24gKGV2dCkgewogICAgICAgICAgICAgICAgLy9Vc2luZyBjdXJyZW50VGFyZ2V0IGluc3RlYWQgb2YgdGFyZ2V0IGZvciBGaXJlZm94IDIuMCdzIHNha2UuIE5vdAogICAgICAgICAgICAgICAgLy9hbGwgb2xkIGJyb3dzZXJzIHdpbGwgYmUgc3VwcG9ydGVkLCBidXQgdGhpcyBvbmUgd2FzIGVhc3kgZW5vdWdoCiAgICAgICAgICAgICAgICAvL3RvIHN1cHBvcnQgYW5kIHN0aWxsIG1ha2VzIHNlbnNlLgogICAgICAgICAgICAgICAgaWYgKGV2dC50eXBlID09PSAnbG9hZCcgfHwKICAgICAgICAgICAgICAgICAgICAgICAgKHJlYWR5UmVnRXhwLnRlc3QoKGV2dC5jdXJyZW50VGFyZ2V0IHx8IGV2dC5zcmNFbGVtZW50KS5yZWFkeVN0YXRlKSkpIHsKICAgICAgICAgICAgICAgICAgICAvL1Jlc2V0IGludGVyYWN0aXZlIHNjcmlwdCBzbyBhIHNjcmlwdCBub2RlIGlzIG5vdCBoZWxkIG9udG8gZm9yCiAgICAgICAgICAgICAgICAgICAgLy90byBsb25nLgogICAgICAgICAgICAgICAgICAgIGludGVyYWN0aXZlU2NyaXB0ID0gbnVsbDsKCiAgICAgICAgICAgICAgICAgICAgLy9QdWxsIG91dCB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlIGFuZCB0aGUgY29udGV4dC4KICAgICAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IGdldFNjcmlwdERhdGEoZXZ0KTsKICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmNvbXBsZXRlTG9hZChkYXRhLmlkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsYmFjayBmb3Igc2NyaXB0IGVycm9ycy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9uU2NyaXB0RXJyb3I6IGZ1bmN0aW9uIChldnQpIHsKICAgICAgICAgICAgICAgIHZhciBkYXRhID0gZ2V0U2NyaXB0RGF0YShldnQpOwogICAgICAgICAgICAgICAgaWYgKCFoYXNQYXRoRmFsbGJhY2soZGF0YS5pZCkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGFyZW50cyA9IFtdOwogICAgICAgICAgICAgICAgICAgIGVhY2hQcm9wKHJlZ2lzdHJ5LCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXkuaW5kZXhPZignX0ByJykgIT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhY2godmFsdWUuZGVwTWFwcywgZnVuY3Rpb24oZGVwTWFwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlcE1hcC5pZCA9PT0gZGF0YS5pZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRzLnB1c2goa2V5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ3NjcmlwdGVycm9yJywgJ1NjcmlwdCBlcnJvciBmb3IgIicgKyBkYXRhLmlkICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmVudHMubGVuZ3RoID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyIsIG5lZWRlZCBieTogJyArIHBhcmVudHMuam9pbignLCAnKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICciJyksIGV2dCwgW2RhdGEuaWRdKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBjb250ZXh0LnJlcXVpcmUgPSBjb250ZXh0Lm1ha2VSZXF1aXJlKCk7CiAgICAgICAgcmV0dXJuIGNvbnRleHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBNYWluIGVudHJ5IHBvaW50LgogICAgICoKICAgICAqIElmIHRoZSBvbmx5IGFyZ3VtZW50IHRvIHJlcXVpcmUgaXMgYSBzdHJpbmcsIHRoZW4gdGhlIG1vZHVsZSB0aGF0CiAgICAgKiBpcyByZXByZXNlbnRlZCBieSB0aGF0IHN0cmluZyBpcyBmZXRjaGVkIGZvciB0aGUgYXBwcm9wcmlhdGUgY29udGV4dC4KICAgICAqCiAgICAgKiBJZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYW4gYXJyYXksIHRoZW4gaXQgd2lsbCBiZSB0cmVhdGVkIGFzIGFuIGFycmF5CiAgICAgKiBvZiBkZXBlbmRlbmN5IHN0cmluZyBuYW1lcyB0byBmZXRjaC4gQW4gb3B0aW9uYWwgZnVuY3Rpb24gY2FsbGJhY2sgY2FuCiAgICAgKiBiZSBzcGVjaWZpZWQgdG8gZXhlY3V0ZSB3aGVuIGFsbCBvZiB0aG9zZSBkZXBlbmRlbmNpZXMgYXJlIGF2YWlsYWJsZS4KICAgICAqCiAgICAgKiBNYWtlIGEgbG9jYWwgcmVxIHZhcmlhYmxlIHRvIGhlbHAgQ2FqYSBjb21wbGlhbmNlIChpdCBhc3N1bWVzIHRoaW5ncwogICAgICogb24gYSByZXF1aXJlIHRoYXQgYXJlIG5vdCBzdGFuZGFyZGl6ZWQpLCBhbmQgdG8gZ2l2ZSBhIHNob3J0CiAgICAgKiBuYW1lIGZvciBtaW5pZmljYXRpb24vbG9jYWwgc2NvcGUgdXNlLgogICAgICovCiAgICByZXEgPSByZXF1aXJlanMgPSBmdW5jdGlvbiAoZGVwcywgY2FsbGJhY2ssIGVycmJhY2ssIG9wdGlvbmFsKSB7CgogICAgICAgIC8vRmluZCB0aGUgcmlnaHQgY29udGV4dCwgdXNlIGRlZmF1bHQKICAgICAgICB2YXIgY29udGV4dCwgY29uZmlnLAogICAgICAgICAgICBjb250ZXh0TmFtZSA9IGRlZkNvbnRleHROYW1lOwoKICAgICAgICAvLyBEZXRlcm1pbmUgaWYgaGF2ZSBjb25maWcgb2JqZWN0IGluIHRoZSBjYWxsLgogICAgICAgIGlmICghaXNBcnJheShkZXBzKSAmJiB0eXBlb2YgZGVwcyAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgLy8gZGVwcyBpcyBhIGNvbmZpZyBvYmplY3QKICAgICAgICAgICAgY29uZmlnID0gZGVwczsKICAgICAgICAgICAgaWYgKGlzQXJyYXkoY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAvLyBBZGp1c3QgYXJncyBpZiB0aGVyZSBhcmUgZGVwZW5kZW5jaWVzCiAgICAgICAgICAgICAgICBkZXBzID0gY2FsbGJhY2s7CiAgICAgICAgICAgICAgICBjYWxsYmFjayA9IGVycmJhY2s7CiAgICAgICAgICAgICAgICBlcnJiYWNrID0gb3B0aW9uYWw7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBkZXBzID0gW107CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLmNvbnRleHQpIHsKICAgICAgICAgICAgY29udGV4dE5hbWUgPSBjb25maWcuY29udGV4dDsKICAgICAgICB9CgogICAgICAgIGNvbnRleHQgPSBnZXRPd24oY29udGV4dHMsIGNvbnRleHROYW1lKTsKICAgICAgICBpZiAoIWNvbnRleHQpIHsKICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHRzW2NvbnRleHROYW1lXSA9IHJlcS5zLm5ld0NvbnRleHQoY29udGV4dE5hbWUpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGNvbmZpZykgewogICAgICAgICAgICBjb250ZXh0LmNvbmZpZ3VyZShjb25maWcpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGNvbnRleHQucmVxdWlyZShkZXBzLCBjYWxsYmFjaywgZXJyYmFjayk7CiAgICB9OwoKICAgIC8qKgogICAgICogU3VwcG9ydCByZXF1aXJlLmNvbmZpZygpIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGNvb3BlcmF0ZSB3aXRoIG90aGVyCiAgICAgKiBBTUQgbG9hZGVycyBvbiBnbG9iYWxseSBhZ3JlZWQgbmFtZXMuCiAgICAgKi8KICAgIHJlcS5jb25maWcgPSBmdW5jdGlvbiAoY29uZmlnKSB7CiAgICAgICAgcmV0dXJuIHJlcShjb25maWcpOwogICAgfTsKCiAgICAvKioKICAgICAqIEV4ZWN1dGUgc29tZXRoaW5nIGFmdGVyIHRoZSBjdXJyZW50IHRpY2sKICAgICAqIG9mIHRoZSBldmVudCBsb29wLiBPdmVycmlkZSBmb3Igb3RoZXIgZW52cwogICAgICogdGhhdCBoYXZlIGEgYmV0dGVyIHNvbHV0aW9uIHRoYW4gc2V0VGltZW91dC4KICAgICAqIEBwYXJhbSAge0Z1bmN0aW9ufSBmbiBmdW5jdGlvbiB0byBleGVjdXRlIGxhdGVyLgogICAgICovCiAgICByZXEubmV4dFRpY2sgPSB0eXBlb2Ygc2V0VGltZW91dCAhPT0gJ3VuZGVmaW5lZCcgPyBmdW5jdGlvbiAoZm4pIHsKICAgICAgICBzZXRUaW1lb3V0KGZuLCA0KTsKICAgIH0gOiBmdW5jdGlvbiAoZm4pIHsgZm4oKTsgfTsKCiAgICAvKioKICAgICAqIEV4cG9ydCByZXF1aXJlIGFzIGEgZ2xvYmFsLCBidXQgb25seSBpZiBpdCBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgogICAgICovCiAgICBpZiAoIXJlcXVpcmUpIHsKICAgICAgICByZXF1aXJlID0gcmVxOwogICAgfQoKICAgIHJlcS52ZXJzaW9uID0gdmVyc2lvbjsKCiAgICAvL1VzZWQgdG8gZmlsdGVyIG91dCBkZXBlbmRlbmNpZXMgdGhhdCBhcmUgYWxyZWFkeSBwYXRocy4KICAgIHJlcS5qc0V4dFJlZ0V4cCA9IC9eXC98OnxcP3xcLmpzJC87CiAgICByZXEuaXNCcm93c2VyID0gaXNCcm93c2VyOwogICAgcyA9IHJlcS5zID0gewogICAgICAgIGNvbnRleHRzOiBjb250ZXh0cywKICAgICAgICBuZXdDb250ZXh0OiBuZXdDb250ZXh0CiAgICB9OwoKICAgIC8vQ3JlYXRlIGRlZmF1bHQgY29udGV4dC4KICAgIHJlcSh7fSk7CgogICAgLy9FeHBvcnRzIHNvbWUgY29udGV4dC1zZW5zaXRpdmUgbWV0aG9kcyBvbiBnbG9iYWwgcmVxdWlyZS4KICAgIGVhY2goWwogICAgICAgICd0b1VybCcsCiAgICAgICAgJ3VuZGVmJywKICAgICAgICAnZGVmaW5lZCcsCiAgICAgICAgJ3NwZWNpZmllZCcKICAgIF0sIGZ1bmN0aW9uIChwcm9wKSB7CiAgICAgICAgLy9SZWZlcmVuY2UgZnJvbSBjb250ZXh0cyBpbnN0ZWFkIG9mIGVhcmx5IGJpbmRpbmcgdG8gZGVmYXVsdCBjb250ZXh0LAogICAgICAgIC8vc28gdGhhdCBkdXJpbmcgYnVpbGRzLCB0aGUgbGF0ZXN0IGluc3RhbmNlIG9mIHRoZSBkZWZhdWx0IGNvbnRleHQKICAgICAgICAvL3dpdGggaXRzIGNvbmZpZyBnZXRzIHVzZWQuCiAgICAgICAgcmVxW3Byb3BdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgY3R4ID0gY29udGV4dHNbZGVmQ29udGV4dE5hbWVdOwogICAgICAgICAgICByZXR1cm4gY3R4LnJlcXVpcmVbcHJvcF0uYXBwbHkoY3R4LCBhcmd1bWVudHMpOwogICAgICAgIH07CiAgICB9KTsKCiAgICBpZiAoaXNCcm93c2VyKSB7CiAgICAgICAgaGVhZCA9IHMuaGVhZCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdoZWFkJylbMF07CiAgICAgICAgLy9JZiBCQVNFIHRhZyBpcyBpbiBwbGF5LCB1c2luZyBhcHBlbmRDaGlsZCBpcyBhIHByb2JsZW0gZm9yIElFNi4KICAgICAgICAvL1doZW4gdGhhdCBicm93c2VyIGRpZXMsIHRoaXMgY2FuIGJlIHJlbW92ZWQuIERldGFpbHMgaW4gdGhpcyBqUXVlcnkgYnVnOgogICAgICAgIC8vaHR0cDovL2Rldi5qcXVlcnkuY29tL3RpY2tldC8yNzA5CiAgICAgICAgYmFzZUVsZW1lbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnYmFzZScpWzBdOwogICAgICAgIGlmIChiYXNlRWxlbWVudCkgewogICAgICAgICAgICBoZWFkID0gcy5oZWFkID0gYmFzZUVsZW1lbnQucGFyZW50Tm9kZTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBBbnkgZXJyb3JzIHRoYXQgcmVxdWlyZSBleHBsaWNpdGx5IGdlbmVyYXRlcyB3aWxsIGJlIHBhc3NlZCB0byB0aGlzCiAgICAgKiBmdW5jdGlvbi4gSW50ZXJjZXB0L292ZXJyaWRlIGl0IGlmIHlvdSB3YW50IGN1c3RvbSBlcnJvciBoYW5kbGluZy4KICAgICAqIEBwYXJhbSB7RXJyb3J9IGVyciB0aGUgZXJyb3Igb2JqZWN0LgogICAgICovCiAgICByZXEub25FcnJvciA9IGRlZmF1bHRPbkVycm9yOwoKICAgIC8qKgogICAgICogQ3JlYXRlcyB0aGUgbm9kZSBmb3IgdGhlIGxvYWQgY29tbWFuZC4gT25seSB1c2VkIGluIGJyb3dzZXIgZW52cy4KICAgICAqLwogICAgcmVxLmNyZWF0ZU5vZGUgPSBmdW5jdGlvbiAoY29uZmlnLCBtb2R1bGVOYW1lLCB1cmwpIHsKICAgICAgICB2YXIgbm9kZSA9IGNvbmZpZy54aHRtbCA/CiAgICAgICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnaHRtbDpzY3JpcHQnKSA6CiAgICAgICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTsKICAgICAgICBub2RlLnR5cGUgPSBjb25maWcuc2NyaXB0VHlwZSB8fCAndGV4dC9qYXZhc2NyaXB0JzsKICAgICAgICBub2RlLmNoYXJzZXQgPSAndXRmLTgnOwogICAgICAgIG5vZGUuYXN5bmMgPSB0cnVlOwogICAgICAgIHJldHVybiBub2RlOwogICAgfTsKCiAgICAvKioKICAgICAqIERvZXMgdGhlIHJlcXVlc3QgdG8gbG9hZCBhIG1vZHVsZSBmb3IgdGhlIGJyb3dzZXIgY2FzZS4KICAgICAqIE1ha2UgdGhpcyBhIHNlcGFyYXRlIGZ1bmN0aW9uIHRvIGFsbG93IG90aGVyIGVudmlyb25tZW50cwogICAgICogdG8gb3ZlcnJpZGUgaXQuCiAgICAgKgogICAgICogQHBhcmFtIHtPYmplY3R9IGNvbnRleHQgdGhlIHJlcXVpcmUgY29udGV4dCB0byBmaW5kIHN0YXRlLgogICAgICogQHBhcmFtIHtTdHJpbmd9IG1vZHVsZU5hbWUgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSB1cmwgdGhlIFVSTCB0byB0aGUgbW9kdWxlLgogICAgICovCiAgICByZXEubG9hZCA9IGZ1bmN0aW9uIChjb250ZXh0LCBtb2R1bGVOYW1lLCB1cmwpIHsKICAgICAgICB2YXIgY29uZmlnID0gKGNvbnRleHQgJiYgY29udGV4dC5jb25maWcpIHx8IHt9LAogICAgICAgICAgICBub2RlOwogICAgICAgIGlmIChpc0Jyb3dzZXIpIHsKICAgICAgICAgICAgLy9JbiB0aGUgYnJvd3NlciBzbyB1c2UgYSBzY3JpcHQgdGFnCiAgICAgICAgICAgIG5vZGUgPSByZXEuY3JlYXRlTm9kZShjb25maWcsIG1vZHVsZU5hbWUsIHVybCk7CgogICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlY29udGV4dCcsIGNvbnRleHQuY29udGV4dE5hbWUpOwogICAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlbW9kdWxlJywgbW9kdWxlTmFtZSk7CgogICAgICAgICAgICAvL1NldCB1cCBsb2FkIGxpc3RlbmVyLiBUZXN0IGF0dGFjaEV2ZW50IGZpcnN0IGJlY2F1c2UgSUU5IGhhcwogICAgICAgICAgICAvL2Egc3VidGxlIGlzc3VlIGluIGl0cyBhZGRFdmVudExpc3RlbmVyIGFuZCBzY3JpcHQgb25sb2FkIGZpcmluZ3MKICAgICAgICAgICAgLy90aGF0IGRvIG5vdCBtYXRjaCB0aGUgYmVoYXZpb3Igb2YgYWxsIG90aGVyIGJyb3dzZXJzIHdpdGgKICAgICAgICAgICAgLy9hZGRFdmVudExpc3RlbmVyIHN1cHBvcnQsIHdoaWNoIGZpcmUgdGhlIG9ubG9hZCBldmVudCBmb3IgYQogICAgICAgICAgICAvL3NjcmlwdCByaWdodCBhZnRlciB0aGUgc2NyaXB0IGV4ZWN1dGlvbi4gU2VlOgogICAgICAgICAgICAvL2h0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL0lFL2ZlZWRiYWNrL2RldGFpbHMvNjQ4MDU3L3NjcmlwdC1vbmxvYWQtZXZlbnQtaXMtbm90LWZpcmVkLWltbWVkaWF0ZWx5LWFmdGVyLXNjcmlwdC1leGVjdXRpb24KICAgICAgICAgICAgLy9VTkZPUlRVTkFURUxZIE9wZXJhIGltcGxlbWVudHMgYXR0YWNoRXZlbnQgYnV0IGRvZXMgbm90IGZvbGxvdyB0aGUgc2NyaXB0CiAgICAgICAgICAgIC8vc2NyaXB0IGV4ZWN1dGlvbiBtb2RlLgogICAgICAgICAgICBpZiAobm9kZS5hdHRhY2hFdmVudCAmJgogICAgICAgICAgICAgICAgICAgIC8vQ2hlY2sgaWYgbm9kZS5hdHRhY2hFdmVudCBpcyBhcnRpZmljaWFsbHkgYWRkZWQgYnkgY3VzdG9tIHNjcmlwdCBvcgogICAgICAgICAgICAgICAgICAgIC8vbmF0aXZlbHkgc3VwcG9ydGVkIGJ5IGJyb3dzZXIKICAgICAgICAgICAgICAgICAgICAvL3JlYWQgaHR0cHM6Ly9naXRodWIuY29tL3JlcXVpcmVqcy9yZXF1aXJlanMvaXNzdWVzLzE4NwogICAgICAgICAgICAgICAgICAgIC8vaWYgd2UgY2FuIE5PVCBmaW5kIFtuYXRpdmUgY29kZV0gdGhlbiBpdCBtdXN0IE5PVCBuYXRpdmVseSBzdXBwb3J0ZWQuCiAgICAgICAgICAgICAgICAgICAgLy9pbiBJRTgsIG5vZGUuYXR0YWNoRXZlbnQgZG9lcyBub3QgaGF2ZSB0b1N0cmluZygpCiAgICAgICAgICAgICAgICAgICAgLy9Ob3RlIHRoZSB0ZXN0IGZvciAiW25hdGl2ZSBjb2RlIiB3aXRoIG5vIGNsb3NpbmcgYnJhY2UsIHNlZToKICAgICAgICAgICAgICAgICAgICAvL2h0dHBzOi8vZ2l0aHViLmNvbS9yZXF1aXJlanMvcmVxdWlyZWpzL2lzc3Vlcy8yNzMKICAgICAgICAgICAgICAgICAgICAhKG5vZGUuYXR0YWNoRXZlbnQudG9TdHJpbmcgJiYgbm9kZS5hdHRhY2hFdmVudC50b1N0cmluZygpLmluZGV4T2YoJ1tuYXRpdmUgY29kZScpIDwgMCkgJiYKICAgICAgICAgICAgICAgICAgICAhaXNPcGVyYSkgewogICAgICAgICAgICAgICAgLy9Qcm9iYWJseSBJRS4gSUUgKGF0IGxlYXN0IDYtOCkgZG8gbm90IGZpcmUKICAgICAgICAgICAgICAgIC8vc2NyaXB0IG9ubG9hZCByaWdodCBhZnRlciBleGVjdXRpbmcgdGhlIHNjcmlwdCwgc28KICAgICAgICAgICAgICAgIC8vd2UgY2Fubm90IHRpZSB0aGUgYW5vbnltb3VzIGRlZmluZSBjYWxsIHRvIGEgbmFtZS4KICAgICAgICAgICAgICAgIC8vSG93ZXZlciwgSUUgcmVwb3J0cyB0aGUgc2NyaXB0IGFzIGJlaW5nIGluICdpbnRlcmFjdGl2ZScKICAgICAgICAgICAgICAgIC8vcmVhZHlTdGF0ZSBhdCB0aGUgdGltZSBvZiB0aGUgZGVmaW5lIGNhbGwuCiAgICAgICAgICAgICAgICB1c2VJbnRlcmFjdGl2ZSA9IHRydWU7CgogICAgICAgICAgICAgICAgbm9kZS5hdHRhY2hFdmVudCgnb25yZWFkeXN0YXRlY2hhbmdlJywgY29udGV4dC5vblNjcmlwdExvYWQpOwogICAgICAgICAgICAgICAgLy9JdCB3b3VsZCBiZSBncmVhdCB0byBhZGQgYW4gZXJyb3IgaGFuZGxlciBoZXJlIHRvIGNhdGNoCiAgICAgICAgICAgICAgICAvLzQwNHMgaW4gSUU5Ky4gSG93ZXZlciwgb25yZWFkeXN0YXRlY2hhbmdlIHdpbGwgZmlyZSBiZWZvcmUKICAgICAgICAgICAgICAgIC8vdGhlIGVycm9yIGhhbmRsZXIsIHNvIHRoYXQgZG9lcyBub3QgaGVscC4gSWYgYWRkRXZlbnRMaXN0ZW5lcgogICAgICAgICAgICAgICAgLy9pcyB1c2VkLCB0aGVuIElFIHdpbGwgZmlyZSBlcnJvciBiZWZvcmUgbG9hZCwgYnV0IHdlIGNhbm5vdAogICAgICAgICAgICAgICAgLy91c2UgdGhhdCBwYXRod2F5IGdpdmVuIHRoZSBjb25uZWN0Lm1pY3Jvc29mdC5jb20gaXNzdWUKICAgICAgICAgICAgICAgIC8vbWVudGlvbmVkIGFib3ZlIGFib3V0IG5vdCBkb2luZyB0aGUgJ3NjcmlwdCBleGVjdXRlLAogICAgICAgICAgICAgICAgLy90aGVuIGZpcmUgdGhlIHNjcmlwdCBsb2FkIGV2ZW50IGxpc3RlbmVyIGJlZm9yZSBleGVjdXRlCiAgICAgICAgICAgICAgICAvL25leHQgc2NyaXB0JyB0aGF0IG90aGVyIGJyb3dzZXJzIGRvLgogICAgICAgICAgICAgICAgLy9CZXN0IGhvcGU6IElFMTAgZml4ZXMgdGhlIGlzc3VlcywKICAgICAgICAgICAgICAgIC8vYW5kIHRoZW4gZGVzdHJveXMgYWxsIGluc3RhbGxzIG9mIElFIDYtOS4KICAgICAgICAgICAgICAgIC8vbm9kZS5hdHRhY2hFdmVudCgnb25lcnJvcicsIGNvbnRleHQub25TY3JpcHRFcnJvcik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBub2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBjb250ZXh0Lm9uU2NyaXB0TG9hZCwgZmFsc2UpOwogICAgICAgICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIGNvbnRleHQub25TY3JpcHRFcnJvciwgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5vZGUuc3JjID0gdXJsOwoKICAgICAgICAgICAgLy9DYWxsaW5nIG9uTm9kZUNyZWF0ZWQgYWZ0ZXIgYWxsIHByb3BlcnRpZXMgb24gdGhlIG5vZGUgaGF2ZSBiZWVuCiAgICAgICAgICAgIC8vc2V0LCBidXQgYmVmb3JlIGl0IGlzIHBsYWNlZCBpbiB0aGUgRE9NLgogICAgICAgICAgICBpZiAoY29uZmlnLm9uTm9kZUNyZWF0ZWQpIHsKICAgICAgICAgICAgICAgIGNvbmZpZy5vbk5vZGVDcmVhdGVkKG5vZGUsIGNvbmZpZywgbW9kdWxlTmFtZSwgdXJsKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9Gb3Igc29tZSBjYWNoZSBjYXNlcyBpbiBJRSA2LTgsIHRoZSBzY3JpcHQgZXhlY3V0ZXMgYmVmb3JlIHRoZSBlbmQKICAgICAgICAgICAgLy9vZiB0aGUgYXBwZW5kQ2hpbGQgZXhlY3V0aW9uLCBzbyB0byB0aWUgYW4gYW5vbnltb3VzIGRlZmluZQogICAgICAgICAgICAvL2NhbGwgdG8gdGhlIG1vZHVsZSBuYW1lICh3aGljaCBpcyBzdG9yZWQgb24gdGhlIG5vZGUpLCBob2xkIG9uCiAgICAgICAgICAgIC8vdG8gYSByZWZlcmVuY2UgdG8gdGhpcyBub2RlLCBidXQgY2xlYXIgYWZ0ZXIgdGhlIERPTSBpbnNlcnRpb24uCiAgICAgICAgICAgIGN1cnJlbnRseUFkZGluZ1NjcmlwdCA9IG5vZGU7CiAgICAgICAgICAgIGlmIChiYXNlRWxlbWVudCkgewogICAgICAgICAgICAgICAgaGVhZC5pbnNlcnRCZWZvcmUobm9kZSwgYmFzZUVsZW1lbnQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaGVhZC5hcHBlbmRDaGlsZChub2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjdXJyZW50bHlBZGRpbmdTY3JpcHQgPSBudWxsOwoKICAgICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgICAgfSBlbHNlIGlmIChpc1dlYldvcmtlcikgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgLy9JbiBhIHdlYiB3b3JrZXIsIHVzZSBpbXBvcnRTY3JpcHRzLiBUaGlzIGlzIG5vdCBhIHZlcnkKICAgICAgICAgICAgICAgIC8vZWZmaWNpZW50IHVzZSBvZiBpbXBvcnRTY3JpcHRzLCBpbXBvcnRTY3JpcHRzIHdpbGwgYmxvY2sgdW50aWwKICAgICAgICAgICAgICAgIC8vaXRzIHNjcmlwdCBpcyBkb3dubG9hZGVkIGFuZCBldmFsdWF0ZWQuIEhvd2V2ZXIsIGlmIHdlYiB3b3JrZXJzCiAgICAgICAgICAgICAgICAvL2FyZSBpbiBwbGF5LCB0aGUgZXhwZWN0YXRpb24gaXMgdGhhdCBhIGJ1aWxkIGhhcyBiZWVuIGRvbmUgc28KICAgICAgICAgICAgICAgIC8vdGhhdCBvbmx5IG9uZSBzY3JpcHQgbmVlZHMgdG8gYmUgbG9hZGVkIGFueXdheS4gVGhpcyBtYXkgbmVlZAogICAgICAgICAgICAgICAgLy90byBiZSByZWV2YWx1YXRlZCBpZiBvdGhlciB1c2UgY2FzZXMgYmVjb21lIGNvbW1vbi4KCiAgICAgICAgICAgICAgICAvLyBQb3N0IGEgdGFzayB0byB0aGUgZXZlbnQgbG9vcCB0byB3b3JrIGFyb3VuZCBhIGJ1ZyBpbiBXZWJLaXQKICAgICAgICAgICAgICAgIC8vIHdoZXJlIHRoZSB3b3JrZXIgZ2V0cyBnYXJiYWdlLWNvbGxlY3RlZCBhZnRlciBjYWxsaW5nCiAgICAgICAgICAgICAgICAvLyBpbXBvcnRTY3JpcHRzKCk6IGh0dHBzOi8vd2Via2l0Lm9yZy9iLzE1MzMxNwogICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHt9LCAwKTsKICAgICAgICAgICAgICAgIGltcG9ydFNjcmlwdHModXJsKTsKCiAgICAgICAgICAgICAgICAvL0FjY291bnQgZm9yIGFub255bW91cyBtb2R1bGVzCiAgICAgICAgICAgICAgICBjb250ZXh0LmNvbXBsZXRlTG9hZChtb2R1bGVOYW1lKTsKICAgICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgY29udGV4dC5vbkVycm9yKG1ha2VFcnJvcignaW1wb3J0c2NyaXB0cycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ltcG9ydFNjcmlwdHMgZmFpbGVkIGZvciAnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlTmFtZSArICcgYXQgJyArIHVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb2R1bGVOYW1lXSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBnZXRJbnRlcmFjdGl2ZVNjcmlwdCgpIHsKICAgICAgICBpZiAoaW50ZXJhY3RpdmVTY3JpcHQgJiYgaW50ZXJhY3RpdmVTY3JpcHQucmVhZHlTdGF0ZSA9PT0gJ2ludGVyYWN0aXZlJykgewogICAgICAgICAgICByZXR1cm4gaW50ZXJhY3RpdmVTY3JpcHQ7CiAgICAgICAgfQoKICAgICAgICBlYWNoUmV2ZXJzZShzY3JpcHRzKCksIGZ1bmN0aW9uIChzY3JpcHQpIHsKICAgICAgICAgICAgaWYgKHNjcmlwdC5yZWFkeVN0YXRlID09PSAnaW50ZXJhY3RpdmUnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKGludGVyYWN0aXZlU2NyaXB0ID0gc2NyaXB0KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBpbnRlcmFjdGl2ZVNjcmlwdDsKICAgIH0KCiAgICAvL0xvb2sgZm9yIGEgZGF0YS1tYWluIHNjcmlwdCBhdHRyaWJ1dGUsIHdoaWNoIGNvdWxkIGFsc28gYWRqdXN0IHRoZSBiYXNlVXJsLgogICAgaWYgKGlzQnJvd3NlciAmJiAhY2ZnLnNraXBEYXRhTWFpbikgewogICAgICAgIC8vRmlndXJlIG91dCBiYXNlVXJsLiBHZXQgaXQgZnJvbSB0aGUgc2NyaXB0IHRhZyB3aXRoIHJlcXVpcmUuanMgaW4gaXQuCiAgICAgICAgZWFjaFJldmVyc2Uoc2NyaXB0cygpLCBmdW5jdGlvbiAoc2NyaXB0KSB7CiAgICAgICAgICAgIC8vU2V0IHRoZSAnaGVhZCcgd2hlcmUgd2UgY2FuIGFwcGVuZCBjaGlsZHJlbiBieQogICAgICAgICAgICAvL3VzaW5nIHRoZSBzY3JpcHQncyBwYXJlbnQuCiAgICAgICAgICAgIGlmICghaGVhZCkgewogICAgICAgICAgICAgICAgaGVhZCA9IHNjcmlwdC5wYXJlbnROb2RlOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvL0xvb2sgZm9yIGEgZGF0YS1tYWluIGF0dHJpYnV0ZSB0byBzZXQgbWFpbiBzY3JpcHQgZm9yIHRoZSBwYWdlCiAgICAgICAgICAgIC8vdG8gbG9hZC4gSWYgaXQgaXMgdGhlcmUsIHRoZSBwYXRoIHRvIGRhdGEgbWFpbiBiZWNvbWVzIHRoZQogICAgICAgICAgICAvL2Jhc2VVcmwsIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHNldC4KICAgICAgICAgICAgZGF0YU1haW4gPSBzY3JpcHQuZ2V0QXR0cmlidXRlKCdkYXRhLW1haW4nKTsKICAgICAgICAgICAgaWYgKGRhdGFNYWluKSB7CiAgICAgICAgICAgICAgICAvL1ByZXNlcnZlIGRhdGFNYWluIGluIGNhc2UgaXQgaXMgYSBwYXRoIChpLmUuIGNvbnRhaW5zICc/JykKICAgICAgICAgICAgICAgIG1haW5TY3JpcHQgPSBkYXRhTWFpbjsKCiAgICAgICAgICAgICAgICAvL1NldCBmaW5hbCBiYXNlVXJsIGlmIHRoZXJlIGlzIG5vdCBhbHJlYWR5IGFuIGV4cGxpY2l0IG9uZSwKICAgICAgICAgICAgICAgIC8vYnV0IG9ubHkgZG8gc28gaWYgdGhlIGRhdGEtbWFpbiB2YWx1ZSBpcyBub3QgYSBsb2FkZXIgcGx1Z2luCiAgICAgICAgICAgICAgICAvL21vZHVsZSBJRC4KICAgICAgICAgICAgICAgIGlmICghY2ZnLmJhc2VVcmwgJiYgbWFpblNjcmlwdC5pbmRleE9mKCchJykgPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgLy9QdWxsIG9mZiB0aGUgZGlyZWN0b3J5IG9mIGRhdGEtbWFpbiBmb3IgdXNlIGFzIHRoZQogICAgICAgICAgICAgICAgICAgIC8vYmFzZVVybC4KICAgICAgICAgICAgICAgICAgICBzcmMgPSBtYWluU2NyaXB0LnNwbGl0KCcvJyk7CiAgICAgICAgICAgICAgICAgICAgbWFpblNjcmlwdCA9IHNyYy5wb3AoKTsKICAgICAgICAgICAgICAgICAgICBzdWJQYXRoID0gc3JjLmxlbmd0aCA/IHNyYy5qb2luKCcvJykgICsgJy8nIDogJy4vJzsKCiAgICAgICAgICAgICAgICAgICAgY2ZnLmJhc2VVcmwgPSBzdWJQYXRoOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vU3RyaXAgb2ZmIGFueSB0cmFpbGluZyAuanMgc2luY2UgbWFpblNjcmlwdCBpcyBub3cKICAgICAgICAgICAgICAgIC8vbGlrZSBhIG1vZHVsZSBuYW1lLgogICAgICAgICAgICAgICAgbWFpblNjcmlwdCA9IG1haW5TY3JpcHQucmVwbGFjZShqc1N1ZmZpeFJlZ0V4cCwgJycpOwoKICAgICAgICAgICAgICAgIC8vSWYgbWFpblNjcmlwdCBpcyBzdGlsbCBhIHBhdGgsIGZhbGwgYmFjayB0byBkYXRhTWFpbgogICAgICAgICAgICAgICAgaWYgKHJlcS5qc0V4dFJlZ0V4cC50ZXN0KG1haW5TY3JpcHQpKSB7CiAgICAgICAgICAgICAgICAgICAgbWFpblNjcmlwdCA9IGRhdGFNYWluOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vUHV0IHRoZSBkYXRhLW1haW4gc2NyaXB0IGluIHRoZSBmaWxlcyB0byBsb2FkLgogICAgICAgICAgICAgICAgY2ZnLmRlcHMgPSBjZmcuZGVwcyA/IGNmZy5kZXBzLmNvbmNhdChtYWluU2NyaXB0KSA6IFttYWluU2NyaXB0XTsKCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogVGhlIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyBkZWZpbml0aW9ucyBvZiBtb2R1bGVzLiBEaWZmZXJzIGZyb20KICAgICAqIHJlcXVpcmUoKSBpbiB0aGF0IGEgc3RyaW5nIGZvciB0aGUgbW9kdWxlIHNob3VsZCBiZSB0aGUgZmlyc3QgYXJndW1lbnQsCiAgICAgKiBhbmQgdGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYWZ0ZXIgZGVwZW5kZW5jaWVzIGFyZSBsb2FkZWQgc2hvdWxkCiAgICAgKiByZXR1cm4gYSB2YWx1ZSB0byBkZWZpbmUgdGhlIG1vZHVsZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBmaXJzdCBhcmd1bWVudCdzCiAgICAgKiBuYW1lLgogICAgICovCiAgICBkZWZpbmUgPSBmdW5jdGlvbiAobmFtZSwgZGVwcywgY2FsbGJhY2spIHsKICAgICAgICB2YXIgbm9kZSwgY29udGV4dDsKCiAgICAgICAgLy9BbGxvdyBmb3IgYW5vbnltb3VzIG1vZHVsZXMKICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIC8vQWRqdXN0IGFyZ3MgYXBwcm9wcmlhdGVseQogICAgICAgICAgICBjYWxsYmFjayA9IGRlcHM7CiAgICAgICAgICAgIGRlcHMgPSBuYW1lOwogICAgICAgICAgICBuYW1lID0gbnVsbDsKICAgICAgICB9CgogICAgICAgIC8vVGhpcyBtb2R1bGUgbWF5IG5vdCBoYXZlIGRlcGVuZGVuY2llcwogICAgICAgIGlmICghaXNBcnJheShkZXBzKSkgewogICAgICAgICAgICBjYWxsYmFjayA9IGRlcHM7CiAgICAgICAgICAgIGRlcHMgPSBudWxsOwogICAgICAgIH0KCiAgICAgICAgLy9JZiBubyBuYW1lLCBhbmQgY2FsbGJhY2sgaXMgYSBmdW5jdGlvbiwgdGhlbiBmaWd1cmUgb3V0IGlmIGl0IGEKICAgICAgICAvL0NvbW1vbkpTIHRoaW5nIHdpdGggZGVwZW5kZW5jaWVzLgogICAgICAgIGlmICghZGVwcyAmJiBpc0Z1bmN0aW9uKGNhbGxiYWNrKSkgewogICAgICAgICAgICBkZXBzID0gW107CiAgICAgICAgICAgIC8vUmVtb3ZlIGNvbW1lbnRzIGZyb20gdGhlIGNhbGxiYWNrIHN0cmluZywKICAgICAgICAgICAgLy9sb29rIGZvciByZXF1aXJlIGNhbGxzLCBhbmQgcHVsbCB0aGVtIGludG8gdGhlIGRlcGVuZGVuY2llcywKICAgICAgICAgICAgLy9idXQgb25seSBpZiB0aGVyZSBhcmUgZnVuY3Rpb24gYXJncy4KICAgICAgICAgICAgaWYgKGNhbGxiYWNrLmxlbmd0aCkgewogICAgICAgICAgICAgICAgY2FsbGJhY2sKICAgICAgICAgICAgICAgICAgICAudG9TdHJpbmcoKQogICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKGNvbW1lbnRSZWdFeHAsIGNvbW1lbnRSZXBsYWNlKQogICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKGNqc1JlcXVpcmVSZWdFeHAsIGZ1bmN0aW9uIChtYXRjaCwgZGVwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMucHVzaChkZXApOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vTWF5IGJlIGEgQ29tbW9uSlMgdGhpbmcgZXZlbiB3aXRob3V0IHJlcXVpcmUgY2FsbHMsIGJ1dCBzdGlsbAogICAgICAgICAgICAgICAgLy9jb3VsZCB1c2UgZXhwb3J0cywgYW5kIG1vZHVsZS4gQXZvaWQgZG9pbmcgZXhwb3J0cyBhbmQgbW9kdWxlCiAgICAgICAgICAgICAgICAvL3dvcmsgdGhvdWdoIGlmIGl0IGp1c3QgbmVlZHMgcmVxdWlyZS4KICAgICAgICAgICAgICAgIC8vUkVRVUlSRVMgdGhlIGZ1bmN0aW9uIHRvIGV4cGVjdCB0aGUgQ29tbW9uSlMgdmFyaWFibGVzIGluIHRoZQogICAgICAgICAgICAgICAgLy9vcmRlciBsaXN0ZWQgYmVsb3cuCiAgICAgICAgICAgICAgICBkZXBzID0gKGNhbGxiYWNrLmxlbmd0aCA9PT0gMSA/IFsncmVxdWlyZSddIDogWydyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJ10pLmNvbmNhdChkZXBzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy9JZiBpbiBJRSA2LTggYW5kIGhpdCBhbiBhbm9ueW1vdXMgZGVmaW5lKCkgY2FsbCwgZG8gdGhlIGludGVyYWN0aXZlCiAgICAgICAgLy93b3JrLgogICAgICAgIGlmICh1c2VJbnRlcmFjdGl2ZSkgewogICAgICAgICAgICBub2RlID0gY3VycmVudGx5QWRkaW5nU2NyaXB0IHx8IGdldEludGVyYWN0aXZlU2NyaXB0KCk7CiAgICAgICAgICAgIGlmIChub2RlKSB7CiAgICAgICAgICAgICAgICBpZiAoIW5hbWUpIHsKICAgICAgICAgICAgICAgICAgICBuYW1lID0gbm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVxdWlyZW1vZHVsZScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHRzW25vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXJlcXVpcmVjb250ZXh0JyldOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvL0Fsd2F5cyBzYXZlIG9mZiBldmFsdWF0aW5nIHRoZSBkZWYgY2FsbCB1bnRpbCB0aGUgc2NyaXB0IG9ubG9hZCBoYW5kbGVyLgogICAgICAgIC8vVGhpcyBhbGxvd3MgbXVsdGlwbGUgbW9kdWxlcyB0byBiZSBpbiBhIGZpbGUgd2l0aG91dCBwcmVtYXR1cmVseQogICAgICAgIC8vdHJhY2luZyBkZXBlbmRlbmNpZXMsIGFuZCBhbGxvd3MgZm9yIGFub255bW91cyBtb2R1bGUgc3VwcG9ydCwKICAgICAgICAvL3doZXJlIHRoZSBtb2R1bGUgbmFtZSBpcyBub3Qga25vd24gdW50aWwgdGhlIHNjcmlwdCBvbmxvYWQgZXZlbnQKICAgICAgICAvL29jY3Vycy4gSWYgbm8gY29udGV4dCwgdXNlIHRoZSBnbG9iYWwgcXVldWUsIGFuZCBnZXQgaXQgcHJvY2Vzc2VkCiAgICAgICAgLy9pbiB0aGUgb25zY3JpcHQgbG9hZCBjYWxsYmFjay4KICAgICAgICBpZiAoY29udGV4dCkgewogICAgICAgICAgICBjb250ZXh0LmRlZlF1ZXVlLnB1c2goW25hbWUsIGRlcHMsIGNhbGxiYWNrXSk7CiAgICAgICAgICAgIGNvbnRleHQuZGVmUXVldWVNYXBbbmFtZV0gPSB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGdsb2JhbERlZlF1ZXVlLnB1c2goW25hbWUsIGRlcHMsIGNhbGxiYWNrXSk7CiAgICAgICAgfQogICAgfTsKCiAgICBkZWZpbmUuYW1kID0gewogICAgICAgIGpRdWVyeTogdHJ1ZQogICAgfTsKCiAgICAvKioKICAgICAqIEV4ZWN1dGVzIHRoZSB0ZXh0LiBOb3JtYWxseSBqdXN0IHVzZXMgZXZhbCwgYnV0IGNhbiBiZSBtb2RpZmllZAogICAgICogdG8gdXNlIGEgYmV0dGVyLCBlbnZpcm9ubWVudC1zcGVjaWZpYyBjYWxsLiBPbmx5IHVzZWQgZm9yIHRyYW5zcGlsaW5nCiAgICAgKiBsb2FkZXIgcGx1Z2lucywgbm90IGZvciBwbGFpbiBKUyBtb2R1bGVzLgogICAgICogQHBhcmFtIHtTdHJpbmd9IHRleHQgdGhlIHRleHQgdG8gZXhlY3V0ZS9ldmFsdWF0ZS4KICAgICAqLwogICAgcmVxLmV4ZWMgPSBmdW5jdGlvbiAodGV4dCkgewogICAgICAgIC8qanNsaW50IGV2aWw6IHRydWUgKi8KICAgICAgICByZXR1cm4gZXZhbCh0ZXh0KTsKICAgIH07CgogICAgLy9TZXQgdXAgd2l0aCBjb25maWcgaW5mby4KICAgIHJlcShjZmcpOwp9KHRoaXMsICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ3VuZGVmaW5lZCcgPyB1bmRlZmluZWQgOiBzZXRUaW1lb3V0KSkpOwoKLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLy8KLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLy8gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAovLwovLyBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCgohZnVuY3Rpb24oKXt2YXIgYT17fSxiPXt9LGM9e307IWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhKXtpZigibnVtYmVyIj09dHlwZW9mIGEpcmV0dXJuIGE7dmFyIGI9e307Zm9yKHZhciBjIGluIGEpYltjXT1hW2NdO3JldHVybiBifWZ1bmN0aW9uIGQoKXt0aGlzLl9kZWxheT0wLHRoaXMuX2VuZERlbGF5PTAsdGhpcy5fZmlsbD0ibm9uZSIsdGhpcy5faXRlcmF0aW9uU3RhcnQ9MCx0aGlzLl9pdGVyYXRpb25zPTEsdGhpcy5fZHVyYXRpb249MCx0aGlzLl9wbGF5YmFja1JhdGU9MSx0aGlzLl9kaXJlY3Rpb249Im5vcm1hbCIsdGhpcy5fZWFzaW5nPSJsaW5lYXIiLHRoaXMuX2Vhc2luZ0Z1bmN0aW9uPXh9ZnVuY3Rpb24gZSgpe3JldHVybiBhLmlzRGVwcmVjYXRlZCgiSW52YWxpZCB0aW1pbmcgaW5wdXRzIiwiMjAxNi0wMy0wMiIsIlR5cGVFcnJvciBleGNlcHRpb25zIHdpbGwgYmUgdGhyb3duIGluc3RlYWQuIiwhMCl9ZnVuY3Rpb24gZihiLGMsZSl7dmFyIGY9bmV3IGQ7cmV0dXJuIGMmJihmLmZpbGw9ImJvdGgiLGYuZHVyYXRpb249ImF1dG8iKSwibnVtYmVyIiE9dHlwZW9mIGJ8fGlzTmFOKGIpP3ZvaWQgMCE9PWImJk9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGIpLmZvckVhY2goZnVuY3Rpb24oYyl7aWYoImF1dG8iIT1iW2NdKXtpZigoIm51bWJlciI9PXR5cGVvZiBmW2NdfHwiZHVyYXRpb24iPT1jKSYmKCJudW1iZXIiIT10eXBlb2YgYltjXXx8aXNOYU4oYltjXSkpKXJldHVybjtpZigiZmlsbCI9PWMmJi0xPT12LmluZGV4T2YoYltjXSkpcmV0dXJuO2lmKCJkaXJlY3Rpb24iPT1jJiYtMT09dy5pbmRleE9mKGJbY10pKXJldHVybjtpZigicGxheWJhY2tSYXRlIj09YyYmMSE9PWJbY10mJmEuaXNEZXByZWNhdGVkKCJBbmltYXRpb25FZmZlY3RUaW1pbmcucGxheWJhY2tSYXRlIiwiMjAxNC0xMS0yOCIsIlVzZSBBbmltYXRpb24ucGxheWJhY2tSYXRlIGluc3RlYWQuIikpcmV0dXJuO2ZbY109YltjXX19KTpmLmR1cmF0aW9uPWIsZn1mdW5jdGlvbiBnKGEpe3JldHVybiJudW1iZXIiPT10eXBlb2YgYSYmKGE9aXNOYU4oYSk/e2R1cmF0aW9uOjB9OntkdXJhdGlvbjphfSksYX1mdW5jdGlvbiBoKGIsYyl7cmV0dXJuIGI9YS5udW1lcmljVGltaW5nVG9PYmplY3QoYiksZihiLGMpfWZ1bmN0aW9uIGkoYSxiLGMsZCl7cmV0dXJuIGE8MHx8YT4xfHxjPDB8fGM+MT94OmZ1bmN0aW9uKGUpe2Z1bmN0aW9uIGYoYSxiLGMpe3JldHVybiAzKmEqKDEtYykqKDEtYykqYyszKmIqKDEtYykqYypjK2MqYypjfWlmKGU8PTApe3ZhciBnPTA7cmV0dXJuIGE+MD9nPWIvYTohYiYmYz4wJiYoZz1kL2MpLGcqZX1pZihlPj0xKXt2YXIgaD0wO3JldHVybiBjPDE/aD0oZC0xKS8oYy0xKToxPT1jJiZhPDEmJihoPShiLTEpLyhhLTEpKSwxK2gqKGUtMSl9Zm9yKHZhciBpPTAsaj0xO2k8ajspe3ZhciBrPShpK2opLzIsbD1mKGEsYyxrKTtpZihNYXRoLmFicyhlLWwpPDFlLTUpcmV0dXJuIGYoYixkLGspO2w8ZT9pPWs6aj1rfXJldHVybiBmKGIsZCxrKX19ZnVuY3Rpb24gaihhLGIpe3JldHVybiBmdW5jdGlvbihjKXtpZihjPj0xKXJldHVybiAxO3ZhciBkPTEvYTtyZXR1cm4oYys9YipkKS1jJWR9fWZ1bmN0aW9uIGsoYSl7Q3x8KEM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUpLEMuYW5pbWF0aW9uVGltaW5nRnVuY3Rpb249IiIsQy5hbmltYXRpb25UaW1pbmdGdW5jdGlvbj1hO3ZhciBiPUMuYW5pbWF0aW9uVGltaW5nRnVuY3Rpb247aWYoIiI9PWImJmUoKSl0aHJvdyBuZXcgVHlwZUVycm9yKGErIiBpcyBub3QgYSB2YWxpZCB2YWx1ZSBmb3IgZWFzaW5nIik7cmV0dXJuIGJ9ZnVuY3Rpb24gbChhKXtpZigibGluZWFyIj09YSlyZXR1cm4geDt2YXIgYj1FLmV4ZWMoYSk7aWYoYilyZXR1cm4gaS5hcHBseSh0aGlzLGIuc2xpY2UoMSkubWFwKE51bWJlcikpO3ZhciBjPUYuZXhlYyhhKTtpZihjKXJldHVybiBqKE51bWJlcihjWzFdKSxBKTt2YXIgZD1HLmV4ZWMoYSk7cmV0dXJuIGQ/aihOdW1iZXIoZFsxXSkse3N0YXJ0OnksbWlkZGxlOnosZW5kOkF9W2RbMl1dKTpCW2FdfHx4fWZ1bmN0aW9uIG0oYSl7cmV0dXJuIE1hdGguYWJzKG4oYSkvYS5wbGF5YmFja1JhdGUpfWZ1bmN0aW9uIG4oYSl7cmV0dXJuIDA9PT1hLmR1cmF0aW9ufHwwPT09YS5pdGVyYXRpb25zPzA6YS5kdXJhdGlvbiphLml0ZXJhdGlvbnN9ZnVuY3Rpb24gbyhhLGIsYyl7aWYobnVsbD09YilyZXR1cm4gSDt2YXIgZD1jLmRlbGF5K2ErYy5lbmREZWxheTtyZXR1cm4gYjxNYXRoLm1pbihjLmRlbGF5LGQpP0k6Yj49TWF0aC5taW4oYy5kZWxheSthLGQpP0o6S31mdW5jdGlvbiBwKGEsYixjLGQsZSl7c3dpdGNoKGQpe2Nhc2UgSTpyZXR1cm4iYmFja3dhcmRzIj09Ynx8ImJvdGgiPT1iPzA6bnVsbDtjYXNlIEs6cmV0dXJuIGMtZTtjYXNlIEo6cmV0dXJuImZvcndhcmRzIj09Ynx8ImJvdGgiPT1iP2E6bnVsbDtjYXNlIEg6cmV0dXJuIG51bGx9fWZ1bmN0aW9uIHEoYSxiLGMsZCxlKXt2YXIgZj1lO3JldHVybiAwPT09YT9iIT09SSYmKGYrPWMpOmYrPWQvYSxmfWZ1bmN0aW9uIHIoYSxiLGMsZCxlLGYpe3ZhciBnPWE9PT0xLzA/YiUxOmElMTtyZXR1cm4gMCE9PWd8fGMhPT1KfHwwPT09ZHx8MD09PWUmJjAhPT1mfHwoZz0xKSxnfWZ1bmN0aW9uIHMoYSxiLGMsZCl7cmV0dXJuIGE9PT1KJiZiPT09MS8wPzEvMDoxPT09Yz9NYXRoLmZsb29yKGQpLTE6TWF0aC5mbG9vcihkKX1mdW5jdGlvbiB0KGEsYixjKXt2YXIgZD1hO2lmKCJub3JtYWwiIT09YSYmInJldmVyc2UiIT09YSl7dmFyIGU9YjsiYWx0ZXJuYXRlLXJldmVyc2UiPT09YSYmKGUrPTEpLGQ9Im5vcm1hbCIsZSE9PTEvMCYmZSUyIT0wJiYoZD0icmV2ZXJzZSIpfXJldHVybiJub3JtYWwiPT09ZD9jOjEtY31mdW5jdGlvbiB1KGEsYixjKXt2YXIgZD1vKGEsYixjKSxlPXAoYSxjLmZpbGwsYixkLGMuZGVsYXkpO2lmKG51bGw9PT1lKXJldHVybiBudWxsO3ZhciBmPXEoYy5kdXJhdGlvbixkLGMuaXRlcmF0aW9ucyxlLGMuaXRlcmF0aW9uU3RhcnQpLGc9cihmLGMuaXRlcmF0aW9uU3RhcnQsZCxjLml0ZXJhdGlvbnMsZSxjLmR1cmF0aW9uKSxoPXMoZCxjLml0ZXJhdGlvbnMsZyxmKSxpPXQoYy5kaXJlY3Rpb24saCxnKTtyZXR1cm4gYy5fZWFzaW5nRnVuY3Rpb24oaSl9dmFyIHY9ImJhY2t3YXJkc3xmb3J3YXJkc3xib3RofG5vbmUiLnNwbGl0KCJ8Iiksdz0icmV2ZXJzZXxhbHRlcm5hdGV8YWx0ZXJuYXRlLXJldmVyc2UiLnNwbGl0KCJ8IikseD1mdW5jdGlvbihhKXtyZXR1cm4gYX07ZC5wcm90b3R5cGU9e19zZXRNZW1iZXI6ZnVuY3Rpb24oYixjKXt0aGlzWyJfIitiXT1jLHRoaXMuX2VmZmVjdCYmKHRoaXMuX2VmZmVjdC5fdGltaW5nSW5wdXRbYl09Yyx0aGlzLl9lZmZlY3QuX3RpbWluZz1hLm5vcm1hbGl6ZVRpbWluZ0lucHV0KHRoaXMuX2VmZmVjdC5fdGltaW5nSW5wdXQpLHRoaXMuX2VmZmVjdC5hY3RpdmVEdXJhdGlvbj1hLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKHRoaXMuX2VmZmVjdC5fdGltaW5nKSx0aGlzLl9lZmZlY3QuX2FuaW1hdGlvbiYmdGhpcy5fZWZmZWN0Ll9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCkpfSxnZXQgcGxheWJhY2tSYXRlKCl7cmV0dXJuIHRoaXMuX3BsYXliYWNrUmF0ZX0sc2V0IGRlbGF5KGEpe3RoaXMuX3NldE1lbWJlcigiZGVsYXkiLGEpfSxnZXQgZGVsYXkoKXtyZXR1cm4gdGhpcy5fZGVsYXl9LHNldCBlbmREZWxheShhKXt0aGlzLl9zZXRNZW1iZXIoImVuZERlbGF5IixhKX0sZ2V0IGVuZERlbGF5KCl7cmV0dXJuIHRoaXMuX2VuZERlbGF5fSxzZXQgZmlsbChhKXt0aGlzLl9zZXRNZW1iZXIoImZpbGwiLGEpfSxnZXQgZmlsbCgpe3JldHVybiB0aGlzLl9maWxsfSxzZXQgaXRlcmF0aW9uU3RhcnQoYSl7aWYoKGlzTmFOKGEpfHxhPDApJiZlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiaXRlcmF0aW9uU3RhcnQgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBudW1iZXIsIHJlY2VpdmVkOiAiK2EpO3RoaXMuX3NldE1lbWJlcigiaXRlcmF0aW9uU3RhcnQiLGEpfSxnZXQgaXRlcmF0aW9uU3RhcnQoKXtyZXR1cm4gdGhpcy5faXRlcmF0aW9uU3RhcnR9LHNldCBkdXJhdGlvbihhKXtpZigiYXV0byIhPWEmJihpc05hTihhKXx8YTwwKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoImR1cmF0aW9uIG11c3QgYmUgbm9uLW5lZ2F0aXZlIG9yIGF1dG8sIHJlY2VpdmVkOiAiK2EpO3RoaXMuX3NldE1lbWJlcigiZHVyYXRpb24iLGEpfSxnZXQgZHVyYXRpb24oKXtyZXR1cm4gdGhpcy5fZHVyYXRpb259LHNldCBkaXJlY3Rpb24oYSl7dGhpcy5fc2V0TWVtYmVyKCJkaXJlY3Rpb24iLGEpfSxnZXQgZGlyZWN0aW9uKCl7cmV0dXJuIHRoaXMuX2RpcmVjdGlvbn0sc2V0IGVhc2luZyhhKXt0aGlzLl9lYXNpbmdGdW5jdGlvbj1sKGsoYSkpLHRoaXMuX3NldE1lbWJlcigiZWFzaW5nIixhKX0sZ2V0IGVhc2luZygpe3JldHVybiB0aGlzLl9lYXNpbmd9LHNldCBpdGVyYXRpb25zKGEpe2lmKChpc05hTihhKXx8YTwwKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIml0ZXJhdGlvbnMgbXVzdCBiZSBub24tbmVnYXRpdmUsIHJlY2VpdmVkOiAiK2EpO3RoaXMuX3NldE1lbWJlcigiaXRlcmF0aW9ucyIsYSl9LGdldCBpdGVyYXRpb25zKCl7cmV0dXJuIHRoaXMuX2l0ZXJhdGlvbnN9fTt2YXIgeT0xLHo9LjUsQT0wLEI9e2Vhc2U6aSguMjUsLjEsLjI1LDEpLCJlYXNlLWluIjppKC40MiwwLDEsMSksImVhc2Utb3V0IjppKDAsMCwuNTgsMSksImVhc2UtaW4tb3V0IjppKC40MiwwLC41OCwxKSwic3RlcC1zdGFydCI6aigxLHkpLCJzdGVwLW1pZGRsZSI6aigxLHopLCJzdGVwLWVuZCI6aigxLEEpfSxDPW51bGwsRD0iXFxzKigtP1xcZCtcXC4/XFxkKnwtP1xcLlxcZCspXFxzKiIsRT1uZXcgUmVnRXhwKCJjdWJpYy1iZXppZXJcXCgiK0QrIiwiK0QrIiwiK0QrIiwiK0QrIlxcKSIpLEY9L3N0ZXBzXChccyooXGQrKVxzKlwpLyxHPS9zdGVwc1woXHMqKFxkKylccyosXHMqKHN0YXJ0fG1pZGRsZXxlbmQpXHMqXCkvLEg9MCxJPTEsSj0yLEs9MzthLmNsb25lVGltaW5nSW5wdXQ9YyxhLm1ha2VUaW1pbmc9ZixhLm51bWVyaWNUaW1pbmdUb09iamVjdD1nLGEubm9ybWFsaXplVGltaW5nSW5wdXQ9aCxhLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uPW0sYS5jYWxjdWxhdGVJdGVyYXRpb25Qcm9ncmVzcz11LGEuY2FsY3VsYXRlUGhhc2U9byxhLm5vcm1hbGl6ZUVhc2luZz1rLGEucGFyc2VFYXNpbmdGdW5jdGlvbj1sfShhKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtyZXR1cm4gYSBpbiBrP2tbYV1bYl18fGI6Yn1mdW5jdGlvbiBkKGEpe3JldHVybiJkaXNwbGF5Ij09PWF8fDA9PT1hLmxhc3RJbmRleE9mKCJhbmltYXRpb24iLDApfHwwPT09YS5sYXN0SW5kZXhPZigidHJhbnNpdGlvbiIsMCl9ZnVuY3Rpb24gZShhLGIsZSl7aWYoIWQoYSkpe3ZhciBmPWhbYV07aWYoZil7aS5zdHlsZVthXT1iO2Zvcih2YXIgZyBpbiBmKXt2YXIgaj1mW2ddLGs9aS5zdHlsZVtqXTtlW2pdPWMoaixrKX19ZWxzZSBlW2FdPWMoYSxiKX19ZnVuY3Rpb24gZihhKXt2YXIgYj1bXTtmb3IodmFyIGMgaW4gYSlpZighKGMgaW5bImVhc2luZyIsIm9mZnNldCIsImNvbXBvc2l0ZSJdKSl7dmFyIGQ9YVtjXTtBcnJheS5pc0FycmF5KGQpfHwoZD1bZF0pO2Zvcih2YXIgZSxmPWQubGVuZ3RoLGc9MDtnPGY7ZysrKWU9e30sZS5vZmZzZXQ9Im9mZnNldCJpbiBhP2Eub2Zmc2V0OjE9PWY/MTpnLyhmLTEpLCJlYXNpbmciaW4gYSYmKGUuZWFzaW5nPWEuZWFzaW5nKSwiY29tcG9zaXRlImluIGEmJihlLmNvbXBvc2l0ZT1hLmNvbXBvc2l0ZSksZVtjXT1kW2ddLGIucHVzaChlKX1yZXR1cm4gYi5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEub2Zmc2V0LWIub2Zmc2V0fSksYn1mdW5jdGlvbiBnKGIpe2Z1bmN0aW9uIGMoKXt2YXIgYT1kLmxlbmd0aDtudWxsPT1kW2EtMV0ub2Zmc2V0JiYoZFthLTFdLm9mZnNldD0xKSxhPjEmJm51bGw9PWRbMF0ub2Zmc2V0JiYoZFswXS5vZmZzZXQ9MCk7Zm9yKHZhciBiPTAsYz1kWzBdLm9mZnNldCxlPTE7ZTxhO2UrKyl7dmFyIGY9ZFtlXS5vZmZzZXQ7aWYobnVsbCE9Zil7Zm9yKHZhciBnPTE7ZzxlLWI7ZysrKWRbYitnXS5vZmZzZXQ9YysoZi1jKSpnLyhlLWIpO2I9ZSxjPWZ9fX1pZihudWxsPT1iKXJldHVybltdO3dpbmRvdy5TeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmQXJyYXkucHJvdG90eXBlLmZyb20mJmJbU3ltYm9sLml0ZXJhdG9yXSYmKGI9QXJyYXkuZnJvbShiKSksQXJyYXkuaXNBcnJheShiKXx8KGI9ZihiKSk7Zm9yKHZhciBkPWIubWFwKGZ1bmN0aW9uKGIpe3ZhciBjPXt9O2Zvcih2YXIgZCBpbiBiKXt2YXIgZj1iW2RdO2lmKCJvZmZzZXQiPT1kKXtpZihudWxsIT1mKXtpZihmPU51bWJlcihmKSwhaXNGaW5pdGUoZikpdGhyb3cgbmV3IFR5cGVFcnJvcigiS2V5ZnJhbWUgb2Zmc2V0cyBtdXN0IGJlIG51bWJlcnMuIik7aWYoZjwwfHxmPjEpdGhyb3cgbmV3IFR5cGVFcnJvcigiS2V5ZnJhbWUgb2Zmc2V0cyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMS4iKX19ZWxzZSBpZigiY29tcG9zaXRlIj09ZCl7aWYoImFkZCI9PWZ8fCJhY2N1bXVsYXRlIj09Zil0aHJvd3t0eXBlOkRPTUV4Y2VwdGlvbi5OT1RfU1VQUE9SVEVEX0VSUixuYW1lOiJOb3RTdXBwb3J0ZWRFcnJvciIsbWVzc2FnZToiYWRkIGNvbXBvc2l0aW5nIGlzIG5vdCBzdXBwb3J0ZWQifTtpZigicmVwbGFjZSIhPWYpdGhyb3cgbmV3IFR5cGVFcnJvcigiSW52YWxpZCBjb21wb3NpdGUgbW9kZSAiK2YrIi4iKX1lbHNlIGY9ImVhc2luZyI9PWQ/YS5ub3JtYWxpemVFYXNpbmcoZik6IiIrZjtlKGQsZixjKX1yZXR1cm4gdm9pZCAwPT1jLm9mZnNldCYmKGMub2Zmc2V0PW51bGwpLHZvaWQgMD09Yy5lYXNpbmcmJihjLmVhc2luZz0ibGluZWFyIiksY30pLGc9ITAsaD0tMS8wLGk9MDtpPGQubGVuZ3RoO2krKyl7dmFyIGo9ZFtpXS5vZmZzZXQ7aWYobnVsbCE9ail7aWYoajxoKXRocm93IG5ldyBUeXBlRXJyb3IoIktleWZyYW1lcyBhcmUgbm90IGxvb3NlbHkgc29ydGVkIGJ5IG9mZnNldC4gU29ydCBvciBzcGVjaWZ5IG9mZnNldHMuIik7aD1qfWVsc2UgZz0hMX1yZXR1cm4gZD1kLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS5vZmZzZXQ+PTAmJmEub2Zmc2V0PD0xfSksZ3x8YygpLGR9dmFyIGg9e2JhY2tncm91bmQ6WyJiYWNrZ3JvdW5kSW1hZ2UiLCJiYWNrZ3JvdW5kUG9zaXRpb24iLCJiYWNrZ3JvdW5kU2l6ZSIsImJhY2tncm91bmRSZXBlYXQiLCJiYWNrZ3JvdW5kQXR0YWNobWVudCIsImJhY2tncm91bmRPcmlnaW4iLCJiYWNrZ3JvdW5kQ2xpcCIsImJhY2tncm91bmRDb2xvciJdLGJvcmRlcjpbImJvcmRlclRvcENvbG9yIiwiYm9yZGVyVG9wU3R5bGUiLCJib3JkZXJUb3BXaWR0aCIsImJvcmRlclJpZ2h0Q29sb3IiLCJib3JkZXJSaWdodFN0eWxlIiwiYm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlckJvdHRvbUNvbG9yIiwiYm9yZGVyQm90dG9tU3R5bGUiLCJib3JkZXJCb3R0b21XaWR0aCIsImJvcmRlckxlZnRDb2xvciIsImJvcmRlckxlZnRTdHlsZSIsImJvcmRlckxlZnRXaWR0aCJdLGJvcmRlckJvdHRvbTpbImJvcmRlckJvdHRvbVdpZHRoIiwiYm9yZGVyQm90dG9tU3R5bGUiLCJib3JkZXJCb3R0b21Db2xvciJdLGJvcmRlckNvbG9yOlsiYm9yZGVyVG9wQ29sb3IiLCJib3JkZXJSaWdodENvbG9yIiwiYm9yZGVyQm90dG9tQ29sb3IiLCJib3JkZXJMZWZ0Q29sb3IiXSxib3JkZXJMZWZ0OlsiYm9yZGVyTGVmdFdpZHRoIiwiYm9yZGVyTGVmdFN0eWxlIiwiYm9yZGVyTGVmdENvbG9yIl0sYm9yZGVyUmFkaXVzOlsiYm9yZGVyVG9wTGVmdFJhZGl1cyIsImJvcmRlclRvcFJpZ2h0UmFkaXVzIiwiYm9yZGVyQm90dG9tUmlnaHRSYWRpdXMiLCJib3JkZXJCb3R0b21MZWZ0UmFkaXVzIl0sYm9yZGVyUmlnaHQ6WyJib3JkZXJSaWdodFdpZHRoIiwiYm9yZGVyUmlnaHRTdHlsZSIsImJvcmRlclJpZ2h0Q29sb3IiXSxib3JkZXJUb3A6WyJib3JkZXJUb3BXaWR0aCIsImJvcmRlclRvcFN0eWxlIiwiYm9yZGVyVG9wQ29sb3IiXSxib3JkZXJXaWR0aDpbImJvcmRlclRvcFdpZHRoIiwiYm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlckJvdHRvbVdpZHRoIiwiYm9yZGVyTGVmdFdpZHRoIl0sZmxleDpbImZsZXhHcm93IiwiZmxleFNocmluayIsImZsZXhCYXNpcyJdLGZvbnQ6WyJmb250RmFtaWx5IiwiZm9udFNpemUiLCJmb250U3R5bGUiLCJmb250VmFyaWFudCIsImZvbnRXZWlnaHQiLCJsaW5lSGVpZ2h0Il0sbWFyZ2luOlsibWFyZ2luVG9wIiwibWFyZ2luUmlnaHQiLCJtYXJnaW5Cb3R0b20iLCJtYXJnaW5MZWZ0Il0sb3V0bGluZTpbIm91dGxpbmVDb2xvciIsIm91dGxpbmVTdHlsZSIsIm91dGxpbmVXaWR0aCJdLHBhZGRpbmc6WyJwYWRkaW5nVG9wIiwicGFkZGluZ1JpZ2h0IiwicGFkZGluZ0JvdHRvbSIsInBhZGRpbmdMZWZ0Il19LGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiZGl2Iiksaj17dGhpbjoiMXB4IixtZWRpdW06IjNweCIsdGhpY2s6IjVweCJ9LGs9e2JvcmRlckJvdHRvbVdpZHRoOmosYm9yZGVyTGVmdFdpZHRoOmosYm9yZGVyUmlnaHRXaWR0aDpqLGJvcmRlclRvcFdpZHRoOmosZm9udFNpemU6eyJ4eC1zbWFsbCI6IjYwJSIsIngtc21hbGwiOiI3NSUiLHNtYWxsOiI4OSUiLG1lZGl1bToiMTAwJSIsbGFyZ2U6IjEyMCUiLCJ4LWxhcmdlIjoiMTUwJSIsInh4LWxhcmdlIjoiMjAwJSJ9LGZvbnRXZWlnaHQ6e25vcm1hbDoiNDAwIixib2xkOiI3MDAifSxvdXRsaW5lV2lkdGg6aix0ZXh0U2hhZG93Ontub25lOiIwcHggMHB4IDBweCB0cmFuc3BhcmVudCJ9LGJveFNoYWRvdzp7bm9uZToiMHB4IDBweCAwcHggMHB4IHRyYW5zcGFyZW50In19O2EuY29udmVydFRvQXJyYXlGb3JtPWYsYS5ub3JtYWxpemVLZXlmcmFtZXM9Z30oYSksZnVuY3Rpb24oYSl7dmFyIGI9e307YS5pc0RlcHJlY2F0ZWQ9ZnVuY3Rpb24oYSxjLGQsZSl7dmFyIGY9ZT8iYXJlIjoiaXMiLGc9bmV3IERhdGUsaD1uZXcgRGF0ZShjKTtyZXR1cm4gaC5zZXRNb250aChoLmdldE1vbnRoKCkrMyksIShnPGgmJihhIGluIGJ8fGNvbnNvbGUud2FybigiV2ViIEFuaW1hdGlvbnM6ICIrYSsiICIrZisiIGRlcHJlY2F0ZWQgYW5kIHdpbGwgc3RvcCB3b3JraW5nIG9uICIraC50b0RhdGVTdHJpbmcoKSsiLiAiK2QpLGJbYV09ITAsMSkpfSxhLmRlcHJlY2F0ZWQ9ZnVuY3Rpb24oYixjLGQsZSl7dmFyIGY9ZT8iYXJlIjoiaXMiO2lmKGEuaXNEZXByZWNhdGVkKGIsYyxkLGUpKXRocm93IG5ldyBFcnJvcihiKyIgIitmKyIgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gIitkKX19KGEpLGZ1bmN0aW9uKCl7aWYoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmFuaW1hdGUpe3ZhciBjPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hbmltYXRlKFtdLDApLGQ9ITA7aWYoYyYmKGQ9ITEsInBsYXl8Y3VycmVudFRpbWV8cGF1c2V8cmV2ZXJzZXxwbGF5YmFja1JhdGV8Y2FuY2VsfGZpbmlzaHxzdGFydFRpbWV8cGxheVN0YXRlIi5zcGxpdCgifCIpLmZvckVhY2goZnVuY3Rpb24oYSl7dm9pZCAwPT09Y1thXSYmKGQ9ITApfSkpLCFkKXJldHVybn0hZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7Zm9yKHZhciBiPXt9LGM9MDtjPGEubGVuZ3RoO2MrKylmb3IodmFyIGQgaW4gYVtjXSlpZigib2Zmc2V0IiE9ZCYmImVhc2luZyIhPWQmJiJjb21wb3NpdGUiIT1kKXt2YXIgZT17b2Zmc2V0OmFbY10ub2Zmc2V0LGVhc2luZzphW2NdLmVhc2luZyx2YWx1ZTphW2NdW2RdfTtiW2RdPWJbZF18fFtdLGJbZF0ucHVzaChlKX1mb3IodmFyIGYgaW4gYil7dmFyIGc9YltmXTtpZigwIT1nWzBdLm9mZnNldHx8MSE9Z1tnLmxlbmd0aC0xXS5vZmZzZXQpdGhyb3d7dHlwZTpET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsbmFtZToiTm90U3VwcG9ydGVkRXJyb3IiLG1lc3NhZ2U6IlBhcnRpYWwga2V5ZnJhbWVzIGFyZSBub3Qgc3VwcG9ydGVkIn19cmV0dXJuIGJ9ZnVuY3Rpb24gZShjKXt2YXIgZD1bXTtmb3IodmFyIGUgaW4gYylmb3IodmFyIGY9Y1tlXSxnPTA7ZzxmLmxlbmd0aC0xO2crKyl7dmFyIGg9ZyxpPWcrMSxqPWZbaF0ub2Zmc2V0LGs9ZltpXS5vZmZzZXQsbD1qLG09azswPT1nJiYobD0tMS8wLDA9PWsmJihpPWgpKSxnPT1mLmxlbmd0aC0yJiYobT0xLzAsMT09aiYmKGg9aSkpLGQucHVzaCh7YXBwbHlGcm9tOmwsYXBwbHlUbzptLHN0YXJ0T2Zmc2V0OmZbaF0ub2Zmc2V0LGVuZE9mZnNldDpmW2ldLm9mZnNldCxlYXNpbmdGdW5jdGlvbjphLnBhcnNlRWFzaW5nRnVuY3Rpb24oZltoXS5lYXNpbmcpLHByb3BlcnR5OmUsaW50ZXJwb2xhdGlvbjpiLnByb3BlcnR5SW50ZXJwb2xhdGlvbihlLGZbaF0udmFsdWUsZltpXS52YWx1ZSl9KX1yZXR1cm4gZC5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuc3RhcnRPZmZzZXQtYi5zdGFydE9mZnNldH0pLGR9Yi5jb252ZXJ0RWZmZWN0SW5wdXQ9ZnVuY3Rpb24oYyl7dmFyIGY9YS5ub3JtYWxpemVLZXlmcmFtZXMoYyksZz1kKGYpLGg9ZShnKTtyZXR1cm4gZnVuY3Rpb24oYSxjKXtpZihudWxsIT1jKWguZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBjPj1hLmFwcGx5RnJvbSYmYzxhLmFwcGx5VG99KS5mb3JFYWNoKGZ1bmN0aW9uKGQpe3ZhciBlPWMtZC5zdGFydE9mZnNldCxmPWQuZW5kT2Zmc2V0LWQuc3RhcnRPZmZzZXQsZz0wPT1mPzA6ZC5lYXNpbmdGdW5jdGlvbihlL2YpO2IuYXBwbHkoYSxkLnByb3BlcnR5LGQuaW50ZXJwb2xhdGlvbihnKSl9KTtlbHNlIGZvcih2YXIgZCBpbiBnKSJvZmZzZXQiIT1kJiYiZWFzaW5nIiE9ZCYmImNvbXBvc2l0ZSIhPWQmJmIuY2xlYXIoYSxkKX19fShhLGIpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe3JldHVybiBhLnJlcGxhY2UoLy0oLikvZyxmdW5jdGlvbihhLGIpe3JldHVybiBiLnRvVXBwZXJDYXNlKCl9KX1mdW5jdGlvbiBlKGEsYixjKXtoW2NdPWhbY118fFtdLGhbY10ucHVzaChbYSxiXSl9ZnVuY3Rpb24gZihhLGIsYyl7Zm9yKHZhciBmPTA7ZjxjLmxlbmd0aDtmKyspe2UoYSxiLGQoY1tmXSkpfX1mdW5jdGlvbiBnKGMsZSxmKXt2YXIgZz1jOy8tLy50ZXN0KGMpJiYhYS5pc0RlcHJlY2F0ZWQoIkh5cGhlbmF0ZWQgcHJvcGVydHkgbmFtZXMiLCIyMDE2LTAzLTIyIiwiVXNlIGNhbWVsQ2FzZSBpbnN0ZWFkLiIsITApJiYoZz1kKGMpKSwiaW5pdGlhbCIhPWUmJiJpbml0aWFsIiE9Znx8KCJpbml0aWFsIj09ZSYmKGU9aVtnXSksImluaXRpYWwiPT1mJiYoZj1pW2ddKSk7Zm9yKHZhciBqPWU9PWY/W106aFtnXSxrPTA7aiYmazxqLmxlbmd0aDtrKyspe3ZhciBsPWpba11bMF0oZSksbT1qW2tdWzBdKGYpO2lmKHZvaWQgMCE9PWwmJnZvaWQgMCE9PW0pe3ZhciBuPWpba11bMV0obCxtKTtpZihuKXt2YXIgbz1iLkludGVycG9sYXRpb24uYXBwbHkobnVsbCxuKTtyZXR1cm4gZnVuY3Rpb24oYSl7cmV0dXJuIDA9PWE/ZToxPT1hP2Y6byhhKX19fX1yZXR1cm4gYi5JbnRlcnBvbGF0aW9uKCExLCEwLGZ1bmN0aW9uKGEpe3JldHVybiBhP2Y6ZX0pfXZhciBoPXt9O2IuYWRkUHJvcGVydGllc0hhbmRsZXI9Zjt2YXIgaT17YmFja2dyb3VuZENvbG9yOiJ0cmFuc3BhcmVudCIsYmFja2dyb3VuZFBvc2l0aW9uOiIwJSAwJSIsYm9yZGVyQm90dG9tQ29sb3I6ImN1cnJlbnRDb2xvciIsYm9yZGVyQm90dG9tTGVmdFJhZGl1czoiMHB4Iixib3JkZXJCb3R0b21SaWdodFJhZGl1czoiMHB4Iixib3JkZXJCb3R0b21XaWR0aDoiM3B4Iixib3JkZXJMZWZ0Q29sb3I6ImN1cnJlbnRDb2xvciIsYm9yZGVyTGVmdFdpZHRoOiIzcHgiLGJvcmRlclJpZ2h0Q29sb3I6ImN1cnJlbnRDb2xvciIsYm9yZGVyUmlnaHRXaWR0aDoiM3B4Iixib3JkZXJTcGFjaW5nOiIycHgiLGJvcmRlclRvcENvbG9yOiJjdXJyZW50Q29sb3IiLGJvcmRlclRvcExlZnRSYWRpdXM6IjBweCIsYm9yZGVyVG9wUmlnaHRSYWRpdXM6IjBweCIsYm9yZGVyVG9wV2lkdGg6IjNweCIsYm90dG9tOiJhdXRvIixjbGlwOiJyZWN0KDBweCwgMHB4LCAwcHgsIDBweCkiLGNvbG9yOiJibGFjayIsZm9udFNpemU6IjEwMCUiLGZvbnRXZWlnaHQ6IjQwMCIsaGVpZ2h0OiJhdXRvIixsZWZ0OiJhdXRvIixsZXR0ZXJTcGFjaW5nOiJub3JtYWwiLGxpbmVIZWlnaHQ6IjEyMCUiLG1hcmdpbkJvdHRvbToiMHB4IixtYXJnaW5MZWZ0OiIwcHgiLG1hcmdpblJpZ2h0OiIwcHgiLG1hcmdpblRvcDoiMHB4IixtYXhIZWlnaHQ6Im5vbmUiLG1heFdpZHRoOiJub25lIixtaW5IZWlnaHQ6IjBweCIsbWluV2lkdGg6IjBweCIsb3BhY2l0eToiMS4wIixvdXRsaW5lQ29sb3I6ImludmVydCIsb3V0bGluZU9mZnNldDoiMHB4IixvdXRsaW5lV2lkdGg6IjNweCIscGFkZGluZ0JvdHRvbToiMHB4IixwYWRkaW5nTGVmdDoiMHB4IixwYWRkaW5nUmlnaHQ6IjBweCIscGFkZGluZ1RvcDoiMHB4IixyaWdodDoiYXV0byIsc3Ryb2tlRGFzaGFycmF5OiJub25lIixzdHJva2VEYXNob2Zmc2V0OiIwcHgiLHRleHRJbmRlbnQ6IjBweCIsdGV4dFNoYWRvdzoiMHB4IDBweCAwcHggdHJhbnNwYXJlbnQiLHRvcDoiYXV0byIsdHJhbnNmb3JtOiIiLHZlcnRpY2FsQWxpZ246IjBweCIsdmlzaWJpbGl0eToidmlzaWJsZSIsd2lkdGg6ImF1dG8iLHdvcmRTcGFjaW5nOiJub3JtYWwiLHpJbmRleDoiYXV0byJ9O2IucHJvcGVydHlJbnRlcnBvbGF0aW9uPWd9KGEsYiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYil7dmFyIGM9YS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbihiKSxkPWZ1bmN0aW9uKGQpe3JldHVybiBhLmNhbGN1bGF0ZUl0ZXJhdGlvblByb2dyZXNzKGMsZCxiKX07cmV0dXJuIGQuX3RvdGFsRHVyYXRpb249Yi5kZWxheStjK2IuZW5kRGVsYXksZH1iLktleWZyYW1lRWZmZWN0PWZ1bmN0aW9uKGMsZSxmLGcpe3ZhciBoLGk9ZChhLm5vcm1hbGl6ZVRpbWluZ0lucHV0KGYpKSxqPWIuY29udmVydEVmZmVjdElucHV0KGUpLGs9ZnVuY3Rpb24oKXtqKGMsaCl9O3JldHVybiBrLl91cGRhdGU9ZnVuY3Rpb24oYSl7cmV0dXJuIG51bGwhPT0oaD1pKGEpKX0say5fY2xlYXI9ZnVuY3Rpb24oKXtqKGMsbnVsbCl9LGsuX2hhc1NhbWVUYXJnZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIGM9PT1hfSxrLl90YXJnZXQ9YyxrLl90b3RhbER1cmF0aW9uPWkuX3RvdGFsRHVyYXRpb24say5faWQ9ZyxrfX0oYSxiKSxmdW5jdGlvbihhLGIpe2EuYXBwbHk9ZnVuY3Rpb24oYixjLGQpe2Iuc3R5bGVbYS5wcm9wZXJ0eU5hbWUoYyldPWR9LGEuY2xlYXI9ZnVuY3Rpb24oYixjKXtiLnN0eWxlW2EucHJvcGVydHlOYW1lKGMpXT0iIn19KGIpLGZ1bmN0aW9uKGEpe3dpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGIsYyl7dmFyIGQ9IiI7cmV0dXJuIGMmJmMuaWQmJihkPWMuaWQpLGEudGltZWxpbmUuX3BsYXkoYS5LZXlmcmFtZUVmZmVjdCh0aGlzLGIsYyxkKSl9fShiKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiLGQpe2lmKCJudW1iZXIiPT10eXBlb2YgYSYmIm51bWJlciI9PXR5cGVvZiBiKXJldHVybiBhKigxLWQpK2IqZDtpZigiYm9vbGVhbiI9PXR5cGVvZiBhJiYiYm9vbGVhbiI9PXR5cGVvZiBiKXJldHVybiBkPC41P2E6YjtpZihhLmxlbmd0aD09Yi5sZW5ndGgpe2Zvcih2YXIgZT1bXSxmPTA7ZjxhLmxlbmd0aDtmKyspZS5wdXNoKGMoYVtmXSxiW2ZdLGQpKTtyZXR1cm4gZX10aHJvdyJNaXNtYXRjaGVkIGludGVycG9sYXRpb24gYXJndW1lbnRzICIrYSsiOiIrYn1hLkludGVycG9sYXRpb249ZnVuY3Rpb24oYSxiLGQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZChjKGEsYixlKSl9fX0oYiksZnVuY3Rpb24oYSxiLGMpe2Euc2VxdWVuY2VOdW1iZXI9MDt2YXIgZD1mdW5jdGlvbihhLGIsYyl7dGhpcy50YXJnZXQ9YSx0aGlzLmN1cnJlbnRUaW1lPWIsdGhpcy50aW1lbGluZVRpbWU9Yyx0aGlzLnR5cGU9ImZpbmlzaCIsdGhpcy5idWJibGVzPSExLHRoaXMuY2FuY2VsYWJsZT0hMSx0aGlzLmN1cnJlbnRUYXJnZXQ9YSx0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITEsdGhpcy5ldmVudFBoYXNlPUV2ZW50LkFUX1RBUkdFVCx0aGlzLnRpbWVTdGFtcD1EYXRlLm5vdygpfTtiLkFuaW1hdGlvbj1mdW5jdGlvbihiKXt0aGlzLmlkPSIiLGImJmIuX2lkJiYodGhpcy5pZD1iLl9pZCksdGhpcy5fc2VxdWVuY2VOdW1iZXI9YS5zZXF1ZW5jZU51bWJlcisrLHRoaXMuX2N1cnJlbnRUaW1lPTAsdGhpcy5fc3RhcnRUaW1lPW51bGwsdGhpcy5fcGF1c2VkPSExLHRoaXMuX3BsYXliYWNrUmF0ZT0xLHRoaXMuX2luVGltZWxpbmU9ITAsdGhpcy5fZmluaXNoZWRGbGFnPSEwLHRoaXMub25maW5pc2g9bnVsbCx0aGlzLl9maW5pc2hIYW5kbGVycz1bXSx0aGlzLl9lZmZlY3Q9Yix0aGlzLl9pbkVmZmVjdD10aGlzLl9lZmZlY3QuX3VwZGF0ZSgwKSx0aGlzLl9pZGxlPSEwLHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz0hMX0sYi5BbmltYXRpb24ucHJvdG90eXBlPXtfZW5zdXJlQWxpdmU6ZnVuY3Rpb24oKXt0aGlzLnBsYXliYWNrUmF0ZTwwJiYwPT09dGhpcy5jdXJyZW50VGltZT90aGlzLl9pbkVmZmVjdD10aGlzLl9lZmZlY3QuX3VwZGF0ZSgtMSk6dGhpcy5faW5FZmZlY3Q9dGhpcy5fZWZmZWN0Ll91cGRhdGUodGhpcy5jdXJyZW50VGltZSksdGhpcy5faW5UaW1lbGluZXx8IXRoaXMuX2luRWZmZWN0JiZ0aGlzLl9maW5pc2hlZEZsYWd8fCh0aGlzLl9pblRpbWVsaW5lPSEwLGIudGltZWxpbmUuX2FuaW1hdGlvbnMucHVzaCh0aGlzKSl9LF90aWNrQ3VycmVudFRpbWU6ZnVuY3Rpb24oYSxiKXthIT10aGlzLl9jdXJyZW50VGltZSYmKHRoaXMuX2N1cnJlbnRUaW1lPWEsdGhpcy5faXNGaW5pc2hlZCYmIWImJih0aGlzLl9jdXJyZW50VGltZT10aGlzLl9wbGF5YmFja1JhdGU+MD90aGlzLl90b3RhbER1cmF0aW9uOjApLHRoaXMuX2Vuc3VyZUFsaXZlKCkpfSxnZXQgY3VycmVudFRpbWUoKXtyZXR1cm4gdGhpcy5faWRsZXx8dGhpcy5fY3VycmVudFRpbWVQZW5kaW5nP251bGw6dGhpcy5fY3VycmVudFRpbWV9LHNldCBjdXJyZW50VGltZShhKXthPSthLGlzTmFOKGEpfHwoYi5yZXN0YXJ0KCksdGhpcy5fcGF1c2VkfHxudWxsPT10aGlzLl9zdGFydFRpbWV8fCh0aGlzLl9zdGFydFRpbWU9dGhpcy5fdGltZWxpbmUuY3VycmVudFRpbWUtYS90aGlzLl9wbGF5YmFja1JhdGUpLHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz0hMSx0aGlzLl9jdXJyZW50VGltZSE9YSYmKHRoaXMuX2lkbGUmJih0aGlzLl9pZGxlPSExLHRoaXMuX3BhdXNlZD0hMCksdGhpcy5fdGlja0N1cnJlbnRUaW1lKGEsITApLGIuYXBwbHlEaXJ0aWVkQW5pbWF0aW9uKHRoaXMpKSl9LGdldCBzdGFydFRpbWUoKXtyZXR1cm4gdGhpcy5fc3RhcnRUaW1lfSxzZXQgc3RhcnRUaW1lKGEpe2E9K2EsaXNOYU4oYSl8fHRoaXMuX3BhdXNlZHx8dGhpcy5faWRsZXx8KHRoaXMuX3N0YXJ0VGltZT1hLHRoaXMuX3RpY2tDdXJyZW50VGltZSgodGhpcy5fdGltZWxpbmUuY3VycmVudFRpbWUtdGhpcy5fc3RhcnRUaW1lKSp0aGlzLnBsYXliYWNrUmF0ZSksYi5hcHBseURpcnRpZWRBbmltYXRpb24odGhpcykpfSxnZXQgcGxheWJhY2tSYXRlKCl7cmV0dXJuIHRoaXMuX3BsYXliYWNrUmF0ZX0sc2V0IHBsYXliYWNrUmF0ZShhKXtpZihhIT10aGlzLl9wbGF5YmFja1JhdGUpe3ZhciBjPXRoaXMuY3VycmVudFRpbWU7dGhpcy5fcGxheWJhY2tSYXRlPWEsdGhpcy5fc3RhcnRUaW1lPW51bGwsInBhdXNlZCIhPXRoaXMucGxheVN0YXRlJiYiaWRsZSIhPXRoaXMucGxheVN0YXRlJiYodGhpcy5fZmluaXNoZWRGbGFnPSExLHRoaXMuX2lkbGU9ITEsdGhpcy5fZW5zdXJlQWxpdmUoKSxiLmFwcGx5RGlydGllZEFuaW1hdGlvbih0aGlzKSksbnVsbCE9YyYmKHRoaXMuY3VycmVudFRpbWU9Yyl9fSxnZXQgX2lzRmluaXNoZWQoKXtyZXR1cm4hdGhpcy5faWRsZSYmKHRoaXMuX3BsYXliYWNrUmF0ZT4wJiZ0aGlzLl9jdXJyZW50VGltZT49dGhpcy5fdG90YWxEdXJhdGlvbnx8dGhpcy5fcGxheWJhY2tSYXRlPDAmJnRoaXMuX2N1cnJlbnRUaW1lPD0wKX0sZ2V0IF90b3RhbER1cmF0aW9uKCl7cmV0dXJuIHRoaXMuX2VmZmVjdC5fdG90YWxEdXJhdGlvbn0sZ2V0IHBsYXlTdGF0ZSgpe3JldHVybiB0aGlzLl9pZGxlPyJpZGxlIjpudWxsPT10aGlzLl9zdGFydFRpbWUmJiF0aGlzLl9wYXVzZWQmJjAhPXRoaXMucGxheWJhY2tSYXRlfHx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc/InBlbmRpbmciOnRoaXMuX3BhdXNlZD8icGF1c2VkIjp0aGlzLl9pc0ZpbmlzaGVkPyJmaW5pc2hlZCI6InJ1bm5pbmcifSxfcmV3aW5kOmZ1bmN0aW9uKCl7aWYodGhpcy5fcGxheWJhY2tSYXRlPj0wKXRoaXMuX2N1cnJlbnRUaW1lPTA7ZWxzZXtpZighKHRoaXMuX3RvdGFsRHVyYXRpb248MS8wKSl0aHJvdyBuZXcgRE9NRXhjZXB0aW9uKCJVbmFibGUgdG8gcmV3aW5kIG5lZ2F0aXZlIHBsYXliYWNrIHJhdGUgYW5pbWF0aW9uIHdpdGggaW5maW5pdGUgZHVyYXRpb24iLCJJbnZhbGlkU3RhdGVFcnJvciIpO3RoaXMuX2N1cnJlbnRUaW1lPXRoaXMuX3RvdGFsRHVyYXRpb259fSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5fcGF1c2VkPSExLCh0aGlzLl9pc0ZpbmlzaGVkfHx0aGlzLl9pZGxlKSYmKHRoaXMuX3Jld2luZCgpLHRoaXMuX3N0YXJ0VGltZT1udWxsKSx0aGlzLl9maW5pc2hlZEZsYWc9ITEsdGhpcy5faWRsZT0hMSx0aGlzLl9lbnN1cmVBbGl2ZSgpLGIuYXBwbHlEaXJ0aWVkQW5pbWF0aW9uKHRoaXMpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuX2lzRmluaXNoZWR8fHRoaXMuX3BhdXNlZHx8dGhpcy5faWRsZT90aGlzLl9pZGxlJiYodGhpcy5fcmV3aW5kKCksdGhpcy5faWRsZT0hMSk6dGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPSEwLHRoaXMuX3N0YXJ0VGltZT1udWxsLHRoaXMuX3BhdXNlZD0hMH0sZmluaXNoOmZ1bmN0aW9uKCl7dGhpcy5faWRsZXx8KHRoaXMuY3VycmVudFRpbWU9dGhpcy5fcGxheWJhY2tSYXRlPjA/dGhpcy5fdG90YWxEdXJhdGlvbjowLHRoaXMuX3N0YXJ0VGltZT10aGlzLl90b3RhbER1cmF0aW9uLXRoaXMuY3VycmVudFRpbWUsdGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPSExLGIuYXBwbHlEaXJ0aWVkQW5pbWF0aW9uKHRoaXMpKX0sY2FuY2VsOmZ1bmN0aW9uKCl7dGhpcy5faW5FZmZlY3QmJih0aGlzLl9pbkVmZmVjdD0hMSx0aGlzLl9pZGxlPSEwLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9maW5pc2hlZEZsYWc9ITAsdGhpcy5fY3VycmVudFRpbWU9MCx0aGlzLl9zdGFydFRpbWU9bnVsbCx0aGlzLl9lZmZlY3QuX3VwZGF0ZShudWxsKSxiLmFwcGx5RGlydGllZEFuaW1hdGlvbih0aGlzKSl9LHJldmVyc2U6ZnVuY3Rpb24oKXt0aGlzLnBsYXliYWNrUmF0ZSo9LTEsdGhpcy5wbGF5KCl9LGFkZEV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiKXsiZnVuY3Rpb24iPT10eXBlb2YgYiYmImZpbmlzaCI9PWEmJnRoaXMuX2ZpbmlzaEhhbmRsZXJzLnB1c2goYil9LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiKXtpZigiZmluaXNoIj09YSl7dmFyIGM9dGhpcy5fZmluaXNoSGFuZGxlcnMuaW5kZXhPZihiKTtjPj0wJiZ0aGlzLl9maW5pc2hIYW5kbGVycy5zcGxpY2UoYywxKX19LF9maXJlRXZlbnRzOmZ1bmN0aW9uKGEpe2lmKHRoaXMuX2lzRmluaXNoZWQpe2lmKCF0aGlzLl9maW5pc2hlZEZsYWcpe3ZhciBiPW5ldyBkKHRoaXMsdGhpcy5fY3VycmVudFRpbWUsYSksYz10aGlzLl9maW5pc2hIYW5kbGVycy5jb25jYXQodGhpcy5vbmZpbmlzaD9bdGhpcy5vbmZpbmlzaF06W10pO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtjLmZvckVhY2goZnVuY3Rpb24oYSl7YS5jYWxsKGIudGFyZ2V0LGIpfSl9LDApLHRoaXMuX2ZpbmlzaGVkRmxhZz0hMH19ZWxzZSB0aGlzLl9maW5pc2hlZEZsYWc9ITF9LF90aWNrOmZ1bmN0aW9uKGEsYil7dGhpcy5faWRsZXx8dGhpcy5fcGF1c2VkfHwobnVsbD09dGhpcy5fc3RhcnRUaW1lP2ImJih0aGlzLnN0YXJ0VGltZT1hLXRoaXMuX2N1cnJlbnRUaW1lL3RoaXMucGxheWJhY2tSYXRlKTp0aGlzLl9pc0ZpbmlzaGVkfHx0aGlzLl90aWNrQ3VycmVudFRpbWUoKGEtdGhpcy5fc3RhcnRUaW1lKSp0aGlzLnBsYXliYWNrUmF0ZSkpLGImJih0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc9ITEsdGhpcy5fZmlyZUV2ZW50cyhhKSl9LGdldCBfbmVlZHNUaWNrKCl7cmV0dXJuIHRoaXMucGxheVN0YXRlIGlue3BlbmRpbmc6MSxydW5uaW5nOjF9fHwhdGhpcy5fZmluaXNoZWRGbGFnfSxfdGFyZ2V0QW5pbWF0aW9uczpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX2VmZmVjdC5fdGFyZ2V0O3JldHVybiBhLl9hY3RpdmVBbmltYXRpb25zfHwoYS5fYWN0aXZlQW5pbWF0aW9ucz1bXSksYS5fYWN0aXZlQW5pbWF0aW9uc30sX21hcmtUYXJnZXQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl90YXJnZXRBbmltYXRpb25zKCk7LTE9PT1hLmluZGV4T2YodGhpcykmJmEucHVzaCh0aGlzKX0sX3VubWFya1RhcmdldDpmdW5jdGlvbigpe3ZhciBhPXRoaXMuX3RhcmdldEFuaW1hdGlvbnMoKSxiPWEuaW5kZXhPZih0aGlzKTstMSE9PWImJmEuc3BsaWNlKGIsMSl9fX0oYSxiKSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXt2YXIgYj1qO2o9W10sYTxxLmN1cnJlbnRUaW1lJiYoYT1xLmN1cnJlbnRUaW1lKSxxLl9hbmltYXRpb25zLnNvcnQoZSkscS5fYW5pbWF0aW9ucz1oKGEsITAscS5fYW5pbWF0aW9ucylbMF0sYi5mb3JFYWNoKGZ1bmN0aW9uKGIpe2JbMV0oYSl9KSxnKCksbD12b2lkIDB9ZnVuY3Rpb24gZShhLGIpe3JldHVybiBhLl9zZXF1ZW5jZU51bWJlci1iLl9zZXF1ZW5jZU51bWJlcn1mdW5jdGlvbiBmKCl7dGhpcy5fYW5pbWF0aW9ucz1bXSx0aGlzLmN1cnJlbnRUaW1lPXdpbmRvdy5wZXJmb3JtYW5jZSYmcGVyZm9ybWFuY2Uubm93P3BlcmZvcm1hbmNlLm5vdygpOjB9ZnVuY3Rpb24gZygpe28uZm9yRWFjaChmdW5jdGlvbihhKXthKCl9KSxvLmxlbmd0aD0wfWZ1bmN0aW9uIGgoYSxjLGQpe3A9ITAsbj0hMSxiLnRpbWVsaW5lLmN1cnJlbnRUaW1lPWEsbT0hMTt2YXIgZT1bXSxmPVtdLGc9W10saD1bXTtyZXR1cm4gZC5mb3JFYWNoKGZ1bmN0aW9uKGIpe2IuX3RpY2soYSxjKSxiLl9pbkVmZmVjdD8oZi5wdXNoKGIuX2VmZmVjdCksYi5fbWFya1RhcmdldCgpKTooZS5wdXNoKGIuX2VmZmVjdCksYi5fdW5tYXJrVGFyZ2V0KCkpLGIuX25lZWRzVGljayYmKG09ITApO3ZhciBkPWIuX2luRWZmZWN0fHxiLl9uZWVkc1RpY2s7Yi5faW5UaW1lbGluZT1kLGQ/Zy5wdXNoKGIpOmgucHVzaChiKX0pLG8ucHVzaC5hcHBseShvLGUpLG8ucHVzaC5hcHBseShvLGYpLG0mJnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe30pLHA9ITEsW2csaF19dmFyIGk9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSxqPVtdLGs9MDt3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lPWZ1bmN0aW9uKGEpe3ZhciBiPWsrKztyZXR1cm4gMD09ai5sZW5ndGgmJmkoZCksai5wdXNoKFtiLGFdKSxifSx3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oYSl7ai5mb3JFYWNoKGZ1bmN0aW9uKGIpe2JbMF09PWEmJihiWzFdPWZ1bmN0aW9uKCl7fSl9KX0sZi5wcm90b3R5cGU9e19wbGF5OmZ1bmN0aW9uKGMpe2MuX3RpbWluZz1hLm5vcm1hbGl6ZVRpbWluZ0lucHV0KGMudGltaW5nKTt2YXIgZD1uZXcgYi5BbmltYXRpb24oYyk7cmV0dXJuIGQuX2lkbGU9ITEsZC5fdGltZWxpbmU9dGhpcyx0aGlzLl9hbmltYXRpb25zLnB1c2goZCksYi5yZXN0YXJ0KCksYi5hcHBseURpcnRpZWRBbmltYXRpb24oZCksZH19O3ZhciBsPXZvaWQgMCxtPSExLG49ITE7Yi5yZXN0YXJ0PWZ1bmN0aW9uKCl7cmV0dXJuIG18fChtPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe30pLG49ITApLG59LGIuYXBwbHlEaXJ0aWVkQW5pbWF0aW9uPWZ1bmN0aW9uKGEpe2lmKCFwKXthLl9tYXJrVGFyZ2V0KCk7dmFyIGM9YS5fdGFyZ2V0QW5pbWF0aW9ucygpO2Muc29ydChlKSxoKGIudGltZWxpbmUuY3VycmVudFRpbWUsITEsYy5zbGljZSgpKVsxXS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZhciBiPXEuX2FuaW1hdGlvbnMuaW5kZXhPZihhKTstMSE9PWImJnEuX2FuaW1hdGlvbnMuc3BsaWNlKGIsMSl9KSxnKCl9fTt2YXIgbz1bXSxwPSExLHE9bmV3IGY7Yi50aW1lbGluZT1xfShhLGIpLGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiKXt2YXIgYz1hLmV4ZWMoYik7aWYoYylyZXR1cm4gYz1hLmlnbm9yZUNhc2U/Y1swXS50b0xvd2VyQ2FzZSgpOmNbMF0sW2MsYi5zdWJzdHIoYy5sZW5ndGgpXX1mdW5jdGlvbiBjKGEsYil7Yj1iLnJlcGxhY2UoL15ccyovLCIiKTt2YXIgYz1hKGIpO2lmKGMpcmV0dXJuW2NbMF0sY1sxXS5yZXBsYWNlKC9eXHMqLywiIildfWZ1bmN0aW9uIGQoYSxkLGUpe2E9Yy5iaW5kKG51bGwsYSk7Zm9yKHZhciBmPVtdOzspe3ZhciBnPWEoZSk7aWYoIWcpcmV0dXJuW2YsZV07aWYoZi5wdXNoKGdbMF0pLGU9Z1sxXSwhKGc9YihkLGUpKXx8IiI9PWdbMV0pcmV0dXJuW2YsZV07ZT1nWzFdfX1mdW5jdGlvbiBlKGEsYil7Zm9yKHZhciBjPTAsZD0wO2Q8Yi5sZW5ndGgmJighL1xzfCwvLnRlc3QoYltkXSl8fDAhPWMpO2QrKylpZigiKCI9PWJbZF0pYysrO2Vsc2UgaWYoIikiPT1iW2RdJiYoYy0tLDA9PWMmJmQrKyxjPD0wKSlicmVhazt2YXIgZT1hKGIuc3Vic3RyKDAsZCkpO3JldHVybiB2b2lkIDA9PWU/dm9pZCAwOltlLGIuc3Vic3RyKGQpXX1mdW5jdGlvbiBmKGEsYil7Zm9yKHZhciBjPWEsZD1iO2MmJmQ7KWM+ZD9jJT1kOmQlPWM7cmV0dXJuIGM9YSpiLyhjK2QpfWZ1bmN0aW9uIGcoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPWEoYik7cmV0dXJuIGMmJihjWzBdPXZvaWQgMCksY319ZnVuY3Rpb24gaChhLGIpe3JldHVybiBmdW5jdGlvbihjKXtyZXR1cm4gYShjKXx8W2IsY119fWZ1bmN0aW9uIGkoYixjKXtmb3IodmFyIGQ9W10sZT0wO2U8Yi5sZW5ndGg7ZSsrKXt2YXIgZj1hLmNvbnN1bWVUcmltbWVkKGJbZV0sYyk7aWYoIWZ8fCIiPT1mWzBdKXJldHVybjt2b2lkIDAhPT1mWzBdJiZkLnB1c2goZlswXSksYz1mWzFdfWlmKCIiPT1jKXJldHVybiBkfWZ1bmN0aW9uIGooYSxiLGMsZCxlKXtmb3IodmFyIGc9W10saD1bXSxpPVtdLGo9ZihkLmxlbmd0aCxlLmxlbmd0aCksaz0wO2s8ajtrKyspe3ZhciBsPWIoZFtrJWQubGVuZ3RoXSxlW2slZS5sZW5ndGhdKTtpZighbClyZXR1cm47Zy5wdXNoKGxbMF0pLGgucHVzaChsWzFdKSxpLnB1c2gobFsyXSl9cmV0dXJuW2csaCxmdW5jdGlvbihiKXt2YXIgZD1iLm1hcChmdW5jdGlvbihhLGIpe3JldHVybiBpW2JdKGEpfSkuam9pbihjKTtyZXR1cm4gYT9hKGQpOmR9XX1mdW5jdGlvbiBrKGEsYixjKXtmb3IodmFyIGQ9W10sZT1bXSxmPVtdLGc9MCxoPTA7aDxjLmxlbmd0aDtoKyspaWYoImZ1bmN0aW9uIj09dHlwZW9mIGNbaF0pe3ZhciBpPWNbaF0oYVtnXSxiW2crK10pO2QucHVzaChpWzBdKSxlLnB1c2goaVsxXSksZi5wdXNoKGlbMl0pfWVsc2UhZnVuY3Rpb24oYSl7ZC5wdXNoKCExKSxlLnB1c2goITEpLGYucHVzaChmdW5jdGlvbigpe3JldHVybiBjW2FdfSl9KGgpO3JldHVybltkLGUsZnVuY3Rpb24oYSl7Zm9yKHZhciBiPSIiLGM9MDtjPGEubGVuZ3RoO2MrKyliKz1mW2NdKGFbY10pO3JldHVybiBifV19YS5jb25zdW1lVG9rZW49YixhLmNvbnN1bWVUcmltbWVkPWMsYS5jb25zdW1lUmVwZWF0ZWQ9ZCxhLmNvbnN1bWVQYXJlbnRoZXNpc2VkPWUsYS5pZ25vcmU9ZyxhLm9wdGlvbmFsPWgsYS5jb25zdW1lTGlzdD1pLGEubWVyZ2VOZXN0ZWRSZXBlYXRlZD1qLmJpbmQobnVsbCxudWxsKSxhLm1lcmdlV3JhcHBlZE5lc3RlZFJlcGVhdGVkPWosYS5tZXJnZUxpc3Q9a30oYiksZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiKXtmdW5jdGlvbiBjKGIpe3ZhciBjPWEuY29uc3VtZVRva2VuKC9eaW5zZXQvaSxiKTtyZXR1cm4gYz8oZC5pbnNldD0hMCxjKTooYz1hLmNvbnN1bWVMZW5ndGhPclBlcmNlbnQoYikpPyhkLmxlbmd0aHMucHVzaChjWzBdKSxjKTooYz1hLmNvbnN1bWVDb2xvcihiKSxjPyhkLmNvbG9yPWNbMF0sYyk6dm9pZCAwKX12YXIgZD17aW5zZXQ6ITEsbGVuZ3RoczpbXSxjb2xvcjpudWxsfSxlPWEuY29uc3VtZVJlcGVhdGVkKGMsL14vLGIpO2lmKGUmJmVbMF0ubGVuZ3RoKXJldHVybltkLGVbMV1dfWZ1bmN0aW9uIGMoYyl7dmFyIGQ9YS5jb25zdW1lUmVwZWF0ZWQoYiwvXiwvLGMpO2lmKGQmJiIiPT1kWzFdKXJldHVybiBkWzBdfWZ1bmN0aW9uIGQoYixjKXtmb3IoO2IubGVuZ3Rocy5sZW5ndGg8TWF0aC5tYXgoYi5sZW5ndGhzLmxlbmd0aCxjLmxlbmd0aHMubGVuZ3RoKTspYi5sZW5ndGhzLnB1c2goe3B4OjB9KTtmb3IoO2MubGVuZ3Rocy5sZW5ndGg8TWF0aC5tYXgoYi5sZW5ndGhzLmxlbmd0aCxjLmxlbmd0aHMubGVuZ3RoKTspYy5sZW5ndGhzLnB1c2goe3B4OjB9KTtpZihiLmluc2V0PT1jLmluc2V0JiYhIWIuY29sb3I9PSEhYy5jb2xvcil7Zm9yKHZhciBkLGU9W10sZj1bW10sMF0sZz1bW10sMF0saD0wO2g8Yi5sZW5ndGhzLmxlbmd0aDtoKyspe3ZhciBpPWEubWVyZ2VEaW1lbnNpb25zKGIubGVuZ3Roc1toXSxjLmxlbmd0aHNbaF0sMj09aCk7ZlswXS5wdXNoKGlbMF0pLGdbMF0ucHVzaChpWzFdKSxlLnB1c2goaVsyXSl9aWYoYi5jb2xvciYmYy5jb2xvcil7dmFyIGo9YS5tZXJnZUNvbG9ycyhiLmNvbG9yLGMuY29sb3IpO2ZbMV09alswXSxnWzFdPWpbMV0sZD1qWzJdfXJldHVybltmLGcsZnVuY3Rpb24oYSl7Zm9yKHZhciBjPWIuaW5zZXQ/Imluc2V0ICI6IiAiLGY9MDtmPGUubGVuZ3RoO2YrKyljKz1lW2ZdKGFbMF1bZl0pKyIgIjtyZXR1cm4gZCYmKGMrPWQoYVsxXSkpLGN9XX19ZnVuY3Rpb24gZShiLGMsZCxlKXtmdW5jdGlvbiBmKGEpe3JldHVybntpbnNldDphLGNvbG9yOlswLDAsMCwwXSxsZW5ndGhzOlt7cHg6MH0se3B4OjB9LHtweDowfSx7cHg6MH1dfX1mb3IodmFyIGc9W10saD1bXSxpPTA7aTxkLmxlbmd0aHx8aTxlLmxlbmd0aDtpKyspe3ZhciBqPWRbaV18fGYoZVtpXS5pbnNldCksaz1lW2ldfHxmKGRbaV0uaW5zZXQpO2cucHVzaChqKSxoLnB1c2goayl9cmV0dXJuIGEubWVyZ2VOZXN0ZWRSZXBlYXRlZChiLGMsZyxoKX12YXIgZj1lLmJpbmQobnVsbCxkLCIsICIpO2EuYWRkUHJvcGVydGllc0hhbmRsZXIoYyxmLFsiYm94LXNoYWRvdyIsInRleHQtc2hhZG93Il0pfShiKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSl7cmV0dXJuIGEudG9GaXhlZCgzKS5yZXBsYWNlKC8wKyQvLCIiKS5yZXBsYWNlKC9cLiQvLCIiKX1mdW5jdGlvbiBkKGEsYixjKXtyZXR1cm4gTWF0aC5taW4oYixNYXRoLm1heChhLGMpKX1mdW5jdGlvbiBlKGEpe2lmKC9eXHMqWy0rXT8oXGQqXC4pP1xkK1xzKiQvLnRlc3QoYSkpcmV0dXJuIE51bWJlcihhKX1mdW5jdGlvbiBmKGEsYil7cmV0dXJuW2EsYixjXX1mdW5jdGlvbiBnKGEsYil7aWYoMCE9YSlyZXR1cm4gaSgwLDEvMCkoYSxiKX1mdW5jdGlvbiBoKGEsYil7cmV0dXJuW2EsYixmdW5jdGlvbihhKXtyZXR1cm4gTWF0aC5yb3VuZChkKDEsMS8wLGEpKX1dfWZ1bmN0aW9uIGkoYSxiKXtyZXR1cm4gZnVuY3Rpb24oZSxmKXtyZXR1cm5bZSxmLGZ1bmN0aW9uKGUpe3JldHVybiBjKGQoYSxiLGUpKX1dfX1mdW5jdGlvbiBqKGEpe3ZhciBiPWEudHJpbSgpLnNwbGl0KC9ccypbXHMsXVxzKi8pO2lmKDAhPT1iLmxlbmd0aCl7Zm9yKHZhciBjPVtdLGQ9MDtkPGIubGVuZ3RoO2QrKyl7dmFyIGY9ZShiW2RdKTtpZih2b2lkIDA9PT1mKXJldHVybjtjLnB1c2goZil9cmV0dXJuIGN9fWZ1bmN0aW9uIGsoYSxiKXtpZihhLmxlbmd0aD09Yi5sZW5ndGgpcmV0dXJuW2EsYixmdW5jdGlvbihhKXtyZXR1cm4gYS5tYXAoYykuam9pbigiICIpfV19ZnVuY3Rpb24gbChhLGIpe3JldHVyblthLGIsTWF0aC5yb3VuZF19YS5jbGFtcD1kLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoaixrLFsic3Ryb2tlLWRhc2hhcnJheSJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGUsaSgwLDEvMCksWyJib3JkZXItaW1hZ2Utd2lkdGgiLCJsaW5lLWhlaWdodCJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGUsaSgwLDEpLFsib3BhY2l0eSIsInNoYXBlLWltYWdlLXRocmVzaG9sZCJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGUsZyxbImZsZXgtZ3JvdyIsImZsZXgtc2hyaW5rIl0pLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoZSxoLFsib3JwaGFucyIsIndpZG93cyJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGUsbCxbInotaW5kZXgiXSksYS5wYXJzZU51bWJlcj1lLGEucGFyc2VOdW1iZXJMaXN0PWosYS5tZXJnZU51bWJlcnM9ZixhLm51bWJlclRvU3RyaW5nPWN9KGIpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2lmKCJ2aXNpYmxlIj09YXx8InZpc2libGUiPT1iKXJldHVyblswLDEsZnVuY3Rpb24oYyl7cmV0dXJuIGM8PTA/YTpjPj0xP2I6InZpc2libGUifV19YS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihTdHJpbmcsYyxbInZpc2liaWxpdHkiXSl9KGIpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhKXthPWEudHJpbSgpLGYuZmlsbFN0eWxlPSIjMDAwIixmLmZpbGxTdHlsZT1hO3ZhciBiPWYuZmlsbFN0eWxlO2lmKGYuZmlsbFN0eWxlPSIjZmZmIixmLmZpbGxTdHlsZT1hLGI9PWYuZmlsbFN0eWxlKXtmLmZpbGxSZWN0KDAsMCwxLDEpO3ZhciBjPWYuZ2V0SW1hZ2VEYXRhKDAsMCwxLDEpLmRhdGE7Zi5jbGVhclJlY3QoMCwwLDEsMSk7dmFyIGQ9Y1szXS8yNTU7cmV0dXJuW2NbMF0qZCxjWzFdKmQsY1syXSpkLGRdfX1mdW5jdGlvbiBkKGIsYyl7cmV0dXJuW2IsYyxmdW5jdGlvbihiKXtmdW5jdGlvbiBjKGEpe3JldHVybiBNYXRoLm1heCgwLE1hdGgubWluKDI1NSxhKSl9aWYoYlszXSlmb3IodmFyIGQ9MDtkPDM7ZCsrKWJbZF09TWF0aC5yb3VuZChjKGJbZF0vYlszXSkpO3JldHVybiBiWzNdPWEubnVtYmVyVG9TdHJpbmcoYS5jbGFtcCgwLDEsYlszXSkpLCJyZ2JhKCIrYi5qb2luKCIsIikrIikifV19dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiY2FudmFzIik7ZS53aWR0aD1lLmhlaWdodD0xO3ZhciBmPWUuZ2V0Q29udGV4dCgiMmQiKTthLmFkZFByb3BlcnRpZXNIYW5kbGVyKGMsZCxbImJhY2tncm91bmQtY29sb3IiLCJib3JkZXItYm90dG9tLWNvbG9yIiwiYm9yZGVyLWxlZnQtY29sb3IiLCJib3JkZXItcmlnaHQtY29sb3IiLCJib3JkZXItdG9wLWNvbG9yIiwiY29sb3IiLCJmaWxsIiwiZmxvb2QtY29sb3IiLCJsaWdodGluZy1jb2xvciIsIm91dGxpbmUtY29sb3IiLCJzdG9wLWNvbG9yIiwic3Ryb2tlIiwidGV4dC1kZWNvcmF0aW9uLWNvbG9yIl0pLGEuY29uc3VtZUNvbG9yPWEuY29uc3VtZVBhcmVudGhlc2lzZWQuYmluZChudWxsLGMpLGEubWVyZ2VDb2xvcnM9ZH0oYiksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEpe2Z1bmN0aW9uIGIoKXt2YXIgYj1oLmV4ZWMoYSk7Zz1iP2JbMF06dm9pZCAwfWZ1bmN0aW9uIGMoKXt2YXIgYT1OdW1iZXIoZyk7cmV0dXJuIGIoKSxhfWZ1bmN0aW9uIGQoKXtpZigiKCIhPT1nKXJldHVybiBjKCk7YigpO3ZhciBhPWYoKTtyZXR1cm4iKSIhPT1nP05hTjooYigpLGEpfWZ1bmN0aW9uIGUoKXtmb3IodmFyIGE9ZCgpOyIqIj09PWd8fCIvIj09PWc7KXt2YXIgYz1nO2IoKTt2YXIgZT1kKCk7IioiPT09Yz9hKj1lOmEvPWV9cmV0dXJuIGF9ZnVuY3Rpb24gZigpe2Zvcih2YXIgYT1lKCk7IisiPT09Z3x8Ii0iPT09Zzspe3ZhciBjPWc7YigpO3ZhciBkPWUoKTsiKyI9PT1jP2ErPWQ6YS09ZH1yZXR1cm4gYX12YXIgZyxoPS8oW1wrXC1cd1wuXSt8W1woXClcKlwvXSkvZztyZXR1cm4gYigpLGYoKX1mdW5jdGlvbiBkKGEsYil7aWYoIjAiPT0oYj1iLnRyaW0oKS50b0xvd2VyQ2FzZSgpKSYmInB4Ii5zZWFyY2goYSk+PTApcmV0dXJue3B4OjB9O2lmKC9eW14oXSokfF5jYWxjLy50ZXN0KGIpKXtiPWIucmVwbGFjZSgvY2FsY1woL2csIigiKTt2YXIgZD17fTtiPWIucmVwbGFjZShhLGZ1bmN0aW9uKGEpe3JldHVybiBkW2FdPW51bGwsIlUiK2F9KTtmb3IodmFyIGU9IlUoIithLnNvdXJjZSsiKSIsZj1iLnJlcGxhY2UoL1stK10/KFxkKlwuKT9cZCsoW0VlXVstK10/XGQrKT8vZywiTiIpLnJlcGxhY2UobmV3IFJlZ0V4cCgiTiIrZSwiZyIpLCJEIikucmVwbGFjZSgvXHNbKy1dXHMvZywiTyIpLnJlcGxhY2UoL1xzL2csIiIpLGc9Wy9OXCooRCkvZywvKE58RClbKlwvXU4vZywvKE58RClPXDEvZywvXCgoTnxEKVwpL2ddLGg9MDtoPGcubGVuZ3RoOylnW2hdLnRlc3QoZik/KGY9Zi5yZXBsYWNlKGdbaF0sIiQxIiksaD0wKTpoKys7aWYoIkQiPT1mKXtmb3IodmFyIGkgaW4gZCl7dmFyIGo9YyhiLnJlcGxhY2UobmV3IFJlZ0V4cCgiVSIraSwiZyIpLCIiKS5yZXBsYWNlKG5ldyBSZWdFeHAoZSwiZyIpLCIqMCIpKTtpZighaXNGaW5pdGUoaikpcmV0dXJuO2RbaV09an1yZXR1cm4gZH19fWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gZihhLGIsITApfWZ1bmN0aW9uIGYoYixjLGQpe3ZhciBlLGY9W107Zm9yKGUgaW4gYilmLnB1c2goZSk7Zm9yKGUgaW4gYylmLmluZGV4T2YoZSk8MCYmZi5wdXNoKGUpO3JldHVybiBiPWYubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBiW2FdfHwwfSksYz1mLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gY1thXXx8MH0pLFtiLGMsZnVuY3Rpb24oYil7dmFyIGM9Yi5tYXAoZnVuY3Rpb24oYyxlKXtyZXR1cm4gMT09Yi5sZW5ndGgmJmQmJihjPU1hdGgubWF4KGMsMCkpLGEubnVtYmVyVG9TdHJpbmcoYykrZltlXX0pLmpvaW4oIiArICIpO3JldHVybiBiLmxlbmd0aD4xPyJjYWxjKCIrYysiKSI6Y31dfXZhciBnPSJweHxlbXxleHxjaHxyZW18dnd8dmh8dm1pbnx2bWF4fGNtfG1tfGlufHB0fHBjIixoPWQuYmluZChudWxsLG5ldyBSZWdFeHAoZywiZyIpKSxpPWQuYmluZChudWxsLG5ldyBSZWdFeHAoZysifCUiLCJnIikpLGo9ZC5iaW5kKG51bGwsL2RlZ3xyYWR8Z3JhZHx0dXJuL2cpO2EucGFyc2VMZW5ndGg9aCxhLnBhcnNlTGVuZ3RoT3JQZXJjZW50PWksYS5jb25zdW1lTGVuZ3RoT3JQZXJjZW50PWEuY29uc3VtZVBhcmVudGhlc2lzZWQuYmluZChudWxsLGkpLGEucGFyc2VBbmdsZT1qLGEubWVyZ2VEaW1lbnNpb25zPWY7dmFyIGs9YS5jb25zdW1lUGFyZW50aGVzaXNlZC5iaW5kKG51bGwsaCksbD1hLmNvbnN1bWVSZXBlYXRlZC5iaW5kKHZvaWQgMCxrLC9eLyksbT1hLmNvbnN1bWVSZXBlYXRlZC5iaW5kKHZvaWQgMCxsLC9eLC8pO2EuY29uc3VtZVNpemVQYWlyTGlzdD1tO3ZhciBuPWZ1bmN0aW9uKGEpe3ZhciBiPW0oYSk7aWYoYiYmIiI9PWJbMV0pcmV0dXJuIGJbMF19LG89YS5tZXJnZU5lc3RlZFJlcGVhdGVkLmJpbmQodm9pZCAwLGUsIiAiKSxwPWEubWVyZ2VOZXN0ZWRSZXBlYXRlZC5iaW5kKHZvaWQgMCxvLCIsIik7YS5tZXJnZU5vbk5lZ2F0aXZlU2l6ZVBhaXI9byxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKG4scCxbImJhY2tncm91bmQtc2l6ZSJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGksZSxbImJvcmRlci1ib3R0b20td2lkdGgiLCJib3JkZXItaW1hZ2Utd2lkdGgiLCJib3JkZXItbGVmdC13aWR0aCIsImJvcmRlci1yaWdodC13aWR0aCIsImJvcmRlci10b3Atd2lkdGgiLCJmbGV4LWJhc2lzIiwiZm9udC1zaXplIiwiaGVpZ2h0IiwibGluZS1oZWlnaHQiLCJtYXgtaGVpZ2h0IiwibWF4LXdpZHRoIiwib3V0bGluZS13aWR0aCIsIndpZHRoIl0pLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoaSxmLFsiYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1cyIsImJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzIiwiYm9yZGVyLXRvcC1sZWZ0LXJhZGl1cyIsImJvcmRlci10b3AtcmlnaHQtcmFkaXVzIiwiYm90dG9tIiwibGVmdCIsImxldHRlci1zcGFjaW5nIiwibWFyZ2luLWJvdHRvbSIsIm1hcmdpbi1sZWZ0IiwibWFyZ2luLXJpZ2h0IiwibWFyZ2luLXRvcCIsIm1pbi1oZWlnaHQiLCJtaW4td2lkdGgiLCJvdXRsaW5lLW9mZnNldCIsInBhZGRpbmctYm90dG9tIiwicGFkZGluZy1sZWZ0IiwicGFkZGluZy1yaWdodCIsInBhZGRpbmctdG9wIiwicGVyc3BlY3RpdmUiLCJyaWdodCIsInNoYXBlLW1hcmdpbiIsInN0cm9rZS1kYXNob2Zmc2V0IiwidGV4dC1pbmRlbnQiLCJ0b3AiLCJ2ZXJ0aWNhbC1hbGlnbiIsIndvcmQtc3BhY2luZyJdKX0oYiksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGIpe3JldHVybiBhLmNvbnN1bWVMZW5ndGhPclBlcmNlbnQoYil8fGEuY29uc3VtZVRva2VuKC9eYXV0by8sYil9ZnVuY3Rpb24gZChiKXt2YXIgZD1hLmNvbnN1bWVMaXN0KFthLmlnbm9yZShhLmNvbnN1bWVUb2tlbi5iaW5kKG51bGwsL15yZWN0LykpLGEuaWdub3JlKGEuY29uc3VtZVRva2VuLmJpbmQobnVsbCwvXlwoLykpLGEuY29uc3VtZVJlcGVhdGVkLmJpbmQobnVsbCxjLC9eLC8pLGEuaWdub3JlKGEuY29uc3VtZVRva2VuLmJpbmQobnVsbCwvXlwpLykpXSxiKTtpZihkJiY0PT1kWzBdLmxlbmd0aClyZXR1cm4gZFswXX1mdW5jdGlvbiBlKGIsYyl7cmV0dXJuImF1dG8iPT1ifHwiYXV0byI9PWM/WyEwLCExLGZ1bmN0aW9uKGQpe3ZhciBlPWQ/YjpjO2lmKCJhdXRvIj09ZSlyZXR1cm4iYXV0byI7dmFyIGY9YS5tZXJnZURpbWVuc2lvbnMoZSxlKTtyZXR1cm4gZlsyXShmWzBdKX1dOmEubWVyZ2VEaW1lbnNpb25zKGIsYyl9ZnVuY3Rpb24gZihhKXtyZXR1cm4icmVjdCgiK2ErIikifXZhciBnPWEubWVyZ2VXcmFwcGVkTmVzdGVkUmVwZWF0ZWQuYmluZChudWxsLGYsZSwiLCAiKTthLnBhcnNlQm94PWQsYS5tZXJnZUJveGVzPWcsYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihkLGcsWyJjbGlwIl0pfShiKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3ZhciBjPTA7cmV0dXJuIGEubWFwKGZ1bmN0aW9uKGEpe3JldHVybiBhPT09az9iW2MrK106YX0pfX1mdW5jdGlvbiBkKGEpe3JldHVybiBhfWZ1bmN0aW9uIGUoYil7aWYoIm5vbmUiPT0oYj1iLnRvTG93ZXJDYXNlKCkudHJpbSgpKSlyZXR1cm5bXTtmb3IodmFyIGMsZD0vXHMqKFx3KylcKChbXildKilcKS9nLGU9W10sZj0wO2M9ZC5leGVjKGIpOyl7aWYoYy5pbmRleCE9ZilyZXR1cm47Zj1jLmluZGV4K2NbMF0ubGVuZ3RoO3ZhciBnPWNbMV0saD1uW2ddO2lmKCFoKXJldHVybjt2YXIgaT1jWzJdLnNwbGl0KCIsIiksaj1oWzBdO2lmKGoubGVuZ3RoPGkubGVuZ3RoKXJldHVybjtmb3IodmFyIGs9W10sbz0wO288ai5sZW5ndGg7bysrKXt2YXIgcCxxPWlbb10scj1qW29dO2lmKHZvaWQgMD09PShwPXE/e0E6ZnVuY3Rpb24oYil7cmV0dXJuIjAiPT1iLnRyaW0oKT9tOmEucGFyc2VBbmdsZShiKX0sTjphLnBhcnNlTnVtYmVyLFQ6YS5wYXJzZUxlbmd0aE9yUGVyY2VudCxMOmEucGFyc2VMZW5ndGh9W3IudG9VcHBlckNhc2UoKV0ocSk6e2E6bSxuOmtbMF0sdDpsfVtyXSkpcmV0dXJuO2sucHVzaChwKX1pZihlLnB1c2goe3Q6ZyxkOmt9KSxkLmxhc3RJbmRleD09Yi5sZW5ndGgpcmV0dXJuIGV9fWZ1bmN0aW9uIGYoYSl7cmV0dXJuIGEudG9GaXhlZCg2KS5yZXBsYWNlKCIuMDAwMDAwIiwiIil9ZnVuY3Rpb24gZyhiLGMpe2lmKGIuZGVjb21wb3NpdGlvblBhaXIhPT1jKXtiLmRlY29tcG9zaXRpb25QYWlyPWM7dmFyIGQ9YS5tYWtlTWF0cml4RGVjb21wb3NpdGlvbihiKX1pZihjLmRlY29tcG9zaXRpb25QYWlyIT09Yil7Yy5kZWNvbXBvc2l0aW9uUGFpcj1iO3ZhciBlPWEubWFrZU1hdHJpeERlY29tcG9zaXRpb24oYyl9cmV0dXJuIG51bGw9PWRbMF18fG51bGw9PWVbMF0/W1shMV0sWyEwXSxmdW5jdGlvbihhKXtyZXR1cm4gYT9jWzBdLmQ6YlswXS5kfV06KGRbMF0ucHVzaCgwKSxlWzBdLnB1c2goMSksW2QsZSxmdW5jdGlvbihiKXt2YXIgYz1hLnF1YXQoZFswXVszXSxlWzBdWzNdLGJbNV0pO3JldHVybiBhLmNvbXBvc2VNYXRyaXgoYlswXSxiWzFdLGJbMl0sYyxiWzRdKS5tYXAoZikuam9pbigiLCIpfV0pfWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGEucmVwbGFjZSgvW3h5XS8sIiIpfWZ1bmN0aW9uIGkoYSl7cmV0dXJuIGEucmVwbGFjZSgvKHh8eXx6fDNkKT8kLywiM2QiKX1mdW5jdGlvbiBqKGIsYyl7dmFyIGQ9YS5tYWtlTWF0cml4RGVjb21wb3NpdGlvbiYmITAsZT0hMTtpZighYi5sZW5ndGh8fCFjLmxlbmd0aCl7Yi5sZW5ndGh8fChlPSEwLGI9YyxjPVtdKTtmb3IodmFyIGY9MDtmPGIubGVuZ3RoO2YrKyl7dmFyIGo9YltmXS50LGs9YltmXS5kLGw9InNjYWxlIj09ai5zdWJzdHIoMCw1KT8xOjA7Yy5wdXNoKHt0OmosZDprLm1hcChmdW5jdGlvbihhKXtpZigibnVtYmVyIj09dHlwZW9mIGEpcmV0dXJuIGw7dmFyIGI9e307Zm9yKHZhciBjIGluIGEpYltjXT1sO3JldHVybiBifSl9KX19dmFyIG09ZnVuY3Rpb24oYSxiKXtyZXR1cm4icGVyc3BlY3RpdmUiPT1hJiYicGVyc3BlY3RpdmUiPT1ifHwoIm1hdHJpeCI9PWF8fCJtYXRyaXgzZCI9PWEpJiYoIm1hdHJpeCI9PWJ8fCJtYXRyaXgzZCI9PWIpfSxvPVtdLHA9W10scT1bXTtpZihiLmxlbmd0aCE9Yy5sZW5ndGgpe2lmKCFkKXJldHVybjt2YXIgcj1nKGIsYyk7bz1bclswXV0scD1bclsxXV0scT1bWyJtYXRyaXgiLFtyWzJdXV1dfWVsc2UgZm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspe3ZhciBqLHM9YltmXS50LHQ9Y1tmXS50LHU9YltmXS5kLHY9Y1tmXS5kLHc9bltzXSx4PW5bdF07aWYobShzLHQpKXtpZighZClyZXR1cm47dmFyIHI9ZyhbYltmXV0sW2NbZl1dKTtvLnB1c2goclswXSkscC5wdXNoKHJbMV0pLHEucHVzaChbIm1hdHJpeCIsW3JbMl1dXSl9ZWxzZXtpZihzPT10KWo9cztlbHNlIGlmKHdbMl0mJnhbMl0mJmgocyk9PWgodCkpaj1oKHMpLHU9d1syXSh1KSx2PXhbMl0odik7ZWxzZXtpZighd1sxXXx8IXhbMV18fGkocykhPWkodCkpe2lmKCFkKXJldHVybjt2YXIgcj1nKGIsYyk7bz1bclswXV0scD1bclsxXV0scT1bWyJtYXRyaXgiLFtyWzJdXV1dO2JyZWFrfWo9aShzKSx1PXdbMV0odSksdj14WzFdKHYpfWZvcih2YXIgeT1bXSx6PVtdLEE9W10sQj0wO0I8dS5sZW5ndGg7QisrKXt2YXIgQz0ibnVtYmVyIj09dHlwZW9mIHVbQl0/YS5tZXJnZU51bWJlcnM6YS5tZXJnZURpbWVuc2lvbnMscj1DKHVbQl0sdltCXSk7eVtCXT1yWzBdLHpbQl09clsxXSxBLnB1c2goclsyXSl9by5wdXNoKHkpLHAucHVzaCh6KSxxLnB1c2goW2osQV0pfX1pZihlKXt2YXIgRD1vO289cCxwPUR9cmV0dXJuW28scCxmdW5jdGlvbihhKXtyZXR1cm4gYS5tYXAoZnVuY3Rpb24oYSxiKXt2YXIgYz1hLm1hcChmdW5jdGlvbihhLGMpe3JldHVybiBxW2JdWzFdW2NdKGEpfSkuam9pbigiLCIpO3JldHVybiJtYXRyaXgiPT1xW2JdWzBdJiYxNj09Yy5zcGxpdCgiLCIpLmxlbmd0aCYmKHFbYl1bMF09Im1hdHJpeDNkIikscVtiXVswXSsiKCIrYysiKSJ9KS5qb2luKCIgIil9XX12YXIgaz1udWxsLGw9e3B4OjB9LG09e2RlZzowfSxuPXttYXRyaXg6WyJOTk5OTk4iLFtrLGssMCwwLGssaywwLDAsMCwwLDEsMCxrLGssMCwxXSxkXSxtYXRyaXgzZDpbIk5OTk5OTk5OTk5OTk5OTk4iLGRdLHJvdGF0ZTpbIkEiXSxyb3RhdGV4OlsiQSJdLHJvdGF0ZXk6WyJBIl0scm90YXRlejpbIkEiXSxyb3RhdGUzZDpbIk5OTkEiXSxwZXJzcGVjdGl2ZTpbIkwiXSxzY2FsZTpbIk5uIixjKFtrLGssMV0pLGRdLHNjYWxleDpbIk4iLGMoW2ssMSwxXSksYyhbaywxXSldLHNjYWxleTpbIk4iLGMoWzEsaywxXSksYyhbMSxrXSldLHNjYWxlejpbIk4iLGMoWzEsMSxrXSldLHNjYWxlM2Q6WyJOTk4iLGRdLHNrZXc6WyJBYSIsbnVsbCxkXSxza2V3eDpbIkEiLG51bGwsYyhbayxtXSldLHNrZXd5OlsiQSIsbnVsbCxjKFttLGtdKV0sdHJhbnNsYXRlOlsiVHQiLGMoW2ssayxsXSksZF0sdHJhbnNsYXRleDpbIlQiLGMoW2ssbCxsXSksYyhbayxsXSldLHRyYW5zbGF0ZXk6WyJUIixjKFtsLGssbF0pLGMoW2wsa10pXSx0cmFuc2xhdGV6OlsiTCIsYyhbbCxsLGtdKV0sdHJhbnNsYXRlM2Q6WyJUVEwiLGRdfTthLmFkZFByb3BlcnRpZXNIYW5kbGVyKGUsaixbInRyYW5zZm9ybSJdKSxhLnRyYW5zZm9ybVRvU3ZnTWF0cml4PWZ1bmN0aW9uKGIpe3ZhciBjPWEudHJhbnNmb3JtTGlzdFRvTWF0cml4KGUoYikpO3JldHVybiJtYXRyaXgoIitmKGNbMF0pKyIgIitmKGNbMV0pKyIgIitmKGNbNF0pKyIgIitmKGNbNV0pKyIgIitmKGNbMTJdKSsiICIrZihjWzEzXSkrIikifX0oYiksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7Yi5jb25jYXQoW2FdKS5mb3JFYWNoKGZ1bmN0aW9uKGIpe2IgaW4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlJiYoZFthXT1iKSxlW2JdPWF9KX12YXIgZD17fSxlPXt9O2MoInRyYW5zZm9ybSIsWyJ3ZWJraXRUcmFuc2Zvcm0iLCJtc1RyYW5zZm9ybSJdKSxjKCJ0cmFuc2Zvcm1PcmlnaW4iLFsid2Via2l0VHJhbnNmb3JtT3JpZ2luIl0pLGMoInBlcnNwZWN0aXZlIixbIndlYmtpdFBlcnNwZWN0aXZlIl0pLGMoInBlcnNwZWN0aXZlT3JpZ2luIixbIndlYmtpdFBlcnNwZWN0aXZlT3JpZ2luIl0pLGEucHJvcGVydHlOYW1lPWZ1bmN0aW9uKGEpe3JldHVybiBkW2FdfHxhfSxhLnVucHJlZml4ZWRQcm9wZXJ0eU5hbWU9ZnVuY3Rpb24oYSl7cmV0dXJuIGVbYV18fGF9fShiKX0oKSxmdW5jdGlvbigpe2lmKHZvaWQgMD09PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLmFuaW1hdGUoW10pLm9uY2FuY2VsKXt2YXIgYTtpZih3aW5kb3cucGVyZm9ybWFuY2UmJnBlcmZvcm1hbmNlLm5vdyl2YXIgYT1mdW5jdGlvbigpe3JldHVybiBwZXJmb3JtYW5jZS5ub3coKX07ZWxzZSB2YXIgYT1mdW5jdGlvbigpe3JldHVybiBEYXRlLm5vdygpfTt2YXIgYj1mdW5jdGlvbihhLGIsYyl7dGhpcy50YXJnZXQ9YSx0aGlzLmN1cnJlbnRUaW1lPWIsdGhpcy50aW1lbGluZVRpbWU9Yyx0aGlzLnR5cGU9ImNhbmNlbCIsdGhpcy5idWJibGVzPSExLHRoaXMuY2FuY2VsYWJsZT0hMSx0aGlzLmN1cnJlbnRUYXJnZXQ9YSx0aGlzLmRlZmF1bHRQcmV2ZW50ZWQ9ITEsdGhpcy5ldmVudFBoYXNlPUV2ZW50LkFUX1RBUkdFVCx0aGlzLnRpbWVTdGFtcD1EYXRlLm5vdygpfSxjPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlO3dpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGQsZSl7dmFyIGY9Yy5jYWxsKHRoaXMsZCxlKTtmLl9jYW5jZWxIYW5kbGVycz1bXSxmLm9uY2FuY2VsPW51bGw7dmFyIGc9Zi5jYW5jZWw7Zi5jYW5jZWw9ZnVuY3Rpb24oKXtnLmNhbGwodGhpcyk7dmFyIGM9bmV3IGIodGhpcyxudWxsLGEoKSksZD10aGlzLl9jYW5jZWxIYW5kbGVycy5jb25jYXQodGhpcy5vbmNhbmNlbD9bdGhpcy5vbmNhbmNlbF06W10pO3NldFRpbWVvdXQoZnVuY3Rpb24oKXtkLmZvckVhY2goZnVuY3Rpb24oYSl7YS5jYWxsKGMudGFyZ2V0LGMpfSl9LDApfTt2YXIgaD1mLmFkZEV2ZW50TGlzdGVuZXI7Zi5hZGRFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYil7ImZ1bmN0aW9uIj09dHlwZW9mIGImJiJjYW5jZWwiPT1hP3RoaXMuX2NhbmNlbEhhbmRsZXJzLnB1c2goYik6aC5jYWxsKHRoaXMsYSxiKX07dmFyIGk9Zi5yZW1vdmVFdmVudExpc3RlbmVyO3JldHVybiBmLnJlbW92ZUV2ZW50TGlzdGVuZXI9ZnVuY3Rpb24oYSxiKXtpZigiY2FuY2VsIj09YSl7dmFyIGM9dGhpcy5fY2FuY2VsSGFuZGxlcnMuaW5kZXhPZihiKTtjPj0wJiZ0aGlzLl9jYW5jZWxIYW5kbGVycy5zcGxpY2UoYywxKX1lbHNlIGkuY2FsbCh0aGlzLGEsYil9LGZ9fX0oKSxmdW5jdGlvbihhKXt2YXIgYj1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsYz1udWxsLGQ9ITE7dHJ5e3ZhciBlPWdldENvbXB1dGVkU3R5bGUoYikuZ2V0UHJvcGVydHlWYWx1ZSgib3BhY2l0eSIpLGY9IjAiPT1lPyIxIjoiMCI7Yz1iLmFuaW1hdGUoe29wYWNpdHk6W2YsZl19LHtkdXJhdGlvbjoxfSksYy5jdXJyZW50VGltZT0wLGQ9Z2V0Q29tcHV0ZWRTdHlsZShiKS5nZXRQcm9wZXJ0eVZhbHVlKCJvcGFjaXR5Iik9PWZ9Y2F0Y2goYSl7fWZpbmFsbHl7YyYmYy5jYW5jZWwoKX1pZighZCl7dmFyIGc9d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmFuaW1hdGU7d2luZG93LkVsZW1lbnQucHJvdG90eXBlLmFuaW1hdGU9ZnVuY3Rpb24oYixjKXtyZXR1cm4gd2luZG93LlN5bWJvbCYmU3ltYm9sLml0ZXJhdG9yJiZBcnJheS5wcm90b3R5cGUuZnJvbSYmYltTeW1ib2wuaXRlcmF0b3JdJiYoYj1BcnJheS5mcm9tKGIpKSxBcnJheS5pc0FycmF5KGIpfHxudWxsPT09Ynx8KGI9YS5jb252ZXJ0VG9BcnJheUZvcm0oYikpLGcuY2FsbCh0aGlzLGIsYyl9fX0oYSksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7dmFyIGM9Yi50aW1lbGluZTtjLmN1cnJlbnRUaW1lPWEsYy5fZGlzY2FyZEFuaW1hdGlvbnMoKSwwPT1jLl9hbmltYXRpb25zLmxlbmd0aD9mPSExOnJlcXVlc3RBbmltYXRpb25GcmFtZShkKX12YXIgZT13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lO3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU9ZnVuY3Rpb24oYSl7cmV0dXJuIGUoZnVuY3Rpb24oYyl7Yi50aW1lbGluZS5fdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzKCksYShjKSxiLnRpbWVsaW5lLl91cGRhdGVBbmltYXRpb25zUHJvbWlzZXMoKX0pfSxiLkFuaW1hdGlvblRpbWVsaW5lPWZ1bmN0aW9uKCl7dGhpcy5fYW5pbWF0aW9ucz1bXSx0aGlzLmN1cnJlbnRUaW1lPXZvaWQgMH0sYi5BbmltYXRpb25UaW1lbGluZS5wcm90b3R5cGU9e2dldEFuaW1hdGlvbnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGlzY2FyZEFuaW1hdGlvbnMoKSx0aGlzLl9hbmltYXRpb25zLnNsaWNlKCl9LF91cGRhdGVBbmltYXRpb25zUHJvbWlzZXM6ZnVuY3Rpb24oKXtiLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXM9Yi5hbmltYXRpb25zV2l0aFByb21pc2VzLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYS5fdXBkYXRlUHJvbWlzZXMoKX0pfSxfZGlzY2FyZEFuaW1hdGlvbnM6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVBbmltYXRpb25zUHJvbWlzZXMoKSx0aGlzLl9hbmltYXRpb25zPXRoaXMuX2FuaW1hdGlvbnMuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiJmaW5pc2hlZCIhPWEucGxheVN0YXRlJiYiaWRsZSIhPWEucGxheVN0YXRlfSl9LF9wbGF5OmZ1bmN0aW9uKGEpe3ZhciBjPW5ldyBiLkFuaW1hdGlvbihhLHRoaXMpO3JldHVybiB0aGlzLl9hbmltYXRpb25zLnB1c2goYyksYi5yZXN0YXJ0V2ViQW5pbWF0aW9uc05leHRUaWNrKCksYy5fdXBkYXRlUHJvbWlzZXMoKSxjLl9hbmltYXRpb24ucGxheSgpLGMuX3VwZGF0ZVByb21pc2VzKCksY30scGxheTpmdW5jdGlvbihhKXtyZXR1cm4gYSYmYS5yZW1vdmUoKSx0aGlzLl9wbGF5KGEpfX07dmFyIGY9ITE7Yi5yZXN0YXJ0V2ViQW5pbWF0aW9uc05leHRUaWNrPWZ1bmN0aW9uKCl7Znx8KGY9ITAscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGQpKX07dmFyIGc9bmV3IGIuQW5pbWF0aW9uVGltZWxpbmU7Yi50aW1lbGluZT1nO3RyeXtPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LmRvY3VtZW50LCJ0aW1lbGluZSIse2NvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gZ319KX1jYXRjaChhKXt9dHJ5e3dpbmRvdy5kb2N1bWVudC50aW1lbGluZT1nfWNhdGNoKGEpe319KDAsYyksZnVuY3Rpb24oYSxiLGMpe2IuYW5pbWF0aW9uc1dpdGhQcm9taXNlcz1bXSxiLkFuaW1hdGlvbj1mdW5jdGlvbihiLGMpe2lmKHRoaXMuaWQ9IiIsYiYmYi5faWQmJih0aGlzLmlkPWIuX2lkKSx0aGlzLmVmZmVjdD1iLGImJihiLl9hbmltYXRpb249dGhpcyksIWMpdGhyb3cgbmV3IEVycm9yKCJBbmltYXRpb24gd2l0aCBudWxsIHRpbWVsaW5lIGlzIG5vdCBzdXBwb3J0ZWQiKTt0aGlzLl90aW1lbGluZT1jLHRoaXMuX3NlcXVlbmNlTnVtYmVyPWEuc2VxdWVuY2VOdW1iZXIrKyx0aGlzLl9ob2xkVGltZT0wLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9pc0dyb3VwPSExLHRoaXMuX2FuaW1hdGlvbj1udWxsLHRoaXMuX2NoaWxkQW5pbWF0aW9ucz1bXSx0aGlzLl9jYWxsYmFjaz1udWxsLHRoaXMuX29sZFBsYXlTdGF0ZT0iaWRsZSIsdGhpcy5fcmVidWlsZFVuZGVybHlpbmdBbmltYXRpb24oKSx0aGlzLl9hbmltYXRpb24uY2FuY2VsKCksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0sYi5BbmltYXRpb24ucHJvdG90eXBlPXtfdXBkYXRlUHJvbWlzZXM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9vbGRQbGF5U3RhdGUsYj10aGlzLnBsYXlTdGF0ZTtyZXR1cm4gdGhpcy5fcmVhZHlQcm9taXNlJiZiIT09YSYmKCJpZGxlIj09Yj8odGhpcy5fcmVqZWN0UmVhZHlQcm9taXNlKCksdGhpcy5fcmVhZHlQcm9taXNlPXZvaWQgMCk6InBlbmRpbmciPT1hP3RoaXMuX3Jlc29sdmVSZWFkeVByb21pc2UoKToicGVuZGluZyI9PWImJih0aGlzLl9yZWFkeVByb21pc2U9dm9pZCAwKSksdGhpcy5fZmluaXNoZWRQcm9taXNlJiZiIT09YSYmKCJpZGxlIj09Yj8odGhpcy5fcmVqZWN0RmluaXNoZWRQcm9taXNlKCksdGhpcy5fZmluaXNoZWRQcm9taXNlPXZvaWQgMCk6ImZpbmlzaGVkIj09Yj90aGlzLl9yZXNvbHZlRmluaXNoZWRQcm9taXNlKCk6ImZpbmlzaGVkIj09YSYmKHRoaXMuX2ZpbmlzaGVkUHJvbWlzZT12b2lkIDApKSx0aGlzLl9vbGRQbGF5U3RhdGU9dGhpcy5wbGF5U3RhdGUsdGhpcy5fcmVhZHlQcm9taXNlfHx0aGlzLl9maW5pc2hlZFByb21pc2V9LF9yZWJ1aWxkVW5kZXJseWluZ0FuaW1hdGlvbjpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGEsYyxkLGUsZj0hIXRoaXMuX2FuaW1hdGlvbjtmJiYoYT10aGlzLnBsYXliYWNrUmF0ZSxjPXRoaXMuX3BhdXNlZCxkPXRoaXMuc3RhcnRUaW1lLGU9dGhpcy5jdXJyZW50VGltZSx0aGlzLl9hbmltYXRpb24uY2FuY2VsKCksdGhpcy5fYW5pbWF0aW9uLl93cmFwcGVyPW51bGwsdGhpcy5fYW5pbWF0aW9uPW51bGwpLCghdGhpcy5lZmZlY3R8fHRoaXMuZWZmZWN0IGluc3RhbmNlb2Ygd2luZG93LktleWZyYW1lRWZmZWN0KSYmKHRoaXMuX2FuaW1hdGlvbj1iLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdCh0aGlzLmVmZmVjdCksYi5iaW5kQW5pbWF0aW9uRm9yS2V5ZnJhbWVFZmZlY3QodGhpcykpLCh0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdHx8dGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuR3JvdXBFZmZlY3QpJiYodGhpcy5fYW5pbWF0aW9uPWIubmV3VW5kZXJseWluZ0FuaW1hdGlvbkZvckdyb3VwKHRoaXMuZWZmZWN0KSxiLmJpbmRBbmltYXRpb25Gb3JHcm91cCh0aGlzKSksdGhpcy5lZmZlY3QmJnRoaXMuZWZmZWN0Ll9vbnNhbXBsZSYmYi5iaW5kQW5pbWF0aW9uRm9yQ3VzdG9tRWZmZWN0KHRoaXMpLGYmJigxIT1hJiYodGhpcy5wbGF5YmFja1JhdGU9YSksbnVsbCE9PWQ/dGhpcy5zdGFydFRpbWU9ZDpudWxsIT09ZT90aGlzLmN1cnJlbnRUaW1lPWU6bnVsbCE9PXRoaXMuX2hvbGRUaW1lJiYodGhpcy5jdXJyZW50VGltZT10aGlzLl9ob2xkVGltZSksYyYmdGhpcy5wYXVzZSgpKSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxfdXBkYXRlQ2hpbGRyZW46ZnVuY3Rpb24oKXtpZih0aGlzLmVmZmVjdCYmImlkbGUiIT10aGlzLnBsYXlTdGF0ZSl7dmFyIGE9dGhpcy5lZmZlY3QuX3RpbWluZy5kZWxheTt0aGlzLl9jaGlsZEFuaW1hdGlvbnMuZm9yRWFjaChmdW5jdGlvbihjKXt0aGlzLl9hcnJhbmdlQ2hpbGRyZW4oYyxhKSx0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdCYmKGErPWIuZ3JvdXBDaGlsZER1cmF0aW9uKGMuZWZmZWN0KSl9LmJpbmQodGhpcykpfX0sX3NldEV4dGVybmFsQW5pbWF0aW9uOmZ1bmN0aW9uKGEpe2lmKHRoaXMuZWZmZWN0JiZ0aGlzLl9pc0dyb3VwKWZvcih2YXIgYj0wO2I8dGhpcy5lZmZlY3QuY2hpbGRyZW4ubGVuZ3RoO2IrKyl0aGlzLmVmZmVjdC5jaGlsZHJlbltiXS5fYW5pbWF0aW9uPWEsdGhpcy5fY2hpbGRBbmltYXRpb25zW2JdLl9zZXRFeHRlcm5hbEFuaW1hdGlvbihhKX0sX2NvbnN0cnVjdENoaWxkQW5pbWF0aW9uczpmdW5jdGlvbigpe2lmKHRoaXMuZWZmZWN0JiZ0aGlzLl9pc0dyb3VwKXt2YXIgYT10aGlzLmVmZmVjdC5fdGltaW5nLmRlbGF5O3RoaXMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpLHRoaXMuZWZmZWN0LmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYyl7dmFyIGQ9Yi50aW1lbGluZS5fcGxheShjKTt0aGlzLl9jaGlsZEFuaW1hdGlvbnMucHVzaChkKSxkLnBsYXliYWNrUmF0ZT10aGlzLnBsYXliYWNrUmF0ZSx0aGlzLl9wYXVzZWQmJmQucGF1c2UoKSxjLl9hbmltYXRpb249dGhpcy5lZmZlY3QuX2FuaW1hdGlvbix0aGlzLl9hcnJhbmdlQ2hpbGRyZW4oZCxhKSx0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdCYmKGErPWIuZ3JvdXBDaGlsZER1cmF0aW9uKGMpKX0uYmluZCh0aGlzKSl9fSxfYXJyYW5nZUNoaWxkcmVuOmZ1bmN0aW9uKGEsYil7bnVsbD09PXRoaXMuc3RhcnRUaW1lP2EuY3VycmVudFRpbWU9dGhpcy5jdXJyZW50VGltZS1iL3RoaXMucGxheWJhY2tSYXRlOmEuc3RhcnRUaW1lIT09dGhpcy5zdGFydFRpbWUrYi90aGlzLnBsYXliYWNrUmF0ZSYmKGEuc3RhcnRUaW1lPXRoaXMuc3RhcnRUaW1lK2IvdGhpcy5wbGF5YmFja1JhdGUpfSxnZXQgdGltZWxpbmUoKXtyZXR1cm4gdGhpcy5fdGltZWxpbmV9LGdldCBwbGF5U3RhdGUoKXtyZXR1cm4gdGhpcy5fYW5pbWF0aW9uP3RoaXMuX2FuaW1hdGlvbi5wbGF5U3RhdGU6ImlkbGUifSxnZXQgZmluaXNoZWQoKXtyZXR1cm4gd2luZG93LlByb21pc2U/KHRoaXMuX2ZpbmlzaGVkUHJvbWlzZXx8KC0xPT1iLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXMuaW5kZXhPZih0aGlzKSYmYi5hbmltYXRpb25zV2l0aFByb21pc2VzLnB1c2godGhpcyksdGhpcy5fZmluaXNoZWRQcm9taXNlPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGEsYil7dGhpcy5fcmVzb2x2ZUZpbmlzaGVkUHJvbWlzZT1mdW5jdGlvbigpe2EodGhpcyl9LHRoaXMuX3JlamVjdEZpbmlzaGVkUHJvbWlzZT1mdW5jdGlvbigpe2Ioe3R5cGU6RE9NRXhjZXB0aW9uLkFCT1JUX0VSUixuYW1lOiJBYm9ydEVycm9yIn0pfX0uYmluZCh0aGlzKSksImZpbmlzaGVkIj09dGhpcy5wbGF5U3RhdGUmJnRoaXMuX3Jlc29sdmVGaW5pc2hlZFByb21pc2UoKSksdGhpcy5fZmluaXNoZWRQcm9taXNlKTooY29uc29sZS53YXJuKCJBbmltYXRpb24gUHJvbWlzZXMgcmVxdWlyZSBKYXZhU2NyaXB0IFByb21pc2UgY29uc3RydWN0b3IiKSxudWxsKX0sZ2V0IHJlYWR5KCl7cmV0dXJuIHdpbmRvdy5Qcm9taXNlPyh0aGlzLl9yZWFkeVByb21pc2V8fCgtMT09Yi5hbmltYXRpb25zV2l0aFByb21pc2VzLmluZGV4T2YodGhpcykmJmIuYW5pbWF0aW9uc1dpdGhQcm9taXNlcy5wdXNoKHRoaXMpLHRoaXMuX3JlYWR5UHJvbWlzZT1uZXcgUHJvbWlzZShmdW5jdGlvbihhLGIpe3RoaXMuX3Jlc29sdmVSZWFkeVByb21pc2U9ZnVuY3Rpb24oKXthKHRoaXMpfSx0aGlzLl9yZWplY3RSZWFkeVByb21pc2U9ZnVuY3Rpb24oKXtiKHt0eXBlOkRPTUV4Y2VwdGlvbi5BQk9SVF9FUlIsbmFtZToiQWJvcnRFcnJvciJ9KX19LmJpbmQodGhpcykpLCJwZW5kaW5nIiE9PXRoaXMucGxheVN0YXRlJiZ0aGlzLl9yZXNvbHZlUmVhZHlQcm9taXNlKCkpLHRoaXMuX3JlYWR5UHJvbWlzZSk6KGNvbnNvbGUud2FybigiQW5pbWF0aW9uIFByb21pc2VzIHJlcXVpcmUgSmF2YVNjcmlwdCBQcm9taXNlIGNvbnN0cnVjdG9yIiksbnVsbCl9LGdldCBvbmZpbmlzaCgpe3JldHVybiB0aGlzLl9hbmltYXRpb24ub25maW5pc2h9LHNldCBvbmZpbmlzaChhKXt0aGlzLl9hbmltYXRpb24ub25maW5pc2g9ImZ1bmN0aW9uIj09dHlwZW9mIGE/ZnVuY3Rpb24oYil7Yi50YXJnZXQ9dGhpcyxhLmNhbGwodGhpcyxiKX0uYmluZCh0aGlzKTphfSxnZXQgb25jYW5jZWwoKXtyZXR1cm4gdGhpcy5fYW5pbWF0aW9uLm9uY2FuY2VsfSxzZXQgb25jYW5jZWwoYSl7dGhpcy5fYW5pbWF0aW9uLm9uY2FuY2VsPSJmdW5jdGlvbiI9PXR5cGVvZiBhP2Z1bmN0aW9uKGIpe2IudGFyZ2V0PXRoaXMsYS5jYWxsKHRoaXMsYil9LmJpbmQodGhpcyk6YX0sZ2V0IGN1cnJlbnRUaW1lKCl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKTt2YXIgYT10aGlzLl9hbmltYXRpb24uY3VycmVudFRpbWU7cmV0dXJuIHRoaXMuX3VwZGF0ZVByb21pc2VzKCksYX0sc2V0IGN1cnJlbnRUaW1lKGEpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCksdGhpcy5fYW5pbWF0aW9uLmN1cnJlbnRUaW1lPWlzRmluaXRlKGEpP2E6TWF0aC5zaWduKGEpKk51bWJlci5NQVhfVkFMVUUsdGhpcy5fcmVnaXN0ZXIoKSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYixjKXtiLmN1cnJlbnRUaW1lPWEtY30pLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LGdldCBzdGFydFRpbWUoKXtyZXR1cm4gdGhpcy5fYW5pbWF0aW9uLnN0YXJ0VGltZX0sc2V0IHN0YXJ0VGltZShhKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX2FuaW1hdGlvbi5zdGFydFRpbWU9aXNGaW5pdGUoYSk/YTpNYXRoLnNpZ24oYSkqTnVtYmVyLk1BWF9WQUxVRSx0aGlzLl9yZWdpc3RlcigpLHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbihiLGMpe2Iuc3RhcnRUaW1lPWErY30pLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LGdldCBwbGF5YmFja1JhdGUoKXtyZXR1cm4gdGhpcy5fYW5pbWF0aW9uLnBsYXliYWNrUmF0ZX0sc2V0IHBsYXliYWNrUmF0ZShhKXt0aGlzLl91cGRhdGVQcm9taXNlcygpO3ZhciBiPXRoaXMuY3VycmVudFRpbWU7dGhpcy5fYW5pbWF0aW9uLnBsYXliYWNrUmF0ZT1hLHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbihiKXtiLnBsYXliYWNrUmF0ZT1hfSksbnVsbCE9PWImJih0aGlzLmN1cnJlbnRUaW1lPWIpLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LHBsYXk6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9hbmltYXRpb24ucGxheSgpLC0xPT10aGlzLl90aW1lbGluZS5fYW5pbWF0aW9ucy5pbmRleE9mKHRoaXMpJiZ0aGlzLl90aW1lbGluZS5fYW5pbWF0aW9ucy5wdXNoKHRoaXMpLHRoaXMuX3JlZ2lzdGVyKCksYi5hd2FpdFN0YXJ0VGltZSh0aGlzKSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYSl7dmFyIGI9YS5jdXJyZW50VGltZTthLnBsYXkoKSxhLmN1cnJlbnRUaW1lPWJ9KSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxwYXVzZTpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCksdGhpcy5jdXJyZW50VGltZSYmKHRoaXMuX2hvbGRUaW1lPXRoaXMuY3VycmVudFRpbWUpLHRoaXMuX2FuaW1hdGlvbi5wYXVzZSgpLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGEpe2EucGF1c2UoKX0pLHRoaXMuX3BhdXNlZD0hMCx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxmaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX2FuaW1hdGlvbi5maW5pc2goKSx0aGlzLl9yZWdpc3RlcigpLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LGNhbmNlbDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCksdGhpcy5fYW5pbWF0aW9uLmNhbmNlbCgpLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0scmV2ZXJzZTpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGE9dGhpcy5jdXJyZW50VGltZTt0aGlzLl9hbmltYXRpb24ucmV2ZXJzZSgpLHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbihhKXthLnJldmVyc2UoKX0pLG51bGwhPT1hJiYodGhpcy5jdXJyZW50VGltZT1hKSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxhZGRFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7dmFyIGM9YjsiZnVuY3Rpb24iPT10eXBlb2YgYiYmKGM9ZnVuY3Rpb24oYSl7YS50YXJnZXQ9dGhpcyxiLmNhbGwodGhpcyxhKX0uYmluZCh0aGlzKSxiLl93cmFwcGVyPWMpLHRoaXMuX2FuaW1hdGlvbi5hZGRFdmVudExpc3RlbmVyKGEsYyl9LHJlbW92ZUV2ZW50TGlzdGVuZXI6ZnVuY3Rpb24oYSxiKXt0aGlzLl9hbmltYXRpb24ucmVtb3ZlRXZlbnRMaXN0ZW5lcihhLGImJmIuX3dyYXBwZXJ8fGIpfSxfcmVtb3ZlQ2hpbGRBbmltYXRpb25zOmZ1bmN0aW9uKCl7Zm9yKDt0aGlzLl9jaGlsZEFuaW1hdGlvbnMubGVuZ3RoOyl0aGlzLl9jaGlsZEFuaW1hdGlvbnMucG9wKCkuY2FuY2VsKCl9LF9mb3JFYWNoQ2hpbGQ6ZnVuY3Rpb24oYil7dmFyIGM9MDtpZih0aGlzLmVmZmVjdC5jaGlsZHJlbiYmdGhpcy5fY2hpbGRBbmltYXRpb25zLmxlbmd0aDx0aGlzLmVmZmVjdC5jaGlsZHJlbi5sZW5ndGgmJnRoaXMuX2NvbnN0cnVjdENoaWxkQW5pbWF0aW9ucygpLHRoaXMuX2NoaWxkQW5pbWF0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2IuY2FsbCh0aGlzLGEsYyksdGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuU2VxdWVuY2VFZmZlY3QmJihjKz1hLmVmZmVjdC5hY3RpdmVEdXJhdGlvbil9LmJpbmQodGhpcykpLCJwZW5kaW5nIiE9dGhpcy5wbGF5U3RhdGUpe3ZhciBkPXRoaXMuZWZmZWN0Ll90aW1pbmcsZT10aGlzLmN1cnJlbnRUaW1lO251bGwhPT1lJiYoZT1hLmNhbGN1bGF0ZUl0ZXJhdGlvblByb2dyZXNzKGEuY2FsY3VsYXRlQWN0aXZlRHVyYXRpb24oZCksZSxkKSksKG51bGw9PWV8fGlzTmFOKGUpKSYmdGhpcy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCl9fX0sd2luZG93LkFuaW1hdGlvbj1iLkFuaW1hdGlvbn0oYSxjKSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChiKXt0aGlzLl9mcmFtZXM9YS5ub3JtYWxpemVLZXlmcmFtZXMoYil9ZnVuY3Rpb24gZSgpe2Zvcih2YXIgYT0hMTtpLmxlbmd0aDspaS5zaGlmdCgpLl91cGRhdGVDaGlsZHJlbigpLGE9ITA7cmV0dXJuIGF9dmFyIGY9ZnVuY3Rpb24oYSl7aWYoYS5fYW5pbWF0aW9uPXZvaWQgMCxhIGluc3RhbmNlb2Ygd2luZG93LlNlcXVlbmNlRWZmZWN0fHxhIGluc3RhbmNlb2Ygd2luZG93Lkdyb3VwRWZmZWN0KWZvcih2YXIgYj0wO2I8YS5jaGlsZHJlbi5sZW5ndGg7YisrKWYoYS5jaGlsZHJlbltiXSl9O2IucmVtb3ZlTXVsdGk9ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPVtdLGM9MDtjPGEubGVuZ3RoO2MrKyl7dmFyIGQ9YVtjXTtkLl9wYXJlbnQ/KC0xPT1iLmluZGV4T2YoZC5fcGFyZW50KSYmYi5wdXNoKGQuX3BhcmVudCksZC5fcGFyZW50LmNoaWxkcmVuLnNwbGljZShkLl9wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihkKSwxKSxkLl9wYXJlbnQ9bnVsbCxmKGQpKTpkLl9hbmltYXRpb24mJmQuX2FuaW1hdGlvbi5lZmZlY3Q9PWQmJihkLl9hbmltYXRpb24uY2FuY2VsKCksZC5fYW5pbWF0aW9uLmVmZmVjdD1uZXcgS2V5ZnJhbWVFZmZlY3QobnVsbCxbXSksZC5fYW5pbWF0aW9uLl9jYWxsYmFjayYmKGQuX2FuaW1hdGlvbi5fY2FsbGJhY2suX2FuaW1hdGlvbj1udWxsKSxkLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCksZihkKSl9Zm9yKGM9MDtjPGIubGVuZ3RoO2MrKyliW2NdLl9yZWJ1aWxkKCl9LGIuS2V5ZnJhbWVFZmZlY3Q9ZnVuY3Rpb24oYixjLGUsZil7cmV0dXJuIHRoaXMudGFyZ2V0PWIsdGhpcy5fcGFyZW50PW51bGwsZT1hLm51bWVyaWNUaW1pbmdUb09iamVjdChlKSx0aGlzLl90aW1pbmdJbnB1dD1hLmNsb25lVGltaW5nSW5wdXQoZSksdGhpcy5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQoZSksdGhpcy50aW1pbmc9YS5tYWtlVGltaW5nKGUsITEsdGhpcyksdGhpcy50aW1pbmcuX2VmZmVjdD10aGlzLCJmdW5jdGlvbiI9PXR5cGVvZiBjPyhhLmRlcHJlY2F0ZWQoIkN1c3RvbSBLZXlmcmFtZUVmZmVjdCIsIjIwMTUtMDYtMjIiLCJVc2UgS2V5ZnJhbWVFZmZlY3Qub25zYW1wbGUgaW5zdGVhZC4iKSx0aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzPWMpOnRoaXMuX25vcm1hbGl6ZWRLZXlmcmFtZXM9bmV3IGQoYyksdGhpcy5fa2V5ZnJhbWVzPWMsdGhpcy5hY3RpdmVEdXJhdGlvbj1hLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKHRoaXMuX3RpbWluZyksdGhpcy5faWQ9Zix0aGlzfSxiLktleWZyYW1lRWZmZWN0LnByb3RvdHlwZT17Z2V0RnJhbWVzOmZ1bmN0aW9uKCl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuX25vcm1hbGl6ZWRLZXlmcmFtZXM/dGhpcy5fbm9ybWFsaXplZEtleWZyYW1lczp0aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzLl9mcmFtZXN9LHNldCBvbnNhbXBsZShhKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5nZXRGcmFtZXMoKSl0aHJvdyBuZXcgRXJyb3IoIlNldHRpbmcgb25zYW1wbGUgb24gY3VzdG9tIGVmZmVjdCBLZXlmcmFtZUVmZmVjdCBpcyBub3Qgc3VwcG9ydGVkLiIpO3RoaXMuX29uc2FtcGxlPWEsdGhpcy5fYW5pbWF0aW9uJiZ0aGlzLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCl9LGdldCBwYXJlbnQoKXtyZXR1cm4gdGhpcy5fcGFyZW50fSxjbG9uZTpmdW5jdGlvbigpe2lmKCJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLmdldEZyYW1lcygpKXRocm93IG5ldyBFcnJvcigiQ2xvbmluZyBjdXN0b20gZWZmZWN0cyBpcyBub3Qgc3VwcG9ydGVkLiIpO3ZhciBiPW5ldyBLZXlmcmFtZUVmZmVjdCh0aGlzLnRhcmdldCxbXSxhLmNsb25lVGltaW5nSW5wdXQodGhpcy5fdGltaW5nSW5wdXQpLHRoaXMuX2lkKTtyZXR1cm4gYi5fbm9ybWFsaXplZEtleWZyYW1lcz10aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzLGIuX2tleWZyYW1lcz10aGlzLl9rZXlmcmFtZXMsYn0scmVtb3ZlOmZ1bmN0aW9uKCl7Yi5yZW1vdmVNdWx0aShbdGhpc10pfX07dmFyIGc9RWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZTtFbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGEsYyl7dmFyIGQ9IiI7cmV0dXJuIGMmJmMuaWQmJihkPWMuaWQpLGIudGltZWxpbmUuX3BsYXkobmV3IGIuS2V5ZnJhbWVFZmZlY3QodGhpcyxhLGMsZCkpfTt2YXIgaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJkaXYiKTtiLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihhKXtpZihhKXt2YXIgYj1hLnRhcmdldHx8aCxjPWEuX2tleWZyYW1lczsiZnVuY3Rpb24iPT10eXBlb2YgYyYmKGM9W10pO3ZhciBkPWEuX3RpbWluZ0lucHV0O2QuaWQ9YS5faWR9ZWxzZSB2YXIgYj1oLGM9W10sZD0wO3JldHVybiBnLmFwcGx5KGIsW2MsZF0pfSxiLmJpbmRBbmltYXRpb25Gb3JLZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihhKXthLmVmZmVjdCYmImZ1bmN0aW9uIj09dHlwZW9mIGEuZWZmZWN0Ll9ub3JtYWxpemVkS2V5ZnJhbWVzJiZiLmJpbmRBbmltYXRpb25Gb3JDdXN0b21FZmZlY3QoYSl9O3ZhciBpPVtdO2IuYXdhaXRTdGFydFRpbWU9ZnVuY3Rpb24oYSl7bnVsbD09PWEuc3RhcnRUaW1lJiZhLl9pc0dyb3VwJiYoMD09aS5sZW5ndGgmJnJlcXVlc3RBbmltYXRpb25GcmFtZShlKSxpLnB1c2goYSkpfTt2YXIgaj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZTtPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LCJnZXRDb21wdXRlZFN0eWxlIix7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZnVuY3Rpb24oKXtiLnRpbWVsaW5lLl91cGRhdGVBbmltYXRpb25zUHJvbWlzZXMoKTt2YXIgYT1qLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gZSgpJiYoYT1qLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksYi50aW1lbGluZS5fdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzKCksYX19KSx3aW5kb3cuS2V5ZnJhbWVFZmZlY3Q9Yi5LZXlmcmFtZUVmZmVjdCx3aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuZ2V0QW5pbWF0aW9ucz1mdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC50aW1lbGluZS5nZXRBbmltYXRpb25zKCkuZmlsdGVyKGZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT09YS5lZmZlY3QmJmEuZWZmZWN0LnRhcmdldD09dGhpc30uYmluZCh0aGlzKSl9fShhLGMpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe2EuX3JlZ2lzdGVyZWR8fChhLl9yZWdpc3RlcmVkPSEwLGcucHVzaChhKSxofHwoaD0hMCxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZSkpKX1mdW5jdGlvbiBlKGEpe3ZhciBiPWc7Zz1bXSxiLnNvcnQoZnVuY3Rpb24oYSxiKXtyZXR1cm4gYS5fc2VxdWVuY2VOdW1iZXItYi5fc2VxdWVuY2VOdW1iZXJ9KSxiPWIuZmlsdGVyKGZ1bmN0aW9uKGEpe2EoKTt2YXIgYj1hLl9hbmltYXRpb24/YS5fYW5pbWF0aW9uLnBsYXlTdGF0ZToiaWRsZSI7cmV0dXJuInJ1bm5pbmciIT1iJiYicGVuZGluZyIhPWImJihhLl9yZWdpc3RlcmVkPSExKSxhLl9yZWdpc3RlcmVkfSksZy5wdXNoLmFwcGx5KGcsYiksZy5sZW5ndGg/KGg9ITAscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUpKTpoPSExfXZhciBmPShkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJkaXYiKSwwKTtiLmJpbmRBbmltYXRpb25Gb3JDdXN0b21FZmZlY3Q9ZnVuY3Rpb24oYil7dmFyIGMsZT1iLmVmZmVjdC50YXJnZXQsZz0iZnVuY3Rpb24iPT10eXBlb2YgYi5lZmZlY3QuZ2V0RnJhbWVzKCk7Yz1nP2IuZWZmZWN0LmdldEZyYW1lcygpOmIuZWZmZWN0Ll9vbnNhbXBsZTt2YXIgaD1iLmVmZmVjdC50aW1pbmcsaT1udWxsO2g9YS5ub3JtYWxpemVUaW1pbmdJbnB1dChoKTt2YXIgaj1mdW5jdGlvbigpe3ZhciBkPWouX2FuaW1hdGlvbj9qLl9hbmltYXRpb24uY3VycmVudFRpbWU6bnVsbDtudWxsIT09ZCYmKGQ9YS5jYWxjdWxhdGVJdGVyYXRpb25Qcm9ncmVzcyhhLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKGgpLGQsaCksaXNOYU4oZCkmJihkPW51bGwpKSxkIT09aSYmKGc/YyhkLGUsYi5lZmZlY3QpOmMoZCxiLmVmZmVjdCxiLmVmZmVjdC5fYW5pbWF0aW9uKSksaT1kfTtqLl9hbmltYXRpb249YixqLl9yZWdpc3RlcmVkPSExLGouX3NlcXVlbmNlTnVtYmVyPWYrKyxiLl9jYWxsYmFjaz1qLGQoail9O3ZhciBnPVtdLGg9ITE7Yi5BbmltYXRpb24ucHJvdG90eXBlLl9yZWdpc3Rlcj1mdW5jdGlvbigpe3RoaXMuX2NhbGxiYWNrJiZkKHRoaXMuX2NhbGxiYWNrKX19KGEsYyksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7cmV0dXJuIGEuX3RpbWluZy5kZWxheSthLmFjdGl2ZUR1cmF0aW9uK2EuX3RpbWluZy5lbmREZWxheX1mdW5jdGlvbiBlKGIsYyxkKXt0aGlzLl9pZD1kLHRoaXMuX3BhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49Ynx8W10sdGhpcy5fcmVwYXJlbnQodGhpcy5jaGlsZHJlbiksYz1hLm51bWVyaWNUaW1pbmdUb09iamVjdChjKSx0aGlzLl90aW1pbmdJbnB1dD1hLmNsb25lVGltaW5nSW5wdXQoYyksdGhpcy5fdGltaW5nPWEubm9ybWFsaXplVGltaW5nSW5wdXQoYywhMCksdGhpcy50aW1pbmc9YS5tYWtlVGltaW5nKGMsITAsdGhpcyksdGhpcy50aW1pbmcuX2VmZmVjdD10aGlzLCJhdXRvIj09PXRoaXMuX3RpbWluZy5kdXJhdGlvbiYmKHRoaXMuX3RpbWluZy5kdXJhdGlvbj10aGlzLmFjdGl2ZUR1cmF0aW9uKX13aW5kb3cuU2VxdWVuY2VFZmZlY3Q9ZnVuY3Rpb24oKXtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sd2luZG93Lkdyb3VwRWZmZWN0PWZ1bmN0aW9uKCl7ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LGUucHJvdG90eXBlPXtfaXNBbmNlc3RvcjpmdW5jdGlvbihhKXtmb3IodmFyIGI9dGhpcztudWxsIT09Yjspe2lmKGI9PWEpcmV0dXJuITA7Yj1iLl9wYXJlbnR9cmV0dXJuITF9LF9yZWJ1aWxkOmZ1bmN0aW9uKCl7Zm9yKHZhciBhPXRoaXM7YTspImF1dG8iPT09YS50aW1pbmcuZHVyYXRpb24mJihhLl90aW1pbmcuZHVyYXRpb249YS5hY3RpdmVEdXJhdGlvbiksYT1hLl9wYXJlbnQ7dGhpcy5fYW5pbWF0aW9uJiZ0aGlzLl9hbmltYXRpb24uX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCl9LF9yZXBhcmVudDpmdW5jdGlvbihhKXtiLnJlbW92ZU11bHRpKGEpO2Zvcih2YXIgYz0wO2M8YS5sZW5ndGg7YysrKWFbY10uX3BhcmVudD10aGlzfSxfcHV0Q2hpbGQ6ZnVuY3Rpb24oYSxiKXtmb3IodmFyIGM9Yj8iQ2Fubm90IGFwcGVuZCBhbiBhbmNlc3RvciBvciBzZWxmIjoiQ2Fubm90IHByZXBlbmQgYW4gYW5jZXN0b3Igb3Igc2VsZiIsZD0wO2Q8YS5sZW5ndGg7ZCsrKWlmKHRoaXMuX2lzQW5jZXN0b3IoYVtkXSkpdGhyb3d7dHlwZTpET01FeGNlcHRpb24uSElFUkFSQ0hZX1JFUVVFU1RfRVJSLG5hbWU6IkhpZXJhcmNoeVJlcXVlc3RFcnJvciIsbWVzc2FnZTpjfTtmb3IodmFyIGQ9MDtkPGEubGVuZ3RoO2QrKyliP3RoaXMuY2hpbGRyZW4ucHVzaChhW2RdKTp0aGlzLmNoaWxkcmVuLnVuc2hpZnQoYVtkXSk7dGhpcy5fcmVwYXJlbnQoYSksdGhpcy5fcmVidWlsZCgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXt0aGlzLl9wdXRDaGlsZChhcmd1bWVudHMsITApfSxwcmVwZW5kOmZ1bmN0aW9uKCl7dGhpcy5fcHV0Q2hpbGQoYXJndW1lbnRzLCExKX0sZ2V0IHBhcmVudCgpe3JldHVybiB0aGlzLl9wYXJlbnR9LGdldCBmaXJzdENoaWxkKCl7cmV0dXJuIHRoaXMuY2hpbGRyZW4ubGVuZ3RoP3RoaXMuY2hpbGRyZW5bMF06bnVsbH0sZ2V0IGxhc3RDaGlsZCgpe3JldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aD90aGlzLmNoaWxkcmVuW3RoaXMuY2hpbGRyZW4ubGVuZ3RoLTFdOm51bGx9LGNsb25lOmZ1bmN0aW9uKCl7Zm9yKHZhciBiPWEuY2xvbmVUaW1pbmdJbnB1dCh0aGlzLl90aW1pbmdJbnB1dCksYz1bXSxkPTA7ZDx0aGlzLmNoaWxkcmVuLmxlbmd0aDtkKyspYy5wdXNoKHRoaXMuY2hpbGRyZW5bZF0uY2xvbmUoKSk7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBHcm91cEVmZmVjdD9uZXcgR3JvdXBFZmZlY3QoYyxiKTpuZXcgU2VxdWVuY2VFZmZlY3QoYyxiKX0scmVtb3ZlOmZ1bmN0aW9uKCl7Yi5yZW1vdmVNdWx0aShbdGhpc10pfX0sd2luZG93LlNlcXVlbmNlRWZmZWN0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93LlNlcXVlbmNlRWZmZWN0LnByb3RvdHlwZSwiYWN0aXZlRHVyYXRpb24iLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiB0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYil7YSs9ZChiKX0pLE1hdGgubWF4KGEsMCl9fSksd2luZG93Lkdyb3VwRWZmZWN0LnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKGUucHJvdG90eXBlKSxPYmplY3QuZGVmaW5lUHJvcGVydHkod2luZG93Lkdyb3VwRWZmZWN0LnByb3RvdHlwZSwiYWN0aXZlRHVyYXRpb24iLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgYT0wO3JldHVybiB0aGlzLmNoaWxkcmVuLmZvckVhY2goZnVuY3Rpb24oYil7YT1NYXRoLm1heChhLGQoYikpfSksYX19KSxiLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JHcm91cD1mdW5jdGlvbihjKXt2YXIgZCxlPW51bGwsZj1mdW5jdGlvbihiKXt2YXIgYz1kLl93cmFwcGVyO2lmKGMmJiJwZW5kaW5nIiE9Yy5wbGF5U3RhdGUmJmMuZWZmZWN0KXJldHVybiBudWxsPT1iP3ZvaWQgYy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCk6MD09YiYmYy5wbGF5YmFja1JhdGU8MCYmKGV8fChlPWEubm9ybWFsaXplVGltaW5nSW5wdXQoYy5lZmZlY3QudGltaW5nKSksYj1hLmNhbGN1bGF0ZUl0ZXJhdGlvblByb2dyZXNzKGEuY2FsY3VsYXRlQWN0aXZlRHVyYXRpb24oZSksLTEsZSksaXNOYU4oYil8fG51bGw9PWIpPyhjLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYSl7YS5jdXJyZW50VGltZT0tMX0pLHZvaWQgYy5fcmVtb3ZlQ2hpbGRBbmltYXRpb25zKCkpOnZvaWQgMH0sZz1uZXcgS2V5ZnJhbWVFZmZlY3QobnVsbCxbXSxjLl90aW1pbmcsYy5faWQpO3JldHVybiBnLm9uc2FtcGxlPWYsZD1iLnRpbWVsaW5lLl9wbGF5KGcpfSxiLmJpbmRBbmltYXRpb25Gb3JHcm91cD1mdW5jdGlvbihhKXthLl9hbmltYXRpb24uX3dyYXBwZXI9YSxhLl9pc0dyb3VwPSEwLGIuYXdhaXRTdGFydFRpbWUoYSksYS5fY29uc3RydWN0Q2hpbGRBbmltYXRpb25zKCksYS5fc2V0RXh0ZXJuYWxBbmltYXRpb24oYSl9LGIuZ3JvdXBDaGlsZER1cmF0aW9uPWR9KGEsYyl9KCk7CgohKGZ1bmN0aW9uKCl7Ci8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uCgogICAgUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgYW5kL29yIGRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSBmb3IgYW55CiAgICBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5IGdyYW50ZWQuCgogICAgVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIgQU5EIFRIRSBBVVRIT1IgRElTQ0xBSU1TIEFMTCBXQVJSQU5USUVTIFdJVEgKICAgIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFIElOQ0xVRElORyBBTEwgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWQogICAgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULAogICAgSU5ESVJFQ1QsIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBPUiBBTlkgREFNQUdFUyBXSEFUU09FVkVSIFJFU1VMVElORyBGUk9NCiAgICBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUgogICAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUgogICAgUEVSRk9STUFOQ0UgT0YgVEhJUyBTT0ZUV0FSRS4KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCmZ1bmN0aW9uIHQodCxlLG4saSl7dmFyIHIsbz1hcmd1bWVudHMubGVuZ3RoLGE9bzwzP2U6bnVsbD09PWk/aT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsbik6aTtpZigib2JqZWN0Ij09dHlwZW9mIFJlZmxlY3QmJiJmdW5jdGlvbiI9PXR5cGVvZiBSZWZsZWN0LmRlY29yYXRlKWE9UmVmbGVjdC5kZWNvcmF0ZSh0LGUsbixpKTtlbHNlIGZvcih2YXIgcz10Lmxlbmd0aC0xO3M+PTA7cy0tKShyPXRbc10pJiYoYT0obzwzP3IoYSk6bz4zP3IoZSxuLGEpOnIoZSxuKSl8fGEpO3JldHVybiBvPjMmJmEmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4sYSksYX1mdW5jdGlvbiBlKHQsZSl7aWYoIm9iamVjdCI9PXR5cGVvZiBSZWZsZWN0JiYiZnVuY3Rpb24iPT10eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSlyZXR1cm4gUmVmbGVjdC5tZXRhZGF0YSh0LGUpfWZ1bmN0aW9uIG4odCxlLG4saSl7cmV0dXJuIG5ldyhufHwobj1Qcm9taXNlKSkoKGZ1bmN0aW9uKHIsbyl7ZnVuY3Rpb24gYSh0KXt0cnl7bChpLm5leHQodCkpfWNhdGNoKHQpe28odCl9fWZ1bmN0aW9uIHModCl7dHJ5e2woaS50aHJvdyh0KSl9Y2F0Y2godCl7byh0KX19ZnVuY3Rpb24gbCh0KXt0LmRvbmU/cih0LnZhbHVlKTooZnVuY3Rpb24gZSh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIG4/dDpuZXcgbigoZnVuY3Rpb24oZSl7ZSh0KX0pKX0pKHQudmFsdWUpLnRoZW4oYSxzKX1sKChpPWkuYXBwbHkodCxlfHxbXSkpLm5leHQoKSl9KSl9Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAxNiBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kCiAgICAgKiBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5CiAgICAgKiBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5CiAgICAgKiBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQCiAgICAgKiByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAgKi9mdW5jdGlvbiBpKHQpe3JldHVybiBlPT57aWYodClpZihlLmhhc093blByb3BlcnR5KCJpcyIpKXtpZih0IT09ZS5pcyl0aHJvdyBuZXcgRXJyb3IoYGN1c3RvbSBlbGVtZW50IHRhZyBuYW1lcyBkbyBub3QgbWF0Y2g6ICgke3R9ICE9PSAke2UuaXN9KWApfWVsc2UgT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImlzIix7dmFsdWU6dH0pO3dpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoZS5pcyxlKX19ZnVuY3Rpb24gcih0LGUsbil7dC5jb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eSgicHJvcGVydGllcyIpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkodC5jb25zdHJ1Y3RvciwicHJvcGVydGllcyIse3ZhbHVlOnt9fSksdC5jb25zdHJ1Y3Rvci5wcm9wZXJ0aWVzW2VdPU9iamVjdC5hc3NpZ24oe30sdC5jb25zdHJ1Y3Rvci5wcm9wZXJ0aWVzW2VdLG4pfWZ1bmN0aW9uIG8odCl7cmV0dXJuKGUsbik9PntyKGUsbix0KX19ZnVuY3Rpb24gYSguLi50KXtyZXR1cm4oZSxuKT0+e2UuY29uc3RydWN0b3IuaGFzT3duUHJvcGVydHkoIm9ic2VydmVycyIpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5jb25zdHJ1Y3Rvciwib2JzZXJ2ZXJzIix7dmFsdWU6W119KSxlLmNvbnN0cnVjdG9yLm9ic2VydmVycy5wdXNoKGAke259KCR7dC5qb2luKCIsIil9KWApfX1mdW5jdGlvbiBzKHQsLi4uZSl7cmV0dXJuKG4saSxvKT0+e2NvbnN0IGE9YF9fY29tcHV0ZSR7aX1gO09iamVjdC5kZWZpbmVQcm9wZXJ0eShuLGEse3ZhbHVlOm8uZ2V0fSksby5nZXQ9dm9pZCAwO3IobixpLHtjb21wdXRlZDpgJHthfSgke1t0LC4uLmVdLmpvaW4oIiwiKX0pYH0pfX0KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi93aW5kb3cuSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eT1mdW5jdGlvbih0LGUpe3JldHVybiB0fTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KbGV0IGwsYyx1PS8odXJsXCgpKFteKV0qKShcKSkvZyxoPS8oXlwvW15cL10pfCheIyl8KF5bXHctXGRdKjopLztmdW5jdGlvbiBkKHQsZSl7aWYodCYmaC50ZXN0KHQpKXJldHVybiB0O2lmKCIvLyI9PT10KXJldHVybiB0O2lmKHZvaWQgMD09PWwpe2w9ITE7dHJ5e2NvbnN0IHQ9bmV3IFVSTCgiYiIsImh0dHA6Ly9hIik7dC5wYXRobmFtZT0iYyUyMGQiLGw9Imh0dHA6Ly9hL2MlMjBkIj09PXQuaHJlZn1jYXRjaCh0KXt9fWlmKGV8fChlPWRvY3VtZW50LmJhc2VVUkl8fHdpbmRvdy5sb2NhdGlvbi5ocmVmKSxsKXRyeXtyZXR1cm4gbmV3IFVSTCh0LGUpLmhyZWZ9Y2F0Y2goZSl7cmV0dXJuIHR9cmV0dXJuIGN8fChjPWRvY3VtZW50LmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgidGVtcCIpLGMuYmFzZT1jLmNyZWF0ZUVsZW1lbnQoImJhc2UiKSxjLmhlYWQuYXBwZW5kQ2hpbGQoYy5iYXNlKSxjLmFuY2hvcj1jLmNyZWF0ZUVsZW1lbnQoImEiKSxjLmJvZHkuYXBwZW5kQ2hpbGQoYy5hbmNob3IpKSxjLmJhc2UuaHJlZj1lLGMuYW5jaG9yLmhyZWY9dCxjLmFuY2hvci5ocmVmfHx0fWZ1bmN0aW9uIHAodCxlKXtyZXR1cm4gdC5yZXBsYWNlKHUsKGZ1bmN0aW9uKHQsbixpLHIpe3JldHVybiBuKyInIitkKGkucmVwbGFjZSgvWyInXS9nLCIiKSxlKSsiJyIrcn0pKX1mdW5jdGlvbiBmKHQpe3JldHVybiB0LnN1YnN0cmluZygwLHQubGFzdEluZGV4T2YoIi8iKSsxKX0KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9jb25zdCBtPSF3aW5kb3cuU2hhZHlET018fCF3aW5kb3cuU2hhZHlET00uaW5Vc2U7Qm9vbGVhbighd2luZG93LlNoYWR5Q1NTfHx3aW5kb3cuU2hhZHlDU1MubmF0aXZlQ3NzKTtjb25zdCBnPW0mJiJhZG9wdGVkU3R5bGVTaGVldHMiaW4gRG9jdW1lbnQucHJvdG90eXBlJiYicmVwbGFjZVN5bmMiaW4gQ1NTU3R5bGVTaGVldC5wcm90b3R5cGUmJigoKT0+e3RyeXtjb25zdCB0PW5ldyBDU1NTdHlsZVNoZWV0O3QucmVwbGFjZVN5bmMoIiIpO2NvbnN0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cmV0dXJuIGUuYXR0YWNoU2hhZG93KHttb2RlOiJvcGVuIn0pLGUuc2hhZG93Um9vdC5hZG9wdGVkU3R5bGVTaGVldHM9W3RdLGUuc2hhZG93Um9vdC5hZG9wdGVkU3R5bGVTaGVldHNbMF09PT10fWNhdGNoKHQpe3JldHVybiExfX0pKCk7bGV0IF89d2luZG93LlBvbHltZXImJndpbmRvdy5Qb2x5bWVyLnJvb3RQYXRofHxmKGRvY3VtZW50LmJhc2VVUkl8fHdpbmRvdy5sb2NhdGlvbi5ocmVmKSx5PXdpbmRvdy5Qb2x5bWVyJiZ3aW5kb3cuUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlfHx2b2lkIDAsdj13aW5kb3cuUG9seW1lciYmd2luZG93LlBvbHltZXIuc2V0UGFzc2l2ZVRvdWNoR2VzdHVyZXN8fCExLGI9d2luZG93LlBvbHltZXImJndpbmRvdy5Qb2x5bWVyLnN0cmljdFRlbXBsYXRlUG9saWN5fHwhMSx4PXdpbmRvdy5Qb2x5bWVyJiZ3aW5kb3cuUG9seW1lci5hbGxvd1RlbXBsYXRlRnJvbURvbU1vZHVsZXx8ITEsdz13aW5kb3cuUG9seW1lciYmd2luZG93LlBvbHltZXIubGVnYWN5T3B0aW1pemF0aW9uc3x8ITEsUz13aW5kb3cuUG9seW1lciYmd2luZG93LlBvbHltZXIubGVnYWN5V2FybmluZ3N8fCExLE09d2luZG93LlBvbHltZXImJndpbmRvdy5Qb2x5bWVyLnN5bmNJbml0aWFsUmVuZGVyfHwhMSxFPXdpbmRvdy5Qb2x5bWVyJiZ3aW5kb3cuUG9seW1lci5sZWdhY3lVbmRlZmluZWR8fCExLFQ9d2luZG93LlBvbHltZXImJndpbmRvdy5Qb2x5bWVyLm9yZGVyZWRDb21wdXRlZHx8ITEsQz13aW5kb3cuUG9seW1lciYmd2luZG93LlBvbHltZXIucmVtb3ZlTmVzdGVkVGVtcGxhdGVzfHwhMSxBPXdpbmRvdy5Qb2x5bWVyJiZ3aW5kb3cuUG9seW1lci5mYXN0RG9tSWZ8fCExLGs9d2luZG93LlBvbHltZXImJndpbmRvdy5Qb2x5bWVyLnN1cHByZXNzVGVtcGxhdGVOb3RpZmljYXRpb25zfHwhMSxMPXdpbmRvdy5Qb2x5bWVyJiZ3aW5kb3cuUG9seW1lci5sZWdhY3lOb09ic2VydmVkQXR0cmlidXRlc3x8ITEsUD13aW5kb3cuUG9seW1lciYmd2luZG93LlBvbHltZXIudXNlQWRvcHRlZFN0eWxlU2hlZXRzV2l0aEJ1aWx0Q1NTfHwhMSxOPTA7Y29uc3QgST1mdW5jdGlvbih0KXtsZXQgZT10Ll9fbWl4aW5BcHBsaWNhdGlvbnM7ZXx8KGU9bmV3IFdlYWtNYXAsdC5fX21peGluQXBwbGljYXRpb25zPWUpO2xldCBuPU4rKztyZXR1cm4gZnVuY3Rpb24gaShyKXtsZXQgbz1yLl9fbWl4aW5TZXQ7aWYobyYmb1tuXSlyZXR1cm4gcjtsZXQgYT1lLHM9YS5nZXQocik7aWYoIXMpe3M9dChyKSxhLnNldChyLHMpO2xldCBlPU9iamVjdC5jcmVhdGUocy5fX21peGluU2V0fHxvfHxudWxsKTtlW25dPSEwLHMuX19taXhpblNldD1lfXJldHVybiBzfX07Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovbGV0IFI9e30sTz17fTtmdW5jdGlvbiB6KHQsZSl7Ult0XT1PW3QudG9Mb3dlckNhc2UoKV09ZX1mdW5jdGlvbiBEKHQpe3JldHVybiBSW3RdfHxPW3QudG9Mb3dlckNhc2UoKV19Y2xhc3MgQiBleHRlbmRzIEhUTUxFbGVtZW50e3N0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCl7cmV0dXJuWyJpZCJdfXN0YXRpYyBpbXBvcnQodCxlKXtpZih0KXtsZXQgbj1EKHQpO3JldHVybiBuJiZlP24ucXVlcnlTZWxlY3RvcihlKTpufXJldHVybiBudWxsfWF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0LGUsbixpKXtlIT09biYmdGhpcy5yZWdpc3RlcigpfWdldCBhc3NldHBhdGgoKXtpZighdGhpcy5fX2Fzc2V0cGF0aCl7Y29uc3QgdD13aW5kb3cuSFRNTEltcG9ydHMmJkhUTUxJbXBvcnRzLmltcG9ydEZvckVsZW1lbnQ/SFRNTEltcG9ydHMuaW1wb3J0Rm9yRWxlbWVudCh0aGlzKXx8ZG9jdW1lbnQ6dGhpcy5vd25lckRvY3VtZW50LGU9ZCh0aGlzLmdldEF0dHJpYnV0ZSgiYXNzZXRwYXRoIil8fCIiLHQuYmFzZVVSSSk7dGhpcy5fX2Fzc2V0cGF0aD1mKGUpfXJldHVybiB0aGlzLl9fYXNzZXRwYXRofXJlZ2lzdGVyKHQpe2lmKHQ9dHx8dGhpcy5pZCl7aWYoYiYmdm9pZCAwIT09RCh0KSl0aHJvdyB6KHQsbnVsbCksbmV3IEVycm9yKGBzdHJpY3RUZW1wbGF0ZVBvbGljeTogZG9tLW1vZHVsZSAke3R9IHJlLXJlZ2lzdGVyZWRgKTt0aGlzLmlkPXQseih0LHRoaXMpLChmdW5jdGlvbiBlKHQpe3QucXVlcnlTZWxlY3Rvcigic3R5bGUiKSYmY29uc29sZS53YXJuKCJkb20tbW9kdWxlICVzIGhhcyBzdHlsZSBvdXRzaWRlIHRlbXBsYXRlIix0LmlkKX0pKHRoaXMpfX19Qi5wcm90b3R5cGUubW9kdWxlcz1SLGN1c3RvbUVsZW1lbnRzLmRlZmluZSgiZG9tLW1vZHVsZSIsQik7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IEg9InNoYWR5LXVuc2NvcGVkIjtmdW5jdGlvbiBGKHQpe3JldHVybiBCLmltcG9ydCh0KX1mdW5jdGlvbiBWKHQpe2NvbnN0IGU9cCgodC5ib2R5P3QuYm9keTp0KS50ZXh0Q29udGVudCx0LmJhc2VVUkkpLG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtyZXR1cm4gbi50ZXh0Q29udGVudD1lLG59ZnVuY3Rpb24gVSh0KXtjb25zdCBlPXQudHJpbSgpLnNwbGl0KC9ccysvKSxuPVtdO2ZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKW4ucHVzaCguLi5qKGVbdF0pKTtyZXR1cm4gbn1mdW5jdGlvbiBqKHQpe2NvbnN0IGU9Rih0KTtpZighZSlyZXR1cm4gY29uc29sZS53YXJuKCJDb3VsZCBub3QgZmluZCBzdHlsZSBkYXRhIGluIG1vZHVsZSBuYW1lZCIsdCksW107aWYodm9pZCAwPT09ZS5fc3R5bGVzKXtjb25zdCB0PVtdO3QucHVzaCguLi5XKGUpKTtjb25zdCBuPWUucXVlcnlTZWxlY3RvcigidGVtcGxhdGUiKTtuJiZ0LnB1c2goLi4uRyhuLGUuYXNzZXRwYXRoKSksZS5fc3R5bGVzPXR9cmV0dXJuIGUuX3N0eWxlc31mdW5jdGlvbiBHKHQsZSl7aWYoIXQuX3N0eWxlcyl7Y29uc3Qgbj1bXSxpPXQuY29udGVudC5xdWVyeVNlbGVjdG9yQWxsKCJzdHlsZSIpO2ZvcihsZXQgdD0wO3Q8aS5sZW5ndGg7dCsrKXtsZXQgcj1pW3RdLG89ci5nZXRBdHRyaWJ1dGUoImluY2x1ZGUiKTtvJiZuLnB1c2goLi4uVShvKS5maWx0ZXIoKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbi5pbmRleE9mKHQpPT09ZX0pKSksZSYmKHIudGV4dENvbnRlbnQ9cChyLnRleHRDb250ZW50LGUpKSxuLnB1c2gocil9dC5fc3R5bGVzPW59cmV0dXJuIHQuX3N0eWxlc31mdW5jdGlvbiBXKHQpe2NvbnN0IGU9W10sbj10LnF1ZXJ5U2VsZWN0b3JBbGwoImxpbmtbcmVsPWltcG9ydF1bdHlwZX49Y3NzXSIpO2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKXtsZXQgaT1uW3RdO2lmKGkuaW1wb3J0KXtjb25zdCB0PWkuaW1wb3J0LG49aS5oYXNBdHRyaWJ1dGUoSCk7aWYobiYmIXQuX3Vuc2NvcGVkU3R5bGUpe2NvbnN0IGU9Vih0KTtlLnNldEF0dHJpYnV0ZShILCIiKSx0Ll91bnNjb3BlZFN0eWxlPWV9ZWxzZSB0Ll9zdHlsZXx8KHQuX3N0eWxlPVYodCkpO2UucHVzaChuP3QuX3Vuc2NvcGVkU3R5bGU6dC5fc3R5bGUpfX1yZXR1cm4gZX1mdW5jdGlvbiBxKHQpe2xldCBlPUYodCk7aWYoZSYmdm9pZCAwPT09ZS5fY3NzVGV4dCl7bGV0IHQ9KGZ1bmN0aW9uIG4odCl7bGV0IGU9IiIsbj1XKHQpO2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKWUrPW5bdF0udGV4dENvbnRlbnQ7cmV0dXJuIGV9Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovKShlKSxuPWUucXVlcnlTZWxlY3RvcigidGVtcGxhdGUiKTtuJiYodCs9KGZ1bmN0aW9uIGkodCxlKXtsZXQgbj0iIjtjb25zdCBpPUcodCxlKTtmb3IobGV0IHQ9MDt0PGkubGVuZ3RoO3QrKyl7bGV0IGU9aVt0XTtlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKSxuKz1lLnRleHRDb250ZW50fXJldHVybiBufSkobixlLmFzc2V0cGF0aCkpLGUuX2Nzc1RleHQ9dHx8bnVsbH1yZXR1cm4gZXx8Y29uc29sZS53YXJuKCJDb3VsZCBub3QgZmluZCBzdHlsZSBkYXRhIGluIG1vZHVsZSBuYW1lZCIsdCksZSYmZS5fY3NzVGV4dHx8IiJ9Y29uc3QgWT13aW5kb3cuU2hhZHlET00mJndpbmRvdy5TaGFkeURPTS5ub1BhdGNoJiZ3aW5kb3cuU2hhZHlET00ud3JhcD93aW5kb3cuU2hhZHlET00ud3JhcDp3aW5kb3cuU2hhZHlET00/dD0+U2hhZHlET00ucGF0Y2godCk6dD0+dDsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9mdW5jdGlvbiBYKHQpe3JldHVybiB0LmluZGV4T2YoIi4iKT49MH1mdW5jdGlvbiAkKHQpe2xldCBlPXQuaW5kZXhPZigiLiIpO3JldHVybi0xPT09ZT90OnQuc2xpY2UoMCxlKX1mdW5jdGlvbiBLKHQsZSl7cmV0dXJuIDA9PT10LmluZGV4T2YoZSsiLiIpfWZ1bmN0aW9uIFoodCxlKXtyZXR1cm4gMD09PWUuaW5kZXhPZih0KyIuIil9ZnVuY3Rpb24gSih0LGUsbil7cmV0dXJuIGUrbi5zbGljZSh0Lmxlbmd0aCl9ZnVuY3Rpb24gUSh0LGUpe3JldHVybiB0PT09ZXx8Syh0LGUpfHxaKHQsZSl9ZnVuY3Rpb24gdHQodCl7aWYoQXJyYXkuaXNBcnJheSh0KSl7bGV0IGU9W107Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2xldCBpPXRbbl0udG9TdHJpbmcoKS5zcGxpdCgiLiIpO2ZvcihsZXQgdD0wO3Q8aS5sZW5ndGg7dCsrKWUucHVzaChpW3RdKX1yZXR1cm4gZS5qb2luKCIuIil9cmV0dXJuIHR9ZnVuY3Rpb24gZXQodCl7cmV0dXJuIEFycmF5LmlzQXJyYXkodCk/dHQodCkuc3BsaXQoIi4iKTp0LnRvU3RyaW5nKCkuc3BsaXQoIi4iKX1mdW5jdGlvbiBudCh0LGUsbil7bGV0IGk9dCxyPWV0KGUpO2ZvcihsZXQgdD0wO3Q8ci5sZW5ndGg7dCsrKXtpZighaSlyZXR1cm47aT1pW3JbdF1dfXJldHVybiBuJiYobi5wYXRoPXIuam9pbigiLiIpKSxpfWZ1bmN0aW9uIGl0KHQsZSxuKXtsZXQgaT10LHI9ZXQoZSksbz1yW3IubGVuZ3RoLTFdO2lmKHIubGVuZ3RoPjEpe2ZvcihsZXQgdD0wO3Q8ci5sZW5ndGgtMTt0Kyspe2lmKGk9aVtyW3RdXSwhaSlyZXR1cm59aVtvXT1ufWVsc2UgaVtlXT1uO3JldHVybiByLmpvaW4oIi4iKX0KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9jb25zdCBydD17fSxvdD0vLVthLXpdL2csYXQ9LyhbQS1aXSkvZztmdW5jdGlvbiBzdCh0KXtyZXR1cm4gcnRbdF18fChydFt0XT10LmluZGV4T2YoIi0iKTwwP3Q6dC5yZXBsYWNlKG90LCh0PT50WzFdLnRvVXBwZXJDYXNlKCkpKSl9ZnVuY3Rpb24gbHQodCl7cmV0dXJuIHJ0W3RdfHwocnRbdF09dC5yZXBsYWNlKGF0LCItJDEiKS50b0xvd2VyQ2FzZSgpKX0KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9sZXQgY3Q9MCx1dD0wLGh0PVtdLGR0PTAscHQ9ITEsZnQ9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiIpO25ldyB3aW5kb3cuTXV0YXRpb25PYnNlcnZlcigoZnVuY3Rpb24gbXQoKXtwdD0hMTtjb25zdCB0PWh0Lmxlbmd0aDtmb3IobGV0IGU9MDtlPHQ7ZSsrKXtsZXQgdD1odFtlXTtpZih0KXRyeXt0KCl9Y2F0Y2godCl7c2V0VGltZW91dCgoKCk9Pnt0aHJvdyB0fSkpfX1odC5zcGxpY2UoMCx0KSx1dCs9dH0pKS5vYnNlcnZlKGZ0LHtjaGFyYWN0ZXJEYXRhOiEwfSk7Y29uc3QgZ3Q9e2FmdGVyOnQ9Pih7cnVuOmU9PndpbmRvdy5zZXRUaW1lb3V0KGUsdCksY2FuY2VsKHQpe3dpbmRvdy5jbGVhclRpbWVvdXQodCl9fSkscnVuOih0LGUpPT53aW5kb3cuc2V0VGltZW91dCh0LGUpLGNhbmNlbCh0KXt3aW5kb3cuY2xlYXJUaW1lb3V0KHQpfX0sX3Q9e3J1bjp0PT53aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHQpLGNhbmNlbCh0KXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodCl9fSx5dD17cnVuOnQ9PndpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNrP3dpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNrKHQpOndpbmRvdy5zZXRUaW1lb3V0KHQsMTYpLGNhbmNlbCh0KXt3aW5kb3cuY2FuY2VsSWRsZUNhbGxiYWNrP3dpbmRvdy5jYW5jZWxJZGxlQ2FsbGJhY2sodCk6d2luZG93LmNsZWFyVGltZW91dCh0KX19LHZ0PXtydW46dD0+KHB0fHwocHQ9ITAsZnQudGV4dENvbnRlbnQ9ZHQrKyksaHQucHVzaCh0KSxjdCsrKSxjYW5jZWwodCl7Y29uc3QgZT10LXV0O2lmKGU+PTApe2lmKCFodFtlXSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgYXN5bmMgaGFuZGxlOiAiK3QpO2h0W2VdPW51bGx9fX0sYnQ9dnQseHQ9SSgodD0+Y2xhc3MgZXh0ZW5kcyB0e3N0YXRpYyBjcmVhdGVQcm9wZXJ0aWVzKHQpe2NvbnN0IGU9dGhpcy5wcm90b3R5cGU7Zm9yKGxldCBuIGluIHQpbiBpbiBlfHxlLl9jcmVhdGVQcm9wZXJ0eUFjY2Vzc29yKG4pfXN0YXRpYyBhdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkodCl7cmV0dXJuIHQudG9Mb3dlckNhc2UoKX1zdGF0aWMgdHlwZUZvclByb3BlcnR5KHQpe31fY3JlYXRlUHJvcGVydHlBY2Nlc3Nvcih0LGUpe3RoaXMuX2FkZFByb3BlcnR5VG9BdHRyaWJ1dGVNYXAodCksdGhpcy5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJfX2RhdGFIYXNBY2Nlc3NvciIsdGhpcykpfHwodGhpcy5fX2RhdGFIYXNBY2Nlc3Nvcj1PYmplY3QuYXNzaWduKHt9LHRoaXMuX19kYXRhSGFzQWNjZXNzb3IpKSx0aGlzLl9fZGF0YUhhc0FjY2Vzc29yW3RdfHwodGhpcy5fX2RhdGFIYXNBY2Nlc3Nvclt0XT0hMCx0aGlzLl9kZWZpbmVQcm9wZXJ0eUFjY2Vzc29yKHQsZSkpfV9hZGRQcm9wZXJ0eVRvQXR0cmlidXRlTWFwKHQpe3RoaXMuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgiX19kYXRhQXR0cmlidXRlcyIsdGhpcykpfHwodGhpcy5fX2RhdGFBdHRyaWJ1dGVzPU9iamVjdC5hc3NpZ24oe30sdGhpcy5fX2RhdGFBdHRyaWJ1dGVzKSk7bGV0IGU9dGhpcy5fX2RhdGFBdHRyaWJ1dGVzW3RdO3JldHVybiBlfHwoZT10aGlzLmNvbnN0cnVjdG9yLmF0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eSh0KSx0aGlzLl9fZGF0YUF0dHJpYnV0ZXNbZV09dCksZX1fZGVmaW5lUHJvcGVydHlBY2Nlc3Nvcih0LGUpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLHQse2dldCgpe3JldHVybiB0aGlzLl9fZGF0YVt0XX0sc2V0OmU/ZnVuY3Rpb24oKXt9OmZ1bmN0aW9uKGUpe3RoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eSh0LGUsITApJiZ0aGlzLl9pbnZhbGlkYXRlUHJvcGVydGllcygpfX0pfWNvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLl9fZGF0YUVuYWJsZWQ9ITEsdGhpcy5fX2RhdGFSZWFkeT0hMSx0aGlzLl9fZGF0YUludmFsaWQ9ITEsdGhpcy5fX2RhdGE9e30sdGhpcy5fX2RhdGFQZW5kaW5nPW51bGwsdGhpcy5fX2RhdGFPbGQ9bnVsbCx0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHM9bnVsbCx0aGlzLl9fZGF0YUNvdW50ZXI9MCx0aGlzLl9fc2VyaWFsaXppbmc9ITEsdGhpcy5faW5pdGlhbGl6ZVByb3BlcnRpZXMoKX1yZWFkeSgpe3RoaXMuX19kYXRhUmVhZHk9ITAsdGhpcy5fZmx1c2hQcm9wZXJ0aWVzKCl9X2luaXRpYWxpemVQcm9wZXJ0aWVzKCl7Zm9yKGxldCB0IGluIHRoaXMuX19kYXRhSGFzQWNjZXNzb3IpdGhpcy5oYXNPd25Qcm9wZXJ0eSh0KSYmKHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wcz10aGlzLl9fZGF0YUluc3RhbmNlUHJvcHN8fHt9LHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wc1t0XT10aGlzW3RdLGRlbGV0ZSB0aGlzW3RdKX1faW5pdGlhbGl6ZUluc3RhbmNlUHJvcGVydGllcyh0KXtPYmplY3QuYXNzaWduKHRoaXMsdCl9X3NldFByb3BlcnR5KHQsZSl7dGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5KHQsZSkmJnRoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCl9X2dldFByb3BlcnR5KHQpe3JldHVybiB0aGlzLl9fZGF0YVt0XX1fc2V0UGVuZGluZ1Byb3BlcnR5KHQsZSxuKXtsZXQgaT10aGlzLl9fZGF0YVt0XSxyPXRoaXMuX3Nob3VsZFByb3BlcnR5Q2hhbmdlKHQsZSxpKTtyZXR1cm4gciYmKHRoaXMuX19kYXRhUGVuZGluZ3x8KHRoaXMuX19kYXRhUGVuZGluZz17fSx0aGlzLl9fZGF0YU9sZD17fSksdGhpcy5fX2RhdGFPbGQmJiEodCBpbiB0aGlzLl9fZGF0YU9sZCkmJih0aGlzLl9fZGF0YU9sZFt0XT1pKSx0aGlzLl9fZGF0YVt0XT1lLHRoaXMuX19kYXRhUGVuZGluZ1t0XT1lKSxyfV9pc1Byb3BlcnR5UGVuZGluZyh0KXtyZXR1cm4hKCF0aGlzLl9fZGF0YVBlbmRpbmd8fCF0aGlzLl9fZGF0YVBlbmRpbmcuaGFzT3duUHJvcGVydHkodCkpfV9pbnZhbGlkYXRlUHJvcGVydGllcygpeyF0aGlzLl9fZGF0YUludmFsaWQmJnRoaXMuX19kYXRhUmVhZHkmJih0aGlzLl9fZGF0YUludmFsaWQ9ITAsYnQucnVuKCgoKT0+e3RoaXMuX19kYXRhSW52YWxpZCYmKHRoaXMuX19kYXRhSW52YWxpZD0hMSx0aGlzLl9mbHVzaFByb3BlcnRpZXMoKSl9KSkpfV9lbmFibGVQcm9wZXJ0aWVzKCl7dGhpcy5fX2RhdGFFbmFibGVkfHwodGhpcy5fX2RhdGFFbmFibGVkPSEwLHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wcyYmKHRoaXMuX2luaXRpYWxpemVJbnN0YW5jZVByb3BlcnRpZXModGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzKSx0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHM9bnVsbCksdGhpcy5yZWFkeSgpKX1fZmx1c2hQcm9wZXJ0aWVzKCl7dGhpcy5fX2RhdGFDb3VudGVyKys7Y29uc3QgdD10aGlzLl9fZGF0YSxlPXRoaXMuX19kYXRhUGVuZGluZyxuPXRoaXMuX19kYXRhT2xkO3RoaXMuX3Nob3VsZFByb3BlcnRpZXNDaGFuZ2UodCxlLG4pJiYodGhpcy5fX2RhdGFQZW5kaW5nPW51bGwsdGhpcy5fX2RhdGFPbGQ9bnVsbCx0aGlzLl9wcm9wZXJ0aWVzQ2hhbmdlZCh0LGUsbikpLHRoaXMuX19kYXRhQ291bnRlci0tfV9zaG91bGRQcm9wZXJ0aWVzQ2hhbmdlKHQsZSxuKXtyZXR1cm4gQm9vbGVhbihlKX1fcHJvcGVydGllc0NoYW5nZWQodCxlLG4pe31fc2hvdWxkUHJvcGVydHlDaGFuZ2UodCxlLG4pe3JldHVybiBuIT09ZSYmKG49PW58fGU9PWUpfWF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0LGUsbixpKXtlIT09biYmdGhpcy5fYXR0cmlidXRlVG9Qcm9wZXJ0eSh0LG4pLHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayYmc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHQsZSxuLGkpfV9hdHRyaWJ1dGVUb1Byb3BlcnR5KHQsZSxuKXtpZighdGhpcy5fX3NlcmlhbGl6aW5nKXtjb25zdCBpPXRoaXMuX19kYXRhQXR0cmlidXRlcyxyPWkmJmlbdF18fHQ7dGhpc1tyXT10aGlzLl9kZXNlcmlhbGl6ZVZhbHVlKGUsbnx8dGhpcy5jb25zdHJ1Y3Rvci50eXBlRm9yUHJvcGVydHkocikpfX1fcHJvcGVydHlUb0F0dHJpYnV0ZSh0LGUsbil7dGhpcy5fX3NlcmlhbGl6aW5nPSEwLHRoaXMuX3ZhbHVlVG9Ob2RlQXR0cmlidXRlKHRoaXMsbj1hcmd1bWVudHMubGVuZ3RoPDM/dGhpc1t0XTpuLGV8fHRoaXMuY29uc3RydWN0b3IuYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHQpKSx0aGlzLl9fc2VyaWFsaXppbmc9ITF9X3ZhbHVlVG9Ob2RlQXR0cmlidXRlKHQsZSxuKXtjb25zdCBpPXRoaXMuX3NlcmlhbGl6ZVZhbHVlKGUpOyJjbGFzcyIhPT1uJiYibmFtZSIhPT1uJiYic2xvdCIhPT1ufHwodD1ZKHQpKSx2b2lkIDA9PT1pP3QucmVtb3ZlQXR0cmlidXRlKG4pOnQuc2V0QXR0cmlidXRlKG4saSl9X3NlcmlhbGl6ZVZhbHVlKHQpe3N3aXRjaCh0eXBlb2YgdCl7Y2FzZSJib29sZWFuIjpyZXR1cm4gdD8iIjp2b2lkIDA7ZGVmYXVsdDpyZXR1cm4gbnVsbCE9dD90LnRvU3RyaW5nKCk6dm9pZCAwfX1fZGVzZXJpYWxpemVWYWx1ZSh0LGUpe3N3aXRjaChlKXtjYXNlIEJvb2xlYW46cmV0dXJuIG51bGwhPT10O2Nhc2UgTnVtYmVyOnJldHVybiBOdW1iZXIodCk7ZGVmYXVsdDpyZXR1cm4gdH19fSkpLHd0PXt9O2xldCBTdD1IVE1MRWxlbWVudC5wcm90b3R5cGU7Zm9yKDtTdDspe2xldCB0PU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKFN0KTtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl3dFt0W2VdXT0hMDtTdD1PYmplY3QuZ2V0UHJvdG90eXBlT2YoU3QpfWNvbnN0IE10PUkoKHQ9Pntjb25zdCBlPXh0KHQpO3JldHVybiBjbGFzcyBleHRlbmRzIGV7c3RhdGljIGNyZWF0ZVByb3BlcnRpZXNGb3JBdHRyaWJ1dGVzKCl7bGV0IHQ9dGhpcy5vYnNlcnZlZEF0dHJpYnV0ZXM7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspdGhpcy5wcm90b3R5cGUuX2NyZWF0ZVByb3BlcnR5QWNjZXNzb3Ioc3QodFtlXSkpfXN0YXRpYyBhdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkodCl7cmV0dXJuIGx0KHQpfV9pbml0aWFsaXplUHJvcGVydGllcygpe3RoaXMuX19kYXRhUHJvdG8mJih0aGlzLl9pbml0aWFsaXplUHJvdG9Qcm9wZXJ0aWVzKHRoaXMuX19kYXRhUHJvdG8pLHRoaXMuX19kYXRhUHJvdG89bnVsbCksc3VwZXIuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCl9X2luaXRpYWxpemVQcm90b1Byb3BlcnRpZXModCl7Zm9yKGxldCBlIGluIHQpdGhpcy5fc2V0UHJvcGVydHkoZSx0W2VdKX1fZW5zdXJlQXR0cmlidXRlKHQsZSl7Y29uc3Qgbj10aGlzO24uaGFzQXR0cmlidXRlKHQpfHx0aGlzLl92YWx1ZVRvTm9kZUF0dHJpYnV0ZShuLGUsdCl9X3NlcmlhbGl6ZVZhbHVlKHQpe3N3aXRjaCh0eXBlb2YgdCl7Y2FzZSJvYmplY3QiOmlmKHQgaW5zdGFuY2VvZiBEYXRlKXJldHVybiB0LnRvU3RyaW5nKCk7aWYodCl0cnl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHQpfWNhdGNoKHQpe3JldHVybiIifWRlZmF1bHQ6cmV0dXJuIHN1cGVyLl9zZXJpYWxpemVWYWx1ZSh0KX19X2Rlc2VyaWFsaXplVmFsdWUodCxlKXtsZXQgbjtzd2l0Y2goZSl7Y2FzZSBPYmplY3Q6dHJ5e249SlNPTi5wYXJzZSh0KX1jYXRjaChlKXtuPXR9YnJlYWs7Y2FzZSBBcnJheTp0cnl7bj1KU09OLnBhcnNlKHQpfWNhdGNoKGUpe249bnVsbCxjb25zb2xlLndhcm4oYFBvbHltZXI6OkF0dHJpYnV0ZXM6IGNvdWxkbid0IGRlY29kZSBBcnJheSBhcyBKU09OOiAke3R9YCl9YnJlYWs7Y2FzZSBEYXRlOm49aXNOYU4odCk/U3RyaW5nKHQpOk51bWJlcih0KSxuPW5ldyBEYXRlKG4pO2JyZWFrO2RlZmF1bHQ6bj1zdXBlci5fZGVzZXJpYWxpemVWYWx1ZSh0LGUpfXJldHVybiBufV9kZWZpbmVQcm9wZXJ0eUFjY2Vzc29yKHQsZSl7IShmdW5jdGlvbiBuKHQsZSl7aWYoIXd0W2VdKXtsZXQgbj10W2VdO3ZvaWQgMCE9PW4mJih0Ll9fZGF0YT90Ll9zZXRQZW5kaW5nUHJvcGVydHkoZSxuKToodC5fX2RhdGFQcm90bz90Lmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIl9fZGF0YVByb3RvIix0KSl8fCh0Ll9fZGF0YVByb3RvPU9iamVjdC5jcmVhdGUodC5fX2RhdGFQcm90bykpOnQuX19kYXRhUHJvdG89e30sdC5fX2RhdGFQcm90b1tlXT1uKSl9fSkodGhpcyx0KSxzdXBlci5fZGVmaW5lUHJvcGVydHlBY2Nlc3Nvcih0LGUpfV9oYXNBY2Nlc3Nvcih0KXtyZXR1cm4gdGhpcy5fX2RhdGFIYXNBY2Nlc3NvciYmdGhpcy5fX2RhdGFIYXNBY2Nlc3Nvclt0XX1faXNQcm9wZXJ0eVBlbmRpbmcodCl7cmV0dXJuIEJvb2xlYW4odGhpcy5fX2RhdGFQZW5kaW5nJiZ0IGluIHRoaXMuX19kYXRhUGVuZGluZyl9fX0pKSxFdD17ImRvbS1pZiI6ITAsImRvbS1yZXBlYXQiOiEwfTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9sZXQgVHQ9ITEsQ3Q9ITE7ZnVuY3Rpb24gQXQodCl7KGZ1bmN0aW9uIGUoKXtpZighVHQpe1R0PSEwO2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGV4dGFyZWEiKTt0LnBsYWNlaG9sZGVyPSJhIixDdD10LnBsYWNlaG9sZGVyPT09dC50ZXh0Q29udGVudH1yZXR1cm4gQ3R9KSgpJiYidGV4dGFyZWEiPT09dC5sb2NhbE5hbWUmJnQucGxhY2Vob2xkZXImJnQucGxhY2Vob2xkZXI9PT10LnRleHRDb250ZW50JiYodC50ZXh0Q29udGVudD1udWxsKX1mdW5jdGlvbiBrdCh0KXtsZXQgZT10LmdldEF0dHJpYnV0ZSgiaXMiKTtpZihlJiZFdFtlXSl7bGV0IG49dDtmb3Iobi5yZW1vdmVBdHRyaWJ1dGUoImlzIiksdD1uLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudChlKSxuLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHQsbiksdC5hcHBlbmRDaGlsZChuKTtuLmF0dHJpYnV0ZXMubGVuZ3RoOyl0LnNldEF0dHJpYnV0ZShuLmF0dHJpYnV0ZXNbMF0ubmFtZSxuLmF0dHJpYnV0ZXNbMF0udmFsdWUpLG4ucmVtb3ZlQXR0cmlidXRlKG4uYXR0cmlidXRlc1swXS5uYW1lKX1yZXR1cm4gdH1mdW5jdGlvbiBMdCh0LGUpe2xldCBuPWUucGFyZW50SW5mbyYmTHQodCxlLnBhcmVudEluZm8pO2lmKCFuKXJldHVybiB0O2ZvcihsZXQgdD1uLmZpcnN0Q2hpbGQsaT0wO3Q7dD10Lm5leHRTaWJsaW5nKWlmKGUucGFyZW50SW5kZXg9PT1pKyspcmV0dXJuIHR9ZnVuY3Rpb24gUHQodCxlLG4saSl7aS5pZCYmKGVbaS5pZF09bil9ZnVuY3Rpb24gTnQodCxlLG4pe2lmKG4uZXZlbnRzJiZuLmV2ZW50cy5sZW5ndGgpZm9yKGxldCBpLHI9MCxvPW4uZXZlbnRzO3I8by5sZW5ndGgmJihpPW9bcl0pO3IrKyl0Ll9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKGUsaS5uYW1lLGkudmFsdWUsdCl9ZnVuY3Rpb24gSXQodCxlLG4saSl7bi50ZW1wbGF0ZUluZm8mJihlLl90ZW1wbGF0ZUluZm89bi50ZW1wbGF0ZUluZm8sZS5fcGFyZW50VGVtcGxhdGVJbmZvPWkpfWNvbnN0IFJ0PUkoKHQ9PmNsYXNzIGV4dGVuZHMgdHtzdGF0aWMgX3BhcnNlVGVtcGxhdGUodCxlKXtpZighdC5fdGVtcGxhdGVJbmZvKXtsZXQgbj10Ll90ZW1wbGF0ZUluZm89e307bi5ub2RlSW5mb0xpc3Q9W10sbi5uZXN0ZWRUZW1wbGF0ZT1Cb29sZWFuKGUpLG4uc3RyaXBXaGl0ZVNwYWNlPWUmJmUuc3RyaXBXaGl0ZVNwYWNlfHx0Lmhhc0F0dHJpYnV0ZSgic3RyaXAtd2hpdGVzcGFjZSIpLHRoaXMuX3BhcnNlVGVtcGxhdGVDb250ZW50KHQsbix7cGFyZW50Om51bGx9KX1yZXR1cm4gdC5fdGVtcGxhdGVJbmZvfXN0YXRpYyBfcGFyc2VUZW1wbGF0ZUNvbnRlbnQodCxlLG4pe3JldHVybiB0aGlzLl9wYXJzZVRlbXBsYXRlTm9kZSh0LmNvbnRlbnQsZSxuKX1zdGF0aWMgX3BhcnNlVGVtcGxhdGVOb2RlKHQsZSxuKXtsZXQgaT0hMSxyPXQ7cmV0dXJuInRlbXBsYXRlIiE9ci5sb2NhbE5hbWV8fHIuaGFzQXR0cmlidXRlKCJwcmVzZXJ2ZS1jb250ZW50Iik/InNsb3QiPT09ci5sb2NhbE5hbWUmJihlLmhhc0luc2VydGlvblBvaW50PSEwKTppPXRoaXMuX3BhcnNlVGVtcGxhdGVOZXN0ZWRUZW1wbGF0ZShyLGUsbil8fGksQXQociksci5maXJzdENoaWxkJiZ0aGlzLl9wYXJzZVRlbXBsYXRlQ2hpbGROb2RlcyhyLGUsbiksci5oYXNBdHRyaWJ1dGVzJiZyLmhhc0F0dHJpYnV0ZXMoKSYmKGk9dGhpcy5fcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGVzKHIsZSxuKXx8aSksaXx8bi5ub3RlZH1zdGF0aWMgX3BhcnNlVGVtcGxhdGVDaGlsZE5vZGVzKHQsZSxuKXtpZigic2NyaXB0IiE9PXQubG9jYWxOYW1lJiYic3R5bGUiIT09dC5sb2NhbE5hbWUpZm9yKGxldCBpLHI9dC5maXJzdENoaWxkLG89MDtyO3I9aSl7aWYoInRlbXBsYXRlIj09ci5sb2NhbE5hbWUmJihyPWt0KHIpKSxpPXIubmV4dFNpYmxpbmcsci5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFKXtsZXQgbj1pO2Zvcig7biYmbi5ub2RlVHlwZT09PU5vZGUuVEVYVF9OT0RFOylyLnRleHRDb250ZW50Kz1uLnRleHRDb250ZW50LGk9bi5uZXh0U2libGluZyx0LnJlbW92ZUNoaWxkKG4pLG49aTtpZihlLnN0cmlwV2hpdGVTcGFjZSYmIXIudGV4dENvbnRlbnQudHJpbSgpKXt0LnJlbW92ZUNoaWxkKHIpO2NvbnRpbnVlfX1sZXQgYT17cGFyZW50SW5kZXg6byxwYXJlbnRJbmZvOm59O3RoaXMuX3BhcnNlVGVtcGxhdGVOb2RlKHIsZSxhKSYmKGEuaW5mb0luZGV4PWUubm9kZUluZm9MaXN0LnB1c2goYSktMSksci5wYXJlbnROb2RlJiZvKyt9fXN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlKHQsZSxuKXtsZXQgaT10LHI9dGhpcy5fcGFyc2VUZW1wbGF0ZShpLGUpO3JldHVybihyLmNvbnRlbnQ9aS5jb250ZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpKS5hcHBlbmRDaGlsZChpLmNvbnRlbnQpLG4udGVtcGxhdGVJbmZvPXIsITB9c3RhdGljIF9wYXJzZVRlbXBsYXRlTm9kZUF0dHJpYnV0ZXModCxlLG4pe2xldCBpPSExLHI9QXJyYXkuZnJvbSh0LmF0dHJpYnV0ZXMpO2ZvcihsZXQgbyxhPXIubGVuZ3RoLTE7bz1yW2FdO2EtLSlpPXRoaXMuX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlKHQsZSxuLG8ubmFtZSxvLnZhbHVlKXx8aTtyZXR1cm4gaX1zdGF0aWMgX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlKHQsZSxuLGkscil7cmV0dXJuIm9uLSI9PT1pLnNsaWNlKDAsMyk/KHQucmVtb3ZlQXR0cmlidXRlKGkpLG4uZXZlbnRzPW4uZXZlbnRzfHxbXSxuLmV2ZW50cy5wdXNoKHtuYW1lOmkuc2xpY2UoMyksdmFsdWU6cn0pLCEwKToiaWQiPT09aSYmKG4uaWQ9ciwhMCl9c3RhdGljIF9jb250ZW50Rm9yVGVtcGxhdGUodCl7bGV0IGU9dC5fdGVtcGxhdGVJbmZvO3JldHVybiBlJiZlLmNvbnRlbnR8fHQuY29udGVudH1fc3RhbXBUZW1wbGF0ZSh0LGUpe3QmJiF0LmNvbnRlbnQmJndpbmRvdy5IVE1MVGVtcGxhdGVFbGVtZW50JiZIVE1MVGVtcGxhdGVFbGVtZW50LmRlY29yYXRlJiZIVE1MVGVtcGxhdGVFbGVtZW50LmRlY29yYXRlKHQpO2xldCBuPShlPWV8fHRoaXMuY29uc3RydWN0b3IuX3BhcnNlVGVtcGxhdGUodCkpLm5vZGVJbmZvTGlzdCxpPWRvY3VtZW50LmltcG9ydE5vZGUoZS5jb250ZW50fHx0LmNvbnRlbnQsITApO2kuX19ub0luc2VydGlvblBvaW50PSFlLmhhc0luc2VydGlvblBvaW50O2xldCByPWkubm9kZUxpc3Q9bmV3IEFycmF5KG4ubGVuZ3RoKTtpLiQ9e307Zm9yKGxldCB0LG89MCxhPW4ubGVuZ3RoO288YSYmKHQ9bltvXSk7bysrKXtsZXQgbj1yW29dPUx0KGksdCk7UHQoMCxpLiQsbix0KSxJdCgwLG4sdCxlKSxOdCh0aGlzLG4sdCl9cmV0dXJuIGk9aSxpfV9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKHQsZSxuLGkpe2xldCByPShmdW5jdGlvbiBvKHQsZSxuKXtyZXR1cm4gdD10Ll9tZXRob2RIb3N0fHx0LGZ1bmN0aW9uKGUpe3Rbbl0/dFtuXShlLGUuZGV0YWlsKTpjb25zb2xlLndhcm4oImxpc3RlbmVyIG1ldGhvZCBgIituKyJgIG5vdCBkZWZpbmVkIil9fSkoaT1pfHx0LDAsbik7cmV0dXJuIHRoaXMuX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUodCxlLHIpLHJ9X2FkZEV2ZW50TGlzdGVuZXJUb05vZGUodCxlLG4pe3QuYWRkRXZlbnRMaXN0ZW5lcihlLG4pfV9yZW1vdmVFdmVudExpc3RlbmVyRnJvbU5vZGUodCxlLG4pe3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLG4pfX0pKTsKLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3CiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrUHJvdG90eXBhbFR5cGVzfQogICAgICogQGxpY2Vuc2UgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQKICAgICAqIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkKICAgICAqIGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkKICAgICAqIEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAKICAgICAqIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICAqL2xldCBPdD0wO2NvbnN0IHp0PVtdLER0PXtDT01QVVRFOiJfX2NvbXB1dGVFZmZlY3RzIixSRUZMRUNUOiJfX3JlZmxlY3RFZmZlY3RzIixOT1RJRlk6Il9fbm90aWZ5RWZmZWN0cyIsUFJPUEFHQVRFOiJfX3Byb3BhZ2F0ZUVmZmVjdHMiLE9CU0VSVkU6Il9fb2JzZXJ2ZUVmZmVjdHMiLFJFQURfT05MWToiX19yZWFkT25seSJ9LEJ0PSJfX2NvbXB1dGVJbmZvIixIdD0vW0EtWl0vO2Z1bmN0aW9uIEZ0KHQsZSxuKXtsZXQgaT10W2VdO2lmKGkpe2lmKCF0Lmhhc093blByb3BlcnR5KGUpJiYoaT10W2VdPU9iamVjdC5jcmVhdGUodFtlXSksbikpZm9yKGxldCB0IGluIGkpe2xldCBlPWlbdF0sbj1pW3RdPUFycmF5KGUubGVuZ3RoKTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyluW3RdPWVbdF19fWVsc2UgaT10W2VdPXt9O3JldHVybiBpfWZ1bmN0aW9uIFZ0KHQsZSxuLGkscixvKXtpZihlKXtsZXQgYT0hMTtjb25zdCBzPU90Kys7Zm9yKGxldCBsIGluIG4pe2xldCBjPWVbcj8kKGwpOmxdO2lmKGMpZm9yKGxldCBlLHU9MCxoPWMubGVuZ3RoO3U8aCYmKGU9Y1t1XSk7dSsrKWUuaW5mbyYmZS5pbmZvLmxhc3RSdW49PT1zfHxyJiYhanQobCxlLnRyaWdnZXIpfHwoZS5pbmZvJiYoZS5pbmZvLmxhc3RSdW49cyksZS5mbih0LGwsbixpLGUuaW5mbyxyLG8pLGE9ITApfXJldHVybiBhfXJldHVybiExfWZ1bmN0aW9uIFV0KHQsZSxuLGkscixvLGEscyl7bGV0IGw9ITEsYz1lW2E/JChpKTppXTtpZihjKWZvcihsZXQgZSx1PTAsaD1jLmxlbmd0aDt1PGgmJihlPWNbdV0pO3UrKyllLmluZm8mJmUuaW5mby5sYXN0UnVuPT09bnx8YSYmIWp0KGksZS50cmlnZ2VyKXx8KGUuaW5mbyYmKGUuaW5mby5sYXN0UnVuPW4pLGUuZm4odCxpLHIsbyxlLmluZm8sYSxzKSxsPSEwKTtyZXR1cm4gbH1mdW5jdGlvbiBqdCh0LGUpe2lmKGUpe2xldCBuPWUubmFtZTtyZXR1cm4gbj09dHx8ISghZS5zdHJ1Y3R1cmVkfHwhSyhuLHQpKXx8ISghZS53aWxkY2FyZHx8IVoobix0KSl9cmV0dXJuITB9ZnVuY3Rpb24gR3QodCxlLG4saSxyKXtsZXQgbz0ic3RyaW5nIj09dHlwZW9mIHIubWV0aG9kP3Rbci5tZXRob2RdOnIubWV0aG9kLGE9ci5wcm9wZXJ0eTtvP28uY2FsbCh0LHQuX19kYXRhW2FdLGlbYV0pOnIuZHluYW1pY0ZufHxjb25zb2xlLndhcm4oIm9ic2VydmVyIG1ldGhvZCBgIityLm1ldGhvZCsiYCBub3QgZGVmaW5lZCIpfWZ1bmN0aW9uIFd0KHQsZSxuKXtsZXQgaT0kKGUpO2lmKGkhPT1lKXtyZXR1cm4gcXQodCxsdChpKSsiLWNoYW5nZWQiLG5bZV0sZSksITB9cmV0dXJuITF9ZnVuY3Rpb24gcXQodCxlLG4saSl7bGV0IHI9e3ZhbHVlOm4scXVldWVQcm9wZXJ0eTohMH07aSYmKHIucGF0aD1pKSxZKHQpLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KGUse2RldGFpbDpyfSkpfWZ1bmN0aW9uIFl0KHQsZSxuLGkscixvKXtsZXQgYT0obz8kKGUpOmUpIT1lP2U6bnVsbCxzPWE/bnQodCxhKTp0Ll9fZGF0YVtlXTthJiZ2b2lkIDA9PT1zJiYocz1uW2VdKSxxdCh0LHIuZXZlbnROYW1lLHMsYSl9ZnVuY3Rpb24gWHQodCxlLG4saSxyKXtsZXQgbz10Ll9fZGF0YVtlXTt5JiYobz15KG8sci5hdHRyTmFtZSwiYXR0cmlidXRlIix0KSksdC5fcHJvcGVydHlUb0F0dHJpYnV0ZShlLHIuYXR0ck5hbWUsbyl9ZnVuY3Rpb24gJHQodCxlLG4saSl7bGV0IHI9dFtEdC5DT01QVVRFXTtpZihyKWlmKFQpe090Kys7Y29uc3Qgbz0oZnVuY3Rpb24gbyh0KXtsZXQgZT10LmNvbnN0cnVjdG9yLl9fb3JkZXJlZENvbXB1dGVkRGVwcztpZighZSl7ZT1uZXcgTWFwO2NvbnN0IG49dFtEdC5DT01QVVRFXTtsZXQgaSx7Y291bnRzOnIscmVhZHk6byx0b3RhbDphfT0oZnVuY3Rpb24gbih0KXtjb25zdCBlPXQuX19jb21wdXRlSW5mbyxuPXt9LGk9dFtEdC5DT01QVVRFXSxyPVtdO2xldCBvPTA7Zm9yKGxldCB0IGluIGUpe2NvbnN0IGk9ZVt0XTtvKz1uW3RdPWkuYXJncy5maWx0ZXIoKHQ9PiF0LmxpdGVyYWwpKS5sZW5ndGgrKGkuZHluYW1pY0ZuPzE6MCl9Zm9yKGxldCB0IGluIGkpZVt0XXx8ci5wdXNoKHQpO3JldHVybntjb3VudHM6bixyZWFkeTpyLHRvdGFsOm99fSkodCk7Zm9yKDtpPW8uc2hpZnQoKTspe2Uuc2V0KGksZS5zaXplKTtjb25zdCB0PW5baV07dCYmdC5mb3JFYWNoKCh0PT57Y29uc3QgZT10LmluZm8ubWV0aG9kSW5mbzstLWEsMD09LS1yW2VdJiZvLnB1c2goZSl9KSl9aWYoMCE9PWEpe2NvbnNvbGUud2FybihgQ29tcHV0ZWQgZ3JhcGggZm9yICR7dC5sb2NhbE5hbWV9IGluY29tcGxldGU7IGNpcmN1bGFyP2ApfXQuY29uc3RydWN0b3IuX19vcmRlcmVkQ29tcHV0ZWREZXBzPWV9cmV0dXJuIGV9KSh0KSxhPVtdO2ZvcihsZXQgdCBpbiBlKVp0KHQscixhLG8saSk7bGV0IHM7Zm9yKDtzPWEuc2hpZnQoKTspSnQodCwiIixlLG4scykmJlp0KHMubWV0aG9kSW5mbyxyLGEsbyxpKTtPYmplY3QuYXNzaWduKG4sdC5fX2RhdGFPbGQpLE9iamVjdC5hc3NpZ24oZSx0Ll9fZGF0YVBlbmRpbmcpLHQuX19kYXRhUGVuZGluZz1udWxsfWVsc2V7bGV0IG89ZTtmb3IoO1Z0KHQscixvLG4saSk7KU9iamVjdC5hc3NpZ24obix0Ll9fZGF0YU9sZCksT2JqZWN0LmFzc2lnbihlLHQuX19kYXRhUGVuZGluZyksbz10Ll9fZGF0YVBlbmRpbmcsdC5fX2RhdGFQZW5kaW5nPW51bGx9fWNvbnN0IEt0PSh0LGUsbik9PntsZXQgaT0wLHI9ZS5sZW5ndGgtMSxvPS0xO2Zvcig7aTw9cjspe2NvbnN0IGE9aStyPj4xLHM9bi5nZXQoZVthXS5tZXRob2RJbmZvKS1uLmdldCh0Lm1ldGhvZEluZm8pO2lmKHM8MClpPWErMTtlbHNle2lmKCEocz4wKSl7bz1hO2JyZWFrfXI9YS0xfX1vPDAmJihvPXIrMSksZS5zcGxpY2UobywwLHQpfSxadD0odCxlLG4saSxyKT0+e2NvbnN0IG89ZVtyPyQodCk6dF07aWYobylmb3IobGV0IGU9MDtlPG8ubGVuZ3RoO2UrKyl7Y29uc3QgYT1vW2VdO2EuaW5mby5sYXN0UnVuPT09T3R8fHImJiFqdCh0LGEudHJpZ2dlcil8fChhLmluZm8ubGFzdFJ1bj1PdCxLdChhLmluZm8sbixpKSl9fTtmdW5jdGlvbiBKdCh0LGUsbixpLHIpe2xldCBvPW9lKHQsZSxuLGkscik7aWYobz09PXp0KXJldHVybiExO2xldCBhPXIubWV0aG9kSW5mbztyZXR1cm4gdC5fX2RhdGFIYXNBY2Nlc3NvciYmdC5fX2RhdGFIYXNBY2Nlc3NvclthXT90Ll9zZXRQZW5kaW5nUHJvcGVydHkoYSxvLCEwKToodFthXT1vLCExKX1mdW5jdGlvbiBRdCh0LGUsbixpLHIsbyxhKXtuLmJpbmRpbmdzPW4uYmluZGluZ3N8fFtdO2xldCBzPXtraW5kOmksdGFyZ2V0OnIscGFydHM6byxsaXRlcmFsOmEsaXNDb21wb3VuZDoxIT09by5sZW5ndGh9O2lmKG4uYmluZGluZ3MucHVzaChzKSwoZnVuY3Rpb24gbCh0KXtyZXR1cm4gQm9vbGVhbih0LnRhcmdldCkmJiJhdHRyaWJ1dGUiIT10LmtpbmQmJiJ0ZXh0IiE9dC5raW5kJiYhdC5pc0NvbXBvdW5kJiYieyI9PT10LnBhcnRzWzBdLm1vZGV9KShzKSl7bGV0e2V2ZW50OnQsbmVnYXRlOmV9PXMucGFydHNbMF07cy5saXN0ZW5lckV2ZW50PXR8fGx0KHIpKyItY2hhbmdlZCIscy5saXN0ZW5lck5lZ2F0ZT1lfWxldCBjPWUubm9kZUluZm9MaXN0Lmxlbmd0aDtmb3IobGV0IG49MDtuPHMucGFydHMubGVuZ3RoO24rKyl7bGV0IGk9cy5wYXJ0c1tuXTtpLmNvbXBvdW5kSW5kZXg9bix0ZSh0LGUscyxpLGMpfX1mdW5jdGlvbiB0ZSh0LGUsbixpLHIpe2lmKCFpLmxpdGVyYWwpaWYoImF0dHJpYnV0ZSI9PT1uLmtpbmQmJiItIj09PW4udGFyZ2V0WzBdKWNvbnNvbGUud2FybigiQ2Fubm90IHNldCBhdHRyaWJ1dGUgIituLnRhcmdldCsnIGJlY2F1c2UgIi0iIGlzIG5vdCBhIHZhbGlkIGF0dHJpYnV0ZSBzdGFydGluZyBjaGFyYWN0ZXInKTtlbHNle2xldCBvPWkuZGVwZW5kZW5jaWVzLGE9e2luZGV4OnIsYmluZGluZzpuLHBhcnQ6aSxldmFsdWF0b3I6dH07Zm9yKGxldCBuPTA7bjxvLmxlbmd0aDtuKyspe2xldCBpPW9bbl07InN0cmluZyI9PXR5cGVvZiBpJiYoaT11ZShpKSxpLndpbGRjYXJkPSEwKSx0Ll9hZGRUZW1wbGF0ZVByb3BlcnR5RWZmZWN0KGUsaS5yb290UHJvcGVydHkse2ZuOmVlLGluZm86YSx0cmlnZ2VyOml9KX19fWZ1bmN0aW9uIGVlKHQsZSxuLGkscixvLGEpe2xldCBzPWFbci5pbmRleF0sbD1yLmJpbmRpbmcsYz1yLnBhcnQ7aWYobyYmYy5zb3VyY2UmJmUubGVuZ3RoPmMuc291cmNlLmxlbmd0aCYmInByb3BlcnR5Ij09bC5raW5kJiYhbC5pc0NvbXBvdW5kJiZzLl9faXNQcm9wZXJ0eUVmZmVjdHNDbGllbnQmJnMuX19kYXRhSGFzQWNjZXNzb3ImJnMuX19kYXRhSGFzQWNjZXNzb3JbbC50YXJnZXRdKXtsZXQgaT1uW2VdO2U9SihjLnNvdXJjZSxsLnRhcmdldCxlKSxzLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgoZSxpLCExLCEwKSYmdC5fZW5xdWV1ZUNsaWVudChzKX1lbHNle2xldCBhPXIuZXZhbHVhdG9yLl9ldmFsdWF0ZUJpbmRpbmcodCxjLGUsbixpLG8pO2EhPT16dCYmKGZ1bmN0aW9uIHUodCxlLG4saSxyKXtyPShmdW5jdGlvbiBvKHQsZSxuLGkpe2lmKG4uaXNDb21wb3VuZCl7bGV0IHI9dC5fX2RhdGFDb21wb3VuZFN0b3JhZ2Vbbi50YXJnZXRdO3JbaS5jb21wb3VuZEluZGV4XT1lLGU9ci5qb2luKCIiKX0iYXR0cmlidXRlIiE9PW4ua2luZCYmKCJ0ZXh0Q29udGVudCIhPT1uLnRhcmdldCYmKCJ2YWx1ZSIhPT1uLnRhcmdldHx8ImlucHV0IiE9PXQubG9jYWxOYW1lJiYidGV4dGFyZWEiIT09dC5sb2NhbE5hbWUpfHwoZT1udWxsPT1lPyIiOmUpKTtyZXR1cm4gZX0pKGUscixuLGkpLHkmJihyPXkocixuLnRhcmdldCxuLmtpbmQsZSkpO2lmKCJhdHRyaWJ1dGUiPT1uLmtpbmQpdC5fdmFsdWVUb05vZGVBdHRyaWJ1dGUoZSxyLG4udGFyZ2V0KTtlbHNle2xldCBpPW4udGFyZ2V0O2UuX19pc1Byb3BlcnR5RWZmZWN0c0NsaWVudCYmZS5fX2RhdGFIYXNBY2Nlc3NvciYmZS5fX2RhdGFIYXNBY2Nlc3NvcltpXT9lW0R0LlJFQURfT05MWV0mJmVbRHQuUkVBRF9PTkxZXVtpXXx8ZS5fc2V0UGVuZGluZ1Byb3BlcnR5KGkscikmJnQuX2VucXVldWVDbGllbnQoZSk6dC5fc2V0VW5tYW5hZ2VkUHJvcGVydHlUb05vZGUoZSxpLHIpfX0pKHQscyxsLGMsYSl9fWZ1bmN0aW9uIG5lKHQsZSl7aWYoZS5pc0NvbXBvdW5kKXtsZXQgbj10Ll9fZGF0YUNvbXBvdW5kU3RvcmFnZXx8KHQuX19kYXRhQ29tcG91bmRTdG9yYWdlPXt9KSxpPWUucGFydHMscj1uZXcgQXJyYXkoaS5sZW5ndGgpO2ZvcihsZXQgdD0wO3Q8aS5sZW5ndGg7dCsrKXJbdF09aVt0XS5saXRlcmFsO2xldCBvPWUudGFyZ2V0O25bb109cixlLmxpdGVyYWwmJiJwcm9wZXJ0eSI9PWUua2luZCYmKCJjbGFzc05hbWUiPT09byYmKHQ9WSh0KSksdFtvXT1lLmxpdGVyYWwpfX1mdW5jdGlvbiBpZSh0LGUsbil7aWYobi5saXN0ZW5lckV2ZW50KXtsZXQgaT1uLnBhcnRzWzBdO3QuYWRkRXZlbnRMaXN0ZW5lcihuLmxpc3RlbmVyRXZlbnQsKGZ1bmN0aW9uKHQpeyEoZnVuY3Rpb24gcih0LGUsbixpLG8pe2xldCBhLHM9dC5kZXRhaWwsbD1zJiZzLnBhdGg7bD8oaT1KKG4saSxsKSxhPXMmJnMudmFsdWUpOmE9dC5jdXJyZW50VGFyZ2V0W25dLGE9bz8hYTphLGVbRHQuUkVBRF9PTkxZXSYmZVtEdC5SRUFEX09OTFldW2ldfHwhZS5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKGksYSwhMCxCb29sZWFuKGwpKXx8cyYmcy5xdWV1ZVByb3BlcnR5fHxlLl9pbnZhbGlkYXRlUHJvcGVydGllcygpfSkodCxlLG4udGFyZ2V0LGkuc291cmNlLGkubmVnYXRlKX0pKX19ZnVuY3Rpb24gcmUodCxlLG4saSxyLG8pe2xldCBhPXttZXRob2ROYW1lOmUubWV0aG9kTmFtZSxhcmdzOmUuYXJncyxtZXRob2RJbmZvOnIsZHluYW1pY0ZuOm89ZS5zdGF0aWN8fG8mJigib2JqZWN0IiE9dHlwZW9mIG98fG9bZS5tZXRob2ROYW1lXSl9O2ZvcihsZXQgcixvPTA7bzxlLmFyZ3MubGVuZ3RoJiYocj1lLmFyZ3Nbb10pO28rKylyLmxpdGVyYWx8fHQuX2FkZFByb3BlcnR5RWZmZWN0KHIucm9vdFByb3BlcnR5LG4se2ZuOmksaW5mbzphLHRyaWdnZXI6cn0pO3JldHVybiBvJiZ0Ll9hZGRQcm9wZXJ0eUVmZmVjdChlLm1ldGhvZE5hbWUsbix7Zm46aSxpbmZvOmF9KSxhfWZ1bmN0aW9uIG9lKHQsZSxuLGkscil7bGV0IG89dC5fbWV0aG9kSG9zdHx8dCxhPW9bci5tZXRob2ROYW1lXTtpZihhKXtsZXQgaT10Ll9tYXJzaGFsQXJncyhyLmFyZ3MsZSxuKTtyZXR1cm4gaT09PXp0P3p0OmEuYXBwbHkobyxpKX1yLmR5bmFtaWNGbnx8Y29uc29sZS53YXJuKCJtZXRob2QgYCIrci5tZXRob2ROYW1lKyJgIG5vdCBkZWZpbmVkIil9Y29uc3QgYWU9W10sc2U9bmV3IFJlZ0V4cCgiKFxcW1xcW3x7eylcXHMqKD86KCEpXFxzKik/KCg/OlthLXpBLVpfJF1bXFx3LjokXFwtKl0qKVxccyooPzpcXChcXHMqKD86KD86KD86KCg/OlthLXpBLVpfJF1bXFx3LjokXFwtKl0qKXwoPzpbLStdP1swLTldKlxcLj9bMC05XSsoPzpbZUVdWy0rXT9bMC05XSspPyl8KD86KD86Jyg/OlteJ1xcXFxdfFxcXFwuKSonKXwoPzpcIig/OlteXCJcXFxcXXxcXFxcLikqXCIpKSlcXHMqKSg/OixcXHMqKD86KCg/OlthLXpBLVpfJF1bXFx3LjokXFwtKl0qKXwoPzpbLStdP1swLTldKlxcLj9bMC05XSsoPzpbZUVdWy0rXT9bMC05XSspPyl8KD86KD86Jyg/OlteJ1xcXFxdfFxcXFwuKSonKXwoPzpcIig/OlteXCJcXFxcXXxcXFxcLikqXCIpKSlcXHMqKSkqKT8pXFwpXFxzKik/KSg/Ol1dfH19KSIsImciKTtmdW5jdGlvbiBsZSh0KXtsZXQgZT0iIjtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7ZSs9dFtuXS5saXRlcmFsfHwiIn1yZXR1cm4gZX1mdW5jdGlvbiBjZSh0KXtsZXQgZT10Lm1hdGNoKC8oW15cc10rPylcKChbXHNcU10qKVwpLyk7aWYoZSl7bGV0IHQ9e21ldGhvZE5hbWU6ZVsxXSxzdGF0aWM6ITAsYXJnczphZX07aWYoZVsyXS50cmltKCkpe3JldHVybihmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIGUuYXJncz10Lm1hcCgoZnVuY3Rpb24odCl7bGV0IG49dWUodCk7cmV0dXJuIG4ubGl0ZXJhbHx8KGUuc3RhdGljPSExKSxufSksdGhpcyksZX0pKGVbMl0ucmVwbGFjZSgvXFwsL2csIiZjb21tYTsiKS5zcGxpdCgiLCIpLHQpfXJldHVybiB0fXJldHVybiBudWxsfWZ1bmN0aW9uIHVlKHQpe2xldCBlPXQudHJpbSgpLnJlcGxhY2UoLyZjb21tYTsvZywiLCIpLnJlcGxhY2UoL1xcKC4pL2csIiQxIiksbj17bmFtZTplLHZhbHVlOiIiLGxpdGVyYWw6ITF9LGk9ZVswXTtzd2l0Y2goIi0iPT09aSYmKGk9ZVsxXSksaT49IjAiJiZpPD0iOSImJihpPSIjIiksaSl7Y2FzZSInIjpjYXNlJyInOm4udmFsdWU9ZS5zbGljZSgxLC0xKSxuLmxpdGVyYWw9ITA7YnJlYWs7Y2FzZSIjIjpuLnZhbHVlPU51bWJlcihlKSxuLmxpdGVyYWw9ITB9cmV0dXJuIG4ubGl0ZXJhbHx8KG4ucm9vdFByb3BlcnR5PSQoZSksbi5zdHJ1Y3R1cmVkPVgoZSksbi5zdHJ1Y3R1cmVkJiYobi53aWxkY2FyZD0iLioiPT1lLnNsaWNlKC0yKSxuLndpbGRjYXJkJiYobi5uYW1lPWUuc2xpY2UoMCwtMikpKSksbn1mdW5jdGlvbiBoZSh0LGUsbil7bGV0IGk9bnQodCxuKTtyZXR1cm4gdm9pZCAwPT09aSYmKGk9ZVtuXSksaX1mdW5jdGlvbiBkZSh0LGUsbixpKXtjb25zdCByPXtpbmRleFNwbGljZXM6aX07RSYmIXQuX292ZXJyaWRlTGVnYWN5VW5kZWZpbmVkJiYoZS5zcGxpY2VzPXIpLHQubm90aWZ5UGF0aChuKyIuc3BsaWNlcyIsciksdC5ub3RpZnlQYXRoKG4rIi5sZW5ndGgiLGUubGVuZ3RoKSxFJiYhdC5fb3ZlcnJpZGVMZWdhY3lVbmRlZmluZWQmJihyLmluZGV4U3BsaWNlcz1bXSl9ZnVuY3Rpb24gcGUodCxlLG4saSxyLG8pe2RlKHQsZSxuLFt7aW5kZXg6aSxhZGRlZENvdW50OnIscmVtb3ZlZDpvLG9iamVjdDplLHR5cGU6InNwbGljZSJ9XSl9Y29uc3QgZmU9SSgodD0+e2NvbnN0IGU9UnQoTXQodCkpO3JldHVybiBjbGFzcyBleHRlbmRzIGV7Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuX19pc1Byb3BlcnR5RWZmZWN0c0NsaWVudD0hMH1nZXQgUFJPUEVSVFlfRUZGRUNUX1RZUEVTKCl7cmV0dXJuIER0fV9pbml0aWFsaXplUHJvcGVydGllcygpe3N1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpLHRoaXMuX3JlZ2lzdGVySG9zdCgpLHRoaXMuX19kYXRhQ2xpZW50c1JlYWR5PSExLHRoaXMuX19kYXRhUGVuZGluZ0NsaWVudHM9bnVsbCx0aGlzLl9fZGF0YVRvTm90aWZ5PW51bGwsdGhpcy5fX2RhdGFMaW5rZWRQYXRocz1udWxsLHRoaXMuX19kYXRhSGFzUGF0aHM9ITEsdGhpcy5fX2RhdGFDb21wb3VuZFN0b3JhZ2U9dGhpcy5fX2RhdGFDb21wb3VuZFN0b3JhZ2V8fG51bGwsdGhpcy5fX2RhdGFIb3N0PXRoaXMuX19kYXRhSG9zdHx8bnVsbCx0aGlzLl9fZGF0YVRlbXA9e30sdGhpcy5fX2RhdGFDbGllbnRzSW5pdGlhbGl6ZWQ9ITF9X3JlZ2lzdGVySG9zdCgpe2lmKG1lLmxlbmd0aCl7bGV0IHQ9bWVbbWUubGVuZ3RoLTFdO3QuX2VucXVldWVDbGllbnQodGhpcyksdGhpcy5fX2RhdGFIb3N0PXR9fV9pbml0aWFsaXplUHJvdG9Qcm9wZXJ0aWVzKHQpe3RoaXMuX19kYXRhPU9iamVjdC5jcmVhdGUodCksdGhpcy5fX2RhdGFQZW5kaW5nPU9iamVjdC5jcmVhdGUodCksdGhpcy5fX2RhdGFPbGQ9e319X2luaXRpYWxpemVJbnN0YW5jZVByb3BlcnRpZXModCl7bGV0IGU9dGhpc1tEdC5SRUFEX09OTFldO2ZvcihsZXQgbiBpbiB0KWUmJmVbbl18fCh0aGlzLl9fZGF0YVBlbmRpbmc9dGhpcy5fX2RhdGFQZW5kaW5nfHx7fSx0aGlzLl9fZGF0YU9sZD10aGlzLl9fZGF0YU9sZHx8e30sdGhpcy5fX2RhdGFbbl09dGhpcy5fX2RhdGFQZW5kaW5nW25dPXRbbl0pfV9hZGRQcm9wZXJ0eUVmZmVjdCh0LGUsbil7dGhpcy5fY3JlYXRlUHJvcGVydHlBY2Nlc3Nvcih0LGU9PUR0LlJFQURfT05MWSk7bGV0IGk9RnQodGhpcyxlLCEwKVt0XTtpfHwoaT10aGlzW2VdW3RdPVtdKSxpLnB1c2gobil9X3JlbW92ZVByb3BlcnR5RWZmZWN0KHQsZSxuKXtsZXQgaT1GdCh0aGlzLGUsITApW3RdLHI9aS5pbmRleE9mKG4pO3I+PTAmJmkuc3BsaWNlKHIsMSl9X2hhc1Byb3BlcnR5RWZmZWN0KHQsZSl7bGV0IG49dGhpc1tlXTtyZXR1cm4gQm9vbGVhbihuJiZuW3RdKX1faGFzUmVhZE9ubHlFZmZlY3QodCl7cmV0dXJuIHRoaXMuX2hhc1Byb3BlcnR5RWZmZWN0KHQsRHQuUkVBRF9PTkxZKX1faGFzTm90aWZ5RWZmZWN0KHQpe3JldHVybiB0aGlzLl9oYXNQcm9wZXJ0eUVmZmVjdCh0LER0Lk5PVElGWSl9X2hhc1JlZmxlY3RFZmZlY3QodCl7cmV0dXJuIHRoaXMuX2hhc1Byb3BlcnR5RWZmZWN0KHQsRHQuUkVGTEVDVCl9X2hhc0NvbXB1dGVkRWZmZWN0KHQpe3JldHVybiB0aGlzLl9oYXNQcm9wZXJ0eUVmZmVjdCh0LER0LkNPTVBVVEUpfV9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgodCxlLG4saSl7aWYoaXx8JChBcnJheS5pc0FycmF5KHQpP3RbMF06dCkhPT10KXtpZighaSl7bGV0IG49bnQodGhpcyx0KTtpZighKHQ9aXQodGhpcyx0LGUpKXx8IXN1cGVyLl9zaG91bGRQcm9wZXJ0eUNoYW5nZSh0LGUsbikpcmV0dXJuITF9aWYodGhpcy5fX2RhdGFIYXNQYXRocz0hMCx0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkodCxlLG4pKXJldHVybihmdW5jdGlvbiByKHQsZSxuKXtsZXQgaT10Ll9fZGF0YUxpbmtlZFBhdGhzO2lmKGkpe2xldCByO2ZvcihsZXQgbyBpbiBpKXtsZXQgYT1pW29dO1oobyxlKT8ocj1KKG8sYSxlKSx0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgocixuLCEwLCEwKSk6WihhLGUpJiYocj1KKGEsbyxlKSx0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgocixuLCEwLCEwKSl9fX0pKHRoaXMsdCxlKSwhMH1lbHNle2lmKHRoaXMuX19kYXRhSGFzQWNjZXNzb3ImJnRoaXMuX19kYXRhSGFzQWNjZXNzb3JbdF0pcmV0dXJuIHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eSh0LGUsbik7dGhpc1t0XT1lfXJldHVybiExfV9zZXRVbm1hbmFnZWRQcm9wZXJ0eVRvTm9kZSh0LGUsbil7bj09PXRbZV0mJiJvYmplY3QiIT10eXBlb2Ygbnx8KCJjbGFzc05hbWUiPT09ZSYmKHQ9WSh0KSksdFtlXT1uKX1fc2V0UGVuZGluZ1Byb3BlcnR5KHQsZSxuKXtsZXQgaT10aGlzLl9fZGF0YUhhc1BhdGhzJiZYKHQpO3JldHVybiEhdGhpcy5fc2hvdWxkUHJvcGVydHlDaGFuZ2UodCxlLChpP3RoaXMuX19kYXRhVGVtcDp0aGlzLl9fZGF0YSlbdF0pJiYodGhpcy5fX2RhdGFQZW5kaW5nfHwodGhpcy5fX2RhdGFQZW5kaW5nPXt9LHRoaXMuX19kYXRhT2xkPXt9KSx0IGluIHRoaXMuX19kYXRhT2xkfHwodGhpcy5fX2RhdGFPbGRbdF09dGhpcy5fX2RhdGFbdF0pLGk/dGhpcy5fX2RhdGFUZW1wW3RdPWU6dGhpcy5fX2RhdGFbdF09ZSx0aGlzLl9fZGF0YVBlbmRpbmdbdF09ZSwoaXx8dGhpc1tEdC5OT1RJRlldJiZ0aGlzW0R0Lk5PVElGWV1bdF0pJiYodGhpcy5fX2RhdGFUb05vdGlmeT10aGlzLl9fZGF0YVRvTm90aWZ5fHx7fSx0aGlzLl9fZGF0YVRvTm90aWZ5W3RdPW4pLCEwKX1fc2V0UHJvcGVydHkodCxlKXt0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkodCxlLCEwKSYmdGhpcy5faW52YWxpZGF0ZVByb3BlcnRpZXMoKX1faW52YWxpZGF0ZVByb3BlcnRpZXMoKXt0aGlzLl9fZGF0YVJlYWR5JiZ0aGlzLl9mbHVzaFByb3BlcnRpZXMoKX1fZW5xdWV1ZUNsaWVudCh0KXt0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzPXRoaXMuX19kYXRhUGVuZGluZ0NsaWVudHN8fFtdLHQhPT10aGlzJiZ0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzLnB1c2godCl9X2ZsdXNoQ2xpZW50cygpe3RoaXMuX19kYXRhQ2xpZW50c1JlYWR5P3RoaXMuX19lbmFibGVPckZsdXNoQ2xpZW50cygpOih0aGlzLl9fZGF0YUNsaWVudHNSZWFkeT0hMCx0aGlzLl9yZWFkeUNsaWVudHMoKSx0aGlzLl9fZGF0YVJlYWR5PSEwKX1fX2VuYWJsZU9yRmx1c2hDbGllbnRzKCl7bGV0IHQ9dGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50cztpZih0KXt0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzPW51bGw7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspe2xldCBuPXRbZV07bi5fX2RhdGFFbmFibGVkP24uX19kYXRhUGVuZGluZyYmbi5fZmx1c2hQcm9wZXJ0aWVzKCk6bi5fZW5hYmxlUHJvcGVydGllcygpfX19X3JlYWR5Q2xpZW50cygpe3RoaXMuX19lbmFibGVPckZsdXNoQ2xpZW50cygpfXNldFByb3BlcnRpZXModCxlKXtmb3IobGV0IG4gaW4gdCkhZSYmdGhpc1tEdC5SRUFEX09OTFldJiZ0aGlzW0R0LlJFQURfT05MWV1bbl18fHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChuLHRbbl0sITApO3RoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCl9cmVhZHkoKXt0aGlzLl9mbHVzaFByb3BlcnRpZXMoKSx0aGlzLl9fZGF0YUNsaWVudHNSZWFkeXx8dGhpcy5fZmx1c2hDbGllbnRzKCksdGhpcy5fX2RhdGFQZW5kaW5nJiZ0aGlzLl9mbHVzaFByb3BlcnRpZXMoKX1fcHJvcGVydGllc0NoYW5nZWQodCxlLG4pe2xldCBpLHI9dGhpcy5fX2RhdGFIYXNQYXRoczt0aGlzLl9fZGF0YUhhc1BhdGhzPSExLCR0KHRoaXMsZSxuLHIpLGk9dGhpcy5fX2RhdGFUb05vdGlmeSx0aGlzLl9fZGF0YVRvTm90aWZ5PW51bGwsdGhpcy5fcHJvcGFnYXRlUHJvcGVydHlDaGFuZ2VzKGUsbixyKSx0aGlzLl9mbHVzaENsaWVudHMoKSxWdCh0aGlzLHRoaXNbRHQuUkVGTEVDVF0sZSxuLHIpLFZ0KHRoaXMsdGhpc1tEdC5PQlNFUlZFXSxlLG4sciksaSYmKGZ1bmN0aW9uIG8odCxlLG4saSxyKXtsZXQgbyxhLHM9dFtEdC5OT1RJRlldLGw9T3QrKztmb3IobGV0IGEgaW4gZSllW2FdJiYocyYmVXQodCxzLGwsYSxuLGkscil8fHImJld0KHQsYSxuKSkmJihvPSEwKTtvJiYoYT10Ll9fZGF0YUhvc3QpJiZhLl9pbnZhbGlkYXRlUHJvcGVydGllcyYmYS5faW52YWxpZGF0ZVByb3BlcnRpZXMoKX0pKHRoaXMsaSxlLG4sciksMT09dGhpcy5fX2RhdGFDb3VudGVyJiYodGhpcy5fX2RhdGFUZW1wPXt9KX1fcHJvcGFnYXRlUHJvcGVydHlDaGFuZ2VzKHQsZSxuKXt0aGlzW0R0LlBST1BBR0FURV0mJlZ0KHRoaXMsdGhpc1tEdC5QUk9QQUdBVEVdLHQsZSxuKSx0aGlzLl9fdGVtcGxhdGVJbmZvJiZ0aGlzLl9ydW5FZmZlY3RzRm9yVGVtcGxhdGUodGhpcy5fX3RlbXBsYXRlSW5mbyx0LGUsbil9X3J1bkVmZmVjdHNGb3JUZW1wbGF0ZSh0LGUsbixpKXtjb25zdCByPShlLGkpPT57VnQodGhpcyx0LnByb3BlcnR5RWZmZWN0cyxlLG4saSx0Lm5vZGVMaXN0KTtmb3IobGV0IHI9dC5maXJzdENoaWxkO3I7cj1yLm5leHRTaWJsaW5nKXRoaXMuX3J1bkVmZmVjdHNGb3JUZW1wbGF0ZShyLGUsbixpKX07dC5ydW5FZmZlY3RzP3QucnVuRWZmZWN0cyhyLGUsaSk6cihlLGkpfWxpbmtQYXRocyh0LGUpe3Q9dHQodCksZT10dChlKSx0aGlzLl9fZGF0YUxpbmtlZFBhdGhzPXRoaXMuX19kYXRhTGlua2VkUGF0aHN8fHt9LHRoaXMuX19kYXRhTGlua2VkUGF0aHNbdF09ZX11bmxpbmtQYXRocyh0KXt0PXR0KHQpLHRoaXMuX19kYXRhTGlua2VkUGF0aHMmJmRlbGV0ZSB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzW3RdfW5vdGlmeVNwbGljZXModCxlKXtsZXQgbj17cGF0aDoiIn07ZGUodGhpcyxudCh0aGlzLHQsbiksbi5wYXRoLGUpfWdldCh0LGUpe3JldHVybiBudChlfHx0aGlzLHQpfXNldCh0LGUsbil7bj9pdChuLHQsZSk6dGhpc1tEdC5SRUFEX09OTFldJiZ0aGlzW0R0LlJFQURfT05MWV1bdF18fHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aCh0LGUsITApJiZ0aGlzLl9pbnZhbGlkYXRlUHJvcGVydGllcygpfXB1c2godCwuLi5lKXtsZXQgbj17cGF0aDoiIn0saT1udCh0aGlzLHQsbikscj1pLmxlbmd0aCxvPWkucHVzaCguLi5lKTtyZXR1cm4gZS5sZW5ndGgmJnBlKHRoaXMsaSxuLnBhdGgscixlLmxlbmd0aCxbXSksb31wb3AodCl7bGV0IGU9e3BhdGg6IiJ9LG49bnQodGhpcyx0LGUpLGk9Qm9vbGVhbihuLmxlbmd0aCkscj1uLnBvcCgpO3JldHVybiBpJiZwZSh0aGlzLG4sZS5wYXRoLG4ubGVuZ3RoLDAsW3JdKSxyfXNwbGljZSh0LGUsbiwuLi5pKXtsZXQgcixvPXtwYXRoOiIifSxhPW50KHRoaXMsdCxvKTtyZXR1cm4gZTwwP2U9YS5sZW5ndGgtTWF0aC5mbG9vcigtZSk6ZSYmKGU9TWF0aC5mbG9vcihlKSkscj0yPT09YXJndW1lbnRzLmxlbmd0aD9hLnNwbGljZShlKTphLnNwbGljZShlLG4sLi4uaSksKGkubGVuZ3RofHxyLmxlbmd0aCkmJnBlKHRoaXMsYSxvLnBhdGgsZSxpLmxlbmd0aCxyKSxyfXNoaWZ0KHQpe2xldCBlPXtwYXRoOiIifSxuPW50KHRoaXMsdCxlKSxpPUJvb2xlYW4obi5sZW5ndGgpLHI9bi5zaGlmdCgpO3JldHVybiBpJiZwZSh0aGlzLG4sZS5wYXRoLDAsMCxbcl0pLHJ9dW5zaGlmdCh0LC4uLmUpe2xldCBuPXtwYXRoOiIifSxpPW50KHRoaXMsdCxuKSxyPWkudW5zaGlmdCguLi5lKTtyZXR1cm4gZS5sZW5ndGgmJnBlKHRoaXMsaSxuLnBhdGgsMCxlLmxlbmd0aCxbXSkscn1ub3RpZnlQYXRoKHQsZSl7bGV0IG47aWYoMT09YXJndW1lbnRzLmxlbmd0aCl7bGV0IGk9e3BhdGg6IiJ9O2U9bnQodGhpcyx0LGkpLG49aS5wYXRofWVsc2Ugbj1BcnJheS5pc0FycmF5KHQpP3R0KHQpOnQ7dGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKG4sZSwhMCwhMCkmJnRoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCl9X2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkodCxlKXt0aGlzLl9hZGRQcm9wZXJ0eUVmZmVjdCh0LER0LlJFQURfT05MWSksZSYmKHRoaXNbIl9zZXQiKyhmdW5jdGlvbiBuKHQpe3JldHVybiB0WzBdLnRvVXBwZXJDYXNlKCkrdC5zdWJzdHJpbmcoMSl9KSh0KV09ZnVuY3Rpb24oZSl7dGhpcy5fc2V0UHJvcGVydHkodCxlKX0pfV9jcmVhdGVQcm9wZXJ0eU9ic2VydmVyKHQsZSxuKXtsZXQgaT17cHJvcGVydHk6dCxtZXRob2Q6ZSxkeW5hbWljRm46Qm9vbGVhbihuKX07dGhpcy5fYWRkUHJvcGVydHlFZmZlY3QodCxEdC5PQlNFUlZFLHtmbjpHdCxpbmZvOmksdHJpZ2dlcjp7bmFtZTp0fX0pLG4mJnRoaXMuX2FkZFByb3BlcnR5RWZmZWN0KGUsRHQuT0JTRVJWRSx7Zm46R3QsaW5mbzppLHRyaWdnZXI6e25hbWU6ZX19KX1fY3JlYXRlTWV0aG9kT2JzZXJ2ZXIodCxlKXtsZXQgbj1jZSh0KTtpZighbil0aHJvdyBuZXcgRXJyb3IoIk1hbGZvcm1lZCBvYnNlcnZlciBleHByZXNzaW9uICciK3QrIiciKTtyZSh0aGlzLG4sRHQuT0JTRVJWRSxvZSxudWxsLGUpfV9jcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eSh0KXt0aGlzLl9hZGRQcm9wZXJ0eUVmZmVjdCh0LER0Lk5PVElGWSx7Zm46WXQsaW5mbzp7ZXZlbnROYW1lOmx0KHQpKyItY2hhbmdlZCIscHJvcGVydHk6dH19KX1fY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkodCl7bGV0IGU9dGhpcy5jb25zdHJ1Y3Rvci5hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkodCk7Ii0iPT09ZVswXT9jb25zb2xlLndhcm4oIlByb3BlcnR5ICIrdCsiIGNhbm5vdCBiZSByZWZsZWN0ZWQgdG8gYXR0cmlidXRlICIrZSsnIGJlY2F1c2UgIi0iIGlzIG5vdCBhIHZhbGlkIHN0YXJ0aW5nIGF0dHJpYnV0ZSBuYW1lLiBVc2UgYSBsb3dlcmNhc2UgZmlyc3QgbGV0dGVyIGZvciB0aGUgcHJvcGVydHkgaW5zdGVhZC4nKTp0aGlzLl9hZGRQcm9wZXJ0eUVmZmVjdCh0LER0LlJFRkxFQ1Qse2ZuOlh0LGluZm86e2F0dHJOYW1lOmV9fSl9X2NyZWF0ZUNvbXB1dGVkUHJvcGVydHkodCxlLG4pe2xldCBpPWNlKGUpO2lmKCFpKXRocm93IG5ldyBFcnJvcigiTWFsZm9ybWVkIGNvbXB1dGVkIGV4cHJlc3Npb24gJyIrZSsiJyIpO2NvbnN0IHI9cmUodGhpcyxpLER0LkNPTVBVVEUsSnQsdCxuKTtGdCh0aGlzLEJ0KVt0XT1yfV9tYXJzaGFsQXJncyh0LGUsbil7Y29uc3QgaT10aGlzLl9fZGF0YSxyPVtdO2ZvcihsZXQgbz0wLGE9dC5sZW5ndGg7bzxhO28rKyl7bGV0e25hbWU6YSxzdHJ1Y3R1cmVkOnMsd2lsZGNhcmQ6bCx2YWx1ZTpjLGxpdGVyYWw6dX09dFtvXTtpZighdSlpZihsKXtjb25zdCB0PVooYSxlKSxyPWhlKGksbix0P2U6YSk7Yz17cGF0aDp0P2U6YSx2YWx1ZTpyLGJhc2U6dD9udChpLGEpOnJ9fWVsc2UgYz1zP2hlKGksbixhKTppW2FdO2lmKEUmJiF0aGlzLl9vdmVycmlkZUxlZ2FjeVVuZGVmaW5lZCYmdm9pZCAwPT09YyYmdC5sZW5ndGg+MSlyZXR1cm4genQ7cltvXT1jfXJldHVybiByfXN0YXRpYyBhZGRQcm9wZXJ0eUVmZmVjdCh0LGUsbil7dGhpcy5wcm90b3R5cGUuX2FkZFByb3BlcnR5RWZmZWN0KHQsZSxuKX1zdGF0aWMgY3JlYXRlUHJvcGVydHlPYnNlcnZlcih0LGUsbil7dGhpcy5wcm90b3R5cGUuX2NyZWF0ZVByb3BlcnR5T2JzZXJ2ZXIodCxlLG4pfXN0YXRpYyBjcmVhdGVNZXRob2RPYnNlcnZlcih0LGUpe3RoaXMucHJvdG90eXBlLl9jcmVhdGVNZXRob2RPYnNlcnZlcih0LGUpfXN0YXRpYyBjcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eSh0KXt0aGlzLnByb3RvdHlwZS5fY3JlYXRlTm90aWZ5aW5nUHJvcGVydHkodCl9c3RhdGljIGNyZWF0ZVJlYWRPbmx5UHJvcGVydHkodCxlKXt0aGlzLnByb3RvdHlwZS5fY3JlYXRlUmVhZE9ubHlQcm9wZXJ0eSh0LGUpfXN0YXRpYyBjcmVhdGVSZWZsZWN0ZWRQcm9wZXJ0eSh0KXt0aGlzLnByb3RvdHlwZS5fY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkodCl9c3RhdGljIGNyZWF0ZUNvbXB1dGVkUHJvcGVydHkodCxlLG4pe3RoaXMucHJvdG90eXBlLl9jcmVhdGVDb21wdXRlZFByb3BlcnR5KHQsZSxuKX1zdGF0aWMgYmluZFRlbXBsYXRlKHQpe3JldHVybiB0aGlzLnByb3RvdHlwZS5fYmluZFRlbXBsYXRlKHQpfV9iaW5kVGVtcGxhdGUodCxlKXtsZXQgbj10aGlzLmNvbnN0cnVjdG9yLl9wYXJzZVRlbXBsYXRlKHQpLGk9dGhpcy5fX3ByZUJvdW5kVGVtcGxhdGVJbmZvPT1uO2lmKCFpKWZvcihsZXQgdCBpbiBuLnByb3BlcnR5RWZmZWN0cyl0aGlzLl9jcmVhdGVQcm9wZXJ0eUFjY2Vzc29yKHQpO2lmKGUpaWYobj1PYmplY3QuY3JlYXRlKG4pLG4ud2FzUHJlQm91bmQ9aSx0aGlzLl9fdGVtcGxhdGVJbmZvKXtjb25zdCBlPXQuX3BhcmVudFRlbXBsYXRlSW5mb3x8dGhpcy5fX3RlbXBsYXRlSW5mbyxpPWUubGFzdENoaWxkO24ucGFyZW50PWUsZS5sYXN0Q2hpbGQ9bixuLnByZXZpb3VzU2libGluZz1pLGk/aS5uZXh0U2libGluZz1uOmUuZmlyc3RDaGlsZD1ufWVsc2UgdGhpcy5fX3RlbXBsYXRlSW5mbz1uO2Vsc2UgdGhpcy5fX3ByZUJvdW5kVGVtcGxhdGVJbmZvPW47cmV0dXJuIG59c3RhdGljIF9hZGRUZW1wbGF0ZVByb3BlcnR5RWZmZWN0KHQsZSxuKXsodC5ob3N0UHJvcHM9dC5ob3N0UHJvcHN8fHt9KVtlXT0hMDtsZXQgaT10LnByb3BlcnR5RWZmZWN0cz10LnByb3BlcnR5RWZmZWN0c3x8e307KGlbZV09aVtlXXx8W10pLnB1c2gobil9X3N0YW1wVGVtcGxhdGUodCxlKXtlPWV8fHRoaXMuX2JpbmRUZW1wbGF0ZSh0LCEwKSxtZS5wdXNoKHRoaXMpO2xldCBuPXN1cGVyLl9zdGFtcFRlbXBsYXRlKHQsZSk7aWYobWUucG9wKCksZS5ub2RlTGlzdD1uLm5vZGVMaXN0LCFlLndhc1ByZUJvdW5kKXtsZXQgdD1lLmNoaWxkTm9kZXM9W107Zm9yKGxldCBlPW4uZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZyl0LnB1c2goZSl9cmV0dXJuIG4udGVtcGxhdGVJbmZvPWUsKGZ1bmN0aW9uIGkodCxlKXtsZXR7bm9kZUxpc3Q6bixub2RlSW5mb0xpc3Q6aX09ZTtpZihpLmxlbmd0aClmb3IobGV0IGU9MDtlPGkubGVuZ3RoO2UrKyl7bGV0IHI9bltlXSxvPWlbZV0uYmluZGluZ3M7aWYobylmb3IobGV0IGU9MDtlPG8ubGVuZ3RoO2UrKyl7bGV0IG49b1tlXTtuZShyLG4pLGllKHIsdCxuKX1yLl9fZGF0YUhvc3Q9dH19KSh0aGlzLGUpLHRoaXMuX19kYXRhQ2xpZW50c1JlYWR5JiYodGhpcy5fcnVuRWZmZWN0c0ZvclRlbXBsYXRlKGUsdGhpcy5fX2RhdGEsbnVsbCwhMSksdGhpcy5fZmx1c2hDbGllbnRzKCkpLG59X3JlbW92ZUJvdW5kRG9tKHQpe2NvbnN0IGU9dC50ZW1wbGF0ZUluZm8se3ByZXZpb3VzU2libGluZzpuLG5leHRTaWJsaW5nOmkscGFyZW50OnJ9PWU7bj9uLm5leHRTaWJsaW5nPWk6ciYmKHIuZmlyc3RDaGlsZD1pKSxpP2kucHJldmlvdXNTaWJsaW5nPW46ciYmKHIubGFzdENoaWxkPW4pLGUubmV4dFNpYmxpbmc9ZS5wcmV2aW91c1NpYmxpbmc9bnVsbDtsZXQgbz1lLmNoaWxkTm9kZXM7Zm9yKGxldCB0PTA7dDxvLmxlbmd0aDt0Kyspe2xldCBlPW9bdF07WShZKGUpLnBhcmVudE5vZGUpLnJlbW92ZUNoaWxkKGUpfX1zdGF0aWMgX3BhcnNlVGVtcGxhdGVOb2RlKHQsbixpKXtsZXQgcj1lLl9wYXJzZVRlbXBsYXRlTm9kZS5jYWxsKHRoaXMsdCxuLGkpO2lmKHQubm9kZVR5cGU9PT1Ob2RlLlRFWFRfTk9ERSl7bGV0IGU9dGhpcy5fcGFyc2VCaW5kaW5ncyh0LnRleHRDb250ZW50LG4pO2UmJih0LnRleHRDb250ZW50PWxlKGUpfHwiICIsUXQodGhpcyxuLGksInRleHQiLCJ0ZXh0Q29udGVudCIsZSkscj0hMCl9cmV0dXJuIHJ9c3RhdGljIF9wYXJzZVRlbXBsYXRlTm9kZUF0dHJpYnV0ZSh0LG4saSxyLG8pe2xldCBhPXRoaXMuX3BhcnNlQmluZGluZ3MobyxuKTtpZihhKXtsZXQgZT1yLG89InByb3BlcnR5IjtIdC50ZXN0KHIpP289ImF0dHJpYnV0ZSI6IiQiPT1yW3IubGVuZ3RoLTFdJiYocj1yLnNsaWNlKDAsLTEpLG89ImF0dHJpYnV0ZSIpO2xldCBzPWxlKGEpO3JldHVybiBzJiYiYXR0cmlidXRlIj09byYmKCJjbGFzcyI9PXImJnQuaGFzQXR0cmlidXRlKCJjbGFzcyIpJiYocys9IiAiK3QuZ2V0QXR0cmlidXRlKHIpKSx0LnNldEF0dHJpYnV0ZShyLHMpKSwiYXR0cmlidXRlIj09byYmImRpc2FibGUtdXBncmFkZSQiPT1lJiZ0LnNldEF0dHJpYnV0ZShyLCIiKSwiaW5wdXQiPT09dC5sb2NhbE5hbWUmJiJ2YWx1ZSI9PT1lJiZ0LnNldEF0dHJpYnV0ZShlLCIiKSx0LnJlbW92ZUF0dHJpYnV0ZShlKSwicHJvcGVydHkiPT09byYmKHI9c3QocikpLFF0KHRoaXMsbixpLG8scixhLHMpLCEwfXJldHVybiBlLl9wYXJzZVRlbXBsYXRlTm9kZUF0dHJpYnV0ZS5jYWxsKHRoaXMsdCxuLGkscixvKX1zdGF0aWMgX3BhcnNlVGVtcGxhdGVOZXN0ZWRUZW1wbGF0ZSh0LG4saSl7bGV0IHI9ZS5fcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlLmNhbGwodGhpcyx0LG4saSk7Y29uc3Qgbz10LnBhcmVudE5vZGUsYT1pLnRlbXBsYXRlSW5mbyxzPSJkb20taWYiPT09by5sb2NhbE5hbWU7QyYmKHN8fCJkb20tcmVwZWF0Ij09PW8ubG9jYWxOYW1lKSYmKG8ucmVtb3ZlQ2hpbGQodCksKGk9aS5wYXJlbnRJbmZvKS50ZW1wbGF0ZUluZm89YSxpLm5vdGVkPSEwLHI9ITEpO2xldCBsPWEuaG9zdFByb3BzO2lmKEEmJnMpbCYmKG4uaG9zdFByb3BzPU9iamVjdC5hc3NpZ24obi5ob3N0UHJvcHN8fHt9LGwpLEN8fChpLnBhcmVudEluZm8ubm90ZWQ9ITApKTtlbHNle2xldCB0PSJ7Ijtmb3IobGV0IGUgaW4gbCl7UXQodGhpcyxuLGksInByb3BlcnR5IiwiX2hvc3RfIitlLFt7bW9kZTp0LHNvdXJjZTplLGRlcGVuZGVuY2llczpbZV0saG9zdFByb3A6ITB9XSl9fXJldHVybiByfXN0YXRpYyBfcGFyc2VCaW5kaW5ncyh0LGUpe2xldCBuLGk9W10scj0wO2Zvcig7bnVsbCE9PShuPXNlLmV4ZWModCkpOyl7bi5pbmRleD5yJiZpLnB1c2goe2xpdGVyYWw6dC5zbGljZShyLG4uaW5kZXgpfSk7bGV0IG89blsxXVswXSxhPUJvb2xlYW4oblsyXSkscz1uWzNdLnRyaW0oKSxsPSExLGM9IiIsdT0tMTsieyI9PW8mJih1PXMuaW5kZXhPZigiOjoiKSk+MCYmKGM9cy5zdWJzdHJpbmcodSsyKSxzPXMuc3Vic3RyaW5nKDAsdSksbD0hMCk7bGV0IGg9Y2UocyksZD1bXTtpZihoKXtsZXR7YXJnczp0LG1ldGhvZE5hbWU6bn09aDtmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl7bGV0IG49dFtlXTtuLmxpdGVyYWx8fGQucHVzaChuKX1sZXQgaT1lLmR5bmFtaWNGbnM7KGkmJmlbbl18fGguc3RhdGljKSYmKGQucHVzaChuKSxoLmR5bmFtaWNGbj0hMCl9ZWxzZSBkLnB1c2gocyk7aS5wdXNoKHtzb3VyY2U6cyxtb2RlOm8sbmVnYXRlOmEsY3VzdG9tRXZlbnQ6bCxzaWduYXR1cmU6aCxkZXBlbmRlbmNpZXM6ZCxldmVudDpjfSkscj1zZS5sYXN0SW5kZXh9aWYociYmcjx0Lmxlbmd0aCl7bGV0IGU9dC5zdWJzdHJpbmcocik7ZSYmaS5wdXNoKHtsaXRlcmFsOmV9KX1yZXR1cm4gaS5sZW5ndGg/aTpudWxsfXN0YXRpYyBfZXZhbHVhdGVCaW5kaW5nKHQsZSxuLGkscixvKXtsZXQgYTtyZXR1cm4gYT1lLnNpZ25hdHVyZT9vZSh0LG4saSwwLGUuc2lnbmF0dXJlKTpuIT1lLnNvdXJjZT9udCh0LGUuc291cmNlKTpvJiZYKG4pP250KHQsbik6dC5fX2RhdGFbbl0sZS5uZWdhdGUmJihhPSFhKSxhfX19KSksbWU9W107Y29uc3QgZ2U9SSgodD0+e2NvbnN0IGU9eHQodCk7ZnVuY3Rpb24gbih0KXtjb25zdCBlPU9iamVjdC5nZXRQcm90b3R5cGVPZih0KTtyZXR1cm4gZS5wcm90b3R5cGUgaW5zdGFuY2VvZiByP2U6bnVsbH1mdW5jdGlvbiBpKHQpe2lmKCF0Lmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIl9fb3duUHJvcGVydGllcyIsdCkpKXtsZXQgZT1udWxsO2lmKHQuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgicHJvcGVydGllcyIsdCkpKXtjb25zdCBuPXQucHJvcGVydGllcztuJiYoZT0oCi8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmZ1bmN0aW9uIGUodCl7Y29uc3QgZT17fTtmb3IobGV0IG4gaW4gdCl7Y29uc3QgaT10W25dO2Vbbl09ImZ1bmN0aW9uIj09dHlwZW9mIGk/e3R5cGU6aX06aX1yZXR1cm4gZX0pKG4pKX10Ll9fb3duUHJvcGVydGllcz1lfXJldHVybiB0Ll9fb3duUHJvcGVydGllc31jbGFzcyByIGV4dGVuZHMgZXtzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpe2lmKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIl9fb2JzZXJ2ZWRBdHRyaWJ1dGVzIix0aGlzKSkpe2NvbnN0IHQ9dGhpcy5fcHJvcGVydGllczt0aGlzLl9fb2JzZXJ2ZWRBdHRyaWJ1dGVzPXQ/T2JqZWN0LmtleXModCkubWFwKCh0PT50aGlzLnByb3RvdHlwZS5fYWRkUHJvcGVydHlUb0F0dHJpYnV0ZU1hcCh0KSkpOltdfXJldHVybiB0aGlzLl9fb2JzZXJ2ZWRBdHRyaWJ1dGVzfXN0YXRpYyBmaW5hbGl6ZSgpe2lmKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIl9fZmluYWxpemVkIix0aGlzKSkpe2NvbnN0IHQ9bih0aGlzKTt0JiZ0LmZpbmFsaXplKCksdGhpcy5fX2ZpbmFsaXplZD0hMCx0aGlzLl9maW5hbGl6ZUNsYXNzKCl9fXN0YXRpYyBfZmluYWxpemVDbGFzcygpe2NvbnN0IHQ9aSh0aGlzKTt0JiZ0aGlzLmNyZWF0ZVByb3BlcnRpZXModCl9c3RhdGljIGdldCBfcHJvcGVydGllcygpe2lmKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIl9fcHJvcGVydGllcyIsdGhpcykpKXtjb25zdCB0PW4odGhpcyk7dGhpcy5fX3Byb3BlcnRpZXM9T2JqZWN0LmFzc2lnbih7fSx0JiZ0Ll9wcm9wZXJ0aWVzLGkodGhpcykpfXJldHVybiB0aGlzLl9fcHJvcGVydGllc31zdGF0aWMgdHlwZUZvclByb3BlcnR5KHQpe2NvbnN0IGU9dGhpcy5fcHJvcGVydGllc1t0XTtyZXR1cm4gZSYmZS50eXBlfV9pbml0aWFsaXplUHJvcGVydGllcygpe3RoaXMuY29uc3RydWN0b3IuZmluYWxpemUoKSxzdXBlci5faW5pdGlhbGl6ZVByb3BlcnRpZXMoKX1jb25uZWN0ZWRDYWxsYmFjaygpe3N1cGVyLmNvbm5lY3RlZENhbGxiYWNrJiZzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpLHRoaXMuX2VuYWJsZVByb3BlcnRpZXMoKX1kaXNjb25uZWN0ZWRDYWxsYmFjaygpe3N1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrJiZzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpfX1yZXR1cm4gcn0pKSxfZT13aW5kb3cuU2hhZHlDU1MmJndpbmRvdy5TaGFkeUNTUy5jc3NCdWlsZCx5ZT1JKCh0PT57Y29uc3QgZT1nZShmZSh0KSk7ZnVuY3Rpb24gbih0LGUsbixpKXtuLmNvbXB1dGVkJiYobi5yZWFkT25seT0hMCksbi5jb21wdXRlZCYmKHQuX2hhc1JlYWRPbmx5RWZmZWN0KGUpP2NvbnNvbGUud2FybihgQ2Fubm90IHJlZGVmaW5lIGNvbXB1dGVkIHByb3BlcnR5ICcke2V9Jy5gKTp0Ll9jcmVhdGVDb21wdXRlZFByb3BlcnR5KGUsbi5jb21wdXRlZCxpKSksbi5yZWFkT25seSYmIXQuX2hhc1JlYWRPbmx5RWZmZWN0KGUpP3QuX2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkoZSwhbi5jb21wdXRlZCk6ITE9PT1uLnJlYWRPbmx5JiZ0Ll9oYXNSZWFkT25seUVmZmVjdChlKSYmY29uc29sZS53YXJuKGBDYW5ub3QgbWFrZSByZWFkT25seSBwcm9wZXJ0eSAnJHtlfScgbm9uLXJlYWRPbmx5LmApLG4ucmVmbGVjdFRvQXR0cmlidXRlJiYhdC5faGFzUmVmbGVjdEVmZmVjdChlKT90Ll9jcmVhdGVSZWZsZWN0ZWRQcm9wZXJ0eShlKTohMT09PW4ucmVmbGVjdFRvQXR0cmlidXRlJiZ0Ll9oYXNSZWZsZWN0RWZmZWN0KGUpJiZjb25zb2xlLndhcm4oYENhbm5vdCBtYWtlIHJlZmxlY3RlZCBwcm9wZXJ0eSAnJHtlfScgbm9uLXJlZmxlY3RlZC5gKSxuLm5vdGlmeSYmIXQuX2hhc05vdGlmeUVmZmVjdChlKT90Ll9jcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eShlKTohMT09PW4ubm90aWZ5JiZ0Ll9oYXNOb3RpZnlFZmZlY3QoZSkmJmNvbnNvbGUud2FybihgQ2Fubm90IG1ha2Ugbm90aWZ5IHByb3BlcnR5ICcke2V9JyBub24tbm90aWZ5LmApLG4ub2JzZXJ2ZXImJnQuX2NyZWF0ZVByb3BlcnR5T2JzZXJ2ZXIoZSxuLm9ic2VydmVyLGlbbi5vYnNlcnZlcl0pLHQuX2FkZFByb3BlcnR5VG9BdHRyaWJ1dGVNYXAoZSl9ZnVuY3Rpb24gaSh0LGUsbixpKXtpZighX2Upe2NvbnN0IHI9ZS5jb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoInN0eWxlIiksbz1HKGUpLGE9KGZ1bmN0aW9uIHIodCl7bGV0IGU9Rih0KTtyZXR1cm4gZT9XKGUpOltdfSkobikscz1lLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQ7Zm9yKGxldCBuPTA7bjxhLmxlbmd0aDtuKyspe2xldCByPWFbbl07ci50ZXh0Q29udGVudD10Ll9wcm9jZXNzU3R5bGVUZXh0KHIudGV4dENvbnRlbnQsaSksZS5jb250ZW50Lmluc2VydEJlZm9yZShyLHMpfWxldCBsPTA7Zm9yKGxldCBlPTA7ZTxvLmxlbmd0aDtlKyspe2xldCBuPW9bZV0sYT1yW2xdO2EhPT1uPyhuPW4uY2xvbmVOb2RlKCEwKSxhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG4sYSkpOmwrKyxuLnRleHRDb250ZW50PXQuX3Byb2Nlc3NTdHlsZVRleHQobi50ZXh0Q29udGVudCxpKX19aWYod2luZG93LlNoYWR5Q1NTJiZ3aW5kb3cuU2hhZHlDU1MucHJlcGFyZVRlbXBsYXRlKGUsbiksUCYmX2UmJmcpe2NvbnN0IG49ZS5jb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoInN0eWxlIik7aWYobil7bGV0IGU9IiI7QXJyYXkuZnJvbShuKS5mb3JFYWNoKCh0PT57ZSs9dC50ZXh0Q29udGVudCx0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCl9KSksdC5fc3R5bGVTaGVldD1uZXcgQ1NTU3R5bGVTaGVldCx0Ll9zdHlsZVNoZWV0LnJlcGxhY2VTeW5jKGUpfX19cmV0dXJuIGNsYXNzIGV4dGVuZHMgZXtzdGF0aWMgZ2V0IHBvbHltZXJFbGVtZW50VmVyc2lvbigpe3JldHVybiIzLjQuMSJ9c3RhdGljIF9maW5hbGl6ZUNsYXNzKCl7ZS5fZmluYWxpemVDbGFzcy5jYWxsKHRoaXMpO2NvbnN0IHQ9KGZ1bmN0aW9uIG4odCl7cmV0dXJuIHQuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgiX19vd25PYnNlcnZlcnMiLHQpKXx8KHQuX19vd25PYnNlcnZlcnM9dC5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJvYnNlcnZlcnMiLHQpKT90Lm9ic2VydmVyczpudWxsKSx0Ll9fb3duT2JzZXJ2ZXJzfSkodGhpcyk7dCYmdGhpcy5jcmVhdGVPYnNlcnZlcnModCx0aGlzLl9wcm9wZXJ0aWVzKSx0aGlzLl9wcmVwYXJlVGVtcGxhdGUoKX1zdGF0aWMgX3ByZXBhcmVUZW1wbGF0ZSgpe2xldCB0PXRoaXMudGVtcGxhdGU7dCYmKCJzdHJpbmciPT10eXBlb2YgdD8oY29uc29sZS5lcnJvcigidGVtcGxhdGUgZ2V0dGVyIG11c3QgcmV0dXJuIEhUTUxUZW1wbGF0ZUVsZW1lbnQiKSx0PW51bGwpOnd8fCh0PXQuY2xvbmVOb2RlKCEwKSkpLHRoaXMucHJvdG90eXBlLl90ZW1wbGF0ZT10fXN0YXRpYyBjcmVhdGVQcm9wZXJ0aWVzKHQpe2ZvcihsZXQgZSBpbiB0KW4odGhpcy5wcm90b3R5cGUsZSx0W2VdLHQpfXN0YXRpYyBjcmVhdGVPYnNlcnZlcnModCxlKXtjb25zdCBuPXRoaXMucHJvdG90eXBlO2ZvcihsZXQgaT0wO2k8dC5sZW5ndGg7aSsrKW4uX2NyZWF0ZU1ldGhvZE9ic2VydmVyKHRbaV0sZSl9c3RhdGljIGdldCB0ZW1wbGF0ZSgpe2lmKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIl90ZW1wbGF0ZSIsdGhpcykpKXtjb25zdCB0PXRoaXMucHJvdG90eXBlLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIl90ZW1wbGF0ZSIsdGhpcy5wcm90b3R5cGUpKT90aGlzLnByb3RvdHlwZS5fdGVtcGxhdGU6dm9pZCAwO3RoaXMuX3RlbXBsYXRlPXZvaWQgMCE9PXQ/dDp0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoImlzIix0aGlzKSkmJihmdW5jdGlvbiBlKHQpe2xldCBlPW51bGw7aWYodCYmKCFifHx4KSYmKGU9Qi5pbXBvcnQodCwidGVtcGxhdGUiKSxiJiYhZSkpdGhyb3cgbmV3IEVycm9yKGBzdHJpY3RUZW1wbGF0ZVBvbGljeTogZXhwZWN0aW5nIGRvbS1tb2R1bGUgb3IgbnVsbCB0ZW1wbGF0ZSBmb3IgJHt0fWApO3JldHVybiBlfSkodGhpcy5pcyl8fE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzLnByb3RvdHlwZSkuY29uc3RydWN0b3IudGVtcGxhdGV9cmV0dXJuIHRoaXMuX3RlbXBsYXRlfXN0YXRpYyBzZXQgdGVtcGxhdGUodCl7dGhpcy5fdGVtcGxhdGU9dH1zdGF0aWMgZ2V0IGltcG9ydFBhdGgoKXtpZighdGhpcy5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJfaW1wb3J0UGF0aCIsdGhpcykpKXtjb25zdCB0PXRoaXMuaW1wb3J0TWV0YTtpZih0KXRoaXMuX2ltcG9ydFBhdGg9Zih0LnVybCk7ZWxzZXtjb25zdCB0PUIuaW1wb3J0KHRoaXMuaXMpO3RoaXMuX2ltcG9ydFBhdGg9dCYmdC5hc3NldHBhdGh8fE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzLnByb3RvdHlwZSkuY29uc3RydWN0b3IuaW1wb3J0UGF0aH19cmV0dXJuIHRoaXMuX2ltcG9ydFBhdGh9Y29uc3RydWN0b3IoKXtzdXBlcigpfV9pbml0aWFsaXplUHJvcGVydGllcygpe3RoaXMuY29uc3RydWN0b3IuZmluYWxpemUoKSx0aGlzLmNvbnN0cnVjdG9yLl9maW5hbGl6ZVRlbXBsYXRlKHRoaXMubG9jYWxOYW1lKSxzdXBlci5faW5pdGlhbGl6ZVByb3BlcnRpZXMoKSx0aGlzLnJvb3RQYXRoPV8sdGhpcy5pbXBvcnRQYXRoPXRoaXMuY29uc3RydWN0b3IuaW1wb3J0UGF0aDtsZXQgdD0oZnVuY3Rpb24gZSh0KXtpZighdC5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJfX3Byb3BlcnR5RGVmYXVsdHMiLHQpKSl7dC5fX3Byb3BlcnR5RGVmYXVsdHM9bnVsbDtsZXQgZT10Ll9wcm9wZXJ0aWVzO2ZvcihsZXQgbiBpbiBlKXtsZXQgaT1lW25dOyJ2YWx1ZSJpbiBpJiYodC5fX3Byb3BlcnR5RGVmYXVsdHM9dC5fX3Byb3BlcnR5RGVmYXVsdHN8fHt9LHQuX19wcm9wZXJ0eURlZmF1bHRzW25dPWkpfX1yZXR1cm4gdC5fX3Byb3BlcnR5RGVmYXVsdHN9KSh0aGlzLmNvbnN0cnVjdG9yKTtpZih0KWZvcihsZXQgZSBpbiB0KXtsZXQgbj10W2VdO2lmKHRoaXMuX2NhbkFwcGx5UHJvcGVydHlEZWZhdWx0KGUpKXtsZXQgdD0iZnVuY3Rpb24iPT10eXBlb2Ygbi52YWx1ZT9uLnZhbHVlLmNhbGwodGhpcyk6bi52YWx1ZTt0aGlzLl9oYXNBY2Nlc3NvcihlKT90aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkoZSx0LCEwKTp0aGlzW2VdPXR9fX1fY2FuQXBwbHlQcm9wZXJ0eURlZmF1bHQodCl7cmV0dXJuIXRoaXMuaGFzT3duUHJvcGVydHkodCl9c3RhdGljIF9wcm9jZXNzU3R5bGVUZXh0KHQsZSl7cmV0dXJuIHAodCxlKX1zdGF0aWMgX2ZpbmFsaXplVGVtcGxhdGUodCl7Y29uc3QgZT10aGlzLnByb3RvdHlwZS5fdGVtcGxhdGU7aWYoZSYmIWUuX19wb2x5bWVyRmluYWxpemVkKXtlLl9fcG9seW1lckZpbmFsaXplZD0hMDtjb25zdCBuPXRoaXMuaW1wb3J0UGF0aDtpKHRoaXMsZSx0LG4/ZChuKToiIiksdGhpcy5wcm90b3R5cGUuX2JpbmRUZW1wbGF0ZShlKX19Y29ubmVjdGVkQ2FsbGJhY2soKXt3aW5kb3cuU2hhZHlDU1MmJnRoaXMuX3RlbXBsYXRlJiZ3aW5kb3cuU2hhZHlDU1Muc3R5bGVFbGVtZW50KHRoaXMpLHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCl9cmVhZHkoKXt0aGlzLl90ZW1wbGF0ZSYmKHRoaXMucm9vdD10aGlzLl9zdGFtcFRlbXBsYXRlKHRoaXMuX3RlbXBsYXRlKSx0aGlzLiQ9dGhpcy5yb290LiQpLHN1cGVyLnJlYWR5KCl9X3JlYWR5Q2xpZW50cygpe3RoaXMuX3RlbXBsYXRlJiYodGhpcy5yb290PXRoaXMuX2F0dGFjaERvbSh0aGlzLnJvb3QpKSxzdXBlci5fcmVhZHlDbGllbnRzKCl9X2F0dGFjaERvbSh0KXtjb25zdCBlPVkodGhpcyk7aWYoZS5hdHRhY2hTaGFkb3cpcmV0dXJuIHQ/KGUuc2hhZG93Um9vdHx8KGUuYXR0YWNoU2hhZG93KHttb2RlOiJvcGVuIixzaGFkeVVwZ3JhZGVGcmFnbWVudDp0fSksZS5zaGFkb3dSb290LmFwcGVuZENoaWxkKHQpLHRoaXMuY29uc3RydWN0b3IuX3N0eWxlU2hlZXQmJihlLnNoYWRvd1Jvb3QuYWRvcHRlZFN0eWxlU2hlZXRzPVt0aGlzLmNvbnN0cnVjdG9yLl9zdHlsZVNoZWV0XSkpLE0mJndpbmRvdy5TaGFkeURPTSYmd2luZG93LlNoYWR5RE9NLmZsdXNoSW5pdGlhbChlLnNoYWRvd1Jvb3QpLGUuc2hhZG93Um9vdCk6bnVsbDt0aHJvdyBuZXcgRXJyb3IoIlNoYWRvd0RPTSBub3QgYXZhaWxhYmxlLiBQb2x5bWVyRWxlbWVudCBjYW4gY3JlYXRlIGRvbSBhcyBjaGlsZHJlbiBpbnN0ZWFkIG9mIGluIFNoYWRvd0RPTSBieSBzZXR0aW5nIGB0aGlzLnJvb3QgPSB0aGlzO2AgYmVmb3JlIGByZWFkeWAuIil9dXBkYXRlU3R5bGVzKHQpe3dpbmRvdy5TaGFkeUNTUyYmd2luZG93LlNoYWR5Q1NTLnN0eWxlU3VidHJlZSh0aGlzLHQpfXJlc29sdmVVcmwodCxlKXtyZXR1cm4hZSYmdGhpcy5pbXBvcnRQYXRoJiYoZT1kKHRoaXMuaW1wb3J0UGF0aCkpLGQodCxlKX1zdGF0aWMgX3BhcnNlVGVtcGxhdGVDb250ZW50KHQsbixpKXtyZXR1cm4gbi5keW5hbWljRm5zPW4uZHluYW1pY0Zuc3x8dGhpcy5fcHJvcGVydGllcyxlLl9wYXJzZVRlbXBsYXRlQ29udGVudC5jYWxsKHRoaXMsdCxuLGkpfXN0YXRpYyBfYWRkVGVtcGxhdGVQcm9wZXJ0eUVmZmVjdCh0LG4saSl7cmV0dXJuIVN8fG4gaW4gdGhpcy5fcHJvcGVydGllc3x8aS5pbmZvLnBhcnQuc2lnbmF0dXJlJiZpLmluZm8ucGFydC5zaWduYXR1cmUuc3RhdGljfHxpLmluZm8ucGFydC5ob3N0UHJvcHx8dC5uZXN0ZWRUZW1wbGF0ZXx8Y29uc29sZS53YXJuKGBQcm9wZXJ0eSAnJHtufScgdXNlZCBpbiB0ZW1wbGF0ZSBidXQgbm90IGRlY2xhcmVkIGluICdwcm9wZXJ0aWVzJzsgYXR0cmlidXRlIHdpbGwgbm90IGJlIG9ic2VydmVkLmApLGUuX2FkZFRlbXBsYXRlUHJvcGVydHlFZmZlY3QuY2FsbCh0aGlzLHQsbixpKX19fSkpOwovKioKICAgICAqIEBmaWxlb3ZlcnZpZXcKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tQcm90b3R5cGFsVHlwZXN9CiAgICAgKiBAbGljZW5zZSBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZAogICAgICogYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heQogICAgICogYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieQogICAgICogR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUAogICAgICogcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgICovCi8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNsYXNzIHZle2NvbnN0cnVjdG9yKHQpe3RoaXMudmFsdWU9dC50b1N0cmluZygpfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMudmFsdWV9fWZ1bmN0aW9uIGJlKHQpe2lmKHQgaW5zdGFuY2VvZiBIVE1MVGVtcGxhdGVFbGVtZW50KXJldHVybiB0LmlubmVySFRNTDtpZih0IGluc3RhbmNlb2YgdmUpcmV0dXJuKGZ1bmN0aW9uIGUodCl7aWYodCBpbnN0YW5jZW9mIHZlKXJldHVybiB0LnZhbHVlO3Rocm93IG5ldyBFcnJvcihgbm9uLWxpdGVyYWwgdmFsdWUgcGFzc2VkIHRvIFBvbHltZXIncyBodG1sTGl0ZXJhbCBmdW5jdGlvbjogJHt0fWApfSkodCk7dGhyb3cgbmV3IEVycm9yKGBub24tdGVtcGxhdGUgdmFsdWUgcGFzc2VkIHRvIFBvbHltZXIncyBodG1sIGZ1bmN0aW9uOiAke3R9YCl9Y29uc3QgeGU9ZnVuY3Rpb24gdChlLC4uLm4pe2NvbnN0IGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTtyZXR1cm4gaS5pbm5lckhUTUw9bi5yZWR1Y2UoKCh0LG4saSk9PnQrYmUobikrZVtpKzFdKSxlWzBdKSxpfSx3ZT15ZShIVE1MRWxlbWVudCk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovdmFyIFNlPSJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsVGhpcz9nbG9iYWxUaGlzOiJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93P3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIGdsb2JhbD9nbG9iYWw6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmP3NlbGY6e307ZnVuY3Rpb24gTWUodCl7aWYodC5fX2VzTW9kdWxlKXJldHVybiB0O3ZhciBlPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciBpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxuKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxuLGkuZ2V0P2k6e2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRbbl19fSl9KSksZX12YXIgRWUsVGUsQ2U9e2V4cG9ydHM6e319OwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBMb2Rhc2ggPGh0dHBzOi8vbG9kYXNoLmNvbS8+CiAgICAgKiBDb3B5cmlnaHQgT3BlbkpTIEZvdW5kYXRpb24gYW5kIG90aGVyIGNvbnRyaWJ1dG9ycyA8aHR0cHM6Ly9vcGVuanNmLm9yZy8+CiAgICAgKiBSZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZSA8aHR0cHM6Ly9sb2Rhc2guY29tL2xpY2Vuc2U+CiAgICAgKiBCYXNlZCBvbiBVbmRlcnNjb3JlLmpzIDEuOC4zIDxodHRwOi8vdW5kZXJzY29yZWpzLm9yZy9MSUNFTlNFPgogICAgICogQ29weXJpZ2h0IEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBhbmQgSW52ZXN0aWdhdGl2ZSBSZXBvcnRlcnMgJiBFZGl0b3JzCiAgICAgKi9FZT1DZSxUZT1DZS5leHBvcnRzLGZ1bmN0aW9uKCl7dmFyIHQsZT0iRXhwZWN0ZWQgYSBmdW5jdGlvbiIsbj0iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyIsaT0iX19sb2Rhc2hfcGxhY2Vob2xkZXJfXyIscj0xNixvPTMyLGE9NjQscz0xMjgsbD0yNTYsYz0xLzAsdT05MDA3MTk5MjU0NzQwOTkxLGg9TmFOLGQ9NDI5NDk2NzI5NSxwPVtbImFyeSIsc10sWyJiaW5kIiwxXSxbImJpbmRLZXkiLDJdLFsiY3VycnkiLDhdLFsiY3VycnlSaWdodCIscl0sWyJmbGlwIiw1MTJdLFsicGFydGlhbCIsb10sWyJwYXJ0aWFsUmlnaHQiLGFdLFsicmVhcmciLGxdXSxmPSJbb2JqZWN0IEFyZ3VtZW50c10iLG09IltvYmplY3QgQXJyYXldIixnPSJbb2JqZWN0IEJvb2xlYW5dIixfPSJbb2JqZWN0IERhdGVdIix5PSJbb2JqZWN0IEVycm9yXSIsdj0iW29iamVjdCBGdW5jdGlvbl0iLGI9IltvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dIix4PSJbb2JqZWN0IE1hcF0iLHc9IltvYmplY3QgTnVtYmVyXSIsUz0iW29iamVjdCBPYmplY3RdIixNPSJbb2JqZWN0IFByb21pc2VdIixFPSJbb2JqZWN0IFJlZ0V4cF0iLFQ9IltvYmplY3QgU2V0XSIsQz0iW29iamVjdCBTdHJpbmddIixBPSJbb2JqZWN0IFN5bWJvbF0iLGs9IltvYmplY3QgV2Vha01hcF0iLEw9IltvYmplY3QgQXJyYXlCdWZmZXJdIixQPSJbb2JqZWN0IERhdGFWaWV3XSIsTj0iW29iamVjdCBGbG9hdDMyQXJyYXldIixJPSJbb2JqZWN0IEZsb2F0NjRBcnJheV0iLFI9IltvYmplY3QgSW50OEFycmF5XSIsTz0iW29iamVjdCBJbnQxNkFycmF5XSIsej0iW29iamVjdCBJbnQzMkFycmF5XSIsRD0iW29iamVjdCBVaW50OEFycmF5XSIsQj0iW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iLEg9IltvYmplY3QgVWludDE2QXJyYXldIixGPSJbb2JqZWN0IFVpbnQzMkFycmF5XSIsVj0vXGJfX3AgXCs9ICcnOy9nLFU9L1xiKF9fcCBcKz0pICcnIFwrL2csaj0vKF9fZVwoLio/XCl8XGJfX3RcKSkgXCtcbicnOy9nLEc9LyYoPzphbXB8bHR8Z3R8cXVvdHwjMzkpOy9nLFc9L1smPD4iJ10vZyxxPVJlZ0V4cChHLnNvdXJjZSksWT1SZWdFeHAoVy5zb3VyY2UpLFg9LzwlLShbXHNcU10rPyklPi9nLCQ9LzwlKFtcc1xTXSs/KSU+L2csSz0vPCU9KFtcc1xTXSs/KSU+L2csWj0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyxKPS9eXHcqJC8sUT0vW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZyx0dD0vW1xcXiQuKis/KClbXF17fXxdL2csZXQ9UmVnRXhwKHR0LnNvdXJjZSksbnQ9L15ccysvLGl0PS9ccy8scnQ9L1x7KD86XG5cL1wqIFxbd3JhcHBlZCB3aXRoIC4rXF0gXCpcLyk/XG4/LyxvdD0vXHtcblwvXCogXFt3cmFwcGVkIHdpdGggKC4rKVxdIFwqLyxhdD0vLD8gJiAvLHN0PS9bXlx4MDAtXHgyZlx4M2EtXHg0MFx4NWItXHg2MFx4N2ItXHg3Zl0rL2csbHQ9L1soKT0se31cW1xdXC9cc10vLGN0PS9cXChcXCk/L2csdXQ9L1wkXHsoW15cXH1dKig/OlxcLlteXFx9XSopKilcfS9nLGh0PS9cdyokLyxkdD0vXlstK10weFswLTlhLWZdKyQvaSxwdD0vXjBiWzAxXSskL2ksZnQ9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sbXQ9L14wb1swLTddKyQvaSxndD0vXig/OjB8WzEtOV1cZCopJC8sX3Q9L1tceGMwLVx4ZDZceGQ4LVx4ZjZceGY4LVx4ZmZcdTAxMDAtXHUwMTdmXS9nLHl0PS8oJF4pLyx2dD0vWydcblxyXHUyMDI4XHUyMDI5XFxdL2csYnQ9IlxcdTAzMDAtXFx1MDM2ZlxcdWZlMjAtXFx1ZmUyZlxcdTIwZDAtXFx1MjBmZiIseHQ9IlxcdTI3MDAtXFx1MjdiZiIsd3Q9ImEtelxceGRmLVxceGY2XFx4ZjgtXFx4ZmYiLFN0PSJBLVpcXHhjMC1cXHhkNlxceGQ4LVxceGRlIixNdD0iXFx1ZmUwZVxcdWZlMGYiLEV0PSJcXHhhY1xceGIxXFx4ZDdcXHhmN1xceDAwLVxceDJmXFx4M2EtXFx4NDBcXHg1Yi1cXHg2MFxceDdiLVxceGJmXFx1MjAwMC1cXHUyMDZmIFxcdFxceDBiXFxmXFx4YTBcXHVmZWZmXFxuXFxyXFx1MjAyOFxcdTIwMjlcXHUxNjgwXFx1MTgwZVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBhXFx1MjAyZlxcdTIwNWZcXHUzMDAwIixUdD0iWyfigJldIixDdD0iW1xcdWQ4MDAtXFx1ZGZmZl0iLEF0PSJbIitFdCsiXSIsa3Q9IlsiK2J0KyJdIixMdD0iXFxkKyIsUHQ9IltcXHUyNzAwLVxcdTI3YmZdIixOdD0iWyIrd3QrIl0iLEl0PSJbXlxcdWQ4MDAtXFx1ZGZmZiIrRXQrTHQreHQrd3QrU3QrIl0iLFJ0PSJcXHVkODNjW1xcdWRmZmItXFx1ZGZmZl0iLE90PSJbXlxcdWQ4MDAtXFx1ZGZmZl0iLHp0PSIoPzpcXHVkODNjW1xcdWRkZTYtXFx1ZGRmZl0pezJ9IixEdD0iW1xcdWQ4MDAtXFx1ZGJmZl1bXFx1ZGMwMC1cXHVkZmZmXSIsQnQ9IlsiK1N0KyJdIixIdD0iKD86IitOdCsifCIrSXQrIikiLEZ0PSIoPzoiK0J0KyJ8IitJdCsiKSIsVnQ9Iig/Olsn4oCZXSg/OmR8bGx8bXxyZXxzfHR8dmUpKT8iLFV0PSIoPzpbJ+KAmV0oPzpEfExMfE18UkV8U3xUfFZFKSk/IixqdD0iKD86IitrdCsifCIrUnQrIik/IixHdD0iW1xcdWZlMGVcXHVmZTBmXT8iLFd0PUd0K2p0KyIoPzpcXHUyMDBkKD86IitbT3QsenQsRHRdLmpvaW4oInwiKSsiKSIrR3QranQrIikqIixxdD0iKD86IitbUHQsenQsRHRdLmpvaW4oInwiKSsiKSIrV3QsWXQ9Iig/OiIrW090K2t0KyI/IixrdCx6dCxEdCxDdF0uam9pbigifCIpKyIpIixYdD1SZWdFeHAoVHQsImciKSwkdD1SZWdFeHAoa3QsImciKSxLdD1SZWdFeHAoUnQrIig/PSIrUnQrIil8IitZdCtXdCwiZyIpLFp0PVJlZ0V4cChbQnQrIj8iK050KyIrIitWdCsiKD89IitbQXQsQnQsIiQiXS5qb2luKCJ8IikrIikiLEZ0KyIrIitVdCsiKD89IitbQXQsQnQrSHQsIiQiXS5qb2luKCJ8IikrIikiLEJ0KyI/IitIdCsiKyIrVnQsQnQrIisiK1V0LCJcXGQqKD86MVNUfDJORHwzUkR8KD8hWzEyM10pXFxkVEgpKD89XFxifFthLXpfXSkiLCJcXGQqKD86MXN0fDJuZHwzcmR8KD8hWzEyM10pXFxkdGgpKD89XFxifFtBLVpfXSkiLEx0LHF0XS5qb2luKCJ8IiksImciKSxKdD1SZWdFeHAoIltcXHUyMDBkXFx1ZDgwMC1cXHVkZmZmIitidCtNdCsiXSIpLFF0PS9bYS16XVtBLVpdfFtBLVpdezJ9W2Etel18WzAtOV1bYS16QS1aXXxbYS16QS1aXVswLTldfFteYS16QS1aMC05IF0vLHRlPVsiQXJyYXkiLCJCdWZmZXIiLCJEYXRhVmlldyIsIkRhdGUiLCJFcnJvciIsIkZsb2F0MzJBcnJheSIsIkZsb2F0NjRBcnJheSIsIkZ1bmN0aW9uIiwiSW50OEFycmF5IiwiSW50MTZBcnJheSIsIkludDMyQXJyYXkiLCJNYXAiLCJNYXRoIiwiT2JqZWN0IiwiUHJvbWlzZSIsIlJlZ0V4cCIsIlNldCIsIlN0cmluZyIsIlN5bWJvbCIsIlR5cGVFcnJvciIsIlVpbnQ4QXJyYXkiLCJVaW50OENsYW1wZWRBcnJheSIsIlVpbnQxNkFycmF5IiwiVWludDMyQXJyYXkiLCJXZWFrTWFwIiwiXyIsImNsZWFyVGltZW91dCIsImlzRmluaXRlIiwicGFyc2VJbnQiLCJzZXRUaW1lb3V0Il0sZWU9LTEsbmU9e307bmVbTl09bmVbSV09bmVbUl09bmVbT109bmVbel09bmVbRF09bmVbQl09bmVbSF09bmVbRl09ITAsbmVbZl09bmVbbV09bmVbTF09bmVbZ109bmVbUF09bmVbX109bmVbeV09bmVbdl09bmVbeF09bmVbd109bmVbU109bmVbRV09bmVbVF09bmVbQ109bmVba109ITE7dmFyIGllPXt9O2llW2ZdPWllW21dPWllW0xdPWllW1BdPWllW2ddPWllW19dPWllW05dPWllW0ldPWllW1JdPWllW09dPWllW3pdPWllW3hdPWllW3ddPWllW1NdPWllW0VdPWllW1RdPWllW0NdPWllW0FdPWllW0RdPWllW0JdPWllW0hdPWllW0ZdPSEwLGllW3ldPWllW3ZdPWllW2tdPSExO3ZhciByZT17IlxcIjoiXFwiLCInIjoiJyIsIlxuIjoibiIsIlxyIjoiciIsIlx1MjAyOCI6InUyMDI4IiwiXHUyMDI5IjoidTIwMjkifSxvZT1wYXJzZUZsb2F0LGFlPXBhcnNlSW50LHNlPSJvYmplY3QiPT10eXBlb2YgU2UmJlNlJiZTZS5PYmplY3Q9PT1PYmplY3QmJlNlLGxlPSJvYmplY3QiPT10eXBlb2Ygc2VsZiYmc2VsZiYmc2VsZi5PYmplY3Q9PT1PYmplY3QmJnNlbGYsY2U9c2V8fGxlfHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpLHVlPVRlJiYhVGUubm9kZVR5cGUmJlRlLGhlPXVlJiZFZSYmIUVlLm5vZGVUeXBlJiZFZSxkZT1oZSYmaGUuZXhwb3J0cz09PXVlLHBlPWRlJiZzZS5wcm9jZXNzLGZlPShmdW5jdGlvbigpe3RyeXt2YXIgdD1oZSYmaGUucmVxdWlyZSYmaGUucmVxdWlyZSgidXRpbCIpLnR5cGVzO3JldHVybiB0fHxwZSYmcGUuYmluZGluZyYmcGUuYmluZGluZygidXRpbCIpfWNhdGNoKHQpe319KSgpLG1lPWZlJiZmZS5pc0FycmF5QnVmZmVyLGdlPWZlJiZmZS5pc0RhdGUsX2U9ZmUmJmZlLmlzTWFwLHllPWZlJiZmZS5pc1JlZ0V4cCx2ZT1mZSYmZmUuaXNTZXQsYmU9ZmUmJmZlLmlzVHlwZWRBcnJheTtmdW5jdGlvbiB4ZSh0LGUsbil7c3dpdGNoKG4ubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIHQuY2FsbChlKTtjYXNlIDE6cmV0dXJuIHQuY2FsbChlLG5bMF0pO2Nhc2UgMjpyZXR1cm4gdC5jYWxsKGUsblswXSxuWzFdKTtjYXNlIDM6cmV0dXJuIHQuY2FsbChlLG5bMF0sblsxXSxuWzJdKX1yZXR1cm4gdC5hcHBseShlLG4pfWZ1bmN0aW9uIHdlKHQsZSxuLGkpe2Zvcih2YXIgcj0tMSxvPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK3I8bzspe3ZhciBhPXRbcl07ZShpLGEsbihhKSx0KX1yZXR1cm4gaX1mdW5jdGlvbiBNZSh0LGUpe2Zvcih2YXIgbj0tMSxpPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK248aSYmITEhPT1lKHRbbl0sbix0KTspO3JldHVybiB0fWZ1bmN0aW9uIENlKHQsZSl7Zm9yKHZhciBuPW51bGw9PXQ/MDp0Lmxlbmd0aDtuLS0mJiExIT09ZSh0W25dLG4sdCk7KTtyZXR1cm4gdH1mdW5jdGlvbiBBZSh0LGUpe2Zvcih2YXIgbj0tMSxpPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK248aTspaWYoIWUodFtuXSxuLHQpKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIGtlKHQsZSl7Zm9yKHZhciBuPS0xLGk9bnVsbD09dD8wOnQubGVuZ3RoLHI9MCxvPVtdOysrbjxpOyl7dmFyIGE9dFtuXTtlKGEsbix0KSYmKG9bcisrXT1hKX1yZXR1cm4gb31mdW5jdGlvbiBMZSh0LGUpe3JldHVybiEobnVsbD09dHx8IXQubGVuZ3RoKSYmRmUodCxlLDApPi0xfWZ1bmN0aW9uIFBlKHQsZSxuKXtmb3IodmFyIGk9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7KytpPHI7KWlmKG4oZSx0W2ldKSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBOZSh0LGUpe2Zvcih2YXIgbj0tMSxpPW51bGw9PXQ/MDp0Lmxlbmd0aCxyPUFycmF5KGkpOysrbjxpOylyW25dPWUodFtuXSxuLHQpO3JldHVybiByfWZ1bmN0aW9uIEllKHQsZSl7Zm9yKHZhciBuPS0xLGk9ZS5sZW5ndGgscj10Lmxlbmd0aDsrK248aTspdFtyK25dPWVbbl07cmV0dXJuIHR9ZnVuY3Rpb24gUmUodCxlLG4saSl7dmFyIHI9LTEsbz1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKGkmJm8mJihuPXRbKytyXSk7KytyPG87KW49ZShuLHRbcl0scix0KTtyZXR1cm4gbn1mdW5jdGlvbiBPZSh0LGUsbixpKXt2YXIgcj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKGkmJnImJihuPXRbLS1yXSk7ci0tOyluPWUobix0W3JdLHIsdCk7cmV0dXJuIG59ZnVuY3Rpb24gemUodCxlKXtmb3IodmFyIG49LTEsaT1udWxsPT10PzA6dC5sZW5ndGg7KytuPGk7KWlmKGUodFtuXSxuLHQpKXJldHVybiEwO3JldHVybiExfXZhciBEZT1HZSgibGVuZ3RoIik7ZnVuY3Rpb24gQmUodCxlLG4pe3ZhciBpO3JldHVybiBuKHQsKGZ1bmN0aW9uKHQsbixyKXtpZihlKHQsbixyKSlyZXR1cm4gaT1uLCExfSkpLGl9ZnVuY3Rpb24gSGUodCxlLG4saSl7Zm9yKHZhciByPXQubGVuZ3RoLG89bisoaT8xOi0xKTtpP28tLTorK288cjspaWYoZSh0W29dLG8sdCkpcmV0dXJuIG87cmV0dXJuLTF9ZnVuY3Rpb24gRmUodCxlLG4pe3JldHVybiBlPT1lPyhmdW5jdGlvbiBpKHQsZSxuKXtmb3IodmFyIGk9bi0xLHI9dC5sZW5ndGg7KytpPHI7KWlmKHRbaV09PT1lKXJldHVybiBpO3JldHVybi0xfSkodCxlLG4pOkhlKHQsVWUsbil9ZnVuY3Rpb24gVmUodCxlLG4saSl7Zm9yKHZhciByPW4tMSxvPXQubGVuZ3RoOysrcjxvOylpZihpKHRbcl0sZSkpcmV0dXJuIHI7cmV0dXJuLTF9ZnVuY3Rpb24gVWUodCl7cmV0dXJuIHQhPXR9ZnVuY3Rpb24gamUodCxlKXt2YXIgbj1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIG4/WWUodCxlKS9uOmh9ZnVuY3Rpb24gR2UoZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBudWxsPT1uP3Q6bltlXX19ZnVuY3Rpb24gV2UoZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBudWxsPT1lP3Q6ZVtuXX19ZnVuY3Rpb24gcWUodCxlLG4saSxyKXtyZXR1cm4gcih0LChmdW5jdGlvbih0LHIsbyl7bj1pPyhpPSExLHQpOmUobix0LHIsbyl9KSksbn1mdW5jdGlvbiBZZShlLG4pe2Zvcih2YXIgaSxyPS0xLG89ZS5sZW5ndGg7KytyPG87KXt2YXIgYT1uKGVbcl0pO2EhPT10JiYoaT1pPT09dD9hOmkrYSl9cmV0dXJuIGl9ZnVuY3Rpb24gWGUodCxlKXtmb3IodmFyIG49LTEsaT1BcnJheSh0KTsrK248dDspaVtuXT1lKG4pO3JldHVybiBpfWZ1bmN0aW9uICRlKHQpe3JldHVybiB0P3Quc2xpY2UoMCxmbih0KSsxKS5yZXBsYWNlKG50LCIiKTp0fWZ1bmN0aW9uIEtlKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdChlKX19ZnVuY3Rpb24gWmUodCxlKXtyZXR1cm4gTmUoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19KSl9ZnVuY3Rpb24gSmUodCxlKXtyZXR1cm4gdC5oYXMoZSl9ZnVuY3Rpb24gUWUodCxlKXtmb3IodmFyIG49LTEsaT10Lmxlbmd0aDsrK248aSYmRmUoZSx0W25dLDApPi0xOyk7cmV0dXJuIG59ZnVuY3Rpb24gdG4odCxlKXtmb3IodmFyIG49dC5sZW5ndGg7bi0tJiZGZShlLHRbbl0sMCk+LTE7KTtyZXR1cm4gbn1mdW5jdGlvbiBlbih0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aCxpPTA7bi0tOyl0W25dPT09ZSYmKytpO3JldHVybiBpfXZhciBubj1XZSh7IsOAIjoiQSIsIsOBIjoiQSIsIsOCIjoiQSIsIsODIjoiQSIsIsOEIjoiQSIsIsOFIjoiQSIsIsOgIjoiYSIsIsOhIjoiYSIsIsOiIjoiYSIsIsOjIjoiYSIsIsOkIjoiYSIsIsOlIjoiYSIsIsOHIjoiQyIsIsOnIjoiYyIsIsOQIjoiRCIsIsOwIjoiZCIsIsOIIjoiRSIsIsOJIjoiRSIsIsOKIjoiRSIsIsOLIjoiRSIsIsOoIjoiZSIsIsOpIjoiZSIsIsOqIjoiZSIsIsOrIjoiZSIsIsOMIjoiSSIsIsONIjoiSSIsIsOOIjoiSSIsIsOPIjoiSSIsIsOsIjoiaSIsIsOtIjoiaSIsIsOuIjoiaSIsIsOvIjoiaSIsIsORIjoiTiIsIsOxIjoibiIsIsOSIjoiTyIsIsOTIjoiTyIsIsOUIjoiTyIsIsOVIjoiTyIsIsOWIjoiTyIsIsOYIjoiTyIsIsOyIjoibyIsIsOzIjoibyIsIsO0IjoibyIsIsO1IjoibyIsIsO2IjoibyIsIsO4IjoibyIsIsOZIjoiVSIsIsOaIjoiVSIsIsObIjoiVSIsIsOcIjoiVSIsIsO5IjoidSIsIsO6IjoidSIsIsO7IjoidSIsIsO8IjoidSIsIsOdIjoiWSIsIsO9IjoieSIsIsO/IjoieSIsIsOGIjoiQWUiLCLDpiI6ImFlIiwiw54iOiJUaCIsIsO+IjoidGgiLCLDnyI6InNzIiwixIAiOiJBIiwixIIiOiJBIiwixIQiOiJBIiwixIEiOiJhIiwixIMiOiJhIiwixIUiOiJhIiwixIYiOiJDIiwixIgiOiJDIiwixIoiOiJDIiwixIwiOiJDIiwixIciOiJjIiwixIkiOiJjIiwixIsiOiJjIiwixI0iOiJjIiwixI4iOiJEIiwixJAiOiJEIiwixI8iOiJkIiwixJEiOiJkIiwixJIiOiJFIiwixJQiOiJFIiwixJYiOiJFIiwixJgiOiJFIiwixJoiOiJFIiwixJMiOiJlIiwixJUiOiJlIiwixJciOiJlIiwixJkiOiJlIiwixJsiOiJlIiwixJwiOiJHIiwixJ4iOiJHIiwixKAiOiJHIiwixKIiOiJHIiwixJ0iOiJnIiwixJ8iOiJnIiwixKEiOiJnIiwixKMiOiJnIiwixKQiOiJIIiwixKYiOiJIIiwixKUiOiJoIiwixKciOiJoIiwixKgiOiJJIiwixKoiOiJJIiwixKwiOiJJIiwixK4iOiJJIiwixLAiOiJJIiwixKkiOiJpIiwixKsiOiJpIiwixK0iOiJpIiwixK8iOiJpIiwixLEiOiJpIiwixLQiOiJKIiwixLUiOiJqIiwixLYiOiJLIiwixLciOiJrIiwixLgiOiJrIiwixLkiOiJMIiwixLsiOiJMIiwixL0iOiJMIiwixL8iOiJMIiwixYEiOiJMIiwixLoiOiJsIiwixLwiOiJsIiwixL4iOiJsIiwixYAiOiJsIiwixYIiOiJsIiwixYMiOiJOIiwixYUiOiJOIiwixYciOiJOIiwixYoiOiJOIiwixYQiOiJuIiwixYYiOiJuIiwixYgiOiJuIiwixYsiOiJuIiwixYwiOiJPIiwixY4iOiJPIiwixZAiOiJPIiwixY0iOiJvIiwixY8iOiJvIiwixZEiOiJvIiwixZQiOiJSIiwixZYiOiJSIiwixZgiOiJSIiwixZUiOiJyIiwixZciOiJyIiwixZkiOiJyIiwixZoiOiJTIiwixZwiOiJTIiwixZ4iOiJTIiwixaAiOiJTIiwixZsiOiJzIiwixZ0iOiJzIiwixZ8iOiJzIiwixaEiOiJzIiwixaIiOiJUIiwixaQiOiJUIiwixaYiOiJUIiwixaMiOiJ0IiwixaUiOiJ0IiwixaciOiJ0IiwixagiOiJVIiwixaoiOiJVIiwixawiOiJVIiwixa4iOiJVIiwixbAiOiJVIiwixbIiOiJVIiwixakiOiJ1IiwixasiOiJ1Iiwixa0iOiJ1Iiwixa8iOiJ1IiwixbEiOiJ1IiwixbMiOiJ1IiwixbQiOiJXIiwixbUiOiJ3IiwixbYiOiJZIiwixbciOiJ5IiwixbgiOiJZIiwixbkiOiJaIiwixbsiOiJaIiwixb0iOiJaIiwixboiOiJ6IiwixbwiOiJ6Iiwixb4iOiJ6IiwixLIiOiJJSiIsIsSzIjoiaWoiLCLFkiI6Ik9lIiwixZMiOiJvZSIsIsWJIjoiJ24iLCLFvyI6InMifSkscm49V2UoeyImIjoiJmFtcDsiLCI8IjoiJmx0OyIsIj4iOiImZ3Q7IiwnIic6IiZxdW90OyIsIiciOiImIzM5OyJ9KTtmdW5jdGlvbiBvbih0KXtyZXR1cm4iXFwiK3JlW3RdfWZ1bmN0aW9uIGFuKHQpe3JldHVybiBKdC50ZXN0KHQpfWZ1bmN0aW9uIHNuKHQpe3ZhciBlPS0xLG49QXJyYXkodC5zaXplKTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0LGkpe25bKytlXT1baSx0XX0pKSxufWZ1bmN0aW9uIGxuKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0KGUobikpfX1mdW5jdGlvbiBjbih0LGUpe2Zvcih2YXIgbj0tMSxyPXQubGVuZ3RoLG89MCxhPVtdOysrbjxyOyl7dmFyIHM9dFtuXTtzIT09ZSYmcyE9PWl8fCh0W25dPWksYVtvKytdPW4pfXJldHVybiBhfWZ1bmN0aW9uIHVuKHQpe3ZhciBlPS0xLG49QXJyYXkodC5zaXplKTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtuWysrZV09dH0pKSxufWZ1bmN0aW9uIGhuKHQpe3ZhciBlPS0xLG49QXJyYXkodC5zaXplKTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtuWysrZV09W3QsdF19KSksbn1mdW5jdGlvbiBkbih0KXtyZXR1cm4gYW4odCk/KGZ1bmN0aW9uIGUodCl7Zm9yKHZhciBlPUt0Lmxhc3RJbmRleD0wO0t0LnRlc3QodCk7KSsrZTtyZXR1cm4gZX0pKHQpOkRlKHQpfWZ1bmN0aW9uIHBuKHQpe3JldHVybiBhbih0KT8oZnVuY3Rpb24gZSh0KXtyZXR1cm4gdC5tYXRjaChLdCl8fFtdfSkodCk6KGZ1bmN0aW9uIG4odCl7cmV0dXJuIHQuc3BsaXQoIiIpfSkodCl9ZnVuY3Rpb24gZm4odCl7Zm9yKHZhciBlPXQubGVuZ3RoO2UtLSYmaXQudGVzdCh0LmNoYXJBdChlKSk7KTtyZXR1cm4gZX12YXIgbW49V2UoeyImYW1wOyI6IiYiLCImbHQ7IjoiPCIsIiZndDsiOiI+IiwiJnF1b3Q7IjonIicsIiYjMzk7IjoiJyJ9KSxnbj0oZnVuY3Rpb24gaXQoYnQpe3ZhciB4dCx3dD0oYnQ9bnVsbD09YnQ/Y2U6Z24uZGVmYXVsdHMoY2UuT2JqZWN0KCksYnQsZ24ucGljayhjZSx0ZSkpKS5BcnJheSxTdD1idC5EYXRlLE10PWJ0LkVycm9yLEV0PWJ0LkZ1bmN0aW9uLFR0PWJ0Lk1hdGgsQ3Q9YnQuT2JqZWN0LEF0PWJ0LlJlZ0V4cCxrdD1idC5TdHJpbmcsTHQ9YnQuVHlwZUVycm9yLFB0PXd0LnByb3RvdHlwZSxOdD1DdC5wcm90b3R5cGUsSXQ9YnRbIl9fY29yZS1qc19zaGFyZWRfXyJdLFJ0PUV0LnByb3RvdHlwZS50b1N0cmluZyxPdD1OdC5oYXNPd25Qcm9wZXJ0eSx6dD0wLER0PSh4dD0vW14uXSskLy5leGVjKEl0JiZJdC5rZXlzJiZJdC5rZXlzLklFX1BST1RPfHwiIikpPyJTeW1ib2woc3JjKV8xLiIreHQ6IiIsQnQ9TnQudG9TdHJpbmcsSHQ9UnQuY2FsbChDdCksRnQ9Y2UuXyxWdD1BdCgiXiIrUnQuY2FsbChPdCkucmVwbGFjZSh0dCwiXFwkJiIpLnJlcGxhY2UoL2hhc093blByb3BlcnR5fChmdW5jdGlvbikuKj8oPz1cXFwoKXwgZm9yIC4rPyg/PVxcXF0pL2csIiQxLio/IikrIiQiKSxVdD1kZT9idC5CdWZmZXI6dCxqdD1idC5TeW1ib2wsR3Q9YnQuVWludDhBcnJheSxXdD1VdD9VdC5hbGxvY1Vuc2FmZTp0LHF0PWxuKEN0LmdldFByb3RvdHlwZU9mLEN0KSxZdD1DdC5jcmVhdGUsS3Q9TnQucHJvcGVydHlJc0VudW1lcmFibGUsSnQ9UHQuc3BsaWNlLHJlPWp0P2p0LmlzQ29uY2F0U3ByZWFkYWJsZTp0LHNlPWp0P2p0Lml0ZXJhdG9yOnQsbGU9anQ/anQudG9TdHJpbmdUYWc6dCx1ZT0oZnVuY3Rpb24oKXt0cnl7dmFyIHQ9T28oQ3QsImRlZmluZVByb3BlcnR5Iik7cmV0dXJuIHQoe30sIiIse30pLHR9Y2F0Y2godCl7fX0pKCksaGU9YnQuY2xlYXJUaW1lb3V0IT09Y2UuY2xlYXJUaW1lb3V0JiZidC5jbGVhclRpbWVvdXQscGU9U3QmJlN0Lm5vdyE9PWNlLkRhdGUubm93JiZTdC5ub3csZmU9YnQuc2V0VGltZW91dCE9PWNlLnNldFRpbWVvdXQmJmJ0LnNldFRpbWVvdXQsU2U9VHQuY2VpbCxFZT1UdC5mbG9vcixUZT1DdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsRGU9VXQ/VXQuaXNCdWZmZXI6dCxXZT1idC5pc0Zpbml0ZSxfbj1QdC5qb2luLHluPWxuKEN0LmtleXMsQ3QpLHZuPVR0Lm1heCxibj1UdC5taW4seG49U3Qubm93LHduPWJ0LnBhcnNlSW50LFNuPVR0LnJhbmRvbSxNbj1QdC5yZXZlcnNlLEVuPU9vKGJ0LCJEYXRhVmlldyIpLFRuPU9vKGJ0LCJNYXAiKSxDbj1PbyhidCwiUHJvbWlzZSIpLEFuPU9vKGJ0LCJTZXQiKSxrbj1PbyhidCwiV2Vha01hcCIpLExuPU9vKEN0LCJjcmVhdGUiKSxQbj1rbiYmbmV3IGtuLE5uPXt9LEluPWNhKEVuKSxSbj1jYShUbiksT249Y2EoQ24pLHpuPWNhKEFuKSxEbj1jYShrbiksQm49anQ/anQucHJvdG90eXBlOnQsSG49Qm4/Qm4udmFsdWVPZjp0LEZuPUJuP0JuLnRvU3RyaW5nOnQ7ZnVuY3Rpb24gVm4odCl7aWYoQXModCkmJiFtcyh0KSYmISh0IGluc3RhbmNlb2YgV24pKXtpZih0IGluc3RhbmNlb2YgR24pcmV0dXJuIHQ7aWYoT3QuY2FsbCh0LCJfX3dyYXBwZWRfXyIpKXJldHVybiB1YSh0KX1yZXR1cm4gbmV3IEduKHQpfXZhciBVbj0oZnVuY3Rpb24oKXtmdW5jdGlvbiBlKCl7fXJldHVybiBmdW5jdGlvbihuKXtpZighQ3MobikpcmV0dXJue307aWYoWXQpcmV0dXJuIFl0KG4pO2UucHJvdG90eXBlPW47dmFyIGk9bmV3IGU7cmV0dXJuIGUucHJvdG90eXBlPXQsaX19KSgpO2Z1bmN0aW9uIGpuKCl7fWZ1bmN0aW9uIEduKGUsbil7dGhpcy5fX3dyYXBwZWRfXz1lLHRoaXMuX19hY3Rpb25zX189W10sdGhpcy5fX2NoYWluX189ISFuLHRoaXMuX19pbmRleF9fPTAsdGhpcy5fX3ZhbHVlc19fPXR9ZnVuY3Rpb24gV24odCl7dGhpcy5fX3dyYXBwZWRfXz10LHRoaXMuX19hY3Rpb25zX189W10sdGhpcy5fX2Rpcl9fPTEsdGhpcy5fX2ZpbHRlcmVkX189ITEsdGhpcy5fX2l0ZXJhdGVlc19fPVtdLHRoaXMuX190YWtlQ291bnRfXz1kLHRoaXMuX192aWV3c19fPVtdfWZ1bmN0aW9uIHFuKHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgaT10W2VdO3RoaXMuc2V0KGlbMF0saVsxXSl9fWZ1bmN0aW9uIFluKHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgaT10W2VdO3RoaXMuc2V0KGlbMF0saVsxXSl9fWZ1bmN0aW9uIFhuKHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgaT10W2VdO3RoaXMuc2V0KGlbMF0saVsxXSl9fWZ1bmN0aW9uICRuKHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLl9fZGF0YV9fPW5ldyBYbjsrK2U8bjspdGhpcy5hZGQodFtlXSl9ZnVuY3Rpb24gS24odCl7dmFyIGU9dGhpcy5fX2RhdGFfXz1uZXcgWW4odCk7dGhpcy5zaXplPWUuc2l6ZX1mdW5jdGlvbiBabih0LGUpe3ZhciBuPW1zKHQpLGk9IW4mJmZzKHQpLHI9IW4mJiFpJiZicyh0KSxvPSFuJiYhaSYmIXImJkhzKHQpLGE9bnx8aXx8cnx8byxzPWE/WGUodC5sZW5ndGgsa3QpOltdLGw9cy5sZW5ndGg7Zm9yKHZhciBjIGluIHQpIWUmJiFPdC5jYWxsKHQsYyl8fGEmJigibGVuZ3RoIj09Y3x8ciYmKCJvZmZzZXQiPT1jfHwicGFyZW50Ij09Yyl8fG8mJigiYnVmZmVyIj09Y3x8ImJ5dGVMZW5ndGgiPT1jfHwiYnl0ZU9mZnNldCI9PWMpfHxVbyhjLGwpKXx8cy5wdXNoKGMpO3JldHVybiBzfWZ1bmN0aW9uIEpuKGUpe3ZhciBuPWUubGVuZ3RoO3JldHVybiBuP2VbX3IoMCxuLTEpXTp0fWZ1bmN0aW9uIFFuKHQsZSl7cmV0dXJuIG9hKEpyKHQpLGxpKGUsMCx0Lmxlbmd0aCkpfWZ1bmN0aW9uIHRpKHQpe3JldHVybiBvYShKcih0KSl9ZnVuY3Rpb24gZWkoZSxuLGkpeyhpIT09dCYmIWhzKGVbbl0saSl8fGk9PT10JiYhKG4gaW4gZSkpJiZhaShlLG4saSl9ZnVuY3Rpb24gbmkoZSxuLGkpe3ZhciByPWVbbl07T3QuY2FsbChlLG4pJiZocyhyLGkpJiYoaSE9PXR8fG4gaW4gZSl8fGFpKGUsbixpKX1mdW5jdGlvbiBpaSh0LGUpe2Zvcih2YXIgbj10Lmxlbmd0aDtuLS07KWlmKGhzKHRbbl1bMF0sZSkpcmV0dXJuIG47cmV0dXJuLTF9ZnVuY3Rpb24gcmkodCxlLG4saSl7cmV0dXJuIE9pKHQsKGZ1bmN0aW9uKHQscixvKXtlKGksdCxuKHQpLG8pfSkpLGl9ZnVuY3Rpb24gb2kodCxlKXtyZXR1cm4gdCYmUXIoZSxsbChlKSx0KX1mdW5jdGlvbiBhaSh0LGUsbil7Il9fcHJvdG9fXyI9PWUmJnVlP3VlKHQsZSx7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6bix3cml0YWJsZTohMH0pOnRbZV09bn1mdW5jdGlvbiBzaShlLG4pe2Zvcih2YXIgaT0tMSxyPW4ubGVuZ3RoLG89d3QociksYT1udWxsPT1lOysraTxyOylvW2ldPWE/dDppbChlLG5baV0pO3JldHVybiBvfWZ1bmN0aW9uIGxpKGUsbixpKXtyZXR1cm4gZT09ZSYmKGkhPT10JiYoZT1lPD1pP2U6aSksbiE9PXQmJihlPWU+PW4/ZTpuKSksZX1mdW5jdGlvbiBjaShlLG4saSxyLG8sYSl7dmFyIHMsbD0xJm4sYz0yJm4sdT00Jm47aWYoaSYmKHM9bz9pKGUscixvLGEpOmkoZSkpLHMhPT10KXJldHVybiBzO2lmKCFDcyhlKSlyZXR1cm4gZTt2YXIgaD1tcyhlKTtpZihoKXtpZihzPShmdW5jdGlvbiBkKHQpe3ZhciBlPXQubGVuZ3RoLG49bmV3IHQuY29uc3RydWN0b3IoZSk7cmV0dXJuIGUmJiJzdHJpbmciPT10eXBlb2YgdFswXSYmT3QuY2FsbCh0LCJpbmRleCIpJiYobi5pbmRleD10LmluZGV4LG4uaW5wdXQ9dC5pbnB1dCksbn0pKGUpLCFsKXJldHVybiBKcihlLHMpfWVsc2V7dmFyIHA9Qm8oZSksbT1wPT12fHxwPT1iO2lmKGJzKGUpKXJldHVybiBxcihlLGwpO2lmKHA9PVN8fHA9PWZ8fG0mJiFvKXtpZihzPWN8fG0/e306Rm8oZSksIWwpcmV0dXJuIGM/KGZ1bmN0aW9uIE0odCxlKXtyZXR1cm4gUXIodCxEbyh0KSxlKX0pKGUsKGZ1bmN0aW9uIHkodCxlKXtyZXR1cm4gdCYmUXIoZSxjbChlKSx0KX0pKHMsZSkpOihmdW5jdGlvbiBrKHQsZSl7cmV0dXJuIFFyKHQsem8odCksZSl9KShlLG9pKHMsZSkpfWVsc2V7aWYoIWllW3BdKXJldHVybiBvP2U6e307cz0oZnVuY3Rpb24gVih0LGUsbil7dmFyIGk9dC5jb25zdHJ1Y3Rvcjtzd2l0Y2goZSl7Y2FzZSBMOnJldHVybiBZcih0KTtjYXNlIGc6Y2FzZSBfOnJldHVybiBuZXcgaSgrdCk7Y2FzZSBQOnJldHVybihmdW5jdGlvbiByKHQsZSl7dmFyIG49ZT9Zcih0LmJ1ZmZlcik6dC5idWZmZXI7cmV0dXJuIG5ldyB0LmNvbnN0cnVjdG9yKG4sdC5ieXRlT2Zmc2V0LHQuYnl0ZUxlbmd0aCl9KSh0LG4pO2Nhc2UgTjpjYXNlIEk6Y2FzZSBSOmNhc2UgTzpjYXNlIHo6Y2FzZSBEOmNhc2UgQjpjYXNlIEg6Y2FzZSBGOnJldHVybiBYcih0LG4pO2Nhc2UgeDpyZXR1cm4gbmV3IGk7Y2FzZSB3OmNhc2UgQzpyZXR1cm4gbmV3IGkodCk7Y2FzZSBFOnJldHVybihmdW5jdGlvbiBvKHQpe3ZhciBlPW5ldyB0LmNvbnN0cnVjdG9yKHQuc291cmNlLGh0LmV4ZWModCkpO3JldHVybiBlLmxhc3RJbmRleD10Lmxhc3RJbmRleCxlfSkodCk7Y2FzZSBUOnJldHVybiBuZXcgaTtjYXNlIEE6cmV0dXJuKGZ1bmN0aW9uIGEodCl7cmV0dXJuIEhuP0N0KEhuLmNhbGwodCkpOnt9fSkodCl9fSkoZSxwLGwpfX1hfHwoYT1uZXcgS24pO3ZhciBVPWEuZ2V0KGUpO2lmKFUpcmV0dXJuIFU7YS5zZXQoZSxzKSxPcyhlKT9lLmZvckVhY2goKGZ1bmN0aW9uKHQpe3MuYWRkKGNpKHQsbixpLHQsZSxhKSl9KSk6a3MoZSkmJmUuZm9yRWFjaCgoZnVuY3Rpb24odCxyKXtzLnNldChyLGNpKHQsbixpLHIsZSxhKSl9KSk7dmFyIGo9aD90Oih1P2M/QW86Q286Yz9jbDpsbCkoZSk7cmV0dXJuIE1lKGp8fGUsKGZ1bmN0aW9uKHQscil7aiYmKHQ9ZVtyPXRdKSxuaShzLHIsY2kodCxuLGkscixlLGEpKX0pKSxzfWZ1bmN0aW9uIHVpKGUsbixpKXt2YXIgcj1pLmxlbmd0aDtpZihudWxsPT1lKXJldHVybiFyO2ZvcihlPUN0KGUpO3ItLTspe3ZhciBvPWlbcl0sYT1lW29dO2lmKGE9PT10JiYhKG8gaW4gZSl8fCEoMCxuW29dKShhKSlyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBoaShuLGkscil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEx0KGUpO3JldHVybiBlYSgoZnVuY3Rpb24oKXtuLmFwcGx5KHQscil9KSxpKX1mdW5jdGlvbiBkaSh0LGUsbixpKXt2YXIgcj0tMSxvPUxlLGE9ITAscz10Lmxlbmd0aCxsPVtdLGM9ZS5sZW5ndGg7aWYoIXMpcmV0dXJuIGw7biYmKGU9TmUoZSxLZShuKSkpLGk/KG89UGUsYT0hMSk6ZS5sZW5ndGg+PTIwMCYmKG89SmUsYT0hMSxlPW5ldyAkbihlKSk7dDpmb3IoOysrcjxzOyl7dmFyIHU9dFtyXSxoPW51bGw9PW4/dTpuKHUpO2lmKHU9aXx8MCE9PXU/dTowLGEmJmg9PWgpe2Zvcih2YXIgZD1jO2QtLTspaWYoZVtkXT09PWgpY29udGludWUgdDtsLnB1c2godSl9ZWxzZSBvKGUsaCxpKXx8bC5wdXNoKHUpfXJldHVybiBsfVZuLnRlbXBsYXRlU2V0dGluZ3M9e2VzY2FwZTpYLGV2YWx1YXRlOiQsaW50ZXJwb2xhdGU6Syx2YXJpYWJsZToiIixpbXBvcnRzOntfOlZufX0sKFZuLnByb3RvdHlwZT1qbi5wcm90b3R5cGUpLmNvbnN0cnVjdG9yPVZuLChHbi5wcm90b3R5cGU9VW4oam4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9R24sKFduLnByb3RvdHlwZT1Vbihqbi5wcm90b3R5cGUpKS5jb25zdHJ1Y3Rvcj1Xbixxbi5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24gcGkoKXt0aGlzLl9fZGF0YV9fPUxuP0xuKG51bGwpOnt9LHRoaXMuc2l6ZT0wfSxxbi5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uIGZpKHQpe3ZhciBlPXRoaXMuaGFzKHQpJiZkZWxldGUgdGhpcy5fX2RhdGFfX1t0XTtyZXR1cm4gdGhpcy5zaXplLT1lPzE6MCxlfSxxbi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uIG1pKGUpe3ZhciBpPXRoaXMuX19kYXRhX187aWYoTG4pe3ZhciByPWlbZV07cmV0dXJuIHI9PT1uP3Q6cn1yZXR1cm4gT3QuY2FsbChpLGUpP2lbZV06dH0scW4ucHJvdG90eXBlLmhhcz1mdW5jdGlvbiBnaShlKXt2YXIgbj10aGlzLl9fZGF0YV9fO3JldHVybiBMbj9uW2VdIT09dDpPdC5jYWxsKG4sZSl9LHFuLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24gX2koZSxpKXt2YXIgcj10aGlzLl9fZGF0YV9fO3JldHVybiB0aGlzLnNpemUrPXRoaXMuaGFzKGUpPzA6MSxyW2VdPUxuJiZpPT09dD9uOmksdGhpc30sWW4ucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uIHlpKCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH0sWW4ucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbiB2aSh0KXt2YXIgZT10aGlzLl9fZGF0YV9fLG49aWkoZSx0KTtyZXR1cm4hKG48MHx8KG49PWUubGVuZ3RoLTE/ZS5wb3AoKTpKdC5jYWxsKGUsbiwxKSwtLXRoaXMuc2l6ZSwwKSl9LFluLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24gYmkoZSl7dmFyIG49dGhpcy5fX2RhdGFfXyxpPWlpKG4sZSk7cmV0dXJuIGk8MD90Om5baV1bMV19LFluLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24geGkodCl7cmV0dXJuIGlpKHRoaXMuX19kYXRhX18sdCk+LTF9LFluLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24gd2kodCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fLGk9aWkobix0KTtyZXR1cm4gaTwwPygrK3RoaXMuc2l6ZSxuLnB1c2goW3QsZV0pKTpuW2ldWzFdPWUsdGhpc30sWG4ucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uIFNpKCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgcW4sbWFwOm5ldyhUbnx8WW4pLHN0cmluZzpuZXcgcW59fSxYbi5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uIE1pKHQpe3ZhciBlPUlvKHRoaXMsdCkuZGVsZXRlKHQpO3JldHVybiB0aGlzLnNpemUtPWU/MTowLGV9LFhuLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24gRWkodCl7cmV0dXJuIElvKHRoaXMsdCkuZ2V0KHQpfSxYbi5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uIFRpKHQpe3JldHVybiBJbyh0aGlzLHQpLmhhcyh0KX0sWG4ucHJvdG90eXBlLnNldD1mdW5jdGlvbiBDaSh0LGUpe3ZhciBuPUlvKHRoaXMsdCksaT1uLnNpemU7cmV0dXJuIG4uc2V0KHQsZSksdGhpcy5zaXplKz1uLnNpemU9PWk/MDoxLHRoaXN9LCRuLnByb3RvdHlwZS5hZGQ9JG4ucHJvdG90eXBlLnB1c2g9ZnVuY3Rpb24gQWkodCl7cmV0dXJuIHRoaXMuX19kYXRhX18uc2V0KHQsbiksdGhpc30sJG4ucHJvdG90eXBlLmhhcz1mdW5jdGlvbiBraSh0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9LEtuLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbiBMaSgpe3RoaXMuX19kYXRhX189bmV3IFluLHRoaXMuc2l6ZT0wfSxLbi5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uIFBpKHQpe3ZhciBlPXRoaXMuX19kYXRhX18sbj1lLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplPWUuc2l6ZSxufSxLbi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uIE5pKHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmdldCh0KX0sS24ucHJvdG90eXBlLmhhcz1mdW5jdGlvbiBJaSh0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5oYXModCl9LEtuLnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24gUmkodCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fO2lmKG4gaW5zdGFuY2VvZiBZbil7dmFyIGk9bi5fX2RhdGFfXztpZighVG58fGkubGVuZ3RoPDE5OSlyZXR1cm4gaS5wdXNoKFt0LGVdKSx0aGlzLnNpemU9KytuLnNpemUsdGhpcztuPXRoaXMuX19kYXRhX189bmV3IFhuKGkpfXJldHVybiBuLnNldCh0LGUpLHRoaXMuc2l6ZT1uLnNpemUsdGhpc307dmFyIE9pPW5vKGppKSx6aT1ubyhHaSwhMCk7ZnVuY3Rpb24gRGkodCxlKXt2YXIgbj0hMDtyZXR1cm4gT2kodCwoZnVuY3Rpb24odCxpLHIpe3JldHVybiBuPSEhZSh0LGkscil9KSksbn1mdW5jdGlvbiBCaShlLG4saSl7Zm9yKHZhciByPS0xLG89ZS5sZW5ndGg7KytyPG87KXt2YXIgYT1lW3JdLHM9bihhKTtpZihudWxsIT1zJiYobD09PXQ/cz09cyYmIUJzKHMpOmkocyxsKSkpdmFyIGw9cyxjPWF9cmV0dXJuIGN9ZnVuY3Rpb24gSGkodCxlKXt2YXIgbj1bXTtyZXR1cm4gT2kodCwoZnVuY3Rpb24odCxpLHIpe2UodCxpLHIpJiZuLnB1c2godCl9KSksbn1mdW5jdGlvbiBGaSh0LGUsbixpLHIpe3ZhciBvPS0xLGE9dC5sZW5ndGg7Zm9yKG58fChuPVZvKSxyfHwocj1bXSk7KytvPGE7KXt2YXIgcz10W29dO2U+MCYmbihzKT9lPjE/RmkocyxlLTEsbixpLHIpOkllKHIscyk6aXx8KHJbci5sZW5ndGhdPXMpfXJldHVybiByfXZhciBWaT1pbygpLFVpPWlvKCEwKTtmdW5jdGlvbiBqaSh0LGUpe3JldHVybiB0JiZWaSh0LGUsbGwpfWZ1bmN0aW9uIEdpKHQsZSl7cmV0dXJuIHQmJlVpKHQsZSxsbCl9ZnVuY3Rpb24gV2kodCxlKXtyZXR1cm4ga2UoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIE1zKHRbZV0pfSkpfWZ1bmN0aW9uIHFpKGUsbil7Zm9yKHZhciBpPTAscj0obj1VcihuLGUpKS5sZW5ndGg7bnVsbCE9ZSYmaTxyOyllPWVbbGEobltpKytdKV07cmV0dXJuIGkmJmk9PXI/ZTp0fWZ1bmN0aW9uIFlpKHQsZSxuKXt2YXIgaT1lKHQpO3JldHVybiBtcyh0KT9pOkllKGksbih0KSl9ZnVuY3Rpb24gWGkoZSl7cmV0dXJuIG51bGw9PWU/ZT09PXQ/IltvYmplY3QgVW5kZWZpbmVkXSI6IltvYmplY3QgTnVsbF0iOmxlJiZsZSBpbiBDdChlKT8oZnVuY3Rpb24gbihlKXt2YXIgbj1PdC5jYWxsKGUsbGUpLGk9ZVtsZV07dHJ5e2VbbGVdPXQ7dmFyIHI9ITB9Y2F0Y2godCl7fXZhciBvPUJ0LmNhbGwoZSk7cmV0dXJuIHImJihuP2VbbGVdPWk6ZGVsZXRlIGVbbGVdKSxvfSkoZSk6KGZ1bmN0aW9uIGkodCl7cmV0dXJuIEJ0LmNhbGwodCl9KShlKX1mdW5jdGlvbiAkaSh0LGUpe3JldHVybiB0PmV9ZnVuY3Rpb24gS2kodCxlKXtyZXR1cm4gbnVsbCE9dCYmT3QuY2FsbCh0LGUpfWZ1bmN0aW9uIFppKHQsZSl7cmV0dXJuIG51bGwhPXQmJmUgaW4gQ3QodCl9ZnVuY3Rpb24gSmkoZSxuLGkpe2Zvcih2YXIgcj1pP1BlOkxlLG89ZVswXS5sZW5ndGgsYT1lLmxlbmd0aCxzPWEsbD13dChhKSxjPTEvMCx1PVtdO3MtLTspe3ZhciBoPWVbc107cyYmbiYmKGg9TmUoaCxLZShuKSkpLGM9Ym4oaC5sZW5ndGgsYyksbFtzXT0haSYmKG58fG8+PTEyMCYmaC5sZW5ndGg+PTEyMCk/bmV3ICRuKHMmJmgpOnR9aD1lWzBdO3ZhciBkPS0xLHA9bFswXTt0OmZvcig7KytkPG8mJnUubGVuZ3RoPGM7KXt2YXIgZj1oW2RdLG09bj9uKGYpOmY7aWYoZj1pfHwwIT09Zj9mOjAsIShwP0plKHAsbSk6cih1LG0saSkpKXtmb3Iocz1hOy0tczspe3ZhciBnPWxbc107aWYoIShnP0plKGcsbSk6cihlW3NdLG0saSkpKWNvbnRpbnVlIHR9cCYmcC5wdXNoKG0pLHUucHVzaChmKX19cmV0dXJuIHV9ZnVuY3Rpb24gUWkoZSxuLGkpe3ZhciByPW51bGw9PShlPVpvKGUsbj1VcihuLGUpKSk/ZTplW2xhKHhhKG4pKV07cmV0dXJuIG51bGw9PXI/dDp4ZShyLGUsaSl9ZnVuY3Rpb24gdHIodCl7cmV0dXJuIEFzKHQpJiZYaSh0KT09Zn1mdW5jdGlvbiBlcihlLG4saSxyLG8pe3JldHVybiBlPT09bnx8KG51bGw9PWV8fG51bGw9PW58fCFBcyhlKSYmIUFzKG4pP2UhPWUmJm4hPW46KGZ1bmN0aW9uIGEoZSxuLGkscixvLHMpe3ZhciBsPW1zKGUpLGM9bXMobiksdT1sP206Qm8oZSksaD1jP206Qm8obiksZD0odT11PT1mP1M6dSk9PVMscD0oaD1oPT1mP1M6aCk9PVMsdj11PT1oO2lmKHYmJmJzKGUpKXtpZighYnMobikpcmV0dXJuITE7bD0hMCxkPSExfWlmKHYmJiFkKXJldHVybiBzfHwocz1uZXcgS24pLGx8fEhzKGUpP0VvKGUsbixpLHIsbyxzKTooZnVuY3Rpb24gYih0LGUsbixpLHIsbyxhKXtzd2l0Y2gobil7Y2FzZSBQOmlmKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHx0LmJ5dGVPZmZzZXQhPWUuYnl0ZU9mZnNldClyZXR1cm4hMTt0PXQuYnVmZmVyLGU9ZS5idWZmZXI7Y2FzZSBMOnJldHVybiEodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fCFvKG5ldyBHdCh0KSxuZXcgR3QoZSkpKTtjYXNlIGc6Y2FzZSBfOmNhc2UgdzpyZXR1cm4gaHMoK3QsK2UpO2Nhc2UgeTpyZXR1cm4gdC5uYW1lPT1lLm5hbWUmJnQubWVzc2FnZT09ZS5tZXNzYWdlO2Nhc2UgRTpjYXNlIEM6cmV0dXJuIHQ9PWUrIiI7Y2FzZSB4OnZhciBzPXNuO2Nhc2UgVDppZihzfHwocz11biksdC5zaXplIT1lLnNpemUmJiEoMSZpKSlyZXR1cm4hMTt2YXIgbD1hLmdldCh0KTtpZihsKXJldHVybiBsPT1lO2l8PTIsYS5zZXQodCxlKTt2YXIgYz1FbyhzKHQpLHMoZSksaSxyLG8sYSk7cmV0dXJuIGEuZGVsZXRlKHQpLGM7Y2FzZSBBOmlmKEhuKXJldHVybiBIbi5jYWxsKHQpPT1Ibi5jYWxsKGUpfXJldHVybiExfSkoZSxuLHUsaSxyLG8scyk7aWYoISgxJmkpKXt2YXIgTT1kJiZPdC5jYWxsKGUsIl9fd3JhcHBlZF9fIiksaz1wJiZPdC5jYWxsKG4sIl9fd3JhcHBlZF9fIik7aWYoTXx8ayl7dmFyIE49TT9lLnZhbHVlKCk6ZSxJPWs/bi52YWx1ZSgpOm47cmV0dXJuIHN8fChzPW5ldyBLbiksbyhOLEksaSxyLHMpfX1yZXR1cm4hIXYmJihzfHwocz1uZXcgS24pLChmdW5jdGlvbiBSKGUsbixpLHIsbyxhKXt2YXIgcz0xJmksbD1DbyhlKSxjPWwubGVuZ3RoLHU9Q28obik7aWYoYyE9dS5sZW5ndGgmJiFzKXJldHVybiExO2Zvcih2YXIgaD1jO2gtLTspe3ZhciBkPWxbaF07aWYoIShzP2QgaW4gbjpPdC5jYWxsKG4sZCkpKXJldHVybiExfXZhciBwPWEuZ2V0KGUpLGY9YS5nZXQobik7aWYocCYmZilyZXR1cm4gcD09biYmZj09ZTt2YXIgbT0hMDthLnNldChlLG4pLGEuc2V0KG4sZSk7Zm9yKHZhciBnPXM7KytoPGM7KXt2YXIgXz1lW2Q9bFtoXV0seT1uW2RdO2lmKHIpdmFyIHY9cz9yKHksXyxkLG4sZSxhKTpyKF8seSxkLGUsbixhKTtpZighKHY9PT10P189PT15fHxvKF8seSxpLHIsYSk6dikpe209ITE7YnJlYWt9Z3x8KGc9ImNvbnN0cnVjdG9yIj09ZCl9aWYobSYmIWcpe3ZhciBiPWUuY29uc3RydWN0b3IseD1uLmNvbnN0cnVjdG9yO2I9PXh8fCEoImNvbnN0cnVjdG9yImluIGUpfHwhKCJjb25zdHJ1Y3RvciJpbiBuKXx8ImZ1bmN0aW9uIj09dHlwZW9mIGImJmIgaW5zdGFuY2VvZiBiJiYiZnVuY3Rpb24iPT10eXBlb2YgeCYmeCBpbnN0YW5jZW9mIHh8fChtPSExKX1yZXR1cm4gYS5kZWxldGUoZSksYS5kZWxldGUobiksbX0pKGUsbixpLHIsbyxzKSl9KShlLG4saSxyLGVyLG8pKX1mdW5jdGlvbiBucihlLG4saSxyKXt2YXIgbz1pLmxlbmd0aCxhPW8scz0hcjtpZihudWxsPT1lKXJldHVybiFhO2ZvcihlPUN0KGUpO28tLTspe3ZhciBsPWlbb107aWYocyYmbFsyXT9sWzFdIT09ZVtsWzBdXTohKGxbMF1pbiBlKSlyZXR1cm4hMX1mb3IoOysrbzxhOyl7dmFyIGM9KGw9aVtvXSlbMF0sdT1lW2NdLGg9bFsxXTtpZihzJiZsWzJdKXtpZih1PT09dCYmIShjIGluIGUpKXJldHVybiExfWVsc2V7dmFyIGQ9bmV3IEtuO2lmKHIpdmFyIHA9cih1LGgsYyxlLG4sZCk7aWYoIShwPT09dD9lcihoLHUsMyxyLGQpOnApKXJldHVybiExfX1yZXR1cm4hMH1mdW5jdGlvbiBpcih0KXtyZXR1cm4hKCFDcyh0KXx8KGZ1bmN0aW9uIGUodCl7cmV0dXJuISFEdCYmRHQgaW4gdH0pKHQpKSYmKE1zKHQpP1Z0OmZ0KS50ZXN0KGNhKHQpKX1mdW5jdGlvbiBycih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90Om51bGw9PXQ/Umw6Im9iamVjdCI9PXR5cGVvZiB0P21zKHQpP3VyKHRbMF0sdFsxXSk6Y3IodCk6amwodCl9ZnVuY3Rpb24gb3IodCl7aWYoIVlvKHQpKXJldHVybiB5bih0KTt2YXIgZT1bXTtmb3IodmFyIG4gaW4gQ3QodCkpT3QuY2FsbCh0LG4pJiYiY29uc3RydWN0b3IiIT1uJiZlLnB1c2gobik7cmV0dXJuIGV9ZnVuY3Rpb24gYXIodCl7aWYoIUNzKHQpKXJldHVybihmdW5jdGlvbiBlKHQpe3ZhciBlPVtdO2lmKG51bGwhPXQpZm9yKHZhciBuIGluIEN0KHQpKWUucHVzaChuKTtyZXR1cm4gZX0pKHQpO3ZhciBuPVlvKHQpLGk9W107Zm9yKHZhciByIGluIHQpKCJjb25zdHJ1Y3RvciIhPXJ8fCFuJiZPdC5jYWxsKHQscikpJiZpLnB1c2gocik7cmV0dXJuIGl9ZnVuY3Rpb24gc3IodCxlKXtyZXR1cm4gdDxlfWZ1bmN0aW9uIGxyKHQsZSl7dmFyIG49LTEsaT15cyh0KT93dCh0Lmxlbmd0aCk6W107cmV0dXJuIE9pKHQsKGZ1bmN0aW9uKHQscixvKXtpWysrbl09ZSh0LHIsbyl9KSksaX1mdW5jdGlvbiBjcih0KXt2YXIgZT1Sbyh0KTtyZXR1cm4gMT09ZS5sZW5ndGgmJmVbMF1bMl0/JG8oZVswXVswXSxlWzBdWzFdKTpmdW5jdGlvbihuKXtyZXR1cm4gbj09PXR8fG5yKG4sdCxlKX19ZnVuY3Rpb24gdXIoZSxuKXtyZXR1cm4gR28oZSkmJlhvKG4pPyRvKGxhKGUpLG4pOmZ1bmN0aW9uKGkpe3ZhciByPWlsKGksZSk7cmV0dXJuIHI9PT10JiZyPT09bj9ybChpLGUpOmVyKG4sciwzKX19ZnVuY3Rpb24gaHIoZSxuLGkscixvKXtlIT09biYmVmkobiwoZnVuY3Rpb24oYSxzKXtpZihvfHwobz1uZXcgS24pLENzKGEpKSEoZnVuY3Rpb24gbChlLG4saSxyLG8sYSxzKXt2YXIgbD1RbyhlLGkpLGM9UW8obixpKSx1PXMuZ2V0KGMpO2lmKHUpZWkoZSxpLHUpO2Vsc2V7dmFyIGg9YT9hKGwsYyxpKyIiLGUsbixzKTp0LGQ9aD09PXQ7aWYoZCl7dmFyIHA9bXMoYyksZj0hcCYmYnMoYyksbT0hcCYmIWYmJkhzKGMpO2g9YyxwfHxmfHxtP21zKGwpP2g9bDp2cyhsKT9oPUpyKGwpOmY/KGQ9ITEsaD1xcihjLCEwKSk6bT8oZD0hMSxoPVhyKGMsITApKTpoPVtdOk5zKGMpfHxmcyhjKT8oaD1sLGZzKGwpP2g9WHMobCk6Q3MobCkmJiFNcyhsKXx8KGg9Rm8oYykpKTpkPSExfWQmJihzLnNldChjLGgpLG8oaCxjLHIsYSxzKSxzLmRlbGV0ZShjKSksZWkoZSxpLGgpfX0pKGUsbixzLGksaHIscixvKTtlbHNle3ZhciBjPXI/cihRbyhlLHMpLGEscysiIixlLG4sbyk6dDtjPT09dCYmKGM9YSksZWkoZSxzLGMpfX0pLGNsKX1mdW5jdGlvbiBkcihlLG4pe3ZhciBpPWUubGVuZ3RoO2lmKGkpcmV0dXJuIFVvKG4rPW48MD9pOjAsaSk/ZVtuXTp0fWZ1bmN0aW9uIHByKHQsZSxuKXtlPWUubGVuZ3RoP05lKGUsKGZ1bmN0aW9uKHQpe3JldHVybiBtcyh0KT9mdW5jdGlvbihlKXtyZXR1cm4gcWkoZSwxPT09dC5sZW5ndGg/dFswXTp0KX06dH0pKTpbUmxdO3ZhciBpPS0xO3JldHVybiBlPU5lKGUsS2UoTm8oKSkpLChmdW5jdGlvbiByKHQsZSl7dmFyIG49dC5sZW5ndGg7Zm9yKHQuc29ydChlKTtuLS07KXRbbl09dFtuXS52YWx1ZTtyZXR1cm4gdH0pKGxyKHQsKGZ1bmN0aW9uKHQsbixyKXtyZXR1cm57Y3JpdGVyaWE6TmUoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUodCl9KSksaW5kZXg6KytpLHZhbHVlOnR9fSkpLChmdW5jdGlvbih0LGUpe3JldHVybihmdW5jdGlvbiBpKHQsZSxuKXtmb3IodmFyIGk9LTEscj10LmNyaXRlcmlhLG89ZS5jcml0ZXJpYSxhPXIubGVuZ3RoLHM9bi5sZW5ndGg7KytpPGE7KXt2YXIgbD0kcihyW2ldLG9baV0pO2lmKGwpcmV0dXJuIGk+PXM/bDpsKigiZGVzYyI9PW5baV0/LTE6MSl9cmV0dXJuIHQuaW5kZXgtZS5pbmRleH0pKHQsZSxuKX0pKX1mdW5jdGlvbiBmcih0LGUsbil7Zm9yKHZhciBpPS0xLHI9ZS5sZW5ndGgsbz17fTsrK2k8cjspe3ZhciBhPWVbaV0scz1xaSh0LGEpO24ocyxhKSYmd3IobyxVcihhLHQpLHMpfXJldHVybiBvfWZ1bmN0aW9uIG1yKHQsZSxuLGkpe3ZhciByPWk/VmU6RmUsbz0tMSxhPWUubGVuZ3RoLHM9dDtmb3IodD09PWUmJihlPUpyKGUpKSxuJiYocz1OZSh0LEtlKG4pKSk7KytvPGE7KWZvcih2YXIgbD0wLGM9ZVtvXSx1PW4/bihjKTpjOyhsPXIocyx1LGwsaSkpPi0xOylzIT09dCYmSnQuY2FsbChzLGwsMSksSnQuY2FsbCh0LGwsMSk7cmV0dXJuIHR9ZnVuY3Rpb24gZ3IodCxlKXtmb3IodmFyIG49dD9lLmxlbmd0aDowLGk9bi0xO24tLTspe3ZhciByPWVbbl07aWYobj09aXx8ciE9PW8pe3ZhciBvPXI7VW8ocik/SnQuY2FsbCh0LHIsMSk6UnIodCxyKX19cmV0dXJuIHR9ZnVuY3Rpb24gX3IodCxlKXtyZXR1cm4gdCtFZShTbigpKihlLXQrMSkpfWZ1bmN0aW9uIHlyKHQsZSl7dmFyIG49IiI7aWYoIXR8fGU8MXx8ZT51KXJldHVybiBuO2Rve2UlMiYmKG4rPXQpLChlPUVlKGUvMikpJiYodCs9dCl9d2hpbGUoZSk7cmV0dXJuIG59ZnVuY3Rpb24gdnIodCxlKXtyZXR1cm4gbmEoS28odCxlLFJsKSx0KyIiKX1mdW5jdGlvbiBicih0KXtyZXR1cm4gSm4oX2wodCkpfWZ1bmN0aW9uIHhyKHQsZSl7dmFyIG49X2wodCk7cmV0dXJuIG9hKG4sbGkoZSwwLG4ubGVuZ3RoKSl9ZnVuY3Rpb24gd3IoZSxuLGkscil7aWYoIUNzKGUpKXJldHVybiBlO2Zvcih2YXIgbz0tMSxhPShuPVVyKG4sZSkpLmxlbmd0aCxzPWEtMSxsPWU7bnVsbCE9bCYmKytvPGE7KXt2YXIgYz1sYShuW29dKSx1PWk7aWYoIl9fcHJvdG9fXyI9PT1jfHwiY29uc3RydWN0b3IiPT09Y3x8InByb3RvdHlwZSI9PT1jKXJldHVybiBlO2lmKG8hPXMpe3ZhciBoPWxbY107KHU9cj9yKGgsYyxsKTp0KT09PXQmJih1PUNzKGgpP2g6VW8obltvKzFdKT9bXTp7fSl9bmkobCxjLHUpLGw9bFtjXX1yZXR1cm4gZX12YXIgU3I9UG4/ZnVuY3Rpb24odCxlKXtyZXR1cm4gUG4uc2V0KHQsZSksdH06UmwsTXI9dWU/ZnVuY3Rpb24odCxlKXtyZXR1cm4gdWUodCwidG9TdHJpbmciLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx2YWx1ZTpQbChlKSx3cml0YWJsZTohMH0pfTpSbDtmdW5jdGlvbiBFcih0KXtyZXR1cm4gb2EoX2wodCkpfWZ1bmN0aW9uIFRyKHQsZSxuKXt2YXIgaT0tMSxyPXQubGVuZ3RoO2U8MCYmKGU9LWU+cj8wOnIrZSksKG49bj5yP3I6bik8MCYmKG4rPXIpLHI9ZT5uPzA6bi1lPj4+MCxlPj4+PTA7Zm9yKHZhciBvPXd0KHIpOysraTxyOylvW2ldPXRbaStlXTtyZXR1cm4gb31mdW5jdGlvbiBDcih0LGUpe3ZhciBuO3JldHVybiBPaSh0LChmdW5jdGlvbih0LGkscil7cmV0dXJuIShuPWUodCxpLHIpKX0pKSwhIW59ZnVuY3Rpb24gQXIodCxlLG4pe3ZhciBpPTAscj1udWxsPT10P2k6dC5sZW5ndGg7aWYoIm51bWJlciI9PXR5cGVvZiBlJiZlPT1lJiZyPD0yMTQ3NDgzNjQ3KXtmb3IoO2k8cjspe3ZhciBvPWkrcj4+PjEsYT10W29dO251bGwhPT1hJiYhQnMoYSkmJihuP2E8PWU6YTxlKT9pPW8rMTpyPW99cmV0dXJuIHJ9cmV0dXJuIGtyKHQsZSxSbCxuKX1mdW5jdGlvbiBrcihlLG4saSxyKXt2YXIgbz0wLGE9bnVsbD09ZT8wOmUubGVuZ3RoO2lmKDA9PT1hKXJldHVybiAwO2Zvcih2YXIgcz0obj1pKG4pKSE9bixsPW51bGw9PT1uLGM9QnMobiksdT1uPT09dDtvPGE7KXt2YXIgaD1FZSgobythKS8yKSxkPWkoZVtoXSkscD1kIT09dCxmPW51bGw9PT1kLG09ZD09ZCxnPUJzKGQpO2lmKHMpdmFyIF89cnx8bTtlbHNlIF89dT9tJiYocnx8cCk6bD9tJiZwJiYocnx8IWYpOmM/bSYmcCYmIWYmJihyfHwhZyk6IWYmJiFnJiYocj9kPD1uOmQ8bik7Xz9vPWgrMTphPWh9cmV0dXJuIGJuKGEsNDI5NDk2NzI5NCl9ZnVuY3Rpb24gTHIodCxlKXtmb3IodmFyIG49LTEsaT10Lmxlbmd0aCxyPTAsbz1bXTsrK248aTspe3ZhciBhPXRbbl0scz1lP2UoYSk6YTtpZighbnx8IWhzKHMsbCkpe3ZhciBsPXM7b1tyKytdPTA9PT1hPzA6YX19cmV0dXJuIG99ZnVuY3Rpb24gUHIodCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0P3Q6QnModCk/aDordH1mdW5jdGlvbiBOcih0KXtpZigic3RyaW5nIj09dHlwZW9mIHQpcmV0dXJuIHQ7aWYobXModCkpcmV0dXJuIE5lKHQsTnIpKyIiO2lmKEJzKHQpKXJldHVybiBGbj9Gbi5jYWxsKHQpOiIiO3ZhciBlPXQrIiI7cmV0dXJuIjAiPT1lJiYxL3Q9PS0xLzA/Ii0wIjplfWZ1bmN0aW9uIElyKHQsZSxuKXt2YXIgaT0tMSxyPUxlLG89dC5sZW5ndGgsYT0hMCxzPVtdLGw9cztpZihuKWE9ITEscj1QZTtlbHNlIGlmKG8+PTIwMCl7dmFyIGM9ZT9udWxsOnZvKHQpO2lmKGMpcmV0dXJuIHVuKGMpO2E9ITEscj1KZSxsPW5ldyAkbn1lbHNlIGw9ZT9bXTpzO3Q6Zm9yKDsrK2k8bzspe3ZhciB1PXRbaV0saD1lP2UodSk6dTtpZih1PW58fDAhPT11P3U6MCxhJiZoPT1oKXtmb3IodmFyIGQ9bC5sZW5ndGg7ZC0tOylpZihsW2RdPT09aCljb250aW51ZSB0O2UmJmwucHVzaChoKSxzLnB1c2godSl9ZWxzZSByKGwsaCxuKXx8KGwhPT1zJiZsLnB1c2goaCkscy5wdXNoKHUpKX1yZXR1cm4gc31mdW5jdGlvbiBScih0LGUpe3JldHVybiBudWxsPT0odD1abyh0LGU9VXIoZSx0KSkpfHxkZWxldGUgdFtsYSh4YShlKSldfWZ1bmN0aW9uIE9yKHQsZSxuLGkpe3JldHVybiB3cih0LGUsbihxaSh0LGUpKSxpKX1mdW5jdGlvbiB6cih0LGUsbixpKXtmb3IodmFyIHI9dC5sZW5ndGgsbz1pP3I6LTE7KGk/by0tOisrbzxyKSYmZSh0W29dLG8sdCk7KTtyZXR1cm4gbj9Ucih0LGk/MDpvLGk/bysxOnIpOlRyKHQsaT9vKzE6MCxpP3I6byl9ZnVuY3Rpb24gRHIodCxlKXt2YXIgbj10O3JldHVybiBuIGluc3RhbmNlb2YgV24mJihuPW4udmFsdWUoKSksUmUoZSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5mdW5jLmFwcGx5KGUudGhpc0FyZyxJZShbdF0sZS5hcmdzKSl9KSxuKX1mdW5jdGlvbiBCcih0LGUsbil7dmFyIGk9dC5sZW5ndGg7aWYoaTwyKXJldHVybiBpP0lyKHRbMF0pOltdO2Zvcih2YXIgcj0tMSxvPXd0KGkpOysrcjxpOylmb3IodmFyIGE9dFtyXSxzPS0xOysrczxpOylzIT1yJiYob1tyXT1kaShvW3JdfHxhLHRbc10sZSxuKSk7cmV0dXJuIElyKEZpKG8sMSksZSxuKX1mdW5jdGlvbiBIcihlLG4saSl7Zm9yKHZhciByPS0xLG89ZS5sZW5ndGgsYT1uLmxlbmd0aCxzPXt9OysrcjxvOylpKHMsZVtyXSxyPGE/bltyXTp0KTtyZXR1cm4gc31mdW5jdGlvbiBGcih0KXtyZXR1cm4gdnModCk/dDpbXX1mdW5jdGlvbiBWcih0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90OlJsfWZ1bmN0aW9uIFVyKHQsZSl7cmV0dXJuIG1zKHQpP3Q6R28odCxlKT9bdF06YWEoJHModCkpfXZhciBqcj12cjtmdW5jdGlvbiBHcihlLG4saSl7dmFyIHI9ZS5sZW5ndGg7cmV0dXJuIGk9aT09PXQ/cjppLCFuJiZpPj1yP2U6VHIoZSxuLGkpfXZhciBXcj1oZXx8ZnVuY3Rpb24odCl7cmV0dXJuIGNlLmNsZWFyVGltZW91dCh0KX07ZnVuY3Rpb24gcXIodCxlKXtpZihlKXJldHVybiB0LnNsaWNlKCk7dmFyIG49dC5sZW5ndGgsaT1XdD9XdChuKTpuZXcgdC5jb25zdHJ1Y3RvcihuKTtyZXR1cm4gdC5jb3B5KGkpLGl9ZnVuY3Rpb24gWXIodCl7dmFyIGU9bmV3IHQuY29uc3RydWN0b3IodC5ieXRlTGVuZ3RoKTtyZXR1cm4gbmV3IEd0KGUpLnNldChuZXcgR3QodCkpLGV9ZnVuY3Rpb24gWHIodCxlKXt2YXIgbj1lP1lyKHQuYnVmZmVyKTp0LmJ1ZmZlcjtyZXR1cm4gbmV3IHQuY29uc3RydWN0b3Iobix0LmJ5dGVPZmZzZXQsdC5sZW5ndGgpfWZ1bmN0aW9uICRyKGUsbil7aWYoZSE9PW4pe3ZhciBpPWUhPT10LHI9bnVsbD09PWUsbz1lPT1lLGE9QnMoZSkscz1uIT09dCxsPW51bGw9PT1uLGM9bj09bix1PUJzKG4pO2lmKCFsJiYhdSYmIWEmJmU+bnx8YSYmcyYmYyYmIWwmJiF1fHxyJiZzJiZjfHwhaSYmY3x8IW8pcmV0dXJuIDE7aWYoIXImJiFhJiYhdSYmZTxufHx1JiZpJiZvJiYhciYmIWF8fGwmJmkmJm98fCFzJiZvfHwhYylyZXR1cm4tMX1yZXR1cm4gMH1mdW5jdGlvbiBLcih0LGUsbixpKXtmb3IodmFyIHI9LTEsbz10Lmxlbmd0aCxhPW4ubGVuZ3RoLHM9LTEsbD1lLmxlbmd0aCxjPXZuKG8tYSwwKSx1PXd0KGwrYyksaD0haTsrK3M8bDspdVtzXT1lW3NdO2Zvcig7KytyPGE7KShofHxyPG8pJiYodVtuW3JdXT10W3JdKTtmb3IoO2MtLTspdVtzKytdPXRbcisrXTtyZXR1cm4gdX1mdW5jdGlvbiBacih0LGUsbixpKXtmb3IodmFyIHI9LTEsbz10Lmxlbmd0aCxhPS0xLHM9bi5sZW5ndGgsbD0tMSxjPWUubGVuZ3RoLHU9dm4oby1zLDApLGg9d3QodStjKSxkPSFpOysrcjx1OyloW3JdPXRbcl07Zm9yKHZhciBwPXI7KytsPGM7KWhbcCtsXT1lW2xdO2Zvcig7KythPHM7KShkfHxyPG8pJiYoaFtwK25bYV1dPXRbcisrXSk7cmV0dXJuIGh9ZnVuY3Rpb24gSnIodCxlKXt2YXIgbj0tMSxpPXQubGVuZ3RoO2ZvcihlfHwoZT13dChpKSk7KytuPGk7KWVbbl09dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBRcihlLG4saSxyKXt2YXIgbz0haTtpfHwoaT17fSk7Zm9yKHZhciBhPS0xLHM9bi5sZW5ndGg7KythPHM7KXt2YXIgbD1uW2FdLGM9cj9yKGlbbF0sZVtsXSxsLGksZSk6dDtjPT09dCYmKGM9ZVtsXSksbz9haShpLGwsYyk6bmkoaSxsLGMpfXJldHVybiBpfWZ1bmN0aW9uIHRvKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4saSl7dmFyIHI9bXMobik/d2U6cmksbz1lP2UoKTp7fTtyZXR1cm4gcihuLHQsTm8oaSwyKSxvKX19ZnVuY3Rpb24gZW8oZSl7cmV0dXJuIHZyKChmdW5jdGlvbihuLGkpe3ZhciByPS0xLG89aS5sZW5ndGgsYT1vPjE/aVtvLTFdOnQscz1vPjI/aVsyXTp0O2ZvcihhPWUubGVuZ3RoPjMmJiJmdW5jdGlvbiI9PXR5cGVvZiBhPyhvLS0sYSk6dCxzJiZqbyhpWzBdLGlbMV0scykmJihhPW88Mz90OmEsbz0xKSxuPUN0KG4pOysrcjxvOyl7dmFyIGw9aVtyXTtsJiZlKG4sbCxyLGEpfXJldHVybiBufSkpfWZ1bmN0aW9uIG5vKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4saSl7aWYobnVsbD09bilyZXR1cm4gbjtpZigheXMobikpcmV0dXJuIHQobixpKTtmb3IodmFyIHI9bi5sZW5ndGgsbz1lP3I6LTEsYT1DdChuKTsoZT9vLS06KytvPHIpJiYhMSE9PWkoYVtvXSxvLGEpOyk7cmV0dXJuIG59fWZ1bmN0aW9uIGlvKHQpe3JldHVybiBmdW5jdGlvbihlLG4saSl7Zm9yKHZhciByPS0xLG89Q3QoZSksYT1pKGUpLHM9YS5sZW5ndGg7cy0tOyl7dmFyIGw9YVt0P3M6KytyXTtpZighMT09PW4ob1tsXSxsLG8pKWJyZWFrfXJldHVybiBlfX1mdW5jdGlvbiBybyhlKXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGk9YW4obj0kcyhuKSk/cG4obik6dCxyPWk/aVswXTpuLmNoYXJBdCgwKSxvPWk/R3IoaSwxKS5qb2luKCIiKTpuLnNsaWNlKDEpO3JldHVybiByW2VdKCkrb319ZnVuY3Rpb24gb28odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBSZShBbChibChlKS5yZXBsYWNlKFh0LCIiKSksdCwiIil9fWZ1bmN0aW9uIGFvKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cztzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IHQ7Y2FzZSAxOnJldHVybiBuZXcgdChlWzBdKTtjYXNlIDI6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSk7Y2FzZSAzOnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSk7Y2FzZSA0OnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSxlWzNdKTtjYXNlIDU6cmV0dXJuIG5ldyB0KGVbMF0sZVsxXSxlWzJdLGVbM10sZVs0XSk7Y2FzZSA2OnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSxlWzNdLGVbNF0sZVs1XSk7Y2FzZSA3OnJldHVybiBuZXcgdChlWzBdLGVbMV0sZVsyXSxlWzNdLGVbNF0sZVs1XSxlWzZdKX12YXIgbj1Vbih0LnByb3RvdHlwZSksaT10LmFwcGx5KG4sZSk7cmV0dXJuIENzKGkpP2k6bn19ZnVuY3Rpb24gc28oZSl7cmV0dXJuIGZ1bmN0aW9uKG4saSxyKXt2YXIgbz1DdChuKTtpZigheXMobikpe3ZhciBhPU5vKGksMyk7bj1sbChuKSxpPWZ1bmN0aW9uKHQpe3JldHVybiBhKG9bdF0sdCxvKX19dmFyIHM9ZShuLGkscik7cmV0dXJuIHM+LTE/b1thP25bc106c106dH19ZnVuY3Rpb24gbG8obil7cmV0dXJuIFRvKChmdW5jdGlvbihpKXt2YXIgcj1pLmxlbmd0aCxvPXIsYT1Hbi5wcm90b3R5cGUudGhydTtmb3IobiYmaS5yZXZlcnNlKCk7by0tOyl7dmFyIHM9aVtvXTtpZigiZnVuY3Rpb24iIT10eXBlb2Ygcyl0aHJvdyBuZXcgTHQoZSk7aWYoYSYmIWwmJiJ3cmFwcGVyIj09TG8ocykpdmFyIGw9bmV3IEduKFtdLCEwKX1mb3Iobz1sP286cjsrK288cjspe3ZhciBjPUxvKHM9aVtvXSksdT0id3JhcHBlciI9PWM/a28ocyk6dDtsPXUmJldvKHVbMF0pJiY0MjQ9PXVbMV0mJiF1WzRdLmxlbmd0aCYmMT09dVs5XT9sW0xvKHVbMF0pXS5hcHBseShsLHVbM10pOjE9PXMubGVuZ3RoJiZXbyhzKT9sW2NdKCk6bC50aHJ1KHMpfXJldHVybiBmdW5jdGlvbigpe3ZhciB0PWFyZ3VtZW50cyxlPXRbMF07aWYobCYmMT09dC5sZW5ndGgmJm1zKGUpKXJldHVybiBsLnBsYW50KGUpLnZhbHVlKCk7Zm9yKHZhciBuPTAsbz1yP2lbbl0uYXBwbHkodGhpcyx0KTplOysrbjxyOylvPWlbbl0uY2FsbCh0aGlzLG8pO3JldHVybiBvfX0pKX1mdW5jdGlvbiBjbyhlLG4saSxyLG8sYSxsLGMsdSxoKXt2YXIgZD1uJnMscD0xJm4sZj0yJm4sbT0yNCZuLGc9NTEyJm4sXz1mP3Q6YW8oZSk7cmV0dXJuIGZ1bmN0aW9uIHQoKXtmb3IodmFyIHM9YXJndW1lbnRzLmxlbmd0aCx5PXd0KHMpLHY9czt2LS07KXlbdl09YXJndW1lbnRzW3ZdO2lmKG0pdmFyIGI9UG8odCkseD1lbih5LGIpO2lmKHImJih5PUtyKHkscixvLG0pKSxhJiYoeT1acih5LGEsbCxtKSkscy09eCxtJiZzPGgpe3ZhciB3PWNuKHksYik7cmV0dXJuIF9vKGUsbixjbyx0LnBsYWNlaG9sZGVyLGkseSx3LGMsdSxoLXMpfXZhciBTPXA/aTp0aGlzLE09Zj9TW2VdOmU7cmV0dXJuIHM9eS5sZW5ndGgsYz95PUpvKHksYyk6ZyYmcz4xJiZ5LnJldmVyc2UoKSxkJiZ1PHMmJih5Lmxlbmd0aD11KSx0aGlzJiZ0aGlzIT09Y2UmJnRoaXMgaW5zdGFuY2VvZiB0JiYoTT1ffHxhbyhNKSksTS5hcHBseShTLHkpfX1mdW5jdGlvbiB1byh0LGUpe3JldHVybiBmdW5jdGlvbihuLGkpe3JldHVybihmdW5jdGlvbiByKHQsZSxuLGkpe3JldHVybiBqaSh0LChmdW5jdGlvbih0LHIsbyl7ZShpLG4odCkscixvKX0pKSxpfSkobix0LGUoaSkse30pfX1mdW5jdGlvbiBobyhlLG4pe3JldHVybiBmdW5jdGlvbihpLHIpe3ZhciBvO2lmKGk9PT10JiZyPT09dClyZXR1cm4gbjtpZihpIT09dCYmKG89aSksciE9PXQpe2lmKG89PT10KXJldHVybiByOyJzdHJpbmciPT10eXBlb2YgaXx8InN0cmluZyI9PXR5cGVvZiByPyhpPU5yKGkpLHI9TnIocikpOihpPVByKGkpLHI9UHIocikpLG89ZShpLHIpfXJldHVybiBvfX1mdW5jdGlvbiBwbyh0KXtyZXR1cm4gVG8oKGZ1bmN0aW9uKGUpe3JldHVybiBlPU5lKGUsS2UoTm8oKSkpLHZyKChmdW5jdGlvbihuKXt2YXIgaT10aGlzO3JldHVybiB0KGUsKGZ1bmN0aW9uKHQpe3JldHVybiB4ZSh0LGksbil9KSl9KSl9KSl9ZnVuY3Rpb24gZm8oZSxuKXt2YXIgaT0obj1uPT09dD8iICI6TnIobikpLmxlbmd0aDtpZihpPDIpcmV0dXJuIGk/eXIobixlKTpuO3ZhciByPXlyKG4sU2UoZS9kbihuKSkpO3JldHVybiBhbihuKT9HcihwbihyKSwwLGUpLmpvaW4oIiIpOnIuc2xpY2UoMCxlKX1mdW5jdGlvbiBtbyhlKXtyZXR1cm4gZnVuY3Rpb24obixpLHIpe3JldHVybiByJiYibnVtYmVyIiE9dHlwZW9mIHImJmpvKG4saSxyKSYmKGk9cj10KSxuPUdzKG4pLGk9PT10PyhpPW4sbj0wKTppPUdzKGkpLChmdW5jdGlvbiBvKHQsZSxuLGkpe2Zvcih2YXIgcj0tMSxvPXZuKFNlKChlLXQpLyhufHwxKSksMCksYT13dChvKTtvLS07KWFbaT9vOisrcl09dCx0Kz1uO3JldHVybiBhfSkobixpLHI9cj09PXQ/bjxpPzE6LTE6R3MociksZSl9fWZ1bmN0aW9uIGdvKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3JldHVybiJzdHJpbmciPT10eXBlb2YgZSYmInN0cmluZyI9PXR5cGVvZiBufHwoZT1ZcyhlKSxuPVlzKG4pKSx0KGUsbil9fWZ1bmN0aW9uIF9vKGUsbixpLHIscyxsLGMsdSxoLGQpe3ZhciBwPTgmbjtufD1wP286YSw0JihuJj1+KHA/YTpvKSl8fChuJj0tNCk7dmFyIGY9W2UsbixzLHA/bDp0LHA/Yzp0LHA/dDpsLHA/dDpjLHUsaCxkXSxtPWkuYXBwbHkodCxmKTtyZXR1cm4gV28oZSkmJnRhKG0sZiksbS5wbGFjZWhvbGRlcj1yLGlhKG0sZSxuKX1mdW5jdGlvbiB5byh0KXt2YXIgZT1UdFt0XTtyZXR1cm4gZnVuY3Rpb24odCxuKXtpZih0PVlzKHQpLChuPW51bGw9PW4/MDpibihXcyhuKSwyOTIpKSYmV2UodCkpe3ZhciBpPSgkcyh0KSsiZSIpLnNwbGl0KCJlIik7cmV0dXJuKygoaT0oJHMoZShpWzBdKyJlIisoK2lbMV0rbikpKSsiZSIpLnNwbGl0KCJlIikpWzBdKyJlIisoK2lbMV0tbikpfXJldHVybiBlKHQpfX12YXIgdm89QW4mJjEvdW4obmV3IEFuKFssLTBdKSlbMV09PWM/ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBBbih0KX06SGw7ZnVuY3Rpb24gYm8odCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPUJvKGUpO3JldHVybiBuPT14P3NuKGUpOm49PVQ/aG4oZSk6KGZ1bmN0aW9uIGkodCxlKXtyZXR1cm4gTmUoZSwoZnVuY3Rpb24oZSl7cmV0dXJuW2UsdFtlXV19KSl9KShlLHQoZSkpfX1mdW5jdGlvbiB4byhuLGMsdSxoLGQscCxmLG0pe3ZhciBnPTImYztpZighZyYmImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEx0KGUpO3ZhciBfPWg/aC5sZW5ndGg6MDtpZihffHwoYyY9LTk3LGg9ZD10KSxmPWY9PT10P2Y6dm4oV3MoZiksMCksbT1tPT09dD9tOldzKG0pLF8tPWQ/ZC5sZW5ndGg6MCxjJmEpe3ZhciB5PWgsdj1kO2g9ZD10fXZhciBiPWc/dDprbyhuKSx4PVtuLGMsdSxoLGQseSx2LHAsZixtXTtpZihiJiYoZnVuY3Rpb24gdyh0LGUpe3ZhciBuPXRbMV0scj1lWzFdLG89bnxyLGE9cj09cyYmOD09bnx8cj09cyYmbj09bCYmdFs3XS5sZW5ndGg8PWVbOF18fDM4ND09ciYmZVs3XS5sZW5ndGg8PWVbOF0mJjg9PW47aWYoIShvPDEzMXx8YSkpcmV0dXJuIHQ7MSZyJiYodFsyXT1lWzJdLG98PTEmbj8wOjQpO3ZhciBjPWVbM107aWYoYyl7dmFyIHU9dFszXTt0WzNdPXU/S3IodSxjLGVbNF0pOmMsdFs0XT11P2NuKHRbM10saSk6ZVs0XX1yZXR1cm4oYz1lWzVdKSYmKHRbNV09KHU9dFs1XSk/WnIodSxjLGVbNl0pOmMsdFs2XT11P2NuKHRbNV0saSk6ZVs2XSksKGM9ZVs3XSkmJih0WzddPWMpLHImcyYmKHRbOF09bnVsbD09dFs4XT9lWzhdOmJuKHRbOF0sZVs4XSkpLG51bGw9PXRbOV0mJih0WzldPWVbOV0pLHRbMF09ZVswXSx0WzFdPW8sdH0pKHgsYiksbj14WzBdLGM9eFsxXSx1PXhbMl0saD14WzNdLGQ9eFs0XSwhKG09eFs5XT14WzldPT09dD9nPzA6bi5sZW5ndGg6dm4oeFs5XS1fLDApKSYmMjQmYyYmKGMmPS0yNSksYyYmMSE9YylFPTg9PWN8fGM9PXI/KGZ1bmN0aW9uIFMoZSxuLGkpe3ZhciByPWFvKGUpO3JldHVybiBmdW5jdGlvbiBvKCl7Zm9yKHZhciBhPWFyZ3VtZW50cy5sZW5ndGgscz13dChhKSxsPWEsYz1QbyhvKTtsLS07KXNbbF09YXJndW1lbnRzW2xdO3ZhciB1PWE8MyYmc1swXSE9PWMmJnNbYS0xXSE9PWM/W106Y24ocyxjKTtyZXR1cm4oYS09dS5sZW5ndGgpPGk/X28oZSxuLGNvLG8ucGxhY2Vob2xkZXIsdCxzLHUsdCx0LGktYSk6eGUodGhpcyYmdGhpcyE9PWNlJiZ0aGlzIGluc3RhbmNlb2Ygbz9yOmUsdGhpcyxzKX19KShuLGMsbSk6YyE9byYmMzMhPWN8fGQubGVuZ3RoP2NvLmFwcGx5KHQseCk6KGZ1bmN0aW9uIE0odCxlLG4saSl7dmFyIHI9MSZlLG89YW8odCk7cmV0dXJuIGZ1bmN0aW9uIGUoKXtmb3IodmFyIGE9LTEscz1hcmd1bWVudHMubGVuZ3RoLGw9LTEsYz1pLmxlbmd0aCx1PXd0KGMrcyksaD10aGlzJiZ0aGlzIT09Y2UmJnRoaXMgaW5zdGFuY2VvZiBlP286dDsrK2w8YzspdVtsXT1pW2xdO2Zvcig7cy0tOyl1W2wrK109YXJndW1lbnRzWysrYV07cmV0dXJuIHhlKGgscj9uOnRoaXMsdSl9fSkobixjLHUsaCk7ZWxzZSB2YXIgRT0oZnVuY3Rpb24gVCh0LGUsbil7dmFyIGk9MSZlLHI9YW8odCk7cmV0dXJuIGZ1bmN0aW9uIGUoKXtyZXR1cm4odGhpcyYmdGhpcyE9PWNlJiZ0aGlzIGluc3RhbmNlb2YgZT9yOnQpLmFwcGx5KGk/bjp0aGlzLGFyZ3VtZW50cyl9fSkobixjLHUpO3JldHVybiBpYSgoYj9Tcjp0YSkoRSx4KSxuLGMpfWZ1bmN0aW9uIHdvKGUsbixpLHIpe3JldHVybiBlPT09dHx8aHMoZSxOdFtpXSkmJiFPdC5jYWxsKHIsaSk/bjplfWZ1bmN0aW9uIFNvKGUsbixpLHIsbyxhKXtyZXR1cm4gQ3MoZSkmJkNzKG4pJiYoYS5zZXQobixlKSxocihlLG4sdCxTbyxhKSxhLmRlbGV0ZShuKSksZX1mdW5jdGlvbiBNbyhlKXtyZXR1cm4gTnMoZSk/dDplfWZ1bmN0aW9uIEVvKGUsbixpLHIsbyxhKXt2YXIgcz0xJmksbD1lLmxlbmd0aCxjPW4ubGVuZ3RoO2lmKGwhPWMmJiEocyYmYz5sKSlyZXR1cm4hMTt2YXIgdT1hLmdldChlKSxoPWEuZ2V0KG4pO2lmKHUmJmgpcmV0dXJuIHU9PW4mJmg9PWU7dmFyIGQ9LTEscD0hMCxmPTImaT9uZXcgJG46dDtmb3IoYS5zZXQoZSxuKSxhLnNldChuLGUpOysrZDxsOyl7dmFyIG09ZVtkXSxnPW5bZF07aWYocil2YXIgXz1zP3IoZyxtLGQsbixlLGEpOnIobSxnLGQsZSxuLGEpO2lmKF8hPT10KXtpZihfKWNvbnRpbnVlO3A9ITE7YnJlYWt9aWYoZil7aWYoIXplKG4sKGZ1bmN0aW9uKHQsZSl7aWYoIUplKGYsZSkmJihtPT09dHx8byhtLHQsaSxyLGEpKSlyZXR1cm4gZi5wdXNoKGUpfSkpKXtwPSExO2JyZWFrfX1lbHNlIGlmKG0hPT1nJiYhbyhtLGcsaSxyLGEpKXtwPSExO2JyZWFrfX1yZXR1cm4gYS5kZWxldGUoZSksYS5kZWxldGUobikscH1mdW5jdGlvbiBUbyhlKXtyZXR1cm4gbmEoS28oZSx0LGdhKSxlKyIiKX1mdW5jdGlvbiBDbyh0KXtyZXR1cm4gWWkodCxsbCx6byl9ZnVuY3Rpb24gQW8odCl7cmV0dXJuIFlpKHQsY2wsRG8pfXZhciBrbz1Qbj9mdW5jdGlvbih0KXtyZXR1cm4gUG4uZ2V0KHQpfTpIbDtmdW5jdGlvbiBMbyh0KXtmb3IodmFyIGU9dC5uYW1lKyIiLG49Tm5bZV0saT1PdC5jYWxsKE5uLGUpP24ubGVuZ3RoOjA7aS0tOyl7dmFyIHI9bltpXSxvPXIuZnVuYztpZihudWxsPT1vfHxvPT10KXJldHVybiByLm5hbWV9cmV0dXJuIGV9ZnVuY3Rpb24gUG8odCl7cmV0dXJuKE90LmNhbGwoVm4sInBsYWNlaG9sZGVyIik/Vm46dCkucGxhY2Vob2xkZXJ9ZnVuY3Rpb24gTm8oKXt2YXIgdD1Wbi5pdGVyYXRlZXx8T2w7cmV0dXJuIHQ9dD09PU9sP3JyOnQsYXJndW1lbnRzLmxlbmd0aD90KGFyZ3VtZW50c1swXSxhcmd1bWVudHNbMV0pOnR9ZnVuY3Rpb24gSW8odCxlKXt2YXIgbj10Ll9fZGF0YV9fO3JldHVybihmdW5jdGlvbiBpKHQpe3ZhciBlPXR5cGVvZiB0O3JldHVybiJzdHJpbmciPT1lfHwibnVtYmVyIj09ZXx8InN5bWJvbCI9PWV8fCJib29sZWFuIj09ZT8iX19wcm90b19fIiE9PXQ6bnVsbD09PXR9KShlKT9uWyJzdHJpbmciPT10eXBlb2YgZT8ic3RyaW5nIjoiaGFzaCJdOm4ubWFwfWZ1bmN0aW9uIFJvKHQpe2Zvcih2YXIgZT1sbCh0KSxuPWUubGVuZ3RoO24tLTspe3ZhciBpPWVbbl0scj10W2ldO2Vbbl09W2kscixYbyhyKV19cmV0dXJuIGV9ZnVuY3Rpb24gT28oZSxuKXt2YXIgaT0oZnVuY3Rpb24gcihlLG4pe3JldHVybiBudWxsPT1lP3Q6ZVtuXX0pKGUsbik7cmV0dXJuIGlyKGkpP2k6dH12YXIgem89VGU/ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/W106KHQ9Q3QodCksa2UoVGUodCksKGZ1bmN0aW9uKGUpe3JldHVybiBLdC5jYWxsKHQsZSl9KSkpfTpxbCxEbz1UZT9mdW5jdGlvbih0KXtmb3IodmFyIGU9W107dDspSWUoZSx6byh0KSksdD1xdCh0KTtyZXR1cm4gZX06cWwsQm89WGk7ZnVuY3Rpb24gSG8odCxlLG4pe2Zvcih2YXIgaT0tMSxyPShlPVVyKGUsdCkpLmxlbmd0aCxvPSExOysraTxyOyl7dmFyIGE9bGEoZVtpXSk7aWYoIShvPW51bGwhPXQmJm4odCxhKSkpYnJlYWs7dD10W2FdfXJldHVybiBvfHwrK2khPXI/bzohIShyPW51bGw9PXQ/MDp0Lmxlbmd0aCkmJlRzKHIpJiZVbyhhLHIpJiYobXModCl8fGZzKHQpKX1mdW5jdGlvbiBGbyh0KXtyZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdC5jb25zdHJ1Y3Rvcnx8WW8odCk/e306VW4ocXQodCkpfWZ1bmN0aW9uIFZvKHQpe3JldHVybiBtcyh0KXx8ZnModCl8fCEhKHJlJiZ0JiZ0W3JlXSl9ZnVuY3Rpb24gVW8odCxlKXt2YXIgbj10eXBlb2YgdDtyZXR1cm4hIShlPW51bGw9PWU/dTplKSYmKCJudW1iZXIiPT1ufHwic3ltYm9sIiE9biYmZ3QudGVzdCh0KSkmJnQ+LTEmJnQlMT09MCYmdDxlfWZ1bmN0aW9uIGpvKHQsZSxuKXtpZighQ3MobikpcmV0dXJuITE7dmFyIGk9dHlwZW9mIGU7cmV0dXJuISEoIm51bWJlciI9PWk/eXMobikmJlVvKGUsbi5sZW5ndGgpOiJzdHJpbmciPT1pJiZlIGluIG4pJiZocyhuW2VdLHQpfWZ1bmN0aW9uIEdvKHQsZSl7aWYobXModCkpcmV0dXJuITE7dmFyIG49dHlwZW9mIHQ7cmV0dXJuISgibnVtYmVyIiE9biYmInN5bWJvbCIhPW4mJiJib29sZWFuIiE9biYmbnVsbCE9dCYmIUJzKHQpKXx8Si50ZXN0KHQpfHwhWi50ZXN0KHQpfHxudWxsIT1lJiZ0IGluIEN0KGUpfWZ1bmN0aW9uIFdvKHQpe3ZhciBlPUxvKHQpLG49Vm5bZV07aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG58fCEoZSBpbiBXbi5wcm90b3R5cGUpKXJldHVybiExO2lmKHQ9PT1uKXJldHVybiEwO3ZhciBpPWtvKG4pO3JldHVybiEhaSYmdD09PWlbMF19KEVuJiZCbyhuZXcgRW4obmV3IEFycmF5QnVmZmVyKDEpKSkhPVB8fFRuJiZCbyhuZXcgVG4pIT14fHxDbiYmQm8oQ24ucmVzb2x2ZSgpKSE9TXx8QW4mJkJvKG5ldyBBbikhPVR8fGtuJiZCbyhuZXcga24pIT1rKSYmKEJvPWZ1bmN0aW9uKGUpe3ZhciBuPVhpKGUpLGk9bj09Uz9lLmNvbnN0cnVjdG9yOnQscj1pP2NhKGkpOiIiO2lmKHIpc3dpdGNoKHIpe2Nhc2UgSW46cmV0dXJuIFA7Y2FzZSBSbjpyZXR1cm4geDtjYXNlIE9uOnJldHVybiBNO2Nhc2Ugem46cmV0dXJuIFQ7Y2FzZSBEbjpyZXR1cm4ga31yZXR1cm4gbn0pO3ZhciBxbz1JdD9NczpZbDtmdW5jdGlvbiBZbyh0KXt2YXIgZT10JiZ0LmNvbnN0cnVjdG9yO3JldHVybiB0PT09KCJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLnByb3RvdHlwZXx8TnQpfWZ1bmN0aW9uIFhvKHQpe3JldHVybiB0PT10JiYhQ3ModCl9ZnVuY3Rpb24gJG8oZSxuKXtyZXR1cm4gZnVuY3Rpb24oaSl7cmV0dXJuIG51bGwhPWkmJmlbZV09PT1uJiYobiE9PXR8fGUgaW4gQ3QoaSkpfX1mdW5jdGlvbiBLbyhlLG4saSl7cmV0dXJuIG49dm4obj09PXQ/ZS5sZW5ndGgtMTpuLDApLGZ1bmN0aW9uKCl7Zm9yKHZhciB0PWFyZ3VtZW50cyxyPS0xLG89dm4odC5sZW5ndGgtbiwwKSxhPXd0KG8pOysrcjxvOylhW3JdPXRbbityXTtyPS0xO2Zvcih2YXIgcz13dChuKzEpOysrcjxuOylzW3JdPXRbcl07cmV0dXJuIHNbbl09aShhKSx4ZShlLHRoaXMscyl9fWZ1bmN0aW9uIFpvKHQsZSl7cmV0dXJuIGUubGVuZ3RoPDI/dDpxaSh0LFRyKGUsMCwtMSkpfWZ1bmN0aW9uIEpvKGUsbil7Zm9yKHZhciBpPWUubGVuZ3RoLHI9Ym4obi5sZW5ndGgsaSksbz1KcihlKTtyLS07KXt2YXIgYT1uW3JdO2Vbcl09VW8oYSxpKT9vW2FdOnR9cmV0dXJuIGV9ZnVuY3Rpb24gUW8odCxlKXtpZigoImNvbnN0cnVjdG9yIiE9PWV8fCJmdW5jdGlvbiIhPXR5cGVvZiB0W2VdKSYmIl9fcHJvdG9fXyIhPWUpcmV0dXJuIHRbZV19dmFyIHRhPXJhKFNyKSxlYT1mZXx8ZnVuY3Rpb24odCxlKXtyZXR1cm4gY2Uuc2V0VGltZW91dCh0LGUpfSxuYT1yYShNcik7ZnVuY3Rpb24gaWEodCxlLG4pe3ZhciBpPWUrIiI7cmV0dXJuIG5hKHQsKGZ1bmN0aW9uIGEodCxlKXt2YXIgbj1lLmxlbmd0aDtpZighbilyZXR1cm4gdDt2YXIgaT1uLTE7cmV0dXJuIGVbaV09KG4+MT8iJiAiOiIiKStlW2ldLGU9ZS5qb2luKG4+Mj8iLCAiOiIgIiksdC5yZXBsYWNlKHJ0LCJ7XG4vKiBbd3JhcHBlZCB3aXRoICIrZSsiXSAqL1xuIil9KShpLChmdW5jdGlvbiBvKHQsZSl7cmV0dXJuIE1lKHAsKGZ1bmN0aW9uKG4pe3ZhciBpPSJfLiIrblswXTtlJm5bMV0mJiFMZSh0LGkpJiZ0LnB1c2goaSl9KSksdC5zb3J0KCl9KSgoZnVuY3Rpb24gcih0KXt2YXIgZT10Lm1hdGNoKG90KTtyZXR1cm4gZT9lWzFdLnNwbGl0KGF0KTpbXX0pKGkpLG4pKSl9ZnVuY3Rpb24gcmEoZSl7dmFyIG49MCxpPTA7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9eG4oKSxvPTE2LShyLWkpO2lmKGk9cixvPjApe2lmKCsrbj49ODAwKXJldHVybiBhcmd1bWVudHNbMF19ZWxzZSBuPTA7cmV0dXJuIGUuYXBwbHkodCxhcmd1bWVudHMpfX1mdW5jdGlvbiBvYShlLG4pe3ZhciBpPS0xLHI9ZS5sZW5ndGgsbz1yLTE7Zm9yKG49bj09PXQ/cjpuOysraTxuOyl7dmFyIGE9X3IoaSxvKSxzPWVbYV07ZVthXT1lW2ldLGVbaV09c31yZXR1cm4gZS5sZW5ndGg9bixlfXZhciBhYT0oZnVuY3Rpb24gc2EodCl7dmFyIGU9b3ModCwoZnVuY3Rpb24odCl7cmV0dXJuIDUwMD09PW4uc2l6ZSYmbi5jbGVhcigpLHR9KSksbj1lLmNhY2hlO3JldHVybiBlfSkoKGZ1bmN0aW9uKHQpe3ZhciBlPVtdO3JldHVybiA0Nj09PXQuY2hhckNvZGVBdCgwKSYmZS5wdXNoKCIiKSx0LnJlcGxhY2UoUSwoZnVuY3Rpb24odCxuLGkscil7ZS5wdXNoKGk/ci5yZXBsYWNlKGN0LCIkMSIpOm58fHQpfSkpLGV9KSk7ZnVuY3Rpb24gbGEodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0fHxCcyh0KSlyZXR1cm4gdDt2YXIgZT10KyIiO3JldHVybiIwIj09ZSYmMS90PT0tMS8wPyItMCI6ZX1mdW5jdGlvbiBjYSh0KXtpZihudWxsIT10KXt0cnl7cmV0dXJuIFJ0LmNhbGwodCl9Y2F0Y2godCl7fXRyeXtyZXR1cm4gdCsiIn1jYXRjaCh0KXt9fXJldHVybiIifWZ1bmN0aW9uIHVhKHQpe2lmKHQgaW5zdGFuY2VvZiBXbilyZXR1cm4gdC5jbG9uZSgpO3ZhciBlPW5ldyBHbih0Ll9fd3JhcHBlZF9fLHQuX19jaGFpbl9fKTtyZXR1cm4gZS5fX2FjdGlvbnNfXz1Kcih0Ll9fYWN0aW9uc19fKSxlLl9faW5kZXhfXz10Ll9faW5kZXhfXyxlLl9fdmFsdWVzX189dC5fX3ZhbHVlc19fLGV9dmFyIGhhPXZyKChmdW5jdGlvbih0LGUpe3JldHVybiB2cyh0KT9kaSh0LEZpKGUsMSx2cywhMCkpOltdfSkpLGRhPXZyKChmdW5jdGlvbihlLG4pe3ZhciBpPXhhKG4pO3JldHVybiB2cyhpKSYmKGk9dCksdnMoZSk/ZGkoZSxGaShuLDEsdnMsITApLE5vKGksMikpOltdfSkpLHBhPXZyKChmdW5jdGlvbihlLG4pe3ZhciBpPXhhKG4pO3JldHVybiB2cyhpKSYmKGk9dCksdnMoZSk/ZGkoZSxGaShuLDEsdnMsITApLHQsaSk6W119KSk7ZnVuY3Rpb24gZmEodCxlLG4pe3ZhciBpPW51bGw9PXQ/MDp0Lmxlbmd0aDtpZighaSlyZXR1cm4tMTt2YXIgcj1udWxsPT1uPzA6V3Mobik7cmV0dXJuIHI8MCYmKHI9dm4oaStyLDApKSxIZSh0LE5vKGUsMykscil9ZnVuY3Rpb24gbWEoZSxuLGkpe3ZhciByPW51bGw9PWU/MDplLmxlbmd0aDtpZighcilyZXR1cm4tMTt2YXIgbz1yLTE7cmV0dXJuIGkhPT10JiYobz1XcyhpKSxvPWk8MD92bihyK28sMCk6Ym4obyxyLTEpKSxIZShlLE5vKG4sMyksbywhMCl9ZnVuY3Rpb24gZ2EodCl7cmV0dXJuIG51bGwhPXQmJnQubGVuZ3RoP0ZpKHQsMSk6W119ZnVuY3Rpb24gX2EoZSl7cmV0dXJuIGUmJmUubGVuZ3RoP2VbMF06dH12YXIgeWE9dnIoKGZ1bmN0aW9uKHQpe3ZhciBlPU5lKHQsRnIpO3JldHVybiBlLmxlbmd0aCYmZVswXT09PXRbMF0/SmkoZSk6W119KSksdmE9dnIoKGZ1bmN0aW9uKGUpe3ZhciBuPXhhKGUpLGk9TmUoZSxGcik7cmV0dXJuIG49PT14YShpKT9uPXQ6aS5wb3AoKSxpLmxlbmd0aCYmaVswXT09PWVbMF0/SmkoaSxObyhuLDIpKTpbXX0pKSxiYT12cigoZnVuY3Rpb24oZSl7dmFyIG49eGEoZSksaT1OZShlLEZyKTtyZXR1cm4obj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOnQpJiZpLnBvcCgpLGkubGVuZ3RoJiZpWzBdPT09ZVswXT9KaShpLHQsbik6W119KSk7ZnVuY3Rpb24geGEoZSl7dmFyIG49bnVsbD09ZT8wOmUubGVuZ3RoO3JldHVybiBuP2Vbbi0xXTp0fXZhciB3YT12cihTYSk7ZnVuY3Rpb24gU2EodCxlKXtyZXR1cm4gdCYmdC5sZW5ndGgmJmUmJmUubGVuZ3RoP21yKHQsZSk6dH12YXIgTWE9VG8oKGZ1bmN0aW9uKHQsZSl7dmFyIG49bnVsbD09dD8wOnQubGVuZ3RoLGk9c2kodCxlKTtyZXR1cm4gZ3IodCxOZShlLChmdW5jdGlvbih0KXtyZXR1cm4gVW8odCxuKT8rdDp0fSkpLnNvcnQoJHIpKSxpfSkpO2Z1bmN0aW9uIEVhKHQpe3JldHVybiBudWxsPT10P3Q6TW4uY2FsbCh0KX12YXIgVGE9dnIoKGZ1bmN0aW9uKHQpe3JldHVybiBJcihGaSh0LDEsdnMsITApKX0pKSxDYT12cigoZnVuY3Rpb24oZSl7dmFyIG49eGEoZSk7cmV0dXJuIHZzKG4pJiYobj10KSxJcihGaShlLDEsdnMsITApLE5vKG4sMikpfSkpLEFhPXZyKChmdW5jdGlvbihlKXt2YXIgbj14YShlKTtyZXR1cm4gbj0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOnQsSXIoRmkoZSwxLHZzLCEwKSx0LG4pfSkpO2Z1bmN0aW9uIGthKHQpe2lmKCF0fHwhdC5sZW5ndGgpcmV0dXJuW107dmFyIGU9MDtyZXR1cm4gdD1rZSh0LChmdW5jdGlvbih0KXtpZih2cyh0KSlyZXR1cm4gZT12bih0Lmxlbmd0aCxlKSwhMH0pKSxYZShlLChmdW5jdGlvbihlKXtyZXR1cm4gTmUodCxHZShlKSl9KSl9ZnVuY3Rpb24gTGEoZSxuKXtpZighZXx8IWUubGVuZ3RoKXJldHVybltdO3ZhciBpPWthKGUpO3JldHVybiBudWxsPT1uP2k6TmUoaSwoZnVuY3Rpb24oZSl7cmV0dXJuIHhlKG4sdCxlKX0pKX12YXIgUGE9dnIoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZzKHQpP2RpKHQsZSk6W119KSksTmE9dnIoKGZ1bmN0aW9uKHQpe3JldHVybiBCcihrZSh0LHZzKSl9KSksSWE9dnIoKGZ1bmN0aW9uKGUpe3ZhciBuPXhhKGUpO3JldHVybiB2cyhuKSYmKG49dCksQnIoa2UoZSx2cyksTm8obiwyKSl9KSksUmE9dnIoKGZ1bmN0aW9uKGUpe3ZhciBuPXhhKGUpO3JldHVybiBuPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246dCxCcihrZShlLHZzKSx0LG4pfSkpLE9hPXZyKGthKSx6YT12cigoZnVuY3Rpb24oZSl7dmFyIG49ZS5sZW5ndGgsaT1uPjE/ZVtuLTFdOnQ7cmV0dXJuIGk9ImZ1bmN0aW9uIj09dHlwZW9mIGk/KGUucG9wKCksaSk6dCxMYShlLGkpfSkpO2Z1bmN0aW9uIERhKHQpe3ZhciBlPVZuKHQpO3JldHVybiBlLl9fY2hhaW5fXz0hMCxlfWZ1bmN0aW9uIEJhKHQsZSl7cmV0dXJuIGUodCl9dmFyIEhhPVRvKChmdW5jdGlvbihlKXt2YXIgbj1lLmxlbmd0aCxpPW4/ZVswXTowLHI9dGhpcy5fX3dyYXBwZWRfXyxvPWZ1bmN0aW9uKHQpe3JldHVybiBzaSh0LGUpfTtyZXR1cm4hKG4+MXx8dGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgpJiZyIGluc3RhbmNlb2YgV24mJlVvKGkpPygocj1yLnNsaWNlKGksK2krKG4/MTowKSkpLl9fYWN0aW9uc19fLnB1c2goe2Z1bmM6QmEsYXJnczpbb10sdGhpc0FyZzp0fSksbmV3IEduKHIsdGhpcy5fX2NoYWluX18pLnRocnUoKGZ1bmN0aW9uKGUpe3JldHVybiBuJiYhZS5sZW5ndGgmJmUucHVzaCh0KSxlfSkpKTp0aGlzLnRocnUobyl9KSksRmE9dG8oKGZ1bmN0aW9uKHQsZSxuKXtPdC5jYWxsKHQsbik/Kyt0W25dOmFpKHQsbiwxKX0pKSxWYT1zbyhmYSksVWE9c28obWEpO2Z1bmN0aW9uIGphKHQsZSl7cmV0dXJuKG1zKHQpP01lOk9pKSh0LE5vKGUsMykpfWZ1bmN0aW9uIEdhKHQsZSl7cmV0dXJuKG1zKHQpP0NlOnppKSh0LE5vKGUsMykpfXZhciBXYT10bygoZnVuY3Rpb24odCxlLG4pe090LmNhbGwodCxuKT90W25dLnB1c2goZSk6YWkodCxuLFtlXSl9KSkscWE9dnIoKGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT0tMSxyPSJmdW5jdGlvbiI9PXR5cGVvZiBlLG89eXModCk/d3QodC5sZW5ndGgpOltdO3JldHVybiBPaSh0LChmdW5jdGlvbih0KXtvWysraV09cj94ZShlLHQsbik6UWkodCxlLG4pfSkpLG99KSksWWE9dG8oKGZ1bmN0aW9uKHQsZSxuKXthaSh0LG4sZSl9KSk7ZnVuY3Rpb24gWGEodCxlKXtyZXR1cm4obXModCk/TmU6bHIpKHQsTm8oZSwzKSl9dmFyICRhPXRvKChmdW5jdGlvbih0LGUsbil7dFtuPzA6MV0ucHVzaChlKX0pLChmdW5jdGlvbigpe3JldHVybltbXSxbXV19KSksS2E9dnIoKGZ1bmN0aW9uKHQsZSl7aWYobnVsbD09dClyZXR1cm5bXTt2YXIgbj1lLmxlbmd0aDtyZXR1cm4gbj4xJiZqbyh0LGVbMF0sZVsxXSk/ZT1bXTpuPjImJmpvKGVbMF0sZVsxXSxlWzJdKSYmKGU9W2VbMF1dKSxwcih0LEZpKGUsMSksW10pfSkpLFphPXBlfHxmdW5jdGlvbigpe3JldHVybiBjZS5EYXRlLm5vdygpfTtmdW5jdGlvbiBKYShlLG4saSl7cmV0dXJuIG49aT90Om4seG8oZSxzLHQsdCx0LHQsbj1lJiZudWxsPT1uP2UubGVuZ3RoOm4pfWZ1bmN0aW9uIFFhKG4saSl7dmFyIHI7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGkpdGhyb3cgbmV3IEx0KGUpO3JldHVybiBuPVdzKG4pLGZ1bmN0aW9uKCl7cmV0dXJuLS1uPjAmJihyPWkuYXBwbHkodGhpcyxhcmd1bWVudHMpKSxuPD0xJiYoaT10KSxyfX12YXIgdHM9dnIoKGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT0xO2lmKG4ubGVuZ3RoKXt2YXIgcj1jbihuLFBvKHRzKSk7aXw9b31yZXR1cm4geG8odCxpLGUsbixyKX0pKSxlcz12cigoZnVuY3Rpb24odCxlLG4pe3ZhciBpPTM7aWYobi5sZW5ndGgpe3ZhciByPWNuKG4sUG8oZXMpKTtpfD1vfXJldHVybiB4byhlLGksdCxuLHIpfSkpO2Z1bmN0aW9uIG5zKG4saSxyKXt2YXIgbyxhLHMsbCxjLHUsaD0wLGQ9ITEscD0hMSxmPSEwO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBMdChlKTtmdW5jdGlvbiBtKGUpe3ZhciBpPW8scj1hO3JldHVybiBvPWE9dCxoPWUsbD1uLmFwcGx5KHIsaSl9ZnVuY3Rpb24gZyh0KXtyZXR1cm4gaD10LGM9ZWEoeSxpKSxkP20odCk6bH1mdW5jdGlvbiBfKGUpe3ZhciBuPWUtdTtyZXR1cm4gdT09PXR8fG4+PWl8fG48MHx8cCYmZS1oPj1zfWZ1bmN0aW9uIHkoKXt2YXIgdD1aYSgpO2lmKF8odCkpcmV0dXJuIHYodCk7Yz1lYSh5LChmdW5jdGlvbiBlKHQpe3ZhciBlPWktKHQtdSk7cmV0dXJuIHA/Ym4oZSxzLSh0LWgpKTplfSkodCkpfWZ1bmN0aW9uIHYoZSl7cmV0dXJuIGM9dCxmJiZvP20oZSk6KG89YT10LGwpfWZ1bmN0aW9uIGIoKXt2YXIgZT1aYSgpLG49XyhlKTtpZihvPWFyZ3VtZW50cyxhPXRoaXMsdT1lLG4pe2lmKGM9PT10KXJldHVybiBnKHUpO2lmKHApcmV0dXJuIFdyKGMpLGM9ZWEoeSxpKSxtKHUpfXJldHVybiBjPT09dCYmKGM9ZWEoeSxpKSksbH1yZXR1cm4gaT1ZcyhpKXx8MCxDcyhyKSYmKGQ9ISFyLmxlYWRpbmcscz0ocD0ibWF4V2FpdCJpbiByKT92bihZcyhyLm1heFdhaXQpfHwwLGkpOnMsZj0idHJhaWxpbmciaW4gcj8hIXIudHJhaWxpbmc6ZiksYi5jYW5jZWw9ZnVuY3Rpb24geCgpe2MhPT10JiZXcihjKSxoPTAsbz11PWE9Yz10fSxiLmZsdXNoPWZ1bmN0aW9uIHcoKXtyZXR1cm4gYz09PXQ/bDp2KFphKCkpfSxifXZhciBpcz12cigoZnVuY3Rpb24odCxlKXtyZXR1cm4gaGkodCwxLGUpfSkpLHJzPXZyKChmdW5jdGlvbih0LGUsbil7cmV0dXJuIGhpKHQsWXMoZSl8fDAsbil9KSk7ZnVuY3Rpb24gb3ModCxuKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdHx8bnVsbCE9biYmImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEx0KGUpO3ZhciBpPWZ1bmN0aW9uKCl7dmFyIGU9YXJndW1lbnRzLHI9bj9uLmFwcGx5KHRoaXMsZSk6ZVswXSxvPWkuY2FjaGU7aWYoby5oYXMocikpcmV0dXJuIG8uZ2V0KHIpO3ZhciBhPXQuYXBwbHkodGhpcyxlKTtyZXR1cm4gaS5jYWNoZT1vLnNldChyLGEpfHxvLGF9O3JldHVybiBpLmNhY2hlPW5ldyhvcy5DYWNoZXx8WG4pLGl9ZnVuY3Rpb24gYXModCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEx0KGUpO3JldHVybiBmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cztzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4hdC5jYWxsKHRoaXMpO2Nhc2UgMTpyZXR1cm4hdC5jYWxsKHRoaXMsZVswXSk7Y2FzZSAyOnJldHVybiF0LmNhbGwodGhpcyxlWzBdLGVbMV0pO2Nhc2UgMzpyZXR1cm4hdC5jYWxsKHRoaXMsZVswXSxlWzFdLGVbMl0pfXJldHVybiF0LmFwcGx5KHRoaXMsZSl9fW9zLkNhY2hlPVhuO3ZhciBzcz1qcigoZnVuY3Rpb24odCxlKXt2YXIgbj0oZT0xPT1lLmxlbmd0aCYmbXMoZVswXSk/TmUoZVswXSxLZShObygpKSk6TmUoRmkoZSwxKSxLZShObygpKSkpLmxlbmd0aDtyZXR1cm4gdnIoKGZ1bmN0aW9uKGkpe2Zvcih2YXIgcj0tMSxvPWJuKGkubGVuZ3RoLG4pOysrcjxvOylpW3JdPWVbcl0uY2FsbCh0aGlzLGlbcl0pO3JldHVybiB4ZSh0LHRoaXMsaSl9KSl9KSksbHM9dnIoKGZ1bmN0aW9uKGUsbil7dmFyIGk9Y24obixQbyhscykpO3JldHVybiB4byhlLG8sdCxuLGkpfSkpLGNzPXZyKChmdW5jdGlvbihlLG4pe3ZhciBpPWNuKG4sUG8oY3MpKTtyZXR1cm4geG8oZSxhLHQsbixpKX0pKSx1cz1UbygoZnVuY3Rpb24oZSxuKXtyZXR1cm4geG8oZSxsLHQsdCx0LG4pfSkpO2Z1bmN0aW9uIGhzKHQsZSl7cmV0dXJuIHQ9PT1lfHx0IT10JiZlIT1lfXZhciBkcz1nbygkaSkscHM9Z28oKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ+PWV9KSksZnM9dHIoKGZ1bmN0aW9uKCl7cmV0dXJuIGFyZ3VtZW50c30pKCkpP3RyOmZ1bmN0aW9uKHQpe3JldHVybiBBcyh0KSYmT3QuY2FsbCh0LCJjYWxsZWUiKSYmIUt0LmNhbGwodCwiY2FsbGVlIil9LG1zPXd0LmlzQXJyYXksZ3M9bWU/S2UobWUpOmZ1bmN0aW9uIF9zKHQpe3JldHVybiBBcyh0KSYmWGkodCk9PUx9O2Z1bmN0aW9uIHlzKHQpe3JldHVybiBudWxsIT10JiZUcyh0Lmxlbmd0aCkmJiFNcyh0KX1mdW5jdGlvbiB2cyh0KXtyZXR1cm4gQXModCkmJnlzKHQpfXZhciBicz1EZXx8WWwseHM9Z2U/S2UoZ2UpOmZ1bmN0aW9uIHdzKHQpe3JldHVybiBBcyh0KSYmWGkodCk9PV99O2Z1bmN0aW9uIFNzKHQpe2lmKCFBcyh0KSlyZXR1cm4hMTt2YXIgZT1YaSh0KTtyZXR1cm4gZT09eXx8IltvYmplY3QgRE9NRXhjZXB0aW9uXSI9PWV8fCJzdHJpbmciPT10eXBlb2YgdC5tZXNzYWdlJiYic3RyaW5nIj09dHlwZW9mIHQubmFtZSYmIU5zKHQpfWZ1bmN0aW9uIE1zKHQpe2lmKCFDcyh0KSlyZXR1cm4hMTt2YXIgZT1YaSh0KTtyZXR1cm4gZT09dnx8ZT09Ynx8IltvYmplY3QgQXN5bmNGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBQcm94eV0iPT1lfWZ1bmN0aW9uIEVzKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdCYmdD09V3ModCl9ZnVuY3Rpb24gVHModCl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiB0JiZ0Pi0xJiZ0JTE9PTAmJnQ8PXV9ZnVuY3Rpb24gQ3ModCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuIG51bGwhPXQmJigib2JqZWN0Ij09ZXx8ImZ1bmN0aW9uIj09ZSl9ZnVuY3Rpb24gQXModCl7cmV0dXJuIG51bGwhPXQmJiJvYmplY3QiPT10eXBlb2YgdH12YXIga3M9X2U/S2UoX2UpOmZ1bmN0aW9uIExzKHQpe3JldHVybiBBcyh0KSYmQm8odCk9PXh9O2Z1bmN0aW9uIFBzKHQpe3JldHVybiJudW1iZXIiPT10eXBlb2YgdHx8QXModCkmJlhpKHQpPT13fWZ1bmN0aW9uIE5zKHQpe2lmKCFBcyh0KXx8WGkodCkhPVMpcmV0dXJuITE7dmFyIGU9cXQodCk7aWYobnVsbD09PWUpcmV0dXJuITA7dmFyIG49T3QuY2FsbChlLCJjb25zdHJ1Y3RvciIpJiZlLmNvbnN0cnVjdG9yO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuJiZuIGluc3RhbmNlb2YgbiYmUnQuY2FsbChuKT09SHR9dmFyIElzPXllP0tlKHllKTpmdW5jdGlvbiBScyh0KXtyZXR1cm4gQXModCkmJlhpKHQpPT1FfSxPcz12ZT9LZSh2ZSk6ZnVuY3Rpb24genModCl7cmV0dXJuIEFzKHQpJiZCbyh0KT09VH07ZnVuY3Rpb24gRHModCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0fHwhbXModCkmJkFzKHQpJiZYaSh0KT09Q31mdW5jdGlvbiBCcyh0KXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHR8fEFzKHQpJiZYaSh0KT09QX12YXIgSHM9YmU/S2UoYmUpOmZ1bmN0aW9uIEZzKHQpe3JldHVybiBBcyh0KSYmVHModC5sZW5ndGgpJiYhIW5lW1hpKHQpXX0sVnM9Z28oc3IpLFVzPWdvKChmdW5jdGlvbih0LGUpe3JldHVybiB0PD1lfSkpO2Z1bmN0aW9uIGpzKHQpe2lmKCF0KXJldHVybltdO2lmKHlzKHQpKXJldHVybiBEcyh0KT9wbih0KTpKcih0KTtpZihzZSYmdFtzZV0pcmV0dXJuKGZ1bmN0aW9uIGUodCl7Zm9yKHZhciBlLG49W107IShlPXQubmV4dCgpKS5kb25lOyluLnB1c2goZS52YWx1ZSk7cmV0dXJuIG59KSh0W3NlXSgpKTt2YXIgbj1Cbyh0KTtyZXR1cm4obj09eD9zbjpuPT1UP3VuOl9sKSh0KX1mdW5jdGlvbiBHcyh0KXtyZXR1cm4gdD8odD1Zcyh0KSk9PT1jfHx0PT09LTEvMD8xNzk3NjkzMTM0ODYyMzE1N2UyOTIqKHQ8MD8tMToxKTp0PT10P3Q6MDowPT09dD90OjB9ZnVuY3Rpb24gV3ModCl7dmFyIGU9R3ModCksbj1lJTE7cmV0dXJuIGU9PWU/bj9lLW46ZTowfWZ1bmN0aW9uIHFzKHQpe3JldHVybiB0P2xpKFdzKHQpLDAsZCk6MH1mdW5jdGlvbiBZcyh0KXtpZigibnVtYmVyIj09dHlwZW9mIHQpcmV0dXJuIHQ7aWYoQnModCkpcmV0dXJuIGg7aWYoQ3ModCkpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0LnZhbHVlT2Y/dC52YWx1ZU9mKCk6dDt0PUNzKGUpP2UrIiI6ZX1pZigic3RyaW5nIiE9dHlwZW9mIHQpcmV0dXJuIDA9PT10P3Q6K3Q7dD0kZSh0KTt2YXIgbj1wdC50ZXN0KHQpO3JldHVybiBufHxtdC50ZXN0KHQpP2FlKHQuc2xpY2UoMiksbj8yOjgpOmR0LnRlc3QodCk/aDordH1mdW5jdGlvbiBYcyh0KXtyZXR1cm4gUXIodCxjbCh0KSl9ZnVuY3Rpb24gJHModCl7cmV0dXJuIG51bGw9PXQ/IiI6TnIodCl9dmFyIEtzPWVvKChmdW5jdGlvbih0LGUpe2lmKFlvKGUpfHx5cyhlKSlRcihlLGxsKGUpLHQpO2Vsc2UgZm9yKHZhciBuIGluIGUpT3QuY2FsbChlLG4pJiZuaSh0LG4sZVtuXSl9KSksWnM9ZW8oKGZ1bmN0aW9uKHQsZSl7UXIoZSxjbChlKSx0KX0pKSxKcz1lbygoZnVuY3Rpb24odCxlLG4saSl7UXIoZSxjbChlKSx0LGkpfSkpLFFzPWVvKChmdW5jdGlvbih0LGUsbixpKXtRcihlLGxsKGUpLHQsaSl9KSksdGw9VG8oc2kpLGVsPXZyKChmdW5jdGlvbihlLG4pe2U9Q3QoZSk7dmFyIGk9LTEscj1uLmxlbmd0aCxvPXI+Mj9uWzJdOnQ7Zm9yKG8mJmpvKG5bMF0sblsxXSxvKSYmKHI9MSk7KytpPHI7KWZvcih2YXIgYT1uW2ldLHM9Y2woYSksbD0tMSxjPXMubGVuZ3RoOysrbDxjOyl7dmFyIHU9c1tsXSxoPWVbdV07KGg9PT10fHxocyhoLE50W3VdKSYmIU90LmNhbGwoZSx1KSkmJihlW3VdPWFbdV0pfXJldHVybiBlfSkpLG5sPXZyKChmdW5jdGlvbihlKXtyZXR1cm4gZS5wdXNoKHQsU28pLHhlKGhsLHQsZSl9KSk7ZnVuY3Rpb24gaWwoZSxuLGkpe3ZhciByPW51bGw9PWU/dDpxaShlLG4pO3JldHVybiByPT09dD9pOnJ9ZnVuY3Rpb24gcmwodCxlKXtyZXR1cm4gbnVsbCE9dCYmSG8odCxlLFppKX12YXIgb2w9dW8oKGZ1bmN0aW9uKHQsZSxuKXtudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZS50b1N0cmluZyYmKGU9QnQuY2FsbChlKSksdFtlXT1ufSksUGwoUmwpKSxhbD11bygoZnVuY3Rpb24odCxlLG4pe251bGwhPWUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlLnRvU3RyaW5nJiYoZT1CdC5jYWxsKGUpKSxPdC5jYWxsKHQsZSk/dFtlXS5wdXNoKG4pOnRbZV09W25dfSksTm8pLHNsPXZyKFFpKTtmdW5jdGlvbiBsbCh0KXtyZXR1cm4geXModCk/Wm4odCk6b3IodCl9ZnVuY3Rpb24gY2wodCl7cmV0dXJuIHlzKHQpP1puKHQsITApOmFyKHQpfXZhciB1bD1lbygoZnVuY3Rpb24odCxlLG4pe2hyKHQsZSxuKX0pKSxobD1lbygoZnVuY3Rpb24odCxlLG4saSl7aHIodCxlLG4saSl9KSksZGw9VG8oKGZ1bmN0aW9uKHQsZSl7dmFyIG49e307aWYobnVsbD09dClyZXR1cm4gbjt2YXIgaT0hMTtlPU5lKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBlPVVyKGUsdCksaXx8KGk9ZS5sZW5ndGg+MSksZX0pKSxRcih0LEFvKHQpLG4pLGkmJihuPWNpKG4sNyxNbykpO2Zvcih2YXIgcj1lLmxlbmd0aDtyLS07KVJyKG4sZVtyXSk7cmV0dXJuIG59KSkscGw9VG8oKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/e306KGZ1bmN0aW9uIG4odCxlKXtyZXR1cm4gZnIodCxlLChmdW5jdGlvbihlLG4pe3JldHVybiBybCh0LG4pfSkpfSkodCxlKX0pKTtmdW5jdGlvbiBmbCh0LGUpe2lmKG51bGw9PXQpcmV0dXJue307dmFyIG49TmUoQW8odCksKGZ1bmN0aW9uKHQpe3JldHVyblt0XX0pKTtyZXR1cm4gZT1ObyhlKSxmcih0LG4sKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUodCxuWzBdKX0pKX12YXIgbWw9Ym8obGwpLGdsPWJvKGNsKTtmdW5jdGlvbiBfbCh0KXtyZXR1cm4gbnVsbD09dD9bXTpaZSh0LGxsKHQpKX12YXIgeWw9b28oKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZT1lLnRvTG93ZXJDYXNlKCksdCsobj92bChlKTplKX0pKTtmdW5jdGlvbiB2bCh0KXtyZXR1cm4gQ2woJHModCkudG9Mb3dlckNhc2UoKSl9ZnVuY3Rpb24gYmwodCl7cmV0dXJuKHQ9JHModCkpJiZ0LnJlcGxhY2UoX3Qsbm4pLnJlcGxhY2UoJHQsIiIpfXZhciB4bD1vbygoZnVuY3Rpb24odCxlLG4pe3JldHVybiB0KyhuPyItIjoiIikrZS50b0xvd2VyQ2FzZSgpfSkpLHdsPW9vKChmdW5jdGlvbih0LGUsbil7cmV0dXJuIHQrKG4/IiAiOiIiKStlLnRvTG93ZXJDYXNlKCl9KSksU2w9cm8oInRvTG93ZXJDYXNlIiksTWw9b28oKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdCsobj8iXyI6IiIpK2UudG9Mb3dlckNhc2UoKX0pKSxFbD1vbygoZnVuY3Rpb24odCxlLG4pe3JldHVybiB0KyhuPyIgIjoiIikrQ2woZSl9KSksVGw9b28oKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gdCsobj8iICI6IiIpK2UudG9VcHBlckNhc2UoKX0pKSxDbD1ybygidG9VcHBlckNhc2UiKTtmdW5jdGlvbiBBbChlLG4saSl7cmV0dXJuIGU9JHMoZSksKG49aT90Om4pPT09dD8oZnVuY3Rpb24gcih0KXtyZXR1cm4gUXQudGVzdCh0KX0pKGUpPyhmdW5jdGlvbiBvKHQpe3JldHVybiB0Lm1hdGNoKFp0KXx8W119KShlKTooZnVuY3Rpb24gYSh0KXtyZXR1cm4gdC5tYXRjaChzdCl8fFtdfSkoZSk6ZS5tYXRjaChuKXx8W119dmFyIGtsPXZyKChmdW5jdGlvbihlLG4pe3RyeXtyZXR1cm4geGUoZSx0LG4pfWNhdGNoKHQpe3JldHVybiBTcyh0KT90Om5ldyBNdCh0KX19KSksTGw9VG8oKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1lKGUsKGZ1bmN0aW9uKGUpe2U9bGEoZSksYWkodCxlLHRzKHRbZV0sdCkpfSkpLHR9KSk7ZnVuY3Rpb24gUGwodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fXZhciBObD1sbygpLElsPWxvKCEwKTtmdW5jdGlvbiBSbCh0KXtyZXR1cm4gdH1mdW5jdGlvbiBPbCh0KXtyZXR1cm4gcnIoImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpjaSh0LDEpKX12YXIgemw9dnIoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBRaShuLHQsZSl9fSkpLERsPXZyKChmdW5jdGlvbih0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gUWkodCxuLGUpfX0pKTtmdW5jdGlvbiBCbCh0LGUsbil7dmFyIGk9bGwoZSkscj1XaShlLGkpO251bGwhPW58fENzKGUpJiYoci5sZW5ndGh8fCFpLmxlbmd0aCl8fChuPWUsZT10LHQ9dGhpcyxyPVdpKGUsbGwoZSkpKTt2YXIgbz0hKENzKG4pJiYiY2hhaW4iaW4gbiYmIW4uY2hhaW4pLGE9TXModCk7cmV0dXJuIE1lKHIsKGZ1bmN0aW9uKG4pe3ZhciBpPWVbbl07dFtuXT1pLGEmJih0LnByb3RvdHlwZVtuXT1mdW5jdGlvbigpe3ZhciBlPXRoaXMuX19jaGFpbl9fO2lmKG98fGUpe3ZhciBuPXQodGhpcy5fX3dyYXBwZWRfXykscj1uLl9fYWN0aW9uc19fPUpyKHRoaXMuX19hY3Rpb25zX18pO3JldHVybiByLnB1c2goe2Z1bmM6aSxhcmdzOmFyZ3VtZW50cyx0aGlzQXJnOnR9KSxuLl9fY2hhaW5fXz1lLG59cmV0dXJuIGkuYXBwbHkodCxJZShbdGhpcy52YWx1ZSgpXSxhcmd1bWVudHMpKX0pfSkpLHR9ZnVuY3Rpb24gSGwoKXt9dmFyIEZsPXBvKE5lKSxWbD1wbyhBZSksVWw9cG8oemUpO2Z1bmN0aW9uIGpsKHQpe3JldHVybiBHbyh0KT9HZShsYSh0KSk6KGZ1bmN0aW9uIGUodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBxaShlLHQpfX0pKHQpfXZhciBHbD1tbygpLFdsPW1vKCEwKTtmdW5jdGlvbiBxbCgpe3JldHVybltdfWZ1bmN0aW9uIFlsKCl7cmV0dXJuITF9dmFyIFhsLCRsPWhvKChmdW5jdGlvbih0LGUpe3JldHVybiB0K2V9KSwwKSxLbD15bygiY2VpbCIpLFpsPWhvKChmdW5jdGlvbih0LGUpe3JldHVybiB0L2V9KSwxKSxKbD15bygiZmxvb3IiKSxRbD1obygoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCplfSksMSksdGM9eW8oInJvdW5kIiksZWM9aG8oKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQtZX0pLDApO3JldHVybiBWbi5hZnRlcj1mdW5jdGlvbiBuYyh0LG4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBMdChlKTtyZXR1cm4gdD1Xcyh0KSxmdW5jdGlvbigpe2lmKC0tdDwxKXJldHVybiBuLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19LFZuLmFyeT1KYSxWbi5hc3NpZ249S3MsVm4uYXNzaWduSW49WnMsVm4uYXNzaWduSW5XaXRoPUpzLFZuLmFzc2lnbldpdGg9UXMsVm4uYXQ9dGwsVm4uYmVmb3JlPVFhLFZuLmJpbmQ9dHMsVm4uYmluZEFsbD1MbCxWbi5iaW5kS2V5PWVzLFZuLmNhc3RBcnJheT1mdW5jdGlvbiBpYygpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybltdO3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gbXModCk/dDpbdF19LFZuLmNoYWluPURhLFZuLmNodW5rPWZ1bmN0aW9uIHJjKGUsbixpKXtuPShpP2pvKGUsbixpKTpuPT09dCk/MTp2bihXcyhuKSwwKTt2YXIgcj1udWxsPT1lPzA6ZS5sZW5ndGg7aWYoIXJ8fG48MSlyZXR1cm5bXTtmb3IodmFyIG89MCxhPTAscz13dChTZShyL24pKTtvPHI7KXNbYSsrXT1UcihlLG8sbys9bik7cmV0dXJuIHN9LFZuLmNvbXBhY3Q9ZnVuY3Rpb24gb2ModCl7Zm9yKHZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoLGk9MCxyPVtdOysrZTxuOyl7dmFyIG89dFtlXTtvJiYocltpKytdPW8pfXJldHVybiByfSxWbi5jb25jYXQ9ZnVuY3Rpb24gYWMoKXt2YXIgdD1hcmd1bWVudHMubGVuZ3RoO2lmKCF0KXJldHVybltdO2Zvcih2YXIgZT13dCh0LTEpLG49YXJndW1lbnRzWzBdLGk9dDtpLS07KWVbaS0xXT1hcmd1bWVudHNbaV07cmV0dXJuIEllKG1zKG4pP0pyKG4pOltuXSxGaShlLDEpKX0sVm4uY29uZD1mdW5jdGlvbiBzYyh0KXt2YXIgbj1udWxsPT10PzA6dC5sZW5ndGgsaT1ObygpO3JldHVybiB0PW4/TmUodCwoZnVuY3Rpb24odCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHRbMV0pdGhyb3cgbmV3IEx0KGUpO3JldHVybltpKHRbMF0pLHRbMV1dfSkpOltdLHZyKChmdW5jdGlvbihlKXtmb3IodmFyIGk9LTE7KytpPG47KXt2YXIgcj10W2ldO2lmKHhlKHJbMF0sdGhpcyxlKSlyZXR1cm4geGUoclsxXSx0aGlzLGUpfX0pKX0sVm4uY29uZm9ybXM9ZnVuY3Rpb24gbGModCl7cmV0dXJuKGZ1bmN0aW9uIGUodCl7dmFyIGU9bGwodCk7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB1aShuLHQsZSl9fSkoY2kodCwxKSl9LFZuLmNvbnN0YW50PVBsLFZuLmNvdW50Qnk9RmEsVm4uY3JlYXRlPWZ1bmN0aW9uIGNjKHQsZSl7dmFyIG49VW4odCk7cmV0dXJuIG51bGw9PWU/bjpvaShuLGUpfSxWbi5jdXJyeT1mdW5jdGlvbiBlKG4saSxyKXt2YXIgbz14byhuLDgsdCx0LHQsdCx0LGk9cj90OmkpO3JldHVybiBvLnBsYWNlaG9sZGVyPWUucGxhY2Vob2xkZXIsb30sVm4uY3VycnlSaWdodD1mdW5jdGlvbiBlKG4saSxvKXt2YXIgYT14byhuLHIsdCx0LHQsdCx0LGk9bz90OmkpO3JldHVybiBhLnBsYWNlaG9sZGVyPWUucGxhY2Vob2xkZXIsYX0sVm4uZGVib3VuY2U9bnMsVm4uZGVmYXVsdHM9ZWwsVm4uZGVmYXVsdHNEZWVwPW5sLFZuLmRlZmVyPWlzLFZuLmRlbGF5PXJzLFZuLmRpZmZlcmVuY2U9aGEsVm4uZGlmZmVyZW5jZUJ5PWRhLFZuLmRpZmZlcmVuY2VXaXRoPXBhLFZuLmRyb3A9ZnVuY3Rpb24gdWMoZSxuLGkpe3ZhciByPW51bGw9PWU/MDplLmxlbmd0aDtyZXR1cm4gcj9UcihlLChuPWl8fG49PT10PzE6V3MobikpPDA/MDpuLHIpOltdfSxWbi5kcm9wUmlnaHQ9ZnVuY3Rpb24gaGMoZSxuLGkpe3ZhciByPW51bGw9PWU/MDplLmxlbmd0aDtyZXR1cm4gcj9UcihlLDAsKG49ci0obj1pfHxuPT09dD8xOldzKG4pKSk8MD8wOm4pOltdfSxWbi5kcm9wUmlnaHRXaGlsZT1mdW5jdGlvbiBkYyh0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD96cih0LE5vKGUsMyksITAsITApOltdfSxWbi5kcm9wV2hpbGU9ZnVuY3Rpb24gcGModCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/enIodCxObyhlLDMpLCEwKTpbXX0sVm4uZmlsbD1mdW5jdGlvbiBmYyhlLG4saSxyKXt2YXIgbz1udWxsPT1lPzA6ZS5sZW5ndGg7cmV0dXJuIG8/KGkmJiJudW1iZXIiIT10eXBlb2YgaSYmam8oZSxuLGkpJiYoaT0wLHI9byksKGZ1bmN0aW9uIGEoZSxuLGkscil7dmFyIG89ZS5sZW5ndGg7Zm9yKChpPVdzKGkpKTwwJiYoaT0taT5vPzA6bytpKSwocj1yPT09dHx8cj5vP286V3MocikpPDAmJihyKz1vKSxyPWk+cj8wOnFzKHIpO2k8cjspZVtpKytdPW47cmV0dXJuIGV9KShlLG4saSxyKSk6W119LFZuLmZpbHRlcj1mdW5jdGlvbiBtYyh0LGUpe3JldHVybihtcyh0KT9rZTpIaSkodCxObyhlLDMpKX0sVm4uZmxhdE1hcD1mdW5jdGlvbiBnYyh0LGUpe3JldHVybiBGaShYYSh0LGUpLDEpfSxWbi5mbGF0TWFwRGVlcD1mdW5jdGlvbiBfYyh0LGUpe3JldHVybiBGaShYYSh0LGUpLGMpfSxWbi5mbGF0TWFwRGVwdGg9ZnVuY3Rpb24geWMoZSxuLGkpe3JldHVybiBpPWk9PT10PzE6V3MoaSksRmkoWGEoZSxuKSxpKX0sVm4uZmxhdHRlbj1nYSxWbi5mbGF0dGVuRGVlcD1mdW5jdGlvbiB2Yyh0KXtyZXR1cm4gbnVsbCE9dCYmdC5sZW5ndGg/RmkodCxjKTpbXX0sVm4uZmxhdHRlbkRlcHRoPWZ1bmN0aW9uIGJjKGUsbil7cmV0dXJuIG51bGwhPWUmJmUubGVuZ3RoP0ZpKGUsbj1uPT09dD8xOldzKG4pKTpbXX0sVm4uZmxpcD1mdW5jdGlvbiB4Yyh0KXtyZXR1cm4geG8odCw1MTIpfSxWbi5mbG93PU5sLFZuLmZsb3dSaWdodD1JbCxWbi5mcm9tUGFpcnM9ZnVuY3Rpb24gd2ModCl7Zm9yKHZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoLGk9e307KytlPG47KXt2YXIgcj10W2VdO2lbclswXV09clsxXX1yZXR1cm4gaX0sVm4uZnVuY3Rpb25zPWZ1bmN0aW9uIFNjKHQpe3JldHVybiBudWxsPT10P1tdOldpKHQsbGwodCkpfSxWbi5mdW5jdGlvbnNJbj1mdW5jdGlvbiBNYyh0KXtyZXR1cm4gbnVsbD09dD9bXTpXaSh0LGNsKHQpKX0sVm4uZ3JvdXBCeT1XYSxWbi5pbml0aWFsPWZ1bmN0aW9uIEVjKHQpe3JldHVybiBudWxsIT10JiZ0Lmxlbmd0aD9Ucih0LDAsLTEpOltdfSxWbi5pbnRlcnNlY3Rpb249eWEsVm4uaW50ZXJzZWN0aW9uQnk9dmEsVm4uaW50ZXJzZWN0aW9uV2l0aD1iYSxWbi5pbnZlcnQ9b2wsVm4uaW52ZXJ0Qnk9YWwsVm4uaW52b2tlTWFwPXFhLFZuLml0ZXJhdGVlPU9sLFZuLmtleUJ5PVlhLFZuLmtleXM9bGwsVm4ua2V5c0luPWNsLFZuLm1hcD1YYSxWbi5tYXBLZXlzPWZ1bmN0aW9uIFRjKHQsZSl7dmFyIG49e307cmV0dXJuIGU9Tm8oZSwzKSxqaSh0LChmdW5jdGlvbih0LGkscil7YWkobixlKHQsaSxyKSx0KX0pKSxufSxWbi5tYXBWYWx1ZXM9ZnVuY3Rpb24gQ2ModCxlKXt2YXIgbj17fTtyZXR1cm4gZT1ObyhlLDMpLGppKHQsKGZ1bmN0aW9uKHQsaSxyKXthaShuLGksZSh0LGkscikpfSkpLG59LFZuLm1hdGNoZXM9ZnVuY3Rpb24gQWModCl7cmV0dXJuIGNyKGNpKHQsMSkpfSxWbi5tYXRjaGVzUHJvcGVydHk9ZnVuY3Rpb24ga2ModCxlKXtyZXR1cm4gdXIodCxjaShlLDEpKX0sVm4ubWVtb2l6ZT1vcyxWbi5tZXJnZT11bCxWbi5tZXJnZVdpdGg9aGwsVm4ubWV0aG9kPXpsLFZuLm1ldGhvZE9mPURsLFZuLm1peGluPUJsLFZuLm5lZ2F0ZT1hcyxWbi5udGhBcmc9ZnVuY3Rpb24gTGModCl7cmV0dXJuIHQ9V3ModCksdnIoKGZ1bmN0aW9uKGUpe3JldHVybiBkcihlLHQpfSkpfSxWbi5vbWl0PWRsLFZuLm9taXRCeT1mdW5jdGlvbiBQYyh0LGUpe3JldHVybiBmbCh0LGFzKE5vKGUpKSl9LFZuLm9uY2U9ZnVuY3Rpb24gTmModCl7cmV0dXJuIFFhKDIsdCl9LFZuLm9yZGVyQnk9ZnVuY3Rpb24gSWMoZSxuLGkscil7cmV0dXJuIG51bGw9PWU/W106KG1zKG4pfHwobj1udWxsPT1uP1tdOltuXSksbXMoaT1yP3Q6aSl8fChpPW51bGw9PWk/W106W2ldKSxwcihlLG4saSkpfSxWbi5vdmVyPUZsLFZuLm92ZXJBcmdzPXNzLFZuLm92ZXJFdmVyeT1WbCxWbi5vdmVyU29tZT1VbCxWbi5wYXJ0aWFsPWxzLFZuLnBhcnRpYWxSaWdodD1jcyxWbi5wYXJ0aXRpb249JGEsVm4ucGljaz1wbCxWbi5waWNrQnk9ZmwsVm4ucHJvcGVydHk9amwsVm4ucHJvcGVydHlPZj1mdW5jdGlvbiBSYyhlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIG51bGw9PWU/dDpxaShlLG4pfX0sVm4ucHVsbD13YSxWbi5wdWxsQWxsPVNhLFZuLnB1bGxBbGxCeT1mdW5jdGlvbiBPYyh0LGUsbil7cmV0dXJuIHQmJnQubGVuZ3RoJiZlJiZlLmxlbmd0aD9tcih0LGUsTm8obiwyKSk6dH0sVm4ucHVsbEFsbFdpdGg9ZnVuY3Rpb24gemMoZSxuLGkpe3JldHVybiBlJiZlLmxlbmd0aCYmbiYmbi5sZW5ndGg/bXIoZSxuLHQsaSk6ZX0sVm4ucHVsbEF0PU1hLFZuLnJhbmdlPUdsLFZuLnJhbmdlUmlnaHQ9V2wsVm4ucmVhcmc9dXMsVm4ucmVqZWN0PWZ1bmN0aW9uIERjKHQsZSl7cmV0dXJuKG1zKHQpP2tlOkhpKSh0LGFzKE5vKGUsMykpKX0sVm4ucmVtb3ZlPWZ1bmN0aW9uIEJjKHQsZSl7dmFyIG49W107aWYoIXR8fCF0Lmxlbmd0aClyZXR1cm4gbjt2YXIgaT0tMSxyPVtdLG89dC5sZW5ndGg7Zm9yKGU9Tm8oZSwzKTsrK2k8bzspe3ZhciBhPXRbaV07ZShhLGksdCkmJihuLnB1c2goYSksci5wdXNoKGkpKX1yZXR1cm4gZ3IodCxyKSxufSxWbi5yZXN0PWZ1bmN0aW9uIEhjKG4saSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIG4pdGhyb3cgbmV3IEx0KGUpO3JldHVybiB2cihuLGk9aT09PXQ/aTpXcyhpKSl9LFZuLnJldmVyc2U9RWEsVm4uc2FtcGxlU2l6ZT1mdW5jdGlvbiBGYyhlLG4saSl7cmV0dXJuIG49KGk/am8oZSxuLGkpOm49PT10KT8xOldzKG4pLChtcyhlKT9Rbjp4cikoZSxuKX0sVm4uc2V0PWZ1bmN0aW9uIFZjKHQsZSxuKXtyZXR1cm4gbnVsbD09dD90OndyKHQsZSxuKX0sVm4uc2V0V2l0aD1mdW5jdGlvbiBVYyhlLG4saSxyKXtyZXR1cm4gcj0iZnVuY3Rpb24iPT10eXBlb2Ygcj9yOnQsbnVsbD09ZT9lOndyKGUsbixpLHIpfSxWbi5zaHVmZmxlPWZ1bmN0aW9uIGpjKHQpe3JldHVybihtcyh0KT90aTpFcikodCl9LFZuLnNsaWNlPWZ1bmN0aW9uIEdjKGUsbixpKXt2YXIgcj1udWxsPT1lPzA6ZS5sZW5ndGg7cmV0dXJuIHI/KGkmJiJudW1iZXIiIT10eXBlb2YgaSYmam8oZSxuLGkpPyhuPTAsaT1yKToobj1udWxsPT1uPzA6V3MobiksaT1pPT09dD9yOldzKGkpKSxUcihlLG4saSkpOltdfSxWbi5zb3J0Qnk9S2EsVm4uc29ydGVkVW5pcT1mdW5jdGlvbiBXYyh0KXtyZXR1cm4gdCYmdC5sZW5ndGg/THIodCk6W119LFZuLnNvcnRlZFVuaXFCeT1mdW5jdGlvbiBxYyh0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD9Mcih0LE5vKGUsMikpOltdfSxWbi5zcGxpdD1mdW5jdGlvbiBZYyhlLG4saSl7cmV0dXJuIGkmJiJudW1iZXIiIT10eXBlb2YgaSYmam8oZSxuLGkpJiYobj1pPXQpLChpPWk9PT10P2Q6aT4+PjApPyhlPSRzKGUpKSYmKCJzdHJpbmciPT10eXBlb2Ygbnx8bnVsbCE9biYmIUlzKG4pKSYmIShuPU5yKG4pKSYmYW4oZSk/R3IocG4oZSksMCxpKTplLnNwbGl0KG4saSk6W119LFZuLnNwcmVhZD1mdW5jdGlvbiBYYyh0LG4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBMdChlKTtyZXR1cm4gbj1udWxsPT1uPzA6dm4oV3MobiksMCksdnIoKGZ1bmN0aW9uKGUpe3ZhciBpPWVbbl0scj1HcihlLDAsbik7cmV0dXJuIGkmJkllKHIsaSkseGUodCx0aGlzLHIpfSkpfSxWbi50YWlsPWZ1bmN0aW9uICRjKHQpe3ZhciBlPW51bGw9PXQ/MDp0Lmxlbmd0aDtyZXR1cm4gZT9Ucih0LDEsZSk6W119LFZuLnRha2U9ZnVuY3Rpb24gS2MoZSxuLGkpe3JldHVybiBlJiZlLmxlbmd0aD9UcihlLDAsKG49aXx8bj09PXQ/MTpXcyhuKSk8MD8wOm4pOltdfSxWbi50YWtlUmlnaHQ9ZnVuY3Rpb24gWmMoZSxuLGkpe3ZhciByPW51bGw9PWU/MDplLmxlbmd0aDtyZXR1cm4gcj9UcihlLChuPXItKG49aXx8bj09PXQ/MTpXcyhuKSkpPDA/MDpuLHIpOltdfSxWbi50YWtlUmlnaHRXaGlsZT1mdW5jdGlvbiBKYyh0LGUpe3JldHVybiB0JiZ0Lmxlbmd0aD96cih0LE5vKGUsMyksITEsITApOltdfSxWbi50YWtlV2hpbGU9ZnVuY3Rpb24gUWModCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg/enIodCxObyhlLDMpKTpbXX0sVm4udGFwPWZ1bmN0aW9uIHR1KHQsZSl7cmV0dXJuIGUodCksdH0sVm4udGhyb3R0bGU9ZnVuY3Rpb24gZXUodCxuLGkpe3ZhciByPSEwLG89ITA7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEx0KGUpO3JldHVybiBDcyhpKSYmKHI9ImxlYWRpbmciaW4gaT8hIWkubGVhZGluZzpyLG89InRyYWlsaW5nImluIGk/ISFpLnRyYWlsaW5nOm8pLG5zKHQsbix7bGVhZGluZzpyLG1heFdhaXQ6bix0cmFpbGluZzpvfSl9LFZuLnRocnU9QmEsVm4udG9BcnJheT1qcyxWbi50b1BhaXJzPW1sLFZuLnRvUGFpcnNJbj1nbCxWbi50b1BhdGg9ZnVuY3Rpb24gbnUodCl7cmV0dXJuIG1zKHQpP05lKHQsbGEpOkJzKHQpP1t0XTpKcihhYSgkcyh0KSkpfSxWbi50b1BsYWluT2JqZWN0PVhzLFZuLnRyYW5zZm9ybT1mdW5jdGlvbiBpdSh0LGUsbil7dmFyIGk9bXModCkscj1pfHxicyh0KXx8SHModCk7aWYoZT1ObyhlLDQpLG51bGw9PW4pe3ZhciBvPXQmJnQuY29uc3RydWN0b3I7bj1yP2k/bmV3IG86W106Q3ModCkmJk1zKG8pP1VuKHF0KHQpKTp7fX1yZXR1cm4ocj9NZTpqaSkodCwoZnVuY3Rpb24odCxpLHIpe3JldHVybiBlKG4sdCxpLHIpfSkpLG59LFZuLnVuYXJ5PWZ1bmN0aW9uIHJ1KHQpe3JldHVybiBKYSh0LDEpfSxWbi51bmlvbj1UYSxWbi51bmlvbkJ5PUNhLFZuLnVuaW9uV2l0aD1BYSxWbi51bmlxPWZ1bmN0aW9uIG91KHQpe3JldHVybiB0JiZ0Lmxlbmd0aD9Jcih0KTpbXX0sVm4udW5pcUJ5PWZ1bmN0aW9uIGF1KHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP0lyKHQsTm8oZSwyKSk6W119LFZuLnVuaXFXaXRoPWZ1bmN0aW9uIHN1KGUsbil7cmV0dXJuIG49ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp0LGUmJmUubGVuZ3RoP0lyKGUsdCxuKTpbXX0sVm4udW5zZXQ9ZnVuY3Rpb24gbHUodCxlKXtyZXR1cm4gbnVsbD09dHx8UnIodCxlKX0sVm4udW56aXA9a2EsVm4udW56aXBXaXRoPUxhLFZuLnVwZGF0ZT1mdW5jdGlvbiBjdSh0LGUsbil7cmV0dXJuIG51bGw9PXQ/dDpPcih0LGUsVnIobikpfSxWbi51cGRhdGVXaXRoPWZ1bmN0aW9uIHV1KGUsbixpLHIpe3JldHVybiByPSJmdW5jdGlvbiI9PXR5cGVvZiByP3I6dCxudWxsPT1lP2U6T3IoZSxuLFZyKGkpLHIpfSxWbi52YWx1ZXM9X2wsVm4udmFsdWVzSW49ZnVuY3Rpb24gaHUodCl7cmV0dXJuIG51bGw9PXQ/W106WmUodCxjbCh0KSl9LFZuLndpdGhvdXQ9UGEsVm4ud29yZHM9QWwsVm4ud3JhcD1mdW5jdGlvbiBkdSh0LGUpe3JldHVybiBscyhWcihlKSx0KX0sVm4ueG9yPU5hLFZuLnhvckJ5PUlhLFZuLnhvcldpdGg9UmEsVm4uemlwPU9hLFZuLnppcE9iamVjdD1mdW5jdGlvbiBwdSh0LGUpe3JldHVybiBIcih0fHxbXSxlfHxbXSxuaSl9LFZuLnppcE9iamVjdERlZXA9ZnVuY3Rpb24gZnUodCxlKXtyZXR1cm4gSHIodHx8W10sZXx8W10sd3IpfSxWbi56aXBXaXRoPXphLFZuLmVudHJpZXM9bWwsVm4uZW50cmllc0luPWdsLFZuLmV4dGVuZD1acyxWbi5leHRlbmRXaXRoPUpzLEJsKFZuLFZuKSxWbi5hZGQ9JGwsVm4uYXR0ZW1wdD1rbCxWbi5jYW1lbENhc2U9eWwsVm4uY2FwaXRhbGl6ZT12bCxWbi5jZWlsPUtsLFZuLmNsYW1wPWZ1bmN0aW9uIG11KGUsbixpKXtyZXR1cm4gaT09PXQmJihpPW4sbj10KSxpIT09dCYmKGk9KGk9WXMoaSkpPT1pP2k6MCksbiE9PXQmJihuPShuPVlzKG4pKT09bj9uOjApLGxpKFlzKGUpLG4saSl9LFZuLmNsb25lPWZ1bmN0aW9uIGd1KHQpe3JldHVybiBjaSh0LDQpfSxWbi5jbG9uZURlZXA9ZnVuY3Rpb24gX3UodCl7cmV0dXJuIGNpKHQsNSl9LFZuLmNsb25lRGVlcFdpdGg9ZnVuY3Rpb24geXUoZSxuKXtyZXR1cm4gY2koZSw1LG49ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjp0KX0sVm4uY2xvbmVXaXRoPWZ1bmN0aW9uIHZ1KGUsbil7cmV0dXJuIGNpKGUsNCxuPSJmdW5jdGlvbiI9PXR5cGVvZiBuP246dCl9LFZuLmNvbmZvcm1zVG89ZnVuY3Rpb24gYnUodCxlKXtyZXR1cm4gbnVsbD09ZXx8dWkodCxlLGxsKGUpKX0sVm4uZGVidXJyPWJsLFZuLmRlZmF1bHRUbz1mdW5jdGlvbiB4dSh0LGUpe3JldHVybiBudWxsPT10fHx0IT10P2U6dH0sVm4uZGl2aWRlPVpsLFZuLmVuZHNXaXRoPWZ1bmN0aW9uIHd1KGUsbixpKXtlPSRzKGUpLG49TnIobik7dmFyIHI9ZS5sZW5ndGgsbz1pPWk9PT10P3I6bGkoV3MoaSksMCxyKTtyZXR1cm4oaS09bi5sZW5ndGgpPj0wJiZlLnNsaWNlKGksbyk9PW59LFZuLmVxPWhzLFZuLmVzY2FwZT1mdW5jdGlvbiBTdSh0KXtyZXR1cm4odD0kcyh0KSkmJlkudGVzdCh0KT90LnJlcGxhY2UoVyxybik6dH0sVm4uZXNjYXBlUmVnRXhwPWZ1bmN0aW9uIE11KHQpe3JldHVybih0PSRzKHQpKSYmZXQudGVzdCh0KT90LnJlcGxhY2UodHQsIlxcJCYiKTp0fSxWbi5ldmVyeT1mdW5jdGlvbiBFdShlLG4saSl7dmFyIHI9bXMoZSk/QWU6RGk7cmV0dXJuIGkmJmpvKGUsbixpKSYmKG49dCkscihlLE5vKG4sMykpfSxWbi5maW5kPVZhLFZuLmZpbmRJbmRleD1mYSxWbi5maW5kS2V5PWZ1bmN0aW9uIFR1KHQsZSl7cmV0dXJuIEJlKHQsTm8oZSwzKSxqaSl9LFZuLmZpbmRMYXN0PVVhLFZuLmZpbmRMYXN0SW5kZXg9bWEsVm4uZmluZExhc3RLZXk9ZnVuY3Rpb24gQ3UodCxlKXtyZXR1cm4gQmUodCxObyhlLDMpLEdpKX0sVm4uZmxvb3I9SmwsVm4uZm9yRWFjaD1qYSxWbi5mb3JFYWNoUmlnaHQ9R2EsVm4uZm9ySW49ZnVuY3Rpb24gQXUodCxlKXtyZXR1cm4gbnVsbD09dD90OlZpKHQsTm8oZSwzKSxjbCl9LFZuLmZvckluUmlnaHQ9ZnVuY3Rpb24ga3UodCxlKXtyZXR1cm4gbnVsbD09dD90OlVpKHQsTm8oZSwzKSxjbCl9LFZuLmZvck93bj1mdW5jdGlvbiBMdSh0LGUpe3JldHVybiB0JiZqaSh0LE5vKGUsMykpfSxWbi5mb3JPd25SaWdodD1mdW5jdGlvbiBQdSh0LGUpe3JldHVybiB0JiZHaSh0LE5vKGUsMykpfSxWbi5nZXQ9aWwsVm4uZ3Q9ZHMsVm4uZ3RlPXBzLFZuLmhhcz1mdW5jdGlvbiBOdSh0LGUpe3JldHVybiBudWxsIT10JiZIbyh0LGUsS2kpfSxWbi5oYXNJbj1ybCxWbi5oZWFkPV9hLFZuLmlkZW50aXR5PVJsLFZuLmluY2x1ZGVzPWZ1bmN0aW9uIEl1KHQsZSxuLGkpe3Q9eXModCk/dDpfbCh0KSxuPW4mJiFpP1dzKG4pOjA7dmFyIHI9dC5sZW5ndGg7cmV0dXJuIG48MCYmKG49dm4ocituLDApKSxEcyh0KT9uPD1yJiZ0LmluZGV4T2YoZSxuKT4tMTohIXImJkZlKHQsZSxuKT4tMX0sVm4uaW5kZXhPZj1mdW5jdGlvbiBSdSh0LGUsbil7dmFyIGk9bnVsbD09dD8wOnQubGVuZ3RoO2lmKCFpKXJldHVybi0xO3ZhciByPW51bGw9PW4/MDpXcyhuKTtyZXR1cm4gcjwwJiYocj12bihpK3IsMCkpLEZlKHQsZSxyKX0sVm4uaW5SYW5nZT1mdW5jdGlvbiBPdShlLG4saSl7cmV0dXJuIG49R3MobiksaT09PXQ/KGk9bixuPTApOmk9R3MoaSksKGZ1bmN0aW9uIHIodCxlLG4pe3JldHVybiB0Pj1ibihlLG4pJiZ0PHZuKGUsbil9KShlPVlzKGUpLG4saSl9LFZuLmludm9rZT1zbCxWbi5pc0FyZ3VtZW50cz1mcyxWbi5pc0FycmF5PW1zLFZuLmlzQXJyYXlCdWZmZXI9Z3MsVm4uaXNBcnJheUxpa2U9eXMsVm4uaXNBcnJheUxpa2VPYmplY3Q9dnMsVm4uaXNCb29sZWFuPWZ1bmN0aW9uIHp1KHQpe3JldHVybiEwPT09dHx8ITE9PT10fHxBcyh0KSYmWGkodCk9PWd9LFZuLmlzQnVmZmVyPWJzLFZuLmlzRGF0ZT14cyxWbi5pc0VsZW1lbnQ9ZnVuY3Rpb24gRHUodCl7cmV0dXJuIEFzKHQpJiYxPT09dC5ub2RlVHlwZSYmIU5zKHQpfSxWbi5pc0VtcHR5PWZ1bmN0aW9uIEJ1KHQpe2lmKG51bGw9PXQpcmV0dXJuITA7aWYoeXModCkmJihtcyh0KXx8InN0cmluZyI9PXR5cGVvZiB0fHwiZnVuY3Rpb24iPT10eXBlb2YgdC5zcGxpY2V8fGJzKHQpfHxIcyh0KXx8ZnModCkpKXJldHVybiF0Lmxlbmd0aDt2YXIgZT1Cbyh0KTtpZihlPT14fHxlPT1UKXJldHVybiF0LnNpemU7aWYoWW8odCkpcmV0dXJuIW9yKHQpLmxlbmd0aDtmb3IodmFyIG4gaW4gdClpZihPdC5jYWxsKHQsbikpcmV0dXJuITE7cmV0dXJuITB9LFZuLmlzRXF1YWw9ZnVuY3Rpb24gSHUodCxlKXtyZXR1cm4gZXIodCxlKX0sVm4uaXNFcXVhbFdpdGg9ZnVuY3Rpb24gRnUoZSxuLGkpe3ZhciByPShpPSJmdW5jdGlvbiI9PXR5cGVvZiBpP2k6dCk/aShlLG4pOnQ7cmV0dXJuIHI9PT10P2VyKGUsbix0LGkpOiEhcn0sVm4uaXNFcnJvcj1TcyxWbi5pc0Zpbml0ZT1mdW5jdGlvbiBWdSh0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQmJldlKHQpfSxWbi5pc0Z1bmN0aW9uPU1zLFZuLmlzSW50ZWdlcj1FcyxWbi5pc0xlbmd0aD1UcyxWbi5pc01hcD1rcyxWbi5pc01hdGNoPWZ1bmN0aW9uIFV1KHQsZSl7cmV0dXJuIHQ9PT1lfHxucih0LGUsUm8oZSkpfSxWbi5pc01hdGNoV2l0aD1mdW5jdGlvbiBqdShlLG4saSl7cmV0dXJuIGk9ImZ1bmN0aW9uIj09dHlwZW9mIGk/aTp0LG5yKGUsbixSbyhuKSxpKX0sVm4uaXNOYU49ZnVuY3Rpb24gR3UodCl7cmV0dXJuIFBzKHQpJiZ0IT0rdH0sVm4uaXNOYXRpdmU9ZnVuY3Rpb24gV3UodCl7aWYocW8odCkpdGhyb3cgbmV3IE10KCJVbnN1cHBvcnRlZCBjb3JlLWpzIHVzZS4gVHJ5IGh0dHBzOi8vbnBtcy5pby9zZWFyY2g/cT1wb255ZmlsbC4iKTtyZXR1cm4gaXIodCl9LFZuLmlzTmlsPWZ1bmN0aW9uIHF1KHQpe3JldHVybiBudWxsPT10fSxWbi5pc051bGw9ZnVuY3Rpb24gWXUodCl7cmV0dXJuIG51bGw9PT10fSxWbi5pc051bWJlcj1QcyxWbi5pc09iamVjdD1DcyxWbi5pc09iamVjdExpa2U9QXMsVm4uaXNQbGFpbk9iamVjdD1OcyxWbi5pc1JlZ0V4cD1JcyxWbi5pc1NhZmVJbnRlZ2VyPWZ1bmN0aW9uIFh1KHQpe3JldHVybiBFcyh0KSYmdD49LTkwMDcxOTkyNTQ3NDA5OTEmJnQ8PXV9LFZuLmlzU2V0PU9zLFZuLmlzU3RyaW5nPURzLFZuLmlzU3ltYm9sPUJzLFZuLmlzVHlwZWRBcnJheT1IcyxWbi5pc1VuZGVmaW5lZD1mdW5jdGlvbiAkdShlKXtyZXR1cm4gZT09PXR9LFZuLmlzV2Vha01hcD1mdW5jdGlvbiBLdSh0KXtyZXR1cm4gQXModCkmJkJvKHQpPT1rfSxWbi5pc1dlYWtTZXQ9ZnVuY3Rpb24gWnUodCl7cmV0dXJuIEFzKHQpJiYiW29iamVjdCBXZWFrU2V0XSI9PVhpKHQpfSxWbi5qb2luPWZ1bmN0aW9uIEp1KHQsZSl7cmV0dXJuIG51bGw9PXQ/IiI6X24uY2FsbCh0LGUpfSxWbi5rZWJhYkNhc2U9eGwsVm4ubGFzdD14YSxWbi5sYXN0SW5kZXhPZj1mdW5jdGlvbiBRdShlLG4saSl7dmFyIHI9bnVsbD09ZT8wOmUubGVuZ3RoO2lmKCFyKXJldHVybi0xO3ZhciBvPXI7cmV0dXJuIGkhPT10JiYobz0obz1XcyhpKSk8MD92bihyK28sMCk6Ym4obyxyLTEpKSxuPT1uPyhmdW5jdGlvbiBhKHQsZSxuKXtmb3IodmFyIGk9bisxO2ktLTspaWYodFtpXT09PWUpcmV0dXJuIGk7cmV0dXJuIGl9KShlLG4sbyk6SGUoZSxVZSxvLCEwKX0sVm4ubG93ZXJDYXNlPXdsLFZuLmxvd2VyRmlyc3Q9U2wsVm4ubHQ9VnMsVm4ubHRlPVVzLFZuLm1heD1mdW5jdGlvbiB0aChlKXtyZXR1cm4gZSYmZS5sZW5ndGg/QmkoZSxSbCwkaSk6dH0sVm4ubWF4Qnk9ZnVuY3Rpb24gZWgoZSxuKXtyZXR1cm4gZSYmZS5sZW5ndGg/QmkoZSxObyhuLDIpLCRpKTp0fSxWbi5tZWFuPWZ1bmN0aW9uIG5oKHQpe3JldHVybiBqZSh0LFJsKX0sVm4ubWVhbkJ5PWZ1bmN0aW9uIGloKHQsZSl7cmV0dXJuIGplKHQsTm8oZSwyKSl9LFZuLm1pbj1mdW5jdGlvbiByaChlKXtyZXR1cm4gZSYmZS5sZW5ndGg/QmkoZSxSbCxzcik6dH0sVm4ubWluQnk9ZnVuY3Rpb24gb2goZSxuKXtyZXR1cm4gZSYmZS5sZW5ndGg/QmkoZSxObyhuLDIpLHNyKTp0fSxWbi5zdHViQXJyYXk9cWwsVm4uc3R1YkZhbHNlPVlsLFZuLnN0dWJPYmplY3Q9ZnVuY3Rpb24gYWgoKXtyZXR1cm57fX0sVm4uc3R1YlN0cmluZz1mdW5jdGlvbiBzaCgpe3JldHVybiIifSxWbi5zdHViVHJ1ZT1mdW5jdGlvbiBsaCgpe3JldHVybiEwfSxWbi5tdWx0aXBseT1RbCxWbi5udGg9ZnVuY3Rpb24gY2goZSxuKXtyZXR1cm4gZSYmZS5sZW5ndGg/ZHIoZSxXcyhuKSk6dH0sVm4ubm9Db25mbGljdD1mdW5jdGlvbiB1aCgpe3JldHVybiBjZS5fPT09dGhpcyYmKGNlLl89RnQpLHRoaXN9LFZuLm5vb3A9SGwsVm4ubm93PVphLFZuLnBhZD1mdW5jdGlvbiBoaCh0LGUsbil7dD0kcyh0KTt2YXIgaT0oZT1XcyhlKSk/ZG4odCk6MDtpZighZXx8aT49ZSlyZXR1cm4gdDt2YXIgcj0oZS1pKS8yO3JldHVybiBmbyhFZShyKSxuKSt0K2ZvKFNlKHIpLG4pfSxWbi5wYWRFbmQ9ZnVuY3Rpb24gZGgodCxlLG4pe3Q9JHModCk7dmFyIGk9KGU9V3MoZSkpP2RuKHQpOjA7cmV0dXJuIGUmJmk8ZT90K2ZvKGUtaSxuKTp0fSxWbi5wYWRTdGFydD1mdW5jdGlvbiBwaCh0LGUsbil7dD0kcyh0KTt2YXIgaT0oZT1XcyhlKSk/ZG4odCk6MDtyZXR1cm4gZSYmaTxlP2ZvKGUtaSxuKSt0OnR9LFZuLnBhcnNlSW50PWZ1bmN0aW9uIGZoKHQsZSxuKXtyZXR1cm4gbnx8bnVsbD09ZT9lPTA6ZSYmKGU9K2UpLHduKCRzKHQpLnJlcGxhY2UobnQsIiIpLGV8fDApfSxWbi5yYW5kb209ZnVuY3Rpb24gbWgoZSxuLGkpe2lmKGkmJiJib29sZWFuIiE9dHlwZW9mIGkmJmpvKGUsbixpKSYmKG49aT10KSxpPT09dCYmKCJib29sZWFuIj09dHlwZW9mIG4/KGk9bixuPXQpOiJib29sZWFuIj09dHlwZW9mIGUmJihpPWUsZT10KSksZT09PXQmJm49PT10PyhlPTAsbj0xKTooZT1HcyhlKSxuPT09dD8obj1lLGU9MCk6bj1HcyhuKSksZT5uKXt2YXIgcj1lO2U9bixuPXJ9aWYoaXx8ZSUxfHxuJTEpe3ZhciBvPVNuKCk7cmV0dXJuIGJuKGUrbyoobi1lK29lKCIxZS0iKygobysiIikubGVuZ3RoLTEpKSksbil9cmV0dXJuIF9yKGUsbil9LFZuLnJlZHVjZT1mdW5jdGlvbiBnaCh0LGUsbil7dmFyIGk9bXModCk/UmU6cWUscj1hcmd1bWVudHMubGVuZ3RoPDM7cmV0dXJuIGkodCxObyhlLDQpLG4scixPaSl9LFZuLnJlZHVjZVJpZ2h0PWZ1bmN0aW9uIF9oKHQsZSxuKXt2YXIgaT1tcyh0KT9PZTpxZSxyPWFyZ3VtZW50cy5sZW5ndGg8MztyZXR1cm4gaSh0LE5vKGUsNCksbixyLHppKX0sVm4ucmVwZWF0PWZ1bmN0aW9uIHloKGUsbixpKXtyZXR1cm4gbj0oaT9qbyhlLG4saSk6bj09PXQpPzE6V3MobikseXIoJHMoZSksbil9LFZuLnJlcGxhY2U9ZnVuY3Rpb24gdmgoKXt2YXIgdD1hcmd1bWVudHMsZT0kcyh0WzBdKTtyZXR1cm4gdC5sZW5ndGg8Mz9lOmUucmVwbGFjZSh0WzFdLHRbMl0pfSxWbi5yZXN1bHQ9ZnVuY3Rpb24gYmgoZSxuLGkpe3ZhciByPS0xLG89KG49VXIobixlKSkubGVuZ3RoO2ZvcihvfHwobz0xLGU9dCk7KytyPG87KXt2YXIgYT1udWxsPT1lP3Q6ZVtsYShuW3JdKV07YT09PXQmJihyPW8sYT1pKSxlPU1zKGEpP2EuY2FsbChlKTphfXJldHVybiBlfSxWbi5yb3VuZD10YyxWbi5ydW5JbkNvbnRleHQ9aXQsVm4uc2FtcGxlPWZ1bmN0aW9uIHhoKHQpe3JldHVybihtcyh0KT9KbjpicikodCl9LFZuLnNpemU9ZnVuY3Rpb24gd2godCl7aWYobnVsbD09dClyZXR1cm4gMDtpZih5cyh0KSlyZXR1cm4gRHModCk/ZG4odCk6dC5sZW5ndGg7dmFyIGU9Qm8odCk7cmV0dXJuIGU9PXh8fGU9PVQ/dC5zaXplOm9yKHQpLmxlbmd0aH0sVm4uc25ha2VDYXNlPU1sLFZuLnNvbWU9ZnVuY3Rpb24gU2goZSxuLGkpe3ZhciByPW1zKGUpP3plOkNyO3JldHVybiBpJiZqbyhlLG4saSkmJihuPXQpLHIoZSxObyhuLDMpKX0sVm4uc29ydGVkSW5kZXg9ZnVuY3Rpb24gTWgodCxlKXtyZXR1cm4gQXIodCxlKX0sVm4uc29ydGVkSW5kZXhCeT1mdW5jdGlvbiBFaCh0LGUsbil7cmV0dXJuIGtyKHQsZSxObyhuLDIpKX0sVm4uc29ydGVkSW5kZXhPZj1mdW5jdGlvbiBUaCh0LGUpe3ZhciBuPW51bGw9PXQ/MDp0Lmxlbmd0aDtpZihuKXt2YXIgaT1Bcih0LGUpO2lmKGk8biYmaHModFtpXSxlKSlyZXR1cm4gaX1yZXR1cm4tMX0sVm4uc29ydGVkTGFzdEluZGV4PWZ1bmN0aW9uIENoKHQsZSl7cmV0dXJuIEFyKHQsZSwhMCl9LFZuLnNvcnRlZExhc3RJbmRleEJ5PWZ1bmN0aW9uIEFoKHQsZSxuKXtyZXR1cm4ga3IodCxlLE5vKG4sMiksITApfSxWbi5zb3J0ZWRMYXN0SW5kZXhPZj1mdW5jdGlvbiBraCh0LGUpe2lmKG51bGwhPXQmJnQubGVuZ3RoKXt2YXIgbj1Bcih0LGUsITApLTE7aWYoaHModFtuXSxlKSlyZXR1cm4gbn1yZXR1cm4tMX0sVm4uc3RhcnRDYXNlPUVsLFZuLnN0YXJ0c1dpdGg9ZnVuY3Rpb24gTGgodCxlLG4pe3JldHVybiB0PSRzKHQpLG49bnVsbD09bj8wOmxpKFdzKG4pLDAsdC5sZW5ndGgpLGU9TnIoZSksdC5zbGljZShuLG4rZS5sZW5ndGgpPT1lfSxWbi5zdWJ0cmFjdD1lYyxWbi5zdW09ZnVuY3Rpb24gUGgodCl7cmV0dXJuIHQmJnQubGVuZ3RoP1llKHQsUmwpOjB9LFZuLnN1bUJ5PWZ1bmN0aW9uIE5oKHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP1llKHQsTm8oZSwyKSk6MH0sVm4udGVtcGxhdGU9ZnVuY3Rpb24gSWgoZSxuLGkpe3ZhciByPVZuLnRlbXBsYXRlU2V0dGluZ3M7aSYmam8oZSxuLGkpJiYobj10KSxlPSRzKGUpLG49SnMoe30sbixyLHdvKTt2YXIgbyxhLHM9SnMoe30sbi5pbXBvcnRzLHIuaW1wb3J0cyx3byksbD1sbChzKSxjPVplKHMsbCksdT0wLGg9bi5pbnRlcnBvbGF0ZXx8eXQsZD0iX19wICs9ICciLHA9QXQoKG4uZXNjYXBlfHx5dCkuc291cmNlKyJ8IitoLnNvdXJjZSsifCIrKGg9PT1LP3V0Onl0KS5zb3VyY2UrInwiKyhuLmV2YWx1YXRlfHx5dCkuc291cmNlKyJ8JCIsImciKSxmPSIvLyMgc291cmNlVVJMPSIrKE90LmNhbGwobiwic291cmNlVVJMIik/KG4uc291cmNlVVJMKyIiKS5yZXBsYWNlKC9ccy9nLCIgIik6ImxvZGFzaC50ZW1wbGF0ZVNvdXJjZXNbIisgKytlZSsiXSIpKyJcbiI7ZS5yZXBsYWNlKHAsKGZ1bmN0aW9uKHQsbixpLHIscyxsKXtyZXR1cm4gaXx8KGk9ciksZCs9ZS5zbGljZSh1LGwpLnJlcGxhY2UodnQsb24pLG4mJihvPSEwLGQrPSInICtcbl9fZSgiK24rIikgK1xuJyIpLHMmJihhPSEwLGQrPSInO1xuIitzKyI7XG5fX3AgKz0gJyIpLGkmJihkKz0iJyArXG4oKF9fdCA9ICgiK2krIikpID09IG51bGwgPyAnJyA6IF9fdCkgK1xuJyIpLHU9bCt0Lmxlbmd0aCx0fSkpLGQrPSInO1xuIjt2YXIgbT1PdC5jYWxsKG4sInZhcmlhYmxlIikmJm4udmFyaWFibGU7aWYobSl7aWYobHQudGVzdChtKSl0aHJvdyBuZXcgTXQoIkludmFsaWQgYHZhcmlhYmxlYCBvcHRpb24gcGFzc2VkIGludG8gYF8udGVtcGxhdGVgIil9ZWxzZSBkPSJ3aXRoIChvYmopIHtcbiIrZCsiXG59XG4iO2Q9KGE/ZC5yZXBsYWNlKFYsIiIpOmQpLnJlcGxhY2UoVSwiJDEiKS5yZXBsYWNlKGosIiQxOyIpLGQ9ImZ1bmN0aW9uKCIrKG18fCJvYmoiKSsiKSB7XG4iKyhtPyIiOiJvYmogfHwgKG9iaiA9IHt9KTtcbiIpKyJ2YXIgX190LCBfX3AgPSAnJyIrKG8/IiwgX19lID0gXy5lc2NhcGUiOiIiKSsoYT8iLCBfX2ogPSBBcnJheS5wcm90b3R5cGUuam9pbjtcbmZ1bmN0aW9uIHByaW50KCkgeyBfX3AgKz0gX19qLmNhbGwoYXJndW1lbnRzLCAnJykgfVxuIjoiO1xuIikrZCsicmV0dXJuIF9fcFxufSI7dmFyIGc9a2woKGZ1bmN0aW9uKCl7cmV0dXJuIEV0KGwsZisicmV0dXJuICIrZCkuYXBwbHkodCxjKX0pKTtpZihnLnNvdXJjZT1kLFNzKGcpKXRocm93IGc7cmV0dXJuIGd9LFZuLnRpbWVzPWZ1bmN0aW9uIFJoKHQsZSl7aWYoKHQ9V3ModCkpPDF8fHQ+dSlyZXR1cm5bXTt2YXIgbj1kLGk9Ym4odCxkKTtlPU5vKGUpLHQtPWQ7Zm9yKHZhciByPVhlKGksZSk7KytuPHQ7KWUobik7cmV0dXJuIHJ9LFZuLnRvRmluaXRlPUdzLFZuLnRvSW50ZWdlcj1XcyxWbi50b0xlbmd0aD1xcyxWbi50b0xvd2VyPWZ1bmN0aW9uIE9oKHQpe3JldHVybiAkcyh0KS50b0xvd2VyQ2FzZSgpfSxWbi50b051bWJlcj1ZcyxWbi50b1NhZmVJbnRlZ2VyPWZ1bmN0aW9uIHpoKHQpe3JldHVybiB0P2xpKFdzKHQpLC05MDA3MTk5MjU0NzQwOTkxLHUpOjA9PT10P3Q6MH0sVm4udG9TdHJpbmc9JHMsVm4udG9VcHBlcj1mdW5jdGlvbiBEaCh0KXtyZXR1cm4gJHModCkudG9VcHBlckNhc2UoKX0sVm4udHJpbT1mdW5jdGlvbiBCaChlLG4saSl7aWYoKGU9JHMoZSkpJiYoaXx8bj09PXQpKXJldHVybiAkZShlKTtpZighZXx8IShuPU5yKG4pKSlyZXR1cm4gZTt2YXIgcj1wbihlKSxvPXBuKG4pO3JldHVybiBHcihyLFFlKHIsbyksdG4ocixvKSsxKS5qb2luKCIiKX0sVm4udHJpbUVuZD1mdW5jdGlvbiBIaChlLG4saSl7aWYoKGU9JHMoZSkpJiYoaXx8bj09PXQpKXJldHVybiBlLnNsaWNlKDAsZm4oZSkrMSk7aWYoIWV8fCEobj1OcihuKSkpcmV0dXJuIGU7dmFyIHI9cG4oZSk7cmV0dXJuIEdyKHIsMCx0bihyLHBuKG4pKSsxKS5qb2luKCIiKX0sVm4udHJpbVN0YXJ0PWZ1bmN0aW9uIEZoKGUsbixpKXtpZigoZT0kcyhlKSkmJihpfHxuPT09dCkpcmV0dXJuIGUucmVwbGFjZShudCwiIik7aWYoIWV8fCEobj1OcihuKSkpcmV0dXJuIGU7dmFyIHI9cG4oZSk7cmV0dXJuIEdyKHIsUWUocixwbihuKSkpLmpvaW4oIiIpfSxWbi50cnVuY2F0ZT1mdW5jdGlvbiBWaChlLG4pe3ZhciBpPTMwLHI9Ii4uLiI7aWYoQ3Mobikpe3ZhciBvPSJzZXBhcmF0b3IiaW4gbj9uLnNlcGFyYXRvcjpvO2k9Imxlbmd0aCJpbiBuP1dzKG4ubGVuZ3RoKTppLHI9Im9taXNzaW9uImluIG4/TnIobi5vbWlzc2lvbik6cn12YXIgYT0oZT0kcyhlKSkubGVuZ3RoO2lmKGFuKGUpKXt2YXIgcz1wbihlKTthPXMubGVuZ3RofWlmKGk+PWEpcmV0dXJuIGU7dmFyIGw9aS1kbihyKTtpZihsPDEpcmV0dXJuIHI7dmFyIGM9cz9HcihzLDAsbCkuam9pbigiIik6ZS5zbGljZSgwLGwpO2lmKG89PT10KXJldHVybiBjK3I7aWYocyYmKGwrPWMubGVuZ3RoLWwpLElzKG8pKXtpZihlLnNsaWNlKGwpLnNlYXJjaChvKSl7dmFyIHUsaD1jO2ZvcihvLmdsb2JhbHx8KG89QXQoby5zb3VyY2UsJHMoaHQuZXhlYyhvKSkrImciKSksby5sYXN0SW5kZXg9MDt1PW8uZXhlYyhoKTspdmFyIGQ9dS5pbmRleDtjPWMuc2xpY2UoMCxkPT09dD9sOmQpfX1lbHNlIGlmKGUuaW5kZXhPZihOcihvKSxsKSE9bCl7dmFyIHA9Yy5sYXN0SW5kZXhPZihvKTtwPi0xJiYoYz1jLnNsaWNlKDAscCkpfXJldHVybiBjK3J9LFZuLnVuZXNjYXBlPWZ1bmN0aW9uIFVoKHQpe3JldHVybih0PSRzKHQpKSYmcS50ZXN0KHQpP3QucmVwbGFjZShHLG1uKTp0fSxWbi51bmlxdWVJZD1mdW5jdGlvbiBqaCh0KXt2YXIgZT0rK3p0O3JldHVybiAkcyh0KStlfSxWbi51cHBlckNhc2U9VGwsVm4udXBwZXJGaXJzdD1DbCxWbi5lYWNoPWphLFZuLmVhY2hSaWdodD1HYSxWbi5maXJzdD1fYSxCbChWbiwoWGw9e30samkoVm4sKGZ1bmN0aW9uKHQsZSl7T3QuY2FsbChWbi5wcm90b3R5cGUsZSl8fChYbFtlXT10KX0pKSxYbCkse2NoYWluOiExfSksVm4uVkVSU0lPTj0iNC4xNy4yMSIsTWUoWyJiaW5kIiwiYmluZEtleSIsImN1cnJ5IiwiY3VycnlSaWdodCIsInBhcnRpYWwiLCJwYXJ0aWFsUmlnaHQiXSwoZnVuY3Rpb24odCl7Vm5bdF0ucGxhY2Vob2xkZXI9Vm59KSksTWUoWyJkcm9wIiwidGFrZSJdLChmdW5jdGlvbihlLG4pe1duLnByb3RvdHlwZVtlXT1mdW5jdGlvbihpKXtpPWk9PT10PzE6dm4oV3MoaSksMCk7dmFyIHI9dGhpcy5fX2ZpbHRlcmVkX18mJiFuP25ldyBXbih0aGlzKTp0aGlzLmNsb25lKCk7cmV0dXJuIHIuX19maWx0ZXJlZF9fP3IuX190YWtlQ291bnRfXz1ibihpLHIuX190YWtlQ291bnRfXyk6ci5fX3ZpZXdzX18ucHVzaCh7c2l6ZTpibihpLGQpLHR5cGU6ZSsoci5fX2Rpcl9fPDA/IlJpZ2h0IjoiIil9KSxyfSxXbi5wcm90b3R5cGVbZSsiUmlnaHQiXT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yZXZlcnNlKClbZV0odCkucmV2ZXJzZSgpfX0pKSxNZShbImZpbHRlciIsIm1hcCIsInRha2VXaGlsZSJdLChmdW5jdGlvbih0LGUpe3ZhciBuPWUrMSxpPTE9PW58fDM9PW47V24ucHJvdG90eXBlW3RdPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuY2xvbmUoKTtyZXR1cm4gZS5fX2l0ZXJhdGVlc19fLnB1c2goe2l0ZXJhdGVlOk5vKHQsMyksdHlwZTpufSksZS5fX2ZpbHRlcmVkX189ZS5fX2ZpbHRlcmVkX198fGksZX19KSksTWUoWyJoZWFkIiwibGFzdCJdLChmdW5jdGlvbih0LGUpe3ZhciBuPSJ0YWtlIisoZT8iUmlnaHQiOiIiKTtXbi5wcm90b3R5cGVbdF09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1tuXSgxKS52YWx1ZSgpWzBdfX0pKSxNZShbImluaXRpYWwiLCJ0YWlsIl0sKGZ1bmN0aW9uKHQsZSl7dmFyIG49ImRyb3AiKyhlPyIiOiJSaWdodCIpO1duLnByb3RvdHlwZVt0XT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9fZmlsdGVyZWRfXz9uZXcgV24odGhpcyk6dGhpc1tuXSgxKX19KSksV24ucHJvdG90eXBlLmNvbXBhY3Q9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5maWx0ZXIoUmwpfSxXbi5wcm90b3R5cGUuZmluZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5maWx0ZXIodCkuaGVhZCgpfSxXbi5wcm90b3R5cGUuZmluZExhc3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucmV2ZXJzZSgpLmZpbmQodCl9LFduLnByb3RvdHlwZS5pbnZva2VNYXA9dnIoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIHQ/bmV3IFduKHRoaXMpOnRoaXMubWFwKChmdW5jdGlvbihuKXtyZXR1cm4gUWkobix0LGUpfSkpfSkpLFduLnByb3RvdHlwZS5yZWplY3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZmlsdGVyKGFzKE5vKHQpKSl9LFduLnByb3RvdHlwZS5zbGljZT1mdW5jdGlvbihlLG4pe2U9V3MoZSk7dmFyIGk9dGhpcztyZXR1cm4gaS5fX2ZpbHRlcmVkX18mJihlPjB8fG48MCk/bmV3IFduKGkpOihlPDA/aT1pLnRha2VSaWdodCgtZSk6ZSYmKGk9aS5kcm9wKGUpKSxuIT09dCYmKGk9KG49V3MobikpPDA/aS5kcm9wUmlnaHQoLW4pOmkudGFrZShuLWUpKSxpKX0sV24ucHJvdG90eXBlLnRha2VSaWdodFdoaWxlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnJldmVyc2UoKS50YWtlV2hpbGUodCkucmV2ZXJzZSgpfSxXbi5wcm90b3R5cGUudG9BcnJheT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnRha2UoZCl9LGppKFduLnByb3RvdHlwZSwoZnVuY3Rpb24oZSxuKXt2YXIgaT0vXig/OmZpbHRlcnxmaW5kfG1hcHxyZWplY3QpfFdoaWxlJC8udGVzdChuKSxyPS9eKD86aGVhZHxsYXN0KSQvLnRlc3Qobiksbz1WbltyPyJ0YWtlIisoImxhc3QiPT1uPyJSaWdodCI6IiIpOm5dLGE9cnx8L15maW5kLy50ZXN0KG4pO28mJihWbi5wcm90b3R5cGVbbl09ZnVuY3Rpb24oKXt2YXIgbj10aGlzLl9fd3JhcHBlZF9fLHM9cj9bMV06YXJndW1lbnRzLGw9biBpbnN0YW5jZW9mIFduLGM9c1swXSx1PWx8fG1zKG4pLGg9ZnVuY3Rpb24odCl7dmFyIGU9by5hcHBseShWbixJZShbdF0scykpO3JldHVybiByJiZkP2VbMF06ZX07dSYmaSYmImZ1bmN0aW9uIj09dHlwZW9mIGMmJjEhPWMubGVuZ3RoJiYobD11PSExKTt2YXIgZD10aGlzLl9fY2hhaW5fXyxwPSEhdGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgsZj1hJiYhZCxtPWwmJiFwO2lmKCFhJiZ1KXtuPW0/bjpuZXcgV24odGhpcyk7dmFyIGc9ZS5hcHBseShuLHMpO3JldHVybiBnLl9fYWN0aW9uc19fLnB1c2goe2Z1bmM6QmEsYXJnczpbaF0sdGhpc0FyZzp0fSksbmV3IEduKGcsZCl9cmV0dXJuIGYmJm0/ZS5hcHBseSh0aGlzLHMpOihnPXRoaXMudGhydShoKSxmP3I/Zy52YWx1ZSgpWzBdOmcudmFsdWUoKTpnKX0pfSkpLE1lKFsicG9wIiwicHVzaCIsInNoaWZ0Iiwic29ydCIsInNwbGljZSIsInVuc2hpZnQiXSwoZnVuY3Rpb24odCl7dmFyIGU9UHRbdF0sbj0vXig/OnB1c2h8c29ydHx1bnNoaWZ0KSQvLnRlc3QodCk/InRhcCI6InRocnUiLGk9L14oPzpwb3B8c2hpZnQpJC8udGVzdCh0KTtWbi5wcm90b3R5cGVbdF09ZnVuY3Rpb24oKXt2YXIgdD1hcmd1bWVudHM7aWYoaSYmIXRoaXMuX19jaGFpbl9fKXt2YXIgcj10aGlzLnZhbHVlKCk7cmV0dXJuIGUuYXBwbHkobXMocik/cjpbXSx0KX1yZXR1cm4gdGhpc1tuXSgoZnVuY3Rpb24obil7cmV0dXJuIGUuYXBwbHkobXMobik/bjpbXSx0KX0pKX19KSksamkoV24ucHJvdG90eXBlLChmdW5jdGlvbih0LGUpe3ZhciBuPVZuW2VdO2lmKG4pe3ZhciBpPW4ubmFtZSsiIjtPdC5jYWxsKE5uLGkpfHwoTm5baV09W10pLE5uW2ldLnB1c2goe25hbWU6ZSxmdW5jOm59KX19KSksTm5bY28odCwyKS5uYW1lXT1be25hbWU6IndyYXBwZXIiLGZ1bmM6dH1dLFduLnByb3RvdHlwZS5jbG9uZT1mdW5jdGlvbiBHaCgpe3ZhciB0PW5ldyBXbih0aGlzLl9fd3JhcHBlZF9fKTtyZXR1cm4gdC5fX2FjdGlvbnNfXz1Kcih0aGlzLl9fYWN0aW9uc19fKSx0Ll9fZGlyX189dGhpcy5fX2Rpcl9fLHQuX19maWx0ZXJlZF9fPXRoaXMuX19maWx0ZXJlZF9fLHQuX19pdGVyYXRlZXNfXz1Kcih0aGlzLl9faXRlcmF0ZWVzX18pLHQuX190YWtlQ291bnRfXz10aGlzLl9fdGFrZUNvdW50X18sdC5fX3ZpZXdzX189SnIodGhpcy5fX3ZpZXdzX18pLHR9LFduLnByb3RvdHlwZS5yZXZlcnNlPWZ1bmN0aW9uIFdoKCl7aWYodGhpcy5fX2ZpbHRlcmVkX18pe3ZhciB0PW5ldyBXbih0aGlzKTt0Ll9fZGlyX189LTEsdC5fX2ZpbHRlcmVkX189ITB9ZWxzZSh0PXRoaXMuY2xvbmUoKSkuX19kaXJfXyo9LTE7cmV0dXJuIHR9LFduLnByb3RvdHlwZS52YWx1ZT1mdW5jdGlvbiBxaCgpe3ZhciB0PXRoaXMuX193cmFwcGVkX18udmFsdWUoKSxlPXRoaXMuX19kaXJfXyxuPW1zKHQpLGk9ZTwwLHI9bj90Lmxlbmd0aDowLG89KGZ1bmN0aW9uIGEodCxlLG4pe2Zvcih2YXIgaT0tMSxyPW4ubGVuZ3RoOysraTxyOyl7dmFyIG89bltpXSxhPW8uc2l6ZTtzd2l0Y2goby50eXBlKXtjYXNlImRyb3AiOnQrPWE7YnJlYWs7Y2FzZSJkcm9wUmlnaHQiOmUtPWE7YnJlYWs7Y2FzZSJ0YWtlIjplPWJuKGUsdCthKTticmVhaztjYXNlInRha2VSaWdodCI6dD12bih0LGUtYSl9fXJldHVybntzdGFydDp0LGVuZDplfX0pKDAscix0aGlzLl9fdmlld3NfXykscz1vLnN0YXJ0LGw9by5lbmQsYz1sLXMsdT1pP2w6cy0xLGg9dGhpcy5fX2l0ZXJhdGVlc19fLGQ9aC5sZW5ndGgscD0wLGY9Ym4oYyx0aGlzLl9fdGFrZUNvdW50X18pO2lmKCFufHwhaSYmcj09YyYmZj09YylyZXR1cm4gRHIodCx0aGlzLl9fYWN0aW9uc19fKTt2YXIgbT1bXTt0OmZvcig7Yy0tJiZwPGY7KXtmb3IodmFyIGc9LTEsXz10W3UrPWVdOysrZzxkOyl7dmFyIHk9aFtnXSx2PXkudHlwZSxiPSgwLHkuaXRlcmF0ZWUpKF8pO2lmKDI9PXYpXz1iO2Vsc2UgaWYoIWIpe2lmKDE9PXYpY29udGludWUgdDticmVhayB0fX1tW3ArK109X31yZXR1cm4gbX0sVm4ucHJvdG90eXBlLmF0PUhhLFZuLnByb3RvdHlwZS5jaGFpbj1mdW5jdGlvbiBZaCgpe3JldHVybiBEYSh0aGlzKX0sVm4ucHJvdG90eXBlLmNvbW1pdD1mdW5jdGlvbiBYaCgpe3JldHVybiBuZXcgR24odGhpcy52YWx1ZSgpLHRoaXMuX19jaGFpbl9fKX0sVm4ucHJvdG90eXBlLm5leHQ9ZnVuY3Rpb24gJGgoKXt0aGlzLl9fdmFsdWVzX189PT10JiYodGhpcy5fX3ZhbHVlc19fPWpzKHRoaXMudmFsdWUoKSkpO3ZhciBlPXRoaXMuX19pbmRleF9fPj10aGlzLl9fdmFsdWVzX18ubGVuZ3RoO3JldHVybntkb25lOmUsdmFsdWU6ZT90OnRoaXMuX192YWx1ZXNfX1t0aGlzLl9faW5kZXhfXysrXX19LFZuLnByb3RvdHlwZS5wbGFudD1mdW5jdGlvbiBLaChlKXtmb3IodmFyIG4saT10aGlzO2kgaW5zdGFuY2VvZiBqbjspe3ZhciByPXVhKGkpO3IuX19pbmRleF9fPTAsci5fX3ZhbHVlc19fPXQsbj9vLl9fd3JhcHBlZF9fPXI6bj1yO3ZhciBvPXI7aT1pLl9fd3JhcHBlZF9ffXJldHVybiBvLl9fd3JhcHBlZF9fPWUsbn0sVm4ucHJvdG90eXBlLnJldmVyc2U9ZnVuY3Rpb24gWmgoKXt2YXIgZT10aGlzLl9fd3JhcHBlZF9fO2lmKGUgaW5zdGFuY2VvZiBXbil7dmFyIG49ZTtyZXR1cm4gdGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgmJihuPW5ldyBXbih0aGlzKSksKG49bi5yZXZlcnNlKCkpLl9fYWN0aW9uc19fLnB1c2goe2Z1bmM6QmEsYXJnczpbRWFdLHRoaXNBcmc6dH0pLG5ldyBHbihuLHRoaXMuX19jaGFpbl9fKX1yZXR1cm4gdGhpcy50aHJ1KEVhKX0sVm4ucHJvdG90eXBlLnRvSlNPTj1Wbi5wcm90b3R5cGUudmFsdWVPZj1Wbi5wcm90b3R5cGUudmFsdWU9ZnVuY3Rpb24gSmgoKXtyZXR1cm4gRHIodGhpcy5fX3dyYXBwZWRfXyx0aGlzLl9fYWN0aW9uc19fKX0sVm4ucHJvdG90eXBlLmZpcnN0PVZuLnByb3RvdHlwZS5oZWFkLHNlJiYoVm4ucHJvdG90eXBlW3NlXT1mdW5jdGlvbiBRaCgpe3JldHVybiB0aGlzfSksVm59KSgpO2hlPygoaGUuZXhwb3J0cz1nbikuXz1nbix1ZS5fPWduKTpjZS5fPWdufS5jYWxsKFNlKTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgQWU9ISh3aW5kb3cuU2hhZHlET00mJndpbmRvdy5TaGFkeURPTS5pblVzZSk7bGV0IGtlLExlO2Z1bmN0aW9uIFBlKHQpe2tlPSghdHx8IXQuc2hpbWNzc3Byb3BlcnRpZXMpJiYoQWV8fEJvb2xlYW4oIW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FwcGxlV2ViS2l0XC82MDF8RWRnZVwvMTUvKSYmd2luZG93LkNTUyYmQ1NTLnN1cHBvcnRzJiZDU1Muc3VwcG9ydHMoImJveC1zaGFkb3ciLCIwIDAgMCB2YXIoLS1mb28pIikpKX13aW5kb3cuU2hhZHlDU1MmJnZvaWQgMCE9PXdpbmRvdy5TaGFkeUNTUy5jc3NCdWlsZCYmKExlPXdpbmRvdy5TaGFkeUNTUy5jc3NCdWlsZCk7Y29uc3QgTmU9Qm9vbGVhbih3aW5kb3cuU2hhZHlDU1MmJndpbmRvdy5TaGFkeUNTUy5kaXNhYmxlUnVudGltZSk7d2luZG93LlNoYWR5Q1NTJiZ2b2lkIDAhPT13aW5kb3cuU2hhZHlDU1MubmF0aXZlQ3NzP2tlPXdpbmRvdy5TaGFkeUNTUy5uYXRpdmVDc3M6d2luZG93LlNoYWR5Q1NTPyhQZSh3aW5kb3cuU2hhZHlDU1MpLHdpbmRvdy5TaGFkeUNTUz12b2lkIDApOlBlKHdpbmRvdy5XZWJDb21wb25lbnRzJiZ3aW5kb3cuV2ViQ29tcG9uZW50cy5mbGFncyk7Y29uc3QgSWU9a2U7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovY2xhc3MgUmV7Y29uc3RydWN0b3IoKXt0aGlzLnN0YXJ0PTAsdGhpcy5lbmQ9MCx0aGlzLnByZXZpb3VzPW51bGwsdGhpcy5wYXJlbnQ9bnVsbCx0aGlzLnJ1bGVzPW51bGwsdGhpcy5wYXJzZWRDc3NUZXh0PSIiLHRoaXMuY3NzVGV4dD0iIix0aGlzLmF0UnVsZT0hMSx0aGlzLnR5cGU9MCx0aGlzLmtleWZyYW1lc05hbWU9IiIsdGhpcy5zZWxlY3Rvcj0iIix0aGlzLnBhcnNlZFNlbGVjdG9yPSIifX1mdW5jdGlvbiBPZSh0KXtyZXR1cm4gemUoKGZ1bmN0aW9uIG4odCl7bGV0IGU9bmV3IFJlO2Uuc3RhcnQ9MCxlLmVuZD10Lmxlbmd0aDtsZXQgbj1lO2ZvcihsZXQgaT0wLHI9dC5sZW5ndGg7aTxyO2krKylpZih0W2ldPT09SGUpe24ucnVsZXN8fChuLnJ1bGVzPVtdKTtsZXQgdD1uLGU9dC5ydWxlc1t0LnJ1bGVzLmxlbmd0aC0xXXx8bnVsbDtuPW5ldyBSZSxuLnN0YXJ0PWkrMSxuLnBhcmVudD10LG4ucHJldmlvdXM9ZSx0LnJ1bGVzLnB1c2gobil9ZWxzZSB0W2ldPT09RmUmJihuLmVuZD1pKzEsbj1uLnBhcmVudHx8ZSk7cmV0dXJuIGV9KSh0PShmdW5jdGlvbiBlKHQpe3JldHVybiB0LnJlcGxhY2UoVmUuY29tbWVudHMsIiIpLnJlcGxhY2UoVmUucG9ydCwiIil9KSh0KSksdCl9ZnVuY3Rpb24gemUodCxlKXtsZXQgbj1lLnN1YnN0cmluZyh0LnN0YXJ0LHQuZW5kLTEpO2lmKHQucGFyc2VkQ3NzVGV4dD10LmNzc1RleHQ9bi50cmltKCksdC5wYXJlbnQpe249ZS5zdWJzdHJpbmcodC5wcmV2aW91cz90LnByZXZpb3VzLmVuZDp0LnBhcmVudC5zdGFydCx0LnN0YXJ0LTEpLG49KGZ1bmN0aW9uIGkodCl7cmV0dXJuIHQucmVwbGFjZSgvXFwoWzAtOWEtZl17MSw2fSlccy9naSwoZnVuY3Rpb24oKXtsZXQgdD1hcmd1bWVudHNbMV0sZT02LXQubGVuZ3RoO2Zvcig7ZS0tOyl0PSIwIit0O3JldHVybiJcXCIrdH0pKX0pKG4pLG49bi5yZXBsYWNlKFZlLm11bHRpcGxlU3BhY2VzLCIgIiksbj1uLnN1YnN0cmluZyhuLmxhc3RJbmRleE9mKCI7IikrMSk7bGV0IGk9dC5wYXJzZWRTZWxlY3Rvcj10LnNlbGVjdG9yPW4udHJpbSgpO3QuYXRSdWxlPTA9PT1pLmluZGV4T2YoR2UpLHQuYXRSdWxlPzA9PT1pLmluZGV4T2YoamUpP3QudHlwZT1CZS5NRURJQV9SVUxFOmkubWF0Y2goVmUua2V5ZnJhbWVzUnVsZSkmJih0LnR5cGU9QmUuS0VZRlJBTUVTX1JVTEUsdC5rZXlmcmFtZXNOYW1lPXQuc2VsZWN0b3Iuc3BsaXQoVmUubXVsdGlwbGVTcGFjZXMpLnBvcCgpKTp0LnR5cGU9MD09PWkuaW5kZXhPZihVZSk/QmUuTUlYSU5fUlVMRTpCZS5TVFlMRV9SVUxFfWxldCByPXQucnVsZXM7aWYocilmb3IobGV0IHQsbj0wLGk9ci5sZW5ndGg7bjxpJiYodD1yW25dKTtuKyspemUodCxlKTtyZXR1cm4gdH1mdW5jdGlvbiBEZSh0LGUsbj0iIil7bGV0IGk9IiI7aWYodC5jc3NUZXh0fHx0LnJ1bGVzKXtsZXQgbj10LnJ1bGVzO2lmKG4mJiEoZnVuY3Rpb24gcih0KXtsZXQgZT10WzBdO3JldHVybiBCb29sZWFuKGUpJiZCb29sZWFuKGUuc2VsZWN0b3IpJiYwPT09ZS5zZWxlY3Rvci5pbmRleE9mKFVlKX0pKG4pKWZvcihsZXQgdCxyPTAsbz1uLmxlbmd0aDtyPG8mJih0PW5bcl0pO3IrKylpPURlKHQsZSxpKTtlbHNlIGk9ZT90LmNzc1RleHQ6KGZ1bmN0aW9uIG8odCl7cmV0dXJuKGZ1bmN0aW9uIG4odCl7cmV0dXJuIHQucmVwbGFjZShWZS5taXhpbkFwcGx5LCIiKS5yZXBsYWNlKFZlLnZhckFwcGx5LCIiKX0pKHQ9KGZ1bmN0aW9uIGUodCl7cmV0dXJuIHQucmVwbGFjZShWZS5jdXN0b21Qcm9wLCIiKS5yZXBsYWNlKFZlLm1peGluUHJvcCwiIil9KSh0KSl9KSh0LmNzc1RleHQpLGk9aS50cmltKCksaSYmKGk9IiAgIitpKyJcbiIpfXJldHVybiBpJiYodC5zZWxlY3RvciYmKG4rPXQuc2VsZWN0b3IrIiAiK0hlKyJcbiIpLG4rPWksdC5zZWxlY3RvciYmKG4rPUZlKyJcblxuIikpLG59Y29uc3QgQmU9e1NUWUxFX1JVTEU6MSxLRVlGUkFNRVNfUlVMRTo3LE1FRElBX1JVTEU6NCxNSVhJTl9SVUxFOjFlM30sSGU9InsiLEZlPSJ9IixWZT17Y29tbWVudHM6L1wvXCpbXipdKlwqKyhbXi8qXVteKl0qXCorKSpcLy9naW0scG9ydDovQGltcG9ydFteO10qOy9naW0sY3VzdG9tUHJvcDovKD86XlteO1wtXHN9XSspPy0tW147e31dKj86W157fTtdKj8oPzpbO1xuXXwkKS9naW0sbWl4aW5Qcm9wOi8oPzpeW147XC1cc31dKyk/LS1bXjt7fV0qPzpbXnt9O10qP3tbXn1dKj99KD86Wztcbl18JCk/L2dpbSxtaXhpbkFwcGx5Oi9AYXBwbHlccypcKD9bXik7XSpcKT9ccyooPzpbO1xuXXwkKT8vZ2ltLHZhckFwcGx5Oi9bXjs6XSo/OlteO10qP3ZhclwoW147XSpcKSg/Ols7XG5dfCQpPy9naW0sa2V5ZnJhbWVzUnVsZTovXkBbXlxzXSprZXlmcmFtZXMvLG11bHRpcGxlU3BhY2VzOi9ccysvZ30sVWU9Ii0tIixqZT0iQG1lZGlhIixHZT0iQCIsV2U9Lyg/Ol58Wztcc3tdXHMqKSgtLVtcdy1dKj8pXHMqOlxzKig/OigoPzonKD86XFwnfC4pKj8nfCIoPzpcXCJ8LikqPyJ8XChbXildKj9cKXxbXn07e10pKyl8XHsoW159XSopXH0oPzooPz1bO1xzfV0pfCQpKS9naSxxZT0vKD86XnxcVyspQGFwcGx5XHMqXCg/KFteKTtcbl0qKVwpPy9naSxZZT0vQG1lZGlhXHMoLiopLyxYZT1uZXcgU2V0O2Z1bmN0aW9uICRlKHQpe2NvbnN0IGU9dC50ZXh0Q29udGVudDtpZighWGUuaGFzKGUpKXtYZS5hZGQoZSk7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO3Quc2V0QXR0cmlidXRlKCJzaGFkeS11bnNjb3BlZCIsIiIpLHQudGV4dENvbnRlbnQ9ZSxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHQpfX1mdW5jdGlvbiBLZSh0KXtyZXR1cm4gdC5oYXNBdHRyaWJ1dGUoInNoYWR5LXVuc2NvcGVkIil9Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovZnVuY3Rpb24gWmUodCxlKXtyZXR1cm4gdD8oInN0cmluZyI9PXR5cGVvZiB0JiYodD1PZSh0KSksZSYmUWUodCxlKSxEZSh0LEllKSk6IiJ9ZnVuY3Rpb24gSmUodCl7cmV0dXJuIXQuX19jc3NSdWxlcyYmdC50ZXh0Q29udGVudCYmKHQuX19jc3NSdWxlcz1PZSh0LnRleHRDb250ZW50KSksdC5fX2Nzc1J1bGVzfHxudWxsfWZ1bmN0aW9uIFFlKHQsZSxuLGkpe2lmKCF0KXJldHVybjtsZXQgcj0hMSxvPXQudHlwZTtpZihpJiZvPT09QmUuTUVESUFfUlVMRSl7bGV0IGU9dC5zZWxlY3Rvci5tYXRjaChZZSk7ZSYmKHdpbmRvdy5tYXRjaE1lZGlhKGVbMV0pLm1hdGNoZXN8fChyPSEwKSl9bz09PUJlLlNUWUxFX1JVTEU/ZSh0KTpuJiZvPT09QmUuS0VZRlJBTUVTX1JVTEU/bih0KTpvPT09QmUuTUlYSU5fUlVMRSYmKHI9ITApO2xldCBhPXQucnVsZXM7aWYoYSYmIXIpZm9yKGxldCB0LHI9MCxvPWEubGVuZ3RoO3I8byYmKHQ9YVtyXSk7cisrKVFlKHQsZSxuLGkpfWZ1bmN0aW9uIHRuKHQsZSl7bGV0IG49dC5pbmRleE9mKCJ2YXIoIik7aWYoLTE9PT1uKXJldHVybiBlKHQsIiIsIiIsIiIpO2xldCBpPShmdW5jdGlvbiByKHQsZSl7bGV0IG49MDtmb3IobGV0IGk9ZSxyPXQubGVuZ3RoO2k8cjtpKyspaWYoIigiPT09dFtpXSluKys7ZWxzZSBpZigiKSI9PT10W2ldJiYwPT0tLW4pcmV0dXJuIGk7cmV0dXJuLTF9KSh0LG4rMyksbz10LnN1YnN0cmluZyhuKzQsaSksYT10LnN1YnN0cmluZygwLG4pLHM9dG4odC5zdWJzdHJpbmcoaSsxKSxlKSxsPW8uaW5kZXhPZigiLCIpO3JldHVybi0xPT09bD9lKGEsby50cmltKCksIiIscyk6ZShhLG8uc3Vic3RyaW5nKDAsbCkudHJpbSgpLG8uc3Vic3RyaW5nKGwrMSkudHJpbSgpLHMpfXdpbmRvdy5TaGFkeURPTSYmd2luZG93O2NvbnN0IGVuPSJjc3MtYnVpbGQiO2Z1bmN0aW9uIG5uKHQpe2lmKHZvaWQgMCE9PUxlKXJldHVybiBMZTtpZih2b2lkIDA9PT10Ll9fY3NzQnVpbGQpe2NvbnN0IGU9dC5nZXRBdHRyaWJ1dGUoZW4pO2lmKGUpdC5fX2Nzc0J1aWxkPWU7ZWxzZXtjb25zdCBlPShmdW5jdGlvbiBlKHQpe2NvbnN0IGU9InRlbXBsYXRlIj09PXQubG9jYWxOYW1lP3QuY29udGVudC5maXJzdENoaWxkOnQuZmlyc3RDaGlsZDtpZihlIGluc3RhbmNlb2YgQ29tbWVudCl7Y29uc3QgdD1lLnRleHRDb250ZW50LnRyaW0oKS5zcGxpdCgiOiIpO2lmKHRbMF09PT1lbilyZXR1cm4gdFsxXX1yZXR1cm4iIn0pKHQpOyIiIT09ZSYmKGZ1bmN0aW9uIG4odCl7Y29uc3QgZT0idGVtcGxhdGUiPT09dC5sb2NhbE5hbWU/dC5jb250ZW50LmZpcnN0Q2hpbGQ6dC5maXJzdENoaWxkO2UucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKX0KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8pKHQpLHQuX19jc3NCdWlsZD1lfX1yZXR1cm4gdC5fX2Nzc0J1aWxkfHwiIn1mdW5jdGlvbiBybih0KXtyZXR1cm4iIiE9PW5uKHQpfWZ1bmN0aW9uIG9uKHQsZSl7Zm9yKGxldCBuIGluIGUpbnVsbD09PW4/dC5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuKTp0LnN0eWxlLnNldFByb3BlcnR5KG4sZVtuXSl9ZnVuY3Rpb24gYW4odCxlKXtjb25zdCBuPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLmdldFByb3BlcnR5VmFsdWUoZSk7cmV0dXJuIG4/bi50cmltKCk6IiJ9Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IHNuPS87XHMqL20sbG49L15ccyooaW5pdGlhbCl8KGluaGVyaXQpXHMqJC8sY249L1xzKiFpbXBvcnRhbnQvLHVuPSJfLV8iO2NsYXNzIGhue2NvbnN0cnVjdG9yKCl7dGhpcy5fbWFwPXt9fXNldCh0LGUpe3Q9dC50cmltKCksdGhpcy5fbWFwW3RdPXtwcm9wZXJ0aWVzOmUsZGVwZW5kYW50czp7fX19Z2V0KHQpe3JldHVybiB0PXQudHJpbSgpLHRoaXMuX21hcFt0XXx8bnVsbH19bGV0IGRuPW51bGw7Y2xhc3MgcG57Y29uc3RydWN0b3IoKXt0aGlzLl9jdXJyZW50RWxlbWVudD1udWxsLHRoaXMuX21lYXN1cmVFbGVtZW50PW51bGwsdGhpcy5fbWFwPW5ldyBobn1kZXRlY3RNaXhpbih0KXtyZXR1cm4oZnVuY3Rpb24gZSh0KXtjb25zdCBlPXFlLnRlc3QodCl8fFdlLnRlc3QodCk7cmV0dXJuIHFlLmxhc3RJbmRleD0wLFdlLmxhc3RJbmRleD0wLGV9KSh0KX1nYXRoZXJTdHlsZXModCl7Y29uc3QgZT0oZnVuY3Rpb24gbih0KXtjb25zdCBlPVtdLG49dC5xdWVyeVNlbGVjdG9yQWxsKCJzdHlsZSIpO2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKXtjb25zdCBpPW5bdF07S2UoaSk/QWV8fCgkZShpKSxpLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaSkpOihlLnB1c2goaS50ZXh0Q29udGVudCksaS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGkpKX1yZXR1cm4gZS5qb2luKCIiKS50cmltKCl9KSh0LmNvbnRlbnQpO2lmKGUpe2NvbnN0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtyZXR1cm4gbi50ZXh0Q29udGVudD1lLHQuY29udGVudC5pbnNlcnRCZWZvcmUobix0LmNvbnRlbnQuZmlyc3RDaGlsZCksbn1yZXR1cm4gbnVsbH10cmFuc2Zvcm1UZW1wbGF0ZSh0LGUpe3ZvaWQgMD09PXQuX2dhdGhlcmVkU3R5bGUmJih0Ll9nYXRoZXJlZFN0eWxlPXRoaXMuZ2F0aGVyU3R5bGVzKHQpKTtjb25zdCBuPXQuX2dhdGhlcmVkU3R5bGU7cmV0dXJuIG4/dGhpcy50cmFuc2Zvcm1TdHlsZShuLGUpOm51bGx9dHJhbnNmb3JtU3R5bGUodCxlPSIiKXtsZXQgbj1KZSh0KTtyZXR1cm4gdGhpcy50cmFuc2Zvcm1SdWxlcyhuLGUpLHQudGV4dENvbnRlbnQ9WmUobiksbn10cmFuc2Zvcm1DdXN0b21TdHlsZSh0KXtsZXQgZT1KZSh0KTtyZXR1cm4gUWUoZSwodD0+eyI6cm9vdCI9PT10LnNlbGVjdG9yJiYodC5zZWxlY3Rvcj0iaHRtbCIpLHRoaXMudHJhbnNmb3JtUnVsZSh0KX0pKSx0LnRleHRDb250ZW50PVplKGUpLGV9dHJhbnNmb3JtUnVsZXModCxlKXt0aGlzLl9jdXJyZW50RWxlbWVudD1lLFFlKHQsKHQ9Pnt0aGlzLnRyYW5zZm9ybVJ1bGUodCl9KSksdGhpcy5fY3VycmVudEVsZW1lbnQ9bnVsbH10cmFuc2Zvcm1SdWxlKHQpe3QuY3NzVGV4dD10aGlzLnRyYW5zZm9ybUNzc1RleHQodC5wYXJzZWRDc3NUZXh0LHQpLCI6cm9vdCI9PT10LnNlbGVjdG9yJiYodC5zZWxlY3Rvcj0iOmhvc3QgPiAqIil9dHJhbnNmb3JtQ3NzVGV4dCh0LGUpe3JldHVybiB0PXQucmVwbGFjZShXZSwoKHQsbixpLHIpPT50aGlzLl9wcm9kdWNlQ3NzUHJvcGVydGllcyh0LG4saSxyLGUpKSksdGhpcy5fY29uc3VtZUNzc1Byb3BlcnRpZXModCxlKX1fZ2V0SW5pdGlhbFZhbHVlRm9yUHJvcGVydHkodCl7cmV0dXJuIHRoaXMuX21lYXN1cmVFbGVtZW50fHwodGhpcy5fbWVhc3VyZUVsZW1lbnQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibWV0YSIpLHRoaXMuX21lYXN1cmVFbGVtZW50LnNldEF0dHJpYnV0ZSgiYXBwbHktc2hpbS1tZWFzdXJlIiwiIiksdGhpcy5fbWVhc3VyZUVsZW1lbnQuc3R5bGUuYWxsPSJpbml0aWFsIixkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHRoaXMuX21lYXN1cmVFbGVtZW50KSksd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5fbWVhc3VyZUVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUodCl9X2ZhbGxiYWNrc0Zyb21QcmV2aW91c1J1bGVzKHQpe2xldCBlPXQ7Zm9yKDtlLnBhcmVudDspZT1lLnBhcmVudDtjb25zdCBuPXt9O2xldCBpPSExO3JldHVybiBRZShlLChlPT57aT1pfHxlPT09dCxpfHxlLnNlbGVjdG9yPT09dC5zZWxlY3RvciYmT2JqZWN0LmFzc2lnbihuLHRoaXMuX2Nzc1RleHRUb01hcChlLnBhcnNlZENzc1RleHQpKX0pKSxufV9jb25zdW1lQ3NzUHJvcGVydGllcyh0LGUpe2xldCBuPW51bGw7Zm9yKDtuPXFlLmV4ZWModCk7KXtsZXQgaT1uWzBdLHI9blsxXSxvPW4uaW5kZXgsYT1vK2kuaW5kZXhPZigiQGFwcGx5Iikscz1vK2kubGVuZ3RoLGw9dC5zbGljZSgwLGEpLGM9dC5zbGljZShzKSx1PWU/dGhpcy5fZmFsbGJhY2tzRnJvbVByZXZpb3VzUnVsZXMoZSk6e307T2JqZWN0LmFzc2lnbih1LHRoaXMuX2Nzc1RleHRUb01hcChsKSk7bGV0IGg9dGhpcy5fYXRBcHBseVRvQ3NzUHJvcGVydGllcyhyLHUpO3Q9YCR7bH0ke2h9JHtjfWAscWUubGFzdEluZGV4PW8raC5sZW5ndGh9cmV0dXJuIHR9X2F0QXBwbHlUb0Nzc1Byb3BlcnRpZXModCxlKXt0PXQucmVwbGFjZShzbiwiIik7bGV0IG49W10saT10aGlzLl9tYXAuZ2V0KHQpO2lmKGl8fCh0aGlzLl9tYXAuc2V0KHQse30pLGk9dGhpcy5fbWFwLmdldCh0KSksaSl7bGV0IHIsbyxhO3RoaXMuX2N1cnJlbnRFbGVtZW50JiYoaS5kZXBlbmRhbnRzW3RoaXMuX2N1cnJlbnRFbGVtZW50XT0hMCk7Y29uc3Qgcz1pLnByb3BlcnRpZXM7Zm9yKHIgaW4gcylhPWUmJmVbcl0sbz1bciwiOiB2YXIoIix0LHVuLHJdLGEmJm8ucHVzaCgiLCIsYS5yZXBsYWNlKGNuLCIiKSksby5wdXNoKCIpIiksY24udGVzdChzW3JdKSYmby5wdXNoKCIgIWltcG9ydGFudCIpLG4ucHVzaChvLmpvaW4oIiIpKX1yZXR1cm4gbi5qb2luKCI7ICIpfV9yZXBsYWNlSW5pdGlhbE9ySW5oZXJpdCh0LGUpe2xldCBuPWxuLmV4ZWMoZSk7cmV0dXJuIG4mJihlPW5bMV0/dGhpcy5fZ2V0SW5pdGlhbFZhbHVlRm9yUHJvcGVydHkodCk6ImFwcGx5LXNoaW0taW5oZXJpdCIpLGV9X2Nzc1RleHRUb01hcCh0LGU9ITEpe2xldCBuLGkscj10LnNwbGl0KCI7Iiksbz17fTtmb3IobGV0IHQsYSxzPTA7czxyLmxlbmd0aDtzKyspdD1yW3NdLHQmJihhPXQuc3BsaXQoIjoiKSxhLmxlbmd0aD4xJiYobj1hWzBdLnRyaW0oKSxpPWEuc2xpY2UoMSkuam9pbigiOiIpLGUmJihpPXRoaXMuX3JlcGxhY2VJbml0aWFsT3JJbmhlcml0KG4saSkpLG9bbl09aSkpO3JldHVybiBvfV9pbnZhbGlkYXRlTWl4aW5FbnRyeSh0KXtpZihkbilmb3IobGV0IGUgaW4gdC5kZXBlbmRhbnRzKWUhPT10aGlzLl9jdXJyZW50RWxlbWVudCYmZG4oZSl9X3Byb2R1Y2VDc3NQcm9wZXJ0aWVzKHQsZSxuLGkscil7aWYobiYmdG4obiwoKHQsZSk9PntlJiZ0aGlzLl9tYXAuZ2V0KGUpJiYoaT1gQGFwcGx5ICR7ZX07YCl9KSksIWkpcmV0dXJuIHQ7bGV0IG89dGhpcy5fY29uc3VtZUNzc1Byb3BlcnRpZXMoIiIraSxyKSxhPXQuc2xpY2UoMCx0LmluZGV4T2YoIi0tIikpLHM9dGhpcy5fY3NzVGV4dFRvTWFwKG8sITApLGw9cyxjPXRoaXMuX21hcC5nZXQoZSksdT1jJiZjLnByb3BlcnRpZXM7dT9sPU9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZSh1KSxzKTp0aGlzLl9tYXAuc2V0KGUsbCk7bGV0IGgsZCxwPVtdLGY9ITE7Zm9yKGggaW4gbClkPXNbaF0sdm9pZCAwPT09ZCYmKGQ9ImluaXRpYWwiKSx1JiYhKGggaW4gdSkmJihmPSEwKSxwLnB1c2goYCR7ZX1fLV8ke2h9OiAke2R9YCk7cmV0dXJuIGYmJnRoaXMuX2ludmFsaWRhdGVNaXhpbkVudHJ5KGMpLGMmJihjLnByb3BlcnRpZXM9bCksbiYmKGE9YCR7dH07JHthfWApLGAke2F9JHtwLmpvaW4oIjsgIil9O2B9fXBuLnByb3RvdHlwZS5kZXRlY3RNaXhpbj1wbi5wcm90b3R5cGUuZGV0ZWN0TWl4aW4scG4ucHJvdG90eXBlLnRyYW5zZm9ybVN0eWxlPXBuLnByb3RvdHlwZS50cmFuc2Zvcm1TdHlsZSxwbi5wcm90b3R5cGUudHJhbnNmb3JtQ3VzdG9tU3R5bGU9cG4ucHJvdG90eXBlLnRyYW5zZm9ybUN1c3RvbVN0eWxlLHBuLnByb3RvdHlwZS50cmFuc2Zvcm1SdWxlcz1wbi5wcm90b3R5cGUudHJhbnNmb3JtUnVsZXMscG4ucHJvdG90eXBlLnRyYW5zZm9ybVJ1bGU9cG4ucHJvdG90eXBlLnRyYW5zZm9ybVJ1bGUscG4ucHJvdG90eXBlLnRyYW5zZm9ybVRlbXBsYXRlPXBuLnByb3RvdHlwZS50cmFuc2Zvcm1UZW1wbGF0ZSxwbi5wcm90b3R5cGUuX3NlcGFyYXRvcj11bixPYmplY3QuZGVmaW5lUHJvcGVydHkocG4ucHJvdG90eXBlLCJpbnZhbGlkQ2FsbGJhY2siLHtnZXQ6KCk9PmRuLHNldCh0KXtkbj10fX0pOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBmbj17fSxtbj0iX2FwcGx5U2hpbUN1cnJlbnRWZXJzaW9uIixnbj0iX2FwcGx5U2hpbU5leHRWZXJzaW9uIixfbj0iX2FwcGx5U2hpbVZhbGlkYXRpbmdWZXJzaW9uIix5bj1Qcm9taXNlLnJlc29sdmUoKTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9mdW5jdGlvbiB2bih0KXtsZXQgZT1mblt0XTtlJiYoZnVuY3Rpb24gbih0KXt0W21uXT10W21uXXx8MCx0W19uXT10W19uXXx8MCx0W2duXT0odFtnbl18fDApKzF9KShlKX1mdW5jdGlvbiBibih0KXtyZXR1cm4gdFttbl09PT10W2duXX0KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KbGV0IHhuLHduPW51bGwsU249d2luZG93LkhUTUxJbXBvcnRzJiZ3aW5kb3cuSFRNTEltcG9ydHMud2hlblJlYWR5fHxudWxsO2Z1bmN0aW9uIE1uKHQpe3JlcXVlc3RBbmltYXRpb25GcmFtZSgoZnVuY3Rpb24oKXtTbj9Tbih0KTood258fCh3bj1uZXcgUHJvbWlzZSgodD0+e3huPXR9KSksImNvbXBsZXRlIj09PWRvY3VtZW50LnJlYWR5U3RhdGU/eG4oKTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIiwoKCk9PnsiY29tcGxldGUiPT09ZG9jdW1lbnQucmVhZHlTdGF0ZSYmeG4oKX0pKSksd24udGhlbigoZnVuY3Rpb24oKXt0JiZ0KCl9KSkpfSkpfQovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqL2NvbnN0IEVuPSJfX3NlZW5CeVNoYWR5Q1NTIixUbj0iX19zaGFkeUNTU0NhY2hlZFN0eWxlIjtsZXQgQ249bnVsbCxBbj1udWxsO2NsYXNzIGtue2NvbnN0cnVjdG9yKCl7dGhpcy5jdXN0b21TdHlsZXM9W10sdGhpcy5lbnF1ZXVlZD0hMSxNbigoKCk9Pnt3aW5kb3cuU2hhZHlDU1MuZmx1c2hDdXN0b21TdHlsZXMmJndpbmRvdy5TaGFkeUNTUy5mbHVzaEN1c3RvbVN0eWxlcygpfSkpfWVucXVldWVEb2N1bWVudFZhbGlkYXRpb24oKXshdGhpcy5lbnF1ZXVlZCYmQW4mJih0aGlzLmVucXVldWVkPSEwLE1uKEFuKSl9YWRkQ3VzdG9tU3R5bGUodCl7dFtFbl18fCh0W0VuXT0hMCx0aGlzLmN1c3RvbVN0eWxlcy5wdXNoKHQpLHRoaXMuZW5xdWV1ZURvY3VtZW50VmFsaWRhdGlvbigpKX1nZXRTdHlsZUZvckN1c3RvbVN0eWxlKHQpe2lmKHRbVG5dKXJldHVybiB0W1RuXTtsZXQgZTtyZXR1cm4gZT10LmdldFN0eWxlP3QuZ2V0U3R5bGUoKTp0LGV9cHJvY2Vzc1N0eWxlcygpe2NvbnN0IHQ9dGhpcy5jdXN0b21TdHlsZXM7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspe2NvbnN0IG49dFtlXTtpZihuW1RuXSljb250aW51ZTtjb25zdCBpPXRoaXMuZ2V0U3R5bGVGb3JDdXN0b21TdHlsZShuKTtpZihpKXtjb25zdCB0PWkuX19hcHBsaWVkRWxlbWVudHx8aTtDbiYmQ24odCksbltUbl09dH19cmV0dXJuIHR9fWtuLnByb3RvdHlwZS5hZGRDdXN0b21TdHlsZT1rbi5wcm90b3R5cGUuYWRkQ3VzdG9tU3R5bGUsa24ucHJvdG90eXBlLmdldFN0eWxlRm9yQ3VzdG9tU3R5bGU9a24ucHJvdG90eXBlLmdldFN0eWxlRm9yQ3VzdG9tU3R5bGUsa24ucHJvdG90eXBlLnByb2Nlc3NTdHlsZXM9a24ucHJvdG90eXBlLnByb2Nlc3NTdHlsZXMsT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoa24ucHJvdG90eXBlLHt0cmFuc2Zvcm1DYWxsYmFjazp7Z2V0OigpPT5DbixzZXQodCl7Q249dH19LHZhbGlkYXRlQ2FsbGJhY2s6e2dldDooKT0+QW4sc2V0KHQpe2xldCBlPSExO0FufHwoZT0hMCksQW49dCxlJiZ0aGlzLmVucXVldWVEb2N1bWVudFZhbGlkYXRpb24oKX19fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IExuPW5ldyBwbjtjbGFzcyBQbntjb25zdHJ1Y3Rvcigpe3RoaXMuY3VzdG9tU3R5bGVJbnRlcmZhY2U9bnVsbCxMbi5pbnZhbGlkQ2FsbGJhY2s9dm59ZW5zdXJlKCl7dGhpcy5jdXN0b21TdHlsZUludGVyZmFjZXx8d2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlJiYodGhpcy5jdXN0b21TdHlsZUludGVyZmFjZT13aW5kb3cuU2hhZHlDU1MuQ3VzdG9tU3R5bGVJbnRlcmZhY2UsdGhpcy5jdXN0b21TdHlsZUludGVyZmFjZS50cmFuc2Zvcm1DYWxsYmFjaz10PT57TG4udHJhbnNmb3JtQ3VzdG9tU3R5bGUodCl9LHRoaXMuY3VzdG9tU3R5bGVJbnRlcmZhY2UudmFsaWRhdGVDYWxsYmFjaz0oKT0+e3JlcXVlc3RBbmltYXRpb25GcmFtZSgoKCk9Pnt0aGlzLmN1c3RvbVN0eWxlSW50ZXJmYWNlLmVucXVldWVkJiZ0aGlzLmZsdXNoQ3VzdG9tU3R5bGVzKCl9KSl9KX1wcmVwYXJlVGVtcGxhdGUodCxlKXtpZih0aGlzLmVuc3VyZSgpLHJuKHQpKXJldHVybjtmbltlXT10O2xldCBuPUxuLnRyYW5zZm9ybVRlbXBsYXRlKHQsZSk7dC5fc3R5bGVBc3Q9bn1mbHVzaEN1c3RvbVN0eWxlcygpe2lmKHRoaXMuZW5zdXJlKCksIXRoaXMuY3VzdG9tU3R5bGVJbnRlcmZhY2UpcmV0dXJuO2xldCB0PXRoaXMuY3VzdG9tU3R5bGVJbnRlcmZhY2UucHJvY2Vzc1N0eWxlcygpO2lmKHRoaXMuY3VzdG9tU3R5bGVJbnRlcmZhY2UuZW5xdWV1ZWQpe2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtsZXQgbj10aGlzLmN1c3RvbVN0eWxlSW50ZXJmYWNlLmdldFN0eWxlRm9yQ3VzdG9tU3R5bGUodFtlXSk7biYmTG4udHJhbnNmb3JtQ3VzdG9tU3R5bGUobil9dGhpcy5jdXN0b21TdHlsZUludGVyZmFjZS5lbnF1ZXVlZD0hMX19c3R5bGVTdWJ0cmVlKHQsZSl7aWYodGhpcy5lbnN1cmUoKSxlJiZvbih0LGUpLHQuc2hhZG93Um9vdCl7dGhpcy5zdHlsZUVsZW1lbnQodCk7bGV0IGU9dC5zaGFkb3dSb290LmNoaWxkcmVufHx0LnNoYWRvd1Jvb3QuY2hpbGROb2Rlcztmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl0aGlzLnN0eWxlU3VidHJlZShlW3RdKX1lbHNle2xldCBlPXQuY2hpbGRyZW58fHQuY2hpbGROb2Rlcztmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl0aGlzLnN0eWxlU3VidHJlZShlW3RdKX19c3R5bGVFbGVtZW50KHQpe3RoaXMuZW5zdXJlKCk7bGV0e2lzOmV9PShmdW5jdGlvbiBuKHQpe2xldCBlPXQubG9jYWxOYW1lLG49IiIsaT0iIjtyZXR1cm4gZT9lLmluZGV4T2YoIi0iKT4tMT9uPWU6KGk9ZSxuPXQuZ2V0QXR0cmlidXRlJiZ0LmdldEF0dHJpYnV0ZSgiaXMiKXx8IiIpOihuPXQuaXMsaT10LmV4dGVuZHMpLHtpczpuLHR5cGVFeHRlbnNpb246aX19KSh0KSxpPWZuW2VdO2lmKCghaXx8IXJuKGkpKSYmaSYmIWJuKGkpKXsoZnVuY3Rpb24gbih0KXtyZXR1cm4hYm4odCkmJnRbX25dPT09dFtnbl19KShpKXx8KHRoaXMucHJlcGFyZVRlbXBsYXRlKGksZSksKGZ1bmN0aW9uIHIodCl7dFtfbl09dFtnbl0sdC5fdmFsaWRhdGluZ3x8KHQuX3ZhbGlkYXRpbmc9ITAseW4udGhlbigoZnVuY3Rpb24oKXt0W21uXT10W2duXSx0Ll92YWxpZGF0aW5nPSExfSkpKX0pKGkpKTtsZXQgbz10LnNoYWRvd1Jvb3Q7aWYobyl7bGV0IHQ9by5xdWVyeVNlbGVjdG9yKCJzdHlsZSIpO3QmJih0Ll9fY3NzUnVsZXM9aS5fc3R5bGVBc3QsdC50ZXh0Q29udGVudD1aZShpLl9zdHlsZUFzdCkpfX19c3R5bGVEb2N1bWVudCh0KXt0aGlzLmVuc3VyZSgpLHRoaXMuc3R5bGVTdWJ0cmVlKGRvY3VtZW50LmJvZHksdCl9fWlmKCF3aW5kb3cuU2hhZHlDU1N8fCF3aW5kb3cuU2hhZHlDU1MuU2NvcGluZ1NoaW0pe2NvbnN0IHQ9bmV3IFBuO2xldCBlPXdpbmRvdy5TaGFkeUNTUyYmd2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlO3dpbmRvdy5TaGFkeUNTUz17cHJlcGFyZVRlbXBsYXRlKGUsbixpKXt0LmZsdXNoQ3VzdG9tU3R5bGVzKCksdC5wcmVwYXJlVGVtcGxhdGUoZSxuKX0scHJlcGFyZVRlbXBsYXRlU3R5bGVzKHQsZSxuKXt3aW5kb3cuU2hhZHlDU1MucHJlcGFyZVRlbXBsYXRlKHQsZSxuKX0scHJlcGFyZVRlbXBsYXRlRG9tKHQsZSl7fSxzdHlsZVN1YnRyZWUoZSxuKXt0LmZsdXNoQ3VzdG9tU3R5bGVzKCksdC5zdHlsZVN1YnRyZWUoZSxuKX0sc3R5bGVFbGVtZW50KGUpe3QuZmx1c2hDdXN0b21TdHlsZXMoKSx0LnN0eWxlRWxlbWVudChlKX0sc3R5bGVEb2N1bWVudChlKXt0LmZsdXNoQ3VzdG9tU3R5bGVzKCksdC5zdHlsZURvY3VtZW50KGUpfSxnZXRDb21wdXRlZFN0eWxlVmFsdWU6KHQsZSk9PmFuKHQsZSksZmx1c2hDdXN0b21TdHlsZXMoKXt0LmZsdXNoQ3VzdG9tU3R5bGVzKCl9LG5hdGl2ZUNzczpJZSxuYXRpdmVTaGFkb3c6QWUsY3NzQnVpbGQ6TGUsZGlzYWJsZVJ1bnRpbWU6TmV9LGUmJih3aW5kb3cuU2hhZHlDU1MuQ3VzdG9tU3R5bGVJbnRlcmZhY2U9ZSl9d2luZG93LlNoYWR5Q1NTLkFwcGx5U2hpbT1MbjsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY2xhc3MgTm57Y29uc3RydWN0b3IoKXt0aGlzLl9hc3luY01vZHVsZT1udWxsLHRoaXMuX2NhbGxiYWNrPW51bGwsdGhpcy5fdGltZXI9bnVsbH1zZXRDb25maWcodCxlKXt0aGlzLl9hc3luY01vZHVsZT10LHRoaXMuX2NhbGxiYWNrPWUsdGhpcy5fdGltZXI9dGhpcy5fYXN5bmNNb2R1bGUucnVuKCgoKT0+e3RoaXMuX3RpbWVyPW51bGwsSW4uZGVsZXRlKHRoaXMpLHRoaXMuX2NhbGxiYWNrKCl9KSl9Y2FuY2VsKCl7dGhpcy5pc0FjdGl2ZSgpJiYodGhpcy5fY2FuY2VsQXN5bmMoKSxJbi5kZWxldGUodGhpcykpfV9jYW5jZWxBc3luYygpe3RoaXMuaXNBY3RpdmUoKSYmKHRoaXMuX2FzeW5jTW9kdWxlLmNhbmNlbCh0aGlzLl90aW1lciksdGhpcy5fdGltZXI9bnVsbCl9Zmx1c2goKXt0aGlzLmlzQWN0aXZlKCkmJih0aGlzLmNhbmNlbCgpLHRoaXMuX2NhbGxiYWNrKCkpfWlzQWN0aXZlKCl7cmV0dXJuIG51bGwhPXRoaXMuX3RpbWVyfXN0YXRpYyBkZWJvdW5jZSh0LGUsbil7cmV0dXJuIHQgaW5zdGFuY2VvZiBObj90Ll9jYW5jZWxBc3luYygpOnQ9bmV3IE5uLHQuc2V0Q29uZmlnKGUsbiksdH19bGV0IEluPW5ldyBTZXQ7Y29uc3QgUm49ZnVuY3Rpb24odCl7SW4uYWRkKHQpfSxPbj1mdW5jdGlvbigpe2NvbnN0IHQ9Qm9vbGVhbihJbi5zaXplKTtyZXR1cm4gSW4uZm9yRWFjaCgodD0+e3RyeXt0LmZsdXNoKCl9Y2F0Y2godCl7c2V0VGltZW91dCgoKCk9Pnt0aHJvdyB0fSkpfX0pKSx0fTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KbGV0IHpuPSJzdHJpbmciPT10eXBlb2YgZG9jdW1lbnQuaGVhZC5zdHlsZS50b3VjaEFjdGlvbixEbj0iX19wb2x5bWVyR2VzdHVyZXMiLEJuPSJfX3BvbHltZXJHZXN0dXJlc0hhbmRsZWQiLEhuPSJfX3BvbHltZXJHZXN0dXJlc1RvdWNoQWN0aW9uIixGbj1bIm1vdXNlZG93biIsIm1vdXNlbW92ZSIsIm1vdXNldXAiLCJjbGljayJdLFZuPVswLDEsNCwyXSxVbj0oZnVuY3Rpb24oKXt0cnl7cmV0dXJuIDE9PT1uZXcgTW91c2VFdmVudCgidGVzdCIse2J1dHRvbnM6MX0pLmJ1dHRvbnN9Y2F0Y2godCl7cmV0dXJuITF9fSkoKTtmdW5jdGlvbiBqbih0KXtyZXR1cm4gRm4uaW5kZXhPZih0KT4tMX1sZXQgR249ITE7ZnVuY3Rpb24gV24odCl7aWYoIWpuKHQpJiYidG91Y2hlbmQiIT09dClyZXR1cm4gem4mJkduJiZ2P3twYXNzaXZlOiEwfTp2b2lkIDB9IShmdW5jdGlvbigpe3RyeXtsZXQgdD1PYmplY3QuZGVmaW5lUHJvcGVydHkoe30sInBhc3NpdmUiLHtnZXQoKXtHbj0hMH19KTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdCIsbnVsbCx0KSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigidGVzdCIsbnVsbCx0KX1jYXRjaCh0KXt9fSkoKTtsZXQgcW49bmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVAoPzpbb2FdZHxob25lKXxBbmRyb2lkLyk7Y29uc3QgWW49W10sWG49e2J1dHRvbjohMCxpbnB1dDohMCxrZXlnZW46ITAsbWV0ZXI6ITAsb3V0cHV0OiEwLHRleHRhcmVhOiEwLHByb2dyZXNzOiEwLHNlbGVjdDohMH0sJG49e2J1dHRvbjohMCxjb21tYW5kOiEwLGZpZWxkc2V0OiEwLGlucHV0OiEwLGtleWdlbjohMCxvcHRncm91cDohMCxvcHRpb246ITAsc2VsZWN0OiEwLHRleHRhcmVhOiEwfTtmdW5jdGlvbiBLbih0KXtsZXQgZT1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0LmxhYmVsc3x8W10pO2lmKCFlLmxlbmd0aCl7ZT1bXTtsZXQgbj10LmdldFJvb3ROb2RlKCk7aWYodC5pZCl7bGV0IGk9bi5xdWVyeVNlbGVjdG9yQWxsKGBsYWJlbFtmb3IgPSAke3QuaWR9XWApO2ZvcihsZXQgdD0wO3Q8aS5sZW5ndGg7dCsrKWUucHVzaChpW3RdKX19cmV0dXJuIGV9bGV0IFpuPWZ1bmN0aW9uKHQpe2xldCBlPXQuc291cmNlQ2FwYWJpbGl0aWVzO2lmKCghZXx8ZS5maXJlc1RvdWNoRXZlbnRzKSYmKHRbQm5dPXtza2lwOiEwfSwiY2xpY2siPT09dC50eXBlKSl7bGV0IGU9ITEsbj1yaSh0KTtmb3IobGV0IHQ9MDt0PG4ubGVuZ3RoO3QrKyl7aWYoblt0XS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKWlmKCJsYWJlbCI9PT1uW3RdLmxvY2FsTmFtZSlZbi5wdXNoKG5bdF0pO2Vsc2UgaWYoWG5bblt0XS5sb2NhbE5hbWVdKXtsZXQgaT1LbihuW3RdKTtmb3IobGV0IHQ9MDt0PGkubGVuZ3RoO3QrKyllPWV8fFluLmluZGV4T2YoaVt0XSk+LTF9aWYoblt0XT09PXRpLm1vdXNlLnRhcmdldClyZXR1cm59aWYoZSlyZXR1cm47dC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCl9fTtmdW5jdGlvbiBKbih0KXtsZXQgZT1xbj9bImNsaWNrIl06Rm47Zm9yKGxldCBuLGk9MDtpPGUubGVuZ3RoO2krKyluPWVbaV0sdD8oWW4ubGVuZ3RoPTAsZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihuLFpuLCEwKSk6ZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihuLFpuLCEwKX1mdW5jdGlvbiBRbih0KXtsZXQgZT10LnR5cGU7aWYoIWpuKGUpKXJldHVybiExO2lmKCJtb3VzZW1vdmUiPT09ZSl7bGV0IGU9dm9pZCAwPT09dC5idXR0b25zPzE6dC5idXR0b25zO3JldHVybiB0IGluc3RhbmNlb2Ygd2luZG93Lk1vdXNlRXZlbnQmJiFVbiYmKGU9Vm5bdC53aGljaF18fDApLEJvb2xlYW4oMSZlKX1yZXR1cm4gMD09PSh2b2lkIDA9PT10LmJ1dHRvbj8wOnQuYnV0dG9uKX1sZXQgdGk9e21vdXNlOnt0YXJnZXQ6bnVsbCxtb3VzZUlnbm9yZUpvYjpudWxsfSx0b3VjaDp7eDowLHk6MCxpZDotMSxzY3JvbGxEZWNpZGVkOiExfX07ZnVuY3Rpb24gZWkodCxlLG4pe3QubW92ZWZuPWUsdC51cGZuPW4sZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vtb3ZlIixlKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIixuKX1mdW5jdGlvbiBuaSh0KXtkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZW1vdmUiLHQubW92ZWZuKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIix0LnVwZm4pLHQubW92ZWZuPW51bGwsdC51cGZuPW51bGx9ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigidG91Y2hlbmQiLChmdW5jdGlvbiBpaSh0KXt0aS5tb3VzZS5tb3VzZUlnbm9yZUpvYnx8Sm4oITApLHRpLm1vdXNlLnRhcmdldD1yaSh0KVswXSx0aS5tb3VzZS5tb3VzZUlnbm9yZUpvYj1Obi5kZWJvdW5jZSh0aS5tb3VzZS5tb3VzZUlnbm9yZUpvYixndC5hZnRlcigyNTAwKSwoZnVuY3Rpb24oKXtKbigpLHRpLm1vdXNlLnRhcmdldD1udWxsLHRpLm1vdXNlLm1vdXNlSWdub3JlSm9iPW51bGx9KSl9KSwhIUduJiZ7cGFzc2l2ZTohMH0pO2NvbnN0IHJpPXdpbmRvdy5TaGFkeURPTSYmd2luZG93LlNoYWR5RE9NLm5vUGF0Y2g/d2luZG93LlNoYWR5RE9NLmNvbXBvc2VkUGF0aDp0PT50LmNvbXBvc2VkUGF0aCYmdC5jb21wb3NlZFBhdGgoKXx8W10sb2k9e30sYWk9W107ZnVuY3Rpb24gc2kodCl7Y29uc3QgZT1yaSh0KTtyZXR1cm4gZS5sZW5ndGg+MD9lWzBdOnQudGFyZ2V0fWZ1bmN0aW9uIGxpKHQpe2xldCBlLG49dC50eXBlLGk9dC5jdXJyZW50VGFyZ2V0W0RuXTtpZighaSlyZXR1cm47bGV0IHI9aVtuXTtpZihyKXtpZighdFtCbl0mJih0W0JuXT17fSwidG91Y2giPT09bi5zbGljZSgwLDUpKSl7bGV0IGU9KHQ9dCkuY2hhbmdlZFRvdWNoZXNbMF07aWYoInRvdWNoc3RhcnQiPT09biYmMT09PXQudG91Y2hlcy5sZW5ndGgmJih0aS50b3VjaC5pZD1lLmlkZW50aWZpZXIpLHRpLnRvdWNoLmlkIT09ZS5pZGVudGlmaWVyKXJldHVybjt6bnx8InRvdWNoc3RhcnQiIT09biYmInRvdWNobW92ZSIhPT1ufHwoZnVuY3Rpb24gbyh0KXtsZXQgZT10LmNoYW5nZWRUb3VjaGVzWzBdLG49dC50eXBlO2lmKCJ0b3VjaHN0YXJ0Ij09PW4pdGkudG91Y2gueD1lLmNsaWVudFgsdGkudG91Y2gueT1lLmNsaWVudFksdGkudG91Y2guc2Nyb2xsRGVjaWRlZD0hMTtlbHNlIGlmKCJ0b3VjaG1vdmUiPT09bil7aWYodGkudG91Y2guc2Nyb2xsRGVjaWRlZClyZXR1cm47dGkudG91Y2guc2Nyb2xsRGVjaWRlZD0hMDtsZXQgbj0oZnVuY3Rpb24gaSh0KXtsZXQgZT0iYXV0byIsbj1yaSh0KTtmb3IobGV0IHQsaT0wO2k8bi5sZW5ndGg7aSsrKWlmKHQ9bltpXSx0W0huXSl7ZT10W0huXTticmVha31yZXR1cm4gZX0pKHQpLGk9ITEscj1NYXRoLmFicyh0aS50b3VjaC54LWUuY2xpZW50WCksbz1NYXRoLmFicyh0aS50b3VjaC55LWUuY2xpZW50WSk7dC5jYW5jZWxhYmxlJiYoIm5vbmUiPT09bj9pPSEwOiJwYW4teCI9PT1uP2k9bz5yOiJwYW4teSI9PT1uJiYoaT1yPm8pKSxpP3QucHJldmVudERlZmF1bHQoKTpmaSgidHJhY2siKX19KSh0KX1pZihlPXRbQm5dLCFlLnNraXApe2ZvcihsZXQgbixpPTA7aTxhaS5sZW5ndGg7aSsrKW49YWlbaV0scltuLm5hbWVdJiYhZVtuLm5hbWVdJiZuLmZsb3cmJm4uZmxvdy5zdGFydC5pbmRleE9mKHQudHlwZSk+LTEmJm4ucmVzZXQmJm4ucmVzZXQoKTtmb3IobGV0IGksbz0wO288YWkubGVuZ3RoO28rKylpPWFpW29dLHJbaS5uYW1lXSYmIWVbaS5uYW1lXSYmKGVbaS5uYW1lXT0hMCxpW25dKHQpKX19fWZ1bmN0aW9uIGNpKHQsZSxuKXtyZXR1cm4hIW9pW2VdJiYoKGZ1bmN0aW9uIGkodCxlLG4pe2xldCBpPW9pW2VdLHI9aS5kZXBzLG89aS5uYW1lLGE9dFtEbl07YXx8KHRbRG5dPWE9e30pO2ZvcihsZXQgZSxuLGk9MDtpPHIubGVuZ3RoO2krKyllPXJbaV0scW4mJmpuKGUpJiYiY2xpY2siIT09ZXx8KG49YVtlXSxufHwoYVtlXT1uPXtfY291bnQ6MH0pLDA9PT1uLl9jb3VudCYmdC5hZGRFdmVudExpc3RlbmVyKGUsbGksV24oZSkpLG5bb109KG5bb118fDApKzEsbi5fY291bnQ9KG4uX2NvdW50fHwwKSsxKTt0LmFkZEV2ZW50TGlzdGVuZXIoZSxuKSxpLnRvdWNoQWN0aW9uJiZkaSh0LGkudG91Y2hBY3Rpb24pfSkodCxlLG4pLCEwKX1mdW5jdGlvbiB1aSh0LGUsbil7cmV0dXJuISFvaVtlXSYmKChmdW5jdGlvbiBpKHQsZSxuKXtsZXQgaT1vaVtlXSxyPWkuZGVwcyxvPWkubmFtZSxhPXRbRG5dO2lmKGEpZm9yKGxldCBlLG4saT0wO2k8ci5sZW5ndGg7aSsrKWU9cltpXSxuPWFbZV0sbiYmbltvXSYmKG5bb109KG5bb118fDEpLTEsbi5fY291bnQ9KG4uX2NvdW50fHwxKS0xLDA9PT1uLl9jb3VudCYmdC5yZW1vdmVFdmVudExpc3RlbmVyKGUsbGksV24oZSkpKTt0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZSxuKX0pKHQsZSxuKSwhMCl9ZnVuY3Rpb24gaGkodCl7YWkucHVzaCh0KTtmb3IobGV0IGU9MDtlPHQuZW1pdHMubGVuZ3RoO2UrKylvaVt0LmVtaXRzW2VdXT10fWZ1bmN0aW9uIGRpKHQsZSl7em4mJnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCYmdnQucnVuKCgoKT0+e3Quc3R5bGUudG91Y2hBY3Rpb249ZX0pKSx0W0huXT1lfWZ1bmN0aW9uIHBpKHQsZSxuKXtsZXQgaT1uZXcgRXZlbnQoZSx7YnViYmxlczohMCxjYW5jZWxhYmxlOiEwLGNvbXBvc2VkOiEwfSk7aWYoaS5kZXRhaWw9bixZKHQpLmRpc3BhdGNoRXZlbnQoaSksaS5kZWZhdWx0UHJldmVudGVkKXtsZXQgdD1uLnByZXZlbnRlcnx8bi5zb3VyY2VFdmVudDt0JiZ0LnByZXZlbnREZWZhdWx0JiZ0LnByZXZlbnREZWZhdWx0KCl9fWZ1bmN0aW9uIGZpKHQpe2xldCBlPShmdW5jdGlvbiBuKHQpe2ZvcihsZXQgZSxuPTA7bjxhaS5sZW5ndGg7bisrKXtlPWFpW25dO2ZvcihsZXQgbixpPTA7aTxlLmVtaXRzLmxlbmd0aDtpKyspaWYobj1lLmVtaXRzW2ldLG49PT10KXJldHVybiBlfXJldHVybiBudWxsfSkodCk7ZS5pbmZvJiYoZS5pbmZvLnByZXZlbnQ9ITApfWZ1bmN0aW9uIG1pKHQsZSxuLGkpe2UmJnBpKGUsdCx7eDpuLmNsaWVudFgseTpuLmNsaWVudFksc291cmNlRXZlbnQ6bixwcmV2ZW50ZXI6aSxwcmV2ZW50OmZ1bmN0aW9uKHQpe3JldHVybiBmaSh0KX19KX1mdW5jdGlvbiBnaSh0LGUsbil7aWYodC5wcmV2ZW50KXJldHVybiExO2lmKHQuc3RhcnRlZClyZXR1cm4hMDtsZXQgaT1NYXRoLmFicyh0LngtZSkscj1NYXRoLmFicyh0Lnktbik7cmV0dXJuIGk+PTV8fHI+PTV9ZnVuY3Rpb24gX2kodCxlLG4pe2lmKCFlKXJldHVybjtsZXQgaSxyPXQubW92ZXNbdC5tb3Zlcy5sZW5ndGgtMl0sbz10Lm1vdmVzW3QubW92ZXMubGVuZ3RoLTFdLGE9MDtyJiYoaT1vLngtci54LGE9by55LXIueSkscGkoZSwidHJhY2siLHtzdGF0ZTp0LnN0YXRlLHg6bi5jbGllbnRYLHk6bi5jbGllbnRZLGR4Om8ueC10LngsZHk6by55LXQueSxkZHg6aSxkZHk6YSxzb3VyY2VFdmVudDpuLGhvdmVyOmZ1bmN0aW9uKCl7cmV0dXJuKGZ1bmN0aW9uIHQoZSxuKXtsZXQgaT1kb2N1bWVudC5lbGVtZW50RnJvbVBvaW50KGUsbikscj1pO2Zvcig7ciYmci5zaGFkb3dSb290JiYhd2luZG93LlNoYWR5RE9NOyl7bGV0IHQ9cjtpZihyPXIuc2hhZG93Um9vdC5lbGVtZW50RnJvbVBvaW50KGUsbiksdD09PXIpYnJlYWs7ciYmKGk9cil9cmV0dXJuIGl9KShuLmNsaWVudFgsbi5jbGllbnRZKX19KX1mdW5jdGlvbiB5aSh0LGUsbil7bGV0IGk9TWF0aC5hYnMoZS5jbGllbnRYLXQueCkscj1NYXRoLmFicyhlLmNsaWVudFktdC55KSxvPXNpKG58fGUpOyFvfHwkbltvLmxvY2FsTmFtZV0mJm8uaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpfHwoaXNOYU4oaSl8fGlzTmFOKHIpfHxpPD0yNSYmcjw9MjV8fChmdW5jdGlvbiBhKHQpe2lmKCJjbGljayI9PT10LnR5cGUpe2lmKDA9PT10LmRldGFpbClyZXR1cm4hMDtsZXQgZT1zaSh0KTtpZighZS5ub2RlVHlwZXx8ZS5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFKXJldHVybiEwO2xldCBuPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksaT10LnBhZ2VYLHI9dC5wYWdlWTtyZXR1cm4hKGk+PW4ubGVmdCYmaTw9bi5yaWdodCYmcj49bi50b3AmJnI8PW4uYm90dG9tKX1yZXR1cm4hMX0pKGUpKSYmKHQucHJldmVudHx8cGkobywidGFwIix7eDplLmNsaWVudFgseTplLmNsaWVudFksc291cmNlRXZlbnQ6ZSxwcmV2ZW50ZXI6bn0pKX1oaSh7bmFtZToiZG93bnVwIixkZXBzOlsibW91c2Vkb3duIiwidG91Y2hzdGFydCIsInRvdWNoZW5kIl0sZmxvdzp7c3RhcnQ6WyJtb3VzZWRvd24iLCJ0b3VjaHN0YXJ0Il0sZW5kOlsibW91c2V1cCIsInRvdWNoZW5kIl19LGVtaXRzOlsiZG93biIsInVwIl0saW5mbzp7bW92ZWZuOm51bGwsdXBmbjpudWxsfSxyZXNldDpmdW5jdGlvbigpe25pKHRoaXMuaW5mbyl9LG1vdXNlZG93bjpmdW5jdGlvbih0KXtpZighUW4odCkpcmV0dXJuO2xldCBlPXNpKHQpLG49dGhpcztlaSh0aGlzLmluZm8sKGZ1bmN0aW9uIHQoaSl7UW4oaSl8fChtaSgidXAiLGUsaSksbmkobi5pbmZvKSl9KSwoZnVuY3Rpb24gdChpKXtRbihpKSYmbWkoInVwIixlLGkpLG5pKG4uaW5mbyl9KSksbWkoImRvd24iLGUsdCl9LHRvdWNoc3RhcnQ6ZnVuY3Rpb24odCl7bWkoImRvd24iLHNpKHQpLHQuY2hhbmdlZFRvdWNoZXNbMF0sdCl9LHRvdWNoZW5kOmZ1bmN0aW9uKHQpe21pKCJ1cCIsc2kodCksdC5jaGFuZ2VkVG91Y2hlc1swXSx0KX19KSxoaSh7bmFtZToidHJhY2siLHRvdWNoQWN0aW9uOiJub25lIixkZXBzOlsibW91c2Vkb3duIiwidG91Y2hzdGFydCIsInRvdWNobW92ZSIsInRvdWNoZW5kIl0sZmxvdzp7c3RhcnQ6WyJtb3VzZWRvd24iLCJ0b3VjaHN0YXJ0Il0sZW5kOlsibW91c2V1cCIsInRvdWNoZW5kIl19LGVtaXRzOlsidHJhY2siXSxpbmZvOnt4OjAseTowLHN0YXRlOiJzdGFydCIsc3RhcnRlZDohMSxtb3ZlczpbXSxhZGRNb3ZlOmZ1bmN0aW9uKHQpe3RoaXMubW92ZXMubGVuZ3RoPjImJnRoaXMubW92ZXMuc2hpZnQoKSx0aGlzLm1vdmVzLnB1c2godCl9LG1vdmVmbjpudWxsLHVwZm46bnVsbCxwcmV2ZW50OiExfSxyZXNldDpmdW5jdGlvbigpe3RoaXMuaW5mby5zdGF0ZT0ic3RhcnQiLHRoaXMuaW5mby5zdGFydGVkPSExLHRoaXMuaW5mby5tb3Zlcz1bXSx0aGlzLmluZm8ueD0wLHRoaXMuaW5mby55PTAsdGhpcy5pbmZvLnByZXZlbnQ9ITEsbmkodGhpcy5pbmZvKX0sbW91c2Vkb3duOmZ1bmN0aW9uKHQpe2lmKCFRbih0KSlyZXR1cm47bGV0IGU9c2kodCksbj10aGlzLGk9ZnVuY3Rpb24gdChpKXtsZXQgcj1pLmNsaWVudFgsbz1pLmNsaWVudFk7Z2kobi5pbmZvLHIsbykmJihuLmluZm8uc3RhdGU9bi5pbmZvLnN0YXJ0ZWQ/Im1vdXNldXAiPT09aS50eXBlPyJlbmQiOiJ0cmFjayI6InN0YXJ0Iiwic3RhcnQiPT09bi5pbmZvLnN0YXRlJiZmaSgidGFwIiksbi5pbmZvLmFkZE1vdmUoe3g6cix5Om99KSxRbihpKXx8KG4uaW5mby5zdGF0ZT0iZW5kIixuaShuLmluZm8pKSxlJiZfaShuLmluZm8sZSxpKSxuLmluZm8uc3RhcnRlZD0hMCl9O2VpKHRoaXMuaW5mbyxpLChmdW5jdGlvbiB0KGUpe24uaW5mby5zdGFydGVkJiZpKGUpLG5pKG4uaW5mbyl9KSksdGhpcy5pbmZvLng9dC5jbGllbnRYLHRoaXMuaW5mby55PXQuY2xpZW50WX0sdG91Y2hzdGFydDpmdW5jdGlvbih0KXtsZXQgZT10LmNoYW5nZWRUb3VjaGVzWzBdO3RoaXMuaW5mby54PWUuY2xpZW50WCx0aGlzLmluZm8ueT1lLmNsaWVudFl9LHRvdWNobW92ZTpmdW5jdGlvbih0KXtsZXQgZT1zaSh0KSxuPXQuY2hhbmdlZFRvdWNoZXNbMF0saT1uLmNsaWVudFgscj1uLmNsaWVudFk7Z2kodGhpcy5pbmZvLGkscikmJigic3RhcnQiPT09dGhpcy5pbmZvLnN0YXRlJiZmaSgidGFwIiksdGhpcy5pbmZvLmFkZE1vdmUoe3g6aSx5OnJ9KSxfaSh0aGlzLmluZm8sZSxuKSx0aGlzLmluZm8uc3RhdGU9InRyYWNrIix0aGlzLmluZm8uc3RhcnRlZD0hMCl9LHRvdWNoZW5kOmZ1bmN0aW9uKHQpe2xldCBlPXNpKHQpLG49dC5jaGFuZ2VkVG91Y2hlc1swXTt0aGlzLmluZm8uc3RhcnRlZCYmKHRoaXMuaW5mby5zdGF0ZT0iZW5kIix0aGlzLmluZm8uYWRkTW92ZSh7eDpuLmNsaWVudFgseTpuLmNsaWVudFl9KSxfaSh0aGlzLmluZm8sZSxuKSl9fSksaGkoe25hbWU6InRhcCIsZGVwczpbIm1vdXNlZG93biIsImNsaWNrIiwidG91Y2hzdGFydCIsInRvdWNoZW5kIl0sZmxvdzp7c3RhcnQ6WyJtb3VzZWRvd24iLCJ0b3VjaHN0YXJ0Il0sZW5kOlsiY2xpY2siLCJ0b3VjaGVuZCJdfSxlbWl0czpbInRhcCJdLGluZm86e3g6TmFOLHk6TmFOLHByZXZlbnQ6ITF9LHJlc2V0OmZ1bmN0aW9uKCl7dGhpcy5pbmZvLng9TmFOLHRoaXMuaW5mby55PU5hTix0aGlzLmluZm8ucHJldmVudD0hMX0sbW91c2Vkb3duOmZ1bmN0aW9uKHQpe1FuKHQpJiYodGhpcy5pbmZvLng9dC5jbGllbnRYLHRoaXMuaW5mby55PXQuY2xpZW50WSl9LGNsaWNrOmZ1bmN0aW9uKHQpe1FuKHQpJiZ5aSh0aGlzLmluZm8sdCl9LHRvdWNoc3RhcnQ6ZnVuY3Rpb24odCl7Y29uc3QgZT10LmNoYW5nZWRUb3VjaGVzWzBdO3RoaXMuaW5mby54PWUuY2xpZW50WCx0aGlzLmluZm8ueT1lLmNsaWVudFl9LHRvdWNoZW5kOmZ1bmN0aW9uKHQpe3lpKHRoaXMuaW5mbyx0LmNoYW5nZWRUb3VjaGVzWzBdLHQpfX0pO2NvbnN0IHZpPXNpLGJpPUkoKHQ9PmNsYXNzIGV4dGVuZHMgdHtfYWRkRXZlbnRMaXN0ZW5lclRvTm9kZSh0LGUsbil7Y2kodCxlLG4pfHxzdXBlci5fYWRkRXZlbnRMaXN0ZW5lclRvTm9kZSh0LGUsbil9X3JlbW92ZUV2ZW50TGlzdGVuZXJGcm9tTm9kZSh0LGUsbil7dWkodCxlLG4pfHxzdXBlci5fcmVtb3ZlRXZlbnRMaXN0ZW5lckZyb21Ob2RlKHQsZSxuKX19KSkseGk9Lzpob3N0XCg6ZGlyXCgobHRyfHJ0bClcKVwpL2csd2k9LyhbXHNcdy0jXC5cW1xdXCpdKik6ZGlyXCgobHRyfHJ0bClcKS9nLFNpPS86ZGlyXCgoPzpsdHJ8cnRsKVwpLyxNaT1Cb29sZWFuKHdpbmRvdy5TaGFkeURPTSYmd2luZG93LlNoYWR5RE9NLmluVXNlKSxFaT1bXTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9sZXQgVGk9bnVsbCxDaT0iIjtmdW5jdGlvbiBBaSgpe0NpPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoImRpciIpfWZ1bmN0aW9uIGtpKHQpe2lmKCF0Ll9fYXV0b0Rpck9wdE91dCl7dC5zZXRBdHRyaWJ1dGUoImRpciIsQ2kpfX1mdW5jdGlvbiBMaSgpe0FpKCksQ2k9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgiZGlyIik7Zm9yKGxldCB0PTA7dDxFaS5sZW5ndGg7dCsrKWtpKEVpW3RdKX1jb25zdCBQaT1JKCh0PT57TWl8fFRpfHwoQWkoKSxUaT1uZXcgTXV0YXRpb25PYnNlcnZlcihMaSksVGkub2JzZXJ2ZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQse2F0dHJpYnV0ZXM6ITAsYXR0cmlidXRlRmlsdGVyOlsiZGlyIl19KSk7Y29uc3QgZT1NdCh0KTtjbGFzcyBuIGV4dGVuZHMgZXtzdGF0aWMgX3Byb2Nlc3NTdHlsZVRleHQodCxuKXtyZXR1cm4gdD1lLl9wcm9jZXNzU3R5bGVUZXh0LmNhbGwodGhpcyx0LG4pLCFNaSYmU2kudGVzdCh0KSYmKHQ9dGhpcy5fcmVwbGFjZURpckluQ3NzVGV4dCh0KSx0aGlzLl9fYWN0aXZhdGVEaXI9ITApLHR9c3RhdGljIF9yZXBsYWNlRGlySW5Dc3NUZXh0KHQpe2xldCBlPXQ7cmV0dXJuIGU9ZS5yZXBsYWNlKHhpLCc6aG9zdChbZGlyPSIkMSJdKScpLGU9ZS5yZXBsYWNlKHdpLCc6aG9zdChbZGlyPSIkMiJdKSAkMScpLGV9Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuX19hdXRvRGlyT3B0T3V0PSExfXJlYWR5KCl7c3VwZXIucmVhZHkoKSx0aGlzLl9fYXV0b0Rpck9wdE91dD10aGlzLmhhc0F0dHJpYnV0ZSgiZGlyIil9Y29ubmVjdGVkQ2FsbGJhY2soKXtlLnByb3RvdHlwZS5jb25uZWN0ZWRDYWxsYmFjayYmc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKSx0aGlzLmNvbnN0cnVjdG9yLl9fYWN0aXZhdGVEaXImJighKGZ1bmN0aW9uIHQoKXtUaSYmVGkudGFrZVJlY29yZHMoKS5sZW5ndGgmJkxpKCl9KSgpLEVpLnB1c2godGhpcyksa2kodGhpcykpfWRpc2Nvbm5lY3RlZENhbGxiYWNrKCl7aWYoZS5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2smJnN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCksdGhpcy5jb25zdHJ1Y3Rvci5fX2FjdGl2YXRlRGlyKXtjb25zdCB0PUVpLmluZGV4T2YodGhpcyk7dD4tMSYmRWkuc3BsaWNlKHQsMSl9fX1yZXR1cm4gbi5fX2FjdGl2YXRlRGlyPSExLG59KSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovbGV0IE5pPSExLElpPVtdLFJpPVtdO2Z1bmN0aW9uIE9pKCl7Tmk9ITAscmVxdWVzdEFuaW1hdGlvbkZyYW1lKChmdW5jdGlvbigpe05pPSExLChmdW5jdGlvbiB0KGUpe2Zvcig7ZS5sZW5ndGg7KXppKGUuc2hpZnQoKSl9KShJaSksc2V0VGltZW91dCgoZnVuY3Rpb24oKXshKGZ1bmN0aW9uIHQoZSl7Zm9yKGxldCB0PTAsbj1lLmxlbmd0aDt0PG47dCsrKXppKGUuc2hpZnQoKSl9KShSaSl9KSl9KSl9ZnVuY3Rpb24gemkodCl7Y29uc3QgZT10WzBdLG49dFsxXSxpPXRbMl07dHJ5e24uYXBwbHkoZSxpKX1jYXRjaCh0KXtzZXRUaW1lb3V0KCgoKT0+e3Rocm93IHR9KSl9fWZ1bmN0aW9uIERpKHQsZSxuKXtOaXx8T2koKSxSaS5wdXNoKFt0LGUsbl0pfQovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqL2Z1bmN0aW9uIEJpKCl7ZG9jdW1lbnQuYm9keS5yZW1vdmVBdHRyaWJ1dGUoInVucmVzb2x2ZWQiKX0KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KZnVuY3Rpb24gSGkodCxlLG4pe3JldHVybntpbmRleDp0LHJlbW92ZWQ6ZSxhZGRlZENvdW50Om59fSJpbnRlcmFjdGl2ZSI9PT1kb2N1bWVudC5yZWFkeVN0YXRlfHwiY29tcGxldGUiPT09ZG9jdW1lbnQucmVhZHlTdGF0ZT9CaSgpOndpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixCaSk7ZnVuY3Rpb24gRmkodCxlLG4saSxyLG8pe2xldCBhLHM9MCxsPTAsYz1NYXRoLm1pbihuLWUsby1yKTtpZigwPT1lJiYwPT1yJiYocz0oZnVuY3Rpb24gdSh0LGUsbil7Zm9yKGxldCBpPTA7aTxuO2krKylpZighVWkodFtpXSxlW2ldKSlyZXR1cm4gaTtyZXR1cm4gbn0pKHQsaSxjKSksbj09dC5sZW5ndGgmJm89PWkubGVuZ3RoJiYobD0oZnVuY3Rpb24gaCh0LGUsbil7bGV0IGk9dC5sZW5ndGgscj1lLmxlbmd0aCxvPTA7Zm9yKDtvPG4mJlVpKHRbLS1pXSxlWy0tcl0pOylvKys7cmV0dXJuIG99KSh0LGksYy1zKSkscis9cyxvLT1sLChuLT1sKS0oZSs9cyk9PTAmJm8tcj09MClyZXR1cm5bXTtpZihlPT1uKXtmb3IoYT1IaShlLFtdLDApO3I8bzspYS5yZW1vdmVkLnB1c2goaVtyKytdKTtyZXR1cm5bYV19aWYocj09bylyZXR1cm5bSGkoZSxbXSxuLWUpXTtsZXQgZD0oZnVuY3Rpb24gZih0KXtsZXQgZT10Lmxlbmd0aC0xLG49dFswXS5sZW5ndGgtMSxpPXRbZV1bbl0scj1bXTtmb3IoO2U+MHx8bj4wOyl7aWYoMD09ZSl7ci5wdXNoKDIpLG4tLTtjb250aW51ZX1pZigwPT1uKXtyLnB1c2goMyksZS0tO2NvbnRpbnVlfWxldCBvLGE9dFtlLTFdW24tMV0scz10W2UtMV1bbl0sbD10W2VdW24tMV07bz1zPGw/czxhP3M6YTpsPGE/bDphLG89PWE/KGE9PWk/ci5wdXNoKDApOihyLnB1c2goMSksaT1hKSxlLS0sbi0tKTpvPT1zPyhyLnB1c2goMyksZS0tLGk9cyk6KHIucHVzaCgyKSxuLS0saT1sKX1yZXR1cm4gci5yZXZlcnNlKCkscn0pKChmdW5jdGlvbiBwKHQsZSxuLGkscixvKXtsZXQgYT1vLXIrMSxzPW4tZSsxLGw9bmV3IEFycmF5KGEpO2ZvcihsZXQgdD0wO3Q8YTt0KyspbFt0XT1uZXcgQXJyYXkocyksbFt0XVswXT10O2ZvcihsZXQgdD0wO3Q8czt0KyspbFswXVt0XT10O2ZvcihsZXQgbj0xO248YTtuKyspZm9yKGxldCBvPTE7bzxzO28rKylpZihVaSh0W2Urby0xXSxpW3Irbi0xXSkpbFtuXVtvXT1sW24tMV1bby0xXTtlbHNle2xldCB0PWxbbi0xXVtvXSsxLGU9bFtuXVtvLTFdKzE7bFtuXVtvXT10PGU/dDplfXJldHVybiBsfSkodCxlLG4saSxyLG8pKTthPXZvaWQgMDtsZXQgbT1bXSxnPWUsXz1yO2ZvcihsZXQgdD0wO3Q8ZC5sZW5ndGg7dCsrKXN3aXRjaChkW3RdKXtjYXNlIDA6YSYmKG0ucHVzaChhKSxhPXZvaWQgMCksZysrLF8rKzticmVhaztjYXNlIDE6YXx8KGE9SGkoZyxbXSwwKSksYS5hZGRlZENvdW50KyssZysrLGEucmVtb3ZlZC5wdXNoKGlbX10pLF8rKzticmVhaztjYXNlIDI6YXx8KGE9SGkoZyxbXSwwKSksYS5hZGRlZENvdW50KyssZysrO2JyZWFrO2Nhc2UgMzphfHwoYT1IaShnLFtdLDApKSxhLnJlbW92ZWQucHVzaChpW19dKSxfKyt9cmV0dXJuIGEmJm0ucHVzaChhKSxtfWZ1bmN0aW9uIFZpKHQsZSl7cmV0dXJuIEZpKHQsMCx0Lmxlbmd0aCxlLDAsZS5sZW5ndGgpfWZ1bmN0aW9uIFVpKHQsZSl7cmV0dXJuIHQ9PT1lfQovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqL2Z1bmN0aW9uIGppKHQpe3JldHVybiJzbG90Ij09PXQubG9jYWxOYW1lfWxldCBHaT1jbGFzc3tzdGF0aWMgZ2V0RmxhdHRlbmVkTm9kZXModCl7Y29uc3QgZT1ZKHQpO3JldHVybiBqaSh0KT8odD10LGUuYXNzaWduZWROb2Rlcyh7ZmxhdHRlbjohMH0pKTpBcnJheS5mcm9tKGUuY2hpbGROb2RlcykubWFwKCh0PT5qaSh0KT9ZKHQ9dCkuYXNzaWduZWROb2Rlcyh7ZmxhdHRlbjohMH0pOlt0XSkpLnJlZHVjZSgoKHQsZSk9PnQuY29uY2F0KGUpKSxbXSl9Y29uc3RydWN0b3IodCxlKXt0aGlzLl9zaGFkeUNoaWxkcmVuT2JzZXJ2ZXI9bnVsbCx0aGlzLl9uYXRpdmVDaGlsZHJlbk9ic2VydmVyPW51bGwsdGhpcy5fY29ubmVjdGVkPSExLHRoaXMuX3RhcmdldD10LHRoaXMuY2FsbGJhY2s9ZSx0aGlzLl9lZmZlY3RpdmVOb2Rlcz1bXSx0aGlzLl9vYnNlcnZlcj1udWxsLHRoaXMuX3NjaGVkdWxlZD0hMSx0aGlzLl9ib3VuZFNjaGVkdWxlPSgpPT57dGhpcy5fc2NoZWR1bGUoKX0sdGhpcy5jb25uZWN0KCksdGhpcy5fc2NoZWR1bGUoKX1jb25uZWN0KCl7amkodGhpcy5fdGFyZ2V0KT90aGlzLl9saXN0ZW5TbG90cyhbdGhpcy5fdGFyZ2V0XSk6WSh0aGlzLl90YXJnZXQpLmNoaWxkcmVuJiYodGhpcy5fbGlzdGVuU2xvdHMoWSh0aGlzLl90YXJnZXQpLmNoaWxkcmVuKSx3aW5kb3cuU2hhZHlET00/dGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyPXdpbmRvdy5TaGFkeURPTS5vYnNlcnZlQ2hpbGRyZW4odGhpcy5fdGFyZ2V0LCh0PT57dGhpcy5fcHJvY2Vzc011dGF0aW9ucyh0KX0pKToodGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlcj1uZXcgTXV0YXRpb25PYnNlcnZlcigodD0+e3RoaXMuX3Byb2Nlc3NNdXRhdGlvbnModCl9KSksdGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlci5vYnNlcnZlKHRoaXMuX3RhcmdldCx7Y2hpbGRMaXN0OiEwfSkpKSx0aGlzLl9jb25uZWN0ZWQ9ITB9ZGlzY29ubmVjdCgpe2ppKHRoaXMuX3RhcmdldCk/dGhpcy5fdW5saXN0ZW5TbG90cyhbdGhpcy5fdGFyZ2V0XSk6WSh0aGlzLl90YXJnZXQpLmNoaWxkcmVuJiYodGhpcy5fdW5saXN0ZW5TbG90cyhZKHRoaXMuX3RhcmdldCkuY2hpbGRyZW4pLHdpbmRvdy5TaGFkeURPTSYmdGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyPyh3aW5kb3cuU2hhZHlET00udW5vYnNlcnZlQ2hpbGRyZW4odGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyKSx0aGlzLl9zaGFkeUNoaWxkcmVuT2JzZXJ2ZXI9bnVsbCk6dGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlciYmKHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIuZGlzY29ubmVjdCgpLHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXI9bnVsbCkpLHRoaXMuX2Nvbm5lY3RlZD0hMX1fc2NoZWR1bGUoKXt0aGlzLl9zY2hlZHVsZWR8fCh0aGlzLl9zY2hlZHVsZWQ9ITAsdnQucnVuKCgoKT0+dGhpcy5mbHVzaCgpKSkpfV9wcm9jZXNzTXV0YXRpb25zKHQpe3RoaXMuX3Byb2Nlc3NTbG90TXV0YXRpb25zKHQpLHRoaXMuZmx1c2goKX1fcHJvY2Vzc1Nsb3RNdXRhdGlvbnModCl7aWYodClmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl7bGV0IG49dFtlXTtuLmFkZGVkTm9kZXMmJnRoaXMuX2xpc3RlblNsb3RzKG4uYWRkZWROb2Rlcyksbi5yZW1vdmVkTm9kZXMmJnRoaXMuX3VubGlzdGVuU2xvdHMobi5yZW1vdmVkTm9kZXMpfX1mbHVzaCgpe2lmKCF0aGlzLl9jb25uZWN0ZWQpcmV0dXJuITE7d2luZG93LlNoYWR5RE9NJiZTaGFkeURPTS5mbHVzaCgpLHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXI/dGhpcy5fcHJvY2Vzc1Nsb3RNdXRhdGlvbnModGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlci50YWtlUmVjb3JkcygpKTp0aGlzLl9zaGFkeUNoaWxkcmVuT2JzZXJ2ZXImJnRoaXMuX3Byb2Nlc3NTbG90TXV0YXRpb25zKHRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlci50YWtlUmVjb3JkcygpKSx0aGlzLl9zY2hlZHVsZWQ9ITE7bGV0IHQ9e3RhcmdldDp0aGlzLl90YXJnZXQsYWRkZWROb2RlczpbXSxyZW1vdmVkTm9kZXM6W119LGU9dGhpcy5jb25zdHJ1Y3Rvci5nZXRGbGF0dGVuZWROb2Rlcyh0aGlzLl90YXJnZXQpLG49VmkoZSx0aGlzLl9lZmZlY3RpdmVOb2Rlcyk7Zm9yKGxldCBlLGk9MDtpPG4ubGVuZ3RoJiYoZT1uW2ldKTtpKyspZm9yKGxldCBuLGk9MDtpPGUucmVtb3ZlZC5sZW5ndGgmJihuPWUucmVtb3ZlZFtpXSk7aSsrKXQucmVtb3ZlZE5vZGVzLnB1c2gobik7Zm9yKGxldCBpLHI9MDtyPG4ubGVuZ3RoJiYoaT1uW3JdKTtyKyspZm9yKGxldCBuPWkuaW5kZXg7bjxpLmluZGV4K2kuYWRkZWRDb3VudDtuKyspdC5hZGRlZE5vZGVzLnB1c2goZVtuXSk7dGhpcy5fZWZmZWN0aXZlTm9kZXM9ZTtsZXQgaT0hMTtyZXR1cm4odC5hZGRlZE5vZGVzLmxlbmd0aHx8dC5yZW1vdmVkTm9kZXMubGVuZ3RoKSYmKGk9ITAsdGhpcy5jYWxsYmFjay5jYWxsKHRoaXMuX3RhcmdldCx0KSksaX1fbGlzdGVuU2xvdHModCl7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspe2xldCBuPXRbZV07amkobikmJm4uYWRkRXZlbnRMaXN0ZW5lcigic2xvdGNoYW5nZSIsdGhpcy5fYm91bmRTY2hlZHVsZSl9fV91bmxpc3RlblNsb3RzKHQpe2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtsZXQgbj10W2VdO2ppKG4pJiZuLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNsb3RjaGFuZ2UiLHRoaXMuX2JvdW5kU2NoZWR1bGUpfX19OwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqL2NvbnN0IFdpPWZ1bmN0aW9uKCl7bGV0IHQsZTtkb3t0PXdpbmRvdy5TaGFkeURPTSYmU2hhZHlET00uZmx1c2goKSx3aW5kb3cuU2hhZHlDU1MmJndpbmRvdy5TaGFkeUNTUy5TY29waW5nU2hpbSYmd2luZG93LlNoYWR5Q1NTLlNjb3BpbmdTaGltLmZsdXNoKCksZT1PbigpfXdoaWxlKHR8fGUpfSxxaT1FbGVtZW50LnByb3RvdHlwZSxZaT1xaS5tYXRjaGVzfHxxaS5tYXRjaGVzU2VsZWN0b3J8fHFpLm1vek1hdGNoZXNTZWxlY3Rvcnx8cWkubXNNYXRjaGVzU2VsZWN0b3J8fHFpLm9NYXRjaGVzU2VsZWN0b3J8fHFpLndlYmtpdE1hdGNoZXNTZWxlY3RvcixYaT1mdW5jdGlvbih0LGUpe3JldHVybiBZaS5jYWxsKHQsZSl9OwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqL2NsYXNzICRpe2NvbnN0cnVjdG9yKHQpe3dpbmRvdy5TaGFkeURPTSYmd2luZG93LlNoYWR5RE9NLmluVXNlJiZ3aW5kb3cuU2hhZHlET00ucGF0Y2godCksdGhpcy5ub2RlPXR9b2JzZXJ2ZU5vZGVzKHQpe3JldHVybiBuZXcgR2kodGhpcy5ub2RlLHQpfXVub2JzZXJ2ZU5vZGVzKHQpe3QuZGlzY29ubmVjdCgpfW5vdGlmeU9ic2VydmVyKCl7fWRlZXBDb250YWlucyh0KXtpZihZKHRoaXMubm9kZSkuY29udGFpbnModCkpcmV0dXJuITA7bGV0IGU9dCxuPXQub3duZXJEb2N1bWVudDtmb3IoO2UmJmUhPT1uJiZlIT09dGhpcy5ub2RlOyllPVkoZSkucGFyZW50Tm9kZXx8WShlKS5ob3N0O3JldHVybiBlPT09dGhpcy5ub2RlfWdldE93bmVyUm9vdCgpe3JldHVybiBZKHRoaXMubm9kZSkuZ2V0Um9vdE5vZGUoKX1nZXREaXN0cmlidXRlZE5vZGVzKCl7cmV0dXJuInNsb3QiPT09dGhpcy5ub2RlLmxvY2FsTmFtZT9ZKHRoaXMubm9kZSkuYXNzaWduZWROb2Rlcyh7ZmxhdHRlbjohMH0pOltdfWdldERlc3RpbmF0aW9uSW5zZXJ0aW9uUG9pbnRzKCl7bGV0IHQ9W10sZT1ZKHRoaXMubm9kZSkuYXNzaWduZWRTbG90O2Zvcig7ZTspdC5wdXNoKGUpLGU9WShlKS5hc3NpZ25lZFNsb3Q7cmV0dXJuIHR9aW1wb3J0Tm9kZSh0LGUpe2xldCBuPXRoaXMubm9kZSBpbnN0YW5jZW9mIERvY3VtZW50P3RoaXMubm9kZTp0aGlzLm5vZGUub3duZXJEb2N1bWVudDtyZXR1cm4gWShuKS5pbXBvcnROb2RlKHQsZSl9Z2V0RWZmZWN0aXZlQ2hpbGROb2Rlcygpe3JldHVybiBHaS5nZXRGbGF0dGVuZWROb2Rlcyh0aGlzLm5vZGUpfXF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyh0KXtsZXQgZT10aGlzLmdldEVmZmVjdGl2ZUNoaWxkTm9kZXMoKSxuPVtdO2ZvcihsZXQgaSxyPTAsbz1lLmxlbmd0aDtyPG8mJihpPWVbcl0pO3IrKylpLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJlhpKGksdCkmJm4ucHVzaChpKTtyZXR1cm4gbn1nZXQgYWN0aXZlRWxlbWVudCgpe2xldCB0PXRoaXMubm9kZTtyZXR1cm4gdm9pZCAwIT09dC5fYWN0aXZlRWxlbWVudD90Ll9hY3RpdmVFbGVtZW50OnQuYWN0aXZlRWxlbWVudH19ZnVuY3Rpb24gS2kodCxlKXtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7bGV0IGk9ZVtuXTtPYmplY3QuZGVmaW5lUHJvcGVydHkodCxpLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ub2RlW2ldfSxjb25maWd1cmFibGU6ITB9KX19Y2xhc3MgWml7Y29uc3RydWN0b3IodCl7dGhpcy5ldmVudD10fWdldCByb290VGFyZ2V0KCl7cmV0dXJuIHRoaXMucGF0aFswXX1nZXQgbG9jYWxUYXJnZXQoKXtyZXR1cm4gdGhpcy5ldmVudC50YXJnZXR9Z2V0IHBhdGgoKXtyZXR1cm4gdGhpcy5ldmVudC5jb21wb3NlZFBhdGgoKX19bGV0IEppPSRpO2lmKHdpbmRvdy5TaGFkeURPTSYmd2luZG93LlNoYWR5RE9NLmluVXNlJiZ3aW5kb3cuU2hhZHlET00ubm9QYXRjaCYmd2luZG93LlNoYWR5RE9NLldyYXBwZXIpe2NsYXNzIHQgZXh0ZW5kcyB3aW5kb3cuU2hhZHlET00uV3JhcHBlcnt9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoJGkucHJvdG90eXBlKS5mb3JFYWNoKChlPT57ImFjdGl2ZUVsZW1lbnQiIT1lJiYodC5wcm90b3R5cGVbZV09JGkucHJvdG90eXBlW2VdKX0pKSxLaSh0LnByb3RvdHlwZSxbImNsYXNzTGlzdCJdKSxKaT10LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKFppLnByb3RvdHlwZSx7bG9jYWxUYXJnZXQ6e2dldCgpe2NvbnN0IHQ9dGhpcy5ldmVudC5jdXJyZW50VGFyZ2V0LGU9dCYmZXIodCkuZ2V0T3duZXJSb290KCksbj10aGlzLnBhdGg7Zm9yKGxldCB0PTA7dDxuLmxlbmd0aDt0Kyspe2NvbnN0IGk9blt0XTtpZihlcihpKS5nZXRPd25lclJvb3QoKT09PWUpcmV0dXJuIGl9fSxjb25maWd1cmFibGU6ITB9LHBhdGg6e2dldCgpe3JldHVybiB3aW5kb3cuU2hhZHlET00uY29tcG9zZWRQYXRoKHRoaXMuZXZlbnQpfSxjb25maWd1cmFibGU6ITB9fSl9ZWxzZSEoZnVuY3Rpb24gUWkodCxlKXtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7bGV0IGk9ZVtuXTt0W2ldPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubm9kZVtpXS5hcHBseSh0aGlzLm5vZGUsYXJndW1lbnRzKX19fSkoJGkucHJvdG90eXBlLFsiY2xvbmVOb2RlIiwiYXBwZW5kQ2hpbGQiLCJpbnNlcnRCZWZvcmUiLCJyZW1vdmVDaGlsZCIsInJlcGxhY2VDaGlsZCIsInNldEF0dHJpYnV0ZSIsInJlbW92ZUF0dHJpYnV0ZSIsInF1ZXJ5U2VsZWN0b3IiLCJxdWVyeVNlbGVjdG9yQWxsIl0pLEtpKCRpLnByb3RvdHlwZSxbInBhcmVudE5vZGUiLCJmaXJzdENoaWxkIiwibGFzdENoaWxkIiwibmV4dFNpYmxpbmciLCJwcmV2aW91c1NpYmxpbmciLCJmaXJzdEVsZW1lbnRDaGlsZCIsImxhc3RFbGVtZW50Q2hpbGQiLCJuZXh0RWxlbWVudFNpYmxpbmciLCJwcmV2aW91c0VsZW1lbnRTaWJsaW5nIiwiY2hpbGROb2RlcyIsImNoaWxkcmVuIiwiY2xhc3NMaXN0Il0pLChmdW5jdGlvbiB0cih0LGUpe2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtsZXQgaT1lW25dO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGkse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm5vZGVbaV19LHNldDpmdW5jdGlvbih0KXt0aGlzLm5vZGVbaV09dH0sY29uZmlndXJhYmxlOiEwfSl9fSkoJGkucHJvdG90eXBlLFsidGV4dENvbnRlbnQiLCJpbm5lckhUTUwiLCJjbGFzc05hbWUiXSk7Y29uc3QgZXI9ZnVuY3Rpb24odCl7aWYoKHQ9dHx8ZG9jdW1lbnQpaW5zdGFuY2VvZiBKaSlyZXR1cm4gdDtpZih0IGluc3RhbmNlb2YgWmkpcmV0dXJuIHQ7bGV0IGU9dC5fX2RvbUFwaTtyZXR1cm4gZXx8KGU9dCBpbnN0YW5jZW9mIEV2ZW50P25ldyBaaSh0KTpuZXcgSmkodCksdC5fX2RvbUFwaT1lKSxlfSxucj13aW5kb3cuU2hhZHlET00saXI9d2luZG93LlNoYWR5Q1NTOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTkgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqL2Z1bmN0aW9uIHJyKHQsZSl7cmV0dXJuIFkodCkuZ2V0Um9vdE5vZGUoKT09PWV9Ci8qKgogICAgICogQGZpbGVvdmVydmlldwogICAgICogQHN1cHByZXNzIHtjaGVja1Byb3RvdHlwYWxUeXBlc30KICAgICAqIEBsaWNlbnNlIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kCiAgICAgKiBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5CiAgICAgKiBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5CiAgICAgKiBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQCiAgICAgKiByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAgKi8KY29uc3Qgb3I9ImRpc2FibGUtdXBncmFkZSIsYXI9dD0+e2Zvcig7dDspe2NvbnN0IGU9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0LCJvYnNlcnZlZEF0dHJpYnV0ZXMiKTtpZihlKXJldHVybiBlLmdldDt0PU9iamVjdC5nZXRQcm90b3R5cGVPZih0LnByb3RvdHlwZSkuY29uc3RydWN0b3J9cmV0dXJuKCk9PltdfTtJKCh0PT57Y29uc3QgZT15ZSh0KTtsZXQgbj1hcihlKTtyZXR1cm4gY2xhc3MgZXh0ZW5kcyBle2NvbnN0cnVjdG9yKCl7c3VwZXIoKX1zdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpe3JldHVybiBuLmNhbGwodGhpcykuY29uY2F0KG9yKX1faW5pdGlhbGl6ZVByb3BlcnRpZXMoKXt0aGlzLmhhc0F0dHJpYnV0ZShvcik/dGhpcy5fX2lzVXBncmFkZURpc2FibGVkPSEwOnN1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpfV9lbmFibGVQcm9wZXJ0aWVzKCl7dGhpcy5fX2lzVXBncmFkZURpc2FibGVkfHxzdXBlci5fZW5hYmxlUHJvcGVydGllcygpfV9jYW5BcHBseVByb3BlcnR5RGVmYXVsdCh0KXtyZXR1cm4gc3VwZXIuX2NhbkFwcGx5UHJvcGVydHlEZWZhdWx0KHQpJiYhKHRoaXMuX19pc1VwZ3JhZGVEaXNhYmxlZCYmdGhpcy5faXNQcm9wZXJ0eVBlbmRpbmcodCkpfWF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0LGUsbixpKXt0PT1vcj90aGlzLl9faXNVcGdyYWRlRGlzYWJsZWQmJm51bGw9PW4mJihzdXBlci5faW5pdGlhbGl6ZVByb3BlcnRpZXMoKSx0aGlzLl9faXNVcGdyYWRlRGlzYWJsZWQ9ITEsWSh0aGlzKS5pc0Nvbm5lY3RlZCYmc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKSk6c3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHQsZSxuLGkpfWNvbm5lY3RlZENhbGxiYWNrKCl7dGhpcy5fX2lzVXBncmFkZURpc2FibGVkfHxzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpfWRpc2Nvbm5lY3RlZENhbGxiYWNrKCl7dGhpcy5fX2lzVXBncmFkZURpc2FibGVkfHxzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpfX19KSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IHNyPSJkaXNhYmxlLXVwZ3JhZGUiO2xldCBscj13aW5kb3cuU2hhZHlDU1M7Y29uc3QgY3I9SSgodD0+e2NvbnN0IGU9YmkoeWUodCkpLG49X2U/ZTpQaShlKSxpPWFyKG4pLHI9e3g6InBhbi14Iix5OiJwYW4teSIsbm9uZToibm9uZSIsYWxsOiJhdXRvIn07Y2xhc3MgbyBleHRlbmRzIG57Y29uc3RydWN0b3IoKXtzdXBlcigpfXN0YXRpYyBnZXQgaW1wb3J0TWV0YSgpe3JldHVybiB0aGlzLnByb3RvdHlwZS5pbXBvcnRNZXRhfWNyZWF0ZWQoKXt9X19hdHRyaWJ1dGVSZWFjdGlvbih0LGUsbil7KHRoaXMuX19kYXRhQXR0cmlidXRlcyYmdGhpcy5fX2RhdGFBdHRyaWJ1dGVzW3RdfHx0PT09c3IpJiZ0aGlzLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0LGUsbixudWxsKX1zZXRBdHRyaWJ1dGUodCxlKXtpZihMJiYhdGhpcy5fbGVnYWN5Rm9yY2VPYnNlcnZlZEF0dHJpYnV0ZXMpe2NvbnN0IG49dGhpcy5nZXRBdHRyaWJ1dGUodCk7c3VwZXIuc2V0QXR0cmlidXRlKHQsZSksdGhpcy5fX2F0dHJpYnV0ZVJlYWN0aW9uKHQsbixTdHJpbmcoZSkpfWVsc2Ugc3VwZXIuc2V0QXR0cmlidXRlKHQsZSl9cmVtb3ZlQXR0cmlidXRlKHQpe2lmKEwmJiF0aGlzLl9sZWdhY3lGb3JjZU9ic2VydmVkQXR0cmlidXRlcyl7Y29uc3QgZT10aGlzLmdldEF0dHJpYnV0ZSh0KTtzdXBlci5yZW1vdmVBdHRyaWJ1dGUodCksdGhpcy5fX2F0dHJpYnV0ZVJlYWN0aW9uKHQsZSxudWxsKX1lbHNlIHN1cGVyLnJlbW92ZUF0dHJpYnV0ZSh0KX1zdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpe3JldHVybiBMJiYhdGhpcy5wcm90b3R5cGUuX2xlZ2FjeUZvcmNlT2JzZXJ2ZWRBdHRyaWJ1dGVzPyh0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIl9fb2JzZXJ2ZWRBdHRyaWJ1dGVzIix0aGlzKSl8fCh0aGlzLl9fb2JzZXJ2ZWRBdHRyaWJ1dGVzPVtdKSx0aGlzLl9fb2JzZXJ2ZWRBdHRyaWJ1dGVzKTppLmNhbGwodGhpcykuY29uY2F0KHNyKX1fZW5hYmxlUHJvcGVydGllcygpe3RoaXMuX19pc1VwZ3JhZGVEaXNhYmxlZHx8c3VwZXIuX2VuYWJsZVByb3BlcnRpZXMoKX1fY2FuQXBwbHlQcm9wZXJ0eURlZmF1bHQodCl7cmV0dXJuIHN1cGVyLl9jYW5BcHBseVByb3BlcnR5RGVmYXVsdCh0KSYmISh0aGlzLl9faXNVcGdyYWRlRGlzYWJsZWQmJnRoaXMuX2lzUHJvcGVydHlQZW5kaW5nKHQpKX1jb25uZWN0ZWRDYWxsYmFjaygpe3RoaXMuX19uZWVkc0F0dHJpYnV0ZXNBdENvbm5lY3RlZCYmdGhpcy5fdGFrZUF0dHJpYnV0ZXMoKSx0aGlzLl9faXNVcGdyYWRlRGlzYWJsZWR8fChzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpLHRoaXMuaXNBdHRhY2hlZD0hMCx0aGlzLmF0dGFjaGVkKCkpfWF0dGFjaGVkKCl7fWRpc2Nvbm5lY3RlZENhbGxiYWNrKCl7dGhpcy5fX2lzVXBncmFkZURpc2FibGVkfHwoc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKSx0aGlzLmlzQXR0YWNoZWQ9ITEsdGhpcy5kZXRhY2hlZCgpKX1kZXRhY2hlZCgpe31hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodCxlLG4saSl7ZSE9PW4mJih0PT1zcj90aGlzLl9faXNVcGdyYWRlRGlzYWJsZWQmJm51bGw9PW4mJih0aGlzLl9pbml0aWFsaXplUHJvcGVydGllcygpLHRoaXMuX19pc1VwZ3JhZGVEaXNhYmxlZD0hMSxZKHRoaXMpLmlzQ29ubmVjdGVkJiZ0aGlzLmNvbm5lY3RlZENhbGxiYWNrKCkpOihzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodCxlLG4saSksdGhpcy5hdHRyaWJ1dGVDaGFuZ2VkKHQsZSxuKSkpfWF0dHJpYnV0ZUNoYW5nZWQodCxlLG4pe31faW5pdGlhbGl6ZVByb3BlcnRpZXMoKXtpZih3JiZ0aGlzLmhhc0F0dHJpYnV0ZShzcikpdGhpcy5fX2lzVXBncmFkZURpc2FibGVkPSEwO2Vsc2V7bGV0IHQ9T2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpO3QuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgiX19oYXNSZWdpc3RlckZpbmlzaGVkIix0KSl8fCh0aGlzLl9yZWdpc3RlcmVkKCksdC5fX2hhc1JlZ2lzdGVyRmluaXNoZWQ9ITApLHN1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpLHRoaXMucm9vdD10aGlzLHRoaXMuY3JlYXRlZCgpLEwmJiF0aGlzLl9sZWdhY3lGb3JjZU9ic2VydmVkQXR0cmlidXRlcyYmKHRoaXMuaGFzQXR0cmlidXRlcygpP3RoaXMuX3Rha2VBdHRyaWJ1dGVzKCk6dGhpcy5wYXJlbnROb2RlfHwodGhpcy5fX25lZWRzQXR0cmlidXRlc0F0Q29ubmVjdGVkPSEwKSksdGhpcy5fYXBwbHlMaXN0ZW5lcnMoKX19X3Rha2VBdHRyaWJ1dGVzKCl7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXM7Zm9yKGxldCBlPTAsbj10Lmxlbmd0aDtlPG47ZSsrKXtjb25zdCBuPXRbZV07dGhpcy5fX2F0dHJpYnV0ZVJlYWN0aW9uKG4ubmFtZSxudWxsLG4udmFsdWUpfX1fcmVnaXN0ZXJlZCgpe31yZWFkeSgpe3RoaXMuX2Vuc3VyZUF0dHJpYnV0ZXMoKSxzdXBlci5yZWFkeSgpfV9lbnN1cmVBdHRyaWJ1dGVzKCl7fV9hcHBseUxpc3RlbmVycygpe31zZXJpYWxpemUodCl7cmV0dXJuIHRoaXMuX3NlcmlhbGl6ZVZhbHVlKHQpfWRlc2VyaWFsaXplKHQsZSl7cmV0dXJuIHRoaXMuX2Rlc2VyaWFsaXplVmFsdWUodCxlKX1yZWZsZWN0UHJvcGVydHlUb0F0dHJpYnV0ZSh0LGUsbil7dGhpcy5fcHJvcGVydHlUb0F0dHJpYnV0ZSh0LGUsbil9c2VyaWFsaXplVmFsdWVUb0F0dHJpYnV0ZSh0LGUsbil7dGhpcy5fdmFsdWVUb05vZGVBdHRyaWJ1dGUobnx8dGhpcyx0LGUpfWV4dGVuZCh0LGUpe2lmKCF0fHwhZSlyZXR1cm4gdHx8ZTtsZXQgbj1PYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKTtmb3IobGV0IGkscj0wO3I8bi5sZW5ndGgmJihpPW5bcl0pO3IrKyl7bGV0IG49T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLGkpO24mJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGksbil9cmV0dXJuIHR9bWl4aW4odCxlKXtmb3IobGV0IG4gaW4gZSl0W25dPWVbbl07cmV0dXJuIHR9Y2hhaW5PYmplY3QodCxlKXtyZXR1cm4gdCYmZSYmdCE9PWUmJih0Ll9fcHJvdG9fXz1lKSx0fWluc3RhbmNlVGVtcGxhdGUodCl7bGV0IGU9dGhpcy5jb25zdHJ1Y3Rvci5fY29udGVudEZvclRlbXBsYXRlKHQpO3JldHVybiBkb2N1bWVudC5pbXBvcnROb2RlKGUsITApfWZpcmUodCxlLG4pe249bnx8e30sZT1udWxsPT1lP3t9OmU7bGV0IGk9bmV3IEV2ZW50KHQse2J1YmJsZXM6dm9pZCAwPT09bi5idWJibGVzfHxuLmJ1YmJsZXMsY2FuY2VsYWJsZTpCb29sZWFuKG4uY2FuY2VsYWJsZSksY29tcG9zZWQ6dm9pZCAwPT09bi5jb21wb3NlZHx8bi5jb21wb3NlZH0pO3JldHVybiBpLmRldGFpbD1lLFkobi5ub2RlfHx0aGlzKS5kaXNwYXRjaEV2ZW50KGkpLGl9bGlzdGVuKHQsZSxuKXt0PXR8fHRoaXM7bGV0IGk9dGhpcy5fX2JvdW5kTGlzdGVuZXJzfHwodGhpcy5fX2JvdW5kTGlzdGVuZXJzPW5ldyBXZWFrTWFwKSxyPWkuZ2V0KHQpO3J8fChyPXt9LGkuc2V0KHQscikpO2xldCBvPWUrbjtyW29dfHwocltvXT10aGlzLl9hZGRNZXRob2RFdmVudExpc3RlbmVyVG9Ob2RlKHQsZSxuLHRoaXMpKX11bmxpc3Rlbih0LGUsbil7dD10fHx0aGlzO2xldCBpPXRoaXMuX19ib3VuZExpc3RlbmVycyYmdGhpcy5fX2JvdW5kTGlzdGVuZXJzLmdldCh0KSxyPWUrbixvPWkmJmlbcl07byYmKHRoaXMuX3JlbW92ZUV2ZW50TGlzdGVuZXJGcm9tTm9kZSh0LGUsbyksaVtyXT1udWxsKX1zZXRTY3JvbGxEaXJlY3Rpb24odCxlKXtkaShlfHx0aGlzLHJbdF18fCJhdXRvIil9JCQodCl7cmV0dXJuIHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKHQpfWdldCBkb21Ib3N0KCl7bGV0IHQ9WSh0aGlzKS5nZXRSb290Tm9kZSgpO3JldHVybiB0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudD90Lmhvc3Q6dH1kaXN0cmlidXRlQ29udGVudCgpe2NvbnN0IHQ9ZXIodGhpcyk7d2luZG93LlNoYWR5RE9NJiZ0LnNoYWRvd1Jvb3QmJlNoYWR5RE9NLmZsdXNoKCl9Z2V0RWZmZWN0aXZlQ2hpbGROb2Rlcygpe3JldHVybiBlcih0aGlzKS5nZXRFZmZlY3RpdmVDaGlsZE5vZGVzKCl9cXVlcnlEaXN0cmlidXRlZEVsZW1lbnRzKHQpe3JldHVybiBlcih0aGlzKS5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHModCl9Z2V0RWZmZWN0aXZlQ2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5nZXRFZmZlY3RpdmVDaGlsZE5vZGVzKCkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFfSkpfWdldEVmZmVjdGl2ZVRleHRDb250ZW50KCl7bGV0IHQ9dGhpcy5nZXRFZmZlY3RpdmVDaGlsZE5vZGVzKCksZT1bXTtmb3IobGV0IG4saT0wO249dFtpXTtpKyspbi5ub2RlVHlwZSE9PU5vZGUuQ09NTUVOVF9OT0RFJiZlLnB1c2gobi50ZXh0Q29udGVudCk7cmV0dXJuIGUuam9pbigiIil9cXVlcnlFZmZlY3RpdmVDaGlsZHJlbih0KXtsZXQgZT10aGlzLnF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyh0KTtyZXR1cm4gZSYmZVswXX1xdWVyeUFsbEVmZmVjdGl2ZUNoaWxkcmVuKHQpe3JldHVybiB0aGlzLnF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyh0KX1nZXRDb250ZW50Q2hpbGROb2Rlcyh0KXtsZXQgZT10aGlzLnJvb3QucXVlcnlTZWxlY3Rvcih0fHwic2xvdCIpO3JldHVybiBlP2VyKGUpLmdldERpc3RyaWJ1dGVkTm9kZXMoKTpbXX1nZXRDb250ZW50Q2hpbGRyZW4odCl7cmV0dXJuIHRoaXMuZ2V0Q29udGVudENoaWxkTm9kZXModCkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFfSkpfWlzTGlnaHREZXNjZW5kYW50KHQpe2NvbnN0IGU9dGhpcztyZXR1cm4gZSE9PXQmJlkoZSkuY29udGFpbnModCkmJlkoZSkuZ2V0Um9vdE5vZGUoKT09PVkodCkuZ2V0Um9vdE5vZGUoKX1pc0xvY2FsRGVzY2VuZGFudCh0KXtyZXR1cm4gdGhpcy5yb290PT09WSh0KS5nZXRSb290Tm9kZSgpfXNjb3BlU3VidHJlZSh0LGU9ITEpe3JldHVybihmdW5jdGlvbiBuKHQsZT0hMSl7aWYoIW5yfHwhaXIpcmV0dXJuIG51bGw7aWYoIW5yLmhhbmRsZXNEeW5hbWljU2NvcGluZylyZXR1cm4gbnVsbDtjb25zdCBuPWlyLlNjb3BpbmdTaGltO2lmKCFuKXJldHVybiBudWxsO2NvbnN0IGk9bi5zY29wZUZvck5vZGUodCkscj1ZKHQpLmdldFJvb3ROb2RlKCksbz10PT57aWYoIXJyKHQscikpcmV0dXJuO2NvbnN0IGU9QXJyYXkuZnJvbShuci5uYXRpdmVNZXRob2RzLnF1ZXJ5U2VsZWN0b3JBbGwuY2FsbCh0LCIqIikpO2UucHVzaCh0KTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyl7Y29uc3Qgbz1lW3RdO2lmKCFycihvLHIpKWNvbnRpbnVlO2NvbnN0IGE9bi5jdXJyZW50U2NvcGVGb3JOb2RlKG8pO2EhPT1pJiYoIiIhPT1hJiZuLnVuc2NvcGVOb2RlKG8sYSksbi5zY29wZU5vZGUobyxpKSl9fTtpZihvKHQpLGUpe2NvbnN0IGU9bmV3IE11dGF0aW9uT2JzZXJ2ZXIoKHQ9Pntmb3IobGV0IGU9MDtlPHQubGVuZ3RoO2UrKyl7Y29uc3Qgbj10W2VdO2ZvcihsZXQgdD0wO3Q8bi5hZGRlZE5vZGVzLmxlbmd0aDt0Kyspe2NvbnN0IGU9bi5hZGRlZE5vZGVzW3RdO2Uubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSYmbyhlKX19fSkpO3JldHVybiBlLm9ic2VydmUodCx7Y2hpbGRMaXN0OiEwLHN1YnRyZWU6ITB9KSxlfXJldHVybiBudWxsfSkodCxlKX1nZXRDb21wdXRlZFN0eWxlVmFsdWUodCl7cmV0dXJuIGxyLmdldENvbXB1dGVkU3R5bGVWYWx1ZSh0aGlzLHQpfWRlYm91bmNlKHQsZSxuKXtyZXR1cm4gdGhpcy5fZGVib3VuY2Vycz10aGlzLl9kZWJvdW5jZXJzfHx7fSx0aGlzLl9kZWJvdW5jZXJzW3RdPU5uLmRlYm91bmNlKHRoaXMuX2RlYm91bmNlcnNbdF0sbj4wP2d0LmFmdGVyKG4pOnZ0LGUuYmluZCh0aGlzKSl9aXNEZWJvdW5jZXJBY3RpdmUodCl7dGhpcy5fZGVib3VuY2Vycz10aGlzLl9kZWJvdW5jZXJzfHx7fTtsZXQgZT10aGlzLl9kZWJvdW5jZXJzW3RdO3JldHVybiEoIWV8fCFlLmlzQWN0aXZlKCkpfWZsdXNoRGVib3VuY2VyKHQpe3RoaXMuX2RlYm91bmNlcnM9dGhpcy5fZGVib3VuY2Vyc3x8e307bGV0IGU9dGhpcy5fZGVib3VuY2Vyc1t0XTtlJiZlLmZsdXNoKCl9Y2FuY2VsRGVib3VuY2VyKHQpe3RoaXMuX2RlYm91bmNlcnM9dGhpcy5fZGVib3VuY2Vyc3x8e307bGV0IGU9dGhpcy5fZGVib3VuY2Vyc1t0XTtlJiZlLmNhbmNlbCgpfWFzeW5jKHQsZSl7cmV0dXJuIGU+MD9ndC5ydW4odC5iaW5kKHRoaXMpLGUpOn52dC5ydW4odC5iaW5kKHRoaXMpKX1jYW5jZWxBc3luYyh0KXt0PDA/dnQuY2FuY2VsKH50KTpndC5jYW5jZWwodCl9Y3JlYXRlKHQsZSl7bGV0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0KTtpZihlKWlmKG4uc2V0UHJvcGVydGllcyluLnNldFByb3BlcnRpZXMoZSk7ZWxzZSBmb3IobGV0IHQgaW4gZSluW3RdPWVbdF07cmV0dXJuIG59ZWxlbWVudE1hdGNoZXModCxlKXtyZXR1cm4gWGkoZXx8dGhpcyx0KX10b2dnbGVBdHRyaWJ1dGUodCxlKXtsZXQgbj10aGlzO3JldHVybiAzPT09YXJndW1lbnRzLmxlbmd0aCYmKG49YXJndW1lbnRzWzJdKSwxPT1hcmd1bWVudHMubGVuZ3RoJiYoZT0hbi5oYXNBdHRyaWJ1dGUodCkpLGU/KFkobikuc2V0QXR0cmlidXRlKHQsIiIpLCEwKTooWShuKS5yZW1vdmVBdHRyaWJ1dGUodCksITEpfXRvZ2dsZUNsYXNzKHQsZSxuKXtuPW58fHRoaXMsMT09YXJndW1lbnRzLmxlbmd0aCYmKGU9IW4uY2xhc3NMaXN0LmNvbnRhaW5zKHQpKSxlP24uY2xhc3NMaXN0LmFkZCh0KTpuLmNsYXNzTGlzdC5yZW1vdmUodCl9dHJhbnNmb3JtKHQsZSl7KGU9ZXx8dGhpcykuc3R5bGUud2Via2l0VHJhbnNmb3JtPXQsZS5zdHlsZS50cmFuc2Zvcm09dH10cmFuc2xhdGUzZCh0LGUsbixpKXt0aGlzLnRyYW5zZm9ybSgidHJhbnNsYXRlM2QoIit0KyIsIitlKyIsIituKyIpIixpPWl8fHRoaXMpfWFycmF5RGVsZXRlKHQsZSl7bGV0IG47aWYoQXJyYXkuaXNBcnJheSh0KSl7aWYobj10LmluZGV4T2YoZSksbj49MClyZXR1cm4gdC5zcGxpY2UobiwxKX1lbHNle2lmKG49bnQodGhpcyx0KS5pbmRleE9mKGUpLG4+PTApcmV0dXJuIHRoaXMuc3BsaWNlKHQsbiwxKX1yZXR1cm4gbnVsbH1fbG9nZ2VyKHQsZSl7c3dpdGNoKEFycmF5LmlzQXJyYXkoZSkmJjE9PT1lLmxlbmd0aCYmQXJyYXkuaXNBcnJheShlWzBdKSYmKGU9ZVswXSksdCl7Y2FzZSJsb2ciOmNhc2Uid2FybiI6Y2FzZSJlcnJvciI6Y29uc29sZVt0XSguLi5lKX19X2xvZyguLi50KXt0aGlzLl9sb2dnZXIoImxvZyIsdCl9X3dhcm4oLi4udCl7dGhpcy5fbG9nZ2VyKCJ3YXJuIix0KX1fZXJyb3IoLi4udCl7dGhpcy5fbG9nZ2VyKCJlcnJvciIsdCl9X2xvZ2YodCwuLi5lKXtyZXR1cm5bIlslczo6JXNdIix0aGlzLmlzLHQsLi4uZV19fXJldHVybiBvLnByb3RvdHlwZS5pcz0iIixvfSkpO2Z1bmN0aW9uIHVyKHQsZSl7bGV0IG49MCxpPTA7Zm9yKDs7KXtpZihuPT09dC5sZW5ndGgpcmV0dXJuIGk9PT1lLmxlbmd0aD8wOi0xO2lmKGk9PT1lLmxlbmd0aClyZXR1cm4gMTtpZihkcih0W25dKSYmZHIoZVtpXSkpe2NvbnN0IHI9bixvPWk7bj1ocih0LG4rMSksaT1ocihlLGkrMSk7Y29uc3QgYT1wYXJzZUZsb2F0KHQuc2xpY2UocixuKSkscz1wYXJzZUZsb2F0KGUuc2xpY2UobyxpKSk7aWYoYTxzKXJldHVybi0xO2lmKGE+cylyZXR1cm4gMX1lbHNle2lmKHByKHRbbl0pKXtpZighcHIoZVtpXSkpcmV0dXJuLTF9ZWxzZXtpZihwcihlW2ldKSlyZXR1cm4gMTtpZih0W25dPGVbaV0pcmV0dXJuLTE7aWYodFtuXT5lW2ldKXJldHVybiAxfW4rKyxpKyt9fX1mdW5jdGlvbiBocih0LGUpe2xldCBuOyEoZnVuY3Rpb24odCl7dFt0Lk5BVFVSQUw9MF09Ik5BVFVSQUwiLHRbdC5SRUFMPTFdPSJSRUFMIix0W3QuRVhQT05FTlRfU0lHTj0yXT0iRVhQT05FTlRfU0lHTiIsdFt0LkVYUE9ORU5UPTNdPSJFWFBPTkVOVCJ9KShufHwobj17fSkpO2xldCBpPW4uTkFUVVJBTDtmb3IoO2U8dC5sZW5ndGg7ZSsrKWlmKGk9PT1uLk5BVFVSQUwpe2lmKCIuIj09PXRbZV0paT1uLlJFQUw7ZWxzZSBpZigiZSI9PT10W2VdfHwiRSI9PT10W2VdKWk9bi5FWFBPTkVOVF9TSUdOO2Vsc2UgaWYoIWRyKHRbZV0pKWJyZWFrfWVsc2UgaWYoaT09PW4uUkVBTCl7aWYoImUiPT09dFtlXXx8IkUiPT09dFtlXSlpPW4uRVhQT05FTlRfU0lHTjtlbHNlIGlmKCFkcih0W2VdKSlicmVha31lbHNlIGlmKGk9PT1uLkVYUE9ORU5UX1NJR04pe2lmKCFkcih0W2VdKSYmIisiIT09dFtlXSYmIi0iIT09dFtlXSlicmVhaztpPW4uRVhQT05FTlR9ZWxzZSBpZihpPT09bi5FWFBPTkVOVCYmIWRyKHRbZV0pKWJyZWFrO3JldHVybiBlfWZ1bmN0aW9uIGRyKHQpe3JldHVybiIwIjw9dCYmdDw9IjkifWZ1bmN0aW9uIHByKHQpe3JldHVybiIvIj09PXR8fCJfIj09PXR8fGRyKHQpfWZ1bmN0aW9uIGZyKHQpe3JldHVybiBDZS5leHBvcnRzLnVuaW9uLmFwcGx5KG51bGwsQ2UuZXhwb3J0cy52YWx1ZXModCkpLnNvcnQodXIpfWNsYXNzIG1yIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMubmFtZT0iUmVxdWVzdENhbmNlbGxhdGlvbkVycm9yIn19Y2xhc3MgZ3IgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLm5hbWU9IkludmFsaWRSZXF1ZXN0T3B0aW9uc0Vycm9yIixPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcyxnci5wcm90b3R5cGUpfX1jbGFzcyBfciBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIoKSx0aGlzLm1lc3NhZ2U9YFJlcXVlc3ROZXR3b3JrRXJyb3I6ICR7dC5zdGF0dXN9IGF0ICR7ZX1gLHRoaXMubmFtZT0iUmVxdWVzdE5ldHdvcmtFcnJvciIsdGhpcy5yZXE9dCx0aGlzLnVybD1lfX12YXIgeXI7IShmdW5jdGlvbih0KXt0LkdFVD0iR0VUIix0LlBPU1Q9IlBPU1QifSkoeXJ8fCh5cj17fSkpO2NsYXNzIHZye3ZhbGlkYXRlKCl7aWYodGhpcy5tZXRob2RUeXBlPT09eXIuR0VUJiZ0aGlzLmJvZHkpdGhyb3cgbmV3IGdyKCJib2R5IG11c3QgYmUgbWlzc2luZyBmb3IgYSBHRVQgcmVxdWVzdC4iKX19Y2xhc3MgYnJ7Y29uc3RydWN0b3IodD0xZTMsZT0zKXt0aGlzLl9xdWV1ZT1bXSx0aGlzLl9uQWN0aXZlUmVxdWVzdHM9MCx0aGlzLl9uU2ltdWx0YW5lb3VzUmVxdWVzdHM9dCx0aGlzLl9tYXhSZXRyaWVzPWV9cmVxdWVzdCh0LGUpe2NvbnN0IG49KGZ1bmN0aW9uIGkodCl7Y29uc3QgZT1uZXcgdnI7aWYoIXQpcmV0dXJuIGUubWV0aG9kVHlwZT15ci5HRVQsZTtyZXR1cm4gZS5tZXRob2RUeXBlPXlyLlBPU1QsZS5ib2R5PShmdW5jdGlvbiBuKHQpe2NvbnN0IGU9bmV3IEZvcm1EYXRhO2Zvcihjb25zdFtuLGldb2YgT2JqZWN0LmVudHJpZXModCkpe2NvbnN0IHQ9QXJyYXkuaXNBcnJheShpKT9pOltpXTtmb3IoY29uc3QgaSBvZiB0KWUuYXBwZW5kKG4saSl9cmV0dXJuIGV9KSh0KSxlfSkoZSk7cmV0dXJuIHRoaXMucmVxdWVzdFdpdGhPcHRpb25zKHQsbil9cmVxdWVzdFdpdGhPcHRpb25zKHQsZSl7ZS52YWxpZGF0ZSgpO3JldHVybiBuZXcgUHJvbWlzZSgoKHQsZSk9Pnt0aGlzLl9xdWV1ZS5wdXNoKHtyZXNvbHZlOnQscmVqZWN0OmV9KSx0aGlzLmxhdW5jaFJlcXVlc3RzKCl9KSkudGhlbigoKCk9PnRoaXMucHJvbWlzZVdpdGhSZXRyaWVzKHQsdGhpcy5fbWF4UmV0cmllcyxlKSkpLnRoZW4oKHQ9Pih0aGlzLl9uQWN0aXZlUmVxdWVzdHMtLSx0aGlzLmxhdW5jaFJlcXVlc3RzKCksdCkpLCh0PT4oIlJlcXVlc3ROZXR3b3JrRXJyb3IiPT09dC5uYW1lJiYodGhpcy5fbkFjdGl2ZVJlcXVlc3RzLS0sdGhpcy5sYXVuY2hSZXF1ZXN0cygpKSxQcm9taXNlLnJlamVjdCh0KSkpKX1mZXRjaCh0LGUpe3JldHVybiBuZXcgUHJvbWlzZSgoKHQsZSk9Pnt0aGlzLl9xdWV1ZS5wdXNoKHtyZXNvbHZlOnQscmVqZWN0OmV9KSx0aGlzLmxhdW5jaFJlcXVlc3RzKCl9KSkudGhlbigoKCk9PntsZXQgbj0xO3JldHVybiBuZXcgUHJvbWlzZSgoaT0+e2NvbnN0IHI9KCk9PntmZXRjaCh0LGUpLnRoZW4oKHQ9PntpZighdC5vayYmdGhpcy5fbWF4UmV0cmllcz5uKXJldHVybiBuKyssdm9pZCByKCk7aSh0KSx0aGlzLl9uQWN0aXZlUmVxdWVzdHMtLSx0aGlzLmxhdW5jaFJlcXVlc3RzKCl9KSl9O3IoKX0pKX0pKX1jbGVhclF1ZXVlKCl7Zm9yKDt0aGlzLl9xdWV1ZS5sZW5ndGg+MDspdGhpcy5fcXVldWUucG9wKCkucmVqZWN0KG5ldyBtcigiUmVxdWVzdCBjYW5jZWxsZWQgYnkgY2xlYXJRdWV1ZSIpKX1hY3RpdmVSZXF1ZXN0cygpe3JldHVybiB0aGlzLl9uQWN0aXZlUmVxdWVzdHN9b3V0c3RhbmRpbmdSZXF1ZXN0cygpe3JldHVybiB0aGlzLl9uQWN0aXZlUmVxdWVzdHMrdGhpcy5fcXVldWUubGVuZ3RofWxhdW5jaFJlcXVlc3RzKCl7Zm9yKDt0aGlzLl9uQWN0aXZlUmVxdWVzdHM8dGhpcy5fblNpbXVsdGFuZW91c1JlcXVlc3RzJiZ0aGlzLl9xdWV1ZS5sZW5ndGg+MDspdGhpcy5fbkFjdGl2ZVJlcXVlc3RzKyssdGhpcy5fcXVldWUucG9wKCkucmVzb2x2ZSh2b2lkIDApfXByb21pc2VXaXRoUmV0cmllcyh0LGUsbil7cmV0dXJuIHRoaXMuX3Byb21pc2VGcm9tVXJsKHQsbikudGhlbigodD0+dCksKGk9PmU+MD90aGlzLnByb21pc2VXaXRoUmV0cmllcyh0LGUtMSxuKTpQcm9taXNlLnJlamVjdChpKSkpfV9wcm9taXNlRnJvbVVybCh0LGUpe3JldHVybiBuZXcgUHJvbWlzZSgoKG4saSk9Pntjb25zdCByPShmdW5jdGlvbiBvKHQsZSxuLGkpe2NvbnN0IHI9bmV3IFhNTEh0dHBSZXF1ZXN0O3Iub3Blbih0LGUpLG4mJihyLndpdGhDcmVkZW50aWFscz1uKTtpJiZyLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsaSk7cmV0dXJuIHJ9KShlLm1ldGhvZFR5cGUsdCxlLndpdGhDcmVkZW50aWFscyxlLmNvbnRlbnRUeXBlKTtyLm9ubG9hZD1mdW5jdGlvbigpezIwMD09PXIuc3RhdHVzP24oSlNPTi5wYXJzZShyLnJlc3BvbnNlVGV4dCkpOmkobmV3IF9yKHIsdCkpfSxyLm9uZXJyb3I9ZnVuY3Rpb24oKXtpKG5ldyBfcihyLHQpKX0sZS5ib2R5P3Iuc2VuZChlLmJvZHkpOnIuc2VuZCgpfSkpfX1jb25zdCB4cj0iZXhwZXJpbWVudGFsUGx1Z2luIix3cj1uZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpO2xldCBTcj1NcigpO2Z1bmN0aW9uIE1yKHQ9ImRhdGEiLGU9d3Ipe3JldHVybiIvIj09PXRbdC5sZW5ndGgtMV0mJih0PXQuc2xpY2UoMCx0Lmxlbmd0aC0xKSkse2Vudmlyb25tZW50OigpPT5Ucih0LCIvZW52aXJvbm1lbnQiKSxleHBlcmltZW50czooKT0+VHIodCwiL2V4cGVyaW1lbnRzIikscGx1Z2luUm91dGU6KGUsbixpKT0+VHIodCsiL3BsdWdpbiIsYC8ke2V9JHtufWAsaSkscGx1Z2luc0xpc3Rpbmc6KCk9PlRyKHQsIi9wbHVnaW5zX2xpc3RpbmciLENyKHtbeHJdOmUuZ2V0QWxsKHhyKX0pKSxydW5zOigpPT5Ucih0LCIvcnVucyIpLHJ1bnNGb3JFeHBlcmltZW50OmU9PlRyKHQsIi9leHBlcmltZW50X3J1bnMiLENyKHtleHBlcmltZW50OlN0cmluZyhlKX0pKX19ZnVuY3Rpb24gRXIoKXtyZXR1cm4gU3J9ZnVuY3Rpb24gVHIodCxlLG49bmV3IFVSTFNlYXJjaFBhcmFtcyl7bGV0IGk9dCtlO2lmKFN0cmluZyhuKSl7aSs9KGUuaW5jbHVkZXMoIj8iKT8iJiI6Ij8iKStTdHJpbmcobil9cmV0dXJuIGl9ZnVuY3Rpb24gQ3IodD17fSl7Y29uc3QgZT1PYmplY3Qua2V5cyh0KS5zb3J0KCkuZmlsdGVyKChlPT50W2VdKSksbj1uZXcgVVJMU2VhcmNoUGFyYW1zO3JldHVybiBlLmZvckVhY2goKGU9Pntjb25zdCBpPXRbZV07KEFycmF5LmlzQXJyYXkoaSk/aTpbaV0pLmZvckVhY2goKHQ9Pm4uYXBwZW5kKGUsdCkpKX0pKSxufXZhciBBcjtmdW5jdGlvbiBrcih0LGUpe2NvbnN0IG49KCgpPT57dHJ5e3JldHVybiBuZXcgUmVnRXhwKGUpfWNhdGNoKHQpe3JldHVybiBudWxsfX0pKCk7cmV0dXJue25hbWU6ZSxtZXRhZGF0YTp7dHlwZTpBci5TRUFSQ0hfUkVTVUxUUyx2YWxpZFJlZ2V4OiEhbix1bml2ZXJzYWxSZWdleDoiLioiPT09ZX0saXRlbXM6bj90LmZpbHRlcigodD0+dC5tYXRjaChuKSkpOltdfX1mdW5jdGlvbiBMcih0LGU9IiIpe2NvbnN0IG49W2tyKHQsZSldLGk9KGZ1bmN0aW9uIHIodCxlPSIvIil7Y29uc3Qgbj1bXSxpPXt9O3JldHVybiB0LmZvckVhY2goKHQ9Pntjb25zdCByPXQuaW5kZXhPZihlKSxvPXI+PTA/dC5zbGljZSgwLHIpOnQ7aWYoIWlbb10pe2NvbnN0IHQ9e25hbWU6byxtZXRhZGF0YTp7dHlwZTpBci5QUkVGSVhfR1JPVVB9LGl0ZW1zOltdfTtpW29dPXQsbi5wdXNoKHQpfWlbb10uaXRlbXMucHVzaCh0KX0pKSxufSkodCk7cmV0dXJuW10uY29uY2F0KG4saSl9ZnVuY3Rpb24gUHIodCxlLG4pe2NvbnN0IGk9THIoZnIodCksbikscj0oZnVuY3Rpb24gbyh0KXtjb25zdCBlPW5ldyBNYXA7cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2goKG49Pnt0W25dLmZvckVhY2goKHQ9Pntjb25zdCBpPWUuZ2V0KHQpfHxbXTtpLnB1c2gobiksZS5zZXQodCxpKX0pKX0pKSxlfSkoQ2UuZXhwb3J0cy5waWNrKHQsZSkpO3JldHVybiBpLm1hcCgoKHtuYW1lOnQsbWV0YWRhdGE6ZSxpdGVtczpufSk9Pih7bmFtZTp0LG1ldGFkYXRhOmUsaXRlbXM6bi5tYXAoKHQ9Pih7dGFnOnQscnVuczooci5nZXQodCl8fFtdKS5zbGljZSgpfSkpKX0pKSl9ZnVuY3Rpb24gTnIodCxlKXtjb25zdCBuPXVyKHQudGFnLGUudGFnKTtyZXR1cm4gMCE9bj9uOnVyKHQucnVuLGUucnVuKX1mdW5jdGlvbiBJcih0LGUsbil7cmV0dXJuIFByKHQsZSxuKS5tYXAoKGZ1bmN0aW9uIGkodCl7Y29uc3QgZT1DZS5leHBvcnRzLmZsYXR0ZW4odC5pdGVtcy5tYXAoKCh7dGFnOnQscnVuczplfSk9PmUubWFwKChlPT4oe3RhZzp0LHJ1bjplfSkpKSkpKTtyZXR1cm4gZS5zb3J0KE5yKSx7bmFtZTp0Lm5hbWUsbWV0YWRhdGE6dC5tZXRhZGF0YSxpdGVtczplfX0pKX0KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8hKGZ1bmN0aW9uKHQpe3RbdC5TRUFSQ0hfUkVTVUxUUz0wXT0iU0VBUkNIX1JFU1VMVFMiLHRbdC5QUkVGSVhfR1JPVVA9MV09IlBSRUZJWF9HUk9VUCJ9KShBcnx8KEFyPXt9KSk7Y29uc3QgUnI9e2F0dGFjaGVkOiEwLGRldGFjaGVkOiEwLHJlYWR5OiEwLGNyZWF0ZWQ6ITAsYmVmb3JlUmVnaXN0ZXI6ITAscmVnaXN0ZXJlZDohMCxhdHRyaWJ1dGVDaGFuZ2VkOiEwLGxpc3RlbmVyczohMCxob3N0QXR0cmlidXRlczohMH0sT3I9e2F0dGFjaGVkOiEwLGRldGFjaGVkOiEwLHJlYWR5OiEwLGNyZWF0ZWQ6ITAsYmVmb3JlUmVnaXN0ZXI6ITAscmVnaXN0ZXJlZDohMCxhdHRyaWJ1dGVDaGFuZ2VkOiEwLGJlaGF2aW9yczohMCxfbm9BY2Nlc3NvcnM6ITB9LHpyPU9iamVjdC5hc3NpZ24oe2xpc3RlbmVyczohMCxob3N0QXR0cmlidXRlczohMCxwcm9wZXJ0aWVzOiEwLG9ic2VydmVyczohMH0sT3IpO2Z1bmN0aW9uIERyKHQsZSxuLGkpeyEoZnVuY3Rpb24gcih0LGUsbil7Y29uc3QgaT10Ll9ub0FjY2Vzc29ycyxyPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHQpO2ZvcihsZXQgbz0wO288ci5sZW5ndGg7bysrKXtsZXQgYT1yW29dO2lmKCEoYSBpbiBuKSlpZihpKWVbYV09dFthXTtlbHNle2xldCBuPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodCxhKTtuJiYobi5jb25maWd1cmFibGU9ITAsT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsYSxuKSl9fX0pKGUsdCxpKTtmb3IobGV0IHQgaW4gUnIpZVt0XSYmKG5bdF09blt0XXx8W10sblt0XS5wdXNoKGVbdF0pKX1mdW5jdGlvbiBCcih0LGUsbil7ZT1lfHxbXTtmb3IobGV0IGk9dC5sZW5ndGgtMTtpPj0wO2ktLSl7bGV0IHI9dFtpXTtyP0FycmF5LmlzQXJyYXkocik/QnIocixlKTplLmluZGV4T2Yocik8MCYmKCFufHxuLmluZGV4T2Yocik8MCkmJmUudW5zaGlmdChyKTpjb25zb2xlLndhcm4oImJlaGF2aW9yIGlzIG51bGwsIGNoZWNrIGZvciBtaXNzaW5nIG9yIDQwNCBpbXBvcnQiKX1yZXR1cm4gZX1mdW5jdGlvbiBIcih0LGUpe2Zvcihjb25zdCBuIGluIGUpe2NvbnN0IGk9dFtuXSxyPWVbbl07dFtuXT0hKCJ2YWx1ZSJpbiByKSYmaSYmInZhbHVlImluIGk/T2JqZWN0LmFzc2lnbih7dmFsdWU6aS52YWx1ZX0scik6cn19Y29uc3QgRnI9Y3IoSFRNTEVsZW1lbnQpO2Z1bmN0aW9uIFZyKHQsZSxuKXtsZXQgaTtjb25zdCByPXt9O2NsYXNzIG8gZXh0ZW5kcyBle3N0YXRpYyBfZmluYWxpemVDbGFzcygpe2lmKHRoaXMuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgiZ2VuZXJhdGVkRnJvbSIsdGhpcykpKXtpZihpKWZvcihsZXQgdCxlPTA7ZTxpLmxlbmd0aDtlKyspdD1pW2VdLHQucHJvcGVydGllcyYmdGhpcy5jcmVhdGVQcm9wZXJ0aWVzKHQucHJvcGVydGllcyksdC5vYnNlcnZlcnMmJnRoaXMuY3JlYXRlT2JzZXJ2ZXJzKHQub2JzZXJ2ZXJzLHQucHJvcGVydGllcyk7dC5wcm9wZXJ0aWVzJiZ0aGlzLmNyZWF0ZVByb3BlcnRpZXModC5wcm9wZXJ0aWVzKSx0Lm9ic2VydmVycyYmdGhpcy5jcmVhdGVPYnNlcnZlcnModC5vYnNlcnZlcnMsdC5wcm9wZXJ0aWVzKSx0aGlzLl9wcmVwYXJlVGVtcGxhdGUoKX1lbHNlIGUuX2ZpbmFsaXplQ2xhc3MuY2FsbCh0aGlzKX1zdGF0aWMgZ2V0IHByb3BlcnRpZXMoKXtjb25zdCBlPXt9O2lmKGkpZm9yKGxldCB0PTA7dDxpLmxlbmd0aDt0KyspSHIoZSxpW3RdLnByb3BlcnRpZXMpO3JldHVybiBIcihlLHQucHJvcGVydGllcyksZX1zdGF0aWMgZ2V0IG9ic2VydmVycygpe2xldCBlPVtdO2lmKGkpZm9yKGxldCB0LG49MDtuPGkubGVuZ3RoO24rKyl0PWlbbl0sdC5vYnNlcnZlcnMmJihlPWUuY29uY2F0KHQub2JzZXJ2ZXJzKSk7cmV0dXJuIHQub2JzZXJ2ZXJzJiYoZT1lLmNvbmNhdCh0Lm9ic2VydmVycykpLGV9Y3JlYXRlZCgpe3N1cGVyLmNyZWF0ZWQoKTtjb25zdCB0PXIuY3JlYXRlZDtpZih0KWZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXRbZV0uY2FsbCh0aGlzKX1fcmVnaXN0ZXJlZCgpe2NvbnN0IHQ9by5wcm90b3R5cGU7aWYoIXQuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgiX19oYXNSZWdpc3RlckZpbmlzaGVkIix0KSkpe3QuX19oYXNSZWdpc3RlckZpbmlzaGVkPSEwLHN1cGVyLl9yZWdpc3RlcmVkKCksdyYmYSh0KTtjb25zdCBlPU9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKTtsZXQgbj1yLmJlZm9yZVJlZ2lzdGVyO2lmKG4pZm9yKGxldCB0PTA7dDxuLmxlbmd0aDt0Kyspblt0XS5jYWxsKGUpO2lmKG49ci5yZWdpc3RlcmVkLG4pZm9yKGxldCB0PTA7dDxuLmxlbmd0aDt0Kyspblt0XS5jYWxsKGUpfX1fYXBwbHlMaXN0ZW5lcnMoKXtzdXBlci5fYXBwbHlMaXN0ZW5lcnMoKTtjb25zdCB0PXIubGlzdGVuZXJzO2lmKHQpZm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspe2NvbnN0IG49dFtlXTtpZihuKWZvcihsZXQgdCBpbiBuKXRoaXMuX2FkZE1ldGhvZEV2ZW50TGlzdGVuZXJUb05vZGUodGhpcyx0LG5bdF0pfX1fZW5zdXJlQXR0cmlidXRlcygpe2NvbnN0IHQ9ci5ob3N0QXR0cmlidXRlcztpZih0KWZvcihsZXQgZT10Lmxlbmd0aC0xO2U+PTA7ZS0tKXtjb25zdCBuPXRbZV07Zm9yKGxldCB0IGluIG4pdGhpcy5fZW5zdXJlQXR0cmlidXRlKHQsblt0XSl9c3VwZXIuX2Vuc3VyZUF0dHJpYnV0ZXMoKX1yZWFkeSgpe3N1cGVyLnJlYWR5KCk7bGV0IHQ9ci5yZWFkeTtpZih0KWZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXRbZV0uY2FsbCh0aGlzKX1hdHRhY2hlZCgpe3N1cGVyLmF0dGFjaGVkKCk7bGV0IHQ9ci5hdHRhY2hlZDtpZih0KWZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXRbZV0uY2FsbCh0aGlzKX1kZXRhY2hlZCgpe3N1cGVyLmRldGFjaGVkKCk7bGV0IHQ9ci5kZXRhY2hlZDtpZih0KWZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXRbZV0uY2FsbCh0aGlzKX1hdHRyaWJ1dGVDaGFuZ2VkKHQsZSxuKXtzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkKCk7bGV0IGk9ci5hdHRyaWJ1dGVDaGFuZ2VkO2lmKGkpZm9yKGxldCByPTA7cjxpLmxlbmd0aDtyKyspaVtyXS5jYWxsKHRoaXMsdCxlLG4pfX1pZihuKXtBcnJheS5pc0FycmF5KG4pfHwobj1bbl0pO2xldCB0PWUucHJvdG90eXBlLmJlaGF2aW9ycztpPUJyKG4sbnVsbCx0KSxvLnByb3RvdHlwZS5iZWhhdmlvcnM9dD90LmNvbmNhdChuKTppfWNvbnN0IGE9ZT0+e2kmJihmdW5jdGlvbiBuKHQsZSxpKXtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKylEcih0LGVbbl0saSx6cil9KShlLGksciksRHIoZSx0LHIsT3IpfTtyZXR1cm4gd3x8YShvLnByb3RvdHlwZSksby5nZW5lcmF0ZWRGcm9tPXQsb31jb25zdCBVcj1mdW5jdGlvbih0LGUpe3R8fGNvbnNvbGUud2FybigiUG9seW1lci5DbGFzcyByZXF1aXJlcyBgaW5mb2AgYXJndW1lbnQiKTtsZXQgbj1lP2UoRnIpOkZyO3JldHVybiBuPVZyKHQsbix0LmJlaGF2aW9ycyksbi5pcz1uLnByb3RvdHlwZS5pcz10LmlzLG59LGpyPWZ1bmN0aW9uKHQpe2xldCBlO3JldHVybiBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6anIuQ2xhc3ModCksdC5fbGVnYWN5Rm9yY2VPYnNlcnZlZEF0dHJpYnV0ZXMmJihlLnByb3RvdHlwZS5fbGVnYWN5Rm9yY2VPYnNlcnZlZEF0dHJpYnV0ZXM9dC5fbGVnYWN5Rm9yY2VPYnNlcnZlZEF0dHJpYnV0ZXMpLGN1c3RvbUVsZW1lbnRzLmRlZmluZShlLmlzLGUpLGV9OwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpmdW5jdGlvbiBHcih0LGUsbixpLHIpe2xldCBvO3ImJihvPSJvYmplY3QiPT10eXBlb2YgbiYmbnVsbCE9PW4sbyYmKGk9dC5fX2RhdGFUZW1wW2VdKSk7bGV0IGE9aSE9PW4mJihpPT1pfHxuPT1uKTtyZXR1cm4gbyYmYSYmKHQuX19kYXRhVGVtcFtlXT1uKSxhfWpyLkNsYXNzPVVyO2NvbnN0IFdyPUkoKHQ9PmNsYXNzIGV4dGVuZHMgdHtfc2hvdWxkUHJvcGVydHlDaGFuZ2UodCxlLG4pe3JldHVybiBHcih0aGlzLHQsZSxuLCEwKX19KSkscXI9SSgodD0+Y2xhc3MgZXh0ZW5kcyB0e3N0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybnttdXRhYmxlRGF0YTpCb29sZWFufX1fc2hvdWxkUHJvcGVydHlDaGFuZ2UodCxlLG4pe3JldHVybiBHcih0aGlzLHQsZSxuLHRoaXMubXV0YWJsZURhdGEpfX0pKTtXci5fbXV0YWJsZVByb3BlcnR5Q2hhbmdlPUdyOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpsZXQgWXI9bnVsbDtmdW5jdGlvbiBYcigpe3JldHVybiBZcn1Yci5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShIVE1MVGVtcGxhdGVFbGVtZW50LnByb3RvdHlwZSx7Y29uc3RydWN0b3I6e3ZhbHVlOlhyLHdyaXRhYmxlOiEwfX0pO2NvbnN0ICRyPWZlKFhyKSxLcj1Xcigkcik7Y29uc3QgWnI9ZmUoY2xhc3N7fSk7ZnVuY3Rpb24gSnIodCxlKXtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7bGV0IGk9ZVtuXTtpZihCb29sZWFuKHQpIT1Cb29sZWFuKGkuX19oaWRlVGVtcGxhdGVDaGlsZHJlbl9fKSlpZihpLm5vZGVUeXBlPT09Tm9kZS5URVhUX05PREUpdD8oaS5fX3BvbHltZXJUZXh0Q29udGVudF9fPWkudGV4dENvbnRlbnQsaS50ZXh0Q29udGVudD0iIik6aS50ZXh0Q29udGVudD1pLl9fcG9seW1lclRleHRDb250ZW50X187ZWxzZSBpZigic2xvdCI9PT1pLmxvY2FsTmFtZSlpZih0KWkuX19wb2x5bWVyUmVwbGFjZWRfXz1kb2N1bWVudC5jcmVhdGVDb21tZW50KCJoaWRkZW4tc2xvdCIpLFkoWShpKS5wYXJlbnROb2RlKS5yZXBsYWNlQ2hpbGQoaS5fX3BvbHltZXJSZXBsYWNlZF9fLGkpO2Vsc2V7Y29uc3QgdD1pLl9fcG9seW1lclJlcGxhY2VkX187dCYmWShZKHQpLnBhcmVudE5vZGUpLnJlcGxhY2VDaGlsZChpLHQpfWVsc2UgaS5zdHlsZSYmKHQ/KGkuX19wb2x5bWVyRGlzcGxheV9fPWkuc3R5bGUuZGlzcGxheSxpLnN0eWxlLmRpc3BsYXk9Im5vbmUiKTppLnN0eWxlLmRpc3BsYXk9aS5fX3BvbHltZXJEaXNwbGF5X18pO2kuX19oaWRlVGVtcGxhdGVDaGlsZHJlbl9fPXQsaS5fc2hvd0hpZGVDaGlsZHJlbiYmaS5fc2hvd0hpZGVDaGlsZHJlbih0KX19Y2xhc3MgUXIgZXh0ZW5kcyBacntjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMuX2NvbmZpZ3VyZVByb3BlcnRpZXModCksdGhpcy5yb290PXRoaXMuX3N0YW1wVGVtcGxhdGUodGhpcy5fX2RhdGFIb3N0KTtsZXQgZT1bXTt0aGlzLmNoaWxkcmVuPWU7Zm9yKGxldCB0PXRoaXMucm9vdC5maXJzdENoaWxkO3Q7dD10Lm5leHRTaWJsaW5nKWUucHVzaCh0KSx0Ll9fdGVtcGxhdGl6ZUluc3RhbmNlPXRoaXM7dGhpcy5fX3RlbXBsYXRpemVPd25lciYmdGhpcy5fX3RlbXBsYXRpemVPd25lci5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18mJnRoaXMuX3Nob3dIaWRlQ2hpbGRyZW4oITApO2xldCBuPXRoaXMuX190ZW1wbGF0aXplT3B0aW9uczsodCYmbi5pbnN0YW5jZVByb3BzfHwhbi5pbnN0YW5jZVByb3BzKSYmdGhpcy5fZW5hYmxlUHJvcGVydGllcygpfV9jb25maWd1cmVQcm9wZXJ0aWVzKHQpe2lmKHRoaXMuX190ZW1wbGF0aXplT3B0aW9ucy5mb3J3YXJkSG9zdFByb3ApZm9yKGxldCB0IGluIHRoaXMuX19ob3N0UHJvcHMpdGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5KHQsdGhpcy5fX2RhdGFIb3N0WyJfaG9zdF8iK3RdKTtmb3IobGV0IGUgaW4gdCl0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkoZSx0W2VdKX1mb3J3YXJkSG9zdFByb3AodCxlKXt0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgodCxlLCExLCEwKSYmdGhpcy5fX2RhdGFIb3N0Ll9lbnF1ZXVlQ2xpZW50KHRoaXMpfV9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKHQsZSxuKXtpZih0aGlzLl9tZXRob2RIb3N0JiZ0aGlzLl9fdGVtcGxhdGl6ZU9wdGlvbnMucGFyZW50TW9kZWwpdGhpcy5fbWV0aG9kSG9zdC5fYWRkRXZlbnRMaXN0ZW5lclRvTm9kZSh0LGUsKHQ9Pnt0Lm1vZGVsPXRoaXMsbih0KX0pKTtlbHNle2xldCBpPXRoaXMuX19kYXRhSG9zdC5fX2RhdGFIb3N0O2kmJmkuX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUodCxlLG4pfX1fc2hvd0hpZGVDaGlsZHJlbih0KXtKcih0LHRoaXMuY2hpbGRyZW4pfV9zZXRVbm1hbmFnZWRQcm9wZXJ0eVRvTm9kZSh0LGUsbil7dC5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18mJnQubm9kZVR5cGU9PU5vZGUuVEVYVF9OT0RFJiYidGV4dENvbnRlbnQiPT1lP3QuX19wb2x5bWVyVGV4dENvbnRlbnRfXz1uOnN1cGVyLl9zZXRVbm1hbmFnZWRQcm9wZXJ0eVRvTm9kZSh0LGUsbil9Z2V0IHBhcmVudE1vZGVsKCl7bGV0IHQ9dGhpcy5fX3BhcmVudE1vZGVsO2lmKCF0KXtsZXQgZTt0PXRoaXM7ZG97dD10Ll9fZGF0YUhvc3QuX19kYXRhSG9zdH13aGlsZSgoZT10Ll9fdGVtcGxhdGl6ZU9wdGlvbnMpJiYhZS5wYXJlbnRNb2RlbCk7dGhpcy5fX3BhcmVudE1vZGVsPXR9cmV0dXJuIHR9ZGlzcGF0Y2hFdmVudCh0KXtyZXR1cm4hMH19Y29uc3QgdG89V3IoUXIpO2Z1bmN0aW9uIGVvKHQpe2xldCBlPXQuX19kYXRhSG9zdDtyZXR1cm4gZSYmZS5fbWV0aG9kSG9zdHx8ZX1mdW5jdGlvbiBubyh0LGUsbil7bGV0IGk9bi5tdXRhYmxlRGF0YT90bzpRcjthby5taXhpbiYmKGk9YW8ubWl4aW4oaSkpO2xldCByPWNsYXNzIGV4dGVuZHMgaXt9O3JldHVybiByLnByb3RvdHlwZS5fX3RlbXBsYXRpemVPcHRpb25zPW4sci5wcm90b3R5cGUuX2JpbmRUZW1wbGF0ZSh0KSwoZnVuY3Rpb24gbyh0LGUsbixpKXtsZXQgcj1uLmhvc3RQcm9wc3x8e307Zm9yKGxldCBlIGluIGkuaW5zdGFuY2VQcm9wcyl7ZGVsZXRlIHJbZV07bGV0IG49aS5ub3RpZnlJbnN0YW5jZVByb3A7biYmdC5wcm90b3R5cGUuX2FkZFByb3BlcnR5RWZmZWN0KGUsdC5wcm90b3R5cGUuUFJPUEVSVFlfRUZGRUNUX1RZUEVTLk5PVElGWSx7Zm46b28oZSxuKX0pfWlmKGkuZm9yd2FyZEhvc3RQcm9wJiZlLl9fZGF0YUhvc3QpZm9yKGxldCBlIGluIHIpbi5oYXNIb3N0UHJvcHN8fChuLmhhc0hvc3RQcm9wcz0hMCksdC5wcm90b3R5cGUuX2FkZFByb3BlcnR5RWZmZWN0KGUsdC5wcm90b3R5cGUuUFJPUEVSVFlfRUZGRUNUX1RZUEVTLk5PVElGWSx7Zm46ZnVuY3Rpb24gdChlLG4saSl7ZS5fX2RhdGFIb3N0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgoIl9ob3N0XyIrbixpW25dLCEwLCEwKX19KX0pKHIsdCxlLG4pLHJ9ZnVuY3Rpb24gaW8odCxlLG4saSl7bGV0IHI9bi5mb3J3YXJkSG9zdFByb3A7aWYociYmZS5oYXNIb3N0UHJvcHMpe2NvbnN0IG89InRlbXBsYXRlIj09dC5sb2NhbE5hbWU7bGV0IGE9ZS50ZW1wbGF0aXplVGVtcGxhdGVDbGFzcztpZighYSl7aWYobyl7bGV0IHQ9bi5tdXRhYmxlRGF0YT9LcjokcjtjbGFzcyBpIGV4dGVuZHMgdHt9YT1lLnRlbXBsYXRpemVUZW1wbGF0ZUNsYXNzPWl9ZWxzZXtjb25zdCBuPXQuY29uc3RydWN0b3I7Y2xhc3MgaSBleHRlbmRzIG57fWE9ZS50ZW1wbGF0aXplVGVtcGxhdGVDbGFzcz1pfWxldCBzPWUuaG9zdFByb3BzO2ZvcihsZXQgdCBpbiBzKWEucHJvdG90eXBlLl9hZGRQcm9wZXJ0eUVmZmVjdCgiX2hvc3RfIit0LGEucHJvdG90eXBlLlBST1BFUlRZX0VGRkVDVF9UWVBFUy5QUk9QQUdBVEUse2ZuOnJvKHQscil9KSxhLnByb3RvdHlwZS5fY3JlYXRlTm90aWZ5aW5nUHJvcGVydHkoIl9ob3N0XyIrdCk7UyYmaSYmKGZ1bmN0aW9uIG8odCxlLG4pe2NvbnN0IGk9bi5jb25zdHJ1Y3Rvci5fcHJvcGVydGllcyx7cHJvcGVydHlFZmZlY3RzOnJ9PXQse2luc3RhbmNlUHJvcHM6b309ZTtmb3IobGV0IHQgaW4gcilpZighKGlbdF18fG8mJm9bdF0pKXtjb25zdCBlPXJbdF07Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2NvbnN0e3BhcnQ6aX09ZVtuXS5pbmZvO2lmKCFpLnNpZ25hdHVyZXx8IWkuc2lnbmF0dXJlLnN0YXRpYyl7Y29uc29sZS53YXJuKGBQcm9wZXJ0eSAnJHt0fScgdXNlZCBpbiB0ZW1wbGF0ZSBidXQgbm90IGRlY2xhcmVkIGluICdwcm9wZXJ0aWVzJzsgYXR0cmlidXRlIHdpbGwgbm90IGJlIG9ic2VydmVkLmApO2JyZWFrfX19fSkoZSxuLGkpfWlmKHQuX19kYXRhUHJvdG8mJk9iamVjdC5hc3NpZ24odC5fX2RhdGEsdC5fX2RhdGFQcm90byksbykhKGZ1bmN0aW9uIGEodCxlKXtZcj10LE9iamVjdC5zZXRQcm90b3R5cGVPZih0LGUucHJvdG90eXBlKSxuZXcgZSxZcj1udWxsfSkodCxhKSx0Ll9fZGF0YVRlbXA9e30sdC5fX2RhdGFQZW5kaW5nPW51bGwsdC5fX2RhdGFPbGQ9bnVsbCx0Ll9lbmFibGVQcm9wZXJ0aWVzKCk7ZWxzZXtPYmplY3Quc2V0UHJvdG90eXBlT2YodCxhLnByb3RvdHlwZSk7Y29uc3Qgbj1lLmhvc3RQcm9wcztmb3IobGV0IGUgaW4gbilpZihlPSJfaG9zdF8iK2UsZSBpbiB0KXtjb25zdCBuPXRbZV07ZGVsZXRlIHRbZV0sdC5fX2RhdGFbZV09bn19fX1mdW5jdGlvbiBybyh0LGUpe3JldHVybiBmdW5jdGlvbiB0KG4saSxyKXtlLmNhbGwobi5fX3RlbXBsYXRpemVPd25lcixpLnN1YnN0cmluZygiX2hvc3RfIi5sZW5ndGgpLHJbaV0pfX1mdW5jdGlvbiBvbyh0LGUpe3JldHVybiBmdW5jdGlvbiB0KG4saSxyKXtlLmNhbGwobi5fX3RlbXBsYXRpemVPd25lcixuLGkscltpXSl9fWZ1bmN0aW9uIGFvKHQsZSxuKXtpZihiJiYhZW8odCkpdGhyb3cgbmV3IEVycm9yKCJzdHJpY3RUZW1wbGF0ZVBvbGljeTogdGVtcGxhdGUgb3duZXIgbm90IHRydXN0ZWQiKTtpZihuPW58fHt9LHQuX190ZW1wbGF0aXplT3duZXIpdGhyb3cgbmV3IEVycm9yKCJBIDx0ZW1wbGF0ZT4gY2FuIG9ubHkgYmUgdGVtcGxhdGl6ZWQgb25jZSIpO3QuX190ZW1wbGF0aXplT3duZXI9ZTtsZXQgaT0oZT9lLmNvbnN0cnVjdG9yOlFyKS5fcGFyc2VUZW1wbGF0ZSh0KSxyPWkudGVtcGxhdGl6ZUluc3RhbmNlQ2xhc3M7cnx8KHI9bm8odCxpLG4pLGkudGVtcGxhdGl6ZUluc3RhbmNlQ2xhc3M9cik7Y29uc3Qgbz1lbyh0KTtpbyh0LGksbixvKTtsZXQgYT1jbGFzcyBleHRlbmRzIHJ7fTtyZXR1cm4gYS5wcm90b3R5cGUuX21ldGhvZEhvc3Q9byxhLnByb3RvdHlwZS5fX2RhdGFIb3N0PXQsYS5wcm90b3R5cGUuX190ZW1wbGF0aXplT3duZXI9ZSxhLnByb3RvdHlwZS5fX2hvc3RQcm9wcz1pLmhvc3RQcm9wcyxhPWEsYX1mdW5jdGlvbiBzbyh0LGUpe2xldCBuO2Zvcig7ZTspaWYobj1lLl9fZGF0YUhvc3Q/ZTplLl9fdGVtcGxhdGl6ZUluc3RhbmNlKXtpZihuLl9fZGF0YUhvc3Q9PXQpcmV0dXJuIG47ZT1uLl9fZGF0YUhvc3R9ZWxzZSBlPVkoZSkucGFyZW50Tm9kZTtyZXR1cm4gbnVsbH0KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9jb25zdCBsbz17dGVtcGxhdGl6ZSh0LGUpe3RoaXMuX3RlbXBsYXRpemVyVGVtcGxhdGU9dCx0aGlzLmN0b3I9YW8odCx0aGlzLHttdXRhYmxlRGF0YTpCb29sZWFuKGUpLHBhcmVudE1vZGVsOnRoaXMuX3BhcmVudE1vZGVsLGluc3RhbmNlUHJvcHM6dGhpcy5faW5zdGFuY2VQcm9wcyxmb3J3YXJkSG9zdFByb3A6dGhpcy5fZm9yd2FyZEhvc3RQcm9wVjIsbm90aWZ5SW5zdGFuY2VQcm9wOnRoaXMuX25vdGlmeUluc3RhbmNlUHJvcFYyfSl9LHN0YW1wKHQpe3JldHVybiBuZXcgdGhpcy5jdG9yKHQpfSxtb2RlbEZvckVsZW1lbnQodCl7cmV0dXJuIHNvKHRoaXMuX3RlbXBsYXRpemVyVGVtcGxhdGUsdCl9fTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9sZXQgY289ITE7ZnVuY3Rpb24gdW8oKXtpZih3JiYhbSl7aWYoIWNvKXtjbz0hMDtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7dC50ZXh0Q29udGVudD0iZG9tLWJpbmQsZG9tLWlmLGRvbS1yZXBlYXR7ZGlzcGxheTpub25lO30iLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodCl9cmV0dXJuITB9cmV0dXJuITF9Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovY29uc3QgaG89YmkocXIoZmUoSFRNTEVsZW1lbnQpKSk7Y3VzdG9tRWxlbWVudHMuZGVmaW5lKCJkb20tYmluZCIsY2xhc3MgZXh0ZW5kcyBob3tzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpe3JldHVyblsibXV0YWJsZS1kYXRhIl19Y29uc3RydWN0b3IoKXtpZihzdXBlcigpLGIpdGhyb3cgbmV3IEVycm9yKCJzdHJpY3RUZW1wbGF0ZVBvbGljeTogZG9tLWJpbmQgbm90IGFsbG93ZWQiKTt0aGlzLnJvb3Q9bnVsbCx0aGlzLiQ9bnVsbCx0aGlzLl9fY2hpbGRyZW49bnVsbH1hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodCxlLG4saSl7dGhpcy5tdXRhYmxlRGF0YT0hMH1jb25uZWN0ZWRDYWxsYmFjaygpe3VvKCl8fCh0aGlzLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSx0aGlzLnJlbmRlcigpfWRpc2Nvbm5lY3RlZENhbGxiYWNrKCl7dGhpcy5fX3JlbW92ZUNoaWxkcmVuKCl9X19pbnNlcnRDaGlsZHJlbigpe1koWSh0aGlzKS5wYXJlbnROb2RlKS5pbnNlcnRCZWZvcmUodGhpcy5yb290LHRoaXMpfV9fcmVtb3ZlQ2hpbGRyZW4oKXtpZih0aGlzLl9fY2hpbGRyZW4pZm9yKGxldCB0PTA7dDx0aGlzLl9fY2hpbGRyZW4ubGVuZ3RoO3QrKyl0aGlzLnJvb3QuYXBwZW5kQ2hpbGQodGhpcy5fX2NoaWxkcmVuW3RdKX1yZW5kZXIoKXtsZXQgdDtpZighdGhpcy5fX2NoaWxkcmVuKXtpZih0PXR8fHRoaXMucXVlcnlTZWxlY3RvcigidGVtcGxhdGUiKSwhdCl7bGV0IGU9bmV3IE11dGF0aW9uT2JzZXJ2ZXIoKCgpPT57aWYodD10aGlzLnF1ZXJ5U2VsZWN0b3IoInRlbXBsYXRlIiksIXQpdGhyb3cgbmV3IEVycm9yKCJkb20tYmluZCByZXF1aXJlcyBhIDx0ZW1wbGF0ZT4gY2hpbGQiKTtlLmRpc2Nvbm5lY3QoKSx0aGlzLnJlbmRlcigpfSkpO3JldHVybiB2b2lkIGUub2JzZXJ2ZSh0aGlzLHtjaGlsZExpc3Q6ITB9KX10aGlzLnJvb3Q9dGhpcy5fc3RhbXBUZW1wbGF0ZSh0KSx0aGlzLiQ9dGhpcy5yb290LiQsdGhpcy5fX2NoaWxkcmVuPVtdO2ZvcihsZXQgdD10aGlzLnJvb3QuZmlyc3RDaGlsZDt0O3Q9dC5uZXh0U2libGluZyl0aGlzLl9fY2hpbGRyZW5bdGhpcy5fX2NoaWxkcmVuLmxlbmd0aF09dDt0aGlzLl9lbmFibGVQcm9wZXJ0aWVzKCl9dGhpcy5fX2luc2VydENoaWxkcmVuKCksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiZG9tLWNoYW5nZSIse2J1YmJsZXM6ITAsY29tcG9zZWQ6ITB9KSl9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IHBvPXFyKHdlKTtjbGFzcyBmbyBleHRlbmRzIHBve3N0YXRpYyBnZXQgaXMoKXtyZXR1cm4iZG9tLXJlcGVhdCJ9c3RhdGljIGdldCB0ZW1wbGF0ZSgpe3JldHVybiBudWxsfXN0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybntpdGVtczp7dHlwZTpBcnJheX0sYXM6e3R5cGU6U3RyaW5nLHZhbHVlOiJpdGVtIn0saW5kZXhBczp7dHlwZTpTdHJpbmcsdmFsdWU6ImluZGV4In0saXRlbXNJbmRleEFzOnt0eXBlOlN0cmluZyx2YWx1ZToiaXRlbXNJbmRleCJ9LHNvcnQ6e3R5cGU6RnVuY3Rpb24sb2JzZXJ2ZXI6Il9fc29ydENoYW5nZWQifSxmaWx0ZXI6e3R5cGU6RnVuY3Rpb24sb2JzZXJ2ZXI6Il9fZmlsdGVyQ2hhbmdlZCJ9LG9ic2VydmU6e3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfX29ic2VydmVDaGFuZ2VkIn0sZGVsYXk6TnVtYmVyLHJlbmRlcmVkSXRlbUNvdW50Ont0eXBlOk51bWJlcixub3RpZnk6IWsscmVhZE9ubHk6ITB9LGluaXRpYWxDb3VudDp7dHlwZTpOdW1iZXJ9LHRhcmdldEZyYW1lcmF0ZTp7dHlwZTpOdW1iZXIsdmFsdWU6MjB9LF90YXJnZXRGcmFtZVRpbWU6e3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfX2NvbXB1dGVGcmFtZVRpbWUodGFyZ2V0RnJhbWVyYXRlKSJ9LG5vdGlmeURvbUNoYW5nZTp7dHlwZTpCb29sZWFufSxyZXVzZUNodW5rZWRJbnN0YW5jZXM6e3R5cGU6Qm9vbGVhbn19fXN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCl7cmV0dXJuWyJfX2l0ZW1zQ2hhbmdlZChpdGVtcy4qKSJdfWNvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLl9faW5zdGFuY2VzPVtdLHRoaXMuX19yZW5kZXJEZWJvdW5jZXI9bnVsbCx0aGlzLl9faXRlbXNJZHhUb0luc3RJZHg9e30sdGhpcy5fX2NodW5rQ291bnQ9bnVsbCx0aGlzLl9fcmVuZGVyU3RhcnRUaW1lPW51bGwsdGhpcy5fX2l0ZW1zQXJyYXlDaGFuZ2VkPSExLHRoaXMuX19zaG91bGRNZWFzdXJlQ2h1bms9ITEsdGhpcy5fX3Nob3VsZENvbnRpbnVlQ2h1bmtpbmc9ITEsdGhpcy5fX2NodW5raW5nSWQ9MCx0aGlzLl9fc29ydEZuPW51bGwsdGhpcy5fX2ZpbHRlckZuPW51bGwsdGhpcy5fX29ic2VydmVQYXRocz1udWxsLHRoaXMuX19jdG9yPW51bGwsdGhpcy5fX2lzRGV0YWNoZWQ9ITAsdGhpcy50ZW1wbGF0ZT1udWxsfWRpc2Nvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKSx0aGlzLl9faXNEZXRhY2hlZD0hMDtmb3IobGV0IHQ9MDt0PHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoO3QrKyl0aGlzLl9fZGV0YWNoSW5zdGFuY2UodCl9Y29ubmVjdGVkQ2FsbGJhY2soKXtpZihzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpLHVvKCl8fCh0aGlzLnN0eWxlLmRpc3BsYXk9Im5vbmUiKSx0aGlzLl9faXNEZXRhY2hlZCl7dGhpcy5fX2lzRGV0YWNoZWQ9ITE7bGV0IHQ9WShZKHRoaXMpLnBhcmVudE5vZGUpO2ZvcihsZXQgZT0wO2U8dGhpcy5fX2luc3RhbmNlcy5sZW5ndGg7ZSsrKXRoaXMuX19hdHRhY2hJbnN0YW5jZShlLHQpfX1fX2Vuc3VyZVRlbXBsYXRpemVkKCl7aWYoIXRoaXMuX19jdG9yKXtjb25zdCB0PXRoaXM7bGV0IGU9dGhpcy50ZW1wbGF0ZT10Ll90ZW1wbGF0ZUluZm8/dDp0aGlzLnF1ZXJ5U2VsZWN0b3IoInRlbXBsYXRlIik7aWYoIWUpe2xldCB0PW5ldyBNdXRhdGlvbk9ic2VydmVyKCgoKT0+e2lmKCF0aGlzLnF1ZXJ5U2VsZWN0b3IoInRlbXBsYXRlIikpdGhyb3cgbmV3IEVycm9yKCJkb20tcmVwZWF0IHJlcXVpcmVzIGEgPHRlbXBsYXRlPiBjaGlsZCIpO3QuZGlzY29ubmVjdCgpLHRoaXMuX19yZW5kZXIoKX0pKTtyZXR1cm4gdC5vYnNlcnZlKHRoaXMse2NoaWxkTGlzdDohMH0pLCExfWxldCBuPXt9O25bdGhpcy5hc109ITAsblt0aGlzLmluZGV4QXNdPSEwLG5bdGhpcy5pdGVtc0luZGV4QXNdPSEwLHRoaXMuX19jdG9yPWFvKGUsdGhpcyx7bXV0YWJsZURhdGE6dGhpcy5tdXRhYmxlRGF0YSxwYXJlbnRNb2RlbDohMCxpbnN0YW5jZVByb3BzOm4sZm9yd2FyZEhvc3RQcm9wOmZ1bmN0aW9uKHQsZSl7bGV0IG49dGhpcy5fX2luc3RhbmNlcztmb3IobGV0IGkscj0wO3I8bi5sZW5ndGgmJihpPW5bcl0pO3IrKylpLmZvcndhcmRIb3N0UHJvcCh0LGUpfSxub3RpZnlJbnN0YW5jZVByb3A6ZnVuY3Rpb24odCxlLG4pe2lmKFEodGhpcy5hcyxlKSl7bGV0IGk9dFt0aGlzLml0ZW1zSW5kZXhBc107ZT09dGhpcy5hcyYmKHRoaXMuaXRlbXNbaV09bik7bGV0IHI9Sih0aGlzLmFzLGAke0pTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIml0ZW1zIix0aGlzKX0uJHtpfWAsZSk7dGhpcy5ub3RpZnlQYXRoKHIsbil9fX0pfXJldHVybiEwfV9fZ2V0TWV0aG9kSG9zdCgpe3JldHVybiB0aGlzLl9fZGF0YUhvc3QuX21ldGhvZEhvc3R8fHRoaXMuX19kYXRhSG9zdH1fX2Z1bmN0aW9uRnJvbVByb3BlcnR5VmFsdWUodCl7aWYoInN0cmluZyI9PXR5cGVvZiB0KXtsZXQgZT10LG49dGhpcy5fX2dldE1ldGhvZEhvc3QoKTtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gbltlXS5hcHBseShuLGFyZ3VtZW50cyl9fXJldHVybiB0fV9fc29ydENoYW5nZWQodCl7dGhpcy5fX3NvcnRGbj10aGlzLl9fZnVuY3Rpb25Gcm9tUHJvcGVydHlWYWx1ZSh0KSx0aGlzLml0ZW1zJiZ0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlbmRlcil9X19maWx0ZXJDaGFuZ2VkKHQpe3RoaXMuX19maWx0ZXJGbj10aGlzLl9fZnVuY3Rpb25Gcm9tUHJvcGVydHlWYWx1ZSh0KSx0aGlzLml0ZW1zJiZ0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlbmRlcil9X19jb21wdXRlRnJhbWVUaW1lKHQpe3JldHVybiBNYXRoLmNlaWwoMWUzL3QpfV9fb2JzZXJ2ZUNoYW5nZWQoKXt0aGlzLl9fb2JzZXJ2ZVBhdGhzPXRoaXMub2JzZXJ2ZSYmdGhpcy5vYnNlcnZlLnJlcGxhY2UoIi4qIiwiLiIpLnNwbGl0KCIgIil9X19oYW5kbGVPYnNlcnZlZFBhdGhzKHQpe2lmKHRoaXMuX19zb3J0Rm58fHRoaXMuX19maWx0ZXJGbilpZih0KXtpZih0aGlzLl9fb2JzZXJ2ZVBhdGhzKXtsZXQgZT10aGlzLl9fb2JzZXJ2ZVBhdGhzO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKTA9PT10LmluZGV4T2YoZVtuXSkmJnRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyLHRoaXMuZGVsYXkpfX1lbHNlIHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyLHRoaXMuZGVsYXkpfV9faXRlbXNDaGFuZ2VkKHQpe3RoaXMuaXRlbXMmJiFBcnJheS5pc0FycmF5KHRoaXMuaXRlbXMpJiZjb25zb2xlLndhcm4oImRvbS1yZXBlYXQgZXhwZWN0ZWQgYXJyYXkgZm9yIGBpdGVtc2AsIGZvdW5kIix0aGlzLml0ZW1zKSx0aGlzLl9faGFuZGxlSXRlbVBhdGgodC5wYXRoLHQudmFsdWUpfHwoIml0ZW1zIj09PXQucGF0aCYmKHRoaXMuX19pdGVtc0FycmF5Q2hhbmdlZD0hMCksdGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIpKX1fX2RlYm91bmNlUmVuZGVyKHQsZT0wKXt0aGlzLl9fcmVuZGVyRGVib3VuY2VyPU5uLmRlYm91bmNlKHRoaXMuX19yZW5kZXJEZWJvdW5jZXIsZT4wP2d0LmFmdGVyKGUpOnZ0LHQuYmluZCh0aGlzKSksUm4odGhpcy5fX3JlbmRlckRlYm91bmNlcil9cmVuZGVyKCl7dGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIpLFdpKCl9X19yZW5kZXIoKXtpZighdGhpcy5fX2Vuc3VyZVRlbXBsYXRpemVkKCkpcmV0dXJuO2xldCB0PXRoaXMuaXRlbXN8fFtdO2NvbnN0IGU9dGhpcy5fX3NvcnRBbmRGaWx0ZXJJdGVtcyh0KSxuPXRoaXMuX19jYWxjdWxhdGVMaW1pdChlLmxlbmd0aCk7dGhpcy5fX3VwZGF0ZUluc3RhbmNlcyh0LG4sZSksdGhpcy5pbml0aWFsQ291bnQmJih0aGlzLl9fc2hvdWxkTWVhc3VyZUNodW5rfHx0aGlzLl9fc2hvdWxkQ29udGludWVDaHVua2luZykmJihjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9fY2h1bmtpbmdJZCksdGhpcy5fX2NodW5raW5nSWQ9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+dGhpcy5fX2NvbnRpbnVlQ2h1bmtpbmcoKSkpKSx0aGlzLl9zZXRSZW5kZXJlZEl0ZW1Db3VudCh0aGlzLl9faW5zdGFuY2VzLmxlbmd0aCksayYmIXRoaXMubm90aWZ5RG9tQ2hhbmdlfHx0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJkb20tY2hhbmdlIix7YnViYmxlczohMCxjb21wb3NlZDohMH0pKX1fX3NvcnRBbmRGaWx0ZXJJdGVtcyh0KXtsZXQgZT1uZXcgQXJyYXkodC5sZW5ndGgpO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKWVbbl09bjtyZXR1cm4gdGhpcy5fX2ZpbHRlckZuJiYoZT1lLmZpbHRlcigoKGUsbixpKT0+dGhpcy5fX2ZpbHRlckZuKHRbZV0sbixpKSkpKSx0aGlzLl9fc29ydEZuJiZlLnNvcnQoKChlLG4pPT50aGlzLl9fc29ydEZuKHRbZV0sdFtuXSkpKSxlfV9fY2FsY3VsYXRlTGltaXQodCl7bGV0IGU9dDtjb25zdCBuPXRoaXMuX19pbnN0YW5jZXMubGVuZ3RoO2lmKHRoaXMuaW5pdGlhbENvdW50KXtsZXQgaTshdGhpcy5fX2NodW5rQ291bnR8fHRoaXMuX19pdGVtc0FycmF5Q2hhbmdlZCYmIXRoaXMucmV1c2VDaHVua2VkSW5zdGFuY2VzPyhlPU1hdGgubWluKHQsdGhpcy5pbml0aWFsQ291bnQpLGk9TWF0aC5tYXgoZS1uLDApLHRoaXMuX19jaHVua0NvdW50PWl8fDEpOihpPU1hdGgubWluKE1hdGgubWF4KHQtbiwwKSx0aGlzLl9fY2h1bmtDb3VudCksZT1NYXRoLm1pbihuK2ksdCkpLHRoaXMuX19zaG91bGRNZWFzdXJlQ2h1bms9aT09PXRoaXMuX19jaHVua0NvdW50LHRoaXMuX19zaG91bGRDb250aW51ZUNodW5raW5nPWU8dCx0aGlzLl9fcmVuZGVyU3RhcnRUaW1lPXBlcmZvcm1hbmNlLm5vdygpfXJldHVybiB0aGlzLl9faXRlbXNBcnJheUNoYW5nZWQ9ITEsZX1fX2NvbnRpbnVlQ2h1bmtpbmcoKXtpZih0aGlzLl9fc2hvdWxkTWVhc3VyZUNodW5rKXtjb25zdCB0PXBlcmZvcm1hbmNlLm5vdygpLXRoaXMuX19yZW5kZXJTdGFydFRpbWU7dGhpcy5fX2NodW5rQ291bnQ9TWF0aC5yb3VuZCh0aGlzLl9fY2h1bmtDb3VudCoodGhpcy5fdGFyZ2V0RnJhbWVUaW1lL3QpKXx8MX10aGlzLl9fc2hvdWxkQ29udGludWVDaHVua2luZyYmdGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIpfV9fdXBkYXRlSW5zdGFuY2VzKHQsZSxuKXtjb25zdCBpPXRoaXMuX19pdGVtc0lkeFRvSW5zdElkeD17fTtsZXQgcjtmb3Iocj0wO3I8ZTtyKyspe2xldCBlPXRoaXMuX19pbnN0YW5jZXNbcl0sbz1uW3JdLGE9dFtvXTtpW29dPXIsZT8oZS5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuYXMsYSksZS5fc2V0UGVuZGluZ1Byb3BlcnR5KHRoaXMuaW5kZXhBcyxyKSxlLl9zZXRQZW5kaW5nUHJvcGVydHkodGhpcy5pdGVtc0luZGV4QXMsbyksZS5fZmx1c2hQcm9wZXJ0aWVzKCkpOnRoaXMuX19pbnNlcnRJbnN0YW5jZShhLHIsbyl9Zm9yKGxldCB0PXRoaXMuX19pbnN0YW5jZXMubGVuZ3RoLTE7dD49cjt0LS0pdGhpcy5fX2RldGFjaEFuZFJlbW92ZUluc3RhbmNlKHQpfV9fZGV0YWNoSW5zdGFuY2UodCl7bGV0IGU9dGhpcy5fX2luc3RhbmNlc1t0XTtjb25zdCBuPVkoZS5yb290KTtmb3IobGV0IHQ9MDt0PGUuY2hpbGRyZW4ubGVuZ3RoO3QrKyl7bi5hcHBlbmRDaGlsZChlLmNoaWxkcmVuW3RdKX1yZXR1cm4gZX1fX2F0dGFjaEluc3RhbmNlKHQsZSl7ZS5pbnNlcnRCZWZvcmUodGhpcy5fX2luc3RhbmNlc1t0XS5yb290LHRoaXMpfV9fZGV0YWNoQW5kUmVtb3ZlSW5zdGFuY2UodCl7dGhpcy5fX2RldGFjaEluc3RhbmNlKHQpLHRoaXMuX19pbnN0YW5jZXMuc3BsaWNlKHQsMSl9X19zdGFtcEluc3RhbmNlKHQsZSxuKXtsZXQgaT17fTtyZXR1cm4gaVt0aGlzLmFzXT10LGlbdGhpcy5pbmRleEFzXT1lLGlbdGhpcy5pdGVtc0luZGV4QXNdPW4sbmV3IHRoaXMuX19jdG9yKGkpfV9faW5zZXJ0SW5zdGFuY2UodCxlLG4pe2NvbnN0IGk9dGhpcy5fX3N0YW1wSW5zdGFuY2UodCxlLG4pO2xldCByPXRoaXMuX19pbnN0YW5jZXNbZSsxXSxvPXI/ci5jaGlsZHJlblswXTp0aGlzO3JldHVybiBZKFkodGhpcykucGFyZW50Tm9kZSkuaW5zZXJ0QmVmb3JlKGkucm9vdCxvKSx0aGlzLl9faW5zdGFuY2VzW2VdPWksaX1fc2hvd0hpZGVDaGlsZHJlbih0KXtmb3IobGV0IGU9MDtlPHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoO2UrKyl0aGlzLl9faW5zdGFuY2VzW2VdLl9zaG93SGlkZUNoaWxkcmVuKHQpfV9faGFuZGxlSXRlbVBhdGgodCxlKXtsZXQgbj10LnNsaWNlKDYpLGk9bi5pbmRleE9mKCIuIikscj1pPDA/bjpuLnN1YnN0cmluZygwLGkpO2lmKHI9PXBhcnNlSW50KHIsMTApKXtsZXQgdD1pPDA/IiI6bi5zdWJzdHJpbmcoaSsxKTt0aGlzLl9faGFuZGxlT2JzZXJ2ZWRQYXRocyh0KTtsZXQgbz10aGlzLl9faW5zdGFuY2VzW3RoaXMuX19pdGVtc0lkeFRvSW5zdElkeFtyXV07aWYobyl7by5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHRoaXMuYXMrKHQ/Ii4iK3Q6IiIpLGUsITEsITApLG8uX2ZsdXNoUHJvcGVydGllcygpfXJldHVybiEwfX1pdGVtRm9yRWxlbWVudCh0KXtsZXQgZT10aGlzLm1vZGVsRm9yRWxlbWVudCh0KTtyZXR1cm4gZSYmZVt0aGlzLmFzXX1pbmRleEZvckVsZW1lbnQodCl7bGV0IGU9dGhpcy5tb2RlbEZvckVsZW1lbnQodCk7cmV0dXJuIGUmJmVbdGhpcy5pbmRleEFzXX1tb2RlbEZvckVsZW1lbnQodCl7cmV0dXJuIHNvKHRoaXMudGVtcGxhdGUsdCl9fWN1c3RvbUVsZW1lbnRzLmRlZmluZShmby5pcyxmbyk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNsYXNzIG1vIGV4dGVuZHMgd2V7c3RhdGljIGdldCBpcygpe3JldHVybiJkb20taWYifXN0YXRpYyBnZXQgdGVtcGxhdGUoKXtyZXR1cm4gbnVsbH1zdGF0aWMgZ2V0IHByb3BlcnRpZXMoKXtyZXR1cm57aWY6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX19kZWJvdW5jZVJlbmRlciJ9LHJlc3RhbXA6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX19kZWJvdW5jZVJlbmRlciJ9LG5vdGlmeURvbUNoYW5nZTp7dHlwZTpCb29sZWFufX19Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuX19yZW5kZXJEZWJvdW5jZXI9bnVsbCx0aGlzLl9sYXN0SWY9ITEsdGhpcy5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX189ITF9X19kZWJvdW5jZVJlbmRlcigpe3RoaXMuX19yZW5kZXJEZWJvdW5jZXI9Tm4uZGVib3VuY2UodGhpcy5fX3JlbmRlckRlYm91bmNlcix2dCwoKCk9PnRoaXMuX19yZW5kZXIoKSkpLFJuKHRoaXMuX19yZW5kZXJEZWJvdW5jZXIpfWRpc2Nvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTtjb25zdCB0PVkodGhpcykucGFyZW50Tm9kZTt0JiYodC5ub2RlVHlwZSE9Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFfHxZKHQpLmhvc3QpfHx0aGlzLl9fdGVhcmRvd25JbnN0YW5jZSgpfWNvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKSx1bygpfHwodGhpcy5zdHlsZS5kaXNwbGF5PSJub25lIiksdGhpcy5pZiYmdGhpcy5fX2RlYm91bmNlUmVuZGVyKCl9X19lbnN1cmVUZW1wbGF0ZSgpe2lmKCF0aGlzLl9fdGVtcGxhdGUpe2NvbnN0IHQ9dGhpcztsZXQgZT10Ll90ZW1wbGF0ZUluZm8/dDpZKHQpLnF1ZXJ5U2VsZWN0b3IoInRlbXBsYXRlIik7aWYoIWUpe2xldCB0PW5ldyBNdXRhdGlvbk9ic2VydmVyKCgoKT0+e2lmKCFZKHRoaXMpLnF1ZXJ5U2VsZWN0b3IoInRlbXBsYXRlIikpdGhyb3cgbmV3IEVycm9yKCJkb20taWYgcmVxdWlyZXMgYSA8dGVtcGxhdGU+IGNoaWxkIik7dC5kaXNjb25uZWN0KCksdGhpcy5fX3JlbmRlcigpfSkpO3JldHVybiB0Lm9ic2VydmUodGhpcyx7Y2hpbGRMaXN0OiEwfSksITF9dGhpcy5fX3RlbXBsYXRlPWV9cmV0dXJuITB9X19lbnN1cmVJbnN0YW5jZSgpe2xldCB0PVkodGhpcykucGFyZW50Tm9kZTtpZih0aGlzLl9faGFzSW5zdGFuY2UoKSl7bGV0IGU9dGhpcy5fX2dldEluc3RhbmNlTm9kZXMoKTtpZihlJiZlLmxlbmd0aCl7aWYoWSh0aGlzKS5wcmV2aW91c1NpYmxpbmchPT1lW2UubGVuZ3RoLTFdKWZvcihsZXQgbixpPTA7aTxlLmxlbmd0aCYmKG49ZVtpXSk7aSsrKVkodCkuaW5zZXJ0QmVmb3JlKG4sdGhpcyl9fWVsc2V7aWYoIXQpcmV0dXJuITE7aWYoIXRoaXMuX19lbnN1cmVUZW1wbGF0ZSgpKXJldHVybiExO3RoaXMuX19jcmVhdGVBbmRJbnNlcnRJbnN0YW5jZSh0KX1yZXR1cm4hMH1yZW5kZXIoKXtXaSgpfV9fcmVuZGVyKCl7aWYodGhpcy5pZil7aWYoIXRoaXMuX19lbnN1cmVJbnN0YW5jZSgpKXJldHVybn1lbHNlIHRoaXMucmVzdGFtcCYmdGhpcy5fX3RlYXJkb3duSW5zdGFuY2UoKTt0aGlzLl9zaG93SGlkZUNoaWxkcmVuKCksayYmIXRoaXMubm90aWZ5RG9tQ2hhbmdlfHx0aGlzLmlmPT10aGlzLl9sYXN0SWZ8fCh0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJkb20tY2hhbmdlIix7YnViYmxlczohMCxjb21wb3NlZDohMH0pKSx0aGlzLl9sYXN0SWY9dGhpcy5pZil9X19oYXNJbnN0YW5jZSgpe31fX2dldEluc3RhbmNlTm9kZXMoKXt9X19jcmVhdGVBbmRJbnNlcnRJbnN0YW5jZSh0KXt9X190ZWFyZG93bkluc3RhbmNlKCl7fV9zaG93SGlkZUNoaWxkcmVuKCl7fX1jb25zdCBnbz1BP2NsYXNzIGV4dGVuZHMgbW97Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuX19pbnN0YW5jZT1udWxsLHRoaXMuX19zeW5jSW5mbz1udWxsfV9faGFzSW5zdGFuY2UoKXtyZXR1cm4gQm9vbGVhbih0aGlzLl9faW5zdGFuY2UpfV9fZ2V0SW5zdGFuY2VOb2Rlcygpe3JldHVybiB0aGlzLl9faW5zdGFuY2UudGVtcGxhdGVJbmZvLmNoaWxkTm9kZXN9X19jcmVhdGVBbmRJbnNlcnRJbnN0YW5jZSh0KXtjb25zdCBlPXRoaXMuX19kYXRhSG9zdHx8dGhpcztpZihiJiYhdGhpcy5fX2RhdGFIb3N0KXRocm93IG5ldyBFcnJvcigic3RyaWN0VGVtcGxhdGVQb2xpY3k6IHRlbXBsYXRlIG93bmVyIG5vdCB0cnVzdGVkIik7Y29uc3Qgbj1lLl9iaW5kVGVtcGxhdGUodGhpcy5fX3RlbXBsYXRlLCEwKTtuLnJ1bkVmZmVjdHM9KHQsZSxuKT0+e2xldCBpPXRoaXMuX19zeW5jSW5mbztpZih0aGlzLmlmKWkmJih0aGlzLl9fc3luY0luZm89bnVsbCx0aGlzLl9zaG93SGlkZUNoaWxkcmVuKCksZT1PYmplY3QuYXNzaWduKGkuY2hhbmdlZFByb3BzLGUpKSx0KGUsbik7ZWxzZSBpZih0aGlzLl9faW5zdGFuY2UpaWYoaXx8KGk9dGhpcy5fX3N5bmNJbmZvPXtydW5FZmZlY3RzOnQsY2hhbmdlZFByb3BzOnt9fSksbilmb3IoY29uc3QgdCBpbiBlKXtjb25zdCBlPSQodCk7aS5jaGFuZ2VkUHJvcHNbZV09dGhpcy5fX2RhdGFIb3N0W2VdfWVsc2UgT2JqZWN0LmFzc2lnbihpLmNoYW5nZWRQcm9wcyxlKX0sdGhpcy5fX2luc3RhbmNlPWUuX3N0YW1wVGVtcGxhdGUodGhpcy5fX3RlbXBsYXRlLG4pLFkodCkuaW5zZXJ0QmVmb3JlKHRoaXMuX19pbnN0YW5jZSx0aGlzKX1fX3N5bmNIb3N0UHJvcGVydGllcygpe2NvbnN0IHQ9dGhpcy5fX3N5bmNJbmZvO3QmJih0aGlzLl9fc3luY0luZm89bnVsbCx0LnJ1bkVmZmVjdHModC5jaGFuZ2VkUHJvcHMsITEpKX1fX3RlYXJkb3duSW5zdGFuY2UoKXt0aGlzLl9faW5zdGFuY2UmJigodGhpcy5fX2RhdGFIb3N0fHx0aGlzKS5fcmVtb3ZlQm91bmREb20odGhpcy5fX2luc3RhbmNlKSx0aGlzLl9faW5zdGFuY2U9bnVsbCx0aGlzLl9fc3luY0luZm89bnVsbCl9X3Nob3dIaWRlQ2hpbGRyZW4oKXtjb25zdCB0PXRoaXMuX19oaWRlVGVtcGxhdGVDaGlsZHJlbl9ffHwhdGhpcy5pZjt0aGlzLl9faW5zdGFuY2UmJkJvb2xlYW4odGhpcy5fX2luc3RhbmNlLl9faGlkZGVuKSE9PXQmJih0aGlzLl9faW5zdGFuY2UuX19oaWRkZW49dCxKcih0LHRoaXMuX19pbnN0YW5jZS50ZW1wbGF0ZUluZm8uY2hpbGROb2RlcykpLHR8fHRoaXMuX19zeW5jSG9zdFByb3BlcnRpZXMoKX19OmNsYXNzIGV4dGVuZHMgbW97Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuX19jdG9yPW51bGwsdGhpcy5fX2luc3RhbmNlPW51bGwsdGhpcy5fX2ludmFsaWRQcm9wcz1udWxsfV9faGFzSW5zdGFuY2UoKXtyZXR1cm4gQm9vbGVhbih0aGlzLl9faW5zdGFuY2UpfV9fZ2V0SW5zdGFuY2VOb2Rlcygpe3JldHVybiB0aGlzLl9faW5zdGFuY2UuY2hpbGRyZW59X19jcmVhdGVBbmRJbnNlcnRJbnN0YW5jZSh0KXt0aGlzLl9fY3Rvcnx8KHRoaXMuX19jdG9yPWFvKHRoaXMuX190ZW1wbGF0ZSx0aGlzLHttdXRhYmxlRGF0YTohMCxmb3J3YXJkSG9zdFByb3A6ZnVuY3Rpb24odCxlKXt0aGlzLl9faW5zdGFuY2UmJih0aGlzLmlmP3RoaXMuX19pbnN0YW5jZS5mb3J3YXJkSG9zdFByb3AodCxlKToodGhpcy5fX2ludmFsaWRQcm9wcz10aGlzLl9faW52YWxpZFByb3BzfHxPYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX19pbnZhbGlkUHJvcHNbJCh0KV09ITApKX19KSksdGhpcy5fX2luc3RhbmNlPW5ldyB0aGlzLl9fY3RvcixZKHQpLmluc2VydEJlZm9yZSh0aGlzLl9faW5zdGFuY2Uucm9vdCx0aGlzKX1fX3RlYXJkb3duSW5zdGFuY2UoKXtpZih0aGlzLl9faW5zdGFuY2Upe2xldCB0PXRoaXMuX19pbnN0YW5jZS5jaGlsZHJlbjtpZih0JiZ0Lmxlbmd0aCl7bGV0IGU9WSh0WzBdKS5wYXJlbnROb2RlO2lmKGUpe2U9WShlKTtmb3IobGV0IG4saT0wO2k8dC5sZW5ndGgmJihuPXRbaV0pO2krKyllLnJlbW92ZUNoaWxkKG4pfX10aGlzLl9faW52YWxpZFByb3BzPW51bGwsdGhpcy5fX2luc3RhbmNlPW51bGx9fV9fc3luY0hvc3RQcm9wZXJ0aWVzKCl7bGV0IHQ9dGhpcy5fX2ludmFsaWRQcm9wcztpZih0KXt0aGlzLl9faW52YWxpZFByb3BzPW51bGw7Zm9yKGxldCBlIGluIHQpdGhpcy5fX2luc3RhbmNlLl9zZXRQZW5kaW5nUHJvcGVydHkoZSx0aGlzLl9fZGF0YUhvc3RbZV0pO3RoaXMuX19pbnN0YW5jZS5fZmx1c2hQcm9wZXJ0aWVzKCl9fV9zaG93SGlkZUNoaWxkcmVuKCl7Y29uc3QgdD10aGlzLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fX3x8IXRoaXMuaWY7dGhpcy5fX2luc3RhbmNlJiZCb29sZWFuKHRoaXMuX19pbnN0YW5jZS5fX2hpZGRlbikhPT10JiYodGhpcy5fX2luc3RhbmNlLl9faGlkZGVuPXQsdGhpcy5fX2luc3RhbmNlLl9zaG93SGlkZUNoaWxkcmVuKHQpKSx0fHx0aGlzLl9fc3luY0hvc3RQcm9wZXJ0aWVzKCl9fTtjdXN0b21FbGVtZW50cy5kZWZpbmUoZ28uaXMsZ28pOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpsZXQgX289SSgodD0+e2xldCBlPXllKHQpO3JldHVybiBjbGFzcyBleHRlbmRzIGV7c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7cmV0dXJue2l0ZW1zOnt0eXBlOkFycmF5fSxtdWx0aTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxzZWxlY3RlZDp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxzZWxlY3RlZEl0ZW06e3R5cGU6T2JqZWN0LG5vdGlmeTohMH0sdG9nZ2xlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fX1zdGF0aWMgZ2V0IG9ic2VydmVycygpe3JldHVyblsiX191cGRhdGVTZWxlY3Rpb24obXVsdGksIGl0ZW1zLiopIl19Y29uc3RydWN0b3IoKXtzdXBlcigpLHRoaXMuX19sYXN0SXRlbXM9bnVsbCx0aGlzLl9fbGFzdE11bHRpPW51bGwsdGhpcy5fX3NlbGVjdGVkTWFwPW51bGx9X191cGRhdGVTZWxlY3Rpb24odCxlKXtsZXQgbj1lLnBhdGg7aWYobj09SlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgiaXRlbXMiLHRoaXMpKXtsZXQgbj1lLmJhc2V8fFtdLGk9dGhpcy5fX2xhc3RJdGVtcztpZih0IT09dGhpcy5fX2xhc3RNdWx0aSYmdGhpcy5jbGVhclNlbGVjdGlvbigpLGkpe2xldCB0PVZpKG4saSk7dGhpcy5fX2FwcGx5U3BsaWNlcyh0KX10aGlzLl9fbGFzdEl0ZW1zPW4sdGhpcy5fX2xhc3RNdWx0aT10fWVsc2UgaWYoZS5wYXRoPT1gJHtKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJpdGVtcyIsdGhpcyl9LnNwbGljZXNgKXRoaXMuX19hcHBseVNwbGljZXMoZS52YWx1ZS5pbmRleFNwbGljZXMpO2Vsc2V7bGV0IHQ9bi5zbGljZShgJHtKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJpdGVtcyIsdGhpcyl9LmAubGVuZ3RoKSxlPXBhcnNlSW50KHQsMTApO3QuaW5kZXhPZigiLiIpPDAmJnQ9PWUmJnRoaXMuX19kZXNlbGVjdENoYW5nZWRJZHgoZSl9fV9fYXBwbHlTcGxpY2VzKHQpe2xldCBlPXRoaXMuX19zZWxlY3RlZE1hcDtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7bGV0IGk9dFtuXTtlLmZvckVhY2goKCh0LG4pPT57dDxpLmluZGV4fHxlLnNldChuLHQ+PWkuaW5kZXgraS5yZW1vdmVkLmxlbmd0aD90K2kuYWRkZWRDb3VudC1pLnJlbW92ZWQubGVuZ3RoOi0xKX0pKTtmb3IobGV0IHQ9MDt0PGkuYWRkZWRDb3VudDt0Kyspe2xldCBuPWkuaW5kZXgrdDtlLmhhcyh0aGlzLml0ZW1zW25dKSYmZS5zZXQodGhpcy5pdGVtc1tuXSxuKX19dGhpcy5fX3VwZGF0ZUxpbmtzKCk7bGV0IG49MDtlLmZvckVhY2goKCh0LGkpPT57dDwwPyh0aGlzLm11bHRpP3RoaXMuc3BsaWNlKEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoInNlbGVjdGVkIix0aGlzKSxuLDEpOnRoaXMuc2VsZWN0ZWQ9dGhpcy5zZWxlY3RlZEl0ZW09bnVsbCxlLmRlbGV0ZShpKSk6bisrfSkpfV9fdXBkYXRlTGlua3MoKXtpZih0aGlzLl9fZGF0YUxpbmtlZFBhdGhzPXt9LHRoaXMubXVsdGkpe2xldCB0PTA7dGhpcy5fX3NlbGVjdGVkTWFwLmZvckVhY2goKGU9PntlPj0wJiZ0aGlzLmxpbmtQYXRocyhgJHtKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJpdGVtcyIsdGhpcyl9LiR7ZX1gLGAke0pTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoInNlbGVjdGVkIix0aGlzKX0uJHt0Kyt9YCl9KSl9ZWxzZSB0aGlzLl9fc2VsZWN0ZWRNYXAuZm9yRWFjaCgodD0+e3RoaXMubGlua1BhdGhzKEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoInNlbGVjdGVkIix0aGlzKSxgJHtKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJpdGVtcyIsdGhpcyl9LiR7dH1gKSx0aGlzLmxpbmtQYXRocyhKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJzZWxlY3RlZEl0ZW0iLHRoaXMpLGAke0pTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIml0ZW1zIix0aGlzKX0uJHt0fWApfSkpfWNsZWFyU2VsZWN0aW9uKCl7dGhpcy5fX2RhdGFMaW5rZWRQYXRocz17fSx0aGlzLl9fc2VsZWN0ZWRNYXA9bmV3IE1hcCx0aGlzLnNlbGVjdGVkPXRoaXMubXVsdGk/W106bnVsbCx0aGlzLnNlbGVjdGVkSXRlbT1udWxsfWlzU2VsZWN0ZWQodCl7cmV0dXJuIHRoaXMuX19zZWxlY3RlZE1hcC5oYXModCl9aXNJbmRleFNlbGVjdGVkKHQpe3JldHVybiB0aGlzLmlzU2VsZWN0ZWQodGhpcy5pdGVtc1t0XSl9X19kZXNlbGVjdENoYW5nZWRJZHgodCl7bGV0IGU9dGhpcy5fX3NlbGVjdGVkSW5kZXhGb3JJdGVtSW5kZXgodCk7aWYoZT49MCl7bGV0IHQ9MDt0aGlzLl9fc2VsZWN0ZWRNYXAuZm9yRWFjaCgoKG4saSk9PntlPT10KysmJnRoaXMuZGVzZWxlY3QoaSl9KSl9fV9fc2VsZWN0ZWRJbmRleEZvckl0ZW1JbmRleCh0KXtsZXQgZT10aGlzLl9fZGF0YUxpbmtlZFBhdGhzW2Ake0pTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIml0ZW1zIix0aGlzKX0uJHt0fWBdO2lmKGUpcmV0dXJuIHBhcnNlSW50KGUuc2xpY2UoYCR7SlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgic2VsZWN0ZWQiLHRoaXMpfS5gLmxlbmd0aCksMTApfWRlc2VsZWN0KHQpe2xldCBlPXRoaXMuX19zZWxlY3RlZE1hcC5nZXQodCk7aWYoZT49MCl7bGV0IG47dGhpcy5fX3NlbGVjdGVkTWFwLmRlbGV0ZSh0KSx0aGlzLm11bHRpJiYobj10aGlzLl9fc2VsZWN0ZWRJbmRleEZvckl0ZW1JbmRleChlKSksdGhpcy5fX3VwZGF0ZUxpbmtzKCksdGhpcy5tdWx0aT90aGlzLnNwbGljZShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJzZWxlY3RlZCIsdGhpcyksbiwxKTp0aGlzLnNlbGVjdGVkPXRoaXMuc2VsZWN0ZWRJdGVtPW51bGx9fWRlc2VsZWN0SW5kZXgodCl7dGhpcy5kZXNlbGVjdCh0aGlzLml0ZW1zW3RdKX1zZWxlY3QodCl7dGhpcy5zZWxlY3RJbmRleCh0aGlzLml0ZW1zLmluZGV4T2YodCkpfXNlbGVjdEluZGV4KHQpe2xldCBlPXRoaXMuaXRlbXNbdF07dGhpcy5pc1NlbGVjdGVkKGUpP3RoaXMudG9nZ2xlJiZ0aGlzLmRlc2VsZWN0SW5kZXgodCk6KHRoaXMubXVsdGl8fHRoaXMuX19zZWxlY3RlZE1hcC5jbGVhcigpLHRoaXMuX19zZWxlY3RlZE1hcC5zZXQoZSx0KSx0aGlzLl9fdXBkYXRlTGlua3MoKSx0aGlzLm11bHRpP3RoaXMucHVzaChKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJzZWxlY3RlZCIsdGhpcyksZSk6dGhpcy5zZWxlY3RlZD10aGlzLnNlbGVjdGVkSXRlbT1lKX19fSkpKHdlKTtjbGFzcyB5byBleHRlbmRzIF9ve3N0YXRpYyBnZXQgaXMoKXtyZXR1cm4iYXJyYXktc2VsZWN0b3IifXN0YXRpYyBnZXQgdGVtcGxhdGUoKXtyZXR1cm4gbnVsbH19Y3VzdG9tRWxlbWVudHMuZGVmaW5lKHlvLmlzLHlvKTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3Qgdm89bmV3IGtuO3dpbmRvdy5TaGFkeUNTU3x8KHdpbmRvdy5TaGFkeUNTUz17cHJlcGFyZVRlbXBsYXRlKHQsZSxuKXt9LHByZXBhcmVUZW1wbGF0ZURvbSh0LGUpe30scHJlcGFyZVRlbXBsYXRlU3R5bGVzKHQsZSxuKXt9LHN0eWxlU3VidHJlZSh0LGUpe3ZvLnByb2Nlc3NTdHlsZXMoKSxvbih0LGUpfSxzdHlsZUVsZW1lbnQodCl7dm8ucHJvY2Vzc1N0eWxlcygpfSxzdHlsZURvY3VtZW50KHQpe3ZvLnByb2Nlc3NTdHlsZXMoKSxvbihkb2N1bWVudC5ib2R5LHQpfSxnZXRDb21wdXRlZFN0eWxlVmFsdWU6KHQsZSk9PmFuKHQsZSksZmx1c2hDdXN0b21TdHlsZXMoKXt9LG5hdGl2ZUNzczpJZSxuYXRpdmVTaGFkb3c6QWUsY3NzQnVpbGQ6TGUsZGlzYWJsZVJ1bnRpbWU6TmV9KSx3aW5kb3cuU2hhZHlDU1MuQ3VzdG9tU3R5bGVJbnRlcmZhY2U9dm87Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IGJvPSJpbmNsdWRlIix4bz13aW5kb3cuU2hhZHlDU1MuQ3VzdG9tU3R5bGVJbnRlcmZhY2U7Y2xhc3Mgd28gZXh0ZW5kcyBIVE1MRWxlbWVudHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5fc3R5bGU9bnVsbCx4by5hZGRDdXN0b21TdHlsZSh0aGlzKX1nZXRTdHlsZSgpe2lmKHRoaXMuX3N0eWxlKXJldHVybiB0aGlzLl9zdHlsZTtjb25zdCB0PXRoaXMucXVlcnlTZWxlY3Rvcigic3R5bGUiKTtpZighdClyZXR1cm4gbnVsbDt0aGlzLl9zdHlsZT10O2NvbnN0IGU9dC5nZXRBdHRyaWJ1dGUoYm8pO3JldHVybiBlJiYodC5yZW1vdmVBdHRyaWJ1dGUoYm8pLHQudGV4dENvbnRlbnQ9KGZ1bmN0aW9uIG4odCl7bGV0IGU9dC50cmltKCkuc3BsaXQoL1xzKy8pLG49IiI7Zm9yKGxldCB0PTA7dDxlLmxlbmd0aDt0Kyspbis9cShlW3RdKTtyZXR1cm4gbn0pKGUpK3QudGV4dENvbnRlbnQpLHRoaXMub3duZXJEb2N1bWVudCE9PXdpbmRvdy5kb2N1bWVudCYmd2luZG93LmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodGhpcyksdGhpcy5fc3R5bGV9fQovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpsZXQgU287d2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgiY3VzdG9tLXN0eWxlIix3byksU289V3IuX211dGFibGVQcm9wZXJ0eUNoYW5nZTtjb25zdCBNbz17cHJvcGVydGllczp7bXV0YWJsZURhdGE6Qm9vbGVhbn0sX3Nob3VsZFByb3BlcnR5Q2hhbmdlKHQsZSxuKXtyZXR1cm4gU28odGhpcyx0LGUsbix0aGlzLm11dGFibGVEYXRhKX19LEVvPWNyKEhUTUxFbGVtZW50KS5wcm90b3R5cGU7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCi8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwp2YXIgVG89bmV3IFNldDtjb25zdCBDbz17cHJvcGVydGllczp7X3BhcmVudFJlc2l6YWJsZTp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il9wYXJlbnRSZXNpemFibGVDaGFuZ2VkIn0sX25vdGlmeWluZ0Rlc2NlbmRhbnQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX19LGxpc3RlbmVyczp7Imlyb24tcmVxdWVzdC1yZXNpemUtbm90aWZpY2F0aW9ucyI6Il9vbklyb25SZXF1ZXN0UmVzaXplTm90aWZpY2F0aW9ucyJ9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcz1bXSx0aGlzLl9ib3VuZE5vdGlmeVJlc2l6ZT10aGlzLm5vdGlmeVJlc2l6ZS5iaW5kKHRoaXMpLHRoaXMuX2JvdW5kT25EZXNjZW5kYW50SXJvblJlc2l6ZT10aGlzLl9vbkRlc2NlbmRhbnRJcm9uUmVzaXplLmJpbmQodGhpcyl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fcmVxdWVzdFJlc2l6ZU5vdGlmaWNhdGlvbnMoKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9wYXJlbnRSZXNpemFibGU/dGhpcy5fcGFyZW50UmVzaXphYmxlLnN0b3BSZXNpemVOb3RpZmljYXRpb25zRm9yKHRoaXMpOihUby5kZWxldGUodGhpcyksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlc2l6ZSIsdGhpcy5fYm91bmROb3RpZnlSZXNpemUpKSx0aGlzLl9wYXJlbnRSZXNpemFibGU9bnVsbH0sbm90aWZ5UmVzaXplOmZ1bmN0aW9uKCl7dGhpcy5pc0F0dGFjaGVkJiYodGhpcy5faW50ZXJlc3RlZFJlc2l6YWJsZXMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dGhpcy5yZXNpemVyU2hvdWxkTm90aWZ5KHQpJiZ0aGlzLl9ub3RpZnlEZXNjZW5kYW50KHQpfSksdGhpcyksdGhpcy5fZmlyZVJlc2l6ZSgpKX0sYXNzaWduUGFyZW50UmVzaXphYmxlOmZ1bmN0aW9uKHQpe3RoaXMuX3BhcmVudFJlc2l6YWJsZSYmdGhpcy5fcGFyZW50UmVzaXphYmxlLnN0b3BSZXNpemVOb3RpZmljYXRpb25zRm9yKHRoaXMpLHRoaXMuX3BhcmVudFJlc2l6YWJsZT10LHQmJi0xPT09dC5faW50ZXJlc3RlZFJlc2l6YWJsZXMuaW5kZXhPZih0aGlzKSYmKHQuX2ludGVyZXN0ZWRSZXNpemFibGVzLnB1c2godGhpcyksdC5fc3Vic2NyaWJlSXJvblJlc2l6ZSh0aGlzKSl9LHN0b3BSZXNpemVOb3RpZmljYXRpb25zRm9yOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2ludGVyZXN0ZWRSZXNpemFibGVzLmluZGV4T2YodCk7ZT4tMSYmKHRoaXMuX2ludGVyZXN0ZWRSZXNpemFibGVzLnNwbGljZShlLDEpLHRoaXMuX3Vuc3Vic2NyaWJlSXJvblJlc2l6ZSh0KSl9LF9zdWJzY3JpYmVJcm9uUmVzaXplOmZ1bmN0aW9uKHQpe3QuYWRkRXZlbnRMaXN0ZW5lcigiaXJvbi1yZXNpemUiLHRoaXMuX2JvdW5kT25EZXNjZW5kYW50SXJvblJlc2l6ZSl9LF91bnN1YnNjcmliZUlyb25SZXNpemU6ZnVuY3Rpb24odCl7dC5yZW1vdmVFdmVudExpc3RlbmVyKCJpcm9uLXJlc2l6ZSIsdGhpcy5fYm91bmRPbkRlc2NlbmRhbnRJcm9uUmVzaXplKX0scmVzaXplclNob3VsZE5vdGlmeTpmdW5jdGlvbih0KXtyZXR1cm4hMH0sX29uRGVzY2VuZGFudElyb25SZXNpemU6ZnVuY3Rpb24odCl7dGhpcy5fbm90aWZ5aW5nRGVzY2VuZGFudD90LnN0b3BQcm9wYWdhdGlvbigpOm18fHRoaXMuX2ZpcmVSZXNpemUoKX0sX2ZpcmVSZXNpemU6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoImlyb24tcmVzaXplIixudWxsLHtub2RlOnRoaXMsYnViYmxlczohMX0pfSxfb25Jcm9uUmVxdWVzdFJlc2l6ZU5vdGlmaWNhdGlvbnM6ZnVuY3Rpb24odCl7dmFyIGU9ZXIodCkucm9vdFRhcmdldDtlIT09dGhpcyYmKGUuYXNzaWduUGFyZW50UmVzaXphYmxlKHRoaXMpLHRoaXMuX25vdGlmeURlc2NlbmRhbnQoZSksdC5zdG9wUHJvcGFnYXRpb24oKSl9LF9wYXJlbnRSZXNpemFibGVDaGFuZ2VkOmZ1bmN0aW9uKHQpe3QmJndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJyZXNpemUiLHRoaXMuX2JvdW5kTm90aWZ5UmVzaXplKX0sX25vdGlmeURlc2NlbmRhbnQ6ZnVuY3Rpb24odCl7dGhpcy5pc0F0dGFjaGVkJiYodGhpcy5fbm90aWZ5aW5nRGVzY2VuZGFudD0hMCx0Lm5vdGlmeVJlc2l6ZSgpLHRoaXMuX25vdGlmeWluZ0Rlc2NlbmRhbnQ9ITEpfSxfcmVxdWVzdFJlc2l6ZU5vdGlmaWNhdGlvbnM6ZnVuY3Rpb24oKXtpZih0aGlzLmlzQXR0YWNoZWQpaWYoImxvYWRpbmciPT09ZG9jdW1lbnQucmVhZHlTdGF0ZSl7dmFyIHQ9dGhpcy5fcmVxdWVzdFJlc2l6ZU5vdGlmaWNhdGlvbnMuYmluZCh0aGlzKTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJyZWFkeXN0YXRlY2hhbmdlIiwoZnVuY3Rpb24gZSgpe2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoInJlYWR5c3RhdGVjaGFuZ2UiLGUpLHQoKX0pKX1lbHNlIHRoaXMuX2ZpbmRQYXJlbnQoKSx0aGlzLl9wYXJlbnRSZXNpemFibGU/dGhpcy5fcGFyZW50UmVzaXphYmxlLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5mb3JFYWNoKChmdW5jdGlvbih0KXt0IT09dGhpcyYmdC5fZmluZFBhcmVudCgpfSksdGhpcyk6KFRvLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QhPT10aGlzJiZ0Ll9maW5kUGFyZW50KCl9KSx0aGlzKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicmVzaXplIix0aGlzLl9ib3VuZE5vdGlmeVJlc2l6ZSksdGhpcy5ub3RpZnlSZXNpemUoKSl9LF9maW5kUGFyZW50OmZ1bmN0aW9uKCl7dGhpcy5hc3NpZ25QYXJlbnRSZXNpemFibGUobnVsbCksdGhpcy5maXJlKCJpcm9uLXJlcXVlc3QtcmVzaXplLW5vdGlmaWNhdGlvbnMiLG51bGwse25vZGU6dGhpcyxidWJibGVzOiEwLGNhbmNlbGFibGU6ITB9KSx0aGlzLl9wYXJlbnRSZXNpemFibGU/VG8uZGVsZXRlKHRoaXMpOlRvLmFkZCh0aGlzKX19O3ZhciBBbz1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxJcm9uUmVzaXphYmxlQmVoYXZpb3I6Q299KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovanIoe190ZW1wbGF0ZTp4ZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IHZhcigtLWlyb24tY29sbGFwc2UtdHJhbnNpdGlvbi1kdXJhdGlvbiwgMzAwbXMpOwogICAgICAgIC8qIFNhZmFyaSAxMCBuZWVkcyB0aGlzIHByb3BlcnR5IHByZWZpeGVkIHRvIGNvcnJlY3RseSBhcHBseSB0aGUgY3VzdG9tIHByb3BlcnR5ICovCiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLWR1cmF0aW9uOiB2YXIoLS1pcm9uLWNvbGxhcHNlLXRyYW5zaXRpb24tZHVyYXRpb24sIDMwMG1zKTsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgfQoKICAgICAgOmhvc3QoLmlyb24tY29sbGFwc2UtY2xvc2VkKSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdCguaXJvbi1jb2xsYXBzZS1vcGVuZWQpKSB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CmAsaXM6Imlyb24tY29sbGFwc2UiLGJlaGF2aW9yczpbQ29dLHByb3BlcnRpZXM6e2hvcml6b250YWw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2hvcml6b250YWxDaGFuZ2VkIn0sb3BlbmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwLG9ic2VydmVyOiJfb3BlbmVkQ2hhbmdlZCJ9LHRyYW5zaXRpb25pbmc6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAscmVhZE9ubHk6ITB9LG5vQW5pbWF0aW9uOnt0eXBlOkJvb2xlYW59LF9kZXNpcmVkU2l6ZTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9fSxnZXQgZGltZW5zaW9uKCl7cmV0dXJuIHRoaXMuaG9yaXpvbnRhbD8id2lkdGgiOiJoZWlnaHQifSxnZXQgX2RpbWVuc2lvbk1heCgpe3JldHVybiB0aGlzLmhvcml6b250YWw/Im1heFdpZHRoIjoibWF4SGVpZ2h0In0sZ2V0IF9kaW1lbnNpb25NYXhDc3MoKXtyZXR1cm4gdGhpcy5ob3Jpem9udGFsPyJtYXgtd2lkdGgiOiJtYXgtaGVpZ2h0In0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6Imdyb3VwIiwiYXJpYS1oaWRkZW4iOiJ0cnVlIn0sbGlzdGVuZXJzOnt0cmFuc2l0aW9uZW5kOiJfb25UcmFuc2l0aW9uRW5kIn0sdG9nZ2xlOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ9IXRoaXMub3BlbmVkfSxzaG93OmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ9ITB9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMX0sdXBkYXRlU2l6ZTpmdW5jdGlvbih0LGUpe3Q9ImF1dG8iPT09dD8iIjp0O3ZhciBuPWUmJiF0aGlzLm5vQW5pbWF0aW9uJiZ0aGlzLmlzQXR0YWNoZWQmJnRoaXMuX2Rlc2lyZWRTaXplIT09dDtpZih0aGlzLl9kZXNpcmVkU2l6ZT10LHRoaXMuX3VwZGF0ZVRyYW5zaXRpb24oITEpLG4pe3ZhciBpPXRoaXMuX2NhbGNTaXplKCk7IiI9PT10JiYodGhpcy5zdHlsZVt0aGlzLl9kaW1lbnNpb25NYXhdPSIiLHQ9dGhpcy5fY2FsY1NpemUoKSksdGhpcy5zdHlsZVt0aGlzLl9kaW1lbnNpb25NYXhdPWksdGhpcy5zY3JvbGxUb3A9dGhpcy5zY3JvbGxUb3AsdGhpcy5fdXBkYXRlVHJhbnNpdGlvbighMCksbj10IT09aX10aGlzLnN0eWxlW3RoaXMuX2RpbWVuc2lvbk1heF09dCxufHx0aGlzLl90cmFuc2l0aW9uRW5kKCl9LGVuYWJsZVRyYW5zaXRpb246ZnVuY3Rpb24odCl7RW8uX3dhcm4oImBlbmFibGVUcmFuc2l0aW9uKClgIGlzIGRlcHJlY2F0ZWQsIHVzZSBgbm9BbmltYXRpb25gIGluc3RlYWQuIiksdGhpcy5ub0FuaW1hdGlvbj0hdH0sX3VwZGF0ZVRyYW5zaXRpb246ZnVuY3Rpb24odCl7dGhpcy5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb249dCYmIXRoaXMubm9BbmltYXRpb24/IiI6IjBzIn0sX2hvcml6b250YWxDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5zdHlsZS50cmFuc2l0aW9uUHJvcGVydHk9dGhpcy5fZGltZW5zaW9uTWF4Q3NzLHRoaXMuc3R5bGVbIm1heFdpZHRoIj09PXRoaXMuX2RpbWVuc2lvbk1heD8ibWF4SGVpZ2h0IjoibWF4V2lkdGgiXT0iIix0aGlzLnVwZGF0ZVNpemUodGhpcy5vcGVuZWQ/ImF1dG8iOiIwcHgiLCExKX0sX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1oaWRkZW4iLCF0aGlzLm9wZW5lZCksdGhpcy5fc2V0VHJhbnNpdGlvbmluZyghMCksdGhpcy50b2dnbGVDbGFzcygiaXJvbi1jb2xsYXBzZS1jbG9zZWQiLCExKSx0aGlzLnRvZ2dsZUNsYXNzKCJpcm9uLWNvbGxhcHNlLW9wZW5lZCIsITEpLHRoaXMudXBkYXRlU2l6ZSh0aGlzLm9wZW5lZD8iYXV0byI6IjBweCIsITApLHRoaXMub3BlbmVkJiZ0aGlzLmZvY3VzKCl9LF90cmFuc2l0aW9uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHlsZVt0aGlzLl9kaW1lbnNpb25NYXhdPXRoaXMuX2Rlc2lyZWRTaXplLHRoaXMudG9nZ2xlQ2xhc3MoImlyb24tY29sbGFwc2UtY2xvc2VkIiwhdGhpcy5vcGVuZWQpLHRoaXMudG9nZ2xlQ2xhc3MoImlyb24tY29sbGFwc2Utb3BlbmVkIix0aGlzLm9wZW5lZCksdGhpcy5fdXBkYXRlVHJhbnNpdGlvbighMSksdGhpcy5ub3RpZnlSZXNpemUoKSx0aGlzLl9zZXRUcmFuc2l0aW9uaW5nKCExKX0sX29uVHJhbnNpdGlvbkVuZDpmdW5jdGlvbih0KXtlcih0KS5yb290VGFyZ2V0PT09dGhpcyYmdGhpcy5fdHJhbnNpdGlvbkVuZCgpfSxfY2FsY1NpemU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVt0aGlzLmRpbWVuc2lvbl0rInB4In19KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IGtvPXhlYAovKiBNb3N0IGNvbW1vbiB1c2VkIGZsZXggc3R5bGVzKi8KPGRvbS1tb2R1bGUgaWQ9Imlyb24tZmxleCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAubGF5b3V0Lmhvcml6b250YWwsCiAgICAgIC5sYXlvdXQudmVydGljYWwgewogICAgICAgIGRpc3BsYXk6IC1tcy1mbGV4Ym94OwogICAgICAgIGRpc3BsYXk6IC13ZWJraXQtZmxleDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICAubGF5b3V0LmlubGluZSB7CiAgICAgICAgZGlzcGxheTogLW1zLWlubGluZS1mbGV4Ym94OwogICAgICAgIGRpc3BsYXk6IC13ZWJraXQtaW5saW5lLWZsZXg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuaG9yaXpvbnRhbCB7CiAgICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQudmVydGljYWwgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICAubGF5b3V0LndyYXAgewogICAgICAgIC1tcy1mbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgLXdlYmtpdC1mbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9CgogICAgICAubGF5b3V0Lm5vLXdyYXAgewogICAgICAgIC1tcy1mbGV4LXdyYXA6IG5vd3JhcDsKICAgICAgICAtd2Via2l0LWZsZXgtd3JhcDogbm93cmFwOwogICAgICAgIGZsZXgtd3JhcDogbm93cmFwOwogICAgICB9CgogICAgICAubGF5b3V0LmNlbnRlciwKICAgICAgLmxheW91dC5jZW50ZXItY2VudGVyIHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogY2VudGVyOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9CgogICAgICAubGF5b3V0LmNlbnRlci1qdXN0aWZpZWQsCiAgICAgIC5sYXlvdXQuY2VudGVyLWNlbnRlciB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogY2VudGVyOwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5mbGV4IHsKICAgICAgICAtbXMtZmxleDogMSAxIDAuMDAwMDAwMDAxcHg7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxOwogICAgICAgIGZsZXg6IDE7CiAgICAgICAgLXdlYmtpdC1mbGV4LWJhc2lzOiAwLjAwMDAwMDAwMXB4OwogICAgICAgIGZsZXgtYmFzaXM6IDAuMDAwMDAwMDAxcHg7CiAgICAgIH0KCiAgICAgIC5mbGV4LWF1dG8gewogICAgICAgIC1tcy1mbGV4OiAxIDEgYXV0bzsKICAgICAgICAtd2Via2l0LWZsZXg6IDEgMSBhdXRvOwogICAgICAgIGZsZXg6IDEgMSBhdXRvOwogICAgICB9CgogICAgICAuZmxleC1ub25lIHsKICAgICAgICAtbXMtZmxleDogbm9uZTsKICAgICAgICAtd2Via2l0LWZsZXg6IG5vbmU7CiAgICAgICAgZmxleDogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+Ci8qIEJhc2ljIGZsZXhib3ggcmV2ZXJzZSBzdHlsZXMgKi8KPGRvbS1tb2R1bGUgaWQ9Imlyb24tZmxleC1yZXZlcnNlIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIC5sYXlvdXQuaG9yaXpvbnRhbC1yZXZlcnNlLAogICAgICAubGF5b3V0LnZlcnRpY2FsLXJldmVyc2UgewogICAgICAgIGRpc3BsYXk6IC1tcy1mbGV4Ym94OwogICAgICAgIGRpc3BsYXk6IC13ZWJraXQtZmxleDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICAubGF5b3V0Lmhvcml6b250YWwtcmV2ZXJzZSB7CiAgICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQudmVydGljYWwtcmV2ZXJzZSB7CiAgICAgICAgLW1zLWZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQud3JhcC1yZXZlcnNlIHsKICAgICAgICAtbXMtZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LXdyYXA6IHdyYXAtcmV2ZXJzZTsKICAgICAgICBmbGV4LXdyYXA6IHdyYXAtcmV2ZXJzZTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+Ci8qIEZsZXhib3ggYWxpZ25tZW50ICovCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgtYWxpZ25tZW50Ij4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIC8qKgogICAgICAgKiBBbGlnbm1lbnQgaW4gY3Jvc3MgYXhpcy4KICAgICAgICovCiAgICAgIC5sYXlvdXQuc3RhcnQgewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBzdGFydDsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LXN0YXJ0OwogICAgICB9CgogICAgICAubGF5b3V0LmNlbnRlciwKICAgICAgLmxheW91dC5jZW50ZXItY2VudGVyIHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogY2VudGVyOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICB9CgogICAgICAubGF5b3V0LmVuZCB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGVuZDsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1pdGVtczogZmxleC1lbmQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuYmFzZWxpbmUgewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBiYXNlbGluZTsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgICAgICBhbGlnbi1pdGVtczogYmFzZWxpbmU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBbGlnbm1lbnQgaW4gbWFpbiBheGlzLgogICAgICAgKi8KICAgICAgLmxheW91dC5zdGFydC1qdXN0aWZpZWQgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IHN0YXJ0OwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXItanVzdGlmaWVkLAogICAgICAubGF5b3V0LmNlbnRlci1jZW50ZXIgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9CgogICAgICAubGF5b3V0LmVuZC1qdXN0aWZpZWQgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGVuZDsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgfQoKICAgICAgLmxheW91dC5hcm91bmQtanVzdGlmaWVkIHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBkaXN0cmlidXRlOwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuanVzdGlmaWVkIHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBqdXN0aWZ5OwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNlbGYgYWxpZ25tZW50LgogICAgICAgKi8KICAgICAgLnNlbGYtc3RhcnQgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICB9CgogICAgICAuc2VsZi1jZW50ZXIgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICB9CgogICAgICAuc2VsZi1lbmQgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLXNlbGY6IGZsZXgtZW5kOwogICAgICB9CgogICAgICAuc2VsZi1zdHJldGNoIHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IHN0cmV0Y2g7CiAgICAgICAgYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgfQoKICAgICAgLnNlbGYtYmFzZWxpbmUgewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBiYXNlbGluZTsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICB9CgogICAgICAvKioKICAgICAgICogbXVsdGktbGluZSBhbGlnbm1lbnQgaW4gbWFpbiBheGlzLgogICAgICAgKi8KICAgICAgLmxheW91dC5zdGFydC1hbGlnbmVkIHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IHN0YXJ0OyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICB9CgogICAgICAubGF5b3V0LmVuZC1hbGlnbmVkIHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGVuZDsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1jb250ZW50OiBmbGV4LWVuZDsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXItYWxpZ25lZCB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBjZW50ZXI7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBhbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuYmV0d2Vlbi1hbGlnbmVkIHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGp1c3RpZnk7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuYXJvdW5kLWFsaWduZWQgewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogZGlzdHJpYnV0ZTsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIGFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+Ci8qIE5vbi1mbGV4Ym94IHBvc2l0aW9uaW5nIGhlbHBlciBzdHlsZXMgKi8KPGRvbS1tb2R1bGUgaWQ9Imlyb24tZmxleC1mYWN0b3JzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIC5mbGV4LAogICAgICAuZmxleC0xIHsKICAgICAgICAtbXMtZmxleDogMSAxIDAuMDAwMDAwMDAxcHg7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxOwogICAgICAgIGZsZXg6IDE7CiAgICAgICAgLXdlYmtpdC1mbGV4LWJhc2lzOiAwLjAwMDAwMDAwMXB4OwogICAgICAgIGZsZXgtYmFzaXM6IDAuMDAwMDAwMDAxcHg7CiAgICAgIH0KCiAgICAgIC5mbGV4LTIgewogICAgICAgIC1tcy1mbGV4OiAyOwogICAgICAgIC13ZWJraXQtZmxleDogMjsKICAgICAgICBmbGV4OiAyOwogICAgICB9CgogICAgICAuZmxleC0zIHsKICAgICAgICAtbXMtZmxleDogMzsKICAgICAgICAtd2Via2l0LWZsZXg6IDM7CiAgICAgICAgZmxleDogMzsKICAgICAgfQoKICAgICAgLmZsZXgtNCB7CiAgICAgICAgLW1zLWZsZXg6IDQ7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA0OwogICAgICAgIGZsZXg6IDQ7CiAgICAgIH0KCiAgICAgIC5mbGV4LTUgewogICAgICAgIC1tcy1mbGV4OiA1OwogICAgICAgIC13ZWJraXQtZmxleDogNTsKICAgICAgICBmbGV4OiA1OwogICAgICB9CgogICAgICAuZmxleC02IHsKICAgICAgICAtbXMtZmxleDogNjsKICAgICAgICAtd2Via2l0LWZsZXg6IDY7CiAgICAgICAgZmxleDogNjsKICAgICAgfQoKICAgICAgLmZsZXgtNyB7CiAgICAgICAgLW1zLWZsZXg6IDc7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA3OwogICAgICAgIGZsZXg6IDc7CiAgICAgIH0KCiAgICAgIC5mbGV4LTggewogICAgICAgIC1tcy1mbGV4OiA4OwogICAgICAgIC13ZWJraXQtZmxleDogODsKICAgICAgICBmbGV4OiA4OwogICAgICB9CgogICAgICAuZmxleC05IHsKICAgICAgICAtbXMtZmxleDogOTsKICAgICAgICAtd2Via2l0LWZsZXg6IDk7CiAgICAgICAgZmxleDogOTsKICAgICAgfQoKICAgICAgLmZsZXgtMTAgewogICAgICAgIC1tcy1mbGV4OiAxMDsKICAgICAgICAtd2Via2l0LWZsZXg6IDEwOwogICAgICAgIGZsZXg6IDEwOwogICAgICB9CgogICAgICAuZmxleC0xMSB7CiAgICAgICAgLW1zLWZsZXg6IDExOwogICAgICAgIC13ZWJraXQtZmxleDogMTE7CiAgICAgICAgZmxleDogMTE7CiAgICAgIH0KCiAgICAgIC5mbGV4LTEyIHsKICAgICAgICAtbXMtZmxleDogMTI7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxMjsKICAgICAgICBmbGV4OiAxMjsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+Cjxkb20tbW9kdWxlIGlkPSJpcm9uLXBvc2l0aW9uaW5nIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIC5ibG9jayB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIFtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5pbnZpc2libGUgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbiAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAucmVsYXRpdmUgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgLmZpdCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQoKICAgICAgYm9keS5mdWxsYmxlZWQgewogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBoZWlnaHQ6IDEwMHZoOwogICAgICB9CgogICAgICAuc2Nyb2xsIHsKICAgICAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KCiAgICAgIC8qIGZpeGVkIHBvc2l0aW9uICovCiAgICAgIC5maXhlZC1ib3R0b20sCiAgICAgIC5maXhlZC1sZWZ0LAogICAgICAuZml4ZWQtcmlnaHQsCiAgICAgIC5maXhlZC10b3AgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgfQoKICAgICAgLmZpeGVkLXRvcCB7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH0KCiAgICAgIC5maXhlZC1yaWdodCB7CiAgICAgICAgdG9wOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgfQoKICAgICAgLmZpeGVkLWJvdHRvbSB7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIC5maXhlZC1sZWZ0IHsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgpgO2tvLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJkaXNwbGF5OiBub25lOyIpLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoa28uY29udGVudCk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBMbz14ZWAKPGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBbaGlkZGVuXSB7CiAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgIH0KICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT4KPGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBodG1sIHsKCiAgICAgIC0tbGF5b3V0OiB7CiAgICAgICAgZGlzcGxheTogLW1zLWZsZXhib3g7CiAgICAgICAgZGlzcGxheTogLXdlYmtpdC1mbGV4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH07CgogICAgICAtLWxheW91dC1pbmxpbmU6IHsKICAgICAgICBkaXNwbGF5OiAtbXMtaW5saW5lLWZsZXhib3g7CiAgICAgICAgZGlzcGxheTogLXdlYmtpdC1pbmxpbmUtZmxleDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWhvcml6b250YWw6IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CgogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtaG9yaXpvbnRhbC1yZXZlcnNlOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0OwoKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXZlcnRpY2FsOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0OwoKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXZlcnRpY2FsLXJldmVyc2U6IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CgogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtd3JhcDogewogICAgICAgIC1tcy1mbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgLXdlYmtpdC1mbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtd3JhcC1yZXZlcnNlOiB7CiAgICAgICAgLW1zLWZsZXgtd3JhcDogd3JhcC1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgICAgZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LWF1dG86IHsKICAgICAgICAtbXMtZmxleDogMSAxIGF1dG87CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxIDEgYXV0bzsKICAgICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtbm9uZTogewogICAgICAgIC1tcy1mbGV4OiBub25lOwogICAgICAgIC13ZWJraXQtZmxleDogbm9uZTsKICAgICAgICBmbGV4OiBub25lOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleDogewogICAgICAgIC1tcy1mbGV4OiAxIDEgMC4wMDAwMDAwMDFweDsKICAgICAgICAtd2Via2l0LWZsZXg6IDE7CiAgICAgICAgZmxleDogMTsKICAgICAgICAtd2Via2l0LWZsZXgtYmFzaXM6IDAuMDAwMDAwMDAxcHg7CiAgICAgICAgZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtMjogewogICAgICAgIC1tcy1mbGV4OiAyOwogICAgICAgIC13ZWJraXQtZmxleDogMjsKICAgICAgICBmbGV4OiAyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC0zOiB7CiAgICAgICAgLW1zLWZsZXg6IDM7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAzOwogICAgICAgIGZsZXg6IDM7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTQ6IHsKICAgICAgICAtbXMtZmxleDogNDsKICAgICAgICAtd2Via2l0LWZsZXg6IDQ7CiAgICAgICAgZmxleDogNDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtNTogewogICAgICAgIC1tcy1mbGV4OiA1OwogICAgICAgIC13ZWJraXQtZmxleDogNTsKICAgICAgICBmbGV4OiA1OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC02OiB7CiAgICAgICAgLW1zLWZsZXg6IDY7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA2OwogICAgICAgIGZsZXg6IDY7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTc6IHsKICAgICAgICAtbXMtZmxleDogNzsKICAgICAgICAtd2Via2l0LWZsZXg6IDc7CiAgICAgICAgZmxleDogNzsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtODogewogICAgICAgIC1tcy1mbGV4OiA4OwogICAgICAgIC13ZWJraXQtZmxleDogODsKICAgICAgICBmbGV4OiA4OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC05OiB7CiAgICAgICAgLW1zLWZsZXg6IDk7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA5OwogICAgICAgIGZsZXg6IDk7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTEwOiB7CiAgICAgICAgLW1zLWZsZXg6IDEwOwogICAgICAgIC13ZWJraXQtZmxleDogMTA7CiAgICAgICAgZmxleDogMTA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTExOiB7CiAgICAgICAgLW1zLWZsZXg6IDExOwogICAgICAgIC13ZWJraXQtZmxleDogMTE7CiAgICAgICAgZmxleDogMTE7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTEyOiB7CiAgICAgICAgLW1zLWZsZXg6IDEyOwogICAgICAgIC13ZWJraXQtZmxleDogMTI7CiAgICAgICAgZmxleDogMTI7CiAgICAgIH07CgogICAgICAvKiBhbGlnbm1lbnQgaW4gY3Jvc3MgYXhpcyAqLwoKICAgICAgLS1sYXlvdXQtc3RhcnQ6IHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWNlbnRlcjogewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIH07CgogICAgICAtLWxheW91dC1lbmQ6IHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWJhc2VsaW5lOiB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGJhc2VsaW5lOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgICAgfTsKCiAgICAgIC8qIGFsaWdubWVudCBpbiBtYWluIGF4aXMgKi8KCiAgICAgIC0tbGF5b3V0LXN0YXJ0LWp1c3RpZmllZDogewogICAgICAgIC1tcy1mbGV4LXBhY2s6IHN0YXJ0OwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWNlbnRlci1qdXN0aWZpZWQ6IHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWVuZC1qdXN0aWZpZWQ6IHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBlbmQ7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1hcm91bmQtanVzdGlmaWVkOiB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogZGlzdHJpYnV0ZTsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtanVzdGlmaWVkOiB7CiAgICAgICAgLW1zLWZsZXgtcGFjazoganVzdGlmeTsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH07CgogICAgICAtLWxheW91dC1jZW50ZXItY2VudGVyOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgfTsKCiAgICAgIC8qIHNlbGYgYWxpZ25tZW50ICovCgogICAgICAtLWxheW91dC1zZWxmLXN0YXJ0OiB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICAgIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1zZWxmLWNlbnRlcjogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtc2VsZi1lbmQ6IHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogZmxleC1lbmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXNlbGYtc3RyZXRjaDogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgICBhbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtc2VsZi1iYXNlbGluZTogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBiYXNlbGluZTsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICB9OwoKICAgICAgLyogbXVsdGktbGluZSBhbGlnbm1lbnQgaW4gbWFpbiBheGlzICovCgogICAgICAtLWxheW91dC1zdGFydC1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBzdGFydDsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWVuZC1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBlbmQ7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1jZW50ZXItYWxpZ25lZDogewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogY2VudGVyOyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgYWxpZ24tY29udGVudDogY2VudGVyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtYmV0d2Vlbi1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBqdXN0aWZ5OyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBhbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtYXJvdW5kLWFsaWduZWQ6IHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGRpc3RyaWJ1dGU7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICBhbGlnbi1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgIH07CgogICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgT3RoZXIgTGF5b3V0CiAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICAtLWxheW91dC1ibG9jazogewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtaW52aXNpYmxlOiB7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuICFpbXBvcnRhbnQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1yZWxhdGl2ZTogewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZpdDogewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1zY3JvbGw6IHsKICAgICAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH07CgogICAgICAtLWxheW91dC1mdWxsYmxlZWQ6IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgfTsKCiAgICAgIC8qIGZpeGVkIHBvc2l0aW9uICovCgogICAgICAtLWxheW91dC1maXhlZC10b3A6IHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1maXhlZC1yaWdodDogewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZml4ZWQtYm90dG9tOiB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZml4ZWQtbGVmdDogewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH07CgogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPmA7TG8uc2V0QXR0cmlidXRlKCJzdHlsZSIsImRpc3BsYXk6IG5vbmU7IiksZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChMby5jb250ZW50KTt2YXIgUG89ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtQby50ZXh0Q29udGVudD0iW2hpZGRlbl0geyBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7IH0iLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoUG8pOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY2xhc3MgTm97Y29uc3RydWN0b3IodCl7Tm9bIiAiXSh0KSx0aGlzLnR5cGU9dCYmdC50eXBlfHwiZGVmYXVsdCIsdGhpcy5rZXk9dCYmdC5rZXksdCYmInZhbHVlImluIHQmJih0aGlzLnZhbHVlPXQudmFsdWUpfWdldCB2YWx1ZSgpe3ZhciB0PXRoaXMudHlwZSxlPXRoaXMua2V5O2lmKHQmJmUpcmV0dXJuIE5vLnR5cGVzW3RdJiZOby50eXBlc1t0XVtlXX1zZXQgdmFsdWUodCl7dmFyIGU9dGhpcy50eXBlLG49dGhpcy5rZXk7ZSYmbiYmKGU9Tm8udHlwZXNbZV09Tm8udHlwZXNbZV18fHt9LG51bGw9PXQ/ZGVsZXRlIGVbbl06ZVtuXT10KX1nZXQgbGlzdCgpe2lmKHRoaXMudHlwZSl7dmFyIHQ9Tm8udHlwZXNbdGhpcy50eXBlXTtyZXR1cm4gdD9PYmplY3Qua2V5cyh0KS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBJb1t0aGlzLnR5cGVdW3RdfSksdGhpcyk6W119fWJ5S2V5KHQpe3JldHVybiB0aGlzLmtleT10LHRoaXMudmFsdWV9fU5vWyIgIl09ZnVuY3Rpb24oKXt9LE5vLnR5cGVzPXt9O3ZhciBJbz1Oby50eXBlcztqcih7aXM6Imlyb24tbWV0YSIscHJvcGVydGllczp7dHlwZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImRlZmF1bHQifSxrZXk6e3R5cGU6U3RyaW5nfSx2YWx1ZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxzZWxmOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9zZWxmQ2hhbmdlZCJ9LF9fbWV0YTp7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfX2NvbXB1dGVNZXRhKHR5cGUsIGtleSwgdmFsdWUpIn19LGhvc3RBdHRyaWJ1dGVzOntoaWRkZW46ITB9LF9fY29tcHV0ZU1ldGE6ZnVuY3Rpb24odCxlLG4pe3ZhciBpPW5ldyBObyh7dHlwZTp0LGtleTplfSk7cmV0dXJuIHZvaWQgMCE9PW4mJm4hPT1pLnZhbHVlP2kudmFsdWU9bjp0aGlzLnZhbHVlIT09aS52YWx1ZSYmKHRoaXMudmFsdWU9aS52YWx1ZSksaX0sZ2V0IGxpc3QoKXtyZXR1cm4gdGhpcy5fX21ldGEmJnRoaXMuX19tZXRhLmxpc3R9LF9zZWxmQ2hhbmdlZDpmdW5jdGlvbih0KXt0JiYodGhpcy52YWx1ZT10aGlzKX0sYnlLZXk6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBObyh7dHlwZTp0aGlzLnR5cGUsa2V5OnR9KS52YWx1ZX19KSwKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmpyKHtfdGVtcGxhdGU6eGVgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaW5saW5lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItY2VudGVyOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKCiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKCiAgICAgICAgZmlsbDogdmFyKC0taXJvbi1pY29uLWZpbGwtY29sb3IsIGN1cnJlbnRjb2xvcik7CiAgICAgICAgc3Ryb2tlOiB2YXIoLS1pcm9uLWljb24tc3Ryb2tlLWNvbG9yLCBub25lKTsKCiAgICAgICAgd2lkdGg6IHZhcigtLWlyb24taWNvbi13aWR0aCwgMjRweCk7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1pcm9uLWljb24taGVpZ2h0LCAyNHB4KTsKICAgICAgICBAYXBwbHkgLS1pcm9uLWljb247CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KYCxpczoiaXJvbi1pY29uIixwcm9wZXJ0aWVzOntpY29uOnt0eXBlOlN0cmluZ30sdGhlbWU6e3R5cGU6U3RyaW5nfSxzcmM6e3R5cGU6U3RyaW5nfSxfbWV0YTp7dmFsdWU6RW8uY3JlYXRlKCJpcm9uLW1ldGEiLHt0eXBlOiJpY29uc2V0In0pfX0sb2JzZXJ2ZXJzOlsiX3VwZGF0ZUljb24oX21ldGEsIGlzQXR0YWNoZWQpIiwiX3VwZGF0ZUljb24odGhlbWUsIGlzQXR0YWNoZWQpIiwiX3NyY0NoYW5nZWQoc3JjLCBpc0F0dGFjaGVkKSIsIl9pY29uQ2hhbmdlZChpY29uLCBpc0F0dGFjaGVkKSJdLF9ERUZBVUxUX0lDT05TRVQ6Imljb25zIixfaWNvbkNoYW5nZWQ6ZnVuY3Rpb24odCl7dmFyIGU9KHR8fCIiKS5zcGxpdCgiOiIpO3RoaXMuX2ljb25OYW1lPWUucG9wKCksdGhpcy5faWNvbnNldE5hbWU9ZS5wb3AoKXx8dGhpcy5fREVGQVVMVF9JQ09OU0VULHRoaXMuX3VwZGF0ZUljb24oKX0sX3NyY0NoYW5nZWQ6ZnVuY3Rpb24odCl7dGhpcy5fdXBkYXRlSWNvbigpfSxfdXNlc0ljb25zZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pY29ufHwhdGhpcy5zcmN9LF91cGRhdGVJY29uOmZ1bmN0aW9uKCl7dGhpcy5fdXNlc0ljb25zZXQoKT8odGhpcy5faW1nJiZ0aGlzLl9pbWcucGFyZW50Tm9kZSYmZXIodGhpcy5yb290KS5yZW1vdmVDaGlsZCh0aGlzLl9pbWcpLCIiPT09dGhpcy5faWNvbk5hbWU/dGhpcy5faWNvbnNldCYmdGhpcy5faWNvbnNldC5yZW1vdmVJY29uKHRoaXMpOnRoaXMuX2ljb25zZXROYW1lJiZ0aGlzLl9tZXRhJiYodGhpcy5faWNvbnNldD10aGlzLl9tZXRhLmJ5S2V5KHRoaXMuX2ljb25zZXROYW1lKSx0aGlzLl9pY29uc2V0Pyh0aGlzLl9pY29uc2V0LmFwcGx5SWNvbih0aGlzLHRoaXMuX2ljb25OYW1lLHRoaXMudGhlbWUpLHRoaXMudW5saXN0ZW4od2luZG93LCJpcm9uLWljb25zZXQtYWRkZWQiLCJfdXBkYXRlSWNvbiIpKTp0aGlzLmxpc3Rlbih3aW5kb3csImlyb24taWNvbnNldC1hZGRlZCIsIl91cGRhdGVJY29uIikpKToodGhpcy5faWNvbnNldCYmdGhpcy5faWNvbnNldC5yZW1vdmVJY29uKHRoaXMpLHRoaXMuX2ltZ3x8KHRoaXMuX2ltZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbWciKSx0aGlzLl9pbWcuc3R5bGUud2lkdGg9IjEwMCUiLHRoaXMuX2ltZy5zdHlsZS5oZWlnaHQ9IjEwMCUiLHRoaXMuX2ltZy5kcmFnZ2FibGU9ITEpLHRoaXMuX2ltZy5zcmM9dGhpcy5zcmMsZXIodGhpcy5yb290KS5hcHBlbmRDaGlsZCh0aGlzLl9pbWcpKX19KSwKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmpyKHtpczoiaXJvbi1pY29uc2V0LXN2ZyIscHJvcGVydGllczp7bmFtZTp7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9uYW1lQ2hhbmdlZCJ9LHNpemU6e3R5cGU6TnVtYmVyLHZhbHVlOjI0fSxydGxNaXJyb3Jpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sdXNlR2xvYmFsUnRsQXR0cmlidXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5fbWV0YT1uZXcgTm8oe3R5cGU6Imljb25zZXQiLGtleTpudWxsLHZhbHVlOm51bGx9KX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlLmRpc3BsYXk9Im5vbmUifSxnZXRJY29uTmFtZXM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faWNvbnM9dGhpcy5fY3JlYXRlSWNvbk1hcCgpLE9iamVjdC5rZXlzKHRoaXMuX2ljb25zKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm5hbWUrIjoiK3R9KSx0aGlzKX0sYXBwbHlJY29uOmZ1bmN0aW9uKHQsZSl7dGhpcy5yZW1vdmVJY29uKHQpO3ZhciBuPXRoaXMuX2Nsb25lSWNvbihlLHRoaXMucnRsTWlycm9yaW5nJiZ0aGlzLl90YXJnZXRJc1JUTCh0KSk7aWYobil7dmFyIGk9ZXIodC5yb290fHx0KTtyZXR1cm4gaS5pbnNlcnRCZWZvcmUobixpLmNoaWxkTm9kZXNbMF0pLHQuX3N2Z0ljb249bn1yZXR1cm4gbnVsbH0scmVtb3ZlSWNvbjpmdW5jdGlvbih0KXt0Ll9zdmdJY29uJiYoZXIodC5yb290fHx0KS5yZW1vdmVDaGlsZCh0Ll9zdmdJY29uKSx0Ll9zdmdJY29uPW51bGwpfSxfdGFyZ2V0SXNSVEw6ZnVuY3Rpb24odCl7aWYobnVsbD09dGhpcy5fX3RhcmdldElzUlRMKWlmKHRoaXMudXNlR2xvYmFsUnRsQXR0cmlidXRlKXt2YXIgZT1kb2N1bWVudC5ib2R5JiZkb2N1bWVudC5ib2R5Lmhhc0F0dHJpYnV0ZSgiZGlyIik/ZG9jdW1lbnQuYm9keTpkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7dGhpcy5fX3RhcmdldElzUlRMPSJydGwiPT09ZS5nZXRBdHRyaWJ1dGUoImRpciIpfWVsc2UgdCYmdC5ub2RlVHlwZSE9PU5vZGUuRUxFTUVOVF9OT0RFJiYodD10Lmhvc3QpLHRoaXMuX190YXJnZXRJc1JUTD10JiYicnRsIj09PXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLmRpcmVjdGlvbjtyZXR1cm4gdGhpcy5fX3RhcmdldElzUlRMfSxfbmFtZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLl9tZXRhLnZhbHVlPW51bGwsdGhpcy5fbWV0YS5rZXk9dGhpcy5uYW1lLHRoaXMuX21ldGEudmFsdWU9dGhpcyx0aGlzLmFzeW5jKChmdW5jdGlvbigpe3RoaXMuZmlyZSgiaXJvbi1pY29uc2V0LWFkZGVkIix0aGlzLHtub2RlOndpbmRvd30pfSkpfSxfY3JlYXRlSWNvbk1hcDpmdW5jdGlvbigpe3ZhciB0PU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIGVyKHRoaXMpLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZF0iKS5mb3JFYWNoKChmdW5jdGlvbihlKXt0W2UuaWRdPWV9KSksdH0sX2Nsb25lSWNvbjpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9pY29ucz10aGlzLl9pY29uc3x8dGhpcy5fY3JlYXRlSWNvbk1hcCgpLHRoaXMuX3ByZXBhcmVTdmdDbG9uZSh0aGlzLl9pY29uc1t0XSx0aGlzLnNpemUsZSl9LF9wcmVwYXJlU3ZnQ2xvbmU6ZnVuY3Rpb24odCxlLG4pe2lmKHQpe3ZhciBpPXQuY2xvbmVOb2RlKCEwKSxyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJzdmciKSxvPWkuZ2V0QXR0cmlidXRlKCJ2aWV3Qm94Iil8fCIwIDAgIitlKyIgIitlLGE9InBvaW50ZXItZXZlbnRzOiBub25lOyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsiO3JldHVybiBuJiZpLmhhc0F0dHJpYnV0ZSgibWlycm9yLWluLXJ0bCIpJiYoYSs9Ii13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC0xLDEpO3RyYW5zZm9ybTpzY2FsZSgtMSwxKTt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjsiKSxyLnNldEF0dHJpYnV0ZSgidmlld0JveCIsbyksci5zZXRBdHRyaWJ1dGUoInByZXNlcnZlQXNwZWN0UmF0aW8iLCJ4TWlkWU1pZCBtZWV0Iiksci5zZXRBdHRyaWJ1dGUoImZvY3VzYWJsZSIsImZhbHNlIiksci5zdHlsZS5jc3NUZXh0PWEsci5hcHBlbmRDaGlsZChpKS5yZW1vdmVBdHRyaWJ1dGUoImlkIikscn1yZXR1cm4gbnVsbH19KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE0IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IFJvPXhlYDxpcm9uLWljb25zZXQtc3ZnIG5hbWU9ImltYWdlIiBzaXplPSIyNCI+Cjxzdmc+PGRlZnM+CjxnIGlkPSJhZGQtYS1waG90byI+PHBhdGggZD0iTTMgNFYxaDJ2M2gzdjJINXYzSDNWNkgwVjRoM3ptMyA2VjdoM1Y0aDdsMS44MyAySDIxYzEuMSAwIDIgLjkgMiAydjEyYzAgMS4xLS45IDItMiAySDVjLTEuMSAwLTItLjktMi0yVjEwaDN6bTcgOWMyLjc2IDAgNS0yLjI0IDUtNXMtMi4yNC01LTUtNS01IDIuMjQtNSA1IDIuMjQgNSA1IDV6bS0zLjItNWMwIDEuNzcgMS40MyAzLjIgMy4yIDMuMnMzLjItMS40MyAzLjItMy4yLTEuNDMtMy4yLTMuMi0zLjItMy4yIDEuNDMtMy4yIDMuMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJhZGQtdG8tcGhvdG9zIj48cGF0aCBkPSJNNCA2SDJ2MTRjMCAxLjEuOSAyIDIgMmgxNHYtMkg0VjZ6bTE2LTRIOGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tMSA5aC00djRoLTJ2LTRIOVY5aDRWNWgydjRoNHYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFkanVzdCI+PHBhdGggZD0iTTEyIDJDNi40OSAyIDIgNi40OSAyIDEyczQuNDkgMTAgMTAgMTAgMTAtNC40OSAxMC0xMFMxNy41MSAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4em0zLThjMCAxLjY2LTEuMzQgMy0zIDNzLTMtMS4zNC0zLTMgMS4zNC0zIDMtMyAzIDEuMzQgMyAzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFzc2lzdGFudCI+PHBhdGggZD0iTTE5IDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmg0bDMgMyAzLTNoNGMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tNS4xMiAxMC44OEwxMiAxN2wtMS44OC00LjEyTDYgMTFsNC4xMi0xLjg4TDEyIDVsMS44OCA0LjEyTDE4IDExbC00LjEyIDEuODh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYXNzaXN0YW50LXBob3RvIj48cGF0aCBkPSJNMTQuNCA2TDE0IDRINXYxN2gydi03aDUuNmwuNCAyaDdWNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJhdWRpb3RyYWNrIj48cGF0aCBkPSJNMTIgM3Y5LjI4Yy0uNDctLjE3LS45Ny0uMjgtMS41LS4yOEM4LjAxIDEyIDYgMTQuMDEgNiAxNi41UzguMDEgMjEgMTAuNSAyMWMyLjMxIDAgNC4yLTEuNzUgNC40NS00SDE1VjZoNFYzaC03eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImJsdXItY2lyY3VsYXIiPjxwYXRoIGQ9Ik0xMCA5Yy0uNTUgMC0xIC40NS0xIDFzLjQ1IDEgMSAxIDEtLjQ1IDEtMS0uNDUtMS0xLTF6bTAgNGMtLjU1IDAtMSAuNDUtMSAxcy40NSAxIDEgMSAxLS40NSAxLTEtLjQ1LTEtMS0xek03IDkuNWMtLjI4IDAtLjUuMjItLjUuNXMuMjIuNS41LjUuNS0uMjIuNS0uNS0uMjItLjUtLjUtLjV6bTMgN2MtLjI4IDAtLjUuMjItLjUuNXMuMjIuNS41LjUuNS0uMjIuNS0uNS0uMjItLjUtLjUtLjV6bS0zLTNjLS4yOCAwLS41LjIyLS41LjVzLjIyLjUuNS41LjUtLjIyLjUtLjUtLjIyLS41LS41LS41em0zLTZjLjI4IDAgLjUtLjIyLjUtLjVzLS4yMi0uNS0uNS0uNS0uNS4yMi0uNS41LjIyLjUuNS41ek0xNCA5Yy0uNTUgMC0xIC40NS0xIDFzLjQ1IDEgMSAxIDEtLjQ1IDEtMS0uNDUtMS0xLTF6bTAtMS41Yy4yOCAwIC41LS4yMi41LS41cy0uMjItLjUtLjUtLjUtLjUuMjItLjUuNS4yMi41LjUuNXptMyA2Yy0uMjggMC0uNS4yMi0uNS41cy4yMi41LjUuNS41LS4yMi41LS41LS4yMi0uNS0uNS0uNXptMC00Yy0uMjggMC0uNS4yMi0uNS41cy4yMi41LjUuNS41LS4yMi41LS41LS4yMi0uNS0uNS0uNXpNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MiAwLTgtMy41OC04LThzMy41OC04IDgtOCA4IDMuNTggOCA4LTMuNTggOC04IDh6bTItMy41Yy0uMjggMC0uNS4yMi0uNS41cy4yMi41LjUuNS41LS4yMi41LS41LS4yMi0uNS0uNS0uNXptMC0zLjVjLS41NSAwLTEgLjQ1LTEgMXMuNDUgMSAxIDEgMS0uNDUgMS0xLS40NS0xLTEtMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJibHVyLWxpbmVhciI+PHBhdGggZD0iTTUgMTcuNWMuODMgMCAxLjUtLjY3IDEuNS0xLjVzLS42Ny0xLjUtMS41LTEuNS0xLjUuNjctMS41IDEuNS42NyAxLjUgMS41IDEuNXpNOSAxM2MuNTUgMCAxLS40NSAxLTFzLS40NS0xLTEtMS0xIC40NS0xIDEgLjQ1IDEgMSAxem0wLTRjLjU1IDAgMS0uNDUgMS0xcy0uNDUtMS0xLTEtMSAuNDUtMSAxIC40NSAxIDEgMXpNMyAyMWgxOHYtMkgzdjJ6TTUgOS41Yy44MyAwIDEuNS0uNjcgMS41LTEuNVM1LjgzIDYuNSA1IDYuNSAzLjUgNy4xNyAzLjUgOCA0LjE3IDkuNSA1IDkuNXptMCA0Yy44MyAwIDEuNS0uNjcgMS41LTEuNXMtLjY3LTEuNS0xLjUtMS41LTEuNS42Ny0xLjUgMS41LjY3IDEuNSAxLjUgMS41ek05IDE3Yy41NSAwIDEtLjQ1IDEtMXMtLjQ1LTEtMS0xLTEgLjQ1LTEgMSAuNDUgMSAxIDF6bTgtLjVjLjI4IDAgLjUtLjIyLjUtLjVzLS4yMi0uNS0uNS0uNS0uNS4yMi0uNS41LjIyLjUuNS41ek0zIDN2MmgxOFYzSDN6bTE0IDUuNWMuMjggMCAuNS0uMjIuNS0uNXMtLjIyLS41LS41LS41LS41LjIyLS41LjUuMjIuNS41LjV6bTAgNGMuMjggMCAuNS0uMjIuNS0uNXMtLjIyLS41LS41LS41LS41LjIyLS41LjUuMjIuNS41LjV6TTEzIDljLjU1IDAgMS0uNDUgMS0xcy0uNDUtMS0xLTEtMSAuNDUtMSAxIC40NSAxIDEgMXptMCA0Yy41NSAwIDEtLjQ1IDEtMXMtLjQ1LTEtMS0xLTEgLjQ1LTEgMSAuNDUgMSAxIDF6bTAgNGMuNTUgMCAxLS40NSAxLTFzLS40NS0xLTEtMS0xIC40NS0xIDEgLjQ1IDEgMSAxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImJsdXItb2ZmIj48cGF0aCBkPSJNMTQgN2MuNTUgMCAxLS40NSAxLTFzLS40NS0xLTEtMS0xIC40NS0xIDEgLjQ1IDEgMSAxem0tLjIgNC40OGwuMi4wMmMuODMgMCAxLjUtLjY3IDEuNS0xLjVzLS42Ny0xLjUtMS41LTEuNS0xLjUuNjctMS41IDEuNWwuMDIuMmMuMDkuNjcuNjEgMS4xOSAxLjI4IDEuMjh6TTE0IDMuNWMuMjggMCAuNS0uMjIuNS0uNXMtLjIyLS41LS41LS41LS41LjIyLS41LjUuMjIuNS41LjV6bS00IDBjLjI4IDAgLjUtLjIyLjUtLjVzLS4yMi0uNS0uNS0uNS0uNS4yMi0uNS41LjIyLjUuNS41em0xMSA3Yy4yOCAwIC41LS4yMi41LS41cy0uMjItLjUtLjUtLjUtLjUuMjItLjUuNS4yMi41LjUuNXpNMTAgN2MuNTUgMCAxLS40NSAxLTFzLS40NS0xLTEtMS0xIC40NS0xIDEgLjQ1IDEgMSAxem04IDhjLjU1IDAgMS0uNDUgMS0xcy0uNDUtMS0xLTEtMSAuNDUtMSAxIC40NSAxIDEgMXptMC00Yy41NSAwIDEtLjQ1IDEtMXMtLjQ1LTEtMS0xLTEgLjQ1LTEgMSAuNDUgMSAxIDF6bTAtNGMuNTUgMCAxLS40NSAxLTFzLS40NS0xLTEtMS0xIC40NS0xIDEgLjQ1IDEgMSAxem0tNCAxMy41Yy0uMjggMC0uNS4yMi0uNS41cy4yMi41LjUuNS41LS4yMi41LS41LS4yMi0uNS0uNS0uNXpNMi41IDUuMjdsMy43OCAzLjc4TDYgOWMtLjU1IDAtMSAuNDUtMSAxcy40NSAxIDEgMSAxLS40NSAxLTFjMC0uMS0uMDMtLjE5LS4wNi0uMjhsMi44MSAyLjgxYy0uNzEuMTEtMS4yNS43My0xLjI1IDEuNDcgMCAuODMuNjcgMS41IDEuNSAxLjUuNzQgMCAxLjM2LS41NCAxLjQ3LTEuMjVsMi44MSAyLjgxYy0uMDktLjAzLS4xOC0uMDYtLjI4LS4wNi0uNTUgMC0xIC40NS0xIDFzLjQ1IDEgMSAxIDEtLjQ1IDEtMWMwLS4xLS4wMy0uMTktLjA2LS4yOGwzLjc4IDMuNzhMMjAgMjAuMjMgMy43NyA0IDIuNSA1LjI3ek0xMCAxN2MtLjU1IDAtMSAuNDUtMSAxcy40NSAxIDEgMSAxLS40NSAxLTEtLjQ1LTEtMS0xem0xMS0zLjVjLS4yOCAwLS41LjIyLS41LjVzLjIyLjUuNS41LjUtLjIyLjUtLjUtLjIyLS41LS41LS41ek02IDEzYy0uNTUgMC0xIC40NS0xIDFzLjQ1IDEgMSAxIDEtLjQ1IDEtMS0uNDUtMS0xLTF6TTMgOS41Yy0uMjggMC0uNS4yMi0uNS41cy4yMi41LjUuNS41LS4yMi41LS41LS4yMi0uNS0uNS0uNXptNyAxMWMtLjI4IDAtLjUuMjItLjUuNXMuMjIuNS41LjUuNS0uMjIuNS0uNS0uMjItLjUtLjUtLjV6TTYgMTdjLS41NSAwLTEgLjQ1LTEgMXMuNDUgMSAxIDEgMS0uNDUgMS0xLS40NS0xLTEtMXptLTMtMy41Yy0uMjggMC0uNS4yMi0uNS41cy4yMi41LjUuNS41LS4yMi41LS41LS4yMi0uNS0uNS0uNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJibHVyLW9uIj48cGF0aCBkPSJNNiAxM2MtLjU1IDAtMSAuNDUtMSAxcy40NSAxIDEgMSAxLS40NSAxLTEtLjQ1LTEtMS0xem0wIDRjLS41NSAwLTEgLjQ1LTEgMXMuNDUgMSAxIDEgMS0uNDUgMS0xLS40NS0xLTEtMXptMC04Yy0uNTUgMC0xIC40NS0xIDFzLjQ1IDEgMSAxIDEtLjQ1IDEtMS0uNDUtMS0xLTF6bS0zIC41Yy0uMjggMC0uNS4yMi0uNS41cy4yMi41LjUuNS41LS4yMi41LS41LS4yMi0uNS0uNS0uNXpNNiA1Yy0uNTUgMC0xIC40NS0xIDFzLjQ1IDEgMSAxIDEtLjQ1IDEtMS0uNDUtMS0xLTF6bTE1IDUuNWMuMjggMCAuNS0uMjIuNS0uNXMtLjIyLS41LS41LS41LS41LjIyLS41LjUuMjIuNS41LjV6TTE0IDdjLjU1IDAgMS0uNDUgMS0xcy0uNDUtMS0xLTEtMSAuNDUtMSAxIC40NSAxIDEgMXptMC0zLjVjLjI4IDAgLjUtLjIyLjUtLjVzLS4yMi0uNS0uNS0uNS0uNS4yMi0uNS41LjIyLjUuNS41em0tMTEgMTBjLS4yOCAwLS41LjIyLS41LjVzLjIyLjUuNS41LjUtLjIyLjUtLjUtLjIyLS41LS41LS41em03IDdjLS4yOCAwLS41LjIyLS41LjVzLjIyLjUuNS41LjUtLjIyLjUtLjUtLjIyLS41LS41LS41em0wLTE3Yy4yOCAwIC41LS4yMi41LS41cy0uMjItLjUtLjUtLjUtLjUuMjItLjUuNS4yMi41LjUuNXpNMTAgN2MuNTUgMCAxLS40NSAxLTFzLS40NS0xLTEtMS0xIC40NS0xIDEgLjQ1IDEgMSAxem0wIDUuNWMtLjgzIDAtMS41LjY3LTEuNSAxLjVzLjY3IDEuNSAxLjUgMS41IDEuNS0uNjcgMS41LTEuNS0uNjctMS41LTEuNS0xLjV6bTggLjVjLS41NSAwLTEgLjQ1LTEgMXMuNDUgMSAxIDEgMS0uNDUgMS0xLS40NS0xLTEtMXptMCA0Yy0uNTUgMC0xIC40NS0xIDFzLjQ1IDEgMSAxIDEtLjQ1IDEtMS0uNDUtMS0xLTF6bTAtOGMtLjU1IDAtMSAuNDUtMSAxcy40NSAxIDEgMSAxLS40NSAxLTEtLjQ1LTEtMS0xem0wLTRjLS41NSAwLTEgLjQ1LTEgMXMuNDUgMSAxIDEgMS0uNDUgMS0xLS40NS0xLTEtMXptMyA4LjVjLS4yOCAwLS41LjIyLS41LjVzLjIyLjUuNS41LjUtLjIyLjUtLjUtLjIyLS41LS41LS41ek0xNCAxN2MtLjU1IDAtMSAuNDUtMSAxcy40NSAxIDEgMSAxLS40NSAxLTEtLjQ1LTEtMS0xem0wIDMuNWMtLjI4IDAtLjUuMjItLjUuNXMuMjIuNS41LjUuNS0uMjIuNS0uNS0uMjItLjUtLjUtLjV6bS00LTEyYy0uODMgMC0xLjUuNjctMS41IDEuNXMuNjcgMS41IDEuNSAxLjUgMS41LS42NyAxLjUtMS41LS42Ny0xLjUtMS41LTEuNXptMCA4LjVjLS41NSAwLTEgLjQ1LTEgMXMuNDUgMSAxIDEgMS0uNDUgMS0xLS40NS0xLTEtMXptNC00LjVjLS44MyAwLTEuNS42Ny0xLjUgMS41cy42NyAxLjUgMS41IDEuNSAxLjUtLjY3IDEuNS0xLjUtLjY3LTEuNS0xLjUtMS41em0wLTRjLS44MyAwLTEuNS42Ny0xLjUgMS41cy42NyAxLjUgMS41IDEuNSAxLjUtLjY3IDEuNS0xLjUtLjY3LTEuNS0xLjUtMS41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImJyaWdodG5lc3MtMSI+PGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMTAiPjwvY2lyY2xlPjwvZz4KPGcgaWQ9ImJyaWdodG5lc3MtMiI+PHBhdGggZD0iTTEwIDJjLTEuODIgMC0zLjUzLjUtNSAxLjM1QzcuOTkgNS4wOCAxMCA4LjMgMTAgMTJzLTIuMDEgNi45Mi01IDguNjVDNi40NyAyMS41IDguMTggMjIgMTAgMjJjNS41MiAwIDEwLTQuNDggMTAtMTBTMTUuNTIgMiAxMCAyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImJyaWdodG5lc3MtMyI+PHBhdGggZD0iTTkgMmMtMS4wNSAwLTIuMDUuMTYtMyAuNDYgNC4wNiAxLjI3IDcgNS4wNiA3IDkuNTQgMCA0LjQ4LTIuOTQgOC4yNy03IDkuNTQuOTUuMyAxLjk1LjQ2IDMgLjQ2IDUuNTIgMCAxMC00LjQ4IDEwLTEwUzE0LjUyIDIgOSAyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImJyaWdodG5lc3MtNCI+PHBhdGggZD0iTTIwIDguNjlWNGgtNC42OUwxMiAuNjkgOC42OSA0SDR2NC42OUwuNjkgMTIgNCAxNS4zMVYyMGg0LjY5TDEyIDIzLjMxIDE1LjMxIDIwSDIwdi00LjY5TDIzLjMxIDEyIDIwIDguNjl6TTEyIDE4Yy0uODkgMC0xLjc0LS4yLTIuNS0uNTVDMTEuNTYgMTYuNSAxMyAxNC40MiAxMyAxMnMtMS40NC00LjUtMy41LTUuNDVDMTAuMjYgNi4yIDExLjExIDYgMTIgNmMzLjMxIDAgNiAyLjY5IDYgNnMtMi42OSA2LTYgNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJicmlnaHRuZXNzLTUiPjxwYXRoIGQ9Ik0yMCAxNS4zMUwyMy4zMSAxMiAyMCA4LjY5VjRoLTQuNjlMMTIgLjY5IDguNjkgNEg0djQuNjlMLjY5IDEyIDQgMTUuMzFWMjBoNC42OUwxMiAyMy4zMSAxNS4zMSAyMEgyMHYtNC42OXpNMTIgMThjLTMuMzEgMC02LTIuNjktNi02czIuNjktNiA2LTYgNiAyLjY5IDYgNi0yLjY5IDYtNiA2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImJyaWdodG5lc3MtNiI+PHBhdGggZD0iTTIwIDE1LjMxTDIzLjMxIDEyIDIwIDguNjlWNGgtNC42OUwxMiAuNjkgOC42OSA0SDR2NC42OUwuNjkgMTIgNCAxNS4zMVYyMGg0LjY5TDEyIDIzLjMxIDE1LjMxIDIwSDIwdi00LjY5ek0xMiAxOFY2YzMuMzEgMCA2IDIuNjkgNiA2cy0yLjY5IDYtNiA2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImJyaWdodG5lc3MtNyI+PHBhdGggZD0iTTIwIDguNjlWNGgtNC42OUwxMiAuNjkgOC42OSA0SDR2NC42OUwuNjkgMTIgNCAxNS4zMVYyMGg0LjY5TDEyIDIzLjMxIDE1LjMxIDIwSDIwdi00LjY5TDIzLjMxIDEyIDIwIDguNjl6TTEyIDE4Yy0zLjMxIDAtNi0yLjY5LTYtNnMyLjY5LTYgNi02IDYgMi42OSA2IDYtMi42OSA2LTYgNnptMC0xMGMtMi4yMSAwLTQgMS43OS00IDRzMS43OSA0IDQgNCA0LTEuNzkgNC00LTEuNzktNC00LTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYnJva2VuLWltYWdlIj48cGF0aCBkPSJNMjEgNXY2LjU5bC0zLTMuMDEtNCA0LjAxLTQtNC00IDQtMy0zLjAxVjVjMC0xLjEuOS0yIDItMmgxNGMxLjEgMCAyIC45IDIgMnptLTMgNi40MmwzIDMuMDFWMTljMCAxLjEtLjkgMi0yIDJINWMtMS4xIDAtMi0uOS0yLTJ2LTYuNThsMyAyLjk5IDQtNCA0IDQgNC0zLjk5eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImJydXNoIj48cGF0aCBkPSJNNyAxNGMtMS42NiAwLTMgMS4zNC0zIDMgMCAxLjMxLTEuMTYgMi0yIDIgLjkyIDEuMjIgMi40OSAyIDQgMiAyLjIxIDAgNC0xLjc5IDQtNCAwLTEuNjYtMS4zNC0zLTMtM3ptMTMuNzEtOS4zN2wtMS4zNC0xLjM0Yy0uMzktLjM5LTEuMDItLjM5LTEuNDEgMEw5IDEyLjI1IDExLjc1IDE1bDguOTYtOC45NmMuMzktLjM5LjM5LTEuMDIgMC0xLjQxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImJ1cnN0LW1vZGUiPjxwYXRoIGQ9Ik0xIDVoMnYxNEgxem00IDBoMnYxNEg1em0xNyAwSDEwYy0uNTUgMC0xIC40NS0xIDF2MTJjMCAuNTUuNDUgMSAxIDFoMTJjLjU1IDAgMS0uNDUgMS0xVjZjMC0uNTUtLjQ1LTEtMS0xek0xMSAxN2wyLjUtMy4xNUwxNS4yOSAxNmwyLjUtMy4yMkwyMSAxN0gxMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJjYW1lcmEiPjxwYXRoIGQ9Ik05LjQgMTAuNWw0Ljc3LTguMjZDMTMuNDcgMi4wOSAxMi43NSAyIDEyIDJjLTIuNCAwLTQuNi44NS02LjMyIDIuMjVsMy42NiA2LjM1LjA2LS4xek0yMS41NCA5Yy0uOTItMi45Mi0zLjE1LTUuMjYtNi02LjM0TDExLjg4IDloOS42NnptLjI2IDFoLTcuNDlsLjI5LjUgNC43NiA4LjI1QzIxIDE2Ljk3IDIyIDE0LjYxIDIyIDEyYzAtLjY5LS4wNy0xLjM1LS4yLTJ6TTguNTQgMTJsLTMuOS02Ljc1QzMuMDEgNy4wMyAyIDkuMzkgMiAxMmMwIC42OS4wNyAxLjM1LjIgMmg3LjQ5bC0xLjE1LTJ6bS02LjA4IDNjLjkyIDIuOTIgMy4xNSA1LjI2IDYgNi4zNEwxMi4xMiAxNUgyLjQ2em0xMS4yNyAwbC0zLjkgNi43NmMuNy4xNSAxLjQyLjI0IDIuMTcuMjQgMi40IDAgNC42LS44NSA2LjMyLTIuMjVsLTMuNjYtNi4zNS0uOTMgMS42eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNhbWVyYS1hbHQiPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjMuMiI+PC9jaXJjbGU+PHBhdGggZD0iTTkgMkw3LjE3IDRINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yaC0zLjE3TDE1IDJIOXptMyAxNWMtMi43NiAwLTUtMi4yNC01LTVzMi4yNC01IDUtNSA1IDIuMjQgNSA1LTIuMjQgNS01IDV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2FtZXJhLWZyb250Ij48cGF0aCBkPSJNMTAgMjBINXYyaDV2MmwzLTMtMy0zdjJ6bTQgMHYyaDV2LTJoLTV6TTEyIDhjMS4xIDAgMi0uOSAyLTJzLS45LTItMi0yLTEuOTkuOS0xLjk5IDJTMTAuOSA4IDEyIDh6bTUtOEg3QzUuOSAwIDUgLjkgNSAydjE0YzAgMS4xLjkgMiAyIDJoMTBjMS4xIDAgMi0uOSAyLTJWMmMwLTEuMS0uOS0yLTItMnpNNyAyaDEwdjEwLjVjMC0xLjY3LTMuMzMtMi41LTUtMi41cy01IC44My01IDIuNVYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNhbWVyYS1yZWFyIj48cGF0aCBkPSJNMTAgMjBINXYyaDV2MmwzLTMtMy0zdjJ6bTQgMHYyaDV2LTJoLTV6bTMtMjBIN0M1LjkgMCA1IC45IDUgMnYxNGMwIDEuMS45IDIgMiAyaDEwYzEuMSAwIDItLjkgMi0yVjJjMC0xLjEtLjktMi0yLTJ6bS01IDZjLTEuMTEgMC0yLS45LTItMnMuODktMiAxLjk5LTIgMiAuOSAyIDJDMTQgNS4xIDEzLjEgNiAxMiA2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNhbWVyYS1yb2xsIj48cGF0aCBkPSJNMTQgNWMwLTEuMS0uOS0yLTItMmgtMVYyYzAtLjU1LS40NS0xLTEtMUg2Yy0uNTUgMC0xIC40NS0xIDF2MUg0Yy0xLjEgMC0yIC45LTIgMnYxNWMwIDEuMS45IDIgMiAyaDhjMS4xIDAgMi0uOSAyLTJoOFY1aC04em0tMiAxM2gtMnYtMmgydjJ6bTAtOWgtMlY3aDJ2MnptNCA5aC0ydi0yaDJ2MnptMC05aC0yVjdoMnYyem00IDloLTJ2LTJoMnYyem0wLTloLTJWN2gydjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2VudGVyLWZvY3VzLXN0cm9uZyI+PHBhdGggZD0iTTEyIDhjLTIuMjEgMC00IDEuNzktNCA0czEuNzkgNCA0IDQgNC0xLjc5IDQtNC0xLjc5LTQtNC00em0tNyA3SDN2NGMwIDEuMS45IDIgMiAyaDR2LTJINXYtNHpNNSA1aDRWM0g1Yy0xLjEgMC0yIC45LTIgMnY0aDJWNXptMTQtMmgtNHYyaDR2NGgyVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTZoLTR2Mmg0YzEuMSAwIDItLjkgMi0ydi00aC0ydjR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2VudGVyLWZvY3VzLXdlYWsiPjxwYXRoIGQ9Ik01IDE1SDN2NGMwIDEuMS45IDIgMiAyaDR2LTJINXYtNHpNNSA1aDRWM0g1Yy0xLjEgMC0yIC45LTIgMnY0aDJWNXptMTQtMmgtNHYyaDR2NGgyVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTZoLTR2Mmg0YzEuMSAwIDItLjkgMi0ydi00aC0ydjR6TTEyIDhjLTIuMjEgMC00IDEuNzktNCA0czEuNzkgNCA0IDQgNC0xLjc5IDQtNC0xLjc5LTQtNC00em0wIDZjLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNvbGxlY3Rpb25zIj48cGF0aCBkPSJNMjIgMTZWNGMwLTEuMS0uOS0yLTItMkg4Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yem0tMTEtNGwyLjAzIDIuNzFMMTYgMTFsNCA1SDhsMy00ek0yIDZ2MTRjMCAxLjEuOSAyIDIgMmgxNHYtMkg0VjZIMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjb2xsZWN0aW9ucy1ib29rbWFyayI+PHBhdGggZD0iTTQgNkgydjE0YzAgMS4xLjkgMiAyIDJoMTR2LTJINFY2em0xNi00SDhjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptMCAxMGwtMi41LTEuNUwxNSAxMlY0aDV2OHoiPjwvcGF0aD48L2c+CjxnIGlkPSJjb2xvci1sZW5zIj48cGF0aCBkPSJNMTIgM2MtNC45NyAwLTkgNC4wMy05IDlzNC4wMyA5IDkgOWMuODMgMCAxLjUtLjY3IDEuNS0xLjUgMC0uMzktLjE1LS43NC0uMzktMS4wMS0uMjMtLjI2LS4zOC0uNjEtLjM4LS45OSAwLS44My42Ny0xLjUgMS41LTEuNUgxNmMyLjc2IDAgNS0yLjI0IDUtNSAwLTQuNDItNC4wMy04LTktOHptLTUuNSA5Yy0uODMgMC0xLjUtLjY3LTEuNS0xLjVTNS42NyA5IDYuNSA5IDggOS42NyA4IDEwLjUgNy4zMyAxMiA2LjUgMTJ6bTMtNEM4LjY3IDggOCA3LjMzIDggNi41UzguNjcgNSA5LjUgNXMxLjUuNjcgMS41IDEuNVMxMC4zMyA4IDkuNSA4em01IDBjLS44MyAwLTEuNS0uNjctMS41LTEuNVMxMy42NyA1IDE0LjUgNXMxLjUuNjcgMS41IDEuNVMxNS4zMyA4IDE0LjUgOHptMyA0Yy0uODMgMC0xLjUtLjY3LTEuNS0xLjVTMTYuNjcgOSAxNy41IDlzMS41LjY3IDEuNSAxLjUtLjY3IDEuNS0xLjUgMS41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNvbG9yaXplIj48cGF0aCBkPSJNMjAuNzEgNS42M2wtMi4zNC0yLjM0Yy0uMzktLjM5LTEuMDItLjM5LTEuNDEgMGwtMy4xMiAzLjEyLTEuOTMtMS45MS0xLjQxIDEuNDEgMS40MiAxLjQyTDMgMTYuMjVWMjFoNC43NWw4LjkyLTguOTIgMS40MiAxLjQyIDEuNDEtMS40MS0xLjkyLTEuOTIgMy4xMi0zLjEyYy40LS40LjQtMS4wMy4wMS0xLjQyek02LjkyIDE5TDUgMTcuMDhsOC4wNi04LjA2IDEuOTIgMS45Mkw2LjkyIDE5eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNvbXBhcmUiPjxwYXRoIGQ9Ik0xMCAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoNXYyaDJWMWgtMnYyem0wIDE1SDVsNS02djZ6bTktMTVoLTV2Mmg1djEzbC01LTZ2OWg1YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY29udHJvbC1wb2ludCI+PHBhdGggZD0iTTEzIDdoLTJ2NEg3djJoNHY0aDJ2LTRoNHYtMmgtNFY3em0tMS01QzYuNDkgMiAyIDYuNDkgMiAxMnM0LjQ5IDEwIDEwIDEwIDEwLTQuNDkgMTAtMTBTMTcuNTEgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJjb250cm9sLXBvaW50LWR1cGxpY2F0ZSI+PHBhdGggZD0iTTE2IDhoLTJ2M2gtM3YyaDN2M2gydi0zaDN2LTJoLTN6TTIgMTJjMC0yLjc5IDEuNjQtNS4yIDQuMDEtNi4zMlYzLjUyQzIuNTIgNC43NiAwIDguMDkgMCAxMnMyLjUyIDcuMjQgNi4wMSA4LjQ4di0yLjE2QzMuNjQgMTcuMiAyIDE0Ljc5IDIgMTJ6bTEzLTljLTQuOTYgMC05IDQuMDQtOSA5czQuMDQgOSA5IDkgOS00LjA0IDktOS00LjA0LTktOS05em0wIDE2Yy0zLjg2IDAtNy0zLjE0LTctN3MzLjE0LTcgNy03IDcgMy4xNCA3IDctMy4xNCA3LTcgN3oiPjwvcGF0aD48L2c+CjxnIGlkPSJjcm9wIj48cGF0aCBkPSJNMTcgMTVoMlY3YzAtMS4xLS45LTItMi0ySDl2Mmg4djh6TTcgMTdWMUg1djRIMXYyaDR2MTBjMCAxLjEuOSAyIDIgMmgxMHY0aDJ2LTRoNHYtMkg3eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNyb3AtMTYtOSI+PHBhdGggZD0iTTE5IDZINWMtMS4xIDAtMiAuOS0yIDJ2OGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6bTAgMTBINVY4aDE0djh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY3JvcC0zLTIiPjxwYXRoIGQ9Ik0xOSA0SDVjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptMCAxNEg1VjZoMTR2MTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY3JvcC01LTQiPjxwYXRoIGQ9Ik0xOSA1SDVjLTEuMSAwLTIgLjktMiAydjEwYzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMnptMCAxMkg1VjdoMTR2MTB6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY3JvcC03LTUiPjxwYXRoIGQ9Ik0xOSA3SDVjLTEuMSAwLTIgLjktMiAydjZjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY5YzAtMS4xLS45LTItMi0yem0wIDhINVY5aDE0djZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY3JvcC1kaW4iPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNkg1VjVoMTR2MTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY3JvcC1mcmVlIj48cGF0aCBkPSJNMyA1djRoMlY1aDRWM0g1Yy0xLjEgMC0yIC45LTIgMnptMiAxMEgzdjRjMCAxLjEuOSAyIDIgMmg0di0ySDV2LTR6bTE0IDRoLTR2Mmg0YzEuMSAwIDItLjkgMi0ydi00aC0ydjR6bTAtMTZoLTR2Mmg0djRoMlY1YzAtMS4xLS45LTItMi0yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNyb3AtbGFuZHNjYXBlIj48cGF0aCBkPSJNMTkgNUg1Yy0xLjEgMC0yIC45LTIgMnYxMGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjdjMC0xLjEtLjktMi0yLTJ6bTAgMTJINVY3aDE0djEweiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNyb3Atb3JpZ2luYWwiPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNkg1VjVoMTR2MTR6bS01LjA0LTYuNzFsLTIuNzUgMy41NC0xLjk2LTIuMzZMNi41IDE3aDExbC0zLjU0LTQuNzF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY3JvcC1wb3J0cmFpdCI+PHBhdGggZD0iTTE3IDNIN2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxMGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2SDdWNWgxMHYxNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJjcm9wLXJvdGF0ZSI+PHBhdGggZD0iTTcuNDcgMjEuNDlDNC4yIDE5LjkzIDEuODYgMTYuNzYgMS41IDEzSDBjLjUxIDYuMTYgNS42NiAxMSAxMS45NSAxMSAuMjMgMCAuNDQtLjAyLjY2LS4wM0w4LjggMjAuMTVsLTEuMzMgMS4zNHpNMTIuMDUgMGMtLjIzIDAtLjQ0LjAyLS42Ni4wNGwzLjgxIDMuODEgMS4zMy0xLjMzQzE5LjggNC4wNyAyMi4xNCA3LjI0IDIyLjUgMTFIMjRjLS41MS02LjE2LTUuNjYtMTEtMTEuOTUtMTF6TTE2IDE0aDJWOGMwLTEuMTEtLjktMi0yLTJoLTZ2Mmg2djZ6bS04IDJWNEg2djJINHYyaDJ2OGMwIDEuMS44OSAyIDIgMmg4djJoMnYtMmgydi0ySDh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY3JvcC1zcXVhcmUiPjxwYXRoIGQ9Ik0xOCA0SDZjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptMCAxNEg2VjZoMTJ2MTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZGVoYXplIj48cGF0aCBkPSJNMiAxNS41djJoMjB2LTJIMnptMC01djJoMjB2LTJIMnptMC01djJoMjB2LTJIMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJkZXRhaWxzIj48cGF0aCBkPSJNMyA0bDkgMTYgOS0xNkgzem0zLjM4IDJoMTEuMjVMMTIgMTYgNi4zOCA2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImVkaXQiPjxwYXRoIGQ9Ik0zIDE3LjI1VjIxaDMuNzVMMTcuODEgOS45NGwtMy43NS0zLjc1TDMgMTcuMjV6TTIwLjcxIDcuMDRjLjM5LS4zOS4zOS0xLjAyIDAtMS40MWwtMi4zNC0yLjM0Yy0uMzktLjM5LTEuMDItLjM5LTEuNDEgMGwtMS44MyAxLjgzIDMuNzUgMy43NSAxLjgzLTEuODN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZXhwb3N1cmUiPjxwYXRoIGQ9Ik0xNSAxN3YyaDJ2LTJoMnYtMmgtMnYtMmgtMnYyaC0ydjJoMnptNS0xNUg0Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6TTUgNWg2djJINVY1em0xNSAxNUg0TDIwIDR2MTZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZXhwb3N1cmUtbmVnLTEiPjxwYXRoIGQ9Ik00IDExdjJoOHYtMkg0em0xNSA3aC0yVjcuMzhMMTQgOC40VjYuN0wxOC43IDVoLjN2MTN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZXhwb3N1cmUtbmVnLTIiPjxwYXRoIGQ9Ik0xNS4wNSAxNi4yOWwyLjg2LTMuMDdjLjM4LS4zOS43Mi0uNzkgMS4wNC0xLjE4LjMyLS4zOS41OS0uNzguODItMS4xNy4yMy0uMzkuNDEtLjc4LjU0LTEuMTdzLjE5LS43OS4xOS0xLjE4YzAtLjUzLS4wOS0xLjAyLS4yNy0xLjQ2LS4xOC0uNDQtLjQ0LS44MS0uNzgtMS4xMS0uMzQtLjMxLS43Ny0uNTQtMS4yNi0uNzEtLjUxLS4xNi0xLjA4LS4yNC0xLjcyLS4yNC0uNjkgMC0xLjMxLjExLTEuODUuMzItLjU0LjIxLTEgLjUxLTEuMzYuODgtLjM3LjM3LS42NS44LS44NCAxLjMtLjE4LjQ3LS4yNy45Ny0uMjggMS41aDIuMTRjLjAxLS4zMS4wNS0uNi4xMy0uODcuMDktLjI5LjIzLS41NC40LS43NS4xOC0uMjEuNDEtLjM3LjY4LS40OS4yNy0uMTIuNi0uMTguOTYtLjE4LjMxIDAgLjU4LjA1LjgxLjE1LjIzLjEuNDMuMjUuNTkuNDMuMTYuMTguMjguNC4zNy42NS4wOC4yNS4xMy41Mi4xMy44MSAwIC4yMi0uMDMuNDMtLjA4LjY1LS4wNi4yMi0uMTUuNDUtLjI5LjctLjE0LjI1LS4zMi41My0uNTYuODMtLjIzLjMtLjUyLjY1LS44OCAxLjAzbC00LjE3IDQuNTVWMThIMjF2LTEuNzFoLTUuOTV6TTIgMTF2Mmg4di0ySDJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZXhwb3N1cmUtcGx1cy0xIj48cGF0aCBkPSJNMTAgN0g4djRINHYyaDR2NGgydi00aDR2LTJoLTRWN3ptMTAgMTFoLTJWNy4zOEwxNSA4LjRWNi43TDE5LjcgNWguM3YxM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJleHBvc3VyZS1wbHVzLTIiPjxwYXRoIGQ9Ik0xNi4wNSAxNi4yOWwyLjg2LTMuMDdjLjM4LS4zOS43Mi0uNzkgMS4wNC0xLjE4LjMyLS4zOS41OS0uNzguODItMS4xNy4yMy0uMzkuNDEtLjc4LjU0LTEuMTcuMTMtLjM5LjE5LS43OS4xOS0xLjE4IDAtLjUzLS4wOS0xLjAyLS4yNy0xLjQ2LS4xOC0uNDQtLjQ0LS44MS0uNzgtMS4xMS0uMzQtLjMxLS43Ny0uNTQtMS4yNi0uNzEtLjUxLS4xNi0xLjA4LS4yNC0xLjcyLS4yNC0uNjkgMC0xLjMxLjExLTEuODUuMzItLjU0LjIxLTEgLjUxLTEuMzYuODgtLjM3LjM3LS42NS44LS44NCAxLjMtLjE4LjQ3LS4yNy45Ny0uMjggMS41aDIuMTRjLjAxLS4zMS4wNS0uNi4xMy0uODcuMDktLjI5LjIzLS41NC40LS43NS4xOC0uMjEuNDEtLjM3LjY4LS40OS4yNy0uMTIuNi0uMTguOTYtLjE4LjMxIDAgLjU4LjA1LjgxLjE1LjIzLjEuNDMuMjUuNTkuNDMuMTYuMTguMjguNC4zNy42NS4wOC4yNS4xMy41Mi4xMy44MSAwIC4yMi0uMDMuNDMtLjA4LjY1LS4wNi4yMi0uMTUuNDUtLjI5LjctLjE0LjI1LS4zMi41My0uNTYuODMtLjIzLjMtLjUyLjY1LS44OCAxLjAzbC00LjE3IDQuNTVWMThIMjJ2LTEuNzFoLTUuOTV6TTggN0g2djRIMnYyaDR2NGgydi00aDR2LTJIOFY3eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImV4cG9zdXJlLXplcm8iPjxwYXRoIGQ9Ik0xNi4xNCAxMi41YzAgMS0uMSAxLjg1LS4zIDIuNTUtLjIuNy0uNDggMS4yNy0uODMgMS43LS4zNi40NC0uNzkuNzUtMS4zLjk1LS41MS4yLTEuMDcuMy0xLjcuMy0uNjIgMC0xLjE4LS4xLTEuNjktLjMtLjUxLS4yLS45NS0uNTEtMS4zMS0uOTUtLjM2LS40NC0uNjUtMS4wMS0uODUtMS43LS4yLS43LS4zLTEuNTUtLjMtMi41NXYtMi4wNGMwLTEgLjEtMS44NS4zLTIuNTUuMi0uNy40OC0xLjI2Ljg0LTEuNjkuMzYtLjQzLjgtLjc0IDEuMzEtLjkzQzEwLjgxIDUuMSAxMS4zOCA1IDEyIDVjLjYzIDAgMS4xOS4xIDEuNy4yOS41MS4xOS45NS41IDEuMzEuOTMuMzYuNDMuNjQuOTkuODQgMS42OS4yLjcuMyAxLjU0LjMgMi41NXYyLjA0em0tMi4xMS0yLjM2YzAtLjY0LS4wNS0xLjE4LS4xMy0xLjYyLS4wOS0uNDQtLjIyLS43OS0uNC0xLjA2LS4xNy0uMjctLjM5LS40Ni0uNjQtLjU4LS4yNS0uMTMtLjU0LS4xOS0uODYtLjE5LS4zMiAwLS42MS4wNi0uODYuMThzLS40Ny4zMS0uNjQuNThjLS4xNy4yNy0uMzEuNjItLjQgMS4wNnMtLjEzLjk4LS4xMyAxLjYydjIuNjdjMCAuNjQuMDUgMS4xOC4xNCAxLjYyLjA5LjQ1LjIzLjgxLjQgMS4wOXMuMzkuNDguNjQuNjEuNTQuMTkuODcuMTljLjMzIDAgLjYyLS4wNi44Ny0uMTlzLjQ2LS4zMy42My0uNjFjLjE3LS4yOC4zLS42NC4zOS0xLjA5LjA5LS40NS4xMy0uOTkuMTMtMS42MnYtMi42NnoiPjwvcGF0aD48L2c+CjxnIGlkPSJmaWx0ZXIiPjxwYXRoIGQ9Ik0xNS45NiAxMC4yOWwtMi43NSAzLjU0LTEuOTYtMi4zNkw4LjUgMTVoMTFsLTMuNTQtNC43MXpNMyA1SDF2MTZjMCAxLjEuOSAyIDIgMmgxNnYtMkgzVjV6bTE4LTRIN2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlYzYzAtMS4xLS45LTItMi0yem0wIDE2SDdWM2gxNHYxNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJmaWx0ZXItMSI+PHBhdGggZD0iTTMgNUgxdjE2YzAgMS4xLjkgMiAyIDJoMTZ2LTJIM1Y1em0xMSAxMGgyVjVoLTR2Mmgydjh6bTctMTRIN2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlYzYzAtMS4xLS45LTItMi0yem0wIDE2SDdWM2gxNHYxNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJmaWx0ZXItMiI+PHBhdGggZD0iTTMgNUgxdjE2YzAgMS4xLjkgMiAyIDJoMTZ2LTJIM1Y1em0xOC00SDdjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWM2MwLTEuMS0uOS0yLTItMnptMCAxNkg3VjNoMTR2MTR6bS00LTRoLTR2LTJoMmMxLjEgMCAyLS44OSAyLTJWN2MwLTEuMTEtLjktMi0yLTJoLTR2Mmg0djJoLTJjLTEuMSAwLTIgLjg5LTIgMnY0aDZ2LTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLTMiPjxwYXRoIGQ9Ik0yMSAxSDdjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWM2MwLTEuMS0uOS0yLTItMnptMCAxNkg3VjNoMTR2MTR6TTMgNUgxdjE2YzAgMS4xLjkgMiAyIDJoMTZ2LTJIM1Y1em0xNCA4di0xLjVjMC0uODMtLjY3LTEuNS0xLjUtMS41LjgzIDAgMS41LS42NyAxLjUtMS41VjdjMC0xLjExLS45LTItMi0yaC00djJoNHYyaC0ydjJoMnYyaC00djJoNGMxLjEgMCAyLS44OSAyLTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLTQiPjxwYXRoIGQ9Ik0zIDVIMXYxNmMwIDEuMS45IDIgMiAyaDE2di0ySDNWNXptMTIgMTBoMlY1aC0ydjRoLTJWNWgtMnY2aDR2NHptNi0xNEg3Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMi0yLTJ6bTAgMTZIN1YzaDE0djE0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZpbHRlci01Ij48cGF0aCBkPSJNMjEgMUg3Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMi0yLTJ6bTAgMTZIN1YzaDE0djE0ek0zIDVIMXYxNmMwIDEuMS45IDIgMiAyaDE2di0ySDNWNXptMTQgOHYtMmMwLTEuMTEtLjktMi0yLTJoLTJWN2g0VjVoLTZ2Nmg0djJoLTR2Mmg0YzEuMSAwIDItLjg5IDItMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJmaWx0ZXItNiI+PHBhdGggZD0iTTMgNUgxdjE2YzAgMS4xLjkgMiAyIDJoMTZ2LTJIM1Y1em0xOC00SDdjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWM2MwLTEuMS0uOS0yLTItMnptMCAxNkg3VjNoMTR2MTR6bS04LTJoMmMxLjEgMCAyLS44OSAyLTJ2LTJjMC0xLjExLS45LTItMi0yaC0yVjdoNFY1aC00Yy0xLjEgMC0yIC44OS0yIDJ2NmMwIDEuMTEuOSAyIDIgMnptMC00aDJ2MmgtMnYtMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJmaWx0ZXItNyI+PHBhdGggZD0iTTMgNUgxdjE2YzAgMS4xLjkgMiAyIDJoMTZ2LTJIM1Y1em0xOC00SDdjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWM2MwLTEuMS0uOS0yLTItMnptMCAxNkg3VjNoMTR2MTR6bS04LTJsNC04VjVoLTZ2Mmg0bC00IDhoMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJmaWx0ZXItOCI+PHBhdGggZD0iTTMgNUgxdjE2YzAgMS4xLjkgMiAyIDJoMTZ2LTJIM1Y1em0xOC00SDdjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWM2MwLTEuMS0uOS0yLTItMnptMCAxNkg3VjNoMTR2MTR6bS04LTJoMmMxLjEgMCAyLS44OSAyLTJ2LTEuNWMwLS44My0uNjctMS41LTEuNS0xLjUuODMgMCAxLjUtLjY3IDEuNS0xLjVWN2MwLTEuMTEtLjktMi0yLTJoLTJjLTEuMSAwLTIgLjg5LTIgMnYxLjVjMCAuODMuNjcgMS41IDEuNSAxLjUtLjgzIDAtMS41LjY3LTEuNSAxLjVWMTNjMCAxLjExLjkgMiAyIDJ6bTAtOGgydjJoLTJWN3ptMCA0aDJ2MmgtMnYtMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJmaWx0ZXItOSI+PHBhdGggZD0iTTMgNUgxdjE2YzAgMS4xLjkgMiAyIDJoMTZ2LTJIM1Y1em0xOC00SDdjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWM2MwLTEuMS0uOS0yLTItMnptMCAxNkg3VjNoMTR2MTR6TTE1IDVoLTJjLTEuMSAwLTIgLjg5LTIgMnYyYzAgMS4xMS45IDIgMiAyaDJ2MmgtNHYyaDRjMS4xIDAgMi0uODkgMi0yVjdjMC0xLjExLS45LTItMi0yem0wIDRoLTJWN2gydjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLTktcGx1cyI+PHBhdGggZD0iTTMgNUgxdjE2YzAgMS4xLjkgMiAyIDJoMTZ2LTJIM1Y1em0xMSA3VjhjMC0xLjExLS45LTItMi0yaC0xYy0xLjEgMC0yIC44OS0yIDJ2MWMwIDEuMTEuOSAyIDIgMmgxdjFIOXYyaDNjMS4xIDAgMi0uODkgMi0yem0tMy0zVjhoMXYxaC0xem0xMC04SDdjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWM2MwLTEuMS0uOS0yLTItMnptMCA4aC0yVjdoLTJ2MmgtMnYyaDJ2Mmgydi0yaDJ2Nkg3VjNoMTR2NnoiPjwvcGF0aD48L2c+CjxnIGlkPSJmaWx0ZXItYi1hbmQtdyI+PHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2bC03LTh2OEg1bDctOFY1aDd2MTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLWNlbnRlci1mb2N1cyI+PHBhdGggZD0iTTUgMTVIM3Y0YzAgMS4xLjkgMiAyIDJoNHYtMkg1di00ek01IDVoNFYzSDVjLTEuMSAwLTIgLjktMiAydjRoMlY1em0xNC0yaC00djJoNHY0aDJWNWMwLTEuMS0uOS0yLTItMnptMCAxNmgtNHYyaDRjMS4xIDAgMi0uOSAyLTJ2LTRoLTJ2NHpNMTIgOWMtMS42NiAwLTMgMS4zNC0zIDNzMS4zNCAzIDMgMyAzLTEuMzQgMy0zLTEuMzQtMy0zLTN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLWRyYW1hIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNjEgNS42NCA1LjM2IDguMDQgMi4zNSA4LjM2IDAgMTAuOSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0xOSAxOEg2Yy0yLjIxIDAtNC0xLjc5LTQtNHMxLjc5LTQgNC00IDQgMS43OSA0IDRoMmMwLTIuNzYtMS44Ni01LjA4LTQuNC01Ljc4QzguNjEgNi44OCAxMC4yIDYgMTIgNmMzLjAzIDAgNS41IDIuNDcgNS41IDUuNXYuNUgxOWMxLjY1IDAgMyAxLjM1IDMgM3MtMS4zNSAzLTMgM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJmaWx0ZXItZnJhbWVzIj48cGF0aCBkPSJNMjAgNGgtNGwtNC00LTQgNEg0Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bTAgMTZINFY2aDQuNTJsMy41Mi0zLjVMMTUuNTIgNkgyMHYxNHpNMTggOEg2djEwaDEyIj48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLWhkciI+PHBhdGggZD0iTTE0IDZsLTMuNzUgNSAyLjg1IDMuOC0xLjYgMS4yQzkuODEgMTMuNzUgNyAxMCA3IDEwbC02IDhoMjJMMTQgNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJmaWx0ZXItbm9uZSI+PHBhdGggZD0iTTMgNUgxdjE2YzAgMS4xLjkgMiAyIDJoMTZ2LTJIM1Y1em0xOC00SDdjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWM2MwLTEuMS0uOS0yLTItMnptMCAxNkg3VjNoMTR2MTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLXRpbHQtc2hpZnQiPjxwYXRoIGQ9Ik0xMSA0LjA3VjIuMDVjLTIuMDEuMi0zLjg0IDEtNS4zMiAyLjIxTDcuMSA1LjY5YzEuMTEtLjg2IDIuNDQtMS40NCAzLjktMS42MnptNy4zMi4xOUMxNi44NCAzLjA1IDE1LjAxIDIuMjUgMTMgMi4wNXYyLjAyYzEuNDYuMTggMi43OS43NiAzLjkgMS42MmwxLjQyLTEuNDN6TTE5LjkzIDExaDIuMDJjLS4yLTIuMDEtMS0zLjg0LTIuMjEtNS4zMkwxOC4zMSA3LjFjLjg2IDEuMTEgMS40NCAyLjQ0IDEuNjIgMy45ek01LjY5IDcuMUw0LjI2IDUuNjhDMy4wNSA3LjE2IDIuMjUgOC45OSAyLjA1IDExaDIuMDJjLjE4LTEuNDYuNzYtMi43OSAxLjYyLTMuOXpNNC4wNyAxM0gyLjA1Yy4yIDIuMDEgMSAzLjg0IDIuMjEgNS4zMmwxLjQzLTEuNDNjLS44Ni0xLjEtMS40NC0yLjQzLTEuNjItMy44OXpNMTUgMTJjMC0xLjY2LTEuMzQtMy0zLTNzLTMgMS4zNC0zIDMgMS4zNCAzIDMgMyAzLTEuMzQgMy0zem0zLjMxIDQuOWwxLjQzIDEuNDNjMS4yMS0xLjQ4IDIuMDEtMy4zMiAyLjIxLTUuMzJoLTIuMDJjLS4xOCAxLjQ1LS43NiAyLjc4LTEuNjIgMy44OXpNMTMgMTkuOTN2Mi4wMmMyLjAxLS4yIDMuODQtMSA1LjMyLTIuMjFsLTEuNDMtMS40M2MtMS4xLjg2LTIuNDMgMS40NC0zLjg5IDEuNjJ6bS03LjMyLS4xOUM3LjE2IDIwLjk1IDkgMjEuNzUgMTEgMjEuOTV2LTIuMDJjLTEuNDYtLjE4LTIuNzktLjc2LTMuOS0xLjYybC0xLjQyIDEuNDN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLXZpbnRhZ2UiPjxwYXRoIGQ9Ik0xOC43IDEyLjRjLS4yOC0uMTYtLjU3LS4yOS0uODYtLjQuMjktLjExLjU4LS4yNC44Ni0uNCAxLjkyLTEuMTEgMi45OS0zLjEyIDMtNS4xOS0xLjc5LTEuMDMtNC4wNy0xLjExLTYgMC0uMjguMTYtLjU0LjM1LS43OC41NC4wNS0uMzEuMDgtLjYzLjA4LS45NSAwLTIuMjItMS4yMS00LjE1LTMtNS4xOUMxMC4yMSAxLjg1IDkgMy43OCA5IDZjMCAuMzIuMDMuNjQuMDguOTUtLjI0LS4yLS41LS4zOS0uNzgtLjU1LTEuOTItMS4xMS00LjItMS4wMy02IDAgMCAyLjA3IDEuMDcgNC4wOCAzIDUuMTkuMjguMTYuNTcuMjkuODYuNC0uMjkuMTEtLjU4LjI0LS44Ni40LTEuOTIgMS4xMS0yLjk5IDMuMTItMyA1LjE5IDEuNzkgMS4wMyA0LjA3IDEuMTEgNiAwIC4yOC0uMTYuNTQtLjM1Ljc4LS41NC0uMDUuMzItLjA4LjY0LS4wOC45NiAwIDIuMjIgMS4yMSA0LjE1IDMgNS4xOSAxLjc5LTEuMDQgMy0yLjk3IDMtNS4xOSAwLS4zMi0uMDMtLjY0LS4wOC0uOTUuMjQuMi41LjM4Ljc4LjU0IDEuOTIgMS4xMSA0LjIgMS4wMyA2IDAtLjAxLTIuMDctMS4wOC00LjA4LTMtNS4xOXpNMTIgMTZjLTIuMjEgMC00LTEuNzktNC00czEuNzktNCA0LTQgNCAxLjc5IDQgNC0xLjc5IDQtNCA0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZsYXJlIj48cGF0aCBkPSJNNyAxMUgxdjJoNnYtMnptMi4xNy0zLjI0TDcuMDUgNS42NCA1LjY0IDcuMDVsMi4xMiAyLjEyIDEuNDEtMS40MXpNMTMgMWgtMnY2aDJWMXptNS4zNiA2LjA1bC0xLjQxLTEuNDEtMi4xMiAyLjEyIDEuNDEgMS40MSAyLjEyLTIuMTJ6TTE3IDExdjJoNnYtMmgtNnptLTUtMmMtMS42NiAwLTMgMS4zNC0zIDNzMS4zNCAzIDMgMyAzLTEuMzQgMy0zLTEuMzQtMy0zLTN6bTIuODMgNy4yNGwyLjEyIDIuMTIgMS40MS0xLjQxLTIuMTItMi4xMi0xLjQxIDEuNDF6bS05LjE5LjcxbDEuNDEgMS40MSAyLjEyLTIuMTItMS40MS0xLjQxLTIuMTIgMi4xMnpNMTEgMjNoMnYtNmgtMnY2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZsYXNoLWF1dG8iPjxwYXRoIGQ9Ik0zIDJ2MTJoM3Y5bDctMTJIOWw0LTlIM3ptMTYgMGgtMmwtMy4yIDloMS45bC43LTJoMy4ybC43IDJoMS45TDE5IDJ6bS0yLjE1IDUuNjVMMTggNGwxLjE1IDMuNjVoLTIuM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJmbGFzaC1vZmYiPjxwYXRoIGQ9Ik0zLjI3IDNMMiA0LjI3bDUgNVYxM2gzdjlsMy41OC02LjE0TDE3LjczIDIwIDE5IDE4LjczIDMuMjcgM3pNMTcgMTBoLTRsNC04SDd2Mi4xOGw4LjQ2IDguNDZMMTcgMTB6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmxhc2gtb24iPjxwYXRoIGQ9Ik03IDJ2MTFoM3Y5bDctMTJoLTRsNC04eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZsaXAiPjxwYXRoIGQ9Ik0xNSAyMWgydi0yaC0ydjJ6bTQtMTJoMlY3aC0ydjJ6TTMgNXYxNGMwIDEuMS45IDIgMiAyaDR2LTJINVY1aDRWM0g1Yy0xLjEgMC0yIC45LTIgMnptMTYtMnYyaDJjMC0xLjEtLjktMi0yLTJ6bS04IDIwaDJWMWgtMnYyMnptOC02aDJ2LTJoLTJ2MnpNMTUgNWgyVjNoLTJ2MnptNCA4aDJ2LTJoLTJ2MnptMCA4YzEuMSAwIDItLjkgMi0yaC0ydjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZ3JhZGllbnQiPjxwYXRoIGQ9Ik0xMSA5aDJ2MmgtMnptLTIgMmgydjJIOXptNCAwaDJ2MmgtMnptMi0yaDJ2MmgtMnpNNyA5aDJ2Mkg3em0xMi02SDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnpNOSAxOEg3di0yaDJ2MnptNCAwaC0ydi0yaDJ2MnptNCAwaC0ydi0yaDJ2MnptMi03aC0ydjJoMnYyaC0ydi0yaC0ydjJoLTJ2LTJoLTJ2Mkg5di0ySDd2Mkg1di0yaDJ2LTJINVY1aDE0djZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZ3JhaW4iPjxwYXRoIGQ9Ik0xMCAxMmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6TTYgOGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTAgOGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTEyLThjMS4xIDAgMi0uOSAyLTJzLS45LTItMi0yLTIgLjktMiAyIC45IDIgMiAyem0tNCA4Yy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptNC00Yy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptLTQtNGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bS00LTRjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImdyaWQtb2ZmIj48cGF0aCBkPSJNOCA0djEuNDVsMiAyVjRoNHY0aC0zLjQ1bDIgMkgxNHYxLjQ1bDIgMlYxMGg0djRoLTMuNDVsMiAySDIwdjEuNDVsMiAyVjRjMC0xLjEtLjktMi0yLTJINC41NWwyIDJIOHptOCAwaDR2NGgtNFY0ek0xLjI3IDEuMjdMMCAyLjU1bDIgMlYyMGMwIDEuMS45IDIgMiAyaDE1LjQ2bDIgMiAxLjI3LTEuMjdMMS4yNyAxLjI3ek0xMCAxMi41NUwxMS40NSAxNEgxMHYtMS40NXptLTYtNkw1LjQ1IDhINFY2LjU1ek04IDIwSDR2LTRoNHY0em0wLTZINHYtNGgzLjQ1bC41NS41NVYxNHptNiA2aC00di00aDMuNDVsLjU1LjU0VjIwem0yIDB2LTEuNDZMMTcuNDYgMjBIMTZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZ3JpZC1vbiI+PHBhdGggZD0iTTIwIDJINGMtMS4xIDAtMiAuOS0yIDJ2MTZjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yek04IDIwSDR2LTRoNHY0em0wLTZINHYtNGg0djR6bTAtNkg0VjRoNHY0em02IDEyaC00di00aDR2NHptMC02aC00di00aDR2NHptMC02aC00VjRoNHY0em02IDEyaC00di00aDR2NHptMC02aC00di00aDR2NHptMC02aC00VjRoNHY0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Imhkci1vZmYiPjxwYXRoIGQ9Ik0xNy41IDE1di0yaDEuMWwuOSAySDIxbC0uOS0yLjFjLjUtLjIuOS0uOC45LTEuNHYtMWMwLS44LS43LTEuNS0xLjUtMS41SDE2djQuOWwxLjEgMS4xaC40em0wLTQuNWgydjFoLTJ2LTF6bS00LjUgMHYuNGwxLjUgMS41di0xLjljMC0uOC0uNy0xLjUtMS41LTEuNWgtMS45bDEuNSAxLjVoLjR6bS0zLjUtMWwtNy03LTEuMSAxTDYuOSA5aC0uNHYyaC0yVjlIM3Y2aDEuNXYtMi41aDJWMTVIOHYtNC45bDEuNSAxLjVWMTVoMy40bDcuNiA3LjYgMS4xLTEuMS0xMi4xLTEyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9Imhkci1vbiI+PHBhdGggZD0iTTIxIDExLjV2LTFjMC0uOC0uNy0xLjUtMS41LTEuNUgxNnY2aDEuNXYtMmgxLjFsLjkgMkgyMWwtLjktMi4xYy41LS4zLjktLjguOS0xLjR6bS0xLjUgMGgtMnYtMWgydjF6bS0xMy0uNWgtMlY5SDN2NmgxLjV2LTIuNWgyVjE1SDhWOUg2LjV2MnpNMTMgOUg5LjV2NkgxM2MuOCAwIDEuNS0uNyAxLjUtMS41di0zYzAtLjgtLjctMS41LTEuNS0xLjV6bTAgNC41aC0ydi0zaDJ2M3oiPjwvcGF0aD48L2c+CjxnIGlkPSJoZHItc3Ryb25nIj48cGF0aCBkPSJNMTcgNmMtMy4zMSAwLTYgMi42OS02IDZzMi42OSA2IDYgNiA2LTIuNjkgNi02LTIuNjktNi02LTZ6TTUgOGMtMi4yMSAwLTQgMS43OS00IDRzMS43OSA0IDQgNCA0LTEuNzkgNC00LTEuNzktNC00LTR6bTAgNmMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaGRyLXdlYWsiPjxwYXRoIGQ9Ik01IDhjLTIuMjEgMC00IDEuNzktNCA0czEuNzkgNCA0IDQgNC0xLjc5IDQtNC0xLjc5LTQtNC00em0xMi0yYy0zLjMxIDAtNiAyLjY5LTYgNnMyLjY5IDYgNiA2IDYtMi42OSA2LTYtMi42OS02LTYtNnptMCAxMGMtMi4yMSAwLTQtMS43OS00LTRzMS43OS00IDQtNCA0IDEuNzkgNCA0LTEuNzkgNC00IDR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaGVhbGluZyI+PHBhdGggZD0iTTE3LjczIDEyLjAybDMuOTgtMy45OGMuMzktLjM5LjM5LTEuMDIgMC0xLjQxbC00LjM0LTQuMzRjLS4zOS0uMzktMS4wMi0uMzktMS40MSAwbC0zLjk4IDMuOThMOCAyLjI5QzcuOCAyLjEgNy41NSAyIDcuMjkgMmMtLjI1IDAtLjUxLjEtLjcuMjlMMi4yNSA2LjYzYy0uMzkuMzktLjM5IDEuMDIgMCAxLjQxbDMuOTggMy45OEwyLjI1IDE2Yy0uMzkuMzktLjM5IDEuMDIgMCAxLjQxbDQuMzQgNC4zNGMuMzkuMzkgMS4wMi4zOSAxLjQxIDBsMy45OC0zLjk4IDMuOTggMy45OGMuMi4yLjQ1LjI5LjcxLjI5LjI2IDAgLjUxLS4xLjcxLS4yOWw0LjM0LTQuMzRjLjM5LS4zOS4zOS0xLjAyIDAtMS40MWwtMy45OS0zLjk4ek0xMiA5Yy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bS00LjcxIDEuOTZMMy42NiA3LjM0bDMuNjMtMy42MyAzLjYyIDMuNjItMy42MiAzLjYzek0xMCAxM2MtLjU1IDAtMS0uNDUtMS0xcy40NS0xIDEtMSAxIC40NSAxIDEtLjQ1IDEtMSAxem0yIDJjLS41NSAwLTEtLjQ1LTEtMXMuNDUtMSAxLTEgMSAuNDUgMSAxLS40NSAxLTEgMXptMi00Yy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTIuNjYgOS4zNGwtMy42My0zLjYyIDMuNjMtMy42MyAzLjYyIDMuNjItMy42MiAzLjYzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImltYWdlIj48cGF0aCBkPSJNMjEgMTlWNWMwLTEuMS0uOS0yLTItMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yek04LjUgMTMuNWwyLjUgMy4wMUwxNC41IDEybDQuNSA2SDVsMy41LTQuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJpbWFnZS1hc3BlY3QtcmF0aW8iPjxwYXRoIGQ9Ik0xNiAxMGgtMnYyaDJ2LTJ6bTAgNGgtMnYyaDJ2LTJ6bS04LTRINnYyaDJ2LTJ6bTQgMGgtMnYyaDJ2LTJ6bTgtNkg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bTAgMTRINFY2aDE2djEyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImlzbyI+PHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yek01LjUgNy41aDJ2LTJIOXYyaDJWOUg5djJINy41VjloLTJWNy41ek0xOSAxOUg1TDE5IDV2MTR6bS0yLTJ2LTEuNWgtNVYxN2g1eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImxhbmRzY2FwZSI+PHBhdGggZD0iTTE0IDZsLTMuNzUgNSAyLjg1IDMuOC0xLjYgMS4yQzkuODEgMTMuNzUgNyAxMCA3IDEwbC02IDhoMjJMMTQgNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJsZWFrLWFkZCI+PHBhdGggZD0iTTYgM0gzdjNjMS42NiAwIDMtMS4zNCAzLTN6bTggMGgtMmMwIDQuOTctNC4wMyA5LTkgOXYyYzYuMDggMCAxMS00LjkzIDExLTExem0tNCAwSDhjMCAyLjc2LTIuMjQgNS01IDV2MmMzLjg3IDAgNy0zLjEzIDctN3ptMCAxOGgyYzAtNC45NyA0LjAzLTkgOS05di0yYy02LjA3IDAtMTEgNC45My0xMSAxMXptOCAwaDN2LTNjLTEuNjYgMC0zIDEuMzQtMyAzem0tNCAwaDJjMC0yLjc2IDIuMjQtNSA1LTV2LTJjLTMuODcgMC03IDMuMTMtNyA3eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImxlYWstcmVtb3ZlIj48cGF0aCBkPSJNMTAgM0g4YzAgLjM3LS4wNC43Mi0uMTIgMS4wNmwxLjU5IDEuNTlDOS44MSA0Ljg0IDEwIDMuOTQgMTAgM3pNMyA0LjI3bDIuODQgMi44NEM1LjAzIDcuNjcgNC4wNiA4IDMgOHYyYzEuNjEgMCAzLjA5LS41NSA0LjI3LTEuNDZMOC43IDkuOTdDNy4xNCAxMS4yNCA1LjE2IDEyIDMgMTJ2MmMyLjcxIDAgNS4xOS0uOTkgNy4xMS0yLjYybDIuNSAyLjVDMTAuOTkgMTUuODEgMTAgMTguMjkgMTAgMjFoMmMwLTIuMTYuNzYtNC4xNCAyLjAzLTUuNjlsMS40MyAxLjQzQzE0LjU1IDE3LjkxIDE0IDE5LjM5IDE0IDIxaDJjMC0xLjA2LjMzLTIuMDMuODktMi44NEwxOS43MyAyMSAyMSAxOS43MyA0LjI3IDMgMyA0LjI3ek0xNCAzaC0yYzAgMS41LS4zNyAyLjkxLTEuMDIgNC4xNmwxLjQ2IDEuNDZDMTMuNDIgNi45OCAxNCA1LjA2IDE0IDN6bTUuOTQgMTMuMTJjLjM0LS4wOC42OS0uMTIgMS4wNi0uMTJ2LTJjLS45NCAwLTEuODQuMTktMi42Ni41MmwxLjYgMS42em0tNC41Ni00LjU2bDEuNDYgMS40NkMxOC4wOSAxMi4zNyAxOS41IDEyIDIxIDEydi0yYy0yLjA2IDAtMy45OC41OC01LjYyIDEuNTZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibGVucyI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibGlua2VkLWNhbWVyYSI+PGNpcmNsZSBjeD0iMTIiIGN5PSIxNCIgcj0iMy4yIj48L2NpcmNsZT48cGF0aCBkPSJNMTYgMy4zM2MyLjU4IDAgNC42NyAyLjA5IDQuNjcgNC42N0gyMmMwLTMuMzEtMi42OS02LTYtNnYxLjMzTTE2IDZjMS4xMSAwIDIgLjg5IDIgMmgxLjMzYzAtMS44NC0xLjQ5LTMuMzMtMy4zMy0zLjMzVjYiPjwvcGF0aD48cGF0aCBkPSJNMTcgOWMwLTEuMTEtLjg5LTItMi0yVjRIOUw3LjE3IDZINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY5aC01em0tNSAxMGMtMi43NiAwLTUtMi4yNC01LTVzMi4yNC01IDUtNSA1IDIuMjQgNSA1LTIuMjQgNS01IDV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibG9va3MiPjxwYXRoIGQ9Ik0xMiAxMGMtMy44NiAwLTcgMy4xNC03IDdoMmMwLTIuNzYgMi4yNC01IDUtNXM1IDIuMjQgNSA1aDJjMC0zLjg2LTMuMTQtNy03LTd6bTAtNEM1LjkzIDYgMSAxMC45MyAxIDE3aDJjMC00Ljk2IDQuMDQtOSA5LTlzOSA0LjA0IDkgOWgyYzAtNi4wNy00LjkzLTExLTExLTExeiI+PC9wYXRoPjwvZz4KPGcgaWQ9Imxvb2tzLTMiPjxwYXRoIGQ9Ik0xOS4wMSAzaC0xNGMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNCA3LjVjMCAuODMtLjY3IDEuNS0xLjUgMS41LjgzIDAgMS41LjY3IDEuNSAxLjVWMTVjMCAxLjExLS45IDItMiAyaC00di0yaDR2LTJoLTJ2LTJoMlY5aC00VjdoNGMxLjEgMCAyIC44OSAyIDJ2MS41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Imxvb2tzLTQiPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTQgMTRoLTJ2LTRIOVY3aDJ2NGgyVjdoMnYxMHoiPjwvcGF0aD48L2c+CjxnIGlkPSJsb29rcy01Ij48cGF0aCBkPSJNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS00IDZoLTR2MmgyYzEuMSAwIDIgLjg5IDIgMnYyYzAgMS4xMS0uOSAyLTIgMkg5di0yaDR2LTJIOVY3aDZ2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJsb29rcy02Ij48cGF0aCBkPSJNMTEgMTVoMnYtMmgtMnYyem04LTEySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTQgNmgtNHYyaDJjMS4xIDAgMiAuODkgMiAydjJjMCAxLjExLS45IDItMiAyaC0yYy0xLjEgMC0yLS44OS0yLTJWOWMwLTEuMTEuOS0yIDItMmg0djJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibG9va3Mtb25lIj48cGF0aCBkPSJNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS01IDE0aC0yVjloLTJWN2g0djEweiI+PC9wYXRoPjwvZz4KPGcgaWQ9Imxvb2tzLXR3byI+PHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNCA4YzAgMS4xMS0uOSAyLTIgMmgtMnYyaDR2Mkg5di00YzAtMS4xMS45LTIgMi0yaDJWOUg5VjdoNGMxLjEgMCAyIC44OSAyIDJ2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJsb3VwZSI+PHBhdGggZD0iTTEzIDdoLTJ2NEg3djJoNHY0aDJ2LTRoNHYtMmgtNFY3em0tMS01QzYuNDkgMiAyIDYuNDkgMiAxMnM0LjQ5IDEwIDEwIDEwaDhjMS4xIDAgMi0uOSAyLTJ2LThjMC01LjUxLTQuNDktMTAtMTAtMTB6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Im1vbm9jaHJvbWUtcGhvdG9zIj48cGF0aCBkPSJNMjAgNWgtMy4yTDE1IDNIOUw3LjIgNUg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjdjMC0xLjEtLjktMi0yLTJ6bTAgMTRoLTh2LTFjLTIuOCAwLTUtMi4yLTUtNXMyLjItNSA1LTVWN2g4djEyem0tMy02YzAtMi44LTIuMi01LTUtNXYxLjhjMS44IDAgMy4yIDEuNCAzLjIgMy4ycy0xLjQgMy4yLTMuMiAzLjJWMThjMi44IDAgNS0yLjIgNS01em0tOC4yIDBjMCAxLjggMS40IDMuMiAzLjIgMy4yVjkuOGMtMS44IDAtMy4yIDEuNC0zLjIgMy4yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9Im1vdmllLWNyZWF0aW9uIj48cGF0aCBkPSJNMTggNGwyIDRoLTNsLTItNGgtMmwyIDRoLTNsLTItNEg4bDIgNEg3TDUgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY0aC00eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Im1vdmllLWZpbHRlciI+PHBhdGggZD0iTTE4IDRsMiAzaC0zbC0yLTNoLTJsMiAzaC0zbC0yLTNIOGwyIDNIN0w1IDRINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE4YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNGgtNHptLTYuNzUgMTEuMjVMMTAgMThsLTEuMjUtMi43NUw2IDE0bDIuNzUtMS4yNUwxMCAxMGwxLjI1IDIuNzVMMTQgMTRsLTIuNzUgMS4yNXptNS42OS0zLjMxTDE2IDE0bC0uOTQtMi4wNkwxMyAxMWwyLjA2LS45NEwxNiA4bC45NCAyLjA2TDE5IDExbC0yLjA2Ljk0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Im11c2ljLW5vdGUiPjxwYXRoIGQ9Ik0xMiAzdjEwLjU1Yy0uNTktLjM0LTEuMjctLjU1LTItLjU1LTIuMjEgMC00IDEuNzktNCA0czEuNzkgNCA0IDQgNC0xLjc5IDQtNFY3aDRWM2gtNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJuYXR1cmUiPjxwYXRoIGQ9Ik0xMyAxNi4xMmMzLjQ3LS40MSA2LjE3LTMuMzYgNi4xNy02Ljk1IDAtMy44Ny0zLjEzLTctNy03cy03IDMuMTMtNyA3YzAgMy40NyAyLjUyIDYuMzQgNS44MyA2Ljg5VjIwSDV2MmgxNHYtMmgtNnYtMy44OHoiPjwvcGF0aD48L2c+CjxnIGlkPSJuYXR1cmUtcGVvcGxlIj48cGF0aCBkPSJNMjIuMTcgOS4xN2MwLTMuODctMy4xMy03LTctN3MtNyAzLjEzLTcgN2MwIDMuNDcgMi41MiA2LjM0IDUuODMgNi44OVYyMEg2di0zaDF2LTRjMC0uNTUtLjQ1LTEtMS0xSDNjLS41NSAwLTEgLjQ1LTEgMXY0aDF2NWgxNnYtMmgtM3YtMy44OGMzLjQ3LS40MSA2LjE3LTMuMzYgNi4xNy02Ljk1ek00LjUgMTFjLjgzIDAgMS41LS42NyAxLjUtMS41UzUuMzMgOCA0LjUgOCAzIDguNjcgMyA5LjUgMy42NyAxMSA0LjUgMTF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibmF2aWdhdGUtYmVmb3JlIj48cGF0aCBkPSJNMTUuNDEgNy40MUwxNCA2bC02IDYgNiA2IDEuNDEtMS40MUwxMC44MyAxMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJuYXZpZ2F0ZS1uZXh0Ij48cGF0aCBkPSJNMTAgNkw4LjU5IDcuNDEgMTMuMTcgMTJsLTQuNTggNC41OUwxMCAxOGw2LTZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGFsZXR0ZSI+PHBhdGggZD0iTTEyIDNjLTQuOTcgMC05IDQuMDMtOSA5czQuMDMgOSA5IDljLjgzIDAgMS41LS42NyAxLjUtMS41IDAtLjM5LS4xNS0uNzQtLjM5LTEuMDEtLjIzLS4yNi0uMzgtLjYxLS4zOC0uOTkgMC0uODMuNjctMS41IDEuNS0xLjVIMTZjMi43NiAwIDUtMi4yNCA1LTUgMC00LjQyLTQuMDMtOC05LTh6bS01LjUgOWMtLjgzIDAtMS41LS42Ny0xLjUtMS41UzUuNjcgOSA2LjUgOSA4IDkuNjcgOCAxMC41IDcuMzMgMTIgNi41IDEyem0zLTRDOC42NyA4IDggNy4zMyA4IDYuNVM4LjY3IDUgOS41IDVzMS41LjY3IDEuNSAxLjVTMTAuMzMgOCA5LjUgOHptNSAwYy0uODMgMC0xLjUtLjY3LTEuNS0xLjVTMTMuNjcgNSAxNC41IDVzMS41LjY3IDEuNSAxLjVTMTUuMzMgOCAxNC41IDh6bTMgNGMtLjgzIDAtMS41LS42Ny0xLjUtMS41UzE2LjY3IDkgMTcuNSA5czEuNS42NyAxLjUgMS41LS42NyAxLjUtMS41IDEuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJwYW5vcmFtYSI+PHBhdGggZD0iTTIzIDE4VjZjMC0xLjEtLjktMi0yLTJIM2MtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMnpNOC41IDEyLjVsMi41IDMuMDFMMTQuNSAxMWw0LjUgNkg1bDMuNS00LjV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGFub3JhbWEtZmlzaC1leWUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDcgMiAyIDYuNDcgMiAxMnM0LjQ3IDEwIDEwIDEwIDEwLTQuNDcgMTAtMTBTMTcuNTMgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJwYW5vcmFtYS1ob3Jpem9udGFsIj48cGF0aCBkPSJNMjAgNi41NHYxMC45MWMtMi42LS43Ny01LjI4LTEuMTYtOC0xLjE2LTIuNzIgMC01LjQuMzktOCAxLjE2VjYuNTRjMi42Ljc3IDUuMjggMS4xNiA4IDEuMTYgMi43Mi4wMSA1LjQtLjM4IDgtMS4xNk0yMS40MyA0Yy0uMSAwLS4yLjAyLS4zMS4wNkMxOC4xOCA1LjE2IDE1LjA5IDUuNyAxMiA1LjdjLTMuMDkgMC02LjE4LS41NS05LjEyLTEuNjQtLjExLS4wNC0uMjItLjA2LS4zMS0uMDYtLjM0IDAtLjU3LjIzLS41Ny42M3YxNC43NWMwIC4zOS4yMy42Mi41Ny42Mi4xIDAgLjItLjAyLjMxLS4wNiAyLjk0LTEuMSA2LjAzLTEuNjQgOS4xMi0xLjY0IDMuMDkgMCA2LjE4LjU1IDkuMTIgMS42NC4xMS4wNC4yMS4wNi4zMS4wNi4zMyAwIC41Ny0uMjMuNTctLjYzVjQuNjNjMC0uNC0uMjQtLjYzLS41Ny0uNjN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGFub3JhbWEtdmVydGljYWwiPjxwYXRoIGQ9Ik0xOS45NCAyMS4xMmMtMS4xLTIuOTQtMS42NC02LjAzLTEuNjQtOS4xMiAwLTMuMDkuNTUtNi4xOCAxLjY0LTkuMTIuMDQtLjExLjA2LS4yMi4wNi0uMzEgMC0uMzQtLjIzLS41Ny0uNjMtLjU3SDQuNjNjLS40IDAtLjYzLjIzLS42My41NyAwIC4xLjAyLjIuMDYuMzFDNS4xNiA1LjgyIDUuNzEgOC45MSA1LjcxIDEyYzAgMy4wOS0uNTUgNi4xOC0xLjY0IDkuMTItLjA1LjExLS4wNy4yMi0uMDcuMzEgMCAuMzMuMjMuNTcuNjMuNTdoMTQuNzVjLjM5IDAgLjYzLS4yNC42My0uNTctLjAxLS4xLS4wMy0uMi0uMDctLjMxek02LjU0IDIwYy43Ny0yLjYgMS4xNi01LjI4IDEuMTYtOCAwLTIuNzItLjM5LTUuNC0xLjE2LThoMTAuOTFjLS43NyAyLjYtMS4xNiA1LjI4LTEuMTYgOCAwIDIuNzIuMzkgNS40IDEuMTYgOEg2LjU0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBhbm9yYW1hLXdpZGUtYW5nbGUiPjxwYXRoIGQ9Ik0xMiA2YzIuNDUgMCA0LjcxLjIgNy4yOS42NC40NyAxLjc4LjcxIDMuNTguNzEgNS4zNiAwIDEuNzgtLjI0IDMuNTgtLjcxIDUuMzYtMi41OC40NC00Ljg0LjY0LTcuMjkuNjRzLTQuNzEtLjItNy4yOS0uNjRDNC4yNCAxNS41OCA0IDEzLjc4IDQgMTJjMC0xLjc4LjI0LTMuNTguNzEtNS4zNkM3LjI5IDYuMiA5LjU1IDYgMTIgNm0wLTJjLTIuNzMgMC01LjIyLjI0LTcuOTUuNzJsLS45My4xNi0uMjUuOUMyLjI5IDcuODUgMiA5LjkzIDIgMTJzLjI5IDQuMTUuODcgNi4yMmwuMjUuODkuOTMuMTZjMi43My40OSA1LjIyLjczIDcuOTUuNzNzNS4yMi0uMjQgNy45NS0uNzJsLjkzLS4xNi4yNS0uODljLjU4LTIuMDguODctNC4xNi44Ny02LjIzcy0uMjktNC4xNS0uODctNi4yMmwtLjI1LS44OS0uOTMtLjE2QzE3LjIyIDQuMjQgMTQuNzMgNCAxMiA0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBob3RvIj48cGF0aCBkPSJNMjEgMTlWNWMwLTEuMS0uOS0yLTItMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yek04LjUgMTMuNWwyLjUgMy4wMUwxNC41IDEybDQuNSA2SDVsMy41LTQuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJwaG90by1hbGJ1bSI+PHBhdGggZD0iTTE4IDJINmMtMS4xIDAtMiAuOS0yIDJ2MTZjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yek02IDRoNXY4bC0yLjUtMS41TDYgMTJWNHptMCAxNWwzLTMuODYgMi4xNCAyLjU4IDMtMy44NkwxOCAxOUg2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBob3RvLWNhbWVyYSI+PGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMy4yIj48L2NpcmNsZT48cGF0aCBkPSJNOSAyTDcuMTcgNEg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJoLTMuMTdMMTUgMkg5em0zIDE1Yy0yLjc2IDAtNS0yLjI0LTUtNXMyLjI0LTUgNS01IDUgMi4yNCA1IDUtMi4yNCA1LTUgNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJwaG90by1maWx0ZXIiPjxwYXRoIGQ9Ik0xOS4wMiAxMHY5SDVWNWg5VjNINS4wMmMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMnYtOWgtMnpNMTcgMTBsLjk0LTIuMDZMMjAgN2wtMi4wNi0uOTRMMTcgNGwtLjk0IDIuMDZMMTQgN2wyLjA2Ljk0em0tMy43NS43NUwxMiA4bC0xLjI1IDIuNzVMOCAxMmwyLjc1IDEuMjVMMTIgMTZsMS4yNS0yLjc1TDE2IDEyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBob3RvLWxpYnJhcnkiPjxwYXRoIGQ9Ik0yMiAxNlY0YzAtMS4xLS45LTItMi0ySDhjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJ6bS0xMS00bDIuMDMgMi43MUwxNiAxMWw0IDVIOGwzLTR6TTIgNnYxNGMwIDEuMS45IDIgMiAyaDE0di0ySDRWNkgyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBob3RvLXNpemUtc2VsZWN0LWFjdHVhbCI+PHBhdGggZD0iTTIxIDNIM0MyIDMgMSA0IDEgNXYxNGMwIDEuMS45IDIgMiAyaDE4YzEgMCAyLTEgMi0yVjVjMC0xLTEtMi0yLTJ6TTUgMTdsMy41LTQuNSAyLjUgMy4wMUwxNC41IDExbDQuNSA2SDV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGhvdG8tc2l6ZS1zZWxlY3QtbGFyZ2UiPjxwYXRoIGQ9Ik0yMSAxNWgydjJoLTJ2LTJ6bTAtNGgydjJoLTJ2LTJ6bTIgOGgtMnYyYzEgMCAyLTEgMi0yek0xMyAzaDJ2MmgtMlYzem04IDRoMnYyaC0yVjd6bTAtNHYyaDJjMC0xLTEtMi0yLTJ6TTEgN2gydjJIMVY3em0xNi00aDJ2MmgtMlYzem0wIDE2aDJ2MmgtMnYtMnpNMyAzQzIgMyAxIDQgMSA1aDJWM3ptNiAwaDJ2Mkg5VjN6TTUgM2gydjJINVYzem0tNCA4djhjMCAxLjEuOSAyIDIgMmgxMlYxMUgxem0yIDhsMi41LTMuMjEgMS43OSAyLjE1IDIuNS0zLjIyTDEzIDE5SDN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGhvdG8tc2l6ZS1zZWxlY3Qtc21hbGwiPjxwYXRoIGQ9Ik0yMyAxNWgtMnYyaDJ2LTJ6bTAtNGgtMnYyaDJ2LTJ6bTAgOGgtMnYyYzEgMCAyLTEgMi0yek0xNSAzaC0ydjJoMlYzem04IDRoLTJ2MmgyVjd6bS0yLTR2MmgyYzAtMS0xLTItMi0yek0zIDIxaDh2LTZIMXY0YzAgMS4xLjkgMiAyIDJ6TTMgN0gxdjJoMlY3em0xMiAxMmgtMnYyaDJ2LTJ6bTQtMTZoLTJ2MmgyVjN6bTAgMTZoLTJ2Mmgydi0yek0zIDNDMiAzIDEgNCAxIDVoMlYzem0wIDhIMXYyaDJ2LTJ6bTgtOEg5djJoMlYzek03IDNINXYyaDJWM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJwaWN0dXJlLWFzLXBkZiI+PHBhdGggZD0iTTIwIDJIOGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tOC41IDcuNWMwIC44My0uNjcgMS41LTEuNSAxLjVIOXYySDcuNVY3SDEwYy44MyAwIDEuNS42NyAxLjUgMS41djF6bTUgMmMwIC44My0uNjcgMS41LTEuNSAxLjVoLTIuNVY3SDE1Yy44MyAwIDEuNS42NyAxLjUgMS41djN6bTQtM0gxOXYxaDEuNVYxMUgxOXYyaC0xLjVWN2gzdjEuNXpNOSA5LjVoMXYtMUg5djF6TTQgNkgydjE0YzAgMS4xLjkgMiAyIDJoMTR2LTJINFY2em0xMCA1LjVoMXYtM2gtMXYzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBvcnRyYWl0Ij48cGF0aCBkPSJNMTIgMTIuMjVjMS4yNCAwIDIuMjUtMS4wMSAyLjI1LTIuMjVTMTMuMjQgNy43NSAxMiA3Ljc1IDkuNzUgOC43NiA5Ljc1IDEwczEuMDEgMi4yNSAyLjI1IDIuMjV6bTQuNSA0YzAtMS41LTMtMi4yNS00LjUtMi4yNXMtNC41Ljc1LTQuNSAyLjI1VjE3aDl2LS43NXpNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTZINVY1aDE0djE0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJlbW92ZS1yZWQtZXllIj48cGF0aCBkPSJNMTIgNC41QzcgNC41IDIuNzMgNy42MSAxIDEyYzEuNzMgNC4zOSA2IDcuNSAxMSA3LjVzOS4yNy0zLjExIDExLTcuNWMtMS43My00LjM5LTYtNy41LTExLTcuNXpNMTIgMTdjLTIuNzYgMC01LTIuMjQtNS01czIuMjQtNSA1LTUgNSAyLjI0IDUgNS0yLjI0IDUtNSA1em0wLThjLTEuNjYgMC0zIDEuMzQtMyAzczEuMzQgMyAzIDMgMy0xLjM0IDMtMy0xLjM0LTMtMy0zeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJvdGF0ZS05MC1kZWdyZWVzLWNjdyI+PHBhdGggZD0iTTcuMzQgNi40MUwuODYgMTIuOWw2LjQ5IDYuNDggNi40OS02LjQ4LTYuNS02LjQ5ek0zLjY5IDEyLjlsMy42Ni0zLjY2TDExIDEyLjlsLTMuNjYgMy42Ni0zLjY1LTMuNjZ6bTE1LjY3LTYuMjZDMTcuNjEgNC44OCAxNS4zIDQgMTMgNFYuNzZMOC43NiA1IDEzIDkuMjRWNmMxLjc5IDAgMy41OC42OCA0Ljk1IDIuMDUgMi43MyAyLjczIDIuNzMgNy4xNyAwIDkuOUMxNi41OCAxOS4zMiAxNC43OSAyMCAxMyAyMGMtLjk3IDAtMS45NC0uMjEtMi44NC0uNjFsLTEuNDkgMS40OUMxMC4wMiAyMS42MiAxMS41MSAyMiAxMyAyMmMyLjMgMCA0LjYxLS44OCA2LjM2LTIuNjQgMy41Mi0zLjUxIDMuNTItOS4yMSAwLTEyLjcyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJvdGF0ZS1sZWZ0Ij48cGF0aCBkPSJNNy4xMSA4LjUzTDUuNyA3LjExQzQuOCA4LjI3IDQuMjQgOS42MSA0LjA3IDExaDIuMDJjLjE0LS44Ny40OS0xLjcyIDEuMDItMi40N3pNNi4wOSAxM0g0LjA3Yy4xNyAxLjM5LjcyIDIuNzMgMS42MiAzLjg5bDEuNDEtMS40MmMtLjUyLS43NS0uODctMS41OS0xLjAxLTIuNDd6bTEuMDEgNS4zMmMxLjE2LjkgMi41MSAxLjQ0IDMuOSAxLjYxVjE3LjljLS44Ny0uMTUtMS43MS0uNDktMi40Ni0xLjAzTDcuMSAxOC4zMnpNMTMgNC4wN1YxTDguNDUgNS41NSAxMyAxMFY2LjA5YzIuODQuNDggNSAyLjk0IDUgNS45MXMtMi4xNiA1LjQzLTUgNS45MXYyLjAyYzMuOTUtLjQ5IDctMy44NSA3LTcuOTNzLTMuMDUtNy40NC03LTcuOTN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icm90YXRlLXJpZ2h0Ij48cGF0aCBkPSJNMTUuNTUgNS41NUwxMSAxdjMuMDdDNy4wNiA0LjU2IDQgNy45MiA0IDEyczMuMDUgNy40NCA3IDcuOTN2LTIuMDJjLTIuODQtLjQ4LTUtMi45NC01LTUuOTFzMi4xNi01LjQzIDUtNS45MVYxMGw0LjU1LTQuNDV6TTE5LjkzIDExYy0uMTctMS4zOS0uNzItMi43My0xLjYyLTMuODlsLTEuNDIgMS40MmMuNTQuNzUuODggMS42IDEuMDIgMi40N2gyLjAyek0xMyAxNy45djIuMDJjMS4zOS0uMTcgMi43NC0uNzEgMy45LTEuNjFsLTEuNDQtMS40NGMtLjc1LjU0LTEuNTkuODktMi40NiAxLjAzem0zLjg5LTIuNDJsMS40MiAxLjQxYy45LTEuMTYgMS40NS0yLjUgMS42Mi0zLjg5aC0yLjAyYy0uMTQuODctLjQ4IDEuNzItMS4wMiAyLjQ4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNsaWRlc2hvdyI+PHBhdGggZD0iTTEwIDh2OGw1LTQtNS00em05LTVINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2SDVWNWgxNHYxNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJzdHJhaWdodGVuIj48cGF0aCBkPSJNMjEgNkgzYy0xLjEgMC0yIC45LTIgMnY4YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWOGMwLTEuMS0uOS0yLTItMnptMCAxMEgzVjhoMnY0aDJWOGgydjRoMlY4aDJ2NGgyVjhoMnY0aDJWOGgydjh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic3R5bGUiPjxwYXRoIGQ9Ik0yLjUzIDE5LjY1bDEuMzQuNTZ2LTkuMDNsLTIuNDMgNS44NmMtLjQxIDEuMDIuMDggMi4xOSAxLjA5IDIuNjF6bTE5LjUtMy43TDE3LjA3IDMuOThjLS4zMS0uNzUtMS4wNC0xLjIxLTEuODEtMS4yMy0uMjYgMC0uNTMuMDQtLjc5LjE1TDcuMSA1Ljk1Yy0uNzUuMzEtMS4yMSAxLjAzLTEuMjMgMS44LS4wMS4yNy4wNC41NC4xNS44bDQuOTYgMTEuOTdjLjMxLjc2IDEuMDUgMS4yMiAxLjgzIDEuMjMuMjYgMCAuNTItLjA1Ljc3LS4xNWw3LjM2LTMuMDVjMS4wMi0uNDIgMS41MS0xLjU5IDEuMDktMi42ek03Ljg4IDguNzVjLS41NSAwLTEtLjQ1LTEtMXMuNDUtMSAxLTEgMSAuNDUgMSAxLS40NSAxLTEgMXptLTIgMTFjMCAxLjEuOSAyIDIgMmgxLjQ1bC0zLjQ1LTguMzR2Ni4zNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJzd2l0Y2gtY2FtZXJhIj48cGF0aCBkPSJNMjAgNGgtMy4xN0wxNSAySDlMNy4xNyA0SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptLTUgMTEuNVYxM0g5djIuNUw1LjUgMTIgOSA4LjVWMTFoNlY4LjVsMy41IDMuNS0zLjUgMy41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InN3aXRjaC12aWRlbyI+PHBhdGggZD0iTTE4IDkuNVY2YzAtLjU1LS40NS0xLTEtMUgzYy0uNTUgMC0xIC40NS0xIDF2MTJjMCAuNTUuNDUgMSAxIDFoMTRjLjU1IDAgMS0uNDUgMS0xdi0zLjVsNCA0di0xM2wtNCA0em0tNSA2VjEzSDd2Mi41TDMuNSAxMiA3IDguNVYxMWg2VjguNWwzLjUgMy41LTMuNSAzLjV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idGFnLWZhY2VzIj48cGF0aCBkPSJNMTEuOTkgMkM2LjQ3IDIgMiA2LjQ4IDIgMTJzNC40NyAxMCA5Ljk5IDEwQzE3LjUyIDIyIDIyIDE3LjUyIDIyIDEyUzE3LjUyIDIgMTEuOTkgMnpNMTIgMjBjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4em0zLjUtOWMuODMgMCAxLjUtLjY3IDEuNS0xLjVTMTYuMzMgOCAxNS41IDggMTQgOC42NyAxNCA5LjVzLjY3IDEuNSAxLjUgMS41em0tNyAwYy44MyAwIDEuNS0uNjcgMS41LTEuNVM5LjMzIDggOC41IDggNyA4LjY3IDcgOS41IDcuNjcgMTEgOC41IDExem0zLjUgNi41YzIuMzMgMCA0LjMxLTEuNDYgNS4xMS0zLjVINi44OWMuOCAyLjA0IDIuNzggMy41IDUuMTEgMy41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRleHR1cmUiPjxwYXRoIGQ9Ik0xOS41MSAzLjA4TDMuMDggMTkuNTFjLjA5LjM0LjI3LjY1LjUxLjkuMjUuMjQuNTYuNDIuOS41MUwyMC45MyA0LjQ5Yy0uMTktLjY5LS43My0xLjIzLTEuNDItMS40MXpNMTEuODggM0wzIDExLjg4djIuODNMMTQuNzEgM2gtMi44M3pNNSAzYy0xLjEgMC0yIC45LTIgMnYybDQtNEg1em0xNCAxOGMuNTUgMCAxLjA1LS4yMiAxLjQxLS41OS4zNy0uMzYuNTktLjg2LjU5LTEuNDF2LTJsLTQgNGgyem0tOS43MSAwaDIuODNMMjEgMTIuMTJWOS4yOUw5LjI5IDIxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRpbWVsYXBzZSI+PHBhdGggZD0iTTE2LjI0IDcuNzZDMTUuMDcgNi41OSAxMy41NCA2IDEyIDZ2NmwtNC4yNCA0LjI0YzIuMzQgMi4zNCA2LjE0IDIuMzQgOC40OSAwIDIuMzQtMi4zNCAyLjM0LTYuMTQtLjAxLTguNDh6TTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRpbWVyIj48cGF0aCBkPSJNMTUgMUg5djJoNlYxem0tNCAxM2gyVjhoLTJ2NnptOC4wMy02LjYxbDEuNDItMS40MmMtLjQzLS41MS0uOS0uOTktMS40MS0xLjQxbC0xLjQyIDEuNDJDMTYuMDcgNC43NCAxNC4xMiA0IDEyIDRjLTQuOTcgMC05IDQuMDMtOSA5czQuMDIgOSA5IDkgOS00LjAzIDktOWMwLTIuMTItLjc0LTQuMDctMS45Ny01LjYxek0xMiAyMGMtMy44NyAwLTctMy4xMy03LTdzMy4xMy03IDctNyA3IDMuMTMgNyA3LTMuMTMgNy03IDd6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idGltZXItMTAiPjxwYXRoIGQ9Ik0wIDcuNzJWOS40bDMtMVYxOGgyVjZoLS4yNUwwIDcuNzJ6bTIzLjc4IDYuNjVjLS4xNC0uMjgtLjM1LS41My0uNjMtLjc0LS4yOC0uMjEtLjYxLS4zOS0xLjAxLS41M3MtLjg1LS4yNy0xLjM1LS4zOGMtLjM1LS4wNy0uNjQtLjE1LS44Ny0uMjMtLjIzLS4wOC0uNDEtLjE2LS41NS0uMjUtLjE0LS4wOS0uMjMtLjE5LS4yOC0uMy0uMDUtLjExLS4wOC0uMjQtLjA4LS4zOSAwLS4xNC4wMy0uMjguMDktLjQxLjA2LS4xMy4xNS0uMjUuMjctLjM0LjEyLS4xLjI3LS4xOC40NS0uMjRzLjQtLjA5LjY0LS4wOWMuMjUgMCAuNDcuMDQuNjYuMTEuMTkuMDcuMzUuMTcuNDguMjkuMTMuMTIuMjIuMjYuMjkuNDIuMDYuMTYuMS4zMi4xLjQ5aDEuOTVjMC0uMzktLjA4LS43NS0uMjQtMS4wOS0uMTYtLjM0LS4zOS0uNjMtLjY5LS44OC0uMy0uMjUtLjY2LS40NC0xLjA5LS41OUMyMS40OSA5LjA3IDIxIDkgMjAuNDYgOWMtLjUxIDAtLjk4LjA3LTEuMzkuMjEtLjQxLjE0LS43Ny4zMy0xLjA2LjU3LS4yOS4yNC0uNTEuNTItLjY3Ljg0LS4xNi4zMi0uMjMuNjUtLjIzIDEuMDFzLjA4LjY5LjIzLjk2Yy4xNS4yOC4zNi41Mi42NC43My4yNy4yMS42LjM4Ljk4LjUzLjM4LjE0LjgxLjI2IDEuMjcuMzYuMzkuMDguNzEuMTcuOTUuMjZzLjQzLjE5LjU3LjI5Yy4xMy4xLjIyLjIyLjI3LjM0LjA1LjEyLjA3LjI1LjA3LjM5IDAgLjMyLS4xMy41Ny0uNC43Ny0uMjcuMi0uNjYuMjktMS4xNy4yOS0uMjIgMC0uNDMtLjAyLS42NC0uMDgtLjIxLS4wNS0uNC0uMTMtLjU2LS4yNC0uMTctLjExLS4zLS4yNi0uNDEtLjQ0LS4xMS0uMTgtLjE3LS40MS0uMTgtLjY3aC0xLjg5YzAgLjM2LjA4LjcxLjI0IDEuMDUuMTYuMzQuMzkuNjUuNy45My4zMS4yNy42OS40OSAxLjE1LjY2LjQ2LjE3Ljk4LjI1IDEuNTguMjUuNTMgMCAxLjAxLS4wNiAxLjQ0LS4xOS40My0uMTMuOC0uMzEgMS4xMS0uNTQuMzEtLjIzLjU0LS41MS43MS0uODMuMTctLjMyLjI1LS42Ny4yNS0xLjA2LS4wMi0uNC0uMDktLjc0LS4yNC0xLjAyem0tOS45Ni03LjMyYy0uMzQtLjQtLjc1LS43LTEuMjMtLjg4LS40Ny0uMTgtMS4wMS0uMjctMS41OS0uMjctLjU4IDAtMS4xMS4wOS0xLjU5LjI3LS40OC4xOC0uODkuNDctMS4yMy44OC0uMzQuNDEtLjYuOTMtLjc5IDEuNTktLjE4LjY1LS4yOCAxLjQ1LS4yOCAyLjM5djEuOTJjMCAuOTQuMDkgMS43NC4yOCAyLjM5LjE5LjY2LjQ1IDEuMTkuOCAxLjYuMzQuNDEuNzUuNzEgMS4yMy44OS40OC4xOCAxLjAxLjI4IDEuNTkuMjguNTkgMCAxLjEyLS4wOSAxLjU5LS4yOC40OC0uMTguODgtLjQ4IDEuMjItLjg5LjM0LS40MS42LS45NC43OC0xLjYuMTgtLjY1LjI4LTEuNDUuMjgtMi4zOXYtMS45MmMwLS45NC0uMDktMS43NC0uMjgtMi4zOS0uMTgtLjY2LS40NC0xLjE5LS43OC0xLjU5em0tLjkyIDYuMTdjMCAuNi0uMDQgMS4xMS0uMTIgMS41My0uMDguNDItLjIuNzYtLjM2IDEuMDItLjE2LjI2LS4zNi40NS0uNTkuNTctLjIzLjEyLS41MS4xOC0uODIuMTgtLjMgMC0uNTgtLjA2LS44Mi0uMThzLS40NC0uMzEtLjYtLjU3Yy0uMTYtLjI2LS4yOS0uNi0uMzgtMS4wMi0uMDktLjQyLS4xMy0uOTMtLjEzLTEuNTN2LTIuNWMwLS42LjA0LTEuMTEuMTMtMS41Mi4wOS0uNDEuMjEtLjc0LjM4LTEgLjE2LS4yNS4zNi0uNDMuNi0uNTUuMjQtLjExLjUxLS4xNy44MS0uMTcuMzEgMCAuNTguMDYuODEuMTcuMjQuMTEuNDQuMjkuNi41NS4xNi4yNS4yOS41OC4zNy45OS4wOC40MS4xMy45Mi4xMyAxLjUydjIuNTF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idGltZXItMyI+PHBhdGggZD0iTTExLjYxIDEyLjk3Yy0uMTYtLjI0LS4zNi0uNDYtLjYyLS42NS0uMjUtLjE5LS41Ni0uMzUtLjkzLS40OC4zLS4xNC41Ny0uMy44LS41LjIzLS4yLjQyLS40MS41Ny0uNjQuMTUtLjIzLjI3LS40Ni4zNC0uNzEuMDgtLjI0LjExLS40OS4xMS0uNzMgMC0uNTUtLjA5LTEuMDQtLjI4LTEuNDYtLjE4LS40Mi0uNDQtLjc3LS43OC0xLjA2LS4zMy0uMjgtLjczLS41LTEuMi0uNjQtLjQ1LS4xMy0uOTctLjItMS41My0uMi0uNTUgMC0xLjA2LjA4LTEuNTIuMjQtLjQ3LjE3LS44Ny40LTEuMi42OS0uMzMuMjktLjYuNjMtLjc4IDEuMDMtLjIuMzktLjI5LjgzLS4yOSAxLjI5aDEuOThjMC0uMjYuMDUtLjQ5LjE0LS42OS4wOS0uMi4yMi0uMzguMzgtLjUyLjE3LS4xNC4zNi0uMjUuNTgtLjMzLjIyLS4wOC40Ni0uMTIuNzMtLjEyLjYxIDAgMS4wNi4xNiAxLjM2LjQ3LjMuMzEuNDQuNzUuNDQgMS4zMiAwIC4yNy0uMDQuNTItLjEyLjc0LS4wOC4yMi0uMjEuNDEtLjM4LjU3LS4xNy4xNi0uMzguMjgtLjYzLjM3LS4yNS4wOS0uNTUuMTMtLjg5LjEzSDYuNzJ2MS41N0g3LjljLjM0IDAgLjY0LjA0LjkxLjExLjI3LjA4LjUuMTkuNjkuMzUuMTkuMTYuMzQuMzYuNDQuNjEuMS4yNC4xNi41NC4xNi44NyAwIC42Mi0uMTggMS4wOS0uNTMgMS40Mi0uMzUuMzMtLjg0LjQ5LTEuNDUuNDktLjI5IDAtLjU2LS4wNC0uOC0uMTMtLjI0LS4wOC0uNDQtLjItLjYxLS4zNi0uMTctLjE2LS4zLS4zNC0uMzktLjU2LS4wOS0uMjItLjE0LS40Ni0uMTQtLjcySDQuMTljMCAuNTUuMTEgMS4wMy4zMiAxLjQ1LjIxLjQyLjUuNzcuODYgMS4wNXMuNzcuNDkgMS4yNC42My45Ni4yMSAxLjQ4LjIxYy41NyAwIDEuMDktLjA4IDEuNTgtLjIzLjQ5LS4xNS45MS0uMzggMS4yNi0uNjguMzYtLjMuNjQtLjY2Ljg0LTEuMS4yLS40My4zLS45My4zLTEuNDggMC0uMjktLjA0LS41OC0uMTEtLjg2LS4wOC0uMjUtLjE5LS41MS0uMzUtLjc2em05LjI2IDEuNGMtLjE0LS4yOC0uMzUtLjUzLS42My0uNzQtLjI4LS4yMS0uNjEtLjM5LTEuMDEtLjUzcy0uODUtLjI3LTEuMzUtLjM4Yy0uMzUtLjA3LS42NC0uMTUtLjg3LS4yMy0uMjMtLjA4LS40MS0uMTYtLjU1LS4yNS0uMTQtLjA5LS4yMy0uMTktLjI4LS4zLS4wNS0uMTEtLjA4LS4yNC0uMDgtLjM5cy4wMy0uMjguMDktLjQxYy4wNi0uMTMuMTUtLjI1LjI3LS4zNC4xMi0uMS4yNy0uMTguNDUtLjI0cy40LS4wOS42NC0uMDljLjI1IDAgLjQ3LjA0LjY2LjExLjE5LjA3LjM1LjE3LjQ4LjI5LjEzLjEyLjIyLjI2LjI5LjQyLjA2LjE2LjEuMzIuMS40OWgxLjk1YzAtLjM5LS4wOC0uNzUtLjI0LTEuMDktLjE2LS4zNC0uMzktLjYzLS42OS0uODgtLjMtLjI1LS42Ni0uNDQtMS4wOS0uNTktLjQzLS4xNS0uOTItLjIyLTEuNDYtLjIyLS41MSAwLS45OC4wNy0xLjM5LjIxLS40MS4xNC0uNzcuMzMtMS4wNi41Ny0uMjkuMjQtLjUxLjUyLS42Ny44NC0uMTYuMzItLjIzLjY1LS4yMyAxLjAxcy4wOC42OC4yMy45NmMuMTUuMjguMzcuNTIuNjQuNzMuMjcuMjEuNi4zOC45OC41My4zOC4xNC44MS4yNiAxLjI3LjM2LjM5LjA4LjcxLjE3Ljk1LjI2cy40My4xOS41Ny4yOWMuMTMuMS4yMi4yMi4yNy4zNC4wNS4xMi4wNy4yNS4wNy4zOSAwIC4zMi0uMTMuNTctLjQuNzctLjI3LjItLjY2LjI5LTEuMTcuMjktLjIyIDAtLjQzLS4wMi0uNjQtLjA4LS4yMS0uMDUtLjQtLjEzLS41Ni0uMjQtLjE3LS4xMS0uMy0uMjYtLjQxLS40NC0uMTEtLjE4LS4xNy0uNDEtLjE4LS42N2gtMS44OWMwIC4zNi4wOC43MS4yNCAxLjA1LjE2LjM0LjM5LjY1LjcuOTMuMzEuMjcuNjkuNDkgMS4xNS42Ni40Ni4xNy45OC4yNSAxLjU4LjI1LjUzIDAgMS4wMS0uMDYgMS40NC0uMTkuNDMtLjEzLjgtLjMxIDEuMTEtLjU0LjMxLS4yMy41NC0uNTEuNzEtLjgzLjE3LS4zMi4yNS0uNjcuMjUtMS4wNi0uMDItLjQtLjA5LS43NC0uMjQtMS4wMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0aW1lci1vZmYiPjxwYXRoIGQ9Ik0xOS4wNCA0LjU1bC0xLjQyIDEuNDJDMTYuMDcgNC43NCAxNC4xMiA0IDEyIDRjLTEuODMgMC0zLjUzLjU1LTQuOTUgMS40OGwxLjQ2IDEuNDZDOS41MyA2LjM1IDEwLjczIDYgMTIgNmMzLjg3IDAgNyAzLjEzIDcgNyAwIDEuMjctLjM1IDIuNDctLjk0IDMuNDlsMS40NSAxLjQ1QzIwLjQ1IDE2LjUzIDIxIDE0LjgzIDIxIDEzYzAtMi4xMi0uNzQtNC4wNy0xLjk3LTUuNjFsMS40Mi0xLjQyLTEuNDEtMS40MnpNMTUgMUg5djJoNlYxem0tNCA4LjQ0bDIgMlY4aC0ydjEuNDR6TTMuMDIgNEwxLjc1IDUuMjcgNC41IDguMDNDMy41NSA5LjQ1IDMgMTEuMTYgMyAxM2MwIDQuOTcgNC4wMiA5IDkgOSAxLjg0IDAgMy41NS0uNTUgNC45OC0xLjVsMi41IDIuNSAxLjI3LTEuMjctNy43MS03LjcxTDMuMDIgNHpNMTIgMjBjLTMuODcgMC03LTMuMTMtNy03IDAtMS4yOC4zNS0yLjQ4Ljk1LTMuNTJsOS41NiA5LjU2Yy0xLjAzLjYxLTIuMjMuOTYtMy41MS45NnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0b25hbGl0eSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bS0xIDE3LjkzYy0zLjk0LS40OS03LTMuODUtNy03LjkzczMuMDUtNy40NCA3LTcuOTN2MTUuODZ6bTItMTUuODZjMS4wMy4xMyAyIC40NSAyLjg3LjkzSDEzdi0uOTN6TTEzIDdoNS4yNGMuMjUuMzEuNDguNjUuNjggMUgxM1Y3em0wIDNoNi43NGMuMDguMzMuMTUuNjYuMTkgMUgxM3YtMXptMCA5LjkzVjE5aDIuODdjLS44Ny40OC0xLjg0LjgtMi44Ny45M3pNMTguMjQgMTdIMTN2LTFoNS45MmMtLjIuMzUtLjQzLjY5LS42OCAxem0xLjUtM0gxM3YtMWg2LjkzYy0uMDQuMzQtLjExLjY3LS4xOSAxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRyYW5zZm9ybSI+PHBhdGggZD0iTTIyIDE4di0ySDhWNGgyTDcgMSA0IDRoMnYySDJ2Mmg0djhjMCAxLjEuOSAyIDIgMmg4djJoLTJsMyAzIDMtM2gtMnYtMmg0ek0xMCA4aDZ2NmgyVjhjMC0xLjEtLjktMi0yLTJoLTZ2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0dW5lIj48cGF0aCBkPSJNMyAxN3YyaDZ2LTJIM3pNMyA1djJoMTBWNUgzem0xMCAxNnYtMmg4di0yaC04di0yaC0ydjZoMnpNNyA5djJIM3YyaDR2MmgyVjlIN3ptMTQgNHYtMkgxMXYyaDEwem0tNi00aDJWN2g0VjVoLTRWM2gtMnY2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InZpZXctY29tZnkiPjxwYXRoIGQ9Ik0zIDloNFY1SDN2NHptMCA1aDR2LTRIM3Y0em01IDBoNHYtNEg4djR6bTUgMGg0di00aC00djR6TTggOWg0VjVIOHY0em01LTR2NGg0VjVoLTR6bTUgOWg0di00aC00djR6TTMgMTloNHYtNEgzdjR6bTUgMGg0di00SDh2NHptNSAwaDR2LTRoLTR2NHptNSAwaDR2LTRoLTR2NHptMC0xNHY0aDRWNWgtNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJ2aWV3LWNvbXBhY3QiPjxwYXRoIGQ9Ik0zIDE5aDZ2LTdIM3Y3em03IDBoMTJ2LTdIMTB2N3pNMyA1djZoMTlWNUgzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InZpZ25ldHRlIj48cGF0aCBkPSJNMjEgM0gzYy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS05IDE1Yy00LjQyIDAtOC0yLjY5LTgtNnMzLjU4LTYgOC02IDggMi42OSA4IDYtMy41OCA2LTggNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ3Yi1hdXRvIj48cGF0aCBkPSJNNi44NSAxMi42NWgyLjNMOCA5bC0xLjE1IDMuNjV6TTIyIDdsLTEuMiA2LjI5TDE5LjMgN2gtMS42bC0xLjQ5IDYuMjlMMTUgN2gtLjc2QzEyLjc3IDUuMTcgMTAuNTMgNCA4IDRjLTQuNDIgMC04IDMuNTgtOCA4czMuNTggOCA4IDhjMy4xMyAwIDUuODQtMS44MSA3LjE1LTQuNDNsLjEuNDNIMTdsMS41LTYuMUwyMCAxNmgxLjc1bDIuMDUtOUgyMnptLTExLjcgOWwtLjctMkg2LjRsLS43IDJIMy44TDcgN2gybDMuMiA5aC0xLjl6Ij48L3BhdGg+PC9nPgo8ZyBpZD0id2ItY2xvdWR5Ij48cGF0aCBkPSJNMTkuMzYgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NC00Ljk2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9IndiLWluY2FuZGVzY2VudCI+PHBhdGggZD0iTTMuNTUgMTguNTRsMS40MSAxLjQxIDEuNzktMS44LTEuNDEtMS40MS0xLjc5IDEuOHpNMTEgMjIuNDVoMlYxOS41aC0ydjIuOTV6TTQgMTAuNUgxdjJoM3YtMnptMTEtNC4xOVYxLjVIOXY0LjgxQzcuMjEgNy4zNSA2IDkuMjggNiAxMS41YzAgMy4zMSAyLjY5IDYgNiA2czYtMi42OSA2LTZjMC0yLjIyLTEuMjEtNC4xNS0zLTUuMTl6bTUgNC4xOXYyaDN2LTJoLTN6bS0yLjc2IDcuNjZsMS43OSAxLjggMS40MS0xLjQxLTEuOC0xLjc5LTEuNCAxLjR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0id2ItaXJpZGVzY2VudCI+PHBhdGggZD0iTTUgMTQuNWgxNHYtNkg1djZ6TTExIC41NVYzLjVoMlYuNTVoLTJ6bTguMDQgMi41bC0xLjc5IDEuNzkgMS40MSAxLjQxIDEuOC0xLjc5LTEuNDItMS40MXpNMTMgMjIuNDVWMTkuNWgtMnYyLjk1aDJ6bTcuNDUtMy45MWwtMS44LTEuNzktMS40MSAxLjQxIDEuNzkgMS44IDEuNDItMS40MnpNMy41NSA0LjQ2bDEuNzkgMS43OSAxLjQxLTEuNDEtMS43OS0xLjc5LTEuNDEgMS40MXptMS40MSAxNS40OWwxLjc5LTEuOC0xLjQxLTEuNDEtMS43OSAxLjc5IDEuNDEgMS40MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ3Yi1zdW5ueSI+PHBhdGggZD0iTTYuNzYgNC44NGwtMS44LTEuNzktMS40MSAxLjQxIDEuNzkgMS43OSAxLjQyLTEuNDF6TTQgMTAuNUgxdjJoM3YtMnptOS05Ljk1aC0yVjMuNWgyVi41NXptNy40NSAzLjkxbC0xLjQxLTEuNDEtMS43OSAxLjc5IDEuNDEgMS40MSAxLjc5LTEuNzl6bS0zLjIxIDEzLjdsMS43OSAxLjggMS40MS0xLjQxLTEuOC0xLjc5LTEuNCAxLjR6TTIwIDEwLjV2Mmgzdi0yaC0zem0tOC01Yy0zLjMxIDAtNiAyLjY5LTYgNnMyLjY5IDYgNiA2IDYtMi42OSA2LTYtMi42OS02LTYtNnptLTEgMTYuOTVoMlYxOS41aC0ydjIuOTV6bS03LjQ1LTMuOTFsMS40MSAxLjQxIDEuNzktMS44LTEuNDEtMS40MS0xLjc5IDEuOHoiPjwvcGF0aD48L2c+CjwvZGVmcz48L3N2Zz4KPC9pcm9uLWljb25zZXQtc3ZnPmA7ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChSby5jb250ZW50KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE0IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IE9vPXhlYDxpcm9uLWljb25zZXQtc3ZnIG5hbWU9Imljb25zIiBzaXplPSIyNCI+Cjxzdmc+PGRlZnM+CjxnIGlkPSIzZC1yb3RhdGlvbiI+PHBhdGggZD0iTTcuNTIgMjEuNDhDNC4yNSAxOS45NCAxLjkxIDE2Ljc2IDEuNTUgMTNILjA1Qy41NiAxOS4xNiA1LjcxIDI0IDEyIDI0bC42Ni0uMDMtMy44MS0zLjgxLTEuMzMgMS4zMnptLjg5LTYuNTJjLS4xOSAwLS4zNy0uMDMtLjUyLS4wOC0uMTYtLjA2LS4yOS0uMTMtLjQtLjI0LS4xMS0uMS0uMi0uMjItLjI2LS4zNy0uMDYtLjE0LS4wOS0uMy0uMDktLjQ3aC0xLjNjMCAuMzYuMDcuNjguMjEuOTUuMTQuMjcuMzMuNS41Ni42OS4yNC4xOC41MS4zMi44Mi40MS4zLjEuNjIuMTUuOTYuMTUuMzcgMCAuNzItLjA1IDEuMDMtLjE1LjMyLS4xLjYtLjI1LjgzLS40NHMuNDItLjQzLjU1LS43MmMuMTMtLjI5LjItLjYxLjItLjk3IDAtLjE5LS4wMi0uMzgtLjA3LS41Ni0uMDUtLjE4LS4xMi0uMzUtLjIzLS41MS0uMS0uMTYtLjI0LS4zLS40LS40My0uMTctLjEzLS4zNy0uMjMtLjYxLS4zMS4yLS4wOS4zNy0uMi41Mi0uMzMuMTUtLjEzLjI3LS4yNy4zNy0uNDIuMS0uMTUuMTctLjMuMjItLjQ2LjA1LS4xNi4wNy0uMzIuMDctLjQ4IDAtLjM2LS4wNi0uNjgtLjE4LS45Ni0uMTItLjI4LS4yOS0uNTEtLjUxLS42OS0uMi0uMTktLjQ3LS4zMy0uNzctLjQzQzkuMSA4LjA1IDguNzYgOCA4LjM5IDhjLS4zNiAwLS42OS4wNS0xIC4xNi0uMy4xMS0uNTcuMjYtLjc5LjQ1LS4yMS4xOS0uMzguNDEtLjUxLjY3LS4xMi4yNi0uMTguNTQtLjE4Ljg1aDEuM2MwLS4xNy4wMy0uMzIuMDktLjQ1cy4xNC0uMjUuMjUtLjM0Yy4xMS0uMDkuMjMtLjE3LjM4LS4yMi4xNS0uMDUuMy0uMDguNDgtLjA4LjQgMCAuNy4xLjg5LjMxLjE5LjIuMjkuNDkuMjkuODYgMCAuMTgtLjAzLjM0LS4wOC40OS0uMDUuMTUtLjE0LjI3LS4yNS4zNy0uMTEuMS0uMjUuMTgtLjQxLjI0LS4xNi4wNi0uMzYuMDktLjU4LjA5SDcuNXYxLjAzaC43N2MuMjIgMCAuNDIuMDIuNi4wN3MuMzMuMTMuNDUuMjNjLjEyLjExLjIyLjI0LjI5LjQuMDcuMTYuMS4zNS4xLjU3IDAgLjQxLS4xMi43Mi0uMzUuOTMtLjIzLjIzLS41NS4zMy0uOTUuMzN6bTguNTUtNS45MmMtLjMyLS4zMy0uNy0uNTktMS4xNC0uNzctLjQzLS4xOC0uOTItLjI3LTEuNDYtLjI3SDEydjhoMi4zYy41NSAwIDEuMDYtLjA5IDEuNTEtLjI3LjQ1LS4xOC44NC0uNDMgMS4xNi0uNzYuMzItLjMzLjU3LS43My43NC0xLjE5LjE3LS40Ny4yNi0uOTkuMjYtMS41N3YtLjRjMC0uNTgtLjA5LTEuMS0uMjYtMS41Ny0uMTgtLjQ3LS40My0uODctLjc1LTEuMnptLS4zOSAzLjE2YzAgLjQyLS4wNS43OS0uMTQgMS4xMy0uMS4zMy0uMjQuNjItLjQzLjg1LS4xOS4yMy0uNDMuNDEtLjcxLjUzLS4yOS4xMi0uNjIuMTgtLjk5LjE4aC0uOTFWOS4xMmguOTdjLjcyIDAgMS4yNy4yMyAxLjY0LjY5LjM4LjQ2LjU3IDEuMTIuNTcgMS45OXYuNHpNMTIgMGwtLjY2LjAzIDMuODEgMy44MSAxLjMzLTEuMzNjMy4yNyAxLjU1IDUuNjEgNC43MiA1Ljk2IDguNDhoMS41QzIzLjQ0IDQuODQgMTguMjkgMCAxMiAweiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFjY2Vzc2liaWxpdHkiPjxwYXRoIGQ9Ik0xMiAyYzEuMSAwIDIgLjkgMiAycy0uOSAyLTIgMi0yLS45LTItMiAuOS0yIDItMnptOSA3aC02djEzaC0ydi02aC0ydjZIOVY5SDNWN2gxOHYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFjY2Vzc2libGUiPjxjaXJjbGUgY3g9IjEyIiBjeT0iNCIgcj0iMiI+PC9jaXJjbGU+PHBhdGggZD0iTTE5IDEzdi0yYy0xLjU0LjAyLTMuMDktLjc1LTQuMDctMS44M2wtMS4yOS0xLjQzYy0uMTctLjE5LS4zOC0uMzQtLjYxLS40NS0uMDEgMC0uMDEtLjAxLS4wMi0uMDFIMTNjLS4zNS0uMi0uNzUtLjMtMS4xOS0uMjZDMTAuNzYgNy4xMSAxMCA4LjA0IDEwIDkuMDlWMTVjMCAxLjEuOSAyIDIgMmg1djVoMnYtNS41YzAtMS4xLS45LTItMi0yaC0zdi0zLjQ1YzEuMjkgMS4wNyAzLjI1IDEuOTQgNSAxLjk1em0tNi4xNyA1Yy0uNDEgMS4xNi0xLjUyIDItMi44MyAyLTEuNjYgMC0zLTEuMzQtMy0zIDAtMS4zMS44NC0yLjQxIDItMi44M1YxMi4xYy0yLjI4LjQ2LTQgMi40OC00IDQuOSAwIDIuNzYgMi4yNCA1IDUgNSAyLjQyIDAgNC40NC0xLjcyIDQuOS00aC0yLjA3eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFjY291bnQtYmFsYW5jZSI+PHBhdGggZD0iTTQgMTB2N2gzdi03SDR6bTYgMHY3aDN2LTdoLTN6TTIgMjJoMTl2LTNIMnYzem0xNC0xMnY3aDN2LTdoLTN6bS00LjUtOUwyIDZ2MmgxOVY2bC05LjUtNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJhY2NvdW50LWJhbGFuY2Utd2FsbGV0Ij48cGF0aCBkPSJNMjEgMTh2MWMwIDEuMS0uOSAyLTIgMkg1Yy0xLjExIDAtMi0uOS0yLTJWNWMwLTEuMS44OS0yIDItMmgxNGMxLjEgMCAyIC45IDIgMnYxaC05Yy0xLjExIDAtMiAuOS0yIDJ2OGMwIDEuMS44OSAyIDIgMmg5em0tOS0yaDEwVjhIMTJ2OHptNC0yLjVjLS44MyAwLTEuNS0uNjctMS41LTEuNXMuNjctMS41IDEuNS0xLjUgMS41LjY3IDEuNSAxLjUtLjY3IDEuNS0xLjUgMS41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFjY291bnQtYm94Ij48cGF0aCBkPSJNMyA1djE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJINWMtMS4xMSAwLTIgLjktMiAyem0xMiA0YzAgMS42Ni0xLjM0IDMtMyAzcy0zLTEuMzQtMy0zIDEuMzQtMyAzLTMgMyAxLjM0IDMgM3ptLTkgOGMwLTIgNC0zLjEgNi0zLjFzNiAxLjEgNiAzLjF2MUg2di0xeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFjY291bnQtY2lyY2xlIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAzYzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzLTMtMS4zNC0zLTMgMS4zNC0zIDMtM3ptMCAxNC4yYy0yLjUgMC00LjcxLTEuMjgtNi0zLjIyLjAzLTEuOTkgNC0zLjA4IDYtMy4wOCAxLjk5IDAgNS45NyAxLjA5IDYgMy4wOC0xLjI5IDEuOTQtMy41IDMuMjItNiAzLjIyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFkZCI+PHBhdGggZD0iTTE5IDEzaC02djZoLTJ2LTZINXYtMmg2VjVoMnY2aDZ2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJhZGQtYWxlcnQiPjxwYXRoIGQ9Ik0xMC4wMSAyMS4wMWMwIDEuMS44OSAxLjk5IDEuOTkgMS45OXMxLjk5LS44OSAxLjk5LTEuOTloLTMuOTh6bTguODctNC4xOVYxMWMwLTMuMjUtMi4yNS01Ljk3LTUuMjktNi42OXYtLjcyQzEzLjU5IDIuNzEgMTIuODggMiAxMiAycy0xLjU5LjcxLTEuNTkgMS41OXYuNzJDNy4zNyA1LjAzIDUuMTIgNy43NSA1LjEyIDExdjUuODJMMyAxOC45NFYyMGgxOHYtMS4wNmwtMi4xMi0yLjEyek0xNiAxMy4wMWgtM3YzaC0ydi0zSDhWMTFoM1Y4aDJ2M2gzdjIuMDF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYWRkLWJveCI+PHBhdGggZD0iTTE5IDNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS0yIDEwaC00djRoLTJ2LTRIN3YtMmg0VjdoMnY0aDR2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJhZGQtY2lyY2xlIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptNSAxMWgtNHY0aC0ydi00SDd2LTJoNFY3aDJ2NGg0djJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYWRkLWNpcmNsZS1vdXRsaW5lIj48cGF0aCBkPSJNMTMgN2gtMnY0SDd2Mmg0djRoMnYtNGg0di0yaC00Vjd6bS0xLTVDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFkZC1zaG9wcGluZy1jYXJ0Ij48cGF0aCBkPSJNMTEgOWgyVjZoM1Y0aC0zVjFoLTJ2M0g4djJoM3Yzem0tNCA5Yy0xLjEgMC0xLjk5LjktMS45OSAyUzUuOSAyMiA3IDIyczItLjkgMi0yLS45LTItMi0yem0xMCAwYy0xLjEgMC0xLjk5LjktMS45OSAycy44OSAyIDEuOTkgMiAyLS45IDItMi0uOS0yLTItMnptLTkuODMtMy4yNWwuMDMtLjEyLjktMS42M2g3LjQ1Yy43NSAwIDEuNDEtLjQxIDEuNzUtMS4wM2wzLjg2LTcuMDFMMTkuNDIgNGgtLjAxbC0xLjEgMi0yLjc2IDVIOC41M2wtLjEzLS4yN0w2LjE2IDZsLS45NS0yLS45NC0ySDF2MmgybDMuNiA3LjU5LTEuMzUgMi40NWMtLjE2LjI4LS4yNS42MS0uMjUuOTYgMCAxLjEuOSAyIDIgMmgxMnYtMkg3LjQyYy0uMTMgMC0uMjUtLjExLS4yNS0uMjV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYWxhcm0iPjxwYXRoIGQ9Ik0yMiA1LjcybC00LjYtMy44Ni0xLjI5IDEuNTMgNC42IDMuODZMMjIgNS43MnpNNy44OCAzLjM5TDYuNiAxLjg2IDIgNS43MWwxLjI5IDEuNTMgNC41OS0zLjg1ek0xMi41IDhIMTF2Nmw0Ljc1IDIuODUuNzUtMS4yMy00LTIuMzdWOHpNMTIgNGMtNC45NyAwLTkgNC4wMy05IDlzNC4wMiA5IDkgOWM0Ljk3IDAgOS00LjAzIDktOXMtNC4wMy05LTktOXptMCAxNmMtMy44NyAwLTctMy4xMy03LTdzMy4xMy03IDctNyA3IDMuMTMgNyA3LTMuMTMgNy03IDd6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYWxhcm0tYWRkIj48cGF0aCBkPSJNNy44OCAzLjM5TDYuNiAxLjg2IDIgNS43MWwxLjI5IDEuNTMgNC41OS0zLjg1ek0yMiA1LjcybC00LjYtMy44Ni0xLjI5IDEuNTMgNC42IDMuODZMMjIgNS43MnpNMTIgNGMtNC45NyAwLTkgNC4wMy05IDlzNC4wMiA5IDkgOWM0Ljk3IDAgOS00LjAzIDktOXMtNC4wMy05LTktOXptMCAxNmMtMy44NyAwLTctMy4xMy03LTdzMy4xMy03IDctNyA3IDMuMTMgNyA3LTMuMTMgNy03IDd6bTEtMTFoLTJ2M0g4djJoM3YzaDJ2LTNoM3YtMmgtM1Y5eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFsYXJtLW9mZiI+PHBhdGggZD0iTTEyIDZjMy44NyAwIDcgMy4xMyA3IDcgMCAuODQtLjE2IDEuNjUtLjQzIDIuNGwxLjUyIDEuNTJjLjU4LTEuMTkuOTEtMi41MS45MS0zLjkyIDAtNC45Ny00LjAzLTktOS05LTEuNDEgMC0yLjczLjMzLTMuOTIuOTFMOS42IDYuNDNDMTAuMzUgNi4xNiAxMS4xNiA2IDEyIDZ6bTEwLS4yOGwtNC42LTMuODYtMS4yOSAxLjUzIDQuNiAzLjg2TDIyIDUuNzJ6TTIuOTIgMi4yOUwxLjY1IDMuNTcgMi45OCA0LjlsLTEuMTEuOTMgMS40MiAxLjQyIDEuMTEtLjk0LjguOEMzLjgzIDguNjkgMyAxMC43NSAzIDEzYzAgNC45NyA0LjAyIDkgOSA5IDIuMjUgMCA0LjMxLS44MyA1Ljg5LTIuMmwyLjIgMi4yIDEuMjctMS4yN0wzLjg5IDMuMjdsLS45Ny0uOTh6bTEzLjU1IDE2LjFDMTUuMjYgMTkuMzkgMTMuNyAyMCAxMiAyMGMtMy44NyAwLTctMy4xMy03LTcgMC0xLjcuNjEtMy4yNiAxLjYxLTQuNDdsOS44NiA5Ljg2ek04LjAyIDMuMjhMNi42IDEuODZsLS44Ni43MSAxLjQyIDEuNDIuODYtLjcxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFsYXJtLW9uIj48cGF0aCBkPSJNMjIgNS43MmwtNC42LTMuODYtMS4yOSAxLjUzIDQuNiAzLjg2TDIyIDUuNzJ6TTcuODggMy4zOUw2LjYgMS44NiAyIDUuNzFsMS4yOSAxLjUzIDQuNTktMy44NXpNMTIgNGMtNC45NyAwLTkgNC4wMy05IDlzNC4wMiA5IDkgOWM0Ljk3IDAgOS00LjAzIDktOXMtNC4wMy05LTktOXptMCAxNmMtMy44NyAwLTctMy4xMy03LTdzMy4xMy03IDctNyA3IDMuMTMgNyA3LTMuMTMgNy03IDd6bS0xLjQ2LTUuNDdMOC40MSAxMi40bC0xLjA2IDEuMDYgMy4xOCAzLjE4IDYtNi0xLjA2LTEuMDYtNC45MyA0Ljk1eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFsbC1vdXQiPjxwYXRoIGQ9Ik0xNi4yMSA0LjE2bDQgNHYtNHptNCAxMmwtNCA0aDR6bS0xMiA0bC00LTR2NHptLTQtMTJsNC00aC00em0xMi45NS0uOTVjLTIuNzMtMi43My03LjE3LTIuNzMtOS45IDBzLTIuNzMgNy4xNyAwIDkuOSA3LjE3IDIuNzMgOS45IDAgMi43My03LjE2IDAtOS45em0tMS4xIDguOGMtMi4xMyAyLjEzLTUuNTcgMi4xMy03LjcgMHMtMi4xMy01LjU3IDAtNy43IDUuNTctMi4xMyA3LjcgMCAyLjEzIDUuNTcgMCA3Ljd6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYW5kcm9pZCI+PHBhdGggZD0iTTYgMThjMCAuNTUuNDUgMSAxIDFoMXYzLjVjMCAuODMuNjcgMS41IDEuNSAxLjVzMS41LS42NyAxLjUtMS41VjE5aDJ2My41YzAgLjgzLjY3IDEuNSAxLjUgMS41czEuNS0uNjcgMS41LTEuNVYxOWgxYy41NSAwIDEtLjQ1IDEtMVY4SDZ2MTB6TTMuNSA4QzIuNjcgOCAyIDguNjcgMiA5LjV2N2MwIC44My42NyAxLjUgMS41IDEuNVM1IDE3LjMzIDUgMTYuNXYtN0M1IDguNjcgNC4zMyA4IDMuNSA4em0xNyAwYy0uODMgMC0xLjUuNjctMS41IDEuNXY3YzAgLjgzLjY3IDEuNSAxLjUgMS41czEuNS0uNjcgMS41LTEuNXYtN2MwLS44My0uNjctMS41LTEuNS0xLjV6bS00Ljk3LTUuODRsMS4zLTEuM2MuMi0uMi4yLS41MSAwLS43MS0uMi0uMi0uNTEtLjItLjcxIDBsLTEuNDggMS40OEMxMy44NSAxLjIzIDEyLjk1IDEgMTIgMWMtLjk2IDAtMS44Ni4yMy0yLjY2LjYzTDcuODUuMTVjLS4yLS4yLS41MS0uMi0uNzEgMC0uMi4yLS4yLjUxIDAgLjcxbDEuMzEgMS4zMUM2Ljk3IDMuMjYgNiA1LjAxIDYgN2gxMmMwLTEuOTktLjk3LTMuNzUtMi40Ny00Ljg0ek0xMCA1SDlWNGgxdjF6bTUgMGgtMVY0aDF2MXoiPjwvcGF0aD48L2c+CjxnIGlkPSJhbm5vdW5jZW1lbnQiPjxwYXRoIGQ9Ik0yMCAySDRjLTEuMSAwLTEuOTkuOS0xLjk5IDJMMiAyMmw0LTRoMTRjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTcgOWgtMlY1aDJ2NnptMCA0aC0ydi0yaDJ2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJhcHBzIj48cGF0aCBkPSJNNCA4aDRWNEg0djR6bTYgMTJoNHYtNGgtNHY0em0tNiAwaDR2LTRINHY0em0wLTZoNHYtNEg0djR6bTYgMGg0di00aC00djR6bTYtMTB2NGg0VjRoLTR6bS02IDRoNFY0aC00djR6bTYgNmg0di00aC00djR6bTAgNmg0di00aC00djR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYXJjaGl2ZSI+PHBhdGggZD0iTTIwLjU0IDUuMjNsLTEuMzktMS42OEMxOC44OCAzLjIxIDE4LjQ3IDMgMTggM0g2Yy0uNDcgMC0uODguMjEtMS4xNi41NUwzLjQ2IDUuMjNDMy4xNyA1LjU3IDMgNi4wMiAzIDYuNVYxOWMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjYuNWMwLS40OC0uMTctLjkzLS40Ni0xLjI3ek0xMiAxNy41TDYuNSAxMkgxMHYtMmg0djJoMy41TDEyIDE3LjV6TTUuMTIgNWwuODEtMWgxMmwuOTQgMUg1LjEyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFycm93LWJhY2siPjxwYXRoIGQ9Ik0yMCAxMUg3LjgzbDUuNTktNS41OUwxMiA0bC04IDggOCA4IDEuNDEtMS40MUw3LjgzIDEzSDIwdi0yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFycm93LWRvd253YXJkIj48cGF0aCBkPSJNMjAgMTJsLTEuNDEtMS40MUwxMyAxNi4xN1Y0aC0ydjEyLjE3bC01LjU4LTUuNTlMNCAxMmw4IDggOC04eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFycm93LWRyb3AtZG93biI+PHBhdGggZD0iTTcgMTBsNSA1IDUtNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJhcnJvdy1kcm9wLWRvd24tY2lyY2xlIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxMmwtNC00aDhsLTQgNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJhcnJvdy1kcm9wLXVwIj48cGF0aCBkPSJNNyAxNGw1LTUgNSA1eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFycm93LWZvcndhcmQiPjxwYXRoIGQ9Ik0xMiA0bC0xLjQxIDEuNDFMMTYuMTcgMTFINHYyaDEyLjE3bC01LjU4IDUuNTlMMTIgMjBsOC04eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFycm93LXVwd2FyZCI+PHBhdGggZD0iTTQgMTJsMS40MSAxLjQxTDExIDcuODNWMjBoMlY3LjgzbDUuNTggNS41OUwyMCAxMmwtOC04LTggOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJhc3BlY3QtcmF0aW8iPjxwYXRoIGQ9Ik0xOSAxMmgtMnYzaC0zdjJoNXYtNXpNNyA5aDNWN0g1djVoMlY5em0xNC02SDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNi4wMUgzVjQuOTloMTh2MTQuMDJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYXNzZXNzbWVudCI+PHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yek05IDE3SDd2LTdoMnY3em00IDBoLTJWN2gydjEwem00IDBoLTJ2LTRoMnY0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFzc2lnbm1lbnQiPjxwYXRoIGQ9Ik0xOSAzaC00LjE4QzE0LjQgMS44NCAxMy4zIDEgMTIgMWMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS03IDBjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptMiAxNEg3di0yaDd2MnptMy00SDd2LTJoMTB2MnptMC00SDdWN2gxMHYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFzc2lnbm1lbnQtaW5kIj48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAwYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTAgNGMxLjY2IDAgMyAxLjM0IDMgM3MtMS4zNCAzLTMgMy0zLTEuMzQtMy0zIDEuMzQtMyAzLTN6bTYgMTJINnYtMS40YzAtMiA0LTMuMSA2LTMuMXM2IDEuMSA2IDMuMVYxOXoiPjwvcGF0aD48L2c+CjxnIGlkPSJhc3NpZ25tZW50LWxhdGUiPjxwYXRoIGQ9Ik0xOSAzaC00LjE4QzE0LjQgMS44NCAxMy4zIDEgMTIgMWMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS02IDE1aC0ydi0yaDJ2MnptMC00aC0yVjhoMnY2em0tMS05Yy0uNTUgMC0xLS40NS0xLTFzLjQ1LTEgMS0xIDEgLjQ1IDEgMS0uNDUgMS0xIDF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYXNzaWdubWVudC1yZXR1cm4iPjxwYXRoIGQ9Ik0xOSAzaC00LjE4QzE0LjQgMS44NCAxMy4zIDEgMTIgMWMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS03IDBjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptNCAxMmgtNHYzbC01LTUgNS01djNoNHY0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFzc2lnbm1lbnQtcmV0dXJuZWQiPjxwYXRoIGQ9Ik0xOSAzaC00LjE4QzE0LjQgMS44NCAxMy4zIDEgMTIgMWMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS03IDBjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptMCAxNWwtNS01aDNWOWg0djRoM2wtNSA1eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFzc2lnbm1lbnQtdHVybmVkLWluIj48cGF0aCBkPSJNMTkgM2gtNC4xOEMxNC40IDEuODQgMTMuMyAxIDEyIDFjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNyAwYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bS0yIDE0bC00LTQgMS40MS0xLjQxTDEwIDE0LjE3bDYuNTktNi41OUwxOCA5bC04IDh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYXR0YWNobWVudCI+PHBhdGggZD0iTTIgMTIuNUMyIDkuNDYgNC40NiA3IDcuNSA3SDE4YzIuMjEgMCA0IDEuNzkgNCA0cy0xLjc5IDQtNCA0SDkuNUM4LjEyIDE1IDcgMTMuODggNyAxMi41UzguMTIgMTAgOS41IDEwSDE3djJIOS40MWMtLjU1IDAtLjU1IDEgMCAxSDE4YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMkg3LjVDNS41NyA5IDQgMTAuNTcgNCAxMi41UzUuNTcgMTYgNy41IDE2SDE3djJINy41QzQuNDYgMTggMiAxNS41NCAyIDEyLjV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYXV0b3JlbmV3Ij48cGF0aCBkPSJNMTIgNnYzbDQtNC00LTR2M2MtNC40MiAwLTggMy41OC04IDggMCAxLjU3LjQ2IDMuMDMgMS4yNCA0LjI2TDYuNyAxNC44Yy0uNDUtLjgzLS43LTEuNzktLjctMi44IDAtMy4zMSAyLjY5LTYgNi02em02Ljc2IDEuNzRMMTcuMyA5LjJjLjQ0Ljg0LjcgMS43OS43IDIuOCAwIDMuMzEtMi42OSA2LTYgNnYtM2wtNCA0IDQgNHYtM2M0LjQyIDAgOC0zLjU4IDgtOCAwLTEuNTctLjQ2LTMuMDMtMS4yNC00LjI2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImJhY2tzcGFjZSI+PHBhdGggZD0iTTIyIDNIN2MtLjY5IDAtMS4yMy4zNS0xLjU5Ljg4TDAgMTJsNS40MSA4LjExYy4zNi41My45Ljg5IDEuNTkuODloMTVjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTMgMTIuNTlMMTcuNTkgMTcgMTQgMTMuNDEgMTAuNDEgMTcgOSAxNS41OSAxMi41OSAxMiA5IDguNDEgMTAuNDEgNyAxNCAxMC41OSAxNy41OSA3IDE5IDguNDEgMTUuNDEgMTIgMTkgMTUuNTl6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYmFja3VwIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0xNCAxM3Y0aC00di00SDdsNS01IDUgNWgtM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJibG9jayI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6TTQgMTJjMC00LjQyIDMuNTgtOCA4LTggMS44NSAwIDMuNTUuNjMgNC45IDEuNjlMNS42OSAxNi45QzQuNjMgMTUuNTUgNCAxMy44NSA0IDEyem04IDhjLTEuODUgMC0zLjU1LS42My00LjktMS42OUwxOC4zMSA3LjFDMTkuMzcgOC40NSAyMCAxMC4xNSAyMCAxMmMwIDQuNDItMy41OCA4LTggOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJib29rIj48cGF0aCBkPSJNMTggMkg2Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6TTYgNGg1djhsLTIuNS0xLjVMNiAxMlY0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImJvb2ttYXJrIj48cGF0aCBkPSJNMTcgM0g3Yy0xLjEgMC0xLjk5LjktMS45OSAyTDUgMjFsNy0zIDcgM1Y1YzAtMS4xLS45LTItMi0yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImJvb2ttYXJrLWJvcmRlciI+PHBhdGggZD0iTTE3IDNIN2MtMS4xIDAtMS45OS45LTEuOTkgMkw1IDIxbDctMyA3IDNWNWMwLTEuMS0uOS0yLTItMnptMCAxNWwtNS0yLjE4TDcgMThWNWgxMHYxM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJidWctcmVwb3J0Ij48cGF0aCBkPSJNMjAgOGgtMi44MWMtLjQ1LS43OC0xLjA3LTEuNDUtMS44Mi0xLjk2TDE3IDQuNDEgMTUuNTkgM2wtMi4xNyAyLjE3QzEyLjk2IDUuMDYgMTIuNDkgNSAxMiA1Yy0uNDkgMC0uOTYuMDYtMS40MS4xN0w4LjQxIDMgNyA0LjQxbDEuNjIgMS42M0M3Ljg4IDYuNTUgNy4yNiA3LjIyIDYuODEgOEg0djJoMi4wOWMtLjA1LjMzLS4wOS42Ni0uMDkgMXYxSDR2MmgydjFjMCAuMzQuMDQuNjcuMDkgMUg0djJoMi44MWMxLjA0IDEuNzkgMi45NyAzIDUuMTkgM3M0LjE1LTEuMjEgNS4xOS0zSDIwdi0yaC0yLjA5Yy4wNS0uMzMuMDktLjY2LjA5LTF2LTFoMnYtMmgtMnYtMWMwLS4zNC0uMDQtLjY3LS4wOS0xSDIwVjh6bS02IDhoLTR2LTJoNHYyem0wLTRoLTR2LTJoNHYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImJ1aWxkIj48cGF0aCBkPSJNMjIuNyAxOWwtOS4xLTkuMWMuOS0yLjMuNC01LTEuNS02LjktMi0yLTUtMi40LTcuNC0xLjNMOSA2IDYgOSAxLjYgNC43Qy40IDcuMS45IDEwLjEgMi45IDEyLjFjMS45IDEuOSA0LjYgMi40IDYuOSAxLjVsOS4xIDkuMWMuNC40IDEgLjQgMS40IDBsMi4zLTIuM2MuNS0uNC41LTEuMS4xLTEuNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJjYWNoZWQiPjxwYXRoIGQ9Ik0xOSA4bC00IDRoM2MwIDMuMzEtMi42OSA2LTYgNi0xLjAxIDAtMS45Ny0uMjUtMi44LS43bC0xLjQ2IDEuNDZDOC45NyAxOS41NCAxMC40MyAyMCAxMiAyMGM0LjQyIDAgOC0zLjU4IDgtOGgzbC00LTR6TTYgMTJjMC0zLjMxIDIuNjktNiA2LTYgMS4wMSAwIDEuOTcuMjUgMi44LjdsMS40Ni0xLjQ2QzE1LjAzIDQuNDYgMTMuNTcgNCAxMiA0Yy00LjQyIDAtOCAzLjU4LTggOEgxbDQgNCA0LTRINnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjYW1lcmEtZW5oYW5jZSI+PHBhdGggZD0iTTkgM0w3LjE3IDVINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY3YzAtMS4xLS45LTItMi0yaC0zLjE3TDE1IDNIOXptMyAxNWMtMi43NiAwLTUtMi4yNC01LTVzMi4yNC01IDUtNSA1IDIuMjQgNSA1LTIuMjQgNS01IDV6bTAtMWwxLjI1LTIuNzVMMTYgMTNsLTIuNzUtMS4yNUwxMiA5bC0xLjI1IDIuNzVMOCAxM2wyLjc1IDEuMjV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2FuY2VsIj48cGF0aCBkPSJNMTIgMkM2LjQ3IDIgMiA2LjQ3IDIgMTJzNC40NyAxMCAxMCAxMCAxMC00LjQ3IDEwLTEwUzE3LjUzIDIgMTIgMnptNSAxMy41OUwxNS41OSAxNyAxMiAxMy40MSA4LjQxIDE3IDcgMTUuNTkgMTAuNTkgMTIgNyA4LjQxIDguNDEgNyAxMiAxMC41OSAxNS41OSA3IDE3IDguNDEgMTMuNDEgMTIgMTcgMTUuNTl6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2FyZC1naWZ0Y2FyZCI+PHBhdGggZD0iTTIwIDZoLTIuMThjLjExLS4zMS4xOC0uNjUuMTgtMSAwLTEuNjYtMS4zNC0zLTMtMy0xLjA1IDAtMS45Ni41NC0yLjUgMS4zNWwtLjUuNjctLjUtLjY4QzEwLjk2IDIuNTQgMTAuMDUgMiA5IDIgNy4zNCAyIDYgMy4zNCA2IDVjMCAuMzUuMDcuNjkuMTggMUg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOWMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6bS01LTJjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXpNOSA0Yy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTExIDE1SDR2LTJoMTZ2MnptMC01SDRWOGg1LjA4TDcgMTAuODMgOC42MiAxMiAxMSA4Ljc2bDEtMS4zNiAxIDEuMzZMMTUuMzggMTIgMTcgMTAuODMgMTQuOTIgOEgyMHY2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNhcmQtbWVtYmVyc2hpcCI+PHBhdGggZD0iTTIwIDJINGMtMS4xMSAwLTIgLjg5LTIgMnYxMWMwIDEuMTEuODkgMiAyIDJoNHY1bDQtMiA0IDJ2LTVoNGMxLjExIDAgMi0uODkgMi0yVjRjMC0xLjExLS44OS0yLTItMnptMCAxM0g0di0yaDE2djJ6bTAtNUg0VjRoMTZ2NnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjYXJkLXRyYXZlbCI+PHBhdGggZD0iTTIwIDZoLTNWNGMwLTEuMTEtLjg5LTItMi0ySDljLTEuMTEgMC0yIC44OS0yIDJ2Mkg0Yy0xLjExIDAtMiAuODktMiAydjExYzAgMS4xMS44OSAyIDIgMmgxNmMxLjExIDAgMi0uODkgMi0yVjhjMC0xLjExLS44OS0yLTItMnpNOSA0aDZ2Mkg5VjR6bTExIDE1SDR2LTJoMTZ2MnptMC01SDRWOGgzdjJoMlY4aDZ2MmgyVjhoM3Y2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNoYW5nZS1oaXN0b3J5Ij48cGF0aCBkPSJNMTIgNy43N0wxOC4zOSAxOEg1LjYxTDEyIDcuNzdNMTIgNEwyIDIwaDIwTDEyIDR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2hlY2siPjxwYXRoIGQ9Ik05IDE2LjE3TDQuODMgMTJsLTEuNDIgMS40MUw5IDE5IDIxIDdsLTEuNDEtMS40MXoiPjwvcGF0aD48L2c+CjxnIGlkPSJjaGVjay1ib3giPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjExIDAgMi0uOSAyLTJWNWMwLTEuMS0uODktMi0yLTJ6bS05IDE0bC01LTUgMS40MS0xLjQxTDEwIDE0LjE3bDcuNTktNy41OUwxOSA4bC05IDl6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2hlY2stYm94LW91dGxpbmUtYmxhbmsiPjxwYXRoIGQ9Ik0xOSA1djE0SDVWNWgxNG0wLTJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNoZWNrLWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bS0yIDE1bC01LTUgMS40MS0xLjQxTDEwIDE0LjE3bDcuNTktNy41OUwxOSA4bC05IDl6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2hldnJvbi1sZWZ0Ij48cGF0aCBkPSJNMTUuNDEgNy40MUwxNCA2bC02IDYgNiA2IDEuNDEtMS40MUwxMC44MyAxMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjaGV2cm9uLXJpZ2h0Ij48cGF0aCBkPSJNMTAgNkw4LjU5IDcuNDEgMTMuMTcgMTJsLTQuNTggNC41OUwxMCAxOGw2LTZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2hyb21lLXJlYWRlci1tb2RlIj48cGF0aCBkPSJNMTMgMTJoN3YxLjVoLTd6bTAtMi41aDdWMTFoLTd6bTAgNWg3VjE2aC03ek0yMSA0SDNjLTEuMSAwLTIgLjktMiAydjEzYzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptMCAxNWgtOVY2aDl2MTN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2xhc3MiPjxwYXRoIGQ9Ik0xOCAySDZjLTEuMSAwLTIgLjktMiAydjE2YzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnpNNiA0aDV2OGwtMi41LTEuNUw2IDEyVjR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2xlYXIiPjxwYXRoIGQ9Ik0xOSA2LjQxTDE3LjU5IDUgMTIgMTAuNTkgNi40MSA1IDUgNi40MSAxMC41OSAxMiA1IDE3LjU5IDYuNDEgMTkgMTIgMTMuNDEgMTcuNTkgMTkgMTkgMTcuNTkgMTMuNDEgMTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2xvc2UiPjxwYXRoIGQ9Ik0xOSA2LjQxTDE3LjU5IDUgMTIgMTAuNTkgNi40MSA1IDUgNi40MSAxMC41OSAxMiA1IDE3LjU5IDYuNDEgMTkgMTIgMTMuNDEgMTcuNTkgMTkgMTkgMTcuNTkgMTMuNDEgMTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2xvdWQiPjxwYXRoIGQ9Ik0xOS4zNSAxMC4wNEMxOC42NyA2LjU5IDE1LjY0IDQgMTIgNCA5LjExIDQgNi42IDUuNjQgNS4zNSA4LjA0IDIuMzQgOC4zNiAwIDEwLjkxIDAgMTRjMCAzLjMxIDIuNjkgNiA2IDZoMTNjMi43NiAwIDUtMi4yNCA1LTUgMC0yLjY0LTIuMDUtNC43OC00LjY1LTQuOTZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2xvdWQtY2lyY2xlIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptNC41IDE0SDhjLTEuNjYgMC0zLTEuMzQtMy0zczEuMzQtMyAzLTNsLjE0LjAxQzguNTggOC4yOCAxMC4xMyA3IDEyIDdjMi4yMSAwIDQgMS43OSA0IDRoLjVjMS4zOCAwIDIuNSAxLjEyIDIuNSAyLjVTMTcuODggMTYgMTYuNSAxNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjbG91ZC1kb25lIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0xMCAxN2wtMy41LTMuNSAxLjQxLTEuNDFMMTAgMTQuMTcgMTUuMTggOWwxLjQxIDEuNDFMMTAgMTd6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2xvdWQtZG93bmxvYWQiPjxwYXRoIGQ9Ik0xOS4zNSAxMC4wNEMxOC42NyA2LjU5IDE1LjY0IDQgMTIgNCA5LjExIDQgNi42IDUuNjQgNS4zNSA4LjA0IDIuMzQgOC4zNiAwIDEwLjkxIDAgMTRjMCAzLjMxIDIuNjkgNiA2IDZoMTNjMi43NiAwIDUtMi4yNCA1LTUgMC0yLjY0LTIuMDUtNC43OC00LjY1LTQuOTZ6TTE3IDEzbC01IDUtNS01aDNWOWg0djRoM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJjbG91ZC1vZmYiPjxwYXRoIGQ9Ik0xOS4zNSAxMC4wNEMxOC42NyA2LjU5IDE1LjY0IDQgMTIgNGMtMS40OCAwLTIuODUuNDMtNC4wMSAxLjE3bDEuNDYgMS40NkMxMC4yMSA2LjIzIDExLjA4IDYgMTIgNmMzLjA0IDAgNS41IDIuNDYgNS41IDUuNXYuNUgxOWMxLjY2IDAgMyAxLjM0IDMgMyAwIDEuMTMtLjY0IDIuMTEtMS41NiAyLjYybDEuNDUgMS40NUMyMy4xNiAxOC4xNiAyNCAxNi42OCAyNCAxNWMwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMyA1LjI3bDIuNzUgMi43NEMyLjU2IDguMTUgMCAxMC43NyAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDExLjczbDIgMkwyMSAyMC43MyA0LjI3IDQgMyA1LjI3ek03LjczIDEwbDggOEg2Yy0yLjIxIDAtNC0xLjc5LTQtNHMxLjc5LTQgNC00aDEuNzN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2xvdWQtcXVldWUiPjxwYXRoIGQ9Ik0xOS4zNSAxMC4wNEMxOC42NyA2LjU5IDE1LjY0IDQgMTIgNCA5LjExIDQgNi42IDUuNjQgNS4zNSA4LjA0IDIuMzQgOC4zNiAwIDEwLjkxIDAgMTRjMCAzLjMxIDIuNjkgNiA2IDZoMTNjMi43NiAwIDUtMi4yNCA1LTUgMC0yLjY0LTIuMDUtNC43OC00LjY1LTQuOTZ6TTE5IDE4SDZjLTIuMjEgMC00LTEuNzktNC00czEuNzktNCA0LTRoLjcxQzcuMzcgNy42OSA5LjQ4IDYgMTIgNmMzLjA0IDAgNS41IDIuNDYgNS41IDUuNXYuNUgxOWMxLjY2IDAgMyAxLjM0IDMgM3MtMS4zNCAzLTMgM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJjbG91ZC11cGxvYWQiPjxwYXRoIGQ9Ik0xOS4zNSAxMC4wNEMxOC42NyA2LjU5IDE1LjY0IDQgMTIgNCA5LjExIDQgNi42IDUuNjQgNS4zNSA4LjA0IDIuMzQgOC4zNiAwIDEwLjkxIDAgMTRjMCAzLjMxIDIuNjkgNiA2IDZoMTNjMi43NiAwIDUtMi4yNCA1LTUgMC0yLjY0LTIuMDUtNC43OC00LjY1LTQuOTZ6TTE0IDEzdjRoLTR2LTRIN2w1LTUgNSA1aC0zeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNvZGUiPjxwYXRoIGQ9Ik05LjQgMTYuNkw0LjggMTJsNC42LTQuNkw4IDZsLTYgNiA2IDYgMS40LTEuNHptNS4yIDBsNC42LTQuNi00LjYtNC42TDE2IDZsNiA2LTYgNi0xLjQtMS40eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNvbXBhcmUtYXJyb3dzIj48cGF0aCBkPSJNOS4wMSAxNEgydjJoNy4wMXYzTDEzIDE1bC0zLjk5LTR2M3ptNS45OC0xdi0zSDIyVjhoLTcuMDFWNUwxMSA5bDMuOTkgNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJjb250ZW50LWNvcHkiPjxwYXRoIGQ9Ik0xNiAxSDRjLTEuMSAwLTIgLjktMiAydjE0aDJWM2gxMlYxem0zIDRIOGMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxMWMxLjEgMCAyLS45IDItMlY3YzAtMS4xLS45LTItMi0yem0wIDE2SDhWN2gxMXYxNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJjb250ZW50LWN1dCI+PHBhdGggZD0iTTkuNjQgNy42NGMuMjMtLjUuMzYtMS4wNS4zNi0xLjY0IDAtMi4yMS0xLjc5LTQtNC00UzIgMy43OSAyIDZzMS43OSA0IDQgNGMuNTkgMCAxLjE0LS4xMyAxLjY0LS4zNkwxMCAxMmwtMi4zNiAyLjM2QzcuMTQgMTQuMTMgNi41OSAxNCA2IDE0Yy0yLjIxIDAtNCAxLjc5LTQgNHMxLjc5IDQgNCA0IDQtMS43OSA0LTRjMC0uNTktLjEzLTEuMTQtLjM2LTEuNjRMMTIgMTRsNyA3aDN2LTFMOS42NCA3LjY0ek02IDhjLTEuMSAwLTItLjg5LTItMnMuOS0yIDItMiAyIC44OSAyIDItLjkgMi0yIDJ6bTAgMTJjLTEuMSAwLTItLjg5LTItMnMuOS0yIDItMiAyIC44OSAyIDItLjkgMi0yIDJ6bTYtNy41Yy0uMjggMC0uNS0uMjItLjUtLjVzLjIyLS41LjUtLjUuNS4yMi41LjUtLjIyLjUtLjUuNXpNMTkgM2wtNiA2IDIgMiA3LTdWM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJjb250ZW50LXBhc3RlIj48cGF0aCBkPSJNMTkgMmgtNC4xOEMxNC40Ljg0IDEzLjMgMCAxMiAwYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE2YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem03IDE4SDVWNGgydjNoMTBWNGgydjE2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNvcHlyaWdodCI+PHBhdGggZD0iTTEwLjA4IDEwLjg2Yy4wNS0uMzMuMTYtLjYyLjMtLjg3cy4zNC0uNDYuNTktLjYyYy4yNC0uMTUuNTQtLjIyLjkxLS4yMy4yMy4wMS40NC4wNS42My4xMy4yLjA5LjM4LjIxLjUyLjM2cy4yNS4zMy4zNC41My4xMy40Mi4xNC42NGgxLjc5Yy0uMDItLjQ3LS4xMS0uOS0uMjgtMS4yOXMtLjQtLjczLS43LTEuMDEtLjY2LS41LTEuMDgtLjY2LS44OC0uMjMtMS4zOS0uMjNjLS42NSAwLTEuMjIuMTEtMS43LjM0cy0uODguNTMtMS4yLjkyLS41Ni44NC0uNzEgMS4zNlM4IDExLjI5IDggMTEuODd2LjI3YzAgLjU4LjA4IDEuMTIuMjMgMS42NHMuMzkuOTcuNzEgMS4zNS43Mi42OSAxLjIuOTEgMS4wNS4zNCAxLjcuMzRjLjQ3IDAgLjkxLS4wOCAxLjMyLS4yM3MuNzctLjM2IDEuMDgtLjYzLjU2LS41OC43NC0uOTQuMjktLjc0LjMtMS4xNWgtMS43OWMtLjAxLjIxLS4wNi40LS4xNS41OHMtLjIxLjMzLS4zNi40Ni0uMzIuMjMtLjUyLjNjLS4xOS4wNy0uMzkuMDktLjYuMS0uMzYtLjAxLS42Ni0uMDgtLjg5LS4yMy0uMjUtLjE2LS40NS0uMzctLjU5LS42MnMtLjI1LS41NS0uMy0uODgtLjA4LS42Ny0uMDgtMXYtLjI3YzAtLjM1LjAzLS42OC4wOC0xLjAxek0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJjcmVhdGUiPjxwYXRoIGQ9Ik0zIDE3LjI1VjIxaDMuNzVMMTcuODEgOS45NGwtMy43NS0zLjc1TDMgMTcuMjV6TTIwLjcxIDcuMDRjLjM5LS4zOS4zOS0xLjAyIDAtMS40MWwtMi4zNC0yLjM0Yy0uMzktLjM5LTEuMDItLjM5LTEuNDEgMGwtMS44MyAxLjgzIDMuNzUgMy43NSAxLjgzLTEuODN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY3JlYXRlLW5ldy1mb2xkZXIiPjxwYXRoIGQ9Ik0yMCA2aC04bC0yLTJINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMThjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWOGMwLTEuMTEtLjg5LTItMi0yem0tMSA4aC0zdjNoLTJ2LTNoLTN2LTJoM1Y5aDJ2M2gzdjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY3JlZGl0LWNhcmQiPjxwYXRoIGQ9Ik0yMCA0SDRjLTEuMTEgMC0xLjk5Ljg5LTEuOTkgMkwyIDE4YzAgMS4xMS44OSAyIDIgMmgxNmMxLjExIDAgMi0uODkgMi0yVjZjMC0xLjExLS44OS0yLTItMnptMCAxNEg0di02aDE2djZ6bTAtMTBINFY2aDE2djJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZGFzaGJvYXJkIj48cGF0aCBkPSJNMyAxM2g4VjNIM3YxMHptMCA4aDh2LTZIM3Y2em0xMCAwaDhWMTFoLTh2MTB6bTAtMTh2Nmg4VjNoLTh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZGF0ZS1yYW5nZSI+PHBhdGggZD0iTTkgMTFIN3YyaDJ2LTJ6bTQgMGgtMnYyaDJ2LTJ6bTQgMGgtMnYyaDJ2LTJ6bTItN2gtMVYyaC0ydjJIOFYySDZ2Mkg1Yy0xLjExIDAtMS45OS45LTEuOTkgMkwzIDIwYzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bTAgMTZINVY5aDE0djExeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImRlbGV0ZSI+PHBhdGggZD0iTTYgMTljMCAxLjEuOSAyIDIgMmg4YzEuMSAwIDItLjkgMi0yVjdINnYxMnpNMTkgNGgtMy41bC0xLTFoLTVsLTEgMUg1djJoMTRWNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJkZWxldGUtZm9yZXZlciI+PHBhdGggZD0iTTYgMTljMCAxLjEuOSAyIDIgMmg4YzEuMSAwIDItLjkgMi0yVjdINnYxMnptMi40Ni03LjEybDEuNDEtMS40MUwxMiAxMi41OWwyLjEyLTIuMTIgMS40MSAxLjQxTDEzLjQxIDE0bDIuMTIgMi4xMi0xLjQxIDEuNDFMMTIgMTUuNDFsLTIuMTIgMi4xMi0xLjQxLTEuNDFMMTAuNTkgMTRsLTIuMTMtMi4xMnpNMTUuNSA0bC0xLTFoLTVsLTEgMUg1djJoMTRWNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJkZWxldGUtc3dlZXAiPjxwYXRoIGQ9Ik0xNSAxNmg0djJoLTR6bTAtOGg3djJoLTd6bTAgNGg2djJoLTZ6TTMgMThjMCAxLjEuOSAyIDIgMmg2YzEuMSAwIDItLjkgMi0yVjhIM3YxMHpNMTQgNWgtM2wtMS0xSDZMNSA1SDJ2MmgxMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJkZXNjcmlwdGlvbiI+PHBhdGggZD0iTTE0IDJINmMtMS4xIDAtMS45OS45LTEuOTkgMkw0IDIwYzAgMS4xLjg5IDIgMS45OSAySDE4YzEuMSAwIDItLjkgMi0yVjhsLTYtNnptMiAxNkg4di0yaDh2MnptMC00SDh2LTJoOHYyem0tMy01VjMuNUwxOC41IDlIMTN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZG5zIj48cGF0aCBkPSJNMjAgMTNINGMtLjU1IDAtMSAuNDUtMSAxdjZjMCAuNTUuNDUgMSAxIDFoMTZjLjU1IDAgMS0uNDUgMS0xdi02YzAtLjU1LS40NS0xLTEtMXpNNyAxOWMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6TTIwIDNINGMtLjU1IDAtMSAuNDUtMSAxdjZjMCAuNTUuNDUgMSAxIDFoMTZjLjU1IDAgMS0uNDUgMS0xVjRjMC0uNTUtLjQ1LTEtMS0xek03IDljLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImRvbmUiPjxwYXRoIGQ9Ik05IDE2LjJMNC44IDEybC0xLjQgMS40TDkgMTkgMjEgN2wtMS40LTEuNEw5IDE2LjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZG9uZS1hbGwiPjxwYXRoIGQ9Ik0xOCA3bC0xLjQxLTEuNDEtNi4zNCA2LjM0IDEuNDEgMS40MUwxOCA3em00LjI0LTEuNDFMMTEuNjYgMTYuMTcgNy40OCAxMmwtMS40MSAxLjQxTDExLjY2IDE5bDEyLTEyLTEuNDItMS40MXpNLjQxIDEzLjQxTDYgMTlsMS40MS0xLjQxTDEuODMgMTIgLjQxIDEzLjQxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImRvbnV0LWxhcmdlIj48cGF0aCBkPSJNMTEgNS4wOFYyYy01IC41LTkgNC44MS05IDEwczQgOS41IDkgMTB2LTMuMDhjLTMtLjQ4LTYtMy40LTYtNi45MnMzLTYuNDQgNi02Ljkyek0xOC45NyAxMUgyMmMtLjQ3LTUtNC04LjUzLTktOXYzLjA4QzE2IDUuNTEgMTguNTQgOCAxOC45NyAxMXpNMTMgMTguOTJWMjJjNS0uNDcgOC41My00IDktOWgtMy4wM2MtLjQzIDMtMi45NyA1LjQ5LTUuOTcgNS45MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJkb251dC1zbWFsbCI+PHBhdGggZD0iTTExIDkuMTZWMmMtNSAuNS05IDQuNzktOSAxMHM0IDkuNSA5IDEwdi03LjE2Yy0xLS40MS0yLTEuNTItMi0yLjg0czEtMi40MyAyLTIuODR6TTE0Ljg2IDExSDIyYy0uNDgtNC43NS00LTguNTMtOS05djcuMTZjMSAuMyAxLjUyLjk4IDEuODYgMS44NHpNMTMgMTQuODRWMjJjNS0uNDcgOC41Mi00LjI1IDktOWgtNy4xNGMtLjM0Ljg2LS44NiAxLjU0LTEuODYgMS44NHoiPjwvcGF0aD48L2c+CjxnIGlkPSJkcmFmdHMiPjxwYXRoIGQ9Ik0yMS45OSA4YzAtLjcyLS4zNy0xLjM1LS45NC0xLjdMMTIgMSAyLjk1IDYuM0MyLjM4IDYuNjUgMiA3LjI4IDIgOHYxMGMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0ybC0uMDEtMTB6TTEyIDEzTDMuNzQgNy44NCAxMiAzbDguMjYgNC44NEwxMiAxM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJlamVjdCI+PHBhdGggZD0iTTUgMTdoMTR2Mkg1em03LTEyTDUuMzMgMTVoMTMuMzR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZXJyb3IiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0xIDE1aC0ydi0yaDJ2MnptMC00aC0yVjdoMnY2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImVycm9yLW91dGxpbmUiPjxwYXRoIGQ9Ik0xMSAxNWgydjJoLTJ6bTAtOGgydjZoLTJ6bS45OS01QzYuNDcgMiAyIDYuNDggMiAxMnM0LjQ3IDEwIDkuOTkgMTBDMTcuNTIgMjIgMjIgMTcuNTIgMjIgMTJTMTcuNTIgMiAxMS45OSAyek0xMiAyMGMtNC40MiAwLTgtMy41OC04LThzMy41OC04IDgtOCA4IDMuNTggOCA4LTMuNTggOC04IDh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZXVyby1zeW1ib2wiPjxwYXRoIGQ9Ik0xNSAxOC41Yy0yLjUxIDAtNC42OC0xLjQyLTUuNzYtMy41SDE1di0ySDguNThjLS4wNS0uMzMtLjA4LS42Ni0uMDgtMXMuMDMtLjY3LjA4LTFIMTVWOUg5LjI0QzEwLjMyIDYuOTIgMTIuNSA1LjUgMTUgNS41YzEuNjEgMCAzLjA5LjU5IDQuMjMgMS41N0wyMSA1LjNDMTkuNDEgMy44NyAxNy4zIDMgMTUgM2MtMy45MiAwLTcuMjQgMi41MS04LjQ4IDZIM3YyaDMuMDZjLS4wNC4zMy0uMDYuNjYtLjA2IDEgMCAuMzQuMDIuNjcuMDYgMUgzdjJoMy41MmMxLjI0IDMuNDkgNC41NiA2IDguNDggNiAyLjMxIDAgNC40MS0uODcgNi0yLjNsLTEuNzgtMS43N2MtMS4xMy45OC0yLjYgMS41Ny00LjIyIDEuNTd6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZXZlbnQiPjxwYXRoIGQ9Ik0xNyAxMmgtNXY1aDV2LTV6TTE2IDF2Mkg4VjFINnYySDVjLTEuMTEgMC0xLjk5LjktMS45OSAyTDMgMTljMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMmgtMVYxaC0yem0zIDE4SDVWOGgxNHYxMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJldmVudC1zZWF0Ij48cGF0aCBkPSJNNCAxOHYzaDN2LTNoMTB2M2gzdi02SDR6bTE1LThoM3YzaC0zek0yIDEwaDN2M0gyem0xNSAzSDdWNWMwLTEuMS45LTIgMi0yaDZjMS4xIDAgMiAuOSAyIDJ2OHoiPjwvcGF0aD48L2c+CjxnIGlkPSJleGl0LXRvLWFwcCI+PHBhdGggZD0iTTEwLjA5IDE1LjU5TDExLjUgMTdsNS01LTUtNS0xLjQxIDEuNDFMMTIuNjcgMTFIM3YyaDkuNjdsLTIuNTggMi41OXpNMTkgM0g1Yy0xLjExIDAtMiAuOS0yIDJ2NGgyVjVoMTR2MTRINXYtNEgzdjRjMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJleHBhbmQtbGVzcyI+PHBhdGggZD0iTTEyIDhsLTYgNiAxLjQxIDEuNDFMMTIgMTAuODNsNC41OSA0LjU4TDE4IDE0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImV4cGFuZC1tb3JlIj48cGF0aCBkPSJNMTYuNTkgOC41OUwxMiAxMy4xNyA3LjQxIDguNTkgNiAxMGw2IDYgNi02eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImV4cGxvcmUiPjxwYXRoIGQ9Ik0xMiAxMC45Yy0uNjEgMC0xLjEuNDktMS4xIDEuMXMuNDkgMS4xIDEuMSAxLjFjLjYxIDAgMS4xLS40OSAxLjEtMS4xcy0uNDktMS4xLTEuMS0xLjF6TTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTIuMTkgMTIuMTlMNiAxOGwzLjgxLTguMTlMMTggNmwtMy44MSA4LjE5eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImV4dGVuc2lvbiI+PHBhdGggZD0iTTIwLjUgMTFIMTlWN2MwLTEuMS0uOS0yLTItMmgtNFYzLjVDMTMgMi4xMiAxMS44OCAxIDEwLjUgMVM4IDIuMTIgOCAzLjVWNUg0Yy0xLjEgMC0xLjk5LjktMS45OSAydjMuOEgzLjVjMS40OSAwIDIuNyAxLjIxIDIuNyAyLjdzLTEuMjEgMi43LTIuNyAyLjdIMlYyMGMwIDEuMS45IDIgMiAyaDMuOHYtMS41YzAtMS40OSAxLjIxLTIuNyAyLjctMi43IDEuNDkgMCAyLjcgMS4yMSAyLjcgMi43VjIySDE3YzEuMSAwIDItLjkgMi0ydi00aDEuNWMxLjM4IDAgMi41LTEuMTIgMi41LTIuNVMyMS44OCAxMSAyMC41IDExeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZhY2UiPjxwYXRoIGQ9Ik05IDExLjc1Yy0uNjkgMC0xLjI1LjU2LTEuMjUgMS4yNXMuNTYgMS4yNSAxLjI1IDEuMjUgMS4yNS0uNTYgMS4yNS0xLjI1LS41Ni0xLjI1LTEuMjUtMS4yNXptNiAwYy0uNjkgMC0xLjI1LjU2LTEuMjUgMS4yNXMuNTYgMS4yNSAxLjI1IDEuMjUgMS4yNS0uNTYgMS4yNS0xLjI1LS41Ni0xLjI1LTEuMjUtMS4yNXpNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LTggMC0uMjkuMDItLjU4LjA1LS44NiAyLjM2LTEuMDUgNC4yMy0yLjk4IDUuMjEtNS4zN0MxMS4wNyA4LjMzIDE0LjA1IDEwIDE3LjQyIDEwYy43OCAwIDEuNTMtLjA5IDIuMjUtLjI2LjIxLjcxLjMzIDEuNDcuMzMgMi4yNiAwIDQuNDEtMy41OSA4LTggOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJmYXZvcml0ZSI+PHBhdGggZD0iTTEyIDIxLjM1bC0xLjQ1LTEuMzJDNS40IDE1LjM2IDIgMTIuMjggMiA4LjUgMiA1LjQyIDQuNDIgMyA3LjUgM2MxLjc0IDAgMy40MS44MSA0LjUgMi4wOUMxMy4wOSAzLjgxIDE0Ljc2IDMgMTYuNSAzIDE5LjU4IDMgMjIgNS40MiAyMiA4LjVjMCAzLjc4LTMuNCA2Ljg2LTguNTUgMTEuNTRMMTIgMjEuMzV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmF2b3JpdGUtYm9yZGVyIj48cGF0aCBkPSJNMTYuNSAzYy0xLjc0IDAtMy40MS44MS00LjUgMi4wOUMxMC45MSAzLjgxIDkuMjQgMyA3LjUgMyA0LjQyIDMgMiA1LjQyIDIgOC41YzAgMy43OCAzLjQgNi44NiA4LjU1IDExLjU0TDEyIDIxLjM1bDEuNDUtMS4zMkMxOC42IDE1LjM2IDIyIDEyLjI4IDIyIDguNSAyMiA1LjQyIDE5LjU4IDMgMTYuNSAzem0tNC40IDE1LjU1bC0uMS4xLS4xLS4xQzcuMTQgMTQuMjQgNCAxMS4zOSA0IDguNSA0IDYuNSA1LjUgNSA3LjUgNWMxLjU0IDAgMy4wNC45OSAzLjU3IDIuMzZoMS44N0MxMy40NiA1Ljk5IDE0Ljk2IDUgMTYuNSA1YzIgMCAzLjUgMS41IDMuNSAzLjUgMCAyLjg5LTMuMTQgNS43NC03LjkgMTAuMDV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmVlZGJhY2siPjxwYXRoIGQ9Ik0yMCAySDRjLTEuMSAwLTEuOTkuOS0xLjk5IDJMMiAyMmw0LTRoMTRjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTcgMTJoLTJ2LTJoMnYyem0wLTRoLTJWNmgydjR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsZS1kb3dubG9hZCI+PHBhdGggZD0iTTE5IDloLTRWM0g5djZINWw3IDcgNy03ek01IDE4djJoMTR2LTJINXoiPjwvcGF0aD48L2c+CjxnIGlkPSJmaWxlLXVwbG9hZCI+PHBhdGggZD0iTTkgMTZoNnYtNmg0bC03LTctNyA3aDR6bS00IDJoMTR2Mkg1eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZpbHRlci1saXN0Ij48cGF0aCBkPSJNMTAgMThoNHYtMmgtNHYyek0zIDZ2MmgxOFY2SDN6bTMgN2gxMnYtMkg2djJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmluZC1pbi1wYWdlIj48cGF0aCBkPSJNMjAgMTkuNTlWOGwtNi02SDZjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNCAyMGMwIDEuMS44OSAyIDEuOTkgMkgxOGMuNDUgMCAuODUtLjE1IDEuMTktLjRsLTQuNDMtNC40M2MtLjguNTItMS43NC44My0yLjc2LjgzLTIuNzYgMC01LTIuMjQtNS01czIuMjQtNSA1LTUgNSAyLjI0IDUgNWMwIDEuMDItLjMxIDEuOTYtLjgzIDIuNzVMMjAgMTkuNTl6TTkgMTNjMCAxLjY2IDEuMzQgMyAzIDNzMy0xLjM0IDMtMy0xLjM0LTMtMy0zLTMgMS4zNC0zIDN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmluZC1yZXBsYWNlIj48cGF0aCBkPSJNMTEgNmMxLjM4IDAgMi42My41NiAzLjU0IDEuNDZMMTIgMTBoNlY0bC0yLjA1IDIuMDVDMTQuNjggNC43OCAxMi45MyA0IDExIDRjLTMuNTMgMC02LjQzIDIuNjEtNi45MiA2SDYuMWMuNDYtMi4yOCAyLjQ4LTQgNC45LTR6bTUuNjQgOS4xNGMuNjYtLjkgMS4xMi0xLjk3IDEuMjgtMy4xNEgxNS45Yy0uNDYgMi4yOC0yLjQ4IDQtNC45IDQtMS4zOCAwLTIuNjMtLjU2LTMuNTQtMS40NkwxMCAxMkg0djZsMi4wNS0yLjA1QzcuMzIgMTcuMjIgOS4wNyAxOCAxMSAxOGMxLjU1IDAgMi45OC0uNTEgNC4xNC0xLjM2TDIwIDIxLjQ5IDIxLjQ5IDIwbC00Ljg1LTQuODZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmluZ2VycHJpbnQiPjxwYXRoIGQ9Ik0xNy44MSA0LjQ3Yy0uMDggMC0uMTYtLjAyLS4yMy0uMDZDMTUuNjYgMy40MiAxNCAzIDEyLjAxIDNjLTEuOTggMC0zLjg2LjQ3LTUuNTcgMS40MS0uMjQuMTMtLjU0LjA0LS42OC0uMi0uMTMtLjI0LS4wNC0uNTUuMi0uNjhDNy44MiAyLjUyIDkuODYgMiAxMi4wMSAyYzIuMTMgMCAzLjk5LjQ3IDYuMDMgMS41Mi4yNS4xMy4zNC40My4yMS42Ny0uMDkuMTgtLjI2LjI4LS40NC4yOHpNMy41IDkuNzJjLS4xIDAtLjItLjAzLS4yOS0uMDktLjIzLS4xNi0uMjgtLjQ3LS4xMi0uNy45OS0xLjQgMi4yNS0yLjUgMy43NS0zLjI3QzkuOTggNC4wNCAxNCA0LjAzIDE3LjE1IDUuNjVjMS41Ljc3IDIuNzYgMS44NiAzLjc1IDMuMjUuMTYuMjIuMTEuNTQtLjEyLjctLjIzLjE2LS41NC4xMS0uNy0uMTItLjktMS4yNi0yLjA0LTIuMjUtMy4zOS0yLjk0LTIuODctMS40Ny02LjU0LTEuNDctOS40LjAxLTEuMzYuNy0yLjUgMS43LTMuNCAyLjk2LS4wOC4xNC0uMjMuMjEtLjM5LjIxem02LjI1IDEyLjA3Yy0uMTMgMC0uMjYtLjA1LS4zNS0uMTUtLjg3LS44Ny0xLjM0LTEuNDMtMi4wMS0yLjY0LS42OS0xLjIzLTEuMDUtMi43My0xLjA1LTQuMzQgMC0yLjk3IDIuNTQtNS4zOSA1LjY2LTUuMzlzNS42NiAyLjQyIDUuNjYgNS4zOWMwIC4yOC0uMjIuNS0uNS41cy0uNS0uMjItLjUtLjVjMC0yLjQyLTIuMDktNC4zOS00LjY2LTQuMzktMi41NyAwLTQuNjYgMS45Ny00LjY2IDQuMzkgMCAxLjQ0LjMyIDIuNzcuOTMgMy44NS42NCAxLjE1IDEuMDggMS42NCAxLjg1IDIuNDIuMTkuMi4xOS41MSAwIC43MS0uMTEuMS0uMjQuMTUtLjM3LjE1em03LjE3LTEuODVjLTEuMTkgMC0yLjI0LS4zLTMuMS0uODktMS40OS0xLjAxLTIuMzgtMi42NS0yLjM4LTQuMzkgMC0uMjguMjItLjUuNS0uNXMuNS4yMi41LjVjMCAxLjQxLjcyIDIuNzQgMS45NCAzLjU2LjcxLjQ4IDEuNTQuNzEgMi41NC43MS4yNCAwIC42NC0uMDMgMS4wNC0uMS4yNy0uMDUuNTMuMTMuNTguNDEuMDUuMjctLjEzLjUzLS40MS41OC0uNTcuMTEtMS4wNy4xMi0xLjIxLjEyek0xNC45MSAyMmMtLjA0IDAtLjA5LS4wMS0uMTMtLjAyLTEuNTktLjQ0LTIuNjMtMS4wMy0zLjcyLTIuMS0xLjQtMS4zOS0yLjE3LTMuMjQtMi4xNy01LjIyIDAtMS42MiAxLjM4LTIuOTQgMy4wOC0yLjk0IDEuNyAwIDMuMDggMS4zMiAzLjA4IDIuOTQgMCAxLjA3LjkzIDEuOTQgMi4wOCAxLjk0czIuMDgtLjg3IDIuMDgtMS45NGMwLTMuNzctMy4yNS02LjgzLTcuMjUtNi44My0yLjg0IDAtNS40NCAxLjU4LTYuNjEgNC4wMy0uMzkuODEtLjU5IDEuNzYtLjU5IDIuOCAwIC43OC4wNyAyLjAxLjY3IDMuNjEuMS4yNi0uMDMuNTUtLjI5LjY0LS4yNi4xLS41NS0uMDQtLjY0LS4yOS0uNDktMS4zMS0uNzMtMi42MS0uNzMtMy45NiAwLTEuMi4yMy0yLjI5LjY4LTMuMjQgMS4zMy0yLjc5IDQuMjgtNC42IDcuNTEtNC42IDQuNTUgMCA4LjI1IDMuNTEgOC4yNSA3LjgzIDAgMS42Mi0xLjM4IDIuOTQtMy4wOCAyLjk0cy0zLjA4LTEuMzItMy4wOC0yLjk0YzAtMS4wNy0uOTMtMS45NC0yLjA4LTEuOTRzLTIuMDguODctMi4wOCAxLjk0YzAgMS43MS42NiAzLjMxIDEuODcgNC41MS45NS45NCAxLjg2IDEuNDYgMy4yNyAxLjg1LjI3LjA3LjQyLjM1LjM1LjYxLS4wNS4yMy0uMjYuMzgtLjQ3LjM4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZpcnN0LXBhZ2UiPjxwYXRoIGQ9Ik0xOC40MSAxNi41OUwxMy44MiAxMmw0LjU5LTQuNTlMMTcgNmwtNiA2IDYgNnpNNiA2aDJ2MTJINnoiPjwvcGF0aD48L2c+CjxnIGlkPSJmbGFnIj48cGF0aCBkPSJNMTQuNCA2TDE0IDRINXYxN2gydi03aDUuNmwuNCAyaDdWNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJmbGlnaHQtbGFuZCI+PHBhdGggZD0iTTIuNSAxOWgxOXYyaC0xOXptNy4xOC01LjczbDQuMzUgMS4xNiA1LjMxIDEuNDJjLjguMjEgMS42Mi0uMjYgMS44NC0xLjA2LjIxLS44LS4yNi0xLjYyLTEuMDYtMS44NGwtNS4zMS0xLjQyLTIuNzYtOS4wMkwxMC4xMiAydjguMjhMNS4xNSA4Ljk1bC0uOTMtMi4zMi0xLjQ1LS4zOXY1LjE3bDEuNi40MyA1LjMxIDEuNDN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmxpZ2h0LXRha2VvZmYiPjxwYXRoIGQ9Ik0yLjUgMTloMTl2MmgtMTl6bTE5LjU3LTkuMzZjLS4yMS0uOC0xLjA0LTEuMjgtMS44NC0xLjA2TDE0LjkyIDEwbC02LjktNi40My0xLjkzLjUxIDQuMTQgNy4xNy00Ljk3IDEuMzMtMS45Ny0xLjU0LTEuNDUuMzkgMS44MiAzLjE2Ljc3IDEuMzMgMS42LS40MyA1LjMxLTEuNDIgNC4zNS0xLjE2TDIxIDExLjQ5Yy44MS0uMjMgMS4yOC0xLjA1IDEuMDctMS44NXoiPjwvcGF0aD48L2c+CjxnIGlkPSJmbGlwLXRvLWJhY2siPjxwYXRoIGQ9Ik05IDdIN3YyaDJWN3ptMCA0SDd2Mmgydi0yem0wLThjLTEuMTEgMC0yIC45LTIgMmgyVjN6bTQgMTJoLTJ2Mmgydi0yem02LTEydjJoMmMwLTEuMS0uOS0yLTItMnptLTYgMGgtMnYyaDJWM3pNOSAxN3YtMkg3YzAgMS4xLjg5IDIgMiAyem0xMC00aDJ2LTJoLTJ2MnptMC00aDJWN2gtMnYyem0wIDhjMS4xIDAgMi0uOSAyLTJoLTJ2MnpNNSA3SDN2MTJjMCAxLjEuODkgMiAyIDJoMTJ2LTJINVY3em0xMC0yaDJWM2gtMnYyem0wIDEyaDJ2LTJoLTJ2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJmbGlwLXRvLWZyb250Ij48cGF0aCBkPSJNMyAxM2gydi0ySDN2MnptMCA0aDJ2LTJIM3Yyem0yIDR2LTJIM2MwIDEuMS44OSAyIDIgMnpNMyA5aDJWN0gzdjJ6bTEyIDEyaDJ2LTJoLTJ2MnptNC0xOEg5Yy0xLjExIDAtMiAuOS0yIDJ2MTBjMCAxLjEuODkgMiAyIDJoMTBjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxMkg5VjVoMTB2MTB6bS04IDZoMnYtMmgtMnYyem0tNCAwaDJ2LTJIN3YyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZvbGRlciI+PHBhdGggZD0iTTEwIDRINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE4YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWOGMwLTEuMS0uOS0yLTItMmgtOGwtMi0yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZvbGRlci1vcGVuIj48cGF0aCBkPSJNMjAgNmgtOGwtMi0ySDRjLTEuMSAwLTEuOTkuOS0xLjk5IDJMMiAxOGMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6bTAgMTJINFY4aDE2djEweiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZvbGRlci1zaGFyZWQiPjxwYXRoIGQ9Ik0yMCA2aC04bC0yLTJINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE4YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWOGMwLTEuMS0uOS0yLTItMnptLTUgM2MxLjEgMCAyIC45IDIgMnMtLjkgMi0yIDItMi0uOS0yLTIgLjktMiAyLTJ6bTQgOGgtOHYtMWMwLTEuMzMgMi42Ny0yIDQtMnM0IC42NyA0IDJ2MXoiPjwvcGF0aD48L2c+CjxnIGlkPSJmb250LWRvd25sb2FkIj48cGF0aCBkPSJNOS45MyAxMy41aDQuMTRMMTIgNy45OHpNMjAgMkg0Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6bS00LjA1IDE2LjVsLTEuMTQtM0g5LjE3bC0xLjEyIDNINS45Nmw1LjExLTEzaDEuODZsNS4xMSAxM2gtMi4wOXoiPjwvcGF0aD48L2c+CjxnIGlkPSJmb3J3YXJkIj48cGF0aCBkPSJNMTIgOFY0bDggOC04IDh2LTRINFY4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZ1bGxzY3JlZW4iPjxwYXRoIGQ9Ik03IDE0SDV2NWg1di0ySDd2LTN6bS0yLTRoMlY3aDNWNUg1djV6bTEyIDdoLTN2Mmg1di01aC0ydjN6TTE0IDV2MmgzdjNoMlY1aC01eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZ1bGxzY3JlZW4tZXhpdCI+PHBhdGggZD0iTTUgMTZoM3YzaDJ2LTVINXYyem0zLThINXYyaDVWNUg4djN6bTYgMTFoMnYtM2gzdi0yaC01djV6bTItMTFWNWgtMnY1aDVWOGgtM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJnLXRyYW5zbGF0ZSI+PHBhdGggZD0iTTIwIDVoLTkuMTJMMTAgMkg0Yy0xLjEgMC0yIC45LTIgMnYxM2MwIDEuMS45IDIgMiAyaDdsMSAzaDhjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMnpNNy4xNyAxNC41OWMtMi4yNSAwLTQuMDktMS44My00LjA5LTQuMDlzMS44My00LjA5IDQuMDktNC4wOWMxLjA0IDAgMS45OS4zNyAyLjc0IDEuMDdsLjA3LjA2LTEuMjMgMS4xOC0uMDYtLjA1Yy0uMjktLjI3LS43OC0uNTktMS41Mi0uNTktMS4zMSAwLTIuMzggMS4wOS0yLjM4IDIuNDJzMS4wNyAyLjQyIDIuMzggMi40MmMxLjM3IDAgMS45Ni0uODcgMi4xMi0xLjQ2SDcuMDhWOS45MWgzLjk1bC4wMS4wN2MuMDQuMjEuMDUuNC4wNS42MSAwIDIuMzUtMS42MSA0LTMuOTIgNHptNi4wMy0xLjcxYy4zMy42Ljc0IDEuMTggMS4xOSAxLjdsLS41NC41My0uNjUtMi4yM3ptLjc3LS43NmgtLjk5bC0uMzEtMS4wNGgzLjk5cy0uMzQgMS4zMS0xLjU2IDIuNzRjLS41Mi0uNjItLjg5LTEuMjMtMS4xMy0xLjd6TTIxIDIwYzAgLjU1LS40NSAxLTEgMWgtN2wyLTItLjgxLTIuNzcuOTItLjkyTDE3Ljc5IDE4bC43My0uNzMtMi43MS0yLjY4Yy45LTEuMDMgMS42LTIuMjUgMS45Mi0zLjUxSDE5di0xLjA0aC0zLjY0VjloLTEuMDR2MS4wNGgtMS45NkwxMS4xOCA2SDIwYy41NSAwIDEgLjQ1IDEgMXYxM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJnYXZlbCI+PHBhdGggZD0iTTEgMjFoMTJ2Mkgxek01LjI0NSA4LjA3bDIuODMtMi44MjcgMTQuMTQgMTQuMTQyLTIuODI4IDIuODI4ek0xMi4zMTcgMWw1LjY1NyA1LjY1Ni0yLjgzIDIuODMtNS42NTQtNS42NnpNMy44MjUgOS40ODVsNS42NTcgNS42NTctMi44MjggMi44MjgtNS42NTctNS42NTd6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZ2VzdHVyZSI+PHBhdGggZD0iTTQuNTkgNi44OWMuNy0uNzEgMS40LTEuMzUgMS43MS0xLjIyLjUuMiAwIDEuMDMtLjMgMS41Mi0uMjUuNDItMi44NiAzLjg5LTIuODYgNi4zMSAwIDEuMjguNDggMi4zNCAxLjM0IDIuOTguNzUuNTYgMS43NC43MyAyLjY0LjQ2IDEuMDctLjMxIDEuOTUtMS40IDMuMDYtMi43NyAxLjIxLTEuNDkgMi44My0zLjQ0IDQuMDgtMy40NCAxLjYzIDAgMS42NSAxLjAxIDEuNzYgMS43OS0zLjc4LjY0LTUuMzggMy42Ny01LjM4IDUuMzcgMCAxLjcgMS40NCAzLjA5IDMuMjEgMy4wOSAxLjYzIDAgNC4yOS0xLjMzIDQuNjktNi4xSDIxdi0yLjVoLTIuNDdjLS4xNS0xLjY1LTEuMDktNC4yLTQuMDMtNC4yLTIuMjUgMC00LjE4IDEuOTEtNC45NCAyLjg0LS41OC43My0yLjA2IDIuNDgtMi4yOSAyLjcyLS4yNS4zLS42OC44NC0xLjExLjg0LS40NSAwLS43Mi0uODMtLjM2LTEuOTIuMzUtMS4wOSAxLjQtMi44NiAxLjg1LTMuNTIuNzgtMS4xNCAxLjMtMS45MiAxLjMtMy4yOEM4Ljk1IDMuNjkgNy4zMSAzIDYuNDQgMyA1LjEyIDMgMy45NyA0IDMuNzIgNC4yNWMtLjM2LjM2LS42Ni42Ni0uODguOTNsMS43NSAxLjcxem05LjI5IDExLjY2Yy0uMzEgMC0uNzQtLjI2LS43NC0uNzIgMC0uNi43My0yLjIgMi44Ny0yLjc2LS4zIDIuNjktMS40MyAzLjQ4LTIuMTMgMy40OHoiPjwvcGF0aD48L2c+CjxnIGlkPSJnZXQtYXBwIj48cGF0aCBkPSJNMTkgOWgtNFYzSDl2Nkg1bDcgNyA3LTd6TTUgMTh2MmgxNHYtMkg1eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImdpZiI+PHBhdGggZD0iTTExLjUgOUgxM3Y2aC0xLjV6TTkgOUg2Yy0uNiAwLTEgLjUtMSAxdjRjMCAuNS40IDEgMSAxaDNjLjYgMCAxLS41IDEtMXYtMkg4LjV2MS41aC0ydi0zSDEwVjEwYzAtLjUtLjQtMS0xLTF6bTEwIDEuNVY5aC00LjV2NkgxNnYtMmgydi0xLjVoLTJ2LTF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZ3JhZGUiPjxwYXRoIGQ9Ik0xMiAxNy4yN0wxOC4xOCAyMWwtMS42NC03LjAzTDIyIDkuMjRsLTcuMTktLjYxTDEyIDIgOS4xOSA4LjYzIDIgOS4yNGw1LjQ2IDQuNzNMNS44MiAyMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJncm91cC13b3JrIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnpNOCAxNy41Yy0xLjM4IDAtMi41LTEuMTItMi41LTIuNXMxLjEyLTIuNSAyLjUtMi41IDIuNSAxLjEyIDIuNSAyLjUtMS4xMiAyLjUtMi41IDIuNXpNOS41IDhjMC0xLjM4IDEuMTItMi41IDIuNS0yLjVzMi41IDEuMTIgMi41IDIuNS0xLjEyIDIuNS0yLjUgMi41UzkuNSA5LjM4IDkuNSA4em02LjUgOS41Yy0xLjM4IDAtMi41LTEuMTItMi41LTIuNXMxLjEyLTIuNSAyLjUtMi41IDIuNSAxLjEyIDIuNSAyLjUtMS4xMiAyLjUtMi41IDIuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJoZWxwIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMSAxN2gtMnYtMmgydjJ6bTIuMDctNy43NWwtLjkuOTJDMTMuNDUgMTIuOSAxMyAxMy41IDEzIDE1aC0ydi0uNWMwLTEuMS40NS0yLjEgMS4xNy0yLjgzbDEuMjQtMS4yNmMuMzctLjM2LjU5LS44Ni41OS0xLjQxIDAtMS4xLS45LTItMi0ycy0yIC45LTIgMkg4YzAtMi4yMSAxLjc5LTQgNC00czQgMS43OSA0IDRjMCAuODgtLjM2IDEuNjgtLjkzIDIuMjV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaGVscC1vdXRsaW5lIj48cGF0aCBkPSJNMTEgMThoMnYtMmgtMnYyem0xLTE2QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHptMC0xNGMtMi4yMSAwLTQgMS43OS00IDRoMmMwLTEuMS45LTIgMi0yczIgLjkgMiAyYzAgMi0zIDEuNzUtMyA1aDJjMC0yLjI1IDMtMi41IDMtNSAwLTIuMjEtMS43OS00LTQtNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJoaWdobGlnaHQtb2ZmIj48cGF0aCBkPSJNMTQuNTkgOEwxMiAxMC41OSA5LjQxIDggOCA5LjQxIDEwLjU5IDEyIDggMTQuNTkgOS40MSAxNiAxMiAxMy40MSAxNC41OSAxNiAxNiAxNC41OSAxMy40MSAxMiAxNiA5LjQxIDE0LjU5IDh6TTEyIDJDNi40NyAyIDIgNi40NyAyIDEyczQuNDcgMTAgMTAgMTAgMTAtNC40NyAxMC0xMFMxNy41MyAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Imhpc3RvcnkiPjxwYXRoIGQ9Ik0xMyAzYy00Ljk3IDAtOSA0LjAzLTkgOUgxbDMuODkgMy44OS4wNy4xNEw5IDEySDZjMC0zLjg3IDMuMTMtNyA3LTdzNyAzLjEzIDcgNy0zLjEzIDctNyA3Yy0xLjkzIDAtMy42OC0uNzktNC45NC0yLjA2bC0xLjQyIDEuNDJDOC4yNyAxOS45OSAxMC41MSAyMSAxMyAyMWM0Ljk3IDAgOS00LjAzIDktOXMtNC4wMy05LTktOXptLTEgNXY1bDQuMjggMi41NC43Mi0xLjIxLTMuNS0yLjA4VjhIMTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaG9tZSI+PHBhdGggZD0iTTEwIDIwdi02aDR2Nmg1di04aDNMMTIgMyAyIDEyaDN2OHoiPjwvcGF0aD48L2c+CjxnIGlkPSJob3VyZ2xhc3MtZW1wdHkiPjxwYXRoIGQ9Ik02IDJ2NmguMDFMNiA4LjAxIDEwIDEybC00IDQgLjAxLjAxSDZWMjJoMTJ2LTUuOTloLS4wMUwxOCAxNmwtNC00IDQtMy45OS0uMDEtLjAxSDE4VjJINnptMTAgMTQuNVYyMEg4di0zLjVsNC00IDQgNHptLTQtNWwtNC00VjRoOHYzLjVsLTQgNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJob3VyZ2xhc3MtZnVsbCI+PHBhdGggZD0iTTYgMnY2aC4wMUw2IDguMDEgMTAgMTJsLTQgNCAuMDEuMDFINlYyMmgxMnYtNS45OWgtLjAxTDE4IDE2bC00LTQgNC0zLjk5LS4wMS0uMDFIMThWMkg2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Imh0dHAiPjxwYXRoIGQ9Ik00LjUgMTFoLTJWOUgxdjZoMS41di0yLjVoMlYxNUg2VjlINC41djJ6bTIuNS0uNWgxLjVWMTVIMTB2LTQuNWgxLjVWOUg3djEuNXptNS41IDBIMTRWMTVoMS41di00LjVIMTdWOWgtNC41djEuNXptOS0xLjVIMTh2NmgxLjV2LTJoMmMuOCAwIDEuNS0uNyAxLjUtMS41di0xYzAtLjgtLjctMS41LTEuNS0xLjV6bTAgMi41aC0ydi0xaDJ2MXoiPjwvcGF0aD48L2c+CjxnIGlkPSJodHRwcyI+PHBhdGggZD0iTTE4IDhoLTFWNmMwLTIuNzYtMi4yNC01LTUtNVM3IDMuMjQgNyA2djJINmMtMS4xIDAtMiAuOS0yIDJ2MTBjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlYxMGMwLTEuMS0uOS0yLTItMnptLTYgOWMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6bTMuMS05SDguOVY2YzAtMS43MSAxLjM5LTMuMSAzLjEtMy4xIDEuNzEgMCAzLjEgMS4zOSAzLjEgMy4xdjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaW1wb3J0YW50LWRldmljZXMiPjxwYXRoIGQ9Ik0yMyAxMS4wMUwxOCAxMWMtLjU1IDAtMSAuNDUtMSAxdjljMCAuNTUuNDUgMSAxIDFoNWMuNTUgMCAxLS40NSAxLTF2LTljMC0uNTUtLjQ1LS45OS0xLS45OXpNMjMgMjBoLTV2LTdoNXY3ek0yMCAySDJDLjg5IDIgMCAyLjg5IDAgNHYxMmMwIDEuMS44OSAyIDIgMmg3djJIN3YyaDh2LTJoLTJ2LTJoMnYtMkgyVjRoMTh2NWgyVjRjMC0xLjExLS45LTItMi0yem0tOC4wMyA3TDExIDZsLS45NyAzSDdsMi40NyAxLjc2LS45NCAyLjkxIDIuNDctMS44IDIuNDcgMS44LS45NC0yLjkxTDE1IDloLTMuMDN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaW5ib3giPjxwYXRoIGQ9Ik0xOSAzSDQuOTljLTEuMTEgMC0xLjk4Ljg5LTEuOTggMkwzIDE5YzAgMS4xLjg4IDIgMS45OSAySDE5YzEuMSAwIDItLjkgMi0yVjVjMC0xLjExLS45LTItMi0yem0wIDEyaC00YzAgMS42Ni0xLjM1IDMtMyAzcy0zLTEuMzQtMy0zSDQuOTlWNUgxOXYxMHoiPjwvcGF0aD48L2c+CjxnIGlkPSJpbmRldGVybWluYXRlLWNoZWNrLWJveCI+PHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tMiAxMEg3di0yaDEwdjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaW5mbyI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTEgMTVoLTJ2LTZoMnY2em0wLThoLTJWN2gydjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaW5mby1vdXRsaW5lIj48cGF0aCBkPSJNMTEgMTdoMnYtNmgtMnY2em0xLTE1QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHpNMTEgOWgyVjdoLTJ2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJpbnB1dCI+PHBhdGggZD0iTTIxIDMuMDFIM2MtMS4xIDAtMiAuOS0yIDJWOWgyVjQuOTloMTh2MTQuMDNIM1YxNUgxdjQuMDFjMCAxLjEuOSAxLjk4IDIgMS45OGgxOGMxLjEgMCAyLS44OCAyLTEuOTh2LTE0YzAtMS4xMS0uOS0yLTItMnpNMTEgMTZsNC00LTQtNHYzSDF2MmgxMHYzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImludmVydC1jb2xvcnMiPjxwYXRoIGQ9Ik0xNy42NiA3LjkzTDEyIDIuMjcgNi4zNCA3LjkzYy0zLjEyIDMuMTItMy4xMiA4LjE5IDAgMTEuMzFDNy45IDIwLjggOS45NSAyMS41OCAxMiAyMS41OGMyLjA1IDAgNC4xLS43OCA1LjY2LTIuMzQgMy4xMi0zLjEyIDMuMTItOC4xOSAwLTExLjMxek0xMiAxOS41OWMtMS42IDAtMy4xMS0uNjItNC4yNC0xLjc2QzYuNjIgMTYuNjkgNiAxNS4xOSA2IDEzLjU5cy42Mi0zLjExIDEuNzYtNC4yNEwxMiA1LjF2MTQuNDl6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibGFiZWwiPjxwYXRoIGQ9Ik0xNy42MyA1Ljg0QzE3LjI3IDUuMzMgMTYuNjcgNSAxNiA1TDUgNS4wMUMzLjkgNS4wMSAzIDUuOSAzIDd2MTBjMCAxLjEuOSAxLjk5IDIgMS45OUwxNiAxOWMuNjcgMCAxLjI3LS4zMyAxLjYzLS44NEwyMiAxMmwtNC4zNy02LjE2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImxhYmVsLW91dGxpbmUiPjxwYXRoIGQ9Ik0xNy42MyA1Ljg0QzE3LjI3IDUuMzMgMTYuNjcgNSAxNiA1TDUgNS4wMUMzLjkgNS4wMSAzIDUuOSAzIDd2MTBjMCAxLjEuOSAxLjk5IDIgMS45OUwxNiAxOWMuNjcgMCAxLjI3LS4zMyAxLjYzLS44NEwyMiAxMmwtNC4zNy02LjE2ek0xNiAxN0g1VjdoMTFsMy41NSA1TDE2IDE3eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Imxhbmd1YWdlIj48cGF0aCBkPSJNMTEuOTkgMkM2LjQ3IDIgMiA2LjQ4IDIgMTJzNC40NyAxMCA5Ljk5IDEwQzE3LjUyIDIyIDIyIDE3LjUyIDIyIDEyUzE3LjUyIDIgMTEuOTkgMnptNi45MyA2aC0yLjk1Yy0uMzItMS4yNS0uNzgtMi40NS0xLjM4LTMuNTYgMS44NC42MyAzLjM3IDEuOTEgNC4zMyAzLjU2ek0xMiA0LjA0Yy44MyAxLjIgMS40OCAyLjUzIDEuOTEgMy45NmgtMy44MmMuNDMtMS40MyAxLjA4LTIuNzYgMS45MS0zLjk2ek00LjI2IDE0QzQuMSAxMy4zNiA0IDEyLjY5IDQgMTJzLjEtMS4zNi4yNi0yaDMuMzhjLS4wOC42Ni0uMTQgMS4zMi0uMTQgMiAwIC42OC4wNiAxLjM0LjE0IDJINC4yNnptLjgyIDJoMi45NWMuMzIgMS4yNS43OCAyLjQ1IDEuMzggMy41Ni0xLjg0LS42My0zLjM3LTEuOS00LjMzLTMuNTZ6bTIuOTUtOEg1LjA4Yy45Ni0xLjY2IDIuNDktMi45MyA0LjMzLTMuNTZDOC44MSA1LjU1IDguMzUgNi43NSA4LjAzIDh6TTEyIDE5Ljk2Yy0uODMtMS4yLTEuNDgtMi41My0xLjkxLTMuOTZoMy44MmMtLjQzIDEuNDMtMS4wOCAyLjc2LTEuOTEgMy45NnpNMTQuMzQgMTRIOS42NmMtLjA5LS42Ni0uMTYtMS4zMi0uMTYtMiAwLS42OC4wNy0xLjM1LjE2LTJoNC42OGMuMDkuNjUuMTYgMS4zMi4xNiAyIDAgLjY4LS4wNyAxLjM0LS4xNiAyem0uMjUgNS41NmMuNi0xLjExIDEuMDYtMi4zMSAxLjM4LTMuNTZoMi45NWMtLjk2IDEuNjUtMi40OSAyLjkzLTQuMzMgMy41NnpNMTYuMzYgMTRjLjA4LS42Ni4xNC0xLjMyLjE0LTIgMC0uNjgtLjA2LTEuMzQtLjE0LTJoMy4zOGMuMTYuNjQuMjYgMS4zMS4yNiAycy0uMSAxLjM2LS4yNiAyaC0zLjM4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Imxhc3QtcGFnZSI+PHBhdGggZD0iTTUuNTkgNy40MUwxMC4xOCAxMmwtNC41OSA0LjU5TDcgMThsNi02LTYtNnpNMTYgNmgydjEyaC0yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImxhdW5jaCI+PHBhdGggZD0iTTE5IDE5SDVWNWg3VjNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0ydi03aC0ydjd6TTE0IDN2MmgzLjU5bC05LjgzIDkuODMgMS40MSAxLjQxTDE5IDYuNDFWMTBoMlYzaC03eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImxpZ2h0YnVsYi1vdXRsaW5lIj48cGF0aCBkPSJNOSAyMWMwIC41NS40NSAxIDEgMWg0Yy41NSAwIDEtLjQ1IDEtMXYtMUg5djF6bTMtMTlDOC4xNCAyIDUgNS4xNCA1IDljMCAyLjM4IDEuMTkgNC40NyAzIDUuNzRWMTdjMCAuNTUuNDUgMSAxIDFoNmMuNTUgMCAxLS40NSAxLTF2LTIuMjZjMS44MS0xLjI3IDMtMy4zNiAzLTUuNzQgMC0zLjg2LTMuMTQtNy03LTd6bTIuODUgMTEuMWwtLjg1LjZWMTZoLTR2LTIuM2wtLjg1LS42QzcuOCAxMi4xNiA3IDEwLjYzIDcgOWMwLTIuNzYgMi4yNC01IDUtNXM1IDIuMjQgNSA1YzAgMS42My0uOCAzLjE2LTIuMTUgNC4xeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImxpbmUtc3R5bGUiPjxwYXRoIGQ9Ik0zIDE2aDV2LTJIM3Yyem02LjUgMGg1di0yaC01djJ6bTYuNSAwaDV2LTJoLTV2MnpNMyAyMGgydi0ySDN2MnptNCAwaDJ2LTJIN3Yyem00IDBoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyek0zIDEyaDh2LTJIM3Yyem0xMCAwaDh2LTJoLTh2MnpNMyA0djRoMThWNEgzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImxpbmUtd2VpZ2h0Ij48cGF0aCBkPSJNMyAxN2gxOHYtMkgzdjJ6bTAgM2gxOHYtMUgzdjF6bTAtN2gxOHYtM0gzdjN6bTAtOXY0aDE4VjRIM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJsaW5rIj48cGF0aCBkPSJNMy45IDEyYzAtMS43MSAxLjM5LTMuMSAzLjEtMy4xaDRWN0g3Yy0yLjc2IDAtNSAyLjI0LTUgNXMyLjI0IDUgNSA1aDR2LTEuOUg3Yy0xLjcxIDAtMy4xLTEuMzktMy4xLTMuMXpNOCAxM2g4di0ySDh2MnptOS02aC00djEuOWg0YzEuNzEgMCAzLjEgMS4zOSAzLjEgMy4xcy0xLjM5IDMuMS0zLjEgMy4xaC00VjE3aDRjMi43NiAwIDUtMi4yNCA1LTVzLTIuMjQtNS01LTV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibGlzdCI+PHBhdGggZD0iTTMgMTNoMnYtMkgzdjJ6bTAgNGgydi0ySDN2MnptMC04aDJWN0gzdjJ6bTQgNGgxNHYtMkg3djJ6bTAgNGgxNHYtMkg3djJ6TTcgN3YyaDE0VjdIN3oiPjwvcGF0aD48L2c+CjxnIGlkPSJsb2NrIj48cGF0aCBkPSJNMTggOGgtMVY2YzAtMi43Ni0yLjI0LTUtNS01UzcgMy4yNCA3IDZ2Mkg2Yy0xLjEgMC0yIC45LTIgMnYxMGMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjEwYzAtMS4xLS45LTItMi0yem0tNiA5Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnptMy4xLTlIOC45VjZjMC0xLjcxIDEuMzktMy4xIDMuMS0zLjEgMS43MSAwIDMuMSAxLjM5IDMuMSAzLjF2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJsb2NrLW9wZW4iPjxwYXRoIGQ9Ik0xMiAxN2MxLjEgMCAyLS45IDItMnMtLjktMi0yLTItMiAuOS0yIDIgLjkgMiAyIDJ6bTYtOWgtMVY2YzAtMi43Ni0yLjI0LTUtNS01UzcgMy4yNCA3IDZoMS45YzAtMS43MSAxLjM5LTMuMSAzLjEtMy4xIDEuNzEgMCAzLjEgMS4zOSAzLjEgMy4xdjJINmMtMS4xIDAtMiAuOS0yIDJ2MTBjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlYxMGMwLTEuMS0uOS0yLTItMnptMCAxMkg2VjEwaDEydjEweiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImxvY2stb3V0bGluZSI+PHBhdGggZD0iTTEyIDE3YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMi0yIC45LTIgMiAuOSAyIDIgMnptNi05aC0xVjZjMC0yLjc2LTIuMjQtNS01LTVTNyAzLjI0IDcgNnYySDZjLTEuMSAwLTIgLjktMiAydjEwYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWMTBjMC0xLjEtLjktMi0yLTJ6TTguOSA2YzAtMS43MSAxLjM5LTMuMSAzLjEtMy4xczMuMSAxLjM5IDMuMSAzLjF2Mkg4LjlWNnpNMTggMjBINlYxMGgxMnYxMHoiPjwvcGF0aD48L2c+CjxnIGlkPSJsb3ctcHJpb3JpdHkiPjxwYXRoIGQ9Ik0xNCA1aDh2MmgtOHptMCA1LjVoOHYyaC04em0wIDUuNWg4djJoLTh6TTIgMTEuNUMyIDE1LjA4IDQuOTIgMTggOC41IDE4SDl2MmwzLTMtMy0zdjJoLS41QzYuMDIgMTYgNCAxMy45OCA0IDExLjVTNi4wMiA3IDguNSA3SDEyVjVIOC41QzQuOTIgNSAyIDcuOTIgMiAxMS41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImxveWFsdHkiPjxwYXRoIGQ9Ik0yMS40MSAxMS41OGwtOS05QzEyLjA1IDIuMjIgMTEuNTUgMiAxMSAySDRjLTEuMSAwLTIgLjktMiAydjdjMCAuNTUuMjIgMS4wNS41OSAxLjQybDkgOWMuMzYuMzYuODYuNTggMS40MS41OC41NSAwIDEuMDUtLjIyIDEuNDEtLjU5bDctN2MuMzctLjM2LjU5LS44Ni41OS0xLjQxIDAtLjU1LS4yMy0xLjA2LS41OS0xLjQyek01LjUgN0M0LjY3IDcgNCA2LjMzIDQgNS41UzQuNjcgNCA1LjUgNCA3IDQuNjcgNyA1LjUgNi4zMyA3IDUuNSA3em0xMS43NyA4LjI3TDEzIDE5LjU0bC00LjI3LTQuMjdDOC4yOCAxNC44MSA4IDE0LjE5IDggMTMuNWMwLTEuMzggMS4xMi0yLjUgMi41LTIuNS42OSAwIDEuMzIuMjggMS43Ny43NGwuNzMuNzIuNzMtLjczYy40NS0uNDUgMS4wOC0uNzMgMS43Ny0uNzMgMS4zOCAwIDIuNSAxLjEyIDIuNSAyLjUgMCAuNjktLjI4IDEuMzItLjczIDEuNzd6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibWFpbCI+PHBhdGggZD0iTTIwIDRINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE4YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptMCA0bC04IDUtOC01VjZsOCA1IDgtNXYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9Im1hcmt1bnJlYWQiPjxwYXRoIGQ9Ik0yMCA0SDRjLTEuMSAwLTEuOTkuOS0xLjk5IDJMMiAxOGMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bTAgNGwtOCA1LTgtNVY2bDggNSA4LTV2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJtYXJrdW5yZWFkLW1haWxib3giPjxwYXRoIGQ9Ik0yMCA2SDEwdjZIOFY0aDZWMEg2djZINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY4YzAtMS4xLS45LTItMi0yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9Im1lbnUiPjxwYXRoIGQ9Ik0zIDE4aDE4di0ySDN2MnptMC01aDE4di0ySDN2MnptMC03djJoMThWNkgzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9Im1vcmUtaG9yaXoiPjxwYXRoIGQ9Ik02IDEwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptMTIgMGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bS02IDBjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9Im1vcmUtdmVydCI+PHBhdGggZD0iTTEyIDhjMS4xIDAgMi0uOSAyLTJzLS45LTItMi0yLTIgLjktMiAyIC45IDIgMiAyem0wIDJjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem0wIDZjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9Im1vdG9yY3ljbGUiPjxwYXRoIGQ9Ik0xOS40NCA5LjAzTDE1LjQxIDVIMTF2MmgzLjU5bDIgMkg1Yy0yLjggMC01IDIuMi01IDVzMi4yIDUgNSA1YzIuNDYgMCA0LjQ1LTEuNjkgNC45LTRoMS42NWwyLjc3LTIuNzdjLS4yMS41NC0uMzIgMS4xNC0uMzIgMS43NyAwIDIuOCAyLjIgNSA1IDVzNS0yLjIgNS01YzAtMi42NS0xLjk3LTQuNzctNC41Ni00Ljk3ek03LjgyIDE1QzcuNCAxNi4xNSA2LjI4IDE3IDUgMTdjLTEuNjMgMC0zLTEuMzctMy0zczEuMzctMyAzLTNjMS4yOCAwIDIuNC44NSAyLjgyIDJINXYyaDIuODJ6TTE5IDE3Yy0xLjY2IDAtMy0xLjM0LTMtM3MxLjM0LTMgMy0zIDMgMS4zNCAzIDMtMS4zNCAzLTMgM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJtb3ZlLXRvLWluYm94Ij48cGF0aCBkPSJNMTkgM0g0Ljk5Yy0xLjExIDAtMS45OC45LTEuOTggMkwzIDE5YzAgMS4xLjg4IDIgMS45OSAySDE5YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTJoLTRjMCAxLjY2LTEuMzUgMy0zIDNzLTMtMS4zNC0zLTNINC45OVY1SDE5djEwem0tMy01aC0yVjdoLTR2M0g4bDQgNCA0LTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibmV4dC13ZWVrIj48cGF0aCBkPSJNMjAgN2gtNFY1YzAtLjU1LS4yMi0xLjA1LS41OS0xLjQxQzE1LjA1IDMuMjIgMTQuNTUgMyAxNCAzaC00Yy0xLjEgMC0yIC45LTIgMnYySDRjLTEuMSAwLTIgLjktMiAydjExYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWOWMwLTEuMS0uOS0yLTItMnpNMTAgNWg0djJoLTRWNXptMSAxMy41bC0xLTEgMy0zLTMtMyAxLTEgNCA0LTQgNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJub3RlLWFkZCI+PHBhdGggZD0iTTE0IDJINmMtMS4xIDAtMS45OS45LTEuOTkgMkw0IDIwYzAgMS4xLjg5IDIgMS45OSAySDE4YzEuMSAwIDItLjkgMi0yVjhsLTYtNnptMiAxNGgtM3YzaC0ydi0zSDh2LTJoM3YtM2gydjNoM3Yyem0tMy03VjMuNUwxOC41IDlIMTN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ib2ZmbGluZS1waW4iPjxwYXRoIGQ9Ik0xMiAyQzYuNSAyIDIgNi41IDIgMTJzNC41IDEwIDEwIDEwIDEwLTQuNSAxMC0xMFMxNy41IDIgMTIgMnptNSAxNkg3di0yaDEwdjJ6bS02LjctNEw3IDEwLjdsMS40LTEuNCAxLjkgMS45IDUuMy01LjNMMTcgNy4zIDEwLjMgMTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ib3BhY2l0eSI+PHBhdGggZD0iTTE3LjY2IDhMMTIgMi4zNSA2LjM0IDhDNC43OCA5LjU2IDQgMTEuNjQgNCAxMy42NHMuNzggNC4xMSAyLjM0IDUuNjcgMy42MSAyLjM1IDUuNjYgMi4zNSA0LjEtLjc5IDUuNjYtMi4zNVMyMCAxNS42NCAyMCAxMy42NCAxOS4yMiA5LjU2IDE3LjY2IDh6TTYgMTRjLjAxLTIgLjYyLTMuMjcgMS43Ni00LjRMMTIgNS4yN2w0LjI0IDQuMzhDMTcuMzggMTAuNzcgMTcuOTkgMTIgMTggMTRINnoiPjwvcGF0aD48L2c+CjxnIGlkPSJvcGVuLWluLWJyb3dzZXIiPjxwYXRoIGQ9Ik0xOSA0SDVjLTEuMTEgMC0yIC45LTIgMnYxMmMwIDEuMS44OSAyIDIgMmg0di0ySDVWOGgxNHYxMGgtNHYyaDRjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uODktMi0yLTJ6bS03IDZsLTQgNGgzdjZoMnYtNmgzbC00LTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ib3Blbi1pbi1uZXciPjxwYXRoIGQ9Ik0xOSAxOUg1VjVoN1YzSDVjLTEuMTEgMC0yIC45LTIgMnYxNGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMnYtN2gtMnY3ek0xNCAzdjJoMy41OWwtOS44MyA5LjgzIDEuNDEgMS40MUwxOSA2LjQxVjEwaDJWM2gtN3oiPjwvcGF0aD48L2c+CjxnIGlkPSJvcGVuLXdpdGgiPjxwYXRoIGQ9Ik0xMCA5aDRWNmgzbC01LTUtNSA1aDN2M3ptLTEgMUg2VjdsLTUgNSA1IDV2LTNoM3YtNHptMTQgMmwtNS01djNoLTN2NGgzdjNsNS01em0tOSAzaC00djNIN2w1IDUgNS01aC0zdi0zeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBhZ2V2aWV3Ij48cGF0aCBkPSJNMTEuNSA5QzEwLjEyIDkgOSAxMC4xMiA5IDExLjVzMS4xMiAyLjUgMi41IDIuNSAyLjUtMS4xMiAyLjUtMi41UzEyLjg4IDkgMTEuNSA5ek0yMCA0SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptLTMuMjEgMTQuMjFsLTIuOTEtMi45MWMtLjY5LjQ0LTEuNTEuNy0yLjM5LjdDOS4wMSAxNiA3IDEzLjk5IDcgMTEuNVM5LjAxIDcgMTEuNSA3IDE2IDkuMDEgMTYgMTEuNWMwIC44OC0uMjYgMS42OS0uNyAyLjM5bDIuOTEgMi45LTEuNDIgMS40MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJwYW4tdG9vbCI+PHBhdGggZD0iTTIzIDUuNVYyMGMwIDIuMi0xLjggNC00IDRoLTcuM2MtMS4wOCAwLTIuMS0uNDMtMi44NS0xLjE5TDEgMTQuODNzMS4yNi0xLjIzIDEuMy0xLjI1Yy4yMi0uMTkuNDktLjI5Ljc5LS4yOS4yMiAwIC40Mi4wNi42LjE2LjA0LjAxIDQuMzEgMi40NiA0LjMxIDIuNDZWNGMwLS44My42Ny0xLjUgMS41LTEuNVMxMSAzLjE3IDExIDR2N2gxVjEuNWMwLS44My42Ny0xLjUgMS41LTEuNVMxNSAuNjcgMTUgMS41VjExaDFWMi41YzAtLjgzLjY3LTEuNSAxLjUtMS41czEuNS42NyAxLjUgMS41VjExaDFWNS41YzAtLjgzLjY3LTEuNSAxLjUtMS41czEuNS42NyAxLjUgMS41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBheW1lbnQiPjxwYXRoIGQ9Ik0yMCA0SDRjLTEuMTEgMC0xLjk5Ljg5LTEuOTkgMkwyIDE4YzAgMS4xMS44OSAyIDIgMmgxNmMxLjExIDAgMi0uODkgMi0yVjZjMC0xLjExLS44OS0yLTItMnptMCAxNEg0di02aDE2djZ6bTAtMTBINFY2aDE2djJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGVybS1jYW1lcmEtbWljIj48cGF0aCBkPSJNMjAgNWgtMy4xN0wxNSAzSDlMNy4xNyA1SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoN3YtMi4wOWMtMi44My0uNDgtNS0yLjk0LTUtNS45MWgyYzAgMi4yMSAxLjc5IDQgNCA0czQtMS43OSA0LTRoMmMwIDIuOTctMi4xNyA1LjQzLTUgNS45MVYyMWg3YzEuMSAwIDItLjkgMi0yVjdjMC0xLjEtLjktMi0yLTJ6bS02IDhjMCAxLjEtLjkgMi0yIDJzLTItLjktMi0yVjljMC0xLjEuOS0yIDItMnMyIC45IDIgMnY0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBlcm0tY29udGFjdC1jYWxlbmRhciI+PHBhdGggZD0iTTE5IDNoLTFWMWgtMnYySDhWMUg2djJINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS03IDNjMS42NiAwIDMgMS4zNCAzIDNzLTEuMzQgMy0zIDMtMy0xLjM0LTMtMyAxLjM0LTMgMy0zem02IDEySDZ2LTFjMC0yIDQtMy4xIDYtMy4xczYgMS4xIDYgMy4xdjF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGVybS1kYXRhLXNldHRpbmciPjxwYXRoIGQ9Ik0xOC45OSAxMS41Yy4zNCAwIC42Ny4wMyAxIC4wN0wyMCAwIDAgMjBoMTEuNTZjLS4wNC0uMzMtLjA3LS42Ni0uMDctMSAwLTQuMTQgMy4zNi03LjUgNy41LTcuNXptMy43MSA3Ljk5Yy4wMi0uMTYuMDQtLjMyLjA0LS40OSAwLS4xNy0uMDEtLjMzLS4wNC0uNDlsMS4wNi0uODNjLjA5LS4wOC4xMi0uMjEuMDYtLjMybC0xLTEuNzNjLS4wNi0uMTEtLjE5LS4xNS0uMzEtLjExbC0xLjI0LjVjLS4yNi0uMi0uNTQtLjM3LS44NS0uNDlsLS4xOS0xLjMyYy0uMDEtLjEyLS4xMi0uMjEtLjI0LS4yMWgtMmMtLjEyIDAtLjIzLjA5LS4yNS4yMWwtLjE5IDEuMzJjLS4zLjEzLS41OS4yOS0uODUuNDlsLTEuMjQtLjVjLS4xMS0uMDQtLjI0IDAtLjMxLjExbC0xIDEuNzNjLS4wNi4xMS0uMDQuMjQuMDYuMzJsMS4wNi44M2MtLjAyLjE2LS4wMy4zMi0uMDMuNDkgMCAuMTcuMDEuMzMuMDMuNDlsLTEuMDYuODNjLS4wOS4wOC0uMTIuMjEtLjA2LjMybDEgMS43M2MuMDYuMTEuMTkuMTUuMzEuMTFsMS4yNC0uNWMuMjYuMi41NC4zNy44NS40OWwuMTkgMS4zMmMuMDIuMTIuMTIuMjEuMjUuMjFoMmMuMTIgMCAuMjMtLjA5LjI1LS4yMWwuMTktMS4zMmMuMy0uMTMuNTktLjI5Ljg0LS40OWwxLjI1LjVjLjExLjA0LjI0IDAgLjMxLS4xMWwxLTEuNzNjLjA2LS4xMS4wMy0uMjQtLjA2LS4zMmwtMS4wNy0uODN6bS0zLjcxIDEuMDFjLS44MyAwLTEuNS0uNjctMS41LTEuNXMuNjctMS41IDEuNS0xLjUgMS41LjY3IDEuNSAxLjUtLjY3IDEuNS0xLjUgMS41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBlcm0tZGV2aWNlLWluZm9ybWF0aW9uIj48cGF0aCBkPSJNMTMgN2gtMnYyaDJWN3ptMCA0aC0ydjZoMnYtNnptNC05Ljk5TDcgMWMtMS4xIDAtMiAuOS0yIDJ2MThjMCAxLjEuOSAyIDIgMmgxMGMxLjEgMCAyLS45IDItMlYzYzAtMS4xLS45LTEuOTktMi0xLjk5ek0xNyAxOUg3VjVoMTB2MTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGVybS1pZGVudGl0eSI+PHBhdGggZD0iTTEyIDUuOWMxLjE2IDAgMi4xLjk0IDIuMSAyLjFzLS45NCAyLjEtMi4xIDIuMVM5LjkgOS4xNiA5LjkgOHMuOTQtMi4xIDIuMS0yLjFtMCA5YzIuOTcgMCA2LjEgMS40NiA2LjEgMi4xdjEuMUg1LjlWMTdjMC0uNjQgMy4xMy0yLjEgNi4xLTIuMU0xMiA0QzkuNzkgNCA4IDUuNzkgOCA4czEuNzkgNCA0IDQgNC0xLjc5IDQtNC0xLjc5LTQtNC00em0wIDljLTIuNjcgMC04IDEuMzQtOCA0djNoMTZ2LTNjMC0yLjY2LTUuMzMtNC04LTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGVybS1tZWRpYSI+PHBhdGggZD0iTTIgNkgwdjVoLjAxTDAgMjBjMCAxLjEuOSAyIDIgMmgxOHYtMkgyVjZ6bTIwLTJoLThsLTItMkg2Yy0xLjEgMC0xLjk5LjktMS45OSAyTDQgMTZjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yek03IDE1bDQuNS02IDMuNSA0LjUxIDIuNS0zLjAxTDIxIDE1SDd6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGVybS1waG9uZS1tc2ciPjxwYXRoIGQ9Ik0yMCAxNS41Yy0xLjI1IDAtMi40NS0uMi0zLjU3LS41Ny0uMzUtLjExLS43NC0uMDMtMS4wMi4yNGwtMi4yIDIuMmMtMi44My0xLjQ0LTUuMTUtMy43NS02LjU5LTYuNThsMi4yLTIuMjFjLjI4LS4yNy4zNi0uNjYuMjUtMS4wMUM4LjcgNi40NSA4LjUgNS4yNSA4LjUgNGMwLS41NS0uNDUtMS0xLTFINGMtLjU1IDAtMSAuNDUtMSAxIDAgOS4zOSA3LjYxIDE3IDE3IDE3IC41NSAwIDEtLjQ1IDEtMXYtMy41YzAtLjU1LS40NS0xLTEtMXpNMTIgM3YxMGwzLTNoNlYzaC05eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBlcm0tc2Nhbi13aWZpIj48cGF0aCBkPSJNMTIgM0M2Ljk1IDMgMy4xNSA0Ljg1IDAgNy4yM0wxMiAyMiAyNCA3LjI1QzIwLjg1IDQuODcgMTcuMDUgMyAxMiAzem0xIDEzaC0ydi02aDJ2NnptLTItOFY2aDJ2MmgtMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJwZXRzIj48Y2lyY2xlIGN4PSI0LjUiIGN5PSI5LjUiIHI9IjIuNSI+PC9jaXJjbGU+PGNpcmNsZSBjeD0iOSIgY3k9IjUuNSIgcj0iMi41Ij48L2NpcmNsZT48Y2lyY2xlIGN4PSIxNSIgY3k9IjUuNSIgcj0iMi41Ij48L2NpcmNsZT48Y2lyY2xlIGN4PSIxOS41IiBjeT0iOS41IiByPSIyLjUiPjwvY2lyY2xlPjxwYXRoIGQ9Ik0xNy4zNCAxNC44NmMtLjg3LTEuMDItMS42LTEuODktMi40OC0yLjkxLS40Ni0uNTQtMS4wNS0xLjA4LTEuNzUtMS4zMi0uMTEtLjA0LS4yMi0uMDctLjMzLS4wOS0uMjUtLjA0LS41Mi0uMDQtLjc4LS4wNHMtLjUzIDAtLjc5LjA1Yy0uMTEuMDItLjIyLjA1LS4zMy4wOS0uNy4yNC0xLjI4Ljc4LTEuNzUgMS4zMi0uODcgMS4wMi0xLjYgMS44OS0yLjQ4IDIuOTEtMS4zMSAxLjMxLTIuOTIgMi43Ni0yLjYyIDQuNzkuMjkgMS4wMiAxLjAyIDIuMDMgMi4zMyAyLjMyLjczLjE1IDMuMDYtLjQ0IDUuNTQtLjQ0aC4xOGMyLjQ4IDAgNC44MS41OCA1LjU0LjQ0IDEuMzEtLjI5IDIuMDQtMS4zMSAyLjMzLTIuMzIuMzEtMi4wNC0xLjMtMy40OS0yLjYxLTQuOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJwaWN0dXJlLWluLXBpY3R1cmUiPjxwYXRoIGQ9Ik0xOSA3aC04djZoOFY3em0yLTRIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAxLjk4IDIgMS45OGgxOGMxLjEgMCAyLS44OCAyLTEuOThWNWMwLTEuMS0uOS0yLTItMnptMCAxNi4wMUgzVjQuOThoMTh2MTQuMDN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGljdHVyZS1pbi1waWN0dXJlLWFsdCI+PHBhdGggZD0iTTE5IDExaC04djZoOHYtNnptNCA4VjQuOThDMjMgMy44OCAyMi4xIDMgMjEgM0gzYy0xLjEgMC0yIC44OC0yIDEuOThWMTljMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMnptLTIgLjAySDNWNC45N2gxOHYxNC4wNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJwbGF5LWZvci13b3JrIj48cGF0aCBkPSJNMTEgNXY1LjU5SDcuNWw0LjUgNC41IDQuNS00LjVIMTNWNWgtMnptLTUgOWMwIDMuMzEgMi42OSA2IDYgNnM2LTIuNjkgNi02aC0yYzAgMi4yMS0xLjc5IDQtNCA0cy00LTEuNzktNC00SDZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icG9seW1lciI+PHBhdGggZD0iTTE5IDRoLTRMNy4xMSAxNi42MyA0LjUgMTIgOSA0SDVMLjUgMTIgNSAyMGg0bDcuODktMTIuNjNMMTkuNSAxMiAxNSAyMGg0bDQuNS04eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBvd2VyLXNldHRpbmdzLW5ldyI+PHBhdGggZD0iTTEzIDNoLTJ2MTBoMlYzem00LjgzIDIuMTdsLTEuNDIgMS40MkMxNy45OSA3Ljg2IDE5IDkuODEgMTkgMTJjMCAzLjg3LTMuMTMgNy03IDdzLTctMy4xMy03LTdjMC0yLjE5IDEuMDEtNC4xNCAyLjU4LTUuNDJMNi4xNyA1LjE3QzQuMjMgNi44MiAzIDkuMjYgMyAxMmMwIDQuOTcgNC4wMyA5IDkgOXM5LTQuMDMgOS05YzAtMi43NC0xLjIzLTUuMTgtMy4xNy02LjgzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InByZWduYW50LXdvbWFuIj48cGF0aCBkPSJNOSA0YzAtMS4xMS44OS0yIDItMnMyIC44OSAyIDItLjg5IDItMiAyLTItLjg5LTItMnptNyA5Yy0uMDEtMS4zNC0uODMtMi41MS0yLTMgMC0xLjY2LTEuMzQtMy0zLTNzLTMgMS4zNC0zIDN2N2gydjVoM3YtNWgzdi00eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InByaW50Ij48cGF0aCBkPSJNMTkgOEg1Yy0xLjY2IDAtMyAxLjM0LTMgM3Y2aDR2NGgxMnYtNGg0di02YzAtMS42Ni0xLjM0LTMtMy0zem0tMyAxMUg4di01aDh2NXptMy03Yy0uNTUgMC0xLS40NS0xLTFzLjQ1LTEgMS0xIDEgLjQ1IDEgMS0uNDUgMS0xIDF6bS0xLTlINnY0aDEyVjN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icXVlcnktYnVpbGRlciI+PHBhdGggZD0iTTExLjk5IDJDNi40NyAyIDIgNi40OCAyIDEyczQuNDcgMTAgOS45OSAxMEMxNy41MiAyMiAyMiAxNy41MiAyMiAxMlMxNy41MiAyIDExLjk5IDJ6TTEyIDIwYy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHptLjUtMTNIMTF2Nmw1LjI1IDMuMTUuNzUtMS4yMy00LjUtMi42N3oiPjwvcGF0aD48L2c+CjxnIGlkPSJxdWVzdGlvbi1hbnN3ZXIiPjxwYXRoIGQ9Ik0yMSA2aC0ydjlINnYyYzAgLjU1LjQ1IDEgMSAxaDExbDQgNFY3YzAtLjU1LS40NS0xLTEtMXptLTQgNlYzYzAtLjU1LS40NS0xLTEtMUgzYy0uNTUgMC0xIC40NS0xIDF2MTRsNC00aDEwYy41NSAwIDEtLjQ1IDEtMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJyYWRpby1idXR0b24tY2hlY2tlZCI+PHBhdGggZD0iTTEyIDdjLTIuNzYgMC01IDIuMjQtNSA1czIuMjQgNSA1IDUgNS0yLjI0IDUtNS0yLjI0LTUtNS01em0wLTVDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJhZGlvLWJ1dHRvbi11bmNoZWNrZWQiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJyZWNlaXB0Ij48cGF0aCBkPSJNMTggMTdINnYtMmgxMnYyem0wLTRINnYtMmgxMnYyem0wLTRINlY3aDEydjJ6TTMgMjJsMS41LTEuNUw2IDIybDEuNS0xLjVMOSAyMmwxLjUtMS41TDEyIDIybDEuNS0xLjVMMTUgMjJsMS41LTEuNUwxOCAyMmwxLjUtMS41TDIxIDIyVjJsLTEuNSAxLjVMMTggMmwtMS41IDEuNUwxNSAybC0xLjUgMS41TDEyIDJsLTEuNSAxLjVMOSAyIDcuNSAzLjUgNiAyIDQuNSAzLjUgMyAydjIweiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJlY29yZC12b2ljZS1vdmVyIj48Y2lyY2xlIGN4PSI5IiBjeT0iOSIgcj0iNCI+PC9jaXJjbGU+PHBhdGggZD0iTTkgMTVjLTIuNjcgMC04IDEuMzQtOCA0djJoMTZ2LTJjMC0yLjY2LTUuMzMtNC04LTR6bTcuNzYtOS42NGwtMS42OCAxLjY5Yy44NCAxLjE4Ljg0IDIuNzEgMCAzLjg5bDEuNjggMS42OWMyLjAyLTIuMDIgMi4wMi01LjA3IDAtNy4yN3pNMjAuMDcgMmwtMS42MyAxLjYzYzIuNzcgMy4wMiAyLjc3IDcuNTYgMCAxMC43NEwyMC4wNyAxNmMzLjktMy44OSAzLjkxLTkuOTUgMC0xNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJyZWRlZW0iPjxwYXRoIGQ9Ik0yMCA2aC0yLjE4Yy4xMS0uMzEuMTgtLjY1LjE4LTEgMC0xLjY2LTEuMzQtMy0zLTMtMS4wNSAwLTEuOTYuNTQtMi41IDEuMzVsLS41LjY3LS41LS42OEMxMC45NiAyLjU0IDEwLjA1IDIgOSAyIDcuMzQgMiA2IDMuMzQgNiA1YzAgLjM1LjA3LjY5LjE4IDFINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMTljMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWOGMwLTEuMTEtLjg5LTItMi0yem0tNS0yYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6TTkgNGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem0xMSAxNUg0di0yaDE2djJ6bTAtNUg0VjhoNS4wOEw3IDEwLjgzIDguNjIgMTIgMTEgOC43NmwxLTEuMzYgMSAxLjM2TDE1LjM4IDEyIDE3IDEwLjgzIDE0LjkyIDhIMjB2NnoiPjwvcGF0aD48L2c+CjxnIGlkPSJyZWRvIj48cGF0aCBkPSJNMTguNCAxMC42QzE2LjU1IDguOTkgMTQuMTUgOCAxMS41IDhjLTQuNjUgMC04LjU4IDMuMDMtOS45NiA3LjIyTDMuOSAxNmMxLjA1LTMuMTkgNC4wNS01LjUgNy42LTUuNSAxLjk1IDAgMy43My43MiA1LjEyIDEuODhMMTMgMTZoOVY3bC0zLjYgMy42eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJlZnJlc2giPjxwYXRoIGQ9Ik0xNy42NSA2LjM1QzE2LjIgNC45IDE0LjIxIDQgMTIgNGMtNC40MiAwLTcuOTkgMy41OC03Ljk5IDhzMy41NyA4IDcuOTkgOGMzLjczIDAgNi44NC0yLjU1IDcuNzMtNmgtMi4wOGMtLjgyIDIuMzMtMy4wNCA0LTUuNjUgNC0zLjMxIDAtNi0yLjY5LTYtNnMyLjY5LTYgNi02YzEuNjYgMCAzLjE0LjY5IDQuMjIgMS43OEwxMyAxMWg3VjRsLTIuMzUgMi4zNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJyZW1vdmUiPjxwYXRoIGQ9Ik0xOSAxM0g1di0yaDE0djJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icmVtb3ZlLWNpcmNsZSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTUgMTFIN3YtMmgxMHYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJlbW92ZS1jaXJjbGUtb3V0bGluZSI+PHBhdGggZD0iTTcgMTF2MmgxMHYtMkg3em01LTlDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJlbW92ZS1zaG9wcGluZy1jYXJ0Ij48cGF0aCBkPSJNMjIuNzMgMjIuNzNMMi43NyAyLjc3IDIgMmwtLjczLS43M0wwIDIuNTRsNC4zOSA0LjM5IDIuMjEgNC42Ni0xLjM1IDIuNDVjLS4xNi4yOC0uMjUuNjEtLjI1Ljk2IDAgMS4xLjkgMiAyIDJoNy40NmwxLjM4IDEuMzhjLS41LjM2LS44My45NS0uODMgMS42MiAwIDEuMS44OSAyIDEuOTkgMiAuNjcgMCAxLjI2LS4zMyAxLjYyLS44NEwyMS40NiAyNGwxLjI3LTEuMjd6TTcuNDIgMTVjLS4xNCAwLS4yNS0uMTEtLjI1LS4yNWwuMDMtLjEyLjktMS42M2gyLjM2bDIgMkg3LjQyem04LjEzLTJjLjc1IDAgMS40MS0uNDEgMS43NS0xLjAzbDMuNTgtNi40OWMuMDgtLjE0LjEyLS4zMS4xMi0uNDggMC0uNTUtLjQ1LTEtMS0xSDYuNTRsOS4wMSA5ek03IDE4Yy0xLjEgMC0xLjk5LjktMS45OSAyUzUuOSAyMiA3IDIyczItLjkgMi0yLS45LTItMi0yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJlb3JkZXIiPjxwYXRoIGQ9Ik0zIDE1aDE4di0ySDN2MnptMCA0aDE4di0ySDN2MnptMC04aDE4VjlIM3Yyem0wLTZ2MmgxOFY1SDN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icmVwbHkiPjxwYXRoIGQ9Ik0xMCA5VjVsLTcgNyA3IDd2LTQuMWM1IDAgOC41IDEuNiAxMSA1LjEtMS01LTQtMTAtMTEtMTF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icmVwbHktYWxsIj48cGF0aCBkPSJNNyA4VjVsLTcgNyA3IDd2LTNsLTQtNCA0LTR6bTYgMVY1bC03IDcgNyA3di00LjFjNSAwIDguNSAxLjYgMTEgNS4xLTEtNS00LTEwLTExLTExeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJlcG9ydCI+PHBhdGggZD0iTTE1LjczIDNIOC4yN0wzIDguMjd2Ny40Nkw4LjI3IDIxaDcuNDZMMjEgMTUuNzNWOC4yN0wxNS43MyAzek0xMiAxNy4zYy0uNzIgMC0xLjMtLjU4LTEuMy0xLjMgMC0uNzIuNTgtMS4zIDEuMy0xLjMuNzIgMCAxLjMuNTggMS4zIDEuMyAwIC43Mi0uNTggMS4zLTEuMyAxLjN6bTEtNC4zaC0yVjdoMnY2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJlcG9ydC1wcm9ibGVtIj48cGF0aCBkPSJNMSAyMWgyMkwxMiAyIDEgMjF6bTEyLTNoLTJ2LTJoMnYyem0wLTRoLTJ2LTRoMnY0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJlc3RvcmUiPjxwYXRoIGQ9Ik0xMyAzYy00Ljk3IDAtOSA0LjAzLTkgOUgxbDMuODkgMy44OS4wNy4xNEw5IDEySDZjMC0zLjg3IDMuMTMtNyA3LTdzNyAzLjEzIDcgNy0zLjEzIDctNyA3Yy0xLjkzIDAtMy42OC0uNzktNC45NC0yLjA2bC0xLjQyIDEuNDJDOC4yNyAxOS45OSAxMC41MSAyMSAxMyAyMWM0Ljk3IDAgOS00LjAzIDktOXMtNC4wMy05LTktOXptLTEgNXY1bDQuMjggMi41NC43Mi0xLjIxLTMuNS0yLjA4VjhIMTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icmVzdG9yZS1wYWdlIj48cGF0aCBkPSJNMTQgMkg2Yy0xLjEgMC0xLjk5LjktMS45OSAyTDQgMjBjMCAxLjEuODkgMiAxLjk5IDJIMThjMS4xIDAgMi0uOSAyLTJWOGwtNi02em0tMiAxNmMtMi4wNSAwLTMuODEtMS4yNC00LjU4LTNoMS43MWMuNjMuOSAxLjY4IDEuNSAyLjg3IDEuNSAxLjkzIDAgMy41LTEuNTcgMy41LTMuNVMxMy45MyA5LjUgMTIgOS41Yy0xLjM1IDAtMi41Mi43OC0zLjEgMS45bDEuNiAxLjZoLTRWOWwxLjMgMS4zQzguNjkgOC45MiAxMC4yMyA4IDEyIDhjMi43NiAwIDUgMi4yNCA1IDVzLTIuMjQgNS01IDV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icm9vbSI+PHBhdGggZD0iTTEyIDJDOC4xMyAyIDUgNS4xMyA1IDljMCA1LjI1IDcgMTMgNyAxM3M3LTcuNzUgNy0xM2MwLTMuODctMy4xMy03LTctN3ptMCA5LjVjLTEuMzggMC0yLjUtMS4xMi0yLjUtMi41czEuMTItMi41IDIuNS0yLjUgMi41IDEuMTIgMi41IDIuNS0xLjEyIDIuNS0yLjUgMi41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJvdW5kZWQtY29ybmVyIj48cGF0aCBkPSJNMTkgMTloMnYyaC0ydi0yem0wLTJoMnYtMmgtMnYyek0zIDEzaDJ2LTJIM3Yyem0wIDRoMnYtMkgzdjJ6bTAtOGgyVjdIM3Yyem0wLTRoMlYzSDN2MnptNCAwaDJWM0g3djJ6bTggMTZoMnYtMmgtMnYyem0tNCAwaDJ2LTJoLTJ2MnptNCAwaDJ2LTJoLTJ2MnptLTggMGgydi0ySDd2MnptLTQgMGgydi0ySDN2MnpNMjEgOGMwLTIuNzYtMi4yNC01LTUtNWgtNXYyaDVjMS42NSAwIDMgMS4zNSAzIDN2NWgyVjh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icm93aW5nIj48cGF0aCBkPSJNOC41IDE0LjVMNCAxOWwxLjUgMS41TDkgMTdoMmwtMi41LTIuNXpNMTUgMWMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTYgMjAuMDFMMTggMjRsLTIuOTktMy4wMVYxOS41bC03LjEtNy4wOWMtLjMxLjA1LS42MS4wNy0uOTEuMDd2LTIuMTZjMS42Ni4wMyAzLjYxLS44NyA0LjY3LTIuMDRsMS40LTEuNTVjLjE5LS4yMS40My0uMzguNjktLjUuMjktLjE0LjYyLS4yMy45Ni0uMjNoLjAzQzE1Ljk5IDYuMDEgMTcgNy4wMiAxNyA4LjI2djUuNzVjMCAuODQtLjM1IDEuNjEtLjkyIDIuMTZsLTMuNTgtMy41OHYtMi4yN2MtLjYzLjUyLTEuNDMgMS4wMi0yLjI5IDEuMzlMMTYuNSAxOEgxOGwzIDMuMDF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2F2ZSI+PHBhdGggZD0iTTE3IDNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjdsLTQtNHptLTUgMTZjLTEuNjYgMC0zLTEuMzQtMy0zczEuMzQtMyAzLTMgMyAxLjM0IDMgMy0xLjM0IDMtMyAzem0zLTEwSDVWNWgxMHY0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNjaGVkdWxlIj48cGF0aCBkPSJNMTEuOTkgMkM2LjQ3IDIgMiA2LjQ4IDIgMTJzNC40NyAxMCA5Ljk5IDEwQzE3LjUyIDIyIDIyIDE3LjUyIDIyIDEyUzE3LjUyIDIgMTEuOTkgMnpNMTIgMjBjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4em0uNS0xM0gxMXY2bDUuMjUgMy4xNS43NS0xLjIzLTQuNS0yLjY3eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNlYXJjaCI+PHBhdGggZD0iTTE1LjUgMTRoLS43OWwtLjI4LS4yN0MxNS40MSAxMi41OSAxNiAxMS4xMSAxNiA5LjUgMTYgNS45MSAxMy4wOSAzIDkuNSAzUzMgNS45MSAzIDkuNSA1LjkxIDE2IDkuNSAxNmMxLjYxIDAgMy4wOS0uNTkgNC4yMy0xLjU3bC4yNy4yOHYuNzlsNSA0Ljk5TDIwLjQ5IDE5bC00Ljk5LTV6bS02IDBDNy4wMSAxNCA1IDExLjk5IDUgOS41UzcuMDEgNSA5LjUgNSAxNCA3LjAxIDE0IDkuNSAxMS45OSAxNCA5LjUgMTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2VsZWN0LWFsbCI+PHBhdGggZD0iTTMgNWgyVjNjLTEuMSAwLTIgLjktMiAyem0wIDhoMnYtMkgzdjJ6bTQgOGgydi0ySDd2MnpNMyA5aDJWN0gzdjJ6bTEwLTZoLTJ2MmgyVjN6bTYgMHYyaDJjMC0xLjEtLjktMi0yLTJ6TTUgMjF2LTJIM2MwIDEuMS45IDIgMiAyem0tMi00aDJ2LTJIM3Yyek05IDNIN3YyaDJWM3ptMiAxOGgydi0yaC0ydjJ6bTgtOGgydi0yaC0ydjJ6bTAgOGMxLjEgMCAyLS45IDItMmgtMnYyem0wLTEyaDJWN2gtMnYyem0wIDhoMnYtMmgtMnYyem0tNCA0aDJ2LTJoLTJ2MnptMC0xNmgyVjNoLTJ2MnpNNyAxN2gxMFY3SDd2MTB6bTItOGg2djZIOVY5eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNlbmQiPjxwYXRoIGQ9Ik0yLjAxIDIxTDIzIDEyIDIuMDEgMyAyIDEwbDE1IDItMTUgMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJzZXR0aW5ncyI+PHBhdGggZD0iTTE5LjQzIDEyLjk4Yy4wNC0uMzIuMDctLjY0LjA3LS45OHMtLjAzLS42Ni0uMDctLjk4bDIuMTEtMS42NWMuMTktLjE1LjI0LS40Mi4xMi0uNjRsLTItMy40NmMtLjEyLS4yMi0uMzktLjMtLjYxLS4yMmwtMi40OSAxYy0uNTItLjQtMS4wOC0uNzMtMS42OS0uOThsLS4zOC0yLjY1QzE0LjQ2IDIuMTggMTQuMjUgMiAxNCAyaC00Yy0uMjUgMC0uNDYuMTgtLjQ5LjQybC0uMzggMi42NWMtLjYxLjI1LTEuMTcuNTktMS42OS45OGwtMi40OS0xYy0uMjMtLjA5LS40OSAwLS42MS4yMmwtMiAzLjQ2Yy0uMTMuMjItLjA3LjQ5LjEyLjY0bDIuMTEgMS42NWMtLjA0LjMyLS4wNy42NS0uMDcuOThzLjAzLjY2LjA3Ljk4bC0yLjExIDEuNjVjLS4xOS4xNS0uMjQuNDItLjEyLjY0bDIgMy40NmMuMTIuMjIuMzkuMy42MS4yMmwyLjQ5LTFjLjUyLjQgMS4wOC43MyAxLjY5Ljk4bC4zOCAyLjY1Yy4wMy4yNC4yNC40Mi40OS40Mmg0Yy4yNSAwIC40Ni0uMTguNDktLjQybC4zOC0yLjY1Yy42MS0uMjUgMS4xNy0uNTkgMS42OS0uOThsMi40OSAxYy4yMy4wOS40OSAwIC42MS0uMjJsMi0zLjQ2Yy4xMi0uMjIuMDctLjQ5LS4xMi0uNjRsLTIuMTEtMS42NXpNMTIgMTUuNWMtMS45MyAwLTMuNS0xLjU3LTMuNS0zLjVzMS41Ny0zLjUgMy41LTMuNSAzLjUgMS41NyAzLjUgMy41LTEuNTcgMy41LTMuNSAzLjV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtYXBwbGljYXRpb25zIj48cGF0aCBkPSJNMTIgMTBjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem03LTdINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMTEgMCAyLS45IDItMlY1YzAtMS4xLS44OS0yLTItMnptLTEuNzUgOWMwIC4yMy0uMDIuNDYtLjA1LjY4bDEuNDggMS4xNmMuMTMuMTEuMTcuMy4wOC40NWwtMS40IDIuNDJjLS4wOS4xNS0uMjcuMjEtLjQzLjE1bC0xLjc0LS43Yy0uMzYuMjgtLjc2LjUxLTEuMTguNjlsLS4yNiAxLjg1Yy0uMDMuMTctLjE4LjMtLjM1LjNoLTIuOGMtLjE3IDAtLjMyLS4xMy0uMzUtLjI5bC0uMjYtMS44NWMtLjQzLS4xOC0uODItLjQxLTEuMTgtLjY5bC0xLjc0LjdjLS4xNi4wNi0uMzQgMC0uNDMtLjE1bC0xLjQtMi40MmMtLjA5LS4xNS0uMDUtLjM0LjA4LS40NWwxLjQ4LTEuMTZjLS4wMy0uMjMtLjA1LS40Ni0uMDUtLjY5IDAtLjIzLjAyLS40Ni4wNS0uNjhsLTEuNDgtMS4xNmMtLjEzLS4xMS0uMTctLjMtLjA4LS40NWwxLjQtMi40MmMuMDktLjE1LjI3LS4yMS40My0uMTVsMS43NC43Yy4zNi0uMjguNzYtLjUxIDEuMTgtLjY5bC4yNi0xLjg1Yy4wMy0uMTcuMTgtLjMuMzUtLjNoMi44Yy4xNyAwIC4zMi4xMy4zNS4yOWwuMjYgMS44NWMuNDMuMTguODIuNDEgMS4xOC42OWwxLjc0LS43Yy4xNi0uMDYuMzQgMCAuNDMuMTVsMS40IDIuNDJjLjA5LjE1LjA1LjM0LS4wOC40NWwtMS40OCAxLjE2Yy4wMy4yMy4wNS40Ni4wNS42OXoiPjwvcGF0aD48L2c+CjxnIGlkPSJzZXR0aW5ncy1iYWNrdXAtcmVzdG9yZSI+PHBhdGggZD0iTTE0IDEyYzAtMS4xLS45LTItMi0ycy0yIC45LTIgMiAuOSAyIDIgMiAyLS45IDItMnptLTItOWMtNC45NyAwLTkgNC4wMy05IDlIMGw0IDQgNC00SDVjMC0zLjg3IDMuMTMtNyA3LTdzNyAzLjEzIDcgNy0zLjEzIDctNyA3Yy0xLjUxIDAtMi45MS0uNDktNC4wNi0xLjNsLTEuNDIgMS40NEM4LjA0IDIwLjMgOS45NCAyMSAxMiAyMWM0Ljk3IDAgOS00LjAzIDktOXMtNC4wMy05LTktOXoiPjwvcGF0aD48L2c+CjxnIGlkPSJzZXR0aW5ncy1ibHVldG9vdGgiPjxwYXRoIGQ9Ik0xMSAyNGgydi0yaC0ydjJ6bS00IDBoMnYtMkg3djJ6bTggMGgydi0yaC0ydjJ6bTIuNzEtMTguMjlMMTIgMGgtMXY3LjU5TDYuNDEgMyA1IDQuNDEgMTAuNTkgMTAgNSAxNS41OSA2LjQxIDE3IDExIDEyLjQxVjIwaDFsNS43MS01LjcxLTQuMy00LjI5IDQuMy00LjI5ek0xMyAzLjgzbDEuODggMS44OEwxMyA3LjU5VjMuODN6bTEuODggMTAuNDZMMTMgMTYuMTd2LTMuNzZsMS44OCAxLjg4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNldHRpbmdzLWJyaWdodG5lc3MiPjxwYXRoIGQ9Ik0yMSAzSDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNi4wMUgzVjQuOTloMTh2MTQuMDJ6TTggMTZoMi41bDEuNSAxLjUgMS41LTEuNUgxNnYtMi41bDEuNS0xLjUtMS41LTEuNVY4aC0yLjVMMTIgNi41IDEwLjUgOEg4djIuNUw2LjUgMTIgOCAxMy41VjE2em00LTdjMS42NiAwIDMgMS4zNCAzIDNzLTEuMzQgMy0zIDNWOXoiPjwvcGF0aD48L2c+CjxnIGlkPSJzZXR0aW5ncy1jZWxsIj48cGF0aCBkPSJNNyAyNGgydi0ySDd2MnptNCAwaDJ2LTJoLTJ2MnptNCAwaDJ2LTJoLTJ2MnpNMTYgLjAxTDggMEM2LjkgMCA2IC45IDYgMnYxNmMwIDEuMS45IDIgMiAyaDhjMS4xIDAgMi0uOSAyLTJWMmMwLTEuMS0uOS0xLjk5LTItMS45OXpNMTYgMTZIOFY0aDh2MTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtZXRoZXJuZXQiPjxwYXRoIGQ9Ik03Ljc3IDYuNzZMNi4yMyA1LjQ4LjgyIDEybDUuNDEgNi41MiAxLjU0LTEuMjhMMy40MiAxMmw0LjM1LTUuMjR6TTcgMTNoMnYtMkg3djJ6bTEwLTJoLTJ2Mmgydi0yem0tNiAyaDJ2LTJoLTJ2MnptNi43Ny03LjUybC0xLjU0IDEuMjhMMjAuNTggMTJsLTQuMzUgNS4yNCAxLjU0IDEuMjhMMjMuMTggMTJsLTUuNDEtNi41MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJzZXR0aW5ncy1pbnB1dC1hbnRlbm5hIj48cGF0aCBkPSJNMTIgNWMtMy44NyAwLTcgMy4xMy03IDdoMmMwLTIuNzYgMi4yNC01IDUtNXM1IDIuMjQgNSA1aDJjMC0zLjg3LTMuMTMtNy03LTd6bTEgOS4yOWMuODgtLjM5IDEuNS0xLjI2IDEuNS0yLjI5IDAtMS4zOC0xLjEyLTIuNS0yLjUtMi41UzkuNSAxMC42MiA5LjUgMTJjMCAxLjAyLjYyIDEuOSAxLjUgMi4yOXYzLjNMNy41OSAyMSA5IDIyLjQxbDMtMyAzIDNMMTYuNDEgMjEgMTMgMTcuNTl2LTMuM3pNMTIgMUM1LjkzIDEgMSA1LjkzIDEgMTJoMmMwLTQuOTcgNC4wMy05IDktOXM5IDQuMDMgOSA5aDJjMC02LjA3LTQuOTMtMTEtMTEtMTF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtaW5wdXQtY29tcG9uZW50Ij48cGF0aCBkPSJNNSAyYzAtLjU1LS40NS0xLTEtMXMtMSAuNDUtMSAxdjRIMXY2aDZWNkg1VjJ6bTQgMTRjMCAxLjMuODQgMi40IDIgMi44MlYyM2gydi00LjE4YzEuMTYtLjQxIDItMS41MSAyLTIuODJ2LTJIOXYyem0tOCAwYzAgMS4zLjg0IDIuNCAyIDIuODJWMjNoMnYtNC4xOEM2LjE2IDE4LjQgNyAxNy4zIDcgMTZ2LTJIMXYyek0yMSA2VjJjMC0uNTUtLjQ1LTEtMS0xcy0xIC40NS0xIDF2NGgtMnY2aDZWNmgtMnptLTgtNGMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMXY0SDl2Nmg2VjZoLTJWMnptNCAxNGMwIDEuMy44NCAyLjQgMiAyLjgyVjIzaDJ2LTQuMThjMS4xNi0uNDEgMi0xLjUxIDItMi44MnYtMmgtNnYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNldHRpbmdzLWlucHV0LWNvbXBvc2l0ZSI+PHBhdGggZD0iTTUgMmMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMXY0SDF2Nmg2VjZINVYyem00IDE0YzAgMS4zLjg0IDIuNCAyIDIuODJWMjNoMnYtNC4xOGMxLjE2LS40MSAyLTEuNTEgMi0yLjgydi0ySDl2MnptLTggMGMwIDEuMy44NCAyLjQgMiAyLjgyVjIzaDJ2LTQuMThDNi4xNiAxOC40IDcgMTcuMyA3IDE2di0ySDF2MnpNMjEgNlYyYzAtLjU1LS40NS0xLTEtMXMtMSAuNDUtMSAxdjRoLTJ2Nmg2VjZoLTJ6bS04LTRjMC0uNTUtLjQ1LTEtMS0xcy0xIC40NS0xIDF2NEg5djZoNlY2aC0yVjJ6bTQgMTRjMCAxLjMuODQgMi40IDIgMi44MlYyM2gydi00LjE4YzEuMTYtLjQxIDItMS41MSAyLTIuODJ2LTJoLTZ2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJzZXR0aW5ncy1pbnB1dC1oZG1pIj48cGF0aCBkPSJNMTggN1Y0YzAtMS4xLS45LTItMi0ySDhjLTEuMSAwLTIgLjktMiAydjNINXY2bDMgNnYzaDh2LTNsMy02VjdoLTF6TTggNGg4djNoLTJWNWgtMXYyaC0yVjVoLTF2Mkg4VjR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtaW5wdXQtc3ZpZGVvIj48cGF0aCBkPSJNOCAxMS41YzAtLjgzLS42Ny0xLjUtMS41LTEuNVM1IDEwLjY3IDUgMTEuNSA1LjY3IDEzIDYuNSAxMyA4IDEyLjMzIDggMTEuNXptNy01YzAtLjgzLS42Ny0xLjUtMS41LTEuNWgtM0M5LjY3IDUgOSA1LjY3IDkgNi41UzkuNjcgOCAxMC41IDhoM2MuODMgMCAxLjUtLjY3IDEuNS0xLjV6TTguNSAxNWMtLjgzIDAtMS41LjY3LTEuNSAxLjVTNy42NyAxOCA4LjUgMThzMS41LS42NyAxLjUtMS41UzkuMzMgMTUgOC41IDE1ek0xMiAxQzUuOTMgMSAxIDUuOTMgMSAxMnM0LjkzIDExIDExIDExIDExLTQuOTMgMTEtMTFTMTguMDcgMSAxMiAxem0wIDIwYy00Ljk2IDAtOS00LjA0LTktOXM0LjA0LTkgOS05IDkgNC4wNCA5IDktNC4wNCA5LTkgOXptNS41LTExYy0uODMgMC0xLjUuNjctMS41IDEuNXMuNjcgMS41IDEuNSAxLjUgMS41LS42NyAxLjUtMS41LS42Ny0xLjUtMS41LTEuNXptLTIgNWMtLjgzIDAtMS41LjY3LTEuNSAxLjVzLjY3IDEuNSAxLjUgMS41IDEuNS0uNjcgMS41LTEuNS0uNjctMS41LTEuNS0xLjV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2V0dGluZ3Mtb3ZlcnNjYW4iPjxwYXRoIGQ9Ik0xMi4wMSA1LjVMMTAgOGg0bC0xLjk5LTIuNXpNMTggMTB2NGwyLjUtMS45OUwxOCAxMHpNNiAxMGwtMi41IDIuMDFMNiAxNHYtNHptOCA2aC00bDIuMDEgMi41TDE0IDE2em03LTEzSDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNi4wMUgzVjQuOTloMTh2MTQuMDJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtcGhvbmUiPjxwYXRoIGQ9Ik0xMyA5aC0ydjJoMlY5em00IDBoLTJ2MmgyVjl6bTMgNi41Yy0xLjI1IDAtMi40NS0uMi0zLjU3LS41Ny0uMzUtLjExLS43NC0uMDMtMS4wMi4yNGwtMi4yIDIuMmMtMi44My0xLjQ0LTUuMTUtMy43NS02LjU5LTYuNThsMi4yLTIuMjFjLjI4LS4yNy4zNi0uNjYuMjUtMS4wMUM4LjcgNi40NSA4LjUgNS4yNSA4LjUgNGMwLS41NS0uNDUtMS0xLTFINGMtLjU1IDAtMSAuNDUtMSAxIDAgOS4zOSA3LjYxIDE3IDE3IDE3IC41NSAwIDEtLjQ1IDEtMXYtMy41YzAtLjU1LS40NS0xLTEtMXpNMTkgOXYyaDJWOWgtMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJzZXR0aW5ncy1wb3dlciI+PHBhdGggZD0iTTcgMjRoMnYtMkg3djJ6bTQgMGgydi0yaC0ydjJ6bTItMjJoLTJ2MTBoMlYyem0zLjU2IDIuNDRsLTEuNDUgMS40NUMxNi44NCA2Ljk0IDE4IDguODMgMTggMTFjMCAzLjMxLTIuNjkgNi02IDZzLTYtMi42OS02LTZjMC0yLjE3IDEuMTYtNC4wNiAyLjg4LTUuMTJMNy40NCA0LjQ0QzUuMzYgNS44OCA0IDguMjggNCAxMWMwIDQuNDIgMy41OCA4IDggOHM4LTMuNTggOC04YzAtMi43Mi0xLjM2LTUuMTItMy40NC02LjU2ek0xNSAyNGgydi0yaC0ydjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtcmVtb3RlIj48cGF0aCBkPSJNMTUgOUg5Yy0uNTUgMC0xIC40NS0xIDF2MTJjMCAuNTUuNDUgMSAxIDFoNmMuNTUgMCAxLS40NSAxLTFWMTBjMC0uNTUtLjQ1LTEtMS0xem0tMyA2Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnpNNy4wNSA2LjA1bDEuNDEgMS40MUM5LjM3IDYuNTYgMTAuNjIgNiAxMiA2czIuNjMuNTYgMy41NCAxLjQ2bDEuNDEtMS40MUMxNS42OCA0Ljc4IDEzLjkzIDQgMTIgNHMtMy42OC43OC00Ljk1IDIuMDV6TTEyIDBDOC45NiAwIDYuMjEgMS4yMyA0LjIyIDMuMjJsMS40MSAxLjQxQzcuMjYgMy4wMSA5LjUxIDIgMTIgMnM0Ljc0IDEuMDEgNi4zNiAyLjY0bDEuNDEtMS40MUMxNy43OSAxLjIzIDE1LjA0IDAgMTIgMHoiPjwvcGF0aD48L2c+CjxnIGlkPSJzZXR0aW5ncy12b2ljZSI+PHBhdGggZD0iTTcgMjRoMnYtMkg3djJ6bTUtMTFjMS42NiAwIDIuOTktMS4zNCAyLjk5LTNMMTUgNGMwLTEuNjYtMS4zNC0zLTMtM1M5IDIuMzQgOSA0djZjMCAxLjY2IDEuMzQgMyAzIDN6bS0xIDExaDJ2LTJoLTJ2MnptNCAwaDJ2LTJoLTJ2MnptNC0xNGgtMS43YzAgMy0yLjU0IDUuMS01LjMgNS4xUzYuNyAxMyA2LjcgMTBINWMwIDMuNDEgMi43MiA2LjIzIDYgNi43MlYyMGgydi0zLjI4YzMuMjgtLjQ5IDYtMy4zMSA2LTYuNzJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2hvcCI+PHBhdGggZD0iTTE2IDZWNGMwLTEuMTEtLjg5LTItMi0yaC00Yy0xLjExIDAtMiAuODktMiAydjJIMnYxM2MwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY2aC02em0tNi0yaDR2MmgtNFY0ek05IDE4VjlsNy41IDRMOSAxOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJzaG9wLXR3byI+PHBhdGggZD0iTTMgOUgxdjExYzAgMS4xMS44OSAyIDIgMmgxNGMxLjExIDAgMi0uODkgMi0ySDNWOXptMTUtNFYzYzAtMS4xMS0uODktMi0yLTJoLTRjLTEuMTEgMC0yIC44OS0yIDJ2Mkg1djExYzAgMS4xMS44OSAyIDIgMmgxNGMxLjExIDAgMi0uODkgMi0yVjVoLTV6bS02LTJoNHYyaC00VjN6bTAgMTJWOGw1LjUgMy01LjUgNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJzaG9wcGluZy1iYXNrZXQiPjxwYXRoIGQ9Ik0xNy4yMSA5bC00LjM4LTYuNTZjLS4xOS0uMjgtLjUxLS40Mi0uODMtLjQyLS4zMiAwLS42NC4xNC0uODMuNDNMNi43OSA5SDJjLS41NSAwLTEgLjQ1LTEgMSAwIC4wOS4wMS4xOC4wNC4yN2wyLjU0IDkuMjdjLjIzLjg0IDEgMS40NiAxLjkyIDEuNDZoMTNjLjkyIDAgMS42OS0uNjIgMS45My0xLjQ2bDIuNTQtOS4yN0wyMyAxMGMwLS41NS0uNDUtMS0xLTFoLTQuNzl6TTkgOWwzLTQuNEwxNSA5SDl6bTMgOGMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2hvcHBpbmctY2FydCI+PHBhdGggZD0iTTcgMThjLTEuMSAwLTEuOTkuOS0xLjk5IDJTNS45IDIyIDcgMjJzMi0uOSAyLTItLjktMi0yLTJ6TTEgMnYyaDJsMy42IDcuNTktMS4zNSAyLjQ1Yy0uMTYuMjgtLjI1LjYxLS4yNS45NiAwIDEuMS45IDIgMiAyaDEydi0ySDcuNDJjLS4xNCAwLS4yNS0uMTEtLjI1LS4yNWwuMDMtLjEyLjktMS42M2g3LjQ1Yy43NSAwIDEuNDEtLjQxIDEuNzUtMS4wM2wzLjU4LTYuNDljLjA4LS4xNC4xMi0uMzEuMTItLjQ4IDAtLjU1LS40NS0xLTEtMUg1LjIxbC0uOTQtMkgxem0xNiAxNmMtMS4xIDAtMS45OS45LTEuOTkgMnMuODkgMiAxLjk5IDIgMi0uOSAyLTItLjktMi0yLTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic29ydCI+PHBhdGggZD0iTTMgMThoNnYtMkgzdjJ6TTMgNnYyaDE4VjZIM3ptMCA3aDEydi0ySDN2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJzcGVha2VyLW5vdGVzIj48cGF0aCBkPSJNMjAgMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMjJsNC00aDE0YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6TTggMTRINnYtMmgydjJ6bTAtM0g2VjloMnYyem0wLTNINlY2aDJ2MnptNyA2aC01di0yaDV2MnptMy0zaC04VjloOHYyem0wLTNoLThWNmg4djJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic3BlYWtlci1ub3Rlcy1vZmYiPjxwYXRoIGQ9Ik0xMC41NCAxMWwtLjU0LS41NEw3LjU0IDggNiA2LjQ2IDIuMzggMi44NCAxLjI3IDEuNzMgMCAzbDIuMDEgMi4wMUwyIDIybDQtNGg5bDUuNzMgNS43M0wyMiAyMi40NiAxNy41NCAxOGwtNy03ek04IDE0SDZ2LTJoMnYyem0tMi0zVjlsMiAySDZ6bTE0LTlINC4wOEwxMCA3LjkyVjZoOHYyaC03LjkybDEgMUgxOHYyaC00LjkybDYuOTkgNi45OUMyMS4xNCAxNy45NSAyMiAxNy4wOCAyMiAxNlY0YzAtMS4xLS45LTItMi0yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNwZWxsY2hlY2siPjxwYXRoIGQ9Ik0xMi40NSAxNmgyLjA5TDkuNDMgM0g3LjU3TDIuNDYgMTZoMi4wOWwxLjEyLTNoNS42NGwxLjE0IDN6bS02LjAyLTVMOC41IDUuNDggMTAuNTcgMTFINi40M3ptMTUuMTYuNTlsLTguMDkgOC4wOUw5LjgzIDE2bC0xLjQxIDEuNDEgNS4wOSA1LjA5TDIzIDEzbC0xLjQxLTEuNDF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic3RhciI+PHBhdGggZD0iTTEyIDE3LjI3TDE4LjE4IDIxbC0xLjY0LTcuMDNMMjIgOS4yNGwtNy4xOS0uNjFMMTIgMiA5LjE5IDguNjMgMiA5LjI0bDUuNDYgNC43M0w1LjgyIDIxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InN0YXItYm9yZGVyIj48cGF0aCBkPSJNMjIgOS4yNGwtNy4xOS0uNjJMMTIgMiA5LjE5IDguNjMgMiA5LjI0bDUuNDYgNC43M0w1LjgyIDIxIDEyIDE3LjI3IDE4LjE4IDIxbC0xLjYzLTcuMDNMMjIgOS4yNHpNMTIgMTUuNGwtMy43NiAyLjI3IDEtNC4yOC0zLjMyLTIuODggNC4zOC0uMzhMMTIgNi4xbDEuNzEgNC4wNCA0LjM4LjM4LTMuMzIgMi44OCAxIDQuMjhMMTIgMTUuNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJzdGFyLWhhbGYiPjxwYXRoIGQ9Ik0yMiA5LjI0bC03LjE5LS42MkwxMiAyIDkuMTkgOC42MyAyIDkuMjRsNS40NiA0LjczTDUuODIgMjEgMTIgMTcuMjcgMTguMTggMjFsLTEuNjMtNy4wM0wyMiA5LjI0ek0xMiAxNS40VjYuMWwxLjcxIDQuMDQgNC4zOC4zOC0zLjMyIDIuODggMSA0LjI4TDEyIDE1LjR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic3RhcnMiPjxwYXRoIGQ9Ik0xMS45OSAyQzYuNDcgMiAyIDYuNDggMiAxMnM0LjQ3IDEwIDkuOTkgMTBDMTcuNTIgMjIgMjIgMTcuNTIgMjIgMTJTMTcuNTIgMiAxMS45OSAyem00LjI0IDE2TDEyIDE1LjQ1IDcuNzcgMThsMS4xMi00LjgxLTMuNzMtMy4yMyA0LjkyLS40MkwxMiA1bDEuOTIgNC41MyA0LjkyLjQyLTMuNzMgMy4yM0wxNi4yMyAxOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJzdG9yZSI+PHBhdGggZD0iTTIwIDRINHYyaDE2VjR6bTEgMTB2LTJsLTEtNUg0bC0xIDV2MmgxdjZoMTB2LTZoNHY2aDJ2LTZoMXptLTkgNEg2di00aDZ2NHoiPjwvcGF0aD48L2c+CjxnIGlkPSJzdWJkaXJlY3RvcnktYXJyb3ctbGVmdCI+PHBhdGggZD0iTTExIDlsMS40MiAxLjQyTDguODMgMTRIMThWNGgydjEySDguODNsMy41OSAzLjU4TDExIDIxbC02LTYgNi02eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InN1YmRpcmVjdG9yeS1hcnJvdy1yaWdodCI+PHBhdGggZD0iTTE5IDE1bC02IDYtMS40Mi0xLjQyTDE1LjE3IDE2SDRWNGgydjEwaDkuMTdsLTMuNTktMy41OEwxMyA5bDYgNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJzdWJqZWN0Ij48cGF0aCBkPSJNMTQgMTdINHYyaDEwdi0yem02LThINHYyaDE2Vjl6TTQgMTVoMTZ2LTJINHYyek00IDV2MmgxNlY1SDR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic3VwZXJ2aXNvci1hY2NvdW50Ij48cGF0aCBkPSJNMTYuNSAxMmMxLjM4IDAgMi40OS0xLjEyIDIuNDktMi41UzE3Ljg4IDcgMTYuNSA3QzE1LjEyIDcgMTQgOC4xMiAxNCA5LjVzMS4xMiAyLjUgMi41IDIuNXpNOSAxMWMxLjY2IDAgMi45OS0xLjM0IDIuOTktM1MxMC42NiA1IDkgNUM3LjM0IDUgNiA2LjM0IDYgOHMxLjM0IDMgMyAzem03LjUgM2MtMS44MyAwLTUuNS45Mi01LjUgMi43NVYxOWgxMXYtMi4yNWMwLTEuODMtMy42Ny0yLjc1LTUuNS0yLjc1ek05IDEzYy0yLjMzIDAtNyAxLjE3LTcgMy41VjE5aDd2LTIuMjVjMC0uODUuMzMtMi4zNCAyLjM3LTMuNDdDMTAuNSAxMy4xIDkuNjYgMTMgOSAxM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJzd2FwLWhvcml6Ij48cGF0aCBkPSJNNi45OSAxMUwzIDE1bDMuOTkgNHYtM0gxNHYtMkg2Ljk5di0zek0yMSA5bC0zLjk5LTR2M0gxMHYyaDcuMDF2M0wyMSA5eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InN3YXAtdmVydCI+PHBhdGggZD0iTTE2IDE3LjAxVjEwaC0ydjcuMDFoLTNMMTUgMjFsNC0zLjk5aC0zek05IDNMNSA2Ljk5aDNWMTRoMlY2Ljk5aDNMOSAzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InN3YXAtdmVydGljYWwtY2lyY2xlIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnpNNi41IDlMMTAgNS41IDEzLjUgOUgxMXY0SDlWOUg2LjV6bTExIDZMMTQgMTguNSAxMC41IDE1SDEzdi00aDJ2NGgyLjV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic3lzdGVtLXVwZGF0ZS1hbHQiPjxwYXRoIGQ9Ik0xMiAxNi41bDQtNGgtM3YtOWgtMnY5SDhsNCA0em05LTEzaC02djEuOTloNnYxNC4wM0gzVjUuNDloNlYzLjVIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMnYtMTRjMC0xLjEtLjktMi0yLTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idGFiIj48cGF0aCBkPSJNMjEgM0gzYy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTZIM1Y1aDEwdjRoOHYxMHoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0YWItdW5zZWxlY3RlZCI+PHBhdGggZD0iTTEgOWgyVjdIMXYyem0wIDRoMnYtMkgxdjJ6bTAtOGgyVjNjLTEuMSAwLTIgLjktMiAyem04IDE2aDJ2LTJIOXYyem0tOC00aDJ2LTJIMXYyem0yIDR2LTJIMWMwIDEuMS45IDIgMiAyek0yMSAzaC04djZoMTBWNWMwLTEuMS0uOS0yLTItMnptMCAxNGgydi0yaC0ydjJ6TTkgNWgyVjNIOXYyek01IDIxaDJ2LTJINXYyek01IDVoMlYzSDV2MnptMTYgMTZjMS4xIDAgMi0uOSAyLTJoLTJ2MnptMC04aDJ2LTJoLTJ2MnptLTggOGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idGV4dC1mb3JtYXQiPjxwYXRoIGQ9Ik01IDE3djJoMTR2LTJINXptNC41LTQuMmg1bC45IDIuMmgyLjFMMTIuNzUgNGgtMS41TDYuNSAxNWgyLjFsLjktMi4yek0xMiA1Ljk4TDEzLjg3IDExaC0zLjc0TDEyIDUuOTh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idGhlYXRlcnMiPjxwYXRoIGQ9Ik0xOCAzdjJoLTJWM0g4djJINlYzSDR2MThoMnYtMmgydjJoOHYtMmgydjJoMlYzaC0yek04IDE3SDZ2LTJoMnYyem0wLTRINnYtMmgydjJ6bTAtNEg2VjdoMnYyem0xMCA4aC0ydi0yaDJ2MnptMC00aC0ydi0yaDJ2MnptMC00aC0yVjdoMnYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRodW1iLWRvd24iPjxwYXRoIGQ9Ik0xNSAzSDZjLS44MyAwLTEuNTQuNS0xLjg0IDEuMjJsLTMuMDIgNy4wNWMtLjA5LjIzLS4xNC40Ny0uMTQuNzN2MS45MWwuMDEuMDFMMSAxNGMwIDEuMS45IDIgMiAyaDYuMzFsLS45NSA0LjU3LS4wMy4zMmMwIC40MS4xNy43OS40NCAxLjA2TDkuODMgMjNsNi41OS02LjU5Yy4zNi0uMzYuNTgtLjg2LjU4LTEuNDFWNWMwLTEuMS0uOS0yLTItMnptNCAwdjEyaDRWM2gtNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0aHVtYi11cCI+PHBhdGggZD0iTTEgMjFoNFY5SDF2MTJ6bTIyLTExYzAtMS4xLS45LTItMi0yaC02LjMxbC45NS00LjU3LjAzLS4zMmMwLS40MS0uMTctLjc5LS40NC0xLjA2TDE0LjE3IDEgNy41OSA3LjU5QzcuMjIgNy45NSA3IDguNDUgNyA5djEwYzAgMS4xLjkgMiAyIDJoOWMuODMgMCAxLjU0LS41IDEuODQtMS4yMmwzLjAyLTcuMDVjLjA5LS4yMy4xNC0uNDcuMTQtLjczdi0xLjkxbC0uMDEtLjAxTDIzIDEweiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRodW1icy11cC1kb3duIj48cGF0aCBkPSJNMTIgNmMwLS41NS0uNDUtMS0xLTFINS44MmwuNjYtMy4xOC4wMi0uMjNjMC0uMzEtLjEzLS41OS0uMzMtLjhMNS4zOCAwIC40NCA0Ljk0Qy4xNyA1LjIxIDAgNS41OSAwIDZ2Ni41YzAgLjgzLjY3IDEuNSAxLjUgMS41aDYuNzVjLjYyIDAgMS4xNS0uMzggMS4zOC0uOTFsMi4yNi01LjI5Yy4wNy0uMTcuMTEtLjM2LjExLS41NVY2em0xMC41IDRoLTYuNzVjLS42MiAwLTEuMTUuMzgtMS4zOC45MWwtMi4yNiA1LjI5Yy0uMDcuMTctLjExLjM2LS4xMS41NVYxOGMwIC41NS40NSAxIDEgMWg1LjE4bC0uNjYgMy4xOC0uMDIuMjRjMCAuMzEuMTMuNTkuMzMuOGwuNzkuNzggNC45NC00Ljk0Yy4yNy0uMjcuNDQtLjY1LjQ0LTEuMDZ2LTYuNWMwLS44My0uNjctMS41LTEuNS0xLjV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idGltZWxpbmUiPjxwYXRoIGQ9Ik0yMyA4YzAgMS4xLS45IDItMiAyLS4xOCAwLS4zNS0uMDItLjUxLS4wN2wtMy41NiAzLjU1Yy4wNS4xNi4wNy4zNC4wNy41MiAwIDEuMS0uOSAyLTIgMnMtMi0uOS0yLTJjMC0uMTguMDItLjM2LjA3LS41MmwtMi41NS0yLjU1Yy0uMTYuMDUtLjM0LjA3LS41Mi4wN3MtLjM2LS4wMi0uNTItLjA3bC00LjU1IDQuNTZjLjA1LjE2LjA3LjMzLjA3LjUxIDAgMS4xLS45IDItMiAycy0yLS45LTItMiAuOS0yIDItMmMuMTggMCAuMzUuMDIuNTEuMDdsNC41Ni00LjU1QzguMDIgOS4zNiA4IDkuMTggOCA5YzAtMS4xLjktMiAyLTJzMiAuOSAyIDJjMCAuMTgtLjAyLjM2LS4wNy41MmwyLjU1IDIuNTVjLjE2LS4wNS4zNC0uMDcuNTItLjA3cy4zNi4wMi41Mi4wN2wzLjU1LTMuNTZDMTkuMDIgOC4zNSAxOSA4LjE4IDE5IDhjMC0xLjEuOS0yIDItMnMyIC45IDIgMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0b2MiPjxwYXRoIGQ9Ik0zIDloMTRWN0gzdjJ6bTAgNGgxNHYtMkgzdjJ6bTAgNGgxNHYtMkgzdjJ6bTE2IDBoMnYtMmgtMnYyem0wLTEwdjJoMlY3aC0yem0wIDZoMnYtMmgtMnYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRvZGF5Ij48cGF0aCBkPSJNMTkgM2gtMVYxaC0ydjJIOFYxSDZ2Mkg1Yy0xLjExIDAtMS45OS45LTEuOTkgMkwzIDE5YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTZINVY4aDE0djExek03IDEwaDV2NUg3eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRvbGwiPjxwYXRoIGQ9Ik0xNSA0Yy00LjQyIDAtOCAzLjU4LTggOHMzLjU4IDggOCA4IDgtMy41OCA4LTgtMy41OC04LTgtOHptMCAxNGMtMy4zMSAwLTYtMi42OS02LTZzMi42OS02IDYtNiA2IDIuNjkgNiA2LTIuNjkgNi02IDZ6TTMgMTJjMC0yLjYxIDEuNjctNC44MyA0LTUuNjVWNC4yNkMzLjU1IDUuMTUgMSA4LjI3IDEgMTJzMi41NSA2Ljg1IDYgNy43NHYtMi4wOWMtMi4zMy0uODItNC0zLjA0LTQtNS42NXoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0b3VjaC1hcHAiPjxwYXRoIGQ9Ik05IDExLjI0VjcuNUM5IDYuMTIgMTAuMTIgNSAxMS41IDVTMTQgNi4xMiAxNCA3LjV2My43NGMxLjIxLS44MSAyLTIuMTggMi0zLjc0QzE2IDUuMDEgMTMuOTkgMyAxMS41IDNTNyA1LjAxIDcgNy41YzAgMS41Ni43OSAyLjkzIDIgMy43NHptOS44NCA0LjYzbC00LjU0LTIuMjZjLS4xNy0uMDctLjM1LS4xMS0uNTQtLjExSDEzdi02YzAtLjgzLS42Ny0xLjUtMS41LTEuNVMxMCA2LjY3IDEwIDcuNXYxMC43NGwtMy40My0uNzJjLS4wOC0uMDEtLjE1LS4wMy0uMjQtLjAzLS4zMSAwLS41OS4xMy0uNzkuMzNsLS43OS44IDQuOTQgNC45NGMuMjcuMjcuNjUuNDQgMS4wNi40NGg2Ljc5Yy43NSAwIDEuMzMtLjU1IDEuNDQtMS4yOGwuNzUtNS4yN2MuMDEtLjA3LjAyLS4xNC4wMi0uMiAwLS42Mi0uMzgtMS4xNi0uOTEtMS4zOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0cmFjay1jaGFuZ2VzIj48cGF0aCBkPSJNMTkuMDcgNC45M2wtMS40MSAxLjQxQzE5LjEgNy43OSAyMCA5Ljc5IDIwIDEyYzAgNC40Mi0zLjU4IDgtOCA4cy04LTMuNTgtOC04YzAtNC4wOCAzLjA1LTcuNDQgNy03LjkzdjIuMDJDOC4xNiA2LjU3IDYgOS4wMyA2IDEyYzAgMy4zMSAyLjY5IDYgNiA2czYtMi42OSA2LTZjMC0xLjY2LS42Ny0zLjE2LTEuNzYtNC4yNGwtMS40MSAxLjQxQzE1LjU1IDkuOSAxNiAxMC45IDE2IDEyYzAgMi4yMS0xLjc5IDQtNCA0cy00LTEuNzktNC00YzAtMS44NiAxLjI4LTMuNDEgMy0zLjg2djIuMTRjLS42LjM1LTEgLjk4LTEgMS43MiAwIDEuMS45IDIgMiAyczItLjkgMi0yYzAtLjc0LS40LTEuMzgtMS0xLjcyVjJoLTFDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMGMwLTIuNzYtMS4xMi01LjI2LTIuOTMtNy4wN3oiPjwvcGF0aD48L2c+CjxnIGlkPSJ0cmFuc2xhdGUiPjxwYXRoIGQ9Ik0xMi44NyAxNS4wN2wtMi41NC0yLjUxLjAzLS4wM2MxLjc0LTEuOTQgMi45OC00LjE3IDMuNzEtNi41M0gxN1Y0aC03VjJIOHYySDF2MS45OWgxMS4xN0MxMS41IDcuOTIgMTAuNDQgOS43NSA5IDExLjM1IDguMDcgMTAuMzIgNy4zIDkuMTkgNi42OSA4aC0yYy43MyAxLjYzIDEuNzMgMy4xNyAyLjk4IDQuNTZsLTUuMDkgNS4wMkw0IDE5bDUtNSAzLjExIDMuMTEuNzYtMi4wNHpNMTguNSAxMGgtMkwxMiAyMmgybDEuMTItM2g0Ljc1TDIxIDIyaDJsLTQuNS0xMnptLTIuNjIgN2wxLjYyLTQuMzNMMTkuMTIgMTdoLTMuMjR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idHJlbmRpbmctZG93biI+PHBhdGggZD0iTTE2IDE4bDIuMjktMi4yOS00Ljg4LTQuODgtNCA0TDIgNy40MSAzLjQxIDZsNiA2IDQtNCA2LjMgNi4yOUwyMiAxMnY2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRyZW5kaW5nLWZsYXQiPjxwYXRoIGQ9Ik0yMiAxMmwtNC00djNIM3YyaDE1djN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idHJlbmRpbmctdXAiPjxwYXRoIGQ9Ik0xNiA2bDIuMjkgMi4yOS00Ljg4IDQuODgtNC00TDIgMTYuNTkgMy40MSAxOGw2LTYgNCA0IDYuMy02LjI5TDIyIDEyVjZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idHVybmVkLWluIj48cGF0aCBkPSJNMTcgM0g3Yy0xLjEgMC0xLjk5LjktMS45OSAyTDUgMjFsNy0zIDcgM1Y1YzAtMS4xLS45LTItMi0yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InR1cm5lZC1pbi1ub3QiPjxwYXRoIGQ9Ik0xNyAzSDdjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNSAyMWw3LTMgNyAzVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTVsLTUtMi4xOEw3IDE4VjVoMTB2MTN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idW5hcmNoaXZlIj48cGF0aCBkPSJNMjAuNTUgNS4yMmwtMS4zOS0xLjY4QzE4Ljg4IDMuMjEgMTguNDcgMyAxOCAzSDZjLS40NyAwLS44OC4yMS0xLjE1LjU1TDMuNDYgNS4yMkMzLjE3IDUuNTcgMyA2LjAxIDMgNi41VjE5YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjYuNWMwLS40OS0uMTctLjkzLS40NS0xLjI4ek0xMiA5LjVsNS41IDUuNUgxNHYyaC00di0ySDYuNUwxMiA5LjV6TTUuMTIgNWwuODItMWgxMmwuOTMgMUg1LjEyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InVuZG8iPjxwYXRoIGQ9Ik0xMi41IDhjLTIuNjUgMC01LjA1Ljk5LTYuOSAyLjZMMiA3djloOWwtMy42Mi0zLjYyYzEuMzktMS4xNiAzLjE2LTEuODggNS4xMi0xLjg4IDMuNTQgMCA2LjU1IDIuMzEgNy42IDUuNWwyLjM3LS43OEMyMS4wOCAxMS4wMyAxNy4xNSA4IDEyLjUgOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJ1bmZvbGQtbGVzcyI+PHBhdGggZD0iTTcuNDEgMTguNTlMOC44MyAyMCAxMiAxNi44MyAxNS4xNyAyMGwxLjQxLTEuNDFMMTIgMTRsLTQuNTkgNC41OXptOS4xOC0xMy4xOEwxNS4xNyA0IDEyIDcuMTcgOC44MyA0IDcuNDEgNS40MSAxMiAxMGw0LjU5LTQuNTl6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idW5mb2xkLW1vcmUiPjxwYXRoIGQ9Ik0xMiA1LjgzTDE1LjE3IDlsMS40MS0xLjQxTDEyIDMgNy40MSA3LjU5IDguODMgOSAxMiA1Ljgzem0wIDEyLjM0TDguODMgMTVsLTEuNDEgMS40MUwxMiAyMWw0LjU5LTQuNTlMMTUuMTcgMTUgMTIgMTguMTd6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idXBkYXRlIj48cGF0aCBkPSJNMjEgMTAuMTJoLTYuNzhsMi43NC0yLjgyYy0yLjczLTIuNy03LjE1LTIuOC05Ljg4LS4xLTIuNzMgMi43MS0yLjczIDcuMDggMCA5Ljc5IDIuNzMgMi43MSA3LjE1IDIuNzEgOS44OCAwQzE4LjMyIDE1LjY1IDE5IDE0LjA4IDE5IDEyLjFoMmMwIDEuOTgtLjg4IDQuNTUtMi42NCA2LjI5LTMuNTEgMy40OC05LjIxIDMuNDgtMTIuNzIgMC0zLjUtMy40Ny0zLjUzLTkuMTEtLjAyLTEyLjU4IDMuNTEtMy40NyA5LjE0LTMuNDcgMTIuNjUgMEwyMSAzdjcuMTJ6TTEyLjUgOHY0LjI1bDMuNSAyLjA4LS43MiAxLjIxTDExIDEzVjhoMS41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InZlcmlmaWVkLXVzZXIiPjxwYXRoIGQ9Ik0xMiAxTDMgNXY2YzAgNS41NSAzLjg0IDEwLjc0IDkgMTIgNS4xNi0xLjI2IDktNi40NSA5LTEyVjVsLTktNHptLTIgMTZsLTQtNCAxLjQxLTEuNDFMMTAgMTQuMTdsNi41OS02LjU5TDE4IDlsLTggOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJ2aWV3LWFnZW5kYSI+PHBhdGggZD0iTTIwIDEzSDNjLS41NSAwLTEgLjQ1LTEgMXY2YzAgLjU1LjQ1IDEgMSAxaDE3Yy41NSAwIDEtLjQ1IDEtMXYtNmMwLS41NS0uNDUtMS0xLTF6bTAtMTBIM2MtLjU1IDAtMSAuNDUtMSAxdjZjMCAuNTUuNDUgMSAxIDFoMTdjLjU1IDAgMS0uNDUgMS0xVjRjMC0uNTUtLjQ1LTEtMS0xeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InZpZXctYXJyYXkiPjxwYXRoIGQ9Ik00IDE4aDNWNUg0djEzek0xOCA1djEzaDNWNWgtM3pNOCAxOGg5VjVIOHYxM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJ2aWV3LWNhcm91c2VsIj48cGF0aCBkPSJNNyAxOWgxMFY0SDd2MTV6bS01LTJoNFY2SDJ2MTF6TTE4IDZ2MTFoNFY2aC00eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InZpZXctY29sdW1uIj48cGF0aCBkPSJNMTAgMThoNVY1aC01djEzem0tNiAwaDVWNUg0djEzek0xNiA1djEzaDVWNWgtNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJ2aWV3LWRheSI+PHBhdGggZD0iTTIgMjFoMTl2LTNIMnYzek0yMCA4SDNjLS41NSAwLTEgLjQ1LTEgMXY2YzAgLjU1LjQ1IDEgMSAxaDE3Yy41NSAwIDEtLjQ1IDEtMVY5YzAtLjU1LS40NS0xLTEtMXpNMiAzdjNoMTlWM0gyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InZpZXctaGVhZGxpbmUiPjxwYXRoIGQ9Ik00IDE1aDE2di0ySDR2MnptMCA0aDE2di0ySDR2MnptMC04aDE2VjlINHYyem0wLTZ2MmgxNlY1SDR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idmlldy1saXN0Ij48cGF0aCBkPSJNNCAxNGg0di00SDR2NHptMCA1aDR2LTRINHY0ek00IDloNFY1SDR2NHptNSA1aDEydi00SDl2NHptMCA1aDEydi00SDl2NHpNOSA1djRoMTJWNUg5eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InZpZXctbW9kdWxlIj48cGF0aCBkPSJNNCAxMWg1VjVINHY2em0wIDdoNXYtNkg0djZ6bTYgMGg1di02aC01djZ6bTYgMGg1di02aC01djZ6bS02LTdoNVY1aC01djZ6bTYtNnY2aDVWNWgtNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJ2aWV3LXF1aWx0Ij48cGF0aCBkPSJNMTAgMThoNXYtNmgtNXY2em0tNiAwaDVWNUg0djEzem0xMiAwaDV2LTZoLTV2NnpNMTAgNXY2aDExVjVIMTB6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idmlldy1zdHJlYW0iPjxwYXRoIGQ9Ik00IDE4aDE3di02SDR2NnpNNCA1djZoMTdWNUg0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InZpZXctd2VlayI+PHBhdGggZD0iTTYgNUgzYy0uNTUgMC0xIC40NS0xIDF2MTJjMCAuNTUuNDUgMSAxIDFoM2MuNTUgMCAxLS40NSAxLTFWNmMwLS41NS0uNDUtMS0xLTF6bTE0IDBoLTNjLS41NSAwLTEgLjQ1LTEgMXYxMmMwIC41NS40NSAxIDEgMWgzYy41NSAwIDEtLjQ1IDEtMVY2YzAtLjU1LS40NS0xLTEtMXptLTcgMGgtM2MtLjU1IDAtMSAuNDUtMSAxdjEyYzAgLjU1LjQ1IDEgMSAxaDNjLjU1IDAgMS0uNDUgMS0xVjZjMC0uNTUtLjQ1LTEtMS0xeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InZpc2liaWxpdHkiPjxwYXRoIGQ9Ik0xMiA0LjVDNyA0LjUgMi43MyA3LjYxIDEgMTJjMS43MyA0LjM5IDYgNy41IDExIDcuNXM5LjI3LTMuMTEgMTEtNy41Yy0xLjczLTQuMzktNi03LjUtMTEtNy41ek0xMiAxN2MtMi43NiAwLTUtMi4yNC01LTVzMi4yNC01IDUtNSA1IDIuMjQgNSA1LTIuMjQgNS01IDV6bTAtOGMtMS42NiAwLTMgMS4zNC0zIDNzMS4zNCAzIDMgMyAzLTEuMzQgMy0zLTEuMzQtMy0zLTN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idmlzaWJpbGl0eS1vZmYiPjxwYXRoIGQ9Ik0xMiA3YzIuNzYgMCA1IDIuMjQgNSA1IDAgLjY1LS4xMyAxLjI2LS4zNiAxLjgzbDIuOTIgMi45MmMxLjUxLTEuMjYgMi43LTIuODkgMy40My00Ljc1LTEuNzMtNC4zOS02LTcuNS0xMS03LjUtMS40IDAtMi43NC4yNS0zLjk4LjdsMi4xNiAyLjE2QzEwLjc0IDcuMTMgMTEuMzUgNyAxMiA3ek0yIDQuMjdsMi4yOCAyLjI4LjQ2LjQ2QzMuMDggOC4zIDEuNzggMTAuMDIgMSAxMmMxLjczIDQuMzkgNiA3LjUgMTEgNy41IDEuNTUgMCAzLjAzLS4zIDQuMzgtLjg0bC40Mi40MkwxOS43MyAyMiAyMSAyMC43MyAzLjI3IDMgMiA0LjI3ek03LjUzIDkuOGwxLjU1IDEuNTVjLS4wNS4yMS0uMDguNDMtLjA4LjY1IDAgMS42NiAxLjM0IDMgMyAzIC4yMiAwIC40NC0uMDMuNjUtLjA4bDEuNTUgMS41NWMtLjY3LjMzLTEuNDEuNTMtMi4yLjUzLTIuNzYgMC01LTIuMjQtNS01IDAtLjc5LjItMS41My41My0yLjJ6bTQuMzEtLjc4bDMuMTUgMy4xNS4wMi0uMTZjMC0xLjY2LTEuMzQtMy0zLTNsLS4xNy4wMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJ3YXJuaW5nIj48cGF0aCBkPSJNMSAyMWgyMkwxMiAyIDEgMjF6bTEyLTNoLTJ2LTJoMnYyem0wLTRoLTJ2LTRoMnY0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9IndhdGNoLWxhdGVyIj48cGF0aCBkPSJNMTIgMkM2LjUgMiAyIDYuNSAyIDEyczQuNSAxMCAxMCAxMCAxMC00LjUgMTAtMTBTMTcuNSAyIDEyIDJ6bTQuMiAxNC4yTDExIDEzVjdoMS41djUuMmw0LjUgMi43LS44IDEuM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJ3ZWVrZW5kIj48cGF0aCBkPSJNMjEgMTBjLTEuMSAwLTIgLjktMiAydjNINXYtM2MwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDJ2NWMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0ydi01YzAtMS4xLS45LTItMi0yem0tMy01SDZjLTEuMSAwLTIgLjktMiAydjIuMTVjMS4xNi40MSAyIDEuNTEgMiAyLjgyVjE0aDEydi0yLjAzYzAtMS4zLjg0LTIuNCAyLTIuODJWN2MwLTEuMS0uOS0yLTItMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ3b3JrIj48cGF0aCBkPSJNMjAgNmgtNFY0YzAtMS4xMS0uODktMi0yLTJoLTRjLTEuMTEgMC0yIC44OS0yIDJ2Mkg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOWMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6bS02IDBoLTRWNGg0djJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ieW91dHViZS1zZWFyY2hlZC1mb3IiPjxwYXRoIGQ9Ik0xNy4wMSAxNGgtLjhsLS4yNy0uMjdjLjk4LTEuMTQgMS41Ny0yLjYxIDEuNTctNC4yMyAwLTMuNTktMi45MS02LjUtNi41LTYuNXMtNi41IDMtNi41IDYuNUgybDMuODQgNCA0LjE2LTRINi41MUM2LjUxIDcgOC41MyA1IDExLjAxIDVzNC41IDIuMDEgNC41IDQuNWMwIDIuNDgtMi4wMiA0LjUtNC41IDQuNS0uNjUgMC0xLjI2LS4xNC0xLjgyLS4zOEw3LjcxIDE1LjFjLjk3LjU3IDIuMDkuOSAzLjMuOSAxLjYxIDAgMy4wOC0uNTkgNC4yMi0xLjU3bC4yNy4yN3YuNzlsNS4wMSA0Ljk5TDIyIDE5bC00Ljk5LTV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iem9vbS1pbiI+PHBhdGggZD0iTTE1LjUgMTRoLS43OWwtLjI4LS4yN0MxNS40MSAxMi41OSAxNiAxMS4xMSAxNiA5LjUgMTYgNS45MSAxMy4wOSAzIDkuNSAzUzMgNS45MSAzIDkuNSA1LjkxIDE2IDkuNSAxNmMxLjYxIDAgMy4wOS0uNTkgNC4yMy0xLjU3bC4yNy4yOHYuNzlsNSA0Ljk5TDIwLjQ5IDE5bC00Ljk5LTV6bS02IDBDNy4wMSAxNCA1IDExLjk5IDUgOS41UzcuMDEgNSA5LjUgNSAxNCA3LjAxIDE0IDkuNSAxMS45OSAxNCA5LjUgMTR6bTIuNS00aC0ydjJIOXYtMkg3VjloMlY3aDF2MmgydjF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iem9vbS1vdXQiPjxwYXRoIGQ9Ik0xNS41IDE0aC0uNzlsLS4yOC0uMjdDMTUuNDEgMTIuNTkgMTYgMTEuMTEgMTYgOS41IDE2IDUuOTEgMTMuMDkgMyA5LjUgM1MzIDUuOTEgMyA5LjUgNS45MSAxNiA5LjUgMTZjMS42MSAwIDMuMDktLjU5IDQuMjMtMS41N2wuMjcuMjh2Ljc5bDUgNC45OUwyMC40OSAxOWwtNC45OS01em0tNiAwQzcuMDEgMTQgNSAxMS45OSA1IDkuNVM3LjAxIDUgOS41IDUgMTQgNy4wMSAxNCA5LjUgMTEuOTkgMTQgOS41IDE0ek03IDloNXYxSDd6Ij48L3BhdGg+PC9nPgo8L2RlZnM+PC9zdmc+CjwvaXJvbi1pY29uc2V0LXN2Zz5gO2RvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoT28uY29udGVudCk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwp2YXIgem89eyJVKzAwMDgiOiJiYWNrc3BhY2UiLCJVKzAwMDkiOiJ0YWIiLCJVKzAwMUIiOiJlc2MiLCJVKzAwMjAiOiJzcGFjZSIsIlUrMDA3RiI6ImRlbCJ9LERvPXs4OiJiYWNrc3BhY2UiLDk6InRhYiIsMTM6ImVudGVyIiwyNzoiZXNjIiwzMzoicGFnZXVwIiwzNDoicGFnZWRvd24iLDM1OiJlbmQiLDM2OiJob21lIiwzMjoic3BhY2UiLDM3OiJsZWZ0IiwzODoidXAiLDM5OiJyaWdodCIsNDA6ImRvd24iLDQ2OiJkZWwiLDEwNjoiKiJ9LEJvPXtzaGlmdDoic2hpZnRLZXkiLGN0cmw6ImN0cmxLZXkiLGFsdDoiYWx0S2V5IixtZXRhOiJtZXRhS2V5In0sSG89L1thLXowLTkqXS8sRm89L1VcKy8sVm89L15hcnJvdy8sVW89L15zcGFjZShiYXIpPy8sam89L15lc2NhcGUkLztmdW5jdGlvbiBHbyh0LGUpe3ZhciBuPSIiO2lmKHQpe3ZhciBpPXQudG9Mb3dlckNhc2UoKTsiICI9PT1pfHxVby50ZXN0KGkpP249InNwYWNlIjpqby50ZXN0KGkpP249ImVzYyI6MT09aS5sZW5ndGg/ZSYmIUhvLnRlc3QoaSl8fChuPWkpOm49Vm8udGVzdChpKT9pLnJlcGxhY2UoImFycm93IiwiIik6Im11bHRpcGx5Ij09aT8iKiI6aX1yZXR1cm4gbn1mdW5jdGlvbiBXbyh0LGUpe3JldHVybiB0LmtleT9Hbyh0LmtleSxlKTp0LmRldGFpbCYmdC5kZXRhaWwua2V5P0dvKHQuZGV0YWlsLmtleSxlKTooZnVuY3Rpb24gbih0KXt2YXIgZT0iIjtyZXR1cm4gdCYmKHQgaW4gem8/ZT16b1t0XTpGby50ZXN0KHQpPyh0PXBhcnNlSW50KHQucmVwbGFjZSgiVSsiLCIweCIpLDE2KSxlPVN0cmluZy5mcm9tQ2hhckNvZGUodCkudG9Mb3dlckNhc2UoKSk6ZT10LnRvTG93ZXJDYXNlKCkpLGV9KSh0LmtleUlkZW50aWZpZXIpfHwoZnVuY3Rpb24gaSh0KXt2YXIgZT0iIjtyZXR1cm4gTnVtYmVyKHQpJiYoZT10Pj02NSYmdDw9OTA/U3RyaW5nLmZyb21DaGFyQ29kZSgzMit0KTp0Pj0xMTImJnQ8PTEyMz8iZiIrKHQtMTEyKzEpOnQ+PTQ4JiZ0PD01Nz9TdHJpbmcodC00OCk6dD49OTYmJnQ8PTEwNT9TdHJpbmcodC05Nik6RG9bdF0pLGV9KSh0LmtleUNvZGUpfHwiIn1mdW5jdGlvbiBxbyh0LGUpe3JldHVybiBXbyhlLHQuaGFzTW9kaWZpZXJzKT09PXQua2V5JiYoIXQuaGFzTW9kaWZpZXJzfHwhIWUuc2hpZnRLZXk9PSEhdC5zaGlmdEtleSYmISFlLmN0cmxLZXk9PSEhdC5jdHJsS2V5JiYhIWUuYWx0S2V5PT0hIXQuYWx0S2V5JiYhIWUubWV0YUtleT09ISF0Lm1ldGFLZXkpfWZ1bmN0aW9uIFlvKHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgiICIpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuKGZ1bmN0aW9uIGUodCl7cmV0dXJuIDE9PT10Lmxlbmd0aD97Y29tYm86dCxrZXk6dCxldmVudDoia2V5ZG93biJ9OnQuc3BsaXQoIisiKS5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7dmFyIG49ZS5zcGxpdCgiOiIpLGk9blswXSxyPW5bMV07cmV0dXJuIGkgaW4gQm8/KHRbQm9baV1dPSEwLHQuaGFzTW9kaWZpZXJzPSEwKToodC5rZXk9aSx0LmV2ZW50PXJ8fCJrZXlkb3duIiksdH0pLHtjb21ibzp0LnNwbGl0KCI6Iikuc2hpZnQoKX0pfSkodCl9KSl9Y29uc3QgWG89e3Byb3BlcnRpZXM6e2tleUV2ZW50VGFyZ2V0Ont0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzfX0sc3RvcEtleWJvYXJkRXZlbnRQcm9wYWdhdGlvbjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfYm91bmRLZXlIYW5kbGVyczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX0sX2ltcGVyYXRpdmVLZXlCaW5kaW5nczp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57fX19fSxvYnNlcnZlcnM6WyJfcmVzZXRLZXlFdmVudExpc3RlbmVycyhrZXlFdmVudFRhcmdldCwgX2JvdW5kS2V5SGFuZGxlcnMpIl0sa2V5QmluZGluZ3M6e30scmVnaXN0ZXJlZDpmdW5jdGlvbigpe3RoaXMuX3ByZXBLZXlCaW5kaW5ncygpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2xpc3RlbktleUV2ZW50TGlzdGVuZXJzKCl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fdW5saXN0ZW5LZXlFdmVudExpc3RlbmVycygpfSxhZGRPd25LZXlCaW5kaW5nOmZ1bmN0aW9uKHQsZSl7dGhpcy5faW1wZXJhdGl2ZUtleUJpbmRpbmdzW3RdPWUsdGhpcy5fcHJlcEtleUJpbmRpbmdzKCksdGhpcy5fcmVzZXRLZXlFdmVudExpc3RlbmVycygpfSxyZW1vdmVPd25LZXlCaW5kaW5nczpmdW5jdGlvbigpe3RoaXMuX2ltcGVyYXRpdmVLZXlCaW5kaW5ncz17fSx0aGlzLl9wcmVwS2V5QmluZGluZ3MoKSx0aGlzLl9yZXNldEtleUV2ZW50TGlzdGVuZXJzKCl9LGtleWJvYXJkRXZlbnRNYXRjaGVzS2V5czpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1ZbyhlKSxpPTA7aTxuLmxlbmd0aDsrK2kpaWYocW8obltpXSx0KSlyZXR1cm4hMDtyZXR1cm4hMX0sX2NvbGxlY3RLZXlCaW5kaW5nczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuYmVoYXZpb3JzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQua2V5QmluZGluZ3N9KSk7cmV0dXJuLTE9PT10LmluZGV4T2YodGhpcy5rZXlCaW5kaW5ncykmJnQucHVzaCh0aGlzLmtleUJpbmRpbmdzKSx0fSxfcHJlcEtleUJpbmRpbmdzOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuX2tleUJpbmRpbmdzPXt9LHRoaXMuX2NvbGxlY3RLZXlCaW5kaW5ncygpLmZvckVhY2goKGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiB0KXRoaXMuX2FkZEtleUJpbmRpbmcoZSx0W2VdKX0pLHRoaXMpLHRoaXMuX2ltcGVyYXRpdmVLZXlCaW5kaW5ncyl0aGlzLl9hZGRLZXlCaW5kaW5nKHQsdGhpcy5faW1wZXJhdGl2ZUtleUJpbmRpbmdzW3RdKTtmb3IodmFyIGUgaW4gdGhpcy5fa2V5QmluZGluZ3MpdGhpcy5fa2V5QmluZGluZ3NbZV0uc29ydCgoZnVuY3Rpb24odCxlKXt2YXIgbj10WzBdLmhhc01vZGlmaWVycztyZXR1cm4gbj09PWVbMF0uaGFzTW9kaWZpZXJzPzA6bj8tMToxfSkpfSxfYWRkS2V5QmluZGluZzpmdW5jdGlvbih0LGUpe1lvKHQpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3RoaXMuX2tleUJpbmRpbmdzW3QuZXZlbnRdPXRoaXMuX2tleUJpbmRpbmdzW3QuZXZlbnRdfHxbXSx0aGlzLl9rZXlCaW5kaW5nc1t0LmV2ZW50XS5wdXNoKFt0LGVdKX0pLHRoaXMpfSxfcmVzZXRLZXlFdmVudExpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMuX3VubGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnMoKSx0aGlzLmlzQXR0YWNoZWQmJnRoaXMuX2xpc3RlbktleUV2ZW50TGlzdGVuZXJzKCl9LF9saXN0ZW5LZXlFdmVudExpc3RlbmVyczpmdW5jdGlvbigpe3RoaXMua2V5RXZlbnRUYXJnZXQmJk9iamVjdC5rZXlzKHRoaXMuX2tleUJpbmRpbmdzKS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9vbktleUJpbmRpbmdFdmVudC5iaW5kKHRoaXMsdGhpcy5fa2V5QmluZGluZ3NbdF0pO3RoaXMuX2JvdW5kS2V5SGFuZGxlcnMucHVzaChbdGhpcy5rZXlFdmVudFRhcmdldCx0LGVdKSx0aGlzLmtleUV2ZW50VGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIodCxlKX0pLHRoaXMpfSxfdW5saXN0ZW5LZXlFdmVudExpc3RlbmVyczpmdW5jdGlvbigpe2Zvcih2YXIgdDt0aGlzLl9ib3VuZEtleUhhbmRsZXJzLmxlbmd0aDspKHQ9dGhpcy5fYm91bmRLZXlIYW5kbGVycy5wb3AoKSlbMF0ucmVtb3ZlRXZlbnRMaXN0ZW5lcih0WzFdLHRbMl0pfSxfb25LZXlCaW5kaW5nRXZlbnQ6ZnVuY3Rpb24odCxlKXtpZih0aGlzLnN0b3BLZXlib2FyZEV2ZW50UHJvcGFnYXRpb24mJmUuc3RvcFByb3BhZ2F0aW9uKCksIWUuZGVmYXVsdFByZXZlbnRlZClmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIGk9dFtuXVswXSxyPXRbbl1bMV07aWYocW8oaSxlKSYmKHRoaXMuX3RyaWdnZXJLZXlIYW5kbGVyKGkscixlKSxlLmRlZmF1bHRQcmV2ZW50ZWQpKXJldHVybn19LF90cmlnZ2VyS2V5SGFuZGxlcjpmdW5jdGlvbih0LGUsbil7dmFyIGk9T2JqZWN0LmNyZWF0ZSh0KTtpLmtleWJvYXJkRXZlbnQ9bjt2YXIgcj1uZXcgQ3VzdG9tRXZlbnQodC5ldmVudCx7ZGV0YWlsOmksY2FuY2VsYWJsZTohMH0pO3RoaXNbZV0uY2FsbCh0aGlzLHIpLHIuZGVmYXVsdFByZXZlbnRlZCYmbi5wcmV2ZW50RGVmYXVsdCgpfX0sJG89e3Byb3BlcnRpZXM6e3Njcm9sbFRhcmdldDp7dHlwZTpIVE1MRWxlbWVudCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9kZWZhdWx0U2Nyb2xsVGFyZ2V0fX19LG9ic2VydmVyczpbIl9zY3JvbGxUYXJnZXRDaGFuZ2VkKHNjcm9sbFRhcmdldCwgaXNBdHRhY2hlZCkiXSxfc2hvdWxkSGF2ZUxpc3RlbmVyOiEwLF9zY3JvbGxUYXJnZXRDaGFuZ2VkOmZ1bmN0aW9uKHQsZSl7aWYodGhpcy5fb2xkU2Nyb2xsVGFyZ2V0JiYodGhpcy5fdG9nZ2xlU2Nyb2xsTGlzdGVuZXIoITEsdGhpcy5fb2xkU2Nyb2xsVGFyZ2V0KSx0aGlzLl9vbGRTY3JvbGxUYXJnZXQ9bnVsbCksZSlpZigiZG9jdW1lbnQiPT09dCl0aGlzLnNjcm9sbFRhcmdldD10aGlzLl9kb2M7ZWxzZSBpZigic3RyaW5nIj09dHlwZW9mIHQpe3ZhciBuPXRoaXMuZG9tSG9zdDt0aGlzLnNjcm9sbFRhcmdldD1uJiZuLiQ/bi4kW3RdOmVyKHRoaXMub3duZXJEb2N1bWVudCkucXVlcnlTZWxlY3RvcigiIyIrdCl9ZWxzZSB0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCkmJih0aGlzLl9vbGRTY3JvbGxUYXJnZXQ9dCx0aGlzLl90b2dnbGVTY3JvbGxMaXN0ZW5lcih0aGlzLl9zaG91bGRIYXZlTGlzdGVuZXIsdCkpfSxfc2Nyb2xsSGFuZGxlcjpmdW5jdGlvbiB0KCl7fSxnZXQgX2RlZmF1bHRTY3JvbGxUYXJnZXQoKXtyZXR1cm4gdGhpcy5fZG9jfSxnZXQgX2RvYygpe3JldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fSxnZXQgX3Njcm9sbFRvcCgpe3JldHVybiB0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCk/dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LnBhZ2VZT2Zmc2V0OnRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbFRvcDowfSxnZXQgX3Njcm9sbExlZnQoKXtyZXR1cm4gdGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpP3RoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcy5fZG9jP3dpbmRvdy5wYWdlWE9mZnNldDp0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxMZWZ0OjB9LHNldCBfc2Nyb2xsVG9wKHQpe3RoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcy5fZG9jP3dpbmRvdy5zY3JvbGxUbyh3aW5kb3cucGFnZVhPZmZzZXQsdCk6dGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpJiYodGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsVG9wPXQpfSxzZXQgX3Njcm9sbExlZnQodCl7dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzLl9kb2M/d2luZG93LnNjcm9sbFRvKHQsd2luZG93LnBhZ2VZT2Zmc2V0KTp0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCkmJih0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxMZWZ0PXQpfSxzY3JvbGw6ZnVuY3Rpb24odCxlKXt2YXIgbjsib2JqZWN0Ij09dHlwZW9mIHQ/KG49dC5sZWZ0LGU9dC50b3ApOm49dCxuPW58fDAsZT1lfHwwLHRoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcy5fZG9jP3dpbmRvdy5zY3JvbGxUbyhuLGUpOnRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSYmKHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbExlZnQ9bix0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A9ZSl9LGdldCBfc2Nyb2xsVGFyZ2V0V2lkdGgoKXtyZXR1cm4gdGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpP3RoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcy5fZG9jP3dpbmRvdy5pbm5lcldpZHRoOnRoaXMuc2Nyb2xsVGFyZ2V0Lm9mZnNldFdpZHRoOjB9LGdldCBfc2Nyb2xsVGFyZ2V0SGVpZ2h0KCl7cmV0dXJuIHRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKT90aGlzLnNjcm9sbFRhcmdldD09PXRoaXMuX2RvYz93aW5kb3cuaW5uZXJIZWlnaHQ6dGhpcy5zY3JvbGxUYXJnZXQub2Zmc2V0SGVpZ2h0OjB9LF9pc1ZhbGlkU2Nyb2xsVGFyZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2Nyb2xsVGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnR9LF90b2dnbGVTY3JvbGxMaXN0ZW5lcjpmdW5jdGlvbih0LGUpe3ZhciBuPWU9PT10aGlzLl9kb2M/d2luZG93OmU7dD90aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXJ8fCh0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXI9dGhpcy5fc2Nyb2xsSGFuZGxlci5iaW5kKHRoaXMpLG4uYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXIpKTp0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXImJihuLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyKSx0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXI9bnVsbCl9LHRvZ2dsZVNjcm9sbExpc3RlbmVyOmZ1bmN0aW9uKHQpe3RoaXMuX3Nob3VsZEhhdmVMaXN0ZW5lcj10LHRoaXMuX3RvZ2dsZVNjcm9sbExpc3RlbmVyKHQsdGhpcy5zY3JvbGxUYXJnZXQpfX07Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNiBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KdmFyIEtvPW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQKD86aG9uZXxhZDsoPzogVTspPyBDUFUpIE9TIChcZCspLyksWm89S28mJktvWzFdPj04LEpvPSItMTAwMDBweCIsUW89LTEwMDtqcih7X3RlbXBsYXRlOnhlYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIEBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKC13ZWJraXQtbWF4LWRldmljZS1waXhlbC1yYXRpbzogMSkgewogICAgICAgIDpob3N0IHsKICAgICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgICAgfQogICAgICB9CgogICAgICAjaXRlbXMgewogICAgICAgIEBhcHBseSAtLWlyb24tbGlzdC1pdGVtcy1jb250YWluZXI7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFtncmlkXSkpICNpdGVtcyA+IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNpdGVtcyA+IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxhcnJheS1zZWxlY3RvciBpZD0ic2VsZWN0b3IiIGl0ZW1zPSJ7e2l0ZW1zfX0iIHNlbGVjdGVkPSJ7e3NlbGVjdGVkSXRlbXN9fSIgc2VsZWN0ZWQtaXRlbT0ie3tzZWxlY3RlZEl0ZW19fSI+PC9hcnJheS1zZWxlY3Rvcj4KCiAgICA8ZGl2IGlkPSJpdGVtcyI+CiAgICAgIDxzbG90Pjwvc2xvdD4KICAgIDwvZGl2PgpgLGlzOiJpcm9uLWxpc3QiLHByb3BlcnRpZXM6e2l0ZW1zOnt0eXBlOkFycmF5fSxhczp7dHlwZTpTdHJpbmcsdmFsdWU6Iml0ZW0ifSxpbmRleEFzOnt0eXBlOlN0cmluZyx2YWx1ZToiaW5kZXgifSxzZWxlY3RlZEFzOnt0eXBlOlN0cmluZyx2YWx1ZToic2VsZWN0ZWQifSxncmlkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwLG9ic2VydmVyOiJfZ3JpZENoYW5nZWQifSxzZWxlY3Rpb25FbmFibGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNlbGVjdGVkSXRlbTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSxzZWxlY3RlZEl0ZW1zOnt0eXBlOk9iamVjdCxub3RpZnk6ITB9LG11bHRpU2VsZWN0aW9uOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHNjcm9sbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MH19LG9ic2VydmVyczpbIl9pdGVtc0NoYW5nZWQoaXRlbXMuKikiLCJfc2VsZWN0aW9uRW5hYmxlZENoYW5nZWQoc2VsZWN0aW9uRW5hYmxlZCkiLCJfbXVsdGlTZWxlY3Rpb25DaGFuZ2VkKG11bHRpU2VsZWN0aW9uKSIsIl9zZXRPdmVyZmxvdyhzY3JvbGxUYXJnZXQsIHNjcm9sbE9mZnNldCkiXSxiZWhhdmlvcnM6W2xvLENvLCRvLE1vXSxfcmF0aW86LjUsX3Njcm9sbGVyUGFkZGluZ1RvcDowLF9zY3JvbGxQb3NpdGlvbjowLF9waHlzaWNhbFNpemU6MCxfcGh5c2ljYWxBdmVyYWdlOjAsX3BoeXNpY2FsQXZlcmFnZUNvdW50OjAsX3BoeXNpY2FsVG9wOjAsX3ZpcnR1YWxDb3VudDowLF9lc3RTY3JvbGxIZWlnaHQ6MCxfc2Nyb2xsSGVpZ2h0OjAsX3ZpZXdwb3J0SGVpZ2h0OjAsX3ZpZXdwb3J0V2lkdGg6MCxfcGh5c2ljYWxJdGVtczpudWxsLF9waHlzaWNhbFNpemVzOm51bGwsX2ZpcnN0VmlzaWJsZUluZGV4VmFsOm51bGwsX2xhc3RWaXNpYmxlSW5kZXhWYWw6bnVsbCxfbWF4UGFnZXM6MixfZm9jdXNlZEl0ZW06bnVsbCxfZm9jdXNlZFZpcnR1YWxJbmRleDotMSxfZm9jdXNlZFBoeXNpY2FsSW5kZXg6LTEsX29mZnNjcmVlbkZvY3VzZWRJdGVtOm51bGwsX2ZvY3VzQmFja2ZpbGxJdGVtOm51bGwsX2l0ZW1zUGVyUm93OjEsX2l0ZW1XaWR0aDowLF9yb3dIZWlnaHQ6MCxfdGVtcGxhdGVDb3N0OjAsX3BhcmVudE1vZGVsOiEwLGdldCBfcGh5c2ljYWxCb3R0b20oKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fcGh5c2ljYWxTaXplfSxnZXQgX3Njcm9sbEJvdHRvbSgpe3JldHVybiB0aGlzLl9zY3JvbGxQb3NpdGlvbit0aGlzLl92aWV3cG9ydEhlaWdodH0sZ2V0IF92aXJ0dWFsRW5kKCl7cmV0dXJuIHRoaXMuX3ZpcnR1YWxTdGFydCt0aGlzLl9waHlzaWNhbENvdW50LTF9LGdldCBfaGlkZGVuQ29udGVudFNpemUoKXtyZXR1cm4odGhpcy5ncmlkP3RoaXMuX3BoeXNpY2FsUm93cyp0aGlzLl9yb3dIZWlnaHQ6dGhpcy5fcGh5c2ljYWxTaXplKS10aGlzLl92aWV3cG9ydEhlaWdodH0sZ2V0IF9pdGVtc1BhcmVudCgpe3JldHVybiBlcihlcih0aGlzLl91c2VyVGVtcGxhdGUpLnBhcmVudE5vZGUpfSxnZXQgX21heFNjcm9sbFRvcCgpe3JldHVybiB0aGlzLl9lc3RTY3JvbGxIZWlnaHQtdGhpcy5fdmlld3BvcnRIZWlnaHQrdGhpcy5fc2Nyb2xsT2Zmc2V0fSxnZXQgX21heFZpcnR1YWxTdGFydCgpe3ZhciB0PXRoaXMuX2NvbnZlcnRJbmRleFRvQ29tcGxldGVSb3codGhpcy5fdmlydHVhbENvdW50KTtyZXR1cm4gTWF0aC5tYXgoMCx0LXRoaXMuX3BoeXNpY2FsQ291bnQpfSxzZXQgX3ZpcnR1YWxTdGFydCh0KXt0PXRoaXMuX2NsYW1wKHQsMCx0aGlzLl9tYXhWaXJ0dWFsU3RhcnQpLHRoaXMuZ3JpZCYmKHQtPXQldGhpcy5faXRlbXNQZXJSb3cpLHRoaXMuX3ZpcnR1YWxTdGFydFZhbD10fSxnZXQgX3ZpcnR1YWxTdGFydCgpe3JldHVybiB0aGlzLl92aXJ0dWFsU3RhcnRWYWx8fDB9LHNldCBfcGh5c2ljYWxTdGFydCh0KXsodCU9dGhpcy5fcGh5c2ljYWxDb3VudCk8MCYmKHQ9dGhpcy5fcGh5c2ljYWxDb3VudCt0KSx0aGlzLmdyaWQmJih0LT10JXRoaXMuX2l0ZW1zUGVyUm93KSx0aGlzLl9waHlzaWNhbFN0YXJ0VmFsPXR9LGdldCBfcGh5c2ljYWxTdGFydCgpe3JldHVybiB0aGlzLl9waHlzaWNhbFN0YXJ0VmFsfHwwfSxnZXQgX3BoeXNpY2FsRW5kKCl7cmV0dXJuKHRoaXMuX3BoeXNpY2FsU3RhcnQrdGhpcy5fcGh5c2ljYWxDb3VudC0xKSV0aGlzLl9waHlzaWNhbENvdW50fSxzZXQgX3BoeXNpY2FsQ291bnQodCl7dGhpcy5fcGh5c2ljYWxDb3VudFZhbD10fSxnZXQgX3BoeXNpY2FsQ291bnQoKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxDb3VudFZhbHx8MH0sZ2V0IF9vcHRQaHlzaWNhbFNpemUoKXtyZXR1cm4gMD09PXRoaXMuX3ZpZXdwb3J0SGVpZ2h0PzEvMDp0aGlzLl92aWV3cG9ydEhlaWdodCp0aGlzLl9tYXhQYWdlc30sZ2V0IF9pc1Zpc2libGUoKXtyZXR1cm4gQm9vbGVhbih0aGlzLm9mZnNldFdpZHRofHx0aGlzLm9mZnNldEhlaWdodCl9LGdldCBmaXJzdFZpc2libGVJbmRleCgpe3ZhciB0PXRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsO2lmKG51bGw9PXQpe3ZhciBlPXRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX3Njcm9sbE9mZnNldDt0PXRoaXMuX2l0ZXJhdGVJdGVtcygoZnVuY3Rpb24odCxuKXtyZXR1cm4oZSs9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KHQpKT50aGlzLl9zY3JvbGxQb3NpdGlvbj90aGlzLmdyaWQ/bi1uJXRoaXMuX2l0ZW1zUGVyUm93Om46dGhpcy5ncmlkJiZ0aGlzLl92aXJ0dWFsQ291bnQtMT09PW4/bi1uJXRoaXMuX2l0ZW1zUGVyUm93OnZvaWQgMH0pKXx8MCx0aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD10fXJldHVybiB0fSxnZXQgbGFzdFZpc2libGVJbmRleCgpe3ZhciB0PXRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw7aWYobnVsbD09dCl7aWYodGhpcy5ncmlkKXQ9TWF0aC5taW4odGhpcy5fdmlydHVhbENvdW50LHRoaXMuZmlyc3RWaXNpYmxlSW5kZXgrdGhpcy5fZXN0Um93c0luVmlldyp0aGlzLl9pdGVtc1BlclJvdy0xKTtlbHNle3ZhciBlPXRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX3Njcm9sbE9mZnNldDt0aGlzLl9pdGVyYXRlSXRlbXMoKGZ1bmN0aW9uKG4saSl7ZTx0aGlzLl9zY3JvbGxCb3R0b20mJih0PWkpLGUrPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChuKX0pKX10aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPXR9cmV0dXJuIHR9LGdldCBfZGVmYXVsdFNjcm9sbFRhcmdldCgpe3JldHVybiB0aGlzfSxnZXQgX3ZpcnR1YWxSb3dDb3VudCgpe3JldHVybiBNYXRoLmNlaWwodGhpcy5fdmlydHVhbENvdW50L3RoaXMuX2l0ZW1zUGVyUm93KX0sZ2V0IF9lc3RSb3dzSW5WaWV3KCl7cmV0dXJuIE1hdGguY2VpbCh0aGlzLl92aWV3cG9ydEhlaWdodC90aGlzLl9yb3dIZWlnaHQpfSxnZXQgX3BoeXNpY2FsUm93cygpe3JldHVybiBNYXRoLmNlaWwodGhpcy5fcGh5c2ljYWxDb3VudC90aGlzLl9pdGVtc1BlclJvdyl9LGdldCBfc2Nyb2xsT2Zmc2V0KCl7cmV0dXJuIHRoaXMuX3Njcm9sbGVyUGFkZGluZ1RvcCt0aGlzLnNjcm9sbE9mZnNldH0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLl9kaWRGb2N1cy5iaW5kKHRoaXMpLCEwKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9kZWJvdW5jZSgiX3JlbmRlciIsdGhpcy5fcmVuZGVyLF90KSx0aGlzLmxpc3Rlbih0aGlzLCJpcm9uLXJlc2l6ZSIsIl9yZXNpemVIYW5kbGVyIiksdGhpcy5saXN0ZW4odGhpcywia2V5ZG93biIsIl9rZXlkb3duSGFuZGxlciIpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMudW5saXN0ZW4odGhpcywiaXJvbi1yZXNpemUiLCJfcmVzaXplSGFuZGxlciIpLHRoaXMudW5saXN0ZW4odGhpcywia2V5ZG93biIsIl9rZXlkb3duSGFuZGxlciIpfSxfc2V0T3ZlcmZsb3c6ZnVuY3Rpb24odCl7dGhpcy5zdHlsZS53ZWJraXRPdmVyZmxvd1Njcm9sbGluZz10PT09dGhpcz8idG91Y2giOiIiLHRoaXMuc3R5bGUub3ZlcmZsb3dZPXQ9PT10aGlzPyJhdXRvIjoiIix0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPW51bGwsdGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9bnVsbCx0aGlzLl9kZWJvdW5jZSgiX3JlbmRlciIsdGhpcy5fcmVuZGVyLF90KX0sdXBkYXRlVmlld3BvcnRCb3VuZGFyaWVzOmZ1bmN0aW9uKCl7dmFyIHQ9d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcyk7dGhpcy5fc2Nyb2xsZXJQYWRkaW5nVG9wPXRoaXMuc2Nyb2xsVGFyZ2V0PT09dGhpcz8wOnBhcnNlSW50KHRbInBhZGRpbmctdG9wIl0sMTApLHRoaXMuX2lzUlRMPUJvb2xlYW4oInJ0bCI9PT10LmRpcmVjdGlvbiksdGhpcy5fdmlld3BvcnRXaWR0aD10aGlzLiQuaXRlbXMub2Zmc2V0V2lkdGgsdGhpcy5fdmlld3BvcnRIZWlnaHQ9dGhpcy5fc2Nyb2xsVGFyZ2V0SGVpZ2h0LHRoaXMuZ3JpZCYmdGhpcy5fdXBkYXRlR3JpZE1ldHJpY3MoKX0sX3Njcm9sbEhhbmRsZXI6ZnVuY3Rpb24oKXt2YXIgdD1NYXRoLm1heCgwLE1hdGgubWluKHRoaXMuX21heFNjcm9sbFRvcCx0aGlzLl9zY3JvbGxUb3ApKSxlPXQtdGhpcy5fc2Nyb2xsUG9zaXRpb24sbj1lPj0wO2lmKHRoaXMuX3Njcm9sbFBvc2l0aW9uPXQsdGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9bnVsbCx0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPW51bGwsTWF0aC5hYnMoZSk+dGhpcy5fcGh5c2ljYWxTaXplJiZ0aGlzLl9waHlzaWNhbFNpemU+MCl7ZS09dGhpcy5fc2Nyb2xsT2Zmc2V0O3ZhciBpPU1hdGgucm91bmQoZS90aGlzLl9waHlzaWNhbEF2ZXJhZ2UpKnRoaXMuX2l0ZW1zUGVyUm93O3RoaXMuX3ZpcnR1YWxTdGFydD10aGlzLl92aXJ0dWFsU3RhcnQraSx0aGlzLl9waHlzaWNhbFN0YXJ0PXRoaXMuX3BoeXNpY2FsU3RhcnQraSx0aGlzLl9waHlzaWNhbFRvcD1NYXRoLm1pbihNYXRoLmZsb29yKHRoaXMuX3ZpcnR1YWxTdGFydC90aGlzLl9pdGVtc1BlclJvdykqdGhpcy5fcGh5c2ljYWxBdmVyYWdlLHRoaXMuX3Njcm9sbFBvc2l0aW9uKSx0aGlzLl91cGRhdGUoKX1lbHNlIGlmKHRoaXMuX3BoeXNpY2FsQ291bnQ+MCl7dmFyIHI9dGhpcy5fZ2V0UmV1c2FibGVzKG4pO24/KHRoaXMuX3BoeXNpY2FsVG9wPXIucGh5c2ljYWxUb3AsdGhpcy5fdmlydHVhbFN0YXJ0PXRoaXMuX3ZpcnR1YWxTdGFydCtyLmluZGV4ZXMubGVuZ3RoLHRoaXMuX3BoeXNpY2FsU3RhcnQ9dGhpcy5fcGh5c2ljYWxTdGFydCtyLmluZGV4ZXMubGVuZ3RoKToodGhpcy5fdmlydHVhbFN0YXJ0PXRoaXMuX3ZpcnR1YWxTdGFydC1yLmluZGV4ZXMubGVuZ3RoLHRoaXMuX3BoeXNpY2FsU3RhcnQ9dGhpcy5fcGh5c2ljYWxTdGFydC1yLmluZGV4ZXMubGVuZ3RoKSx0aGlzLl91cGRhdGUoci5pbmRleGVzLG4/bnVsbDpyLmluZGV4ZXMpLHRoaXMuX2RlYm91bmNlKCJfaW5jcmVhc2VQb29sSWZOZWVkZWQiLHRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkLmJpbmQodGhpcywwKSx2dCl9fSxfZ2V0UmV1c2FibGVzOmZ1bmN0aW9uKHQpe3ZhciBlLG4saSxyPVtdLG89dGhpcy5faGlkZGVuQ29udGVudFNpemUqdGhpcy5fcmF0aW8sYT10aGlzLl92aXJ0dWFsU3RhcnQscz10aGlzLl92aXJ0dWFsRW5kLGw9dGhpcy5fcGh5c2ljYWxDb3VudCxjPXRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX3Njcm9sbE9mZnNldCx1PXRoaXMuX3Njcm9sbFBvc2l0aW9uLGg9dGhpcy5fc2Nyb2xsQm90dG9tO2Zvcih0PyhlPXRoaXMuX3BoeXNpY2FsU3RhcnQsbj11LWMpOihlPXRoaXMuX3BoeXNpY2FsRW5kLG49dGhpcy5fcGh5c2ljYWxCb3R0b20rdGhpcy5fc2Nyb2xsT2Zmc2V0LWgpO24tPWk9dGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KGUpLCEoci5sZW5ndGg+PWx8fG48PW8pOylpZih0KXtpZihzK3IubGVuZ3RoKzE+PXRoaXMuX3ZpcnR1YWxDb3VudClicmVhaztpZihjK2k+PXUtdGhpcy5fc2Nyb2xsT2Zmc2V0KWJyZWFrO3IucHVzaChlKSxjKz1pLGU9KGUrMSklbH1lbHNle2lmKGEtci5sZW5ndGg8PTApYnJlYWs7aWYoYyt0aGlzLl9waHlzaWNhbFNpemUtaTw9aClicmVhaztyLnB1c2goZSksYy09aSxlPTA9PT1lP2wtMTplLTF9cmV0dXJue2luZGV4ZXM6cixwaHlzaWNhbFRvcDpjLXRoaXMuX3Njcm9sbE9mZnNldH19LF91cGRhdGU6ZnVuY3Rpb24odCxlKXtpZighKHQmJjA9PT10Lmxlbmd0aHx8MD09PXRoaXMuX3BoeXNpY2FsQ291bnQpKXtpZih0aGlzLl9tYW5hZ2VGb2N1cygpLHRoaXMuX2Fzc2lnbk1vZGVscyh0KSx0aGlzLl91cGRhdGVNZXRyaWNzKHQpLGUpZm9yKDtlLmxlbmd0aDspe3ZhciBuPWUucG9wKCk7dGhpcy5fcGh5c2ljYWxUb3AtPXRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChuKX10aGlzLl9wb3NpdGlvbkl0ZW1zKCksdGhpcy5fdXBkYXRlU2Nyb2xsZXJTaXplKCl9fSxfY3JlYXRlUG9vbDpmdW5jdGlvbih0KXt2YXIgZSxuO3RoaXMuX2Vuc3VyZVRlbXBsYXRpemVkKCk7dmFyIGk9bmV3IEFycmF5KHQpO2ZvcihlPTA7ZTx0O2UrKyluPXRoaXMuc3RhbXAobnVsbCksaVtlXT1uLnJvb3QucXVlcnlTZWxlY3RvcigiKiIpLHRoaXMuX2l0ZW1zUGFyZW50LmFwcGVuZENoaWxkKG4ucm9vdCk7cmV0dXJuIGl9LF9pc0NsaWVudEZ1bGw6ZnVuY3Rpb24oKXtyZXR1cm4gMCE9dGhpcy5fc2Nyb2xsQm90dG9tJiZ0aGlzLl9waHlzaWNhbEJvdHRvbS0xPj10aGlzLl9zY3JvbGxCb3R0b20mJnRoaXMuX3BoeXNpY2FsVG9wPD10aGlzLl9zY3JvbGxQb3NpdGlvbn0sX2luY3JlYXNlUG9vbElmTmVlZGVkOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2NsYW1wKHRoaXMuX3BoeXNpY2FsQ291bnQrdCwzLHRoaXMuX3ZpcnR1YWxDb3VudC10aGlzLl92aXJ0dWFsU3RhcnQpO2lmKGU9dGhpcy5fY29udmVydEluZGV4VG9Db21wbGV0ZVJvdyhlKSx0aGlzLmdyaWQpe3ZhciBuPWUldGhpcy5faXRlbXNQZXJSb3c7biYmZS1uPD10aGlzLl9waHlzaWNhbENvdW50JiYoZSs9dGhpcy5faXRlbXNQZXJSb3cpLGUtPW59dmFyIGk9ZS10aGlzLl9waHlzaWNhbENvdW50LHI9TWF0aC5yb3VuZCguNSp0aGlzLl9waHlzaWNhbENvdW50KTtpZighKGk8MCkpe2lmKGk+MCl7dmFyIG89d2luZG93LnBlcmZvcm1hbmNlLm5vdygpO1tdLnB1c2guYXBwbHkodGhpcy5fcGh5c2ljYWxJdGVtcyx0aGlzLl9jcmVhdGVQb29sKGkpKTtmb3IodmFyIGE9MDthPGk7YSsrKXRoaXMuX3BoeXNpY2FsU2l6ZXMucHVzaCgwKTt0aGlzLl9waHlzaWNhbENvdW50PXRoaXMuX3BoeXNpY2FsQ291bnQraSx0aGlzLl9waHlzaWNhbFN0YXJ0PnRoaXMuX3BoeXNpY2FsRW5kJiZ0aGlzLl9pc0luZGV4UmVuZGVyZWQodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCkmJnRoaXMuX2dldFBoeXNpY2FsSW5kZXgodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCk8dGhpcy5fcGh5c2ljYWxFbmQmJih0aGlzLl9waHlzaWNhbFN0YXJ0PXRoaXMuX3BoeXNpY2FsU3RhcnQraSksdGhpcy5fdXBkYXRlKCksdGhpcy5fdGVtcGxhdGVDb3N0PSh3aW5kb3cucGVyZm9ybWFuY2Uubm93KCktbykvaSxyPU1hdGgucm91bmQoLjUqdGhpcy5fcGh5c2ljYWxDb3VudCl9dGhpcy5fdmlydHVhbEVuZD49dGhpcy5fdmlydHVhbENvdW50LTF8fDA9PT1yfHwodGhpcy5faXNDbGllbnRGdWxsKCk/dGhpcy5fcGh5c2ljYWxTaXplPHRoaXMuX29wdFBoeXNpY2FsU2l6ZSYmdGhpcy5fZGVib3VuY2UoIl9pbmNyZWFzZVBvb2xJZk5lZWRlZCIsdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQuYmluZCh0aGlzLHRoaXMuX2NsYW1wKE1hdGgucm91bmQoNTAvdGhpcy5fdGVtcGxhdGVDb3N0KSwxLHIpKSx5dCk6dGhpcy5fZGVib3VuY2UoIl9pbmNyZWFzZVBvb2xJZk5lZWRlZCIsdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQuYmluZCh0aGlzLHIpLHZ0KSl9fSxfcmVuZGVyOmZ1bmN0aW9uKCl7aWYodGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9pc1Zpc2libGUpaWYoMCE9PXRoaXMuX3BoeXNpY2FsQ291bnQpe3ZhciB0PXRoaXMuX2dldFJldXNhYmxlcyghMCk7dGhpcy5fcGh5c2ljYWxUb3A9dC5waHlzaWNhbFRvcCx0aGlzLl92aXJ0dWFsU3RhcnQ9dGhpcy5fdmlydHVhbFN0YXJ0K3QuaW5kZXhlcy5sZW5ndGgsdGhpcy5fcGh5c2ljYWxTdGFydD10aGlzLl9waHlzaWNhbFN0YXJ0K3QuaW5kZXhlcy5sZW5ndGgsdGhpcy5fdXBkYXRlKHQuaW5kZXhlcyksdGhpcy5fdXBkYXRlKCksdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQoMCl9ZWxzZSB0aGlzLl92aXJ0dWFsQ291bnQ+MCYmKHRoaXMudXBkYXRlVmlld3BvcnRCb3VuZGFyaWVzKCksdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQoMykpfSxfZW5zdXJlVGVtcGxhdGl6ZWQ6ZnVuY3Rpb24oKXtpZighdGhpcy5jdG9yKXt0aGlzLl91c2VyVGVtcGxhdGU9dGhpcy5xdWVyeUVmZmVjdGl2ZUNoaWxkcmVuKCJ0ZW1wbGF0ZSIpLHRoaXMuX3VzZXJUZW1wbGF0ZXx8Y29uc29sZS53YXJuKCJpcm9uLWxpc3QgcmVxdWlyZXMgYSB0ZW1wbGF0ZSB0byBiZSBwcm92aWRlZCBpbiBsaWdodC1kb20iKTt2YXIgdD17X19rZXlfXzohMH07dFt0aGlzLmFzXT0hMCx0W3RoaXMuaW5kZXhBc109ITAsdFt0aGlzLnNlbGVjdGVkQXNdPSEwLHQudGFiSW5kZXg9ITAsdGhpcy5faW5zdGFuY2VQcm9wcz10LHRoaXMudGVtcGxhdGl6ZSh0aGlzLl91c2VyVGVtcGxhdGUsdGhpcy5tdXRhYmxlRGF0YSl9fSxfZ3JpZENoYW5nZWQ6ZnVuY3Rpb24odCxlKXt2b2lkIDAhPT1lJiYodGhpcy5ub3RpZnlSZXNpemUoKSxXaSgpLHQmJnRoaXMuX3VwZGF0ZUdyaWRNZXRyaWNzKCkpfSxfaXRlbXNDaGFuZ2VkOmZ1bmN0aW9uKHQpe2lmKCJpdGVtcyI9PT10LnBhdGgpdGhpcy5fdmlydHVhbFN0YXJ0PTAsdGhpcy5fcGh5c2ljYWxUb3A9MCx0aGlzLl92aXJ0dWFsQ291bnQ9dGhpcy5pdGVtcz90aGlzLml0ZW1zLmxlbmd0aDowLHRoaXMuX3BoeXNpY2FsSW5kZXhGb3JLZXk9e30sdGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9bnVsbCx0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPW51bGwsdGhpcy5fcGh5c2ljYWxDb3VudD10aGlzLl9waHlzaWNhbENvdW50fHwwLHRoaXMuX3BoeXNpY2FsSXRlbXM9dGhpcy5fcGh5c2ljYWxJdGVtc3x8W10sdGhpcy5fcGh5c2ljYWxTaXplcz10aGlzLl9waHlzaWNhbFNpemVzfHxbXSx0aGlzLl9waHlzaWNhbFN0YXJ0PTAsdGhpcy5fc2Nyb2xsVG9wPnRoaXMuX3Njcm9sbE9mZnNldCYmdGhpcy5fcmVzZXRTY3JvbGxQb3NpdGlvbigwKSx0aGlzLl9yZW1vdmVGb2N1c2VkSXRlbSgpLHRoaXMuX2RlYm91bmNlKCJfcmVuZGVyIix0aGlzLl9yZW5kZXIsX3QpO2Vsc2UgaWYoIml0ZW1zLnNwbGljZXMiPT09dC5wYXRoKXtpZih0aGlzLl9hZGp1c3RWaXJ0dWFsSW5kZXgodC52YWx1ZS5pbmRleFNwbGljZXMpLHRoaXMuX3ZpcnR1YWxDb3VudD10aGlzLml0ZW1zP3RoaXMuaXRlbXMubGVuZ3RoOjAsdC52YWx1ZS5pbmRleFNwbGljZXMuc29tZSgoZnVuY3Rpb24odCl7cmV0dXJuIHQuYWRkZWRDb3VudD4wfHx0LnJlbW92ZWQubGVuZ3RoPjB9KSkpe3ZhciBlPXRoaXMuX2dldEFjdGl2ZUVsZW1lbnQoKTt0aGlzLmNvbnRhaW5zKGUpJiZlLmJsdXIoKX12YXIgbj10LnZhbHVlLmluZGV4U3BsaWNlcy5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gdC5pbmRleCt0LmFkZGVkQ291bnQ+PXRoaXMuX3ZpcnR1YWxTdGFydCYmdC5pbmRleDw9dGhpcy5fdmlydHVhbEVuZH0pLHRoaXMpO3RoaXMuX2lzQ2xpZW50RnVsbCgpJiYhbnx8dGhpcy5fZGVib3VuY2UoIl9yZW5kZXIiLHRoaXMuX3JlbmRlcixfdCl9ZWxzZSJpdGVtcy5sZW5ndGgiIT09dC5wYXRoJiZ0aGlzLl9mb3J3YXJkSXRlbVBhdGgodC5wYXRoLHQudmFsdWUpfSxfZm9yd2FyZEl0ZW1QYXRoOmZ1bmN0aW9uKHQsZSl7dmFyIG4saSxyLG89KHQ9dC5zbGljZSg2KSkuaW5kZXhPZigiLiIpOy0xPT09byYmKG89dC5sZW5ndGgpO3ZhciBhPXRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtKSxzPXBhcnNlSW50KHQuc3Vic3RyaW5nKDAsbyksMTApOyhuPXRoaXMuX2lzSW5kZXhSZW5kZXJlZChzKSk/KGk9dGhpcy5fZ2V0UGh5c2ljYWxJbmRleChzKSxyPXRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX3BoeXNpY2FsSXRlbXNbaV0pKTphJiYocj1hKSxyJiZyW3RoaXMuaW5kZXhBc109PT1zJiYodD10LnN1YnN0cmluZyhvKzEpLHIuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aCh0PXRoaXMuYXMrKHQ/Ii4iK3Q6IiIpLGUsITEsITApLHIuX2ZsdXNoUHJvcGVydGllcyYmci5fZmx1c2hQcm9wZXJ0aWVzKCksbiYmKHRoaXMuX3VwZGF0ZU1ldHJpY3MoW2ldKSx0aGlzLl9wb3NpdGlvbkl0ZW1zKCksdGhpcy5fdXBkYXRlU2Nyb2xsZXJTaXplKCkpKX0sX2FkanVzdFZpcnR1YWxJbmRleDpmdW5jdGlvbih0KXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKHQucmVtb3ZlZC5mb3JFYWNoKHRoaXMuX3JlbW92ZUl0ZW0sdGhpcyksdC5pbmRleDx0aGlzLl92aXJ0dWFsU3RhcnQpe3ZhciBlPU1hdGgubWF4KHQuYWRkZWRDb3VudC10LnJlbW92ZWQubGVuZ3RoLHQuaW5kZXgtdGhpcy5fdmlydHVhbFN0YXJ0KTt0aGlzLl92aXJ0dWFsU3RhcnQ9dGhpcy5fdmlydHVhbFN0YXJ0K2UsdGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleD49MCYmKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9dGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCtlKX19KSx0aGlzKX0sX3JlbW92ZUl0ZW06ZnVuY3Rpb24odCl7dGhpcy4kLnNlbGVjdG9yLmRlc2VsZWN0KHQpLHRoaXMuX2ZvY3VzZWRJdGVtJiZ0aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9mb2N1c2VkSXRlbSlbdGhpcy5hc109PT10JiZ0aGlzLl9yZW1vdmVGb2N1c2VkSXRlbSgpfSxfaXRlcmF0ZUl0ZW1zOmZ1bmN0aW9uKHQsZSl7dmFyIG4saSxyLG87aWYoMj09PWFyZ3VtZW50cy5sZW5ndGgmJmUpe2ZvcihvPTA7bzxlLmxlbmd0aDtvKyspaWYoaT10aGlzLl9jb21wdXRlVmlkeChuPWVbb10pLG51bGwhPShyPXQuY2FsbCh0aGlzLG4saSkpKXJldHVybiByfWVsc2V7Zm9yKG49dGhpcy5fcGh5c2ljYWxTdGFydCxpPXRoaXMuX3ZpcnR1YWxTdGFydDtuPHRoaXMuX3BoeXNpY2FsQ291bnQ7bisrLGkrKylpZihudWxsIT0ocj10LmNhbGwodGhpcyxuLGkpKSlyZXR1cm4gcjtmb3Iobj0wO248dGhpcy5fcGh5c2ljYWxTdGFydDtuKyssaSsrKWlmKG51bGwhPShyPXQuY2FsbCh0aGlzLG4saSkpKXJldHVybiByfX0sX2NvbXB1dGVWaWR4OmZ1bmN0aW9uKHQpe3JldHVybiB0Pj10aGlzLl9waHlzaWNhbFN0YXJ0P3RoaXMuX3ZpcnR1YWxTdGFydCsodC10aGlzLl9waHlzaWNhbFN0YXJ0KTp0aGlzLl92aXJ0dWFsU3RhcnQrKHRoaXMuX3BoeXNpY2FsQ291bnQtdGhpcy5fcGh5c2ljYWxTdGFydCkrdH0sX2Fzc2lnbk1vZGVsczpmdW5jdGlvbih0KXt0aGlzLl9pdGVyYXRlSXRlbXMoKGZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fcGh5c2ljYWxJdGVtc1t0XSxpPXRoaXMuaXRlbXMmJnRoaXMuaXRlbXNbZV07aWYobnVsbCE9aSl7dmFyIHI9dGhpcy5tb2RlbEZvckVsZW1lbnQobik7ci5fX2tleV9fPW51bGwsdGhpcy5fZm9yd2FyZFByb3BlcnR5KHIsdGhpcy5hcyxpKSx0aGlzLl9mb3J3YXJkUHJvcGVydHkocix0aGlzLnNlbGVjdGVkQXMsdGhpcy4kLnNlbGVjdG9yLmlzU2VsZWN0ZWQoaSkpLHRoaXMuX2ZvcndhcmRQcm9wZXJ0eShyLHRoaXMuaW5kZXhBcyxlKSx0aGlzLl9mb3J3YXJkUHJvcGVydHkociwidGFiSW5kZXgiLHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9PT1lPzA6LTEpLHRoaXMuX3BoeXNpY2FsSW5kZXhGb3JLZXlbci5fX2tleV9fXT10LHIuX2ZsdXNoUHJvcGVydGllcyYmci5fZmx1c2hQcm9wZXJ0aWVzKCEwKSxuLnJlbW92ZUF0dHJpYnV0ZSgiaGlkZGVuIil9ZWxzZSBuLnNldEF0dHJpYnV0ZSgiaGlkZGVuIiwiIil9KSx0KX0sX3VwZGF0ZU1ldHJpY3M6ZnVuY3Rpb24odCl7V2koKTt2YXIgZT0wLG49MCxpPXRoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50LHI9dGhpcy5fcGh5c2ljYWxBdmVyYWdlO3RoaXMuX2l0ZXJhdGVJdGVtcygoZnVuY3Rpb24odCxpKXtuKz10aGlzLl9waHlzaWNhbFNpemVzW3RdLHRoaXMuX3BoeXNpY2FsU2l6ZXNbdF09dGhpcy5fcGh5c2ljYWxJdGVtc1t0XS5vZmZzZXRIZWlnaHQsZSs9dGhpcy5fcGh5c2ljYWxTaXplc1t0XSx0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCs9dGhpcy5fcGh5c2ljYWxTaXplc1t0XT8xOjB9KSx0KSx0aGlzLmdyaWQ/KHRoaXMuX3VwZGF0ZUdyaWRNZXRyaWNzKCksdGhpcy5fcGh5c2ljYWxTaXplPU1hdGguY2VpbCh0aGlzLl9waHlzaWNhbENvdW50L3RoaXMuX2l0ZW1zUGVyUm93KSp0aGlzLl9yb3dIZWlnaHQpOihuPTE9PT10aGlzLl9pdGVtc1BlclJvdz9uOk1hdGguY2VpbCh0aGlzLl9waHlzaWNhbENvdW50L3RoaXMuX2l0ZW1zUGVyUm93KSp0aGlzLl9yb3dIZWlnaHQsdGhpcy5fcGh5c2ljYWxTaXplPXRoaXMuX3BoeXNpY2FsU2l6ZStlLW4sdGhpcy5faXRlbXNQZXJSb3c9MSksdGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQhPT1pJiYodGhpcy5fcGh5c2ljYWxBdmVyYWdlPU1hdGgucm91bmQoKHIqaStlKS90aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCkpfSxfdXBkYXRlR3JpZE1ldHJpY3M6ZnVuY3Rpb24oKXt0aGlzLl9pdGVtV2lkdGg9dGhpcy5fcGh5c2ljYWxDb3VudD4wP3RoaXMuX3BoeXNpY2FsSXRlbXNbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg6MjAwLHRoaXMuX3Jvd0hlaWdodD10aGlzLl9waHlzaWNhbENvdW50PjA/dGhpcy5fcGh5c2ljYWxJdGVtc1swXS5vZmZzZXRIZWlnaHQ6MjAwLHRoaXMuX2l0ZW1zUGVyUm93PXRoaXMuX2l0ZW1XaWR0aD9NYXRoLmZsb29yKHRoaXMuX3ZpZXdwb3J0V2lkdGgvdGhpcy5faXRlbVdpZHRoKTp0aGlzLl9pdGVtc1BlclJvd30sX3Bvc2l0aW9uSXRlbXM6ZnVuY3Rpb24oKXt0aGlzLl9hZGp1c3RTY3JvbGxQb3NpdGlvbigpO3ZhciB0PXRoaXMuX3BoeXNpY2FsVG9wO2lmKHRoaXMuZ3JpZCl7dmFyIGU9KHRoaXMuX3ZpZXdwb3J0V2lkdGgtdGhpcy5faXRlbXNQZXJSb3cqdGhpcy5faXRlbVdpZHRoKS8yO3RoaXMuX2l0ZXJhdGVJdGVtcygoZnVuY3Rpb24obixpKXt2YXIgcj1NYXRoLmZsb29yKGkldGhpcy5faXRlbXNQZXJSb3cqdGhpcy5faXRlbVdpZHRoK2UpO3RoaXMuX2lzUlRMJiYocio9LTEpLHRoaXMudHJhbnNsYXRlM2QocisicHgiLHQrInB4IiwwLHRoaXMuX3BoeXNpY2FsSXRlbXNbbl0pLHRoaXMuX3Nob3VsZFJlbmRlck5leHRSb3coaSkmJih0Kz10aGlzLl9yb3dIZWlnaHQpfSkpfWVsc2V7Y29uc3QgZT1bXTt0aGlzLl9pdGVyYXRlSXRlbXMoKGZ1bmN0aW9uKG4saSl7Y29uc3Qgcj10aGlzLl9waHlzaWNhbEl0ZW1zW25dO3RoaXMudHJhbnNsYXRlM2QoMCx0KyJweCIsMCxyKSx0Kz10aGlzLl9waHlzaWNhbFNpemVzW25dO2NvbnN0IG89ci5pZDtvJiZlLnB1c2gobyl9KSksZS5sZW5ndGgmJnRoaXMuc2V0QXR0cmlidXRlKCJhcmlhLW93bnMiLGUuam9pbigiICIpKX19LF9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZ3JpZD90aGlzLl9jb21wdXRlVmlkeCh0KSV0aGlzLl9pdGVtc1BlclJvdyE9dGhpcy5faXRlbXNQZXJSb3ctMT8wOnRoaXMuX3Jvd0hlaWdodDp0aGlzLl9waHlzaWNhbFNpemVzW3RdfSxfc2hvdWxkUmVuZGVyTmV4dFJvdzpmdW5jdGlvbih0KXtyZXR1cm4gdCV0aGlzLl9pdGVtc1BlclJvdz09dGhpcy5faXRlbXNQZXJSb3ctMX0sX2FkanVzdFNjcm9sbFBvc2l0aW9uOmZ1bmN0aW9uKCl7dmFyIHQ9MD09PXRoaXMuX3ZpcnR1YWxTdGFydD90aGlzLl9waHlzaWNhbFRvcDpNYXRoLm1pbih0aGlzLl9zY3JvbGxQb3NpdGlvbit0aGlzLl9waHlzaWNhbFRvcCwwKTtpZigwIT09dCl7dGhpcy5fcGh5c2ljYWxUb3A9dGhpcy5fcGh5c2ljYWxUb3AtdDt2YXIgZT10aGlzLl9zY3JvbGxQb3NpdGlvbjshWm8mJmU+MCYmdGhpcy5fcmVzZXRTY3JvbGxQb3NpdGlvbihlLXQpfX0sX3Jlc2V0U2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24odCl7dGhpcy5zY3JvbGxUYXJnZXQmJnQ+PTAmJih0aGlzLl9zY3JvbGxUb3A9dCx0aGlzLl9zY3JvbGxQb3NpdGlvbj10aGlzLl9zY3JvbGxUb3ApfSxfdXBkYXRlU2Nyb2xsZXJTaXplOmZ1bmN0aW9uKHQpe3RoaXMuX2VzdFNjcm9sbEhlaWdodD10aGlzLmdyaWQ/dGhpcy5fdmlydHVhbFJvd0NvdW50KnRoaXMuX3Jvd0hlaWdodDp0aGlzLl9waHlzaWNhbEJvdHRvbStNYXRoLm1heCh0aGlzLl92aXJ0dWFsQ291bnQtdGhpcy5fcGh5c2ljYWxDb3VudC10aGlzLl92aXJ0dWFsU3RhcnQsMCkqdGhpcy5fcGh5c2ljYWxBdmVyYWdlLCgodD0odD0odD10fHwwPT09dGhpcy5fc2Nyb2xsSGVpZ2h0KXx8dGhpcy5fc2Nyb2xsUG9zaXRpb24+PXRoaXMuX2VzdFNjcm9sbEhlaWdodC10aGlzLl9waHlzaWNhbFNpemUpfHx0aGlzLmdyaWQmJnRoaXMuJC5pdGVtcy5zdHlsZS5oZWlnaHQ8dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0KXx8TWF0aC5hYnModGhpcy5fZXN0U2Nyb2xsSGVpZ2h0LXRoaXMuX3Njcm9sbEhlaWdodCk+PXRoaXMuX3ZpZXdwb3J0SGVpZ2h0KSYmKHRoaXMuJC5pdGVtcy5zdHlsZS5oZWlnaHQ9dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0KyJweCIsdGhpcy5fc2Nyb2xsSGVpZ2h0PXRoaXMuX2VzdFNjcm9sbEhlaWdodCl9LHNjcm9sbFRvSXRlbTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zY3JvbGxUb0luZGV4KHRoaXMuaXRlbXMuaW5kZXhPZih0KSl9LHNjcm9sbFRvSW5kZXg6ZnVuY3Rpb24odCl7aWYoISgibnVtYmVyIiE9dHlwZW9mIHR8fHQ8MHx8dD50aGlzLml0ZW1zLmxlbmd0aC0xKSYmKFdpKCksMCE9PXRoaXMuX3BoeXNpY2FsQ291bnQpKXt0PXRoaXMuX2NsYW1wKHQsMCx0aGlzLl92aXJ0dWFsQ291bnQtMSksKCF0aGlzLl9pc0luZGV4UmVuZGVyZWQodCl8fHQ+PXRoaXMuX21heFZpcnR1YWxTdGFydCkmJih0aGlzLl92aXJ0dWFsU3RhcnQ9dGhpcy5ncmlkP3QtMip0aGlzLl9pdGVtc1BlclJvdzp0LTEpLHRoaXMuX21hbmFnZUZvY3VzKCksdGhpcy5fYXNzaWduTW9kZWxzKCksdGhpcy5fdXBkYXRlTWV0cmljcygpLHRoaXMuX3BoeXNpY2FsVG9wPU1hdGguZmxvb3IodGhpcy5fdmlydHVhbFN0YXJ0L3RoaXMuX2l0ZW1zUGVyUm93KSp0aGlzLl9waHlzaWNhbEF2ZXJhZ2U7Zm9yKHZhciBlPXRoaXMuX3BoeXNpY2FsU3RhcnQsbj10aGlzLl92aXJ0dWFsU3RhcnQsaT0wLHI9dGhpcy5faGlkZGVuQ29udGVudFNpemU7bjx0JiZpPD1yOylpKz10aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQoZSksZT0oZSsxKSV0aGlzLl9waHlzaWNhbENvdW50LG4rKzt0aGlzLl91cGRhdGVTY3JvbGxlclNpemUoITApLHRoaXMuX3Bvc2l0aW9uSXRlbXMoKSx0aGlzLl9yZXNldFNjcm9sbFBvc2l0aW9uKHRoaXMuX3BoeXNpY2FsVG9wK3RoaXMuX3Njcm9sbE9mZnNldCtpKSx0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZCgwKSx0aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD1udWxsLHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9bnVsbH19LF9yZXNldEF2ZXJhZ2U6ZnVuY3Rpb24oKXt0aGlzLl9waHlzaWNhbEF2ZXJhZ2U9MCx0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudD0wfSxfcmVzaXplSGFuZGxlcjpmdW5jdGlvbigpe3RoaXMuX2RlYm91bmNlKCJfcmVuZGVyIiwoZnVuY3Rpb24oKXt0aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD1udWxsLHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9bnVsbCx0aGlzLl9pc1Zpc2libGU/KHRoaXMudXBkYXRlVmlld3BvcnRCb3VuZGFyaWVzKCksdGhpcy50b2dnbGVTY3JvbGxMaXN0ZW5lcighMCksdGhpcy5fcmVzZXRBdmVyYWdlKCksdGhpcy5fcmVuZGVyKCkpOnRoaXMudG9nZ2xlU2Nyb2xsTGlzdGVuZXIoITEpfSksX3QpfSxzZWxlY3RJdGVtOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNlbGVjdEluZGV4KHRoaXMuaXRlbXMuaW5kZXhPZih0KSl9LHNlbGVjdEluZGV4OmZ1bmN0aW9uKHQpe2lmKCEodDwwfHx0Pj10aGlzLl92aXJ0dWFsQ291bnQpKXtpZighdGhpcy5tdWx0aVNlbGVjdGlvbiYmdGhpcy5zZWxlY3RlZEl0ZW0mJnRoaXMuY2xlYXJTZWxlY3Rpb24oKSx0aGlzLl9pc0luZGV4UmVuZGVyZWQodCkpe3ZhciBlPXRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fZ2V0UGh5c2ljYWxJbmRleCh0KV0pO2UmJihlW3RoaXMuc2VsZWN0ZWRBc109ITApLHRoaXMudXBkYXRlU2l6ZUZvckluZGV4KHQpfXRoaXMuJC5zZWxlY3Rvci5zZWxlY3RJbmRleCh0KX19LGRlc2VsZWN0SXRlbTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5kZXNlbGVjdEluZGV4KHRoaXMuaXRlbXMuaW5kZXhPZih0KSl9LGRlc2VsZWN0SW5kZXg6ZnVuY3Rpb24odCl7aWYoISh0PDB8fHQ+PXRoaXMuX3ZpcnR1YWxDb3VudCkpe2lmKHRoaXMuX2lzSW5kZXhSZW5kZXJlZCh0KSl0aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9waHlzaWNhbEl0ZW1zW3RoaXMuX2dldFBoeXNpY2FsSW5kZXgodCldKVt0aGlzLnNlbGVjdGVkQXNdPSExLHRoaXMudXBkYXRlU2l6ZUZvckluZGV4KHQpO3RoaXMuJC5zZWxlY3Rvci5kZXNlbGVjdEluZGV4KHQpfX0sdG9nZ2xlU2VsZWN0aW9uRm9ySXRlbTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy50b2dnbGVTZWxlY3Rpb25Gb3JJbmRleCh0aGlzLml0ZW1zLmluZGV4T2YodCkpfSx0b2dnbGVTZWxlY3Rpb25Gb3JJbmRleDpmdW5jdGlvbih0KXsodGhpcy4kLnNlbGVjdG9yLmlzSW5kZXhTZWxlY3RlZD90aGlzLiQuc2VsZWN0b3IuaXNJbmRleFNlbGVjdGVkKHQpOnRoaXMuJC5zZWxlY3Rvci5pc1NlbGVjdGVkKHRoaXMuaXRlbXNbdF0pKT90aGlzLmRlc2VsZWN0SW5kZXgodCk6dGhpcy5zZWxlY3RJbmRleCh0KX0sY2xlYXJTZWxlY3Rpb246ZnVuY3Rpb24oKXt0aGlzLl9pdGVyYXRlSXRlbXMoKGZ1bmN0aW9uKHQsZSl7dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fcGh5c2ljYWxJdGVtc1t0XSlbdGhpcy5zZWxlY3RlZEFzXT0hMX0pKSx0aGlzLiQuc2VsZWN0b3IuY2xlYXJTZWxlY3Rpb24oKX0sX3NlbGVjdGlvbkVuYWJsZWRDaGFuZ2VkOmZ1bmN0aW9uKHQpeyh0P3RoaXMubGlzdGVuOnRoaXMudW5saXN0ZW4pLmNhbGwodGhpcyx0aGlzLCJ0YXAiLCJfc2VsZWN0aW9uSGFuZGxlciIpfSxfc2VsZWN0aW9uSGFuZGxlcjpmdW5jdGlvbih0KXt2YXIgZT10aGlzLm1vZGVsRm9yRWxlbWVudCh0LnRhcmdldCk7aWYoZSl7dmFyIG4saSxyPWVyKHQpLnBhdGhbMF0sbz10aGlzLl9nZXRBY3RpdmVFbGVtZW50KCksYT10aGlzLl9waHlzaWNhbEl0ZW1zW3RoaXMuX2dldFBoeXNpY2FsSW5kZXgoZVt0aGlzLmluZGV4QXNdKV07ImlucHV0IiE9PXIubG9jYWxOYW1lJiYiYnV0dG9uIiE9PXIubG9jYWxOYW1lJiYic2VsZWN0IiE9PXIubG9jYWxOYW1lJiYobj1lLnRhYkluZGV4LGUudGFiSW5kZXg9UW8saT1vP28udGFiSW5kZXg6LTEsZS50YWJJbmRleD1uLG8mJmEhPT1vJiZhLmNvbnRhaW5zKG8pJiZpIT09UW98fHRoaXMudG9nZ2xlU2VsZWN0aW9uRm9ySXRlbShlW3RoaXMuYXNdKSl9fSxfbXVsdGlTZWxlY3Rpb25DaGFuZ2VkOmZ1bmN0aW9uKHQpe3RoaXMuY2xlYXJTZWxlY3Rpb24oKSx0aGlzLiQuc2VsZWN0b3IubXVsdGk9dH0sdXBkYXRlU2l6ZUZvckl0ZW06ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMudXBkYXRlU2l6ZUZvckluZGV4KHRoaXMuaXRlbXMuaW5kZXhPZih0KSl9LHVwZGF0ZVNpemVGb3JJbmRleDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5faXNJbmRleFJlbmRlcmVkKHQpPyh0aGlzLl91cGRhdGVNZXRyaWNzKFt0aGlzLl9nZXRQaHlzaWNhbEluZGV4KHQpXSksdGhpcy5fcG9zaXRpb25JdGVtcygpLG51bGwpOm51bGx9LF9tYW5hZ2VGb2N1czpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg7dD49MCYmdDx0aGlzLl92aXJ0dWFsQ291bnQ/dGhpcy5faXNJbmRleFJlbmRlcmVkKHQpP3RoaXMuX3Jlc3RvcmVGb2N1c2VkSXRlbSgpOnRoaXMuX2NyZWF0ZUZvY3VzQmFja2ZpbGxJdGVtKCk6dGhpcy5fdmlydHVhbENvdW50PjAmJnRoaXMuX3BoeXNpY2FsQ291bnQ+MCYmKHRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4PXRoaXMuX3BoeXNpY2FsU3RhcnQsdGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleD10aGlzLl92aXJ0dWFsU3RhcnQsdGhpcy5fZm9jdXNlZEl0ZW09dGhpcy5fcGh5c2ljYWxJdGVtc1t0aGlzLl9waHlzaWNhbFN0YXJ0XSl9LF9jb252ZXJ0SW5kZXhUb0NvbXBsZXRlUm93OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9pdGVtc1BlclJvdz10aGlzLl9pdGVtc1BlclJvd3x8MSx0aGlzLmdyaWQ/TWF0aC5jZWlsKHQvdGhpcy5faXRlbXNQZXJSb3cpKnRoaXMuX2l0ZW1zUGVyUm93OnR9LF9pc0luZGV4UmVuZGVyZWQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQ+PXRoaXMuX3ZpcnR1YWxTdGFydCYmdDw9dGhpcy5fdmlydHVhbEVuZH0sX2lzSW5kZXhWaXNpYmxlOmZ1bmN0aW9uKHQpe3JldHVybiB0Pj10aGlzLmZpcnN0VmlzaWJsZUluZGV4JiZ0PD10aGlzLmxhc3RWaXNpYmxlSW5kZXh9LF9nZXRQaHlzaWNhbEluZGV4OmZ1bmN0aW9uKHQpe3JldHVybih0aGlzLl9waHlzaWNhbFN0YXJ0Kyh0LXRoaXMuX3ZpcnR1YWxTdGFydCkpJXRoaXMuX3BoeXNpY2FsQ291bnR9LGZvY3VzSXRlbTpmdW5jdGlvbih0KXt0aGlzLl9mb2N1c1BoeXNpY2FsSXRlbSh0KX0sX2ZvY3VzUGh5c2ljYWxJdGVtOmZ1bmN0aW9uKHQpe2lmKCEodDwwfHx0Pj10aGlzLl92aXJ0dWFsQ291bnQpKXt0aGlzLl9yZXN0b3JlRm9jdXNlZEl0ZW0oKSx0aGlzLl9pc0luZGV4UmVuZGVyZWQodCl8fHRoaXMuc2Nyb2xsVG9JbmRleCh0KTt2YXIgZSxuPXRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fZ2V0UGh5c2ljYWxJbmRleCh0KV0saT10aGlzLm1vZGVsRm9yRWxlbWVudChuKTtpLnRhYkluZGV4PVFvLG4udGFiSW5kZXg9PT1RbyYmKGU9biksZXx8KGU9ZXIobikucXVlcnlTZWxlY3RvcignW3RhYmluZGV4PSItMTAwIl0nKSksaS50YWJJbmRleD0wLHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9dCxlJiZlLmZvY3VzKCl9fSxfcmVtb3ZlRm9jdXNlZEl0ZW06ZnVuY3Rpb24oKXt0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSYmdGhpcy5faXRlbXNQYXJlbnQucmVtb3ZlQ2hpbGQodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pLHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtPW51bGwsdGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW09bnVsbCx0aGlzLl9mb2N1c2VkSXRlbT1udWxsLHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg9LTEsdGhpcy5fZm9jdXNlZFBoeXNpY2FsSW5kZXg9LTF9LF9jcmVhdGVGb2N1c0JhY2tmaWxsSXRlbTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4O2lmKCEodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW18fHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg8MCkpe2lmKCF0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbSl7dmFyIGU9dGhpcy5zdGFtcChudWxsKTt0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbT1lLnJvb3QucXVlcnlTZWxlY3RvcigiKiIpLHRoaXMuX2l0ZW1zUGFyZW50LmFwcGVuZENoaWxkKGUucm9vdCl9dGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW09dGhpcy5fcGh5c2ljYWxJdGVtc1t0XSx0aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSkudGFiSW5kZXg9MCx0aGlzLl9waHlzaWNhbEl0ZW1zW3RdPXRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtLHRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4PXQsdGhpcy50cmFuc2xhdGUzZCgwLEpvLDAsdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pfX0sX3Jlc3RvcmVGb2N1c2VkSXRlbTpmdW5jdGlvbigpe2lmKHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtJiYhKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg8MCkpe3RoaXMuX2Fzc2lnbk1vZGVscygpO3ZhciB0PXRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4PXRoaXMuX2dldFBoeXNpY2FsSW5kZXgodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCksZT10aGlzLl9waHlzaWNhbEl0ZW1zW3RdO2lmKGUpe3ZhciBuPXRoaXMubW9kZWxGb3JFbGVtZW50KGUpLGk9dGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pO25bdGhpcy5hc109PT1pW3RoaXMuYXNdPyh0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbT1lLG4udGFiSW5kZXg9LTEsdGhpcy5fcGh5c2ljYWxJdGVtc1t0XT10aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSx0aGlzLnRyYW5zbGF0ZTNkKDAsSm8sMCx0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbSkpOih0aGlzLl9yZW1vdmVGb2N1c2VkSXRlbSgpLHRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtPW51bGwpLHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtPW51bGx9fX0sX2RpZEZvY3VzOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMubW9kZWxGb3JFbGVtZW50KHQudGFyZ2V0KSxuPXRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX2ZvY3VzZWRJdGVtKSxpPW51bGwhPT10aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSxyPXRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg7ZSYmKG49PT1lP3RoaXMuX2lzSW5kZXhWaXNpYmxlKHIpfHx0aGlzLnNjcm9sbFRvSW5kZXgocik6KHRoaXMuX3Jlc3RvcmVGb2N1c2VkSXRlbSgpLG4mJihuLnRhYkluZGV4PS0xKSxlLnRhYkluZGV4PTAsdGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleD1yPWVbdGhpcy5pbmRleEFzXSx0aGlzLl9mb2N1c2VkUGh5c2ljYWxJbmRleD10aGlzLl9nZXRQaHlzaWNhbEluZGV4KHIpLHRoaXMuX2ZvY3VzZWRJdGVtPXRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fZm9jdXNlZFBoeXNpY2FsSW5kZXhdLGkmJiF0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSYmdGhpcy5fdXBkYXRlKCkpKX0sX2tleWRvd25IYW5kbGVyOmZ1bmN0aW9uKHQpe3N3aXRjaCh0LmtleUNvZGUpe2Nhc2UgNDA6dGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleDx0aGlzLl92aXJ0dWFsQ291bnQtMSYmdC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgrKHRoaXMuZ3JpZD90aGlzLl9pdGVtc1BlclJvdzoxKSk7YnJlYWs7Y2FzZSAzOTp0aGlzLmdyaWQmJnRoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgrKHRoaXMuX2lzUlRMPy0xOjEpKTticmVhaztjYXNlIDM4OnRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg+MCYmdC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgtKHRoaXMuZ3JpZD90aGlzLl9pdGVtc1BlclJvdzoxKSk7YnJlYWs7Y2FzZSAzNzp0aGlzLmdyaWQmJnRoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgrKHRoaXMuX2lzUlRMPzE6LTEpKTticmVhaztjYXNlIDEzOnRoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgpLHRoaXMuc2VsZWN0aW9uRW5hYmxlZCYmdGhpcy5fc2VsZWN0aW9uSGFuZGxlcih0KX19LF9jbGFtcDpmdW5jdGlvbih0LGUsbil7cmV0dXJuIE1hdGgubWluKG4sTWF0aC5tYXgoZSx0KSl9LF9kZWJvdW5jZTpmdW5jdGlvbih0LGUsbil7dGhpcy5fZGVib3VuY2Vycz10aGlzLl9kZWJvdW5jZXJzfHx7fSx0aGlzLl9kZWJvdW5jZXJzW3RdPU5uLmRlYm91bmNlKHRoaXMuX2RlYm91bmNlcnNbdF0sbixlLmJpbmQodGhpcykpLFJuKHRoaXMuX2RlYm91bmNlcnNbdF0pfSxfZm9yd2FyZFByb3BlcnR5OmZ1bmN0aW9uKHQsZSxuKXt0Ll9zZXRQZW5kaW5nUHJvcGVydHkoZSxuKX0sX2ZvcndhcmRIb3N0UHJvcFYyOmZ1bmN0aW9uKHQsZSl7KHRoaXMuX3BoeXNpY2FsSXRlbXN8fFtdKS5jb25jYXQoW3RoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtLHRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtXSkuZm9yRWFjaCgoZnVuY3Rpb24obil7biYmdGhpcy5tb2RlbEZvckVsZW1lbnQobikuZm9yd2FyZEhvc3RQcm9wKHQsZSl9KSx0aGlzKX0sX25vdGlmeUluc3RhbmNlUHJvcFYyOmZ1bmN0aW9uKHQsZSxuKXtpZihRKHRoaXMuYXMsZSkpe3ZhciBpPXRbdGhpcy5pbmRleEFzXTtlPT10aGlzLmFzJiYodGhpcy5pdGVtc1tpXT1uKSx0aGlzLm5vdGlmeVBhdGgoSih0aGlzLmFzLCJpdGVtcy4iK2ksZSksbil9fSxfZ2V0U3RhbXBlZENoaWxkcmVuOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3BoeXNpY2FsSXRlbXN9LF9mb3J3YXJkSW5zdGFuY2VQYXRoOmZ1bmN0aW9uKHQsZSxuKXswPT09ZS5pbmRleE9mKHRoaXMuYXMrIi4iKSYmdGhpcy5ub3RpZnlQYXRoKCJpdGVtcy4iK3QuX19rZXlfXysiLiIrZS5zbGljZSh0aGlzLmFzLmxlbmd0aCsxKSxuKX0sX2ZvcndhcmRQYXJlbnRQYXRoOmZ1bmN0aW9uKHQsZSl7KHRoaXMuX3BoeXNpY2FsSXRlbXN8fFtdKS5jb25jYXQoW3RoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtLHRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtXSkuZm9yRWFjaCgoZnVuY3Rpb24obil7biYmdGhpcy5tb2RlbEZvckVsZW1lbnQobikubm90aWZ5UGF0aCh0LGUpfSksdGhpcyl9LF9mb3J3YXJkUGFyZW50UHJvcDpmdW5jdGlvbih0LGUpeyh0aGlzLl9waHlzaWNhbEl0ZW1zfHxbXSkuY29uY2F0KFt0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSx0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbV0pLmZvckVhY2goKGZ1bmN0aW9uKG4pe24mJih0aGlzLm1vZGVsRm9yRWxlbWVudChuKVt0XT1lKX0pLHRoaXMpfSxfZ2V0QWN0aXZlRWxlbWVudDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2l0ZW1zUGFyZW50Lm5vZGUuZG9tSG9zdDtyZXR1cm4gZXIodD90LnJvb3Q6ZG9jdW1lbnQpLmFjdGl2ZUVsZW1lbnR9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjbGFzcyB0YXtjb25zdHJ1Y3Rvcih0KXt0aGlzLnNlbGVjdGlvbj1bXSx0aGlzLnNlbGVjdENhbGxiYWNrPXR9Z2V0KCl7cmV0dXJuIHRoaXMubXVsdGk/dGhpcy5zZWxlY3Rpb24uc2xpY2UoKTp0aGlzLnNlbGVjdGlvblswXX1jbGVhcih0KXt0aGlzLnNlbGVjdGlvbi5zbGljZSgpLmZvckVhY2goKGZ1bmN0aW9uKGUpeyghdHx8dC5pbmRleE9mKGUpPDApJiZ0aGlzLnNldEl0ZW1TZWxlY3RlZChlLCExKX0pLHRoaXMpfWlzU2VsZWN0ZWQodCl7cmV0dXJuIHRoaXMuc2VsZWN0aW9uLmluZGV4T2YodCk+PTB9c2V0SXRlbVNlbGVjdGVkKHQsZSl7aWYobnVsbCE9dCYmZSE9PXRoaXMuaXNTZWxlY3RlZCh0KSl7aWYoZSl0aGlzLnNlbGVjdGlvbi5wdXNoKHQpO2Vsc2V7dmFyIG49dGhpcy5zZWxlY3Rpb24uaW5kZXhPZih0KTtuPj0wJiZ0aGlzLnNlbGVjdGlvbi5zcGxpY2UobiwxKX10aGlzLnNlbGVjdENhbGxiYWNrJiZ0aGlzLnNlbGVjdENhbGxiYWNrKHQsZSl9fXNlbGVjdCh0KXt0aGlzLm11bHRpP3RoaXMudG9nZ2xlKHQpOnRoaXMuZ2V0KCkhPT10JiYodGhpcy5zZXRJdGVtU2VsZWN0ZWQodGhpcy5nZXQoKSwhMSksdGhpcy5zZXRJdGVtU2VsZWN0ZWQodCwhMCkpfXRvZ2dsZSh0KXt0aGlzLnNldEl0ZW1TZWxlY3RlZCh0LCF0aGlzLmlzU2VsZWN0ZWQodCkpfX0KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovY29uc3QgZWE9e3Byb3BlcnRpZXM6e2F0dHJGb3JTZWxlY3RlZDp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0sc2VsZWN0ZWQ6e3R5cGU6U3RyaW5nLG5vdGlmeTohMH0sc2VsZWN0ZWRJdGVtOnt0eXBlOk9iamVjdCxyZWFkT25seTohMCxub3RpZnk6ITB9LGFjdGl2YXRlRXZlbnQ6e3R5cGU6U3RyaW5nLHZhbHVlOiJ0YXAiLG9ic2VydmVyOiJfYWN0aXZhdGVFdmVudENoYW5nZWQifSxzZWxlY3RhYmxlOlN0cmluZyxzZWxlY3RlZENsYXNzOnt0eXBlOlN0cmluZyx2YWx1ZToiaXJvbi1zZWxlY3RlZCJ9LHNlbGVjdGVkQXR0cmlidXRlOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxmYWxsYmFja1NlbGVjdGlvbjp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH0saXRlbXM6e3R5cGU6QXJyYXkscmVhZE9ubHk6ITAsbm90aWZ5OiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxfZXhjbHVkZWRMb2NhbE5hbWVzOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybnt0ZW1wbGF0ZToxLCJkb20tYmluZCI6MSwiZG9tLWlmIjoxLCJkb20tcmVwZWF0IjoxfX19fSxvYnNlcnZlcnM6WyJfdXBkYXRlQXR0ckZvclNlbGVjdGVkKGF0dHJGb3JTZWxlY3RlZCkiLCJfdXBkYXRlU2VsZWN0ZWQoc2VsZWN0ZWQpIiwiX2NoZWNrRmFsbGJhY2soZmFsbGJhY2tTZWxlY3Rpb24pIl0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX2JpbmRGaWx0ZXJJdGVtPXRoaXMuX2ZpbHRlckl0ZW0uYmluZCh0aGlzKSx0aGlzLl9zZWxlY3Rpb249bmV3IHRhKHRoaXMuX2FwcGx5U2VsZWN0aW9uLmJpbmQodGhpcykpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyPXRoaXMuX29ic2VydmVJdGVtcyh0aGlzKSx0aGlzLl9hZGRMaXN0ZW5lcih0aGlzLmFjdGl2YXRlRXZlbnQpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyJiZlcih0aGlzKS51bm9ic2VydmVOb2Rlcyh0aGlzLl9vYnNlcnZlciksdGhpcy5fcmVtb3ZlTGlzdGVuZXIodGhpcy5hY3RpdmF0ZUV2ZW50KX0saW5kZXhPZjpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pdGVtcz90aGlzLml0ZW1zLmluZGV4T2YodCk6LTF9LHNlbGVjdDpmdW5jdGlvbih0KXt0aGlzLnNlbGVjdGVkPXR9LHNlbGVjdFByZXZpb3VzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5pdGVtcy5sZW5ndGgsZT10LTE7dm9pZCAwIT09dGhpcy5zZWxlY3RlZCYmKGU9KE51bWJlcih0aGlzLl92YWx1ZVRvSW5kZXgodGhpcy5zZWxlY3RlZCkpLTErdCkldCksdGhpcy5zZWxlY3RlZD10aGlzLl9pbmRleFRvVmFsdWUoZSl9LHNlbGVjdE5leHQ6ZnVuY3Rpb24oKXt2YXIgdD0wO3ZvaWQgMCE9PXRoaXMuc2VsZWN0ZWQmJih0PShOdW1iZXIodGhpcy5fdmFsdWVUb0luZGV4KHRoaXMuc2VsZWN0ZWQpKSsxKSV0aGlzLml0ZW1zLmxlbmd0aCksdGhpcy5zZWxlY3RlZD10aGlzLl9pbmRleFRvVmFsdWUodCl9LHNlbGVjdEluZGV4OmZ1bmN0aW9uKHQpe3RoaXMuc2VsZWN0KHRoaXMuX2luZGV4VG9WYWx1ZSh0KSl9LGZvcmNlU3luY2hyb25vdXNJdGVtVXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5fb2JzZXJ2ZXImJiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLl9vYnNlcnZlci5mbHVzaD90aGlzLl9vYnNlcnZlci5mbHVzaCgpOnRoaXMuX3VwZGF0ZUl0ZW1zKCl9LGdldCBfc2hvdWxkVXBkYXRlU2VsZWN0aW9uKCl7cmV0dXJuIG51bGwhPXRoaXMuc2VsZWN0ZWR9LF9jaGVja0ZhbGxiYWNrOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlU2VsZWN0ZWQoKX0sX2FkZExpc3RlbmVyOmZ1bmN0aW9uKHQpe3RoaXMubGlzdGVuKHRoaXMsdCwiX2FjdGl2YXRlSGFuZGxlciIpfSxfcmVtb3ZlTGlzdGVuZXI6ZnVuY3Rpb24odCl7dGhpcy51bmxpc3Rlbih0aGlzLHQsIl9hY3RpdmF0ZUhhbmRsZXIiKX0sX2FjdGl2YXRlRXZlbnRDaGFuZ2VkOmZ1bmN0aW9uKHQsZSl7dGhpcy5fcmVtb3ZlTGlzdGVuZXIoZSksdGhpcy5fYWRkTGlzdGVuZXIodCl9LF91cGRhdGVJdGVtczpmdW5jdGlvbigpe3ZhciB0PWVyKHRoaXMpLnF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyh0aGlzLnNlbGVjdGFibGV8fCIqIik7dD1BcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwodCx0aGlzLl9iaW5kRmlsdGVySXRlbSksdGhpcy5fc2V0SXRlbXModCl9LF91cGRhdGVBdHRyRm9yU2VsZWN0ZWQ6ZnVuY3Rpb24oKXt0aGlzLnNlbGVjdGVkSXRlbSYmKHRoaXMuc2VsZWN0ZWQ9dGhpcy5fdmFsdWVGb3JJdGVtKHRoaXMuc2VsZWN0ZWRJdGVtKSl9LF91cGRhdGVTZWxlY3RlZDpmdW5jdGlvbigpe3RoaXMuX3NlbGVjdFNlbGVjdGVkKHRoaXMuc2VsZWN0ZWQpfSxfc2VsZWN0U2VsZWN0ZWQ6ZnVuY3Rpb24odCl7aWYodGhpcy5pdGVtcyl7dmFyIGU9dGhpcy5fdmFsdWVUb0l0ZW0odGhpcy5zZWxlY3RlZCk7ZT90aGlzLl9zZWxlY3Rpb24uc2VsZWN0KGUpOnRoaXMuX3NlbGVjdGlvbi5jbGVhcigpLHRoaXMuZmFsbGJhY2tTZWxlY3Rpb24mJnRoaXMuaXRlbXMubGVuZ3RoJiZ2b2lkIDA9PT10aGlzLl9zZWxlY3Rpb24uZ2V0KCkmJih0aGlzLnNlbGVjdGVkPXRoaXMuZmFsbGJhY2tTZWxlY3Rpb24pfX0sX2ZpbHRlckl0ZW06ZnVuY3Rpb24odCl7cmV0dXJuIXRoaXMuX2V4Y2x1ZGVkTG9jYWxOYW1lc1t0LmxvY2FsTmFtZV19LF92YWx1ZVRvSXRlbTpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9udWxsOnRoaXMuaXRlbXNbdGhpcy5fdmFsdWVUb0luZGV4KHQpXX0sX3ZhbHVlVG9JbmRleDpmdW5jdGlvbih0KXtpZighdGhpcy5hdHRyRm9yU2VsZWN0ZWQpcmV0dXJuIE51bWJlcih0KTtmb3IodmFyIGUsbj0wO2U9dGhpcy5pdGVtc1tuXTtuKyspaWYodGhpcy5fdmFsdWVGb3JJdGVtKGUpPT10KXJldHVybiBufSxfaW5kZXhUb1ZhbHVlOmZ1bmN0aW9uKHQpe2lmKCF0aGlzLmF0dHJGb3JTZWxlY3RlZClyZXR1cm4gdDt2YXIgZT10aGlzLml0ZW1zW3RdO3JldHVybiBlP3RoaXMuX3ZhbHVlRm9ySXRlbShlKTp2b2lkIDB9LF92YWx1ZUZvckl0ZW06ZnVuY3Rpb24odCl7aWYoIXQpcmV0dXJuIG51bGw7aWYoIXRoaXMuYXR0ckZvclNlbGVjdGVkKXt2YXIgZT10aGlzLmluZGV4T2YodCk7cmV0dXJuLTE9PT1lP251bGw6ZX12YXIgbj10W3N0KHRoaXMuYXR0ckZvclNlbGVjdGVkKV07cmV0dXJuIG51bGwhPW4/bjp0LmdldEF0dHJpYnV0ZSh0aGlzLmF0dHJGb3JTZWxlY3RlZCl9LF9hcHBseVNlbGVjdGlvbjpmdW5jdGlvbih0LGUpe3RoaXMuc2VsZWN0ZWRDbGFzcyYmdGhpcy50b2dnbGVDbGFzcyh0aGlzLnNlbGVjdGVkQ2xhc3MsZSx0KSx0aGlzLnNlbGVjdGVkQXR0cmlidXRlJiZ0aGlzLnRvZ2dsZUF0dHJpYnV0ZSh0aGlzLnNlbGVjdGVkQXR0cmlidXRlLGUsdCksdGhpcy5fc2VsZWN0aW9uQ2hhbmdlKCksdGhpcy5maXJlKCJpcm9uLSIrKGU/InNlbGVjdCI6ImRlc2VsZWN0Iikse2l0ZW06dH0pfSxfc2VsZWN0aW9uQ2hhbmdlOmZ1bmN0aW9uKCl7dGhpcy5fc2V0U2VsZWN0ZWRJdGVtKHRoaXMuX3NlbGVjdGlvbi5nZXQoKSl9LF9vYnNlcnZlSXRlbXM6ZnVuY3Rpb24odCl7cmV0dXJuIGVyKHQpLm9ic2VydmVOb2RlcygoZnVuY3Rpb24odCl7dGhpcy5fdXBkYXRlSXRlbXMoKSx0aGlzLl91cGRhdGVTZWxlY3RlZCgpLHRoaXMuZmlyZSgiaXJvbi1pdGVtcy1jaGFuZ2VkIix0LHtidWJibGVzOiExLGNhbmNlbGFibGU6ITF9KX0pKX0sX2FjdGl2YXRlSGFuZGxlcjpmdW5jdGlvbih0KXtmb3IodmFyIGU9dC50YXJnZXQsbj10aGlzLml0ZW1zO2UmJmUhPXRoaXM7KXt2YXIgaT1uLmluZGV4T2YoZSk7aWYoaT49MCl7dmFyIHI9dGhpcy5faW5kZXhUb1ZhbHVlKGkpO3JldHVybiB2b2lkIHRoaXMuX2l0ZW1BY3RpdmF0ZShyLGUpfWU9ZS5wYXJlbnROb2RlfX0sX2l0ZW1BY3RpdmF0ZTpmdW5jdGlvbih0LGUpe3RoaXMuZmlyZSgiaXJvbi1hY3RpdmF0ZSIse3NlbGVjdGVkOnQsaXRlbTplfSx7Y2FuY2VsYWJsZTohMH0pLmRlZmF1bHRQcmV2ZW50ZWR8fHRoaXMuc2VsZWN0KHQpfX07Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqL2pyKHtfdGVtcGxhdGU6eGVgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoOm5vdChzbG90KTpub3QoLmlyb24tc2VsZWN0ZWQpKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzbG90Pjwvc2xvdD4KYCxpczoiaXJvbi1wYWdlcyIsYmVoYXZpb3JzOltDbyxlYV0scHJvcGVydGllczp7YWN0aXZhdGVFdmVudDp7dHlwZTpTdHJpbmcsdmFsdWU6bnVsbH19LG9ic2VydmVyczpbIl9zZWxlY3RlZFBhZ2VDaGFuZ2VkKHNlbGVjdGVkKSJdLF9zZWxlY3RlZFBhZ2VDaGFuZ2VkOmZ1bmN0aW9uKHQsZSl7dGhpcy5hc3luYyh0aGlzLm5vdGlmeVJlc2l6ZSl9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBuYT14ZWAKPGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBodG1sIHsKCiAgICAgIC0tc2hhZG93LXRyYW5zaXRpb246IHsKICAgICAgICB0cmFuc2l0aW9uOiBib3gtc2hhZG93IDAuMjhzIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1ub25lOiB7CiAgICAgICAgYm94LXNoYWRvdzogbm9uZTsKICAgICAgfTsKCiAgICAgIC8qIGZyb20gaHR0cDovL2NvZGVwZW4uaW8vc2h5bmRtYW4vcGVuL2M1Mzk0ZGRmMmU4YjJhNWM5MTg1OTA0YjU3NDIxY2RiICovCgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tMmRwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCAycHggMnB4IDAgcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDFweCA1cHggMCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi0zZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDNweCA0cHggMCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgMXB4IDhweCAwIHJnYmEoMCwgMCwgMCwgMC4xMiksCiAgICAgICAgICAgICAgICAgICAgMCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTRkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgNHB4IDVweCAwIHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCAxcHggMTBweCAwIHJnYmEoMCwgMCwgMCwgMC4xMiksCiAgICAgICAgICAgICAgICAgICAgMCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTZkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgNnB4IDEwcHggMCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgMXB4IDE4cHggMCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi04ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgM3B4IDE0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMiksCiAgICAgICAgICAgICAgICAgICAgMCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTEyZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDEycHggMTZweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDRweCAyMnB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgNnB4IDdweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi0xNmRwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCAgNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMiksCiAgICAgICAgICAgICAgICAgICAgMCAgOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tMjRkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMiksCiAgICAgICAgICAgICAgICAgICAgMCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgIH07CiAgICB9CiAgPC9zdHlsZT4KPC9jdXN0b20tc3R5bGU+YDtuYS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZGlzcGxheTogbm9uZTsiKSxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKG5hLmNvbnRlbnQpOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgaWE9eGVgCjxkb20tbW9kdWxlIGlkPSJwYXBlci1tYXRlcmlhbC1zdHlsZXMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgaHRtbCB7CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbDogewogICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0xOiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTJkcDsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTI6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tNGRwOwogICAgICAgIH07CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMzogewogICAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi02ZHA7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi00OiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLThkcDsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTU6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMTZkcDsKICAgICAgICB9OwogICAgICB9CiAgICAgIC5wYXBlci1tYXRlcmlhbCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWw7CiAgICAgIH0KICAgICAgLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iMSJdIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMTsKICAgICAgfQogICAgICAucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIyIl0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0yOwogICAgICB9CiAgICAgIC5wYXBlci1tYXRlcmlhbFtlbGV2YXRpb249IjMiXSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTM7CiAgICAgIH0KICAgICAgLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iNCJdIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNDsKICAgICAgfQogICAgICAucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSI1Il0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi01OwogICAgICB9CgogICAgICAvKiBEdXBsaWNhdGUgdGhlIHN0eWxlcyBiZWNhdXNlIG9mIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJjb21wb25lbnRzL3NoYWR5Y3NzL2lzc3Vlcy8xOTMgKi8KICAgICAgOmhvc3QgewogICAgICAgIC0tcGFwZXItbWF0ZXJpYWw6IHsKICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIH07CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMTogewogICAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0yZHA7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0yOiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTRkcDsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTM6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tNmRwOwogICAgICAgIH07CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNDogewogICAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi04ZHA7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi01OiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTE2ZHA7CiAgICAgICAgfTsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWwpIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbDsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIxIl0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMTsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIyIl0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMjsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIzIl0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMzsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSI0Il0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNDsKICAgICAgfQogICAgICA6aG9zdCgucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSI1Il0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+YDtpYS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZGlzcGxheTogbm9uZTsiKSxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGlhLmNvbnRlbnQpOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgcmE9e3Byb3BlcnRpZXM6e2ZvY3VzZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITAscmVhZE9ubHk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxkaXNhYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCxvYnNlcnZlcjoiX2Rpc2FibGVkQ2hhbmdlZCIscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfb2xkVGFiSW5kZXg6e3R5cGU6U3RyaW5nfSxfYm91bmRGb2N1c0JsdXJIYW5kbGVyOnt0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZvY3VzQmx1ckhhbmRsZXIuYmluZCh0aGlzKX19fSxvYnNlcnZlcnM6WyJfY2hhbmdlZENvbnRyb2xTdGF0ZShmb2N1c2VkLCBkaXNhYmxlZCkiXSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXMiLHRoaXMuX2JvdW5kRm9jdXNCbHVySGFuZGxlciwhMCksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLl9ib3VuZEZvY3VzQmx1ckhhbmRsZXIsITApfSxfZm9jdXNCbHVySGFuZGxlcjpmdW5jdGlvbih0KXt0aGlzLl9zZXRGb2N1c2VkKCJmb2N1cyI9PT10LnR5cGUpfSxfZGlzYWJsZWRDaGFuZ2VkOmZ1bmN0aW9uKHQsZSl7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtZGlzYWJsZWQiLHQ/InRydWUiOiJmYWxzZSIpLHRoaXMuc3R5bGUucG9pbnRlckV2ZW50cz10PyJub25lIjoiIix0Pyh0aGlzLl9vbGRUYWJJbmRleD10aGlzLmdldEF0dHJpYnV0ZSgidGFiaW5kZXgiKSx0aGlzLl9zZXRGb2N1c2VkKCExKSx0aGlzLnRhYkluZGV4PS0xLHRoaXMuYmx1cigpKTp2b2lkIDAhPT10aGlzLl9vbGRUYWJJbmRleCYmKG51bGw9PT10aGlzLl9vbGRUYWJJbmRleD90aGlzLnJlbW92ZUF0dHJpYnV0ZSgidGFiaW5kZXgiKTp0aGlzLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLHRoaXMuX29sZFRhYkluZGV4KSl9LF9jaGFuZ2VkQ29udHJvbFN0YXRlOmZ1bmN0aW9uKCl7dGhpcy5fY29udHJvbFN0YXRlQ2hhbmdlZCYmdGhpcy5fY29udHJvbFN0YXRlQ2hhbmdlZCgpfX0sb2E9e3Byb3BlcnRpZXM6e3ByZXNzZWQ6e3R5cGU6Qm9vbGVhbixyZWFkT25seTohMCx2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsb2JzZXJ2ZXI6Il9wcmVzc2VkQ2hhbmdlZCJ9LHRvZ2dsZXM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGFjdGl2ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHBvaW50ZXJEb3duOnt0eXBlOkJvb2xlYW4scmVhZE9ubHk6ITAsdmFsdWU6ITF9LHJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQ6e3R5cGU6Qm9vbGVhbixyZWFkT25seTohMH0sYXJpYUFjdGl2ZUF0dHJpYnV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6ImFyaWEtcHJlc3NlZCIsb2JzZXJ2ZXI6Il9hcmlhQWN0aXZlQXR0cmlidXRlQ2hhbmdlZCJ9fSxsaXN0ZW5lcnM6e2Rvd246Il9kb3duSGFuZGxlciIsdXA6Il91cEhhbmRsZXIiLHRhcDoiX3RhcEhhbmRsZXIifSxvYnNlcnZlcnM6WyJfZm9jdXNDaGFuZ2VkKGZvY3VzZWQpIiwiX2FjdGl2ZUNoYW5nZWQoYWN0aXZlLCBhcmlhQWN0aXZlQXR0cmlidXRlKSJdLGtleUJpbmRpbmdzOnsiZW50ZXI6a2V5ZG93biI6Il9hc3luY0NsaWNrIiwic3BhY2U6a2V5ZG93biI6Il9zcGFjZUtleURvd25IYW5kbGVyIiwic3BhY2U6a2V5dXAiOiJfc3BhY2VLZXlVcEhhbmRsZXIifSxfbW91c2VFdmVudFJlOi9ebW91c2UvLF90YXBIYW5kbGVyOmZ1bmN0aW9uKCl7dGhpcy50b2dnbGVzP3RoaXMuX3VzZXJBY3RpdmF0ZSghdGhpcy5hY3RpdmUpOnRoaXMuYWN0aXZlPSExfSxfZm9jdXNDaGFuZ2VkOmZ1bmN0aW9uKHQpe3RoaXMuX2RldGVjdEtleWJvYXJkRm9jdXModCksdHx8dGhpcy5fc2V0UHJlc3NlZCghMSl9LF9kZXRlY3RLZXlib2FyZEZvY3VzOmZ1bmN0aW9uKHQpe3RoaXMuX3NldFJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQoIXRoaXMucG9pbnRlckRvd24mJnQpfSxfdXNlckFjdGl2YXRlOmZ1bmN0aW9uKHQpe3RoaXMuYWN0aXZlIT09dCYmKHRoaXMuYWN0aXZlPXQsdGhpcy5maXJlKCJjaGFuZ2UiKSl9LF9kb3duSGFuZGxlcjpmdW5jdGlvbih0KXt0aGlzLl9zZXRQb2ludGVyRG93bighMCksdGhpcy5fc2V0UHJlc3NlZCghMCksdGhpcy5fc2V0UmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZCghMSl9LF91cEhhbmRsZXI6ZnVuY3Rpb24oKXt0aGlzLl9zZXRQb2ludGVyRG93bighMSksdGhpcy5fc2V0UHJlc3NlZCghMSl9LF9zcGFjZUtleURvd25IYW5kbGVyOmZ1bmN0aW9uKHQpe3ZhciBlPXQuZGV0YWlsLmtleWJvYXJkRXZlbnQsbj1lcihlKS5sb2NhbFRhcmdldDt0aGlzLmlzTGlnaHREZXNjZW5kYW50KG4pfHwoZS5wcmV2ZW50RGVmYXVsdCgpLGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5fc2V0UHJlc3NlZCghMCkpfSxfc3BhY2VLZXlVcEhhbmRsZXI6ZnVuY3Rpb24odCl7dmFyIGU9ZXIodC5kZXRhaWwua2V5Ym9hcmRFdmVudCkubG9jYWxUYXJnZXQ7dGhpcy5pc0xpZ2h0RGVzY2VuZGFudChlKXx8KHRoaXMucHJlc3NlZCYmdGhpcy5fYXN5bmNDbGljaygpLHRoaXMuX3NldFByZXNzZWQoITEpKX0sX2FzeW5jQ2xpY2s6ZnVuY3Rpb24oKXt0aGlzLmFzeW5jKChmdW5jdGlvbigpe3RoaXMuY2xpY2soKX0pLDEpfSxfcHJlc3NlZENoYW5nZWQ6ZnVuY3Rpb24odCl7dGhpcy5fY2hhbmdlZEJ1dHRvblN0YXRlKCl9LF9hcmlhQWN0aXZlQXR0cmlidXRlQ2hhbmdlZDpmdW5jdGlvbih0LGUpe2UmJmUhPXQmJnRoaXMuaGFzQXR0cmlidXRlKGUpJiZ0aGlzLnJlbW92ZUF0dHJpYnV0ZShlKX0sX2FjdGl2ZUNoYW5nZWQ6ZnVuY3Rpb24odCxlKXt0aGlzLnRvZ2dsZXM/dGhpcy5zZXRBdHRyaWJ1dGUodGhpcy5hcmlhQWN0aXZlQXR0cmlidXRlLHQ/InRydWUiOiJmYWxzZSIpOnRoaXMucmVtb3ZlQXR0cmlidXRlKHRoaXMuYXJpYUFjdGl2ZUF0dHJpYnV0ZSksdGhpcy5fY2hhbmdlZEJ1dHRvblN0YXRlKCl9LF9jb250cm9sU3RhdGVDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5kaXNhYmxlZD90aGlzLl9zZXRQcmVzc2VkKCExKTp0aGlzLl9jaGFuZ2VkQnV0dG9uU3RhdGUoKX0sX2NoYW5nZWRCdXR0b25TdGF0ZTpmdW5jdGlvbigpe3RoaXMuX2J1dHRvblN0YXRlQ2hhbmdlZCYmdGhpcy5fYnV0dG9uU3RhdGVDaGFuZ2VkKCl9fSxhYT1bWG8sb2FdOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE0IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCnZhciBzYT17ZGlzdGFuY2U6ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9dC1uLG89ZS1pO3JldHVybiBNYXRoLnNxcnQocipyK28qbyl9LG5vdzp3aW5kb3cucGVyZm9ybWFuY2UmJndpbmRvdy5wZXJmb3JtYW5jZS5ub3c/d2luZG93LnBlcmZvcm1hbmNlLm5vdy5iaW5kKHdpbmRvdy5wZXJmb3JtYW5jZSk6RGF0ZS5ub3d9O2Z1bmN0aW9uIGxhKHQpe3RoaXMuZWxlbWVudD10LHRoaXMud2lkdGg9dGhpcy5ib3VuZGluZ1JlY3Qud2lkdGgsdGhpcy5oZWlnaHQ9dGhpcy5ib3VuZGluZ1JlY3QuaGVpZ2h0LHRoaXMuc2l6ZT1NYXRoLm1heCh0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KX1mdW5jdGlvbiBjYSh0KXt0aGlzLmVsZW1lbnQ9dCx0aGlzLmNvbG9yPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLmNvbG9yLHRoaXMud2F2ZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLndhdmVDb250YWluZXI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksdGhpcy53YXZlLnN0eWxlLmJhY2tncm91bmRDb2xvcj10aGlzLmNvbG9yLHRoaXMud2F2ZS5jbGFzc0xpc3QuYWRkKCJ3YXZlIiksdGhpcy53YXZlQ29udGFpbmVyLmNsYXNzTGlzdC5hZGQoIndhdmUtY29udGFpbmVyIiksZXIodGhpcy53YXZlQ29udGFpbmVyKS5hcHBlbmRDaGlsZCh0aGlzLndhdmUpLHRoaXMucmVzZXRJbnRlcmFjdGlvblN0YXRlKCl9bGEucHJvdG90eXBlPXtnZXQgYm91bmRpbmdSZWN0KCl7cmV0dXJuIHRoaXMuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX0sZnVydGhlc3RDb3JuZXJEaXN0YW5jZUZyb206ZnVuY3Rpb24odCxlKXt2YXIgbj1zYS5kaXN0YW5jZSh0LGUsMCwwKSxpPXNhLmRpc3RhbmNlKHQsZSx0aGlzLndpZHRoLDApLHI9c2EuZGlzdGFuY2UodCxlLDAsdGhpcy5oZWlnaHQpLG89c2EuZGlzdGFuY2UodCxlLHRoaXMud2lkdGgsdGhpcy5oZWlnaHQpO3JldHVybiBNYXRoLm1heChuLGkscixvKX19LGNhLk1BWF9SQURJVVM9MzAwLGNhLnByb3RvdHlwZT17Z2V0IHJlY2VudGVycygpe3JldHVybiB0aGlzLmVsZW1lbnQucmVjZW50ZXJzfSxnZXQgY2VudGVyKCl7cmV0dXJuIHRoaXMuZWxlbWVudC5jZW50ZXJ9LGdldCBtb3VzZURvd25FbGFwc2VkKCl7dmFyIHQ7cmV0dXJuIHRoaXMubW91c2VEb3duU3RhcnQ/KHQ9c2Eubm93KCktdGhpcy5tb3VzZURvd25TdGFydCx0aGlzLm1vdXNlVXBTdGFydCYmKHQtPXRoaXMubW91c2VVcEVsYXBzZWQpLHQpOjB9LGdldCBtb3VzZVVwRWxhcHNlZCgpe3JldHVybiB0aGlzLm1vdXNlVXBTdGFydD9zYS5ub3coKS10aGlzLm1vdXNlVXBTdGFydDowfSxnZXQgbW91c2VEb3duRWxhcHNlZFNlY29uZHMoKXtyZXR1cm4gdGhpcy5tb3VzZURvd25FbGFwc2VkLzFlM30sZ2V0IG1vdXNlVXBFbGFwc2VkU2Vjb25kcygpe3JldHVybiB0aGlzLm1vdXNlVXBFbGFwc2VkLzFlM30sZ2V0IG1vdXNlSW50ZXJhY3Rpb25TZWNvbmRzKCl7cmV0dXJuIHRoaXMubW91c2VEb3duRWxhcHNlZFNlY29uZHMrdGhpcy5tb3VzZVVwRWxhcHNlZFNlY29uZHN9LGdldCBpbml0aWFsT3BhY2l0eSgpe3JldHVybiB0aGlzLmVsZW1lbnQuaW5pdGlhbE9wYWNpdHl9LGdldCBvcGFjaXR5RGVjYXlWZWxvY2l0eSgpe3JldHVybiB0aGlzLmVsZW1lbnQub3BhY2l0eURlY2F5VmVsb2NpdHl9LGdldCByYWRpdXMoKXt2YXIgdD0xLjEqTWF0aC5taW4oTWF0aC5zcXJ0KHRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aCp0aGlzLmNvbnRhaW5lck1ldHJpY3Mud2lkdGgrdGhpcy5jb250YWluZXJNZXRyaWNzLmhlaWdodCp0aGlzLmNvbnRhaW5lck1ldHJpY3MuaGVpZ2h0KSxjYS5NQVhfUkFESVVTKSs1LGU9dCooMS1NYXRoLnBvdyg4MCwtKHRoaXMubW91c2VJbnRlcmFjdGlvblNlY29uZHMvKDEuMS10L2NhLk1BWF9SQURJVVMqLjIpKSkpO3JldHVybiBNYXRoLmFicyhlKX0sZ2V0IG9wYWNpdHkoKXtyZXR1cm4gdGhpcy5tb3VzZVVwU3RhcnQ/TWF0aC5tYXgoMCx0aGlzLmluaXRpYWxPcGFjaXR5LXRoaXMubW91c2VVcEVsYXBzZWRTZWNvbmRzKnRoaXMub3BhY2l0eURlY2F5VmVsb2NpdHkpOnRoaXMuaW5pdGlhbE9wYWNpdHl9LGdldCBvdXRlck9wYWNpdHkoKXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1pbiguMyp0aGlzLm1vdXNlVXBFbGFwc2VkU2Vjb25kcyx0aGlzLm9wYWNpdHkpKX0sZ2V0IGlzT3BhY2l0eUZ1bGx5RGVjYXllZCgpe3JldHVybiB0aGlzLm9wYWNpdHk8LjAxJiZ0aGlzLnJhZGl1cz49TWF0aC5taW4odGhpcy5tYXhSYWRpdXMsY2EuTUFYX1JBRElVUyl9LGdldCBpc1Jlc3RpbmdBdE1heFJhZGl1cygpe3JldHVybiB0aGlzLm9wYWNpdHk+PXRoaXMuaW5pdGlhbE9wYWNpdHkmJnRoaXMucmFkaXVzPj1NYXRoLm1pbih0aGlzLm1heFJhZGl1cyxjYS5NQVhfUkFESVVTKX0sZ2V0IGlzQW5pbWF0aW9uQ29tcGxldGUoKXtyZXR1cm4gdGhpcy5tb3VzZVVwU3RhcnQ/dGhpcy5pc09wYWNpdHlGdWxseURlY2F5ZWQ6dGhpcy5pc1Jlc3RpbmdBdE1heFJhZGl1c30sZ2V0IHRyYW5zbGF0aW9uRnJhY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4oMSx0aGlzLnJhZGl1cy90aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSoyL01hdGguc3FydCgyKSl9LGdldCB4Tm93KCl7cmV0dXJuIHRoaXMueEVuZD90aGlzLnhTdGFydCt0aGlzLnRyYW5zbGF0aW9uRnJhY3Rpb24qKHRoaXMueEVuZC10aGlzLnhTdGFydCk6dGhpcy54U3RhcnR9LGdldCB5Tm93KCl7cmV0dXJuIHRoaXMueUVuZD90aGlzLnlTdGFydCt0aGlzLnRyYW5zbGF0aW9uRnJhY3Rpb24qKHRoaXMueUVuZC10aGlzLnlTdGFydCk6dGhpcy55U3RhcnR9LGdldCBpc01vdXNlRG93bigpe3JldHVybiB0aGlzLm1vdXNlRG93blN0YXJ0JiYhdGhpcy5tb3VzZVVwU3RhcnR9LHJlc2V0SW50ZXJhY3Rpb25TdGF0ZTpmdW5jdGlvbigpe3RoaXMubWF4UmFkaXVzPTAsdGhpcy5tb3VzZURvd25TdGFydD0wLHRoaXMubW91c2VVcFN0YXJ0PTAsdGhpcy54U3RhcnQ9MCx0aGlzLnlTdGFydD0wLHRoaXMueEVuZD0wLHRoaXMueUVuZD0wLHRoaXMuc2xpZGVEaXN0YW5jZT0wLHRoaXMuY29udGFpbmVyTWV0cmljcz1uZXcgbGEodGhpcy5lbGVtZW50KX0sZHJhdzpmdW5jdGlvbigpe3ZhciB0LGUsbjt0aGlzLndhdmUuc3R5bGUub3BhY2l0eT10aGlzLm9wYWNpdHksdD10aGlzLnJhZGl1cy8odGhpcy5jb250YWluZXJNZXRyaWNzLnNpemUvMiksdGhpcy53YXZlQ29udGFpbmVyLnN0eWxlLndlYmtpdFRyYW5zZm9ybT0idHJhbnNsYXRlKCIrKGU9dGhpcy54Tm93LXRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aC8yKSsicHgsICIrKG49dGhpcy55Tm93LXRoaXMuY29udGFpbmVyTWV0cmljcy5oZWlnaHQvMikrInB4KSIsdGhpcy53YXZlQ29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlM2QoIitlKyJweCwgIituKyJweCwgMCkiLHRoaXMud2F2ZS5zdHlsZS53ZWJraXRUcmFuc2Zvcm09InNjYWxlKCIrdCsiLCIrdCsiKSIsdGhpcy53YXZlLnN0eWxlLnRyYW5zZm9ybT0ic2NhbGUzZCgiK3QrIiwiK3QrIiwxKSJ9LGRvd25BY3Rpb246ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5jb250YWluZXJNZXRyaWNzLndpZHRoLzIsbj10aGlzLmNvbnRhaW5lck1ldHJpY3MuaGVpZ2h0LzI7dGhpcy5yZXNldEludGVyYWN0aW9uU3RhdGUoKSx0aGlzLm1vdXNlRG93blN0YXJ0PXNhLm5vdygpLHRoaXMuY2VudGVyPyh0aGlzLnhTdGFydD1lLHRoaXMueVN0YXJ0PW4sdGhpcy5zbGlkZURpc3RhbmNlPXNhLmRpc3RhbmNlKHRoaXMueFN0YXJ0LHRoaXMueVN0YXJ0LHRoaXMueEVuZCx0aGlzLnlFbmQpKToodGhpcy54U3RhcnQ9dD90LmRldGFpbC54LXRoaXMuY29udGFpbmVyTWV0cmljcy5ib3VuZGluZ1JlY3QubGVmdDp0aGlzLmNvbnRhaW5lck1ldHJpY3Mud2lkdGgvMix0aGlzLnlTdGFydD10P3QuZGV0YWlsLnktdGhpcy5jb250YWluZXJNZXRyaWNzLmJvdW5kaW5nUmVjdC50b3A6dGhpcy5jb250YWluZXJNZXRyaWNzLmhlaWdodC8yKSx0aGlzLnJlY2VudGVycyYmKHRoaXMueEVuZD1lLHRoaXMueUVuZD1uLHRoaXMuc2xpZGVEaXN0YW5jZT1zYS5kaXN0YW5jZSh0aGlzLnhTdGFydCx0aGlzLnlTdGFydCx0aGlzLnhFbmQsdGhpcy55RW5kKSksdGhpcy5tYXhSYWRpdXM9dGhpcy5jb250YWluZXJNZXRyaWNzLmZ1cnRoZXN0Q29ybmVyRGlzdGFuY2VGcm9tKHRoaXMueFN0YXJ0LHRoaXMueVN0YXJ0KSx0aGlzLndhdmVDb250YWluZXIuc3R5bGUudG9wPSh0aGlzLmNvbnRhaW5lck1ldHJpY3MuaGVpZ2h0LXRoaXMuY29udGFpbmVyTWV0cmljcy5zaXplKS8yKyJweCIsdGhpcy53YXZlQ29udGFpbmVyLnN0eWxlLmxlZnQ9KHRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aC10aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSkvMisicHgiLHRoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS53aWR0aD10aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSsicHgiLHRoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS5oZWlnaHQ9dGhpcy5jb250YWluZXJNZXRyaWNzLnNpemUrInB4In0sdXBBY3Rpb246ZnVuY3Rpb24odCl7dGhpcy5pc01vdXNlRG93biYmKHRoaXMubW91c2VVcFN0YXJ0PXNhLm5vdygpKX0scmVtb3ZlOmZ1bmN0aW9uKCl7ZXIoZXIodGhpcy53YXZlQ29udGFpbmVyKS5wYXJlbnROb2RlKS5yZW1vdmVDaGlsZCh0aGlzLndhdmVDb250YWluZXIpfX0sanIoe190ZW1wbGF0ZTp4ZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBib3JkZXItcmFkaXVzOiBpbmhlcml0OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwoKICAgICAgICAvKiBTZWUgUG9seW1lckVsZW1lbnRzL3BhcGVyLWJlaGF2aW9ycy9pc3N1ZXMvMzQuIE9uIG5vbi1DaHJvbWUgYnJvd3NlcnMsCiAgICAgICAgICogY3JlYXRpbmcgYSBub2RlICh3aXRoIGEgcG9zaXRpb246YWJzb2x1dGUpIGluIHRoZSBtaWRkbGUgb2YgYW4gZXZlbnQKICAgICAgICAgKiBoYW5kbGVyICJpbnRlcnJ1cHRzIiB0aGF0IGV2ZW50IGhhbmRsZXIgKHdoaWNoIGhhcHBlbnMgd2hlbiB0aGUKICAgICAgICAgKiByaXBwbGUgaXMgY3JlYXRlZCBvbiBkZW1hbmQpICovCiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFthbmltYXRpbmddKSB7CiAgICAgICAgLyogVGhpcyByZXNvbHZlcyBhIHJlbmRlcmluZyBpc3N1ZSBpbiBDaHJvbWUgKGFzIG9mIDQwKSB3aGVyZSB0aGUKICAgICAgICAgICByaXBwbGUgaXMgbm90IHByb3Blcmx5IGNsaXBwZWQgYnkgaXRzIHBhcmVudCAod2hpY2ggbWF5IGhhdmUKICAgICAgICAgICByb3VuZGVkIGNvcm5lcnMpLiBTZWU6IGh0dHA6Ly9qc2Jpbi5jb20vdGVtZXhhLzQKCiAgICAgICAgICAgTm90ZTogV2Ugb25seSBhcHBseSB0aGlzIHN0eWxlIGNvbmRpdGlvbmFsbHkuIE90aGVyd2lzZSwgdGhlIGJyb3dzZXIKICAgICAgICAgICB3aWxsIGNyZWF0ZSBhIG5ldyBjb21wb3NpdGluZyBsYXllciBmb3IgZXZlcnkgcmlwcGxlIGVsZW1lbnQgb24gdGhlCiAgICAgICAgICAgcGFnZSwgYW5kIHRoYXQgd291bGQgYmUgYmFkLiAqLwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMCwgMCk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUzZCgwLCAwLCAwKTsKICAgICAgfQoKICAgICAgI2JhY2tncm91bmQsCiAgICAgICN3YXZlcywKICAgICAgLndhdmUtY29udGFpbmVyLAogICAgICAud2F2ZSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgI2JhY2tncm91bmQsCiAgICAgIC53YXZlIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICB9CgogICAgICAjd2F2ZXMsCiAgICAgIC53YXZlIHsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAud2F2ZS1jb250YWluZXIsCiAgICAgIC53YXZlIHsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgIH0KCiAgICAgIDpob3N0KC5jaXJjbGUpICNiYWNrZ3JvdW5kLAogICAgICA6aG9zdCguY2lyY2xlKSAjd2F2ZXMgewogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgfQoKICAgICAgOmhvc3QoLmNpcmNsZSkgLndhdmUtY29udGFpbmVyIHsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9ImJhY2tncm91bmQiPjwvZGl2PgogICAgPGRpdiBpZD0id2F2ZXMiPjwvZGl2PgpgLGlzOiJwYXBlci1yaXBwbGUiLGJlaGF2aW9yczpbWG9dLHByb3BlcnRpZXM6e2luaXRpYWxPcGFjaXR5Ont0eXBlOk51bWJlcix2YWx1ZTouMjV9LG9wYWNpdHlEZWNheVZlbG9jaXR5Ont0eXBlOk51bWJlcix2YWx1ZTouOH0scmVjZW50ZXJzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGNlbnRlcjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxyaXBwbGVzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxhbmltYXRpbmc6e3R5cGU6Qm9vbGVhbixyZWFkT25seTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITF9LGhvbGREb3duOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9ob2xkRG93bkNoYW5nZWQifSxub2luazp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfYW5pbWF0aW5nOnt0eXBlOkJvb2xlYW59LF9ib3VuZEFuaW1hdGU6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hbmltYXRlLmJpbmQodGhpcyl9fX0sZ2V0IHRhcmdldCgpe3JldHVybiB0aGlzLmtleUV2ZW50VGFyZ2V0fSxrZXlCaW5kaW5nczp7ImVudGVyOmtleWRvd24iOiJfb25FbnRlcktleWRvd24iLCJzcGFjZTprZXlkb3duIjoiX29uU3BhY2VLZXlkb3duIiwic3BhY2U6a2V5dXAiOiJfb25TcGFjZUtleXVwIn0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLmtleUV2ZW50VGFyZ2V0PTExPT1lcih0aGlzKS5wYXJlbnROb2RlLm5vZGVUeXBlP2VyKHRoaXMpLmdldE93bmVyUm9vdCgpLmhvc3Q6ZXIodGhpcykucGFyZW50Tm9kZTt2YXIgdD10aGlzLmtleUV2ZW50VGFyZ2V0O3RoaXMubGlzdGVuKHQsInVwIiwidWlVcEFjdGlvbiIpLHRoaXMubGlzdGVuKHQsImRvd24iLCJ1aURvd25BY3Rpb24iKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnVubGlzdGVuKHRoaXMua2V5RXZlbnRUYXJnZXQsInVwIiwidWlVcEFjdGlvbiIpLHRoaXMudW5saXN0ZW4odGhpcy5rZXlFdmVudFRhcmdldCwiZG93biIsInVpRG93bkFjdGlvbiIpLHRoaXMua2V5RXZlbnRUYXJnZXQ9bnVsbH0sZ2V0IHNob3VsZEtlZXBBbmltYXRpbmcoKXtmb3IodmFyIHQ9MDt0PHRoaXMucmlwcGxlcy5sZW5ndGg7Kyt0KWlmKCF0aGlzLnJpcHBsZXNbdF0uaXNBbmltYXRpb25Db21wbGV0ZSlyZXR1cm4hMDtyZXR1cm4hMX0sc2ltdWxhdGVkUmlwcGxlOmZ1bmN0aW9uKCl7dGhpcy5kb3duQWN0aW9uKG51bGwpLHRoaXMuYXN5bmMoKGZ1bmN0aW9uKCl7dGhpcy51cEFjdGlvbigpfSksMSl9LHVpRG93bkFjdGlvbjpmdW5jdGlvbih0KXt0aGlzLm5vaW5rfHx0aGlzLmRvd25BY3Rpb24odCl9LGRvd25BY3Rpb246ZnVuY3Rpb24odCl7dGhpcy5ob2xkRG93biYmdGhpcy5yaXBwbGVzLmxlbmd0aD4wfHwodGhpcy5hZGRSaXBwbGUoKS5kb3duQWN0aW9uKHQpLHRoaXMuX2FuaW1hdGluZ3x8KHRoaXMuX2FuaW1hdGluZz0hMCx0aGlzLmFuaW1hdGUoKSkpfSx1aVVwQWN0aW9uOmZ1bmN0aW9uKHQpe3RoaXMubm9pbmt8fHRoaXMudXBBY3Rpb24odCl9LHVwQWN0aW9uOmZ1bmN0aW9uKHQpe3RoaXMuaG9sZERvd258fCh0aGlzLnJpcHBsZXMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7ZS51cEFjdGlvbih0KX0pKSx0aGlzLl9hbmltYXRpbmc9ITAsdGhpcy5hbmltYXRlKCkpfSxvbkFuaW1hdGlvbkNvbXBsZXRlOmZ1bmN0aW9uKCl7dGhpcy5fYW5pbWF0aW5nPSExLHRoaXMuJC5iYWNrZ3JvdW5kLnN0eWxlLmJhY2tncm91bmRDb2xvcj0iIix0aGlzLmZpcmUoInRyYW5zaXRpb25lbmQiKX0sYWRkUmlwcGxlOmZ1bmN0aW9uKCl7dmFyIHQ9bmV3IGNhKHRoaXMpO3JldHVybiBlcih0aGlzLiQud2F2ZXMpLmFwcGVuZENoaWxkKHQud2F2ZUNvbnRhaW5lciksdGhpcy4kLmJhY2tncm91bmQuc3R5bGUuYmFja2dyb3VuZENvbG9yPXQuY29sb3IsdGhpcy5yaXBwbGVzLnB1c2godCksdGhpcy5fc2V0QW5pbWF0aW5nKCEwKSx0fSxyZW1vdmVSaXBwbGU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5yaXBwbGVzLmluZGV4T2YodCk7ZTwwfHwodGhpcy5yaXBwbGVzLnNwbGljZShlLDEpLHQucmVtb3ZlKCksdGhpcy5yaXBwbGVzLmxlbmd0aHx8dGhpcy5fc2V0QW5pbWF0aW5nKCExKSl9LGFuaW1hdGU6ZnVuY3Rpb24oKXtpZih0aGlzLl9hbmltYXRpbmcpe3ZhciB0LGU7Zm9yKHQ9MDt0PHRoaXMucmlwcGxlcy5sZW5ndGg7Kyt0KShlPXRoaXMucmlwcGxlc1t0XSkuZHJhdygpLHRoaXMuJC5iYWNrZ3JvdW5kLnN0eWxlLm9wYWNpdHk9ZS5vdXRlck9wYWNpdHksZS5pc09wYWNpdHlGdWxseURlY2F5ZWQmJiFlLmlzUmVzdGluZ0F0TWF4UmFkaXVzJiZ0aGlzLnJlbW92ZVJpcHBsZShlKTt0aGlzLnNob3VsZEtlZXBBbmltYXRpbmd8fDAhPT10aGlzLnJpcHBsZXMubGVuZ3RoP3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5fYm91bmRBbmltYXRlKTp0aGlzLm9uQW5pbWF0aW9uQ29tcGxldGUoKX19LGFuaW1hdGVSaXBwbGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hbmltYXRlKCl9LF9vbkVudGVyS2V5ZG93bjpmdW5jdGlvbigpe3RoaXMudWlEb3duQWN0aW9uKCksdGhpcy5hc3luYyh0aGlzLnVpVXBBY3Rpb24sMSl9LF9vblNwYWNlS2V5ZG93bjpmdW5jdGlvbigpe3RoaXMudWlEb3duQWN0aW9uKCl9LF9vblNwYWNlS2V5dXA6ZnVuY3Rpb24oKXt0aGlzLnVpVXBBY3Rpb24oKX0sX2hvbGREb3duQ2hhbmdlZDpmdW5jdGlvbih0LGUpe3ZvaWQgMCE9PWUmJih0P3RoaXMuZG93bkFjdGlvbigpOnRoaXMudXBBY3Rpb24oKSl9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCB1YT17cHJvcGVydGllczp7bm9pbms6e3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX25vaW5rQ2hhbmdlZCJ9LF9yaXBwbGVDb250YWluZXI6e3R5cGU6T2JqZWN0fX0sX2J1dHRvblN0YXRlQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuZm9jdXNlZCYmdGhpcy5lbnN1cmVSaXBwbGUoKX0sX2Rvd25IYW5kbGVyOmZ1bmN0aW9uKHQpe29hLl9kb3duSGFuZGxlci5jYWxsKHRoaXMsdCksdGhpcy5wcmVzc2VkJiZ0aGlzLmVuc3VyZVJpcHBsZSh0KX0sZW5zdXJlUmlwcGxlOmZ1bmN0aW9uKHQpe2lmKCF0aGlzLmhhc1JpcHBsZSgpKXt0aGlzLl9yaXBwbGU9dGhpcy5fY3JlYXRlUmlwcGxlKCksdGhpcy5fcmlwcGxlLm5vaW5rPXRoaXMubm9pbms7dmFyIGU9dGhpcy5fcmlwcGxlQ29udGFpbmVyfHx0aGlzLnJvb3Q7aWYoZSYmZXIoZSkuYXBwZW5kQ2hpbGQodGhpcy5fcmlwcGxlKSx0KXt2YXIgbj1lcih0aGlzLl9yaXBwbGVDb250YWluZXJ8fHRoaXMpLGk9ZXIodCkucm9vdFRhcmdldDtuLmRlZXBDb250YWlucyhpKSYmdGhpcy5fcmlwcGxlLnVpRG93bkFjdGlvbih0KX19fSxnZXRSaXBwbGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbnN1cmVSaXBwbGUoKSx0aGlzLl9yaXBwbGV9LGhhc1JpcHBsZTpmdW5jdGlvbigpe3JldHVybiBCb29sZWFuKHRoaXMuX3JpcHBsZSl9LF9jcmVhdGVSaXBwbGU6ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicGFwZXItcmlwcGxlIil9LF9ub2lua0NoYW5nZWQ6ZnVuY3Rpb24odCl7dGhpcy5oYXNSaXBwbGUoKSYmKHRoaXMuX3JpcHBsZS5ub2luaz10KX19LGhhPXtwcm9wZXJ0aWVzOntlbGV2YXRpb246e3R5cGU6TnVtYmVyLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCxyZWFkT25seTohMH19LG9ic2VydmVyczpbIl9jYWxjdWxhdGVFbGV2YXRpb24oZm9jdXNlZCwgZGlzYWJsZWQsIGFjdGl2ZSwgcHJlc3NlZCwgcmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZCkiLCJfY29tcHV0ZUtleWJvYXJkQ2xhc3MocmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZCkiXSxob3N0QXR0cmlidXRlczp7cm9sZToiYnV0dG9uIix0YWJpbmRleDoiMCIsYW5pbWF0ZWQ6ITB9LF9jYWxjdWxhdGVFbGV2YXRpb246ZnVuY3Rpb24oKXt2YXIgdD0xO3RoaXMuZGlzYWJsZWQ/dD0wOnRoaXMuYWN0aXZlfHx0aGlzLnByZXNzZWQ/dD00OnRoaXMucmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZCYmKHQ9MyksdGhpcy5fc2V0RWxldmF0aW9uKHQpfSxfY29tcHV0ZUtleWJvYXJkQ2xhc3M6ZnVuY3Rpb24odCl7dGhpcy50b2dnbGVDbGFzcygia2V5Ym9hcmQtZm9jdXMiLHQpfSxfc3BhY2VLZXlEb3duSGFuZGxlcjpmdW5jdGlvbih0KXtvYS5fc3BhY2VLZXlEb3duSGFuZGxlci5jYWxsKHRoaXMsdCksdGhpcy5oYXNSaXBwbGUoKSYmdGhpcy5nZXRSaXBwbGUoKS5yaXBwbGVzLmxlbmd0aDwxJiZ0aGlzLl9yaXBwbGUudWlEb3duQWN0aW9uKCl9LF9zcGFjZUtleVVwSGFuZGxlcjpmdW5jdGlvbih0KXtvYS5fc3BhY2VLZXlVcEhhbmRsZXIuY2FsbCh0aGlzLHQpLHRoaXMuaGFzUmlwcGxlKCkmJnRoaXMuX3JpcHBsZS51aVVwQWN0aW9uKCl9fSxkYT1bYWEscmEsdWEsaGFdLHBhPXhlYAogIDxzdHlsZSBpbmNsdWRlPSJwYXBlci1tYXRlcmlhbC1zdHlsZXMiPgogICAgLyogTmVlZCB0byBzcGVjaWZ5IHRoZSBzYW1lIHNwZWNpZmljaXR5IGFzIHRoZSBzdHlsZXMgaW1wb3J0ZWQgZnJvbSBwYXBlci1tYXRlcmlhbC4gKi8KICAgIDpob3N0IHsKICAgICAgQGFwcGx5IC0tbGF5b3V0LWlubGluZTsKICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlci1jZW50ZXI7CiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgbWluLXdpZHRoOiA1LjE0ZW07CiAgICAgIG1hcmdpbjogMCAwLjI5ZW07CiAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMCk7CiAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogdHJhbnNwYXJlbnQ7CiAgICAgIGZvbnQ6IGluaGVyaXQ7CiAgICAgIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7CiAgICAgIG91dGxpbmUtd2lkdGg6IDA7CiAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB6LWluZGV4OiAwOwogICAgICBwYWRkaW5nOiAwLjdlbSAwLjU3ZW07CgogICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICBAYXBwbHkgLS1wYXBlci1idXR0b247CiAgICB9CgogICAgOmhvc3QoW2VsZXZhdGlvbj0iMSJdKSB7CiAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0xOwogICAgfQoKICAgIDpob3N0KFtlbGV2YXRpb249IjIiXSkgewogICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMjsKICAgIH0KCiAgICA6aG9zdChbZWxldmF0aW9uPSIzIl0pIHsKICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTM7CiAgICB9CgogICAgOmhvc3QoW2VsZXZhdGlvbj0iNCJdKSB7CiAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi00OwogICAgfQoKICAgIDpob3N0KFtlbGV2YXRpb249IjUiXSkgewogICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNTsKICAgIH0KCiAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICB9CgogICAgOmhvc3QoW3JhaXNlZF0ua2V5Ym9hcmQtZm9jdXMpIHsKICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbi1yYWlzZWQta2V5Ym9hcmQtZm9jdXM7CiAgICB9CgogICAgOmhvc3QoOm5vdChbcmFpc2VkXSkua2V5Ym9hcmQtZm9jdXMpIHsKICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbi1mbGF0LWtleWJvYXJkLWZvY3VzOwogICAgfQoKICAgIDpob3N0KFtkaXNhYmxlZF0pIHsKICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgY29sb3I6ICNhOGE4YTg7CiAgICAgIGN1cnNvcjogYXV0bzsKICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CgogICAgICBAYXBwbHkgLS1wYXBlci1idXR0b24tZGlzYWJsZWQ7CiAgICB9CgogICAgOmhvc3QoW2Rpc2FibGVkXVtyYWlzZWRdKSB7CiAgICAgIGJhY2tncm91bmQ6ICNlYWVhZWE7CiAgICB9CgoKICAgIDpob3N0KFthbmltYXRlZF0pIHsKICAgICAgQGFwcGx5IC0tc2hhZG93LXRyYW5zaXRpb247CiAgICB9CgogICAgcGFwZXItcmlwcGxlIHsKICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWJ1dHRvbi1pbmstY29sb3IpOwogICAgfQogIDwvc3R5bGU+CgogIDxzbG90Pjwvc2xvdD5gOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9wYS5zZXRBdHRyaWJ1dGUoInN0cmlwLXdoaXRlc3BhY2UiLCIiKSxqcih7X3RlbXBsYXRlOnBhLGlzOiJwYXBlci1idXR0b24iLGJlaGF2aW9yczpbZGFdLHByb3BlcnRpZXM6e3JhaXNlZDp7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCx2YWx1ZTohMSxvYnNlcnZlcjoiX2NhbGN1bGF0ZUVsZXZhdGlvbiJ9fSxfY2FsY3VsYXRlRWxldmF0aW9uOmZ1bmN0aW9uKCl7dGhpcy5yYWlzZWQ/aGEuX2NhbGN1bGF0ZUVsZXZhdGlvbi5hcHBseSh0aGlzKTp0aGlzLl9zZXRFbGV2YXRpb24oMCl9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBmYT14ZWAKPGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBodG1sIHsKCiAgICAgIC8qIE1hdGVyaWFsIERlc2lnbiBjb2xvciBwYWxldHRlIGZvciBHb29nbGUgcHJvZHVjdHMgKi8KCiAgICAgIC0tZ29vZ2xlLXJlZC0xMDA6ICNmNGM3YzM7CiAgICAgIC0tZ29vZ2xlLXJlZC0zMDA6ICNlNjdjNzM7CiAgICAgIC0tZ29vZ2xlLXJlZC01MDA6ICNkYjQ0Mzc7CiAgICAgIC0tZ29vZ2xlLXJlZC03MDA6ICNjNTM5Mjk7CgogICAgICAtLWdvb2dsZS1ibHVlLTEwMDogI2M2ZGFmYzsKICAgICAgLS1nb29nbGUtYmx1ZS0zMDA6ICM3YmFhZjc7CiAgICAgIC0tZ29vZ2xlLWJsdWUtNTAwOiAjNDI4NWY0OwogICAgICAtLWdvb2dsZS1ibHVlLTcwMDogIzMzNjdkNjsKCiAgICAgIC0tZ29vZ2xlLWdyZWVuLTEwMDogI2I3ZTFjZDsKICAgICAgLS1nb29nbGUtZ3JlZW4tMzAwOiAjNTdiYjhhOwogICAgICAtLWdvb2dsZS1ncmVlbi01MDA6ICMwZjlkNTg7CiAgICAgIC0tZ29vZ2xlLWdyZWVuLTcwMDogIzBiODA0MzsKCiAgICAgIC0tZ29vZ2xlLXllbGxvdy0xMDA6ICNmY2U4YjI7CiAgICAgIC0tZ29vZ2xlLXllbGxvdy0zMDA6ICNmN2NiNGQ7CiAgICAgIC0tZ29vZ2xlLXllbGxvdy01MDA6ICNmNGI0MDA7CiAgICAgIC0tZ29vZ2xlLXllbGxvdy03MDA6ICNmMDkzMDA7CgogICAgICAtLWdvb2dsZS1ncmV5LTEwMDogI2Y1ZjVmNTsKICAgICAgLS1nb29nbGUtZ3JleS0zMDA6ICNlMGUwZTA7CiAgICAgIC0tZ29vZ2xlLWdyZXktNTAwOiAjOWU5ZTllOwogICAgICAtLWdvb2dsZS1ncmV5LTcwMDogIzYxNjE2MTsKCiAgICAgIC8qIE1hdGVyaWFsIERlc2lnbiBjb2xvciBwYWxldHRlIGZyb20gb25saW5lIHNwZWMgZG9jdW1lbnQgKi8KCiAgICAgIC0tcGFwZXItcmVkLTUwOiAjZmZlYmVlOwogICAgICAtLXBhcGVyLXJlZC0xMDA6ICNmZmNkZDI7CiAgICAgIC0tcGFwZXItcmVkLTIwMDogI2VmOWE5YTsKICAgICAgLS1wYXBlci1yZWQtMzAwOiAjZTU3MzczOwogICAgICAtLXBhcGVyLXJlZC00MDA6ICNlZjUzNTA7CiAgICAgIC0tcGFwZXItcmVkLTUwMDogI2Y0NDMzNjsKICAgICAgLS1wYXBlci1yZWQtNjAwOiAjZTUzOTM1OwogICAgICAtLXBhcGVyLXJlZC03MDA6ICNkMzJmMmY7CiAgICAgIC0tcGFwZXItcmVkLTgwMDogI2M2MjgyODsKICAgICAgLS1wYXBlci1yZWQtOTAwOiAjYjcxYzFjOwogICAgICAtLXBhcGVyLXJlZC1hMTAwOiAjZmY4YTgwOwogICAgICAtLXBhcGVyLXJlZC1hMjAwOiAjZmY1MjUyOwogICAgICAtLXBhcGVyLXJlZC1hNDAwOiAjZmYxNzQ0OwogICAgICAtLXBhcGVyLXJlZC1hNzAwOiAjZDUwMDAwOwoKICAgICAgLS1wYXBlci1waW5rLTUwOiAjZmNlNGVjOwogICAgICAtLXBhcGVyLXBpbmstMTAwOiAjZjhiYmQwOwogICAgICAtLXBhcGVyLXBpbmstMjAwOiAjZjQ4ZmIxOwogICAgICAtLXBhcGVyLXBpbmstMzAwOiAjZjA2MjkyOwogICAgICAtLXBhcGVyLXBpbmstNDAwOiAjZWM0MDdhOwogICAgICAtLXBhcGVyLXBpbmstNTAwOiAjZTkxZTYzOwogICAgICAtLXBhcGVyLXBpbmstNjAwOiAjZDgxYjYwOwogICAgICAtLXBhcGVyLXBpbmstNzAwOiAjYzIxODViOwogICAgICAtLXBhcGVyLXBpbmstODAwOiAjYWQxNDU3OwogICAgICAtLXBhcGVyLXBpbmstOTAwOiAjODgwZTRmOwogICAgICAtLXBhcGVyLXBpbmstYTEwMDogI2ZmODBhYjsKICAgICAgLS1wYXBlci1waW5rLWEyMDA6ICNmZjQwODE7CiAgICAgIC0tcGFwZXItcGluay1hNDAwOiAjZjUwMDU3OwogICAgICAtLXBhcGVyLXBpbmstYTcwMDogI2M1MTE2MjsKCiAgICAgIC0tcGFwZXItcHVycGxlLTUwOiAjZjNlNWY1OwogICAgICAtLXBhcGVyLXB1cnBsZS0xMDA6ICNlMWJlZTc7CiAgICAgIC0tcGFwZXItcHVycGxlLTIwMDogI2NlOTNkODsKICAgICAgLS1wYXBlci1wdXJwbGUtMzAwOiAjYmE2OGM4OwogICAgICAtLXBhcGVyLXB1cnBsZS00MDA6ICNhYjQ3YmM7CiAgICAgIC0tcGFwZXItcHVycGxlLTUwMDogIzljMjdiMDsKICAgICAgLS1wYXBlci1wdXJwbGUtNjAwOiAjOGUyNGFhOwogICAgICAtLXBhcGVyLXB1cnBsZS03MDA6ICM3YjFmYTI7CiAgICAgIC0tcGFwZXItcHVycGxlLTgwMDogIzZhMWI5YTsKICAgICAgLS1wYXBlci1wdXJwbGUtOTAwOiAjNGExNDhjOwogICAgICAtLXBhcGVyLXB1cnBsZS1hMTAwOiAjZWE4MGZjOwogICAgICAtLXBhcGVyLXB1cnBsZS1hMjAwOiAjZTA0MGZiOwogICAgICAtLXBhcGVyLXB1cnBsZS1hNDAwOiAjZDUwMGY5OwogICAgICAtLXBhcGVyLXB1cnBsZS1hNzAwOiAjYWEwMGZmOwoKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS01MDogI2VkZTdmNjsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS0xMDA6ICNkMWM0ZTk7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtMjAwOiAjYjM5ZGRiOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTMwMDogIzk1NzVjZDsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS00MDA6ICM3ZTU3YzI7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtNTAwOiAjNjczYWI3OwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTYwMDogIzVlMzViMTsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS03MDA6ICM1MTJkYTg7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtODAwOiAjNDUyN2EwOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTkwMDogIzMxMWI5MjsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS1hMTAwOiAjYjM4OGZmOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLWEyMDA6ICM3YzRkZmY7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtYTQwMDogIzY1MWZmZjsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS1hNzAwOiAjNjIwMGVhOwoKICAgICAgLS1wYXBlci1pbmRpZ28tNTA6ICNlOGVhZjY7CiAgICAgIC0tcGFwZXItaW5kaWdvLTEwMDogI2M1Y2FlOTsKICAgICAgLS1wYXBlci1pbmRpZ28tMjAwOiAjOWZhOGRhOwogICAgICAtLXBhcGVyLWluZGlnby0zMDA6ICM3OTg2Y2I7CiAgICAgIC0tcGFwZXItaW5kaWdvLTQwMDogIzVjNmJjMDsKICAgICAgLS1wYXBlci1pbmRpZ28tNTAwOiAjM2Y1MWI1OwogICAgICAtLXBhcGVyLWluZGlnby02MDA6ICMzOTQ5YWI7CiAgICAgIC0tcGFwZXItaW5kaWdvLTcwMDogIzMwM2Y5ZjsKICAgICAgLS1wYXBlci1pbmRpZ28tODAwOiAjMjgzNTkzOwogICAgICAtLXBhcGVyLWluZGlnby05MDA6ICMxYTIzN2U7CiAgICAgIC0tcGFwZXItaW5kaWdvLWExMDA6ICM4YzllZmY7CiAgICAgIC0tcGFwZXItaW5kaWdvLWEyMDA6ICM1MzZkZmU7CiAgICAgIC0tcGFwZXItaW5kaWdvLWE0MDA6ICMzZDVhZmU7CiAgICAgIC0tcGFwZXItaW5kaWdvLWE3MDA6ICMzMDRmZmU7CgogICAgICAtLXBhcGVyLWJsdWUtNTA6ICNlM2YyZmQ7CiAgICAgIC0tcGFwZXItYmx1ZS0xMDA6ICNiYmRlZmI7CiAgICAgIC0tcGFwZXItYmx1ZS0yMDA6ICM5MGNhZjk7CiAgICAgIC0tcGFwZXItYmx1ZS0zMDA6ICM2NGI1ZjY7CiAgICAgIC0tcGFwZXItYmx1ZS00MDA6ICM0MmE1ZjU7CiAgICAgIC0tcGFwZXItYmx1ZS01MDA6ICMyMTk2ZjM7CiAgICAgIC0tcGFwZXItYmx1ZS02MDA6ICMxZTg4ZTU7CiAgICAgIC0tcGFwZXItYmx1ZS03MDA6ICMxOTc2ZDI7CiAgICAgIC0tcGFwZXItYmx1ZS04MDA6ICMxNTY1YzA7CiAgICAgIC0tcGFwZXItYmx1ZS05MDA6ICMwZDQ3YTE7CiAgICAgIC0tcGFwZXItYmx1ZS1hMTAwOiAjODJiMWZmOwogICAgICAtLXBhcGVyLWJsdWUtYTIwMDogIzQ0OGFmZjsKICAgICAgLS1wYXBlci1ibHVlLWE0MDA6ICMyOTc5ZmY7CiAgICAgIC0tcGFwZXItYmx1ZS1hNzAwOiAjMjk2MmZmOwoKICAgICAgLS1wYXBlci1saWdodC1ibHVlLTUwOiAjZTFmNWZlOwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtMTAwOiAjYjNlNWZjOwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtMjAwOiAjODFkNGZhOwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtMzAwOiAjNGZjM2Y3OwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtNDAwOiAjMjliNmY2OwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtNTAwOiAjMDNhOWY0OwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtNjAwOiAjMDM5YmU1OwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtNzAwOiAjMDI4OGQxOwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtODAwOiAjMDI3N2JkOwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtOTAwOiAjMDE1NzliOwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtYTEwMDogIzgwZDhmZjsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLWEyMDA6ICM0MGM0ZmY7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS1hNDAwOiAjMDBiMGZmOwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtYTcwMDogIzAwOTFlYTsKCiAgICAgIC0tcGFwZXItY3lhbi01MDogI2UwZjdmYTsKICAgICAgLS1wYXBlci1jeWFuLTEwMDogI2IyZWJmMjsKICAgICAgLS1wYXBlci1jeWFuLTIwMDogIzgwZGVlYTsKICAgICAgLS1wYXBlci1jeWFuLTMwMDogIzRkZDBlMTsKICAgICAgLS1wYXBlci1jeWFuLTQwMDogIzI2YzZkYTsKICAgICAgLS1wYXBlci1jeWFuLTUwMDogIzAwYmNkNDsKICAgICAgLS1wYXBlci1jeWFuLTYwMDogIzAwYWNjMTsKICAgICAgLS1wYXBlci1jeWFuLTcwMDogIzAwOTdhNzsKICAgICAgLS1wYXBlci1jeWFuLTgwMDogIzAwODM4ZjsKICAgICAgLS1wYXBlci1jeWFuLTkwMDogIzAwNjA2NDsKICAgICAgLS1wYXBlci1jeWFuLWExMDA6ICM4NGZmZmY7CiAgICAgIC0tcGFwZXItY3lhbi1hMjAwOiAjMThmZmZmOwogICAgICAtLXBhcGVyLWN5YW4tYTQwMDogIzAwZTVmZjsKICAgICAgLS1wYXBlci1jeWFuLWE3MDA6ICMwMGI4ZDQ7CgogICAgICAtLXBhcGVyLXRlYWwtNTA6ICNlMGYyZjE7CiAgICAgIC0tcGFwZXItdGVhbC0xMDA6ICNiMmRmZGI7CiAgICAgIC0tcGFwZXItdGVhbC0yMDA6ICM4MGNiYzQ7CiAgICAgIC0tcGFwZXItdGVhbC0zMDA6ICM0ZGI2YWM7CiAgICAgIC0tcGFwZXItdGVhbC00MDA6ICMyNmE2OWE7CiAgICAgIC0tcGFwZXItdGVhbC01MDA6ICMwMDk2ODg7CiAgICAgIC0tcGFwZXItdGVhbC02MDA6ICMwMDg5N2I7CiAgICAgIC0tcGFwZXItdGVhbC03MDA6ICMwMDc5NmI7CiAgICAgIC0tcGFwZXItdGVhbC04MDA6ICMwMDY5NWM7CiAgICAgIC0tcGFwZXItdGVhbC05MDA6ICMwMDRkNDA7CiAgICAgIC0tcGFwZXItdGVhbC1hMTAwOiAjYTdmZmViOwogICAgICAtLXBhcGVyLXRlYWwtYTIwMDogIzY0ZmZkYTsKICAgICAgLS1wYXBlci10ZWFsLWE0MDA6ICMxZGU5YjY7CiAgICAgIC0tcGFwZXItdGVhbC1hNzAwOiAjMDBiZmE1OwoKICAgICAgLS1wYXBlci1ncmVlbi01MDogI2U4ZjVlOTsKICAgICAgLS1wYXBlci1ncmVlbi0xMDA6ICNjOGU2Yzk7CiAgICAgIC0tcGFwZXItZ3JlZW4tMjAwOiAjYTVkNmE3OwogICAgICAtLXBhcGVyLWdyZWVuLTMwMDogIzgxYzc4NDsKICAgICAgLS1wYXBlci1ncmVlbi00MDA6ICM2NmJiNmE7CiAgICAgIC0tcGFwZXItZ3JlZW4tNTAwOiAjNGNhZjUwOwogICAgICAtLXBhcGVyLWdyZWVuLTYwMDogIzQzYTA0NzsKICAgICAgLS1wYXBlci1ncmVlbi03MDA6ICMzODhlM2M7CiAgICAgIC0tcGFwZXItZ3JlZW4tODAwOiAjMmU3ZDMyOwogICAgICAtLXBhcGVyLWdyZWVuLTkwMDogIzFiNWUyMDsKICAgICAgLS1wYXBlci1ncmVlbi1hMTAwOiAjYjlmNmNhOwogICAgICAtLXBhcGVyLWdyZWVuLWEyMDA6ICM2OWYwYWU7CiAgICAgIC0tcGFwZXItZ3JlZW4tYTQwMDogIzAwZTY3NjsKICAgICAgLS1wYXBlci1ncmVlbi1hNzAwOiAjMDBjODUzOwoKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi01MDogI2YxZjhlOTsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi0xMDA6ICNkY2VkYzg7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tMjAwOiAjYzVlMWE1OwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTMwMDogI2FlZDU4MTsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi00MDA6ICM5Y2NjNjU7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tNTAwOiAjOGJjMzRhOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTYwMDogIzdjYjM0MjsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi03MDA6ICM2ODlmMzg7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tODAwOiAjNTU4YjJmOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTkwMDogIzMzNjkxZTsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi1hMTAwOiAjY2NmZjkwOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLWEyMDA6ICNiMmZmNTk7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tYTQwMDogIzc2ZmYwMzsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi1hNzAwOiAjNjRkZDE3OwoKICAgICAgLS1wYXBlci1saW1lLTUwOiAjZjlmYmU3OwogICAgICAtLXBhcGVyLWxpbWUtMTAwOiAjZjBmNGMzOwogICAgICAtLXBhcGVyLWxpbWUtMjAwOiAjZTZlZTljOwogICAgICAtLXBhcGVyLWxpbWUtMzAwOiAjZGNlNzc1OwogICAgICAtLXBhcGVyLWxpbWUtNDAwOiAjZDRlMTU3OwogICAgICAtLXBhcGVyLWxpbWUtNTAwOiAjY2RkYzM5OwogICAgICAtLXBhcGVyLWxpbWUtNjAwOiAjYzBjYTMzOwogICAgICAtLXBhcGVyLWxpbWUtNzAwOiAjYWZiNDJiOwogICAgICAtLXBhcGVyLWxpbWUtODAwOiAjOWU5ZDI0OwogICAgICAtLXBhcGVyLWxpbWUtOTAwOiAjODI3NzE3OwogICAgICAtLXBhcGVyLWxpbWUtYTEwMDogI2Y0ZmY4MTsKICAgICAgLS1wYXBlci1saW1lLWEyMDA6ICNlZWZmNDE7CiAgICAgIC0tcGFwZXItbGltZS1hNDAwOiAjYzZmZjAwOwogICAgICAtLXBhcGVyLWxpbWUtYTcwMDogI2FlZWEwMDsKCiAgICAgIC0tcGFwZXIteWVsbG93LTUwOiAjZmZmZGU3OwogICAgICAtLXBhcGVyLXllbGxvdy0xMDA6ICNmZmY5YzQ7CiAgICAgIC0tcGFwZXIteWVsbG93LTIwMDogI2ZmZjU5ZDsKICAgICAgLS1wYXBlci15ZWxsb3ctMzAwOiAjZmZmMTc2OwogICAgICAtLXBhcGVyLXllbGxvdy00MDA6ICNmZmVlNTg7CiAgICAgIC0tcGFwZXIteWVsbG93LTUwMDogI2ZmZWIzYjsKICAgICAgLS1wYXBlci15ZWxsb3ctNjAwOiAjZmRkODM1OwogICAgICAtLXBhcGVyLXllbGxvdy03MDA6ICNmYmMwMmQ7CiAgICAgIC0tcGFwZXIteWVsbG93LTgwMDogI2Y5YTgyNTsKICAgICAgLS1wYXBlci15ZWxsb3ctOTAwOiAjZjU3ZjE3OwogICAgICAtLXBhcGVyLXllbGxvdy1hMTAwOiAjZmZmZjhkOwogICAgICAtLXBhcGVyLXllbGxvdy1hMjAwOiAjZmZmZjAwOwogICAgICAtLXBhcGVyLXllbGxvdy1hNDAwOiAjZmZlYTAwOwogICAgICAtLXBhcGVyLXllbGxvdy1hNzAwOiAjZmZkNjAwOwoKICAgICAgLS1wYXBlci1hbWJlci01MDogI2ZmZjhlMTsKICAgICAgLS1wYXBlci1hbWJlci0xMDA6ICNmZmVjYjM7CiAgICAgIC0tcGFwZXItYW1iZXItMjAwOiAjZmZlMDgyOwogICAgICAtLXBhcGVyLWFtYmVyLTMwMDogI2ZmZDU0ZjsKICAgICAgLS1wYXBlci1hbWJlci00MDA6ICNmZmNhMjg7CiAgICAgIC0tcGFwZXItYW1iZXItNTAwOiAjZmZjMTA3OwogICAgICAtLXBhcGVyLWFtYmVyLTYwMDogI2ZmYjMwMDsKICAgICAgLS1wYXBlci1hbWJlci03MDA6ICNmZmEwMDA7CiAgICAgIC0tcGFwZXItYW1iZXItODAwOiAjZmY4ZjAwOwogICAgICAtLXBhcGVyLWFtYmVyLTkwMDogI2ZmNmYwMDsKICAgICAgLS1wYXBlci1hbWJlci1hMTAwOiAjZmZlNTdmOwogICAgICAtLXBhcGVyLWFtYmVyLWEyMDA6ICNmZmQ3NDA7CiAgICAgIC0tcGFwZXItYW1iZXItYTQwMDogI2ZmYzQwMDsKICAgICAgLS1wYXBlci1hbWJlci1hNzAwOiAjZmZhYjAwOwoKICAgICAgLS1wYXBlci1vcmFuZ2UtNTA6ICNmZmYzZTA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTEwMDogI2ZmZTBiMjsKICAgICAgLS1wYXBlci1vcmFuZ2UtMjAwOiAjZmZjYzgwOwogICAgICAtLXBhcGVyLW9yYW5nZS0zMDA6ICNmZmI3NGQ7CiAgICAgIC0tcGFwZXItb3JhbmdlLTQwMDogI2ZmYTcyNjsKICAgICAgLS1wYXBlci1vcmFuZ2UtNTAwOiAjZmY5ODAwOwogICAgICAtLXBhcGVyLW9yYW5nZS02MDA6ICNmYjhjMDA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTcwMDogI2Y1N2MwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtODAwOiAjZWY2YzAwOwogICAgICAtLXBhcGVyLW9yYW5nZS05MDA6ICNlNjUxMDA7CiAgICAgIC0tcGFwZXItb3JhbmdlLWExMDA6ICNmZmQxODA7CiAgICAgIC0tcGFwZXItb3JhbmdlLWEyMDA6ICNmZmFiNDA7CiAgICAgIC0tcGFwZXItb3JhbmdlLWE0MDA6ICNmZjkxMDA7CiAgICAgIC0tcGFwZXItb3JhbmdlLWE3MDA6ICNmZjY1MDA7CgogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTUwOiAjZmJlOWU3OwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTEwMDogI2ZmY2NiYzsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS0yMDA6ICNmZmFiOTE7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtMzAwOiAjZmY4YTY1OwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTQwMDogI2ZmNzA0MzsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS01MDA6ICNmZjU3MjI7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNjAwOiAjZjQ1MTFlOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTcwMDogI2U2NGExOTsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS04MDA6ICNkODQzMTU7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtOTAwOiAjYmYzNjBjOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLWExMDA6ICNmZjllODA7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtYTIwMDogI2ZmNmU0MDsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS1hNDAwOiAjZmYzZDAwOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLWE3MDA6ICNkZDJjMDA7CgogICAgICAtLXBhcGVyLWJyb3duLTUwOiAjZWZlYmU5OwogICAgICAtLXBhcGVyLWJyb3duLTEwMDogI2Q3Y2NjODsKICAgICAgLS1wYXBlci1icm93bi0yMDA6ICNiY2FhYTQ7CiAgICAgIC0tcGFwZXItYnJvd24tMzAwOiAjYTE4ODdmOwogICAgICAtLXBhcGVyLWJyb3duLTQwMDogIzhkNmU2MzsKICAgICAgLS1wYXBlci1icm93bi01MDA6ICM3OTU1NDg7CiAgICAgIC0tcGFwZXItYnJvd24tNjAwOiAjNmQ0YzQxOwogICAgICAtLXBhcGVyLWJyb3duLTcwMDogIzVkNDAzNzsKICAgICAgLS1wYXBlci1icm93bi04MDA6ICM0ZTM0MmU7CiAgICAgIC0tcGFwZXItYnJvd24tOTAwOiAjM2UyNzIzOwoKICAgICAgLS1wYXBlci1ncmV5LTUwOiAjZmFmYWZhOwogICAgICAtLXBhcGVyLWdyZXktMTAwOiAjZjVmNWY1OwogICAgICAtLXBhcGVyLWdyZXktMjAwOiAjZWVlZWVlOwogICAgICAtLXBhcGVyLWdyZXktMzAwOiAjZTBlMGUwOwogICAgICAtLXBhcGVyLWdyZXktNDAwOiAjYmRiZGJkOwogICAgICAtLXBhcGVyLWdyZXktNTAwOiAjOWU5ZTllOwogICAgICAtLXBhcGVyLWdyZXktNjAwOiAjNzU3NTc1OwogICAgICAtLXBhcGVyLWdyZXktNzAwOiAjNjE2MTYxOwogICAgICAtLXBhcGVyLWdyZXktODAwOiAjNDI0MjQyOwogICAgICAtLXBhcGVyLWdyZXktOTAwOiAjMjEyMTIxOwoKICAgICAgLS1wYXBlci1ibHVlLWdyZXktNTA6ICNlY2VmZjE7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTEwMDogI2NmZDhkYzsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktMjAwOiAjYjBiZWM1OwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS0zMDA6ICM5MGE0YWU7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTQwMDogIzc4OTA5YzsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktNTAwOiAjNjA3ZDhiOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS02MDA6ICM1NDZlN2E7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTcwMDogIzQ1NWE2NDsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktODAwOiAjMzc0NzRmOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS05MDA6ICMyNjMyMzg7CgogICAgICAvKiBvcGFjaXR5IGZvciBkYXJrIHRleHQgb24gYSBsaWdodCBiYWNrZ3JvdW5kICovCiAgICAgIC0tZGFyay1kaXZpZGVyLW9wYWNpdHk6IDAuMTI7CiAgICAgIC0tZGFyay1kaXNhYmxlZC1vcGFjaXR5OiAwLjM4OyAvKiBvciBoaW50IHRleHQgb3IgaWNvbiAqLwogICAgICAtLWRhcmstc2Vjb25kYXJ5LW9wYWNpdHk6IDAuNTQ7CiAgICAgIC0tZGFyay1wcmltYXJ5LW9wYWNpdHk6IDAuODc7CgogICAgICAvKiBvcGFjaXR5IGZvciBsaWdodCB0ZXh0IG9uIGEgZGFyayBiYWNrZ3JvdW5kICovCiAgICAgIC0tbGlnaHQtZGl2aWRlci1vcGFjaXR5OiAwLjEyOwogICAgICAtLWxpZ2h0LWRpc2FibGVkLW9wYWNpdHk6IDAuMzsgLyogb3IgaGludCB0ZXh0IG9yIGljb24gKi8KICAgICAgLS1saWdodC1zZWNvbmRhcnktb3BhY2l0eTogMC43OwogICAgICAtLWxpZ2h0LXByaW1hcnktb3BhY2l0eTogMS4wOwoKICAgIH0KCiAgPC9zdHlsZT4KPC9jdXN0b20tc3R5bGU+CmA7ZmEuc2V0QXR0cmlidXRlKCJzdHlsZSIsImRpc3BsYXk6IG5vbmU7IiksZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChmYS5jb250ZW50KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IG1hPXhlYAo8Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIGh0bWwgewogICAgICAvKgogICAgICAgKiBZb3UgY2FuIHVzZSB0aGVzZSBnZW5lcmljIHZhcmlhYmxlcyBpbiB5b3VyIGVsZW1lbnRzIGZvciBlYXN5IHRoZW1pbmcuCiAgICAgICAqIEZvciBleGFtcGxlLCBpZiBhbGwgeW91ciBlbGVtZW50cyB1c2UgXGAtLXByaW1hcnktdGV4dC1jb2xvclxgIGFzIGl0cyBtYWluCiAgICAgICAqIGNvbG9yLCB0aGVuIHN3aXRjaGluZyBmcm9tIGEgbGlnaHQgdG8gYSBkYXJrIHRoZW1lIGlzIGp1c3QgYSBtYXR0ZXIgb2YKICAgICAgICogY2hhbmdpbmcgdGhlIHZhbHVlIG9mIFxgLS1wcmltYXJ5LXRleHQtY29sb3JcYCBpbiB5b3VyIGFwcGxpY2F0aW9uLgogICAgICAgKi8KICAgICAgLS1wcmltYXJ5LXRleHQtY29sb3I6IHZhcigtLWxpZ2h0LXRoZW1lLXRleHQtY29sb3IpOwogICAgICAtLXByaW1hcnktYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbGlnaHQtdGhlbWUtYmFja2dyb3VuZC1jb2xvcik7CiAgICAgIC0tc2Vjb25kYXJ5LXRleHQtY29sb3I6IHZhcigtLWxpZ2h0LXRoZW1lLXNlY29uZGFyeS1jb2xvcik7CiAgICAgIC0tZGlzYWJsZWQtdGV4dC1jb2xvcjogdmFyKC0tbGlnaHQtdGhlbWUtZGlzYWJsZWQtY29sb3IpOwogICAgICAtLWRpdmlkZXItY29sb3I6IHZhcigtLWxpZ2h0LXRoZW1lLWRpdmlkZXItY29sb3IpOwogICAgICAtLWVycm9yLWNvbG9yOiB2YXIoLS1wYXBlci1kZWVwLW9yYW5nZS1hNzAwKTsKCiAgICAgIC8qCiAgICAgICAqIFByaW1hcnkgYW5kIGFjY2VudCBjb2xvcnMuIEFsc28gc2VlIGNvbG9yLmpzIGZvciBtb3JlIGNvbG9ycy4KICAgICAgICovCiAgICAgIC0tcHJpbWFyeS1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTUwMCk7CiAgICAgIC0tbGlnaHQtcHJpbWFyeS1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTEwMCk7CiAgICAgIC0tZGFyay1wcmltYXJ5LWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tNzAwKTsKCiAgICAgIC0tYWNjZW50LWNvbG9yOiB2YXIoLS1wYXBlci1waW5rLWEyMDApOwogICAgICAtLWxpZ2h0LWFjY2VudC1jb2xvcjogdmFyKC0tcGFwZXItcGluay1hMTAwKTsKICAgICAgLS1kYXJrLWFjY2VudC1jb2xvcjogdmFyKC0tcGFwZXItcGluay1hNDAwKTsKCgogICAgICAvKgogICAgICAgKiBNYXRlcmlhbCBEZXNpZ24gTGlnaHQgYmFja2dyb3VuZCB0aGVtZQogICAgICAgKi8KICAgICAgLS1saWdodC10aGVtZS1iYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwogICAgICAtLWxpZ2h0LXRoZW1lLWJhc2UtY29sb3I6ICMwMDAwMDA7CiAgICAgIC0tbGlnaHQtdGhlbWUtdGV4dC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS05MDApOwogICAgICAtLWxpZ2h0LXRoZW1lLXNlY29uZGFyeS1jb2xvcjogIzczNzM3MzsgIC8qIGZvciBzZWNvbmRhcnkgdGV4dCBhbmQgaWNvbnMgKi8KICAgICAgLS1saWdodC10aGVtZS1kaXNhYmxlZC1jb2xvcjogIzliOWI5YjsgIC8qIGRpc2FibGVkL2hpbnQgdGV4dCAqLwogICAgICAtLWxpZ2h0LXRoZW1lLWRpdmlkZXItY29sb3I6ICNkYmRiZGI7CgogICAgICAvKgogICAgICAgKiBNYXRlcmlhbCBEZXNpZ24gRGFyayBiYWNrZ3JvdW5kIHRoZW1lCiAgICAgICAqLwogICAgICAtLWRhcmstdGhlbWUtYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS05MDApOwogICAgICAtLWRhcmstdGhlbWUtYmFzZS1jb2xvcjogI2ZmZmZmZjsKICAgICAgLS1kYXJrLXRoZW1lLXRleHQtY29sb3I6ICNmZmZmZmY7CiAgICAgIC0tZGFyay10aGVtZS1zZWNvbmRhcnktY29sb3I6ICNiY2JjYmM7ICAvKiBmb3Igc2Vjb25kYXJ5IHRleHQgYW5kIGljb25zICovCiAgICAgIC0tZGFyay10aGVtZS1kaXNhYmxlZC1jb2xvcjogIzY0NjQ2NDsgIC8qIGRpc2FibGVkL2hpbnQgdGV4dCAqLwogICAgICAtLWRhcmstdGhlbWUtZGl2aWRlci1jb2xvcjogIzNjM2MzYzsKCiAgICAgIC8qCiAgICAgICAqIERlcHJlY2F0ZWQgdmFsdWVzIGJlY2F1c2Ugb2YgdGhlaXIgY29uZnVzaW5nIG5hbWVzLgogICAgICAgKi8KICAgICAgLS10ZXh0LXByaW1hcnktY29sb3I6IHZhcigtLWRhcmstdGhlbWUtdGV4dC1jb2xvcik7CiAgICAgIC0tZGVmYXVsdC1wcmltYXJ5LWNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yKTsKICAgIH0KICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT5gO21hLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJkaXNwbGF5OiBub25lOyIpLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobWEuY29udGVudCk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBnYT17cHJvcGVydGllczp7bmFtZTp7dHlwZTpTdHJpbmd9LHZhbHVlOntub3RpZnk6ITAsdHlwZTpTdHJpbmd9LHJlcXVpcmVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxhdHRhY2hlZDpmdW5jdGlvbigpe30sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt9fTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovbGV0IF9hPW51bGw7Y29uc3QgeWE9e3Byb3BlcnRpZXM6e3ZhbGlkYXRvcjp7dHlwZTpTdHJpbmd9LGludmFsaWQ6e25vdGlmeTohMCxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfaW52YWxpZENoYW5nZWQifX0scmVnaXN0ZXJlZDpmdW5jdGlvbigpe19hPW5ldyBObyh7dHlwZToidmFsaWRhdG9yIn0pfSxfaW52YWxpZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmludmFsaWQ/dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtaW52YWxpZCIsInRydWUiKTp0aGlzLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1pbnZhbGlkIil9LGdldCBfdmFsaWRhdG9yKCl7cmV0dXJuIF9hJiZfYS5ieUtleSh0aGlzLnZhbGlkYXRvcil9LGhhc1ZhbGlkYXRvcjpmdW5jdGlvbigpe3JldHVybiBudWxsIT10aGlzLl92YWxpZGF0b3J9LHZhbGlkYXRlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmludmFsaWQ9dm9pZCAwPT09dCYmdm9pZCAwIT09dGhpcy52YWx1ZT8hdGhpcy5fZ2V0VmFsaWRpdHkodGhpcy52YWx1ZSk6IXRoaXMuX2dldFZhbGlkaXR5KHQpLCF0aGlzLmludmFsaWR9LF9nZXRWYWxpZGl0eTpmdW5jdGlvbih0KXtyZXR1cm4hdGhpcy5oYXNWYWxpZGF0b3IoKXx8dGhpcy5fdmFsaWRhdG9yLnZhbGlkYXRlKHQpfX0sdmE9e3Byb3BlcnRpZXM6e2NoZWNrZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsbm90aWZ5OiEwLG9ic2VydmVyOiJfY2hlY2tlZENoYW5nZWQifSx0b2dnbGVzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwfSx2YWx1ZTp7dHlwZTpTdHJpbmcsdmFsdWU6Im9uIixvYnNlcnZlcjoiX3ZhbHVlQ2hhbmdlZCJ9fSxvYnNlcnZlcnM6WyJfcmVxdWlyZWRDaGFuZ2VkKHJlcXVpcmVkKSJdLGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9oYXNJcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvcj0hMH0sX2dldFZhbGlkaXR5OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmRpc2FibGVkfHwhdGhpcy5yZXF1aXJlZHx8dGhpcy5jaGVja2VkfSxfcmVxdWlyZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5yZXF1aXJlZD90aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1yZXF1aXJlZCIsInRydWUiKTp0aGlzLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1yZXF1aXJlZCIpfSxfY2hlY2tlZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmFjdGl2ZT10aGlzLmNoZWNrZWQsdGhpcy5maXJlKCJpcm9uLWNoYW5nZSIpfSxfdmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKCl7bnVsbD09dGhpcy52YWx1ZSYmKHRoaXMudmFsdWU9Im9uIil9fSxiYT17b2JzZXJ2ZXJzOlsiX2ZvY3VzZWRDaGFuZ2VkKHJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQpIl0sX2ZvY3VzZWRDaGFuZ2VkOmZ1bmN0aW9uKHQpe3QmJnRoaXMuZW5zdXJlUmlwcGxlKCksdGhpcy5oYXNSaXBwbGUoKSYmKHRoaXMuX3JpcHBsZS5ob2xkRG93bj10KX0sX2NyZWF0ZVJpcHBsZTpmdW5jdGlvbigpe3ZhciB0PXVhLl9jcmVhdGVSaXBwbGUoKTtyZXR1cm4gdC5pZD0iaW5rIix0LnNldEF0dHJpYnV0ZSgiY2VudGVyIiwiIiksdC5jbGFzc0xpc3QuYWRkKCJjaXJjbGUiKSx0fX0seGE9W2FhLHJhLHVhLGJhXSx3YT1beGEsW2dhLHlhLHZhXSx7X2NoZWNrZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dmEuX2NoZWNrZWRDaGFuZ2VkLmNhbGwodGhpcyksdGhpcy5oYXNSaXBwbGUoKSYmKHRoaXMuY2hlY2tlZD90aGlzLl9yaXBwbGUuc2V0QXR0cmlidXRlKCJjaGVja2VkIiwiIik6dGhpcy5fcmlwcGxlLnJlbW92ZUF0dHJpYnV0ZSgiY2hlY2tlZCIpKX0sX2J1dHRvblN0YXRlQ2hhbmdlZDpmdW5jdGlvbigpe3VhLl9idXR0b25TdGF0ZUNoYW5nZWQuY2FsbCh0aGlzKSx0aGlzLmRpc2FibGVkfHx0aGlzLmlzQXR0YWNoZWQmJih0aGlzLmNoZWNrZWQ9dGhpcy5hY3RpdmUpfX1dLFNhPXhlYDxzdHlsZT4KICA6aG9zdCB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgY3Vyc29yOiBwb2ludGVyOwogICAgLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemU6IHZhcigtLXBhcGVyLWNoZWNrYm94LXNpemUsIDE4cHgpOwogICAgLyogLTFweCBpcyBhIHNlbnRpbmVsIGZvciB0aGUgZGVmYXVsdCBhbmQgaXMgcmVwbGFjZWQgaW4gXGBhdHRhY2hlZFxgLiAqLwogICAgLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LWluay1zaXplOiB2YXIoLS1wYXBlci1jaGVja2JveC1pbmstc2l6ZSwgLTFweCk7CiAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgbGluZS1oZWlnaHQ6IDA7CiAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50OwogIH0KCiAgOmhvc3QoW2hpZGRlbl0pIHsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICB9CgogIDpob3N0KDpmb2N1cykgewogICAgb3V0bGluZTogbm9uZTsKICB9CgogIC5oaWRkZW4gewogICAgZGlzcGxheTogbm9uZTsKICB9CgogICNjaGVja2JveENvbnRhaW5lciB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB3aWR0aDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKTsKICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKTsKICAgIG1pbi13aWR0aDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKTsKICAgIG1hcmdpbjogdmFyKC0tcGFwZXItY2hlY2tib3gtbWFyZ2luLCBpbml0aWFsKTsKICAgIHZlcnRpY2FsLWFsaWduOiB2YXIoLS1wYXBlci1jaGVja2JveC12ZXJ0aWNhbC1hbGlnbiwgbWlkZGxlKTsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1iYWNrZ3JvdW5kLWNvbG9yLCB0cmFuc3BhcmVudCk7CiAgfQoKICAjaW5rIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKCiAgICAvKiBDZW50ZXIgdGhlIHJpcHBsZSBpbiB0aGUgY2hlY2tib3ggYnkgbmVnYXRpdmUgb2Zmc2V0dGluZyBpdCBieQogICAgICogKGlua1dpZHRoIC0gcmlwcGxlV2lkdGgpIC8gMiAqLwogICAgdG9wOiBjYWxjKDBweCAtICh2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LWluay1zaXplKSAtIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpIC8gMik7CiAgICBsZWZ0OiBjYWxjKDBweCAtICh2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LWluay1zaXplKSAtIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpIC8gMik7CiAgICB3aWR0aDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSk7CiAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUpOwogICAgY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgb3BhY2l0eTogMC42OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgfQoKICAjaW5rOmRpcihydGwpIHsKICAgIHJpZ2h0OiBjYWxjKDBweCAtICh2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LWluay1zaXplKSAtIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpIC8gMik7CiAgICBsZWZ0OiBhdXRvOwogIH0KCiAgI2lua1tjaGVja2VkXSB7CiAgICBjb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICB9CgogICNjaGVja2JveCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgaGVpZ2h0OiAxMDAlOwogICAgYm9yZGVyOiBzb2xpZCAycHg7CiAgICBib3JkZXItY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIC13ZWJraXQtdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAxNDBtcywgYm9yZGVyLWNvbG9yIDE0MG1zOwogICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciAxNDBtcywgYm9yZGVyLWNvbG9yIDE0MG1zOwoKICAgIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItY2hlY2tib3gtYW5pbWF0aW9uLWR1cmF0aW9uLCAxNDBtcyk7CiAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci1jaGVja2JveC1hbmltYXRpb24tZHVyYXRpb24sIDE0MG1zKTsKICB9CgogIC8qIGNoZWNrYm94IGNoZWNrZWQgYW5pbWF0aW9ucyAqLwogICNjaGVja2JveC5jaGVja2VkICNjaGVja21hcmsgewogICAgLXdlYmtpdC1hbmltYXRpb246IGNoZWNrbWFyay1leHBhbmQgMTQwbXMgZWFzZS1vdXQgZm9yd2FyZHM7CiAgICBhbmltYXRpb246IGNoZWNrbWFyay1leHBhbmQgMTQwbXMgZWFzZS1vdXQgZm9yd2FyZHM7CgogICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLWNoZWNrYm94LWFuaW1hdGlvbi1kdXJhdGlvbiwgMTQwbXMpOwogICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci1jaGVja2JveC1hbmltYXRpb24tZHVyYXRpb24sIDE0MG1zKTsKICB9CgogIEAtd2Via2l0LWtleWZyYW1lcyBjaGVja21hcmstZXhwYW5kIHsKICAgIDAlIHsKICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAsIDApIHJvdGF0ZSg0NWRlZyk7CiAgICB9CiAgICAxMDAlIHsKICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEsIDEpIHJvdGF0ZSg0NWRlZyk7CiAgICB9CiAgfQoKICBAa2V5ZnJhbWVzIGNoZWNrbWFyay1leHBhbmQgewogICAgMCUgewogICAgICB0cmFuc2Zvcm06IHNjYWxlKDAsIDApIHJvdGF0ZSg0NWRlZyk7CiAgICB9CiAgICAxMDAlIHsKICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLCAxKSByb3RhdGUoNDVkZWcpOwogICAgfQogIH0KCiAgI2NoZWNrYm94LmNoZWNrZWQgewogICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgfQoKICAjY2hlY2ttYXJrIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIHdpZHRoOiAzNiU7CiAgICBoZWlnaHQ6IDcwJTsKICAgIGJvcmRlci1zdHlsZTogc29saWQ7CiAgICBib3JkZXItdG9wOiBub25lOwogICAgYm9yZGVyLWxlZnQ6IG5vbmU7CiAgICBib3JkZXItcmlnaHQtd2lkdGg6IGNhbGMoMi8xNSAqIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpOwogICAgYm9yZGVyLWJvdHRvbS13aWR0aDogY2FsYygyLzE1ICogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplKSk7CiAgICBib3JkZXItY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LWNoZWNrbWFyay1jb2xvciwgd2hpdGUpOwogICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiA5NyUgODYlOwogICAgdHJhbnNmb3JtLW9yaWdpbjogOTclIDg2JTsKICAgIGJveC1zaXppbmc6IGNvbnRlbnQtYm94OyAvKiBwcm90ZWN0IGFnYWluc3QgcGFnZS1sZXZlbCBib3gtc2l6aW5nICovCiAgfQoKICAjY2hlY2ttYXJrOmRpcihydGwpIHsKICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogNTAlIDE0JTsKICAgIHRyYW5zZm9ybS1vcmlnaW46IDUwJSAxNCU7CiAgfQoKICAvKiBsYWJlbCAqLwogICNjaGVja2JveExhYmVsIHsKICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICBwYWRkaW5nLWxlZnQ6IHZhcigtLXBhcGVyLWNoZWNrYm94LWxhYmVsLXNwYWNpbmcsIDhweCk7CiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKICAgIGNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC1sYWJlbC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICBAYXBwbHkgLS1wYXBlci1jaGVja2JveC1sYWJlbDsKICB9CgogIDpob3N0KFtjaGVja2VkXSkgI2NoZWNrYm94TGFiZWwgewogICAgY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LWxhYmVsLWNoZWNrZWQtY29sb3IsIHZhcigtLXBhcGVyLWNoZWNrYm94LWxhYmVsLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKSk7CiAgICBAYXBwbHkgLS1wYXBlci1jaGVja2JveC1sYWJlbC1jaGVja2VkOwogIH0KCiAgI2NoZWNrYm94TGFiZWw6ZGlyKHJ0bCkgewogICAgcGFkZGluZy1yaWdodDogdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtc3BhY2luZywgOHB4KTsKICAgIHBhZGRpbmctbGVmdDogMDsKICB9CgogICNjaGVja2JveExhYmVsW2hpZGRlbl0gewogICAgZGlzcGxheTogbm9uZTsKICB9CgogIC8qIGRpc2FibGVkIHN0YXRlICovCgogIDpob3N0KFtkaXNhYmxlZF0pICNjaGVja2JveCB7CiAgICBvcGFjaXR5OiAwLjU7CiAgICBib3JkZXItY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgfQoKICA6aG9zdChbZGlzYWJsZWRdW2NoZWNrZWRdKSAjY2hlY2tib3ggewogICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgIG9wYWNpdHk6IDAuNTsKICB9CgogIDpob3N0KFtkaXNhYmxlZF0pICNjaGVja2JveExhYmVsICB7CiAgICBvcGFjaXR5OiAwLjY1OwogIH0KCiAgLyogaW52YWxpZCBzdGF0ZSAqLwogICNjaGVja2JveC5pbnZhbGlkOm5vdCguY2hlY2tlZCkgewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC1lcnJvci1jb2xvciwgdmFyKC0tZXJyb3ItY29sb3IpKTsKICB9Cjwvc3R5bGU+Cgo8ZGl2IGlkPSJjaGVja2JveENvbnRhaW5lciI+CiAgPGRpdiBpZD0iY2hlY2tib3giIGNsYXNzJD0iW1tfY29tcHV0ZUNoZWNrYm94Q2xhc3MoY2hlY2tlZCwgaW52YWxpZCldXSI+CiAgICA8ZGl2IGlkPSJjaGVja21hcmsiIGNsYXNzJD0iW1tfY29tcHV0ZUNoZWNrbWFya0NsYXNzKGNoZWNrZWQpXV0iPjwvZGl2PgogIDwvZGl2Pgo8L2Rpdj4KCjxkaXYgaWQ9ImNoZWNrYm94TGFiZWwiPjxzbG90Pjwvc2xvdD48L2Rpdj5gOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmlmKFNhLnNldEF0dHJpYnV0ZSgic3RyaXAtd2hpdGVzcGFjZSIsIiIpLGpyKHtfdGVtcGxhdGU6U2EsaXM6InBhcGVyLWNoZWNrYm94IixiZWhhdmlvcnM6W3dhXSxob3N0QXR0cmlidXRlczp7cm9sZToiY2hlY2tib3giLCJhcmlhLWNoZWNrZWQiOiExLHRhYmluZGV4OjB9LHByb3BlcnRpZXM6e2FyaWFBY3RpdmVBdHRyaWJ1dGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJhcmlhLWNoZWNrZWQifX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXtEaSh0aGlzLChmdW5jdGlvbigpe2lmKCItMXB4Ij09PXRoaXMuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKCItLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUiKS50cmltKCkpe3ZhciB0PXRoaXMuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKCItLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSIpLnRyaW0oKSxlPSJweCIsbj10Lm1hdGNoKC9bQS1aYS16XSskLyk7bnVsbCE9PW4mJihlPW5bMF0pO3ZhciBpPXBhcnNlRmxvYXQodCkscj04LzMqaTsicHgiPT09ZSYmKHI9TWF0aC5mbG9vcihyKSklMiE9aSUyJiZyKyssdGhpcy51cGRhdGVTdHlsZXMoeyItLXBhcGVyLWNoZWNrYm94LWluay1zaXplIjpyK2V9KX19KSl9LF9jb21wdXRlQ2hlY2tib3hDbGFzczpmdW5jdGlvbih0LGUpe3ZhciBuPSIiO3JldHVybiB0JiYobis9ImNoZWNrZWQgIiksZSYmKG4rPSJpbnZhbGlkIiksbn0sX2NvbXB1dGVDaGVja21hcmtDbGFzczpmdW5jdGlvbih0KXtyZXR1cm4gdD8iIjoiaGlkZGVuIn0sX2NyZWF0ZVJpcHBsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yaXBwbGVDb250YWluZXI9dGhpcy4kLmNoZWNrYm94Q29udGFpbmVyLGJhLl9jcmVhdGVSaXBwbGUuY2FsbCh0aGlzKX19KSwhd2luZG93LnBvbHltZXJTa2lwTG9hZGluZ0ZvbnRSb2JvdG8pe2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgibGluayIpO3QucmVsPSJzdHlsZXNoZWV0Iix0LnR5cGU9InRleHQvY3NzIix0LmNyb3NzT3JpZ2luPSJhbm9ueW1vdXMiLHQuaHJlZj0iaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90bytNb25vOjQwMCw3MDB8Um9ib3RvOjQwMCwzMDAsMzAwaXRhbGljLDQwMGl0YWxpYyw1MDAsNTAwaXRhbGljLDcwMCw3MDBpdGFsaWMiLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodCl9Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqL2NvbnN0IE1hPXhlYDxjdXN0b20tc3R5bGU+CiAgPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogICAgaHRtbCB7CgogICAgICAvKiBTaGFyZWQgU3R5bGVzICovCiAgICAgIC0tcGFwZXItZm9udC1jb21tb24tYmFzZTogewogICAgICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvJywgJ05vdG8nLCBzYW5zLXNlcmlmOwogICAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWNvbW1vbi1jb2RlOiB7CiAgICAgICAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubycsICdDb25zb2xhcycsICdNZW5sbycsIG1vbm9zcGFjZTsKICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jb21tb24tZXhwZW5zaXZlLWtlcm5pbmc6IHsKICAgICAgICB0ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA6IHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH07CgogICAgICAvKiBNYXRlcmlhbCBGb250IFN0eWxlcyAqLwoKICAgICAgLS1wYXBlci1mb250LWRpc3BsYXk0OiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogMTEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDMwMDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLS4wNDRlbTsKICAgICAgICBsaW5lLWhlaWdodDogMTIwcHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtZGlzcGxheTM6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKCiAgICAgICAgZm9udC1zaXplOiA1NnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0uMDI2ZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDYwcHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtZGlzcGxheTI6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwoKICAgICAgICBmb250LXNpemU6IDQ1cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLS4wMThlbTsKICAgICAgICBsaW5lLWhlaWdodDogNDhweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1kaXNwbGF5MTogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CgogICAgICAgIGZvbnQtc2l6ZTogMzRweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtLjAxZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDQwcHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtaGVhZGxpbmU6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwoKICAgICAgICBmb250LXNpemU6IDI0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLS4wMTJlbTsKICAgICAgICBsaW5lLWhlaWdodDogMzJweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC10aXRsZTogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOwoKICAgICAgICBmb250LXNpemU6IDIwcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjhweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1zdWJoZWFkOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiAxNnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtYm9keTI6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwoKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjRweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1ib2R5MTogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CgogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWNhcHRpb246IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKCiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDExZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtbWVudTogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOwoKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjRweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1idXR0b246IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKCiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IDAuMDE4ZW07CiAgICAgICAgbGluZS1oZWlnaHQ6IDI0cHg7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1jb2RlMjogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWNvZGU7CgogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNzAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWNvZGUxOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tY29kZTsKCiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7CiAgICAgIH07CgogICAgfQoKICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT5gO01hLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJkaXNwbGF5OiBub25lOyIpLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoTWEuY29udGVudCk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBFYT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpO0VhLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJkaXNwbGF5OiBub25lOyIpLEVhLmlubmVySFRNTD0nPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWRpYWxvZy1zaGFyZWQtc3R5bGVzIj5cbiAgPHRlbXBsYXRlPlxuICAgIDxzdHlsZT5cbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIG1hcmdpbjogMjRweCA0MHB4O1xuXG4gICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLWRpYWxvZy1iYWNrZ3JvdW5kLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWJhY2tncm91bmQtY29sb3IpKTtcbiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWRpYWxvZy1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7XG5cbiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1ib2R5MTtcbiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0xNmRwO1xuICAgICAgICBAYXBwbHkgLS1wYXBlci1kaWFsb2c7XG4gICAgICB9XG5cbiAgICAgIDpob3N0ID4gOjpzbG90dGVkKCopIHtcbiAgICAgICAgbWFyZ2luLXRvcDogMjBweDtcbiAgICAgICAgcGFkZGluZzogMCAyNHB4O1xuICAgICAgfVxuXG4gICAgICA6aG9zdCA+IDo6c2xvdHRlZCgubm8tcGFkZGluZykge1xuICAgICAgICBwYWRkaW5nOiAwO1xuICAgICAgfVxuXG4gICAgICBcbiAgICAgIDpob3N0ID4gOjpzbG90dGVkKCo6Zmlyc3QtY2hpbGQpIHtcbiAgICAgICAgbWFyZ2luLXRvcDogMjRweDtcbiAgICAgIH1cblxuICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoKjpsYXN0LWNoaWxkKSB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7XG4gICAgICB9XG5cbiAgICAgIC8qIEluIDEueCwgdGhpcyBzZWxlY3RvciB3YXMgYDpob3N0ID4gOjpjb250ZW50IGgyYC4gSW4gMi54IDxzbG90PiBhbGxvd3NcbiAgICAgIHRvIHNlbGVjdCBkaXJlY3QgY2hpbGRyZW4gb25seSwgd2hpY2ggaW5jcmVhc2VzIHRoZSB3ZWlnaHQgb2YgdGhpc1xuICAgICAgc2VsZWN0b3IsIHNvIHdlIGhhdmUgdG8gcmUtZGVmaW5lIGZpcnN0LWNoaWxkL2xhc3QtY2hpbGQgbWFyZ2lucyBiZWxvdy4gKi9cbiAgICAgIDpob3N0ID4gOjpzbG90dGVkKGgyKSB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgbWFyZ2luOiAwO1xuXG4gICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtdGl0bGU7XG4gICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZy10aXRsZTtcbiAgICAgIH1cblxuICAgICAgLyogQXBwbHkgbWl4aW4gYWdhaW4sIGluIGNhc2UgaXQgc2V0cyBtYXJnaW4tdG9wLiAqL1xuICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoaDI6Zmlyc3QtY2hpbGQpIHtcbiAgICAgICAgbWFyZ2luLXRvcDogMjRweDtcbiAgICAgICAgQGFwcGx5IC0tcGFwZXItZGlhbG9nLXRpdGxlO1xuICAgICAgfVxuXG4gICAgICAvKiBBcHBseSBtaXhpbiBhZ2FpbiwgaW4gY2FzZSBpdCBzZXRzIG1hcmdpbi1ib3R0b20uICovXG4gICAgICA6aG9zdCA+IDo6c2xvdHRlZChoMjpsYXN0LWNoaWxkKSB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7XG4gICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZy10aXRsZTtcbiAgICAgIH1cblxuICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoLnBhcGVyLWRpYWxvZy1idXR0b25zKSxcbiAgICAgIDpob3N0ID4gOjpzbG90dGVkKC5idXR0b25zKSB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgcGFkZGluZzogOHB4IDhweCA4cHggMjRweDtcbiAgICAgICAgbWFyZ2luOiAwO1xuXG4gICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1kaWFsb2ctYnV0dG9uLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7XG5cbiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7XG4gICAgICAgIEBhcHBseSAtLWxheW91dC1lbmQtanVzdGlmaWVkO1xuICAgICAgfVxuICAgIDwvc3R5bGU+XG4gIDwvdGVtcGxhdGU+XG48L2RvbS1tb2R1bGU+Jyxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKEVhLmNvbnRlbnQpOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgVGE9W3twcm9wZXJ0aWVzOnthbmltYXRpb25Db25maWc6e3R5cGU6T2JqZWN0fSxlbnRyeUFuaW1hdGlvbjp7b2JzZXJ2ZXI6Il9lbnRyeUFuaW1hdGlvbkNoYW5nZWQiLHR5cGU6U3RyaW5nfSxleGl0QW5pbWF0aW9uOntvYnNlcnZlcjoiX2V4aXRBbmltYXRpb25DaGFuZ2VkIix0eXBlOlN0cmluZ319LF9lbnRyeUFuaW1hdGlvbkNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmFuaW1hdGlvbkNvbmZpZz10aGlzLmFuaW1hdGlvbkNvbmZpZ3x8e30sdGhpcy5hbmltYXRpb25Db25maWcuZW50cnk9W3tuYW1lOnRoaXMuZW50cnlBbmltYXRpb24sbm9kZTp0aGlzfV19LF9leGl0QW5pbWF0aW9uQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuYW5pbWF0aW9uQ29uZmlnPXRoaXMuYW5pbWF0aW9uQ29uZmlnfHx7fSx0aGlzLmFuaW1hdGlvbkNvbmZpZy5leGl0PVt7bmFtZTp0aGlzLmV4aXRBbmltYXRpb24sbm9kZTp0aGlzfV19LF9jb3B5UHJvcGVydGllczpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKXRbbl09ZVtuXX0sX2Nsb25lQ29uZmlnOmZ1bmN0aW9uKHQpe3ZhciBlPXtpc0Nsb25lOiEwfTtyZXR1cm4gdGhpcy5fY29weVByb3BlcnRpZXMoZSx0KSxlfSxfZ2V0QW5pbWF0aW9uQ29uZmlnUmVjdXJzaXZlOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaTtpZih0aGlzLmFuaW1hdGlvbkNvbmZpZylpZih0aGlzLmFuaW1hdGlvbkNvbmZpZy52YWx1ZSYmImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuYW5pbWF0aW9uQ29uZmlnLnZhbHVlKXRoaXMuX3dhcm4odGhpcy5fbG9nZigicGxheUFuaW1hdGlvbiIsIlBsZWFzZSBwdXQgJ2FuaW1hdGlvbkNvbmZpZycgaW5zaWRlIG9mIHlvdXIgY29tcG9uZW50cyAncHJvcGVydGllcycgb2JqZWN0IGluc3RlYWQgb2Ygb3V0c2lkZSBvZiBpdC4iKSk7ZWxzZSBpZihpPXQ/dGhpcy5hbmltYXRpb25Db25maWdbdF06dGhpcy5hbmltYXRpb25Db25maWcsQXJyYXkuaXNBcnJheShpKXx8KGk9W2ldKSxpKWZvcih2YXIgcixvPTA7cj1pW29dO28rKylpZihyLmFuaW1hdGFibGUpci5hbmltYXRhYmxlLl9nZXRBbmltYXRpb25Db25maWdSZWN1cnNpdmUoci50eXBlfHx0LGUsbik7ZWxzZSBpZihyLmlkKXt2YXIgYT1lW3IuaWRdO2E/KGEuaXNDbG9uZXx8KGVbci5pZF09dGhpcy5fY2xvbmVDb25maWcoYSksYT1lW3IuaWRdKSx0aGlzLl9jb3B5UHJvcGVydGllcyhhLHIpKTplW3IuaWRdPXJ9ZWxzZSBuLnB1c2gocil9LGdldEFuaW1hdGlvbkNvbmZpZzpmdW5jdGlvbih0KXt2YXIgZT17fSxuPVtdO2Zvcih2YXIgaSBpbiB0aGlzLl9nZXRBbmltYXRpb25Db25maWdSZWN1cnNpdmUodCxlLG4pLGUpbi5wdXNoKGVbaV0pO3JldHVybiBufX0se19jb25maWd1cmVBbmltYXRpb25zOmZ1bmN0aW9uKHQpe3ZhciBlPVtdLG49W107aWYodC5sZW5ndGg+MClmb3IobGV0IGUsaT0wO2U9dFtpXTtpKyspe2xldCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZS5uYW1lKTtpZih0LmlzTmVvbkFuaW1hdGlvbil7bGV0IGk9bnVsbDt0LmNvbmZpZ3VyZXx8KHQuY29uZmlndXJlPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsfSksaT10LmNvbmZpZ3VyZShlKSxuLnB1c2goe3Jlc3VsdDppLGNvbmZpZzplLG5lb25BbmltYXRpb246dH0pfWVsc2UgY29uc29sZS53YXJuKHRoaXMuaXMrIjoiLGUubmFtZSwibm90IGZvdW5kISIpfWZvcih2YXIgaT0wO2k8bi5sZW5ndGg7aSsrKXtsZXQgdD1uW2ldLnJlc3VsdCxyPW5baV0uY29uZmlnLG89bltpXS5uZW9uQW5pbWF0aW9uO3RyeXsiZnVuY3Rpb24iIT10eXBlb2YgdC5jYW5jZWwmJih0PWRvY3VtZW50LnRpbWVsaW5lLnBsYXkodCkpfWNhdGNoKGUpe3Q9bnVsbCxjb25zb2xlLndhcm4oIkNvdWxkbnQgcGxheSIsIigiLHIubmFtZSwiKS4iLGUpfXQmJmUucHVzaCh7bmVvbkFuaW1hdGlvbjpvLGNvbmZpZzpyLGFuaW1hdGlvbjp0fSl9cmV0dXJuIGV9LF9zaG91bGRDb21wbGV0ZTpmdW5jdGlvbih0KXtmb3IodmFyIGU9ITAsbj0wO248dC5sZW5ndGg7bisrKWlmKCJmaW5pc2hlZCIhPXRbbl0uYW5pbWF0aW9uLnBsYXlTdGF0ZSl7ZT0hMTticmVha31yZXR1cm4gZX0sX2NvbXBsZXRlOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKXRbZV0ubmVvbkFuaW1hdGlvbi5jb21wbGV0ZSh0W2VdLmNvbmZpZyk7Zm9yKGU9MDtlPHQubGVuZ3RoO2UrKyl0W2VdLmFuaW1hdGlvbi5jYW5jZWwoKX0scGxheUFuaW1hdGlvbjpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ2V0QW5pbWF0aW9uQ29uZmlnKHQpO2lmKG4pe3RoaXMuX2FjdGl2ZT10aGlzLl9hY3RpdmV8fHt9LHRoaXMuX2FjdGl2ZVt0XSYmKHRoaXMuX2NvbXBsZXRlKHRoaXMuX2FjdGl2ZVt0XSksZGVsZXRlIHRoaXMuX2FjdGl2ZVt0XSk7dmFyIGk9dGhpcy5fY29uZmlndXJlQW5pbWF0aW9ucyhuKTtpZigwIT1pLmxlbmd0aCl7dGhpcy5fYWN0aXZlW3RdPWk7Zm9yKHZhciByPTA7cjxpLmxlbmd0aDtyKyspaVtyXS5hbmltYXRpb24ub25maW5pc2g9ZnVuY3Rpb24oKXt0aGlzLl9zaG91bGRDb21wbGV0ZShpKSYmKHRoaXMuX2NvbXBsZXRlKGkpLGRlbGV0ZSB0aGlzLl9hY3RpdmVbdF0sdGhpcy5maXJlKCJuZW9uLWFuaW1hdGlvbi1maW5pc2giLGUse2J1YmJsZXM6ITF9KSl9LmJpbmQodGhpcyl9ZWxzZSB0aGlzLmZpcmUoIm5lb24tYW5pbWF0aW9uLWZpbmlzaCIsZSx7YnViYmxlczohMX0pfX0sY2FuY2VsQW5pbWF0aW9uOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMuX2FjdGl2ZSl7dmFyIGU9dGhpcy5fYWN0aXZlW3RdO2Zvcih2YXIgbiBpbiBlKWVbbl0uYW5pbWF0aW9uLmNhbmNlbCgpfXRoaXMuX2FjdGl2ZT17fX19XTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCi8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpsZXQgQ2E7Y29uc3QgQWE9e3Byb3BlcnRpZXM6e3NpemluZ1RhcmdldDp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc319LGZpdEludG86e3R5cGU6T2JqZWN0LHZhbHVlOndpbmRvd30sbm9PdmVybGFwOnt0eXBlOkJvb2xlYW59LHBvc2l0aW9uVGFyZ2V0Ont0eXBlOkVsZW1lbnR9LGhvcml6b250YWxBbGlnbjp7dHlwZTpTdHJpbmd9LHZlcnRpY2FsQWxpZ246e3R5cGU6U3RyaW5nfSxkeW5hbWljQWxpZ246e3R5cGU6Qm9vbGVhbn0saG9yaXpvbnRhbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LHZlcnRpY2FsT2Zmc2V0Ont0eXBlOk51bWJlcix2YWx1ZTowLG5vdGlmeTohMH0sYXV0b0ZpdE9uQXR0YWNoOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGV4cGFuZFNpemluZ1RhcmdldEZvclNjcm9sbGJhcnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX2ZpdEluZm86e3R5cGU6T2JqZWN0fX0sZ2V0IF9maXRXaWR0aCgpe3JldHVybiB0aGlzLmZpdEludG89PT13aW5kb3c/dGhpcy5maXRJbnRvLmlubmVyV2lkdGg6dGhpcy5maXRJbnRvLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRofSxnZXQgX2ZpdEhlaWdodCgpe3JldHVybiB0aGlzLmZpdEludG89PT13aW5kb3c/dGhpcy5maXRJbnRvLmlubmVySGVpZ2h0OnRoaXMuZml0SW50by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHR9LGdldCBfZml0TGVmdCgpe3JldHVybiB0aGlzLmZpdEludG89PT13aW5kb3c/MDp0aGlzLmZpdEludG8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdH0sZ2V0IF9maXRUb3AoKXtyZXR1cm4gdGhpcy5maXRJbnRvPT09d2luZG93PzA6dGhpcy5maXRJbnRvLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcH0sZ2V0IF9kZWZhdWx0UG9zaXRpb25UYXJnZXQoKXt2YXIgdD1lcih0aGlzKS5wYXJlbnROb2RlO3JldHVybiB0JiZ0Lm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFJiYodD10Lmhvc3QpLHR9LGdldCBfbG9jYWxlSG9yaXpvbnRhbEFsaWduKCl7aWYodGhpcy5faXNSVEwpe2lmKCJyaWdodCI9PT10aGlzLmhvcml6b250YWxBbGlnbilyZXR1cm4ibGVmdCI7aWYoImxlZnQiPT09dGhpcy5ob3Jpem9udGFsQWxpZ24pcmV0dXJuInJpZ2h0In1yZXR1cm4gdGhpcy5ob3Jpem9udGFsQWxpZ259LGdldCBfX3Nob3VsZFBvc2l0aW9uKCl7cmV0dXJuKHRoaXMuaG9yaXpvbnRhbEFsaWdufHx0aGlzLnZlcnRpY2FsQWxpZ24pJiZ0aGlzLnBvc2l0aW9uVGFyZ2V0fSxnZXQgX2lzUlRMKCl7cmV0dXJuIHZvaWQgMD09PXRoaXMuX21lbW9pemVkSXNSVEwmJih0aGlzLl9tZW1vaXplZElzUlRMPSJydGwiPT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKS5kaXJlY3Rpb24pLHRoaXMuX21lbW9pemVkSXNSVEx9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5wb3NpdGlvblRhcmdldD10aGlzLnBvc2l0aW9uVGFyZ2V0fHx0aGlzLl9kZWZhdWx0UG9zaXRpb25UYXJnZXQsdGhpcy5hdXRvRml0T25BdHRhY2gmJigibm9uZSI9PT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKS5kaXNwbGF5P3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLmZpdCgpfS5iaW5kKHRoaXMpKTood2luZG93LlNoYWR5RE9NJiZTaGFkeURPTS5mbHVzaCgpLHRoaXMuZml0KCkpKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9fZGVmZXJyZWRGaXQmJihjbGVhclRpbWVvdXQodGhpcy5fX2RlZmVycmVkRml0KSx0aGlzLl9fZGVmZXJyZWRGaXQ9bnVsbCl9LGZpdDpmdW5jdGlvbigpe3RoaXMucG9zaXRpb24oKSx0aGlzLmNvbnN0cmFpbigpLHRoaXMuY2VudGVyKCl9LF9kaXNjb3ZlckluZm86ZnVuY3Rpb24oKXtpZighdGhpcy5fZml0SW5mbyl7dmFyIHQ9d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcyksZT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLnNpemluZ1RhcmdldCk7dGhpcy5fZml0SW5mbz17aW5saW5lU3R5bGU6e3RvcDp0aGlzLnN0eWxlLnRvcHx8IiIsbGVmdDp0aGlzLnN0eWxlLmxlZnR8fCIiLHBvc2l0aW9uOnRoaXMuc3R5bGUucG9zaXRpb258fCIifSxzaXplcklubGluZVN0eWxlOnttYXhXaWR0aDp0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5tYXhXaWR0aHx8IiIsbWF4SGVpZ2h0OnRoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLm1heEhlaWdodHx8IiIsYm94U2l6aW5nOnRoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLmJveFNpemluZ3x8IiJ9LHBvc2l0aW9uZWRCeTp7dmVydGljYWxseToiYXV0byIhPT10LnRvcD8idG9wIjoiYXV0byIhPT10LmJvdHRvbT8iYm90dG9tIjpudWxsLGhvcml6b250YWxseToiYXV0byIhPT10LmxlZnQ/ImxlZnQiOiJhdXRvIiE9PXQucmlnaHQ/InJpZ2h0IjpudWxsfSxzaXplZEJ5OntoZWlnaHQ6Im5vbmUiIT09ZS5tYXhIZWlnaHQsd2lkdGg6Im5vbmUiIT09ZS5tYXhXaWR0aCxtaW5XaWR0aDpwYXJzZUludChlLm1pbldpZHRoLDEwKXx8MCxtaW5IZWlnaHQ6cGFyc2VJbnQoZS5taW5IZWlnaHQsMTApfHwwfSxtYXJnaW46e3RvcDpwYXJzZUludCh0Lm1hcmdpblRvcCwxMCl8fDAscmlnaHQ6cGFyc2VJbnQodC5tYXJnaW5SaWdodCwxMCl8fDAsYm90dG9tOnBhcnNlSW50KHQubWFyZ2luQm90dG9tLDEwKXx8MCxsZWZ0OnBhcnNlSW50KHQubWFyZ2luTGVmdCwxMCl8fDB9fX19LHJlc2V0Rml0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZml0SW5mb3x8e307Zm9yKHZhciBlIGluIHQuc2l6ZXJJbmxpbmVTdHlsZSl0aGlzLnNpemluZ1RhcmdldC5zdHlsZVtlXT10LnNpemVySW5saW5lU3R5bGVbZV07Zm9yKHZhciBlIGluIHQuaW5saW5lU3R5bGUpdGhpcy5zdHlsZVtlXT10LmlubGluZVN0eWxlW2VdO3RoaXMuX2ZpdEluZm89bnVsbH0scmVmaXQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnNpemluZ1RhcmdldC5zY3JvbGxMZWZ0LGU9dGhpcy5zaXppbmdUYXJnZXQuc2Nyb2xsVG9wO3RoaXMucmVzZXRGaXQoKSx0aGlzLmZpdCgpLHRoaXMuc2l6aW5nVGFyZ2V0LnNjcm9sbExlZnQ9dCx0aGlzLnNpemluZ1RhcmdldC5zY3JvbGxUb3A9ZX0scG9zaXRpb246ZnVuY3Rpb24oKXtpZighdGhpcy5fX3Nob3VsZFBvc2l0aW9uKXJldHVybjt0aGlzLl9kaXNjb3ZlckluZm8oKSx3aW5kb3cuU2hhZHlET00mJndpbmRvdy5TaGFkeURPTS5mbHVzaCgpLHRoaXMuc3R5bGUucG9zaXRpb249ImZpeGVkIix0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5ib3hTaXppbmc9ImJvcmRlci1ib3giLHRoaXMuc3R5bGUubGVmdD0iMHB4Iix0aGlzLnN0eWxlLnRvcD0iMHB4Ijt2YXIgdD10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9dGhpcy5fX2dldE5vcm1hbGl6ZWRSZWN0KHRoaXMucG9zaXRpb25UYXJnZXQpLG49dGhpcy5fX2dldE5vcm1hbGl6ZWRSZWN0KHRoaXMuZml0SW50byk7bGV0IGkscixvLGE7dGhpcy5leHBhbmRTaXppbmdUYXJnZXRGb3JTY3JvbGxiYXJzJiYoaT10aGlzLnNpemluZ1RhcmdldC5vZmZzZXRXaWR0aCxyPXRoaXMuc2l6aW5nVGFyZ2V0Lm9mZnNldEhlaWdodCxvPXRoaXMuc2l6aW5nVGFyZ2V0LmNsaWVudFdpZHRoLGE9dGhpcy5zaXppbmdUYXJnZXQuY2xpZW50SGVpZ2h0KTt2YXIgcz10aGlzLl9maXRJbmZvLm1hcmdpbixsPXRoaXMuX19nZXRQb3NpdGlvbih0aGlzLl9sb2NhbGVIb3Jpem9udGFsQWxpZ24sdGhpcy52ZXJ0aWNhbEFsaWduLHt3aWR0aDp0LndpZHRoK3MubGVmdCtzLnJpZ2h0LGhlaWdodDp0LmhlaWdodCtzLnRvcCtzLmJvdHRvbX0sdCxlLG4pLGM9bC5sZWZ0K3MubGVmdCx1PWwudG9wK3MudG9wLGg9TWF0aC5taW4obi5yaWdodC1zLnJpZ2h0LGMrdC53aWR0aCksZD1NYXRoLm1pbihuLmJvdHRvbS1zLmJvdHRvbSx1K3QuaGVpZ2h0KTtjPU1hdGgubWF4KG4ubGVmdCtzLmxlZnQsTWF0aC5taW4oYyxoLXRoaXMuX2ZpdEluZm8uc2l6ZWRCeS5taW5XaWR0aCkpLHU9TWF0aC5tYXgobi50b3Arcy50b3AsTWF0aC5taW4odSxkLXRoaXMuX2ZpdEluZm8uc2l6ZWRCeS5taW5IZWlnaHQpKTtjb25zdCBwPU1hdGgubWF4KGgtYyx0aGlzLl9maXRJbmZvLnNpemVkQnkubWluV2lkdGgpLGY9TWF0aC5tYXgoZC11LHRoaXMuX2ZpdEluZm8uc2l6ZWRCeS5taW5IZWlnaHQpO3RoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLm1heFdpZHRoPXArInB4Iix0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5tYXhIZWlnaHQ9ZisicHgiO2NvbnN0IG09Yy10LmxlZnQsZz11LXQudG9wO2lmKHRoaXMuc3R5bGUubGVmdD1gJHttfXB4YCx0aGlzLnN0eWxlLnRvcD1gJHtnfXB4YCx0aGlzLmV4cGFuZFNpemluZ1RhcmdldEZvclNjcm9sbGJhcnMpe2NvbnN0IHQ9dGhpcy5zaXppbmdUYXJnZXQub2Zmc2V0SGVpZ2h0LGU9dC10aGlzLnNpemluZ1RhcmdldC5jbGllbnRIZWlnaHQtKHItYSk7aWYoZT4wKXtjb25zdCBpPU1hdGgubWluKG4uaGVpZ2h0LXMudG9wLXMuYm90dG9tLGYrZSk7dGhpcy5zaXppbmdUYXJnZXQuc3R5bGUubWF4SGVpZ2h0PWAke2l9cHhgO2NvbnN0IHI9dGhpcy5zaXppbmdUYXJnZXQub2Zmc2V0SGVpZ2h0LG89ci10O2xldCBhOyJ0b3AiPT09bC52ZXJ0aWNhbEFsaWduP2E9ZzoibWlkZGxlIj09PWwudmVydGljYWxBbGlnbj9hPWctby8yOiJib3R0b20iPT09bC52ZXJ0aWNhbEFsaWduJiYoYT1nLW8pLGE9TWF0aC5tYXgobi50b3Arcy50b3AsTWF0aC5taW4oYSxuLmJvdHRvbS1zLmJvdHRvbS1yKSksdGhpcy5zdHlsZS50b3A9YCR7YX1weGB9Y29uc3QgYz10aGlzLnNpemluZ1RhcmdldC5vZmZzZXRXaWR0aCx1PWMtdGhpcy5zaXppbmdUYXJnZXQuY2xpZW50V2lkdGgtKGktbyk7aWYodT4wKXtjb25zdCB0PSgoKT0+e2lmKHZvaWQgMCE9PUNhKXJldHVybiBDYTtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO09iamVjdC5hc3NpZ24odC5zdHlsZSx7b3ZlcmZsb3c6ImF1dG8iLHBvc2l0aW9uOiJmaXhlZCIsbGVmdDoiMHB4Iix0b3A6IjBweCIsbWF4V2lkdGg6IjEwMHB4IixtYXhIZWlnaHQ6IjEwMHB4In0pO2NvbnN0IGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cmV0dXJuIGUuc3R5bGUud2lkdGg9IjIwMHB4IixlLnN0eWxlLmhlaWdodD0iMjAwcHgiLHQuYXBwZW5kQ2hpbGQoZSksZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0KSxDYT1NYXRoLmFicyh0Lm9mZnNldFdpZHRoLTEwMCk+MT90Lm9mZnNldFdpZHRoLXQuY2xpZW50V2lkdGg6MCxkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHQpLENhfSkoKSxlPU1hdGgubWluKG4ud2lkdGgtcy5sZWZ0LXMucmlnaHQscCt1LXQpO3RoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLm1heFdpZHRoPWAke2V9cHhgO2NvbnN0IGk9dGhpcy5zaXppbmdUYXJnZXQub2Zmc2V0V2lkdGgrdCxyPWktYztsZXQgbzsibGVmdCI9PT1sLmhvcml6b250YWxBbGlnbj9vPW06ImNlbnRlciI9PT1sLmhvcml6b250YWxBbGlnbj9vPW0tci8yOiJyaWdodCI9PT1sLmhvcml6b250YWxBbGlnbiYmKG89bS1yKSxvPU1hdGgubWF4KG4ubGVmdCtzLmxlZnQsTWF0aC5taW4obyxuLnJpZ2h0LXMucmlnaHQtaSkpLHRoaXMuc3R5bGUubGVmdD1gJHtvfXB4YH19fSxjb25zdHJhaW46ZnVuY3Rpb24oKXtpZighdGhpcy5fX3Nob3VsZFBvc2l0aW9uKXt0aGlzLl9kaXNjb3ZlckluZm8oKTt2YXIgdD10aGlzLl9maXRJbmZvO3QucG9zaXRpb25lZEJ5LnZlcnRpY2FsbHl8fCh0aGlzLnN0eWxlLnBvc2l0aW9uPSJmaXhlZCIsdGhpcy5zdHlsZS50b3A9IjBweCIpLHQucG9zaXRpb25lZEJ5Lmhvcml6b250YWxseXx8KHRoaXMuc3R5bGUucG9zaXRpb249ImZpeGVkIix0aGlzLnN0eWxlLmxlZnQ9IjBweCIpLHRoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLmJveFNpemluZz0iYm9yZGVyLWJveCI7dmFyIGU9dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0LnNpemVkQnkuaGVpZ2h0fHx0aGlzLl9fc2l6ZURpbWVuc2lvbihlLHQucG9zaXRpb25lZEJ5LnZlcnRpY2FsbHksInRvcCIsImJvdHRvbSIsIkhlaWdodCIpLHQuc2l6ZWRCeS53aWR0aHx8dGhpcy5fX3NpemVEaW1lbnNpb24oZSx0LnBvc2l0aW9uZWRCeS5ob3Jpem9udGFsbHksImxlZnQiLCJyaWdodCIsIldpZHRoIil9fSxfc2l6ZURpbWVuc2lvbjpmdW5jdGlvbih0LGUsbixpLHIpe3RoaXMuX19zaXplRGltZW5zaW9uKHQsZSxuLGkscil9LF9fc2l6ZURpbWVuc2lvbjpmdW5jdGlvbih0LGUsbixpLHIpe3ZhciBvPXRoaXMuX2ZpdEluZm8sYT10aGlzLl9fZ2V0Tm9ybWFsaXplZFJlY3QodGhpcy5maXRJbnRvKSxzPSJXaWR0aCI9PT1yP2Eud2lkdGg6YS5oZWlnaHQsbD1lPT09aSxjPSJvZmZzZXQiK3I7dGhpcy5zaXppbmdUYXJnZXQuc3R5bGVbIm1heCIrcl09cy1vLm1hcmdpbltsP246aV0tKGw/cy10W2ldOnRbbl0pLSh0aGlzW2NdLXRoaXMuc2l6aW5nVGFyZ2V0W2NdKSsicHgifSxjZW50ZXI6ZnVuY3Rpb24oKXtpZighdGhpcy5fX3Nob3VsZFBvc2l0aW9uKXt0aGlzLl9kaXNjb3ZlckluZm8oKTt2YXIgdD10aGlzLl9maXRJbmZvLnBvc2l0aW9uZWRCeTtpZighdC52ZXJ0aWNhbGx5fHwhdC5ob3Jpem9udGFsbHkpe3RoaXMuc3R5bGUucG9zaXRpb249ImZpeGVkIix0LnZlcnRpY2FsbHl8fCh0aGlzLnN0eWxlLnRvcD0iMHB4IiksdC5ob3Jpem9udGFsbHl8fCh0aGlzLnN0eWxlLmxlZnQ9IjBweCIpO3ZhciBlPXRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbj10aGlzLl9fZ2V0Tm9ybWFsaXplZFJlY3QodGhpcy5maXRJbnRvKTtpZighdC52ZXJ0aWNhbGx5KXRoaXMuc3R5bGUudG9wPW4udG9wLWUudG9wKyhuLmhlaWdodC1lLmhlaWdodCkvMisicHgiO2lmKCF0Lmhvcml6b250YWxseSl0aGlzLnN0eWxlLmxlZnQ9bi5sZWZ0LWUubGVmdCsobi53aWR0aC1lLndpZHRoKS8yKyJweCJ9fX0sX19nZXROb3JtYWxpemVkUmVjdDpmdW5jdGlvbih0KXtyZXR1cm4gdD09PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8dD09PXdpbmRvdz97dG9wOjAsbGVmdDowLHdpZHRoOndpbmRvdy5pbm5lcldpZHRoLGhlaWdodDp3aW5kb3cuaW5uZXJIZWlnaHQscmlnaHQ6d2luZG93LmlubmVyV2lkdGgsYm90dG9tOndpbmRvdy5pbm5lckhlaWdodH06dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX0sX19nZXRPZmZzY3JlZW5BcmVhOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1NYXRoLm1pbigwLHQudG9wKStNYXRoLm1pbigwLG4uYm90dG9tLSh0LnRvcCtlLmhlaWdodCkpLHI9TWF0aC5taW4oMCx0LmxlZnQpK01hdGgubWluKDAsbi5yaWdodC0odC5sZWZ0K2Uud2lkdGgpKTtyZXR1cm4gTWF0aC5hYnMoaSkqZS53aWR0aCtNYXRoLmFicyhyKSplLmhlaWdodH0sX19nZXRQb3NpdGlvbjpmdW5jdGlvbih0LGUsbixpLHIsbyl7dmFyIGEscz1be3ZlcnRpY2FsQWxpZ246InRvcCIsaG9yaXpvbnRhbEFsaWduOiJsZWZ0Iix0b3A6ci50b3ArdGhpcy52ZXJ0aWNhbE9mZnNldCxsZWZ0OnIubGVmdCt0aGlzLmhvcml6b250YWxPZmZzZXR9LHt2ZXJ0aWNhbEFsaWduOiJ0b3AiLGhvcml6b250YWxBbGlnbjoicmlnaHQiLHRvcDpyLnRvcCt0aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6ci5yaWdodC1uLndpZHRoLXRoaXMuaG9yaXpvbnRhbE9mZnNldH0se3ZlcnRpY2FsQWxpZ246ImJvdHRvbSIsaG9yaXpvbnRhbEFsaWduOiJsZWZ0Iix0b3A6ci5ib3R0b20tbi5oZWlnaHQtdGhpcy52ZXJ0aWNhbE9mZnNldCxsZWZ0OnIubGVmdCt0aGlzLmhvcml6b250YWxPZmZzZXR9LHt2ZXJ0aWNhbEFsaWduOiJib3R0b20iLGhvcml6b250YWxBbGlnbjoicmlnaHQiLHRvcDpyLmJvdHRvbS1uLmhlaWdodC10aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6ci5yaWdodC1uLndpZHRoLXRoaXMuaG9yaXpvbnRhbE9mZnNldH1dO2lmKHRoaXMubm9PdmVybGFwKXtmb3IodmFyIGw9MCxjPXMubGVuZ3RoO2w8YztsKyspe3ZhciB1PXt9O2Zvcih2YXIgaCBpbiBzW2xdKXVbaF09c1tsXVtoXTtzLnB1c2godSl9c1swXS50b3A9c1sxXS50b3ArPXIuaGVpZ2h0LHNbMl0udG9wPXNbM10udG9wLT1yLmhlaWdodCxzWzRdLmxlZnQ9c1s2XS5sZWZ0Kz1yLndpZHRoLHNbNV0ubGVmdD1zWzddLmxlZnQtPXIud2lkdGh9ZT0iYXV0byI9PT1lP251bGw6ZSwodD0iYXV0byI9PT10P251bGw6dCkmJiJjZW50ZXIiIT09dHx8KHMucHVzaCh7dmVydGljYWxBbGlnbjoidG9wIixob3Jpem9udGFsQWxpZ246ImNlbnRlciIsdG9wOnIudG9wK3RoaXMudmVydGljYWxPZmZzZXQrKHRoaXMubm9PdmVybGFwP3IuaGVpZ2h0OjApLGxlZnQ6ci5sZWZ0LWkud2lkdGgvMityLndpZHRoLzIrdGhpcy5ob3Jpem9udGFsT2Zmc2V0fSkscy5wdXNoKHt2ZXJ0aWNhbEFsaWduOiJib3R0b20iLGhvcml6b250YWxBbGlnbjoiY2VudGVyIix0b3A6ci5ib3R0b20tbi5oZWlnaHQtdGhpcy52ZXJ0aWNhbE9mZnNldC0odGhpcy5ub092ZXJsYXA/ci5oZWlnaHQ6MCksbGVmdDpyLmxlZnQtaS53aWR0aC8yK3Iud2lkdGgvMit0aGlzLmhvcml6b250YWxPZmZzZXR9KSksZSYmIm1pZGRsZSIhPT1lfHwocy5wdXNoKHt2ZXJ0aWNhbEFsaWduOiJtaWRkbGUiLGhvcml6b250YWxBbGlnbjoibGVmdCIsdG9wOnIudG9wLWkuaGVpZ2h0LzIrci5oZWlnaHQvMit0aGlzLnZlcnRpY2FsT2Zmc2V0LGxlZnQ6ci5sZWZ0K3RoaXMuaG9yaXpvbnRhbE9mZnNldCsodGhpcy5ub092ZXJsYXA/ci53aWR0aDowKX0pLHMucHVzaCh7dmVydGljYWxBbGlnbjoibWlkZGxlIixob3Jpem9udGFsQWxpZ246InJpZ2h0Iix0b3A6ci50b3AtaS5oZWlnaHQvMityLmhlaWdodC8yK3RoaXMudmVydGljYWxPZmZzZXQsbGVmdDpyLnJpZ2h0LW4ud2lkdGgtdGhpcy5ob3Jpem9udGFsT2Zmc2V0LSh0aGlzLm5vT3ZlcmxhcD9yLndpZHRoOjApfSkpLCJtaWRkbGUiPT09ZSYmImNlbnRlciI9PT10JiZzLnB1c2goe3ZlcnRpY2FsQWxpZ246Im1pZGRsZSIsaG9yaXpvbnRhbEFsaWduOiJjZW50ZXIiLHRvcDpyLnRvcC1pLmhlaWdodC8yK3IuaGVpZ2h0LzIrdGhpcy52ZXJ0aWNhbE9mZnNldCxsZWZ0OnIubGVmdC1pLndpZHRoLzIrci53aWR0aC8yK3RoaXMuaG9yaXpvbnRhbE9mZnNldH0pO2ZvcihsPTA7bDxzLmxlbmd0aDtsKyspe3ZhciBkPXNbbF0scD1kLnZlcnRpY2FsQWxpZ249PT1lLGY9ZC5ob3Jpem9udGFsQWxpZ249PT10O2lmKCF0aGlzLmR5bmFtaWNBbGlnbiYmIXRoaXMubm9PdmVybGFwJiZwJiZmKXthPWQ7YnJlYWt9dmFyIG09KCFlfHxwKSYmKCF0fHxmKTtpZih0aGlzLmR5bmFtaWNBbGlnbnx8bSl7aWYoZC5vZmZzY3JlZW5BcmVhPXRoaXMuX19nZXRPZmZzY3JlZW5BcmVhKGQsbixvKSwwPT09ZC5vZmZzY3JlZW5BcmVhJiZtKXthPWQ7YnJlYWt9dmFyIGc9ZC5vZmZzY3JlZW5BcmVhLShhPWF8fGQpLm9mZnNjcmVlbkFyZWE7KGc8MHx8MD09PWcmJihwfHxmKSkmJihhPWQpfX1yZXR1cm4gYX19OwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KdmFyIGthPUVsZW1lbnQucHJvdG90eXBlLExhPWthLm1hdGNoZXN8fGthLm1hdGNoZXNTZWxlY3Rvcnx8a2EubW96TWF0Y2hlc1NlbGVjdG9yfHxrYS5tc01hdGNoZXNTZWxlY3Rvcnx8a2Eub01hdGNoZXNTZWxlY3Rvcnx8a2Eud2Via2l0TWF0Y2hlc1NlbGVjdG9yO2NvbnN0IFBhPW5ldyBjbGFzc3tnZXRUYWJiYWJsZU5vZGVzKHQpe3ZhciBlPVtdO3JldHVybiB0aGlzLl9jb2xsZWN0VGFiYmFibGVOb2Rlcyh0LGUpP3RoaXMuX3NvcnRCeVRhYkluZGV4KGUpOmV9aXNGb2N1c2FibGUodCl7cmV0dXJuIExhLmNhbGwodCwiaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIGJ1dHRvbiwgb2JqZWN0Iik/TGEuY2FsbCh0LCI6bm90KFtkaXNhYmxlZF0pIik6TGEuY2FsbCh0LCJhW2hyZWZdLCBhcmVhW2hyZWZdLCBpZnJhbWUsIFt0YWJpbmRleF0sIFtjb250ZW50RWRpdGFibGVdIil9aXNUYWJiYWJsZSh0KXtyZXR1cm4gdGhpcy5pc0ZvY3VzYWJsZSh0KSYmTGEuY2FsbCh0LCc6bm90KFt0YWJpbmRleD0iLTEiXSknKSYmdGhpcy5faXNWaXNpYmxlKHQpfV9ub3JtYWxpemVkVGFiSW5kZXgodCl7aWYodGhpcy5pc0ZvY3VzYWJsZSh0KSl7dmFyIGU9dC5nZXRBdHRyaWJ1dGUoInRhYmluZGV4Iil8fDA7cmV0dXJuIE51bWJlcihlKX1yZXR1cm4tMX1fY29sbGVjdFRhYmJhYmxlTm9kZXModCxlKXtpZih0Lm5vZGVUeXBlIT09Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuITE7dmFyIG49dDtpZighdGhpcy5faXNWaXNpYmxlKG4pKXJldHVybiExO3ZhciBpLHI9dGhpcy5fbm9ybWFsaXplZFRhYkluZGV4KG4pLG89cj4wO3I+PTAmJmUucHVzaChuKSxpPSJjb250ZW50Ij09PW4ubG9jYWxOYW1lfHwic2xvdCI9PT1uLmxvY2FsTmFtZT9lcihuKS5nZXREaXN0cmlidXRlZE5vZGVzKCk6ZXIobi5yb290fHxuKS5jaGlsZHJlbjtmb3IodmFyIGE9MDthPGkubGVuZ3RoO2ErKylvPXRoaXMuX2NvbGxlY3RUYWJiYWJsZU5vZGVzKGlbYV0sZSl8fG87cmV0dXJuIG99X2lzVmlzaWJsZSh0KXt2YXIgZT10LnN0eWxlO3JldHVybiJoaWRkZW4iIT09ZS52aXNpYmlsaXR5JiYibm9uZSIhPT1lLmRpc3BsYXkmJigiaGlkZGVuIiE9PShlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpKS52aXNpYmlsaXR5JiYibm9uZSIhPT1lLmRpc3BsYXkpfV9zb3J0QnlUYWJJbmRleCh0KXt2YXIgZT10Lmxlbmd0aDtpZihlPDIpcmV0dXJuIHQ7dmFyIG49TWF0aC5jZWlsKGUvMiksaT10aGlzLl9zb3J0QnlUYWJJbmRleCh0LnNsaWNlKDAsbikpLHI9dGhpcy5fc29ydEJ5VGFiSW5kZXgodC5zbGljZShuKSk7cmV0dXJuIHRoaXMuX21lcmdlU29ydEJ5VGFiSW5kZXgoaSxyKX1fbWVyZ2VTb3J0QnlUYWJJbmRleCh0LGUpe2Zvcih2YXIgbj1bXTt0Lmxlbmd0aD4wJiZlLmxlbmd0aD4wOyl0aGlzLl9oYXNMb3dlclRhYk9yZGVyKHRbMF0sZVswXSk/bi5wdXNoKGUuc2hpZnQoKSk6bi5wdXNoKHQuc2hpZnQoKSk7cmV0dXJuIG4uY29uY2F0KHQsZSl9X2hhc0xvd2VyVGFiT3JkZXIodCxlKXt2YXIgbj1NYXRoLm1heCh0LnRhYkluZGV4LDApLGk9TWF0aC5tYXgoZS50YWJJbmRleCwwKTtyZXR1cm4gMD09PW58fDA9PT1pP2k+bjpuPml9fTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovanIoe190ZW1wbGF0ZTp4ZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0taXJvbi1vdmVybGF5LWJhY2tkcm9wLWJhY2tncm91bmQtY29sb3IsICMwMDApOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIEBhcHBseSAtLWlyb24tb3ZlcmxheS1iYWNrZHJvcDsKICAgICAgfQoKICAgICAgOmhvc3QoLm9wZW5lZCkgewogICAgICAgIG9wYWNpdHk6IHZhcigtLWlyb24tb3ZlcmxheS1iYWNrZHJvcC1vcGFjaXR5LCAwLjYpOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICAgIEBhcHBseSAtLWlyb24tb3ZlcmxheS1iYWNrZHJvcC1vcGVuZWQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgpgLGlzOiJpcm9uLW92ZXJsYXktYmFja2Ryb3AiLHByb3BlcnRpZXM6e29wZW5lZDp7cmVmbGVjdFRvQXR0cmlidXRlOiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQifX0sbGlzdGVuZXJzOnt0cmFuc2l0aW9uZW5kOiJfb25UcmFuc2l0aW9uZW5kIn0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX19vcGVuZWRSYWY9bnVsbH0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmdGhpcy5fb3BlbmVkQ2hhbmdlZCh0aGlzLm9wZW5lZCl9LHByZXBhcmU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZCYmIXRoaXMucGFyZW50Tm9kZSYmZXIoZG9jdW1lbnQuYm9keSkuYXBwZW5kQ2hpbGQodGhpcyl9LG9wZW46ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMH0sY2xvc2U6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZD0hMX0sY29tcGxldGU6ZnVuY3Rpb24oKXt0aGlzLm9wZW5lZHx8dGhpcy5wYXJlbnROb2RlIT09ZG9jdW1lbnQuYm9keXx8ZXIodGhpcy5wYXJlbnROb2RlKS5yZW1vdmVDaGlsZCh0aGlzKX0sX29uVHJhbnNpdGlvbmVuZDpmdW5jdGlvbih0KXt0JiZ0LnRhcmdldD09PXRoaXMmJnRoaXMuY29tcGxldGUoKX0sX29wZW5lZENoYW5nZWQ6ZnVuY3Rpb24odCl7aWYodCl0aGlzLnByZXBhcmUoKTtlbHNle3ZhciBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpOyIwcyIhPT1lLnRyYW5zaXRpb25EdXJhdGlvbiYmMCE9ZS5vcGFjaXR5fHx0aGlzLmNvbXBsZXRlKCl9dGhpcy5pc0F0dGFjaGVkJiYodGhpcy5fX29wZW5lZFJhZiYmKHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9fb3BlbmVkUmFmKSx0aGlzLl9fb3BlbmVkUmFmPW51bGwpLHRoaXMuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wLHRoaXMuX19vcGVuZWRSYWY9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpe3RoaXMuX19vcGVuZWRSYWY9bnVsbCx0aGlzLnRvZ2dsZUNsYXNzKCJvcGVuZWQiLHRoaXMub3BlbmVkKX0uYmluZCh0aGlzKSkpfX0pO2NvbnN0IE5hPW5ldwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLl9vdmVybGF5cz1bXSx0aGlzLl9taW5pbXVtWj0xMDEsdGhpcy5fYmFja2Ryb3BFbGVtZW50PW51bGwsY2koZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCJ0YXAiLChmdW5jdGlvbigpe30pKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJ0YXAiLHRoaXMuX29uQ2FwdHVyZUNsaWNrLmJpbmQodGhpcyksITApLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzIix0aGlzLl9vbkNhcHR1cmVGb2N1cy5iaW5kKHRoaXMpLCEwKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLl9vbkNhcHR1cmVLZXlEb3duLmJpbmQodGhpcyksITApfWdldCBiYWNrZHJvcEVsZW1lbnQoKXtyZXR1cm4gdGhpcy5fYmFja2Ryb3BFbGVtZW50fHwodGhpcy5fYmFja2Ryb3BFbGVtZW50PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlyb24tb3ZlcmxheS1iYWNrZHJvcCIpKSx0aGlzLl9iYWNrZHJvcEVsZW1lbnR9Z2V0IGRlZXBBY3RpdmVFbGVtZW50KCl7dmFyIHQ9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtmb3IodCYmdCBpbnN0YW5jZW9mIEVsZW1lbnQhPSExfHwodD1kb2N1bWVudC5ib2R5KTt0LnJvb3QmJmVyKHQucm9vdCkuYWN0aXZlRWxlbWVudDspdD1lcih0LnJvb3QpLmFjdGl2ZUVsZW1lbnQ7cmV0dXJuIHR9X2JyaW5nT3ZlcmxheUF0SW5kZXhUb0Zyb250KHQpe3ZhciBlPXRoaXMuX292ZXJsYXlzW3RdO2lmKGUpe3ZhciBuPXRoaXMuX292ZXJsYXlzLmxlbmd0aC0xLGk9dGhpcy5fb3ZlcmxheXNbbl07aWYoaSYmdGhpcy5fc2hvdWxkQmVCZWhpbmRPdmVybGF5KGUsaSkmJm4tLSwhKHQ+PW4pKXt2YXIgcj1NYXRoLm1heCh0aGlzLmN1cnJlbnRPdmVybGF5WigpLHRoaXMuX21pbmltdW1aKTtmb3IodGhpcy5fZ2V0WihlKTw9ciYmdGhpcy5fYXBwbHlPdmVybGF5WihlLHIpO3Q8bjspdGhpcy5fb3ZlcmxheXNbdF09dGhpcy5fb3ZlcmxheXNbdCsxXSx0Kys7dGhpcy5fb3ZlcmxheXNbbl09ZX19fWFkZE9yUmVtb3ZlT3ZlcmxheSh0KXt0Lm9wZW5lZD90aGlzLmFkZE92ZXJsYXkodCk6dGhpcy5yZW1vdmVPdmVybGF5KHQpfWFkZE92ZXJsYXkodCl7dmFyIGU9dGhpcy5fb3ZlcmxheXMuaW5kZXhPZih0KTtpZihlPj0wKXJldHVybiB0aGlzLl9icmluZ092ZXJsYXlBdEluZGV4VG9Gcm9udChlKSx2b2lkIHRoaXMudHJhY2tCYWNrZHJvcCgpO3ZhciBuPXRoaXMuX292ZXJsYXlzLmxlbmd0aCxpPXRoaXMuX292ZXJsYXlzW24tMV0scj1NYXRoLm1heCh0aGlzLl9nZXRaKGkpLHRoaXMuX21pbmltdW1aKSxvPXRoaXMuX2dldFoodCk7aSYmdGhpcy5fc2hvdWxkQmVCZWhpbmRPdmVybGF5KHQsaSkmJih0aGlzLl9hcHBseU92ZXJsYXlaKGksciksbi0tLHI9TWF0aC5tYXgodGhpcy5fZ2V0Wih0aGlzLl9vdmVybGF5c1tuLTFdKSx0aGlzLl9taW5pbXVtWikpO288PXImJnRoaXMuX2FwcGx5T3ZlcmxheVoodCxyKSx0aGlzLl9vdmVybGF5cy5zcGxpY2UobiwwLHQpLHRoaXMudHJhY2tCYWNrZHJvcCgpfXJlbW92ZU92ZXJsYXkodCl7dmFyIGU9dGhpcy5fb3ZlcmxheXMuaW5kZXhPZih0KTstMSE9PWUmJih0aGlzLl9vdmVybGF5cy5zcGxpY2UoZSwxKSx0aGlzLnRyYWNrQmFja2Ryb3AoKSl9Y3VycmVudE92ZXJsYXkoKXtyZXR1cm4gdGhpcy5fb3ZlcmxheXNbdGhpcy5fb3ZlcmxheXMubGVuZ3RoLTFdfWN1cnJlbnRPdmVybGF5Wigpe3JldHVybiB0aGlzLl9nZXRaKHRoaXMuY3VycmVudE92ZXJsYXkoKSl9ZW5zdXJlTWluaW11bVoodCl7dGhpcy5fbWluaW11bVo9TWF0aC5tYXgodGhpcy5fbWluaW11bVosdCl9Zm9jdXNPdmVybGF5KCl7dmFyIHQ9dGhpcy5jdXJyZW50T3ZlcmxheSgpO3QmJnQuX2FwcGx5Rm9jdXMoKX10cmFja0JhY2tkcm9wKCl7dmFyIHQ9dGhpcy5fb3ZlcmxheVdpdGhCYWNrZHJvcCgpOyh0fHx0aGlzLl9iYWNrZHJvcEVsZW1lbnQpJiYodGhpcy5iYWNrZHJvcEVsZW1lbnQuc3R5bGUuekluZGV4PXRoaXMuX2dldFoodCktMSx0aGlzLmJhY2tkcm9wRWxlbWVudC5vcGVuZWQ9ISF0LHRoaXMuYmFja2Ryb3BFbGVtZW50LnByZXBhcmUoKSl9Z2V0QmFja2Ryb3BzKCl7Zm9yKHZhciB0PVtdLGU9MDtlPHRoaXMuX292ZXJsYXlzLmxlbmd0aDtlKyspdGhpcy5fb3ZlcmxheXNbZV0ud2l0aEJhY2tkcm9wJiZ0LnB1c2godGhpcy5fb3ZlcmxheXNbZV0pO3JldHVybiB0fWJhY2tkcm9wWigpe3JldHVybiB0aGlzLl9nZXRaKHRoaXMuX292ZXJsYXlXaXRoQmFja2Ryb3AoKSktMX1fb3ZlcmxheVdpdGhCYWNrZHJvcCgpe2Zvcih2YXIgdD10aGlzLl9vdmVybGF5cy5sZW5ndGgtMTt0Pj0wO3QtLSlpZih0aGlzLl9vdmVybGF5c1t0XS53aXRoQmFja2Ryb3ApcmV0dXJuIHRoaXMuX292ZXJsYXlzW3RdfV9nZXRaKHQpe3ZhciBlPXRoaXMuX21pbmltdW1aO2lmKHQpe3ZhciBuPU51bWJlcih0LnN0eWxlLnpJbmRleHx8d2luZG93LmdldENvbXB1dGVkU3R5bGUodCkuekluZGV4KTtuPT1uJiYoZT1uKX1yZXR1cm4gZX1fc2V0Wih0LGUpe3Quc3R5bGUuekluZGV4PWV9X2FwcGx5T3ZlcmxheVoodCxlKXt0aGlzLl9zZXRaKHQsZSsyKX1fb3ZlcmxheUluUGF0aCh0KXt0PXR8fFtdO2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKWlmKHRbZV0uX21hbmFnZXI9PT10aGlzKXJldHVybiB0W2VdfV9vbkNhcHR1cmVDbGljayh0KXt2YXIgZT10aGlzLl9vdmVybGF5cy5sZW5ndGgtMTtpZigtMSE9PWUpZm9yKHZhciBuLGk9ZXIodCkucGF0aDsobj10aGlzLl9vdmVybGF5c1tlXSkmJnRoaXMuX292ZXJsYXlJblBhdGgoaSkhPT1uJiYobi5fb25DYXB0dXJlQ2xpY2sodCksbi5hbGxvd0NsaWNrVGhyb3VnaCk7KWUtLX1fb25DYXB0dXJlRm9jdXModCl7dmFyIGU9dGhpcy5jdXJyZW50T3ZlcmxheSgpO2UmJmUuX29uQ2FwdHVyZUZvY3VzKHQpfV9vbkNhcHR1cmVLZXlEb3duKHQpe3ZhciBlPXRoaXMuY3VycmVudE92ZXJsYXkoKTtlJiYoWG8ua2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzKHQsImVzYyIpP2UuX29uQ2FwdHVyZUVzYyh0KTpYby5rZXlib2FyZEV2ZW50TWF0Y2hlc0tleXModCwidGFiIikmJmUuX29uQ2FwdHVyZVRhYih0KSl9X3Nob3VsZEJlQmVoaW5kT3ZlcmxheSh0LGUpe3JldHVybiF0LmFsd2F5c09uVG9wJiZlLmFsd2F5c09uVG9wfX07Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqL3ZhciBJYSxSYSxPYT17cGFnZVg6MCxwYWdlWTowfSx6YT1udWxsLERhPVtdLEJhPVsid2hlZWwiLCJtb3VzZXdoZWVsIiwiRE9NTW91c2VTY3JvbGwiLCJ0b3VjaHN0YXJ0IiwidG91Y2htb3ZlIl07ZnVuY3Rpb24gSGEodCl7VmEuaW5kZXhPZih0KT49MHx8KDA9PT1WYS5sZW5ndGgmJihmdW5jdGlvbiBlKCl7SWE9SWF8fFVhLmJpbmQodm9pZCAwKTtmb3IodmFyIHQ9MCxlPUJhLmxlbmd0aDt0PGU7dCsrKWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoQmFbdF0sSWEse2NhcHR1cmU6ITAscGFzc2l2ZTohMX0pfSkoKSxWYS5wdXNoKHQpLFJhPVZhW1ZhLmxlbmd0aC0xXSl9ZnVuY3Rpb24gRmEodCl7dmFyIGU9VmEuaW5kZXhPZih0KTstMSE9PWUmJihWYS5zcGxpY2UoZSwxKSxSYT1WYVtWYS5sZW5ndGgtMV0sMD09PVZhLmxlbmd0aCYmKGZ1bmN0aW9uIG4oKXtmb3IodmFyIHQ9MCxlPUJhLmxlbmd0aDt0PGU7dCsrKWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoQmFbdF0sSWEse2NhcHR1cmU6ITAscGFzc2l2ZTohMX0pfSkoKSl9Y29uc3QgVmE9W107ZnVuY3Rpb24gVWEodCl7aWYodC5jYW5jZWxhYmxlJiYoZnVuY3Rpb24gZSh0KXt2YXIgZT1lcih0KS5yb290VGFyZ2V0OyJ0b3VjaG1vdmUiIT09dC50eXBlJiZ6YSE9PWUmJih6YT1lLERhPShmdW5jdGlvbiBuKHQpe2Zvcih2YXIgZT1bXSxuPXQuaW5kZXhPZihSYSksaT0wO2k8PW47aSsrKWlmKHRbaV0ubm9kZVR5cGU9PT1Ob2RlLkVMRU1FTlRfTk9ERSl7dmFyIHI9dFtpXSxvPXIuc3R5bGU7InNjcm9sbCIhPT1vLm92ZXJmbG93JiYiYXV0byIhPT1vLm92ZXJmbG93JiYobz13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShyKSksInNjcm9sbCIhPT1vLm92ZXJmbG93JiYiYXV0byIhPT1vLm92ZXJmbG93fHxlLnB1c2gocil9cmV0dXJuIGV9KShlcih0KS5wYXRoKSk7aWYoIURhLmxlbmd0aClyZXR1cm4hMDtpZigidG91Y2hzdGFydCI9PT10LnR5cGUpcmV0dXJuITE7dmFyIGk9KGZ1bmN0aW9uIHIodCl7dmFyIGU9e2RlbHRhWDp0LmRlbHRhWCxkZWx0YVk6dC5kZWx0YVl9O2lmKCJkZWx0YVgiaW4gdCk7ZWxzZSBpZigid2hlZWxEZWx0YVgiaW4gdCYmIndoZWVsRGVsdGFZImluIHQpZS5kZWx0YVg9LXQud2hlZWxEZWx0YVgsZS5kZWx0YVk9LXQud2hlZWxEZWx0YVk7ZWxzZSBpZigid2hlZWxEZWx0YSJpbiB0KWUuZGVsdGFYPTAsZS5kZWx0YVk9LXQud2hlZWxEZWx0YTtlbHNlIGlmKCJheGlzImluIHQpZS5kZWx0YVg9MT09PXQuYXhpcz90LmRldGFpbDowLGUuZGVsdGFZPTI9PT10LmF4aXM/dC5kZXRhaWw6MDtlbHNlIGlmKHQudGFyZ2V0VG91Y2hlcyl7dmFyIG49dC50YXJnZXRUb3VjaGVzWzBdO2UuZGVsdGFYPU9hLnBhZ2VYLW4ucGFnZVgsZS5kZWx0YVk9T2EucGFnZVktbi5wYWdlWX1yZXR1cm4gZX0KLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovKSh0KTtyZXR1cm4hKGZ1bmN0aW9uIG8odCxlLG4pe2lmKCFlJiYhbilyZXR1cm47Zm9yKHZhciBpPU1hdGguYWJzKG4pPj1NYXRoLmFicyhlKSxyPTA7cjx0Lmxlbmd0aDtyKyspe3ZhciBvPXRbcl07aWYoaT9uPDA/by5zY3JvbGxUb3A+MDpvLnNjcm9sbFRvcDxvLnNjcm9sbEhlaWdodC1vLmNsaWVudEhlaWdodDplPDA/by5zY3JvbGxMZWZ0PjA6by5zY3JvbGxMZWZ0PG8uc2Nyb2xsV2lkdGgtby5jbGllbnRXaWR0aClyZXR1cm4gb319KShEYSxpLmRlbHRhWCxpLmRlbHRhWSl9KSh0KSYmdC5wcmV2ZW50RGVmYXVsdCgpLHQudGFyZ2V0VG91Y2hlcyl7dmFyIG49dC50YXJnZXRUb3VjaGVzWzBdO09hLnBhZ2VYPW4ucGFnZVgsT2EucGFnZVk9bi5wYWdlWX19Y29uc3QgamE9e3Byb3BlcnRpZXM6e29wZW5lZDp7b2JzZXJ2ZXI6Il9vcGVuZWRDaGFuZ2VkIix0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxjYW5jZWxlZDp7b2JzZXJ2ZXI6Il9jYW5jZWxlZENoYW5nZWQiLHJlYWRPbmx5OiEwLHR5cGU6Qm9vbGVhbix2YWx1ZTohMX0sd2l0aEJhY2tkcm9wOntvYnNlcnZlcjoiX3dpdGhCYWNrZHJvcENoYW5nZWQiLHR5cGU6Qm9vbGVhbn0sbm9BdXRvRm9jdXM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sbm9DYW5jZWxPbkVzY0tleTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub0NhbmNlbE9uT3V0c2lkZUNsaWNrOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGNsb3NpbmdSZWFzb246e3R5cGU6T2JqZWN0fSxyZXN0b3JlRm9jdXNPbkNsb3NlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGFsbG93Q2xpY2tUaHJvdWdoOnt0eXBlOkJvb2xlYW59LGFsd2F5c09uVG9wOnt0eXBlOkJvb2xlYW59LHNjcm9sbEFjdGlvbjp7dHlwZTpTdHJpbmd9LF9tYW5hZ2VyOnt0eXBlOk9iamVjdCx2YWx1ZTpOYX0sX2ZvY3VzZWRDaGlsZDp7dHlwZTpPYmplY3R9fSxsaXN0ZW5lcnM6eyJpcm9uLXJlc2l6ZSI6Il9vbklyb25SZXNpemUifSxvYnNlcnZlcnM6WyJfX3VwZGF0ZVNjcm9sbE9ic2VydmVycyhpc0F0dGFjaGVkLCBvcGVuZWQsIHNjcm9sbEFjdGlvbikiXSxnZXQgYmFja2Ryb3BFbGVtZW50KCl7cmV0dXJuIHRoaXMuX21hbmFnZXIuYmFja2Ryb3BFbGVtZW50fSxnZXQgX2ZvY3VzTm9kZSgpe3JldHVybiB0aGlzLl9mb2N1c2VkQ2hpbGR8fGVyKHRoaXMpLnF1ZXJ5U2VsZWN0b3IoIlthdXRvZm9jdXNdIil8fHRoaXN9LGdldCBfZm9jdXNhYmxlTm9kZXMoKXtyZXR1cm4gUGEuZ2V0VGFiYmFibGVOb2Rlcyh0aGlzKX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9faXNBbmltYXRpbmc9ITEsdGhpcy5fX3Nob3VsZFJlbW92ZVRhYkluZGV4PSExLHRoaXMuX19maXJzdEZvY3VzYWJsZU5vZGU9dGhpcy5fX2xhc3RGb2N1c2FibGVOb2RlPW51bGwsdGhpcy5fX3JhZnM9e30sdGhpcy5fX3Jlc3RvcmVGb2N1c05vZGU9bnVsbCx0aGlzLl9fc2Nyb2xsVG9wPXRoaXMuX19zY3JvbGxMZWZ0PW51bGwsdGhpcy5fX29uQ2FwdHVyZVNjcm9sbD10aGlzLl9fb25DYXB0dXJlU2Nyb2xsLmJpbmQodGhpcyksdGhpcy5fX3Jvb3ROb2Rlcz1udWxsLHRoaXMuX2Vuc3VyZVNldHVwKCl9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQmJnRoaXMuX29wZW5lZENoYW5nZWQodGhpcy5vcGVuZWQpLHRoaXMuX29ic2VydmVyPWVyKHRoaXMpLm9ic2VydmVOb2Rlcyh0aGlzLl9vbk5vZGVzQ2hhbmdlKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcy5fb2JzZXJ2ZXImJmVyKHRoaXMpLnVub2JzZXJ2ZU5vZGVzKHRoaXMuX29ic2VydmVyKSx0aGlzLl9vYnNlcnZlcj1udWxsLHRoaXMuX19yYWZzKW51bGwhPT10aGlzLl9fcmFmc1t0XSYmY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fX3JhZnNbdF0pO3RoaXMuX19yYWZzPXt9LHRoaXMuX21hbmFnZXIucmVtb3ZlT3ZlcmxheSh0aGlzKSx0aGlzLl9faXNBbmltYXRpbmcmJih0aGlzLm9wZW5lZD90aGlzLl9maW5pc2hSZW5kZXJPcGVuZWQoKToodGhpcy5fYXBwbHlGb2N1cygpLHRoaXMuX2ZpbmlzaFJlbmRlckNsb3NlZCgpKSl9LHRvZ2dsZTpmdW5jdGlvbigpe3RoaXMuX3NldENhbmNlbGVkKCExKSx0aGlzLm9wZW5lZD0hdGhpcy5vcGVuZWR9LG9wZW46ZnVuY3Rpb24oKXt0aGlzLl9zZXRDYW5jZWxlZCghMSksdGhpcy5vcGVuZWQ9ITB9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy5fc2V0Q2FuY2VsZWQoITEpLHRoaXMub3BlbmVkPSExfSxjYW5jZWw6ZnVuY3Rpb24odCl7dGhpcy5maXJlKCJpcm9uLW92ZXJsYXktY2FuY2VsZWQiLHQse2NhbmNlbGFibGU6ITB9KS5kZWZhdWx0UHJldmVudGVkfHwodGhpcy5fc2V0Q2FuY2VsZWQoITApLHRoaXMub3BlbmVkPSExKX0saW52YWxpZGF0ZVRhYmJhYmxlczpmdW5jdGlvbigpe3RoaXMuX19maXJzdEZvY3VzYWJsZU5vZGU9dGhpcy5fX2xhc3RGb2N1c2FibGVOb2RlPW51bGx9LF9lbnN1cmVTZXR1cDpmdW5jdGlvbigpe3RoaXMuX292ZXJsYXlTZXR1cHx8KHRoaXMuX292ZXJsYXlTZXR1cD0hMCx0aGlzLnN0eWxlLm91dGxpbmU9Im5vbmUiLHRoaXMuc3R5bGUuZGlzcGxheT0ibm9uZSIpfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbih0KXt0P3RoaXMucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWhpZGRlbiIpOnRoaXMuc2V0QXR0cmlidXRlKCJhcmlhLWhpZGRlbiIsInRydWUiKSx0aGlzLmlzQXR0YWNoZWQmJih0aGlzLl9faXNBbmltYXRpbmc9ITAsdGhpcy5fX2RlcmFmKCJfX29wZW5lZENoYW5nZWQiLHRoaXMuX19vcGVuZWRDaGFuZ2VkKSl9LF9jYW5jZWxlZENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmNsb3NpbmdSZWFzb249dGhpcy5jbG9zaW5nUmVhc29ufHx7fSx0aGlzLmNsb3NpbmdSZWFzb24uY2FuY2VsZWQ9dGhpcy5jYW5jZWxlZH0sX3dpdGhCYWNrZHJvcENoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLndpdGhCYWNrZHJvcCYmIXRoaXMuaGFzQXR0cmlidXRlKCJ0YWJpbmRleCIpPyh0aGlzLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCItMSIpLHRoaXMuX19zaG91bGRSZW1vdmVUYWJJbmRleD0hMCk6dGhpcy5fX3Nob3VsZFJlbW92ZVRhYkluZGV4JiYodGhpcy5yZW1vdmVBdHRyaWJ1dGUoInRhYmluZGV4IiksdGhpcy5fX3Nob3VsZFJlbW92ZVRhYkluZGV4PSExKSx0aGlzLm9wZW5lZCYmdGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9tYW5hZ2VyLnRyYWNrQmFja2Ryb3AoKX0sX3ByZXBhcmVSZW5kZXJPcGVuZWQ6ZnVuY3Rpb24oKXt0aGlzLl9fcmVzdG9yZUZvY3VzTm9kZT10aGlzLl9tYW5hZ2VyLmRlZXBBY3RpdmVFbGVtZW50LHRoaXMuX3ByZXBhcmVQb3NpdGlvbmluZygpLHRoaXMucmVmaXQoKSx0aGlzLl9maW5pc2hQb3NpdGlvbmluZygpLHRoaXMubm9BdXRvRm9jdXMmJmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ9PT10aGlzLl9mb2N1c05vZGUmJih0aGlzLl9mb2N1c05vZGUuYmx1cigpLHRoaXMuX19yZXN0b3JlRm9jdXNOb2RlLmZvY3VzKCkpfSxfcmVuZGVyT3BlbmVkOmZ1bmN0aW9uKCl7dGhpcy5fZmluaXNoUmVuZGVyT3BlbmVkKCl9LF9yZW5kZXJDbG9zZWQ6ZnVuY3Rpb24oKXt0aGlzLl9maW5pc2hSZW5kZXJDbG9zZWQoKX0sX2ZpbmlzaFJlbmRlck9wZW5lZDpmdW5jdGlvbigpe3RoaXMubm90aWZ5UmVzaXplKCksdGhpcy5fX2lzQW5pbWF0aW5nPSExLHRoaXMuZmlyZSgiaXJvbi1vdmVybGF5LW9wZW5lZCIpfSxfZmluaXNoUmVuZGVyQ2xvc2VkOmZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5kaXNwbGF5PSJub25lIix0aGlzLnN0eWxlLnpJbmRleD0iIix0aGlzLm5vdGlmeVJlc2l6ZSgpLHRoaXMuX19pc0FuaW1hdGluZz0hMSx0aGlzLmZpcmUoImlyb24tb3ZlcmxheS1jbG9zZWQiLHRoaXMuY2xvc2luZ1JlYXNvbil9LF9wcmVwYXJlUG9zaXRpb25pbmc6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnRyYW5zaXRpb249dGhpcy5zdHlsZS53ZWJraXRUcmFuc2l0aW9uPSJub25lIix0aGlzLnN0eWxlLnRyYW5zZm9ybT10aGlzLnN0eWxlLndlYmtpdFRyYW5zZm9ybT0ibm9uZSIsdGhpcy5zdHlsZS5kaXNwbGF5PSIifSxfZmluaXNoUG9zaXRpb25pbmc6ZnVuY3Rpb24oKXt0aGlzLnN0eWxlLmRpc3BsYXk9Im5vbmUiLHRoaXMuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wLHRoaXMuc3R5bGUudHJhbnNpdGlvbj10aGlzLnN0eWxlLndlYmtpdFRyYW5zaXRpb249IiIsdGhpcy5zdHlsZS50cmFuc2Zvcm09dGhpcy5zdHlsZS53ZWJraXRUcmFuc2Zvcm09IiIsdGhpcy5zdHlsZS5kaXNwbGF5PSIiLHRoaXMuc2Nyb2xsVG9wPXRoaXMuc2Nyb2xsVG9wfSxfYXBwbHlGb2N1czpmdW5jdGlvbigpe2lmKHRoaXMub3BlbmVkKXRoaXMubm9BdXRvRm9jdXN8fHRoaXMuX2ZvY3VzTm9kZS5mb2N1cygpO2Vsc2V7aWYodGhpcy5yZXN0b3JlRm9jdXNPbkNsb3NlJiZ0aGlzLl9fcmVzdG9yZUZvY3VzTm9kZSl7dmFyIHQ9dGhpcy5fbWFuYWdlci5kZWVwQWN0aXZlRWxlbWVudDsodD09PWRvY3VtZW50LmJvZHl8fEdhKHRoaXMsdCkpJiZ0aGlzLl9fcmVzdG9yZUZvY3VzTm9kZS5mb2N1cygpfXRoaXMuX19yZXN0b3JlRm9jdXNOb2RlPW51bGwsdGhpcy5fZm9jdXNOb2RlLmJsdXIoKSx0aGlzLl9mb2N1c2VkQ2hpbGQ9bnVsbH19LF9vbkNhcHR1cmVDbGljazpmdW5jdGlvbih0KXt0aGlzLm5vQ2FuY2VsT25PdXRzaWRlQ2xpY2t8fHRoaXMuY2FuY2VsKHQpfSxfb25DYXB0dXJlRm9jdXM6ZnVuY3Rpb24odCl7aWYodGhpcy53aXRoQmFja2Ryb3Ape3ZhciBlPWVyKHQpLnBhdGg7LTE9PT1lLmluZGV4T2YodGhpcyk/KHQuc3RvcFByb3BhZ2F0aW9uKCksdGhpcy5fYXBwbHlGb2N1cygpKTp0aGlzLl9mb2N1c2VkQ2hpbGQ9ZVswXX19LF9vbkNhcHR1cmVFc2M6ZnVuY3Rpb24odCl7dGhpcy5ub0NhbmNlbE9uRXNjS2V5fHx0aGlzLmNhbmNlbCh0KX0sX29uQ2FwdHVyZVRhYjpmdW5jdGlvbih0KXtpZih0aGlzLndpdGhCYWNrZHJvcCl7dGhpcy5fX2Vuc3VyZUZpcnN0TGFzdEZvY3VzYWJsZXMoKTt2YXIgZT10LnNoaWZ0S2V5LG49ZT90aGlzLl9fZmlyc3RGb2N1c2FibGVOb2RlOnRoaXMuX19sYXN0Rm9jdXNhYmxlTm9kZSxpPWU/dGhpcy5fX2xhc3RGb2N1c2FibGVOb2RlOnRoaXMuX19maXJzdEZvY3VzYWJsZU5vZGUscj0hMTtpZihuPT09aSlyPSEwO2Vsc2V7dmFyIG89dGhpcy5fbWFuYWdlci5kZWVwQWN0aXZlRWxlbWVudDtyPW89PT1ufHxvPT09dGhpc31yJiYodC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2ZvY3VzZWRDaGlsZD1pLHRoaXMuX2FwcGx5Rm9jdXMoKSl9fSxfb25Jcm9uUmVzaXplOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQmJiF0aGlzLl9faXNBbmltYXRpbmcmJnRoaXMuX19kZXJhZigicmVmaXQiLHRoaXMucmVmaXQpfSxfb25Ob2Rlc0NoYW5nZTpmdW5jdGlvbigpe3RoaXMub3BlbmVkJiYhdGhpcy5fX2lzQW5pbWF0aW5nJiYodGhpcy5pbnZhbGlkYXRlVGFiYmFibGVzKCksdGhpcy5ub3RpZnlSZXNpemUoKSl9LF9fZW5zdXJlRmlyc3RMYXN0Rm9jdXNhYmxlczpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2ZvY3VzYWJsZU5vZGVzO3RoaXMuX19maXJzdEZvY3VzYWJsZU5vZGU9dFswXSx0aGlzLl9fbGFzdEZvY3VzYWJsZU5vZGU9dFt0Lmxlbmd0aC0xXX0sX19vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ/KHRoaXMuX3ByZXBhcmVSZW5kZXJPcGVuZWQoKSx0aGlzLl9tYW5hZ2VyLmFkZE92ZXJsYXkodGhpcyksdGhpcy5fYXBwbHlGb2N1cygpLHRoaXMuX3JlbmRlck9wZW5lZCgpKToodGhpcy5fbWFuYWdlci5yZW1vdmVPdmVybGF5KHRoaXMpLHRoaXMuX2FwcGx5Rm9jdXMoKSx0aGlzLl9yZW5kZXJDbG9zZWQoKSl9LF9fZGVyYWY6ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl9fcmFmcztudWxsIT09blt0XSYmY2FuY2VsQW5pbWF0aW9uRnJhbWUoblt0XSksblt0XT1yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gaSgpe25bdF09bnVsbCxlLmNhbGwodGhpcyl9LmJpbmQodGhpcykpfSxfX3VwZGF0ZVNjcm9sbE9ic2VydmVyczpmdW5jdGlvbih0LGUsbil7dCYmZSYmdGhpcy5fX2lzVmFsaWRTY3JvbGxBY3Rpb24obik/KCJsb2NrIj09PW4mJih0aGlzLl9fc2F2ZVNjcm9sbFBvc2l0aW9uKCksSGEodGhpcykpLHRoaXMuX19hZGRTY3JvbGxMaXN0ZW5lcnMoKSk6KEZhKHRoaXMpLHRoaXMuX19yZW1vdmVTY3JvbGxMaXN0ZW5lcnMoKSl9LF9fYWRkU2Nyb2xsTGlzdGVuZXJzOmZ1bmN0aW9uKCl7aWYoIXRoaXMuX19yb290Tm9kZXMpe2lmKHRoaXMuX19yb290Tm9kZXM9W10sbSlmb3IodmFyIHQ9dGhpczt0Oyl0Lm5vZGVUeXBlPT09Tm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFJiZ0Lmhvc3QmJnRoaXMuX19yb290Tm9kZXMucHVzaCh0KSx0PXQuaG9zdHx8dC5hc3NpZ25lZFNsb3R8fHQucGFyZW50Tm9kZTt0aGlzLl9fcm9vdE5vZGVzLnB1c2goZG9jdW1lbnQpfXRoaXMuX19yb290Tm9kZXMuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5hZGRFdmVudExpc3RlbmVyKCJzY3JvbGwiLHRoaXMuX19vbkNhcHR1cmVTY3JvbGwse2NhcHR1cmU6ITAscGFzc2l2ZTohMH0pfSksdGhpcyl9LF9fcmVtb3ZlU2Nyb2xsTGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5fX3Jvb3ROb2RlcyYmdGhpcy5fX3Jvb3ROb2Rlcy5mb3JFYWNoKChmdW5jdGlvbih0KXt0LnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdGhpcy5fX29uQ2FwdHVyZVNjcm9sbCx7Y2FwdHVyZTohMCxwYXNzaXZlOiEwfSl9KSx0aGlzKSx0aGlzLmlzQXR0YWNoZWR8fCh0aGlzLl9fcm9vdE5vZGVzPW51bGwpfSxfX2lzVmFsaWRTY3JvbGxBY3Rpb246ZnVuY3Rpb24odCl7cmV0dXJuImxvY2siPT09dHx8InJlZml0Ij09PXR8fCJjYW5jZWwiPT09dH0sX19vbkNhcHR1cmVTY3JvbGw6ZnVuY3Rpb24odCl7aWYoISh0aGlzLl9faXNBbmltYXRpbmd8fGVyKHQpLnBhdGguaW5kZXhPZih0aGlzKT49MCkpc3dpdGNoKHRoaXMuc2Nyb2xsQWN0aW9uKXtjYXNlImxvY2siOnRoaXMuX19yZXN0b3JlU2Nyb2xsUG9zaXRpb24oKTticmVhaztjYXNlInJlZml0Ijp0aGlzLl9fZGVyYWYoInJlZml0Iix0aGlzLnJlZml0KTticmVhaztjYXNlImNhbmNlbCI6dGhpcy5jYW5jZWwodCl9fSxfX3NhdmVTY3JvbGxQb3NpdGlvbjpmdW5jdGlvbigpe2RvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQ/KHRoaXMuX19zY3JvbGxUb3A9ZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudC5zY3JvbGxUb3AsdGhpcy5fX3Njcm9sbExlZnQ9ZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudC5zY3JvbGxMZWZ0KToodGhpcy5fX3Njcm9sbFRvcD1NYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wLGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wKSx0aGlzLl9fc2Nyb2xsTGVmdD1NYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCxkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQpKX0sX19yZXN0b3JlU2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24oKXtkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50Pyhkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50LnNjcm9sbFRvcD10aGlzLl9fc2Nyb2xsVG9wLGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsTGVmdD10aGlzLl9fc2Nyb2xsTGVmdCk6KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3A9ZG9jdW1lbnQuYm9keS5zY3JvbGxUb3A9dGhpcy5fX3Njcm9sbFRvcCxkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdD1kb2N1bWVudC5ib2R5LnNjcm9sbExlZnQ9dGhpcy5fX3Njcm9sbExlZnQpfX0sR2E9KHQsZSk9Pntmb3IobGV0IGk9ZTtpO2k9KG49aSkuYXNzaWduZWRTbG90fHxuLnBhcmVudE5vZGV8fG4uaG9zdClpZihpPT09dClyZXR1cm4hMDt2YXIgbjtyZXR1cm4hMX0sV2E9W0FhLENvLGphXSxxYT17aG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImRpYWxvZyIsdGFiaW5kZXg6Ii0xIn0scHJvcGVydGllczp7bW9kYWw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX19yZWFkaWVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxvYnNlcnZlcnM6WyJfbW9kYWxDaGFuZ2VkKG1vZGFsLCBfX3JlYWRpZWQpIl0sbGlzdGVuZXJzOnt0YXA6Il9vbkRpYWxvZ0NsaWNrIn0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9fcHJldk5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s9dGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrLHRoaXMuX19wcmV2Tm9DYW5jZWxPbkVzY0tleT10aGlzLm5vQ2FuY2VsT25Fc2NLZXksdGhpcy5fX3ByZXZXaXRoQmFja2Ryb3A9dGhpcy53aXRoQmFja2Ryb3AsdGhpcy5fX3JlYWRpZWQ9ITB9LF9tb2RhbENoYW5nZWQ6ZnVuY3Rpb24odCxlKXtlJiYodD8odGhpcy5fX3ByZXZOb0NhbmNlbE9uT3V0c2lkZUNsaWNrPXRoaXMubm9DYW5jZWxPbk91dHNpZGVDbGljayx0aGlzLl9fcHJldk5vQ2FuY2VsT25Fc2NLZXk9dGhpcy5ub0NhbmNlbE9uRXNjS2V5LHRoaXMuX19wcmV2V2l0aEJhY2tkcm9wPXRoaXMud2l0aEJhY2tkcm9wLHRoaXMubm9DYW5jZWxPbk91dHNpZGVDbGljaz0hMCx0aGlzLm5vQ2FuY2VsT25Fc2NLZXk9ITAsdGhpcy53aXRoQmFja2Ryb3A9ITApOih0aGlzLm5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s9dGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrJiZ0aGlzLl9fcHJldk5vQ2FuY2VsT25PdXRzaWRlQ2xpY2ssdGhpcy5ub0NhbmNlbE9uRXNjS2V5PXRoaXMubm9DYW5jZWxPbkVzY0tleSYmdGhpcy5fX3ByZXZOb0NhbmNlbE9uRXNjS2V5LHRoaXMud2l0aEJhY2tkcm9wPXRoaXMud2l0aEJhY2tkcm9wJiZ0aGlzLl9fcHJldldpdGhCYWNrZHJvcCkpfSxfdXBkYXRlQ2xvc2luZ1JlYXNvbkNvbmZpcm1lZDpmdW5jdGlvbih0KXt0aGlzLmNsb3NpbmdSZWFzb249dGhpcy5jbG9zaW5nUmVhc29ufHx7fSx0aGlzLmNsb3NpbmdSZWFzb24uY29uZmlybWVkPXR9LF9vbkRpYWxvZ0NsaWNrOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1lcih0KS5wYXRoLG49MCxpPWUuaW5kZXhPZih0aGlzKTtuPGk7bisrKXt2YXIgcj1lW25dO2lmKHIuaGFzQXR0cmlidXRlJiYoci5oYXNBdHRyaWJ1dGUoImRpYWxvZy1kaXNtaXNzIil8fHIuaGFzQXR0cmlidXRlKCJkaWFsb2ctY29uZmlybSIpKSl7dGhpcy5fdXBkYXRlQ2xvc2luZ1JlYXNvbkNvbmZpcm1lZChyLmhhc0F0dHJpYnV0ZSgiZGlhbG9nLWNvbmZpcm0iKSksdGhpcy5jbG9zZSgpLHQuc3RvcFByb3BhZ2F0aW9uKCk7YnJlYWt9fX19OwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KanIoe190ZW1wbGF0ZTp4ZWAKICAgIDxzdHlsZSBpbmNsdWRlPSJwYXBlci1kaWFsb2ctc2hhcmVkLXN0eWxlcyI+PC9zdHlsZT4KICAgIDxzbG90Pjwvc2xvdD4KYCxpczoicGFwZXItZGlhbG9nIixiZWhhdmlvcnM6W1tXYSxxYV0sVGFdLGxpc3RlbmVyczp7Im5lb24tYW5pbWF0aW9uLWZpbmlzaCI6Il9vbk5lb25BbmltYXRpb25GaW5pc2gifSxfcmVuZGVyT3BlbmVkOmZ1bmN0aW9uKCl7dGhpcy5jYW5jZWxBbmltYXRpb24oKSx0aGlzLnBsYXlBbmltYXRpb24oImVudHJ5Iil9LF9yZW5kZXJDbG9zZWQ6ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbEFuaW1hdGlvbigpLHRoaXMucGxheUFuaW1hdGlvbigiZXhpdCIpfSxfb25OZW9uQW5pbWF0aW9uRmluaXNoOmZ1bmN0aW9uKCl7dGhpcy5vcGVuZWQ/dGhpcy5fZmluaXNoUmVuZGVyT3BlbmVkKCk6dGhpcy5fZmluaXNoUmVuZGVyQ2xvc2VkKCl9fSksCi8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpqcih7X3RlbXBsYXRlOnhlYAogICAgPHN0eWxlPgoKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIEBhcHBseSAtLWxheW91dC1yZWxhdGl2ZTsKICAgICAgfQoKICAgICAgOmhvc3QoLmlzLXNjcm9sbGVkOm5vdCg6Zmlyc3QtY2hpbGQpKTo6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgaGVpZ2h0OiAxcHg7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tZGl2aWRlci1jb2xvcik7CiAgICAgIH0KCiAgICAgIDpob3N0KC5jYW4tc2Nyb2xsOm5vdCguc2Nyb2xsZWQtdG8tYm90dG9tKTpub3QoOmxhc3QtY2hpbGQpKTo6YWZ0ZXIgewogICAgICAgIGNvbnRlbnQ6ICcnOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBoZWlnaHQ6IDFweDsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1kaXZpZGVyLWNvbG9yKTsKICAgICAgfQoKICAgICAgLnNjcm9sbGFibGUgewogICAgICAgIHBhZGRpbmc6IDAgMjRweDsKCiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXNjcm9sbDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1kaWFsb2ctc2Nyb2xsYWJsZTsKICAgICAgfQoKICAgICAgLmZpdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZpdDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJzY3JvbGxhYmxlIiBjbGFzcz0ic2Nyb2xsYWJsZSIgb24tc2Nyb2xsPSJ1cGRhdGVTY3JvbGxTdGF0ZSI+CiAgICAgIDxzbG90Pjwvc2xvdD4KICAgIDwvZGl2PgpgLGlzOiJwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZSIscHJvcGVydGllczp7ZGlhbG9nRWxlbWVudDp7dHlwZTpPYmplY3R9fSxnZXQgc2Nyb2xsVGFyZ2V0KCl7cmV0dXJuIHRoaXMuJC5zY3JvbGxhYmxlfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuX2Vuc3VyZVRhcmdldCgpLHRoaXMuY2xhc3NMaXN0LmFkZCgibm8tcGFkZGluZyIpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2Vuc3VyZVRhcmdldCgpLHJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLnVwZGF0ZVNjcm9sbFN0YXRlLmJpbmQodGhpcykpfSx1cGRhdGVTY3JvbGxTdGF0ZTpmdW5jdGlvbigpe3RoaXMudG9nZ2xlQ2xhc3MoImlzLXNjcm9sbGVkIix0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A+MCksdGhpcy50b2dnbGVDbGFzcygiY2FuLXNjcm9sbCIsdGhpcy5zY3JvbGxUYXJnZXQub2Zmc2V0SGVpZ2h0PHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbEhlaWdodCksdGhpcy50b2dnbGVDbGFzcygic2Nyb2xsZWQtdG8tYm90dG9tIix0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3ArdGhpcy5zY3JvbGxUYXJnZXQub2Zmc2V0SGVpZ2h0Pj10aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxIZWlnaHQpfSxfZW5zdXJlVGFyZ2V0OmZ1bmN0aW9uKCl7dGhpcy5kaWFsb2dFbGVtZW50PXRoaXMuZGlhbG9nRWxlbWVudHx8dGhpcy5wYXJlbnRFbGVtZW50LHRoaXMuZGlhbG9nRWxlbWVudCYmdGhpcy5kaWFsb2dFbGVtZW50LmJlaGF2aW9ycyYmdGhpcy5kaWFsb2dFbGVtZW50LmJlaGF2aW9ycy5pbmRleE9mKHFhKT49MD8odGhpcy5kaWFsb2dFbGVtZW50LnNpemluZ1RhcmdldD10aGlzLnNjcm9sbFRhcmdldCx0aGlzLnNjcm9sbFRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKCJmaXQiKSk6dGhpcy5kaWFsb2dFbGVtZW50JiZ0aGlzLnNjcm9sbFRhcmdldC5jbGFzc0xpc3QuYWRkKCJmaXQiKX19KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IFlhPWpyKHtfdGVtcGxhdGU6eGVgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIGNsaXA6IHJlY3QoMHB4LDBweCwwcHgsMHB4KTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYgYXJpYS1saXZlJD0iW1ttb2RlXV0iPltbX3RleHRdXTwvZGl2PgpgLGlzOiJpcm9uLWExMXktYW5ub3VuY2VyIixwcm9wZXJ0aWVzOnttb2RlOnt0eXBlOlN0cmluZyx2YWx1ZToicG9saXRlIn0sdGltZW91dDp7dHlwZTpOdW1iZXIsdmFsdWU6MTUwfSxfdGV4dDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9fSxjcmVhdGVkOmZ1bmN0aW9uKCl7WWEuaW5zdGFuY2V8fChZYS5pbnN0YW5jZT10aGlzKSxkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJpcm9uLWFubm91bmNlIix0aGlzLl9vbklyb25Bbm5vdW5jZS5iaW5kKHRoaXMpKX0sYW5ub3VuY2U6ZnVuY3Rpb24odCl7dGhpcy5fdGV4dD0iIix0aGlzLmFzeW5jKChmdW5jdGlvbigpe3RoaXMuX3RleHQ9dH0pLHRoaXMudGltZW91dCl9LF9vbklyb25Bbm5vdW5jZTpmdW5jdGlvbih0KXt0LmRldGFpbCYmdC5kZXRhaWwudGV4dCYmdGhpcy5hbm5vdW5jZSh0LmRldGFpbC50ZXh0KX19KTtZYS5pbnN0YW5jZT1udWxsLFlhLnJlcXVlc3RBdmFpbGFiaWxpdHk9ZnVuY3Rpb24oKXtZYS5pbnN0YW5jZXx8KFlhLmluc3RhbmNlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImlyb24tYTExeS1hbm5vdW5jZXIiKSksZG9jdW1lbnQuYm9keT9kb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKFlhLmluc3RhbmNlKTpkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwoZnVuY3Rpb24oKXtkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKFlhLmluc3RhbmNlKX0pKX0sCi8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpqcih7X3RlbXBsYXRlOnhlYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHNsb3QgaWQ9ImNvbnRlbnQiPjwvc2xvdD4KYCxpczoiaXJvbi1pbnB1dCIsYmVoYXZpb3JzOlt5YV0scHJvcGVydGllczp7YmluZFZhbHVlOnt0eXBlOlN0cmluZyx2YWx1ZToiIn0sdmFsdWU6e3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVZhbHVlKGJpbmRWYWx1ZSkifSxhbGxvd2VkUGF0dGVybjp7dHlwZTpTdHJpbmd9LGF1dG9WYWxpZGF0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfaW5wdXRFbGVtZW50Ok9iamVjdH0sb2JzZXJ2ZXJzOlsiX2JpbmRWYWx1ZUNoYW5nZWQoYmluZFZhbHVlLCBfaW5wdXRFbGVtZW50KSJdLGxpc3RlbmVyczp7aW5wdXQ6Il9vbklucHV0IixrZXlwcmVzczoiX29uS2V5cHJlc3MifSxjcmVhdGVkOmZ1bmN0aW9uKCl7WWEucmVxdWVzdEF2YWlsYWJpbGl0eSgpLHRoaXMuX3ByZXZpb3VzVmFsaWRJbnB1dD0iIix0aGlzLl9wYXR0ZXJuQWxyZWFkeUNoZWNrZWQ9ITF9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fb2JzZXJ2ZXI9ZXIodGhpcykub2JzZXJ2ZU5vZGVzKGZ1bmN0aW9uKHQpe3RoaXMuX2luaXRTbG90dGVkSW5wdXQoKX0uYmluZCh0aGlzKSl9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fb2JzZXJ2ZXImJihlcih0aGlzKS51bm9ic2VydmVOb2Rlcyh0aGlzLl9vYnNlcnZlciksdGhpcy5fb2JzZXJ2ZXI9bnVsbCl9LGdldCBpbnB1dEVsZW1lbnQoKXtyZXR1cm4gdGhpcy5faW5wdXRFbGVtZW50fSxfaW5pdFNsb3R0ZWRJbnB1dDpmdW5jdGlvbigpe3RoaXMuX2lucHV0RWxlbWVudD10aGlzLmdldEVmZmVjdGl2ZUNoaWxkcmVuKClbMF0sdGhpcy5pbnB1dEVsZW1lbnQmJnRoaXMuaW5wdXRFbGVtZW50LnZhbHVlJiYodGhpcy5iaW5kVmFsdWU9dGhpcy5pbnB1dEVsZW1lbnQudmFsdWUpLHRoaXMuZmlyZSgiaXJvbi1pbnB1dC1yZWFkeSIpfSxnZXQgX3BhdHRlcm5SZWdFeHAoKXt2YXIgdDtpZih0aGlzLmFsbG93ZWRQYXR0ZXJuKXQ9bmV3IFJlZ0V4cCh0aGlzLmFsbG93ZWRQYXR0ZXJuKTtlbHNlIHN3aXRjaCh0aGlzLmlucHV0RWxlbWVudC50eXBlKXtjYXNlIm51bWJlciI6dD0vWzAtOS4sZS1dL31yZXR1cm4gdH0sX2JpbmRWYWx1ZUNoYW5nZWQ6ZnVuY3Rpb24odCxlKXtlJiYodm9pZCAwPT09dD9lLnZhbHVlPW51bGw6dCE9PWUudmFsdWUmJih0aGlzLmlucHV0RWxlbWVudC52YWx1ZT10KSx0aGlzLmF1dG9WYWxpZGF0ZSYmdGhpcy52YWxpZGF0ZSgpLHRoaXMuZmlyZSgiYmluZC12YWx1ZS1jaGFuZ2VkIix7dmFsdWU6dH0pKX0sX29uSW5wdXQ6ZnVuY3Rpb24oKXt0aGlzLmFsbG93ZWRQYXR0ZXJuJiYhdGhpcy5fcGF0dGVybkFscmVhZHlDaGVja2VkJiYodGhpcy5fY2hlY2tQYXR0ZXJuVmFsaWRpdHkoKXx8KHRoaXMuX2Fubm91bmNlSW52YWxpZENoYXJhY3RlcigiSW52YWxpZCBzdHJpbmcgb2YgY2hhcmFjdGVycyBub3QgZW50ZXJlZC4iKSx0aGlzLmlucHV0RWxlbWVudC52YWx1ZT10aGlzLl9wcmV2aW91c1ZhbGlkSW5wdXQpKTt0aGlzLmJpbmRWYWx1ZT10aGlzLl9wcmV2aW91c1ZhbGlkSW5wdXQ9dGhpcy5pbnB1dEVsZW1lbnQudmFsdWUsdGhpcy5fcGF0dGVybkFscmVhZHlDaGVja2VkPSExfSxfaXNQcmludGFibGU6ZnVuY3Rpb24odCl7cmV0dXJuISg4PT10LmtleUNvZGV8fDk9PXQua2V5Q29kZXx8MTM9PXQua2V5Q29kZXx8Mjc9PXQua2V5Q29kZXx8MD09dC5jaGFyQ29kZSYmKDE5PT10LmtleUNvZGV8fDIwPT10LmtleUNvZGV8fDQ1PT10LmtleUNvZGV8fDQ2PT10LmtleUNvZGV8fDE0ND09dC5rZXlDb2RlfHwxNDU9PXQua2V5Q29kZXx8dC5rZXlDb2RlPjMyJiZ0LmtleUNvZGU8NDF8fHQua2V5Q29kZT4xMTEmJnQua2V5Q29kZTwxMjQpKX0sX29uS2V5cHJlc3M6ZnVuY3Rpb24odCl7aWYodGhpcy5hbGxvd2VkUGF0dGVybnx8Im51bWJlciI9PT10aGlzLmlucHV0RWxlbWVudC50eXBlKXt2YXIgZT10aGlzLl9wYXR0ZXJuUmVnRXhwO2lmKGUmJiEodC5tZXRhS2V5fHx0LmN0cmxLZXl8fHQuYWx0S2V5KSl7dGhpcy5fcGF0dGVybkFscmVhZHlDaGVja2VkPSEwO3ZhciBuPVN0cmluZy5mcm9tQ2hhckNvZGUodC5jaGFyQ29kZSk7dGhpcy5faXNQcmludGFibGUodCkmJiFlLnRlc3QobikmJih0LnByZXZlbnREZWZhdWx0KCksdGhpcy5fYW5ub3VuY2VJbnZhbGlkQ2hhcmFjdGVyKCJJbnZhbGlkIGNoYXJhY3RlciAiK24rIiBub3QgZW50ZXJlZC4iKSl9fX0sX2NoZWNrUGF0dGVyblZhbGlkaXR5OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fcGF0dGVyblJlZ0V4cDtpZighdClyZXR1cm4hMDtmb3IodmFyIGU9MDtlPHRoaXMuaW5wdXRFbGVtZW50LnZhbHVlLmxlbmd0aDtlKyspaWYoIXQudGVzdCh0aGlzLmlucHV0RWxlbWVudC52YWx1ZVtlXSkpcmV0dXJuITE7cmV0dXJuITB9LHZhbGlkYXRlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuaW5wdXRFbGVtZW50KXJldHVybiB0aGlzLmludmFsaWQ9ITEsITA7dmFyIHQ9dGhpcy5pbnB1dEVsZW1lbnQuY2hlY2tWYWxpZGl0eSgpO3JldHVybiB0JiYodGhpcy5yZXF1aXJlZCYmIiI9PT10aGlzLmJpbmRWYWx1ZT90PSExOnRoaXMuaGFzVmFsaWRhdG9yKCkmJih0PXlhLnZhbGlkYXRlLmNhbGwodGhpcyx0aGlzLmJpbmRWYWx1ZSkpKSx0aGlzLmludmFsaWQ9IXQsdGhpcy5maXJlKCJpcm9uLWlucHV0LXZhbGlkYXRlIiksdH0sX2Fubm91bmNlSW52YWxpZENoYXJhY3RlcjpmdW5jdGlvbih0KXt0aGlzLmZpcmUoImlyb24tYW5ub3VuY2UiLHt0ZXh0OnR9KX0sX2NvbXB1dGVWYWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gdH19KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IFhhPXthdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuZmlyZSgiYWRkb24tYXR0YWNoZWQiKX0sdXBkYXRlOmZ1bmN0aW9uKHQpe319OwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi9qcih7X3RlbXBsYXRlOnhlYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGZsb2F0OiByaWdodDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jYXB0aW9uOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNoYXItY291bnRlcjsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpkaXIocnRsKSkgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzcGFuPltbX2NoYXJDb3VudGVyU3RyXV08L3NwYW4+CmAsaXM6InBhcGVyLWlucHV0LWNoYXItY291bnRlciIsYmVoYXZpb3JzOltYYV0scHJvcGVydGllczp7X2NoYXJDb3VudGVyU3RyOnt0eXBlOlN0cmluZyx2YWx1ZToiMCJ9fSx1cGRhdGU6ZnVuY3Rpb24odCl7aWYodC5pbnB1dEVsZW1lbnQpe3QudmFsdWU9dC52YWx1ZXx8IiI7dmFyIGU9dC52YWx1ZS50b1N0cmluZygpLmxlbmd0aC50b1N0cmluZygpO3QuaW5wdXRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgibWF4bGVuZ3RoIikmJihlKz0iLyIrdC5pbnB1dEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJtYXhsZW5ndGgiKSksdGhpcy5fY2hhckNvdW50ZXJTdHI9ZX19fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCAkYT14ZWAKPGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBodG1sIHsKICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItc2hhcmVkLWlucHV0LXN0eWxlOiB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOyAvKiB0byBtYWtlIGEgc3RhY2tpbmcgY29udGV4dCAqLwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgYm94LXNoYWRvdzogbm9uZTsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsKICAgICAgICB0ZXh0LWFsaWduOiBpbmhlcml0OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtYWxpZ24sIGJvdHRvbSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgfTsKICAgIH0KICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT4KYDskYS5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZGlzcGxheTogbm9uZTsiKSxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKCRhLmNvbnRlbnQpLGpyKHtfdGVtcGxhdGU6eGVgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nOiA4cHggMDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXI7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbmxpbmVdKSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgb3BhY2l0eTogMC4zMzsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWRpc2FibGVkOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLmZsb2F0ZWQtbGFiZWwtcGxhY2Vob2xkZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY2FwdGlvbjsKICAgICAgfQoKICAgICAgLnVuZGVybGluZSB7CiAgICAgICAgaGVpZ2h0OiAycHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAuZm9jdXNlZC1saW5lIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwogICAgICAgIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItZm9jdXMtY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKCiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgY2VudGVyOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlM2QoMCwxLDEpOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUzZCgwLDEsMSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci11bmRlcmxpbmUtZm9jdXM7CiAgICAgIH0KCiAgICAgIC51bmRlcmxpbmUuaXMtaGlnaGxpZ2h0ZWQgLmZvY3VzZWQtbGluZSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgdHJhbnNmb3JtOiBub25lOwogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gMC4yNXM7CiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMjVzOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10cmFuc2l0aW9uLWVhc2luZzsKICAgICAgfQoKICAgICAgLnVuZGVybGluZS5pcy1pbnZhbGlkIC5mb2N1c2VkLWxpbmUgewogICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWludmFsaWQtY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgdHJhbnNmb3JtOiBub25lOwogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gMC4yNXM7CiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMjVzOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10cmFuc2l0aW9uLWVhc2luZzsKICAgICAgfQoKICAgICAgLnVuZm9jdXNlZC1saW5lIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXVuZGVybGluZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgLnVuZm9jdXNlZC1saW5lIHsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggZGFzaGVkOwogICAgICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWNvbG9yLCB2YXIoLS1zZWNvbmRhcnktdGV4dC1jb2xvcikpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci11bmRlcmxpbmUtZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIC5pbnB1dC13cmFwcGVyIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgLmlucHV0LWNvbnRlbnQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4LWF1dG87CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXJlbGF0aXZlOwogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGxhYmVsKSwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1sYWJlbCkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBmb250OiBpbmhlcml0OwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAwLjI1cywgd2lkdGggMC4yNXM7CiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMjVzLCB3aWR0aCAwLjI1czsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGxlZnQgdG9wOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQgdG9wOwogICAgICAgIC8qIEZpeCBmb3Igc2FmYXJpIG5vdCBmb2N1c2luZyAwLWhlaWdodCBkYXRlL3RpbWUgaW5wdXRzIHdpdGggLXdlYmtpdC1hcHBlcmFuY2U6IG5vbmU7ICovCiAgICAgICAgbWluLWhlaWdodDogMXB4OwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1zdWJoZWFkOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDsKICAgICAgICBAYXBwbHkgLS1wYXBlci10cmFuc2l0aW9uLWVhc2luZzsKICAgICAgfQoKCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChsYWJlbCk6YmVmb3JlLAogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKTpiZWZvcmUgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbC1iZWZvcmU7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChsYWJlbCk6YWZ0ZXIsCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZCgucGFwZXItaW5wdXQtbGFiZWwpOmFmdGVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWwtYWZ0ZXI7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50LmxhYmVsLWlzLWZsb2F0aW5nIDo6c2xvdHRlZChsYWJlbCksCiAgICAgIC5pbnB1dC1jb250ZW50LmxhYmVsLWlzLWZsb2F0aW5nIDo6c2xvdHRlZCgucGFwZXItaW5wdXQtbGFiZWwpIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNzUlKSBzY2FsZSgwLjc1KTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTc1JSkgc2NhbGUoMC43NSk7CgogICAgICAgIC8qIFNpbmNlIHdlIHNjYWxlIHRvIDc1LzEwMCBvZiB0aGUgc2l6ZSwgd2UgYWN0dWFsbHkgaGF2ZSAxMDAvNzUgb2YgdGhlCiAgICAgICAgb3JpZ2luYWwgc3BhY2Ugbm93IGF2YWlsYWJsZSAqLwogICAgICAgIHdpZHRoOiAxMzMlOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWwtZmxvYXRpbmc7CiAgICAgIH0KCiAgICAgIDpob3N0KDpkaXIocnRsKSkgLmlucHV0LWNvbnRlbnQubGFiZWwtaXMtZmxvYXRpbmcgOjpzbG90dGVkKGxhYmVsKSwKICAgICAgOmhvc3QoOmRpcihydGwpKSAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1mbG9hdGluZyA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgbGVmdDogYXV0bzsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0IHRvcDsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiByaWdodCB0b3A7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50LmxhYmVsLWlzLWhpZ2hsaWdodGVkIDo6c2xvdHRlZChsYWJlbCksCiAgICAgIC5pbnB1dC1jb250ZW50LmxhYmVsLWlzLWhpZ2hsaWdodGVkIDo6c2xvdHRlZCgucGFwZXItaW5wdXQtbGFiZWwpIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbC1mb2N1czsKICAgICAgfQoKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudC5pcy1pbnZhbGlkIDo6c2xvdHRlZCgucGFwZXItaW5wdXQtbGFiZWwpIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWludmFsaWQtY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50LmxhYmVsLWlzLWhpZGRlbiA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1oaWRkZW4gOjpzbG90dGVkKC5wYXBlci1pbnB1dC1sYWJlbCkgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlucHV0KSwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlyb24taW5wdXQpLAogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQodGV4dGFyZWEpLAogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSksCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZCgucGFwZXItaW5wdXQtaW5wdXQpIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItc2hhcmVkLWlucHV0LXN0eWxlOwogICAgICAgIC8qIFRoZSBhcHBseSBzaGltIGRvZXNuJ3QgYXBwbHkgdGhlIG5lc3RlZCBjb2xvciBjdXN0b20gcHJvcGVydHksCiAgICAgICAgICBzbyB3ZSBoYXZlIHRvIHJlLWFwcGx5IGl0IGhlcmUuICovCiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoaW5wdXQpOjotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uLAogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoaW5wdXQpOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtd2Via2l0LXNwaW5uZXI7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50LmZvY3VzZWQgOjpzbG90dGVkKGlucHV0KSwKICAgICAgLmlucHV0LWNvbnRlbnQuZm9jdXNlZCA6OnNsb3R0ZWQoaXJvbi1pbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50LmZvY3VzZWQgOjpzbG90dGVkKHRleHRhcmVhKSwKICAgICAgLmlucHV0LWNvbnRlbnQuZm9jdXNlZCA6OnNsb3R0ZWQoaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSksCiAgICAgIC5pbnB1dC1jb250ZW50LmZvY3VzZWQgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1pbnB1dCkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC1mb2N1czsKICAgICAgfQoKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoaW5wdXQpLAogICAgICAuaW5wdXQtY29udGVudC5pcy1pbnZhbGlkIDo6c2xvdHRlZChpcm9uLWlucHV0KSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQodGV4dGFyZWEpLAogICAgICAuaW5wdXQtY29udGVudC5pcy1pbnZhbGlkIDo6c2xvdHRlZChpcm9uLWF1dG9ncm93LXRleHRhcmVhKSwKICAgICAgLmlucHV0LWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWlucHV0KSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LWludmFsaWQ7CiAgICAgIH0KCiAgICAgIC5wcmVmaXggOjpzbG90dGVkKCopIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1zdWJoZWFkOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4LW5vbmU7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtcHJlZml4OwogICAgICB9CgogICAgICAuc3VmZml4IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1ub25lOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1zdWZmaXg7CiAgICAgIH0KCiAgICAgIC8qIEZpcmVmb3ggc2V0cyBhIG1pbi13aWR0aCBvbiB0aGUgaW5wdXQsIHdoaWNoIGNhbiBjYXVzZSBsYXlvdXQgaXNzdWVzICovCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChpbnB1dCkgewogICAgICAgIG1pbi13aWR0aDogMDsKICAgICAgfQoKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKHRleHRhcmVhKSB7CiAgICAgICAgcmVzaXplOiBub25lOwogICAgICB9CgogICAgICAuYWRkLW9uLWNvbnRlbnQgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgLmFkZC1vbi1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKCopIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWludmFsaWQtY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIC5hZGQtb24tY29udGVudC5pcy1oaWdobGlnaHRlZCA6OnNsb3R0ZWQoKikgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItZm9jdXMtY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGNsYXNzPSJmbG9hdGVkLWxhYmVsLXBsYWNlaG9sZGVyIiBhcmlhLWhpZGRlbj0idHJ1ZSIgaGlkZGVuPSJbW25vTGFiZWxGbG9hdF1dIj4mbmJzcDs8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJpbnB1dC13cmFwcGVyIj4KICAgICAgPHNwYW4gY2xhc3M9InByZWZpeCI+PHNsb3QgbmFtZT0icHJlZml4Ij48L3Nsb3Q+PC9zcGFuPgoKICAgICAgPGRpdiBjbGFzcyQ9IltbX2NvbXB1dGVJbnB1dENvbnRlbnRDbGFzcyhub0xhYmVsRmxvYXQsYWx3YXlzRmxvYXRMYWJlbCxmb2N1c2VkLGludmFsaWQsX2lucHV0SGFzQ29udGVudCldXSIgaWQ9ImxhYmVsQW5kSW5wdXRDb250YWluZXIiPgogICAgICAgIDxzbG90IG5hbWU9ImxhYmVsIj48L3Nsb3Q+CiAgICAgICAgPHNsb3QgbmFtZT0iaW5wdXQiPjwvc2xvdD4KICAgICAgPC9kaXY+CgogICAgICA8c3BhbiBjbGFzcz0ic3VmZml4Ij48c2xvdCBuYW1lPSJzdWZmaXgiPjwvc2xvdD48L3NwYW4+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzJD0iW1tfY29tcHV0ZVVuZGVybGluZUNsYXNzKGZvY3VzZWQsaW52YWxpZCldXSI+CiAgICAgIDxkaXYgY2xhc3M9InVuZm9jdXNlZC1saW5lIj48L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iZm9jdXNlZC1saW5lIj48L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3MkPSJbW19jb21wdXRlQWRkT25Db250ZW50Q2xhc3MoZm9jdXNlZCxpbnZhbGlkKV1dIj4KICAgICAgPHNsb3QgbmFtZT0iYWRkLW9uIj48L3Nsb3Q+CiAgICA8L2Rpdj4KYCxpczoicGFwZXItaW5wdXQtY29udGFpbmVyIixwcm9wZXJ0aWVzOntub0xhYmVsRmxvYXQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYWx3YXlzRmxvYXRMYWJlbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhdHRyRm9yVmFsdWU6e3R5cGU6U3RyaW5nLHZhbHVlOiJiaW5kLXZhbHVlIn0sYXV0b1ZhbGlkYXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGludmFsaWQ6e29ic2VydmVyOiJfaW52YWxpZENoYW5nZWQiLHR5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZm9jdXNlZDp7cmVhZE9ubHk6ITAsdHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0sX2FkZG9uczp7dHlwZTpBcnJheX0sX2lucHV0SGFzQ29udGVudDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfaW5wdXRTZWxlY3Rvcjp7dHlwZTpTdHJpbmcsdmFsdWU6ImlucHV0LGlyb24taW5wdXQsdGV4dGFyZWEsLnBhcGVyLWlucHV0LWlucHV0In0sX2JvdW5kT25Gb2N1czp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vbkZvY3VzLmJpbmQodGhpcyl9fSxfYm91bmRPbkJsdXI6e3R5cGU6RnVuY3Rpb24sdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fb25CbHVyLmJpbmQodGhpcyl9fSxfYm91bmRPbklucHV0Ont0eXBlOkZ1bmN0aW9uLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29uSW5wdXQuYmluZCh0aGlzKX19LF9ib3VuZFZhbHVlQ2hhbmdlZDp7dHlwZTpGdW5jdGlvbix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9vblZhbHVlQ2hhbmdlZC5iaW5kKHRoaXMpfX19LGxpc3RlbmVyczp7ImFkZG9uLWF0dGFjaGVkIjoiX29uQWRkb25BdHRhY2hlZCIsImlyb24taW5wdXQtdmFsaWRhdGUiOiJfb25Jcm9uSW5wdXRWYWxpZGF0ZSJ9LGdldCBfdmFsdWVDaGFuZ2VkRXZlbnQoKXtyZXR1cm4gdGhpcy5hdHRyRm9yVmFsdWUrIi1jaGFuZ2VkIn0sZ2V0IF9wcm9wZXJ0eUZvclZhbHVlKCl7cmV0dXJuIHN0KHRoaXMuYXR0ckZvclZhbHVlKX0sZ2V0IF9pbnB1dEVsZW1lbnQoKXtyZXR1cm4gZXIodGhpcykucXVlcnlTZWxlY3Rvcih0aGlzLl9pbnB1dFNlbGVjdG9yKX0sZ2V0IF9pbnB1dEVsZW1lbnRWYWx1ZSgpe3JldHVybiB0aGlzLl9pbnB1dEVsZW1lbnRbdGhpcy5fcHJvcGVydHlGb3JWYWx1ZV18fHRoaXMuX2lucHV0RWxlbWVudC52YWx1ZX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9faXNGaXJzdFZhbHVlVXBkYXRlPSEwLHRoaXMuX2FkZG9uc3x8KHRoaXMuX2FkZG9ucz1bXSksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJmb2N1cyIsdGhpcy5fYm91bmRPbkZvY3VzLCEwKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImJsdXIiLHRoaXMuX2JvdW5kT25CbHVyLCEwKX0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLmF0dHJGb3JWYWx1ZT90aGlzLl9pbnB1dEVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcih0aGlzLl92YWx1ZUNoYW5nZWRFdmVudCx0aGlzLl9ib3VuZFZhbHVlQ2hhbmdlZCk6dGhpcy5hZGRFdmVudExpc3RlbmVyKCJpbnB1dCIsdGhpcy5fb25JbnB1dCksdGhpcy5faW5wdXRFbGVtZW50VmFsdWUmJiIiIT10aGlzLl9pbnB1dEVsZW1lbnRWYWx1ZT90aGlzLl9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZSh0aGlzLl9pbnB1dEVsZW1lbnQpOnRoaXMuX2hhbmRsZVZhbHVlKHRoaXMuX2lucHV0RWxlbWVudCl9LF9vbkFkZG9uQXR0YWNoZWQ6ZnVuY3Rpb24odCl7dGhpcy5fYWRkb25zfHwodGhpcy5fYWRkb25zPVtdKTt2YXIgZT10LnRhcmdldDstMT09PXRoaXMuX2FkZG9ucy5pbmRleE9mKGUpJiYodGhpcy5fYWRkb25zLnB1c2goZSksdGhpcy5pc0F0dGFjaGVkJiZ0aGlzLl9oYW5kbGVWYWx1ZSh0aGlzLl9pbnB1dEVsZW1lbnQpKX0sX29uRm9jdXM6ZnVuY3Rpb24oKXt0aGlzLl9zZXRGb2N1c2VkKCEwKX0sX29uQmx1cjpmdW5jdGlvbigpe3RoaXMuX3NldEZvY3VzZWQoITEpLHRoaXMuX2hhbmRsZVZhbHVlQW5kQXV0b1ZhbGlkYXRlKHRoaXMuX2lucHV0RWxlbWVudCl9LF9vbklucHV0OmZ1bmN0aW9uKHQpe3RoaXMuX2hhbmRsZVZhbHVlQW5kQXV0b1ZhbGlkYXRlKHQudGFyZ2V0KX0sX29uVmFsdWVDaGFuZ2VkOmZ1bmN0aW9uKHQpe3ZhciBlPXQudGFyZ2V0O3RoaXMuX19pc0ZpcnN0VmFsdWVVcGRhdGUmJih0aGlzLl9faXNGaXJzdFZhbHVlVXBkYXRlPSExLHZvaWQgMD09PWUudmFsdWV8fCIiPT09ZS52YWx1ZSl8fHRoaXMuX2hhbmRsZVZhbHVlQW5kQXV0b1ZhbGlkYXRlKHQudGFyZ2V0KX0sX2hhbmRsZVZhbHVlOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2lucHV0RWxlbWVudFZhbHVlO3RoaXMuX2lucHV0SGFzQ29udGVudD0hKCFlJiYwIT09ZSYmKCJudW1iZXIiIT09dC50eXBlfHx0LmNoZWNrVmFsaWRpdHkoKSkpLHRoaXMudXBkYXRlQWRkb25zKHtpbnB1dEVsZW1lbnQ6dCx2YWx1ZTplLGludmFsaWQ6dGhpcy5pbnZhbGlkfSl9LF9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZTpmdW5jdGlvbih0KXt2YXIgZTt0aGlzLmF1dG9WYWxpZGF0ZSYmdCYmKGU9dC52YWxpZGF0ZT90LnZhbGlkYXRlKHRoaXMuX2lucHV0RWxlbWVudFZhbHVlKTp0LmNoZWNrVmFsaWRpdHkoKSx0aGlzLmludmFsaWQ9IWUpO3RoaXMuX2hhbmRsZVZhbHVlKHQpfSxfb25Jcm9uSW5wdXRWYWxpZGF0ZTpmdW5jdGlvbih0KXt0aGlzLmludmFsaWQ9dGhpcy5faW5wdXRFbGVtZW50LmludmFsaWR9LF9pbnZhbGlkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMuX2FkZG9ucyYmdGhpcy51cGRhdGVBZGRvbnMoe2ludmFsaWQ6dGhpcy5pbnZhbGlkfSl9LHVwZGF0ZUFkZG9uczpmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0wO2U9dGhpcy5fYWRkb25zW25dO24rKyllLnVwZGF0ZSh0KX0sX2NvbXB1dGVJbnB1dENvbnRlbnRDbGFzczpmdW5jdGlvbih0LGUsbixpLHIpe3ZhciBvPSJpbnB1dC1jb250ZW50IjtpZih0KXImJihvKz0iIGxhYmVsLWlzLWhpZGRlbiIpLGkmJihvKz0iIGlzLWludmFsaWQiKTtlbHNle3ZhciBhPXRoaXMucXVlcnlTZWxlY3RvcigibGFiZWwiKTtlfHxyPyhvKz0iIGxhYmVsLWlzLWZsb2F0aW5nIix0aGlzLiQubGFiZWxBbmRJbnB1dENvbnRhaW5lci5zdHlsZS5wb3NpdGlvbj0ic3RhdGljIixpP28rPSIgaXMtaW52YWxpZCI6biYmKG8rPSIgbGFiZWwtaXMtaGlnaGxpZ2h0ZWQiKSk6KGEmJih0aGlzLiQubGFiZWxBbmRJbnB1dENvbnRhaW5lci5zdHlsZS5wb3NpdGlvbj0icmVsYXRpdmUiKSxpJiYobys9IiBpcy1pbnZhbGlkIikpfXJldHVybiBuJiYobys9IiBmb2N1c2VkIiksb30sX2NvbXB1dGVVbmRlcmxpbmVDbGFzczpmdW5jdGlvbih0LGUpe3ZhciBuPSJ1bmRlcmxpbmUiO3JldHVybiBlP24rPSIgaXMtaW52YWxpZCI6dCYmKG4rPSIgaXMtaGlnaGxpZ2h0ZWQiKSxufSxfY29tcHV0ZUFkZE9uQ29udGVudENsYXNzOmZ1bmN0aW9uKHQsZSl7dmFyIG49ImFkZC1vbi1jb250ZW50IjtyZXR1cm4gZT9uKz0iIGlzLWludmFsaWQiOnQmJihuKz0iIGlzLWhpZ2hsaWdodGVkIiksbn19KSwKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmpyKHtfdGVtcGxhdGU6eGVgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwoKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWludmFsaWQtY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY2FwdGlvbjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1lcnJvcjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbGVmdDowOwogICAgICAgIHJpZ2h0OjA7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgewogICAgICAgIHZpc2liaWxpdHk6IHZpc2libGU7CiAgICAgIH0KCiAgICAgICNhMTF5V3JhcHBlciB7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICA6aG9zdChbaW52YWxpZF0pICNhMTF5V3JhcHBlciB7CiAgICAgICAgdmlzaWJpbGl0eTogdmlzaWJsZTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8IS0tCiAgICBJZiB0aGUgcGFwZXItaW5wdXQtZXJyb3IgZWxlbWVudCBpcyBkaXJlY3RseSByZWZlcmVuY2VkIGJ5IGFuCiAgICBcYGFyaWEtZGVzY3JpYmVkYnlcYCBhdHRyaWJ1dGUsIHN1Y2ggYXMgd2hlbiB1c2VkIGFzIGEgcGFwZXItaW5wdXQgYWRkLW9uLAogICAgdGhlbiBhcHBseWluZyBcYHZpc2liaWxpdHk6IGhpZGRlbjtcYCB0byB0aGUgcGFwZXItaW5wdXQtZXJyb3IgZWxlbWVudCBpdHNlbGYKICAgIGRvZXMgbm90IGhpZGUgdGhlIGVycm9yLgoKICAgIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWU6CiAgICBodHRwczovL3d3dy53My5vcmcvVFIvYWNjbmFtZS0xLjEvI21hcHBpbmdfYWRkaXRpb25hbF9uZF9kZXNjcmlwdGlvbgogICAgLS0+CiAgICA8ZGl2IGlkPSJhMTF5V3JhcHBlciI+CiAgICAgIDxzbG90Pjwvc2xvdD4KICAgIDwvZGl2PgpgLGlzOiJwYXBlci1pbnB1dC1lcnJvciIsYmVoYXZpb3JzOltYYV0scHJvcGVydGllczp7aW52YWxpZDp7cmVhZE9ubHk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwLHR5cGU6Qm9vbGVhbn19LHVwZGF0ZTpmdW5jdGlvbih0KXt0aGlzLl9zZXRJbnZhbGlkKHQuaW52YWxpZCl9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBLYT17TmV4dExhYmVsSUQ6MSxOZXh0QWRkb25JRDoxLE5leHRJbnB1dElEOjF9LFphPXtwcm9wZXJ0aWVzOntsYWJlbDp7dHlwZTpTdHJpbmd9LHZhbHVlOntub3RpZnk6ITAsdHlwZTpTdHJpbmd9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGludmFsaWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxub3RpZnk6ITB9LGFsbG93ZWRQYXR0ZXJuOnt0eXBlOlN0cmluZ30sdHlwZTp7dHlwZTpTdHJpbmd9LGxpc3Q6e3R5cGU6U3RyaW5nfSxwYXR0ZXJuOnt0eXBlOlN0cmluZ30scmVxdWlyZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZXJyb3JNZXNzYWdlOnt0eXBlOlN0cmluZ30sY2hhckNvdW50ZXI6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sbm9MYWJlbEZsb2F0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGFsd2F5c0Zsb2F0TGFiZWw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYXV0b1ZhbGlkYXRlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LHZhbGlkYXRvcjp7dHlwZTpTdHJpbmd9LGF1dG9jb21wbGV0ZTp7dHlwZTpTdHJpbmcsdmFsdWU6Im9mZiJ9LGF1dG9mb2N1czp7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfYXV0b2ZvY3VzQ2hhbmdlZCJ9LGlucHV0bW9kZTp7dHlwZTpTdHJpbmd9LG1pbmxlbmd0aDp7dHlwZTpOdW1iZXJ9LG1heGxlbmd0aDp7dHlwZTpOdW1iZXJ9LG1pbjp7dHlwZTpTdHJpbmd9LG1heDp7dHlwZTpTdHJpbmd9LHN0ZXA6e3R5cGU6U3RyaW5nfSxuYW1lOnt0eXBlOlN0cmluZ30scGxhY2Vob2xkZXI6e3R5cGU6U3RyaW5nLHZhbHVlOiIifSxyZWFkb25seTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxzaXplOnt0eXBlOk51bWJlcn0sYXV0b2NhcGl0YWxpemU6e3R5cGU6U3RyaW5nLHZhbHVlOiJub25lIn0sYXV0b2NvcnJlY3Q6e3R5cGU6U3RyaW5nLHZhbHVlOiJvZmYifSxhdXRvc2F2ZTp7dHlwZTpTdHJpbmd9LHJlc3VsdHM6e3R5cGU6TnVtYmVyfSxhY2NlcHQ6e3R5cGU6U3RyaW5nfSxtdWx0aXBsZTp7dHlwZTpCb29sZWFufSxfYXJpYURlc2NyaWJlZEJ5Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sX2FyaWFMYWJlbGxlZEJ5Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sX2lucHV0SWQ6e3R5cGU6U3RyaW5nLHZhbHVlOiIifX0sbGlzdGVuZXJzOnsiYWRkb24tYXR0YWNoZWQiOiJfb25BZGRvbkF0dGFjaGVkIn0sa2V5QmluZGluZ3M6eyJzaGlmdCt0YWI6a2V5ZG93biI6Il9vblNoaWZ0VGFiRG93biJ9LGhvc3RBdHRyaWJ1dGVzOnt0YWJpbmRleDowfSxnZXQgaW5wdXRFbGVtZW50KCl7cmV0dXJuIHRoaXMuJHx8KHRoaXMuJD17fSksdGhpcy4kLmlucHV0fHwodGhpcy5fZ2VuZXJhdGVJbnB1dElkKCksdGhpcy4kLmlucHV0PXRoaXMuJCQoIiMiK3RoaXMuX2lucHV0SWQpKSx0aGlzLiQuaW5wdXR9LGdldCBfZm9jdXNhYmxlRWxlbWVudCgpe3JldHVybiB0aGlzLmlucHV0RWxlbWVudH0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuX3R5cGVzVGhhdEhhdmVUZXh0PVsiZGF0ZSIsImRhdGV0aW1lIiwiZGF0ZXRpbWUtbG9jYWwiLCJtb250aCIsInRpbWUiLCJ3ZWVrIiwiZmlsZSJdfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUFyaWFMYWJlbGxlZEJ5KCksIXdlJiZ0aGlzLmlucHV0RWxlbWVudCYmLTEhPT10aGlzLl90eXBlc1RoYXRIYXZlVGV4dC5pbmRleE9mKHRoaXMuaW5wdXRFbGVtZW50LnR5cGUpJiYodGhpcy5hbHdheXNGbG9hdExhYmVsPSEwKX0sX2FwcGVuZFN0cmluZ1dpdGhTcGFjZTpmdW5jdGlvbih0LGUpe3JldHVybiB0PXQ/dCsiICIrZTplfSxfb25BZGRvbkF0dGFjaGVkOmZ1bmN0aW9uKHQpe3ZhciBlPWVyKHQpLnJvb3RUYXJnZXQ7aWYoZS5pZCl0aGlzLl9hcmlhRGVzY3JpYmVkQnk9dGhpcy5fYXBwZW5kU3RyaW5nV2l0aFNwYWNlKHRoaXMuX2FyaWFEZXNjcmliZWRCeSxlLmlkKTtlbHNle3ZhciBuPSJwYXBlci1pbnB1dC1hZGQtb24tIitLYS5OZXh0QWRkb25JRCsrO2UuaWQ9bix0aGlzLl9hcmlhRGVzY3JpYmVkQnk9dGhpcy5fYXBwZW5kU3RyaW5nV2l0aFNwYWNlKHRoaXMuX2FyaWFEZXNjcmliZWRCeSxuKX19LHZhbGlkYXRlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5wdXRFbGVtZW50LnZhbGlkYXRlKCl9LF9mb2N1c0JsdXJIYW5kbGVyOmZ1bmN0aW9uKHQpe3JhLl9mb2N1c0JsdXJIYW5kbGVyLmNhbGwodGhpcyx0KSx0aGlzLmZvY3VzZWQmJiF0aGlzLl9zaGlmdFRhYlByZXNzZWQmJnRoaXMuX2ZvY3VzYWJsZUVsZW1lbnQmJnRoaXMuX2ZvY3VzYWJsZUVsZW1lbnQuZm9jdXMoKX0sX29uU2hpZnRUYWJEb3duOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpO3RoaXMuX3NoaWZ0VGFiUHJlc3NlZD0hMCx0aGlzLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCItMSIpLHRoaXMuYXN5bmMoKGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IixlKSx0aGlzLl9zaGlmdFRhYlByZXNzZWQ9ITF9KSwxKX0sX2hhbmRsZUF1dG9WYWxpZGF0ZTpmdW5jdGlvbigpe3RoaXMuYXV0b1ZhbGlkYXRlJiZ0aGlzLnZhbGlkYXRlKCl9LHVwZGF0ZVZhbHVlQW5kUHJlc2VydmVDYXJldDpmdW5jdGlvbih0KXt0cnl7dmFyIGU9dGhpcy5pbnB1dEVsZW1lbnQuc2VsZWN0aW9uU3RhcnQ7dGhpcy52YWx1ZT10LHRoaXMuaW5wdXRFbGVtZW50LnNlbGVjdGlvblN0YXJ0PWUsdGhpcy5pbnB1dEVsZW1lbnQuc2VsZWN0aW9uRW5kPWV9Y2F0Y2goZSl7dGhpcy52YWx1ZT10fX0sX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fHR9LF91cGRhdGVBcmlhTGFiZWxsZWRCeTpmdW5jdGlvbigpe3ZhciB0LGU9ZXIodGhpcy5yb290KS5xdWVyeVNlbGVjdG9yKCJsYWJlbCIpO2U/KGUuaWQ/dD1lLmlkOih0PSJwYXBlci1pbnB1dC1sYWJlbC0iK0thLk5leHRMYWJlbElEKyssZS5pZD10KSx0aGlzLl9hcmlhTGFiZWxsZWRCeT10KTp0aGlzLl9hcmlhTGFiZWxsZWRCeT0iIn0sX2dlbmVyYXRlSW5wdXRJZDpmdW5jdGlvbigpe3RoaXMuX2lucHV0SWQmJiIiIT09dGhpcy5faW5wdXRJZHx8KHRoaXMuX2lucHV0SWQ9ImlucHV0LSIrS2EuTmV4dElucHV0SUQrKyl9LF9vbkNoYW5nZTpmdW5jdGlvbih0KXt0aGlzLnNoYWRvd1Jvb3QmJnRoaXMuZmlyZSh0LnR5cGUse3NvdXJjZUV2ZW50OnR9LHtub2RlOnRoaXMsYnViYmxlczp0LmJ1YmJsZXMsY2FuY2VsYWJsZTp0LmNhbmNlbGFibGV9KX0sX2F1dG9mb2N1c0NoYW5nZWQ6ZnVuY3Rpb24oKXtpZih0aGlzLmF1dG9mb2N1cyYmdGhpcy5fZm9jdXNhYmxlRWxlbWVudCl7dmFyIHQ9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDt0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQmJnQhPT1kb2N1bWVudC5ib2R5JiZ0IT09ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50fHx0aGlzLl9mb2N1c2FibGVFbGVtZW50LmZvY3VzKCl9fX0sSmE9W3JhLFhvLFphXTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmpyKHtpczoicGFwZXItaW5wdXQiLF90ZW1wbGF0ZTp4ZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICA6aG9zdChbZm9jdXNlZF0pIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgaW5wdXQgewogICAgICAgIC8qIEZpcmVmb3ggc2V0cyBhIG1pbi13aWR0aCBvbiB0aGUgaW5wdXQsIHdoaWNoIGNhbiBjYXVzZSBsYXlvdXQgaXNzdWVzICovCiAgICAgICAgbWluLXdpZHRoOiAwOwogICAgICB9CgogICAgICAvKiBJbiAxLngsIHRoZSA8aW5wdXQ+IGlzIGRpc3RyaWJ1dGVkIHRvIHBhcGVyLWlucHV0LWNvbnRhaW5lciwgd2hpY2ggc3R5bGVzIGl0LgogICAgICBJbiAyLnggdGhlIDxpcm9uLWlucHV0PiBpcyBkaXN0cmlidXRlZCB0byBwYXBlci1pbnB1dC1jb250YWluZXIsIHdoaWNoIHN0eWxlcwogICAgICBpdCwgYnV0IGluIG9yZGVyIGZvciB0aGlzIHRvIHdvcmsgY29ycmVjdGx5LCB3ZSBuZWVkIHRvIHJlc2V0IHNvbWUKICAgICAgb2YgdGhlIG5hdGl2ZSBpbnB1dCdzIHByb3BlcnRpZXMgdG8gaW5oZXJpdCAoZnJvbSB0aGUgaXJvbi1pbnB1dCkgKi8KICAgICAgaXJvbi1pbnB1dCA+IGlucHV0IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItc2hhcmVkLWlucHV0LXN0eWxlOwogICAgICAgIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogICAgICAgIGZvbnQtd2VpZ2h0OiBpbmhlcml0OwogICAgICAgIGZvbnQtc2l6ZTogaW5oZXJpdDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogaW5oZXJpdDsKICAgICAgICB3b3JkLXNwYWNpbmc6IGluaGVyaXQ7CiAgICAgICAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7CiAgICAgICAgdGV4dC1zaGFkb3c6IGluaGVyaXQ7CiAgICAgICAgY29sb3I6IGluaGVyaXQ7CiAgICAgICAgY3Vyc29yOiBpbmhlcml0OwogICAgICB9CgogICAgICBpbnB1dDpkaXNhYmxlZCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LWRpc2FibGVkOwogICAgICB9CgogICAgICBpbnB1dDo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiwKICAgICAgaW5wdXQ6Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24gewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC13ZWJraXQtc3Bpbm5lcjsKICAgICAgfQoKICAgICAgaW5wdXQ6Oi13ZWJraXQtY2xlYXItYnV0dG9uIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtd2Via2l0LWNsZWFyOwogICAgICB9CgogICAgICBpbnB1dDo6LXdlYmtpdC1jYWxlbmRhci1waWNrZXItaW5kaWNhdG9yIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtd2Via2l0LWNhbGVuZGFyLXBpY2tlci1pbmRpY2F0b3I7CiAgICAgIH0KCiAgICAgIGlucHV0Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWNvbG9yLCB2YXIoLS1zZWNvbmRhcnktdGV4dC1jb2xvcikpOwogICAgICB9CgogICAgICBpbnB1dDotbW96LXBsYWNlaG9sZGVyIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWNvbG9yLCB2YXIoLS1zZWNvbmRhcnktdGV4dC1jb2xvcikpOwogICAgICB9CgogICAgICBpbnB1dDo6LW1vei1wbGFjZWhvbGRlciB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKICAgICAgfQoKICAgICAgaW5wdXQ6Oi1tcy1jbGVhciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLW1zLWNsZWFyOwogICAgICB9CgogICAgICBpbnB1dDo6LW1zLXJldmVhbCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLW1zLXJldmVhbDsKICAgICAgfQoKICAgICAgaW5wdXQ6LW1zLWlucHV0LXBsYWNlaG9sZGVyIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWNvbG9yLCB2YXIoLS1zZWNvbmRhcnktdGV4dC1jb2xvcikpOwogICAgICB9CgogICAgICBsYWJlbCB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHBhcGVyLWlucHV0LWNvbnRhaW5lciBpZD0iY29udGFpbmVyIiBuby1sYWJlbC1mbG9hdD0iW1tub0xhYmVsRmxvYXRdXSIgYWx3YXlzLWZsb2F0LWxhYmVsPSJbW19jb21wdXRlQWx3YXlzRmxvYXRMYWJlbChhbHdheXNGbG9hdExhYmVsLHBsYWNlaG9sZGVyKV1dIiBhdXRvLXZhbGlkYXRlJD0iW1thdXRvVmFsaWRhdGVdXSIgZGlzYWJsZWQkPSJbW2Rpc2FibGVkXV0iIGludmFsaWQ9IltbaW52YWxpZF1dIj4KCiAgICAgIDxzbG90IG5hbWU9InByZWZpeCIgc2xvdD0icHJlZml4Ij48L3Nsb3Q+CgogICAgICA8bGFiZWwgaGlkZGVuJD0iW1shbGFiZWxdXSIgYXJpYS1oaWRkZW49InRydWUiIGZvciQ9IltbX2lucHV0SWRdXSIgc2xvdD0ibGFiZWwiPltbbGFiZWxdXTwvbGFiZWw+CgogICAgICA8IS0tIE5lZWQgdG8gYmluZCBtYXhsZW5ndGggc28gdGhhdCB0aGUgcGFwZXItaW5wdXQtY2hhci1jb3VudGVyIHdvcmtzIGNvcnJlY3RseSAtLT4KICAgICAgPGlyb24taW5wdXQgYmluZC12YWx1ZT0ie3t2YWx1ZX19IiBzbG90PSJpbnB1dCIgY2xhc3M9ImlucHV0LWVsZW1lbnQiIGlkJD0iW1tfaW5wdXRJZF1dIiBtYXhsZW5ndGgkPSJbW21heGxlbmd0aF1dIiBhbGxvd2VkLXBhdHRlcm49IltbYWxsb3dlZFBhdHRlcm5dXSIgaW52YWxpZD0ie3tpbnZhbGlkfX0iIHZhbGlkYXRvcj0iW1t2YWxpZGF0b3JdXSI+CiAgICAgICAgPGlucHV0IGFyaWEtbGFiZWxsZWRieSQ9IltbX2FyaWFMYWJlbGxlZEJ5XV0iIGFyaWEtZGVzY3JpYmVkYnkkPSJbW19hcmlhRGVzY3JpYmVkQnldXSIgZGlzYWJsZWQkPSJbW2Rpc2FibGVkXV0iIHRpdGxlJD0iW1t0aXRsZV1dIiB0eXBlJD0iW1t0eXBlXV0iIHBhdHRlcm4kPSJbW3BhdHRlcm5dXSIgcmVxdWlyZWQkPSJbW3JlcXVpcmVkXV0iIGF1dG9jb21wbGV0ZSQ9IltbYXV0b2NvbXBsZXRlXV0iIGF1dG9mb2N1cyQ9IltbYXV0b2ZvY3VzXV0iIGlucHV0bW9kZSQ9IltbaW5wdXRtb2RlXV0iIG1pbmxlbmd0aCQ9IltbbWlubGVuZ3RoXV0iIG1heGxlbmd0aCQ9IltbbWF4bGVuZ3RoXV0iIG1pbiQ9IltbbWluXV0iIG1heCQ9IltbbWF4XV0iIHN0ZXAkPSJbW3N0ZXBdXSIgbmFtZSQ9IltbbmFtZV1dIiBwbGFjZWhvbGRlciQ9IltbcGxhY2Vob2xkZXJdXSIgcmVhZG9ubHkkPSJbW3JlYWRvbmx5XV0iIGxpc3QkPSJbW2xpc3RdXSIgc2l6ZSQ9Iltbc2l6ZV1dIiBhdXRvY2FwaXRhbGl6ZSQ9IltbYXV0b2NhcGl0YWxpemVdXSIgYXV0b2NvcnJlY3QkPSJbW2F1dG9jb3JyZWN0XV0iIG9uLWNoYW5nZT0iX29uQ2hhbmdlIiB0YWJpbmRleCQ9IltbdGFiSW5kZXhdXSIgYXV0b3NhdmUkPSJbW2F1dG9zYXZlXV0iIHJlc3VsdHMkPSJbW3Jlc3VsdHNdXSIgYWNjZXB0JD0iW1thY2NlcHRdXSIgbXVsdGlwbGUkPSJbW211bHRpcGxlXV0iIHJvbGUkPSJbW2lucHV0Um9sZV1dIiBhcmlhLWhhc3BvcHVwJD0iW1tpbnB1dEFyaWFIYXNwb3B1cF1dIj4KICAgICAgPC9pcm9uLWlucHV0PgoKICAgICAgPHNsb3QgbmFtZT0ic3VmZml4IiBzbG90PSJzdWZmaXgiPjwvc2xvdD4KCiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tlcnJvck1lc3NhZ2VdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0LWVycm9yIGFyaWEtbGl2ZT0iYXNzZXJ0aXZlIiBzbG90PSJhZGQtb24iPltbZXJyb3JNZXNzYWdlXV08L3BhcGVyLWlucHV0LWVycm9yPgogICAgICA8L3RlbXBsYXRlPgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NoYXJDb3VudGVyXV0iPgogICAgICAgIDxwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXIgc2xvdD0iYWRkLW9uIj48L3BhcGVyLWlucHV0LWNoYXItY291bnRlcj4KICAgICAgPC90ZW1wbGF0ZT4KCiAgICA8L3BhcGVyLWlucHV0LWNvbnRhaW5lcj4KICBgLGJlaGF2aW9yczpbSmEsZ2FdLHByb3BlcnRpZXM6e3ZhbHVlOnt0eXBlOlN0cmluZ30saW5wdXRSb2xlOnt0eXBlOlN0cmluZyx2YWx1ZTp2b2lkIDB9LGlucHV0QXJpYUhhc3BvcHVwOnt0eXBlOlN0cmluZyx2YWx1ZTp2b2lkIDB9fSxnZXQgX2ZvY3VzYWJsZUVsZW1lbnQoKXtyZXR1cm4gdGhpcy5pbnB1dEVsZW1lbnQuX2lucHV0RWxlbWVudH0sbGlzdGVuZXJzOnsiaXJvbi1pbnB1dC1yZWFkeSI6Il9vbklyb25JbnB1dFJlYWR5In0sX29uSXJvbklucHV0UmVhZHk6ZnVuY3Rpb24oKXt0aGlzLiQubmF0aXZlSW5wdXR8fCh0aGlzLiQubmF0aXZlSW5wdXQ9dGhpcy4kJCgiaW5wdXQiKSksdGhpcy5pbnB1dEVsZW1lbnQmJi0xIT09dGhpcy5fdHlwZXNUaGF0SGF2ZVRleHQuaW5kZXhPZih0aGlzLiQubmF0aXZlSW5wdXQudHlwZSkmJih0aGlzLmFsd2F5c0Zsb2F0TGFiZWw9ITApLHRoaXMuaW5wdXRFbGVtZW50LmJpbmRWYWx1ZSYmdGhpcy4kLmNvbnRhaW5lci5faGFuZGxlVmFsdWVBbmRBdXRvVmFsaWRhdGUodGhpcy5pbnB1dEVsZW1lbnQpfX0pLAovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KanIoe190ZW1wbGF0ZTp4ZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgfQoKICAgICAgI2NvbnRlbnRXcmFwcGVyIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KCiAgICAgICNjb250ZW50V3JhcHBlci5hbmltYXRpbmcgOjpzbG90dGVkKCopIHsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9ImNvbnRlbnRXcmFwcGVyIj4KICAgICAgPHNsb3QgaWQ9ImNvbnRlbnQiIG5hbWU9ImRyb3Bkb3duLWNvbnRlbnQiPjwvc2xvdD4KICAgIDwvZGl2PgpgLGlzOiJpcm9uLWRyb3Bkb3duIixiZWhhdmlvcnM6W3JhLFhvLFdhLFRhXSxwcm9wZXJ0aWVzOntob3Jpem9udGFsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJsZWZ0IixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHZlcnRpY2FsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJ0b3AiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sb3BlbkFuaW1hdGlvbkNvbmZpZzp7dHlwZTpPYmplY3R9LGNsb3NlQW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdH0sZm9jdXNUYXJnZXQ6e3R5cGU6T2JqZWN0fSxub0FuaW1hdGlvbnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sYWxsb3dPdXRzaWRlU2Nyb2xsOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9hbGxvd091dHNpZGVTY3JvbGxDaGFuZ2VkIn19LGxpc3RlbmVyczp7Im5lb24tYW5pbWF0aW9uLWZpbmlzaCI6Il9vbk5lb25BbmltYXRpb25GaW5pc2gifSxvYnNlcnZlcnM6WyJfdXBkYXRlT3ZlcmxheVBvc2l0aW9uKHBvc2l0aW9uVGFyZ2V0LCB2ZXJ0aWNhbEFsaWduLCBob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsT2Zmc2V0LCBob3Jpem9udGFsT2Zmc2V0KSJdLGdldCBjb250YWluZWRFbGVtZW50KCl7Zm9yKHZhciB0PWVyKHRoaXMuJC5jb250ZW50KS5nZXREaXN0cmlidXRlZE5vZGVzKCksZT0wLG49dC5sZW5ndGg7ZTxuO2UrKylpZih0W2VdLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuIHRbZV19LHJlYWR5OmZ1bmN0aW9uKCl7dGhpcy5zY3JvbGxBY3Rpb258fCh0aGlzLnNjcm9sbEFjdGlvbj10aGlzLmFsbG93T3V0c2lkZVNjcm9sbD8icmVmaXQiOiJsb2NrIiksdGhpcy5fcmVhZGllZD0hMH0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnNpemluZ1RhcmdldCYmdGhpcy5zaXppbmdUYXJnZXQhPT10aGlzfHwodGhpcy5zaXppbmdUYXJnZXQ9dGhpcy5jb250YWluZWRFbGVtZW50fHx0aGlzKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbEFuaW1hdGlvbigpfSxfb3BlbmVkQ2hhbmdlZDpmdW5jdGlvbigpe3RoaXMub3BlbmVkJiZ0aGlzLmRpc2FibGVkP3RoaXMuY2FuY2VsKCk6KHRoaXMuY2FuY2VsQW5pbWF0aW9uKCksdGhpcy5fdXBkYXRlQW5pbWF0aW9uQ29uZmlnKCksamEuX29wZW5lZENoYW5nZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sX3JlbmRlck9wZW5lZDpmdW5jdGlvbigpeyF0aGlzLm5vQW5pbWF0aW9ucyYmdGhpcy5hbmltYXRpb25Db25maWcub3Blbj8odGhpcy4kLmNvbnRlbnRXcmFwcGVyLmNsYXNzTGlzdC5hZGQoImFuaW1hdGluZyIpLHRoaXMucGxheUFuaW1hdGlvbigib3BlbiIpKTpqYS5fcmVuZGVyT3BlbmVkLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0sX3JlbmRlckNsb3NlZDpmdW5jdGlvbigpeyF0aGlzLm5vQW5pbWF0aW9ucyYmdGhpcy5hbmltYXRpb25Db25maWcuY2xvc2U/KHRoaXMuJC5jb250ZW50V3JhcHBlci5jbGFzc0xpc3QuYWRkKCJhbmltYXRpbmciKSx0aGlzLnBsYXlBbmltYXRpb24oImNsb3NlIikpOmphLl9yZW5kZXJDbG9zZWQuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfb25OZW9uQW5pbWF0aW9uRmluaXNoOmZ1bmN0aW9uKCl7dGhpcy4kLmNvbnRlbnRXcmFwcGVyLmNsYXNzTGlzdC5yZW1vdmUoImFuaW1hdGluZyIpLHRoaXMub3BlbmVkP3RoaXMuX2ZpbmlzaFJlbmRlck9wZW5lZCgpOnRoaXMuX2ZpbmlzaFJlbmRlckNsb3NlZCgpfSxfdXBkYXRlQW5pbWF0aW9uQ29uZmlnOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuY29udGFpbmVkRWxlbWVudCxlPVtdLmNvbmNhdCh0aGlzLm9wZW5BbmltYXRpb25Db25maWd8fFtdKS5jb25jYXQodGhpcy5jbG9zZUFuaW1hdGlvbkNvbmZpZ3x8W10pLG49MDtuPGUubGVuZ3RoO24rKyllW25dLm5vZGU9dDt0aGlzLmFuaW1hdGlvbkNvbmZpZz17b3Blbjp0aGlzLm9wZW5BbmltYXRpb25Db25maWcsY2xvc2U6dGhpcy5jbG9zZUFuaW1hdGlvbkNvbmZpZ319LF91cGRhdGVPdmVybGF5UG9zaXRpb246ZnVuY3Rpb24oKXt0aGlzLmlzQXR0YWNoZWQmJnRoaXMubm90aWZ5UmVzaXplKCl9LF9hbGxvd091dHNpZGVTY3JvbGxDaGFuZ2VkOmZ1bmN0aW9uKHQpe3RoaXMuX3JlYWRpZWQmJih0P3RoaXMuc2Nyb2xsQWN0aW9uJiYibG9jayIhPT10aGlzLnNjcm9sbEFjdGlvbnx8KHRoaXMuc2Nyb2xsQWN0aW9uPSJyZWZpdCIpOnRoaXMuc2Nyb2xsQWN0aW9uPSJsb2NrIil9LF9hcHBseUZvY3VzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5mb2N1c1RhcmdldHx8dGhpcy5jb250YWluZWRFbGVtZW50O3QmJnRoaXMub3BlbmVkJiYhdGhpcy5ub0F1dG9Gb2N1cz90LmZvY3VzKCk6amEuX2FwcGx5Rm9jdXMuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0pOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgUWE9e3Byb3BlcnRpZXM6e2FuaW1hdGlvblRpbWluZzp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57ZHVyYXRpb246NTAwLGVhc2luZzoiY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKSIsZmlsbDoiYm90aCJ9fX19LGlzTmVvbkFuaW1hdGlvbjohMCxjcmVhdGVkOmZ1bmN0aW9uKCl7ZG9jdW1lbnQuYm9keS5hbmltYXRlfHxjb25zb2xlLndhcm4oIk5vIHdlYiBhbmltYXRpb25zIGRldGVjdGVkLiBUaGlzIGVsZW1lbnQgd2lsbCBub3QgZnVuY3Rpb24gd2l0aG91dCBhIHdlYiBhbmltYXRpb25zIHBvbHlmaWxsLiIpfSx0aW1pbmdGcm9tQ29uZmlnOmZ1bmN0aW9uKHQpe2lmKHQudGltaW5nKWZvcih2YXIgZSBpbiB0LnRpbWluZyl0aGlzLmFuaW1hdGlvblRpbWluZ1tlXT10LnRpbWluZ1tlXTtyZXR1cm4gdGhpcy5hbmltYXRpb25UaW1pbmd9LHNldFByZWZpeGVkUHJvcGVydHk6ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaSxyPXt0cmFuc2Zvcm06WyJ3ZWJraXRUcmFuc2Zvcm0iXSx0cmFuc2Zvcm1PcmlnaW46WyJtb3pUcmFuc2Zvcm1PcmlnaW4iLCJ3ZWJraXRUcmFuc2Zvcm1PcmlnaW4iXX1bZV0sbz0wO2k9cltvXTtvKyspdC5zdHlsZVtpXT1uO3Quc3R5bGVbZV09bn0sY29tcGxldGU6ZnVuY3Rpb24odCl7fX07Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqL2pyKHtpczoiZmFkZS1pbi1hbmltYXRpb24iLGJlaGF2aW9yczpbUWFdLGNvbmZpZ3VyZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdCh0Lm5vZGUsW3tvcGFjaXR5OiIwIn0se29wYWNpdHk6IjEifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKHQpKSx0aGlzLl9lZmZlY3R9fSksCi8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpqcih7aXM6ImZhZGUtb3V0LWFuaW1hdGlvbiIsYmVoYXZpb3JzOltRYV0sY29uZmlndXJlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9lZmZlY3Q9bmV3IEtleWZyYW1lRWZmZWN0KHQubm9kZSxbe29wYWNpdHk6IjEifSx7b3BhY2l0eToiMCJ9XSx0aGlzLnRpbWluZ0Zyb21Db25maWcodCkpLHRoaXMuX2VmZmVjdH19KSwKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmpyKHtpczoicGFwZXItbWVudS1ncm93LWhlaWdodC1hbmltYXRpb24iLF90ZW1wbGF0ZTpudWxsLGJlaGF2aW9yczpbUWFdLGNvbmZpZ3VyZTpmdW5jdGlvbih0KXt2YXIgZT10Lm5vZGUsbj1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtyZXR1cm4gdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChlLFt7aGVpZ2h0Om4vMisicHgifSx7aGVpZ2h0Om4rInB4In1dLHRoaXMudGltaW5nRnJvbUNvbmZpZyh0KSksdGhpcy5fZWZmZWN0fX0pLGpyKHtpczoicGFwZXItbWVudS1ncm93LXdpZHRoLWFuaW1hdGlvbiIsX3RlbXBsYXRlOm51bGwsYmVoYXZpb3JzOltRYV0sY29uZmlndXJlOmZ1bmN0aW9uKHQpe3ZhciBlPXQubm9kZSxuPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7cmV0dXJuIHRoaXMuX2VmZmVjdD1uZXcgS2V5ZnJhbWVFZmZlY3QoZSxbe3dpZHRoOm4vMisicHgifSx7d2lkdGg6bisicHgifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKHQpKSx0aGlzLl9lZmZlY3R9fSksanIoe2lzOiJwYXBlci1tZW51LXNocmluay13aWR0aC1hbmltYXRpb24iLF90ZW1wbGF0ZTpudWxsLGJlaGF2aW9yczpbUWFdLGNvbmZpZ3VyZTpmdW5jdGlvbih0KXt2YXIgZT10Lm5vZGUsbj1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO3JldHVybiB0aGlzLl9lZmZlY3Q9bmV3IEtleWZyYW1lRWZmZWN0KGUsW3t3aWR0aDpuKyJweCJ9LHt3aWR0aDpuLW4vMjArInB4In1dLHRoaXMudGltaW5nRnJvbUNvbmZpZyh0KSksdGhpcy5fZWZmZWN0fX0pLGpyKHtpczoicGFwZXItbWVudS1zaHJpbmstaGVpZ2h0LWFuaW1hdGlvbiIsX3RlbXBsYXRlOm51bGwsYmVoYXZpb3JzOltRYV0sY29uZmlndXJlOmZ1bmN0aW9uKHQpe3ZhciBlPXQubm9kZSxuPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O3JldHVybiB0aGlzLnNldFByZWZpeGVkUHJvcGVydHkoZSwidHJhbnNmb3JtT3JpZ2luIiwiMCAwIiksdGhpcy5fZWZmZWN0PW5ldyBLZXlmcmFtZUVmZmVjdChlLFt7aGVpZ2h0Om4rInB4Iix0cmFuc2Zvcm06InRyYW5zbGF0ZVkoMCkifSx7aGVpZ2h0Om4vMisicHgiLHRyYW5zZm9ybToidHJhbnNsYXRlWSgtMjBweCkifV0sdGhpcy50aW1pbmdGcm9tQ29uZmlnKHQpKSx0aGlzLl9lZmZlY3R9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwp2YXIgdHM9e0FOSU1BVElPTl9DVUJJQ19CRVpJRVI6ImN1YmljLWJlemllciguMywuOTUsLjUsMSkiLE1BWF9BTklNQVRJT05fVElNRV9NUzo0MDB9O2NvbnN0IGVzPWpyKHtfdGVtcGxhdGU6eGVgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICBvdXRsaW5lOiBub25lOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1tZW51LWJ1dHRvbjsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgewogICAgICAgIGN1cnNvcjogYXV0bzsKICAgICAgICBjb2xvcjogdmFyKC0tZGlzYWJsZWQtdGV4dC1jb2xvcik7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uLWRpc2FibGVkOwogICAgICB9CgogICAgICBpcm9uLWRyb3Bkb3duIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tZW51LWJ1dHRvbi1kcm9wZG93bjsKICAgICAgfQoKICAgICAgLmRyb3Bkb3duLWNvbnRlbnQgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMmRwOwoKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLW1lbnUtYnV0dG9uLWRyb3Bkb3duLWJhY2tncm91bmQsIHZhcigtLXByaW1hcnktYmFja2dyb3VuZC1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1tZW51LWJ1dHRvbi1jb250ZW50OwogICAgICB9CgogICAgICA6aG9zdChbdmVydGljYWwtYWxpZ249InRvcCJdKSAuZHJvcGRvd24tY29udGVudCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMjBweDsKICAgICAgICBtYXJnaW4tdG9wOiAtMTBweDsKICAgICAgICB0b3A6IDEwcHg7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbC1hbGlnbj0iYm90dG9tIl0pIC5kcm9wZG93bi1jb250ZW50IHsKICAgICAgICBib3R0b206IDEwcHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogLTEwcHg7CiAgICAgICAgbWFyZ2luLXRvcDogMjBweDsKICAgICAgfQoKICAgICAgI3RyaWdnZXIgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJ0cmlnZ2VyIiBvbi10YXA9InRvZ2dsZSI+CiAgICAgIDxzbG90IG5hbWU9ImRyb3Bkb3duLXRyaWdnZXIiPjwvc2xvdD4KICAgIDwvZGl2PgoKICAgIDxpcm9uLWRyb3Bkb3duIGlkPSJkcm9wZG93biIgb3BlbmVkPSJ7e29wZW5lZH19IiBob3Jpem9udGFsLWFsaWduPSJbW2hvcml6b250YWxBbGlnbl1dIiB2ZXJ0aWNhbC1hbGlnbj0iW1t2ZXJ0aWNhbEFsaWduXV0iIGR5bmFtaWMtYWxpZ249IltbZHluYW1pY0FsaWduXV0iIGhvcml6b250YWwtb2Zmc2V0PSJbW2hvcml6b250YWxPZmZzZXRdXSIgdmVydGljYWwtb2Zmc2V0PSJbW3ZlcnRpY2FsT2Zmc2V0XV0iIG5vLW92ZXJsYXA9Iltbbm9PdmVybGFwXV0iIG9wZW4tYW5pbWF0aW9uLWNvbmZpZz0iW1tvcGVuQW5pbWF0aW9uQ29uZmlnXV0iIGNsb3NlLWFuaW1hdGlvbi1jb25maWc9IltbY2xvc2VBbmltYXRpb25Db25maWddXSIgbm8tYW5pbWF0aW9ucz0iW1tub0FuaW1hdGlvbnNdXSIgZm9jdXMtdGFyZ2V0PSJbW19kcm9wZG93bkNvbnRlbnRdXSIgYWxsb3ctb3V0c2lkZS1zY3JvbGw9IltbYWxsb3dPdXRzaWRlU2Nyb2xsXV0iIHJlc3RvcmUtZm9jdXMtb24tY2xvc2U9IltbcmVzdG9yZUZvY3VzT25DbG9zZV1dIiBvbi1pcm9uLW92ZXJsYXktY2FuY2VsZWQ9Il9fb25Jcm9uT3ZlcmxheUNhbmNlbGVkIiBleHBhbmQtc2l6aW5nLXRhcmdldC1mb3Itc2Nyb2xsYmFycz0iW1tleHBhbmRTaXppbmdUYXJnZXRGb3JTY3JvbGxiYXJzXV0iPgogICAgICA8ZGl2IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIGNsYXNzPSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICA8c2xvdCBpZD0iY29udGVudCIgbmFtZT0iZHJvcGRvd24tY29udGVudCI+PC9zbG90PgogICAgICA8L2Rpdj4KICAgIDwvaXJvbi1kcm9wZG93bj4KYCxpczoicGFwZXItbWVudS1idXR0b24iLGJlaGF2aW9yczpbWG8scmFdLHByb3BlcnRpZXM6e29wZW5lZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMCxvYnNlcnZlcjoiX29wZW5lZENoYW5nZWQifSxob3Jpem9udGFsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJsZWZ0IixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LHZlcnRpY2FsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJ0b3AiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sZHluYW1pY0FsaWduOnt0eXBlOkJvb2xlYW59LGhvcml6b250YWxPZmZzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwfSx2ZXJ0aWNhbE9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITB9LG5vT3ZlcmxhcDp7dHlwZTpCb29sZWFufSxub0FuaW1hdGlvbnM6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0saWdub3JlU2VsZWN0Ont0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGNsb3NlT25BY3RpdmF0ZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxvcGVuQW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVyblt7bmFtZToiZmFkZS1pbi1hbmltYXRpb24iLHRpbWluZzp7ZGVsYXk6MTAwLGR1cmF0aW9uOjIwMH19LHtuYW1lOiJwYXBlci1tZW51LWdyb3ctd2lkdGgtYW5pbWF0aW9uIix0aW1pbmc6e2RlbGF5OjEwMCxkdXJhdGlvbjoxNTAsZWFzaW5nOnRzLkFOSU1BVElPTl9DVUJJQ19CRVpJRVJ9fSx7bmFtZToicGFwZXItbWVudS1ncm93LWhlaWdodC1hbmltYXRpb24iLHRpbWluZzp7ZGVsYXk6MTAwLGR1cmF0aW9uOjI3NSxlYXNpbmc6dHMuQU5JTUFUSU9OX0NVQklDX0JFWklFUn19XX19LGNsb3NlQW5pbWF0aW9uQ29uZmlnOnt0eXBlOk9iamVjdCx2YWx1ZTpmdW5jdGlvbigpe3JldHVyblt7bmFtZToiZmFkZS1vdXQtYW5pbWF0aW9uIix0aW1pbmc6e2R1cmF0aW9uOjE1MH19LHtuYW1lOiJwYXBlci1tZW51LXNocmluay13aWR0aC1hbmltYXRpb24iLHRpbWluZzp7ZGVsYXk6MTAwLGR1cmF0aW9uOjUwLGVhc2luZzp0cy5BTklNQVRJT05fQ1VCSUNfQkVaSUVSfX0se25hbWU6InBhcGVyLW1lbnUtc2hyaW5rLWhlaWdodC1hbmltYXRpb24iLHRpbWluZzp7ZHVyYXRpb246MjAwLGVhc2luZzoiZWFzZS1pbiJ9fV19fSxhbGxvd091dHNpZGVTY3JvbGw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0scmVzdG9yZUZvY3VzT25DbG9zZTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxleHBhbmRTaXppbmdUYXJnZXRGb3JTY3JvbGxiYXJzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9kcm9wZG93bkNvbnRlbnQ6e3R5cGU6T2JqZWN0fX0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6Imdyb3VwIiwiYXJpYS1oYXNwb3B1cCI6InRydWUifSxsaXN0ZW5lcnM6eyJpcm9uLWFjdGl2YXRlIjoiX29uSXJvbkFjdGl2YXRlIiwiaXJvbi1zZWxlY3QiOiJfb25Jcm9uU2VsZWN0In0sZ2V0IGNvbnRlbnRFbGVtZW50KCl7Zm9yKHZhciB0PWVyKHRoaXMuJC5jb250ZW50KS5nZXREaXN0cmlidXRlZE5vZGVzKCksZT0wLG49dC5sZW5ndGg7ZTxuO2UrKylpZih0W2VdLm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUpcmV0dXJuIHRbZV19LHRvZ2dsZTpmdW5jdGlvbigpe3RoaXMub3BlbmVkP3RoaXMuY2xvc2UoKTp0aGlzLm9wZW4oKX0sb3BlbjpmdW5jdGlvbigpe3RoaXMuZGlzYWJsZWR8fHRoaXMuJC5kcm9wZG93bi5vcGVuKCl9LGNsb3NlOmZ1bmN0aW9uKCl7dGhpcy4kLmRyb3Bkb3duLmNsb3NlKCl9LF9vbklyb25TZWxlY3Q6ZnVuY3Rpb24odCl7dGhpcy5pZ25vcmVTZWxlY3R8fHRoaXMuY2xvc2UoKX0sX29uSXJvbkFjdGl2YXRlOmZ1bmN0aW9uKHQpe3RoaXMuY2xvc2VPbkFjdGl2YXRlJiZ0aGlzLmNsb3NlKCl9LF9vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKHQsZSl7dD8odGhpcy5fZHJvcGRvd25Db250ZW50PXRoaXMuY29udGVudEVsZW1lbnQsdGhpcy5maXJlKCJwYXBlci1kcm9wZG93bi1vcGVuIikpOm51bGwhPWUmJnRoaXMuZmlyZSgicGFwZXItZHJvcGRvd24tY2xvc2UiKX0sX2Rpc2FibGVkQ2hhbmdlZDpmdW5jdGlvbih0KXtyYS5fZGlzYWJsZWRDaGFuZ2VkLmFwcGx5KHRoaXMsYXJndW1lbnRzKSx0JiZ0aGlzLm9wZW5lZCYmdGhpcy5jbG9zZSgpfSxfX29uSXJvbk92ZXJsYXlDYW5jZWxlZDpmdW5jdGlvbih0KXt2YXIgZT10aGlzLiQudHJpZ2dlcjtlcih0LmRldGFpbCkucGF0aC5pbmRleE9mKGUpPi0xJiZ0LnByZXZlbnREZWZhdWx0KCl9fSk7T2JqZWN0LmtleXModHMpLmZvckVhY2goKGZ1bmN0aW9uKHQpe2VzW3RdPXRzW3RdfSkpOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgbnM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTtucy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZGlzcGxheTogbm9uZTsiKSxucy5pbm5lckhUTUw9Jzxpcm9uLWljb25zZXQtc3ZnIG5hbWU9InBhcGVyLWRyb3Bkb3duLW1lbnUiIHNpemU9IjI0Ij5cbjxzdmc+PGRlZnM+XG48ZyBpZD0iYXJyb3ctZHJvcC1kb3duIj48cGF0aCBkPSJNNyAxMGw1IDUgNS01eiI+PC9wYXRoPjwvZz5cbjwvZGVmcz48L3N2Zz5cbjwvaXJvbi1pY29uc2V0LXN2Zz4nLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQobnMuY29udGVudCk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNiBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBpcz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpO2lzLnNldEF0dHJpYnV0ZSgic3R5bGUiLCJkaXNwbGF5OiBub25lOyIpLGlzLmlubmVySFRNTD0nPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWRyb3Bkb3duLW1lbnUtc2hhcmVkLXN0eWxlcyI+XG4gIDx0ZW1wbGF0ZT5cbiAgICA8c3R5bGU+XG4gICAgICA6aG9zdCB7XG4gICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0O1xuXG4gICAgICAgIC8qIE5PVEUoY2RhdGEpOiBCb3RoIHZhbHVlcyBhcmUgbmVlZGVkLCBzaW5jZSBzb21lIHBob25lcyByZXF1aXJlIHRoZVxuICAgICAgICAgKiB2YWx1ZSB0byBiZSBgdHJhbnNwYXJlbnRgLlxuICAgICAgICAgKi9cbiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsMCwwLDApO1xuICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50O1xuXG4gICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7XG4gICAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICAgICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzO1xuICAgICAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICAgIGN1cnNvcjogcG9pbnRlcjtcbiAgICAgICAgfTtcblxuICAgICAgICBAYXBwbHkgLS1wYXBlci1kcm9wZG93bi1tZW51O1xuICAgICAgfVxuXG4gICAgICAvKiBwYXBlci1kcm9wZG93bi1tZW51IGFuZCBwYXBlci1kcm9wZG93bi1tZW51LWxpZ2h0IGJvdGggZGVsZWdhdGUgZm9jdXNcbiAgICAgICAqIHRvIG90aGVyIGludGVybmFsIGVsZW1lbnRzIHdoaWNoIG1hbmFnZSBmb2N1cyBzdHlsaW5nLiAqL1xuICAgICAgOmhvc3QoOmZvY3VzKSB7XG4gICAgICAgIG91dGxpbmU6IG5vbmU7XG4gICAgICB9XG5cbiAgICAgIDpob3N0KDpkaXIocnRsKSkge1xuICAgICAgICB0ZXh0LWFsaWduOiByaWdodDtcblxuICAgICAgICBAYXBwbHkoLS1wYXBlci1kcm9wZG93bi1tZW51KTtcbiAgICAgIH1cblxuICAgICAgOmhvc3QoW2Rpc2FibGVkXSkge1xuICAgICAgICBAYXBwbHkgLS1wYXBlci1kcm9wZG93bi1tZW51LWRpc2FibGVkO1xuICAgICAgfVxuXG4gICAgICA6aG9zdChbbm9pbmtdKSBwYXBlci1yaXBwbGUge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfVxuXG4gICAgICA6aG9zdChbbm8tbGFiZWwtZmxvYXRdKSBwYXBlci1yaXBwbGUge1xuICAgICAgICB0b3A6IDhweDtcbiAgICAgIH1cblxuICAgICAgcGFwZXItcmlwcGxlIHtcbiAgICAgICAgdG9wOiAxMnB4O1xuICAgICAgICBsZWZ0OiAwcHg7XG4gICAgICAgIGJvdHRvbTogOHB4O1xuICAgICAgICByaWdodDogMHB4O1xuXG4gICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtcmlwcGxlO1xuICAgICAgfVxuXG4gICAgICBwYXBlci1tZW51LWJ1dHRvbiB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBwYWRkaW5nOiAwO1xuXG4gICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtYnV0dG9uO1xuICAgICAgfVxuXG4gICAgICBwYXBlci1pbnB1dCB7XG4gICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtaW5wdXQ7XG4gICAgICB9XG5cbiAgICAgIGlyb24taWNvbiB7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1kaXNhYmxlZC10ZXh0LWNvbG9yKTtcblxuICAgICAgICBAYXBwbHkgLS1wYXBlci1kcm9wZG93bi1tZW51LWljb247XG4gICAgICB9XG4gICAgPC9zdHlsZT5cbiAgPC90ZW1wbGF0ZT5cbjwvZG9tLW1vZHVsZT4nLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoaXMuY29udGVudCk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBycz1jcihIVE1MRWxlbWVudCk7anIoe190ZW1wbGF0ZTp4ZWAKICAgIDxzdHlsZSBpbmNsdWRlPSJwYXBlci1kcm9wZG93bi1tZW51LXNoYXJlZC1zdHlsZXMiPjwvc3R5bGU+CgogICAgPHBhcGVyLW1lbnUtYnV0dG9uIGlkPSJtZW51QnV0dG9uIiB2ZXJ0aWNhbC1hbGlnbj0iW1t2ZXJ0aWNhbEFsaWduXV0iIGhvcml6b250YWwtYWxpZ249IltbaG9yaXpvbnRhbEFsaWduXV0iIGR5bmFtaWMtYWxpZ249IltbZHluYW1pY0FsaWduXV0iIHZlcnRpY2FsLW9mZnNldD0iW1tfY29tcHV0ZU1lbnVWZXJ0aWNhbE9mZnNldChub0xhYmVsRmxvYXQsIHZlcnRpY2FsT2Zmc2V0KV1dIiBkaXNhYmxlZD0iW1tkaXNhYmxlZF1dIiBuby1hbmltYXRpb25zPSJbW25vQW5pbWF0aW9uc11dIiBvbi1pcm9uLXNlbGVjdD0iX29uSXJvblNlbGVjdCIgb24taXJvbi1kZXNlbGVjdD0iX29uSXJvbkRlc2VsZWN0IiBvcGVuZWQ9Int7b3BlbmVkfX0iIGNsb3NlLW9uLWFjdGl2YXRlIGFsbG93LW91dHNpZGUtc2Nyb2xsPSJbW2FsbG93T3V0c2lkZVNjcm9sbF1dIiByZXN0b3JlLWZvY3VzLW9uLWNsb3NlPSJbW3Jlc3RvcmVGb2N1c09uQ2xvc2VdXSIgZXhwYW5kLXNpemluZy10YXJnZXQtZm9yLXNjcm9sbGJhcnM9IltbZXhwYW5kU2l6aW5nVGFyZ2V0Rm9yU2Nyb2xsYmFyc11dIj4KICAgICAgPCEtLSBzdXBwb3J0IGh5YnJpZCBtb2RlOiB1c2VyIG1pZ2h0IGJlIHVzaW5nIHBhcGVyLW1lbnUtYnV0dG9uIDEueCB3aGljaCBkaXN0cmlidXRlcyB2aWEgPGNvbnRlbnQ+IC0tPgogICAgICA8ZGl2IGNsYXNzPSJkcm9wZG93bi10cmlnZ2VyIiBzbG90PSJkcm9wZG93bi10cmlnZ2VyIj4KICAgICAgICA8cGFwZXItcmlwcGxlPjwvcGFwZXItcmlwcGxlPgogICAgICAgIDwhLS0gcGFwZXItaW5wdXQgaGFzIHR5cGU9InRleHQiIGZvciBhMTF5LCBkbyBub3QgcmVtb3ZlIC0tPgogICAgICAgIDxwYXBlci1pbnB1dCBpZD0iaW5wdXQiIHR5cGU9InRleHQiIGludmFsaWQ9IltbaW52YWxpZF1dIiByZWFkb25seSBkaXNhYmxlZD0iW1tkaXNhYmxlZF1dIiB2YWx1ZT0iW1t2YWx1ZV1dIiBwbGFjZWhvbGRlcj0iW1twbGFjZWhvbGRlcl1dIiBlcnJvci1tZXNzYWdlPSJbW2Vycm9yTWVzc2FnZV1dIiBhbHdheXMtZmxvYXQtbGFiZWw9IltbYWx3YXlzRmxvYXRMYWJlbF1dIiBuby1sYWJlbC1mbG9hdD0iW1tub0xhYmVsRmxvYXRdXSIgbGFiZWw9IltbbGFiZWxdXSIgaW5wdXQtcm9sZT0iYnV0dG9uIiBpbnB1dC1hcmlhLWhhc3BvcHVwPSJsaXN0Ym94IiBhdXRvY29tcGxldGU9Im9mZiI+CiAgICAgICAgICA8IS0tIHN1cHBvcnQgaHlicmlkIG1vZGU6IHVzZXIgbWlnaHQgYmUgdXNpbmcgcGFwZXItaW5wdXQgMS54IHdoaWNoIGRpc3RyaWJ1dGVzIHZpYSA8Y29udGVudD4gLS0+CiAgICAgICAgICA8aXJvbi1pY29uIGljb249InBhcGVyLWRyb3Bkb3duLW1lbnU6YXJyb3ctZHJvcC1kb3duIiBzdWZmaXggc2xvdD0ic3VmZml4Ij48L2lyb24taWNvbj4KICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICA8L2Rpdj4KICAgICAgPHNsb3QgaWQ9ImNvbnRlbnQiIG5hbWU9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPjwvc2xvdD4KICAgIDwvcGFwZXItbWVudS1idXR0b24+CmAsaXM6InBhcGVyLWRyb3Bkb3duLW1lbnUiLGJlaGF2aW9yczpbYWEscmEsZ2EseWFdLHByb3BlcnRpZXM6e3NlbGVjdGVkSXRlbUxhYmVsOnt0eXBlOlN0cmluZyxub3RpZnk6ITAscmVhZE9ubHk6ITB9LHNlbGVjdGVkSXRlbTp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRPbmx5OiEwfSx2YWx1ZTp7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSxsYWJlbDp7dHlwZTpTdHJpbmd9LHBsYWNlaG9sZGVyOnt0eXBlOlN0cmluZ30sZXJyb3JNZXNzYWdlOnt0eXBlOlN0cmluZ30sb3BlbmVkOnt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLHZhbHVlOiExLG9ic2VydmVyOiJfb3BlbmVkQ2hhbmdlZCJ9LGFsbG93T3V0c2lkZVNjcm9sbDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxub0xhYmVsRmxvYXQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9LGFsd2F5c0Zsb2F0TGFiZWw6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sbm9BbmltYXRpb25zOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGhvcml6b250YWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6InJpZ2h0In0sdmVydGljYWxBbGlnbjp7dHlwZTpTdHJpbmcsdmFsdWU6InRvcCJ9LHZlcnRpY2FsT2Zmc2V0Ok51bWJlcixkeW5hbWljQWxpZ246e3R5cGU6Qm9vbGVhbn0scmVzdG9yZUZvY3VzT25DbG9zZTp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxleHBhbmRTaXppbmdUYXJnZXRGb3JTY3JvbGxiYXJzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxsaXN0ZW5lcnM6e3RhcDoiX29uVGFwIn0sa2V5QmluZGluZ3M6eyJ1cCBkb3duIjoib3BlbiIsZXNjOiJjbG9zZSJ9LG9ic2VydmVyczpbIl9zZWxlY3RlZEl0ZW1DaGFuZ2VkKHNlbGVjdGVkSXRlbSkiXSxfYXR0YWNoRG9tKHQpe2NvbnN0IGU9WSh0aGlzKTtyZXR1cm4gZS5hdHRhY2hTaGFkb3coe21vZGU6Im9wZW4iLGRlbGVnYXRlc0ZvY3VzOiEwLHNoYWR5VXBncmFkZUZyYWdtZW50OnR9KSxlLnNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQodCkscnMucHJvdG90eXBlLl9hdHRhY2hEb20uY2FsbCh0aGlzLHQpfSxmb2N1cygpe3RoaXMuJC5pbnB1dC5fZm9jdXNhYmxlRWxlbWVudC5mb2N1cygpfSxhdHRhY2hlZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuY29udGVudEVsZW1lbnQ7dCYmdC5zZWxlY3RlZEl0ZW0mJnRoaXMuX3NldFNlbGVjdGVkSXRlbSh0LnNlbGVjdGVkSXRlbSl9LGdldCBjb250ZW50RWxlbWVudCgpe2Zvcih2YXIgdD1lcih0aGlzLiQuY29udGVudCkuZ2V0RGlzdHJpYnV0ZWROb2RlcygpLGU9MCxuPXQubGVuZ3RoO2U8bjtlKyspaWYodFtlXS5ub2RlVHlwZT09PU5vZGUuRUxFTUVOVF9OT0RFKXJldHVybiB0W2VdfSxvcGVuOmZ1bmN0aW9uKCl7dGhpcy4kLm1lbnVCdXR0b24ub3BlbigpfSxjbG9zZTpmdW5jdGlvbigpe3RoaXMuJC5tZW51QnV0dG9uLmNsb3NlKCl9LF9vbklyb25TZWxlY3Q6ZnVuY3Rpb24odCl7dGhpcy5fc2V0U2VsZWN0ZWRJdGVtKHQuZGV0YWlsLml0ZW0pfSxfb25Jcm9uRGVzZWxlY3Q6ZnVuY3Rpb24odCl7dGhpcy5fc2V0U2VsZWN0ZWRJdGVtKG51bGwpfSxfb25UYXA6ZnVuY3Rpb24odCl7dmkodCk9PT10aGlzJiZ0aGlzLm9wZW4oKX0sX3NlbGVjdGVkSXRlbUNoYW5nZWQ6ZnVuY3Rpb24odCl7dmFyIGU9IiI7ZT10P3QubGFiZWx8fHQuZ2V0QXR0cmlidXRlKCJsYWJlbCIpfHx0LnRleHRDb250ZW50LnRyaW0oKToiIix0aGlzLnZhbHVlPWUsdGhpcy5fc2V0U2VsZWN0ZWRJdGVtTGFiZWwoZSl9LF9jb21wdXRlTWVudVZlcnRpY2FsT2Zmc2V0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV8fCh0Py00OjgpfSxfZ2V0VmFsaWRpdHk6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGlzYWJsZWR8fCF0aGlzLnJlcXVpcmVkfHx0aGlzLnJlcXVpcmVkJiYhIXRoaXMudmFsdWV9LF9vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb250ZW50RWxlbWVudDt0JiZ0LnNldEF0dHJpYnV0ZSgiYXJpYS1leHBhbmRlZCIsdGhpcy5vcGVuZWQ/InRydWUiOiJmYWxzZSIpfX0pOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KdmFyIG9zPXtvdXRlclNjcm9sbDp7c2Nyb2xsOiEwfSxzaGFkb3dNb2RlOntzdGFuZGFyZDoyLHdhdGVyZmFsbDoxLCJ3YXRlcmZhbGwtdGFsbCI6MX0sdGFsbE1vZGU6eyJ3YXRlcmZhbGwtdGFsbCI6ITB9fTtqcih7X3RlbXBsYXRlOnhlYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsOwogICAgICB9CgogICAgICAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDsKICAgICAgfQoKICAgICAgI21haW5QYW5lbCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1ib2R5OwogICAgICB9CgogICAgICAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbW9kZTogc2Nyb2xsCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT1zY3JvbGxdKSAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXNjcm9sbC1jb250YWluZXI7CiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7CiAgICAgIH0KCiAgICAgIDpob3N0KFttb2RlPXNjcm9sbF0pIHsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1vZGU6IGNvdmVyCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT1jb3Zlcl0pICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtY292ZXItY29udGFpbmVyOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIDpob3N0KFttb2RlPWNvdmVyXSkgI21haW5QYW5lbCB7CiAgICAgICAgcG9zaXRpb246IHN0YXRpYzsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbW9kZTogc3RhbmRhcmQKICAgICAgICovCiAgICAgIDpob3N0KFttb2RlPXN0YW5kYXJkXSkgI21haW5Db250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1zdGFuZGFyZC1jb250YWluZXI7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1vZGU6IHNlYW1lZAogICAgICAgKi8KICAgICAgOmhvc3QoW21vZGU9c2VhbWVkXSkgI21haW5Db250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1zZWFtZWQtY29udGFpbmVyOwogICAgICB9CgoKICAgICAgLyoKICAgICAgICogbW9kZTogd2F0ZXJmYWxsCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT13YXRlcmZhbGxdKSAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXdhdGVyZmFsbC1jb250YWluZXI7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1vZGU6IHdhdGVyZmFsbC10YWxsCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT13YXRlcmZhbGwtdGFsbF0pICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtd2F0ZXJmYWxsLXRhbGwtY29udGFpbmVyOwogICAgICB9CgogICAgICAjZHJvcFNoYWRvdyB7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjVzOwogICAgICAgIGhlaWdodDogNnB4OwogICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDBweCA1cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1zaGFkb3c7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgICNkcm9wU2hhZG93Lmhhcy1zaGFkb3cgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgICNtYWluQ29udGFpbmVyID4gOjpzbG90dGVkKC5maXQpIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwogICAgICB9CgogICAgPC9zdHlsZT4KCiAgICA8c2xvdCBpZD0iaGVhZGVyU2xvdCIgbmFtZT0iaGVhZGVyIj48L3Nsb3Q+CgogICAgPGRpdiBpZD0ibWFpblBhbmVsIj4KICAgICAgPGRpdiBpZD0ibWFpbkNvbnRhaW5lciIgY2xhc3NcJD0iW1tfY29tcHV0ZU1haW5Db250YWluZXJDbGFzcyhtb2RlKV1dIj4KICAgICAgICA8c2xvdD48L3Nsb3Q+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGlkPSJkcm9wU2hhZG93Ij48L2Rpdj4KICAgIDwvZGl2PgpgLGlzOiJwYXBlci1oZWFkZXItcGFuZWwiLHByb3BlcnRpZXM6e21vZGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJzdGFuZGFyZCIsb2JzZXJ2ZXI6Il9tb2RlQ2hhbmdlZCIscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxzaGFkb3c6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sdGFsbENsYXNzOnt0eXBlOlN0cmluZyx2YWx1ZToidGFsbCJ9LGF0VG9wOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITAsbm90aWZ5OiEwLHJlYWRPbmx5OiEwLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH19LG9ic2VydmVyczpbIl9jb21wdXRlRHJvcFNoYWRvd0hpZGRlbihhdFRvcCwgbW9kZSwgc2hhZG93KSJdLGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fYWRkTGlzdGVuZXIoKSx0aGlzLl9rZWVwU2Nyb2xsaW5nU3RhdGUoKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLl9yZW1vdmVMaXN0ZW5lcigpfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsSGFuZGxlcj10aGlzLl9zY3JvbGwuYmluZCh0aGlzKSxjb25zb2xlLndhcm4odGhpcy5pcywiaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBhcHAtbGF5b3V0IGluc3RlYWQhIil9LGdldCBoZWFkZXIoKXtyZXR1cm4gZXIodGhpcy4kLmhlYWRlclNsb3QpLmdldERpc3RyaWJ1dGVkTm9kZXMoKVswXX0sZ2V0IHNjcm9sbGVyKCl7cmV0dXJuIHRoaXMuX2dldFNjcm9sbGVyRm9yTW9kZSh0aGlzLm1vZGUpfSxnZXQgdmlzaWJsZVNoYWRvdygpe3JldHVybiB0aGlzLiQuZHJvcFNoYWRvdy5jbGFzc0xpc3QuY29udGFpbnMoImhhcy1zaGFkb3ciKX0sX2NvbXB1dGVEcm9wU2hhZG93SGlkZGVuOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1vcy5zaGFkb3dNb2RlW2VdO3RoaXMudG9nZ2xlQ2xhc3MoImhhcy1zaGFkb3ciLCEhdGhpcy5zaGFkb3d8fCgyPT09aXx8MT09PWkmJiF0KSx0aGlzLiQuZHJvcFNoYWRvdyl9LF9jb21wdXRlTWFpbkNvbnRhaW5lckNsYXNzOmZ1bmN0aW9uKHQpe3ZhciBlPXt9O3JldHVybiBlLmZsZXg9ImNvdmVyIiE9PXQsT2JqZWN0LmtleXMoZSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gZVt0XX0pKS5qb2luKCIgIil9LF9hZGRMaXN0ZW5lcjpmdW5jdGlvbigpe3RoaXMuc2Nyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcigic2Nyb2xsIix0aGlzLnNjcm9sbEhhbmRsZXIpfSxfcmVtb3ZlTGlzdGVuZXI6ZnVuY3Rpb24oKXt0aGlzLnNjcm9sbGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoInNjcm9sbCIsdGhpcy5zY3JvbGxIYW5kbGVyKX0sX21vZGVDaGFuZ2VkOmZ1bmN0aW9uKHQsZSl7dmFyIG49b3MsaT10aGlzLmhlYWRlcjtpJiYobi50YWxsTW9kZVtlXSYmIW4udGFsbE1vZGVbdF0/KGkuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLnRhbGxDbGFzcyksdGhpcy5hc3luYygoZnVuY3Rpb24oKXtpLmNsYXNzTGlzdC5yZW1vdmUoImFuaW1hdGUiKX0pLDIwMCkpOnRoaXMudG9nZ2xlQ2xhc3MoImFuaW1hdGUiLG4udGFsbE1vZGVbdF0saSkpLHRoaXMuX2tlZXBTY3JvbGxpbmdTdGF0ZSgpfSxfa2VlcFNjcm9sbGluZ1N0YXRlOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5zY3JvbGxlcixlPXRoaXMuaGVhZGVyO3RoaXMuX3NldEF0VG9wKDA9PT10LnNjcm9sbFRvcCksZSYmdGhpcy50YWxsQ2xhc3MmJm9zLnRhbGxNb2RlW3RoaXMubW9kZV0mJnRoaXMudG9nZ2xlQ2xhc3ModGhpcy50YWxsQ2xhc3MsdGhpcy5hdFRvcHx8ZS5jbGFzc0xpc3QuY29udGFpbnModGhpcy50YWxsQ2xhc3MpJiZ0LnNjcm9sbEhlaWdodDx0aGlzLm9mZnNldEhlaWdodCxlKX0sX3Njcm9sbDpmdW5jdGlvbigpe3RoaXMuX2tlZXBTY3JvbGxpbmdTdGF0ZSgpLHRoaXMuZmlyZSgiY29udGVudC1zY3JvbGwiLHt0YXJnZXQ6dGhpcy5zY3JvbGxlcn0se2J1YmJsZXM6ITF9KX0sX2dldFNjcm9sbGVyRm9yTW9kZTpmdW5jdGlvbih0KXtyZXR1cm4gb3Mub3V0ZXJTY3JvbGxbdF0/dGhpczp0aGlzLiQubWFpbkNvbnRhaW5lcn19KSwKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmpyKHtpczoicGFwZXItaWNvbi1idXR0b24iLF90ZW1wbGF0ZTp4ZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgei1pbmRleDogMDsKICAgICAgICBsaW5lLWhlaWdodDogMTsKCiAgICAgICAgd2lkdGg6IDQwcHg7CiAgICAgICAgaGVpZ2h0OiA0MHB4OwoKICAgICAgICAvKgogICAgICAgICAgTk9URTogQm90aCB2YWx1ZXMgYXJlIG5lZWRlZCwgc2luY2Ugc29tZSBwaG9uZXMgcmVxdWlyZSB0aGUgdmFsdWUgdG8KICAgICAgICAgIGJlIFxgdHJhbnNwYXJlbnRcYC4KICAgICAgICAqLwogICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwKTsKICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50OwoKICAgICAgICAvKiBCZWNhdXNlIG9mIHBvbHltZXIvMjU1OCwgdGhpcyBzdHlsZSBoYXMgbG93ZXIgc3BlY2lmaWNpdHkgdGhhbiAqICovCiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveCAhaW1wb3J0YW50OwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pY29uLWJ1dHRvbjsKICAgICAgfQoKICAgICAgOmhvc3QgI2luayB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWljb24tYnV0dG9uLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgb3BhY2l0eTogMC42OwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWljb24tYnV0dG9uLWRpc2FibGVkLXRleHQsIHZhcigtLWRpc2FibGVkLXRleHQtY29sb3IpKTsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBjdXJzb3I6IGF1dG87CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWljb24tYnV0dG9uLWRpc2FibGVkOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgOmhvc3QoOmhvdmVyKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaWNvbi1idXR0b24taG92ZXI7CiAgICAgIH0KCiAgICAgIGlyb24taWNvbiB7CiAgICAgICAgLS1pcm9uLWljb24td2lkdGg6IDEwMCU7CiAgICAgICAgLS1pcm9uLWljb24taGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxpcm9uLWljb24gaWQ9Imljb24iIHNyYz0iW1tzcmNdXSIgaWNvbj0iW1tpY29uXV0iCiAgICAgICAgICAgICAgIGFsdCQ9IltbYWx0XV0iPjwvaXJvbi1pY29uPgogIGAsaG9zdEF0dHJpYnV0ZXM6e3JvbGU6ImJ1dHRvbiIsdGFiaW5kZXg6IjAifSxiZWhhdmlvcnM6W3hhXSxyZWdpc3RlcmVkOmZ1bmN0aW9uKCl7dGhpcy5fdGVtcGxhdGUuc2V0QXR0cmlidXRlKCJzdHJpcC13aGl0ZXNwYWNlIiwiIil9LHByb3BlcnRpZXM6e3NyYzp7dHlwZTpTdHJpbmd9LGljb246e3R5cGU6U3RyaW5nfSxhbHQ6e3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfYWx0Q2hhbmdlZCJ9fSxfYWx0Q2hhbmdlZDpmdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIik7biYmZSE9bnx8dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLHQpfX0pLAovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KanIoe190ZW1wbGF0ZTp4ZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDQwMHB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkOwogICAgICAgIHBhZGRpbmc6IDJweDsKICAgICAgICAtbW96LWFwcGVhcmFuY2U6IHRleHRhcmVhOwogICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogdGV4dGFyZWE7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLm1pcnJvci10ZXh0IHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIEBhcHBseSAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWE7CiAgICAgIH0KCiAgICAgIC5maXQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgIH0KCiAgICAgIHRleHRhcmVhIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgcmVzaXplOiBub25lOwogICAgICAgIGJhY2tncm91bmQ6IGluaGVyaXQ7CiAgICAgICAgY29sb3I6IGluaGVyaXQ7CiAgICAgICAgLyogc2VlIGNvbW1lbnRzIGluIHRlbXBsYXRlICovCiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGZvbnQtc2l6ZTogaW5oZXJpdDsKICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgICAgICBsaW5lLWhlaWdodDogaW5oZXJpdDsKICAgICAgICB0ZXh0LWFsaWduOiBpbmhlcml0OwogICAgICAgIEBhcHBseSAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWE7CiAgICAgIH0KCiAgICAgIHRleHRhcmVhOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CgogICAgICB0ZXh0YXJlYTotbW96LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CgogICAgICB0ZXh0YXJlYTo6LW1vei1wbGFjZWhvbGRlciB7CiAgICAgICAgQGFwcGx5IC0taXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYS1wbGFjZWhvbGRlcjsKICAgICAgfQoKICAgICAgdGV4dGFyZWE6LW1zLWlucHV0LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDwhLS0gdGhlIG1pcnJvciBzaXplcyB0aGUgaW5wdXQvdGV4dGFyZWEgc28gaXQgZ3Jvd3Mgd2l0aCB0eXBpbmcgLS0+CiAgICA8IS0tIHVzZSAmIzE2MDsgaW5zdGVhZCAmbmJzcDsgb2YgdG8gYWxsb3cgdGhpcyBlbGVtZW50IHRvIGJlIHVzZWQgaW4gWEhUTUwgLS0+CiAgICA8ZGl2IGlkPSJtaXJyb3IiIGNsYXNzPSJtaXJyb3ItdGV4dCIgYXJpYS1oaWRkZW49InRydWUiPiZuYnNwOzwvZGl2PgoKICAgIDwhLS0gc2l6ZSB0aGUgaW5wdXQvdGV4dGFyZWEgd2l0aCBhIGRpdiwgYmVjYXVzZSB0aGUgdGV4dGFyZWEgaGFzIGludHJpbnNpYyBzaXplIGluIGZmIC0tPgogICAgPGRpdiBjbGFzcz0idGV4dGFyZWEtY29udGFpbmVyIGZpdCI+CiAgICAgIDx0ZXh0YXJlYSBpZD0idGV4dGFyZWEiIG5hbWUkPSJbW25hbWVdXSIgYXJpYS1sYWJlbCQ9IltbbGFiZWxdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgYXV0b2NhcGl0YWxpemUkPSJbW2F1dG9jYXBpdGFsaXplXV0iIGlucHV0bW9kZSQ9IltbaW5wdXRtb2RlXV0iIHBsYWNlaG9sZGVyJD0iW1twbGFjZWhvbGRlcl1dIiByZWFkb25seSQ9IltbcmVhZG9ubHldXSIgcmVxdWlyZWQkPSJbW3JlcXVpcmVkXV0iIGRpc2FibGVkJD0iW1tkaXNhYmxlZF1dIiByb3dzJD0iW1tyb3dzXV0iIG1pbmxlbmd0aCQ9IltbbWlubGVuZ3RoXV0iIG1heGxlbmd0aCQ9IltbbWF4bGVuZ3RoXV0iPjwvdGV4dGFyZWE+CiAgICA8L2Rpdj4KYCxpczoiaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYSIsYmVoYXZpb3JzOlt5YSxyYV0scHJvcGVydGllczp7dmFsdWU6e29ic2VydmVyOiJfdmFsdWVDaGFuZ2VkIix0eXBlOlN0cmluZyxub3RpZnk6ITB9LGJpbmRWYWx1ZTp7b2JzZXJ2ZXI6Il9iaW5kVmFsdWVDaGFuZ2VkIix0eXBlOlN0cmluZyxub3RpZnk6ITB9LHJvd3M6e3R5cGU6TnVtYmVyLHZhbHVlOjEsb2JzZXJ2ZXI6Il91cGRhdGVDYWNoZWQifSxtYXhSb3dzOnt0eXBlOk51bWJlcix2YWx1ZTowLG9ic2VydmVyOiJfdXBkYXRlQ2FjaGVkIn0sYXV0b2NvbXBsZXRlOnt0eXBlOlN0cmluZyx2YWx1ZToib2ZmIn0sYXV0b2ZvY3VzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGF1dG9jYXBpdGFsaXplOnt0eXBlOlN0cmluZyx2YWx1ZToibm9uZSJ9LGlucHV0bW9kZTp7dHlwZTpTdHJpbmd9LHBsYWNlaG9sZGVyOnt0eXBlOlN0cmluZ30scmVhZG9ubHk6e3R5cGU6U3RyaW5nfSxyZXF1aXJlZDp7dHlwZTpCb29sZWFufSxtaW5sZW5ndGg6e3R5cGU6TnVtYmVyfSxtYXhsZW5ndGg6e3R5cGU6TnVtYmVyfSxsYWJlbDp7dHlwZTpTdHJpbmd9fSxsaXN0ZW5lcnM6e2lucHV0OiJfb25JbnB1dCJ9LGdldCB0ZXh0YXJlYSgpe3JldHVybiB0aGlzLiQudGV4dGFyZWF9LGdldCBzZWxlY3Rpb25TdGFydCgpe3JldHVybiB0aGlzLiQudGV4dGFyZWEuc2VsZWN0aW9uU3RhcnR9LGdldCBzZWxlY3Rpb25FbmQoKXtyZXR1cm4gdGhpcy4kLnRleHRhcmVhLnNlbGVjdGlvbkVuZH0sc2V0IHNlbGVjdGlvblN0YXJ0KHQpe3RoaXMuJC50ZXh0YXJlYS5zZWxlY3Rpb25TdGFydD10fSxzZXQgc2VsZWN0aW9uRW5kKHQpe3RoaXMuJC50ZXh0YXJlYS5zZWxlY3Rpb25FbmQ9dH0sYXR0YWNoZWQ6ZnVuY3Rpb24oKXtuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUCg/OltvYV1kfGhvbmUpLykmJiFuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9PUyAxWzM0NTY3ODldLykmJih0aGlzLiQudGV4dGFyZWEuc3R5bGUubWFyZ2luTGVmdD0iLTNweCIpfSx2YWxpZGF0ZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuJC50ZXh0YXJlYS52YWxpZGl0eS52YWxpZDtyZXR1cm4gdCYmKHRoaXMucmVxdWlyZWQmJiIiPT09dGhpcy52YWx1ZT90PSExOnRoaXMuaGFzVmFsaWRhdG9yKCkmJih0PXlhLnZhbGlkYXRlLmNhbGwodGhpcyx0aGlzLnZhbHVlKSkpLHRoaXMuaW52YWxpZD0hdCx0aGlzLmZpcmUoImlyb24taW5wdXQtdmFsaWRhdGUiKSx0fSxfYmluZFZhbHVlQ2hhbmdlZDpmdW5jdGlvbih0KXt0aGlzLnZhbHVlPXR9LF92YWx1ZUNoYW5nZWQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy50ZXh0YXJlYTtlJiYoZS52YWx1ZSE9PXQmJihlLnZhbHVlPXR8fDA9PT10P3Q6IiIpLHRoaXMuYmluZFZhbHVlPXQsdGhpcy4kLm1pcnJvci5pbm5lckhUTUw9dGhpcy5fdmFsdWVGb3JNaXJyb3IoKSx0aGlzLmZpcmUoImJpbmQtdmFsdWUtY2hhbmdlZCIse3ZhbHVlOnRoaXMuYmluZFZhbHVlfSkpfSxfb25JbnB1dDpmdW5jdGlvbih0KXt2YXIgZT1lcih0KS5wYXRoO3RoaXMudmFsdWU9ZT9lWzBdLnZhbHVlOnQudGFyZ2V0LnZhbHVlfSxfY29uc3RyYWluOmZ1bmN0aW9uKHQpe3ZhciBlO2Zvcih0PXR8fFsiIl0sZT10aGlzLm1heFJvd3M+MCYmdC5sZW5ndGg+dGhpcy5tYXhSb3dzP3Quc2xpY2UoMCx0aGlzLm1heFJvd3MpOnQuc2xpY2UoMCk7dGhpcy5yb3dzPjAmJmUubGVuZ3RoPHRoaXMucm93czspZS5wdXNoKCIiKTtyZXR1cm4gZS5qb2luKCI8YnIvPiIpKyImIzE2MDsifSxfdmFsdWVGb3JNaXJyb3I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnRleHRhcmVhO2lmKHQpcmV0dXJuIHRoaXMudG9rZW5zPXQmJnQudmFsdWU/dC52YWx1ZS5yZXBsYWNlKC8mL2dtLCImYW1wOyIpLnJlcGxhY2UoLyIvZ20sIiZxdW90OyIpLnJlcGxhY2UoLycvZ20sIiYjMzk7IikucmVwbGFjZSgvPC9nbSwiJmx0OyIpLnJlcGxhY2UoLz4vZ20sIiZndDsiKS5zcGxpdCgiXG4iKTpbIiJdLHRoaXMuX2NvbnN0cmFpbih0aGlzLnRva2Vucyl9LF91cGRhdGVDYWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLiQubWlycm9yLmlubmVySFRNTD10aGlzLl9jb25zdHJhaW4odGhpcy50b2tlbnMpfX0pLAovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KanIoe190ZW1wbGF0ZTp4ZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgbGFiZWwgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxwYXBlci1pbnB1dC1jb250YWluZXIgbm8tbGFiZWwtZmxvYXQkPSJbW25vTGFiZWxGbG9hdF1dIiBhbHdheXMtZmxvYXQtbGFiZWw9IltbX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsKGFsd2F5c0Zsb2F0TGFiZWwscGxhY2Vob2xkZXIpXV0iIGF1dG8tdmFsaWRhdGUkPSJbW2F1dG9WYWxpZGF0ZV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgaW52YWxpZD0iW1tpbnZhbGlkXV0iPgoKICAgICAgPGxhYmVsIGhpZGRlbiQ9IltbIWxhYmVsXV0iIGFyaWEtaGlkZGVuPSJ0cnVlIiBmb3IkPSJbW19pbnB1dElkXV0iIHNsb3Q9ImxhYmVsIj5bW2xhYmVsXV08L2xhYmVsPgoKICAgICAgPGlyb24tYXV0b2dyb3ctdGV4dGFyZWEgY2xhc3M9InBhcGVyLWlucHV0LWlucHV0IiBzbG90PSJpbnB1dCIgaWQkPSJbW19pbnB1dElkXV0iIGFyaWEtbGFiZWxsZWRieSQ9IltbX2FyaWFMYWJlbGxlZEJ5XV0iIGFyaWEtZGVzY3JpYmVkYnkkPSJbW19hcmlhRGVzY3JpYmVkQnldXSIgYmluZC12YWx1ZT0ie3t2YWx1ZX19IiBpbnZhbGlkPSJ7e2ludmFsaWR9fSIgdmFsaWRhdG9yJD0iW1t2YWxpZGF0b3JdXSIgZGlzYWJsZWQkPSJbW2Rpc2FibGVkXV0iIGF1dG9jb21wbGV0ZSQ9IltbYXV0b2NvbXBsZXRlXV0iIGF1dG9mb2N1cyQ9IltbYXV0b2ZvY3VzXV0iIGlucHV0bW9kZSQ9IltbaW5wdXRtb2RlXV0iIG5hbWUkPSJbW25hbWVdXSIgcGxhY2Vob2xkZXIkPSJbW3BsYWNlaG9sZGVyXV0iIHJlYWRvbmx5JD0iW1tyZWFkb25seV1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgYXV0b2NhcGl0YWxpemUkPSJbW2F1dG9jYXBpdGFsaXplXV0iIHJvd3MkPSJbW3Jvd3NdXSIgbWF4LXJvd3MkPSJbW21heFJvd3NdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiPjwvaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYT4KCiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tlcnJvck1lc3NhZ2VdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0LWVycm9yIGFyaWEtbGl2ZT0iYXNzZXJ0aXZlIiBzbG90PSJhZGQtb24iPltbZXJyb3JNZXNzYWdlXV08L3BhcGVyLWlucHV0LWVycm9yPgogICAgICA8L3RlbXBsYXRlPgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NoYXJDb3VudGVyXV0iPgogICAgICAgIDxwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXIgc2xvdD0iYWRkLW9uIj48L3BhcGVyLWlucHV0LWNoYXItY291bnRlcj4KICAgICAgPC90ZW1wbGF0ZT4KCiAgICA8L3BhcGVyLWlucHV0LWNvbnRhaW5lcj4KYCxpczoicGFwZXItdGV4dGFyZWEiLGJlaGF2aW9yczpbSmEsZ2FdLHByb3BlcnRpZXM6e19hcmlhTGFiZWxsZWRCeTp7b2JzZXJ2ZXI6Il9hcmlhTGFiZWxsZWRCeUNoYW5nZWQiLHR5cGU6U3RyaW5nfSxfYXJpYURlc2NyaWJlZEJ5OntvYnNlcnZlcjoiX2FyaWFEZXNjcmliZWRCeUNoYW5nZWQiLHR5cGU6U3RyaW5nfSx2YWx1ZTp7dHlwZTpTdHJpbmd9LHJvd3M6e3R5cGU6TnVtYmVyLHZhbHVlOjF9LG1heFJvd3M6e3R5cGU6TnVtYmVyLHZhbHVlOjB9fSxnZXQgc2VsZWN0aW9uU3RhcnQoKXtyZXR1cm4gdGhpcy4kLmlucHV0LnRleHRhcmVhLnNlbGVjdGlvblN0YXJ0fSxzZXQgc2VsZWN0aW9uU3RhcnQodCl7dGhpcy4kLmlucHV0LnRleHRhcmVhLnNlbGVjdGlvblN0YXJ0PXR9LGdldCBzZWxlY3Rpb25FbmQoKXtyZXR1cm4gdGhpcy4kLmlucHV0LnRleHRhcmVhLnNlbGVjdGlvbkVuZH0sc2V0IHNlbGVjdGlvbkVuZCh0KXt0aGlzLiQuaW5wdXQudGV4dGFyZWEuc2VsZWN0aW9uRW5kPXR9LF9hcmlhTGFiZWxsZWRCeUNoYW5nZWQ6ZnVuY3Rpb24odCl7dGhpcy5fZm9jdXNhYmxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWxsZWRieSIsdCl9LF9hcmlhRGVzY3JpYmVkQnlDaGFuZ2VkOmZ1bmN0aW9uKHQpe3RoaXMuX2ZvY3VzYWJsZUVsZW1lbnQuc2V0QXR0cmlidXRlKCJhcmlhLWRlc2NyaWJlZGJ5Iix0KX0sZ2V0IF9mb2N1c2FibGVFbGVtZW50KCl7cmV0dXJuIHRoaXMuaW5wdXRFbGVtZW50LnRleHRhcmVhfX0pOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgYXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTthcy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZGlzcGxheTogbm9uZTsiKSxhcy5pbm5lckhUTUw9Ijxkb20tbW9kdWxlIGlkPVwicGFwZXItaXRlbS1zaGFyZWQtc3R5bGVzXCI+XG4gIDx0ZW1wbGF0ZT5cbiAgICA8c3R5bGU+XG4gICAgICA6aG9zdCwgLnBhcGVyLWl0ZW0ge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgICBtaW4taGVpZ2h0OiB2YXIoLS1wYXBlci1pdGVtLW1pbi1oZWlnaHQsIDQ4cHgpO1xuICAgICAgICBwYWRkaW5nOiAwcHggMTZweDtcbiAgICAgIH1cblxuICAgICAgLnBhcGVyLWl0ZW0ge1xuICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7XG4gICAgICAgIGJvcmRlcjpub25lO1xuICAgICAgICBvdXRsaW5lOiBub25lO1xuICAgICAgICBiYWNrZ3JvdW5kOiB3aGl0ZTtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIHRleHQtYWxpZ246IGxlZnQ7XG4gICAgICB9XG5cbiAgICAgIDpob3N0KFtoaWRkZW5dKSwgLnBhcGVyLWl0ZW1baGlkZGVuXSB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDtcbiAgICAgIH1cblxuICAgICAgOmhvc3QoLmlyb24tc2VsZWN0ZWQpLCAucGFwZXItaXRlbS5pcm9uLXNlbGVjdGVkIHtcbiAgICAgICAgZm9udC13ZWlnaHQ6IHZhcigtLXBhcGVyLWl0ZW0tc2VsZWN0ZWQtd2VpZ2h0LCBib2xkKTtcblxuICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtLXNlbGVjdGVkO1xuICAgICAgfVxuXG4gICAgICA6aG9zdChbZGlzYWJsZWRdKSwgLnBhcGVyLWl0ZW1bZGlzYWJsZWRdIHtcbiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWl0ZW0tZGlzYWJsZWQtY29sb3IsIHZhcigtLWRpc2FibGVkLXRleHQtY29sb3IpKTtcblxuICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtLWRpc2FibGVkO1xuICAgICAgfVxuXG4gICAgICA6aG9zdCg6Zm9jdXMpLCAucGFwZXItaXRlbTpmb2N1cyB7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgICAgb3V0bGluZTogMDtcblxuICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtLWZvY3VzZWQ7XG4gICAgICB9XG5cbiAgICAgIDpob3N0KDpmb2N1cyk6YmVmb3JlLCAucGFwZXItaXRlbTpmb2N1czpiZWZvcmUge1xuICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0O1xuXG4gICAgICAgIGJhY2tncm91bmQ6IGN1cnJlbnRDb2xvcjtcbiAgICAgICAgY29udGVudDogJyc7XG4gICAgICAgIG9wYWNpdHk6IHZhcigtLWRhcmstZGl2aWRlci1vcGFjaXR5KTtcbiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG5cbiAgICAgICAgQGFwcGx5IC0tcGFwZXItaXRlbS1mb2N1c2VkLWJlZm9yZTtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICA8L3RlbXBsYXRlPlxuPC9kb20tbW9kdWxlPiIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChhcy5jb250ZW50KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IHNzPVthYSxyYSx7aG9zdEF0dHJpYnV0ZXM6e3JvbGU6Im9wdGlvbiIsdGFiaW5kZXg6IjAifX1dOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KanIoe190ZW1wbGF0ZTp4ZWAKICAgIDxzdHlsZSBpbmNsdWRlPSJwYXBlci1pdGVtLXNoYXJlZC1zdHlsZXMiPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8c2xvdD48L3Nsb3Q+CmAsaXM6InBhcGVyLWl0ZW0iLGJlaGF2aW9yczpbc3NdfSksCi8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpqcih7X3RlbXBsYXRlOnhlYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsgLyogbmVlZGVkIGZvciB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpcyB0byB3b3JrIG9uIGZmICovCiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItanVzdGlmaWVkOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4OwogICAgICB9CgogICAgICA6aG9zdChbdHdvLWxpbmVdKSB7CiAgICAgICAgbWluLWhlaWdodDogdmFyKC0tcGFwZXItaXRlbS1ib2R5LXR3by1saW5lLW1pbi1oZWlnaHQsIDcycHgpOwogICAgICB9CgogICAgICA6aG9zdChbdGhyZWUtbGluZV0pIHsKICAgICAgICBtaW4taGVpZ2h0OiB2YXIoLS1wYXBlci1pdGVtLWJvZHktdGhyZWUtbGluZS1taW4taGVpZ2h0LCA4OHB4KTsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoKikgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoW3NlY29uZGFyeV0pIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWJvZHkxOwoKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaXRlbS1ib2R5LXNlY29uZGFyeS1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaXRlbS1ib2R5LXNlY29uZGFyeTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CmAsaXM6InBhcGVyLWl0ZW0tYm9keSJ9KSwKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmpyKHtfdGVtcGxhdGU6eGVgCiAgICA8c3R5bGUgaW5jbHVkZT0icGFwZXItaXRlbS1zaGFyZWQtc3R5bGVzIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW07CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaWNvbi1pdGVtOwogICAgICB9CgogICAgICAuY29udGVudC1pY29uIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyOwoKICAgICAgICB3aWR0aDogdmFyKC0tcGFwZXItaXRlbS1pY29uLXdpZHRoLCA1NnB4KTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtLWljb247CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0iY29udGVudEljb24iIGNsYXNzPSJjb250ZW50LWljb24iPgogICAgICA8c2xvdCBuYW1lPSJpdGVtLWljb24iPjwvc2xvdD4KICAgIDwvZGl2PgogICAgPHNsb3Q+PC9zbG90PgpgLGlzOiJwYXBlci1pY29uLWl0ZW0iLGJlaGF2aW9yczpbc3NdfSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBscz17cHJvcGVydGllczp7bXVsdGk6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoibXVsdGlDaGFuZ2VkIn0sc2VsZWN0ZWRWYWx1ZXM6e3R5cGU6QXJyYXksbm90aWZ5OiEwLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxzZWxlY3RlZEl0ZW1zOnt0eXBlOkFycmF5LHJlYWRPbmx5OiEwLG5vdGlmeTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX19LG9ic2VydmVyczpbIl91cGRhdGVTZWxlY3RlZChzZWxlY3RlZFZhbHVlcy5zcGxpY2VzKSJdLHNlbGVjdDpmdW5jdGlvbih0KXt0aGlzLm11bHRpP3RoaXMuX3RvZ2dsZVNlbGVjdGVkKHQpOnRoaXMuc2VsZWN0ZWQ9dH0sbXVsdGlDaGFuZ2VkOmZ1bmN0aW9uKHQpe3RoaXMuX3NlbGVjdGlvbi5tdWx0aT10LHRoaXMuX3VwZGF0ZVNlbGVjdGVkKCl9LGdldCBfc2hvdWxkVXBkYXRlU2VsZWN0aW9uKCl7cmV0dXJuIG51bGwhPXRoaXMuc2VsZWN0ZWR8fG51bGwhPXRoaXMuc2VsZWN0ZWRWYWx1ZXMmJnRoaXMuc2VsZWN0ZWRWYWx1ZXMubGVuZ3RofSxfdXBkYXRlQXR0ckZvclNlbGVjdGVkOmZ1bmN0aW9uKCl7dGhpcy5tdWx0aT90aGlzLnNlbGVjdGVkSXRlbXMmJnRoaXMuc2VsZWN0ZWRJdGVtcy5sZW5ndGg+MCYmKHRoaXMuc2VsZWN0ZWRWYWx1ZXM9dGhpcy5zZWxlY3RlZEl0ZW1zLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2luZGV4VG9WYWx1ZSh0aGlzLmluZGV4T2YodCkpfSksdGhpcykuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dH0pLHRoaXMpKTplYS5fdXBkYXRlQXR0ckZvclNlbGVjdGVkLmFwcGx5KHRoaXMpfSxfdXBkYXRlU2VsZWN0ZWQ6ZnVuY3Rpb24oKXt0aGlzLm11bHRpP3RoaXMuX3NlbGVjdE11bHRpKHRoaXMuc2VsZWN0ZWRWYWx1ZXMpOnRoaXMuX3NlbGVjdFNlbGVjdGVkKHRoaXMuc2VsZWN0ZWQpfSxfc2VsZWN0TXVsdGk6ZnVuY3Rpb24odCl7dmFyIGU9KHRoaXMuX3ZhbHVlc1RvSXRlbXModD10fHxbXSl8fFtdKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10fSkpO3RoaXMuX3NlbGVjdGlvbi5jbGVhcihlKTtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKyl0aGlzLl9zZWxlY3Rpb24uc2V0SXRlbVNlbGVjdGVkKGVbbl0sITApO3RoaXMuZmFsbGJhY2tTZWxlY3Rpb24mJiF0aGlzLl9zZWxlY3Rpb24uZ2V0KCkubGVuZ3RoJiYodGhpcy5fdmFsdWVUb0l0ZW0odGhpcy5mYWxsYmFja1NlbGVjdGlvbikmJnRoaXMuc2VsZWN0KHRoaXMuZmFsbGJhY2tTZWxlY3Rpb24pKX0sX3NlbGVjdGlvbkNoYW5nZTpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3NlbGVjdGlvbi5nZXQoKTt0aGlzLm11bHRpPyh0aGlzLl9zZXRTZWxlY3RlZEl0ZW1zKHQpLHRoaXMuX3NldFNlbGVjdGVkSXRlbSh0Lmxlbmd0aD90WzBdOm51bGwpKTpudWxsIT10Pyh0aGlzLl9zZXRTZWxlY3RlZEl0ZW1zKFt0XSksdGhpcy5fc2V0U2VsZWN0ZWRJdGVtKHQpKToodGhpcy5fc2V0U2VsZWN0ZWRJdGVtcyhbXSksdGhpcy5fc2V0U2VsZWN0ZWRJdGVtKG51bGwpKX0sX3RvZ2dsZVNlbGVjdGVkOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuc2VsZWN0ZWRWYWx1ZXMuaW5kZXhPZih0KTtlPDA/dGhpcy5wdXNoKCJzZWxlY3RlZFZhbHVlcyIsdCk6dGhpcy5zcGxpY2UoInNlbGVjdGVkVmFsdWVzIixlLDEpfSxfdmFsdWVzVG9JdGVtczpmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9udWxsOnQubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fdmFsdWVUb0l0ZW0odCl9KSx0aGlzKX19LGNzPXtwcm9wZXJ0aWVzOntmb2N1c2VkSXRlbTp7b2JzZXJ2ZXI6Il9mb2N1c2VkSXRlbUNoYW5nZWQiLHJlYWRPbmx5OiEwLHR5cGU6T2JqZWN0fSxhdHRyRm9ySXRlbVRpdGxlOnt0eXBlOlN0cmluZ30sZGlzYWJsZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX2Rpc2FibGVkQ2hhbmdlZCJ9fSxfTU9ESUZJRVJfS0VZUzpbIkFsdCIsIkFsdEdyYXBoIiwiQ2Fwc0xvY2siLCJDb250cm9sIiwiRm4iLCJGbkxvY2siLCJIeXBlciIsIk1ldGEiLCJOdW1Mb2NrIiwiT1MiLCJTY3JvbGxMb2NrIiwiU2hpZnQiLCJTdXBlciIsIlN5bWJvbCIsIlN5bWJvbExvY2siXSxfU0VBUkNIX1JFU0VUX1RJTUVPVVRfTVM6MWUzLF9wcmV2aW91c1RhYkluZGV4OjAsaG9zdEF0dHJpYnV0ZXM6e3JvbGU6Im1lbnUifSxvYnNlcnZlcnM6WyJfdXBkYXRlTXVsdGlzZWxlY3RhYmxlKG11bHRpKSJdLGxpc3RlbmVyczp7Zm9jdXM6Il9vbkZvY3VzIixrZXlkb3duOiJfb25LZXlkb3duIiwiaXJvbi1pdGVtcy1jaGFuZ2VkIjoiX29uSXJvbkl0ZW1zQ2hhbmdlZCJ9LGtleUJpbmRpbmdzOnt1cDoiX29uVXBLZXkiLGRvd246Il9vbkRvd25LZXkiLGVzYzoiX29uRXNjS2V5Iiwic2hpZnQrdGFiOmtleWRvd24iOiJfb25TaGlmdFRhYkRvd24ifSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX3Jlc2V0VGFiaW5kaWNlcygpfSxzZWxlY3Q6ZnVuY3Rpb24odCl7dGhpcy5fZGVmYXVsdEZvY3VzQXN5bmMmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jKSx0aGlzLl9kZWZhdWx0Rm9jdXNBc3luYz1udWxsKTt2YXIgZT10aGlzLl92YWx1ZVRvSXRlbSh0KTtlJiZlLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKXx8KHRoaXMuX3NldEZvY3VzZWRJdGVtKGUpLGxzLnNlbGVjdC5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSxfcmVzZXRUYWJpbmRpY2VzOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5tdWx0aT90aGlzLnNlbGVjdGVkSXRlbXMmJnRoaXMuc2VsZWN0ZWRJdGVtc1swXTp0aGlzLnNlbGVjdGVkSXRlbTt0aGlzLml0ZW1zLmZvckVhY2goKGZ1bmN0aW9uKGUpe2Uuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsZT09PXQ/IjAiOiItMSIpLGUuc2V0QXR0cmlidXRlKCJhcmlhLXNlbGVjdGVkIix0aGlzLl9zZWxlY3Rpb24uaXNTZWxlY3RlZChlKSl9KSx0aGlzKX0sX3VwZGF0ZU11bHRpc2VsZWN0YWJsZTpmdW5jdGlvbih0KXt0P3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLW11bHRpc2VsZWN0YWJsZSIsInRydWUiKTp0aGlzLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1tdWx0aXNlbGVjdGFibGUiKX0sX2ZvY3VzV2l0aEtleWJvYXJkRXZlbnQ6ZnVuY3Rpb24odCl7aWYoLTE9PT10aGlzLl9NT0RJRklFUl9LRVlTLmluZGV4T2YodC5rZXkpKXt0aGlzLmNhbmNlbERlYm91bmNlcigiX2NsZWFyU2VhcmNoVGV4dCIpO2Zvcih2YXIgZSxuPXRoaXMuX3NlYXJjaFRleHR8fCIiLGk9KG4rPSh0LmtleSYmMT09dC5rZXkubGVuZ3RoP3Qua2V5OlN0cmluZy5mcm9tQ2hhckNvZGUodC5rZXlDb2RlKSkudG9Mb2NhbGVMb3dlckNhc2UoKSkubGVuZ3RoLHI9MDtlPXRoaXMuaXRlbXNbcl07cisrKWlmKCFlLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSl7dmFyIG89dGhpcy5hdHRyRm9ySXRlbVRpdGxlfHwidGV4dENvbnRlbnQiLGE9KGVbb118fGUuZ2V0QXR0cmlidXRlKG8pfHwiIikudHJpbSgpO2lmKCEoYS5sZW5ndGg8aSkmJmEuc2xpY2UoMCxpKS50b0xvY2FsZUxvd2VyQ2FzZSgpPT1uKXt0aGlzLl9zZXRGb2N1c2VkSXRlbShlKTticmVha319dGhpcy5fc2VhcmNoVGV4dD1uLHRoaXMuZGVib3VuY2UoIl9jbGVhclNlYXJjaFRleHQiLHRoaXMuX2NsZWFyU2VhcmNoVGV4dCx0aGlzLl9TRUFSQ0hfUkVTRVRfVElNRU9VVF9NUyl9fSxfY2xlYXJTZWFyY2hUZXh0OmZ1bmN0aW9uKCl7dGhpcy5fc2VhcmNoVGV4dD0iIn0sX2ZvY3VzUHJldmlvdXM6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcy5pdGVtcy5sZW5ndGgsZT1OdW1iZXIodGhpcy5pbmRleE9mKHRoaXMuZm9jdXNlZEl0ZW0pKSxuPTE7bjx0KzE7bisrKXt2YXIgaT10aGlzLml0ZW1zWyhlLW4rdCkldF07aWYoIWkuaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpKXt2YXIgcj1lcihpKS5nZXRPd25lclJvb3QoKXx8ZG9jdW1lbnQ7aWYodGhpcy5fc2V0Rm9jdXNlZEl0ZW0oaSksZXIocikuYWN0aXZlRWxlbWVudD09aSlyZXR1cm59fX0sX2ZvY3VzTmV4dDpmdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLml0ZW1zLmxlbmd0aCxlPU51bWJlcih0aGlzLmluZGV4T2YodGhpcy5mb2N1c2VkSXRlbSkpLG49MTtuPHQrMTtuKyspe3ZhciBpPXRoaXMuaXRlbXNbKGUrbikldF07aWYoIWkuaGFzQXR0cmlidXRlKCJkaXNhYmxlZCIpKXt2YXIgcj1lcihpKS5nZXRPd25lclJvb3QoKXx8ZG9jdW1lbnQ7aWYodGhpcy5fc2V0Rm9jdXNlZEl0ZW0oaSksZXIocikuYWN0aXZlRWxlbWVudD09aSlyZXR1cm59fX0sX2FwcGx5U2VsZWN0aW9uOmZ1bmN0aW9uKHQsZSl7dC5zZXRBdHRyaWJ1dGUoImFyaWEtc2VsZWN0ZWQiLGU/InRydWUiOiJmYWxzZSIpLGVhLl9hcHBseVNlbGVjdGlvbi5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF9mb2N1c2VkSXRlbUNoYW5nZWQ6ZnVuY3Rpb24odCxlKXtlJiZlLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCItMSIpLCF0fHx0Lmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKXx8dGhpcy5kaXNhYmxlZHx8KHQuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsIjAiKSx0LmZvY3VzKCkpfSxfb25Jcm9uSXRlbXNDaGFuZ2VkOmZ1bmN0aW9uKHQpe3QuZGV0YWlsLmFkZGVkTm9kZXMubGVuZ3RoJiZ0aGlzLl9yZXNldFRhYmluZGljZXMoKX0sX29uU2hpZnRUYWJEb3duOmZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZ2V0QXR0cmlidXRlKCJ0YWJpbmRleCIpO2NzLl9zaGlmdFRhYlByZXNzZWQ9ITAsdGhpcy5fc2V0Rm9jdXNlZEl0ZW0obnVsbCksdGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4IiwiLTEiKSx0aGlzLmFzeW5jKChmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsZSksY3MuX3NoaWZ0VGFiUHJlc3NlZD0hMX0pLDEpfSxfb25Gb2N1czpmdW5jdGlvbih0KXtpZighY3MuX3NoaWZ0VGFiUHJlc3NlZCl7dmFyIGU9ZXIodCkucm9vdFRhcmdldDsoZT09PXRoaXN8fHZvaWQgMD09PWUudGFiSW5kZXh8fHRoaXMuaXNMaWdodERlc2NlbmRhbnQoZSkpJiYodGhpcy5fZGVmYXVsdEZvY3VzQXN5bmM9dGhpcy5hc3luYygoZnVuY3Rpb24oKXt2YXIgdD10aGlzLm11bHRpP3RoaXMuc2VsZWN0ZWRJdGVtcyYmdGhpcy5zZWxlY3RlZEl0ZW1zWzBdOnRoaXMuc2VsZWN0ZWRJdGVtO3RoaXMuX3NldEZvY3VzZWRJdGVtKG51bGwpLHQ/dGhpcy5fc2V0Rm9jdXNlZEl0ZW0odCk6dGhpcy5pdGVtc1swXSYmdGhpcy5fZm9jdXNOZXh0KCl9KSkpfX0sX29uVXBLZXk6ZnVuY3Rpb24odCl7dGhpcy5fZm9jdXNQcmV2aW91cygpLHQuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKX0sX29uRG93bktleTpmdW5jdGlvbih0KXt0aGlzLl9mb2N1c05leHQoKSx0LmRldGFpbC5rZXlib2FyZEV2ZW50LnByZXZlbnREZWZhdWx0KCl9LF9vbkVzY0tleTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLmZvY3VzZWRJdGVtO2UmJmUuYmx1cigpfSxfb25LZXlkb3duOmZ1bmN0aW9uKHQpe3RoaXMua2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzKHQsInVwIGRvd24gZXNjIil8fHRoaXMuX2ZvY3VzV2l0aEtleWJvYXJkRXZlbnQodCksdC5zdG9wUHJvcGFnYXRpb24oKX0sX2FjdGl2YXRlSGFuZGxlcjpmdW5jdGlvbih0KXtlYS5fYWN0aXZhdGVIYW5kbGVyLmNhbGwodGhpcyx0KSx0LnN0b3BQcm9wYWdhdGlvbigpfSxfZGlzYWJsZWRDaGFuZ2VkOmZ1bmN0aW9uKHQpe3Q/KHRoaXMuX3ByZXZpb3VzVGFiSW5kZXg9dGhpcy5oYXNBdHRyaWJ1dGUoInRhYmluZGV4Iik/dGhpcy50YWJJbmRleDowLHRoaXMucmVtb3ZlQXR0cmlidXRlKCJ0YWJpbmRleCIpKTp0aGlzLmhhc0F0dHJpYnV0ZSgidGFiaW5kZXgiKXx8dGhpcy5zZXRBdHRyaWJ1dGUoInRhYmluZGV4Iix0aGlzLl9wcmV2aW91c1RhYkluZGV4KX0sX3NoaWZ0VGFiUHJlc3NlZDohMX0sdXM9W1tlYSxsc10sWG8sY3NdOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KanIoe190ZW1wbGF0ZTp4ZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDhweCAwOwoKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci1saXN0Ym94LWJhY2tncm91bmQtY29sb3IsIHZhcigtLXByaW1hcnktYmFja2dyb3VuZC1jb2xvcikpOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1saXN0Ym94LWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItbGlzdGJveDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CmAsaXM6InBhcGVyLWxpc3Rib3giLGJlaGF2aW9yczpbdXNdLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJsaXN0Ym94In19KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IGhzPXhlYAo8ZG9tLW1vZHVsZSBpZD0icGFwZXItbWF0ZXJpYWwtc2hhcmVkLXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSIxIl0pIHsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTJkcDsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iMiJdKSB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi00ZHA7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjMiXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tNmRwOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSI0Il0pIHsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLThkcDsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iNSJdKSB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0xNmRwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KYDtocy5zZXRBdHRyaWJ1dGUoInN0eWxlIiwiZGlzcGxheTogbm9uZTsiKSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGhzLmNvbnRlbnQpLAovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KanIoe190ZW1wbGF0ZTp4ZWAKICAgIDxzdHlsZSBpbmNsdWRlPSJwYXBlci1tYXRlcmlhbC1zaGFyZWQtc3R5bGVzIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdChbYW5pbWF0ZWRdKSB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LXRyYW5zaXRpb247CiAgICAgIH0KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzbG90Pjwvc2xvdD4KYCxpczoicGFwZXItbWF0ZXJpYWwiLHByb3BlcnRpZXM6e2VsZXZhdGlvbjp7dHlwZTpOdW1iZXIscmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOjF9LGFuaW1hdGVkOnt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwLHZhbHVlOiExfX19KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IGRzPXtwcm9wZXJ0aWVzOnt2YWx1ZTp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxtaW46e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwfSxtYXg6e3R5cGU6TnVtYmVyLHZhbHVlOjEwMCxub3RpZnk6ITB9LHN0ZXA6e3R5cGU6TnVtYmVyLHZhbHVlOjEsbm90aWZ5OiEwfSxyYXRpbzp7dHlwZTpOdW1iZXIsdmFsdWU6MCxyZWFkT25seTohMCxub3RpZnk6ITB9fSxvYnNlcnZlcnM6WyJfdXBkYXRlKHZhbHVlLCBtaW4sIG1heCwgc3RlcCkiXSxfY2FsY1JhdGlvOmZ1bmN0aW9uKHQpe3JldHVybih0aGlzLl9jbGFtcFZhbHVlKHQpLXRoaXMubWluKS8odGhpcy5tYXgtdGhpcy5taW4pfSxfY2xhbXBWYWx1ZTpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5taW4odGhpcy5tYXgsTWF0aC5tYXgodGhpcy5taW4sdGhpcy5fY2FsY1N0ZXAodCkpKX0sX2NhbGNTdGVwOmZ1bmN0aW9uKHQpe2lmKHQ9cGFyc2VGbG9hdCh0KSwhdGhpcy5zdGVwKXJldHVybiB0O3ZhciBlPU1hdGgucm91bmQoKHQtdGhpcy5taW4pL3RoaXMuc3RlcCk7cmV0dXJuIHRoaXMuc3RlcDwxP2UvKDEvdGhpcy5zdGVwKSt0aGlzLm1pbjplKnRoaXMuc3RlcCt0aGlzLm1pbn0sX3ZhbGlkYXRlVmFsdWU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9jbGFtcFZhbHVlKHRoaXMudmFsdWUpO3JldHVybiB0aGlzLnZhbHVlPXRoaXMub2xkVmFsdWU9aXNOYU4odCk/dGhpcy5vbGRWYWx1ZTp0LHRoaXMudmFsdWUhPT10fSxfdXBkYXRlOmZ1bmN0aW9uKCl7dGhpcy5fdmFsaWRhdGVWYWx1ZSgpLHRoaXMuX3NldFJhdGlvKDEwMCp0aGlzLl9jYWxjUmF0aW8odGhpcy52YWx1ZSkpfX07Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqL2pyKHtfdGVtcGxhdGU6eGVgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMjAwcHg7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSwgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgI3Byb2dyZXNzQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1wcm9ncmVzcy1jb250YWluZXI7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjcHJvZ3Jlc3NDb250YWluZXIsCiAgICAgIC8qIHRoZSBzdHJpcGUgZm9yIHRoZSBpbmRldGVybWluYXRlIGFuaW1hdGlvbiovCiAgICAgIC5pbmRldGVybWluYXRlOjphZnRlciB7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1wYXBlci1wcm9ncmVzcy1oZWlnaHQsIDRweCk7CiAgICAgIH0KCiAgICAgICNwcmltYXJ5UHJvZ3Jlc3MsCiAgICAgICNzZWNvbmRhcnlQcm9ncmVzcywKICAgICAgLmluZGV0ZXJtaW5hdGU6OmFmdGVyIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwogICAgICB9CgogICAgICAjcHJvZ3Jlc3NDb250YWluZXIsCiAgICAgIC5pbmRldGVybWluYXRlOjphZnRlciB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtY29udGFpbmVyLWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JleS0zMDApKTsKICAgICAgfQoKICAgICAgOmhvc3QoLnRyYW5zaXRpbmcpICNwcmltYXJ5UHJvZ3Jlc3MsCiAgICAgIDpob3N0KC50cmFuc2l0aW5nKSAjc2Vjb25kYXJ5UHJvZ3Jlc3MgewogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1wcm9wZXJ0eTogLXdlYmtpdC10cmFuc2Zvcm07CiAgICAgICAgdHJhbnNpdGlvbi1wcm9wZXJ0eTogdHJhbnNmb3JtOwoKICAgICAgICAvKiBEdXJhdGlvbiAqLwogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi1kdXJhdGlvbiwgMC4wOHMpOwogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXByb2dyZXNzLXRyYW5zaXRpb24tZHVyYXRpb24sIDAuMDhzKTsKCiAgICAgICAgLyogVGltaW5nIGZ1bmN0aW9uICovCiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24sIGVhc2UpOwogICAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiB2YXIoLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbiwgZWFzZSk7CgogICAgICAgIC8qIERlbGF5ICovCiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLWRlbGF5LCAwcyk7CiAgICAgICAgdHJhbnNpdGlvbi1kZWxheTogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi1kZWxheSwgMHMpOwogICAgICB9CgogICAgICAjcHJpbWFyeVByb2dyZXNzLAogICAgICAjc2Vjb25kYXJ5UHJvZ3Jlc3MgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGNlbnRlcjsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGNlbnRlcjsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDApOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDApOwogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgIH0KCiAgICAgICNwcmltYXJ5UHJvZ3Jlc3MgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLWFjdGl2ZS1jb2xvciwgdmFyKC0tZ29vZ2xlLWdyZWVuLTUwMCkpOwogICAgICB9CgogICAgICAjc2Vjb25kYXJ5UHJvZ3Jlc3MgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLXNlY29uZGFyeS1jb2xvciwgdmFyKC0tZ29vZ2xlLWdyZWVuLTEwMCkpOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjcHJpbWFyeVByb2dyZXNzIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci1wcm9ncmVzcy1kaXNhYmxlZC1hY3RpdmUtY29sb3IsIHZhcigtLWdvb2dsZS1ncmV5LTUwMCkpOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAjc2Vjb25kYXJ5UHJvZ3Jlc3MgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLWRpc2FibGVkLXNlY29uZGFyeS1jb2xvciwgdmFyKC0tZ29vZ2xlLWdyZXktMzAwKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KDpub3QoW2Rpc2FibGVkXSkpICNwcmltYXJ5UHJvZ3Jlc3MuaW5kZXRlcm1pbmF0ZSB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiByaWdodCBjZW50ZXI7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgY2VudGVyOwogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBpbmRldGVybWluYXRlLWJhciB2YXIoLS1wYXBlci1wcm9ncmVzcy1pbmRldGVybWluYXRlLWN5Y2xlLWR1cmF0aW9uLCAycykgbGluZWFyIGluZmluaXRlOwogICAgICAgIGFuaW1hdGlvbjogaW5kZXRlcm1pbmF0ZS1iYXIgdmFyKC0tcGFwZXItcHJvZ3Jlc3MtaW5kZXRlcm1pbmF0ZS1jeWNsZS1kdXJhdGlvbiwgMnMpIGxpbmVhciBpbmZpbml0ZTsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdChbZGlzYWJsZWRdKSkgI3ByaW1hcnlQcm9ncmVzcy5pbmRldGVybWluYXRlOjphZnRlciB7CiAgICAgICAgY29udGVudDogIiI7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgY2VudGVyOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7CgogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBpbmRldGVybWluYXRlLXNwbGl0dGVyIHZhcigtLXBhcGVyLXByb2dyZXNzLWluZGV0ZXJtaW5hdGUtY3ljbGUtZHVyYXRpb24sIDJzKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgICAgYW5pbWF0aW9uOiBpbmRldGVybWluYXRlLXNwbGl0dGVyIHZhcigtLXBhcGVyLXByb2dyZXNzLWluZGV0ZXJtaW5hdGUtY3ljbGUtZHVyYXRpb24sIDJzKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBpbmRldGVybWluYXRlLWJhciB7CiAgICAgICAgMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgxKSB0cmFuc2xhdGVYKC0xMDAlKTsKICAgICAgICB9CiAgICAgICAgNTAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMSkgdHJhbnNsYXRlWCgwJSk7CiAgICAgICAgfQogICAgICAgIDc1JSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDEpIHRyYW5zbGF0ZVgoMCUpOwogICAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoLjI4LC42MiwuMzcsLjkxKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDApIHRyYW5zbGF0ZVgoMCUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGluZGV0ZXJtaW5hdGUtc3BsaXR0ZXIgewogICAgICAgIDAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKC0xMjUlKTsKICAgICAgICB9CiAgICAgICAgMzAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKC0xMjUlKTsKICAgICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKC40MiwwLC42LC44KTsKICAgICAgICB9CiAgICAgICAgOTAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKDEyNSUpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKDEyNSUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBpbmRldGVybWluYXRlLWJhciB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMSkgdHJhbnNsYXRlWCgtMTAwJSk7CiAgICAgICAgfQogICAgICAgIDUwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgxKSB0cmFuc2xhdGVYKDAlKTsKICAgICAgICB9CiAgICAgICAgNzUlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDEpIHRyYW5zbGF0ZVgoMCUpOwogICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKC4yOCwuNjIsLjM3LC45MSk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMCkgdHJhbnNsYXRlWCgwJSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGluZGV0ZXJtaW5hdGUtc3BsaXR0ZXIgewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgtMTI1JSk7CiAgICAgICAgfQogICAgICAgIDMwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoLTEyNSUpOwogICAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKC40MiwwLC42LC44KTsKICAgICAgICB9CiAgICAgICAgOTAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgxMjUlKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoMTI1JSk7CiAgICAgICAgfQogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InByb2dyZXNzQ29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0ic2Vjb25kYXJ5UHJvZ3Jlc3MiIGhpZGRlblwkPSJbW19oaWRlU2Vjb25kYXJ5UHJvZ3Jlc3Moc2Vjb25kYXJ5UmF0aW8pXV0iPjwvZGl2PgogICAgICA8ZGl2IGlkPSJwcmltYXJ5UHJvZ3Jlc3MiPjwvZGl2PgogICAgPC9kaXY+CmAsaXM6InBhcGVyLXByb2dyZXNzIixiZWhhdmlvcnM6W2RzXSxwcm9wZXJ0aWVzOntzZWNvbmRhcnlQcm9ncmVzczp7dHlwZTpOdW1iZXIsdmFsdWU6MH0sc2Vjb25kYXJ5UmF0aW86e3R5cGU6TnVtYmVyLHZhbHVlOjAscmVhZE9ubHk6ITB9LGluZGV0ZXJtaW5hdGU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxvYnNlcnZlcjoiX3RvZ2dsZUluZGV0ZXJtaW5hdGUifSxkaXNhYmxlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCxvYnNlcnZlcjoiX2Rpc2FibGVkQ2hhbmdlZCJ9fSxvYnNlcnZlcnM6WyJfcHJvZ3Jlc3NDaGFuZ2VkKHNlY29uZGFyeVByb2dyZXNzLCB2YWx1ZSwgbWluLCBtYXgsIGluZGV0ZXJtaW5hdGUpIl0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6InByb2dyZXNzYmFyIn0sX3RvZ2dsZUluZGV0ZXJtaW5hdGU6ZnVuY3Rpb24odCl7dGhpcy50b2dnbGVDbGFzcygiaW5kZXRlcm1pbmF0ZSIsdCx0aGlzLiQucHJpbWFyeVByb2dyZXNzKX0sX3RyYW5zZm9ybVByb2dyZXNzOmZ1bmN0aW9uKHQsZSl7dC5zdHlsZS50cmFuc2Zvcm09dC5zdHlsZS53ZWJraXRUcmFuc2Zvcm09InNjYWxlWCgiK2UvMTAwKyIpIn0sX21haW5SYXRpb0NoYW5nZWQ6ZnVuY3Rpb24odCl7dGhpcy5fdHJhbnNmb3JtUHJvZ3Jlc3ModGhpcy4kLnByaW1hcnlQcm9ncmVzcyx0KX0sX3Byb2dyZXNzQ2hhbmdlZDpmdW5jdGlvbih0LGUsbixpLHIpe3Q9dGhpcy5fY2xhbXBWYWx1ZSh0KSxlPXRoaXMuX2NsYW1wVmFsdWUoZSk7dmFyIG89MTAwKnRoaXMuX2NhbGNSYXRpbyh0KSxhPTEwMCp0aGlzLl9jYWxjUmF0aW8oZSk7dGhpcy5fc2V0U2Vjb25kYXJ5UmF0aW8obyksdGhpcy5fdHJhbnNmb3JtUHJvZ3Jlc3ModGhpcy4kLnNlY29uZGFyeVByb2dyZXNzLG8pLHRoaXMuX3RyYW5zZm9ybVByb2dyZXNzKHRoaXMuJC5wcmltYXJ5UHJvZ3Jlc3MsYSksdGhpcy5zZWNvbmRhcnlQcm9ncmVzcz10LHI/dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFyaWEtdmFsdWVub3ciKTp0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS12YWx1ZW5vdyIsZSksdGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtdmFsdWVtaW4iLG4pLHRoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXZhbHVlbWF4IixpKX0sX2Rpc2FibGVkQ2hhbmdlZDpmdW5jdGlvbih0KXt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1kaXNhYmxlZCIsdD8idHJ1ZSI6ImZhbHNlIil9LF9oaWRlU2Vjb25kYXJ5UHJvZ3Jlc3M6ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10fX0pOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBwcz14ZWAKPHN0eWxlPgogIDpob3N0IHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIGxpbmUtaGVpZ2h0OiAwOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAtLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLXNpemU6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1zaXplLCAxNnB4KTsKICAgIC8qIC0xcHggaXMgYSBzZW50aW5lbCBmb3IgdGhlIGRlZmF1bHQgYW5kIGlzIHJlcGxhY2UgaW4gXGBhdHRhY2hlZFxgLiAqLwogICAgLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1pbmstc2l6ZTogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLWluay1zaXplLCAtMXB4KTsKICB9CgogIDpob3N0KDpmb2N1cykgewogICAgb3V0bGluZTogbm9uZTsKICB9CgogICNyYWRpb0NvbnRhaW5lciB7CiAgICBAYXBwbHkgLS1sYXlvdXQtaW5saW5lOwogICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlci1jZW50ZXI7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB3aWR0aDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24tc2l6ZSk7CiAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLXNpemUpOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKCiAgICBAYXBwbHkgLS1wYXBlci1yYWRpby1idXR0b24tcmFkaW8tY29udGFpbmVyOwogIH0KCiAgI2luayB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDUwJTsKICAgIGxlZnQ6IDUwJTsKICAgIHJpZ2h0OiBhdXRvOwogICAgd2lkdGg6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLWluay1zaXplKTsKICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemUpOwogICAgY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi11bmNoZWNrZWQtaW5rLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgIG9wYWNpdHk6IDAuNjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogIH0KCiAgI2lua1tjaGVja2VkXSB7CiAgICBjb2xvcjogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLWNoZWNrZWQtaW5rLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgfQoKICAjb2ZmUmFkaW8sICNvblJhZGlvIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICB0b3A6IDA7CiAgICBsZWZ0OiAwOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgfQoKICAjb2ZmUmFkaW8gewogICAgYm9yZGVyOiAycHggc29saWQgdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLXVuY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWJhY2tncm91bmQtY29sb3IsIHRyYW5zcGFyZW50KTsKICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjI4czsKICB9CgogICNvblJhZGlvIHsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMCk7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDApOwogICAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gZWFzZSAwLjI4czsKICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSBlYXNlIDAuMjhzOwogICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICB9CgogIDpob3N0KFtjaGVja2VkXSkgI29mZlJhZGlvIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLWNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICB9CgogIDpob3N0KFtjaGVja2VkXSkgI29uUmFkaW8gewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuNSk7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNSk7CiAgfQoKICAjcmFkaW9MYWJlbCB7CiAgICBsaW5lLWhlaWdodDogbm9ybWFsOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIG1hcmdpbi1sZWZ0OiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWwtc3BhY2luZywgMTBweCk7CiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1sYWJlbC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CgogICAgQGFwcGx5IC0tcGFwZXItcmFkaW8tYnV0dG9uLWxhYmVsOwogIH0KCiAgOmhvc3QoW2NoZWNrZWRdKSAjcmFkaW9MYWJlbCB7CiAgICBAYXBwbHkgLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWwtY2hlY2tlZDsKICB9CgogICNyYWRpb0xhYmVsOmRpcihydGwpIHsKICAgIG1hcmdpbi1sZWZ0OiAwOwogICAgbWFyZ2luLXJpZ2h0OiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWwtc3BhY2luZywgMTBweCk7CiAgfQoKICAjcmFkaW9MYWJlbFtoaWRkZW5dIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQoKICAvKiBkaXNhYmxlZCBzdGF0ZSAqLwoKICA6aG9zdChbZGlzYWJsZWRdKSAjb2ZmUmFkaW8gewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgIG9wYWNpdHk6IDAuNTsKICB9CgogIDpob3N0KFtkaXNhYmxlZF1bY2hlY2tlZF0pICNvblJhZGlvIHsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi11bmNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgb3BhY2l0eTogMC41OwogIH0KCiAgOmhvc3QoW2Rpc2FibGVkXSkgI3JhZGlvTGFiZWwgewogICAgLyogc2xpZ2h0bHkgZGFya2VyIHRoYW4gdGhlIGJ1dHRvbiwgc28gdGhhdCBpdCdzIHJlYWRhYmxlICovCiAgICBvcGFjaXR5OiAwLjY1OwogIH0KPC9zdHlsZT4KCjxkaXYgaWQ9InJhZGlvQ29udGFpbmVyIj4KICA8ZGl2IGlkPSJvZmZSYWRpbyI+PC9kaXY+CiAgPGRpdiBpZD0ib25SYWRpbyI+PC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0icmFkaW9MYWJlbCI+PHNsb3Q+PC9zbG90PjwvZGl2PmA7cHMuc2V0QXR0cmlidXRlKCJzdHJpcC13aGl0ZXNwYWNlIiwiIiksanIoe190ZW1wbGF0ZTpwcyxpczoicGFwZXItcmFkaW8tYnV0dG9uIixiZWhhdmlvcnM6W3dhXSxob3N0QXR0cmlidXRlczp7cm9sZToicmFkaW8iLCJhcmlhLWNoZWNrZWQiOiExLHRhYmluZGV4OjB9LHByb3BlcnRpZXM6e2FyaWFBY3RpdmVBdHRyaWJ1dGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJhcmlhLWNoZWNrZWQifX0scmVhZHk6ZnVuY3Rpb24oKXt0aGlzLl9yaXBwbGVDb250YWluZXI9dGhpcy4kLnJhZGlvQ29udGFpbmVyfSxhdHRhY2hlZDpmdW5jdGlvbigpe0RpKHRoaXMsKGZ1bmN0aW9uKCl7aWYoIi0xcHgiPT09dGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoIi0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemUiKS50cmltKCkpe3ZhciB0PXBhcnNlRmxvYXQodGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoIi0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24tc2l6ZSIpLnRyaW0oKSksZT1NYXRoLmZsb29yKDMqdCk7ZSUyIT10JTImJmUrKyx0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItcmFkaW8tYnV0dG9uLWluay1zaXplIjplKyJweCJ9KX19KSl9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBmcz17aG9zdEF0dHJpYnV0ZXM6e3JvbGU6Im1lbnViYXIifSxrZXlCaW5kaW5nczp7bGVmdDoiX29uTGVmdEtleSIscmlnaHQ6Il9vblJpZ2h0S2V5In0sX29uVXBLZXk6ZnVuY3Rpb24odCl7dGhpcy5mb2N1c2VkSXRlbS5jbGljaygpLHQuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKX0sX29uRG93bktleTpmdW5jdGlvbih0KXt0aGlzLmZvY3VzZWRJdGVtLmNsaWNrKCksdC5kZXRhaWwua2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpfSxnZXQgX2lzUlRMKCl7cmV0dXJuInJ0bCI9PT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKS5kaXJlY3Rpb259LF9vbkxlZnRLZXk6ZnVuY3Rpb24odCl7dGhpcy5faXNSVEw/dGhpcy5fZm9jdXNOZXh0KCk6dGhpcy5fZm9jdXNQcmV2aW91cygpLHQuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKX0sX29uUmlnaHRLZXk6ZnVuY3Rpb24odCl7dGhpcy5faXNSVEw/dGhpcy5fZm9jdXNQcmV2aW91cygpOnRoaXMuX2ZvY3VzTmV4dCgpLHQuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKX0sX29uS2V5ZG93bjpmdW5jdGlvbih0KXt0aGlzLmtleWJvYXJkRXZlbnRNYXRjaGVzS2V5cyh0LCJ1cCBkb3duIGxlZnQgcmlnaHQgZXNjIil8fHRoaXMuX2ZvY3VzV2l0aEtleWJvYXJkRXZlbnQodCl9fSxtcz1bdXMsZnNdOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KanIoe190ZW1wbGF0ZTp4ZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgOmhvc3QgOjpzbG90dGVkKCopIHsKICAgICAgICBwYWRkaW5nOiB2YXIoLS1wYXBlci1yYWRpby1ncm91cC1pdGVtLXBhZGRpbmcsIDEycHgpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzbG90Pjwvc2xvdD4KYCxpczoicGFwZXItcmFkaW8tZ3JvdXAiLGJlaGF2aW9yczpbbXNdLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJyYWRpb2dyb3VwIn0scHJvcGVydGllczp7YXR0ckZvclNlbGVjdGVkOnt0eXBlOlN0cmluZyx2YWx1ZToibmFtZSJ9LHNlbGVjdGVkQXR0cmlidXRlOnt0eXBlOlN0cmluZyx2YWx1ZToiY2hlY2tlZCJ9LHNlbGVjdGFibGU6e3R5cGU6U3RyaW5nLHZhbHVlOiJwYXBlci1yYWRpby1idXR0b24ifSxhbGxvd0VtcHR5U2VsZWN0aW9uOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxzZWxlY3Q6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fdmFsdWVUb0l0ZW0odCk7aWYoIWV8fCFlLmhhc0F0dHJpYnV0ZSgiZGlzYWJsZWQiKSl7aWYodGhpcy5zZWxlY3RlZCl7dmFyIG49dGhpcy5fdmFsdWVUb0l0ZW0odGhpcy5zZWxlY3RlZCk7aWYodGhpcy5zZWxlY3RlZD09dCl7aWYoIXRoaXMuYWxsb3dFbXB0eVNlbGVjdGlvbilyZXR1cm4gdm9pZChuJiYobi5jaGVja2VkPSEwKSk7dD0iIn1uJiYobi5jaGVja2VkPSExKX1lYS5zZWxlY3QuYXBwbHkodGhpcyxbdF0pLHRoaXMuZmlyZSgicGFwZXItcmFkaW8tZ3JvdXAtY2hhbmdlZCIpfX0sX2FjdGl2YXRlRm9jdXNlZEl0ZW06ZnVuY3Rpb24oKXt0aGlzLl9pdGVtQWN0aXZhdGUodGhpcy5fdmFsdWVGb3JJdGVtKHRoaXMuZm9jdXNlZEl0ZW0pLHRoaXMuZm9jdXNlZEl0ZW0pfSxfb25VcEtleTpmdW5jdGlvbih0KXt0aGlzLl9mb2N1c1ByZXZpb3VzKCksdC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2FjdGl2YXRlRm9jdXNlZEl0ZW0oKX0sX29uRG93bktleTpmdW5jdGlvbih0KXt0aGlzLl9mb2N1c05leHQoKSx0LnByZXZlbnREZWZhdWx0KCksdGhpcy5fYWN0aXZhdGVGb2N1c2VkSXRlbSgpfSxfb25MZWZ0S2V5OmZ1bmN0aW9uKHQpe2ZzLl9vbkxlZnRLZXkuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX2FjdGl2YXRlRm9jdXNlZEl0ZW0oKX0sX29uUmlnaHRLZXk6ZnVuY3Rpb24odCl7ZnMuX29uUmlnaHRLZXkuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuX2FjdGl2YXRlRm9jdXNlZEl0ZW0oKX19KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IGdzPXhlYAogIDxzdHlsZT4KICAgIDpob3N0IHsKICAgICAgQGFwcGx5IC0tbGF5b3V0OwogICAgICBAYXBwbHkgLS1sYXlvdXQtanVzdGlmaWVkOwogICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyOwogICAgICB3aWR0aDogMjAwcHg7CiAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDApOwogICAgICAtLXBhcGVyLXByb2dyZXNzLWFjdGl2ZS1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWFjdGl2ZS1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtNzAwKSk7CiAgICAgIC0tcGFwZXItcHJvZ3Jlc3Mtc2Vjb25kYXJ5LWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItc2Vjb25kYXJ5LWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS0zMDApKTsKICAgICAgLS1wYXBlci1wcm9ncmVzcy1kaXNhYmxlZC1hY3RpdmUtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1kaXNhYmxlZC1hY3RpdmUtY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtZGlzYWJsZWQtc2Vjb25kYXJ5LWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItZGlzYWJsZWQtc2Vjb25kYXJ5LWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgICAtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodDogdmFyKC0tcGFwZXItc2xpZGVyLWhlaWdodCwgMnB4KTsKICAgIH0KCiAgICAvKiBmb2N1cyBzaG93cyB0aGUgcmlwcGxlICovCiAgICA6aG9zdCg6Zm9jdXMpIHsKICAgICAgb3V0bGluZTogbm9uZTsKICAgIH0KCiAgICAvKioKICAgICAgKiBOT1RFKGtlYW51bGVlKTogVGhvdWdoIDpob3N0LWNvbnRleHQgaXMgbm90IHVuaXZlcnNhbGx5IHN1cHBvcnRlZCwgc29tZSBwYWdlcwogICAgICAqIHN0aWxsIHJlbHkgb24gcGFwZXItc2xpZGVyIGJlaW5nIGZsaXBwZWQgd2hlbiBkaXI9InJ0bCIgaXMgc2V0IG9uIGJvZHkuIEZvciBmdWxsCiAgICAgICogY29tcGF0aWJpbGl0eSwgZGlyPSJydGwiIG11c3QgYmUgZXhwbGljaXRseSBzZXQgb24gcGFwZXItc2xpZGVyLgogICAgICAqLwogICAgOmRpcihydGwpICNzbGlkZXJDb250YWluZXIgewogICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKC0xKTsKICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLTEpOwogICAgfQoKICAgIC8qKgogICAgICAqIE5PVEUoa2VhbnVsZWUpOiBUaGlzIGlzIHNlcGFyYXRlIGZyb20gdGhlIHJ1bGUgYWJvdmUgYmVjYXVzZSA6aG9zdC1jb250ZXh0IG1heQogICAgICAqIG5vdCBiZSByZWNvZ25pemVkLgogICAgICAqLwogICAgOmhvc3QoW2Rpcj0icnRsIl0pICNzbGlkZXJDb250YWluZXIgewogICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKC0xKTsKICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLTEpOwogICAgfQoKICAgIC8qKgogICAgICAqIE5PVEUoa2VhbnVsZWUpOiBOZWVkZWQgdG8gb3ZlcnJpZGUgdGhlIDpob3N0LWNvbnRleHQgcnVsZSAod2hlcmUgc3VwcG9ydGVkKQogICAgICAqIHRvIHN1cHBvcnQgTFRSIHNsaWRlcnMgaW4gUlRMIHBhZ2VzLgogICAgICAqLwogICAgOmhvc3QoW2Rpcj0ibHRyIl0pICNzbGlkZXJDb250YWluZXIgewogICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDEpOwogICAgICB0cmFuc2Zvcm06IHNjYWxlWCgxKTsKICAgIH0KCiAgICAjc2xpZGVyQ29udGFpbmVyIHsKICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB3aWR0aDogMTAwJTsKICAgICAgaGVpZ2h0OiBjYWxjKDMwcHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpKTsKICAgICAgbWFyZ2luLWxlZnQ6IGNhbGMoMTVweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkvMik7CiAgICAgIG1hcmdpbi1yaWdodDogY2FsYygxNXB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KS8yKTsKICAgIH0KCiAgICAjc2xpZGVyQ29udGFpbmVyOmZvY3VzIHsKICAgICAgb3V0bGluZTogMDsKICAgIH0KCiAgICAjc2xpZGVyQ29udGFpbmVyLmVkaXRhYmxlIHsKICAgICAgbWFyZ2luLXRvcDogMTJweDsKICAgICAgbWFyZ2luLWJvdHRvbTogMTJweDsKICAgIH0KCiAgICAuYmFyLWNvbnRhaW5lciB7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgdG9wOiAwOwogICAgICBib3R0b206IDA7CiAgICAgIGxlZnQ6IDA7CiAgICAgIHJpZ2h0OiAwOwogICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgfQoKICAgIC5yaW5nID4gLmJhci1jb250YWluZXIgewogICAgICBsZWZ0OiBjYWxjKDVweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkvMik7CiAgICAgIHRyYW5zaXRpb246IGxlZnQgMC4xOHMgZWFzZTsKICAgIH0KCiAgICAucmluZy5leHBhbmQuZHJhZ2dpbmcgPiAuYmFyLWNvbnRhaW5lciB7CiAgICAgIHRyYW5zaXRpb246IG5vbmU7CiAgICB9CgogICAgLnJpbmcuZXhwYW5kOm5vdCgucGluKSA+IC5iYXItY29udGFpbmVyIHsKICAgICAgbGVmdDogY2FsYyg4cHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpLzIpOwogICAgfQoKICAgICNzbGlkZXJCYXIgewogICAgICBwYWRkaW5nOiAxNXB4IDA7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItYmFyLWNvbG9yLCB0cmFuc3BhcmVudCk7CiAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtY29udGFpbmVyLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItY29udGFpbmVyLWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgICAtLXBhcGVyLXByb2dyZXNzLWhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KTsKICAgIH0KCiAgICAuc2xpZGVyLW1hcmtlcnMgewogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIC8qIHNsaWRlci1rbm9iIGlzIDMwcHggKyB0aGUgc2xpZGVyLWhlaWdodCBzbyB0aGF0IHRoZSBtYXJrZXJzIHNob3VsZCBzdGFydCBhdCBhIG9mZnNldCBvZiAxNXB4Ki8KICAgICAgdG9wOiAxNXB4OwogICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCk7CiAgICAgIGxlZnQ6IDA7CiAgICAgIHJpZ2h0OiAtMXB4OwogICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICB9CgogICAgLnNsaWRlci1tYXJrZXIgewogICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleDsKICAgIH0KICAgIC5zbGlkZXItbWFya2Vyczo6YWZ0ZXIsCiAgICAuc2xpZGVyLW1hcmtlcjo6YWZ0ZXIgewogICAgICBjb250ZW50OiAiIjsKICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIG1hcmdpbi1sZWZ0OiAtMXB4OwogICAgICB3aWR0aDogMnB4OwogICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCk7CiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLW1hcmtlcnMtY29sb3IsICMwMDApOwogICAgfQoKICAgIC5zbGlkZXIta25vYiB7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgbGVmdDogMDsKICAgICAgdG9wOiAwOwogICAgICBtYXJnaW4tbGVmdDogY2FsYygtMTVweCAtIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkvMik7CiAgICAgIHdpZHRoOiBjYWxjKDMwcHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpKTsKICAgICAgaGVpZ2h0OiBjYWxjKDMwcHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpKTsKICAgIH0KCiAgICAudHJhbnNpdGluZyA+IC5zbGlkZXIta25vYiB7CiAgICAgIHRyYW5zaXRpb246IGxlZnQgMC4wOHMgZWFzZTsKICAgIH0KCiAgICAuc2xpZGVyLWtub2I6Zm9jdXMgewogICAgICBvdXRsaW5lOiBub25lOwogICAgfQoKICAgIC5zbGlkZXIta25vYi5kcmFnZ2luZyB7CiAgICAgIHRyYW5zaXRpb246IG5vbmU7CiAgICB9CgogICAgLnNuYXBzID4gLnNsaWRlci1rbm9iLmRyYWdnaW5nIHsKICAgICAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gMC4wOHMgZWFzZTsKICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMDhzIGVhc2U7CiAgICB9CgogICAgLnNsaWRlci1rbm9iLWlubmVyIHsKICAgICAgbWFyZ2luOiAxMHB4OwogICAgICB3aWR0aDogY2FsYygxMDAlIC0gMjBweCk7CiAgICAgIGhlaWdodDogY2FsYygxMDAlIC0gMjBweCk7CiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS03MDApKTsKICAgICAgYm9yZGVyOiAycHggc29saWQgdmFyKC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTcwMCkpOwogICAgICBib3JkZXItcmFkaXVzOiA1MCU7CgogICAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CgogICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiAtd2Via2l0LXRyYW5zZm9ybSwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyOwogICAgICB0cmFuc2l0aW9uLXByb3BlcnR5OiB0cmFuc2Zvcm0sIGJhY2tncm91bmQtY29sb3IsIGJvcmRlcjsKICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4xOHM7CiAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlOwogICAgfQoKICAgIC5leHBhbmQ6bm90KC5waW4pID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyIHsKICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEuNSk7CiAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS41KTsKICAgIH0KCiAgICAucmluZyA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lciB7CiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWNvbG9yLCB0cmFuc3BhcmVudCk7CiAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgIH0KCiAgICAuc2xpZGVyLWtub2ItaW5uZXI6OmJlZm9yZSB7CiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1waW4tY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTcwMCkpOwogICAgfQoKICAgIC5waW4gPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXI6OmJlZm9yZSB7CiAgICAgIGNvbnRlbnQ6ICIiOwogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIHRvcDogMDsKICAgICAgbGVmdDogNTAlOwogICAgICBtYXJnaW4tbGVmdDogLTEzcHg7CiAgICAgIHdpZHRoOiAyNnB4OwogICAgICBoZWlnaHQ6IDI2cHg7CiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJSA1MCUgNTAlIDA7CgogICAgICAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC00NWRlZykgc2NhbGUoMCkgdHJhbnNsYXRlKDApOwogICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpIHNjYWxlKDApIHRyYW5zbGF0ZSgwKTsKICAgIH0KCiAgICAuc2xpZGVyLWtub2ItaW5uZXI6OmJlZm9yZSwKICAgIC5zbGlkZXIta25vYi1pbm5lcjo6YWZ0ZXIgewogICAgICB0cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAuMThzIGVhc2UsIGJhY2tncm91bmQtY29sb3IgLjE4cyBlYXNlOwogICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gLjE4cyBlYXNlLCBiYWNrZ3JvdW5kLWNvbG9yIC4xOHMgZWFzZTsKICAgIH0KCiAgICAucGluLnJpbmcgPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXI6OmJlZm9yZSB7CiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICB9CgogICAgLnBpbi5leHBhbmQgPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXI6OmJlZm9yZSB7CiAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKSBzY2FsZSgxKSB0cmFuc2xhdGUoMTdweCwgLTE3cHgpOwogICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpIHNjYWxlKDEpIHRyYW5zbGF0ZSgxN3B4LCAtMTdweCk7CiAgICB9CgogICAgLnBpbiA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lcjo6YWZ0ZXIgewogICAgICBjb250ZW50OiBhdHRyKHZhbHVlKTsKICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB0b3A6IDA7CiAgICAgIGxlZnQ6IDUwJTsKICAgICAgbWFyZ2luLWxlZnQ6IC0xNnB4OwogICAgICB3aWR0aDogMzJweDsKICAgICAgaGVpZ2h0OiAyNnB4OwogICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItZm9udC1jb2xvciwgI2ZmZik7CiAgICAgIGZvbnQtc2l6ZTogMTBweDsKCiAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwKSB0cmFuc2xhdGUoMCk7CiAgICAgIHRyYW5zZm9ybTogc2NhbGUoMCkgdHJhbnNsYXRlKDApOwogICAgfQoKICAgIC5waW4uZXhwYW5kID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyOjphZnRlciB7CiAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxKSB0cmFuc2xhdGUoMCwgLTE3cHgpOwogICAgICB0cmFuc2Zvcm06IHNjYWxlKDEpIHRyYW5zbGF0ZSgwLCAtMTdweCk7CiAgICB9CgogICAgLyogcGFwZXItaW5wdXQgKi8KICAgIC5zbGlkZXItaW5wdXQgewogICAgICB3aWR0aDogNTBweDsKICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItc2xpZGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDsKICAgICAgfTsKICAgICAgQGFwcGx5IC0tcGFwZXItc2xpZGVyLWlucHV0OwogICAgfQoKICAgIC8qIGRpc2FibGVkIHN0YXRlICovCiAgICAjc2xpZGVyQ29udGFpbmVyLmRpc2FibGVkIHsKICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB9CgogICAgLmRpc2FibGVkID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyIHsKICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWRpc2FibGVkLWtub2ItY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgIGJvcmRlcjogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXNsaWRlci1kaXNhYmxlZC1rbm9iLWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgwLjc1LCAwLjc1LCAxKTsKICAgICAgdHJhbnNmb3JtOiBzY2FsZTNkKDAuNzUsIDAuNzUsIDEpOwogICAgfQoKICAgIC5kaXNhYmxlZC5yaW5nID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyIHsKICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3IsIHRyYW5zcGFyZW50KTsKICAgICAgYm9yZGVyOiAycHggc29saWQgdmFyKC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgfQoKICAgIHBhcGVyLXJpcHBsZSB7CiAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtNzAwKSk7CiAgICB9CiAgPC9zdHlsZT4KCiAgPGRpdiBpZD0ic2xpZGVyQ29udGFpbmVyIiBjbGFzc1wkPSJbW19nZXRDbGFzc05hbWVzKGRpc2FibGVkLCBwaW4sIHNuYXBzLCBpbW1lZGlhdGVWYWx1ZSwgbWluLCBleHBhbmQsIGRyYWdnaW5nLCB0cmFuc2l0aW5nLCBlZGl0YWJsZSldXSI+CiAgICA8ZGl2IGNsYXNzPSJiYXItY29udGFpbmVyIj4KICAgICAgPHBhcGVyLXByb2dyZXNzIGRpc2FibGVkXCQ9IltbZGlzYWJsZWRdXSIgaWQ9InNsaWRlckJhciIgYXJpYS1oaWRkZW49InRydWUiIG1pbj0iW1ttaW5dXSIgbWF4PSJbW21heF1dIiBzdGVwPSJbW3N0ZXBdXSIgdmFsdWU9IltbaW1tZWRpYXRlVmFsdWVdXSIgc2Vjb25kYXJ5LXByb2dyZXNzPSJbW3NlY29uZGFyeVByb2dyZXNzXV0iIG9uLWRvd249Il9iYXJkb3duIiBvbi11cD0iX3Jlc2V0S25vYiIgb24tdHJhY2s9Il9iYXJ0cmFjayIgb24tdGFwPSJfYmFyY2xpY2siPgogICAgICA8L3BhcGVyLXByb2dyZXNzPgogICAgPC9kaXY+CgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3NuYXBzXV0iPgogICAgICA8ZGl2IGNsYXNzPSJzbGlkZXItbWFya2VycyI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1ttYXJrZXJzXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2xpZGVyLW1hcmtlciI+PC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgoKICAgIDxkaXYgaWQ9InNsaWRlcktub2IiIGNsYXNzPSJzbGlkZXIta25vYiIgb24tZG93bj0iX2tub2Jkb3duIiBvbi11cD0iX3Jlc2V0S25vYiIgb24tdHJhY2s9Il9vblRyYWNrIiBvbi10cmFuc2l0aW9uZW5kPSJfa25vYlRyYW5zaXRpb25FbmQiPgogICAgICAgIDxkaXYgY2xhc3M9InNsaWRlci1rbm9iLWlubmVyIiB2YWx1ZVwkPSJbW2ltbWVkaWF0ZVZhbHVlXV0iPjwvZGl2PgogICAgPC9kaXY+CiAgPC9kaXY+CgogIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tlZGl0YWJsZV1dIj4KICAgIDxwYXBlci1pbnB1dCBpZD0iaW5wdXQiIHR5cGU9Im51bWJlciIgc3RlcD0iW1tzdGVwXV0iIG1pbj0iW1ttaW5dXSIgbWF4PSJbW21heF1dIiBjbGFzcz0ic2xpZGVyLWlucHV0IiBkaXNhYmxlZFwkPSJbW2Rpc2FibGVkXV0iIHZhbHVlPSJbW2ltbWVkaWF0ZVZhbHVlXV0iIG9uLWNoYW5nZT0iX2NoYW5nZVZhbHVlIiBvbi1rZXlkb3duPSJfaW5wdXRLZXlEb3duIiBuby1sYWJlbC1mbG9hdD4KICAgIDwvcGFwZXItaW5wdXQ+CiAgPC90ZW1wbGF0ZT4KYDtncy5zZXRBdHRyaWJ1dGUoInN0cmlwLXdoaXRlc3BhY2UiLCIiKSxqcih7X3RlbXBsYXRlOmdzLGlzOiJwYXBlci1zbGlkZXIiLGJlaGF2aW9yczpbWG8sZ2EseGEsZHNdLHByb3BlcnRpZXM6e3ZhbHVlOnt0eXBlOk51bWJlcix2YWx1ZTowfSxzbmFwczp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG5vdGlmeTohMH0scGluOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwfSxzZWNvbmRhcnlQcm9ncmVzczp7dHlwZTpOdW1iZXIsdmFsdWU6MCxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9zZWNvbmRhcnlQcm9ncmVzc0NoYW5nZWQifSxlZGl0YWJsZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxpbW1lZGlhdGVWYWx1ZTp7dHlwZTpOdW1iZXIsdmFsdWU6MCxyZWFkT25seTohMCxub3RpZnk6ITB9LG1heE1hcmtlcnM6e3R5cGU6TnVtYmVyLHZhbHVlOjAsbm90aWZ5OiEwfSxleHBhbmQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMH0saWdub3JlQmFyVG91Y2g6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sZHJhZ2dpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMCxub3RpZnk6ITB9LHRyYW5zaXRpbmc6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWFkT25seTohMH0sbWFya2Vyczp7dHlwZTpBcnJheSxyZWFkT25seTohMCx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX19LG9ic2VydmVyczpbIl91cGRhdGVLbm9iKHZhbHVlLCBtaW4sIG1heCwgc25hcHMsIHN0ZXApIiwiX3ZhbHVlQ2hhbmdlZCh2YWx1ZSkiLCJfaW1tZWRpYXRlVmFsdWVDaGFuZ2VkKGltbWVkaWF0ZVZhbHVlKSIsIl91cGRhdGVNYXJrZXJzKG1heE1hcmtlcnMsIG1pbiwgbWF4LCBzbmFwcykiXSxob3N0QXR0cmlidXRlczp7cm9sZToic2xpZGVyIix0YWJpbmRleDowfSxrZXlCaW5kaW5nczp7bGVmdDoiX2xlZnRLZXkiLHJpZ2h0OiJfcmlnaHRLZXkiLCJkb3duIHBhZ2Vkb3duIGhvbWUiOiJfZGVjcmVtZW50S2V5IiwidXAgcGFnZXVwIGVuZCI6Il9pbmNyZW1lbnRLZXkifSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuaWdub3JlQmFyVG91Y2gmJmRpKHRoaXMuJC5zbGlkZXJCYXIsImF1dG8iKX0saW5jcmVtZW50OmZ1bmN0aW9uKCl7dGhpcy52YWx1ZT10aGlzLl9jbGFtcFZhbHVlKHRoaXMudmFsdWUrdGhpcy5zdGVwKX0sZGVjcmVtZW50OmZ1bmN0aW9uKCl7dGhpcy52YWx1ZT10aGlzLl9jbGFtcFZhbHVlKHRoaXMudmFsdWUtdGhpcy5zdGVwKX0sX3VwZGF0ZUtub2I6ZnVuY3Rpb24odCxlLG4saSxyKXt0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS12YWx1ZW1pbiIsZSksdGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtdmFsdWVtYXgiLG4pLHRoaXMuc2V0QXR0cmlidXRlKCJhcmlhLXZhbHVlbm93Iix0KSx0aGlzLl9wb3NpdGlvbktub2IoMTAwKnRoaXMuX2NhbGNSYXRpbyh0KSl9LF92YWx1ZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmZpcmUoInZhbHVlLWNoYW5nZSIse2NvbXBvc2VkOiEwfSl9LF9pbW1lZGlhdGVWYWx1ZUNoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmRyYWdnaW5nP3RoaXMuZmlyZSgiaW1tZWRpYXRlLXZhbHVlLWNoYW5nZSIse2NvbXBvc2VkOiEwfSk6dGhpcy52YWx1ZT10aGlzLmltbWVkaWF0ZVZhbHVlfSxfc2Vjb25kYXJ5UHJvZ3Jlc3NDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5zZWNvbmRhcnlQcm9ncmVzcz10aGlzLl9jbGFtcFZhbHVlKHRoaXMuc2Vjb25kYXJ5UHJvZ3Jlc3MpfSxfZXhwYW5kS25vYjpmdW5jdGlvbigpe3RoaXMuX3NldEV4cGFuZCghMCl9LF9yZXNldEtub2I6ZnVuY3Rpb24oKXt0aGlzLmNhbmNlbERlYm91bmNlcigiZXhwYW5kS25vYiIpLHRoaXMuX3NldEV4cGFuZCghMSl9LF9wb3NpdGlvbktub2I6ZnVuY3Rpb24odCl7dGhpcy5fc2V0SW1tZWRpYXRlVmFsdWUodGhpcy5fY2FsY1N0ZXAodGhpcy5fY2FsY0tub2JQb3NpdGlvbih0KSkpLHRoaXMuX3NldFJhdGlvKDEwMCp0aGlzLl9jYWxjUmF0aW8odGhpcy5pbW1lZGlhdGVWYWx1ZSkpLHRoaXMuJC5zbGlkZXJLbm9iLnN0eWxlLmxlZnQ9dGhpcy5yYXRpbysiJSIsdGhpcy5kcmFnZ2luZyYmKHRoaXMuX2tub2JzdGFydHg9dGhpcy5yYXRpbyp0aGlzLl93LzEwMCx0aGlzLnRyYW5zbGF0ZTNkKDAsMCwwLHRoaXMuJC5zbGlkZXJLbm9iKSl9LF9jYWxjS25vYlBvc2l0aW9uOmZ1bmN0aW9uKHQpe3JldHVybih0aGlzLm1heC10aGlzLm1pbikqdC8xMDArdGhpcy5taW59LF9vblRyYWNrOmZ1bmN0aW9uKHQpe3N3aXRjaCh0LnN0b3BQcm9wYWdhdGlvbigpLHQuZGV0YWlsLnN0YXRlKXtjYXNlInN0YXJ0Ijp0aGlzLl90cmFja1N0YXJ0KHQpO2JyZWFrO2Nhc2UidHJhY2siOnRoaXMuX3RyYWNrWCh0KTticmVhaztjYXNlImVuZCI6dGhpcy5fdHJhY2tFbmQoKX19LF90cmFja1N0YXJ0OmZ1bmN0aW9uKHQpe3RoaXMuX3NldFRyYW5zaXRpbmcoITEpLHRoaXMuX3c9dGhpcy4kLnNsaWRlckJhci5vZmZzZXRXaWR0aCx0aGlzLl94PXRoaXMucmF0aW8qdGhpcy5fdy8xMDAsdGhpcy5fc3RhcnR4PXRoaXMuX3gsdGhpcy5fa25vYnN0YXJ0eD10aGlzLl9zdGFydHgsdGhpcy5fbWlueD0tdGhpcy5fc3RhcnR4LHRoaXMuX21heHg9dGhpcy5fdy10aGlzLl9zdGFydHgsdGhpcy4kLnNsaWRlcktub2IuY2xhc3NMaXN0LmFkZCgiZHJhZ2dpbmciKSx0aGlzLl9zZXREcmFnZ2luZyghMCl9LF90cmFja1g6ZnVuY3Rpb24odCl7dGhpcy5kcmFnZ2luZ3x8dGhpcy5fdHJhY2tTdGFydCh0KTt2YXIgZT1NYXRoLm1pbih0aGlzLl9tYXh4LE1hdGgubWF4KHRoaXMuX21pbngsdC5kZXRhaWwuZHgqKHRoaXMuX2lzUlRMPy0xOjEpKSk7dGhpcy5feD10aGlzLl9zdGFydHgrZTt2YXIgbj10aGlzLl9jYWxjU3RlcCh0aGlzLl9jYWxjS25vYlBvc2l0aW9uKHRoaXMuX3gvdGhpcy5fdyoxMDApKTt0aGlzLl9zZXRJbW1lZGlhdGVWYWx1ZShuKTt2YXIgaT10aGlzLl9jYWxjUmF0aW8odGhpcy5pbW1lZGlhdGVWYWx1ZSkqdGhpcy5fdy10aGlzLl9rbm9ic3RhcnR4O3RoaXMudHJhbnNsYXRlM2QoaSsicHgiLDAsMCx0aGlzLiQuc2xpZGVyS25vYil9LF90cmFja0VuZDpmdW5jdGlvbigpe3ZhciB0PXRoaXMuJC5zbGlkZXJLbm9iLnN0eWxlO3RoaXMuJC5zbGlkZXJLbm9iLmNsYXNzTGlzdC5yZW1vdmUoImRyYWdnaW5nIiksdGhpcy5fc2V0RHJhZ2dpbmcoITEpLHRoaXMuX3Jlc2V0S25vYigpLHRoaXMudmFsdWU9dGhpcy5pbW1lZGlhdGVWYWx1ZSx0LnRyYW5zZm9ybT10LndlYmtpdFRyYW5zZm9ybT0iIix0aGlzLmZpcmUoImNoYW5nZSIse2NvbXBvc2VkOiEwfSl9LF9rbm9iZG93bjpmdW5jdGlvbih0KXt0aGlzLl9leHBhbmRLbm9iKCksdC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuZm9jdXMoKX0sX2JhcnRyYWNrOmZ1bmN0aW9uKHQpe3RoaXMuX2FsbG93QmFyRXZlbnQodCkmJnRoaXMuX29uVHJhY2sodCl9LF9iYXJjbGljazpmdW5jdGlvbih0KXt0aGlzLl93PXRoaXMuJC5zbGlkZXJCYXIub2Zmc2V0V2lkdGg7dmFyIGU9dGhpcy4kLnNsaWRlckJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxuPSh0LmRldGFpbC54LWUubGVmdCkvdGhpcy5fdyoxMDA7dGhpcy5faXNSVEwmJihuPTEwMC1uKTt2YXIgaT10aGlzLnJhdGlvO3RoaXMuX3NldFRyYW5zaXRpbmcoITApLHRoaXMuX3Bvc2l0aW9uS25vYihuKSxpPT09dGhpcy5yYXRpbyYmdGhpcy5fc2V0VHJhbnNpdGluZyghMSksdGhpcy5hc3luYygoZnVuY3Rpb24oKXt0aGlzLmZpcmUoImNoYW5nZSIse2NvbXBvc2VkOiEwfSl9KSksdC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuZm9jdXMoKX0sX2JhcmRvd246ZnVuY3Rpb24odCl7dGhpcy5fYWxsb3dCYXJFdmVudCh0KSYmKHRoaXMuZGVib3VuY2UoImV4cGFuZEtub2IiLHRoaXMuX2V4cGFuZEtub2IsNjApLHRoaXMuX2JhcmNsaWNrKHQpKX0sX2tub2JUcmFuc2l0aW9uRW5kOmZ1bmN0aW9uKHQpe3QudGFyZ2V0PT09dGhpcy4kLnNsaWRlcktub2ImJnRoaXMuX3NldFRyYW5zaXRpbmcoITEpfSxfdXBkYXRlTWFya2VyczpmdW5jdGlvbih0LGUsbixpKXtpfHx0aGlzLl9zZXRNYXJrZXJzKFtdKTt2YXIgcj1NYXRoLnJvdW5kKChuLWUpL3RoaXMuc3RlcCk7cj50JiYocj10KSwocjwwfHwhaXNGaW5pdGUocikpJiYocj0wKSx0aGlzLl9zZXRNYXJrZXJzKG5ldyBBcnJheShyKSl9LF9tZXJnZUNsYXNzZXM6ZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZpbHRlcigoZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19KSkuam9pbigiICIpfSxfZ2V0Q2xhc3NOYW1lczpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9tZXJnZUNsYXNzZXMoe2Rpc2FibGVkOnRoaXMuZGlzYWJsZWQscGluOnRoaXMucGluLHNuYXBzOnRoaXMuc25hcHMscmluZzp0aGlzLmltbWVkaWF0ZVZhbHVlPD10aGlzLm1pbixleHBhbmQ6dGhpcy5leHBhbmQsZHJhZ2dpbmc6dGhpcy5kcmFnZ2luZyx0cmFuc2l0aW5nOnRoaXMudHJhbnNpdGluZyxlZGl0YWJsZTp0aGlzLmVkaXRhYmxlfSl9LF9hbGxvd0JhckV2ZW50OmZ1bmN0aW9uKHQpe3JldHVybiF0aGlzLmlnbm9yZUJhclRvdWNofHx0LmRldGFpbC5zb3VyY2VFdmVudCBpbnN0YW5jZW9mIE1vdXNlRXZlbnR9LGdldCBfaXNSVEwoKXtyZXR1cm4gdm9pZCAwPT09dGhpcy5fX2lzUlRMJiYodGhpcy5fX2lzUlRMPSJydGwiPT09d2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcykuZGlyZWN0aW9uKSx0aGlzLl9faXNSVEx9LF9sZWZ0S2V5OmZ1bmN0aW9uKHQpe3RoaXMuX2lzUlRMP3RoaXMuX2luY3JlbWVudEtleSh0KTp0aGlzLl9kZWNyZW1lbnRLZXkodCl9LF9yaWdodEtleTpmdW5jdGlvbih0KXt0aGlzLl9pc1JUTD90aGlzLl9kZWNyZW1lbnRLZXkodCk6dGhpcy5faW5jcmVtZW50S2V5KHQpfSxfaW5jcmVtZW50S2V5OmZ1bmN0aW9uKHQpe3RoaXMuZGlzYWJsZWR8fCgiZW5kIj09PXQuZGV0YWlsLmtleT90aGlzLnZhbHVlPXRoaXMubWF4OnRoaXMuaW5jcmVtZW50KCksdGhpcy5maXJlKCJjaGFuZ2UiKSx0LnByZXZlbnREZWZhdWx0KCkpfSxfZGVjcmVtZW50S2V5OmZ1bmN0aW9uKHQpe3RoaXMuZGlzYWJsZWR8fCgiaG9tZSI9PT10LmRldGFpbC5rZXk/dGhpcy52YWx1ZT10aGlzLm1pbjp0aGlzLmRlY3JlbWVudCgpLHRoaXMuZmlyZSgiY2hhbmdlIiksdC5wcmV2ZW50RGVmYXVsdCgpKX0sX2NoYW5nZVZhbHVlOmZ1bmN0aW9uKHQpe3RoaXMudmFsdWU9dC50YXJnZXQudmFsdWUsdGhpcy5maXJlKCJjaGFuZ2UiLHtjb21wb3NlZDohMH0pfSxfaW5wdXRLZXlEb3duOmZ1bmN0aW9uKHQpe3Quc3RvcFByb3BhZ2F0aW9uKCl9LF9jcmVhdGVSaXBwbGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmlwcGxlQ29udGFpbmVyPXRoaXMuJC5zbGlkZXJLbm9iLGJhLl9jcmVhdGVSaXBwbGUuY2FsbCh0aGlzKX0sX2ZvY3VzZWRDaGFuZ2VkOmZ1bmN0aW9uKHQpe3QmJnRoaXMuZW5zdXJlUmlwcGxlKCksdGhpcy5oYXNSaXBwbGUoKSYmKHRoaXMuX3JpcHBsZS5zdHlsZS5kaXNwbGF5PXQ/IiI6Im5vbmUiLHRoaXMuX3JpcHBsZS5ob2xkRG93bj10KX19KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IF9zPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIik7X3Muc2V0QXR0cmlidXRlKCJzdHlsZSIsImRpc3BsYXk6IG5vbmU7IiksX3MuaW5uZXJIVE1MPSI8ZG9tLW1vZHVsZSBpZD1cInBhcGVyLXNwaW5uZXItc3R5bGVzXCI+XG4gIDx0ZW1wbGF0ZT5cbiAgICA8c3R5bGU+XG4gICAgICAvKlxuICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqL1xuICAgICAgLyogU1RZTEVTIEZPUiBUSEUgU1BJTk5FUiAqL1xuICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4gICAgICAvKlxuICAgICAgICogQ29uc3RhbnRzOlxuICAgICAgICogICAgICBBUkNTSVpFICAgICA9IDI3MCBkZWdyZWVzIChhbW91bnQgb2YgY2lyY2xlIHRoZSBhcmMgdGFrZXMgdXApXG4gICAgICAgKiAgICAgIEFSQ1RJTUUgICAgID0gMTMzM21zICh0aW1lIGl0IHRha2VzIHRvIGV4cGFuZCBhbmQgY29udHJhY3QgYXJjKVxuICAgICAgICogICAgICBBUkNTVEFSVFJPVCA9IDIxNiBkZWdyZWVzIChob3cgbXVjaCB0aGUgc3RhcnQgbG9jYXRpb24gb2YgdGhlIGFyY1xuICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCByb3RhdGUgZWFjaCB0aW1lLCAyMTYgZ2l2ZXMgdXMgYVxuICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUgcG9pbnRlZCBzdGFyIHNoYXBlIChpdCdzIDM2MC81ICogMykuXG4gICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIGEgNyBwb2ludGVkIHN0YXIsIHdlIG1pZ2h0IGRvXG4gICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzYwLzcgKiAzID0gMTU0LjI4NilcbiAgICAgICAqICAgICAgU0hSSU5LX1RJTUUgPSA0MDBtc1xuICAgICAgICovXG5cbiAgICAgIDpob3N0IHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIHdpZHRoOiAyOHB4O1xuICAgICAgICBoZWlnaHQ6IDI4cHg7XG5cbiAgICAgICAgLyogMzYwICogQVJDVElNRSAvIChBUkNTVEFSVFJPVCArICgzNjAtQVJDU0laRSkpICovXG4gICAgICAgIC0tcGFwZXItc3Bpbm5lci1jb250YWluZXItcm90YXRpb24tZHVyYXRpb246IDE1NjhtcztcblxuICAgICAgICAvKiBBUkNUSU1FICovXG4gICAgICAgIC0tcGFwZXItc3Bpbm5lci1leHBhbmQtY29udHJhY3QtZHVyYXRpb246IDEzMzNtcztcblxuICAgICAgICAvKiA0ICogQVJDVElNRSAqL1xuICAgICAgICAtLXBhcGVyLXNwaW5uZXItZnVsbC1jeWNsZS1kdXJhdGlvbjogNTMzMm1zO1xuXG4gICAgICAgIC8qIFNIUklOS19USU1FICovXG4gICAgICAgIC0tcGFwZXItc3Bpbm5lci1jb29sZG93bi1kdXJhdGlvbjogNDAwbXM7XG4gICAgICB9XG5cbiAgICAgICNzcGlubmVyQ29udGFpbmVyIHtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICAgIGhlaWdodDogMTAwJTtcblxuICAgICAgICAvKiBUaGUgc3Bpbm5lciBkb2VzIG5vdCBoYXZlIGFueSBjb250ZW50cyB0aGF0IHdvdWxkIGhhdmUgdG8gYmVcbiAgICAgICAgICogZmxpcHBlZCBpZiB0aGUgZGlyZWN0aW9uIGNoYW5nZXMuIEFsd2F5cyB1c2UgbHRyIHNvIHRoYXQgdGhlXG4gICAgICAgICAqIHN0eWxlIHdvcmtzIG91dCBjb3JyZWN0bHkgaW4gYm90aCBjYXNlcy4gKi9cbiAgICAgICAgZGlyZWN0aW9uOiBsdHI7XG4gICAgICB9XG5cbiAgICAgICNzcGlubmVyQ29udGFpbmVyLmFjdGl2ZSB7XG4gICAgICAgIC13ZWJraXQtYW5pbWF0aW9uOiBjb250YWluZXItcm90YXRlIHZhcigtLXBhcGVyLXNwaW5uZXItY29udGFpbmVyLXJvdGF0aW9uLWR1cmF0aW9uKSBsaW5lYXIgaW5maW5pdGU7XG4gICAgICAgIGFuaW1hdGlvbjogY29udGFpbmVyLXJvdGF0ZSB2YXIoLS1wYXBlci1zcGlubmVyLWNvbnRhaW5lci1yb3RhdGlvbi1kdXJhdGlvbikgbGluZWFyIGluZmluaXRlO1xuICAgICAgfVxuXG4gICAgICBALXdlYmtpdC1rZXlmcmFtZXMgY29udGFpbmVyLXJvdGF0ZSB7XG4gICAgICAgIHRvIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpIH1cbiAgICAgIH1cblxuICAgICAgQGtleWZyYW1lcyBjb250YWluZXItcm90YXRlIHtcbiAgICAgICAgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpIH1cbiAgICAgIH1cblxuICAgICAgLnNwaW5uZXItbGF5ZXIge1xuICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS01MDApKTtcbiAgICAgIH1cblxuICAgICAgLmxheWVyLTEge1xuICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItc3Bpbm5lci1sYXllci0xLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS01MDApKTtcbiAgICAgIH1cblxuICAgICAgLmxheWVyLTIge1xuICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItc3Bpbm5lci1sYXllci0yLWNvbG9yLCB2YXIoLS1nb29nbGUtcmVkLTUwMCkpO1xuICAgICAgfVxuXG4gICAgICAubGF5ZXItMyB7XG4gICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWxheWVyLTMtY29sb3IsIHZhcigtLWdvb2dsZS15ZWxsb3ctNTAwKSk7XG4gICAgICB9XG5cbiAgICAgIC5sYXllci00IHtcbiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXNwaW5uZXItbGF5ZXItNC1jb2xvciwgdmFyKC0tZ29vZ2xlLWdyZWVuLTUwMCkpO1xuICAgICAgfVxuXG4gICAgICAvKipcbiAgICAgICAqIElNUE9SVEFOVCBOT1RFIEFCT1VUIENTUyBBTklNQVRJT04gUFJPUEVSVElFUyAoa2VhbnVsZWUpOlxuICAgICAgICpcbiAgICAgICAqIGlPUyBTYWZhcmkgKHRlc3RlZCBvbiBpT1MgOC4xKSBkb2VzIG5vdCBoYW5kbGUgYW5pbWF0aW9uLWRlbGF5IHZlcnkgd2VsbCAtIGl0IGRvZXNuJ3RcbiAgICAgICAqIGd1YXJhbnRlZSB0aGF0IHRoZSBhbmltYXRpb24gd2lsbCBzdGFydCBfZXhhY3RseV8gYWZ0ZXIgdGhhdCB2YWx1ZS4gU28gd2UgYXZvaWQgdXNpbmdcbiAgICAgICAqIGFuaW1hdGlvbi1kZWxheSBhbmQgaW5zdGVhZCBzZXQgY3VzdG9tIGtleWZyYW1lcyBmb3IgZWFjaCBjb2xvciAoYXMgbGF5ZXItMnVuZGFudCBhcyBpdFxuICAgICAgICogc2VlbXMpLlxuICAgICAgICovXG4gICAgICAuYWN0aXZlIC5zcGlubmVyLWxheWVyIHtcbiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlO1xuICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItc3Bpbm5lci1mdWxsLWN5Y2xlLWR1cmF0aW9uKTtcbiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7XG4gICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7XG4gICAgICAgIGFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGU7XG4gICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItc3Bpbm5lci1mdWxsLWN5Y2xlLWR1cmF0aW9uKTtcbiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpO1xuICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgIH1cblxuICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci0xIHtcbiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlLCBsYXllci0xLWZhZGUtaW4tb3V0O1xuICAgICAgICBhbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlLCBsYXllci0xLWZhZGUtaW4tb3V0O1xuICAgICAgfVxuXG4gICAgICAuYWN0aXZlIC5zcGlubmVyLWxheWVyLmxheWVyLTIge1xuICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTItZmFkZS1pbi1vdXQ7XG4gICAgICAgIGFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTItZmFkZS1pbi1vdXQ7XG4gICAgICB9XG5cbiAgICAgIC5hY3RpdmUgLnNwaW5uZXItbGF5ZXIubGF5ZXItMyB7XG4gICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItMy1mYWRlLWluLW91dDtcbiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZSwgbGF5ZXItMy1mYWRlLWluLW91dDtcbiAgICAgIH1cblxuICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllci5sYXllci00IHtcbiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlLCBsYXllci00LWZhZGUtaW4tb3V0O1xuICAgICAgICBhbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlLCBsYXllci00LWZhZGUtaW4tb3V0O1xuICAgICAgfVxuXG4gICAgICBALXdlYmtpdC1rZXlmcmFtZXMgZmlsbC11bmZpbGwtcm90YXRlIHtcbiAgICAgICAgMTIuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEzNWRlZykgfSAvKiAwLjUgKiBBUkNTSVpFICovXG4gICAgICAgIDI1JSAgIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpIH0gLyogMSAgICogQVJDU0laRSAqL1xuICAgICAgICAzNy41JSB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoNDA1ZGVnKSB9IC8qIDEuNSAqIEFSQ1NJWkUgKi9cbiAgICAgICAgNTAlICAgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDU0MGRlZykgfSAvKiAyICAgKiBBUkNTSVpFICovXG4gICAgICAgIDYyLjUlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg2NzVkZWcpIH0gLyogMi41ICogQVJDU0laRSAqL1xuICAgICAgICA3NSUgICB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoODEwZGVnKSB9IC8qIDMgICAqIEFSQ1NJWkUgKi9cbiAgICAgICAgODcuNSUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDk0NWRlZykgfSAvKiAzLjUgKiBBUkNTSVpFICovXG4gICAgICAgIHRvICAgIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMDgwZGVnKSB9IC8qIDQgICAqIEFSQ1NJWkUgKi9cbiAgICAgIH1cblxuICAgICAgQGtleWZyYW1lcyBmaWxsLXVuZmlsbC1yb3RhdGUge1xuICAgICAgICAxMi41JSB7IHRyYW5zZm9ybTogcm90YXRlKDEzNWRlZykgfSAvKiAwLjUgKiBBUkNTSVpFICovXG4gICAgICAgIDI1JSAgIHsgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKSB9IC8qIDEgICAqIEFSQ1NJWkUgKi9cbiAgICAgICAgMzcuNSUgeyB0cmFuc2Zvcm06IHJvdGF0ZSg0MDVkZWcpIH0gLyogMS41ICogQVJDU0laRSAqL1xuICAgICAgICA1MCUgICB7IHRyYW5zZm9ybTogcm90YXRlKDU0MGRlZykgfSAvKiAyICAgKiBBUkNTSVpFICovXG4gICAgICAgIDYyLjUlIHsgdHJhbnNmb3JtOiByb3RhdGUoNjc1ZGVnKSB9IC8qIDIuNSAqIEFSQ1NJWkUgKi9cbiAgICAgICAgNzUlICAgeyB0cmFuc2Zvcm06IHJvdGF0ZSg4MTBkZWcpIH0gLyogMyAgICogQVJDU0laRSAqL1xuICAgICAgICA4Ny41JSB7IHRyYW5zZm9ybTogcm90YXRlKDk0NWRlZykgfSAvKiAzLjUgKiBBUkNTSVpFICovXG4gICAgICAgIHRvICAgIHsgdHJhbnNmb3JtOiByb3RhdGUoMTA4MGRlZykgfSAvKiA0ICAgKiBBUkNTSVpFICovXG4gICAgICB9XG5cbiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsYXllci0xLWZhZGUtaW4tb3V0IHtcbiAgICAgICAgMCUgeyBvcGFjaXR5OiAxIH1cbiAgICAgICAgMjUlIHsgb3BhY2l0eTogMSB9XG4gICAgICAgIDI2JSB7IG9wYWNpdHk6IDAgfVxuICAgICAgICA4OSUgeyBvcGFjaXR5OiAwIH1cbiAgICAgICAgOTAlIHsgb3BhY2l0eTogMSB9XG4gICAgICAgIHRvIHsgb3BhY2l0eTogMSB9XG4gICAgICB9XG5cbiAgICAgIEBrZXlmcmFtZXMgbGF5ZXItMS1mYWRlLWluLW91dCB7XG4gICAgICAgIDAlIHsgb3BhY2l0eTogMSB9XG4gICAgICAgIDI1JSB7IG9wYWNpdHk6IDEgfVxuICAgICAgICAyNiUgeyBvcGFjaXR5OiAwIH1cbiAgICAgICAgODklIHsgb3BhY2l0eTogMCB9XG4gICAgICAgIDkwJSB7IG9wYWNpdHk6IDEgfVxuICAgICAgICB0byB7IG9wYWNpdHk6IDEgfVxuICAgICAgfVxuXG4gICAgICBALXdlYmtpdC1rZXlmcmFtZXMgbGF5ZXItMi1mYWRlLWluLW91dCB7XG4gICAgICAgIDAlIHsgb3BhY2l0eTogMCB9XG4gICAgICAgIDE1JSB7IG9wYWNpdHk6IDAgfVxuICAgICAgICAyNSUgeyBvcGFjaXR5OiAxIH1cbiAgICAgICAgNTAlIHsgb3BhY2l0eTogMSB9XG4gICAgICAgIDUxJSB7IG9wYWNpdHk6IDAgfVxuICAgICAgICB0byB7IG9wYWNpdHk6IDAgfVxuICAgICAgfVxuXG4gICAgICBAa2V5ZnJhbWVzIGxheWVyLTItZmFkZS1pbi1vdXQge1xuICAgICAgICAwJSB7IG9wYWNpdHk6IDAgfVxuICAgICAgICAxNSUgeyBvcGFjaXR5OiAwIH1cbiAgICAgICAgMjUlIHsgb3BhY2l0eTogMSB9XG4gICAgICAgIDUwJSB7IG9wYWNpdHk6IDEgfVxuICAgICAgICA1MSUgeyBvcGFjaXR5OiAwIH1cbiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH1cbiAgICAgIH1cblxuICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGxheWVyLTMtZmFkZS1pbi1vdXQge1xuICAgICAgICAwJSB7IG9wYWNpdHk6IDAgfVxuICAgICAgICA0MCUgeyBvcGFjaXR5OiAwIH1cbiAgICAgICAgNTAlIHsgb3BhY2l0eTogMSB9XG4gICAgICAgIDc1JSB7IG9wYWNpdHk6IDEgfVxuICAgICAgICA3NiUgeyBvcGFjaXR5OiAwIH1cbiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH1cbiAgICAgIH1cblxuICAgICAgQGtleWZyYW1lcyBsYXllci0zLWZhZGUtaW4tb3V0IHtcbiAgICAgICAgMCUgeyBvcGFjaXR5OiAwIH1cbiAgICAgICAgNDAlIHsgb3BhY2l0eTogMCB9XG4gICAgICAgIDUwJSB7IG9wYWNpdHk6IDEgfVxuICAgICAgICA3NSUgeyBvcGFjaXR5OiAxIH1cbiAgICAgICAgNzYlIHsgb3BhY2l0eTogMCB9XG4gICAgICAgIHRvIHsgb3BhY2l0eTogMCB9XG4gICAgICB9XG5cbiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsYXllci00LWZhZGUtaW4tb3V0IHtcbiAgICAgICAgMCUgeyBvcGFjaXR5OiAwIH1cbiAgICAgICAgNjUlIHsgb3BhY2l0eTogMCB9XG4gICAgICAgIDc1JSB7IG9wYWNpdHk6IDEgfVxuICAgICAgICA5MCUgeyBvcGFjaXR5OiAxIH1cbiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH1cbiAgICAgIH1cblxuICAgICAgQGtleWZyYW1lcyBsYXllci00LWZhZGUtaW4tb3V0IHtcbiAgICAgICAgMCUgeyBvcGFjaXR5OiAwIH1cbiAgICAgICAgNjUlIHsgb3BhY2l0eTogMCB9XG4gICAgICAgIDc1JSB7IG9wYWNpdHk6IDEgfVxuICAgICAgICA5MCUgeyBvcGFjaXR5OiAxIH1cbiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH1cbiAgICAgIH1cblxuICAgICAgLmNpcmNsZS1jbGlwcGVyIHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIHdpZHRoOiA1MCU7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgICAgIH1cblxuICAgICAgLyoqXG4gICAgICAgKiBQYXRjaCB0aGUgZ2FwIHRoYXQgYXBwZWFyIGJldHdlZW4gdGhlIHR3byBhZGphY2VudCBkaXYuY2lyY2xlLWNsaXBwZXIgd2hpbGUgdGhlXG4gICAgICAgKiBzcGlubmVyIGlzIHJvdGF0aW5nIChhcHBlYXJzIG9uIENocm9tZSA1MCwgU2FmYXJpIDkuMS4xLCBhbmQgRWRnZSkuXG4gICAgICAgKi9cbiAgICAgIC5zcGlubmVyLWxheWVyOjphZnRlciB7XG4gICAgICAgIGNvbnRlbnQ6ICcnO1xuICAgICAgICBsZWZ0OiA0NSU7XG4gICAgICAgIHdpZHRoOiAxMCU7XG4gICAgICAgIGJvcmRlci10b3Atc3R5bGU6IHNvbGlkO1xuICAgICAgfVxuXG4gICAgICAuc3Bpbm5lci1sYXllcjo6YWZ0ZXIsXG4gICAgICAuY2lyY2xlLWNsaXBwZXIgLmNpcmNsZSB7XG4gICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgICBib3JkZXItd2lkdGg6IHZhcigtLXBhcGVyLXNwaW5uZXItc3Ryb2tlLXdpZHRoLCAzcHgpO1xuICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7XG4gICAgICB9XG5cbiAgICAgIC5jaXJjbGUtY2xpcHBlciAuY2lyY2xlIHtcbiAgICAgICAgYm90dG9tOiAwO1xuICAgICAgICB3aWR0aDogMjAwJTtcbiAgICAgICAgYm9yZGVyLXN0eWxlOiBzb2xpZDtcbiAgICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcbiAgICAgIH1cblxuICAgICAgLmNpcmNsZS1jbGlwcGVyLmxlZnQgLmNpcmNsZSB7XG4gICAgICAgIGxlZnQ6IDA7XG4gICAgICAgIGJvcmRlci1yaWdodC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMjlkZWcpO1xuICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxMjlkZWcpO1xuICAgICAgfVxuXG4gICAgICAuY2lyY2xlLWNsaXBwZXIucmlnaHQgLmNpcmNsZSB7XG4gICAgICAgIGxlZnQ6IC0xMDAlO1xuICAgICAgICBib3JkZXItbGVmdC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcbiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtMTI5ZGVnKTtcbiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoLTEyOWRlZyk7XG4gICAgICB9XG5cbiAgICAgIC5hY3RpdmUgLmdhcC1wYXRjaDo6YWZ0ZXIsXG4gICAgICAuYWN0aXZlIC5jaXJjbGUtY2xpcHBlciAuY2lyY2xlIHtcbiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXNwaW5uZXItZXhwYW5kLWNvbnRyYWN0LWR1cmF0aW9uKTtcbiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7XG4gICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7XG4gICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItc3Bpbm5lci1leHBhbmQtY29udHJhY3QtZHVyYXRpb24pO1xuICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7XG4gICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlO1xuICAgICAgfVxuXG4gICAgICAuYWN0aXZlIC5jaXJjbGUtY2xpcHBlci5sZWZ0IC5jaXJjbGUge1xuICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBsZWZ0LXNwaW47XG4gICAgICAgIGFuaW1hdGlvbi1uYW1lOiBsZWZ0LXNwaW47XG4gICAgICB9XG5cbiAgICAgIC5hY3RpdmUgLmNpcmNsZS1jbGlwcGVyLnJpZ2h0IC5jaXJjbGUge1xuICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiByaWdodC1zcGluO1xuICAgICAgICBhbmltYXRpb24tbmFtZTogcmlnaHQtc3BpbjtcbiAgICAgIH1cblxuICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGxlZnQtc3BpbiB7XG4gICAgICAgIDAlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMzBkZWcpIH1cbiAgICAgICAgNTAlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtNWRlZykgfVxuICAgICAgICB0byB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMTMwZGVnKSB9XG4gICAgICB9XG5cbiAgICAgIEBrZXlmcmFtZXMgbGVmdC1zcGluIHtcbiAgICAgICAgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgxMzBkZWcpIH1cbiAgICAgICAgNTAlIHsgdHJhbnNmb3JtOiByb3RhdGUoLTVkZWcpIH1cbiAgICAgICAgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgxMzBkZWcpIH1cbiAgICAgIH1cblxuICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIHJpZ2h0LXNwaW4ge1xuICAgICAgICAwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTEzMGRlZykgfVxuICAgICAgICA1MCUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDVkZWcpIH1cbiAgICAgICAgdG8geyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC0xMzBkZWcpIH1cbiAgICAgIH1cblxuICAgICAgQGtleWZyYW1lcyByaWdodC1zcGluIHtcbiAgICAgICAgMCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSgtMTMwZGVnKSB9XG4gICAgICAgIDUwJSB7IHRyYW5zZm9ybTogcm90YXRlKDVkZWcpIH1cbiAgICAgICAgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgtMTMwZGVnKSB9XG4gICAgICB9XG5cbiAgICAgICNzcGlubmVyQ29udGFpbmVyLmNvb2xkb3duIHtcbiAgICAgICAgLXdlYmtpdC1hbmltYXRpb246IGNvbnRhaW5lci1yb3RhdGUgdmFyKC0tcGFwZXItc3Bpbm5lci1jb250YWluZXItcm90YXRpb24tZHVyYXRpb24pIGxpbmVhciBpbmZpbml0ZSwgZmFkZS1vdXQgdmFyKC0tcGFwZXItc3Bpbm5lci1jb29sZG93bi1kdXJhdGlvbikgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpO1xuICAgICAgICBhbmltYXRpb246IGNvbnRhaW5lci1yb3RhdGUgdmFyKC0tcGFwZXItc3Bpbm5lci1jb250YWluZXItcm90YXRpb24tZHVyYXRpb24pIGxpbmVhciBpbmZpbml0ZSwgZmFkZS1vdXQgdmFyKC0tcGFwZXItc3Bpbm5lci1jb29sZG93bi1kdXJhdGlvbikgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpO1xuICAgICAgfVxuXG4gICAgICBALXdlYmtpdC1rZXlmcmFtZXMgZmFkZS1vdXQge1xuICAgICAgICAwJSB7IG9wYWNpdHk6IDEgfVxuICAgICAgICB0byB7IG9wYWNpdHk6IDAgfVxuICAgICAgfVxuXG4gICAgICBAa2V5ZnJhbWVzIGZhZGUtb3V0IHtcbiAgICAgICAgMCUgeyBvcGFjaXR5OiAxIH1cbiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH1cbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICA8L3RlbXBsYXRlPlxuPC9kb20tbW9kdWxlPiIsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChfcy5jb250ZW50KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IHlzPXtwcm9wZXJ0aWVzOnthY3RpdmU6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMSxyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsb2JzZXJ2ZXI6Il9fYWN0aXZlQ2hhbmdlZCJ9LGFsdDp7dHlwZTpTdHJpbmcsdmFsdWU6ImxvYWRpbmciLG9ic2VydmVyOiJfX2FsdENoYW5nZWQifSxfX2Nvb2xpbmdEb3duOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9fSxfX2NvbXB1dGVDb250YWluZXJDbGFzc2VzOmZ1bmN0aW9uKHQsZSl7cmV0dXJuW3R8fGU/ImFjdGl2ZSI6IiIsZT8iY29vbGRvd24iOiIiXS5qb2luKCIgIil9LF9fYWN0aXZlQ2hhbmdlZDpmdW5jdGlvbih0LGUpe3RoaXMuX19zZXRBcmlhSGlkZGVuKCF0KSx0aGlzLl9fY29vbGluZ0Rvd249IXQmJmV9LF9fYWx0Q2hhbmdlZDpmdW5jdGlvbih0KXsibG9hZGluZyI9PT10P3RoaXMuYWx0PXRoaXMuZ2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIil8fHQ6KHRoaXMuX19zZXRBcmlhSGlkZGVuKCIiPT09dCksdGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtbGFiZWwiLHQpKX0sX19zZXRBcmlhSGlkZGVuOmZ1bmN0aW9uKHQpe3ZhciBlPSJhcmlhLWhpZGRlbiI7dD90aGlzLnNldEF0dHJpYnV0ZShlLCJ0cnVlIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUoZSl9LF9fcmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLmFjdGl2ZT0hMSx0aGlzLl9fY29vbGluZ0Rvd249ITF9fSx2cz14ZWAKICA8c3R5bGUgaW5jbHVkZT0icGFwZXItc3Bpbm5lci1zdHlsZXMiPjwvc3R5bGU+CgogIDxkaXYgaWQ9InNwaW5uZXJDb250YWluZXIiIGNsYXNzLW5hbWU9IltbX19jb21wdXRlQ29udGFpbmVyQ2xhc3NlcyhhY3RpdmUsIF9fY29vbGluZ0Rvd24pXV0iIG9uLWFuaW1hdGlvbmVuZD0iX19yZXNldCIgb24td2Via2l0LWFuaW1hdGlvbi1lbmQ9Il9fcmVzZXQiPgogICAgPGRpdiBjbGFzcz0ic3Bpbm5lci1sYXllciBsYXllci0xIj4KICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlLWNsaXBwZXIgbGVmdCI+CiAgICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlIj48L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZS1jbGlwcGVyIHJpZ2h0Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUiPjwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9InNwaW5uZXItbGF5ZXIgbGF5ZXItMiI+CiAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZS1jbGlwcGVyIGxlZnQiPgogICAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZSI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciByaWdodCI+CiAgICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlIj48L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJzcGlubmVyLWxheWVyIGxheWVyLTMiPgogICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciBsZWZ0Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUiPjwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlLWNsaXBwZXIgcmlnaHQiPgogICAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZSI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0ic3Bpbm5lci1sYXllciBsYXllci00Ij4KICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlLWNsaXBwZXIgbGVmdCI+CiAgICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlIj48L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZS1jbGlwcGVyIHJpZ2h0Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUiPjwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2PgpgOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi92cy5zZXRBdHRyaWJ1dGUoInN0cmlwLXdoaXRlc3BhY2UiLCIiKSxqcih7X3RlbXBsYXRlOnZzLGlzOiJwYXBlci1zcGlubmVyIixiZWhhdmlvcnM6W3lzXX0pOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgYnM9eGVgCiAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLXNwaW5uZXItc3R5bGVzIj48L3N0eWxlPgoKICA8ZGl2IGlkPSJzcGlubmVyQ29udGFpbmVyIiBjbGFzcy1uYW1lPSJbW19fY29tcHV0ZUNvbnRhaW5lckNsYXNzZXMoYWN0aXZlLCBfX2Nvb2xpbmdEb3duKV1dIiBvbi1hbmltYXRpb25lbmQ9Il9fcmVzZXQiIG9uLXdlYmtpdC1hbmltYXRpb24tZW5kPSJfX3Jlc2V0Ij4KICAgIDxkaXYgY2xhc3M9InNwaW5uZXItbGF5ZXIiPgogICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciBsZWZ0Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUiPjwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlLWNsaXBwZXIgcmlnaHQiPgogICAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZSI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgPC9kaXY+CmA7YnMuc2V0QXR0cmlidXRlKCJzdHJpcC13aGl0ZXNwYWNlIiwiIiksanIoe190ZW1wbGF0ZTpicyxpczoicGFwZXItc3Bpbm5lci1saXRlIixiZWhhdmlvcnM6W3lzXX0pOwovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCB4cz14ZWA8aXJvbi1pY29uc2V0LXN2ZyBuYW1lPSJwYXBlci10YWJzIiBzaXplPSIyNCI+Cjxzdmc+PGRlZnM+CjxnIGlkPSJjaGV2cm9uLWxlZnQiPjxwYXRoIGQ9Ik0xNS40MSA3LjQxTDE0IDZsLTYgNiA2IDYgMS40MS0xLjQxTDEwLjgzIDEyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNoZXZyb24tcmlnaHQiPjxwYXRoIGQ9Ik0xMCA2TDguNTkgNy40MSAxMy4xNyAxMmwtNC41OCA0LjU5TDEwIDE4bDYtNnoiPjwvcGF0aD48L2c+CjwvZGVmcz48L3N2Zz4KPC9pcm9uLWljb25zZXQtc3ZnPmA7ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh4cy5jb250ZW50KSwKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KanIoe190ZW1wbGF0ZTp4ZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLWxheW91dC1pbmxpbmU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1hdXRvOwoKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogMCAxMnB4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFiOwogICAgICB9CgogICAgICA6aG9zdCg6Zm9jdXMpIHsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CgogICAgICA6aG9zdChbbGlua10pIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAudGFiLWNvbnRlbnQgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWigwKTsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMXMgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAxLCAxKTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1hdXRvOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYi1jb250ZW50OwogICAgICB9CgogICAgICA6aG9zdCg6bm90KC5pcm9uLXNlbGVjdGVkKSkgPiAudGFiLWNvbnRlbnQgewogICAgICAgIG9wYWNpdHk6IDAuODsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFiLWNvbnRlbnQtdW5zZWxlY3RlZDsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSAudGFiLWNvbnRlbnQgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgICAgZm9udC13ZWlnaHQ6IDcwMDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFiLWNvbnRlbnQtZm9jdXNlZDsKICAgICAgfQoKICAgICAgcGFwZXItcmlwcGxlIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdGFiLWluaywgdmFyKC0tcGFwZXIteWVsbG93LWExMDApKTsKICAgICAgfQoKICAgICAgLnRhYi1jb250ZW50ID4gOjpzbG90dGVkKGEpIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleC1hdXRvOwoKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0idGFiLWNvbnRlbnQiPgogICAgICA8c2xvdD48L3Nsb3Q+CiAgICA8L2Rpdj4KYCxpczoicGFwZXItdGFiIixiZWhhdmlvcnM6W3JhLGFhLHVhXSxwcm9wZXJ0aWVzOntsaW5rOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEscmVmbGVjdFRvQXR0cmlidXRlOiEwfX0saG9zdEF0dHJpYnV0ZXM6e3JvbGU6InRhYiJ9LGxpc3RlbmVyczp7ZG93bjoiX3VwZGF0ZU5vaW5rIix0YXA6Il9vblRhcCJ9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlTm9pbmsoKX0sZ2V0IF9wYXJlbnROb2luaygpe3ZhciB0PWVyKHRoaXMpLnBhcmVudE5vZGU7cmV0dXJuISF0JiYhIXQubm9pbmt9LF91cGRhdGVOb2luazpmdW5jdGlvbigpe3RoaXMubm9pbms9ISF0aGlzLm5vaW5rfHwhIXRoaXMuX3BhcmVudE5vaW5rfSxfb25UYXA6ZnVuY3Rpb24odCl7aWYodGhpcy5saW5rKXt2YXIgZT10aGlzLnF1ZXJ5RWZmZWN0aXZlQ2hpbGRyZW4oImEiKTtpZighZSlyZXR1cm47aWYodC50YXJnZXQ9PT1lKXJldHVybjtlLmNsaWNrKCl9fX0pLAovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpqcih7X3RlbXBsYXRlOnhlYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0OwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CgogICAgICAgIGhlaWdodDogNDhweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CgogICAgICAgIC8qIE5PVEU6IEJvdGggdmFsdWVzIGFyZSBuZWVkZWQsIHNpbmNlIHNvbWUgcGhvbmVzIHJlcXVpcmUgdGhlIHZhbHVlIHRvIGJlIFxgdHJhbnNwYXJlbnRcYC4gKi8KICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMCk7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFiczsKICAgICAgfQoKICAgICAgOmhvc3QoOmRpcihydGwpKSB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWwtcmV2ZXJzZTsKICAgICAgfQoKICAgICAgI3RhYnNDb250YWluZXIgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4LWF1dG87CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFicy1jb250YWluZXI7CiAgICAgIH0KCiAgICAgICN0YWJzQ29udGVudCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIC1tb3otZmxleC1iYXNpczogYXV0bzsKICAgICAgICAtbXMtZmxleC1iYXNpczogYXV0bzsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYnMtY29udGVudDsKICAgICAgfQoKICAgICAgI3RhYnNDb250ZW50LnNjcm9sbGFibGUgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CgogICAgICAjdGFic0NvbnRlbnQ6bm90KC5zY3JvbGxhYmxlKSwKICAgICAgI3RhYnNDb250ZW50LnNjcm9sbGFibGUuZml0LWNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgIH0KCiAgICAgICN0YWJzQ29udGVudC5zY3JvbGxhYmxlLmZpdC1jb250YWluZXIgewogICAgICAgIG1pbi13aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgI3RhYnNDb250ZW50LnNjcm9sbGFibGUuZml0LWNvbnRhaW5lciA+IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgLyogSUUgLSBwcmV2ZW50IHRhYnMgZnJvbSBjb21wcmVzc2luZyB3aGVuIHRoZXkgc2hvdWxkIHNjcm9sbC4gKi8KICAgICAgICAtbXMtZmxleDogMSAwIGF1dG87CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxIDAgYXV0bzsKICAgICAgICBmbGV4OiAxIDAgYXV0bzsKICAgICAgfQoKICAgICAgLmhpZGRlbiB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLm5vdC12aXNpYmxlIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIHdpZHRoOiA0OHB4OwogICAgICAgIGhlaWdodDogNDhweDsKICAgICAgICBwYWRkaW5nOiAxMnB4OwogICAgICAgIG1hcmdpbjogMCA0cHg7CiAgICAgIH0KCiAgICAgICNzZWxlY3Rpb25CYXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBoZWlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHZhcigtLXBhcGVyLXRhYnMtc2VsZWN0aW9uLWJhci1jb2xvciwgdmFyKC0tcGFwZXIteWVsbG93LWExMDApKTsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDApOwogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGNlbnRlcjsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBsZWZ0IGNlbnRlcjsKICAgICAgICAgIHRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtOwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFicy1zZWxlY3Rpb24tYmFyOwogICAgICB9CgogICAgICAjc2VsZWN0aW9uQmFyLmFsaWduLWJvdHRvbSB7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogYXV0bzsKICAgICAgfQoKICAgICAgI3NlbGVjdGlvbkJhci5leHBhbmQgewogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMTVzOwogICAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDEsIDEpOwogICAgICB9CgogICAgICAjc2VsZWN0aW9uQmFyLmNvbnRyYWN0IHsKICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjE4czsKICAgICAgICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuMCwgMC4wLCAwLjIsIDEpOwogICAgICB9CgogICAgICAjdGFic0NvbnRlbnQgPiA6OnNsb3R0ZWQoOm5vdCgjc2VsZWN0aW9uQmFyKSkgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0icGFwZXItdGFiczpjaGV2cm9uLWxlZnQiIGNsYXNzJD0iW1tfY29tcHV0ZVNjcm9sbEJ1dHRvbkNsYXNzKF9sZWZ0SGlkZGVuLCBzY3JvbGxhYmxlLCBoaWRlU2Nyb2xsQnV0dG9ucyldXSIgb24tdXA9Il9vblNjcm9sbEJ1dHRvblVwIiBvbi1kb3duPSJfb25MZWZ0U2Nyb2xsQnV0dG9uRG93biIgdGFiaW5kZXg9Ii0xIj48L3BhcGVyLWljb24tYnV0dG9uPgoKICAgIDxkaXYgaWQ9InRhYnNDb250YWluZXIiIG9uLXRyYWNrPSJfc2Nyb2xsIiBvbi1kb3duPSJfZG93biI+CiAgICAgIDxkaXYgaWQ9InRhYnNDb250ZW50IiBjbGFzcyQ9IltbX2NvbXB1dGVUYWJzQ29udGVudENsYXNzKHNjcm9sbGFibGUsIGZpdENvbnRhaW5lcildXSI+CiAgICAgICAgPGRpdiBpZD0ic2VsZWN0aW9uQmFyIiBjbGFzcyQ9IltbX2NvbXB1dGVTZWxlY3Rpb25CYXJDbGFzcyhub0JhciwgYWxpZ25Cb3R0b20pXV0iIG9uLXRyYW5zaXRpb25lbmQ9Il9vbkJhclRyYW5zaXRpb25FbmQiPjwvZGl2PgogICAgICAgIDxzbG90Pjwvc2xvdD4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0icGFwZXItdGFiczpjaGV2cm9uLXJpZ2h0IiBjbGFzcyQ9IltbX2NvbXB1dGVTY3JvbGxCdXR0b25DbGFzcyhfcmlnaHRIaWRkZW4sIHNjcm9sbGFibGUsIGhpZGVTY3JvbGxCdXR0b25zKV1dIiBvbi11cD0iX29uU2Nyb2xsQnV0dG9uVXAiIG9uLWRvd249Il9vblJpZ2h0U2Nyb2xsQnV0dG9uRG93biIgdGFiaW5kZXg9Ii0xIj48L3BhcGVyLWljb24tYnV0dG9uPgpgLGlzOiJwYXBlci10YWJzIixiZWhhdmlvcnM6W0NvLG1zXSxwcm9wZXJ0aWVzOntub2luazp7dHlwZTpCb29sZWFuLHZhbHVlOiExLG9ic2VydmVyOiJfbm9pbmtDaGFuZ2VkIn0sbm9CYXI6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sbm9TbGlkZTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxzY3JvbGxhYmxlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGZpdENvbnRhaW5lcjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxkaXNhYmxlRHJhZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxoaWRlU2Nyb2xsQnV0dG9uczp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhbGlnbkJvdHRvbTp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxzZWxlY3RhYmxlOnt0eXBlOlN0cmluZyx2YWx1ZToicGFwZXItdGFiIn0sYXV0b3NlbGVjdDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxhdXRvc2VsZWN0RGVsYXk6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LF9zdGVwOnt0eXBlOk51bWJlcix2YWx1ZToxMH0sX2hvbGREZWxheTp7dHlwZTpOdW1iZXIsdmFsdWU6MX0sX2xlZnRIaWRkZW46e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3JpZ2h0SGlkZGVuOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LF9wcmV2aW91c1RhYjp7dHlwZTpPYmplY3R9fSxob3N0QXR0cmlidXRlczp7cm9sZToidGFibGlzdCJ9LGxpc3RlbmVyczp7Imlyb24tcmVzaXplIjoiX29uVGFiU2l6aW5nQ2hhbmdlZCIsImlyb24taXRlbXMtY2hhbmdlZCI6Il9vblRhYlNpemluZ0NoYW5nZWQiLCJpcm9uLXNlbGVjdCI6Il9vbklyb25TZWxlY3QiLCJpcm9uLWRlc2VsZWN0IjoiX29uSXJvbkRlc2VsZWN0In0sa2V5QmluZGluZ3M6eyJsZWZ0OmtleXVwIHJpZ2h0OmtleXVwIjoiX29uQXJyb3dLZXl1cCJ9LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLl9ob2xkSm9iPW51bGwsdGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtPXZvaWQgMCx0aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQ9dm9pZCAwLHRoaXMuX2JpbmREZWxheWVkQWN0aXZhdGlvbkhhbmRsZXI9dGhpcy5fZGVsYXllZEFjdGl2YXRpb25IYW5kbGVyLmJpbmQodGhpcyksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJibHVyIix0aGlzLl9vbkJsdXJDYXB0dXJlLmJpbmQodGhpcyksITApfSxyZWFkeTpmdW5jdGlvbigpe3RoaXMuc2V0U2Nyb2xsRGlyZWN0aW9uKCJ5Iix0aGlzLiQudGFic0NvbnRhaW5lcil9LGRldGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fY2FuY2VsUGVuZGluZ0FjdGl2YXRpb24oKX0sX25vaW5rQ2hhbmdlZDpmdW5jdGlvbih0KXtlcih0aGlzKS5xdWVyeVNlbGVjdG9yQWxsKCJwYXBlci10YWIiKS5mb3JFYWNoKHQ/dGhpcy5fc2V0Tm9pbmtBdHRyaWJ1dGU6dGhpcy5fcmVtb3ZlTm9pbmtBdHRyaWJ1dGUpfSxfc2V0Tm9pbmtBdHRyaWJ1dGU6ZnVuY3Rpb24odCl7dC5zZXRBdHRyaWJ1dGUoIm5vaW5rIiwiIil9LF9yZW1vdmVOb2lua0F0dHJpYnV0ZTpmdW5jdGlvbih0KXt0LnJlbW92ZUF0dHJpYnV0ZSgibm9pbmsiKX0sX2NvbXB1dGVTY3JvbGxCdXR0b25DbGFzczpmdW5jdGlvbih0LGUsbil7cmV0dXJuIWV8fG4/ImhpZGRlbiI6dD8ibm90LXZpc2libGUiOiIifSxfY29tcHV0ZVRhYnNDb250ZW50Q2xhc3M6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD8ic2Nyb2xsYWJsZSIrKGU/IiBmaXQtY29udGFpbmVyIjoiIik6IiBmaXQtY29udGFpbmVyIn0sX2NvbXB1dGVTZWxlY3Rpb25CYXJDbGFzczpmdW5jdGlvbih0LGUpe3JldHVybiB0PyJoaWRkZW4iOmU/ImFsaWduLWJvdHRvbSI6IiJ9LF9vblRhYlNpemluZ0NoYW5nZWQ6ZnVuY3Rpb24oKXt0aGlzLmRlYm91bmNlKCJfb25UYWJTaXppbmdDaGFuZ2VkIiwoZnVuY3Rpb24oKXt0aGlzLl9zY3JvbGwoKSx0aGlzLl90YWJDaGFuZ2VkKHRoaXMuc2VsZWN0ZWRJdGVtKX0pLDEwKX0sX29uSXJvblNlbGVjdDpmdW5jdGlvbih0KXt0aGlzLl90YWJDaGFuZ2VkKHQuZGV0YWlsLml0ZW0sdGhpcy5fcHJldmlvdXNUYWIpLHRoaXMuX3ByZXZpb3VzVGFiPXQuZGV0YWlsLml0ZW0sdGhpcy5jYW5jZWxEZWJvdW5jZXIoInRhYi1jaGFuZ2VkIil9LF9vbklyb25EZXNlbGVjdDpmdW5jdGlvbih0KXt0aGlzLmRlYm91bmNlKCJ0YWItY2hhbmdlZCIsKGZ1bmN0aW9uKCl7dGhpcy5fdGFiQ2hhbmdlZChudWxsLHRoaXMuX3ByZXZpb3VzVGFiKSx0aGlzLl9wcmV2aW91c1RhYj1udWxsfSksMSl9LF9hY3RpdmF0ZUhhbmRsZXI6ZnVuY3Rpb24oKXt0aGlzLl9jYW5jZWxQZW5kaW5nQWN0aXZhdGlvbigpLGNzLl9hY3RpdmF0ZUhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxfc2NoZWR1bGVBY3RpdmF0aW9uOmZ1bmN0aW9uKHQsZSl7dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtPXQsdGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0PXRoaXMuYXN5bmModGhpcy5fYmluZERlbGF5ZWRBY3RpdmF0aW9uSGFuZGxlcixlKX0sX2RlbGF5ZWRBY3RpdmF0aW9uSGFuZGxlcjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbTt0aGlzLl9wZW5kaW5nQWN0aXZhdGlvbkl0ZW09dm9pZCAwLHRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uVGltZW91dD12b2lkIDAsdC5maXJlKHRoaXMuYWN0aXZhdGVFdmVudCxudWxsLHtidWJibGVzOiEwLGNhbmNlbGFibGU6ITB9KX0sX2NhbmNlbFBlbmRpbmdBY3RpdmF0aW9uOmZ1bmN0aW9uKCl7dm9pZCAwIT09dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0JiYodGhpcy5jYW5jZWxBc3luYyh0aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQpLHRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbT12b2lkIDAsdGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0PXZvaWQgMCl9LF9vbkFycm93S2V5dXA6ZnVuY3Rpb24odCl7dGhpcy5hdXRvc2VsZWN0JiZ0aGlzLl9zY2hlZHVsZUFjdGl2YXRpb24odGhpcy5mb2N1c2VkSXRlbSx0aGlzLmF1dG9zZWxlY3REZWxheSl9LF9vbkJsdXJDYXB0dXJlOmZ1bmN0aW9uKHQpe3QudGFyZ2V0PT09dGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtJiZ0aGlzLl9jYW5jZWxQZW5kaW5nQWN0aXZhdGlvbigpfSxnZXQgX3RhYkNvbnRhaW5lclNjcm9sbFNpemUoKXtyZXR1cm4gTWF0aC5tYXgoMCx0aGlzLiQudGFic0NvbnRhaW5lci5zY3JvbGxXaWR0aC10aGlzLiQudGFic0NvbnRhaW5lci5vZmZzZXRXaWR0aCl9LF9zY3JvbGw6ZnVuY3Rpb24odCxlKXt0aGlzLnNjcm9sbGFibGUmJnRoaXMuX2FmZmVjdFNjcm9sbChlJiYtZS5kZHh8fDApfSxfZG93bjpmdW5jdGlvbih0KXt0aGlzLmFzeW5jKChmdW5jdGlvbigpe3RoaXMuX2RlZmF1bHRGb2N1c0FzeW5jJiYodGhpcy5jYW5jZWxBc3luYyh0aGlzLl9kZWZhdWx0Rm9jdXNBc3luYyksdGhpcy5fZGVmYXVsdEZvY3VzQXN5bmM9bnVsbCl9KSwxKX0sX2FmZmVjdFNjcm9sbDpmdW5jdGlvbih0KXt0aGlzLiQudGFic0NvbnRhaW5lci5zY3JvbGxMZWZ0Kz10O3ZhciBlPXRoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQ7dGhpcy5fbGVmdEhpZGRlbj0wPT09ZSx0aGlzLl9yaWdodEhpZGRlbj1lPT09dGhpcy5fdGFiQ29udGFpbmVyU2Nyb2xsU2l6ZX0sX29uTGVmdFNjcm9sbEJ1dHRvbkRvd246ZnVuY3Rpb24oKXt0aGlzLl9zY3JvbGxUb0xlZnQoKSx0aGlzLl9ob2xkSm9iPXNldEludGVydmFsKHRoaXMuX3Njcm9sbFRvTGVmdC5iaW5kKHRoaXMpLHRoaXMuX2hvbGREZWxheSl9LF9vblJpZ2h0U2Nyb2xsQnV0dG9uRG93bjpmdW5jdGlvbigpe3RoaXMuX3Njcm9sbFRvUmlnaHQoKSx0aGlzLl9ob2xkSm9iPXNldEludGVydmFsKHRoaXMuX3Njcm9sbFRvUmlnaHQuYmluZCh0aGlzKSx0aGlzLl9ob2xkRGVsYXkpfSxfb25TY3JvbGxCdXR0b25VcDpmdW5jdGlvbigpe2NsZWFySW50ZXJ2YWwodGhpcy5faG9sZEpvYiksdGhpcy5faG9sZEpvYj1udWxsfSxfc2Nyb2xsVG9MZWZ0OmZ1bmN0aW9uKCl7dGhpcy5fYWZmZWN0U2Nyb2xsKC10aGlzLl9zdGVwKX0sX3Njcm9sbFRvUmlnaHQ6ZnVuY3Rpb24oKXt0aGlzLl9hZmZlY3RTY3JvbGwodGhpcy5fc3RlcCl9LF90YWJDaGFuZ2VkOmZ1bmN0aW9uKHQsZSl7aWYoIXQpcmV0dXJuIHRoaXMuJC5zZWxlY3Rpb25CYXIuY2xhc3NMaXN0LnJlbW92ZSgiZXhwYW5kIiksdGhpcy4kLnNlbGVjdGlvbkJhci5jbGFzc0xpc3QucmVtb3ZlKCJjb250cmFjdCIpLHZvaWQgdGhpcy5fcG9zaXRpb25CYXIoMCwwKTt2YXIgbj10aGlzLiQudGFic0NvbnRlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksaT1uLndpZHRoLHI9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxvPXIubGVmdC1uLmxlZnQ7aWYodGhpcy5fcG9zPXt3aWR0aDp0aGlzLl9jYWxjUGVyY2VudChyLndpZHRoLGkpLGxlZnQ6dGhpcy5fY2FsY1BlcmNlbnQobyxpKX0sdGhpcy5ub1NsaWRlfHxudWxsPT1lKXJldHVybiB0aGlzLiQuc2VsZWN0aW9uQmFyLmNsYXNzTGlzdC5yZW1vdmUoImV4cGFuZCIpLHRoaXMuJC5zZWxlY3Rpb25CYXIuY2xhc3NMaXN0LnJlbW92ZSgiY29udHJhY3QiKSx2b2lkIHRoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX3Bvcy53aWR0aCx0aGlzLl9wb3MubGVmdCk7dmFyIGE9ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxzPXRoaXMuaXRlbXMuaW5kZXhPZihlKSxsPXRoaXMuaXRlbXMuaW5kZXhPZih0KTt0aGlzLiQuc2VsZWN0aW9uQmFyLmNsYXNzTGlzdC5hZGQoImV4cGFuZCIpO3ZhciBjPXM8bDt0aGlzLl9pc1JUTCYmKGM9IWMpLGM/dGhpcy5fcG9zaXRpb25CYXIodGhpcy5fY2FsY1BlcmNlbnQoci5sZWZ0K3Iud2lkdGgtYS5sZWZ0LGkpLTUsdGhpcy5fbGVmdCk6dGhpcy5fcG9zaXRpb25CYXIodGhpcy5fY2FsY1BlcmNlbnQoYS5sZWZ0K2Eud2lkdGgtci5sZWZ0LGkpLTUsdGhpcy5fY2FsY1BlcmNlbnQobyxpKSs1KSx0aGlzLnNjcm9sbGFibGUmJnRoaXMuX3Njcm9sbFRvU2VsZWN0ZWRJZk5lZWRlZChyLndpZHRoLG8pfSxfc2Nyb2xsVG9TZWxlY3RlZElmTmVlZGVkOmZ1bmN0aW9uKHQsZSl7dmFyIG49ZS10aGlzLiQudGFic0NvbnRhaW5lci5zY3JvbGxMZWZ0OyhuPDB8fChuKz10LXRoaXMuJC50YWJzQ29udGFpbmVyLm9mZnNldFdpZHRoKT4wKSYmKHRoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQrPW4pfSxfY2FsY1BlcmNlbnQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gMTAwKnQvZX0sX3Bvc2l0aW9uQmFyOmZ1bmN0aW9uKHQsZSl7ZT1lfHwwLHRoaXMuX3dpZHRoPXQ9dHx8MCx0aGlzLl9sZWZ0PWUsdGhpcy50cmFuc2Zvcm0oInRyYW5zbGF0ZVgoIitlKyIlKSBzY2FsZVgoIit0LzEwMCsiKSIsdGhpcy4kLnNlbGVjdGlvbkJhcil9LF9vbkJhclRyYW5zaXRpb25FbmQ6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy4kLnNlbGVjdGlvbkJhci5jbGFzc0xpc3Q7ZS5jb250YWlucygiZXhwYW5kIik/KGUucmVtb3ZlKCJleHBhbmQiKSxlLmFkZCgiY29udHJhY3QiKSx0aGlzLl9wb3NpdGlvbkJhcih0aGlzLl9wb3Mud2lkdGgsdGhpcy5fcG9zLmxlZnQpKTplLmNvbnRhaW5zKCJjb250cmFjdCIpJiZlLnJlbW92ZSgiY29udHJhY3QiKX19KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCnZhciB3cz1udWxsO2pyKHtfdGVtcGxhdGU6eGVgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9hc3QtYmFja2dyb3VuZC1jb2xvciwgIzMyMzIzMik7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvYXN0LWNvbG9yLCAjZjFmMWYxKTsKICAgICAgICBtaW4taGVpZ2h0OiA0OHB4OwogICAgICAgIG1pbi13aWR0aDogMjg4cHg7CiAgICAgICAgcGFkZGluZzogMTZweCAyNHB4OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgYm94LXNoYWRvdzogMCAycHggNXB4IDAgcmdiYSgwLCAwLCAwLCAwLjI2KTsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgbWFyZ2luOiAxMnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAwLjNzLCBvcGFjaXR5IDAuM3M7CiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuM3MsIG9wYWNpdHkgMC4zczsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDEwMHB4KTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTAwcHgpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgIH0KCiAgICAgIDpob3N0KC5jYXBzdWxlKSB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMjRweDsKICAgICAgfQoKICAgICAgOmhvc3QoLmZpdC1ib3R0b20pIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgIH0KCiAgICAgIDpob3N0KC5wYXBlci10b2FzdC1vcGVuKSB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgwcHgpOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwcHgpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzcGFuIGlkPSJsYWJlbCI+e3t0ZXh0fX08L3NwYW4+CiAgICA8c2xvdD48L3Nsb3Q+CmAsaXM6InBhcGVyLXRvYXN0IixiZWhhdmlvcnM6W1dhXSxwcm9wZXJ0aWVzOntmaXRJbnRvOnt0eXBlOk9iamVjdCx2YWx1ZTp3aW5kb3csb2JzZXJ2ZXI6Il9vbkZpdEludG9DaGFuZ2VkIn0saG9yaXpvbnRhbEFsaWduOnt0eXBlOlN0cmluZyx2YWx1ZToibGVmdCJ9LHZlcnRpY2FsQWxpZ246e3R5cGU6U3RyaW5nLHZhbHVlOiJib3R0b20ifSxkdXJhdGlvbjp7dHlwZTpOdW1iZXIsdmFsdWU6M2UzfSx0ZXh0Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sbm9DYW5jZWxPbk91dHNpZGVDbGljazp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfSxub0F1dG9Gb2N1czp7dHlwZTpCb29sZWFuLHZhbHVlOiEwfX0sbGlzdGVuZXJzOnt0cmFuc2l0aW9uZW5kOiJfX29uVHJhbnNpdGlvbkVuZCJ9LGdldCB2aXNpYmxlKCl7cmV0dXJuIEVvLl93YXJuKCJgdmlzaWJsZWAgaXMgZGVwcmVjYXRlZCwgdXNlIGBvcGVuZWRgIGluc3RlYWQiKSx0aGlzLm9wZW5lZH0sZ2V0IF9jYW5BdXRvQ2xvc2UoKXtyZXR1cm4gdGhpcy5kdXJhdGlvbj4wJiZ0aGlzLmR1cmF0aW9uIT09MS8wfSxjcmVhdGVkOmZ1bmN0aW9uKCl7dGhpcy5fYXV0b0Nsb3NlPW51bGwsWWEucmVxdWVzdEF2YWlsYWJpbGl0eSgpfSxzaG93OmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiJzdHJpbmciPT10eXBlb2YgdCYmKHQ9e3RleHQ6dH0pLHQpMD09PWUuaW5kZXhPZigiXyIpP0VvLl93YXJuKCdUaGUgcHJvcGVydHkgIicrZSsnIiBpcyBwcml2YXRlIGFuZCB3YXMgbm90IHNldC4nKTplIGluIHRoaXM/dGhpc1tlXT10W2VdOkVvLl93YXJuKCdUaGUgcHJvcGVydHkgIicrZSsnIiBpcyBub3QgdmFsaWQuJyk7dGhpcy5vcGVuKCl9LGhpZGU6ZnVuY3Rpb24oKXt0aGlzLmNsb3NlKCl9LF9fb25UcmFuc2l0aW9uRW5kOmZ1bmN0aW9uKHQpe3QmJnQudGFyZ2V0PT09dGhpcyYmIm9wYWNpdHkiPT09dC5wcm9wZXJ0eU5hbWUmJih0aGlzLm9wZW5lZD90aGlzLl9maW5pc2hSZW5kZXJPcGVuZWQoKTp0aGlzLl9maW5pc2hSZW5kZXJDbG9zZWQoKSl9LF9vcGVuZWRDaGFuZ2VkOmZ1bmN0aW9uKCl7bnVsbCE9PXRoaXMuX2F1dG9DbG9zZSYmKHRoaXMuY2FuY2VsQXN5bmModGhpcy5fYXV0b0Nsb3NlKSx0aGlzLl9hdXRvQ2xvc2U9bnVsbCksdGhpcy5vcGVuZWQ/KHdzJiZ3cyE9PXRoaXMmJndzLmNsb3NlKCksd3M9dGhpcyx0aGlzLmZpcmUoImlyb24tYW5ub3VuY2UiLHt0ZXh0OnRoaXMudGV4dH0pLHRoaXMuX2NhbkF1dG9DbG9zZSYmKHRoaXMuX2F1dG9DbG9zZT10aGlzLmFzeW5jKHRoaXMuY2xvc2UsdGhpcy5kdXJhdGlvbikpKTp3cz09PXRoaXMmJih3cz1udWxsKSxqYS5fb3BlbmVkQ2hhbmdlZC5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LF9yZW5kZXJPcGVuZWQ6ZnVuY3Rpb24oKXt0aGlzLmNsYXNzTGlzdC5hZGQoInBhcGVyLXRvYXN0LW9wZW4iKX0sX3JlbmRlckNsb3NlZDpmdW5jdGlvbigpe3RoaXMuY2xhc3NMaXN0LnJlbW92ZSgicGFwZXItdG9hc3Qtb3BlbiIpfSxfb25GaXRJbnRvQ2hhbmdlZDpmdW5jdGlvbih0KXt0aGlzLnBvc2l0aW9uVGFyZ2V0PXR9fSk7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmNvbnN0IFNzPXhlYAoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgb3V0bGluZTpub25lOwogICAgICB9CgogICAgICAudG9nZ2xlLWJhciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBib3JkZXItcmFkaXVzOiA4cHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgb3BhY2l0eTogMC40OwogICAgICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgbGluZWFyIC4wOHM7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi11bmNoZWNrZWQtYmFyLWNvbG9yLCAjMDAwMDAwKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi11bmNoZWNrZWQtYmFyOwogICAgICB9CgogICAgICAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogLTNweDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIGhlaWdodDogMjBweDsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgYm94LXNoYWRvdzogMCAxcHggNXB4IDAgcmdiYSgwLCAwLCAwLCAwLjYpOwogICAgICAgIHRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIGxpbmVhciAuMDhzLCBiYWNrZ3JvdW5kLWNvbG9yIGxpbmVhciAuMDhzOwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSBsaW5lYXIgLjA4cywgYmFja2dyb3VuZC1jb2xvciBsaW5lYXIgLjA4czsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWJ1dHRvbi1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS01MCkpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10b2dnbGUtYnV0dG9uLXVuY2hlY2tlZC1idXR0b247CiAgICAgIH0KCiAgICAgIC50b2dnbGUtYnV0dG9uLmRyYWdnaW5nIHsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IG5vbmU7CiAgICAgICAgdHJhbnNpdGlvbjogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdOm5vdChbZGlzYWJsZWRdKSkgLnRvZ2dsZS1iYXIgewogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYmFyLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvZ2dsZS1idXR0b24tY2hlY2tlZC1iYXI7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIC50b2dnbGUtYmFyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDAwOwogICAgICAgIG9wYWNpdHk6IDAuMTI7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjaGVja2VkXSkgLnRvZ2dsZS1idXR0b24gewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGUoMTZweCwgMCk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGUoMTZweCwgMCk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjaGVja2VkXTpub3QoW2Rpc2FibGVkXSkpIC50b2dnbGUtYnV0dG9uIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYnV0dG9uLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvZ2dsZS1idXR0b24tY2hlY2tlZC1idXR0b247CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIC50b2dnbGUtYnV0dG9uIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYmRiZGJkOwogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtaW5rIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAtMTRweDsKICAgICAgICBsZWZ0OiAtMTRweDsKICAgICAgICByaWdodDogYXV0bzsKICAgICAgICBib3R0b206IGF1dG87CiAgICAgICAgd2lkdGg6IDQ4cHg7CiAgICAgICAgaGVpZ2h0OiA0OHB4OwogICAgICAgIG9wYWNpdHk6IDAuNTsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi11bmNoZWNrZWQtaW5rLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi11bmNoZWNrZWQtaW5rOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pIC50b2dnbGUtaW5rIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWluay1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtaW5rOwogICAgICB9CgogICAgICAudG9nZ2xlLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMzZweDsKICAgICAgICBoZWlnaHQ6IDE0cHg7CiAgICAgICAgLyogVGhlIHRvZ2dsZSBidXR0b24gaGFzIGFuIGFic29sdXRlIHBvc2l0aW9uIG9mIC0zcHg7IFRoZSBleHRyYSAxcHgKICAgICAgICAvKiBhY2NvdW50cyBmb3IgdGhlIHRvZ2dsZSBidXR0b24gc2hhZG93IGJveC4gKi8KICAgICAgICBtYXJnaW46IDRweCAxcHg7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtbGFiZWwgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgICBwYWRkaW5nLWxlZnQ6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tbGFiZWwtc3BhY2luZywgOHB4KTsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1sYWJlbC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIC8qIGludmFsaWQgc3RhdGUgKi8KICAgICAgOmhvc3QoW2ludmFsaWRdKSAudG9nZ2xlLWJhciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1pbnZhbGlkLWJhci1jb2xvciwgdmFyKC0tZXJyb3ItY29sb3IpKTsKICAgICAgfQoKICAgICAgOmhvc3QoW2ludmFsaWRdKSAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1pbnZhbGlkLWJ1dHRvbi1jb2xvciwgdmFyKC0tZXJyb3ItY29sb3IpKTsKICAgICAgfQoKICAgICAgOmhvc3QoW2ludmFsaWRdKSAudG9nZ2xlLWluayB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24taW52YWxpZC1pbmstY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBjbGFzcz0idG9nZ2xlLWNvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9InRvZ2dsZUJhciIgY2xhc3M9InRvZ2dsZS1iYXIiPjwvZGl2PgogICAgICA8ZGl2IGlkPSJ0b2dnbGVCdXR0b24iIGNsYXNzPSJ0b2dnbGUtYnV0dG9uIj48L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1sYWJlbCI+PHNsb3Q+PC9zbG90PjwvZGl2PgoKICBgO1NzLnNldEF0dHJpYnV0ZSgic3RyaXAtd2hpdGVzcGFjZSIsIiIpLGpyKHtfdGVtcGxhdGU6U3MsaXM6InBhcGVyLXRvZ2dsZS1idXR0b24iLGJlaGF2aW9yczpbd2FdLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJidXR0b24iLCJhcmlhLXByZXNzZWQiOiJmYWxzZSIsdGFiaW5kZXg6MH0scHJvcGVydGllczp7fSxsaXN0ZW5lcnM6e3RyYWNrOiJfb250cmFjayJ9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7RGkodGhpcywoZnVuY3Rpb24oKXtkaSh0aGlzLCJwYW4teSIpfSkpfSxfb250cmFjazpmdW5jdGlvbih0KXt2YXIgZT10LmRldGFpbDsic3RhcnQiPT09ZS5zdGF0ZT90aGlzLl90cmFja1N0YXJ0KGUpOiJ0cmFjayI9PT1lLnN0YXRlP3RoaXMuX3RyYWNrTW92ZShlKToiZW5kIj09PWUuc3RhdGUmJnRoaXMuX3RyYWNrRW5kKGUpfSxfdHJhY2tTdGFydDpmdW5jdGlvbih0KXt0aGlzLl93aWR0aD10aGlzLiQudG9nZ2xlQmFyLm9mZnNldFdpZHRoLzIsdGhpcy5fdHJhY2tDaGVja2VkPXRoaXMuY2hlY2tlZCx0aGlzLiQudG9nZ2xlQnV0dG9uLmNsYXNzTGlzdC5hZGQoImRyYWdnaW5nIil9LF90cmFja01vdmU6ZnVuY3Rpb24odCl7dmFyIGU9dC5keDt0aGlzLl94PU1hdGgubWluKHRoaXMuX3dpZHRoLE1hdGgubWF4KDAsdGhpcy5fdHJhY2tDaGVja2VkP3RoaXMuX3dpZHRoK2U6ZSkpLHRoaXMudHJhbnNsYXRlM2QodGhpcy5feCsicHgiLDAsMCx0aGlzLiQudG9nZ2xlQnV0dG9uKSx0aGlzLl91c2VyQWN0aXZhdGUodGhpcy5feD50aGlzLl93aWR0aC8yKX0sX3RyYWNrRW5kOmZ1bmN0aW9uKHQpe3RoaXMuJC50b2dnbGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgiZHJhZ2dpbmciKSx0aGlzLnRyYW5zZm9ybSgiIix0aGlzLiQudG9nZ2xlQnV0dG9uKX0sX2NyZWF0ZVJpcHBsZTpmdW5jdGlvbigpe3RoaXMuX3JpcHBsZUNvbnRhaW5lcj10aGlzLiQudG9nZ2xlQnV0dG9uO3ZhciB0PXVhLl9jcmVhdGVSaXBwbGUoKTtyZXR1cm4gdC5pZD0iaW5rIix0LnNldEF0dHJpYnV0ZSgicmVjZW50ZXJzIiwiIiksdC5jbGFzc0xpc3QuYWRkKCJjaXJjbGUiLCJ0b2dnbGUtaW5rIiksdH19KSwKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCmpyKHtfdGVtcGxhdGU6eGVgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICAtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1oZWlnaHQ6IHZhcigtLXBhcGVyLXRvb2xiYXItaGVpZ2h0LCA2NHB4KTsKICAgICAgICAtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1zbS1oZWlnaHQ6IHZhcigtLXBhcGVyLXRvb2xiYXItc20taGVpZ2h0LCA1NnB4KTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItaGVpZ2h0KTsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci10b29sYmFyLWJhY2tncm91bmQsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdG9vbGJhci1jb2xvciwgdmFyKC0tZGFyay10aGVtZS10ZXh0LWNvbG9yKSk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhcjsKICAgICAgfQoKICAgICAgOmhvc3QoLmFuaW1hdGUpIHsKICAgICAgICB0cmFuc2l0aW9uOiB2YXIoLS1wYXBlci10b29sYmFyLXRyYW5zaXRpb24sIGhlaWdodCAwLjE4cyBlYXNlLWluKTsKICAgICAgfQoKICAgICAgOmhvc3QoLm1lZGl1bS10YWxsKSB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1oZWlnaHQpICogMik7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci1tZWRpdW07CiAgICAgIH0KCiAgICAgIDpob3N0KC50YWxsKSB7CiAgICAgICAgaGVpZ2h0OiBjYWxjKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1oZWlnaHQpICogMyk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci10YWxsOwogICAgICB9CgogICAgICAudG9vbGJhci10b29scyB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLWhlaWdodCk7CiAgICAgICAgcGFkZGluZzogMCAxNnB4OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci1jb250ZW50OwogICAgICB9CgogICAgICAvKgogICAgICAgKiBUT0RPOiBXaGVyZSBzaG91bGQgbWVkaWEgcXVlcnkgYnJlYWtwb2ludHMgbGl2ZSBzbyB0aGV5IGNhbiBiZSBzaGFyZWQgYmV0d2VlbiBlbGVtZW50cz8KICAgICAgICovCgogICAgICBAbWVkaWEgKG1heC13aWR0aDogNjAwcHgpIHsKICAgICAgICA6aG9zdCB7CiAgICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1zbS1oZWlnaHQpOwogICAgICAgIH0KCiAgICAgICAgOmhvc3QoLm1lZGl1bS10YWxsKSB7CiAgICAgICAgICBoZWlnaHQ6IGNhbGModmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLXNtLWhlaWdodCkgKiAyKTsKICAgICAgICB9CgogICAgICAgIDpob3N0KC50YWxsKSB7CiAgICAgICAgICBoZWlnaHQ6IGNhbGModmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLXNtLWhlaWdodCkgKiAzKTsKICAgICAgICB9CgogICAgICAgIC50b29sYmFyLXRvb2xzIHsKICAgICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLXNtLWhlaWdodCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAjdG9wQmFyIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC8qIG1pZGRsZSBiYXIgKi8KICAgICAgI21pZGRsZUJhciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CgogICAgICA6aG9zdCgudGFsbCkgI21pZGRsZUJhciwKICAgICAgOmhvc3QoLm1lZGl1bS10YWxsKSAjbWlkZGxlQmFyIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgxMDAlKTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTAwJSk7CiAgICAgIH0KCiAgICAgIC8qIGJvdHRvbSBiYXIgKi8KICAgICAgI2JvdHRvbUJhciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CgogICAgICAvKgogICAgICAgKiBtYWtlIGVsZW1lbnRzIChlLmcuIGJ1dHRvbnMpIHJlc3BvbmQgdG8gbW91c2UvdG91Y2ggZXZlbnRzCiAgICAgICAqCiAgICAgICAqIFxgLnRvb2xiYXItdG9vbHNcYCBkaXNhYmxlcyB0b3VjaCBldmVudHMgc28gbXVsdGlwbGUgdG9vbGJhcnMgY2FuIHN0YWNrIGFuZCBub3QKICAgICAgICogYWJzb3JiIGV2ZW50cy4gQWxsIGNoaWxkcmVuIG11c3QgaGF2ZSBwb2ludGVyIGV2ZW50cyByZS1lbmFibGVkIHRvIHdvcmsgYXMKICAgICAgICogZXhwZWN0ZWQuCiAgICAgICAqLwogICAgICAudG9vbGJhci10b29scyA+IDo6c2xvdHRlZCgqOm5vdChbZGlzYWJsZWRdKSkgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICB9CgogICAgICAudG9vbGJhci10b29scyA+IDo6c2xvdHRlZCgudGl0bGUpIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICBmb250LXNpemU6IDIwcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsaW5lLWhlaWdodDogMTsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleDsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLnRpdGxlKSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDU2cHg7CiAgICAgIH0KCiAgICAgIC50b29sYmFyLXRvb2xzID4gOjpzbG90dGVkKHBhcGVyLWljb24tYnV0dG9uICsgLnRpdGxlKSB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBUaGUgLS1wYXBlci10b29sYmFyLXRpdGxlIG1peGluIGlzIGFwcGxpZWQgaGVyZSBpbnN0ZWFkIG9mIGFib3ZlIHRvCiAgICAgICAqIGZpeCB0aGUgaXNzdWUgd2l0aCBtYXJnaW4tbGVmdCBiZWluZyBpZ25vcmVkIGR1ZSB0byBjc3Mgb3JkZXJpbmcuCiAgICAgICAqLwogICAgICAudG9vbGJhci10b29scyA+IDo6c2xvdHRlZCgudGl0bGUpIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sYmFyLXRpdGxlOwogICAgICB9CgogICAgICAudG9vbGJhci10b29scyA+IDo6c2xvdHRlZChwYXBlci1pY29uLWJ1dHRvbltpY29uPW1lbnVdKSB7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAyNHB4OwogICAgICB9CgogICAgICAudG9vbGJhci10b29scyA+IDo6c2xvdHRlZCguZml0KSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogYXV0bzsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB3aWR0aDogYXV0bzsKICAgICAgICBtYXJnaW46IDA7CiAgICAgIH0KCiAgICAgIC8qIFRPRE8obm9tcyk6IFVudGlsIHdlIGhhdmUgYSBiZXR0ZXIgc29sdXRpb24gZm9yIGNsYXNzZXMgdGhhdCBkb24ndCB1c2UKICAgICAgICogL2RlZXAvIGNyZWF0ZSBvdXIgb3duLgogICAgICAgKi8KICAgICAgLnN0YXJ0LWp1c3RpZmllZCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXN0YXJ0LWp1c3RpZmllZDsKICAgICAgfQoKICAgICAgLmNlbnRlci1qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXItanVzdGlmaWVkOwogICAgICB9CgogICAgICAuZW5kLWp1c3RpZmllZCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWVuZC1qdXN0aWZpZWQ7CiAgICAgIH0KCiAgICAgIC5hcm91bmQtanVzdGlmaWVkIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtYXJvdW5kLWp1c3RpZmllZDsKICAgICAgfQoKICAgICAgLmp1c3RpZmllZCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWp1c3RpZmllZDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJ0b3BCYXIiIGNsYXNzXCQ9InRvb2xiYXItdG9vbHMgW1tfY29tcHV0ZUJhckV4dHJhQ2xhc3NlcyhqdXN0aWZ5KV1dIj4KICAgICAgPHNsb3QgbmFtZT0idG9wIj48L3Nsb3Q+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJtaWRkbGVCYXIiIGNsYXNzXCQ9InRvb2xiYXItdG9vbHMgW1tfY29tcHV0ZUJhckV4dHJhQ2xhc3NlcyhtaWRkbGVKdXN0aWZ5KV1dIj4KICAgICAgPHNsb3QgbmFtZT0ibWlkZGxlIj48L3Nsb3Q+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJib3R0b21CYXIiIGNsYXNzXCQ9InRvb2xiYXItdG9vbHMgW1tfY29tcHV0ZUJhckV4dHJhQ2xhc3Nlcyhib3R0b21KdXN0aWZ5KV1dIj4KICAgICAgPHNsb3QgbmFtZT0iYm90dG9tIj48L3Nsb3Q+CiAgICA8L2Rpdj4KYCxpczoicGFwZXItdG9vbGJhciIsaG9zdEF0dHJpYnV0ZXM6e3JvbGU6InRvb2xiYXIifSxwcm9wZXJ0aWVzOntib3R0b21KdXN0aWZ5Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sanVzdGlmeTp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LG1pZGRsZUp1c3RpZnk6e3R5cGU6U3RyaW5nLHZhbHVlOiIifX0scmVhZHk6ZnVuY3Rpb24oKXtjb25zb2xlLndhcm4odGhpcy5pcywiaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBhcHAtbGF5b3V0IGluc3RlYWQhIil9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fb2JzZXJ2ZXI9dGhpcy5fb2JzZXJ2ZSh0aGlzKSx0aGlzLl91cGRhdGVBcmlhTGFiZWxsZWRCeSgpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX29ic2VydmVyJiZ0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KCl9LF9vYnNlcnZlOmZ1bmN0aW9uKHQpe3ZhciBlPW5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlQXJpYUxhYmVsbGVkQnkoKX0uYmluZCh0aGlzKSk7cmV0dXJuIGUub2JzZXJ2ZSh0LHtjaGlsZExpc3Q6ITAsc3VidHJlZTohMH0pLGV9LF91cGRhdGVBcmlhTGFiZWxsZWRCeTpmdW5jdGlvbigpe1dpKCk7Zm9yKHZhciB0LGU9W10sbj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChlcih0aGlzLnJvb3QpLnF1ZXJ5U2VsZWN0b3JBbGwoInNsb3QiKSkuY29uY2F0KEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGVyKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvckFsbCgiY29udGVudCIpKSksaT0wO3Q9bltpXTtpKyspZm9yKHZhciByLG89ZXIodCkuZ2V0RGlzdHJpYnV0ZWROb2RlcygpLGE9MDtyPW9bYV07YSsrKWlmKHIuY2xhc3NMaXN0JiZyLmNsYXNzTGlzdC5jb250YWlucygidGl0bGUiKSlpZihyLmlkKWUucHVzaChyLmlkKTtlbHNle3ZhciBzPSJwYXBlci10b29sYmFyLWxhYmVsLSIrTWF0aC5mbG9vcigxZTQqTWF0aC5yYW5kb20oKSk7ci5pZD1zLGUucHVzaChzKX1lLmxlbmd0aD4wJiZ0aGlzLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbGxlZGJ5IixlLmpvaW4oIiAiKSl9LF9jb21wdXRlQmFyRXh0cmFDbGFzc2VzOmZ1bmN0aW9uKHQpe3JldHVybiB0P3QrKCJqdXN0aWZpZWQiPT09dD8iIjoiLWp1c3RpZmllZCIpOiIifX0pLAovKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KanIoe190ZW1wbGF0ZTp4ZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIHotaW5kZXg6IDEwMDI7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgIH0KCiAgICAgICN0b29sdGlwIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvb2x0aXAtYmFja2dyb3VuZCwgIzYxNjE2MSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvb2x0aXAtdGV4dC1jb2xvciwgd2hpdGUpOwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcDsKICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBrZXlGcmFtZVNjYWxlVXAgewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC4wKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMCk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGtleUZyYW1lU2NhbGVEb3duIHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMCk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjApOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBrZXlGcmFtZUZhZGVJbk9wYWNpdHkgewogICAgICAgIDAlIHsKICAgICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgb3BhY2l0eTogdmFyKC0tcGFwZXItdG9vbHRpcC1vcGFjaXR5LCAwLjkpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBrZXlGcmFtZUZhZGVPdXRPcGFjaXR5IHsKICAgICAgICAwJSB7CiAgICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMga2V5RnJhbWVTbGlkZURvd25JbiB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yMDAwcHgpOwogICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB9CiAgICAgICAgMTAlIHsKICAgICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGtleUZyYW1lU2xpZGVEb3duT3V0IHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgfQogICAgICAgIDEwJSB7CiAgICAgICAgICBvcGFjaXR5OiAwLjI7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yMDAwcHgpOwogICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC5mYWRlLWluLWFuaW1hdGlvbiB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXRvb2x0aXAtZGVsYXktaW4sIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tbmFtZToga2V5RnJhbWVGYWRlSW5PcGFjaXR5OwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDE7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXRvb2x0aXAtZHVyYXRpb24taW4sIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwLWFuaW1hdGlvbjsKICAgICAgfQoKICAgICAgLmZhZGUtb3V0LWFuaW1hdGlvbiB7CiAgICAgICAgb3BhY2l0eTogdmFyKC0tcGFwZXItdG9vbHRpcC1vcGFjaXR5LCAwLjkpOwogICAgICAgIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tcGFwZXItdG9vbHRpcC1kZWxheS1vdXQsIDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGtleUZyYW1lRmFkZU91dE9wYWNpdHk7CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogMTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItdG9vbHRpcC1kdXJhdGlvbi1vdXQsIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwLWFuaW1hdGlvbjsKICAgICAgfQoKICAgICAgLnNjYWxlLXVwLWFuaW1hdGlvbiB7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwKTsKICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LWluLCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGtleUZyYW1lU2NhbGVVcDsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci10b29sdGlwLWR1cmF0aW9uLWluLCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcC1hbmltYXRpb247CiAgICAgIH0KCiAgICAgIC5zY2FsZS1kb3duLWFuaW1hdGlvbiB7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBrZXlGcmFtZVNjYWxlRG93bjsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci10b29sdGlwLWR1cmF0aW9uLW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXAtYW5pbWF0aW9uOwogICAgICB9CgogICAgICAuc2xpZGUtZG93bi1hbmltYXRpb24gewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMjAwMHB4KTsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tcGFwZXItdG9vbHRpcC1kZWxheS1vdXQsIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tbmFtZToga2V5RnJhbWVTbGlkZURvd25JbjsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjAsIDAuMCwgMC4yLCAxKTsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXRvb2x0aXAtZHVyYXRpb24tb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcC1hbmltYXRpb247CiAgICAgIH0KCiAgICAgIC5zbGlkZS1kb3duLWFuaW1hdGlvbi1vdXQgewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBrZXlGcmFtZVNsaWRlRG93bk91dDsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMSwgMSk7CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci10b29sdGlwLWR1cmF0aW9uLW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXAtYW5pbWF0aW9uOwogICAgICB9CgogICAgICAuY2FuY2VsLWFuaW1hdGlvbiB7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAtMzBzICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qIFRoYW5rcyBJRSAxMC4gKi8KCiAgICAgIC5oaWRkZW4gewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJ0b29sdGlwIiBjbGFzcz0iaGlkZGVuIj4KICAgICAgPHNsb3Q+PC9zbG90PgogICAgPC9kaXY+CmAsaXM6InBhcGVyLXRvb2x0aXAiLGhvc3RBdHRyaWJ1dGVzOntyb2xlOiJ0b29sdGlwIix0YWJpbmRleDotMX0scHJvcGVydGllczp7Zm9yOnt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX2ZpbmRUYXJnZXQifSxtYW51YWxNb2RlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsb2JzZXJ2ZXI6Il9tYW51YWxNb2RlQ2hhbmdlZCJ9LHBvc2l0aW9uOnt0eXBlOlN0cmluZyx2YWx1ZToiYm90dG9tIn0sZml0VG9WaXNpYmxlQm91bmRzOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LG9mZnNldDp7dHlwZTpOdW1iZXIsdmFsdWU6MTR9LG1hcmdpblRvcDp7dHlwZTpOdW1iZXIsdmFsdWU6MTR9LGFuaW1hdGlvbkRlbGF5Ont0eXBlOk51bWJlcix2YWx1ZTo1MDAsb2JzZXJ2ZXI6Il9kZWxheUNoYW5nZSJ9LGFuaW1hdGlvbkVudHJ5Ont0eXBlOlN0cmluZyx2YWx1ZToiIn0sYW5pbWF0aW9uRXhpdDp7dHlwZTpTdHJpbmcsdmFsdWU6IiJ9LGFuaW1hdGlvbkNvbmZpZzp7dHlwZTpPYmplY3QsdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm57ZW50cnk6W3tuYW1lOiJmYWRlLWluLWFuaW1hdGlvbiIsbm9kZTp0aGlzLHRpbWluZzp7ZGVsYXk6MH19XSxleGl0Olt7bmFtZToiZmFkZS1vdXQtYW5pbWF0aW9uIixub2RlOnRoaXN9XX19fSxfc2hvd2luZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExfX0sbGlzdGVuZXJzOnt3ZWJraXRBbmltYXRpb25FbmQ6Il9vbkFuaW1hdGlvbkVuZCJ9LGdldCB0YXJnZXQoKXt2YXIgdD1lcih0aGlzKS5wYXJlbnROb2RlLGU9ZXIodGhpcykuZ2V0T3duZXJSb290KCk7cmV0dXJuIHRoaXMuZm9yP2VyKGUpLnF1ZXJ5U2VsZWN0b3IoIiMiK3RoaXMuZm9yKTp0Lm5vZGVUeXBlPT1Ob2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREU/ZS5ob3N0OnR9LGF0dGFjaGVkOmZ1bmN0aW9uKCl7dGhpcy5fZmluZFRhcmdldCgpfSxkZXRhY2hlZDpmdW5jdGlvbigpe3RoaXMubWFudWFsTW9kZXx8dGhpcy5fcmVtb3ZlTGlzdGVuZXJzKCl9LHBsYXlBbmltYXRpb246ZnVuY3Rpb24odCl7ImVudHJ5Ij09PXQ/dGhpcy5zaG93KCk6ImV4aXQiPT09dCYmdGhpcy5oaWRlKCl9LGNhbmNlbEFuaW1hdGlvbjpmdW5jdGlvbigpe3RoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5hZGQoImNhbmNlbC1hbmltYXRpb24iKX0sc2hvdzpmdW5jdGlvbigpe2lmKCF0aGlzLl9zaG93aW5nKXtpZigiIj09PWVyKHRoaXMpLnRleHRDb250ZW50LnRyaW0oKSl7Zm9yKHZhciB0PSEwLGU9ZXIodGhpcykuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpLG49MDtuPGUubGVuZ3RoO24rKylpZigiIiE9PWVbbl0udGV4dENvbnRlbnQudHJpbSgpKXt0PSExO2JyZWFrfWlmKHQpcmV0dXJufXRoaXMuX3Nob3dpbmc9ITAsdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSgiaGlkZGVuIiksdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSgiY2FuY2VsLWFuaW1hdGlvbiIpLHRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgiZXhpdCIpKSx0aGlzLnVwZGF0ZVBvc2l0aW9uKCksdGhpcy5fYW5pbWF0aW9uUGxheWluZz0hMCx0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QuYWRkKHRoaXMuX2dldEFuaW1hdGlvblR5cGUoImVudHJ5IikpfX0saGlkZTpmdW5jdGlvbigpe2lmKHRoaXMuX3Nob3dpbmcpe2lmKHRoaXMuX2FuaW1hdGlvblBsYXlpbmcpcmV0dXJuIHRoaXMuX3Nob3dpbmc9ITEsdm9pZCB0aGlzLl9jYW5jZWxBbmltYXRpb24oKTt0aGlzLl9vbkFuaW1hdGlvbkZpbmlzaCgpLHRoaXMuX3Nob3dpbmc9ITEsdGhpcy5fYW5pbWF0aW9uUGxheWluZz0hMH19LHVwZGF0ZVBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpcy5fdGFyZ2V0JiZ0aGlzLm9mZnNldFBhcmVudCl7dmFyIHQ9dGhpcy5vZmZzZXQ7MTQhPXRoaXMubWFyZ2luVG9wJiYxND09dGhpcy5vZmZzZXQmJih0PXRoaXMubWFyZ2luVG9wKTt2YXIgZSxuLGk9dGhpcy5vZmZzZXRQYXJlbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkscj10aGlzLl90YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksbz10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGE9KHIud2lkdGgtby53aWR0aCkvMixzPShyLmhlaWdodC1vLmhlaWdodCkvMixsPXIubGVmdC1pLmxlZnQsYz1yLnRvcC1pLnRvcDtzd2l0Y2godGhpcy5wb3NpdGlvbil7Y2FzZSJ0b3AiOmU9bCthLG49Yy1vLmhlaWdodC10O2JyZWFrO2Nhc2UiYm90dG9tIjplPWwrYSxuPWMrci5oZWlnaHQrdDticmVhaztjYXNlImxlZnQiOmU9bC1vLndpZHRoLXQsbj1jK3M7YnJlYWs7Y2FzZSJyaWdodCI6ZT1sK3Iud2lkdGgrdCxuPWMrc310aGlzLmZpdFRvVmlzaWJsZUJvdW5kcz8oaS5sZWZ0K2Urby53aWR0aD53aW5kb3cuaW5uZXJXaWR0aD8odGhpcy5zdHlsZS5yaWdodD0iMHB4Iix0aGlzLnN0eWxlLmxlZnQ9ImF1dG8iKToodGhpcy5zdHlsZS5sZWZ0PU1hdGgubWF4KDAsZSkrInB4Iix0aGlzLnN0eWxlLnJpZ2h0PSJhdXRvIiksaS50b3ArbitvLmhlaWdodD53aW5kb3cuaW5uZXJIZWlnaHQ/KHRoaXMuc3R5bGUuYm90dG9tPWkuaGVpZ2h0LWMrdCsicHgiLHRoaXMuc3R5bGUudG9wPSJhdXRvIik6KHRoaXMuc3R5bGUudG9wPU1hdGgubWF4KC1pLnRvcCxuKSsicHgiLHRoaXMuc3R5bGUuYm90dG9tPSJhdXRvIikpOih0aGlzLnN0eWxlLmxlZnQ9ZSsicHgiLHRoaXMuc3R5bGUudG9wPW4rInB4Iil9fSxfYWRkTGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5fdGFyZ2V0JiYodGhpcy5saXN0ZW4odGhpcy5fdGFyZ2V0LCJtb3VzZWVudGVyIiwic2hvdyIpLHRoaXMubGlzdGVuKHRoaXMuX3RhcmdldCwiZm9jdXMiLCJzaG93IiksdGhpcy5saXN0ZW4odGhpcy5fdGFyZ2V0LCJtb3VzZWxlYXZlIiwiaGlkZSIpLHRoaXMubGlzdGVuKHRoaXMuX3RhcmdldCwiYmx1ciIsImhpZGUiKSx0aGlzLmxpc3Rlbih0aGlzLl90YXJnZXQsInRhcCIsImhpZGUiKSksdGhpcy5saXN0ZW4odGhpcy4kLnRvb2x0aXAsImFuaW1hdGlvbmVuZCIsIl9vbkFuaW1hdGlvbkVuZCIpLHRoaXMubGlzdGVuKHRoaXMsIm1vdXNlZW50ZXIiLCJoaWRlIil9LF9maW5kVGFyZ2V0OmZ1bmN0aW9uKCl7dGhpcy5tYW51YWxNb2RlfHx0aGlzLl9yZW1vdmVMaXN0ZW5lcnMoKSx0aGlzLl90YXJnZXQ9dGhpcy50YXJnZXQsdGhpcy5tYW51YWxNb2RlfHx0aGlzLl9hZGRMaXN0ZW5lcnMoKX0sX2RlbGF5Q2hhbmdlOmZ1bmN0aW9uKHQpezUwMCE9PXQmJnRoaXMudXBkYXRlU3R5bGVzKHsiLS1wYXBlci10b29sdGlwLWRlbGF5LWluIjp0KyJtcyJ9KX0sX21hbnVhbE1vZGVDaGFuZ2VkOmZ1bmN0aW9uKCl7dGhpcy5tYW51YWxNb2RlP3RoaXMuX3JlbW92ZUxpc3RlbmVycygpOnRoaXMuX2FkZExpc3RlbmVycygpfSxfY2FuY2VsQW5pbWF0aW9uOmZ1bmN0aW9uKCl7dGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJlbnRyeSIpKSx0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2dldEFuaW1hdGlvblR5cGUoImV4aXQiKSksdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSgiY2FuY2VsLWFuaW1hdGlvbiIpLHRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpfSxfb25BbmltYXRpb25GaW5pc2g6ZnVuY3Rpb24oKXt0aGlzLl9zaG93aW5nJiYodGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJlbnRyeSIpKSx0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKCJjYW5jZWwtYW5pbWF0aW9uIiksdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LmFkZCh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJleGl0IikpKX0sX29uQW5pbWF0aW9uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fYW5pbWF0aW9uUGxheWluZz0hMSx0aGlzLl9zaG93aW5nfHwodGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCJleGl0IikpLHRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5hZGQoImhpZGRlbiIpKX0sX2dldEFuaW1hdGlvblR5cGU6ZnVuY3Rpb24odCl7aWYoImVudHJ5Ij09PXQmJiIiIT09dGhpcy5hbmltYXRpb25FbnRyeSlyZXR1cm4gdGhpcy5hbmltYXRpb25FbnRyeTtpZigiZXhpdCI9PT10JiYiIiE9PXRoaXMuYW5pbWF0aW9uRXhpdClyZXR1cm4gdGhpcy5hbmltYXRpb25FeGl0O2lmKHRoaXMuYW5pbWF0aW9uQ29uZmlnW3RdJiYic3RyaW5nIj09dHlwZW9mIHRoaXMuYW5pbWF0aW9uQ29uZmlnW3RdWzBdLm5hbWUpe2lmKHRoaXMuYW5pbWF0aW9uQ29uZmlnW3RdWzBdLnRpbWluZyYmdGhpcy5hbmltYXRpb25Db25maWdbdF1bMF0udGltaW5nLmRlbGF5JiYwIT09dGhpcy5hbmltYXRpb25Db25maWdbdF1bMF0udGltaW5nLmRlbGF5KXt2YXIgZT10aGlzLmFuaW1hdGlvbkNvbmZpZ1t0XVswXS50aW1pbmcuZGVsYXk7ImVudHJ5Ij09PXQ/dGhpcy51cGRhdGVTdHlsZXMoeyItLXBhcGVyLXRvb2x0aXAtZGVsYXktaW4iOmUrIm1zIn0pOiJleGl0Ij09PXQmJnRoaXMudXBkYXRlU3R5bGVzKHsiLS1wYXBlci10b29sdGlwLWRlbGF5LW91dCI6ZSsibXMifSl9cmV0dXJuIHRoaXMuYW5pbWF0aW9uQ29uZmlnW3RdWzBdLm5hbWV9fSxfcmVtb3ZlTGlzdGVuZXJzOmZ1bmN0aW9uKCl7dGhpcy5fdGFyZ2V0JiYodGhpcy51bmxpc3Rlbih0aGlzLl90YXJnZXQsIm1vdXNlZW50ZXIiLCJzaG93IiksdGhpcy51bmxpc3Rlbih0aGlzLl90YXJnZXQsImZvY3VzIiwic2hvdyIpLHRoaXMudW5saXN0ZW4odGhpcy5fdGFyZ2V0LCJtb3VzZWxlYXZlIiwiaGlkZSIpLHRoaXMudW5saXN0ZW4odGhpcy5fdGFyZ2V0LCJibHVyIiwiaGlkZSIpLHRoaXMudW5saXN0ZW4odGhpcy5fdGFyZ2V0LCJ0YXAiLCJoaWRlIikpLHRoaXMudW5saXN0ZW4odGhpcy4kLnRvb2x0aXAsImFuaW1hdGlvbmVuZCIsIl9vbkFuaW1hdGlvbkVuZCIpLHRoaXMudW5saXN0ZW4odGhpcywibW91c2VlbnRlciIsImhpZGUiKX19KTtjbGFzcyBNc3tjb25zdHJ1Y3Rvcih0KXt0aGlzLmxpc3RlbmVyPXR9fWNvbnN0IEVzPW5ldyBTZXQsVHM9bmV3IFNldDtmdW5jdGlvbiBDcyh0KXtjb25zdCBlPW5ldyBNcyh0KTtyZXR1cm4gRXMuYWRkKGUpLGV9ZnVuY3Rpb24gQXModCl7Y29uc3QgZT1uZXcgTXModCk7cmV0dXJuIFRzLmFkZChlKSxlfWZ1bmN0aW9uIGtzKCl7VHMuZm9yRWFjaCgodD0+dC5saXN0ZW5lcigpKSl9ZnVuY3Rpb24gTHModCl7RXMuZGVsZXRlKHQpfWZ1bmN0aW9uIFBzKHQpe1RzLmRlbGV0ZSh0KX13aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigiaGFzaGNoYW5nZSIsKCgpPT57RXMuZm9yRWFjaCgodD0+dC5saXN0ZW5lcigpKSl9KSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInN0b3JhZ2UiLCgoKT0+e1RzLmZvckVhY2goKHQ9PnQubGlzdGVuZXIoKSkpfSkpO2xldCBOcz0hMTtmdW5jdGlvbiBJcygpe3JldHVybiBOc31sZXQgUnM9IiI7ZnVuY3Rpb24gT3ModCl7UnM9dH1mdW5jdGlvbiB6cygpe3JldHVybiBSc312YXIgRHM9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsc2V0VXNlSGFzaDpmdW5jdGlvbiBCcyh0KXtOcz10fSx1c2VIYXNoOklzLHNldEZha2VIYXNoOk9zLGdldEZha2VIYXNoOnpzfSk7Y29uc3QgSHM9Il9fdGFiX18iO2xldCBGcz17fTtmdW5jdGlvbiBWcygpe3JldHVybiBJcygpP3dpbmRvdy5sb2NhdGlvbi5oYXNoLnNsaWNlKDEpOnpzKCl9ZnVuY3Rpb24gVXModCl7Y29uc3QgZT17fTtyZXR1cm4gdC5zcGxpdCgiJiIpLmZvckVhY2goKHQ9Pntjb25zdCBuPXQuc3BsaXQoIj0iKTsxPT09bi5sZW5ndGg/ZS5fX3RhYl9fPW5bMF06Mj09PW4ubGVuZ3RoJiYoZVtkZWNvZGVVUklDb21wb25lbnQoblswXSldPWRlY29kZVVSSUNvbXBvbmVudChuWzFdKSl9KSksZX1mdW5jdGlvbiBqcyh0LGU9ITEpe2lmKElzKCkpaWYoZSl7Y29uc3QgZT1uZXcgVVJMKHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtlLmhhc2g9dCx3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUod2luZG93Lmhpc3Rvcnkuc3RhdGUsIiIsZS50b1N0cmluZygpKX1lbHNlIHdpbmRvdy5sb2NhdGlvbi5oYXNoPXQ7ZWxzZSBPcyh0KX1mdW5jdGlvbiBHcyh0KXtsZXQgZT0iIjt2b2lkIDAhPT10Ll9fdGFiX18mJihlKz10Ll9fdGFiX18pO2NvbnN0IG49T2JqZWN0LmtleXModCkubWFwKChlPT5bZSx0W2VdXSkpLmZpbHRlcigodD0+dFswXSE9PUhzKSkubWFwKCh0PT5lbmNvZGVVUklDb21wb25lbnQodFswXSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudCh0WzFdKSkpLmpvaW4oIiYiKTtyZXR1cm4gbi5sZW5ndGg+MD9lKyImIituOmV9Q3MoKCgpPT57RnM9VXMoVnMoKSl9KSk7Y29uc3QgV3M9ImRpc2FtYmlndWF0b3IiLHtnZXQ6cXMsc2V0OllzLGdldEluaXRpYWxpemVyOlhzLGdldE9ic2VydmVyOiRzLGRpc3Bvc2VCaW5kaW5nOktzfT1kbCgodD0+dCksKHQ9PnQpKSx7Z2V0OlpzLHNldDpKcyxnZXRJbml0aWFsaXplcjpRcyxnZXRPYnNlcnZlcjp0bCxkaXNwb3NlQmluZGluZzplbH09ZGwoKHQ9PiJ0cnVlIj09PXR8fCJmYWxzZSIhPT10JiZ2b2lkIDApLCh0PT50LnRvU3RyaW5nKCkpKSx7Z2V0Om5sLHNldDppbCxnZXRJbml0aWFsaXplcjpybCxnZXRPYnNlcnZlcjpvbCxkaXNwb3NlQmluZGluZzphbH09ZGwoKHQ9Pit0KSwodD0+dC50b1N0cmluZygpKSkse2dldDpzbCxzZXQ6bGwsZ2V0SW5pdGlhbGl6ZXI6Y2wsZ2V0T2JzZXJ2ZXI6dWwsZGlzcG9zZUJpbmRpbmc6aGx9PWRsKCh0PT5KU09OLnBhcnNlKGF0b2IodCkpKSwodD0+YnRvYShKU09OLnN0cmluZ2lmeSh0KSkpKTtmdW5jdGlvbiBkbCh0LGUpe2NvbnN0IG49W10saT1bXTtmdW5jdGlvbiByKGUsbj17fSl7Y29uc3R7ZGVmYXVsdFZhbHVlOmksdXNlTG9jYWxTdG9yYWdlOnI9ITF9PW4sbz1yP3dpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShlKTpVcyhWcygpKVtlXTtyZXR1cm4gbnVsbD09bz9DZS5leHBvcnRzLmNsb25lRGVlcChpKTp0KG8pfWZ1bmN0aW9uIG8odCxuLGk9e30pe2NvbnN0e2RlZmF1bHRWYWx1ZTpvLHVzZUxvY2FsU3RvcmFnZTphPSExLHVzZUxvY2F0aW9uUmVwbGFjZTpzPSExfT1pLGw9ZShuKTtpZihhKXdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbSh0LGwpLGtzKCk7ZWxzZSBpZighQ2UuZXhwb3J0cy5pc0VxdWFsKG4scih0LHt1c2VMb2NhbFN0b3JhZ2U6YX0pKSlpZihDZS5leHBvcnRzLmlzRXF1YWwobixvKSkhKGZ1bmN0aW9uIGModCl7Y29uc3QgZT1VcyhWcygpKTtkZWxldGUgZVt0XSxqcyhHcyhlKSl9KSh0KTtlbHNle2NvbnN0IGU9VXMoVnMoKSk7ZVt0XT1sLGpzKEdzKGUpLHMpfX1yZXR1cm57Z2V0OnIsc2V0Om8sZ2V0SW5pdGlhbGl6ZXI6ZnVuY3Rpb24gYSh0LGUpe2NvbnN0IG89T2JqZWN0LmFzc2lnbih7ZGVmYXVsdFZhbHVlOmUuZGVmYXVsdFZhbHVlLHBvbHltZXJQcm9wZXJ0eTp0LHVzZUxvY2FsU3RvcmFnZTohMX0sZSk7cmV0dXJuIGZ1bmN0aW9uKCl7Y29uc3QgZT1wbCh0aGlzLHQpLGE9KCk9Pntjb25zdCB0PXIoZSxvKTtDZS5leHBvcnRzLmlzRXF1YWwodCx0aGlzW28ucG9seW1lclByb3BlcnR5XSl8fCh0aGlzW28ucG9seW1lclByb3BlcnR5XT10KX0scz0oby51c2VMb2NhbFN0b3JhZ2U/QXM6Q3MpKCgoKT0+YSgpKSk7cmV0dXJuIG8udXNlTG9jYWxTdG9yYWdlP2kucHVzaChzKTpuLnB1c2gocyksYSgpLHRoaXNbby5wb2x5bWVyUHJvcGVydHldfX0sZ2V0T2JzZXJ2ZXI6ZnVuY3Rpb24gcyh0LGUpe2NvbnN0IG49T2JqZWN0LmFzc2lnbih7ZGVmYXVsdFZhbHVlOmUuZGVmYXVsdFZhbHVlLHBvbHltZXJQcm9wZXJ0eTp0LHVzZUxvY2FsU3RvcmFnZTohMX0sZSk7cmV0dXJuIGZ1bmN0aW9uKCl7byhwbCh0aGlzLHQpLHRoaXNbbi5wb2x5bWVyUHJvcGVydHldLG4pfX0sZGlzcG9zZUJpbmRpbmc6ZnVuY3Rpb24gbCgpe24uZm9yRWFjaCgodD0+THModCkpKSxpLmZvckVhY2goKHQ9PlBzKHQpKSl9fX1mdW5jdGlvbiBwbCh0LGUpe2NvbnN0IG49dC5kaXNhbWJpZ3VhdG9yO3JldHVybihudWxsPT1uP1tlXTpbbixlXSkuam9pbigiLiIpfWxldCBmbD1jbGFzcyBleHRlbmRzIHdle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl90YWdGaWx0ZXI9WHMoInRhZ0ZpbHRlciIse2RlZmF1bHRWYWx1ZToiIix1c2VMb2NhbFN0b3JhZ2U6ITEscG9seW1lclByb3BlcnR5OiJfdGFnRmlsdGVyIn0pLmNhbGwodGhpcyksdGhpcy5fdGFnRmlsdGVyT2JzZXJ2ZXI9JHMoInRhZ0ZpbHRlciIse2RlZmF1bHRWYWx1ZToiIix1c2VMb2NhbFN0b3JhZ2U6ITEscG9seW1lclByb3BlcnR5OiJfdGFnRmlsdGVyIn0pfV9jb21wdXRlVGFnRmlsdGVyKCl7cmV0dXJuIHRoaXMuX3RhZ0ZpbHRlcn19O2Z1bmN0aW9uIG1sKHQpe2NvbnN0e21vZHVsZU5hbWU6ZSxzdHlsZUNvbnRlbnQ6bn09dCxpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRvbS1tb2R1bGUiKSxyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIiksbz1bXTt0LnN0eWxlRGVwZW5kZW5jaWVzJiZ0LnN0eWxlRGVwZW5kZW5jaWVzLmZvckVhY2goKHQ9Pntjb25zdCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7ZS5zZXRBdHRyaWJ1dGUoImluY2x1ZGUiLHQpLG8ucHVzaChlKX0pKTtjb25zdCBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7T2JqZWN0LmFzc2lnbihhLHt0ZXh0Q29udGVudDpufSksby5mb3JFYWNoKCh0PT57ci5jb250ZW50LmFwcGVuZENoaWxkKHQpfSkpLHIuY29udGVudC5hcHBlbmRDaGlsZChhKSxpLmFwcGVuZENoaWxkKHIpLGkucmVnaXN0ZXIoZSl9ZnVuY3Rpb24gZ2wodCl7cmV0dXJuIGNsYXNzIGV4dGVuZHMgdHtjb25uZWN0ZWRDYWxsYmFjaygpe3N1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCksdGhpcy5fbWF5YmVTZXREYXJrTW9kZSgpLHRoaXMub2JzZXJ2ZXI9bmV3IE11dGF0aW9uT2JzZXJ2ZXIoKHQ9Pnt0LnNvbWUoKHQ9PiJjbGFzcyI9PT10LmF0dHJpYnV0ZU5hbWUpKSYmdGhpcy5fbWF5YmVTZXREYXJrTW9kZSgpfSkpLHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LHthdHRyaWJ1dGVzOiEwfSl9ZGlzY29ubmVjdGVkQ2FsbGJhY2soKXt2YXIgdDtzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpLG51bGw9PT0odD10aGlzLm9ic2VydmVyKXx8dm9pZCAwPT09dHx8dC5kaXNjb25uZWN0KCl9X21heWJlU2V0RGFya01vZGUoKXt0aGlzLmNsYXNzTGlzdC50b2dnbGUoImRhcmstbW9kZSIsZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuY29udGFpbnMoImRhcmstbW9kZSIpKX19fWZsLnRlbXBsYXRlPXhlYAogICAgPHBhcGVyLWlucHV0CiAgICAgIG5vLWxhYmVsLWZsb2F0PSIiCiAgICAgIGxhYmVsPSJGaWx0ZXIgdGFncyAocmVndWxhciBleHByZXNzaW9ucyBzdXBwb3J0ZWQpIgogICAgICB2YWx1ZT0ie3tfdGFnRmlsdGVyfX0iCiAgICAgIGNsYXNzPSJzZWFyY2gtaW5wdXQiCiAgICA+CiAgICAgIDxpcm9uLWljb24gcHJlZml4PSIiIGljb249InNlYXJjaCIgc2xvdD0icHJlZml4Ij48L2lyb24taWNvbj4KICAgIDwvcGFwZXItaW5wdXQ+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW46IDEwcHggNXB4IDEwcHggMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6U3RyaW5nLG5vdGlmeTohMCxjb21wdXRlZDoiX2NvbXB1dGVUYWdGaWx0ZXIoX3RhZ0ZpbHRlcikifSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLGZsLnByb3RvdHlwZSwidGFnRmlsdGVyIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nLG9ic2VydmVyOiJfdGFnRmlsdGVyT2JzZXJ2ZXIifSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLGZsLnByb3RvdHlwZSwiX3RhZ0ZpbHRlciIsdm9pZCAwKSxmbD10KFtpKCJ0Zi10YWctZmlsdGVyZXIiKV0sZmwpLG1sKHttb2R1bGVOYW1lOiJkYXNoYm9hcmQtc3R5bGUiLHN0eWxlRGVwZW5kZW5jaWVzOlsiaXJvbi1mbGV4Il0sc3R5bGVDb250ZW50OiJcbiAgICAgIDpob3N0IHtcbiAgICAgICAgLS1zaWRlYmFyLXZlcnRpY2FsLXBhZGRpbmc6IDE1cHg7XG4gICAgICAgIC0tc2lkZWJhci1sZWZ0LXBhZGRpbmc6IDMwcHg7XG4gICAgICB9XG5cbiAgICAgIFtzbG90PSdzaWRlYmFyJ10ge1xuICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIG1hcmdpbi1yaWdodDogMTBweDtcbiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuO1xuICAgICAgICBwYWRkaW5nOiA1cHggMDtcbiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gICAgICB9XG5cbiAgICAgIC5zZXR0aW5ncyB7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDUwcHg7XG4gICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgICAgICAgb3ZlcmZsb3cteTogYXV0bztcbiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTtcbiAgICAgIH1cblxuICAgICAgLnJ1bnMtc2VsZWN0b3Ige1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4LWdyb3c6IDE7XG4gICAgICAgIG1pbi1oZWlnaHQ6IDIwMHB4O1xuICAgICAgfVxuXG4gICAgICB0Zi1ydW5zLXNlbGVjdG9yIHtcbiAgICAgICAgZmxleC1ncm93OiAxO1xuICAgICAgICBmbGV4LXNocmluazogMTtcbiAgICAgICAgbGVmdDogdmFyKC0tc2lkZWJhci1sZWZ0LXBhZGRpbmcpO1xuICAgICAgICBtYXgtaGVpZ2h0OiBjYWxjKDEwMCUgLSB2YXIoLS1zaWRlYmFyLXZlcnRpY2FsLXBhZGRpbmcpICogMik7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgICAgICAgcmlnaHQ6IDA7XG4gICAgICB9XG5cbiAgICAgIC5zZWFyY2gtaW5wdXQge1xuICAgICAgICBtYXJnaW46IDEwcHggNXB4IDAgMTBweDtcbiAgICAgIH1cblxuICAgICAgLnNpZGViYXItc2VjdGlvbiB7XG4gICAgICAgIGJvcmRlci10b3A6IHNvbGlkIDFweCB2YXIoLS10Yi11aS1ib3JkZXIpO1xuICAgICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7XG4gICAgICAgIHBhZGRpbmc6IHZhcigtLXNpZGViYXItdmVydGljYWwtcGFkZGluZykgMFxuICAgICAgICAgIHZhcigtLXNpZGViYXItdmVydGljYWwtcGFkZGluZykgdmFyKC0tc2lkZWJhci1sZWZ0LXBhZGRpbmcpO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB9XG5cbiAgICAgIC5zaWRlYmFyLXNlY3Rpb246Zmlyc3Qtb2YtdHlwZSB7XG4gICAgICAgIGJvcmRlcjogbm9uZTtcbiAgICAgIH1cblxuICAgICAgLnNpZGViYXItc2VjdGlvbiBwYXBlci1idXR0b24ge1xuICAgICAgICBtYXJnaW46IDVweDtcbiAgICAgIH1cblxuICAgICAgLnNpZGViYXItc2VjdGlvbiBwYXBlci1idXR0b246Zmlyc3Qtb2YtdHlwZSB7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAwICFpbXBvcnRhbnQ7XG4gICAgICB9XG5cbiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gcGFwZXItYnV0dG9uOmxhc3Qtb2YtdHlwZSB7XG4gICAgICAgIG1hcmdpbi1yaWdodDogMCAhaW1wb3J0YW50O1xuICAgICAgfVxuXG4gICAgICAuc2lkZWJhci1zZWN0aW9uID4gOmZpcnN0LWNoaWxkIHtcbiAgICAgICAgbWFyZ2luLXRvcDogMDtcbiAgICAgICAgcGFkZGluZy10b3A6IDA7XG4gICAgICB9XG5cbiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gPiA6bGFzdC1jaGlsZCB7XG4gICAgICAgIG1hcmdpbi1ib3R0b206IDA7XG4gICAgICAgIHBhZGRpbmctYm90dG9tOiAwO1xuICAgICAgfVxuXG4gICAgICAuc2lkZWJhci1zZWN0aW9uIGgzIHtcbiAgICAgICAgY29sb3I6IHZhcigtLXRiLXNlY29uZGFyeS10ZXh0LWNvbG9yKTtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIGZvbnQtc2l6ZTogMTRweDtcbiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDtcbiAgICAgICAgbWFyZ2luOiAxMHB4IDAgNXB4O1xuICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTtcbiAgICAgIH1cblxuICAgICAgcGFwZXItY2hlY2tib3gge1xuICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTtcbiAgICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTtcbiAgICAgICAgZm9udC1zaXplOiAxNXB4O1xuICAgICAgICBtYXJnaW4tdG9wOiA1cHg7XG4gICAgICB9XG5cbiAgICAgIGEge1xuICAgICAgICBjb2xvcjogdmFyKC0tdGItbGluayk7XG4gICAgICB9XG5cbiAgICAgIGE6dmlzaXRlZCB7XG4gICAgICAgIGNvbG9yOiB2YXIoLS10Yi1saW5rLXZpc2l0ZWQpO1xuICAgICAgfVxuICAifSksbWwoe21vZHVsZU5hbWU6InNjcm9sbGJhci1zdHlsZSIsc3R5bGVDb250ZW50OiJcbiAgICAuc2Nyb2xsYmFyOjotd2Via2l0LXNjcm9sbGJhci10cmFjayB7XG4gICAgICB2aXNpYmlsaXR5OiBoaWRkZW47XG4gICAgfVxuXG4gICAgLnNjcm9sbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXIge1xuICAgICAgd2lkdGg6IDEwcHg7XG4gICAgfVxuXG4gICAgLnNjcm9sbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIge1xuICAgICAgYm9yZGVyLXJhZGl1czogMTBweDtcbiAgICAgIC13ZWJraXQtYm94LXNoYWRvdzogaW5zZXQgMCAwIDJweCByZ2JhKDAsIDAsIDAsIDAuMyk7XG4gICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTUwMCk7XG4gICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS05MDApO1xuICAgIH1cbiAgICAuc2Nyb2xsYmFyIHtcbiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgfVxuICAifSk7Y29uc3QgX2w9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtfbC5zZXRBdHRyaWJ1dGUoImlzIiwiY3VzdG9tLXN0eWxlIiksX2wudGV4dENvbnRlbnQ9IlxuICA6cm9vdCB7XG4gICAgLS10Yi1vcmFuZ2Utd2VhazogI2ZmYTcyNjtcbiAgICAtLXRiLW9yYW5nZS1zdHJvbmc6ICNmNTdjMDA7XG4gICAgLS10Yi1vcmFuZ2UtZGFyazogI2RjNzMyMDtcbiAgICAtLXRiLWdyZXktZGFya2VyOiAjZTJlMmUyO1xuICAgIC0tdGItZ3JleS1saWdodGVyOiAjZjNmM2YzO1xuICAgIC0tdGItdWktZGFyay1hY2NlbnQ6ICM3NTc1NzU7XG4gICAgLS10Yi11aS1saWdodC1hY2NlbnQ6ICNlMGUwZTA7XG4gICAgLS10Yi11aS1ib3JkZXI6IHZhcigtLXBhcGVyLWdyZXktMzAwKTtcbiAgICAtLXRiLWdyYXBoLWZhZGVkOiAjZTBkNGIzO1xuICAgIC0tdGItc2Vjb25kYXJ5LXRleHQtY29sb3I6IHZhcigtLXBhcGVyLWdyZXktODAwKTtcbiAgICAtLXRiLXJhaXNlZC1idXR0b24tc2hhZG93LWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuMik7XG4gICAgLS1wcmltYXJ5LWJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgLS1zZWNvbmRhcnktYmFja2dyb3VuZC1jb2xvcjogI2U5ZTllOTtcbiAgICAtLXRiLWxheW91dC1iYWNrZ3JvdW5kLWNvbG9yOiAjZjVmNWY1O1xuICAgIC0tdGItbGluazogIzE5NzZkMjsgLyogbWF0ZXJpYWwgYmx1ZSA3MDAuICovXG4gICAgLS10Yi1saW5rLXZpc2l0ZWQ6ICM3YjFmYTI7IC8qIG1hdGVyaWFsIHB1cnBsZSA3MDAuICovXG4gIH1cblxuICA6cm9vdCAuZGFyay1tb2RlIHtcbiAgICAtLXRiLXVpLWJvcmRlcjogdmFyKC0tcGFwZXItZ3JleS03MDApO1xuICAgIC0tdGItdWktZGFyay1hY2NlbnQ6IHZhcigtLXBhcGVyLWdyZXktNDAwKTtcbiAgICAtLXRiLXVpLWxpZ2h0LWFjY2VudDogdmFyKC0tcGFwZXItZ3JleS02MDApO1xuICAgIC0tdGItc2Vjb25kYXJ5LXRleHQtY29sb3I6IHZhcigtLXBhcGVyLWdyZXktNDAwKTtcbiAgICAtLXRiLXJhaXNlZC1idXR0b24tc2hhZG93LWNvbG9yOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuNSk7XG4gICAgLS1wcmltYXJ5LXRleHQtY29sb3I6ICNmZmY7XG4gICAgLS1zZWNvbmRhcnktdGV4dC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS00MDApO1xuICAgIC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yOiAjMzAzMDMwOyAgLyogbWF0ZXJpYWwgZ3JleSBBNDAwLiAqL1xuICAgIC0tc2Vjb25kYXJ5LWJhY2tncm91bmQtY29sb3I6ICMzYTNhM2E7XG4gICAgLS10Yi1sYXlvdXQtYmFja2dyb3VuZC1jb2xvcjogIzNhM2EzYTtcbiAgICAtLXRiLWxpbms6ICM0MmE1ZjU7IC8qIG1hdGVyaWFsIGJsdWUgNDAwLiAqL1xuICAgIC0tdGItbGluay12aXNpdGVkOiAjYmE2OGM4OyAvKiBtYXRlcmlhbCBwdXJwbGUgMzAwLiAqL1xuICAgIC8qIE92ZXJyaWRlcyBwYXBlci1tYXRlcmlhbCAqL1xuICAgIC0tc2hhZG93LWVsZXZhdGlvbi0yZHBfLV9ib3gtc2hhZG93OiAwIDJweCAycHggMCByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTQpLFxuICAgICAgMCAxcHggNXB4IDAgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKSxcbiAgICAgIDAgM3B4IDFweCAtMnB4IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4yKTtcbiAgfVxuIixkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKF9sKTtsZXQgeWw9Y2xhc3MgZXh0ZW5kcyhnbCh3ZSkpe307eWwudGVtcGxhdGU9eGVgCiAgICA8ZGl2IGlkPSJzaWRlYmFyIj4KICAgICAgPHNsb3QgbmFtZT0ic2lkZWJhciI+PC9zbG90PgogICAgPC9kaXY+CgogICAgPGRpdiBpZD0iY2VudGVyIj4KICAgICAgPHNsb3QgbmFtZT0iY2VudGVyIiBjbGFzcz0ic2NvbGxiYXIiPjwvc2xvdD4KICAgIDwvZGl2PgogICAgPHN0eWxlIGluY2x1ZGU9InNjcm9sbGJhci1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmNWY1ZjU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgOmhvc3QoLmRhcmstbW9kZSkgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXNlY29uZGFyeS1iYWNrZ3JvdW5kLWNvbG9yKTsKICAgICAgfQoKICAgICAgI3NpZGViYXIgewogICAgICAgIGZsZXg6IDAgMCB2YXIoLS10Zi1kYXNoYm9hcmQtbGF5b3V0LXNpZGViYXItYmFzaXMsIDI1JSk7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG1heC13aWR0aDogdmFyKC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLW1heC13aWR0aCwgMzUwcHgpOwogICAgICAgIG1pbi13aWR0aDogdmFyKC0tdGYtZGFzaGJvYXJkLWxheW91dC1zaWRlYmFyLW1pbi13aWR0aCwgMjcwcHgpOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KCiAgICAgICNjZW50ZXIgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgOjpzbG90dGVkKFtzbG90PSdjZW50ZXInXSkgewogICAgICAgIGNvbnRhaW46IHN0cmljdDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQoKICAgICAgLnRmLWdyYXBoLWRhc2hib2FyZCAjY2VudGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZmZmOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAseWw9dChbaSgidGYtZGFzaGJvYXJkLWxheW91dCIpXSx5bCk7Y29uc3Qgdmw9IlRGLlRlbnNvckJvYXJkLlBhZ2luYXRlZFZpZXcubGltaXQiO2xldCBibD1udWxsO2NvbnN0IHhsPW5ldyBTZXQ7ZnVuY3Rpb24gd2wodCl7eGwuYWRkKHQpfWZ1bmN0aW9uIFNsKHQpe3hsLmRlbGV0ZSh0KX1mdW5jdGlvbiBNbCgpe3JldHVybiBudWxsPT1ibCYmKGJsPW5sKHZsLHt1c2VMb2NhbFN0b3JhZ2U6ITB9KSwobnVsbD09Ymx8fCFpc0Zpbml0ZShibCl8fGJsPD0wKSYmKGJsPTEyKSksYmx9Y2xhc3MgRWwgZXh0ZW5kcyB3ZXt1cGRhdGVBcnJheVByb3AodCxlLG4pe2xldCBpPXRoaXMuZ2V0KHQpO2NvbnN0IHI9ZTtpZighQXJyYXkuaXNBcnJheShyKSl0aHJvdyBSYW5nZUVycm9yKGBFeHBlY3RlZCBuZXcgdmFsdWUgdG8gJyR7dH0nIHRvIGJlIGFuIGFycmF5LmApO0FycmF5LmlzQXJyYXkoaSl8fChpPVtdLHRoaXMuc2V0KHQsaSkpO2NvbnN0IG89bmV3IFNldChyLm1hcCgoKHQsZSk9Pm4odCxlKSkpKTtsZXQgYT0wLHM9MDtmb3IoO2E8aS5sZW5ndGgmJnM8ci5sZW5ndGg7KW8uaGFzKG4oaVthXSxhKSk/KG4oaVthXSxhKT09bihyW3NdLHMpP3RoaXMuc2V0KGAke3R9LiR7YX1gLHJbc10pOnRoaXMuc3BsaWNlKHQsYSwwLHJbc10pLHMrKyxhKyspOnRoaXMuc3BsaWNlKHQsYSwxKTthPGkubGVuZ3RoJiZ0aGlzLnNwbGljZSh0LGEpLHM8ci5sZW5ndGgmJnRoaXMucHVzaCh0LC4uLnIuc2xpY2UocykpfX1jbGFzcyBUbCBleHRlbmRzIEVse2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmFzPSJpdGVtIix0aGlzLl9jb250ZW50QWN0aXZlPSEwLHRoaXMuX2RvbUJvb3RzdHJhcHBlZD0hMSx0aGlzLl9jdG9yPW51bGwsdGhpcy5fcmVuZGVyZWRJdGVtcz1bXSx0aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdD1uZXcgTWFwLHRoaXMuX2xydUNhY2hlZEl0ZW1zPW5ldyBNYXAsdGhpcy5fY2FjaGVTaXplPTEwLHRoaXMuX2dldEl0ZW1LZXk9dD0+SlNPTi5zdHJpbmdpZnkodCksdGhpcy5faXNDb25uZWN0ZWQ9ITF9Y29ubmVjdGVkQ2FsbGJhY2soKXtzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpLHRoaXMuX2lzQ29ubmVjdGVkPSEwfXNldENhY2hlU2l6ZSh0KXt0aGlzLl9jYWNoZVNpemU9dH1zZXRHZXRJdGVtS2V5KHQpe3RoaXMuX2dldEl0ZW1LZXk9dH11cGRhdGVEb20odCl7dGhpcy51cGRhdGVBcnJheVByb3AoIl9yZW5kZXJlZEl0ZW1zIix0LHRoaXMuX2dldEl0ZW1LZXkpfV9lbnN1cmVUZW1wbGF0aXplZCgpe2lmKCF0aGlzLmlzQ29ubmVjdGVkKXJldHVybiExO2lmKCF0aGlzLl9jdG9yKXtjb25zdCB0PXRoaXMucXVlcnlTZWxlY3RvcigidGVtcGxhdGUiKTt0aGlzLl9jdG9yPWFvKHQsdGhpcyx7cGFyZW50TW9kZWw6ITAsaW5zdGFuY2VQcm9wczp7W3RoaXMuYXNdOiEwLGFjdGl2ZTp0aGlzLl9jb250ZW50QWN0aXZlfSxmb3J3YXJkSG9zdFByb3A6ZnVuY3Rpb24odCxlKXt0aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5mb3JFYWNoKChuPT57bi5mb3J3YXJkSG9zdFByb3AodCxlKX0pKX19KX1yZXR1cm4hMH1fYm9vdHN0cmFwRG9tKCl7aWYoIXRoaXMuX2Vuc3VyZVRlbXBsYXRpemVkKCl8fHRoaXMuX2RvbUJvb3RzdHJhcHBlZClyZXR1cm47bmV3IE11dGF0aW9uT2JzZXJ2ZXIoKHQ9Pntmb3IoY29uc3QgZSBvZiB0KWlmKCJjaGlsZExpc3QiPT09ZS50eXBlKWZvcihjb25zdCB0IG9mIEFycmF5LmZyb20oZS5hZGRlZE5vZGVzKSl0IGluc3RhbmNlb2YgRWxlbWVudCYmdC5zZXRBdHRyaWJ1dGUoInNsb3QiLCJpdGVtcyIpfSkpLm9ic2VydmUodGhpcyx7Y2hpbGRMaXN0OiEwfSksQXJyYXkuZnJvbSh0aGlzLmNoaWxkcmVuKS5mb3JFYWNoKCh0PT57dGhpcy5yZW1vdmVDaGlsZCh0KX0pKSx0aGlzLl9scnVDYWNoZWRJdGVtcy5jbGVhcigpLHRoaXMuX3JlbmRlcmVkSXRlbXMuZm9yRWFjaCgoKHQsZSk9PnRoaXMuX2luc2VydEl0ZW0odCxlKSkpLHRoaXMuX2RvbUJvb3RzdHJhcHBlZD0hMH1fdXBkYXRlQWN0aXZlKCl7dGhpcy5fZG9tQm9vdHN0cmFwcGVkJiZBcnJheS5mcm9tKHRoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LnZhbHVlcygpKS5mb3JFYWNoKCh0PT57dC5ub3RpZnlQYXRoKCJhY3RpdmUiLHRoaXMuX2NvbnRlbnRBY3RpdmUpfSkpfV91cGRhdGVEb20odCl7aWYodGhpcy5fZG9tQm9vdHN0cmFwcGVkJiYiX3JlbmRlcmVkSXRlbXMiIT10LnBhdGgmJiJfcmVuZGVyZWRJdGVtcy5sZW5ndGgiIT10LnBhdGgpaWYoIl9yZW5kZXJlZEl0ZW1zLnNwbGljZXMiPT09dC5wYXRoKXt0LnZhbHVlLmluZGV4U3BsaWNlcy5mb3JFYWNoKCh0PT57Y29uc3R7aW5kZXg6ZSxhZGRlZENvdW50Om4sb2JqZWN0OmkscmVtb3ZlZDpyfT10O3IuZm9yRWFjaCgodD0+e3RoaXMuX3JlbW92ZUl0ZW0odCx0aGlzLmNoaWxkcmVuW2VdKX0pKSxpLnNsaWNlKGUsZStuKS5mb3JFYWNoKCgodCxuKT0+dGhpcy5faW5zZXJ0SXRlbSh0LGUrbikpKSx0aGlzLl90cmltQ2FjaGUoKX0pKX1lbHNle2NvbnN0IGU9dGhpcy5fZ2V0SXRlbUtleSh0LnZhbHVlKTt0aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5oYXMoZSk/dGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QuZ2V0KGUpLm5vdGlmeVBhdGgodGhpcy5hcyx0LnZhbHVlKTpjb25zb2xlLndhcm4oYEV4cGVjdGVkICcke2V9JyB0byBleGlzdCBpbiB0aGUgRE9NIGJ1dCBjb3VsZCBub3QgZmluZCBvbmUuYCl9fV9pbnNlcnRJdGVtKHQsZSl7aWYoIXRoaXMuX2Vuc3VyZVRlbXBsYXRpemVkKCkpdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCB0ZW1wbGF0aXplZCBiZWZvcmUgaW5zZXJ0aW5nIGFuIGl0ZW0iKTtsZXQgbjtjb25zdCBpPXRoaXMuX2dldEl0ZW1LZXkodCk7aWYodGhpcy5fbHJ1Q2FjaGVkSXRlbXMuaGFzKGkpKW49dGhpcy5fbHJ1Q2FjaGVkSXRlbXMuZ2V0KGkpLHRoaXMuX2xydUNhY2hlZEl0ZW1zLmRlbGV0ZShpKSx0aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5nZXQoaSkubm90aWZ5UGF0aCgiYWN0aXZlIix0aGlzLl9jb250ZW50QWN0aXZlKTtlbHNle2NvbnN0IGU9bmV3IHRoaXMuX2N0b3Ioe1t0aGlzLmFzXTp0LGFjdGl2ZTp0aGlzLl9jb250ZW50QWN0aXZlfSk7bj1lLnJvb3QsdGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3Quc2V0KGksZSl9aWYodGhpcy5jaGlsZHJlbltlXSl0aGlzLmluc2VydEJlZm9yZShuLHRoaXMuY2hpbGRyZW5bZV0pO2Vsc2V7KG4ubm9kZVR5cGU9PU5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERT9BcnJheS5mcm9tKG4uY2hpbGRyZW4pOltuXSkuZm9yRWFjaCgodD0+dC5zZXRBdHRyaWJ1dGUoInNsb3QiLCJpdGVtcyIpKSksdGhpcy5hcHBlbmRDaGlsZChuKX19X3JlbW92ZUl0ZW0odCxlKXtlLnBhcmVudE5vZGUmJmUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKTtjb25zdCBuPXRoaXMuX2dldEl0ZW1LZXkodCk7dGhpcy5fbHJ1Q2FjaGVkSXRlbXMuc2V0KG4sZSksdGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QuZ2V0KG4pLm5vdGlmeVBhdGgoImFjdGl2ZSIsITEpfV90cmltQ2FjaGUoKXtmb3IoO3RoaXMuX2xydUNhY2hlZEl0ZW1zLnNpemU+dGhpcy5fY2FjaGVTaXplOyl7Y29uc3RbdF09dGhpcy5fbHJ1Q2FjaGVkSXRlbXMua2V5cygpO3RoaXMuX2xydUNhY2hlZEl0ZW1zLmRlbGV0ZSh0KSx0aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5kZWxldGUodCl9fX10KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxUbC5wcm90b3R5cGUsImFzIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxUbC5wcm90b3R5cGUsIml0ZW1zIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sVGwucHJvdG90eXBlLCJfY29udGVudEFjdGl2ZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sVGwucHJvdG90eXBlLCJfZG9tQm9vdHN0cmFwcGVkIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFRsLnByb3RvdHlwZSwiX2N0b3IiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLFRsLnByb3RvdHlwZSwiX3JlbmRlcmVkSXRlbXMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sVGwucHJvdG90eXBlLCJfcmVuZGVyZWRUZW1wbGF0ZUluc3QiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sVGwucHJvdG90eXBlLCJfbHJ1Q2FjaGVkSXRlbXMiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sVGwucHJvdG90eXBlLCJfY2FjaGVTaXplIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFRsLnByb3RvdHlwZSwiX2dldEl0ZW1LZXkiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFRsLnByb3RvdHlwZSwiX2lzQ29ubmVjdGVkIix2b2lkIDApLHQoW2EoIl9pc0Nvbm5lY3RlZCIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sVGwucHJvdG90eXBlLCJfYm9vdHN0cmFwRG9tIixudWxsKSx0KFthKCJfY29udGVudEFjdGl2ZSIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sVGwucHJvdG90eXBlLCJfdXBkYXRlQWN0aXZlIixudWxsKSx0KFthKCJfcmVuZGVyZWRJdGVtcy4qIiwiX2RvbUJvb3RzdHJhcHBlZCIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtPYmplY3RdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sVGwucHJvdG90eXBlLCJfdXBkYXRlRG9tIixudWxsKSx0KFthKCJfY2FjaGVTaXplIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxUbC5wcm90b3R5cGUsIl90cmltQ2FjaGUiLG51bGwpO2xldCBDbD1jbGFzcyBleHRlbmRzIFRse2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmRpc2FibGVQYWdpbmF0aW9uPSExLHRoaXMuZ2V0Q2F0ZWdvcnlJdGVtS2V5PXQ9PkpTT04uc3RyaW5naWZ5KHQpLHRoaXMuX2xpbWl0PTEyLHRoaXMuX2FjdGl2ZUluZGV4PTAsdGhpcy5fcGFnZUlucHV0UmF3VmFsdWU9IiIsdGhpcy5fcGFnZUlucHV0Rm9jdXNlZD0hMX1fY29tcHV0ZUNvdW50KCl7cmV0dXJuIHRoaXMuY2F0ZWdvcnkuaXRlbXMubGVuZ3RofWdldCBfaGFzTXVsdGlwbGUoKXtyZXR1cm4gdGhpcy5fY291bnQ+MX1fdG9nZ2xlUGFuZSgpe3RoaXMub3BlbmVkPSF0aGlzLm9wZW5lZH1fY2hhbmdlQ29udGVudEFjdGl2ZSh0KXt0aGlzLl9jb250ZW50QWN0aXZlPXR9X29uUGFuZVJlbmRlcmVkQ2hhbmdlZCh0LGUpe3QmJnQhPT1lJiZ0aGlzLiQuaWZSZW5kZXJlZC5yZW5kZXIoKX1fY29tcHV0ZVBhbmVSZW5kZXJlZCh0KXtyZXR1cm4hKHQubWV0YWRhdGEudHlwZT09PUFyLlNFQVJDSF9SRVNVTFRTJiYiIj09PXQubmFtZSl9Z2V0IF9pdGVtc1JlbmRlcmVkKCl7cmV0dXJuIHRoaXMuX3BhbmVSZW5kZXJlZCYmdGhpcy5vcGVuZWR9X2NvbXB1dGVJc1NlYXJjaFJlc3VsdHModCl7cmV0dXJuIHQ9PT1Bci5TRUFSQ0hfUkVTVUxUU31fY29tcHV0ZUlzSW52YWxpZFNlYXJjaFJlc3VsdHModCl7cmV0dXJuIHQudHlwZT09PUFyLlNFQVJDSF9SRVNVTFRTJiYhdC52YWxpZFJlZ2V4fV9jb21wdXRlSXNVbml2ZXJzYWxTZWFyY2hRdWVyeSh0KXtyZXR1cm4gdC50eXBlPT09QXIuU0VBUkNIX1JFU1VMVFMmJnQudW5pdmVyc2FsUmVnZXh9X2lzQ29tcG9zaXRlU2VhcmNoKCl7Y29uc3R7dHlwZTp0LGNvbXBvc2l0ZVNlYXJjaDplfT10aGlzLmNhdGVnb3J5Lm1ldGFkYXRhO3JldHVybiBlJiZ0PT09QXIuU0VBUkNIX1JFU1VMVFN9cmVhZHkoKXtzdXBlci5yZWFkeSgpLHRoaXMub3BlbmVkPW51bGw9PXRoaXMuaW5pdGlhbE9wZW5lZHx8dGhpcy5pbml0aWFsT3BlbmVkLHRoaXMuX2xpbWl0TGlzdGVuZXI9KCk9Pnt0aGlzLnNldCgiX2xpbWl0IixNbCgpKX0sd2wodGhpcy5fbGltaXRMaXN0ZW5lciksdGhpcy5fbGltaXRMaXN0ZW5lcigpfWRldGFjaGVkKCl7U2wodGhpcy5fbGltaXRMaXN0ZW5lcil9X3VwZGF0ZVJlbmRlcmVkSXRlbXMoKXt2YXIgdD10aGlzLl9saW1pdCxlPXRoaXMuZGlzYWJsZVBhZ2luYXRpb247aWYoIXRoaXMuX2l0ZW1zUmVuZGVyZWQpcmV0dXJuO2NvbnN0IG49TWF0aC5mbG9vcih0aGlzLl9hY3RpdmVJbmRleC90KSxpPXRoaXMuY2F0ZWdvcnkuaXRlbXN8fFtdLHI9ZT9pOmkuc2xpY2Uobip0LChuKzEpKnQpO3RoaXMudXBkYXRlRG9tKHIpfV9saW1pdENoYW5nZWQodCl7dGhpcy5zZXRDYWNoZVNpemUoMip0KX1fZ2V0Q2F0ZWdvcnlJdGVtS2V5Q2hhbmdlZCgpe3RoaXMuc2V0R2V0SXRlbUtleSh0aGlzLmdldENhdGVnb3J5SXRlbUtleSl9Z2V0IF9jdXJyZW50UGFnZSgpe3JldHVybiBNYXRoLmZsb29yKHRoaXMuX2FjdGl2ZUluZGV4L3RoaXMuX2xpbWl0KSsxfV9jb21wdXRlUGFnZUNvdW50KHQsZSl7cmV0dXJuIHRoaXMuY2F0ZWdvcnk/TWF0aC5jZWlsKHRoaXMuY2F0ZWdvcnkuaXRlbXMubGVuZ3RoL2UpOjB9Z2V0IF9tdWx0aXBsZVBhZ2VzRXhpc3QoKXtyZXR1cm4hdGhpcy5kaXNhYmxlUGFnaW5hdGlvbiYmdGhpcy5fcGFnZUNvdW50PjF9Z2V0IF9oYXNQcmV2aW91c1BhZ2UoKXtyZXR1cm4gdGhpcy5fY3VycmVudFBhZ2U+MX1nZXQgX2hhc05leHRQYWdlKCl7cmV0dXJuIHRoaXMuX2N1cnJlbnRQYWdlPHRoaXMuX3BhZ2VDb3VudH1fY29tcHV0ZUlucHV0V2lkdGgodCl7cmV0dXJuYGNhbGMoJHt0LnRvU3RyaW5nKCkubGVuZ3RofWVtICsgMjBweClgfV9zZXRBY3RpdmVJbmRleCh0KXtjb25zdCBlPSh0aGlzLmNhdGVnb3J5Lml0ZW1zfHxbXSkubGVuZ3RoLTE7dD5lJiYodD1lKSx0PDAmJih0PTApLHRoaXMuc2V0KCJfYWN0aXZlSW5kZXgiLHQpfV9jbGFtcEFjdGl2ZUluZGV4KCl7dGhpcy5fc2V0QWN0aXZlSW5kZXgodGhpcy5fYWN0aXZlSW5kZXgpfV9wZXJmb3JtUHJldmlvdXNQYWdlKCl7dGhpcy5fc2V0QWN0aXZlSW5kZXgodGhpcy5fYWN0aXZlSW5kZXgtdGhpcy5fbGltaXQpfV9wZXJmb3JtTmV4dFBhZ2UoKXt0aGlzLl9zZXRBY3RpdmVJbmRleCh0aGlzLl9hY3RpdmVJbmRleCt0aGlzLl9saW1pdCl9X2NvbXB1dGVQYWdlSW5wdXRWYWx1ZSh0LGUsbil7cmV0dXJuIHQ/ZTpuLnRvU3RyaW5nKCl9X2hhbmRsZVBhZ2VJbnB1dEV2ZW50KHQpe3RoaXMuc2V0KCJfcGFnZUlucHV0UmF3VmFsdWUiLHQudGFyZ2V0LnZhbHVlKTtjb25zdCBlPU51bWJlcih0LnRhcmdldC52YWx1ZXx8TmFOKTtpZihpc05hTihlKSlyZXR1cm47Y29uc3Qgbj1NYXRoLm1heCgxLE1hdGgubWluKGUsdGhpcy5fcGFnZUNvdW50KSktMTt0aGlzLl9zZXRBY3RpdmVJbmRleCh0aGlzLl9saW1pdCpuKX1faGFuZGxlUGFnZUNoYW5nZUV2ZW50KCl7dGhpcy5zZXQoIl9wYWdlSW5wdXRSYXdWYWx1ZSIsdGhpcy5fY3VycmVudFBhZ2UudG9TdHJpbmcoKSl9X2hhbmRsZVBhZ2VGb2N1c0V2ZW50KCl7dGhpcy5zZXQoIl9wYWdlSW5wdXRSYXdWYWx1ZSIsdGhpcy5fcGFnZUlucHV0VmFsdWUpLHRoaXMuc2V0KCJfcGFnZUlucHV0Rm9jdXNlZCIsITApfV9oYW5kbGVQYWdlQmx1ckV2ZW50KCl7dGhpcy5zZXQoIl9wYWdlSW5wdXRGb2N1c2VkIiwhMSl9X3VwZGF0ZVBhZ2VJbnB1dFZhbHVlKHQpe2NvbnN0IGU9dGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoIiNwYWdlLWlucHV0IGlucHV0Iik7ZSYmKGUudmFsdWU9dCl9X3VwZGF0ZUlucHV0V2lkdGgoKXt0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXctcGFnZS1pbnB1dC13aWR0aCI6dGhpcy5faW5wdXRXaWR0aH0pfX07Q2wudGVtcGxhdGU9eGVgCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3BhbmVSZW5kZXJlZF1dIiBpZD0iaWZSZW5kZXJlZCI+CiAgICAgIDxidXR0b24gY2xhc3M9ImhlYWRpbmciIG9uLXRhcD0iX3RvZ2dsZVBhbmUiIG9wZW4tYnV0dG9uJD0iW1tvcGVuZWRdXSI+CiAgICAgICAgPHNwYW4gY2xhc3M9Im5hbWUiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1NlYXJjaFJlc3VsdHNdXSI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNDb21wb3NpdGVTZWFyY2goY2F0ZWdvcnkpXV0iPgogICAgICAgICAgICAgIDxzcGFuPlRhZ3MgbWF0Y2hpbmcgbXVsdGlwbGUgZXhwZXJpbWVudHM8L3NwYW4+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0ludmFsaWRTZWFyY2hSZXN1bHRzXV0iPgogICAgICAgICAgICAgICAgPHNwYW4KICAgICAgICAgICAgICAgICAgPiZuYnNwOzxzdHJvbmc+KG1hbGZvcm1lZCByZWd1bGFyIGV4cHJlc3Npb24pPC9zdHJvbmc+PC9zcGFuCiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfaXNDb21wb3NpdGVTZWFyY2goY2F0ZWdvcnkpXV0iPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsaWdodCI+VGFncyBtYXRjaGluZyAvPC9zcGFuPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjYXRlZ29yeS1uYW1lIiB0aXRsZSQ9IltbY2F0ZWdvcnkubmFtZV1dIgogICAgICAgICAgICAgICAgPltbY2F0ZWdvcnkubmFtZV1dPC9zcGFuCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsaWdodCI+Lzwvc3Bhbj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVW5pdmVyc2FsU2VhcmNoUXVlcnldXSI+CiAgICAgICAgICAgICAgICA8c3Bhbj4gKGFsbCB0YWdzKTwvc3Bhbj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNJbnZhbGlkU2VhcmNoUmVzdWx0c11dIj4KICAgICAgICAgICAgICAgIDxzcGFuPiA8c3Ryb25nPihtYWxmb3JtZWQgcmVndWxhciBleHByZXNzaW9uKTwvc3Ryb25nPjwvc3Bhbj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2lzU2VhcmNoUmVzdWx0c11dIj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNhdGVnb3J5LW5hbWUiIHRpdGxlJD0iW1tjYXRlZ29yeS5uYW1lXV0iCiAgICAgICAgICAgICAgPltbY2F0ZWdvcnkubmFtZV1dPC9zcGFuCiAgICAgICAgICAgID4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJjb3VudCI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc011bHRpcGxlXV0iPgogICAgICAgICAgICA8c3Bhbj5bW19jb3VudF1dPC9zcGFuPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDxpcm9uLWljb24gaWNvbj0iZXhwYW5kLW1vcmUiIGNsYXNzPSJleHBhbmQtYXJyb3ciPjwvaXJvbi1pY29uPgogICAgICAgIDwvc3Bhbj4KICAgICAgPC9idXR0b24+CiAgICAgIDwhLS0gVE9ETyhzdGVwaGFud2xlZSk6IGludmVzdGlnYXRlIGZ1cnRoZXIuIEZvciBzb21lIHJlYXNvbiwKICAgICAgICB0cmFuc2l0aW9uZW5kIHRoYXQgdGhlIGlyb24tY29sbGFwc2UgcmVsaWVzIG9uIHNvbWV0aW1lcyBkb2VzIG5vdAogICAgICAgIHRyaWdnZXIgd2hlbiByZW5kZXJpbmcgYSBjaGFydCB3aXRoIGEgc3Bpbm5lci4gQSB0b3kgZXhhbXBsZSBjYW5ub3QKICAgICAgICByZXByb2R1Y2UgdGhpcyBidWcuIC0tPgogICAgICA8aXJvbi1jb2xsYXBzZSBvcGVuZWQ9Iltbb3BlbmVkXV0iIG5vLWFuaW1hdGlvbj0iIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KICAgICAgICAgIDxzcGFuIGlkPSJ0b3Atb2YtY29udGFpbmVyIj48L3NwYW4+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX211bHRpcGxlUGFnZXNFeGlzdF1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmlnLXBhZ2UtYnV0dG9ucyIgc3R5bGU9Im1hcmdpbi1ib3R0b206IDEwcHg7Ij4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgICBvbi10YXA9Il9wZXJmb3JtUHJldmlvdXNQYWdlIgogICAgICAgICAgICAgICAgZGlzYWJsZWQkPSJbWyFfaGFzUHJldmlvdXNQYWdlXV0iCiAgICAgICAgICAgICAgICA+UHJldmlvdXMgcGFnZTwvcGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24KICAgICAgICAgICAgICAgIG9uLXRhcD0iX3BlcmZvcm1OZXh0UGFnZSIKICAgICAgICAgICAgICAgIGRpc2FibGVkJD0iW1shX2hhc05leHRQYWdlXV0iCiAgICAgICAgICAgICAgICA+TmV4dCBwYWdlPC9wYXBlci1idXR0b24KICAgICAgICAgICAgICA+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8ZGl2IGlkPSJpdGVtcyI+CiAgICAgICAgICAgIDxzbG90IG5hbWU9Iml0ZW1zIj48L3Nsb3Q+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfbXVsdGlwbGVQYWdlc0V4aXN0XV0iPgogICAgICAgICAgICA8ZGl2IGlkPSJjb250cm9scy1jb250YWluZXIiPgogICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgcGFkZGluZzogMCA1cHgiPgogICAgICAgICAgICAgICAgUGFnZQogICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0CiAgICAgICAgICAgICAgICAgIGlkPSJwYWdlLWlucHV0IgogICAgICAgICAgICAgICAgICB0eXBlPSJudW1iZXIiCiAgICAgICAgICAgICAgICAgIG5vLWxhYmVsLWZsb2F0PSIiCiAgICAgICAgICAgICAgICAgIG1pbj0iMSIKICAgICAgICAgICAgICAgICAgbWF4PSJbW19wYWdlQ291bnRdXSIKICAgICAgICAgICAgICAgICAgdmFsdWU9IltbX3BhZ2VJbnB1dFZhbHVlXV0iCiAgICAgICAgICAgICAgICAgIG9uLWlucHV0PSJfaGFuZGxlUGFnZUlucHV0RXZlbnQiCiAgICAgICAgICAgICAgICAgIG9uLWNoYW5nZT0iX2hhbmRsZVBhZ2VDaGFuZ2VFdmVudCIKICAgICAgICAgICAgICAgICAgb24tZm9jdXM9Il9oYW5kbGVQYWdlRm9jdXNFdmVudCIKICAgICAgICAgICAgICAgICAgb24tYmx1cj0iX2hhbmRsZVBhZ2VCbHVyRXZlbnQiCiAgICAgICAgICAgICAgICA+PC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgIG9mIFtbX3BhZ2VDb3VudF1dCiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmlnLXBhZ2UtYnV0dG9ucyIgc3R5bGU9Im1hcmdpbi10b3A6IDEwcHg7Ij4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgICBvbi10YXA9Il9wZXJmb3JtUHJldmlvdXNQYWdlIgogICAgICAgICAgICAgICAgZGlzYWJsZWQkPSJbWyFfaGFzUHJldmlvdXNQYWdlXV0iCiAgICAgICAgICAgICAgICA+UHJldmlvdXMgcGFnZTwvcGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24KICAgICAgICAgICAgICAgIG9uLXRhcD0iX3BlcmZvcm1OZXh0UGFnZSIKICAgICAgICAgICAgICAgIGRpc2FibGVkJD0iW1shX2hhc05leHRQYWdlXV0iCiAgICAgICAgICAgICAgICA+TmV4dCBwYWdlPC9wYXBlci1idXR0b24KICAgICAgICAgICAgICA+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgPC90ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbjogMCA1cHggMXB4IDEwcHg7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmaXJzdC1vZi10eXBlKSB7CiAgICAgICAgbWFyZ2luLXRvcDogMTBweDsKICAgICAgfQoKICAgICAgOmhvc3QoOmxhc3Qtb2YtdHlwZSkgewogICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7CiAgICAgIH0KCiAgICAgIC5oZWFkaW5nIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wcmltYXJ5LWJhY2tncm91bmQtY29sb3IpOwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZm9udC1zaXplOiAxNXB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgICAgIGJveC1zaGFkb3c6IDAgMXB4IDVweCB2YXIoLS10Yi1yYWlzZWQtYnV0dG9uLXNoYWRvdy1jb2xvcik7CiAgICAgICAgcGFkZGluZzogMTBweCAxNXB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KCiAgICAgIC5oZWFkaW5nOjotbW96LWZvY3VzLWlubmVyIHsKICAgICAgICBwYWRkaW5nOiAxMHB4IDE1cHg7CiAgICAgIH0KCiAgICAgIFtvcGVuLWJ1dHRvbl0gewogICAgICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDAgIWltcG9ydGFudDsKICAgICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMCAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBbb3Blbi1idXR0b25dIC5leHBhbmQtYXJyb3cgewogICAgICAgIHRyYW5zZm9ybTogcm90YXRlWigxODBkZWcpOwogICAgICB9CgogICAgICAubmFtZSB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLmxpZ2h0IHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS01MDApOwogICAgICB9CgogICAgICAuY2F0ZWdvcnktbmFtZSB7CiAgICAgICAgd2hpdGUtc3BhY2U6IHByZTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIHBhZGRpbmc6IDJweCAwOwogICAgICB9CgogICAgICAuY291bnQgewogICAgICAgIG1hcmdpbjogMCA1cHg7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTUwMCk7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGZsZXg6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5oZWFkaW5nOjotbW96LWZvY3VzLWlubmVyIHsKICAgICAgICBwYWRkaW5nOiAxMHB4IDE1cHg7CiAgICAgIH0KCiAgICAgIC5jb250ZW50IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yKTsKICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAycHg7CiAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDJweDsKICAgICAgICBib3JkZXItdG9wOiBub25lOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkZWRlZGU7CiAgICAgICAgcGFkZGluZzogMTVweDsKICAgICAgfQoKICAgICAgLmxpZ2h0IHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS01MDApOwogICAgICB9CgogICAgICAjY29udHJvbHMtY29udGFpbmVyIHsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAjY29udHJvbHMtY29udGFpbmVyIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICAuYmlnLXBhZ2UtYnV0dG9ucyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLmJpZy1wYWdlLWJ1dHRvbnMgcGFwZXItYnV0dG9uIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICAgIGNvbG9yOiB2YXIoLS10Yi11aS1kYXJrLWFjY2VudCk7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGZsZXgtYmFzaXM6IDA7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgfQoKICAgICAgLmJpZy1wYWdlLWJ1dHRvbnMgcGFwZXItYnV0dG9uW2Rpc2FibGVkXSB7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgfQoKICAgICAgc2xvdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgfQoKICAgICAgOjpzbG90dGVkKFtzbG90PSdpdGVtcyddKSB7CiAgICAgICAgLyogVG9vbHRpcCBmb3IgZGVzY3JpcHRpb25zIGFuZCBvdGhlcnMgYnJlYWsgd2l0aCBtb3JlIHN0cmljdCBvbmVzLiAqLwogICAgICAgIGNvbnRhaW46IHN0eWxlOwogICAgICB9CgogICAgICAjcGFnZS1pbnB1dCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiB2YXIoLS10Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldy1wYWdlLWlucHV0LXdpZHRoLCAxMDAlKTsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLENsLnByb3RvdHlwZSwiY2F0ZWdvcnkiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxDbC5wcm90b3R5cGUsImluaXRpYWxPcGVuZWQiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFuLG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sQ2wucHJvdG90eXBlLCJvcGVuZWQiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxDbC5wcm90b3R5cGUsImRpc2FibGVQYWdpbmF0aW9uIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyLGNvbXB1dGVkOiJfY29tcHV0ZUNvdW50KGNhdGVnb3J5Lml0ZW1zLiopIn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxDbC5wcm90b3R5cGUsIl9jb3VudCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlUGFuZVJlbmRlcmVkKGNhdGVnb3J5KSIsb2JzZXJ2ZXI6Il9vblBhbmVSZW5kZXJlZENoYW5nZWQifSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxDbC5wcm90b3R5cGUsIl9wYW5lUmVuZGVyZWQiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFuLGNvbXB1dGVkOiJfY29tcHV0ZUlzU2VhcmNoUmVzdWx0cyhjYXRlZ29yeS5tZXRhZGF0YS50eXBlKSJ9KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLENsLnByb3RvdHlwZSwiX2lzU2VhcmNoUmVzdWx0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4sY29tcHV0ZWQ6Il9jb21wdXRlSXNJbnZhbGlkU2VhcmNoUmVzdWx0cyhjYXRlZ29yeS5tZXRhZGF0YSkifSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxDbC5wcm90b3R5cGUsIl9pc0ludmFsaWRTZWFyY2hSZXN1bHRzIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbixjb21wdXRlZDoiX2NvbXB1dGVJc1VuaXZlcnNhbFNlYXJjaFF1ZXJ5KGNhdGVnb3J5Lm1ldGFkYXRhKSJ9KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLENsLnByb3RvdHlwZSwiX2lzVW5pdmVyc2FsU2VhcmNoUXVlcnkiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il9nZXRDYXRlZ29yeUl0ZW1LZXlDaGFuZ2VkIn0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxDbC5wcm90b3R5cGUsImdldENhdGVnb3J5SXRlbUtleSIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcixvYnNlcnZlcjoiX2xpbWl0Q2hhbmdlZCJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sQ2wucHJvdG90eXBlLCJfbGltaXQiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sQ2wucHJvdG90eXBlLCJfYWN0aXZlSW5kZXgiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXIsY29tcHV0ZWQ6Il9jb21wdXRlUGFnZUNvdW50KGNhdGVnb3J5Lml0ZW1zLiosIF9saW1pdCkifSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLENsLnByb3RvdHlwZSwiX3BhZ2VDb3VudCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVJbnB1dFdpZHRoKF9wYWdlQ291bnQpIixvYnNlcnZlcjoiX3VwZGF0ZUlucHV0V2lkdGgifSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLENsLnByb3RvdHlwZSwiX2lucHV0V2lkdGgiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlUGFnZUlucHV0VmFsdWUoX3BhZ2VJbnB1dEZvY3VzZWQsIF9wYWdlSW5wdXRSYXdWYWx1ZSwgX2N1cnJlbnRQYWdlKSIsb2JzZXJ2ZXI6Il91cGRhdGVQYWdlSW5wdXRWYWx1ZSJ9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sQ2wucHJvdG90eXBlLCJfcGFnZUlucHV0VmFsdWUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sQ2wucHJvdG90eXBlLCJfcGFnZUlucHV0UmF3VmFsdWUiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxDbC5wcm90b3R5cGUsIl9wYWdlSW5wdXRGb2N1c2VkIix2b2lkIDApLHQoW3MoIl9jb3VudCIpLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxDbC5wcm90b3R5cGUsIl9oYXNNdWx0aXBsZSIsbnVsbCksdChbYSgib3BlbmVkIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW0Jvb2xlYW5dKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sQ2wucHJvdG90eXBlLCJfY2hhbmdlQ29udGVudEFjdGl2ZSIsbnVsbCksdChbcygib3BlbmVkIiwiX3BhbmVSZW5kZXJlZCIpLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxDbC5wcm90b3R5cGUsIl9pdGVtc1JlbmRlcmVkIixudWxsKSx0KFthKCJfaXRlbXNSZW5kZXJlZCIsImNhdGVnb3J5Lml0ZW1zLioiLCJfbGltaXQiLCJfYWN0aXZlSW5kZXgiLCJfcGFnZUNvdW50IiwiZGlzYWJsZVBhZ2luYXRpb24iKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLENsLnByb3RvdHlwZSwiX3VwZGF0ZVJlbmRlcmVkSXRlbXMiLG51bGwpLHQoW3MoIl9saW1pdCIsIl9hY3RpdmVJbmRleCIpLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLENsLnByb3RvdHlwZSwiX2N1cnJlbnRQYWdlIixudWxsKSx0KFtzKCJfcGFnZUNvdW50IiwiZGlzYWJsZVBhZ2luYXRpb24iKSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sQ2wucHJvdG90eXBlLCJfbXVsdGlwbGVQYWdlc0V4aXN0IixudWxsKSx0KFtzKCJfY3VycmVudFBhZ2UiKSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sQ2wucHJvdG90eXBlLCJfaGFzUHJldmlvdXNQYWdlIixudWxsKSx0KFtzKCJfY3VycmVudFBhZ2UiLCJfcGFnZUNvdW50IiksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLENsLnByb3RvdHlwZSwiX2hhc05leHRQYWdlIixudWxsKSx0KFthKCJjYXRlZ29yeS5pdGVtcy4qIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxDbC5wcm90b3R5cGUsIl9jbGFtcEFjdGl2ZUluZGV4IixudWxsKSxDbD10KFtpKCJ0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldyIpXSxDbCk7Y2xhc3MgQWx7Y29uc3RydWN0b3IodCl7dGhpcy5saXN0ZW5lcj10fX1jbGFzcyBrbHtjb25zdHJ1Y3Rvcigpe3RoaXMucmVxdWVzdE1hbmFnZXI9bmV3IGJyKDEpLHRoaXMuX2xpc3RlbmVycz1uZXcgU2V0LHRoaXMuaW5pdGlhbGl6ZWQ9ITF9cmVmcmVzaCgpe3JldHVybiB0aGlzLmxvYWQoKS50aGVuKCgoKT0+e3RoaXMuaW5pdGlhbGl6ZWQ9ITB9KSl9YWRkTGlzdGVuZXIodCl7Y29uc3QgZT1uZXcgQWwodCk7cmV0dXJuIHRoaXMuX2xpc3RlbmVycy5hZGQoZSksZX1yZW1vdmVMaXN0ZW5lckJ5S2V5KHQpe3RoaXMuX2xpc3RlbmVycy5kZWxldGUodCl9ZW1pdENoYW5nZSgpe3RoaXMuX2xpc3RlbmVycy5mb3JFYWNoKCh0PT57dHJ5e3QubGlzdGVuZXIoKX1jYXRjaCh0KXt9fSkpfX1jbGFzcyBMbCBleHRlbmRzIGtse2xvYWQoKXtjb25zdCB0PUVyKCkuZW52aXJvbm1lbnQoKTtyZXR1cm4gdGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHQpLnRoZW4oKHQ9Pntjb25zdCBlPXtkYXRhTG9jYXRpb246dC5kYXRhX2xvY2F0aW9uLHdpbmRvd1RpdGxlOnQud2luZG93X3RpdGxlfTt2b2lkIDAhPT10LmV4cGVyaW1lbnRfbmFtZSYmKGUuZXhwZXJpbWVudE5hbWU9dC5leHBlcmltZW50X25hbWUpLHZvaWQgMCE9PXQuZXhwZXJpbWVudF9kZXNjcmlwdGlvbiYmKGUuZXhwZXJpbWVudERlc2NyaXB0aW9uPXQuZXhwZXJpbWVudF9kZXNjcmlwdGlvbiksdm9pZCAwIT09dC5jcmVhdGlvbl90aW1lJiYoZS5jcmVhdGlvblRpbWU9dC5jcmVhdGlvbl90aW1lKSxDZS5leHBvcnRzLmlzRXF1YWwodGhpcy5lbnZpcm9ubWVudCxlKXx8KHRoaXMuZW52aXJvbm1lbnQ9ZSx0aGlzLmVtaXRDaGFuZ2UoKSl9KSl9Z2V0RGF0YUxvY2F0aW9uKCl7cmV0dXJuIHRoaXMuZW52aXJvbm1lbnQ/dGhpcy5lbnZpcm9ubWVudC5kYXRhTG9jYXRpb246IiJ9Z2V0V2luZG93VGl0bGUoKXtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudD90aGlzLmVudmlyb25tZW50LndpbmRvd1RpdGxlOiIifWdldEV4cGVyaW1lbnROYW1lKCl7cmV0dXJuIHRoaXMuZW52aXJvbm1lbnQ/dGhpcy5lbnZpcm9ubWVudC5leHBlcmltZW50TmFtZToiIn1nZXRFeHBlcmltZW50RGVzY3JpcHRpb24oKXtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudD90aGlzLmVudmlyb25tZW50LmV4cGVyaW1lbnREZXNjcmlwdGlvbjoiIn1nZXRDcmVhdGlvblRpbWUoKXtyZXR1cm4gdGhpcy5lbnZpcm9ubWVudD90aGlzLmVudmlyb25tZW50LmNyZWF0aW9uVGltZTpudWxsfX1jb25zdCBQbD1uZXcgTGw7Y2xhc3MgTmwgZXh0ZW5kcyBrbHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5fcnVucz1bXX1sb2FkKCl7Y29uc3QgdD1FcigpLnJ1bnMoKTtyZXR1cm4gdGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHQpLnRoZW4oKHQ9PntDZS5leHBvcnRzLmlzRXF1YWwodGhpcy5fcnVucyx0KXx8KHRoaXMuX3J1bnM9dCx0aGlzLmVtaXRDaGFuZ2UoKSl9KSl9Z2V0UnVucygpe3JldHVybiB0aGlzLl9ydW5zLnNsaWNlKCl9fWNvbnN0IElsPW5ldyBObDtmdW5jdGlvbiBSbCh0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6dD49ZT8wOk5hTn1mdW5jdGlvbiBPbCh0KXtyZXR1cm4gMT09PXQubGVuZ3RoJiYodD0oZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXtyZXR1cm4gUmwodChlKSxuKX19KSh0KSkse2xlZnQ6ZnVuY3Rpb24oZSxuLGkscil7Zm9yKG51bGw9PWkmJihpPTApLG51bGw9PXImJihyPWUubGVuZ3RoKTtpPHI7KXt2YXIgbz1pK3I+Pj4xO3QoZVtvXSxuKTwwP2k9bysxOnI9b31yZXR1cm4gaX0scmlnaHQ6ZnVuY3Rpb24oZSxuLGkscil7Zm9yKG51bGw9PWkmJihpPTApLG51bGw9PXImJihyPWUubGVuZ3RoKTtpPHI7KXt2YXIgbz1pK3I+Pj4xO3QoZVtvXSxuKT4wP3I9bzppPW8rMX1yZXR1cm4gaX19fXZhciB6bD1PbChSbCksRGw9emwucmlnaHQsQmw9emwubGVmdDtmdW5jdGlvbiBIbCh0LGUpe3JldHVyblt0LGVdfWZ1bmN0aW9uIEZsKHQsZSxuKXt2YXIgaSxyLG8sYSxzPXQubGVuZ3RoLGw9ZS5sZW5ndGgsYz1uZXcgQXJyYXkocypsKTtmb3IobnVsbD09biYmKG49SGwpLGk9bz0wO2k8czsrK2kpZm9yKGE9dFtpXSxyPTA7cjxsOysrciwrK28pY1tvXT1uKGEsZVtyXSk7cmV0dXJuIGN9ZnVuY3Rpb24gVmwodCl7cmV0dXJuIG51bGw9PT10P05hTjordH1mdW5jdGlvbiBVbCh0LGUpe3ZhciBuLGkscj10Lmxlbmd0aCxvPTAsYT0tMSxzPTAsbD0wO2lmKG51bGw9PWUpZm9yKDsrK2E8cjspaXNOYU4obj1WbCh0W2FdKSl8fChsKz0oaT1uLXMpKihuLShzKz1pLysrbykpKTtlbHNlIGZvcig7KythPHI7KWlzTmFOKG49VmwoZSh0W2FdLGEsdCkpKXx8KGwrPShpPW4tcykqKG4tKHMrPWkvKytvKSkpO2lmKG8+MSlyZXR1cm4gbC8oby0xKX1mdW5jdGlvbiBqbCh0LGUpe3ZhciBuPVVsKHQsZSk7cmV0dXJuIG4/TWF0aC5zcXJ0KG4pOm59ZnVuY3Rpb24gR2wodCxlKXt2YXIgbixpLHIsbz10Lmxlbmd0aCxhPS0xO2lmKG51bGw9PWUpe2Zvcig7KythPG87KWlmKG51bGwhPShuPXRbYV0pJiZuPj1uKWZvcihpPXI9bjsrK2E8bzspbnVsbCE9KG49dFthXSkmJihpPm4mJihpPW4pLHI8biYmKHI9bikpfWVsc2UgZm9yKDsrK2E8bzspaWYobnVsbCE9KG49ZSh0W2FdLGEsdCkpJiZuPj1uKWZvcihpPXI9bjsrK2E8bzspbnVsbCE9KG49ZSh0W2FdLGEsdCkpJiYoaT5uJiYoaT1uKSxyPG4mJihyPW4pKTtyZXR1cm5baSxyXX12YXIgV2w9QXJyYXkucHJvdG90eXBlLHFsPVdsLnNsaWNlLFlsPVdsLm1hcDtmdW5jdGlvbiBYbCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gJGwodCl7cmV0dXJuIHR9ZnVuY3Rpb24gS2wodCxlLG4pe3Q9K3QsZT0rZSxuPShyPWFyZ3VtZW50cy5sZW5ndGgpPDI/KGU9dCx0PTAsMSk6cjwzPzE6K247Zm9yKHZhciBpPS0xLHI9MHxNYXRoLm1heCgwLE1hdGguY2VpbCgoZS10KS9uKSksbz1uZXcgQXJyYXkocik7KytpPHI7KW9baV09dCtpKm47cmV0dXJuIG99dmFyIFpsPU1hdGguc3FydCg1MCksSmw9TWF0aC5zcXJ0KDEwKSxRbD1NYXRoLnNxcnQoMik7ZnVuY3Rpb24gdGModCxlLG4pe3ZhciBpLHIsbyxhLHM9LTE7aWYobj0rbiwodD0rdCk9PT0oZT0rZSkmJm4+MClyZXR1cm5bdF07aWYoKGk9ZTx0KSYmKHI9dCx0PWUsZT1yKSwwPT09KGE9ZWModCxlLG4pKXx8IWlzRmluaXRlKGEpKXJldHVybltdO2lmKGE+MClmb3IodD1NYXRoLmNlaWwodC9hKSxlPU1hdGguZmxvb3IoZS9hKSxvPW5ldyBBcnJheShyPU1hdGguY2VpbChlLXQrMSkpOysrczxyOylvW3NdPSh0K3MpKmE7ZWxzZSBmb3IodD1NYXRoLmZsb29yKHQqYSksZT1NYXRoLmNlaWwoZSphKSxvPW5ldyBBcnJheShyPU1hdGguY2VpbCh0LWUrMSkpOysrczxyOylvW3NdPSh0LXMpL2E7cmV0dXJuIGkmJm8ucmV2ZXJzZSgpLG99ZnVuY3Rpb24gZWModCxlLG4pe3ZhciBpPShlLXQpL01hdGgubWF4KDAsbikscj1NYXRoLmZsb29yKE1hdGgubG9nKGkpL01hdGguTE4xMCksbz1pL01hdGgucG93KDEwLHIpO3JldHVybiByPj0wPyhvPj1abD8xMDpvPj1KbD81Om8+PVFsPzI6MSkqTWF0aC5wb3coMTAscik6LU1hdGgucG93KDEwLC1yKS8obz49Wmw/MTA6bz49Smw/NTpvPj1RbD8yOjEpfWZ1bmN0aW9uIG5jKHQsZSxuKXt2YXIgaT1NYXRoLmFicyhlLXQpL01hdGgubWF4KDAsbikscj1NYXRoLnBvdygxMCxNYXRoLmZsb29yKE1hdGgubG9nKGkpL01hdGguTE4xMCkpLG89aS9yO3JldHVybiBvPj1abD9yKj0xMDpvPj1KbD9yKj01Om8+PVFsJiYocio9MiksZTx0Py1yOnJ9ZnVuY3Rpb24gaWModCl7cmV0dXJuIE1hdGguY2VpbChNYXRoLmxvZyh0Lmxlbmd0aCkvTWF0aC5MTjIpKzF9ZnVuY3Rpb24gcmModCxlLG4pe2lmKG51bGw9PW4mJihuPVZsKSxpPXQubGVuZ3RoKXtpZigoZT0rZSk8PTB8fGk8MilyZXR1cm4rbih0WzBdLDAsdCk7aWYoZT49MSlyZXR1cm4rbih0W2ktMV0saS0xLHQpO3ZhciBpLHI9KGktMSkqZSxvPU1hdGguZmxvb3IociksYT0rbih0W29dLG8sdCk7cmV0dXJuIGErKCtuKHRbbysxXSxvKzEsdCktYSkqKHItbyl9fWZ1bmN0aW9uIG9jKHQsZSl7dmFyIG4saSxyPXQubGVuZ3RoLG89LTE7aWYobnVsbD09ZSl7Zm9yKDsrK288cjspaWYobnVsbCE9KG49dFtvXSkmJm4+PW4pZm9yKGk9bjsrK288cjspbnVsbCE9KG49dFtvXSkmJm4+aSYmKGk9bil9ZWxzZSBmb3IoOysrbzxyOylpZihudWxsIT0obj1lKHRbb10sbyx0KSkmJm4+PW4pZm9yKGk9bjsrK288cjspbnVsbCE9KG49ZSh0W29dLG8sdCkpJiZuPmkmJihpPW4pO3JldHVybiBpfWZ1bmN0aW9uIGFjKHQpe2Zvcih2YXIgZSxuLGkscj10Lmxlbmd0aCxvPS0xLGE9MDsrK288cjspYSs9dFtvXS5sZW5ndGg7Zm9yKG49bmV3IEFycmF5KGEpOy0tcj49MDspZm9yKGU9KGk9dFtyXSkubGVuZ3RoOy0tZT49MDspblstLWFdPWlbZV07cmV0dXJuIG59ZnVuY3Rpb24gc2ModCxlKXt2YXIgbixpLHI9dC5sZW5ndGgsbz0tMTtpZihudWxsPT1lKXtmb3IoOysrbzxyOylpZihudWxsIT0obj10W29dKSYmbj49bilmb3IoaT1uOysrbzxyOyludWxsIT0obj10W29dKSYmaT5uJiYoaT1uKX1lbHNlIGZvcig7KytvPHI7KWlmKG51bGwhPShuPWUodFtvXSxvLHQpKSYmbj49bilmb3IoaT1uOysrbzxyOyludWxsIT0obj1lKHRbb10sbyx0KSkmJmk+biYmKGk9bik7cmV0dXJuIGl9ZnVuY3Rpb24gbGModCl7aWYoIShyPXQubGVuZ3RoKSlyZXR1cm5bXTtmb3IodmFyIGU9LTEsbj1zYyh0LGNjKSxpPW5ldyBBcnJheShuKTsrK2U8bjspZm9yKHZhciByLG89LTEsYT1pW2VdPW5ldyBBcnJheShyKTsrK288cjspYVtvXT10W29dW2VdO3JldHVybiBpfWZ1bmN0aW9uIGNjKHQpe3JldHVybiB0Lmxlbmd0aH12YXIgdWM9QXJyYXkucHJvdG90eXBlLnNsaWNlO2Z1bmN0aW9uIGhjKHQpe3JldHVybiB0fXZhciBkYz0xZS02O2Z1bmN0aW9uIHBjKHQpe3JldHVybiJ0cmFuc2xhdGUoIisodCsuNSkrIiwwKSJ9ZnVuY3Rpb24gZmModCl7cmV0dXJuInRyYW5zbGF0ZSgwLCIrKHQrLjUpKyIpIn1mdW5jdGlvbiBtYyh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuK3QoZSl9fWZ1bmN0aW9uIGdjKHQpe3ZhciBlPU1hdGgubWF4KDAsdC5iYW5kd2lkdGgoKS0xKS8yO3JldHVybiB0LnJvdW5kKCkmJihlPU1hdGgucm91bmQoZSkpLGZ1bmN0aW9uKG4pe3JldHVybit0KG4pK2V9fWZ1bmN0aW9uIF9jKCl7cmV0dXJuIXRoaXMuX19heGlzfWZ1bmN0aW9uIHljKHQsZSl7dmFyIG49W10saT1udWxsLHI9bnVsbCxvPTYsYT02LHM9MyxsPTE9PT10fHw0PT09dD8tMToxLGM9ND09PXR8fDI9PT10PyJ4IjoieSIsdT0xPT09dHx8Mz09PXQ/cGM6ZmM7ZnVuY3Rpb24gaChoKXt2YXIgZD1udWxsPT1pP2UudGlja3M/ZS50aWNrcy5hcHBseShlLG4pOmUuZG9tYWluKCk6aSxwPW51bGw9PXI/ZS50aWNrRm9ybWF0P2UudGlja0Zvcm1hdC5hcHBseShlLG4pOmhjOnIsZj1NYXRoLm1heChvLDApK3MsbT1lLnJhbmdlKCksZz0rbVswXSsuNSxfPSttW20ubGVuZ3RoLTFdKy41LHk9KGUuYmFuZHdpZHRoP2djOm1jKShlLmNvcHkoKSksdj1oLnNlbGVjdGlvbj9oLnNlbGVjdGlvbigpOmgsYj12LnNlbGVjdEFsbCgiLmRvbWFpbiIpLmRhdGEoW251bGxdKSx4PXYuc2VsZWN0QWxsKCIudGljayIpLmRhdGEoZCxlKS5vcmRlcigpLHc9eC5leGl0KCksUz14LmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJ0aWNrIiksTT14LnNlbGVjdCgibGluZSIpLEU9eC5zZWxlY3QoInRleHQiKTtiPWIubWVyZ2UoYi5lbnRlcigpLmluc2VydCgicGF0aCIsIi50aWNrIikuYXR0cigiY2xhc3MiLCJkb21haW4iKS5hdHRyKCJzdHJva2UiLCJjdXJyZW50Q29sb3IiKSkseD14Lm1lcmdlKFMpLE09TS5tZXJnZShTLmFwcGVuZCgibGluZSIpLmF0dHIoInN0cm9rZSIsImN1cnJlbnRDb2xvciIpLmF0dHIoYysiMiIsbCpvKSksRT1FLm1lcmdlKFMuYXBwZW5kKCJ0ZXh0IikuYXR0cigiZmlsbCIsImN1cnJlbnRDb2xvciIpLmF0dHIoYyxsKmYpLmF0dHIoImR5IiwxPT09dD8iMGVtIjozPT09dD8iMC43MWVtIjoiMC4zMmVtIikpLGghPT12JiYoYj1iLnRyYW5zaXRpb24oaCkseD14LnRyYW5zaXRpb24oaCksTT1NLnRyYW5zaXRpb24oaCksRT1FLnRyYW5zaXRpb24oaCksdz13LnRyYW5zaXRpb24oaCkuYXR0cigib3BhY2l0eSIsZGMpLmF0dHIoInRyYW5zZm9ybSIsKGZ1bmN0aW9uKHQpe3JldHVybiBpc0Zpbml0ZSh0PXkodCkpP3UodCk6dGhpcy5nZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIpfSkpLFMuYXR0cigib3BhY2l0eSIsZGMpLmF0dHIoInRyYW5zZm9ybSIsKGZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMucGFyZW50Tm9kZS5fX2F4aXM7cmV0dXJuIHUoZSYmaXNGaW5pdGUoZT1lKHQpKT9lOnkodCkpfSkpKSx3LnJlbW92ZSgpLGIuYXR0cigiZCIsND09PXR8fDI9PXQ/YT8iTSIrbCphKyIsIitnKyJIMC41ViIrXysiSCIrbCphOiJNMC41LCIrZysiViIrXzphPyJNIitnKyIsIitsKmErIlYwLjVIIitfKyJWIitsKmE6Ik0iK2crIiwwLjVIIitfKSx4LmF0dHIoIm9wYWNpdHkiLDEpLmF0dHIoInRyYW5zZm9ybSIsKGZ1bmN0aW9uKHQpe3JldHVybiB1KHkodCkpfSkpLE0uYXR0cihjKyIyIixsKm8pLEUuYXR0cihjLGwqZikudGV4dChwKSx2LmZpbHRlcihfYykuYXR0cigiZmlsbCIsIm5vbmUiKS5hdHRyKCJmb250LXNpemUiLDEwKS5hdHRyKCJmb250LWZhbWlseSIsInNhbnMtc2VyaWYiKS5hdHRyKCJ0ZXh0LWFuY2hvciIsMj09PXQ/InN0YXJ0Ijo0PT09dD8iZW5kIjoibWlkZGxlIiksdi5lYWNoKChmdW5jdGlvbigpe3RoaXMuX19heGlzPXl9KSl9cmV0dXJuIGguc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxoKTplfSxoLnRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIG49dWMuY2FsbChhcmd1bWVudHMpLGh9LGgudGlja0FyZ3VtZW50cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1udWxsPT10P1tdOnVjLmNhbGwodCksaCk6bi5zbGljZSgpfSxoLnRpY2tWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09dD9udWxsOnVjLmNhbGwodCksaCk6aSYmaS5zbGljZSgpfSxoLnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxoKTpyfSxoLnRpY2tTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWE9K3QsaCk6b30saC50aWNrU2l6ZUlubmVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSt0LGgpOm99LGgudGlja1NpemVPdXRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0rdCxoKTphfSxoLnRpY2tQYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSt0LGgpOnN9LGh9ZnVuY3Rpb24gdmModCl7cmV0dXJuIHljKDMsdCl9ZnVuY3Rpb24gYmModCl7cmV0dXJuIHljKDQsdCl9dmFyIHhjPXt2YWx1ZTpmdW5jdGlvbigpe319O2Z1bmN0aW9uIHdjKCl7Zm9yKHZhciB0LGU9MCxuPWFyZ3VtZW50cy5sZW5ndGgsaT17fTtlPG47KytlKXtpZighKHQ9YXJndW1lbnRzW2VdKyIiKXx8dCBpbiBpfHwvW1xzLl0vLnRlc3QodCkpdGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIHR5cGU6ICIrdCk7aVt0XT1bXX1yZXR1cm4gbmV3IFNjKGkpfWZ1bmN0aW9uIFNjKHQpe3RoaXMuXz10fWZ1bmN0aW9uIE1jKHQsZSl7cmV0dXJuIHQudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcCgoZnVuY3Rpb24odCl7dmFyIG49IiIsaT10LmluZGV4T2YoIi4iKTtpZihpPj0wJiYobj10LnNsaWNlKGkrMSksdD10LnNsaWNlKDAsaSkpLHQmJiFlLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO3JldHVybnt0eXBlOnQsbmFtZTpufX0pKX1mdW5jdGlvbiBFYyh0LGUpe2Zvcih2YXIgbixpPTAscj10Lmxlbmd0aDtpPHI7KytpKWlmKChuPXRbaV0pLm5hbWU9PT1lKXJldHVybiBuLnZhbHVlfWZ1bmN0aW9uIFRjKHQsZSxuKXtmb3IodmFyIGk9MCxyPXQubGVuZ3RoO2k8cjsrK2kpaWYodFtpXS5uYW1lPT09ZSl7dFtpXT14Yyx0PXQuc2xpY2UoMCxpKS5jb25jYXQodC5zbGljZShpKzEpKTticmVha31yZXR1cm4gbnVsbCE9biYmdC5wdXNoKHtuYW1lOmUsdmFsdWU6bn0pLHR9U2MucHJvdG90eXBlPXdjLnByb3RvdHlwZT17Y29uc3RydWN0b3I6U2Msb246ZnVuY3Rpb24odCxlKXt2YXIgbixpPXRoaXMuXyxyPU1jKHQrIiIsaSksbz0tMSxhPXIubGVuZ3RoO2lmKCEoYXJndW1lbnRzLmxlbmd0aDwyKSl7aWYobnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrOiAiK2UpO2Zvcig7KytvPGE7KWlmKG49KHQ9cltvXSkudHlwZSlpW25dPVRjKGlbbl0sdC5uYW1lLGUpO2Vsc2UgaWYobnVsbD09ZSlmb3IobiBpbiBpKWlbbl09VGMoaVtuXSx0Lm5hbWUsbnVsbCk7cmV0dXJuIHRoaXN9Zm9yKDsrK288YTspaWYoKG49KHQ9cltvXSkudHlwZSkmJihuPUVjKGlbbl0sdC5uYW1lKSkpcmV0dXJuIG59LGNvcHk6ZnVuY3Rpb24oKXt2YXIgdD17fSxlPXRoaXMuXztmb3IodmFyIG4gaW4gZSl0W25dPWVbbl0uc2xpY2UoKTtyZXR1cm4gbmV3IFNjKHQpfSxjYWxsOmZ1bmN0aW9uKHQsZSl7aWYoKG49YXJndW1lbnRzLmxlbmd0aC0yKT4wKWZvcih2YXIgbixpLHI9bmV3IEFycmF5KG4pLG89MDtvPG47KytvKXJbb109YXJndW1lbnRzW28rMl07aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3Iobz0wLG49KGk9dGhpcy5fW3RdKS5sZW5ndGg7bzxuOysrbylpW29dLnZhbHVlLmFwcGx5KGUscil9LGFwcGx5OmZ1bmN0aW9uKHQsZSxuKXtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO2Zvcih2YXIgaT10aGlzLl9bdF0scj0wLG89aS5sZW5ndGg7cjxvOysrcilpW3JdLnZhbHVlLmFwcGx5KGUsbil9fTt2YXIgQ2M9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLEFjPXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDpDYyx4bGluazoiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIseG1sOiJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLHhtbG5zOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyJ9O2Z1bmN0aW9uIGtjKHQpe3ZhciBlPXQrPSIiLG49ZS5pbmRleE9mKCI6Iik7cmV0dXJuIG4+PTAmJiJ4bWxucyIhPT0oZT10LnNsaWNlKDAsbikpJiYodD10LnNsaWNlKG4rMSkpLEFjLmhhc093blByb3BlcnR5KGUpP3tzcGFjZTpBY1tlXSxsb2NhbDp0fTp0fWZ1bmN0aW9uIExjKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXRoaXMub3duZXJEb2N1bWVudCxuPXRoaXMubmFtZXNwYWNlVVJJO3JldHVybiBuPT09Q2MmJmUuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSST09PUNjP2UuY3JlYXRlRWxlbWVudCh0KTplLmNyZWF0ZUVsZW1lbnROUyhuLHQpfX1mdW5jdGlvbiBQYyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh0LnNwYWNlLHQubG9jYWwpfX1mdW5jdGlvbiBOYyh0KXt2YXIgZT1rYyh0KTtyZXR1cm4oZS5sb2NhbD9QYzpMYykoZSl9ZnVuY3Rpb24gSWMoKXt9ZnVuY3Rpb24gUmModCl7cmV0dXJuIG51bGw9PXQ/SWM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHQpfX1mdW5jdGlvbiBPYygpe3JldHVybltdfWZ1bmN0aW9uIHpjKHQpe3JldHVybiBudWxsPT10P09jOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbCh0KX19ZnVuY3Rpb24gRGModCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF0Y2hlcyh0KX19ZnVuY3Rpb24gQmModCl7cmV0dXJuIG5ldyBBcnJheSh0Lmxlbmd0aCl9ZnVuY3Rpb24gSGModCxlKXt0aGlzLm93bmVyRG9jdW1lbnQ9dC5vd25lckRvY3VtZW50LHRoaXMubmFtZXNwYWNlVVJJPXQubmFtZXNwYWNlVVJJLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9wYXJlbnQ9dCx0aGlzLl9fZGF0YV9fPWV9SGMucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpIYyxhcHBlbmRDaGlsZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LHRoaXMuX25leHQpfSxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LGUpfSxxdWVyeVNlbGVjdG9yOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3Rvcih0KX0scXVlcnlTZWxlY3RvckFsbDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCl9fTtmdW5jdGlvbiBGYyh0LGUsbixpLHIsbyl7Zm9yKHZhciBhLHM9MCxsPWUubGVuZ3RoLGM9by5sZW5ndGg7czxjOysrcykoYT1lW3NdKT8oYS5fX2RhdGFfXz1vW3NdLGlbc109YSk6bltzXT1uZXcgSGModCxvW3NdKTtmb3IoO3M8bDsrK3MpKGE9ZVtzXSkmJihyW3NdPWEpfWZ1bmN0aW9uIFZjKHQsZSxuLGkscixvLGEpe3ZhciBzLGwsYyx1PXt9LGg9ZS5sZW5ndGgsZD1vLmxlbmd0aCxwPW5ldyBBcnJheShoKTtmb3Iocz0wO3M8aDsrK3MpKGw9ZVtzXSkmJihwW3NdPWM9IiQiK2EuY2FsbChsLGwuX19kYXRhX18scyxlKSxjIGluIHU/cltzXT1sOnVbY109bCk7Zm9yKHM9MDtzPGQ7KytzKShsPXVbYz0iJCIrYS5jYWxsKHQsb1tzXSxzLG8pXSk/KGlbc109bCxsLl9fZGF0YV9fPW9bc10sdVtjXT1udWxsKTpuW3NdPW5ldyBIYyh0LG9bc10pO2ZvcihzPTA7czxoOysrcykobD1lW3NdKSYmdVtwW3NdXT09PWwmJihyW3NdPWwpfWZ1bmN0aW9uIFVjKHQsZSl7cmV0dXJuIHQ8ZT8tMTp0PmU/MTp0Pj1lPzA6TmFOfWZ1bmN0aW9uIGpjKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX1mdW5jdGlvbiBHYyh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIFdjKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUodCxlKX19ZnVuY3Rpb24gcWModCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxlKX19ZnVuY3Rpb24gWWModCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1uP3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpOnRoaXMuc2V0QXR0cmlidXRlKHQsbil9fWZ1bmN0aW9uIFhjKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09bj90aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk6dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsbil9fWZ1bmN0aW9uICRjKHQpe3JldHVybiB0Lm93bmVyRG9jdW1lbnQmJnQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8dC5kb2N1bWVudCYmdHx8dC5kZWZhdWx0Vmlld31mdW5jdGlvbiBLYyh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfX1mdW5jdGlvbiBaYyh0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSh0LGUsbil9fWZ1bmN0aW9uIEpjKHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaT1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1pP3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCk6dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSh0LGksbil9fWZ1bmN0aW9uIFFjKHQsZSl7cmV0dXJuIHQuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShlKXx8JGModCkuZ2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpLmdldFByb3BlcnR5VmFsdWUoZSl9ZnVuY3Rpb24gdHUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbdF19fWZ1bmN0aW9uIGV1KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpc1t0XT1lfX1mdW5jdGlvbiBudSh0LGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PW4/ZGVsZXRlIHRoaXNbdF06dGhpc1t0XT1ufX1mdW5jdGlvbiBpdSh0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLyl9ZnVuY3Rpb24gcnUodCl7cmV0dXJuIHQuY2xhc3NMaXN0fHxuZXcgb3UodCl9ZnVuY3Rpb24gb3UodCl7dGhpcy5fbm9kZT10LHRoaXMuX25hbWVzPWl1KHQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9ZnVuY3Rpb24gYXUodCxlKXtmb3IodmFyIG49cnUodCksaT0tMSxyPWUubGVuZ3RoOysraTxyOyluLmFkZChlW2ldKX1mdW5jdGlvbiBzdSh0LGUpe2Zvcih2YXIgbj1ydSh0KSxpPS0xLHI9ZS5sZW5ndGg7KytpPHI7KW4ucmVtb3ZlKGVbaV0pfWZ1bmN0aW9uIGx1KHQpe3JldHVybiBmdW5jdGlvbigpe2F1KHRoaXMsdCl9fWZ1bmN0aW9uIGN1KHQpe3JldHVybiBmdW5jdGlvbigpe3N1KHRoaXMsdCl9fWZ1bmN0aW9uIHV1KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7KGUuYXBwbHkodGhpcyxhcmd1bWVudHMpP2F1OnN1KSh0aGlzLHQpfX1mdW5jdGlvbiBodSgpe3RoaXMudGV4dENvbnRlbnQ9IiJ9ZnVuY3Rpb24gZHUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD10fX1mdW5jdGlvbiBwdSh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PWU/IiI6ZX19ZnVuY3Rpb24gZnUoKXt0aGlzLmlubmVySFRNTD0iIn1mdW5jdGlvbiBtdSh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLmlubmVySFRNTD10fX1mdW5jdGlvbiBndSh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmlubmVySFRNTD1udWxsPT1lPyIiOmV9fWZ1bmN0aW9uIF91KCl7dGhpcy5uZXh0U2libGluZyYmdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpfWZ1bmN0aW9uIHl1KCl7dGhpcy5wcmV2aW91c1NpYmxpbmcmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcyx0aGlzLnBhcmVudE5vZGUuZmlyc3RDaGlsZCl9ZnVuY3Rpb24gdnUoKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiBidSgpe3ZhciB0PXRoaXMucGFyZW50Tm9kZTt0JiZ0LnJlbW92ZUNoaWxkKHRoaXMpfWZ1bmN0aW9uIHh1KCl7dmFyIHQ9dGhpcy5jbG9uZU5vZGUoITEpLGU9dGhpcy5wYXJlbnROb2RlO3JldHVybiBlP2UuaW5zZXJ0QmVmb3JlKHQsdGhpcy5uZXh0U2libGluZyk6dH1mdW5jdGlvbiB3dSgpe3ZhciB0PXRoaXMuY2xvbmVOb2RlKCEwKSxlPXRoaXMucGFyZW50Tm9kZTtyZXR1cm4gZT9lLmluc2VydEJlZm9yZSh0LHRoaXMubmV4dFNpYmxpbmcpOnR9b3UucHJvdG90eXBlPXthZGQ6ZnVuY3Rpb24odCl7dGhpcy5fbmFtZXMuaW5kZXhPZih0KTwwJiYodGhpcy5fbmFtZXMucHVzaCh0KSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbmFtZXMuaW5kZXhPZih0KTtlPj0wJiYodGhpcy5fbmFtZXMuc3BsaWNlKGUsMSksdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLl9uYW1lcy5qb2luKCIgIikpKX0sY29udGFpbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YodCk+PTB9fTt2YXIgU3U9e30sTXU9bnVsbDsidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiYoIm9ubW91c2VlbnRlciJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fChTdT17bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9KSk7ZnVuY3Rpb24gRXUodCxlLG4pe3JldHVybiB0PVR1KHQsZSxuKSxmdW5jdGlvbihlKXt2YXIgbj1lLnJlbGF0ZWRUYXJnZXQ7biYmKG49PT10aGlzfHw4Jm4uY29tcGFyZURvY3VtZW50UG9zaXRpb24odGhpcykpfHx0LmNhbGwodGhpcyxlKX19ZnVuY3Rpb24gVHUodCxlLG4pe3JldHVybiBmdW5jdGlvbihpKXt2YXIgcj1NdTtNdT1pO3RyeXt0LmNhbGwodGhpcyx0aGlzLl9fZGF0YV9fLGUsbil9ZmluYWxseXtNdT1yfX19ZnVuY3Rpb24gQ3UodCl7cmV0dXJuIHQudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcCgoZnVuY3Rpb24odCl7dmFyIGU9IiIsbj10LmluZGV4T2YoIi4iKTtyZXR1cm4gbj49MCYmKGU9dC5zbGljZShuKzEpLHQ9dC5zbGljZSgwLG4pKSx7dHlwZTp0LG5hbWU6ZX19KSl9ZnVuY3Rpb24gQXUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fX29uO2lmKGUpe2Zvcih2YXIgbixpPTAscj0tMSxvPWUubGVuZ3RoO2k8bzsrK2kpbj1lW2ldLHQudHlwZSYmbi50eXBlIT09dC50eXBlfHxuLm5hbWUhPT10Lm5hbWU/ZVsrK3JdPW46dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG4udHlwZSxuLmxpc3RlbmVyLG4uY2FwdHVyZSk7KytyP2UubGVuZ3RoPXI6ZGVsZXRlIHRoaXMuX19vbn19fWZ1bmN0aW9uIGt1KHQsZSxuKXt2YXIgaT1TdS5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpP0V1OlR1O3JldHVybiBmdW5jdGlvbihyLG8sYSl7dmFyIHMsbD10aGlzLl9fb24sYz1pKGUsbyxhKTtpZihsKWZvcih2YXIgdT0wLGg9bC5sZW5ndGg7dTxoOysrdSlpZigocz1sW3VdKS50eXBlPT09dC50eXBlJiZzLm5hbWU9PT10Lm5hbWUpcmV0dXJuIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihzLnR5cGUscy5saXN0ZW5lcixzLmNhcHR1cmUpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihzLnR5cGUscy5saXN0ZW5lcj1jLHMuY2FwdHVyZT1uKSx2b2lkKHMudmFsdWU9ZSk7dGhpcy5hZGRFdmVudExpc3RlbmVyKHQudHlwZSxjLG4pLHM9e3R5cGU6dC50eXBlLG5hbWU6dC5uYW1lLHZhbHVlOmUsbGlzdGVuZXI6YyxjYXB0dXJlOm59LGw/bC5wdXNoKHMpOnRoaXMuX19vbj1bc119fWZ1bmN0aW9uIEx1KHQsZSxuLGkpe3ZhciByPU11O3Quc291cmNlRXZlbnQ9TXUsTXU9dDt0cnl7cmV0dXJuIGUuYXBwbHkobixpKX1maW5hbGx5e011PXJ9fWZ1bmN0aW9uIFB1KHQsZSxuKXt2YXIgaT0kYyh0KSxyPWkuQ3VzdG9tRXZlbnQ7ImZ1bmN0aW9uIj09dHlwZW9mIHI/cj1uZXcgcihlLG4pOihyPWkuZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50Iiksbj8oci5pbml0RXZlbnQoZSxuLmJ1YmJsZXMsbi5jYW5jZWxhYmxlKSxyLmRldGFpbD1uLmRldGFpbCk6ci5pbml0RXZlbnQoZSwhMSwhMSkpLHQuZGlzcGF0Y2hFdmVudChyKX1mdW5jdGlvbiBOdSh0LGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBQdSh0aGlzLHQsZSl9fWZ1bmN0aW9uIEl1KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIFB1KHRoaXMsdCxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fXZhciBSdT1bbnVsbF07ZnVuY3Rpb24gT3UodCxlKXt0aGlzLl9ncm91cHM9dCx0aGlzLl9wYXJlbnRzPWV9ZnVuY3Rpb24genUoKXtyZXR1cm4gbmV3IE91KFtbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XV0sUnUpfWZ1bmN0aW9uIER1KHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9uZXcgT3UoW1tkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHQpXV0sW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pOm5ldyBPdShbW3RdXSxSdSl9T3UucHJvdG90eXBlPXp1LnByb3RvdHlwZT17Y29uc3RydWN0b3I6T3Usc2VsZWN0OmZ1bmN0aW9uIEJ1KHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1SYyh0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLGk9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWZvcih2YXIgbyxhLHM9ZVtyXSxsPXMubGVuZ3RoLGM9aVtyXT1uZXcgQXJyYXkobCksdT0wO3U8bDsrK3UpKG89c1t1XSkmJihhPXQuY2FsbChvLG8uX19kYXRhX18sdSxzKSkmJigiX19kYXRhX18iaW4gbyYmKGEuX19kYXRhX189by5fX2RhdGFfXyksY1t1XT1hKTtyZXR1cm4gbmV3IE91KGksdGhpcy5fcGFyZW50cyl9LHNlbGVjdEFsbDpmdW5jdGlvbiBIdSh0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9emModCkpO2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj1lLmxlbmd0aCxpPVtdLHI9W10sbz0wO288bjsrK28pZm9yKHZhciBhLHM9ZVtvXSxsPXMubGVuZ3RoLGM9MDtjPGw7KytjKShhPXNbY10pJiYoaS5wdXNoKHQuY2FsbChhLGEuX19kYXRhX18sYyxzKSksci5wdXNoKGEpKTtyZXR1cm4gbmV3IE91KGkscil9LGZpbHRlcjpmdW5jdGlvbiBGdSh0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9RGModCkpO2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj1lLmxlbmd0aCxpPW5ldyBBcnJheShuKSxyPTA7cjxuOysrcilmb3IodmFyIG8sYT1lW3JdLHM9YS5sZW5ndGgsbD1pW3JdPVtdLGM9MDtjPHM7KytjKShvPWFbY10pJiZ0LmNhbGwobyxvLl9fZGF0YV9fLGMsYSkmJmwucHVzaChvKTtyZXR1cm4gbmV3IE91KGksdGhpcy5fcGFyZW50cyl9LGRhdGE6ZnVuY3Rpb24gVnUodCxlKXtpZighdClyZXR1cm4gZj1uZXcgQXJyYXkodGhpcy5zaXplKCkpLHU9LTEsdGhpcy5lYWNoKChmdW5jdGlvbih0KXtmWysrdV09dH0pKSxmO3ZhciBuPWU/VmM6RmMsaT10aGlzLl9wYXJlbnRzLHI9dGhpcy5fZ3JvdXBzOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD0oZnVuY3Rpb24gbyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19KSh0KSk7Zm9yKHZhciBhPXIubGVuZ3RoLHM9bmV3IEFycmF5KGEpLGw9bmV3IEFycmF5KGEpLGM9bmV3IEFycmF5KGEpLHU9MDt1PGE7Kyt1KXt2YXIgaD1pW3VdLGQ9clt1XSxwPWQubGVuZ3RoLGY9dC5jYWxsKGgsaCYmaC5fX2RhdGFfXyx1LGkpLG09Zi5sZW5ndGgsZz1sW3VdPW5ldyBBcnJheShtKSxfPXNbdV09bmV3IEFycmF5KG0pO24oaCxkLGcsXyxjW3VdPW5ldyBBcnJheShwKSxmLGUpO2Zvcih2YXIgeSx2LGI9MCx4PTA7YjxtOysrYilpZih5PWdbYl0pe2ZvcihiPj14JiYoeD1iKzEpOyEodj1fW3hdKSYmKyt4PG07KTt5Ll9uZXh0PXZ8fG51bGx9fXJldHVybihzPW5ldyBPdShzLGkpKS5fZW50ZXI9bCxzLl9leGl0PWMsc30sZW50ZXI6ZnVuY3Rpb24gVXUoKXtyZXR1cm4gbmV3IE91KHRoaXMuX2VudGVyfHx0aGlzLl9ncm91cHMubWFwKEJjKSx0aGlzLl9wYXJlbnRzKX0sZXhpdDpmdW5jdGlvbiBqdSgpe3JldHVybiBuZXcgT3UodGhpcy5fZXhpdHx8dGhpcy5fZ3JvdXBzLm1hcChCYyksdGhpcy5fcGFyZW50cyl9LGpvaW46ZnVuY3Rpb24gR3UodCxlLG4pe3ZhciBpPXRoaXMuZW50ZXIoKSxyPXRoaXMsbz10aGlzLmV4aXQoKTtyZXR1cm4gaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90KGkpOmkuYXBwZW5kKHQrIiIpLG51bGwhPWUmJihyPWUocikpLG51bGw9PW4/by5yZW1vdmUoKTpuKG8pLGkmJnI/aS5tZXJnZShyKS5vcmRlcigpOnJ9LG1lcmdlOmZ1bmN0aW9uIFd1KHQpe2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj10Ll9ncm91cHMsaT1lLmxlbmd0aCxyPU1hdGgubWluKGksbi5sZW5ndGgpLG89bmV3IEFycmF5KGkpLGE9MDthPHI7KythKWZvcih2YXIgcyxsPWVbYV0sYz1uW2FdLHU9bC5sZW5ndGgsaD1vW2FdPW5ldyBBcnJheSh1KSxkPTA7ZDx1OysrZCkocz1sW2RdfHxjW2RdKSYmKGhbZF09cyk7Zm9yKDthPGk7KythKW9bYV09ZVthXTtyZXR1cm4gbmV3IE91KG8sdGhpcy5fcGFyZW50cyl9LG9yZGVyOmZ1bmN0aW9uIHF1KCl7Zm9yKHZhciB0PXRoaXMuX2dyb3VwcyxlPS0xLG49dC5sZW5ndGg7KytlPG47KWZvcih2YXIgaSxyPXRbZV0sbz1yLmxlbmd0aC0xLGE9cltvXTstLW8+PTA7KShpPXJbb10pJiYoYSYmNF5pLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGEpJiZhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGksYSksYT1pKTtyZXR1cm4gdGhpc30sc29ydDpmdW5jdGlvbiBZdSh0KXtmdW5jdGlvbiBlKGUsbil7cmV0dXJuIGUmJm4/dChlLl9fZGF0YV9fLG4uX19kYXRhX18pOiFlLSFufXR8fCh0PVVjKTtmb3IodmFyIG49dGhpcy5fZ3JvdXBzLGk9bi5sZW5ndGgscj1uZXcgQXJyYXkoaSksbz0wO288aTsrK28pe2Zvcih2YXIgYSxzPW5bb10sbD1zLmxlbmd0aCxjPXJbb109bmV3IEFycmF5KGwpLHU9MDt1PGw7Kyt1KShhPXNbdV0pJiYoY1t1XT1hKTtjLnNvcnQoZSl9cmV0dXJuIG5ldyBPdShyLHRoaXMuX3BhcmVudHMpLm9yZGVyKCl9LGNhbGw6ZnVuY3Rpb24gWHUoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIGFyZ3VtZW50c1swXT10aGlzLHQuYXBwbHkobnVsbCxhcmd1bWVudHMpLHRoaXN9LG5vZGVzOmZ1bmN0aW9uICR1KCl7dmFyIHQ9bmV3IEFycmF5KHRoaXMuc2l6ZSgpKSxlPS0xO3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7dFsrK2VdPXRoaXN9KSksdH0sbm9kZTpmdW5jdGlvbiBLdSgpe2Zvcih2YXIgdD10aGlzLl9ncm91cHMsZT0wLG49dC5sZW5ndGg7ZTxuOysrZSlmb3IodmFyIGk9dFtlXSxyPTAsbz1pLmxlbmd0aDtyPG87KytyKXt2YXIgYT1pW3JdO2lmKGEpcmV0dXJuIGF9cmV0dXJuIG51bGx9LHNpemU6ZnVuY3Rpb24gWnUoKXt2YXIgdD0wO3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7Kyt0fSkpLHR9LGVtcHR5OmZ1bmN0aW9uIEp1KCl7cmV0dXJuIXRoaXMubm9kZSgpfSxlYWNoOmZ1bmN0aW9uIFF1KHQpe2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj0wLGk9ZS5sZW5ndGg7bjxpOysrbilmb3IodmFyIHIsbz1lW25dLGE9MCxzPW8ubGVuZ3RoO2E8czsrK2EpKHI9b1thXSkmJnQuY2FsbChyLHIuX19kYXRhX18sYSxvKTtyZXR1cm4gdGhpc30sYXR0cjpmdW5jdGlvbiB0aCh0LGUpe3ZhciBuPWtjKHQpO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7dmFyIGk9dGhpcy5ub2RlKCk7cmV0dXJuIG4ubG9jYWw/aS5nZXRBdHRyaWJ1dGVOUyhuLnNwYWNlLG4ubG9jYWwpOmkuZ2V0QXR0cmlidXRlKG4pfXJldHVybiB0aGlzLmVhY2goKG51bGw9PWU/bi5sb2NhbD9HYzpqYzoiZnVuY3Rpb24iPT10eXBlb2YgZT9uLmxvY2FsP1hjOlljOm4ubG9jYWw/cWM6V2MpKG4sZSkpfSxzdHlsZTpmdW5jdGlvbiBlaCh0LGUsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goKG51bGw9PWU/S2M6ImZ1bmN0aW9uIj09dHlwZW9mIGU/SmM6WmMpKHQsZSxudWxsPT1uPyIiOm4pKTpRYyh0aGlzLm5vZGUoKSx0KX0scHJvcGVydHk6ZnVuY3Rpb24gbmgodCxlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09ZT90dToiZnVuY3Rpb24iPT10eXBlb2YgZT9udTpldSkodCxlKSk6dGhpcy5ub2RlKClbdF19LGNsYXNzZWQ6ZnVuY3Rpb24gaWgodCxlKXt2YXIgbj1pdSh0KyIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgaT1ydSh0aGlzLm5vZGUoKSkscj0tMSxvPW4ubGVuZ3RoOysrcjxvOylpZighaS5jb250YWlucyhuW3JdKSlyZXR1cm4hMTtyZXR1cm4hMH1yZXR1cm4gdGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgZT91dTplP2x1OmN1KShuLGUpKX0sdGV4dDpmdW5jdGlvbiByaCh0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD9odTooImZ1bmN0aW9uIj09dHlwZW9mIHQ/cHU6ZHUpKHQpKTp0aGlzLm5vZGUoKS50ZXh0Q29udGVudH0saHRtbDpmdW5jdGlvbiBvaCh0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD9mdTooImZ1bmN0aW9uIj09dHlwZW9mIHQ/Z3U6bXUpKHQpKTp0aGlzLm5vZGUoKS5pbm5lckhUTUx9LHJhaXNlOmZ1bmN0aW9uIGFoKCl7cmV0dXJuIHRoaXMuZWFjaChfdSl9LGxvd2VyOmZ1bmN0aW9uIHNoKCl7cmV0dXJuIHRoaXMuZWFjaCh5dSl9LGFwcGVuZDpmdW5jdGlvbiBsaCh0KXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90Ok5jKHQpO3JldHVybiB0aGlzLnNlbGVjdCgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9KSl9LGluc2VydDpmdW5jdGlvbiBjaCh0LGUpe3ZhciBuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6TmModCksaT1udWxsPT1lP3Z1OiJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6UmMoZSk7cmV0dXJuIHRoaXMuc2VsZWN0KChmdW5jdGlvbigpe3JldHVybiB0aGlzLmluc2VydEJlZm9yZShuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxpLmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8bnVsbCl9KSl9LHJlbW92ZTpmdW5jdGlvbiB1aCgpe3JldHVybiB0aGlzLmVhY2goYnUpfSxjbG9uZTpmdW5jdGlvbiBoaCh0KXtyZXR1cm4gdGhpcy5zZWxlY3QodD93dTp4dSl9LGRhdHVtOmZ1bmN0aW9uIGRoKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMucHJvcGVydHkoIl9fZGF0YV9fIix0KTp0aGlzLm5vZGUoKS5fX2RhdGFfX30sb246ZnVuY3Rpb24gcGgodCxlLG4pe3ZhciBpLHIsbz1DdSh0KyIiKSxhPW8ubGVuZ3RoO2lmKCEoYXJndW1lbnRzLmxlbmd0aDwyKSl7Zm9yKHM9ZT9rdTpBdSxudWxsPT1uJiYobj0hMSksaT0wO2k8YTsrK2kpdGhpcy5lYWNoKHMob1tpXSxlLG4pKTtyZXR1cm4gdGhpc312YXIgcz10aGlzLm5vZGUoKS5fX29uO2lmKHMpZm9yKHZhciBsLGM9MCx1PXMubGVuZ3RoO2M8dTsrK2MpZm9yKGk9MCxsPXNbY107aTxhOysraSlpZigocj1vW2ldKS50eXBlPT09bC50eXBlJiZyLm5hbWU9PT1sLm5hbWUpcmV0dXJuIGwudmFsdWV9LGRpc3BhdGNoOmZ1bmN0aW9uIGZoKHQsZSl7cmV0dXJuIHRoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIGU/SXU6TnUpKHQsZSkpfX07dmFyIG1oPTA7ZnVuY3Rpb24gZ2goKXtyZXR1cm4gbmV3IF9ofWZ1bmN0aW9uIF9oKCl7dGhpcy5fPSJAIisoKyttaCkudG9TdHJpbmcoMzYpfWZ1bmN0aW9uIHloKCl7Zm9yKHZhciB0LGU9TXU7dD1lLnNvdXJjZUV2ZW50OyllPXQ7cmV0dXJuIGV9ZnVuY3Rpb24gdmgodCxlKXt2YXIgbj10Lm93bmVyU1ZHRWxlbWVudHx8dDtpZihuLmNyZWF0ZVNWR1BvaW50KXt2YXIgaT1uLmNyZWF0ZVNWR1BvaW50KCk7cmV0dXJuIGkueD1lLmNsaWVudFgsaS55PWUuY2xpZW50WSxbKGk9aS5tYXRyaXhUcmFuc2Zvcm0odC5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpKS54LGkueV19dmFyIHI9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm5bZS5jbGllbnRYLXIubGVmdC10LmNsaWVudExlZnQsZS5jbGllbnRZLXIudG9wLXQuY2xpZW50VG9wXX1mdW5jdGlvbiBiaCh0KXt2YXIgZT15aCgpO3JldHVybiBlLmNoYW5nZWRUb3VjaGVzJiYoZT1lLmNoYW5nZWRUb3VjaGVzWzBdKSx2aCh0LGUpfWZ1bmN0aW9uIHhoKHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9uZXcgT3UoW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCldLFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKTpuZXcgT3UoW251bGw9PXQ/W106dF0sUnUpfWZ1bmN0aW9uIHdoKHQsZSxuKXthcmd1bWVudHMubGVuZ3RoPDMmJihuPWUsZT15aCgpLmNoYW5nZWRUb3VjaGVzKTtmb3IodmFyIGkscj0wLG89ZT9lLmxlbmd0aDowO3I8bzsrK3IpaWYoKGk9ZVtyXSkuaWRlbnRpZmllcj09PW4pcmV0dXJuIHZoKHQsaSk7cmV0dXJuIG51bGx9ZnVuY3Rpb24gU2goKXtNdS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiBNaCgpe011LnByZXZlbnREZWZhdWx0KCksTXUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gRWgodCl7dmFyIGU9dC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsbj1EdSh0KS5vbigiZHJhZ3N0YXJ0LmRyYWciLE1oLCEwKTsib25zZWxlY3RzdGFydCJpbiBlP24ub24oInNlbGVjdHN0YXJ0LmRyYWciLE1oLCEwKTooZS5fX25vc2VsZWN0PWUuc3R5bGUuTW96VXNlclNlbGVjdCxlLnN0eWxlLk1velVzZXJTZWxlY3Q9Im5vbmUiKX1mdW5jdGlvbiBUaCh0LGUpe3ZhciBuPXQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGk9RHUodCkub24oImRyYWdzdGFydC5kcmFnIixudWxsKTtlJiYoaS5vbigiY2xpY2suZHJhZyIsTWgsITApLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aS5vbigiY2xpY2suZHJhZyIsbnVsbCl9KSwwKSksIm9uc2VsZWN0c3RhcnQiaW4gbj9pLm9uKCJzZWxlY3RzdGFydC5kcmFnIixudWxsKToobi5zdHlsZS5Nb3pVc2VyU2VsZWN0PW4uX19ub3NlbGVjdCxkZWxldGUgbi5fX25vc2VsZWN0KX1mdW5jdGlvbiBDaCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gQWgodCxlLG4saSxyLG8sYSxzLGwsYyl7dGhpcy50YXJnZXQ9dCx0aGlzLnR5cGU9ZSx0aGlzLnN1YmplY3Q9bix0aGlzLmlkZW50aWZpZXI9aSx0aGlzLmFjdGl2ZT1yLHRoaXMueD1vLHRoaXMueT1hLHRoaXMuZHg9cyx0aGlzLmR5PWwsdGhpcy5fPWN9ZnVuY3Rpb24ga2goKXtyZXR1cm4hTXUuY3RybEtleSYmIU11LmJ1dHRvbn1mdW5jdGlvbiBMaCgpe3JldHVybiB0aGlzLnBhcmVudE5vZGV9ZnVuY3Rpb24gUGgodCl7cmV0dXJuIG51bGw9PXQ/e3g6TXUueCx5Ok11Lnl9OnR9ZnVuY3Rpb24gTmgoKXtyZXR1cm4gbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzfHwib250b3VjaHN0YXJ0ImluIHRoaXN9ZnVuY3Rpb24gSWgoKXt2YXIgdCxlLG4saSxyPWtoLG89TGgsYT1QaCxzPU5oLGw9e30sYz13Yygic3RhcnQiLCJkcmFnIiwiZW5kIiksdT0wLGg9MDtmdW5jdGlvbiBkKHQpe3Qub24oIm1vdXNlZG93bi5kcmFnIixwKS5maWx0ZXIocykub24oInRvdWNoc3RhcnQuZHJhZyIsZykub24oInRvdWNobW92ZS5kcmFnIixfKS5vbigidG91Y2hlbmQuZHJhZyB0b3VjaGNhbmNlbC5kcmFnIix5KS5zdHlsZSgidG91Y2gtYWN0aW9uIiwibm9uZSIpLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCJyZ2JhKDAsMCwwLDApIil9ZnVuY3Rpb24gcCgpe2lmKCFpJiZyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIGE9digibW91c2UiLG8uYXBwbHkodGhpcyxhcmd1bWVudHMpLGJoLHRoaXMsYXJndW1lbnRzKTthJiYoRHUoTXUudmlldykub24oIm1vdXNlbW92ZS5kcmFnIixmLCEwKS5vbigibW91c2V1cC5kcmFnIixtLCEwKSxFaChNdS52aWV3KSxTaCgpLG49ITEsdD1NdS5jbGllbnRYLGU9TXUuY2xpZW50WSxhKCJzdGFydCIpKX19ZnVuY3Rpb24gZigpe2lmKE1oKCksIW4pe3ZhciBpPU11LmNsaWVudFgtdCxyPU11LmNsaWVudFktZTtuPWkqaStyKnI+aH1sLm1vdXNlKCJkcmFnIil9ZnVuY3Rpb24gbSgpe0R1KE11LnZpZXcpLm9uKCJtb3VzZW1vdmUuZHJhZyBtb3VzZXVwLmRyYWciLG51bGwpLFRoKE11LnZpZXcsbiksTWgoKSxsLm1vdXNlKCJlbmQiKX1mdW5jdGlvbiBnKCl7aWYoci5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciB0LGUsbj1NdS5jaGFuZ2VkVG91Y2hlcyxpPW8uYXBwbHkodGhpcyxhcmd1bWVudHMpLGE9bi5sZW5ndGg7Zm9yKHQ9MDt0PGE7Kyt0KShlPXYoblt0XS5pZGVudGlmaWVyLGksd2gsdGhpcyxhcmd1bWVudHMpKSYmKFNoKCksZSgic3RhcnQiKSl9fWZ1bmN0aW9uIF8oKXt2YXIgdCxlLG49TXUuY2hhbmdlZFRvdWNoZXMsaT1uLmxlbmd0aDtmb3IodD0wO3Q8aTsrK3QpKGU9bFtuW3RdLmlkZW50aWZpZXJdKSYmKE1oKCksZSgiZHJhZyIpKX1mdW5jdGlvbiB5KCl7dmFyIHQsZSxuPU11LmNoYW5nZWRUb3VjaGVzLHI9bi5sZW5ndGg7Zm9yKGkmJmNsZWFyVGltZW91dChpKSxpPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aT1udWxsfSksNTAwKSx0PTA7dDxyOysrdCkoZT1sW25bdF0uaWRlbnRpZmllcl0pJiYoU2goKSxlKCJlbmQiKSl9ZnVuY3Rpb24gdih0LGUsbixpLHIpe3ZhciBvLHMsaCxwPW4oZSx0KSxmPWMuY29weSgpO2lmKEx1KG5ldyBBaChkLCJiZWZvcmVzdGFydCIsbyx0LHUscFswXSxwWzFdLDAsMCxmKSwoZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9KE11LnN1YmplY3Q9bz1hLmFwcGx5KGkscikpJiYocz1vLngtcFswXXx8MCxoPW8ueS1wWzFdfHwwLCEwKX0pKSlyZXR1cm4gZnVuY3Rpb24gYShjKXt2YXIgbSxnPXA7c3dpdGNoKGMpe2Nhc2Uic3RhcnQiOmxbdF09YSxtPXUrKzticmVhaztjYXNlImVuZCI6ZGVsZXRlIGxbdF0sLS11O2Nhc2UiZHJhZyI6cD1uKGUsdCksbT11fUx1KG5ldyBBaChkLGMsbyx0LG0scFswXStzLHBbMV0raCxwWzBdLWdbMF0scFsxXS1nWzFdLGYpLGYuYXBwbHksZixbYyxpLHJdKX19cmV0dXJuIGQuZmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6Q2goISF0KSxkKTpyfSxkLmNvbnRhaW5lcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkNoKHQpLGQpOm99LGQuc3ViamVjdD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkNoKHQpLGQpOmF9LGQudG91Y2hhYmxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6Q2goISF0KSxkKTpzfSxkLm9uPWZ1bmN0aW9uKCl7dmFyIHQ9Yy5vbi5hcHBseShjLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1jP2Q6dH0sZC5jbGlja0Rpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSh0PSt0KSp0LGQpOk1hdGguc3FydChoKX0sZH1mdW5jdGlvbiBSaCh0LGUsbil7dC5wcm90b3R5cGU9ZS5wcm90b3R5cGU9bixuLmNvbnN0cnVjdG9yPXR9ZnVuY3Rpb24gT2godCxlKXt2YXIgbj1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKTtmb3IodmFyIGkgaW4gZSluW2ldPWVbaV07cmV0dXJuIG59ZnVuY3Rpb24gemgoKXt9X2gucHJvdG90eXBlPWdoLnByb3RvdHlwZT17Y29uc3RydWN0b3I6X2gsZ2V0OmZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLl87IShlIGluIHQpOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm47cmV0dXJuIHRbZV19LHNldDpmdW5jdGlvbih0LGUpe3JldHVybiB0W3RoaXMuX109ZX0scmVtb3ZlOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl8gaW4gdCYmZGVsZXRlIHRbdGhpcy5fXX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5ffX0sQWgucHJvdG90eXBlLm9uPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fLm9uLmFwcGx5KHRoaXMuXyxhcmd1bWVudHMpO3JldHVybiB0PT09dGhpcy5fP3RoaXM6dH07dmFyIERoPS43LEJoPTEvRGgsSGg9IlxccyooWystXT9cXGQrKVxccyoiLEZoPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLFZoPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIixVaD0vXiMoWzAtOWEtZl17Myw4fSkkLyxqaD1uZXcgUmVnRXhwKCJecmdiXFwoIitbSGgsSGgsSGhdKyJcXCkkIiksR2g9bmV3IFJlZ0V4cCgiXnJnYlxcKCIrW1ZoLFZoLFZoXSsiXFwpJCIpLFdoPW5ldyBSZWdFeHAoIl5yZ2JhXFwoIitbSGgsSGgsSGgsRmhdKyJcXCkkIikscWg9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tWaCxWaCxWaCxGaF0rIlxcKSQiKSxZaD1uZXcgUmVnRXhwKCJeaHNsXFwoIitbRmgsVmgsVmhdKyJcXCkkIiksWGg9bmV3IFJlZ0V4cCgiXmhzbGFcXCgiK1tGaCxWaCxWaCxGaF0rIlxcKSQiKSwkaD17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fTtmdW5jdGlvbiBLaCgpe3JldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleCgpfWZ1bmN0aW9uIFpoKCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0UmdiKCl9ZnVuY3Rpb24gSmgodCl7dmFyIGUsbjtyZXR1cm4gdD0odCsiIikudHJpbSgpLnRvTG93ZXJDYXNlKCksKGU9VWguZXhlYyh0KSk/KG49ZVsxXS5sZW5ndGgsZT1wYXJzZUludChlWzFdLDE2KSw2PT09bj9RaChlKTozPT09bj9uZXcgaWQoZT4+OCYxNXxlPj40JjI0MCxlPj40JjE1fDI0MCZlLCgxNSZlKTw8NHwxNSZlLDEpOjg9PT1uP3RkKGU+PjI0JjI1NSxlPj4xNiYyNTUsZT4+OCYyNTUsKDI1NSZlKS8yNTUpOjQ9PT1uP3RkKGU+PjEyJjE1fGU+PjgmMjQwLGU+PjgmMTV8ZT4+NCYyNDAsZT4+NCYxNXwyNDAmZSwoKDE1JmUpPDw0fDE1JmUpLzI1NSk6bnVsbCk6KGU9amguZXhlYyh0KSk/bmV3IGlkKGVbMV0sZVsyXSxlWzNdLDEpOihlPUdoLmV4ZWModCkpP25ldyBpZCgyNTUqZVsxXS8xMDAsMjU1KmVbMl0vMTAwLDI1NSplWzNdLzEwMCwxKTooZT1XaC5leGVjKHQpKT90ZChlWzFdLGVbMl0sZVszXSxlWzRdKTooZT1xaC5leGVjKHQpKT90ZCgyNTUqZVsxXS8xMDAsMjU1KmVbMl0vMTAwLDI1NSplWzNdLzEwMCxlWzRdKTooZT1ZaC5leGVjKHQpKT9zZChlWzFdLGVbMl0vMTAwLGVbM10vMTAwLDEpOihlPVhoLmV4ZWModCkpP3NkKGVbMV0sZVsyXS8xMDAsZVszXS8xMDAsZVs0XSk6JGguaGFzT3duUHJvcGVydHkodCk/UWgoJGhbdF0pOiJ0cmFuc3BhcmVudCI9PT10P25ldyBpZChOYU4sTmFOLE5hTiwwKTpudWxsfWZ1bmN0aW9uIFFoKHQpe3JldHVybiBuZXcgaWQodD4+MTYmMjU1LHQ+PjgmMjU1LDI1NSZ0LDEpfWZ1bmN0aW9uIHRkKHQsZSxuLGkpe3JldHVybiBpPD0wJiYodD1lPW49TmFOKSxuZXcgaWQodCxlLG4saSl9ZnVuY3Rpb24gZWQodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiB6aHx8KHQ9SmgodCkpLHQ/bmV3IGlkKCh0PXQucmdiKCkpLnIsdC5nLHQuYix0Lm9wYWNpdHkpOm5ldyBpZH1mdW5jdGlvbiBuZCh0LGUsbixpKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/ZWQodCk6bmV3IGlkKHQsZSxuLG51bGw9PWk/MTppKX1mdW5jdGlvbiBpZCh0LGUsbixpKXt0aGlzLnI9K3QsdGhpcy5nPStlLHRoaXMuYj0rbix0aGlzLm9wYWNpdHk9K2l9ZnVuY3Rpb24gcmQoKXtyZXR1cm4iIyIrYWQodGhpcy5yKSthZCh0aGlzLmcpK2FkKHRoaXMuYil9ZnVuY3Rpb24gb2QoKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX1mdW5jdGlvbiBhZCh0KXtyZXR1cm4oKHQ9TWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0KXx8MCkpKTwxNj8iMCI6IiIpK3QudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIHNkKHQsZSxuLGkpe3JldHVybiBpPD0wP3Q9ZT1uPU5hTjpuPD0wfHxuPj0xP3Q9ZT1OYU46ZTw9MCYmKHQ9TmFOKSxuZXcgdWQodCxlLG4saSl9ZnVuY3Rpb24gbGQodCl7aWYodCBpbnN0YW5jZW9mIHVkKXJldHVybiBuZXcgdWQodC5oLHQucyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2Ygemh8fCh0PUpoKHQpKSwhdClyZXR1cm4gbmV3IHVkO2lmKHQgaW5zdGFuY2VvZiB1ZClyZXR1cm4gdDt2YXIgZT0odD10LnJnYigpKS5yLzI1NSxuPXQuZy8yNTUsaT10LmIvMjU1LHI9TWF0aC5taW4oZSxuLGkpLG89TWF0aC5tYXgoZSxuLGkpLGE9TmFOLHM9by1yLGw9KG8rcikvMjtyZXR1cm4gcz8oYT1lPT09bz8obi1pKS9zKzYqKG48aSk6bj09PW8/KGktZSkvcysyOihlLW4pL3MrNCxzLz1sPC41P28rcjoyLW8tcixhKj02MCk6cz1sPjAmJmw8MT8wOmEsbmV3IHVkKGEscyxsLHQub3BhY2l0eSl9ZnVuY3Rpb24gY2QodCxlLG4saSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2xkKHQpOm5ldyB1ZCh0LGUsbixudWxsPT1pPzE6aSl9ZnVuY3Rpb24gdWQodCxlLG4saSl7dGhpcy5oPSt0LHRoaXMucz0rZSx0aGlzLmw9K24sdGhpcy5vcGFjaXR5PStpfWZ1bmN0aW9uIGhkKHQsZSxuKXtyZXR1cm4gMjU1Kih0PDYwP2UrKG4tZSkqdC82MDp0PDE4MD9uOnQ8MjQwP2UrKG4tZSkqKDI0MC10KS82MDplKX1SaCh6aCxKaCx7Y29weTpmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgdGhpcy5jb25zdHJ1Y3Rvcix0aGlzLHQpfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCl9LGhleDpLaCxmb3JtYXRIZXg6S2gsZm9ybWF0SHNsOmZ1bmN0aW9uIGRkKCl7cmV0dXJuIGxkKHRoaXMpLmZvcm1hdEhzbCgpfSxmb3JtYXRSZ2I6WmgsdG9TdHJpbmc6Wmh9KSxSaChpZCxuZCxPaCh6aCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9CaDpNYXRoLnBvdyhCaCx0KSxuZXcgaWQodGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/RGg6TWF0aC5wb3coRGgsdCksbmV3IGlkKHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiB0aGlzfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybi0uNTw9dGhpcy5yJiZ0aGlzLnI8MjU1LjUmJi0uNTw9dGhpcy5nJiZ0aGlzLmc8MjU1LjUmJi0uNTw9dGhpcy5iJiZ0aGlzLmI8MjU1LjUmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxoZXg6cmQsZm9ybWF0SGV4OnJkLGZvcm1hdFJnYjpvZCx0b1N0cmluZzpvZH0pKSxSaCh1ZCxjZCxPaCh6aCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9CaDpNYXRoLnBvdyhCaCx0KSxuZXcgdWQodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9EaDpNYXRoLnBvdyhEaCx0KSxuZXcgdWQodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmglMzYwKzM2MCoodGhpcy5oPDApLGU9aXNOYU4odCl8fGlzTmFOKHRoaXMucyk/MDp0aGlzLnMsbj10aGlzLmwsaT1uKyhuPC41P246MS1uKSplLHI9MipuLWk7cmV0dXJuIG5ldyBpZChoZCh0Pj0yNDA/dC0yNDA6dCsxMjAscixpKSxoZCh0LHIsaSksaGQodDwxMjA/dCsyNDA6dC0xMjAscixpKSx0aGlzLm9wYWNpdHkpfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybigwPD10aGlzLnMmJnRoaXMuczw9MXx8aXNOYU4odGhpcy5zKSkmJjA8PXRoaXMubCYmdGhpcy5sPD0xJiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0sZm9ybWF0SHNsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcGFjaXR5O3JldHVybigxPT09KHQ9aXNOYU4odCk/MTpNYXRoLm1heCgwLE1hdGgubWluKDEsdCkpKT8iaHNsKCI6ImhzbGEoIikrKHRoaXMuaHx8MCkrIiwgIisxMDAqKHRoaXMuc3x8MCkrIiUsICIrMTAwKih0aGlzLmx8fDApKyIlIisoMT09PXQ/IikiOiIsICIrdCsiKSIpfX0pKTt2YXIgcGQ9TWF0aC5QSS8xODAsZmQ9MTgwL01hdGguUEksbWQ9Ljk2NDIyLGdkPS44MjUyMSxfZD00LzI5LHlkPTYvMjksdmQ9Myp5ZCp5ZDtmdW5jdGlvbiBiZCh0KXtpZih0IGluc3RhbmNlb2Ygd2QpcmV0dXJuIG5ldyB3ZCh0LmwsdC5hLHQuYix0Lm9wYWNpdHkpO2lmKHQgaW5zdGFuY2VvZiBrZClyZXR1cm4gTGQodCk7dCBpbnN0YW5jZW9mIGlkfHwodD1lZCh0KSk7dmFyIGUsbixpPVRkKHQucikscj1UZCh0LmcpLG89VGQodC5iKSxhPVNkKCguMjIyNTA0NSppKy43MTY4Nzg2KnIrLjA2MDYxNjkqbykvMSk7cmV0dXJuIGk9PT1yJiZyPT09bz9lPW49YTooZT1TZCgoLjQzNjA3NDcqaSsuMzg1MDY0OSpyKy4xNDMwODA0Km8pL21kKSxuPVNkKCguMDEzOTMyMippKy4wOTcxMDQ1KnIrLjcxNDE3MzMqbykvZ2QpKSxuZXcgd2QoMTE2KmEtMTYsNTAwKihlLWEpLDIwMCooYS1uKSx0Lm9wYWNpdHkpfWZ1bmN0aW9uIHhkKHQsZSxuLGkpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9iZCh0KTpuZXcgd2QodCxlLG4sbnVsbD09aT8xOmkpfWZ1bmN0aW9uIHdkKHQsZSxuLGkpe3RoaXMubD0rdCx0aGlzLmE9K2UsdGhpcy5iPStuLHRoaXMub3BhY2l0eT0raX1mdW5jdGlvbiBTZCh0KXtyZXR1cm4gdD4uMDA4ODU2NDUxNjc5MDM1NjMxP01hdGgucG93KHQsMS8zKTp0L3ZkK19kfWZ1bmN0aW9uIE1kKHQpe3JldHVybiB0PnlkP3QqdCp0OnZkKih0LV9kKX1mdW5jdGlvbiBFZCh0KXtyZXR1cm4gMjU1Kih0PD0uMDAzMTMwOD8xMi45Mip0OjEuMDU1Kk1hdGgucG93KHQsMS8yLjQpLS4wNTUpfWZ1bmN0aW9uIFRkKHQpe3JldHVybih0Lz0yNTUpPD0uMDQwNDU/dC8xMi45MjpNYXRoLnBvdygodCsuMDU1KS8xLjA1NSwyLjQpfWZ1bmN0aW9uIENkKHQpe2lmKHQgaW5zdGFuY2VvZiBrZClyZXR1cm4gbmV3IGtkKHQuaCx0LmMsdC5sLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIHdkfHwodD1iZCh0KSksMD09PXQuYSYmMD09PXQuYilyZXR1cm4gbmV3IGtkKE5hTiwwPHQubCYmdC5sPDEwMD8wOk5hTix0LmwsdC5vcGFjaXR5KTt2YXIgZT1NYXRoLmF0YW4yKHQuYix0LmEpKmZkO3JldHVybiBuZXcga2QoZTwwP2UrMzYwOmUsTWF0aC5zcXJ0KHQuYSp0LmErdC5iKnQuYiksdC5sLHQub3BhY2l0eSl9ZnVuY3Rpb24gQWQodCxlLG4saSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP0NkKHQpOm5ldyBrZCh0LGUsbixudWxsPT1pPzE6aSl9ZnVuY3Rpb24ga2QodCxlLG4saSl7dGhpcy5oPSt0LHRoaXMuYz0rZSx0aGlzLmw9K24sdGhpcy5vcGFjaXR5PStpfWZ1bmN0aW9uIExkKHQpe2lmKGlzTmFOKHQuaCkpcmV0dXJuIG5ldyB3ZCh0LmwsMCwwLHQub3BhY2l0eSk7dmFyIGU9dC5oKnBkO3JldHVybiBuZXcgd2QodC5sLE1hdGguY29zKGUpKnQuYyxNYXRoLnNpbihlKSp0LmMsdC5vcGFjaXR5KX1SaCh3ZCx4ZCxPaCh6aCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyB3ZCh0aGlzLmwrMTgqKG51bGw9PXQ/MTp0KSx0aGlzLmEsdGhpcy5iLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IHdkKHRoaXMubC0xOCoobnVsbD09dD8xOnQpLHRoaXMuYSx0aGlzLmIsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9KHRoaXMubCsxNikvMTE2LGU9aXNOYU4odGhpcy5hKT90OnQrdGhpcy5hLzUwMCxuPWlzTmFOKHRoaXMuYik/dDp0LXRoaXMuYi8yMDA7cmV0dXJuIG5ldyBpZChFZCgzLjEzMzg1NjEqKGU9bWQqTWQoZSkpLTEuNjE2ODY2NyoodD0xKk1kKHQpKS0uNDkwNjE0Nioobj1nZCpNZChuKSkpLEVkKC0uOTc4NzY4NCplKzEuOTE2MTQxNSp0Ky4wMzM0NTQqbiksRWQoLjA3MTk0NTMqZS0uMjI4OTkxNCp0KzEuNDA1MjQyNypuKSx0aGlzLm9wYWNpdHkpfX0pKSxSaChrZCxBZCxPaCh6aCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBrZCh0aGlzLmgsdGhpcy5jLHRoaXMubCsxOCoobnVsbD09dD8xOnQpLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGtkKHRoaXMuaCx0aGlzLmMsdGhpcy5sLTE4KihudWxsPT10PzE6dCksdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7cmV0dXJuIExkKHRoaXMpLnJnYigpfX0pKTt2YXIgUGQ9LS4xNDg2MSxOZD0xLjc4Mjc3LElkPS0uMjkyMjcsUmQ9LS45MDY0OSxPZD0xLjk3Mjk0LHpkPU9kKlJkLERkPU9kKk5kLEJkPU5kKklkLVJkKlBkO2Z1bmN0aW9uIEhkKHQpe2lmKHQgaW5zdGFuY2VvZiBWZClyZXR1cm4gbmV3IFZkKHQuaCx0LnMsdC5sLHQub3BhY2l0eSk7dCBpbnN0YW5jZW9mIGlkfHwodD1lZCh0KSk7dmFyIGU9dC5nLzI1NSxuPXQuYi8yNTUsaT0oQmQqbit6ZCoodC5yLzI1NSktRGQqZSkvLTUuOTYxNTEyMjkxMixyPW4taSxvPShPZCooZS1pKS1JZCpyKS9SZCxhPU1hdGguc3FydChvKm8rcipyKS8oT2QqaSooMS1pKSkscz1hP01hdGguYXRhbjIobyxyKSpmZC0xMjA6TmFOO3JldHVybiBuZXcgVmQoczwwP3MrMzYwOnMsYSxpLHQub3BhY2l0eSl9ZnVuY3Rpb24gRmQodCxlLG4saSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP0hkKHQpOm5ldyBWZCh0LGUsbixudWxsPT1pPzE6aSl9ZnVuY3Rpb24gVmQodCxlLG4saSl7dGhpcy5oPSt0LHRoaXMucz0rZSx0aGlzLmw9K24sdGhpcy5vcGFjaXR5PStpfWZ1bmN0aW9uIFVkKHQsZSxuLGkscil7dmFyIG89dCp0LGE9byp0O3JldHVybigoMS0zKnQrMypvLWEpKmUrKDQtNipvKzMqYSkqbisoMSszKnQrMypvLTMqYSkqaSthKnIpLzZ9ZnVuY3Rpb24gamQodCl7dmFyIGU9dC5sZW5ndGgtMTtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGk9bjw9MD9uPTA6bj49MT8obj0xLGUtMSk6TWF0aC5mbG9vcihuKmUpLHI9dFtpXSxvPXRbaSsxXTtyZXR1cm4gVWQoKG4taS9lKSplLGk+MD90W2ktMV06MipyLW8scixvLGk8ZS0xP3RbaSsyXToyKm8tcil9fWZ1bmN0aW9uIEdkKHQpe3ZhciBlPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihuKXt2YXIgaT1NYXRoLmZsb29yKCgobiU9MSk8MD8rK246bikqZSk7cmV0dXJuIFVkKChuLWkvZSkqZSx0WyhpK2UtMSklZV0sdFtpJWVdLHRbKGkrMSklZV0sdFsoaSsyKSVlXSl9fWZ1bmN0aW9uIFdkKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBxZCh0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdCtuKmV9fWZ1bmN0aW9uIFlkKHQsZSl7dmFyIG49ZS10O3JldHVybiBuP3FkKHQsbj4xODB8fG48LTE4MD9uLTM2MCpNYXRoLnJvdW5kKG4vMzYwKTpuKTpXZChpc05hTih0KT9lOnQpfWZ1bmN0aW9uIFhkKHQpe3JldHVybiAxPT0odD0rdCk/JGQ6ZnVuY3Rpb24oZSxuKXtyZXR1cm4gbi1lPyhmdW5jdGlvbiBpKHQsZSxuKXtyZXR1cm4gdD1NYXRoLnBvdyh0LG4pLGU9TWF0aC5wb3coZSxuKS10LG49MS9uLGZ1bmN0aW9uKGkpe3JldHVybiBNYXRoLnBvdyh0K2kqZSxuKX19KShlLG4sdCk6V2QoaXNOYU4oZSk/bjplKX19ZnVuY3Rpb24gJGQodCxlKXt2YXIgbj1lLXQ7cmV0dXJuIG4/cWQodCxuKTpXZChpc05hTih0KT9lOnQpfVJoKFZkLEZkLE9oKHpoLHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10P0JoOk1hdGgucG93KEJoLHQpLG5ldyBWZCh0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10P0RoOk1hdGgucG93KERoLHQpLG5ldyBWZCh0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3ZhciB0PWlzTmFOKHRoaXMuaCk/MDoodGhpcy5oKzEyMCkqcGQsZT0rdGhpcy5sLG49aXNOYU4odGhpcy5zKT8wOnRoaXMucyplKigxLWUpLGk9TWF0aC5jb3ModCkscj1NYXRoLnNpbih0KTtyZXR1cm4gbmV3IGlkKDI1NSooZStuKihQZCppK05kKnIpKSwyNTUqKGUrbiooSWQqaStSZCpyKSksMjU1KihlK24qKE9kKmkpKSx0aGlzLm9wYWNpdHkpfX0pKTt2YXIgS2Q9KGZ1bmN0aW9uIHQoZSl7dmFyIG49WGQoZSk7ZnVuY3Rpb24gaSh0LGUpe3ZhciBpPW4oKHQ9bmQodCkpLnIsKGU9bmQoZSkpLnIpLHI9bih0LmcsZS5nKSxvPW4odC5iLGUuYiksYT0kZCh0Lm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQucj1pKGUpLHQuZz1yKGUpLHQuYj1vKGUpLHQub3BhY2l0eT1hKGUpLHQrIiJ9fXJldHVybiBpLmdhbW1hPXQsaX0pKDEpO2Z1bmN0aW9uIFpkKHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgbixpLHI9ZS5sZW5ndGgsbz1uZXcgQXJyYXkociksYT1uZXcgQXJyYXkocikscz1uZXcgQXJyYXkocik7Zm9yKG49MDtuPHI7KytuKWk9bmQoZVtuXSksb1tuXT1pLnJ8fDAsYVtuXT1pLmd8fDAsc1tuXT1pLmJ8fDA7cmV0dXJuIG89dChvKSxhPXQoYSkscz10KHMpLGkub3BhY2l0eT0xLGZ1bmN0aW9uKHQpe3JldHVybiBpLnI9byh0KSxpLmc9YSh0KSxpLmI9cyh0KSxpKyIifX19dmFyIEpkPVpkKGpkKSxRZD1aZChHZCk7ZnVuY3Rpb24gdHAodCxlKXtlfHwoZT1bXSk7dmFyIG4saT10P01hdGgubWluKGUubGVuZ3RoLHQubGVuZ3RoKTowLHI9ZS5zbGljZSgpO3JldHVybiBmdW5jdGlvbihvKXtmb3Iobj0wO248aTsrK24pcltuXT10W25dKigxLW8pK2Vbbl0qbztyZXR1cm4gcn19ZnVuY3Rpb24gZXAodCl7cmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyh0KSYmISh0IGluc3RhbmNlb2YgRGF0YVZpZXcpfWZ1bmN0aW9uIG5wKHQsZSl7dmFyIG4saT1lP2UubGVuZ3RoOjAscj10P01hdGgubWluKGksdC5sZW5ndGgpOjAsbz1uZXcgQXJyYXkociksYT1uZXcgQXJyYXkoaSk7Zm9yKG49MDtuPHI7KytuKW9bbl09Y3AodFtuXSxlW25dKTtmb3IoO248aTsrK24pYVtuXT1lW25dO3JldHVybiBmdW5jdGlvbih0KXtmb3Iobj0wO248cjsrK24pYVtuXT1vW25dKHQpO3JldHVybiBhfX1mdW5jdGlvbiBpcCh0LGUpe3ZhciBuPW5ldyBEYXRlO3JldHVybiB0PSt0LGU9K2UsZnVuY3Rpb24oaSl7cmV0dXJuIG4uc2V0VGltZSh0KigxLWkpK2UqaSksbn19ZnVuY3Rpb24gcnAodCxlKXtyZXR1cm4gdD0rdCxlPStlLGZ1bmN0aW9uKG4pe3JldHVybiB0KigxLW4pK2Uqbn19ZnVuY3Rpb24gb3AodCxlKXt2YXIgbixpPXt9LHI9e307Zm9yKG4gaW4gbnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdHx8KHQ9e30pLG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV8fChlPXt9KSxlKW4gaW4gdD9pW25dPWNwKHRbbl0sZVtuXSk6cltuXT1lW25dO3JldHVybiBmdW5jdGlvbih0KXtmb3IobiBpbiBpKXJbbl09aVtuXSh0KTtyZXR1cm4gcn19dmFyIGFwPS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyxzcD1uZXcgUmVnRXhwKGFwLnNvdXJjZSwiZyIpO2Z1bmN0aW9uIGxwKHQsZSl7dmFyIG4saSxyLG89YXAubGFzdEluZGV4PXNwLmxhc3RJbmRleD0wLGE9LTEscz1bXSxsPVtdO2Zvcih0Kz0iIixlKz0iIjsobj1hcC5leGVjKHQpKSYmKGk9c3AuZXhlYyhlKSk7KShyPWkuaW5kZXgpPm8mJihyPWUuc2xpY2UobyxyKSxzW2FdP3NbYV0rPXI6c1srK2FdPXIpLChuPW5bMF0pPT09KGk9aVswXSk/c1thXT9zW2FdKz1pOnNbKythXT1pOihzWysrYV09bnVsbCxsLnB1c2goe2k6YSx4OnJwKG4saSl9KSksbz1zcC5sYXN0SW5kZXg7cmV0dXJuIG88ZS5sZW5ndGgmJihyPWUuc2xpY2Uobyksc1thXT9zW2FdKz1yOnNbKythXT1yKSxzLmxlbmd0aDwyP2xbMF0/KGZ1bmN0aW9uIGModCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpKyIifX0pKGxbMF0ueCk6KGZ1bmN0aW9uIHUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSkoZSk6KGU9bC5sZW5ndGgsZnVuY3Rpb24odCl7Zm9yKHZhciBuLGk9MDtpPGU7KytpKXNbKG49bFtpXSkuaV09bi54KHQpO3JldHVybiBzLmpvaW4oIiIpfSl9ZnVuY3Rpb24gY3AodCxlKXt2YXIgbixpPXR5cGVvZiBlO3JldHVybiBudWxsPT1lfHwiYm9vbGVhbiI9PT1pP1dkKGUpOigibnVtYmVyIj09PWk/cnA6InN0cmluZyI9PT1pPyhuPUpoKGUpKT8oZT1uLEtkKTpscDplIGluc3RhbmNlb2YgSmg/S2Q6ZSBpbnN0YW5jZW9mIERhdGU/aXA6ZXAoZSk/dHA6QXJyYXkuaXNBcnJheShlKT9ucDoiZnVuY3Rpb24iIT10eXBlb2YgZS52YWx1ZU9mJiYiZnVuY3Rpb24iIT10eXBlb2YgZS50b1N0cmluZ3x8aXNOYU4oZSk/b3A6cnApKHQsZSl9ZnVuY3Rpb24gdXAodCxlKXtyZXR1cm4gdD0rdCxlPStlLGZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnJvdW5kKHQqKDEtbikrZSpuKX19dmFyIGhwLGRwLHBwLGZwLG1wPTE4MC9NYXRoLlBJLGdwPXt0cmFuc2xhdGVYOjAsdHJhbnNsYXRlWTowLHJvdGF0ZTowLHNrZXdYOjAsc2NhbGVYOjEsc2NhbGVZOjF9O2Z1bmN0aW9uIF9wKHQsZSxuLGkscixvKXt2YXIgYSxzLGw7cmV0dXJuKGE9TWF0aC5zcXJ0KHQqdCtlKmUpKSYmKHQvPWEsZS89YSksKGw9dCpuK2UqaSkmJihuLT10KmwsaS09ZSpsKSwocz1NYXRoLnNxcnQobipuK2kqaSkpJiYobi89cyxpLz1zLGwvPXMpLHQqaTxlKm4mJih0PS10LGU9LWUsbD0tbCxhPS1hKSx7dHJhbnNsYXRlWDpyLHRyYW5zbGF0ZVk6byxyb3RhdGU6TWF0aC5hdGFuMihlLHQpKm1wLHNrZXdYOk1hdGguYXRhbihsKSptcCxzY2FsZVg6YSxzY2FsZVk6c319ZnVuY3Rpb24geXAodCxlLG4saSl7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdC5sZW5ndGg/dC5wb3AoKSsiICI6IiJ9cmV0dXJuIGZ1bmN0aW9uKG8sYSl7dmFyIHM9W10sbD1bXTtyZXR1cm4gbz10KG8pLGE9dChhKSwoZnVuY3Rpb24gYyh0LGkscixvLGEscyl7aWYodCE9PXJ8fGkhPT1vKXt2YXIgbD1hLnB1c2goInRyYW5zbGF0ZSgiLG51bGwsZSxudWxsLG4pO3MucHVzaCh7aTpsLTQseDpycCh0LHIpfSx7aTpsLTIseDpycChpLG8pfSl9ZWxzZShyfHxvKSYmYS5wdXNoKCJ0cmFuc2xhdGUoIityK2UrbytuKX0pKG8udHJhbnNsYXRlWCxvLnRyYW5zbGF0ZVksYS50cmFuc2xhdGVYLGEudHJhbnNsYXRlWSxzLGwpLChmdW5jdGlvbiB1KHQsZSxuLG8pe3QhPT1lPyh0LWU+MTgwP2UrPTM2MDplLXQ+MTgwJiYodCs9MzYwKSxvLnB1c2goe2k6bi5wdXNoKHIobikrInJvdGF0ZSgiLG51bGwsaSktMix4OnJwKHQsZSl9KSk6ZSYmbi5wdXNoKHIobikrInJvdGF0ZSgiK2UraSl9KShvLnJvdGF0ZSxhLnJvdGF0ZSxzLGwpLChmdW5jdGlvbiBoKHQsZSxuLG8pe3QhPT1lP28ucHVzaCh7aTpuLnB1c2gocihuKSsic2tld1goIixudWxsLGkpLTIseDpycCh0LGUpfSk6ZSYmbi5wdXNoKHIobikrInNrZXdYKCIrZStpKX0pKG8uc2tld1gsYS5za2V3WCxzLGwpLChmdW5jdGlvbiBkKHQsZSxuLGksbyxhKXtpZih0IT09bnx8ZSE9PWkpe3ZhciBzPW8ucHVzaChyKG8pKyJzY2FsZSgiLG51bGwsIiwiLG51bGwsIikiKTthLnB1c2goe2k6cy00LHg6cnAodCxuKX0se2k6cy0yLHg6cnAoZSxpKX0pfWVsc2UgMT09PW4mJjE9PT1pfHxvLnB1c2gocihvKSsic2NhbGUoIituKyIsIitpKyIpIil9KShvLnNjYWxlWCxvLnNjYWxlWSxhLnNjYWxlWCxhLnNjYWxlWSxzLGwpLG89YT1udWxsLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPS0xLGk9bC5sZW5ndGg7KytuPGk7KXNbKGU9bFtuXSkuaV09ZS54KHQpO3JldHVybiBzLmpvaW4oIiIpfX19dmFyIHZwPXlwKChmdW5jdGlvbiBicCh0KXtyZXR1cm4ibm9uZSI9PT10P2dwOihocHx8KGhwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLGRwPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxwcD1kb2N1bWVudC5kZWZhdWx0VmlldyksaHAuc3R5bGUudHJhbnNmb3JtPXQsdD1wcC5nZXRDb21wdXRlZFN0eWxlKGRwLmFwcGVuZENoaWxkKGhwKSxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2Zvcm0iKSxkcC5yZW1vdmVDaGlsZChocCksX3AoKyh0PXQuc2xpY2UoNywtMSkuc3BsaXQoIiwiKSlbMF0sK3RbMV0sK3RbMl0sK3RbM10sK3RbNF0sK3RbNV0pKX0pLCJweCwgIiwicHgpIiwiZGVnKSIpLHhwPXlwKChmdW5jdGlvbiB3cCh0KXtyZXR1cm4gbnVsbD09dD9ncDooZnB8fChmcD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwiZyIpKSxmcC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsdCksKHQ9ZnAudHJhbnNmb3JtLmJhc2VWYWwuY29uc29saWRhdGUoKSk/X3AoKHQ9dC5tYXRyaXgpLmEsdC5iLHQuYyx0LmQsdC5lLHQuZik6Z3ApfSksIiwgIiwiKSIsIikiKSxTcD1NYXRoLlNRUlQyO2Z1bmN0aW9uIE1wKHQpe3JldHVybigodD1NYXRoLmV4cCh0KSkrMS90KS8yfWZ1bmN0aW9uIEVwKHQsZSl7dmFyIG4saSxyPXRbMF0sbz10WzFdLGE9dFsyXSxzPWVbMl0sbD1lWzBdLXIsYz1lWzFdLW8sdT1sKmwrYypjO2lmKHU8MWUtMTIpaT1NYXRoLmxvZyhzL2EpL1NwLG49ZnVuY3Rpb24odCl7cmV0dXJuW3IrdCpsLG8rdCpjLGEqTWF0aC5leHAoU3AqdCppKV19O2Vsc2V7dmFyIGg9TWF0aC5zcXJ0KHUpLGQ9KHMqcy1hKmErNCp1KS8oMiphKjIqaCkscD0ocypzLWEqYS00KnUpLygyKnMqMipoKSxmPU1hdGgubG9nKE1hdGguc3FydChkKmQrMSktZCksbT1NYXRoLmxvZyhNYXRoLnNxcnQocCpwKzEpLXApO2k9KG0tZikvU3Asbj1mdW5jdGlvbih0KXt2YXIgZT10Kmksbj1NcChmKSxzPWEvKDIqaCkqKG4qKGZ1bmN0aW9uIHUodCl7cmV0dXJuKCh0PU1hdGguZXhwKDIqdCkpLTEpLyh0KzEpfSkoU3AqZStmKS0oZnVuY3Rpb24gZCh0KXtyZXR1cm4oKHQ9TWF0aC5leHAodCkpLTEvdCkvMn0pKGYpKTtyZXR1cm5bcitzKmwsbytzKmMsYSpuL01wKFNwKmUrZildfX1yZXR1cm4gbi5kdXJhdGlvbj0xZTMqaSxufWZ1bmN0aW9uIFRwKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3ZhciBpPXQoKGU9Y2QoZSkpLmgsKG49Y2QobikpLmgpLHI9JGQoZS5zLG4ucyksbz0kZChlLmwsbi5sKSxhPSRkKGUub3BhY2l0eSxuLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZS5oPWkodCksZS5zPXIodCksZS5sPW8odCksZS5vcGFjaXR5PWEodCksZSsiIn19fXZhciBDcD1UcChZZCksQXA9VHAoJGQpO2Z1bmN0aW9uIGtwKHQsZSl7dmFyIG49JGQoKHQ9eGQodCkpLmwsKGU9eGQoZSkpLmwpLGk9JGQodC5hLGUuYSkscj0kZCh0LmIsZS5iKSxvPSRkKHQub3BhY2l0eSxlLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdC5sPW4oZSksdC5hPWkoZSksdC5iPXIoZSksdC5vcGFjaXR5PW8oZSksdCsiIn19ZnVuY3Rpb24gTHAodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dmFyIGk9dCgoZT1BZChlKSkuaCwobj1BZChuKSkuaCkscj0kZChlLmMsbi5jKSxvPSRkKGUubCxuLmwpLGE9JGQoZS5vcGFjaXR5LG4ub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBlLmg9aSh0KSxlLmM9cih0KSxlLmw9byh0KSxlLm9wYWNpdHk9YSh0KSxlKyIifX19dmFyIFBwPUxwKFlkKSxOcD1McCgkZCk7ZnVuY3Rpb24gSXAodCl7cmV0dXJuKGZ1bmN0aW9uIGUobil7ZnVuY3Rpb24gaShlLGkpe3ZhciByPXQoKGU9RmQoZSkpLmgsKGk9RmQoaSkpLmgpLG89JGQoZS5zLGkucyksYT0kZChlLmwsaS5sKSxzPSRkKGUub3BhY2l0eSxpLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZS5oPXIodCksZS5zPW8odCksZS5sPWEoTWF0aC5wb3codCxuKSksZS5vcGFjaXR5PXModCksZSsiIn19cmV0dXJuIG49K24saS5nYW1tYT1lLGl9KSgxKX12YXIgUnA9SXAoWWQpLE9wPUlwKCRkKTt2YXIgenAsRHAsQnA9MCxIcD0wLEZwPTAsVnA9MCxVcD0wLGpwPTAsR3A9Im9iamVjdCI9PXR5cGVvZiBwZXJmb3JtYW5jZSYmcGVyZm9ybWFuY2Uubm93P3BlcmZvcm1hbmNlOkRhdGUsV3A9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdyk6ZnVuY3Rpb24odCl7c2V0VGltZW91dCh0LDE3KX07ZnVuY3Rpb24gcXAoKXtyZXR1cm4gVXB8fChXcChZcCksVXA9R3Aubm93KCkranApfWZ1bmN0aW9uIFlwKCl7VXA9MH1mdW5jdGlvbiBYcCgpe3RoaXMuX2NhbGw9dGhpcy5fdGltZT10aGlzLl9uZXh0PW51bGx9ZnVuY3Rpb24gJHAodCxlLG4pe3ZhciBpPW5ldyBYcDtyZXR1cm4gaS5yZXN0YXJ0KHQsZSxuKSxpfWZ1bmN0aW9uIEtwKCl7cXAoKSwrK0JwO2Zvcih2YXIgdCxlPXpwO2U7KSh0PVVwLWUuX3RpbWUpPj0wJiZlLl9jYWxsLmNhbGwobnVsbCx0KSxlPWUuX25leHQ7LS1CcH1mdW5jdGlvbiBacCgpe1VwPShWcD1HcC5ub3coKSkranAsQnA9SHA9MDt0cnl7S3AoKX1maW5hbGx5e0JwPTAsKGZ1bmN0aW9uIHQoKXt2YXIgdCxlLG49enAsaT0xLzA7Zm9yKDtuOyluLl9jYWxsPyhpPm4uX3RpbWUmJihpPW4uX3RpbWUpLHQ9bixuPW4uX25leHQpOihlPW4uX25leHQsbi5fbmV4dD1udWxsLG49dD90Ll9uZXh0PWU6enA9ZSk7RHA9dCxRcChpKX0pKCksVXA9MH19ZnVuY3Rpb24gSnAoKXt2YXIgdD1HcC5ub3coKSxlPXQtVnA7ZT4xZTMmJihqcC09ZSxWcD10KX1mdW5jdGlvbiBRcCh0KXtCcHx8KEhwJiYoSHA9Y2xlYXJUaW1lb3V0KEhwKSksdC1VcD4yND8odDwxLzAmJihIcD1zZXRUaW1lb3V0KFpwLHQtR3Aubm93KCktanApKSxGcCYmKEZwPWNsZWFySW50ZXJ2YWwoRnApKSk6KEZwfHwoVnA9R3Aubm93KCksRnA9c2V0SW50ZXJ2YWwoSnAsMWUzKSksQnA9MSxXcChacCkpKX1mdW5jdGlvbiB0Zih0LGUsbil7dmFyIGk9bmV3IFhwO3JldHVybiBpLnJlc3RhcnQoKGZ1bmN0aW9uKG4pe2kuc3RvcCgpLHQobitlKX0pLGU9bnVsbD09ZT8wOitlLG4pLGl9WHAucHJvdG90eXBlPSRwLnByb3RvdHlwZT17Y29uc3RydWN0b3I6WHAscmVzdGFydDpmdW5jdGlvbih0LGUsbil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb24iKTtuPShudWxsPT1uP3FwKCk6K24pKyhudWxsPT1lPzA6K2UpLHRoaXMuX25leHR8fERwPT09dGhpc3x8KERwP0RwLl9uZXh0PXRoaXM6enA9dGhpcyxEcD10aGlzKSx0aGlzLl9jYWxsPXQsdGhpcy5fdGltZT1uLFFwKCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLl9jYWxsJiYodGhpcy5fY2FsbD1udWxsLHRoaXMuX3RpbWU9MS8wLFFwKCkpfX07dmFyIGVmPXdjKCJzdGFydCIsImVuZCIsImNhbmNlbCIsImludGVycnVwdCIpLG5mPVtdO2Z1bmN0aW9uIHJmKHQsZSxuLGkscixvKXt2YXIgYT10Ll9fdHJhbnNpdGlvbjtpZihhKXtpZihuIGluIGEpcmV0dXJufWVsc2UgdC5fX3RyYW5zaXRpb249e307IShmdW5jdGlvbiBzKHQsZSxuKXt2YXIgaSxyPXQuX190cmFuc2l0aW9uO2Z1bmN0aW9uIG8odCl7bi5zdGF0ZT0xLG4udGltZXIucmVzdGFydChhLG4uZGVsYXksbi50aW1lKSxuLmRlbGF5PD10JiZhKHQtbi5kZWxheSl9ZnVuY3Rpb24gYShvKXt2YXIgYyx1LGgsZDtpZigxIT09bi5zdGF0ZSlyZXR1cm4gbCgpO2ZvcihjIGluIHIpaWYoKGQ9cltjXSkubmFtZT09PW4ubmFtZSl7aWYoMz09PWQuc3RhdGUpcmV0dXJuIHRmKGEpOzQ9PT1kLnN0YXRlPyhkLnN0YXRlPTYsZC50aW1lci5zdG9wKCksZC5vbi5jYWxsKCJpbnRlcnJ1cHQiLHQsdC5fX2RhdGFfXyxkLmluZGV4LGQuZ3JvdXApLGRlbGV0ZSByW2NdKTorYzxlJiYoZC5zdGF0ZT02LGQudGltZXIuc3RvcCgpLGQub24uY2FsbCgiY2FuY2VsIix0LHQuX19kYXRhX18sZC5pbmRleCxkLmdyb3VwKSxkZWxldGUgcltjXSl9aWYodGYoKGZ1bmN0aW9uKCl7Mz09PW4uc3RhdGUmJihuLnN0YXRlPTQsbi50aW1lci5yZXN0YXJ0KHMsbi5kZWxheSxuLnRpbWUpLHMobykpfSkpLG4uc3RhdGU9MixuLm9uLmNhbGwoInN0YXJ0Iix0LHQuX19kYXRhX18sbi5pbmRleCxuLmdyb3VwKSwyPT09bi5zdGF0ZSl7Zm9yKG4uc3RhdGU9MyxpPW5ldyBBcnJheShoPW4udHdlZW4ubGVuZ3RoKSxjPTAsdT0tMTtjPGg7KytjKShkPW4udHdlZW5bY10udmFsdWUuY2FsbCh0LHQuX19kYXRhX18sbi5pbmRleCxuLmdyb3VwKSkmJihpWysrdV09ZCk7aS5sZW5ndGg9dSsxfX1mdW5jdGlvbiBzKGUpe2Zvcih2YXIgcj1lPG4uZHVyYXRpb24/bi5lYXNlLmNhbGwobnVsbCxlL24uZHVyYXRpb24pOihuLnRpbWVyLnJlc3RhcnQobCksbi5zdGF0ZT01LDEpLG89LTEsYT1pLmxlbmd0aDsrK288YTspaVtvXS5jYWxsKHQscik7NT09PW4uc3RhdGUmJihuLm9uLmNhbGwoImVuZCIsdCx0Ll9fZGF0YV9fLG4uaW5kZXgsbi5ncm91cCksbCgpKX1mdW5jdGlvbiBsKCl7Zm9yKHZhciBpIGluIG4uc3RhdGU9NixuLnRpbWVyLnN0b3AoKSxkZWxldGUgcltlXSxyKXJldHVybjtkZWxldGUgdC5fX3RyYW5zaXRpb259cltlXT1uLG4udGltZXI9JHAobywwLG4udGltZSl9KSh0LG4se25hbWU6ZSxpbmRleDppLGdyb3VwOnIsb246ZWYsdHdlZW46bmYsdGltZTpvLnRpbWUsZGVsYXk6by5kZWxheSxkdXJhdGlvbjpvLmR1cmF0aW9uLGVhc2U6by5lYXNlLHRpbWVyOm51bGwsc3RhdGU6MH0pfWZ1bmN0aW9uIG9mKHQsZSl7dmFyIG49c2YodCxlKTtpZihuLnN0YXRlPjApdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZTsgYWxyZWFkeSBzY2hlZHVsZWQiKTtyZXR1cm4gbn1mdW5jdGlvbiBhZih0LGUpe3ZhciBuPXNmKHQsZSk7aWYobi5zdGF0ZT4zKXRocm93IG5ldyBFcnJvcigidG9vIGxhdGU7IGFscmVhZHkgcnVubmluZyIpO3JldHVybiBufWZ1bmN0aW9uIHNmKHQsZSl7dmFyIG49dC5fX3RyYW5zaXRpb247aWYoIW58fCEobj1uW2VdKSl0aHJvdyBuZXcgRXJyb3IoInRyYW5zaXRpb24gbm90IGZvdW5kIik7cmV0dXJuIG59ZnVuY3Rpb24gbGYodCxlKXt2YXIgbixpLHIsbz10Ll9fdHJhbnNpdGlvbixhPSEwO2lmKG8pe2ZvcihyIGluIGU9bnVsbD09ZT9udWxsOmUrIiIsbykobj1vW3JdKS5uYW1lPT09ZT8oaT1uLnN0YXRlPjImJm4uc3RhdGU8NSxuLnN0YXRlPTYsbi50aW1lci5zdG9wKCksbi5vbi5jYWxsKGk/ImludGVycnVwdCI6ImNhbmNlbCIsdCx0Ll9fZGF0YV9fLG4uaW5kZXgsbi5ncm91cCksZGVsZXRlIG9bcl0pOmE9ITE7YSYmZGVsZXRlIHQuX190cmFuc2l0aW9ufX1mdW5jdGlvbiBjZih0LGUpe3ZhciBuLGk7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHI9YWYodGhpcyx0KSxvPXIudHdlZW47aWYobyE9PW4pZm9yKHZhciBhPTAscz0oaT1uPW8pLmxlbmd0aDthPHM7KythKWlmKGlbYV0ubmFtZT09PWUpeyhpPWkuc2xpY2UoKSkuc3BsaWNlKGEsMSk7YnJlYWt9ci50d2Vlbj1pfX1mdW5jdGlvbiB1Zih0LGUsbil7dmFyIGkscjtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89YWYodGhpcyx0KSxhPW8udHdlZW47aWYoYSE9PWkpe3I9KGk9YSkuc2xpY2UoKTtmb3IodmFyIHM9e25hbWU6ZSx2YWx1ZTpufSxsPTAsYz1yLmxlbmd0aDtsPGM7KytsKWlmKHJbbF0ubmFtZT09PWUpe3JbbF09czticmVha31sPT09YyYmci5wdXNoKHMpfW8udHdlZW49cn19ZnVuY3Rpb24gaGYodCxlLG4pe3ZhciBpPXQuX2lkO3JldHVybiB0LmVhY2goKGZ1bmN0aW9uKCl7dmFyIHQ9YWYodGhpcyxpKTsodC52YWx1ZXx8KHQudmFsdWU9e30pKVtlXT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pKSxmdW5jdGlvbih0KXtyZXR1cm4gc2YodCxpKS52YWx1ZVtlXX19ZnVuY3Rpb24gZGYodCxlKXt2YXIgbjtyZXR1cm4oIm51bWJlciI9PXR5cGVvZiBlP3JwOmUgaW5zdGFuY2VvZiBKaD9LZDoobj1KaChlKSk/KGU9bixLZCk6bHApKHQsZSl9ZnVuY3Rpb24gcGYodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fWZ1bmN0aW9uIGZmKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19ZnVuY3Rpb24gbWYodCxlLG4pe3ZhciBpLHIsbz1uKyIiO3JldHVybiBmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0QXR0cmlidXRlKHQpO3JldHVybiBhPT09bz9udWxsOmE9PT1pP3I6cj1lKGk9YSxuKX19ZnVuY3Rpb24gZ2YodCxlLG4pe3ZhciBpLHIsbz1uKyIiO3JldHVybiBmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKTtyZXR1cm4gYT09PW8/bnVsbDphPT09aT9yOnI9ZShpPWEsbil9fWZ1bmN0aW9uIF9mKHQsZSxuKXt2YXIgaSxyLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGEscyxsPW4odGhpcyk7aWYobnVsbCE9bClyZXR1cm4oYT10aGlzLmdldEF0dHJpYnV0ZSh0KSk9PT0ocz1sKyIiKT9udWxsOmE9PT1pJiZzPT09cj9vOihyPXMsbz1lKGk9YSxsKSk7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fWZ1bmN0aW9uIHlmKHQsZSxuKXt2YXIgaSxyLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGEscyxsPW4odGhpcyk7aWYobnVsbCE9bClyZXR1cm4oYT10aGlzLmdldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCkpPT09KHM9bCsiIik/bnVsbDphPT09aSYmcz09PXI/bzoocj1zLG89ZShpPWEsbCkpO3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19ZnVuY3Rpb24gdmYodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7dGhpcy5zZXRBdHRyaWJ1dGUodCxlLmNhbGwodGhpcyxuKSl9fWZ1bmN0aW9uIGJmKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3RoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLGUuY2FsbCh0aGlzLG4pKX19ZnVuY3Rpb24geGYodCxlKXt2YXIgbixpO2Z1bmN0aW9uIHIoKXt2YXIgcj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gciE9PWkmJihuPShpPXIpJiZiZih0LHIpKSxufXJldHVybiByLl92YWx1ZT1lLHJ9ZnVuY3Rpb24gd2YodCxlKXt2YXIgbixpO2Z1bmN0aW9uIHIoKXt2YXIgcj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gciE9PWkmJihuPShpPXIpJiZ2Zih0LHIpKSxufXJldHVybiByLl92YWx1ZT1lLHJ9ZnVuY3Rpb24gU2YodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtvZih0aGlzLHQpLmRlbGF5PStlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gTWYodCxlKXtyZXR1cm4gZT0rZSxmdW5jdGlvbigpe29mKHRoaXMsdCkuZGVsYXk9ZX19ZnVuY3Rpb24gRWYodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXthZih0aGlzLHQpLmR1cmF0aW9uPStlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24gVGYodCxlKXtyZXR1cm4gZT0rZSxmdW5jdGlvbigpe2FmKHRoaXMsdCkuZHVyYXRpb249ZX19ZnVuY3Rpb24gQ2YodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7YWYodGhpcyx0KS5lYXNlPWV9fWZ1bmN0aW9uIEFmKHQsZSxuKXt2YXIgaSxyLG89KGZ1bmN0aW9uIGEodCl7cmV0dXJuKHQrIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKS5ldmVyeSgoZnVuY3Rpb24odCl7dmFyIGU9dC5pbmRleE9mKCIuIik7cmV0dXJuIGU+PTAmJih0PXQuc2xpY2UoMCxlKSksIXR8fCJzdGFydCI9PT10fSkpfSkoZSk/b2Y6YWY7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9byh0aGlzLHQpLHM9YS5vbjtzIT09aSYmKHI9KGk9cykuY29weSgpKS5vbihlLG4pLGEub249cn19dmFyIGtmPXp1LnByb3RvdHlwZS5jb25zdHJ1Y3RvcjtmdW5jdGlvbiBMZih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfX1mdW5jdGlvbiBQZih0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKGkpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxlLmNhbGwodGhpcyxpKSxuKX19ZnVuY3Rpb24gTmYodCxlLG4pe3ZhciBpLHI7ZnVuY3Rpb24gbygpe3ZhciBvPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBvIT09ciYmKGk9KHI9bykmJlBmKHQsbyxuKSksaX1yZXR1cm4gby5fdmFsdWU9ZSxvfWZ1bmN0aW9uIElmKHQpe3JldHVybiBmdW5jdGlvbihlKXt0aGlzLnRleHRDb250ZW50PXQuY2FsbCh0aGlzLGUpfX1mdW5jdGlvbiBSZih0KXt2YXIgZSxuO2Z1bmN0aW9uIGkoKXt2YXIgaT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTtyZXR1cm4gaSE9PW4mJihlPShuPWkpJiZJZihpKSksZX1yZXR1cm4gaS5fdmFsdWU9dCxpfXZhciBPZj0wO2Z1bmN0aW9uIHpmKHQsZSxuLGkpe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9ZSx0aGlzLl9uYW1lPW4sdGhpcy5faWQ9aX1mdW5jdGlvbiBEZih0KXtyZXR1cm4genUoKS50cmFuc2l0aW9uKHQpfWZ1bmN0aW9uIEJmKCl7cmV0dXJuKytPZn12YXIgSGY9enUucHJvdG90eXBlO2Z1bmN0aW9uIEZmKHQpe3JldHVybit0fWZ1bmN0aW9uIFZmKHQpe3JldHVybiB0KnR9ZnVuY3Rpb24gVWYodCl7cmV0dXJuIHQqKDItdCl9ZnVuY3Rpb24gamYodCl7cmV0dXJuKCh0Kj0yKTw9MT90KnQ6LS10KigyLXQpKzEpLzJ9ZnVuY3Rpb24gR2YodCl7cmV0dXJuIHQqdCp0fWZ1bmN0aW9uIFdmKHQpe3JldHVybi0tdCp0KnQrMX1mdW5jdGlvbiBxZih0KXtyZXR1cm4oKHQqPTIpPD0xP3QqdCp0Oih0LT0yKSp0KnQrMikvMn16Zi5wcm90b3R5cGU9RGYucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp6ZixzZWxlY3Q6ZnVuY3Rpb24gWWYodCl7dmFyIGU9dGhpcy5fbmFtZSxuPXRoaXMuX2lkOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1SYyh0KSk7Zm9yKHZhciBpPXRoaXMuX2dyb3VwcyxyPWkubGVuZ3RoLG89bmV3IEFycmF5KHIpLGE9MDthPHI7KythKWZvcih2YXIgcyxsLGM9aVthXSx1PWMubGVuZ3RoLGg9b1thXT1uZXcgQXJyYXkodSksZD0wO2Q8dTsrK2QpKHM9Y1tkXSkmJihsPXQuY2FsbChzLHMuX19kYXRhX18sZCxjKSkmJigiX19kYXRhX18iaW4gcyYmKGwuX19kYXRhX189cy5fX2RhdGFfXyksaFtkXT1sLHJmKGhbZF0sZSxuLGQsaCxzZihzLG4pKSk7cmV0dXJuIG5ldyB6ZihvLHRoaXMuX3BhcmVudHMsZSxuKX0sc2VsZWN0QWxsOmZ1bmN0aW9uIFhmKHQpe3ZhciBlPXRoaXMuX25hbWUsbj10aGlzLl9pZDsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9emModCkpO2Zvcih2YXIgaT10aGlzLl9ncm91cHMscj1pLmxlbmd0aCxvPVtdLGE9W10scz0wO3M8cjsrK3MpZm9yKHZhciBsLGM9aVtzXSx1PWMubGVuZ3RoLGg9MDtoPHU7KytoKWlmKGw9Y1toXSl7Zm9yKHZhciBkLHA9dC5jYWxsKGwsbC5fX2RhdGFfXyxoLGMpLGY9c2YobCxuKSxtPTAsZz1wLmxlbmd0aDttPGc7KyttKShkPXBbbV0pJiZyZihkLGUsbixtLHAsZik7by5wdXNoKHApLGEucHVzaChsKX1yZXR1cm4gbmV3IHpmKG8sYSxlLG4pfSxmaWx0ZXI6ZnVuY3Rpb24gJGYodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PURjKHQpKTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49ZS5sZW5ndGgsaT1uZXcgQXJyYXkobikscj0wO3I8bjsrK3IpZm9yKHZhciBvLGE9ZVtyXSxzPWEubGVuZ3RoLGw9aVtyXT1bXSxjPTA7YzxzOysrYykobz1hW2NdKSYmdC5jYWxsKG8sby5fX2RhdGFfXyxjLGEpJiZsLnB1c2gobyk7cmV0dXJuIG5ldyB6ZihpLHRoaXMuX3BhcmVudHMsdGhpcy5fbmFtZSx0aGlzLl9pZCl9LG1lcmdlOmZ1bmN0aW9uIEtmKHQpe2lmKHQuX2lkIT09dGhpcy5faWQpdGhyb3cgbmV3IEVycm9yO2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj10Ll9ncm91cHMsaT1lLmxlbmd0aCxyPU1hdGgubWluKGksbi5sZW5ndGgpLG89bmV3IEFycmF5KGkpLGE9MDthPHI7KythKWZvcih2YXIgcyxsPWVbYV0sYz1uW2FdLHU9bC5sZW5ndGgsaD1vW2FdPW5ldyBBcnJheSh1KSxkPTA7ZDx1OysrZCkocz1sW2RdfHxjW2RdKSYmKGhbZF09cyk7Zm9yKDthPGk7KythKW9bYV09ZVthXTtyZXR1cm4gbmV3IHpmKG8sdGhpcy5fcGFyZW50cyx0aGlzLl9uYW1lLHRoaXMuX2lkKX0sc2VsZWN0aW9uOmZ1bmN0aW9uIFpmKCl7cmV0dXJuIG5ldyBrZih0aGlzLl9ncm91cHMsdGhpcy5fcGFyZW50cyl9LHRyYW5zaXRpb246ZnVuY3Rpb24gSmYoKXtmb3IodmFyIHQ9dGhpcy5fbmFtZSxlPXRoaXMuX2lkLG49QmYoKSxpPXRoaXMuX2dyb3VwcyxyPWkubGVuZ3RoLG89MDtvPHI7KytvKWZvcih2YXIgYSxzPWlbb10sbD1zLmxlbmd0aCxjPTA7YzxsOysrYylpZihhPXNbY10pe3ZhciB1PXNmKGEsZSk7cmYoYSx0LG4sYyxzLHt0aW1lOnUudGltZSt1LmRlbGF5K3UuZHVyYXRpb24sZGVsYXk6MCxkdXJhdGlvbjp1LmR1cmF0aW9uLGVhc2U6dS5lYXNlfSl9cmV0dXJuIG5ldyB6ZihpLHRoaXMuX3BhcmVudHMsdCxuKX0sY2FsbDpIZi5jYWxsLG5vZGVzOkhmLm5vZGVzLG5vZGU6SGYubm9kZSxzaXplOkhmLnNpemUsZW1wdHk6SGYuZW1wdHksZWFjaDpIZi5lYWNoLG9uOmZ1bmN0aW9uIFFmKHQsZSl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj9zZih0aGlzLm5vZGUoKSxuKS5vbi5vbih0KTp0aGlzLmVhY2goQWYobix0LGUpKX0sYXR0cjpmdW5jdGlvbiB0bSh0LGUpe3ZhciBuPWtjKHQpLGk9InRyYW5zZm9ybSI9PT1uP3hwOmRmO3JldHVybiB0aGlzLmF0dHJUd2Vlbih0LCJmdW5jdGlvbiI9PXR5cGVvZiBlPyhuLmxvY2FsP3lmOl9mKShuLGksaGYodGhpcywiYXR0ci4iK3QsZSkpOm51bGw9PWU/KG4ubG9jYWw/ZmY6cGYpKG4pOihuLmxvY2FsP2dmOm1mKShuLGksZSkpfSxhdHRyVHdlZW46ZnVuY3Rpb24gZW0odCxlKXt2YXIgbj0iYXR0ci4iK3Q7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXJldHVybihuPXRoaXMudHdlZW4obikpJiZuLl92YWx1ZTtpZihudWxsPT1lKXJldHVybiB0aGlzLnR3ZWVuKG4sbnVsbCk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yO3ZhciBpPWtjKHQpO3JldHVybiB0aGlzLnR3ZWVuKG4sKGkubG9jYWw/eGY6d2YpKGksZSkpfSxzdHlsZTpmdW5jdGlvbiBubSh0LGUsbil7dmFyIGk9InRyYW5zZm9ybSI9PSh0Kz0iIik/dnA6ZGY7cmV0dXJuIG51bGw9PWU/dGhpcy5zdHlsZVR3ZWVuKHQsKGZ1bmN0aW9uIHIodCxlKXt2YXIgbixpLHI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89UWModGhpcyx0KSxhPSh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLFFjKHRoaXMsdCkpO3JldHVybiBvPT09YT9udWxsOm89PT1uJiZhPT09aT9yOnI9ZShuPW8saT1hKX19KSh0LGkpKS5vbigiZW5kLnN0eWxlLiIrdCxMZih0KSk6ImZ1bmN0aW9uIj09dHlwZW9mIGU/dGhpcy5zdHlsZVR3ZWVuKHQsKGZ1bmN0aW9uIGEodCxlLG4pe3ZhciBpLHIsbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT1RYyh0aGlzLHQpLHM9bih0aGlzKSxsPXMrIiI7cmV0dXJuIG51bGw9PXMmJih0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLGw9cz1RYyh0aGlzLHQpKSxhPT09bD9udWxsOmE9PT1pJiZsPT09cj9vOihyPWwsbz1lKGk9YSxzKSl9fSkodCxpLGhmKHRoaXMsInN0eWxlLiIrdCxlKSkpLmVhY2goKGZ1bmN0aW9uIG8odCxlKXt2YXIgbixpLHIsbyxhPSJzdHlsZS4iK2Uscz0iZW5kLiIrYTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbD1hZih0aGlzLHQpLGM9bC5vbix1PW51bGw9PWwudmFsdWVbYV0/b3x8KG89TGYoZSkpOnZvaWQgMDtjPT09biYmcj09PXV8fChpPShuPWMpLmNvcHkoKSkub24ocyxyPXUpLGwub249aX19KSh0aGlzLl9pZCx0KSk6dGhpcy5zdHlsZVR3ZWVuKHQsKGZ1bmN0aW9uIHModCxlLG4pe3ZhciBpLHIsbz1uKyIiO3JldHVybiBmdW5jdGlvbigpe3ZhciBhPVFjKHRoaXMsdCk7cmV0dXJuIGE9PT1vP251bGw6YT09PWk/cjpyPWUoaT1hLG4pfX0pKHQsaSxlKSxuKS5vbigiZW5kLnN0eWxlLiIrdCxudWxsKX0sc3R5bGVUd2VlbjpmdW5jdGlvbiBpbSh0LGUsbil7dmFyIGk9InN0eWxlLiIrKHQrPSIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKGk9dGhpcy50d2VlbihpKSkmJmkuX3ZhbHVlO2lmKG51bGw9PWUpcmV0dXJuIHRoaXMudHdlZW4oaSxudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHRoaXMudHdlZW4oaSxOZih0LGUsbnVsbD09bj8iIjpuKSl9LHRleHQ6ZnVuY3Rpb24gcm0odCl7cmV0dXJuIHRoaXMudHdlZW4oInRleHQiLCJmdW5jdGlvbiI9PXR5cGVvZiB0PyhmdW5jdGlvbiBlKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQodGhpcyk7dGhpcy50ZXh0Q29udGVudD1udWxsPT1lPyIiOmV9fSkoaGYodGhpcywidGV4dCIsdCkpOihmdW5jdGlvbiBuKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19KShudWxsPT10PyIiOnQrIiIpKX0sdGV4dFR3ZWVuOmZ1bmN0aW9uIG9tKHQpe3ZhciBlPSJ0ZXh0IjtpZihhcmd1bWVudHMubGVuZ3RoPDEpcmV0dXJuKGU9dGhpcy50d2VlbihlKSkmJmUuX3ZhbHVlO2lmKG51bGw9PXQpcmV0dXJuIHRoaXMudHdlZW4oZSxudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHRoaXMudHdlZW4oZSxSZih0KSl9LHJlbW92ZTpmdW5jdGlvbiBhbSgpe3JldHVybiB0aGlzLm9uKCJlbmQucmVtb3ZlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD10aGlzLnBhcmVudE5vZGU7Zm9yKHZhciBuIGluIHRoaXMuX190cmFuc2l0aW9uKWlmKCtuIT09ZSlyZXR1cm47dCYmdC5yZW1vdmVDaGlsZCh0aGlzKX19KSh0aGlzLl9pZCkpfSx0d2VlbjpmdW5jdGlvbiBzbSh0LGUpe3ZhciBuPXRoaXMuX2lkO2lmKHQrPSIiLGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHZhciBpLHI9c2YodGhpcy5ub2RlKCksbikudHdlZW4sbz0wLGE9ci5sZW5ndGg7bzxhOysrbylpZigoaT1yW29dKS5uYW1lPT09dClyZXR1cm4gaS52YWx1ZTtyZXR1cm4gbnVsbH1yZXR1cm4gdGhpcy5lYWNoKChudWxsPT1lP2NmOnVmKShuLHQsZSkpfSxkZWxheTpmdW5jdGlvbiBsbSh0KXt2YXIgZT10aGlzLl9pZDtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiB0P1NmOk1mKShlLHQpKTpzZih0aGlzLm5vZGUoKSxlKS5kZWxheX0sZHVyYXRpb246ZnVuY3Rpb24gY20odCl7dmFyIGU9dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9FZjpUZikoZSx0KSk6c2YodGhpcy5ub2RlKCksZSkuZHVyYXRpb259LGVhc2U6ZnVuY3Rpb24gdW0odCl7dmFyIGU9dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKENmKGUsdCkpOnNmKHRoaXMubm9kZSgpLGUpLmVhc2V9LGVuZDpmdW5jdGlvbiBobSgpe3ZhciB0LGUsbj10aGlzLGk9bi5faWQscj1uLnNpemUoKTtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKG8sYSl7dmFyIHM9e3ZhbHVlOmF9LGw9e3ZhbHVlOmZ1bmN0aW9uKCl7MD09LS1yJiZvKCl9fTtuLmVhY2goKGZ1bmN0aW9uKCl7dmFyIG49YWYodGhpcyxpKSxyPW4ub247ciE9PXQmJigoZT0odD1yKS5jb3B5KCkpLl8uY2FuY2VsLnB1c2gocyksZS5fLmludGVycnVwdC5wdXNoKHMpLGUuXy5lbmQucHVzaChsKSksbi5vbj1lfSkpfSkpfX07dmFyIGRtPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIE1hdGgucG93KHQsZSl9cmV0dXJuIGU9K2Usbi5leHBvbmVudD10LG59KSgzKSxwbT0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiAxLU1hdGgucG93KDEtdCxlKX1yZXR1cm4gZT0rZSxuLmV4cG9uZW50PXQsbn0pKDMpLGZtPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuKCh0Kj0yKTw9MT9NYXRoLnBvdyh0LGUpOjItTWF0aC5wb3coMi10LGUpKS8yfXJldHVybiBlPStlLG4uZXhwb25lbnQ9dCxufSkoMyksbW09TWF0aC5QSSxnbT1tbS8yO2Z1bmN0aW9uIF9tKHQpe3JldHVybiAxPT0rdD8xOjEtTWF0aC5jb3ModCpnbSl9ZnVuY3Rpb24geW0odCl7cmV0dXJuIE1hdGguc2luKHQqZ20pfWZ1bmN0aW9uIHZtKHQpe3JldHVybigxLU1hdGguY29zKG1tKnQpKS8yfWZ1bmN0aW9uIGJtKHQpe3JldHVybiAxLjAwMDk3NzUxNzEwNjU0OTQqKE1hdGgucG93KDIsLTEwKnQpLS4wMDA5NzY1NjI1KX1mdW5jdGlvbiB4bSh0KXtyZXR1cm4gYm0oMS0rdCl9ZnVuY3Rpb24gd20odCl7cmV0dXJuIDEtYm0odCl9ZnVuY3Rpb24gU20odCl7cmV0dXJuKCh0Kj0yKTw9MT9ibSgxLXQpOjItYm0odC0xKSkvMn1mdW5jdGlvbiBNbSh0KXtyZXR1cm4gMS1NYXRoLnNxcnQoMS10KnQpfWZ1bmN0aW9uIEVtKHQpe3JldHVybiBNYXRoLnNxcnQoMS0gLS10KnQpfWZ1bmN0aW9uIFRtKHQpe3JldHVybigodCo9Mik8PTE/MS1NYXRoLnNxcnQoMS10KnQpOk1hdGguc3FydCgxLSh0LT0yKSp0KSsxKS8yfXZhciBDbT00LzExLEFtPTcuNTYyNTtmdW5jdGlvbiBrbSh0KXtyZXR1cm4gMS1MbSgxLXQpfWZ1bmN0aW9uIExtKHQpe3JldHVybih0PSt0KTxDbT9BbSp0KnQ6dDwuNzI3MjcyNzI3MjcyNzI3Mz9BbSoodC09LjU0NTQ1NDU0NTQ1NDU0NTQpKnQrLjc1OnQ8LjkwOTA5MDkwOTA5MDkwOTE/QW0qKHQtPS44MTgxODE4MTgxODE4MTgyKSp0Ky45Mzc1OkFtKih0LT0uOTU0NTQ1NDU0NTQ1NDU0NikqdCsuOTg0Mzc1fWZ1bmN0aW9uIFBtKHQpe3JldHVybigodCo9Mik8PTE/MS1MbSgxLXQpOkxtKHQtMSkrMSkvMn12YXIgTm09MS43MDE1OCxJbT0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybih0PSt0KSp0KihlKih0LTEpK3QpfXJldHVybiBlPStlLG4ub3ZlcnNob290PXQsbn0pKE5tKSxSbT0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybi0tdCp0KigodCsxKSplK3QpKzF9cmV0dXJuIGU9K2Usbi5vdmVyc2hvb3Q9dCxufSkoTm0pLE9tPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuKCh0Kj0yKTwxP3QqdCooKGUrMSkqdC1lKToodC09MikqdCooKGUrMSkqdCtlKSsyKS8yfXJldHVybiBlPStlLG4ub3ZlcnNob290PXQsbn0pKE5tKSx6bT0yKk1hdGguUEksRG09KGZ1bmN0aW9uIHQoZSxuKXt2YXIgaT1NYXRoLmFzaW4oMS8oZT1NYXRoLm1heCgxLGUpKSkqKG4vPXptKTtmdW5jdGlvbiByKHQpe3JldHVybiBlKmJtKC0gLS10KSpNYXRoLnNpbigoaS10KS9uKX1yZXR1cm4gci5hbXBsaXR1ZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSxuKnptKX0sci5wZXJpb2Q9ZnVuY3Rpb24obil7cmV0dXJuIHQoZSxuKX0scn0pKDEsLjMpLEJtPShmdW5jdGlvbiB0KGUsbil7dmFyIGk9TWF0aC5hc2luKDEvKGU9TWF0aC5tYXgoMSxlKSkpKihuLz16bSk7ZnVuY3Rpb24gcih0KXtyZXR1cm4gMS1lKmJtKHQ9K3QpKk1hdGguc2luKCh0K2kpL24pfXJldHVybiByLmFtcGxpdHVkZT1mdW5jdGlvbihlKXtyZXR1cm4gdChlLG4qem0pfSxyLnBlcmlvZD1mdW5jdGlvbihuKXtyZXR1cm4gdChlLG4pfSxyfSkoMSwuMyksSG09KGZ1bmN0aW9uIHQoZSxuKXt2YXIgaT1NYXRoLmFzaW4oMS8oZT1NYXRoLm1heCgxLGUpKSkqKG4vPXptKTtmdW5jdGlvbiByKHQpe3JldHVybigodD0yKnQtMSk8MD9lKmJtKC10KSpNYXRoLnNpbigoaS10KS9uKToyLWUqYm0odCkqTWF0aC5zaW4oKGkrdCkvbikpLzJ9cmV0dXJuIHIuYW1wbGl0dWRlPWZ1bmN0aW9uKGUpe3JldHVybiB0KGUsbip6bSl9LHIucGVyaW9kPWZ1bmN0aW9uKG4pe3JldHVybiB0KGUsbil9LHJ9KSgxLC4zKSxGbT1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxlYXNlTGluZWFyOkZmLGVhc2VRdWFkOmpmLGVhc2VRdWFkSW46VmYsZWFzZVF1YWRPdXQ6VWYsZWFzZVF1YWRJbk91dDpqZixlYXNlQ3ViaWM6cWYsZWFzZUN1YmljSW46R2YsZWFzZUN1YmljT3V0OldmLGVhc2VDdWJpY0luT3V0OnFmLGVhc2VQb2x5OmZtLGVhc2VQb2x5SW46ZG0sZWFzZVBvbHlPdXQ6cG0sZWFzZVBvbHlJbk91dDpmbSxlYXNlU2luOnZtLGVhc2VTaW5JbjpfbSxlYXNlU2luT3V0OnltLGVhc2VTaW5Jbk91dDp2bSxlYXNlRXhwOlNtLGVhc2VFeHBJbjp4bSxlYXNlRXhwT3V0OndtLGVhc2VFeHBJbk91dDpTbSxlYXNlQ2lyY2xlOlRtLGVhc2VDaXJjbGVJbjpNbSxlYXNlQ2lyY2xlT3V0OkVtLGVhc2VDaXJjbGVJbk91dDpUbSxlYXNlQm91bmNlOkxtLGVhc2VCb3VuY2VJbjprbSxlYXNlQm91bmNlT3V0OkxtLGVhc2VCb3VuY2VJbk91dDpQbSxlYXNlQmFjazpPbSxlYXNlQmFja0luOkltLGVhc2VCYWNrT3V0OlJtLGVhc2VCYWNrSW5PdXQ6T20sZWFzZUVsYXN0aWM6Qm0sZWFzZUVsYXN0aWNJbjpEbSxlYXNlRWxhc3RpY091dDpCbSxlYXNlRWxhc3RpY0luT3V0OkhtfSksVm09e3RpbWU6bnVsbCxkZWxheTowLGR1cmF0aW9uOjI1MCxlYXNlOnFmfTtmdW5jdGlvbiBVbSh0LGUpe2Zvcih2YXIgbjshKG49dC5fX3RyYW5zaXRpb24pfHwhKG49bltlXSk7KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybiBWbS50aW1lPXFwKCksVm07cmV0dXJuIG59enUucHJvdG90eXBlLmludGVycnVwdD1mdW5jdGlvbiBqbSh0KXtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe2xmKHRoaXMsdCl9KSl9LHp1LnByb3RvdHlwZS50cmFuc2l0aW9uPWZ1bmN0aW9uIEdtKHQpe3ZhciBlLG47dCBpbnN0YW5jZW9mIHpmPyhlPXQuX2lkLHQ9dC5fbmFtZSk6KGU9QmYoKSwobj1WbSkudGltZT1xcCgpLHQ9bnVsbD09dD9udWxsOnQrIiIpO2Zvcih2YXIgaT10aGlzLl9ncm91cHMscj1pLmxlbmd0aCxvPTA7bzxyOysrbylmb3IodmFyIGEscz1pW29dLGw9cy5sZW5ndGgsYz0wO2M8bDsrK2MpKGE9c1tjXSkmJnJmKGEsdCxlLGMscyxufHxVbShhLGUpKTtyZXR1cm4gbmV3IHpmKGksdGhpcy5fcGFyZW50cyx0LGUpfTt2YXIgV209W251bGxdO2Z1bmN0aW9uIHFtKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBZbSh0LGUsbil7dGhpcy50YXJnZXQ9dCx0aGlzLnR5cGU9ZSx0aGlzLnNlbGVjdGlvbj1ufWZ1bmN0aW9uIFhtKCl7TXUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gJG0oKXtNdS5wcmV2ZW50RGVmYXVsdCgpLE11LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfXZhciBLbT17bmFtZToiZHJhZyJ9LFptPXtuYW1lOiJzcGFjZSJ9LEptPXtuYW1lOiJoYW5kbGUifSxRbT17bmFtZToiY2VudGVyIn07ZnVuY3Rpb24gdGcodCl7cmV0dXJuWyt0WzBdLCt0WzFdXX1mdW5jdGlvbiBlZyh0KXtyZXR1cm5bdGcodFswXSksdGcodFsxXSldfWZ1bmN0aW9uIG5nKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gd2goZSxNdS50b3VjaGVzLHQpfX12YXIgaWc9e25hbWU6IngiLGhhbmRsZXM6WyJ3IiwiZSJdLm1hcChoZyksaW5wdXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD9udWxsOltbK3RbMF0sZVswXVsxXV0sWyt0WzFdLGVbMV1bMV1dXX0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZbdFswXVswXSx0WzFdWzBdXX19LHJnPXtuYW1lOiJ5IixoYW5kbGVzOlsibiIsInMiXS5tYXAoaGcpLGlucHV0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/bnVsbDpbW2VbMF1bMF0sK3RbMF1dLFtlWzFdWzBdLCt0WzFdXV19LG91dHB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmW3RbMF1bMV0sdFsxXVsxXV19fSxvZz17bmFtZToieHkiLGhhbmRsZXM6WyJuIiwidyIsImUiLCJzIiwibnciLCJuZSIsInN3Iiwic2UiXS5tYXAoaGcpLGlucHV0OmZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P251bGw6ZWcodCl9LG91dHB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdH19LGFnPXtvdmVybGF5OiJjcm9zc2hhaXIiLHNlbGVjdGlvbjoibW92ZSIsbjoibnMtcmVzaXplIixlOiJldy1yZXNpemUiLHM6Im5zLXJlc2l6ZSIsdzoiZXctcmVzaXplIixudzoibndzZS1yZXNpemUiLG5lOiJuZXN3LXJlc2l6ZSIsc2U6Im53c2UtcmVzaXplIixzdzoibmVzdy1yZXNpemUifSxzZz17ZToidyIsdzoiZSIsbnc6Im5lIixuZToibnciLHNlOiJzdyIsc3c6InNlIn0sbGc9e246InMiLHM6Im4iLG53OiJzdyIsbmU6InNlIixzZToibmUiLHN3OiJudyJ9LGNnPXtvdmVybGF5OjEsc2VsZWN0aW9uOjEsbjpudWxsLGU6MSxzOm51bGwsdzotMSxudzotMSxuZToxLHNlOjEsc3c6LTF9LHVnPXtvdmVybGF5OjEsc2VsZWN0aW9uOjEsbjotMSxlOm51bGwsczoxLHc6bnVsbCxudzotMSxuZTotMSxzZToxLHN3OjF9O2Z1bmN0aW9uIGhnKHQpe3JldHVybnt0eXBlOnR9fWZ1bmN0aW9uIGRnKCl7cmV0dXJuIU11LmN0cmxLZXkmJiFNdS5idXR0b259ZnVuY3Rpb24gcGcoKXt2YXIgdD10aGlzLm93bmVyU1ZHRWxlbWVudHx8dGhpcztyZXR1cm4gdC5oYXNBdHRyaWJ1dGUoInZpZXdCb3giKT9bWyh0PXQudmlld0JveC5iYXNlVmFsKS54LHQueV0sW3QueCt0LndpZHRoLHQueSt0LmhlaWdodF1dOltbMCwwXSxbdC53aWR0aC5iYXNlVmFsLnZhbHVlLHQuaGVpZ2h0LmJhc2VWYWwudmFsdWVdXX1mdW5jdGlvbiBmZygpe3JldHVybiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHN8fCJvbnRvdWNoc3RhcnQiaW4gdGhpc31mdW5jdGlvbiBtZyh0KXtmb3IoOyF0Ll9fYnJ1c2g7KWlmKCEodD10LnBhcmVudE5vZGUpKXJldHVybjtyZXR1cm4gdC5fX2JydXNofWZ1bmN0aW9uIGdnKHQpe3JldHVybiB0WzBdWzBdPT09dFsxXVswXXx8dFswXVsxXT09PXRbMV1bMV19ZnVuY3Rpb24gX2codCl7dmFyIGU9dC5fX2JydXNoO3JldHVybiBlP2UuZGltLm91dHB1dChlLnNlbGVjdGlvbik6bnVsbH1mdW5jdGlvbiB5Zygpe3JldHVybiBiZyhyZyl9ZnVuY3Rpb24gdmcoKXtyZXR1cm4gYmcob2cpfWZ1bmN0aW9uIGJnKHQpe3ZhciBlLG49cGcsaT1kZyxyPWZnLG89ITAsYT13Yygic3RhcnQiLCJicnVzaCIsImVuZCIpLHM9NjtmdW5jdGlvbiBsKGUpe3ZhciBuPWUucHJvcGVydHkoIl9fYnJ1c2giLG0pLnNlbGVjdEFsbCgiLm92ZXJsYXkiKS5kYXRhKFtoZygib3ZlcmxheSIpXSk7bi5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwib3ZlcmxheSIpLmF0dHIoInBvaW50ZXItZXZlbnRzIiwiYWxsIikuYXR0cigiY3Vyc29yIixhZy5vdmVybGF5KS5tZXJnZShuKS5lYWNoKChmdW5jdGlvbigpe3ZhciB0PW1nKHRoaXMpLmV4dGVudDtEdSh0aGlzKS5hdHRyKCJ4Iix0WzBdWzBdKS5hdHRyKCJ5Iix0WzBdWzFdKS5hdHRyKCJ3aWR0aCIsdFsxXVswXS10WzBdWzBdKS5hdHRyKCJoZWlnaHQiLHRbMV1bMV0tdFswXVsxXSl9KSksZS5zZWxlY3RBbGwoIi5zZWxlY3Rpb24iKS5kYXRhKFtoZygic2VsZWN0aW9uIildKS5lbnRlcigpLmFwcGVuZCgicmVjdCIpLmF0dHIoImNsYXNzIiwic2VsZWN0aW9uIikuYXR0cigiY3Vyc29yIixhZy5zZWxlY3Rpb24pLmF0dHIoImZpbGwiLCIjNzc3IikuYXR0cigiZmlsbC1vcGFjaXR5IiwuMykuYXR0cigic3Ryb2tlIiwiI2ZmZiIpLmF0dHIoInNoYXBlLXJlbmRlcmluZyIsImNyaXNwRWRnZXMiKTt2YXIgaT1lLnNlbGVjdEFsbCgiLmhhbmRsZSIpLmRhdGEodC5oYW5kbGVzLChmdW5jdGlvbih0KXtyZXR1cm4gdC50eXBlfSkpO2kuZXhpdCgpLnJlbW92ZSgpLGkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsKGZ1bmN0aW9uKHQpe3JldHVybiJoYW5kbGUgaGFuZGxlLS0iK3QudHlwZX0pKS5hdHRyKCJjdXJzb3IiLChmdW5jdGlvbih0KXtyZXR1cm4gYWdbdC50eXBlXX0pKSxlLmVhY2goYykuYXR0cigiZmlsbCIsIm5vbmUiKS5hdHRyKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLm9uKCJtb3VzZWRvd24uYnJ1c2giLGQpLmZpbHRlcihyKS5vbigidG91Y2hzdGFydC5icnVzaCIsZCkub24oInRvdWNobW92ZS5icnVzaCIscCkub24oInRvdWNoZW5kLmJydXNoIHRvdWNoY2FuY2VsLmJydXNoIixmKS5zdHlsZSgidG91Y2gtYWN0aW9uIiwibm9uZSIpLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCJyZ2JhKDAsMCwwLDApIil9ZnVuY3Rpb24gYygpe3ZhciB0PUR1KHRoaXMpLGU9bWcodGhpcykuc2VsZWN0aW9uO2U/KHQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLmF0dHIoIngiLGVbMF1bMF0pLmF0dHIoInkiLGVbMF1bMV0pLmF0dHIoIndpZHRoIixlWzFdWzBdLWVbMF1bMF0pLmF0dHIoImhlaWdodCIsZVsxXVsxXS1lWzBdWzFdKSx0LnNlbGVjdEFsbCgiLmhhbmRsZSIpLnN0eWxlKCJkaXNwbGF5IixudWxsKS5hdHRyKCJ4IiwoZnVuY3Rpb24odCl7cmV0dXJuImUiPT09dC50eXBlW3QudHlwZS5sZW5ndGgtMV0/ZVsxXVswXS1zLzI6ZVswXVswXS1zLzJ9KSkuYXR0cigieSIsKGZ1bmN0aW9uKHQpe3JldHVybiJzIj09PXQudHlwZVswXT9lWzFdWzFdLXMvMjplWzBdWzFdLXMvMn0pKS5hdHRyKCJ3aWR0aCIsKGZ1bmN0aW9uKHQpe3JldHVybiJuIj09PXQudHlwZXx8InMiPT09dC50eXBlP2VbMV1bMF0tZVswXVswXStzOnN9KSkuYXR0cigiaGVpZ2h0IiwoZnVuY3Rpb24odCl7cmV0dXJuImUiPT09dC50eXBlfHwidyI9PT10LnR5cGU/ZVsxXVsxXS1lWzBdWzFdK3M6c30pKSk6dC5zZWxlY3RBbGwoIi5zZWxlY3Rpb24sLmhhbmRsZSIpLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpLmF0dHIoIngiLG51bGwpLmF0dHIoInkiLG51bGwpLmF0dHIoIndpZHRoIixudWxsKS5hdHRyKCJoZWlnaHQiLG51bGwpfWZ1bmN0aW9uIHUodCxlLG4pe3ZhciBpPXQuX19icnVzaC5lbWl0dGVyO3JldHVybiFpfHxuJiZpLmNsZWFuP25ldyBoKHQsZSxuKTppfWZ1bmN0aW9uIGgodCxlLG4pe3RoaXMudGhhdD10LHRoaXMuYXJncz1lLHRoaXMuc3RhdGU9dC5fX2JydXNoLHRoaXMuYWN0aXZlPTAsdGhpcy5jbGVhbj1ufWZ1bmN0aW9uIGQoKXtpZigoIWV8fE11LnRvdWNoZXMpJiZpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIG4scixhLHMsbCxoLGQscCxmLG0sZyxfPXRoaXMseT1NdS50YXJnZXQuX19kYXRhX18udHlwZSx2PSJzZWxlY3Rpb24iPT09KG8mJk11Lm1ldGFLZXk/eT0ib3ZlcmxheSI6eSk/S206byYmTXUuYWx0S2V5P1FtOkptLGI9dD09PXJnP251bGw6Y2dbeV0seD10PT09aWc/bnVsbDp1Z1t5XSx3PW1nKF8pLFM9dy5leHRlbnQsTT13LnNlbGVjdGlvbixFPVNbMF1bMF0sVD1TWzBdWzFdLEM9U1sxXVswXSxBPVNbMV1bMV0saz0wLEw9MCxQPWImJngmJm8mJk11LnNoaWZ0S2V5LE49TXUudG91Y2hlcz9uZyhNdS5jaGFuZ2VkVG91Y2hlc1swXS5pZGVudGlmaWVyKTpiaCxJPU4oXyksUj1JLE89dShfLGFyZ3VtZW50cywhMCkuYmVmb3Jlc3RhcnQoKTsib3ZlcmxheSI9PT15PyhNJiYoZj0hMCksdy5zZWxlY3Rpb249TT1bW249dD09PXJnP0U6SVswXSxhPXQ9PT1pZz9UOklbMV1dLFtsPXQ9PT1yZz9DOm4sZD10PT09aWc/QTphXV0pOihuPU1bMF1bMF0sYT1NWzBdWzFdLGw9TVsxXVswXSxkPU1bMV1bMV0pLHI9bixzPWEsaD1sLHA9ZDt2YXIgej1EdShfKS5hdHRyKCJwb2ludGVyLWV2ZW50cyIsIm5vbmUiKSxEPXouc2VsZWN0QWxsKCIub3ZlcmxheSIpLmF0dHIoImN1cnNvciIsYWdbeV0pO2lmKE11LnRvdWNoZXMpTy5tb3ZlZD1ILE8uZW5kZWQ9VjtlbHNle3ZhciBCPUR1KE11LnZpZXcpLm9uKCJtb3VzZW1vdmUuYnJ1c2giLEgsITApLm9uKCJtb3VzZXVwLmJydXNoIixWLCEwKTtvJiZCLm9uKCJrZXlkb3duLmJydXNoIixVLCEwKS5vbigia2V5dXAuYnJ1c2giLGosITApLEVoKE11LnZpZXcpfVhtKCksbGYoXyksYy5jYWxsKF8pLE8uc3RhcnQoKX1mdW5jdGlvbiBIKCl7dmFyIHQ9TihfKTshUHx8bXx8Z3x8KE1hdGguYWJzKHRbMF0tUlswXSk+TWF0aC5hYnModFsxXS1SWzFdKT9nPSEwOm09ITApLFI9dCxmPSEwLCRtKCksRigpfWZ1bmN0aW9uIEYoKXt2YXIgdDtzd2l0Y2goaz1SWzBdLUlbMF0sTD1SWzFdLUlbMV0sdil7Y2FzZSBabTpjYXNlIEttOmImJihrPU1hdGgubWF4KEUtbixNYXRoLm1pbihDLWwsaykpLHI9bitrLGg9bCtrKSx4JiYoTD1NYXRoLm1heChULWEsTWF0aC5taW4oQS1kLEwpKSxzPWErTCxwPWQrTCk7YnJlYWs7Y2FzZSBKbTpiPDA/KGs9TWF0aC5tYXgoRS1uLE1hdGgubWluKEMtbixrKSkscj1uK2ssaD1sKTpiPjAmJihrPU1hdGgubWF4KEUtbCxNYXRoLm1pbihDLWwsaykpLHI9bixoPWwraykseDwwPyhMPU1hdGgubWF4KFQtYSxNYXRoLm1pbihBLWEsTCkpLHM9YStMLHA9ZCk6eD4wJiYoTD1NYXRoLm1heChULWQsTWF0aC5taW4oQS1kLEwpKSxzPWEscD1kK0wpO2JyZWFrO2Nhc2UgUW06YiYmKHI9TWF0aC5tYXgoRSxNYXRoLm1pbihDLG4taypiKSksaD1NYXRoLm1heChFLE1hdGgubWluKEMsbCtrKmIpKSkseCYmKHM9TWF0aC5tYXgoVCxNYXRoLm1pbihBLGEtTCp4KSkscD1NYXRoLm1heChULE1hdGgubWluKEEsZCtMKngpKSl9aDxyJiYoYio9LTEsdD1uLG49bCxsPXQsdD1yLHI9aCxoPXQseSBpbiBzZyYmRC5hdHRyKCJjdXJzb3IiLGFnW3k9c2dbeV1dKSkscDxzJiYoeCo9LTEsdD1hLGE9ZCxkPXQsdD1zLHM9cCxwPXQseSBpbiBsZyYmRC5hdHRyKCJjdXJzb3IiLGFnW3k9bGdbeV1dKSksdy5zZWxlY3Rpb24mJihNPXcuc2VsZWN0aW9uKSxtJiYocj1NWzBdWzBdLGg9TVsxXVswXSksZyYmKHM9TVswXVsxXSxwPU1bMV1bMV0pLE1bMF1bMF09PT1yJiZNWzBdWzFdPT09cyYmTVsxXVswXT09PWgmJk1bMV1bMV09PT1wfHwody5zZWxlY3Rpb249W1tyLHNdLFtoLHBdXSxjLmNhbGwoXyksTy5icnVzaCgpKX1mdW5jdGlvbiBWKCl7aWYoWG0oKSxNdS50b3VjaGVzKXtpZihNdS50b3VjaGVzLmxlbmd0aClyZXR1cm47ZSYmY2xlYXJUaW1lb3V0KGUpLGU9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtlPW51bGx9KSw1MDApfWVsc2UgVGgoTXUudmlldyxmKSxCLm9uKCJrZXlkb3duLmJydXNoIGtleXVwLmJydXNoIG1vdXNlbW92ZS5icnVzaCBtb3VzZXVwLmJydXNoIixudWxsKTt6LmF0dHIoInBvaW50ZXItZXZlbnRzIiwiYWxsIiksRC5hdHRyKCJjdXJzb3IiLGFnLm92ZXJsYXkpLHcuc2VsZWN0aW9uJiYoTT13LnNlbGVjdGlvbiksZ2coTSkmJih3LnNlbGVjdGlvbj1udWxsLGMuY2FsbChfKSksTy5lbmQoKX1mdW5jdGlvbiBVKCl7c3dpdGNoKE11LmtleUNvZGUpe2Nhc2UgMTY6UD1iJiZ4O2JyZWFrO2Nhc2UgMTg6dj09PUptJiYoYiYmKGw9aC1rKmIsbj1yK2sqYikseCYmKGQ9cC1MKngsYT1zK0wqeCksdj1RbSxGKCkpO2JyZWFrO2Nhc2UgMzI6diE9PUptJiZ2IT09UW18fChiPDA/bD1oLWs6Yj4wJiYobj1yLWspLHg8MD9kPXAtTDp4PjAmJihhPXMtTCksdj1abSxELmF0dHIoImN1cnNvciIsYWcuc2VsZWN0aW9uKSxGKCkpO2JyZWFrO2RlZmF1bHQ6cmV0dXJufSRtKCl9ZnVuY3Rpb24gaigpe3N3aXRjaChNdS5rZXlDb2RlKXtjYXNlIDE2OlAmJihtPWc9UD0hMSxGKCkpO2JyZWFrO2Nhc2UgMTg6dj09PVFtJiYoYjwwP2w9aDpiPjAmJihuPXIpLHg8MD9kPXA6eD4wJiYoYT1zKSx2PUptLEYoKSk7YnJlYWs7Y2FzZSAzMjp2PT09Wm0mJihNdS5hbHRLZXk/KGImJihsPWgtaypiLG49citrKmIpLHgmJihkPXAtTCp4LGE9cytMKngpLHY9UW0pOihiPDA/bD1oOmI+MCYmKG49cikseDwwP2Q9cDp4PjAmJihhPXMpLHY9Sm0pLEQuYXR0cigiY3Vyc29yIixhZ1t5XSksRigpKTticmVhaztkZWZhdWx0OnJldHVybn0kbSgpfX1mdW5jdGlvbiBwKCl7dSh0aGlzLGFyZ3VtZW50cykubW92ZWQoKX1mdW5jdGlvbiBmKCl7dSh0aGlzLGFyZ3VtZW50cykuZW5kZWQoKX1mdW5jdGlvbiBtKCl7dmFyIGU9dGhpcy5fX2JydXNofHx7c2VsZWN0aW9uOm51bGx9O3JldHVybiBlLmV4dGVudD1lZyhuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksZS5kaW09dCxlfXJldHVybiBsLm1vdmU9ZnVuY3Rpb24oZSxuKXtlLnNlbGVjdGlvbj9lLm9uKCJzdGFydC5icnVzaCIsKGZ1bmN0aW9uKCl7dSh0aGlzLGFyZ3VtZW50cykuYmVmb3Jlc3RhcnQoKS5zdGFydCgpfSkpLm9uKCJpbnRlcnJ1cHQuYnJ1c2ggZW5kLmJydXNoIiwoZnVuY3Rpb24oKXt1KHRoaXMsYXJndW1lbnRzKS5lbmQoKX0pKS50d2VlbigiYnJ1c2giLChmdW5jdGlvbigpe3ZhciBlPXRoaXMsaT1lLl9fYnJ1c2gscj11KGUsYXJndW1lbnRzKSxvPWkuc2VsZWN0aW9uLGE9dC5pbnB1dCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuLGkuZXh0ZW50KSxzPWNwKG8sYSk7ZnVuY3Rpb24gbCh0KXtpLnNlbGVjdGlvbj0xPT09dCYmbnVsbD09PWE/bnVsbDpzKHQpLGMuY2FsbChlKSxyLmJydXNoKCl9cmV0dXJuIG51bGwhPT1vJiZudWxsIT09YT9sOmwoMSl9KSk6ZS5lYWNoKChmdW5jdGlvbigpe3ZhciBlPXRoaXMsaT1hcmd1bWVudHMscj1lLl9fYnJ1c2gsbz10LmlucHV0KCJmdW5jdGlvbiI9PXR5cGVvZiBuP24uYXBwbHkoZSxpKTpuLHIuZXh0ZW50KSxhPXUoZSxpKS5iZWZvcmVzdGFydCgpO2xmKGUpLHIuc2VsZWN0aW9uPW51bGw9PT1vP251bGw6byxjLmNhbGwoZSksYS5zdGFydCgpLmJydXNoKCkuZW5kKCl9KSl9LGwuY2xlYXI9ZnVuY3Rpb24odCl7bC5tb3ZlKHQsbnVsbCl9LGgucHJvdG90eXBlPXtiZWZvcmVzdGFydDpmdW5jdGlvbigpe3JldHVybiAxPT0rK3RoaXMuYWN0aXZlJiYodGhpcy5zdGF0ZS5lbWl0dGVyPXRoaXMsdGhpcy5zdGFydGluZz0hMCksdGhpc30sc3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdGFydGluZz8odGhpcy5zdGFydGluZz0hMSx0aGlzLmVtaXQoInN0YXJ0IikpOnRoaXMuZW1pdCgiYnJ1c2giKSx0aGlzfSxicnVzaDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVtaXQoImJydXNoIiksdGhpc30sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PS0tdGhpcy5hY3RpdmUmJihkZWxldGUgdGhpcy5zdGF0ZS5lbWl0dGVyLHRoaXMuZW1pdCgiZW5kIikpLHRoaXN9LGVtaXQ6ZnVuY3Rpb24oZSl7THUobmV3IFltKGwsZSx0Lm91dHB1dCh0aGlzLnN0YXRlLnNlbGVjdGlvbikpLGEuYXBwbHksYSxbZSx0aGlzLnRoYXQsdGhpcy5hcmdzXSl9fSxsLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnFtKGVnKHQpKSxsKTpufSxsLmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnFtKCEhdCksbCk6aX0sbC50b3VjaGFibGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpxbSghIXQpLGwpOnJ9LGwuaGFuZGxlU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0rdCxsKTpzfSxsLmtleU1vZGlmaWVycz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0hIXQsbCk6b30sbC5vbj1mdW5jdGlvbigpe3ZhciB0PWEub24uYXBwbHkoYSxhcmd1bWVudHMpO3JldHVybiB0PT09YT9sOnR9LGx9dmFyIHhnPU1hdGguY29zLHdnPU1hdGguc2luLFNnPU1hdGguUEksTWc9U2cvMixFZz0yKlNnLFRnPU1hdGgubWF4O2Z1bmN0aW9uIENnKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3JldHVybiB0KGUuc291cmNlLnZhbHVlK2UudGFyZ2V0LnZhbHVlLG4uc291cmNlLnZhbHVlK24udGFyZ2V0LnZhbHVlKX19dmFyIEFnPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBrZyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19dmFyIExnPU1hdGguUEksUGc9MipMZyxOZz0xZS02LElnPVBnLU5nO2Z1bmN0aW9uIFJnKCl7dGhpcy5feDA9dGhpcy5feTA9dGhpcy5feDE9dGhpcy5feTE9bnVsbCx0aGlzLl89IiJ9ZnVuY3Rpb24gT2coKXtyZXR1cm4gbmV3IFJnfWZ1bmN0aW9uIHpnKHQpe3JldHVybiB0LnNvdXJjZX1mdW5jdGlvbiBEZyh0KXtyZXR1cm4gdC50YXJnZXR9ZnVuY3Rpb24gQmcodCl7cmV0dXJuIHQucmFkaXVzfWZ1bmN0aW9uIEhnKHQpe3JldHVybiB0LnN0YXJ0QW5nbGV9ZnVuY3Rpb24gRmcodCl7cmV0dXJuIHQuZW5kQW5nbGV9UmcucHJvdG90eXBlPU9nLnByb3RvdHlwZT17Y29uc3RydWN0b3I6UmcsbW92ZVRvOmZ1bmN0aW9uKHQsZSl7dGhpcy5fKz0iTSIrKHRoaXMuX3gwPXRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kwPXRoaXMuX3kxPStlKX0sY2xvc2VQYXRoOmZ1bmN0aW9uKCl7bnVsbCE9PXRoaXMuX3gxJiYodGhpcy5feDE9dGhpcy5feDAsdGhpcy5feTE9dGhpcy5feTAsdGhpcy5fKz0iWiIpfSxsaW5lVG86ZnVuY3Rpb24odCxlKXt0aGlzLl8rPSJMIisodGhpcy5feDE9K3QpKyIsIisodGhpcy5feTE9K2UpfSxxdWFkcmF0aWNDdXJ2ZVRvOmZ1bmN0aW9uKHQsZSxuLGkpe3RoaXMuXys9IlEiKyArdCsiLCIrICtlKyIsIisodGhpcy5feDE9K24pKyIsIisodGhpcy5feTE9K2kpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKHQsZSxuLGkscixvKXt0aGlzLl8rPSJDIisgK3QrIiwiKyArZSsiLCIrICtuKyIsIisgK2krIiwiKyh0aGlzLl94MT0rcikrIiwiKyh0aGlzLl95MT0rbyl9LGFyY1RvOmZ1bmN0aW9uKHQsZSxuLGkscil7dmFyIG89dGhpcy5feDEsYT10aGlzLl95MSxzPShuPStuKS0odD0rdCksbD0oaT0raSktKGU9K2UpLGM9by10LHU9YS1lLGg9YypjK3UqdTtpZigocj0rcik8MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIityKTtpZihudWxsPT09dGhpcy5feDEpdGhpcy5fKz0iTSIrKHRoaXMuX3gxPXQpKyIsIisodGhpcy5feTE9ZSk7ZWxzZSBpZihoPk5nKWlmKE1hdGguYWJzKHUqcy1sKmMpPk5nJiZyKXt2YXIgZD1uLW8scD1pLWEsZj1zKnMrbCpsLG09ZCpkK3AqcCxnPU1hdGguc3FydChmKSxfPU1hdGguc3FydChoKSx5PXIqTWF0aC50YW4oKExnLU1hdGguYWNvcygoZitoLW0pLygyKmcqXykpKS8yKSx2PXkvXyxiPXkvZztNYXRoLmFicyh2LTEpPk5nJiYodGhpcy5fKz0iTCIrKHQrdipjKSsiLCIrKGUrdip1KSksdGhpcy5fKz0iQSIrcisiLCIrcisiLDAsMCwiKyArKHUqZD5jKnApKyIsIisodGhpcy5feDE9dCtiKnMpKyIsIisodGhpcy5feTE9ZStiKmwpfWVsc2UgdGhpcy5fKz0iTCIrKHRoaXMuX3gxPXQpKyIsIisodGhpcy5feTE9ZSk7ZWxzZTt9LGFyYzpmdW5jdGlvbih0LGUsbixpLHIsbyl7dD0rdCxlPStlLG89ISFvO3ZhciBhPShuPStuKSpNYXRoLmNvcyhpKSxzPW4qTWF0aC5zaW4oaSksbD10K2EsYz1lK3MsdT0xXm8saD1vP2ktcjpyLWk7aWYobjwwKXRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzOiAiK24pO251bGw9PT10aGlzLl94MT90aGlzLl8rPSJNIitsKyIsIitjOihNYXRoLmFicyh0aGlzLl94MS1sKT5OZ3x8TWF0aC5hYnModGhpcy5feTEtYyk+TmcpJiYodGhpcy5fKz0iTCIrbCsiLCIrYyksbiYmKGg8MCYmKGg9aCVQZytQZyksaD5JZz90aGlzLl8rPSJBIituKyIsIituKyIsMCwxLCIrdSsiLCIrKHQtYSkrIiwiKyhlLXMpKyJBIituKyIsIituKyIsMCwxLCIrdSsiLCIrKHRoaXMuX3gxPWwpKyIsIisodGhpcy5feTE9Yyk6aD5OZyYmKHRoaXMuXys9IkEiK24rIiwiK24rIiwwLCIrICsoaD49TGcpKyIsIit1KyIsIisodGhpcy5feDE9dCtuKk1hdGguY29zKHIpKSsiLCIrKHRoaXMuX3kxPWUrbipNYXRoLnNpbihyKSkpKX0scmVjdDpmdW5jdGlvbih0LGUsbixpKXt0aGlzLl8rPSJNIisodGhpcy5feDA9dGhpcy5feDE9K3QpKyIsIisodGhpcy5feTA9dGhpcy5feTE9K2UpKyJoIisgK24rInYiKyAraSsiaCIrLW4rIloifSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl99fTt2YXIgVmc9IiQiO2Z1bmN0aW9uIFVnKCl7fWZ1bmN0aW9uIGpnKHQsZSl7dmFyIG49bmV3IFVnO2lmKHQgaW5zdGFuY2VvZiBVZyl0LmVhY2goKGZ1bmN0aW9uKHQsZSl7bi5zZXQoZSx0KX0pKTtlbHNlIGlmKEFycmF5LmlzQXJyYXkodCkpe3ZhciBpLHI9LTEsbz10Lmxlbmd0aDtpZihudWxsPT1lKWZvcig7KytyPG87KW4uc2V0KHIsdFtyXSk7ZWxzZSBmb3IoOysrcjxvOyluLnNldChlKGk9dFtyXSxyLHQpLGkpfWVsc2UgaWYodClmb3IodmFyIGEgaW4gdCluLnNldChhLHRbYV0pO3JldHVybiBufWZ1bmN0aW9uIEdnKCl7cmV0dXJue319ZnVuY3Rpb24gV2codCxlLG4pe3RbZV09bn1mdW5jdGlvbiBxZygpe3JldHVybiBqZygpfWZ1bmN0aW9uIFlnKHQsZSxuKXt0LnNldChlLG4pfWZ1bmN0aW9uIFhnKCl7fVVnLnByb3RvdHlwZT1qZy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlVnLGhhczpmdW5jdGlvbih0KXtyZXR1cm4gVmcrdCBpbiB0aGlzfSxnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbVmcrdF19LHNldDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzW1ZnK3RdPWUsdGhpc30scmVtb3ZlOmZ1bmN0aW9uKHQpe3ZhciBlPVZnK3Q7cmV0dXJuIGUgaW4gdGhpcyYmZGVsZXRlIHRoaXNbZV19LGNsZWFyOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpdFswXT09PVZnJiZkZWxldGUgdGhpc1t0XX0sa2V5czpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiB0aGlzKWVbMF09PT1WZyYmdC5wdXNoKGUuc2xpY2UoMSkpO3JldHVybiB0fSx2YWx1ZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gdGhpcyllWzBdPT09VmcmJnQucHVzaCh0aGlzW2VdKTtyZXR1cm4gdH0sZW50cmllczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiB0aGlzKWVbMF09PT1WZyYmdC5wdXNoKHtrZXk6ZS5zbGljZSgxKSx2YWx1ZTp0aGlzW2VdfSk7cmV0dXJuIHR9LHNpemU6ZnVuY3Rpb24oKXt2YXIgdD0wO2Zvcih2YXIgZSBpbiB0aGlzKWVbMF09PT1WZyYmKyt0O3JldHVybiB0fSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzKWlmKHRbMF09PT1WZylyZXR1cm4hMTtyZXR1cm4hMH0sZWFjaDpmdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdGhpcyllWzBdPT09VmcmJnQodGhpc1tlXSxlLnNsaWNlKDEpLHRoaXMpfX07dmFyICRnPWpnLnByb3RvdHlwZTtmdW5jdGlvbiBLZyh0LGUpe3ZhciBuPW5ldyBYZztpZih0IGluc3RhbmNlb2YgWGcpdC5lYWNoKChmdW5jdGlvbih0KXtuLmFkZCh0KX0pKTtlbHNlIGlmKHQpe3ZhciBpPS0xLHI9dC5sZW5ndGg7aWYobnVsbD09ZSlmb3IoOysraTxyOyluLmFkZCh0W2ldKTtlbHNlIGZvcig7KytpPHI7KW4uYWRkKGUodFtpXSxpLHQpKX1yZXR1cm4gbn1mdW5jdGlvbiBaZyh0KXt2YXIgZT1bXTtmb3IodmFyIG4gaW4gdCllLnB1c2gobik7cmV0dXJuIGV9WGcucHJvdG90eXBlPUtnLnByb3RvdHlwZT17Y29uc3RydWN0b3I6WGcsaGFzOiRnLmhhcyxhZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbVmcrKHQrPSIiKV09dCx0aGlzfSxyZW1vdmU6JGcucmVtb3ZlLGNsZWFyOiRnLmNsZWFyLHZhbHVlczokZy5rZXlzLHNpemU6JGcuc2l6ZSxlbXB0eTokZy5lbXB0eSxlYWNoOiRnLmVhY2h9O3ZhciBKZz1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZnVuY3Rpb24gUWcodCxlKXtyZXR1cm4gdC1lfWZ1bmN0aW9uIHRfKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBlXyh0LGUpe2Zvcih2YXIgbixpPS0xLHI9ZS5sZW5ndGg7KytpPHI7KWlmKG49bl8odCxlW2ldKSlyZXR1cm4gbjtyZXR1cm4gMH1mdW5jdGlvbiBuXyh0LGUpe2Zvcih2YXIgbj1lWzBdLGk9ZVsxXSxyPS0xLG89MCxhPXQubGVuZ3RoLHM9YS0xO288YTtzPW8rKyl7dmFyIGw9dFtvXSxjPWxbMF0sdT1sWzFdLGg9dFtzXSxkPWhbMF0scD1oWzFdO2lmKGlfKGwsaCxlKSlyZXR1cm4gMDt1PmkhPXA+aSYmbjwoZC1jKSooaS11KS8ocC11KStjJiYocj0tcil9cmV0dXJuIHJ9ZnVuY3Rpb24gaV8odCxlLG4pe3ZhciBpO3JldHVybihmdW5jdGlvbiByKHQsZSxuKXtyZXR1cm4oZVswXS10WzBdKSooblsxXS10WzFdKT09KG5bMF0tdFswXSkqKGVbMV0tdFsxXSl9KSh0LGUsbikmJihmdW5jdGlvbiBvKHQsZSxuKXtyZXR1cm4gdDw9ZSYmZTw9bnx8bjw9ZSYmZTw9dH0pKHRbaT0rKHRbMF09PT1lWzBdKV0sbltpXSxlW2ldKX1mdW5jdGlvbiByXygpe312YXIgb189W1tdLFtbWzEsMS41XSxbLjUsMV1dXSxbW1sxLjUsMV0sWzEsMS41XV1dLFtbWzEuNSwxXSxbLjUsMV1dXSxbW1sxLC41XSxbMS41LDFdXV0sW1tbMSwxLjVdLFsuNSwxXV0sW1sxLC41XSxbMS41LDFdXV0sW1tbMSwuNV0sWzEsMS41XV1dLFtbWzEsLjVdLFsuNSwxXV1dLFtbWy41LDFdLFsxLC41XV1dLFtbWzEsMS41XSxbMSwuNV1dXSxbW1suNSwxXSxbMSwuNV1dLFtbMS41LDFdLFsxLDEuNV1dXSxbW1sxLjUsMV0sWzEsLjVdXV0sW1tbLjUsMV0sWzEuNSwxXV1dLFtbWzEsMS41XSxbMS41LDFdXV0sW1tbLjUsMV0sWzEsMS41XV1dLFtdXTtmdW5jdGlvbiBhXygpe3ZhciB0PTEsZT0xLG49aWMsaT1zO2Z1bmN0aW9uIHIodCl7dmFyIGU9bih0KTtpZihBcnJheS5pc0FycmF5KGUpKWU9ZS5zbGljZSgpLnNvcnQoUWcpO2Vsc2V7dmFyIGk9R2wodCkscj1pWzBdLGE9aVsxXTtlPW5jKHIsYSxlKSxlPUtsKE1hdGguZmxvb3Ioci9lKSplLE1hdGguZmxvb3IoYS9lKSplLGUpfXJldHVybiBlLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIG8odCxlKX0pKX1mdW5jdGlvbiBvKG4scil7dmFyIG89W10scz1bXTtyZXR1cm4oZnVuY3Rpb24gbChuLGkscil7dmFyIG8scyxsLGMsdSxoPW5ldyBBcnJheSxkPW5ldyBBcnJheTtvPXM9LTEsb19bKGw9blswXT49aSk8PDFdLmZvckVhY2gocCk7Zm9yKDsrK288dC0xOylvX1tsfChsPW5bbysxXT49aSk8PDFdLmZvckVhY2gocCk7b19bbDw8MF0uZm9yRWFjaChwKTtmb3IoOysrczxlLTE7KXtmb3Iobz0tMSxvX1sobD1uW3MqdCt0XT49aSk8PDF8KGM9bltzKnRdPj1pKTw8Ml0uZm9yRWFjaChwKTsrK288dC0xOyl1PWMsb19bbHwobD1uW3MqdCt0K28rMV0+PWkpPDwxfChjPW5bcyp0K28rMV0+PWkpPDwyfHU8PDNdLmZvckVhY2gocCk7b19bbHxjPDwzXS5mb3JFYWNoKHApfW89LTEsb19bKGM9bltzKnRdPj1pKTw8Ml0uZm9yRWFjaChwKTtmb3IoOysrbzx0LTE7KXU9YyxvX1soYz1uW3MqdCtvKzFdPj1pKTw8Mnx1PDwzXS5mb3JFYWNoKHApO2Z1bmN0aW9uIHAodCl7dmFyIGUsbixpPVt0WzBdWzBdK28sdFswXVsxXStzXSxsPVt0WzFdWzBdK28sdFsxXVsxXStzXSxjPWEoaSksdT1hKGwpOyhlPWRbY10pPyhuPWhbdV0pPyhkZWxldGUgZFtlLmVuZF0sZGVsZXRlIGhbbi5zdGFydF0sZT09PW4/KGUucmluZy5wdXNoKGwpLHIoZS5yaW5nKSk6aFtlLnN0YXJ0XT1kW24uZW5kXT17c3RhcnQ6ZS5zdGFydCxlbmQ6bi5lbmQscmluZzplLnJpbmcuY29uY2F0KG4ucmluZyl9KTooZGVsZXRlIGRbZS5lbmRdLGUucmluZy5wdXNoKGwpLGRbZS5lbmQ9dV09ZSk6KGU9aFt1XSk/KG49ZFtjXSk/KGRlbGV0ZSBoW2Uuc3RhcnRdLGRlbGV0ZSBkW24uZW5kXSxlPT09bj8oZS5yaW5nLnB1c2gobCkscihlLnJpbmcpKTpoW24uc3RhcnRdPWRbZS5lbmRdPXtzdGFydDpuLnN0YXJ0LGVuZDplLmVuZCxyaW5nOm4ucmluZy5jb25jYXQoZS5yaW5nKX0pOihkZWxldGUgaFtlLnN0YXJ0XSxlLnJpbmcudW5zaGlmdChpKSxoW2Uuc3RhcnQ9Y109ZSk6aFtjXT1kW3VdPXtzdGFydDpjLGVuZDp1LHJpbmc6W2ksbF19fW9fW2M8PDNdLmZvckVhY2gocCl9KShuLHIsKGZ1bmN0aW9uKHQpe2kodCxuLHIpLChmdW5jdGlvbiBlKHQpe2Zvcih2YXIgZT0wLG49dC5sZW5ndGgsaT10W24tMV1bMV0qdFswXVswXS10W24tMV1bMF0qdFswXVsxXTsrK2U8bjspaSs9dFtlLTFdWzFdKnRbZV1bMF0tdFtlLTFdWzBdKnRbZV1bMV07cmV0dXJuIGl9KSh0KT4wP28ucHVzaChbdF0pOnMucHVzaCh0KX0pKSxzLmZvckVhY2goKGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPTAsaT1vLmxlbmd0aDtuPGk7KytuKWlmKC0xIT09ZV8oKGU9b1tuXSlbMF0sdCkpcmV0dXJuIHZvaWQgZS5wdXNoKHQpfSkpLHt0eXBlOiJNdWx0aVBvbHlnb24iLHZhbHVlOnIsY29vcmRpbmF0ZXM6b319ZnVuY3Rpb24gYShlKXtyZXR1cm4gMiplWzBdK2VbMV0qKHQrMSkqNH1mdW5jdGlvbiBzKG4saSxyKXtuLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciBvLGE9blswXSxzPW5bMV0sbD0wfGEsYz0wfHMsdT1pW2MqdCtsXTthPjAmJmE8dCYmbD09PWEmJihuWzBdPWErKHItKG89aVtjKnQrbC0xXSkpLyh1LW8pLS41KSxzPjAmJnM8ZSYmYz09PXMmJihuWzFdPXMrKHItKG89aVsoYy0xKSp0K2xdKSkvKHUtbyktLjUpfSkpfXJldHVybiByLmNvbnRvdXI9byxyLnNpemU9ZnVuY3Rpb24obil7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuW3QsZV07dmFyIGk9TWF0aC5jZWlsKG5bMF0pLG89TWF0aC5jZWlsKG5bMV0pO2lmKCEoaT4wJiZvPjApKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBzaXplIik7cmV0dXJuIHQ9aSxlPW8scn0sci50aHJlc2hvbGRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6QXJyYXkuaXNBcnJheSh0KT90XyhKZy5jYWxsKHQpKTp0Xyh0KSxyKTpufSxyLnNtb290aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10P3M6cl8scik6aT09PXN9LHJ9ZnVuY3Rpb24gc18odCxlLG4pe2Zvcih2YXIgaT10LndpZHRoLHI9dC5oZWlnaHQsbz0xKyhuPDwxKSxhPTA7YTxyOysrYSlmb3IodmFyIHM9MCxsPTA7czxpK247KytzKXM8aSYmKGwrPXQuZGF0YVtzK2EqaV0pLHM+PW4mJihzPj1vJiYobC09dC5kYXRhW3MtbythKmldKSxlLmRhdGFbcy1uK2EqaV09bC9NYXRoLm1pbihzKzEsaS0xK28tcyxvKSl9ZnVuY3Rpb24gbF8odCxlLG4pe2Zvcih2YXIgaT10LndpZHRoLHI9dC5oZWlnaHQsbz0xKyhuPDwxKSxhPTA7YTxpOysrYSlmb3IodmFyIHM9MCxsPTA7czxyK247KytzKXM8ciYmKGwrPXQuZGF0YVthK3MqaV0pLHM+PW4mJihzPj1vJiYobC09dC5kYXRhW2ErKHMtbykqaV0pLGUuZGF0YVthKyhzLW4pKmldPWwvTWF0aC5taW4ocysxLHItMStvLXMsbykpfWZ1bmN0aW9uIGNfKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIHVfKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIGhfKCl7cmV0dXJuIDF9dmFyIGRfPXt9LHBfPXt9O2Z1bmN0aW9uIGZfKHQpe3JldHVybiBuZXcgRnVuY3Rpb24oImQiLCJyZXR1cm4geyIrdC5tYXAoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KHQpKyI6IGRbIitlKyddIHx8ICIiJ30pKS5qb2luKCIsIikrIn0iKX1mdW5jdGlvbiBtXyh0KXt2YXIgZT1PYmplY3QuY3JlYXRlKG51bGwpLG49W107cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7Zm9yKHZhciBpIGluIHQpaSBpbiBlfHxuLnB1c2goZVtpXT1pKX0pKSxufWZ1bmN0aW9uIGdfKHQsZSl7dmFyIG49dCsiIixpPW4ubGVuZ3RoO3JldHVybiBpPGU/bmV3IEFycmF5KGUtaSsxKS5qb2luKDApK246bn1mdW5jdGlvbiBfXyh0KXt2YXIgZT10LmdldFVUQ0hvdXJzKCksbj10LmdldFVUQ01pbnV0ZXMoKSxpPXQuZ2V0VVRDU2Vjb25kcygpLHI9dC5nZXRVVENNaWxsaXNlY29uZHMoKTtyZXR1cm4gaXNOYU4odCk/IkludmFsaWQgRGF0ZSI6KGZ1bmN0aW9uIG8odCl7cmV0dXJuIHQ8MD8iLSIrZ18oLXQsNik6dD45OTk5PyIrIitnXyh0LDYpOmdfKHQsNCl9KSh0LmdldFVUQ0Z1bGxZZWFyKCkpKyItIitnXyh0LmdldFVUQ01vbnRoKCkrMSwyKSsiLSIrZ18odC5nZXRVVENEYXRlKCksMikrKHI/IlQiK2dfKGUsMikrIjoiK2dfKG4sMikrIjoiK2dfKGksMikrIi4iK2dfKHIsMykrIloiOmk/IlQiK2dfKGUsMikrIjoiK2dfKG4sMikrIjoiK2dfKGksMikrIloiOm58fGU/IlQiK2dfKGUsMikrIjoiK2dfKG4sMikrIloiOiIiKX1mdW5jdGlvbiB5Xyh0KXt2YXIgZT1uZXcgUmVnRXhwKCdbIicrdCsiXG5ccl0iKSxuPXQuY2hhckNvZGVBdCgwKTtmdW5jdGlvbiBpKHQsZSl7dmFyIGkscj1bXSxvPXQubGVuZ3RoLGE9MCxzPTAsbD1vPD0wLGM9ITE7ZnVuY3Rpb24gdSgpe2lmKGwpcmV0dXJuIHBfO2lmKGMpcmV0dXJuIGM9ITEsZF87dmFyIGUsaSxyPWE7aWYoMzQ9PT10LmNoYXJDb2RlQXQocikpe2Zvcig7YSsrPG8mJjM0IT09dC5jaGFyQ29kZUF0KGEpfHwzND09PXQuY2hhckNvZGVBdCgrK2EpOyk7cmV0dXJuKGU9YSk+PW8/bD0hMDoxMD09PShpPXQuY2hhckNvZGVBdChhKyspKT9jPSEwOjEzPT09aSYmKGM9ITAsMTA9PT10LmNoYXJDb2RlQXQoYSkmJisrYSksdC5zbGljZShyKzEsZS0xKS5yZXBsYWNlKC8iIi9nLCciJyl9Zm9yKDthPG87KXtpZigxMD09PShpPXQuY2hhckNvZGVBdChlPWErKykpKWM9ITA7ZWxzZSBpZigxMz09PWkpYz0hMCwxMD09PXQuY2hhckNvZGVBdChhKSYmKythO2Vsc2UgaWYoaSE9PW4pY29udGludWU7cmV0dXJuIHQuc2xpY2UocixlKX1yZXR1cm4gbD0hMCx0LnNsaWNlKHIsbyl9Zm9yKDEwPT09dC5jaGFyQ29kZUF0KG8tMSkmJi0tbywxMz09PXQuY2hhckNvZGVBdChvLTEpJiYtLW87KGk9dSgpKSE9PXBfOyl7Zm9yKHZhciBoPVtdO2khPT1kXyYmaSE9PXBfOyloLnB1c2goaSksaT11KCk7ZSYmbnVsbD09KGg9ZShoLHMrKykpfHxyLnB1c2goaCl9cmV0dXJuIHJ9ZnVuY3Rpb24gcihlLG4pe3JldHVybiBlLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIG4ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gYShlW3RdKX0pKS5qb2luKHQpfSkpfWZ1bmN0aW9uIG8oZSl7cmV0dXJuIGUubWFwKGEpLmpvaW4odCl9ZnVuY3Rpb24gYSh0KXtyZXR1cm4gbnVsbD09dD8iIjp0IGluc3RhbmNlb2YgRGF0ZT9fXyh0KTplLnRlc3QodCs9IiIpPyciJyt0LnJlcGxhY2UoLyIvZywnIiInKSsnIic6dH1yZXR1cm57cGFyc2U6ZnVuY3Rpb24gcyh0LGUpe3ZhciBuLHIsbz1pKHQsKGZ1bmN0aW9uKHQsaSl7aWYobilyZXR1cm4gbih0LGktMSk7cj10LG49ZT8oZnVuY3Rpb24gbyh0LGUpe3ZhciBuPWZfKHQpO3JldHVybiBmdW5jdGlvbihpLHIpe3JldHVybiBlKG4oaSkscix0KX19KSh0LGUpOmZfKHQpfSkpO3JldHVybiBvLmNvbHVtbnM9cnx8W10sb30scGFyc2VSb3dzOmksZm9ybWF0OmZ1bmN0aW9uIGwoZSxuKXtyZXR1cm4gbnVsbD09biYmKG49bV8oZSkpLFtuLm1hcChhKS5qb2luKHQpXS5jb25jYXQocihlLG4pKS5qb2luKCJcbiIpfSxmb3JtYXRCb2R5OmZ1bmN0aW9uIGModCxlKXtyZXR1cm4gbnVsbD09ZSYmKGU9bV8odCkpLHIodCxlKS5qb2luKCJcbiIpfSxmb3JtYXRSb3dzOmZ1bmN0aW9uIHUodCl7cmV0dXJuIHQubWFwKG8pLmpvaW4oIlxuIil9LGZvcm1hdFJvdzpvLGZvcm1hdFZhbHVlOmF9fXZhciB2Xz15XygiLCIpLGJfPXZfLnBhcnNlLHhfPXZfLnBhcnNlUm93cyx3Xz12Xy5mb3JtYXQsU189dl8uZm9ybWF0Qm9keSxNXz12Xy5mb3JtYXRSb3dzLEVfPXZfLmZvcm1hdFJvdyxUXz12Xy5mb3JtYXRWYWx1ZSxDXz15XygiXHQiKSxBXz1DXy5wYXJzZSxrXz1DXy5wYXJzZVJvd3MsTF89Q18uZm9ybWF0LFBfPUNfLmZvcm1hdEJvZHksTl89Q18uZm9ybWF0Um93cyxJXz1DXy5mb3JtYXRSb3csUl89Q18uZm9ybWF0VmFsdWU7dmFyIE9fPW5ldyBEYXRlKCIyMDE5LTAxLTAxVDAwOjAwIikuZ2V0SG91cnMoKXx8bmV3IERhdGUoIjIwMTktMDctMDFUMDA6MDAiKS5nZXRIb3VycygpO2Z1bmN0aW9uIHpfKHQpe2lmKCF0Lm9rKXRocm93IG5ldyBFcnJvcih0LnN0YXR1cysiICIrdC5zdGF0dXNUZXh0KTtyZXR1cm4gdC5ibG9iKCl9ZnVuY3Rpb24gRF8odCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0LmFycmF5QnVmZmVyKCl9ZnVuY3Rpb24gQl8odCl7aWYoIXQub2spdGhyb3cgbmV3IEVycm9yKHQuc3RhdHVzKyIgIit0LnN0YXR1c1RleHQpO3JldHVybiB0LnRleHQoKX1mdW5jdGlvbiBIXyh0LGUpe3JldHVybiBmZXRjaCh0LGUpLnRoZW4oQl8pfWZ1bmN0aW9uIEZfKHQpe3JldHVybiBmdW5jdGlvbihlLG4saSl7cmV0dXJuIDI9PT1hcmd1bWVudHMubGVuZ3RoJiYiZnVuY3Rpb24iPT10eXBlb2YgbiYmKGk9bixuPXZvaWQgMCksSF8oZSxuKS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm4gdChlLGkpfSkpfX12YXIgVl89Rl8oYl8pLFVfPUZfKEFfKTtmdW5jdGlvbiBqXyh0KXtpZighdC5vayl0aHJvdyBuZXcgRXJyb3IodC5zdGF0dXMrIiAiK3Quc3RhdHVzVGV4dCk7aWYoMjA0IT09dC5zdGF0dXMmJjIwNSE9PXQuc3RhdHVzKXJldHVybiB0Lmpzb24oKX1mdW5jdGlvbiBHXyh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXtyZXR1cm4gSF8oZSxuKS50aGVuKChmdW5jdGlvbihlKXtyZXR1cm4obmV3IERPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGUsdCl9KSl9fXZhciBXXz1HXygiYXBwbGljYXRpb24veG1sIikscV89R18oInRleHQvaHRtbCIpLFlfPUdfKCJpbWFnZS9zdmcreG1sIik7ZnVuY3Rpb24gWF8odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uICRfKCl7cmV0dXJuIDFlLTYqKE1hdGgucmFuZG9tKCktLjUpfWZ1bmN0aW9uIEtfKHQsZSxuLGkpe2lmKGlzTmFOKGUpfHxpc05hTihuKSlyZXR1cm4gdDt2YXIgcixvLGEscyxsLGMsdSxoLGQscD10Ll9yb290LGY9e2RhdGE6aX0sbT10Ll94MCxnPXQuX3kwLF89dC5feDEseT10Ll95MTtpZighcClyZXR1cm4gdC5fcm9vdD1mLHQ7Zm9yKDtwLmxlbmd0aDspaWYoKGM9ZT49KG89KG0rXykvMikpP209bzpfPW8sKHU9bj49KGE9KGcreSkvMikpP2c9YTp5PWEscj1wLCEocD1wW2g9dTw8MXxjXSkpcmV0dXJuIHJbaF09Zix0O2lmKHM9K3QuX3guY2FsbChudWxsLHAuZGF0YSksbD0rdC5feS5jYWxsKG51bGwscC5kYXRhKSxlPT09cyYmbj09PWwpcmV0dXJuIGYubmV4dD1wLHI/cltoXT1mOnQuX3Jvb3Q9Zix0O2Rve3I9cj9yW2hdPW5ldyBBcnJheSg0KTp0Ll9yb290PW5ldyBBcnJheSg0KSwoYz1lPj0obz0obStfKS8yKSk/bT1vOl89bywodT1uPj0oYT0oZyt5KS8yKSk/Zz1hOnk9YX13aGlsZSgoaD11PDwxfGMpPT0oZD0obD49YSk8PDF8cz49bykpO3JldHVybiByW2RdPXAscltoXT1mLHR9ZnVuY3Rpb24gWl8odCxlLG4saSxyKXt0aGlzLm5vZGU9dCx0aGlzLngwPWUsdGhpcy55MD1uLHRoaXMueDE9aSx0aGlzLnkxPXJ9ZnVuY3Rpb24gSl8odCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gUV8odCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24gdHkodCxlLG4pe3ZhciBpPW5ldyBleShudWxsPT1lP0pfOmUsbnVsbD09bj9RXzpuLE5hTixOYU4sTmFOLE5hTik7cmV0dXJuIG51bGw9PXQ/aTppLmFkZEFsbCh0KX1mdW5jdGlvbiBleSh0LGUsbixpLHIsbyl7dGhpcy5feD10LHRoaXMuX3k9ZSx0aGlzLl94MD1uLHRoaXMuX3kwPWksdGhpcy5feDE9cix0aGlzLl95MT1vLHRoaXMuX3Jvb3Q9dm9pZCAwfWZ1bmN0aW9uIG55KHQpe2Zvcih2YXIgZT17ZGF0YTp0LmRhdGF9LG49ZTt0PXQubmV4dDspbj1uLm5leHQ9e2RhdGE6dC5kYXRhfTtyZXR1cm4gZX12YXIgaXk9dHkucHJvdG90eXBlPWV5LnByb3RvdHlwZTtmdW5jdGlvbiByeSh0KXtyZXR1cm4gdC54K3Qudnh9ZnVuY3Rpb24gb3kodCl7cmV0dXJuIHQueSt0LnZ5fWZ1bmN0aW9uIGF5KHQpe3JldHVybiB0LmluZGV4fWZ1bmN0aW9uIHN5KHQsZSl7dmFyIG49dC5nZXQoZSk7aWYoIW4pdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nOiAiK2UpO3JldHVybiBufWZ1bmN0aW9uIGx5KHQpe3JldHVybiB0Lnh9ZnVuY3Rpb24gY3kodCl7cmV0dXJuIHQueX1peS5jb3B5PWZ1bmN0aW9uKCl7dmFyIHQsZSxuPW5ldyBleSh0aGlzLl94LHRoaXMuX3ksdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpLGk9dGhpcy5fcm9vdDtpZighaSlyZXR1cm4gbjtpZighaS5sZW5ndGgpcmV0dXJuIG4uX3Jvb3Q9bnkoaSksbjtmb3IodD1be3NvdXJjZTppLHRhcmdldDpuLl9yb290PW5ldyBBcnJheSg0KX1dO2k9dC5wb3AoKTspZm9yKHZhciByPTA7cjw0OysrcikoZT1pLnNvdXJjZVtyXSkmJihlLmxlbmd0aD90LnB1c2goe3NvdXJjZTplLHRhcmdldDppLnRhcmdldFtyXT1uZXcgQXJyYXkoNCl9KTppLnRhcmdldFtyXT1ueShlKSk7cmV0dXJuIG59LGl5LmFkZD1mdW5jdGlvbiB1eSh0KXt2YXIgZT0rdGhpcy5feC5jYWxsKG51bGwsdCksbj0rdGhpcy5feS5jYWxsKG51bGwsdCk7cmV0dXJuIEtfKHRoaXMuY292ZXIoZSxuKSxlLG4sdCl9LGl5LmFkZEFsbD1mdW5jdGlvbiBoeSh0KXt2YXIgZSxuLGkscixvPXQubGVuZ3RoLGE9bmV3IEFycmF5KG8pLHM9bmV3IEFycmF5KG8pLGw9MS8wLGM9MS8wLHU9LTEvMCxoPS0xLzA7Zm9yKG49MDtuPG87KytuKWlzTmFOKGk9K3RoaXMuX3guY2FsbChudWxsLGU9dFtuXSkpfHxpc05hTihyPSt0aGlzLl95LmNhbGwobnVsbCxlKSl8fChhW25dPWksc1tuXT1yLGk8bCYmKGw9aSksaT51JiYodT1pKSxyPGMmJihjPXIpLHI+aCYmKGg9cikpO2lmKGw+dXx8Yz5oKXJldHVybiB0aGlzO2Zvcih0aGlzLmNvdmVyKGwsYykuY292ZXIodSxoKSxuPTA7bjxvOysrbilLXyh0aGlzLGFbbl0sc1tuXSx0W25dKTtyZXR1cm4gdGhpc30saXkuY292ZXI9ZnVuY3Rpb24gZHkodCxlKXtpZihpc05hTih0PSt0KXx8aXNOYU4oZT0rZSkpcmV0dXJuIHRoaXM7dmFyIG49dGhpcy5feDAsaT10aGlzLl95MCxyPXRoaXMuX3gxLG89dGhpcy5feTE7aWYoaXNOYU4obikpcj0obj1NYXRoLmZsb29yKHQpKSsxLG89KGk9TWF0aC5mbG9vcihlKSkrMTtlbHNle2Zvcih2YXIgYSxzLGw9ci1uLGM9dGhpcy5fcm9vdDtuPnR8fHQ+PXJ8fGk+ZXx8ZT49bzspc3dpdGNoKHM9KGU8aSk8PDF8dDxuLChhPW5ldyBBcnJheSg0KSlbc109YyxjPWEsbCo9MixzKXtjYXNlIDA6cj1uK2wsbz1pK2w7YnJlYWs7Y2FzZSAxOm49ci1sLG89aStsO2JyZWFrO2Nhc2UgMjpyPW4rbCxpPW8tbDticmVhaztjYXNlIDM6bj1yLWwsaT1vLWx9dGhpcy5fcm9vdCYmdGhpcy5fcm9vdC5sZW5ndGgmJih0aGlzLl9yb290PWMpfXJldHVybiB0aGlzLl94MD1uLHRoaXMuX3kwPWksdGhpcy5feDE9cix0aGlzLl95MT1vLHRoaXN9LGl5LmRhdGE9ZnVuY3Rpb24gcHkoKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy52aXNpdCgoZnVuY3Rpb24oZSl7aWYoIWUubGVuZ3RoKWRve3QucHVzaChlLmRhdGEpfXdoaWxlKGU9ZS5uZXh0KX0pKSx0fSxpeS5leHRlbnQ9ZnVuY3Rpb24gZnkodCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5jb3ZlcigrdFswXVswXSwrdFswXVsxXSkuY292ZXIoK3RbMV1bMF0sK3RbMV1bMV0pOmlzTmFOKHRoaXMuX3gwKT92b2lkIDA6W1t0aGlzLl94MCx0aGlzLl95MF0sW3RoaXMuX3gxLHRoaXMuX3kxXV19LGl5LmZpbmQ9ZnVuY3Rpb24gbXkodCxlLG4pe3ZhciBpLHIsbyxhLHMsbCxjLHU9dGhpcy5feDAsaD10aGlzLl95MCxkPXRoaXMuX3gxLHA9dGhpcy5feTEsZj1bXSxtPXRoaXMuX3Jvb3Q7Zm9yKG0mJmYucHVzaChuZXcgWl8obSx1LGgsZCxwKSksbnVsbD09bj9uPTEvMDoodT10LW4saD1lLW4sZD10K24scD1lK24sbio9bik7bD1mLnBvcCgpOylpZighKCEobT1sLm5vZGUpfHwocj1sLngwKT5kfHwobz1sLnkwKT5wfHwoYT1sLngxKTx1fHwocz1sLnkxKTxoKSlpZihtLmxlbmd0aCl7dmFyIGc9KHIrYSkvMixfPShvK3MpLzI7Zi5wdXNoKG5ldyBaXyhtWzNdLGcsXyxhLHMpLG5ldyBaXyhtWzJdLHIsXyxnLHMpLG5ldyBaXyhtWzFdLGcsbyxhLF8pLG5ldyBaXyhtWzBdLHIsbyxnLF8pKSwoYz0oZT49Xyk8PDF8dD49ZykmJihsPWZbZi5sZW5ndGgtMV0sZltmLmxlbmd0aC0xXT1mW2YubGVuZ3RoLTEtY10sZltmLmxlbmd0aC0xLWNdPWwpfWVsc2V7dmFyIHk9dC0rdGhpcy5feC5jYWxsKG51bGwsbS5kYXRhKSx2PWUtK3RoaXMuX3kuY2FsbChudWxsLG0uZGF0YSksYj15Knkrdip2O2lmKGI8bil7dmFyIHg9TWF0aC5zcXJ0KG49Yik7dT10LXgsaD1lLXgsZD10K3gscD1lK3gsaT1tLmRhdGF9fXJldHVybiBpfSxpeS5yZW1vdmU9ZnVuY3Rpb24gZ3kodCl7aWYoaXNOYU4obz0rdGhpcy5feC5jYWxsKG51bGwsdCkpfHxpc05hTihhPSt0aGlzLl95LmNhbGwobnVsbCx0KSkpcmV0dXJuIHRoaXM7dmFyIGUsbixpLHIsbyxhLHMsbCxjLHUsaCxkLHA9dGhpcy5fcm9vdCxmPXRoaXMuX3gwLG09dGhpcy5feTAsZz10aGlzLl94MSxfPXRoaXMuX3kxO2lmKCFwKXJldHVybiB0aGlzO2lmKHAubGVuZ3RoKWZvcig7Oyl7aWYoKGM9bz49KHM9KGYrZykvMikpP2Y9czpnPXMsKHU9YT49KGw9KG0rXykvMikpP209bDpfPWwsZT1wLCEocD1wW2g9dTw8MXxjXSkpcmV0dXJuIHRoaXM7aWYoIXAubGVuZ3RoKWJyZWFrOyhlW2grMSYzXXx8ZVtoKzImM118fGVbaCszJjNdKSYmKG49ZSxkPWgpfWZvcig7cC5kYXRhIT09dDspaWYoaT1wLCEocD1wLm5leHQpKXJldHVybiB0aGlzO3JldHVybihyPXAubmV4dCkmJmRlbGV0ZSBwLm5leHQsaT8ocj9pLm5leHQ9cjpkZWxldGUgaS5uZXh0LHRoaXMpOmU/KHI/ZVtoXT1yOmRlbGV0ZSBlW2hdLChwPWVbMF18fGVbMV18fGVbMl18fGVbM10pJiZwPT09KGVbM118fGVbMl18fGVbMV18fGVbMF0pJiYhcC5sZW5ndGgmJihuP25bZF09cDp0aGlzLl9yb290PXApLHRoaXMpOih0aGlzLl9yb290PXIsdGhpcyl9LGl5LnJlbW92ZUFsbD1mdW5jdGlvbiBfeSh0KXtmb3IodmFyIGU9MCxuPXQubGVuZ3RoO2U8bjsrK2UpdGhpcy5yZW1vdmUodFtlXSk7cmV0dXJuIHRoaXN9LGl5LnJvb3Q9ZnVuY3Rpb24geXkoKXtyZXR1cm4gdGhpcy5fcm9vdH0saXkuc2l6ZT1mdW5jdGlvbiB2eSgpe3ZhciB0PTA7cmV0dXJuIHRoaXMudmlzaXQoKGZ1bmN0aW9uKGUpe2lmKCFlLmxlbmd0aClkb3srK3R9d2hpbGUoZT1lLm5leHQpfSkpLHR9LGl5LnZpc2l0PWZ1bmN0aW9uIGJ5KHQpe3ZhciBlLG4saSxyLG8sYSxzPVtdLGw9dGhpcy5fcm9vdDtmb3IobCYmcy5wdXNoKG5ldyBaXyhsLHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSk7ZT1zLnBvcCgpOylpZighdChsPWUubm9kZSxpPWUueDAscj1lLnkwLG89ZS54MSxhPWUueTEpJiZsLmxlbmd0aCl7dmFyIGM9KGkrbykvMix1PShyK2EpLzI7KG49bFszXSkmJnMucHVzaChuZXcgWl8obixjLHUsbyxhKSksKG49bFsyXSkmJnMucHVzaChuZXcgWl8obixpLHUsYyxhKSksKG49bFsxXSkmJnMucHVzaChuZXcgWl8obixjLHIsbyx1KSksKG49bFswXSkmJnMucHVzaChuZXcgWl8obixpLHIsYyx1KSl9cmV0dXJuIHRoaXN9LGl5LnZpc2l0QWZ0ZXI9ZnVuY3Rpb24geHkodCl7dmFyIGUsbj1bXSxpPVtdO2Zvcih0aGlzLl9yb290JiZuLnB1c2gobmV3IFpfKHRoaXMuX3Jvb3QsdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpKTtlPW4ucG9wKCk7KXt2YXIgcj1lLm5vZGU7aWYoci5sZW5ndGgpe3ZhciBvLGE9ZS54MCxzPWUueTAsbD1lLngxLGM9ZS55MSx1PShhK2wpLzIsaD0ocytjKS8yOyhvPXJbMF0pJiZuLnB1c2gobmV3IFpfKG8sYSxzLHUsaCkpLChvPXJbMV0pJiZuLnB1c2gobmV3IFpfKG8sdSxzLGwsaCkpLChvPXJbMl0pJiZuLnB1c2gobmV3IFpfKG8sYSxoLHUsYykpLChvPXJbM10pJiZuLnB1c2gobmV3IFpfKG8sdSxoLGwsYykpfWkucHVzaChlKX1mb3IoO2U9aS5wb3AoKTspdChlLm5vZGUsZS54MCxlLnkwLGUueDEsZS55MSk7cmV0dXJuIHRoaXN9LGl5Lng9ZnVuY3Rpb24gd3kodCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3g9dCx0aGlzKTp0aGlzLl94fSxpeS55PWZ1bmN0aW9uIFN5KHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLl95PXQsdGhpcyk6dGhpcy5feX07dmFyIE15PU1hdGguUEkqKDMtTWF0aC5zcXJ0KDUpKTtmdW5jdGlvbiBFeSh0LGUpe2lmKChuPSh0PWU/dC50b0V4cG9uZW50aWFsKGUtMSk6dC50b0V4cG9uZW50aWFsKCkpLmluZGV4T2YoImUiKSk8MClyZXR1cm4gbnVsbDt2YXIgbixpPXQuc2xpY2UoMCxuKTtyZXR1cm5baS5sZW5ndGg+MT9pWzBdK2kuc2xpY2UoMik6aSwrdC5zbGljZShuKzEpXX1mdW5jdGlvbiBUeSh0KXtyZXR1cm4odD1FeShNYXRoLmFicyh0KSkpP3RbMV06TmFOfXZhciBDeSxBeT0vXig/OiguKT8oWzw+PV5dKSk/KFsrXC0oIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLlxkKyk/KH4pPyhbYS16JV0pPyQvaTtmdW5jdGlvbiBreSh0KXtpZighKGU9QXkuZXhlYyh0KSkpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvcm1hdDogIit0KTt2YXIgZTtyZXR1cm4gbmV3IEx5KHtmaWxsOmVbMV0sYWxpZ246ZVsyXSxzaWduOmVbM10sc3ltYm9sOmVbNF0semVybzplWzVdLHdpZHRoOmVbNl0sY29tbWE6ZVs3XSxwcmVjaXNpb246ZVs4XSYmZVs4XS5zbGljZSgxKSx0cmltOmVbOV0sdHlwZTplWzEwXX0pfWZ1bmN0aW9uIEx5KHQpe3RoaXMuZmlsbD12b2lkIDA9PT10LmZpbGw/IiAiOnQuZmlsbCsiIix0aGlzLmFsaWduPXZvaWQgMD09PXQuYWxpZ24/Ij4iOnQuYWxpZ24rIiIsdGhpcy5zaWduPXZvaWQgMD09PXQuc2lnbj8iLSI6dC5zaWduKyIiLHRoaXMuc3ltYm9sPXZvaWQgMD09PXQuc3ltYm9sPyIiOnQuc3ltYm9sKyIiLHRoaXMuemVybz0hIXQuemVybyx0aGlzLndpZHRoPXZvaWQgMD09PXQud2lkdGg/dm9pZCAwOit0LndpZHRoLHRoaXMuY29tbWE9ISF0LmNvbW1hLHRoaXMucHJlY2lzaW9uPXZvaWQgMD09PXQucHJlY2lzaW9uP3ZvaWQgMDordC5wcmVjaXNpb24sdGhpcy50cmltPSEhdC50cmltLHRoaXMudHlwZT12b2lkIDA9PT10LnR5cGU/IiI6dC50eXBlKyIifWZ1bmN0aW9uIFB5KHQsZSl7dmFyIG49RXkodCxlKTtpZighbilyZXR1cm4gdCsiIjt2YXIgaT1uWzBdLHI9blsxXTtyZXR1cm4gcjwwPyIwLiIrbmV3IEFycmF5KC1yKS5qb2luKCIwIikraTppLmxlbmd0aD5yKzE/aS5zbGljZSgwLHIrMSkrIi4iK2kuc2xpY2UocisxKTppK25ldyBBcnJheShyLWkubGVuZ3RoKzIpLmpvaW4oIjAiKX1reS5wcm90b3R5cGU9THkucHJvdG90eXBlLEx5LnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbGwrdGhpcy5hbGlnbit0aGlzLnNpZ24rdGhpcy5zeW1ib2wrKHRoaXMuemVybz8iMCI6IiIpKyh2b2lkIDA9PT10aGlzLndpZHRoPyIiOk1hdGgubWF4KDEsMHx0aGlzLndpZHRoKSkrKHRoaXMuY29tbWE/IiwiOiIiKSsodm9pZCAwPT09dGhpcy5wcmVjaXNpb24/IiI6Ii4iK01hdGgubWF4KDAsMHx0aGlzLnByZWNpc2lvbikpKyh0aGlzLnRyaW0/In4iOiIiKSt0aGlzLnR5cGV9O3ZhciBOeT17IiUiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuKDEwMCp0KS50b0ZpeGVkKGUpfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDIpfSxjOmZ1bmN0aW9uKHQpe3JldHVybiB0KyIifSxkOmZ1bmN0aW9uIEl5KHQpe3JldHVybiBNYXRoLmFicyh0PU1hdGgucm91bmQodCkpPj0xZTIxP3QudG9Mb2NhbGVTdHJpbmcoImVuIikucmVwbGFjZSgvLC9nLCIiKTp0LnRvU3RyaW5nKDEwKX0sZTpmdW5jdGlvbih0LGUpe3JldHVybiB0LnRvRXhwb25lbnRpYWwoZSl9LGY6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC50b0ZpeGVkKGUpfSxnOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudG9QcmVjaXNpb24oZSl9LG86ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoOCl9LHA6ZnVuY3Rpb24odCxlKXtyZXR1cm4gUHkoMTAwKnQsZSl9LHI6UHksczpmdW5jdGlvbiBSeSh0LGUpe3ZhciBuPUV5KHQsZSk7aWYoIW4pcmV0dXJuIHQrIiI7dmFyIGk9blswXSxyPW5bMV0sbz1yLShDeT0zKk1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihyLzMpKSkpKzEsYT1pLmxlbmd0aDtyZXR1cm4gbz09PWE/aTpvPmE/aStuZXcgQXJyYXkoby1hKzEpLmpvaW4oIjAiKTpvPjA/aS5zbGljZSgwLG8pKyIuIitpLnNsaWNlKG8pOiIwLiIrbmV3IEFycmF5KDEtbykuam9pbigiMCIpK0V5KHQsTWF0aC5tYXgoMCxlK28tMSkpWzBdfSxYOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfSx4OmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDE2KX19O2Z1bmN0aW9uIE95KHQpe3JldHVybiB0fXZhciB6eSxEeSxCeSxIeT1BcnJheS5wcm90b3R5cGUubWFwLEZ5PVsieSIsInoiLCJhIiwiZiIsInAiLCJuIiwiwrUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXTtmdW5jdGlvbiBWeSh0KXt2YXIgZT12b2lkIDA9PT10Lmdyb3VwaW5nfHx2b2lkIDA9PT10LnRob3VzYW5kcz9PeTooZnVuY3Rpb24gbih0LGUpe3JldHVybiBmdW5jdGlvbihuLGkpe2Zvcih2YXIgcj1uLmxlbmd0aCxvPVtdLGE9MCxzPXRbMF0sbD0wO3I+MCYmcz4wJiYobCtzKzE+aSYmKHM9TWF0aC5tYXgoMSxpLWwpKSxvLnB1c2gobi5zdWJzdHJpbmcoci09cyxyK3MpKSwhKChsKz1zKzEpPmkpKTspcz10W2E9KGErMSkldC5sZW5ndGhdO3JldHVybiBvLnJldmVyc2UoKS5qb2luKGUpfX0pKEh5LmNhbGwodC5ncm91cGluZyxOdW1iZXIpLHQudGhvdXNhbmRzKyIiKSxpPXZvaWQgMD09PXQuY3VycmVuY3k/IiI6dC5jdXJyZW5jeVswXSsiIixyPXZvaWQgMD09PXQuY3VycmVuY3k/IiI6dC5jdXJyZW5jeVsxXSsiIixvPXZvaWQgMD09PXQuZGVjaW1hbD8iLiI6dC5kZWNpbWFsKyIiLGE9dm9pZCAwPT09dC5udW1lcmFscz9PeTooZnVuY3Rpb24gcyh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZSgvWzAtOV0vZywoZnVuY3Rpb24oZSl7cmV0dXJuIHRbK2VdfSkpfX0pKEh5LmNhbGwodC5udW1lcmFscyxTdHJpbmcpKSxsPXZvaWQgMD09PXQucGVyY2VudD8iJSI6dC5wZXJjZW50KyIiLGM9dm9pZCAwPT09dC5taW51cz8iLSI6dC5taW51cysiIix1PXZvaWQgMD09PXQubmFuPyJOYU4iOnQubmFuKyIiO2Z1bmN0aW9uIGgodCl7dmFyIG49KHQ9a3kodCkpLmZpbGwscz10LmFsaWduLGg9dC5zaWduLGQ9dC5zeW1ib2wscD10Lnplcm8sZj10LndpZHRoLG09dC5jb21tYSxnPXQucHJlY2lzaW9uLF89dC50cmltLHk9dC50eXBlOyJuIj09PXk/KG09ITAseT0iZyIpOk55W3ldfHwodm9pZCAwPT09ZyYmKGc9MTIpLF89ITAseT0iZyIpLChwfHwiMCI9PT1uJiYiPSI9PT1zKSYmKHA9ITAsbj0iMCIscz0iPSIpO3ZhciB2PSIkIj09PWQ/aToiIyI9PT1kJiYvW2JveFhdLy50ZXN0KHkpPyIwIit5LnRvTG93ZXJDYXNlKCk6IiIsYj0iJCI9PT1kP3I6L1slcF0vLnRlc3QoeSk/bDoiIix4PU55W3ldLHc9L1tkZWZncHJzJV0vLnRlc3QoeSk7ZnVuY3Rpb24gUyh0KXt2YXIgaSxyLGwsZD12LFM9YjtpZigiYyI9PT15KVM9eCh0KStTLHQ9IiI7ZWxzZXt2YXIgTT0odD0rdCk8MHx8MS90PDA7aWYodD1pc05hTih0KT91OngoTWF0aC5hYnModCksZyksXyYmKHQ9KGZ1bmN0aW9uIEUodCl7dDpmb3IodmFyIGUsbj10Lmxlbmd0aCxpPTEscj0tMTtpPG47KytpKXN3aXRjaCh0W2ldKXtjYXNlIi4iOnI9ZT1pO2JyZWFrO2Nhc2UiMCI6MD09PXImJihyPWkpLGU9aTticmVhaztkZWZhdWx0OmlmKCErdFtpXSlicmVhayB0O3I+MCYmKHI9MCl9cmV0dXJuIHI+MD90LnNsaWNlKDAscikrdC5zbGljZShlKzEpOnR9KSh0KSksTSYmMD09K3QmJiIrIiE9PWgmJihNPSExKSxkPShNPyIoIj09PWg/aDpjOiItIj09PWh8fCIoIj09PWg/IiI6aCkrZCxTPSgicyI9PT15P0Z5WzgrQ3kvM106IiIpK1MrKE0mJiIoIj09PWg/IikiOiIiKSx3KWZvcihpPS0xLHI9dC5sZW5ndGg7KytpPHI7KWlmKDQ4PihsPXQuY2hhckNvZGVBdChpKSl8fGw+NTcpe1M9KDQ2PT09bD9vK3Quc2xpY2UoaSsxKTp0LnNsaWNlKGkpKStTLHQ9dC5zbGljZSgwLGkpO2JyZWFrfX1tJiYhcCYmKHQ9ZSh0LDEvMCkpO3ZhciBUPWQubGVuZ3RoK3QubGVuZ3RoK1MubGVuZ3RoLEM9VDxmP25ldyBBcnJheShmLVQrMSkuam9pbihuKToiIjtzd2l0Y2gobSYmcCYmKHQ9ZShDK3QsQy5sZW5ndGg/Zi1TLmxlbmd0aDoxLzApLEM9IiIpLHMpe2Nhc2UiPCI6dD1kK3QrUytDO2JyZWFrO2Nhc2UiPSI6dD1kK0MrdCtTO2JyZWFrO2Nhc2UiXiI6dD1DLnNsaWNlKDAsVD1DLmxlbmd0aD4+MSkrZCt0K1MrQy5zbGljZShUKTticmVhaztkZWZhdWx0OnQ9QytkK3QrU31yZXR1cm4gYSh0KX1yZXR1cm4gZz12b2lkIDA9PT1nPzY6L1tncHJzXS8udGVzdCh5KT9NYXRoLm1heCgxLE1hdGgubWluKDIxLGcpKTpNYXRoLm1heCgwLE1hdGgubWluKDIwLGcpKSxTLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHQrIiJ9LFN9cmV0dXJue2Zvcm1hdDpoLGZvcm1hdFByZWZpeDpmdW5jdGlvbiBkKHQsZSl7dmFyIG49aCgoKHQ9a3kodCkpLnR5cGU9ImYiLHQpKSxpPTMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKFR5KGUpLzMpKSkscj1NYXRoLnBvdygxMCwtaSksbz1GeVs4K2kvM107cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBuKHIqdCkrb319fX1mdW5jdGlvbiBVeSh0KXtyZXR1cm4genk9VnkodCksRHk9enkuZm9ybWF0LEJ5PXp5LmZvcm1hdFByZWZpeCx6eX1mdW5jdGlvbiBqeSh0KXtyZXR1cm4gTWF0aC5tYXgoMCwtVHkoTWF0aC5hYnModCkpKX1mdW5jdGlvbiBHeSh0LGUpe3JldHVybiBNYXRoLm1heCgwLDMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKFR5KGUpLzMpKSktVHkoTWF0aC5hYnModCkpKX1mdW5jdGlvbiBXeSh0LGUpe3JldHVybiB0PU1hdGguYWJzKHQpLGU9TWF0aC5hYnMoZSktdCxNYXRoLm1heCgwLFR5KGUpLVR5KHQpKSsxfWZ1bmN0aW9uIHF5KCl7cmV0dXJuIG5ldyBZeX1mdW5jdGlvbiBZeSgpe3RoaXMucmVzZXQoKX1VeSh7ZGVjaW1hbDoiLiIsdGhvdXNhbmRzOiIsIixncm91cGluZzpbM10sY3VycmVuY3k6WyIkIiwiIl0sbWludXM6Ii0ifSksWXkucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpZeSxyZXNldDpmdW5jdGlvbigpe3RoaXMucz10aGlzLnQ9MH0sYWRkOmZ1bmN0aW9uKHQpeyR5KFh5LHQsdGhpcy50KSwkeSh0aGlzLFh5LnMsdGhpcy5zKSx0aGlzLnM/dGhpcy50Kz1YeS50OnRoaXMucz1YeS50fSx2YWx1ZU9mOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc319O3ZhciBYeT1uZXcgWXk7ZnVuY3Rpb24gJHkodCxlLG4pe3ZhciBpPXQucz1lK24scj1pLWU7dC50PWUtKGktcikrKG4tcil9dmFyIEt5PTFlLTYsWnk9MWUtMTIsSnk9TWF0aC5QSSxReT1KeS8yLHR2PUp5LzQsZXY9MipKeSxudj0xODAvSnksaXY9SnkvMTgwLHJ2PU1hdGguYWJzLG92PU1hdGguYXRhbixhdj1NYXRoLmF0YW4yLHN2PU1hdGguY29zLGx2PU1hdGguY2VpbCxjdj1NYXRoLmV4cCx1dj1NYXRoLmxvZyxodj1NYXRoLnBvdyxkdj1NYXRoLnNpbixwdj1NYXRoLnNpZ258fGZ1bmN0aW9uKHQpe3JldHVybiB0PjA/MTp0PDA/LTE6MH0sZnY9TWF0aC5zcXJ0LG12PU1hdGgudGFuO2Z1bmN0aW9uIGd2KHQpe3JldHVybiB0PjE/MDp0PC0xP0p5Ok1hdGguYWNvcyh0KX1mdW5jdGlvbiBfdih0KXtyZXR1cm4gdD4xP1F5OnQ8LTE/LVF5Ok1hdGguYXNpbih0KX1mdW5jdGlvbiB5dih0KXtyZXR1cm4odD1kdih0LzIpKSp0fWZ1bmN0aW9uIHZ2KCl7fWZ1bmN0aW9uIGJ2KHQsZSl7dCYmd3YuaGFzT3duUHJvcGVydHkodC50eXBlKSYmd3ZbdC50eXBlXSh0LGUpfXZhciB4dj17RmVhdHVyZTpmdW5jdGlvbih0LGUpe2J2KHQuZ2VvbWV0cnksZSl9LEZlYXR1cmVDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuZmVhdHVyZXMsaT0tMSxyPW4ubGVuZ3RoOysraTxyOylidihuW2ldLmdlb21ldHJ5LGUpfX0sd3Y9e1NwaGVyZTpmdW5jdGlvbih0LGUpe2Uuc3BoZXJlKCl9LFBvaW50OmZ1bmN0aW9uKHQsZSl7ZS5wb2ludCgodD10LmNvb3JkaW5hdGVzKVswXSx0WzFdLHRbMl0pfSxNdWx0aVBvaW50OmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuY29vcmRpbmF0ZXMsaT0tMSxyPW4ubGVuZ3RoOysraTxyOyllLnBvaW50KCh0PW5baV0pWzBdLHRbMV0sdFsyXSl9LExpbmVTdHJpbmc6ZnVuY3Rpb24odCxlKXtTdih0LmNvb3JkaW5hdGVzLGUsMCl9LE11bHRpTGluZVN0cmluZzpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmNvb3JkaW5hdGVzLGk9LTEscj1uLmxlbmd0aDsrK2k8cjspU3YobltpXSxlLDApfSxQb2x5Z29uOmZ1bmN0aW9uKHQsZSl7TXYodC5jb29yZGluYXRlcyxlKX0sTXVsdGlQb2x5Z29uOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuY29vcmRpbmF0ZXMsaT0tMSxyPW4ubGVuZ3RoOysraTxyOylNdihuW2ldLGUpfSxHZW9tZXRyeUNvbGxlY3Rpb246ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5nZW9tZXRyaWVzLGk9LTEscj1uLmxlbmd0aDsrK2k8cjspYnYobltpXSxlKX19O2Z1bmN0aW9uIFN2KHQsZSxuKXt2YXIgaSxyPS0xLG89dC5sZW5ndGgtbjtmb3IoZS5saW5lU3RhcnQoKTsrK3I8bzspZS5wb2ludCgoaT10W3JdKVswXSxpWzFdLGlbMl0pO2UubGluZUVuZCgpfWZ1bmN0aW9uIE12KHQsZSl7dmFyIG49LTEsaT10Lmxlbmd0aDtmb3IoZS5wb2x5Z29uU3RhcnQoKTsrK248aTspU3YodFtuXSxlLDEpO2UucG9seWdvbkVuZCgpfWZ1bmN0aW9uIEV2KHQsZSl7dCYmeHYuaGFzT3duUHJvcGVydHkodC50eXBlKT94dlt0LnR5cGVdKHQsZSk6YnYodCxlKX12YXIgVHYsQ3YsQXYsa3YsTHYsUHY9cXkoKSxOdj1xeSgpLEl2PXtwb2ludDp2dixsaW5lU3RhcnQ6dnYsbGluZUVuZDp2dixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtQdi5yZXNldCgpLEl2LmxpbmVTdGFydD1SdixJdi5saW5lRW5kPU92fSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9K1B2O052LmFkZCh0PDA/ZXYrdDp0KSx0aGlzLmxpbmVTdGFydD10aGlzLmxpbmVFbmQ9dGhpcy5wb2ludD12dn0sc3BoZXJlOmZ1bmN0aW9uKCl7TnYuYWRkKGV2KX19O2Z1bmN0aW9uIFJ2KCl7SXYucG9pbnQ9enZ9ZnVuY3Rpb24gT3YoKXtEdihUdixDdil9ZnVuY3Rpb24genYodCxlKXtJdi5wb2ludD1EdixUdj10LEN2PWUsQXY9dCo9aXYsa3Y9c3YoZT0oZSo9aXYpLzIrdHYpLEx2PWR2KGUpfWZ1bmN0aW9uIER2KHQsZSl7dmFyIG49KHQqPWl2KS1BdixpPW4+PTA/MTotMSxyPWkqbixvPXN2KGU9KGUqPWl2KS8yK3R2KSxhPWR2KGUpLHM9THYqYSxsPWt2Km8rcypzdihyKSxjPXMqaSpkdihyKTtQdi5hZGQoYXYoYyxsKSksQXY9dCxrdj1vLEx2PWF9ZnVuY3Rpb24gQnYodCl7cmV0dXJuW2F2KHRbMV0sdFswXSksX3YodFsyXSldfWZ1bmN0aW9uIEh2KHQpe3ZhciBlPXRbMF0sbj10WzFdLGk9c3Yobik7cmV0dXJuW2kqc3YoZSksaSpkdihlKSxkdihuKV19ZnVuY3Rpb24gRnYodCxlKXtyZXR1cm4gdFswXSplWzBdK3RbMV0qZVsxXSt0WzJdKmVbMl19ZnVuY3Rpb24gVnYodCxlKXtyZXR1cm5bdFsxXSplWzJdLXRbMl0qZVsxXSx0WzJdKmVbMF0tdFswXSplWzJdLHRbMF0qZVsxXS10WzFdKmVbMF1dfWZ1bmN0aW9uIFV2KHQsZSl7dFswXSs9ZVswXSx0WzFdKz1lWzFdLHRbMl0rPWVbMl19ZnVuY3Rpb24ganYodCxlKXtyZXR1cm5bdFswXSplLHRbMV0qZSx0WzJdKmVdfWZ1bmN0aW9uIEd2KHQpe3ZhciBlPWZ2KHRbMF0qdFswXSt0WzFdKnRbMV0rdFsyXSp0WzJdKTt0WzBdLz1lLHRbMV0vPWUsdFsyXS89ZX12YXIgV3YscXYsWXYsWHYsJHYsS3YsWnYsSnYsUXYsdGIsZWIsbmIsaWIscmIsb2IsYWIsc2IsbGIsY2IsdWIsaGIsZGIscGIsZmIsbWIsZ2IsX2I9cXkoKSx5Yj17cG9pbnQ6dmIsbGluZVN0YXJ0OnhiLGxpbmVFbmQ6d2IscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7eWIucG9pbnQ9U2IseWIubGluZVN0YXJ0PU1iLHliLmxpbmVFbmQ9RWIsX2IucmVzZXQoKSxJdi5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe0l2LnBvbHlnb25FbmQoKSx5Yi5wb2ludD12Yix5Yi5saW5lU3RhcnQ9eGIseWIubGluZUVuZD13YixQdjwwPyhXdj0tKFl2PTE4MCkscXY9LShYdj05MCkpOl9iPkt5P1h2PTkwOl9iPC0xZS02JiYocXY9LTkwKSx0YlswXT1Xdix0YlsxXT1Zdn0sc3BoZXJlOmZ1bmN0aW9uKCl7V3Y9LShZdj0xODApLHF2PS0oWHY9OTApfX07ZnVuY3Rpb24gdmIodCxlKXtRdi5wdXNoKHRiPVtXdj10LFl2PXRdKSxlPHF2JiYocXY9ZSksZT5YdiYmKFh2PWUpfWZ1bmN0aW9uIGJiKHQsZSl7dmFyIG49SHYoW3QqaXYsZSppdl0pO2lmKEp2KXt2YXIgaT1WdihKdixuKSxyPVZ2KFtpWzFdLC1pWzBdLDBdLGkpO0d2KHIpLHI9QnYocik7dmFyIG8sYT10LSR2LHM9YT4wPzE6LTEsbD1yWzBdKm52KnMsYz1ydihhKT4xODA7Y14ocyokdjxsJiZsPHMqdCk/KG89clsxXSpudik+WHYmJihYdj1vKTpjXihzKiR2PChsPShsKzM2MCklMzYwLTE4MCkmJmw8cyp0KT8obz0tclsxXSpudik8cXYmJihxdj1vKTooZTxxdiYmKHF2PWUpLGU+WHYmJihYdj1lKSksYz90PCR2P1RiKFd2LHQpPlRiKFd2LFl2KSYmKFl2PXQpOlRiKHQsWXYpPlRiKFd2LFl2KSYmKFd2PXQpOll2Pj1Xdj8odDxXdiYmKFd2PXQpLHQ+WXYmJihZdj10KSk6dD4kdj9UYihXdix0KT5UYihXdixZdikmJihZdj10KTpUYih0LFl2KT5UYihXdixZdikmJihXdj10KX1lbHNlIFF2LnB1c2godGI9W1d2PXQsWXY9dF0pO2U8cXYmJihxdj1lKSxlPlh2JiYoWHY9ZSksSnY9biwkdj10fWZ1bmN0aW9uIHhiKCl7eWIucG9pbnQ9YmJ9ZnVuY3Rpb24gd2IoKXt0YlswXT1Xdix0YlsxXT1Zdix5Yi5wb2ludD12YixKdj1udWxsfWZ1bmN0aW9uIFNiKHQsZSl7aWYoSnYpe3ZhciBuPXQtJHY7X2IuYWRkKHJ2KG4pPjE4MD9uKyhuPjA/MzYwOi0zNjApOm4pfWVsc2UgS3Y9dCxadj1lO0l2LnBvaW50KHQsZSksYmIodCxlKX1mdW5jdGlvbiBNYigpe0l2LmxpbmVTdGFydCgpfWZ1bmN0aW9uIEViKCl7U2IoS3YsWnYpLEl2LmxpbmVFbmQoKSxydihfYik+S3kmJihXdj0tKFl2PTE4MCkpLHRiWzBdPVd2LHRiWzFdPVl2LEp2PW51bGx9ZnVuY3Rpb24gVGIodCxlKXtyZXR1cm4oZS09dCk8MD9lKzM2MDplfWZ1bmN0aW9uIENiKHQsZSl7cmV0dXJuIHRbMF0tZVswXX1mdW5jdGlvbiBBYih0LGUpe3JldHVybiB0WzBdPD10WzFdP3RbMF08PWUmJmU8PXRbMV06ZTx0WzBdfHx0WzFdPGV9dmFyIGtiPXtzcGhlcmU6dnYscG9pbnQ6TGIsbGluZVN0YXJ0Ok5iLGxpbmVFbmQ6T2IscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7a2IubGluZVN0YXJ0PXpiLGtiLmxpbmVFbmQ9RGJ9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtrYi5saW5lU3RhcnQ9TmIsa2IubGluZUVuZD1PYn19O2Z1bmN0aW9uIExiKHQsZSl7dCo9aXY7dmFyIG49c3YoZSo9aXYpO1BiKG4qc3YodCksbipkdih0KSxkdihlKSl9ZnVuY3Rpb24gUGIodCxlLG4peysrZWIsaWIrPSh0LWliKS9lYixyYis9KGUtcmIpL2ViLG9iKz0obi1vYikvZWJ9ZnVuY3Rpb24gTmIoKXtrYi5wb2ludD1JYn1mdW5jdGlvbiBJYih0LGUpe3QqPWl2O3ZhciBuPXN2KGUqPWl2KTtmYj1uKnN2KHQpLG1iPW4qZHYodCksZ2I9ZHYoZSksa2IucG9pbnQ9UmIsUGIoZmIsbWIsZ2IpfWZ1bmN0aW9uIFJiKHQsZSl7dCo9aXY7dmFyIG49c3YoZSo9aXYpLGk9bipzdih0KSxyPW4qZHYodCksbz1kdihlKSxhPWF2KGZ2KChhPW1iKm8tZ2IqcikqYSsoYT1nYippLWZiKm8pKmErKGE9ZmIqci1tYippKSphKSxmYippK21iKnIrZ2Iqbyk7bmIrPWEsYWIrPWEqKGZiKyhmYj1pKSksc2IrPWEqKG1iKyhtYj1yKSksbGIrPWEqKGdiKyhnYj1vKSksUGIoZmIsbWIsZ2IpfWZ1bmN0aW9uIE9iKCl7a2IucG9pbnQ9TGJ9ZnVuY3Rpb24gemIoKXtrYi5wb2ludD1CYn1mdW5jdGlvbiBEYigpe0hiKGRiLHBiKSxrYi5wb2ludD1MYn1mdW5jdGlvbiBCYih0LGUpe2RiPXQscGI9ZSx0Kj1pdixlKj1pdixrYi5wb2ludD1IYjt2YXIgbj1zdihlKTtmYj1uKnN2KHQpLG1iPW4qZHYodCksZ2I9ZHYoZSksUGIoZmIsbWIsZ2IpfWZ1bmN0aW9uIEhiKHQsZSl7dCo9aXY7dmFyIG49c3YoZSo9aXYpLGk9bipzdih0KSxyPW4qZHYodCksbz1kdihlKSxhPW1iKm8tZ2IqcixzPWdiKmktZmIqbyxsPWZiKnItbWIqaSxjPWZ2KGEqYStzKnMrbCpsKSx1PV92KGMpLGg9YyYmLXUvYztjYis9aCphLHViKz1oKnMsaGIrPWgqbCxuYis9dSxhYis9dSooZmIrKGZiPWkpKSxzYis9dSoobWIrKG1iPXIpKSxsYis9dSooZ2IrKGdiPW8pKSxQYihmYixtYixnYil9ZnVuY3Rpb24gRmIodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIFZiKHQsZSl7ZnVuY3Rpb24gbihuLGkpe3JldHVybiBuPXQobixpKSxlKG5bMF0sblsxXSl9cmV0dXJuIHQuaW52ZXJ0JiZlLmludmVydCYmKG4uaW52ZXJ0PWZ1bmN0aW9uKG4saSl7cmV0dXJuKG49ZS5pbnZlcnQobixpKSkmJnQuaW52ZXJ0KG5bMF0sblsxXSl9KSxufWZ1bmN0aW9uIFViKHQsZSl7cmV0dXJuW3J2KHQpPkp5P3QrTWF0aC5yb3VuZCgtdC9ldikqZXY6dCxlXX1mdW5jdGlvbiBqYih0LGUsbil7cmV0dXJuKHQlPWV2KT9lfHxuP1ZiKFdiKHQpLHFiKGUsbikpOldiKHQpOmV8fG4/cWIoZSxuKTpVYn1mdW5jdGlvbiBHYih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXtyZXR1cm5bKGUrPXQpPkp5P2UtZXY6ZTwtSnk/ZStldjplLG5dfX1mdW5jdGlvbiBXYih0KXt2YXIgZT1HYih0KTtyZXR1cm4gZS5pbnZlcnQ9R2IoLXQpLGV9ZnVuY3Rpb24gcWIodCxlKXt2YXIgbj1zdih0KSxpPWR2KHQpLHI9c3YoZSksbz1kdihlKTtmdW5jdGlvbiBhKHQsZSl7dmFyIGE9c3YoZSkscz1zdih0KSphLGw9ZHYodCkqYSxjPWR2KGUpLHU9YypuK3MqaTtyZXR1cm5bYXYobCpyLXUqbyxzKm4tYyppKSxfdih1KnIrbCpvKV19cmV0dXJuIGEuaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7dmFyIGE9c3YoZSkscz1zdih0KSphLGw9ZHYodCkqYSxjPWR2KGUpLHU9YypyLWwqbztyZXR1cm5bYXYobCpyK2MqbyxzKm4rdSppKSxfdih1Km4tcyppKV19LGF9ZnVuY3Rpb24gWWIodCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4oZT10KGVbMF0qaXYsZVsxXSppdikpWzBdKj1udixlWzFdKj1udixlfXJldHVybiB0PWpiKHRbMF0qaXYsdFsxXSppdix0Lmxlbmd0aD4yP3RbMl0qaXY6MCksZS5pbnZlcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuKGU9dC5pbnZlcnQoZVswXSppdixlWzFdKml2KSlbMF0qPW52LGVbMV0qPW52LGV9LGV9ZnVuY3Rpb24gWGIodCxlLG4saSxyLG8pe2lmKG4pe3ZhciBhPXN2KGUpLHM9ZHYoZSksbD1pKm47bnVsbD09cj8ocj1lK2kqZXYsbz1lLWwvMik6KHI9JGIoYSxyKSxvPSRiKGEsbyksKGk+MD9yPG86cj5vKSYmKHIrPWkqZXYpKTtmb3IodmFyIGMsdT1yO2k+MD91Pm86dTxvO3UtPWwpYz1CdihbYSwtcypzdih1KSwtcypkdih1KV0pLHQucG9pbnQoY1swXSxjWzFdKX19ZnVuY3Rpb24gJGIodCxlKXsoZT1IdihlKSlbMF0tPXQsR3YoZSk7dmFyIG49Z3YoLWVbMV0pO3JldHVybigoLWVbMl08MD8tbjpuKStldi1LeSklZXZ9ZnVuY3Rpb24gS2IoKXt2YXIgdCxlPVtdO3JldHVybntwb2ludDpmdW5jdGlvbihlLG4saSl7dC5wdXNoKFtlLG4saV0pfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtlLnB1c2godD1bXSl9LGxpbmVFbmQ6dnYscmVqb2luOmZ1bmN0aW9uKCl7ZS5sZW5ndGg+MSYmZS5wdXNoKGUucG9wKCkuY29uY2F0KGUuc2hpZnQoKSkpfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgbj1lO3JldHVybiBlPVtdLHQ9bnVsbCxufX19ZnVuY3Rpb24gWmIodCxlKXtyZXR1cm4gcnYodFswXS1lWzBdKTxLeSYmcnYodFsxXS1lWzFdKTxLeX1mdW5jdGlvbiBKYih0LGUsbixpKXt0aGlzLng9dCx0aGlzLno9ZSx0aGlzLm89bix0aGlzLmU9aSx0aGlzLnY9ITEsdGhpcy5uPXRoaXMucD1udWxsfWZ1bmN0aW9uIFFiKHQsZSxuLGkscil7dmFyIG8sYSxzPVtdLGw9W107aWYodC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZighKChlPXQubGVuZ3RoLTEpPD0wKSl7dmFyIGUsbixpPXRbMF0sYT10W2VdO2lmKFpiKGksYSkpe2lmKCFpWzJdJiYhYVsyXSl7Zm9yKHIubGluZVN0YXJ0KCksbz0wO288ZTsrK28pci5wb2ludCgoaT10W29dKVswXSxpWzFdKTtyZXR1cm4gdm9pZCByLmxpbmVFbmQoKX1hWzBdKz0yZS02fXMucHVzaChuPW5ldyBKYihpLHQsbnVsbCwhMCkpLGwucHVzaChuLm89bmV3IEpiKGksbnVsbCxuLCExKSkscy5wdXNoKG49bmV3IEpiKGEsdCxudWxsLCExKSksbC5wdXNoKG4ubz1uZXcgSmIoYSxudWxsLG4sITApKX19KSkscy5sZW5ndGgpe2ZvcihsLnNvcnQoZSksdHgocyksdHgobCksbz0wLGE9bC5sZW5ndGg7bzxhOysrbylsW29dLmU9bj0hbjtmb3IodmFyIGMsdSxoPXNbMF07Oyl7Zm9yKHZhciBkPWgscD0hMDtkLnY7KWlmKChkPWQubik9PT1oKXJldHVybjtjPWQueixyLmxpbmVTdGFydCgpO2Rve2lmKGQudj1kLm8udj0hMCxkLmUpe2lmKHApZm9yKG89MCxhPWMubGVuZ3RoO288YTsrK28pci5wb2ludCgodT1jW29dKVswXSx1WzFdKTtlbHNlIGkoZC54LGQubi54LDEscik7ZD1kLm59ZWxzZXtpZihwKWZvcihvPShjPWQucC56KS5sZW5ndGgtMTtvPj0wOy0tbylyLnBvaW50KCh1PWNbb10pWzBdLHVbMV0pO2Vsc2UgaShkLngsZC5wLngsLTEscik7ZD1kLnB9Yz0oZD1kLm8pLnoscD0hcH13aGlsZSghZC52KTtyLmxpbmVFbmQoKX19fWZ1bmN0aW9uIHR4KHQpe2lmKGU9dC5sZW5ndGgpe2Zvcih2YXIgZSxuLGk9MCxyPXRbMF07KytpPGU7KXIubj1uPXRbaV0sbi5wPXIscj1uO3Iubj1uPXRbMF0sbi5wPXJ9fVViLmludmVydD1VYjt2YXIgZXg9cXkoKTtmdW5jdGlvbiBueCh0KXtyZXR1cm4gcnYodFswXSk8PUp5P3RbMF06cHYodFswXSkqKChydih0WzBdKStKeSklZXYtSnkpfWZ1bmN0aW9uIGl4KHQsZSl7dmFyIG49bngoZSksaT1lWzFdLHI9ZHYoaSksbz1bZHYobiksLXN2KG4pLDBdLGE9MCxzPTA7ZXgucmVzZXQoKSwxPT09cj9pPVF5K0t5Oi0xPT09ciYmKGk9LVF5LUt5KTtmb3IodmFyIGw9MCxjPXQubGVuZ3RoO2w8YzsrK2wpaWYoaD0odT10W2xdKS5sZW5ndGgpZm9yKHZhciB1LGgsZD11W2gtMV0scD1ueChkKSxmPWRbMV0vMit0dixtPWR2KGYpLGc9c3YoZiksXz0wO188aDsrK18scD12LG09eCxnPXcsZD15KXt2YXIgeT11W19dLHY9bngoeSksYj15WzFdLzIrdHYseD1kdihiKSx3PXN2KGIpLFM9di1wLE09Uz49MD8xOi0xLEU9TSpTLFQ9RT5KeSxDPW0qeDtpZihleC5hZGQoYXYoQypNKmR2KEUpLGcqdytDKnN2KEUpKSksYSs9VD9TK00qZXY6UyxUXnA+PW5edj49bil7dmFyIEE9VnYoSHYoZCksSHYoeSkpO0d2KEEpO3ZhciBrPVZ2KG8sQSk7R3Yoayk7dmFyIEw9KFReUz49MD8tMToxKSpfdihrWzJdKTsoaT5MfHxpPT09TCYmKEFbMF18fEFbMV0pKSYmKHMrPVReUz49MD8xOi0xKX19cmV0dXJuKGE8LTFlLTZ8fGE8S3kmJmV4PC0xZS02KV4xJnN9ZnVuY3Rpb24gcngodCxlLG4saSl7cmV0dXJuIGZ1bmN0aW9uKHIpe3ZhciBvLGEscyxsPWUociksYz1LYigpLHU9ZShjKSxoPSExLGQ9e3BvaW50OnAsbGluZVN0YXJ0Om0sbGluZUVuZDpnLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2QucG9pbnQ9XyxkLmxpbmVTdGFydD15LGQubGluZUVuZD12LGE9W10sbz1bXX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2QucG9pbnQ9cCxkLmxpbmVTdGFydD1tLGQubGluZUVuZD1nLGE9YWMoYSk7dmFyIHQ9aXgobyxpKTthLmxlbmd0aD8oaHx8KHIucG9seWdvblN0YXJ0KCksaD0hMCksUWIoYSxheCx0LG4scikpOnQmJihofHwoci5wb2x5Z29uU3RhcnQoKSxoPSEwKSxyLmxpbmVTdGFydCgpLG4obnVsbCxudWxsLDEsciksci5saW5lRW5kKCkpLGgmJihyLnBvbHlnb25FbmQoKSxoPSExKSxhPW89bnVsbH0sc3BoZXJlOmZ1bmN0aW9uKCl7ci5wb2x5Z29uU3RhcnQoKSxyLmxpbmVTdGFydCgpLG4obnVsbCxudWxsLDEsciksci5saW5lRW5kKCksci5wb2x5Z29uRW5kKCl9fTtmdW5jdGlvbiBwKGUsbil7dChlLG4pJiZyLnBvaW50KGUsbil9ZnVuY3Rpb24gZih0LGUpe2wucG9pbnQodCxlKX1mdW5jdGlvbiBtKCl7ZC5wb2ludD1mLGwubGluZVN0YXJ0KCl9ZnVuY3Rpb24gZygpe2QucG9pbnQ9cCxsLmxpbmVFbmQoKX1mdW5jdGlvbiBfKHQsZSl7cy5wdXNoKFt0LGVdKSx1LnBvaW50KHQsZSl9ZnVuY3Rpb24geSgpe3UubGluZVN0YXJ0KCkscz1bXX1mdW5jdGlvbiB2KCl7XyhzWzBdWzBdLHNbMF1bMV0pLHUubGluZUVuZCgpO3ZhciB0LGUsbixpLGw9dS5jbGVhbigpLGQ9Yy5yZXN1bHQoKSxwPWQubGVuZ3RoO2lmKHMucG9wKCksby5wdXNoKHMpLHM9bnVsbCxwKWlmKDEmbCl7aWYoKGU9KG49ZFswXSkubGVuZ3RoLTEpPjApe2ZvcihofHwoci5wb2x5Z29uU3RhcnQoKSxoPSEwKSxyLmxpbmVTdGFydCgpLHQ9MDt0PGU7Kyt0KXIucG9pbnQoKGk9blt0XSlbMF0saVsxXSk7ci5saW5lRW5kKCl9fWVsc2UgcD4xJiYyJmwmJmQucHVzaChkLnBvcCgpLmNvbmNhdChkLnNoaWZ0KCkpKSxhLnB1c2goZC5maWx0ZXIob3gpKX1yZXR1cm4gZH19ZnVuY3Rpb24gb3godCl7cmV0dXJuIHQubGVuZ3RoPjF9ZnVuY3Rpb24gYXgodCxlKXtyZXR1cm4oKHQ9dC54KVswXTwwP3RbMV0tUXktS3k6UXktdFsxXSktKChlPWUueClbMF08MD9lWzFdLVF5LUt5OlF5LWVbMV0pfXZhciBzeD1yeCgoZnVuY3Rpb24oKXtyZXR1cm4hMH0pLChmdW5jdGlvbiBseCh0KXt2YXIgZSxuPU5hTixpPU5hTixyPU5hTjtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dC5saW5lU3RhcnQoKSxlPTF9LHBvaW50OmZ1bmN0aW9uKG8sYSl7dmFyIHM9bz4wP0p5Oi1KeSxsPXJ2KG8tbik7cnYobC1KeSk8S3k/KHQucG9pbnQobixpPShpK2EpLzI+MD9ReTotUXkpLHQucG9pbnQocixpKSx0LmxpbmVFbmQoKSx0LmxpbmVTdGFydCgpLHQucG9pbnQocyxpKSx0LnBvaW50KG8saSksZT0wKTpyIT09cyYmbD49SnkmJihydihuLXIpPEt5JiYobi09cipLeSkscnYoby1zKTxLeSYmKG8tPXMqS3kpLGk9KGZ1bmN0aW9uIGModCxlLG4saSl7dmFyIHIsbyxhPWR2KHQtbik7cmV0dXJuIHJ2KGEpPkt5P292KChkdihlKSoobz1zdihpKSkqZHYobiktZHYoaSkqKHI9c3YoZSkpKmR2KHQpKS8ocipvKmEpKTooZStpKS8yfSkobixpLG8sYSksdC5wb2ludChyLGkpLHQubGluZUVuZCgpLHQubGluZVN0YXJ0KCksdC5wb2ludChzLGkpLGU9MCksdC5wb2ludChuPW8saT1hKSxyPXN9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0LmxpbmVFbmQoKSxuPWk9TmFOfSxjbGVhbjpmdW5jdGlvbigpe3JldHVybiAyLWV9fX0pLChmdW5jdGlvbiBjeCh0LGUsbixpKXt2YXIgcjtpZihudWxsPT10KWkucG9pbnQoLUp5LHI9bipReSksaS5wb2ludCgwLHIpLGkucG9pbnQoSnksciksaS5wb2ludChKeSwwKSxpLnBvaW50KEp5LC1yKSxpLnBvaW50KDAsLXIpLGkucG9pbnQoLUp5LC1yKSxpLnBvaW50KC1KeSwwKSxpLnBvaW50KC1KeSxyKTtlbHNlIGlmKHJ2KHRbMF0tZVswXSk+S3kpe3ZhciBvPXRbMF08ZVswXT9KeTotSnk7aS5wb2ludCgtbyxyPW4qby8yKSxpLnBvaW50KDAsciksaS5wb2ludChvLHIpfWVsc2UgaS5wb2ludChlWzBdLGVbMV0pfSksWy1KeSwtUXldKTtmdW5jdGlvbiB1eCh0KXt2YXIgZT1zdih0KSxuPTYqaXYsaT1lPjAscj1ydihlKT5LeTtmdW5jdGlvbiBvKHQsbil7cmV0dXJuIHN2KHQpKnN2KG4pPmV9ZnVuY3Rpb24gYSh0LG4saSl7dmFyIHI9WzEsMCwwXSxvPVZ2KEh2KHQpLEh2KG4pKSxhPUZ2KG8sbykscz1vWzBdLGw9YS1zKnM7aWYoIWwpcmV0dXJuIWkmJnQ7dmFyIGM9ZSphL2wsdT0tZSpzL2wsaD1WdihyLG8pLGQ9anYocixjKTtVdihkLGp2KG8sdSkpO3ZhciBwPWgsZj1GdihkLHApLG09RnYocCxwKSxnPWYqZi1tKihGdihkLGQpLTEpO2lmKCEoZzwwKSl7dmFyIF89ZnYoZykseT1qdihwLCgtZi1fKS9tKTtpZihVdih5LGQpLHk9QnYoeSksIWkpcmV0dXJuIHk7dmFyIHYsYj10WzBdLHg9blswXSx3PXRbMV0sUz1uWzFdO3g8YiYmKHY9YixiPXgseD12KTt2YXIgTT14LWIsRT1ydihNLUp5KTxLeTtpZighRSYmUzx3JiYodj13LHc9UyxTPXYpLEV8fE08S3k/RT93K1M+MF55WzFdPChydih5WzBdLWIpPEt5P3c6Uyk6dzw9eVsxXSYmeVsxXTw9UzpNPkp5XihiPD15WzBdJiZ5WzBdPD14KSl7dmFyIFQ9anYocCwoLWYrXykvbSk7cmV0dXJuIFV2KFQsZCksW3ksQnYoVCldfX19ZnVuY3Rpb24gcyhlLG4pe3ZhciByPWk/dDpKeS10LG89MDtyZXR1cm4gZTwtcj9vfD0xOmU+ciYmKG98PTIpLG48LXI/b3w9NDpuPnImJihvfD04KSxvfXJldHVybiByeChvLChmdW5jdGlvbiBsKHQpe3ZhciBlLG4sbCxjLHU7cmV0dXJue2xpbmVTdGFydDpmdW5jdGlvbigpe2M9bD0hMSx1PTF9LHBvaW50OmZ1bmN0aW9uKGgsZCl7dmFyIHAsZj1baCxkXSxtPW8oaCxkKSxnPWk/bT8wOnMoaCxkKTptP3MoaCsoaDwwP0p5Oi1KeSksZCk6MDtpZighZSYmKGM9bD1tKSYmdC5saW5lU3RhcnQoKSxtIT09bCYmKCEocD1hKGUsZikpfHxaYihlLHApfHxaYihmLHApKSYmKGZbMl09MSksbSE9PWwpdT0wLG0/KHQubGluZVN0YXJ0KCkscD1hKGYsZSksdC5wb2ludChwWzBdLHBbMV0pKToocD1hKGUsZiksdC5wb2ludChwWzBdLHBbMV0sMiksdC5saW5lRW5kKCkpLGU9cDtlbHNlIGlmKHImJmUmJmlebSl7dmFyIF87ZyZufHwhKF89YShmLGUsITApKXx8KHU9MCxpPyh0LmxpbmVTdGFydCgpLHQucG9pbnQoX1swXVswXSxfWzBdWzFdKSx0LnBvaW50KF9bMV1bMF0sX1sxXVsxXSksdC5saW5lRW5kKCkpOih0LnBvaW50KF9bMV1bMF0sX1sxXVsxXSksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KF9bMF1bMF0sX1swXVsxXSwzKSkpfSFtfHxlJiZaYihlLGYpfHx0LnBvaW50KGZbMF0sZlsxXSksZT1mLGw9bSxuPWd9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtsJiZ0LmxpbmVFbmQoKSxlPW51bGx9LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIHV8KGMmJmwpPDwxfX19KSwoZnVuY3Rpb24gYyhlLGkscixvKXtYYihvLHQsbixyLGUsaSl9KSxpP1swLC10XTpbLUp5LHQtSnldKX12YXIgaHg9MWU5LGR4PS1oeDtmdW5jdGlvbiBweCh0LGUsbixpKXtmdW5jdGlvbiByKHIsbyl7cmV0dXJuIHQ8PXImJnI8PW4mJmU8PW8mJm88PWl9ZnVuY3Rpb24gbyhyLG8scyxjKXt2YXIgdT0wLGg9MDtpZihudWxsPT1yfHwodT1hKHIscykpIT09KGg9YShvLHMpKXx8bChyLG8pPDBecz4wKWRve2MucG9pbnQoMD09PXV8fDM9PT11P3Q6bix1PjE/aTplKX13aGlsZSgodT0odStzKzQpJTQpIT09aCk7ZWxzZSBjLnBvaW50KG9bMF0sb1sxXSl9ZnVuY3Rpb24gYShpLHIpe3JldHVybiBydihpWzBdLXQpPEt5P3I+MD8wOjM6cnYoaVswXS1uKTxLeT9yPjA/MjoxOnJ2KGlbMV0tZSk8S3k/cj4wPzE6MDpyPjA/MzoyfWZ1bmN0aW9uIHModCxlKXtyZXR1cm4gbCh0LngsZS54KX1mdW5jdGlvbiBsKHQsZSl7dmFyIG49YSh0LDEpLGk9YShlLDEpO3JldHVybiBuIT09aT9uLWk6MD09PW4/ZVsxXS10WzFdOjE9PT1uP3RbMF0tZVswXToyPT09bj90WzFdLWVbMV06ZVswXS10WzBdfXJldHVybiBmdW5jdGlvbihhKXt2YXIgbCxjLHUsaCxkLHAsZixtLGcsXyx5LHY9YSxiPUtiKCkseD17cG9pbnQ6VCxsaW5lU3RhcnQ6ZnVuY3Rpb24gdygpe3gucG9pbnQ9QyxjJiZjLnB1c2godT1bXSk7Xz0hMCxnPSExLGY9bT1OYU59LGxpbmVFbmQ6ZnVuY3Rpb24gUygpe2wmJihDKGgsZCkscCYmZyYmYi5yZWpvaW4oKSxsLnB1c2goYi5yZXN1bHQoKSkpO3gucG9pbnQ9VCxnJiZ2LmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uIE0oKXt2PWIsbD1bXSxjPVtdLHk9ITB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24gRSgpe3ZhciBlPShmdW5jdGlvbiBuKCl7Zm9yKHZhciBlPTAsbj0wLHI9Yy5sZW5ndGg7bjxyOysrbilmb3IodmFyIG8sYSxzPWNbbl0sbD0xLHU9cy5sZW5ndGgsaD1zWzBdLGQ9aFswXSxwPWhbMV07bDx1OysrbClvPWQsYT1wLGQ9KGg9c1tsXSlbMF0scD1oWzFdLGE8PWk/cD5pJiYoZC1vKSooaS1hKT4ocC1hKSoodC1vKSYmKytlOnA8PWkmJihkLW8pKihpLWEpPChwLWEpKih0LW8pJiYtLWU7cmV0dXJuIGV9KSgpLHI9eSYmZSxoPShsPWFjKGwpKS5sZW5ndGg7KHJ8fGgpJiYoYS5wb2x5Z29uU3RhcnQoKSxyJiYoYS5saW5lU3RhcnQoKSxvKG51bGwsbnVsbCwxLGEpLGEubGluZUVuZCgpKSxoJiZRYihsLHMsZSxvLGEpLGEucG9seWdvbkVuZCgpKTt2PWEsbD1jPXU9bnVsbH19O2Z1bmN0aW9uIFQodCxlKXtyKHQsZSkmJnYucG9pbnQodCxlKX1mdW5jdGlvbiBDKG8sYSl7dmFyIHM9cihvLGEpO2lmKGMmJnUucHVzaChbbyxhXSksXyloPW8sZD1hLHA9cyxfPSExLHMmJih2LmxpbmVTdGFydCgpLHYucG9pbnQobyxhKSk7ZWxzZSBpZihzJiZnKXYucG9pbnQobyxhKTtlbHNle3ZhciBsPVtmPU1hdGgubWF4KGR4LE1hdGgubWluKGh4LGYpKSxtPU1hdGgubWF4KGR4LE1hdGgubWluKGh4LG0pKV0sYj1bbz1NYXRoLm1heChkeCxNYXRoLm1pbihoeCxvKSksYT1NYXRoLm1heChkeCxNYXRoLm1pbihoeCxhKSldOyEoZnVuY3Rpb24geCh0LGUsbixpLHIsbyl7dmFyIGEscz10WzBdLGw9dFsxXSxjPTAsdT0xLGg9ZVswXS1zLGQ9ZVsxXS1sO2lmKGE9bi1zLGh8fCEoYT4wKSl7aWYoYS89aCxoPDApe2lmKGE8YylyZXR1cm47YTx1JiYodT1hKX1lbHNlIGlmKGg+MCl7aWYoYT51KXJldHVybjthPmMmJihjPWEpfWlmKGE9ci1zLGh8fCEoYTwwKSl7aWYoYS89aCxoPDApe2lmKGE+dSlyZXR1cm47YT5jJiYoYz1hKX1lbHNlIGlmKGg+MCl7aWYoYTxjKXJldHVybjthPHUmJih1PWEpfWlmKGE9aS1sLGR8fCEoYT4wKSl7aWYoYS89ZCxkPDApe2lmKGE8YylyZXR1cm47YTx1JiYodT1hKX1lbHNlIGlmKGQ+MCl7aWYoYT51KXJldHVybjthPmMmJihjPWEpfWlmKGE9by1sLGR8fCEoYTwwKSl7aWYoYS89ZCxkPDApe2lmKGE+dSlyZXR1cm47YT5jJiYoYz1hKX1lbHNlIGlmKGQ+MCl7aWYoYTxjKXJldHVybjthPHUmJih1PWEpfXJldHVybiBjPjAmJih0WzBdPXMrYypoLHRbMV09bCtjKmQpLHU8MSYmKGVbMF09cyt1KmgsZVsxXT1sK3UqZCksITB9fX19fSkobCxiLHQsZSxuLGkpP3MmJih2LmxpbmVTdGFydCgpLHYucG9pbnQobyxhKSx5PSExKTooZ3x8KHYubGluZVN0YXJ0KCksdi5wb2ludChsWzBdLGxbMV0pKSx2LnBvaW50KGJbMF0sYlsxXSksc3x8di5saW5lRW5kKCkseT0hMSl9Zj1vLG09YSxnPXN9cmV0dXJuIHh9fXZhciBmeCxteCxneCxfeD1xeSgpLHl4PXtzcGhlcmU6dnYscG9pbnQ6dnYsbGluZVN0YXJ0OmZ1bmN0aW9uIHZ4KCl7eXgucG9pbnQ9eHgseXgubGluZUVuZD1ieH0sbGluZUVuZDp2dixwb2x5Z29uU3RhcnQ6dnYscG9seWdvbkVuZDp2dn07ZnVuY3Rpb24gYngoKXt5eC5wb2ludD15eC5saW5lRW5kPXZ2fWZ1bmN0aW9uIHh4KHQsZSl7Zng9dCo9aXYsbXg9ZHYoZSo9aXYpLGd4PXN2KGUpLHl4LnBvaW50PXd4fWZ1bmN0aW9uIHd4KHQsZSl7dCo9aXY7dmFyIG49ZHYoZSo9aXYpLGk9c3YoZSkscj1ydih0LWZ4KSxvPXN2KHIpLGE9aSpkdihyKSxzPWd4Km4tbXgqaSpvLGw9bXgqbitneCppKm87X3guYWRkKGF2KGZ2KGEqYStzKnMpLGwpKSxmeD10LG14PW4sZ3g9aX1mdW5jdGlvbiBTeCh0KXtyZXR1cm4gX3gucmVzZXQoKSxFdih0LHl4KSwrX3h9dmFyIE14PVtudWxsLG51bGxdLEV4PXt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczpNeH07ZnVuY3Rpb24gVHgodCxlKXtyZXR1cm4gTXhbMF09dCxNeFsxXT1lLFN4KEV4KX12YXIgQ3g9e0ZlYXR1cmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4ga3godC5nZW9tZXRyeSxlKX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5mZWF0dXJlcyxpPS0xLHI9bi5sZW5ndGg7KytpPHI7KWlmKGt4KG5baV0uZ2VvbWV0cnksZSkpcmV0dXJuITA7cmV0dXJuITF9fSxBeD17U3BoZXJlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFBvaW50OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIEx4KHQuY29vcmRpbmF0ZXMsZSl9LE11bHRpUG9pbnQ6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5jb29yZGluYXRlcyxpPS0xLHI9bi5sZW5ndGg7KytpPHI7KWlmKEx4KG5baV0sZSkpcmV0dXJuITA7cmV0dXJuITF9LExpbmVTdHJpbmc6ZnVuY3Rpb24odCxlKXtyZXR1cm4gUHgodC5jb29yZGluYXRlcyxlKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuY29vcmRpbmF0ZXMsaT0tMSxyPW4ubGVuZ3RoOysraTxyOylpZihQeChuW2ldLGUpKXJldHVybiEwO3JldHVybiExfSxQb2x5Z29uOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIE54KHQuY29vcmRpbmF0ZXMsZSl9LE11bHRpUG9seWdvbjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmNvb3JkaW5hdGVzLGk9LTEscj1uLmxlbmd0aDsrK2k8cjspaWYoTngobltpXSxlKSlyZXR1cm4hMDtyZXR1cm4hMX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuZ2VvbWV0cmllcyxpPS0xLHI9bi5sZW5ndGg7KytpPHI7KWlmKGt4KG5baV0sZSkpcmV0dXJuITA7cmV0dXJuITF9fTtmdW5jdGlvbiBreCh0LGUpe3JldHVybiEoIXR8fCFBeC5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpKSYmQXhbdC50eXBlXSh0LGUpfWZ1bmN0aW9uIEx4KHQsZSl7cmV0dXJuIDA9PT1UeCh0LGUpfWZ1bmN0aW9uIFB4KHQsZSl7Zm9yKHZhciBuLGkscixvPTAsYT10Lmxlbmd0aDtvPGE7bysrKXtpZigwPT09KGk9VHgodFtvXSxlKSkpcmV0dXJuITA7aWYobz4wJiYocj1UeCh0W29dLHRbby0xXSkpPjAmJm48PXImJmk8PXImJihuK2ktcikqKDEtTWF0aC5wb3coKG4taSkvciwyKSk8WnkqcilyZXR1cm4hMDtuPWl9cmV0dXJuITF9ZnVuY3Rpb24gTngodCxlKXtyZXR1cm4hIWl4KHQubWFwKEl4KSxSeChlKSl9ZnVuY3Rpb24gSXgodCl7cmV0dXJuKHQ9dC5tYXAoUngpKS5wb3AoKSx0fWZ1bmN0aW9uIFJ4KHQpe3JldHVyblt0WzBdKml2LHRbMV0qaXZdfWZ1bmN0aW9uIE94KHQsZSxuKXt2YXIgaT1LbCh0LGUtS3ksbikuY29uY2F0KGUpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gaS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVyblt0LGVdfSkpfX1mdW5jdGlvbiB6eCh0LGUsbil7dmFyIGk9S2wodCxlLUt5LG4pLmNvbmNhdChlKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGkubWFwKChmdW5jdGlvbihlKXtyZXR1cm5bZSx0XX0pKX19ZnVuY3Rpb24gRHgoKXt2YXIgdCxlLG4saSxyLG8sYSxzLGwsYyx1LGgsZD0xMCxwPWQsZj05MCxtPTM2MCxnPTIuNTtmdW5jdGlvbiBfKCl7cmV0dXJue3R5cGU6Ik11bHRpTGluZVN0cmluZyIsY29vcmRpbmF0ZXM6eSgpfX1mdW5jdGlvbiB5KCl7cmV0dXJuIEtsKGx2KGkvZikqZixuLGYpLm1hcCh1KS5jb25jYXQoS2wobHYocy9tKSptLGEsbSkubWFwKGgpKS5jb25jYXQoS2wobHYoZS9kKSpkLHQsZCkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gcnYodCVmKT5LeX0pKS5tYXAobCkpLmNvbmNhdChLbChsdihvL3ApKnAscixwKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiBydih0JW0pPkt5fSkpLm1hcChjKSl9cmV0dXJuIF8ubGluZXM9ZnVuY3Rpb24oKXtyZXR1cm4geSgpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJue3R5cGU6IkxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnR9fSkpfSxfLm91dGxpbmU9ZnVuY3Rpb24oKXtyZXR1cm57dHlwZToiUG9seWdvbiIsY29vcmRpbmF0ZXM6W3UoaSkuY29uY2F0KGgoYSkuc2xpY2UoMSksdShuKS5yZXZlcnNlKCkuc2xpY2UoMSksaChzKS5yZXZlcnNlKCkuc2xpY2UoMSkpXX19LF8uZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP18uZXh0ZW50TWFqb3IodCkuZXh0ZW50TWlub3IodCk6Xy5leHRlbnRNaW5vcigpfSxfLmV4dGVudE1ham9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSt0WzBdWzFdLGE9K3RbMV1bMV0sKGk9K3RbMF1bMF0pPihuPSt0WzFdWzBdKSYmKHQ9aSxpPW4sbj10KSxzPmEmJih0PXMscz1hLGE9dCksXy5wcmVjaXNpb24oZykpOltbaSxzXSxbbixhXV19LF8uZXh0ZW50TWlub3I9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K25bMF1bMV0scj0rblsxXVsxXSwoZT0rblswXVswXSk+KHQ9K25bMV1bMF0pJiYobj1lLGU9dCx0PW4pLG8+ciYmKG49byxvPXIscj1uKSxfLnByZWNpc2lvbihnKSk6W1tlLG9dLFt0LHJdXX0sXy5zdGVwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP18uc3RlcE1ham9yKHQpLnN0ZXBNaW5vcih0KTpfLnN0ZXBNaW5vcigpfSxfLnN0ZXBNYWpvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj0rdFswXSxtPSt0WzFdLF8pOltmLG1dfSxfLnN0ZXBNaW5vcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD0rdFswXSxwPSt0WzFdLF8pOltkLHBdfSxfLnByZWNpc2lvbj1mdW5jdGlvbihkKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZz0rZCxsPU94KG8sciw5MCksYz16eChlLHQsZyksdT1PeChzLGEsOTApLGg9engoaSxuLGcpLF8pOmd9LF8uZXh0ZW50TWFqb3IoW1stMTgwLC04OS45OTk5OTldLFsxODAsODkuOTk5OTk5XV0pLmV4dGVudE1pbm9yKFtbLTE4MCwtODAuMDAwMDAxXSxbMTgwLDgwLjAwMDAwMV1dKX1mdW5jdGlvbiBCeCh0KXtyZXR1cm4gdH12YXIgSHgsRngsVngsVXgsang9cXkoKSxHeD1xeSgpLFd4PXtwb2ludDp2dixsaW5lU3RhcnQ6dnYsbGluZUVuZDp2dixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtXeC5saW5lU3RhcnQ9cXgsV3gubGluZUVuZD0keH0scG9seWdvbkVuZDpmdW5jdGlvbigpe1d4LmxpbmVTdGFydD1XeC5saW5lRW5kPVd4LnBvaW50PXZ2LGp4LmFkZChydihHeCkpLEd4LnJlc2V0KCl9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PWp4LzI7cmV0dXJuIGp4LnJlc2V0KCksdH19O2Z1bmN0aW9uIHF4KCl7V3gucG9pbnQ9WXh9ZnVuY3Rpb24gWXgodCxlKXtXeC5wb2ludD1YeCxIeD1WeD10LEZ4PVV4PWV9ZnVuY3Rpb24gWHgodCxlKXtHeC5hZGQoVXgqdC1WeCplKSxWeD10LFV4PWV9ZnVuY3Rpb24gJHgoKXtYeChIeCxGeCl9dmFyIEt4PVd4LFp4PTEvMCxKeD1aeCxReD0tWngsdHc9UXg7dmFyIGV3LG53LGl3LHJ3LG93PXtwb2ludDpmdW5jdGlvbiBhdyh0LGUpe3Q8WngmJihaeD10KTt0PlF4JiYoUXg9dCk7ZTxKeCYmKEp4PWUpO2U+dHcmJih0dz1lKX0sbGluZVN0YXJ0OnZ2LGxpbmVFbmQ6dnYscG9seWdvblN0YXJ0OnZ2LHBvbHlnb25FbmQ6dnYscmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9W1taeCxKeF0sW1F4LHR3XV07cmV0dXJuIFF4PXR3PS0oSng9Wng9MS8wKSx0fX0sc3c9MCxsdz0wLGN3PTAsdXc9MCxodz0wLGR3PTAscHc9MCxmdz0wLG13PTAsZ3c9e3BvaW50Ol93LGxpbmVTdGFydDp5dyxsaW5lRW5kOnh3LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2d3LmxpbmVTdGFydD13dyxndy5saW5lRW5kPVN3fSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7Z3cucG9pbnQ9X3csZ3cubGluZVN0YXJ0PXl3LGd3LmxpbmVFbmQ9eHd9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciB0PW13P1twdy9tdyxmdy9td106ZHc/W3V3L2R3LGh3L2R3XTpjdz9bc3cvY3csbHcvY3ddOltOYU4sTmFOXTtyZXR1cm4gc3c9bHc9Y3c9dXc9aHc9ZHc9cHc9Znc9bXc9MCx0fX07ZnVuY3Rpb24gX3codCxlKXtzdys9dCxsdys9ZSwrK2N3fWZ1bmN0aW9uIHl3KCl7Z3cucG9pbnQ9dnd9ZnVuY3Rpb24gdncodCxlKXtndy5wb2ludD1idyxfdyhpdz10LHJ3PWUpfWZ1bmN0aW9uIGJ3KHQsZSl7dmFyIG49dC1pdyxpPWUtcncscj1mdihuKm4raSppKTt1dys9ciooaXcrdCkvMixodys9cioocncrZSkvMixkdys9cixfdyhpdz10LHJ3PWUpfWZ1bmN0aW9uIHh3KCl7Z3cucG9pbnQ9X3d9ZnVuY3Rpb24gd3coKXtndy5wb2ludD1Nd31mdW5jdGlvbiBTdygpe0V3KGV3LG53KX1mdW5jdGlvbiBNdyh0LGUpe2d3LnBvaW50PUV3LF93KGV3PWl3PXQsbnc9cnc9ZSl9ZnVuY3Rpb24gRXcodCxlKXt2YXIgbj10LWl3LGk9ZS1ydyxyPWZ2KG4qbitpKmkpO3V3Kz1yKihpdyt0KS8yLGh3Kz1yKihydytlKS8yLGR3Kz1yLHB3Kz0ocj1ydyp0LWl3KmUpKihpdyt0KSxmdys9cioocncrZSksbXcrPTMqcixfdyhpdz10LHJ3PWUpfXZhciBUdz1ndztmdW5jdGlvbiBDdyh0KXt0aGlzLl9jb250ZXh0PXR9Q3cucHJvdG90eXBlPXtfcmFkaXVzOjQuNSxwb2ludFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmFkaXVzPXQsdGhpc30scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXswPT09dGhpcy5fbGluZSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9wb2ludD1OYU59LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxlKSx0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9jb250ZXh0LmxpbmVUbyh0LGUpO2JyZWFrO2RlZmF1bHQ6dGhpcy5fY29udGV4dC5tb3ZlVG8odCt0aGlzLl9yYWRpdXMsZSksdGhpcy5fY29udGV4dC5hcmModCxlLHRoaXMuX3JhZGl1cywwLGV2KX19LHJlc3VsdDp2dn07dmFyIEF3LGt3LEx3LFB3LE53LEl3PXF5KCksUnc9e3BvaW50OnZ2LGxpbmVTdGFydDpmdW5jdGlvbigpe1J3LnBvaW50PU93fSxsaW5lRW5kOmZ1bmN0aW9uKCl7QXcmJnp3KGt3LEx3KSxSdy5wb2ludD12dn0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7QXc9ITB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtBdz1udWxsfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgdD0rSXc7cmV0dXJuIEl3LnJlc2V0KCksdH19O2Z1bmN0aW9uIE93KHQsZSl7UncucG9pbnQ9encsa3c9UHc9dCxMdz1Odz1lfWZ1bmN0aW9uIHp3KHQsZSl7SXcuYWRkKGZ2KChQdy09dCkqUHcrKE53LT1lKSpOdykpLFB3PXQsTnc9ZX12YXIgRHc9Unc7ZnVuY3Rpb24gQncoKXt0aGlzLl9zdHJpbmc9W119ZnVuY3Rpb24gSHcodCl7cmV0dXJuIm0wLCIrdCsiYSIrdCsiLCIrdCsiIDAgMSwxIDAsIistMip0KyJhIit0KyIsIit0KyIgMCAxLDEgMCwiKzIqdCsieiJ9ZnVuY3Rpb24gRncodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPW5ldyBWdztmb3IodmFyIGkgaW4gdCluW2ldPXRbaV07cmV0dXJuIG4uc3RyZWFtPWUsbn19ZnVuY3Rpb24gVncoKXt9ZnVuY3Rpb24gVXcodCxlLG4pe3ZhciBpPXQuY2xpcEV4dGVudCYmdC5jbGlwRXh0ZW50KCk7cmV0dXJuIHQuc2NhbGUoMTUwKS50cmFuc2xhdGUoWzAsMF0pLG51bGwhPWkmJnQuY2xpcEV4dGVudChudWxsKSxFdihuLHQuc3RyZWFtKG93KSksZShvdy5yZXN1bHQoKSksbnVsbCE9aSYmdC5jbGlwRXh0ZW50KGkpLHR9ZnVuY3Rpb24gancodCxlLG4pe3JldHVybiBVdyh0LChmdW5jdGlvbihuKXt2YXIgaT1lWzFdWzBdLWVbMF1bMF0scj1lWzFdWzFdLWVbMF1bMV0sbz1NYXRoLm1pbihpLyhuWzFdWzBdLW5bMF1bMF0pLHIvKG5bMV1bMV0tblswXVsxXSkpLGE9K2VbMF1bMF0rKGktbyooblsxXVswXStuWzBdWzBdKSkvMixzPStlWzBdWzFdKyhyLW8qKG5bMV1bMV0rblswXVsxXSkpLzI7dC5zY2FsZSgxNTAqbykudHJhbnNsYXRlKFthLHNdKX0pLG4pfWZ1bmN0aW9uIEd3KHQsZSxuKXtyZXR1cm4gancodCxbWzAsMF0sZV0sbil9ZnVuY3Rpb24gV3codCxlLG4pe3JldHVybiBVdyh0LChmdW5jdGlvbihuKXt2YXIgaT0rZSxyPWkvKG5bMV1bMF0tblswXVswXSksbz0oaS1yKihuWzFdWzBdK25bMF1bMF0pKS8yLGE9LXIqblswXVsxXTt0LnNjYWxlKDE1MCpyKS50cmFuc2xhdGUoW28sYV0pfSksbil9ZnVuY3Rpb24gcXcodCxlLG4pe3JldHVybiBVdyh0LChmdW5jdGlvbihuKXt2YXIgaT0rZSxyPWkvKG5bMV1bMV0tblswXVsxXSksbz0tcipuWzBdWzBdLGE9KGktciooblsxXVsxXStuWzBdWzFdKSkvMjt0LnNjYWxlKDE1MCpyKS50cmFuc2xhdGUoW28sYV0pfSksbil9QncucHJvdG90eXBlPXtfcmFkaXVzOjQuNSxfY2lyY2xlOkh3KDQuNSkscG9pbnRSYWRpdXM6ZnVuY3Rpb24odCl7cmV0dXJuKHQ9K3QpIT09dGhpcy5fcmFkaXVzJiYodGhpcy5fcmFkaXVzPXQsdGhpcy5fY2lyY2xlPW51bGwpLHRoaXN9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7MD09PXRoaXMuX2xpbmUmJnRoaXMuX3N0cmluZy5wdXNoKCJaIiksdGhpcy5fcG9pbnQ9TmFOfSxwb2ludDpmdW5jdGlvbih0LGUpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3N0cmluZy5wdXNoKCJNIix0LCIsIixlKSx0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9zdHJpbmcucHVzaCgiTCIsdCwiLCIsZSk7YnJlYWs7ZGVmYXVsdDpudWxsPT10aGlzLl9jaXJjbGUmJih0aGlzLl9jaXJjbGU9SHcodGhpcy5fcmFkaXVzKSksdGhpcy5fc3RyaW5nLnB1c2goIk0iLHQsIiwiLGUsdGhpcy5fY2lyY2xlKX19LHJlc3VsdDpmdW5jdGlvbigpe2lmKHRoaXMuX3N0cmluZy5sZW5ndGgpe3ZhciB0PXRoaXMuX3N0cmluZy5qb2luKCIiKTtyZXR1cm4gdGhpcy5fc3RyaW5nPVtdLHR9cmV0dXJuIG51bGx9fSxWdy5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlZ3LHBvaW50OmZ1bmN0aW9uKHQsZSl7dGhpcy5zdHJlYW0ucG9pbnQodCxlKX0sc3BoZXJlOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0uc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25FbmQoKX19O3ZhciBZdz1zdigzMCppdik7ZnVuY3Rpb24gWHcodCxlKXtyZXR1cm4rZT8oZnVuY3Rpb24gbih0LGUpe2Z1bmN0aW9uIG4oaSxyLG8sYSxzLGwsYyx1LGgsZCxwLGYsbSxnKXt2YXIgXz1jLWkseT11LXIsdj1fKl8reSp5O2lmKHY+NCplJiZtLS0pe3ZhciBiPWErZCx4PXMrcCx3PWwrZixTPWZ2KGIqYit4Kngrdyp3KSxNPV92KHcvPVMpLEU9cnYocnYodyktMSk8S3l8fHJ2KG8taCk8S3k/KG8raCkvMjphdih4LGIpLFQ9dChFLE0pLEM9VFswXSxBPVRbMV0saz1DLWksTD1BLXIsUD15KmstXypMOyhQKlAvdj5lfHxydigoXyprK3kqTCkvdi0uNSk+LjN8fGEqZCtzKnArbCpmPFl3KSYmKG4oaSxyLG8sYSxzLGwsQyxBLEUsYi89Uyx4Lz1TLHcsbSxnKSxnLnBvaW50KEMsQSksbihDLEEsRSxiLHgsdyxjLHUsaCxkLHAsZixtLGcpKX19cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBpLHIsbyxhLHMsbCxjLHUsaCxkLHAsZixtPXtwb2ludDpnLGxpbmVTdGFydDpfLGxpbmVFbmQ6dixwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtlLnBvbHlnb25TdGFydCgpLG0ubGluZVN0YXJ0PWJ9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtlLnBvbHlnb25FbmQoKSxtLmxpbmVTdGFydD1ffX07ZnVuY3Rpb24gZyhuLGkpe249dChuLGkpLGUucG9pbnQoblswXSxuWzFdKX1mdW5jdGlvbiBfKCl7dT1OYU4sbS5wb2ludD15LGUubGluZVN0YXJ0KCl9ZnVuY3Rpb24geShpLHIpe3ZhciBvPUh2KFtpLHJdKSxhPXQoaSxyKTtuKHUsaCxjLGQscCxmLHU9YVswXSxoPWFbMV0sYz1pLGQ9b1swXSxwPW9bMV0sZj1vWzJdLDE2LGUpLGUucG9pbnQodSxoKX1mdW5jdGlvbiB2KCl7bS5wb2ludD1nLGUubGluZUVuZCgpfWZ1bmN0aW9uIGIoKXtfKCksbS5wb2ludD14LG0ubGluZUVuZD13fWZ1bmN0aW9uIHgodCxlKXt5KGk9dCxlKSxyPXUsbz1oLGE9ZCxzPXAsbD1mLG0ucG9pbnQ9eX1mdW5jdGlvbiB3KCl7bih1LGgsYyxkLHAsZixyLG8saSxhLHMsbCwxNixlKSxtLmxpbmVFbmQ9dix2KCl9cmV0dXJuIG19fSkodCxlKTooZnVuY3Rpb24gaSh0KXtyZXR1cm4gRncoe3BvaW50OmZ1bmN0aW9uKGUsbil7ZT10KGUsbiksdGhpcy5zdHJlYW0ucG9pbnQoZVswXSxlWzFdKX19KX0pKHQpfXZhciAkdz1Gdyh7cG9pbnQ6ZnVuY3Rpb24odCxlKXt0aGlzLnN0cmVhbS5wb2ludCh0Kml2LGUqaXYpfX0pO2Z1bmN0aW9uIEt3KHQsZSxuLGkscil7ZnVuY3Rpb24gbyhvLGEpe3JldHVybltlK3QqKG8qPWkpLG4tdCooYSo9cildfXJldHVybiBvLmludmVydD1mdW5jdGlvbihvLGEpe3JldHVyblsoby1lKS90KmksKG4tYSkvdCpyXX0sb31mdW5jdGlvbiBadyh0LGUsbixpLHIsbyl7dmFyIGE9c3Yobykscz1kdihvKSxsPWEqdCxjPXMqdCx1PWEvdCxoPXMvdCxkPShzKm4tYSplKS90LHA9KHMqZSthKm4pL3Q7ZnVuY3Rpb24gZih0LG8pe3JldHVybltsKih0Kj1pKS1jKihvKj1yKStlLG4tYyp0LWwqb119cmV0dXJuIGYuaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuW2kqKHUqdC1oKmUrZCkscioocC1oKnQtdSplKV19LGZ9ZnVuY3Rpb24gSncodCl7cmV0dXJuIFF3KChmdW5jdGlvbigpe3JldHVybiB0fSkpKCl9ZnVuY3Rpb24gUXcodCl7dmFyIGUsbixpLHIsbyxhLHMsbCxjLHUsaD0xNTAsZD00ODAscD0yNTAsZj0wLG09MCxnPTAsXz0wLHk9MCx2PTAsYj0xLHg9MSx3PW51bGwsUz1zeCxNPW51bGwsRT1CeCxUPS41O2Z1bmN0aW9uIEModCl7cmV0dXJuIGwodFswXSppdix0WzFdKml2KX1mdW5jdGlvbiBBKHQpe3JldHVybih0PWwuaW52ZXJ0KHRbMF0sdFsxXSkpJiZbdFswXSpudix0WzFdKm52XX1mdW5jdGlvbiBrKCl7dmFyIHQ9WncoaCwwLDAsYix4LHYpLmFwcGx5KG51bGwsZShmLG0pKSxpPSh2P1p3Okt3KShoLGQtdFswXSxwLXRbMV0sYix4LHYpO3JldHVybiBuPWpiKGcsXyx5KSxzPVZiKGUsaSksbD1WYihuLHMpLGE9WHcocyxUKSxMKCl9ZnVuY3Rpb24gTCgpe3JldHVybiBjPXU9bnVsbCxDfXJldHVybiBDLnN0cmVhbT1mdW5jdGlvbih0KXtyZXR1cm4gYyYmdT09PXQ/YzpjPSR3KChmdW5jdGlvbiBlKHQpe3JldHVybiBGdyh7cG9pbnQ6ZnVuY3Rpb24oZSxuKXt2YXIgaT10KGUsbik7cmV0dXJuIHRoaXMuc3RyZWFtLnBvaW50KGlbMF0saVsxXSl9fSl9KShuKShTKGEoRSh1PXQpKSkpKX0sQy5wcmVjbGlwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhTPXQsdz12b2lkIDAsTCgpKTpTfSxDLnBvc3RjbGlwPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhFPXQsTT1pPXI9bz1udWxsLEwoKSk6RX0sQy5jbGlwQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KFM9K3Q/dXgodz10Kml2KToodz1udWxsLHN4KSxMKCkpOncqbnZ9LEMuY2xpcEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oRT1udWxsPT10PyhNPWk9cj1vPW51bGwsQngpOnB4KE09K3RbMF1bMF0saT0rdFswXVsxXSxyPSt0WzFdWzBdLG89K3RbMV1bMV0pLEwoKSk6bnVsbD09TT9udWxsOltbTSxpXSxbcixvXV19LEMuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9K3QsaygpKTpofSxDLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZD0rdFswXSxwPSt0WzFdLGsoKSk6W2QscF19LEMuY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhmPXRbMF0lMzYwKml2LG09dFsxXSUzNjAqaXYsaygpKTpbZipudixtKm52XX0sQy5yb3RhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9dFswXSUzNjAqaXYsXz10WzFdJTM2MCppdix5PXQubGVuZ3RoPjI/dFsyXSUzNjAqaXY6MCxrKCkpOltnKm52LF8qbnYseSpudl19LEMuYW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHY9dCUzNjAqaXYsaygpKTp2Km52fSxDLnJlZmxlY3RYPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPXQ/LTE6MSxrKCkpOmI8MH0sQy5yZWZsZWN0WT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oeD10Py0xOjEsaygpKTp4PDB9LEMucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPVh3KHMsVD10KnQpLEwoKSk6ZnYoVCl9LEMuZml0RXh0ZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGp3KEMsdCxlKX0sQy5maXRTaXplPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIEd3KEMsdCxlKX0sQy5maXRXaWR0aD1mdW5jdGlvbih0LGUpe3JldHVybiBXdyhDLHQsZSl9LEMuZml0SGVpZ2h0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHF3KEMsdCxlKX0sZnVuY3Rpb24oKXtyZXR1cm4gZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxDLmludmVydD1lLmludmVydCYmQSxrKCl9fWZ1bmN0aW9uIHRTKHQpe3ZhciBlPTAsbj1KeS8zLGk9UXcodCkscj1pKGUsbik7cmV0dXJuIHIucGFyYWxsZWxzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2koZT10WzBdKml2LG49dFsxXSppdik6W2UqbnYsbipudl19LHJ9ZnVuY3Rpb24gZVModCxlKXt2YXIgbj1kdih0KSxpPShuK2R2KGUpKS8yO2lmKHJ2KGkpPEt5KXJldHVybihmdW5jdGlvbiByKHQpe3ZhciBlPXN2KHQpO2Z1bmN0aW9uIG4odCxuKXtyZXR1cm5bdCplLGR2KG4pL2VdfXJldHVybiBuLmludmVydD1mdW5jdGlvbih0LG4pe3JldHVyblt0L2UsX3YobiplKV19LG59KSh0KTt2YXIgbz0xK24qKDIqaS1uKSxhPWZ2KG8pL2k7ZnVuY3Rpb24gcyh0LGUpe3ZhciBuPWZ2KG8tMippKmR2KGUpKS9pO3JldHVybltuKmR2KHQqPWkpLGEtbipzdih0KV19cmV0dXJuIHMuaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7dmFyIG49YS1lLHI9YXYodCxydihuKSkqcHYobik7cmV0dXJuIG4qaTwwJiYoci09SnkqcHYodCkqcHYobikpLFtyL2ksX3YoKG8tKHQqdCtuKm4pKmkqaSkvKDIqaSkpXX0sc31mdW5jdGlvbiBuUygpe3JldHVybiB0UyhlUykuc2NhbGUoMTU1LjQyNCkuY2VudGVyKFswLDMzLjY0NDJdKX1mdW5jdGlvbiBpUygpe3JldHVybiBuUygpLnBhcmFsbGVscyhbMjkuNSw0NS41XSkuc2NhbGUoMTA3MCkudHJhbnNsYXRlKFs0ODAsMjUwXSkucm90YXRlKFs5NiwwXSkuY2VudGVyKFstLjYsMzguN10pfWZ1bmN0aW9uIHJTKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3ZhciBpPXN2KGUpLHI9c3Yobiksbz10KGkqcik7cmV0dXJuW28qcipkdihlKSxvKmR2KG4pXX19ZnVuY3Rpb24gb1ModCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dmFyIGk9ZnYoZSplK24qbikscj10KGkpLG89ZHYociksYT1zdihyKTtyZXR1cm5bYXYoZSpvLGkqYSksX3YoaSYmbipvL2kpXX19dmFyIGFTPXJTKChmdW5jdGlvbih0KXtyZXR1cm4gZnYoMi8oMSt0KSl9KSk7YVMuaW52ZXJ0PW9TKChmdW5jdGlvbih0KXtyZXR1cm4gMipfdih0LzIpfSkpO3ZhciBzUz1yUygoZnVuY3Rpb24odCl7cmV0dXJuKHQ9Z3YodCkpJiZ0L2R2KHQpfSkpO2Z1bmN0aW9uIGxTKHQsZSl7cmV0dXJuW3QsdXYobXYoKFF5K2UpLzIpKV19ZnVuY3Rpb24gY1ModCl7dmFyIGUsbixpLHI9SncodCksbz1yLmNlbnRlcixhPXIuc2NhbGUscz1yLnRyYW5zbGF0ZSxsPXIuY2xpcEV4dGVudCxjPW51bGw7ZnVuY3Rpb24gdSgpe3ZhciBvPUp5KmEoKSxzPXIoWWIoci5yb3RhdGUoKSkuaW52ZXJ0KFswLDBdKSk7cmV0dXJuIGwobnVsbD09Yz9bW3NbMF0tbyxzWzFdLW9dLFtzWzBdK28sc1sxXStvXV06dD09PWxTP1tbTWF0aC5tYXgoc1swXS1vLGMpLGVdLFtNYXRoLm1pbihzWzBdK28sbiksaV1dOltbYyxNYXRoLm1heChzWzFdLW8sZSldLFtuLE1hdGgubWluKHNbMV0rbyxpKV1dKX1yZXR1cm4gci5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYSh0KSx1KCkpOmEoKX0sci50cmFuc2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHModCksdSgpKTpzKCl9LHIuY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvKHQpLHUoKSk6bygpfSxyLmNsaXBFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/Yz1lPW49aT1udWxsOihjPSt0WzBdWzBdLGU9K3RbMF1bMV0sbj0rdFsxXVswXSxpPSt0WzFdWzFdKSx1KCkpOm51bGw9PWM/bnVsbDpbW2MsZV0sW24saV1dfSx1KCl9ZnVuY3Rpb24gdVModCl7cmV0dXJuIG12KChReSt0KS8yKX1mdW5jdGlvbiBoUyh0LGUpe3ZhciBuPXN2KHQpLGk9dD09PWU/ZHYodCk6dXYobi9zdihlKSkvdXYodVMoZSkvdVModCkpLHI9bipodih1Uyh0KSxpKS9pO2lmKCFpKXJldHVybiBsUztmdW5jdGlvbiBvKHQsZSl7cj4wP2U8LVF5K0t5JiYoZT0tUXkrS3kpOmU+UXktS3kmJihlPVF5LUt5KTt2YXIgbj1yL2h2KHVTKGUpLGkpO3JldHVybltuKmR2KGkqdCksci1uKnN2KGkqdCldfXJldHVybiBvLmludmVydD1mdW5jdGlvbih0LGUpe3ZhciBuPXItZSxvPXB2KGkpKmZ2KHQqdCtuKm4pLGE9YXYodCxydihuKSkqcHYobik7cmV0dXJuIG4qaTwwJiYoYS09SnkqcHYodCkqcHYobikpLFthL2ksMipvdihodihyL28sMS9pKSktUXldfSxvfWZ1bmN0aW9uIGRTKHQsZSl7cmV0dXJuW3QsZV19ZnVuY3Rpb24gcFModCxlKXt2YXIgbj1zdih0KSxpPXQ9PT1lP2R2KHQpOihuLXN2KGUpKS8oZS10KSxyPW4vaSt0O2lmKHJ2KGkpPEt5KXJldHVybiBkUztmdW5jdGlvbiBvKHQsZSl7dmFyIG49ci1lLG89aSp0O3JldHVybltuKmR2KG8pLHItbipzdihvKV19cmV0dXJuIG8uaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7dmFyIG49ci1lLG89YXYodCxydihuKSkqcHYobik7cmV0dXJuIG4qaTwwJiYoby09SnkqcHYodCkqcHYobikpLFtvL2ksci1wdihpKSpmdih0KnQrbipuKV19LG99c1MuaW52ZXJ0PW9TKChmdW5jdGlvbih0KXtyZXR1cm4gdH0pKSxsUy5pbnZlcnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm5bdCwyKm92KGN2KGUpKS1ReV19LGRTLmludmVydD1kUzt2YXIgZlM9MS4zNDAyNjQsbVM9LS4wODExMDYsZ1M9ODkzZS02LF9TPS4wMDM3OTYseVM9ZnYoMykvMjtmdW5jdGlvbiB2Uyh0LGUpe3ZhciBuPV92KHlTKmR2KGUpKSxpPW4qbixyPWkqaSppO3JldHVyblt0KnN2KG4pLyh5UyooZlMrMyptUyppK3IqKDcqZ1MrOSpfUyppKSkpLG4qKGZTK21TKmkrciooZ1MrX1MqaSkpXX1mdW5jdGlvbiBiUyh0LGUpe3ZhciBuPXN2KGUpLGk9c3YodCkqbjtyZXR1cm5bbipkdih0KS9pLGR2KGUpL2ldfWZ1bmN0aW9uIHhTKHQsZSl7dmFyIG49ZSplLGk9bipuO3JldHVyblt0KiguODcwNy0uMTMxOTc5Km4raSooaSooLjAwMzk3MSpuLS4wMDE1MjkqaSktLjAxMzc5MSkpLGUqKDEuMDA3MjI2K24qKC4wMTUwODUraSooLjAyODg3NCpuLS4wNDQ0NzUtLjAwNTkxNippKSkpXX1mdW5jdGlvbiB3Uyh0LGUpe3JldHVybltzdihlKSpkdih0KSxkdihlKV19ZnVuY3Rpb24gU1ModCxlKXt2YXIgbj1zdihlKSxpPTErc3YodCkqbjtyZXR1cm5bbipkdih0KS9pLGR2KGUpL2ldfWZ1bmN0aW9uIE1TKHQsZSl7cmV0dXJuW3V2KG12KChReStlKS8yKSksLXRdfWZ1bmN0aW9uIEVTKHQsZSl7cmV0dXJuIHQucGFyZW50PT09ZS5wYXJlbnQ/MToyfWZ1bmN0aW9uIFRTKHQsZSl7cmV0dXJuIHQrZS54fWZ1bmN0aW9uIENTKHQsZSl7cmV0dXJuIE1hdGgubWF4KHQsZS55KX1mdW5jdGlvbiBBUyh0KXt2YXIgZT0wLG49dC5jaGlsZHJlbixpPW4mJm4ubGVuZ3RoO2lmKGkpZm9yKDstLWk+PTA7KWUrPW5baV0udmFsdWU7ZWxzZSBlPTE7dC52YWx1ZT1lfWZ1bmN0aW9uIGtTKHQsZSl7dmFyIG4saSxyLG8sYSxzPW5ldyBJUyh0KSxsPSt0LnZhbHVlJiYocy52YWx1ZT10LnZhbHVlKSxjPVtzXTtmb3IobnVsbD09ZSYmKGU9TFMpO249Yy5wb3AoKTspaWYobCYmKG4udmFsdWU9K24uZGF0YS52YWx1ZSksKHI9ZShuLmRhdGEpKSYmKGE9ci5sZW5ndGgpKWZvcihuLmNoaWxkcmVuPW5ldyBBcnJheShhKSxvPWEtMTtvPj0wOy0tbyljLnB1c2goaT1uLmNoaWxkcmVuW29dPW5ldyBJUyhyW29dKSksaS5wYXJlbnQ9bixpLmRlcHRoPW4uZGVwdGgrMTtyZXR1cm4gcy5lYWNoQmVmb3JlKE5TKX1mdW5jdGlvbiBMUyh0KXtyZXR1cm4gdC5jaGlsZHJlbn1mdW5jdGlvbiBQUyh0KXt0LmRhdGE9dC5kYXRhLmRhdGF9ZnVuY3Rpb24gTlModCl7dmFyIGU9MDtkb3t0LmhlaWdodD1lfXdoaWxlKCh0PXQucGFyZW50KSYmdC5oZWlnaHQ8KytlKX1mdW5jdGlvbiBJUyh0KXt0aGlzLmRhdGE9dCx0aGlzLmRlcHRoPXRoaXMuaGVpZ2h0PTAsdGhpcy5wYXJlbnQ9bnVsbH12Uy5pbnZlcnQ9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4saT1lLHI9aSppLG89cipyKnIsYT0wO2E8MTImJihvPShyPShpLT1uPShpKihmUyttUypyK28qKGdTK19TKnIpKS1lKS8oZlMrMyptUypyK28qKDcqZ1MrOSpfUypyKSkpKmkpKnIqciwhKHJ2KG4pPFp5KSk7KythKTtyZXR1cm5beVMqdCooZlMrMyptUypyK28qKDcqZ1MrOSpfUypyKSkvc3YoaSksX3YoZHYoaSkveVMpXX0sYlMuaW52ZXJ0PW9TKG92KSx4Uy5pbnZlcnQ9ZnVuY3Rpb24odCxlKXt2YXIgbixpPWUscj0yNTtkb3t2YXIgbz1pKmksYT1vKm87aS09bj0oaSooMS4wMDcyMjYrbyooLjAxNTA4NSthKiguMDI4ODc0Km8tLjA0NDQ3NS0uMDA1OTE2KmEpKSktZSkvKDEuMDA3MjI2K28qKC4wNDUyNTUrYSooLjI1OTg2NipvLS4zMTEzMjUtLjAwNTkxNioxMSphKSkpfXdoaWxlKHJ2KG4pPkt5JiYtLXI+MCk7cmV0dXJuW3QvKC44NzA3KyhvPWkqaSkqKG8qKG8qbypvKiguMDAzOTcxLS4wMDE1MjkqbyktLjAxMzc5MSktLjEzMTk3OSkpLGldfSx3Uy5pbnZlcnQ9b1MoX3YpLFNTLmludmVydD1vUygoZnVuY3Rpb24odCl7cmV0dXJuIDIqb3YodCl9KSksTVMuaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuWy1lLDIqb3YoY3YodCkpLVF5XX0sSVMucHJvdG90eXBlPWtTLnByb3RvdHlwZT17Y29uc3RydWN0b3I6SVMsY291bnQ6ZnVuY3Rpb24gUlMoKXtyZXR1cm4gdGhpcy5lYWNoQWZ0ZXIoQVMpfSxlYWNoOmZ1bmN0aW9uIE9TKHQpe3ZhciBlLG4saSxyLG89dGhpcyxhPVtvXTtkb3tmb3IoZT1hLnJldmVyc2UoKSxhPVtdO289ZS5wb3AoKTspaWYodChvKSxuPW8uY2hpbGRyZW4pZm9yKGk9MCxyPW4ubGVuZ3RoO2k8cjsrK2kpYS5wdXNoKG5baV0pfXdoaWxlKGEubGVuZ3RoKTtyZXR1cm4gdGhpc30sZWFjaEFmdGVyOmZ1bmN0aW9uIHpTKHQpe2Zvcih2YXIgZSxuLGkscj10aGlzLG89W3JdLGE9W107cj1vLnBvcCgpOylpZihhLnB1c2gociksZT1yLmNoaWxkcmVuKWZvcihuPTAsaT1lLmxlbmd0aDtuPGk7KytuKW8ucHVzaChlW25dKTtmb3IoO3I9YS5wb3AoKTspdChyKTtyZXR1cm4gdGhpc30sZWFjaEJlZm9yZTpmdW5jdGlvbiBEUyh0KXtmb3IodmFyIGUsbixpPXRoaXMscj1baV07aT1yLnBvcCgpOylpZih0KGkpLGU9aS5jaGlsZHJlbilmb3Iobj1lLmxlbmd0aC0xO24+PTA7LS1uKXIucHVzaChlW25dKTtyZXR1cm4gdGhpc30sc3VtOmZ1bmN0aW9uIEJTKHQpe3JldHVybiB0aGlzLmVhY2hBZnRlcigoZnVuY3Rpb24oZSl7Zm9yKHZhciBuPSt0KGUuZGF0YSl8fDAsaT1lLmNoaWxkcmVuLHI9aSYmaS5sZW5ndGg7LS1yPj0wOyluKz1pW3JdLnZhbHVlO2UudmFsdWU9bn0pKX0sc29ydDpmdW5jdGlvbiBIUyh0KXtyZXR1cm4gdGhpcy5lYWNoQmVmb3JlKChmdW5jdGlvbihlKXtlLmNoaWxkcmVuJiZlLmNoaWxkcmVuLnNvcnQodCl9KSl9LHBhdGg6ZnVuY3Rpb24gRlModCl7Zm9yKHZhciBlPXRoaXMsbj0oZnVuY3Rpb24gaSh0LGUpe2lmKHQ9PT1lKXJldHVybiB0O3ZhciBuPXQuYW5jZXN0b3JzKCksaT1lLmFuY2VzdG9ycygpLHI9bnVsbDt0PW4ucG9wKCksZT1pLnBvcCgpO2Zvcig7dD09PWU7KXI9dCx0PW4ucG9wKCksZT1pLnBvcCgpO3JldHVybiByfSkoZSx0KSxyPVtlXTtlIT09bjspci5wdXNoKGU9ZS5wYXJlbnQpO2Zvcih2YXIgbz1yLmxlbmd0aDt0IT09bjspci5zcGxpY2UobywwLHQpLHQ9dC5wYXJlbnQ7cmV0dXJuIHJ9LGFuY2VzdG9yczpmdW5jdGlvbiBWUygpe2Zvcih2YXIgdD10aGlzLGU9W3RdO3Q9dC5wYXJlbnQ7KWUucHVzaCh0KTtyZXR1cm4gZX0sZGVzY2VuZGFudHM6ZnVuY3Rpb24gVVMoKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbihlKXt0LnB1c2goZSl9KSksdH0sbGVhdmVzOmZ1bmN0aW9uIGpTKCl7dmFyIHQ9W107cmV0dXJuIHRoaXMuZWFjaEJlZm9yZSgoZnVuY3Rpb24oZSl7ZS5jaGlsZHJlbnx8dC5wdXNoKGUpfSkpLHR9LGxpbmtzOmZ1bmN0aW9uIEdTKCl7dmFyIHQ9dGhpcyxlPVtdO3JldHVybiB0LmVhY2goKGZ1bmN0aW9uKG4pe24hPT10JiZlLnB1c2goe3NvdXJjZTpuLnBhcmVudCx0YXJnZXQ6bn0pfSkpLGV9LGNvcHk6ZnVuY3Rpb24gV1MoKXtyZXR1cm4ga1ModGhpcykuZWFjaEJlZm9yZShQUyl9fTt2YXIgcVM9QXJyYXkucHJvdG90eXBlLnNsaWNlO2Z1bmN0aW9uIFlTKHQpe2Zvcih2YXIgZSxuLGk9MCxyPSh0PShmdW5jdGlvbiBvKHQpe2Zvcih2YXIgZSxuLGk9dC5sZW5ndGg7aTspbj1NYXRoLnJhbmRvbSgpKmktLXwwLGU9dFtpXSx0W2ldPXRbbl0sdFtuXT1lO3JldHVybiB0fSkocVMuY2FsbCh0KSkpLmxlbmd0aCxhPVtdO2k8cjspZT10W2ldLG4mJktTKG4sZSk/KytpOihuPUpTKGE9WFMoYSxlKSksaT0wKTtyZXR1cm4gbn1mdW5jdGlvbiBYUyh0LGUpe3ZhciBuLGk7aWYoWlMoZSx0KSlyZXR1cm5bZV07Zm9yKG49MDtuPHQubGVuZ3RoOysrbilpZigkUyhlLHRbbl0pJiZaUyhRUyh0W25dLGUpLHQpKXJldHVyblt0W25dLGVdO2ZvcihuPTA7bjx0Lmxlbmd0aC0xOysrbilmb3IoaT1uKzE7aTx0Lmxlbmd0aDsrK2kpaWYoJFMoUVModFtuXSx0W2ldKSxlKSYmJFMoUVModFtuXSxlKSx0W2ldKSYmJFMoUVModFtpXSxlKSx0W25dKSYmWlModE0odFtuXSx0W2ldLGUpLHQpKXJldHVyblt0W25dLHRbaV0sZV07dGhyb3cgbmV3IEVycm9yfWZ1bmN0aW9uICRTKHQsZSl7dmFyIG49dC5yLWUucixpPWUueC10Lngscj1lLnktdC55O3JldHVybiBuPDB8fG4qbjxpKmkrcipyfWZ1bmN0aW9uIEtTKHQsZSl7dmFyIG49dC5yLWUucisxZS02LGk9ZS54LXQueCxyPWUueS10Lnk7cmV0dXJuIG4+MCYmbipuPmkqaStyKnJ9ZnVuY3Rpb24gWlModCxlKXtmb3IodmFyIG49MDtuPGUubGVuZ3RoOysrbilpZighS1ModCxlW25dKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBKUyh0KXtzd2l0Y2godC5sZW5ndGgpe2Nhc2UgMTpyZXR1cm4oZnVuY3Rpb24gZSh0KXtyZXR1cm57eDp0LngseTp0Lnkscjp0LnJ9fSkodFswXSk7Y2FzZSAyOnJldHVybiBRUyh0WzBdLHRbMV0pO2Nhc2UgMzpyZXR1cm4gdE0odFswXSx0WzFdLHRbMl0pfX1mdW5jdGlvbiBRUyh0LGUpe3ZhciBuPXQueCxpPXQueSxyPXQucixvPWUueCxhPWUueSxzPWUucixsPW8tbixjPWEtaSx1PXMtcixoPU1hdGguc3FydChsKmwrYypjKTtyZXR1cm57eDoobitvK2wvaCp1KS8yLHk6KGkrYStjL2gqdSkvMixyOihoK3IrcykvMn19ZnVuY3Rpb24gdE0odCxlLG4pe3ZhciBpPXQueCxyPXQueSxvPXQucixhPWUueCxzPWUueSxsPWUucixjPW4ueCx1PW4ueSxoPW4ucixkPWktYSxwPWktYyxmPXItcyxtPXItdSxnPWwtbyxfPWgtbyx5PWkqaStyKnItbypvLHY9eS1hKmEtcypzK2wqbCxiPXktYypjLXUqdStoKmgseD1wKmYtZCptLHc9KGYqYi1tKnYpLygyKngpLWksUz0obSpnLWYqXykveCxNPShwKnYtZCpiKS8oMip4KS1yLEU9KGQqXy1wKmcpL3gsVD1TKlMrRSpFLTEsQz0yKihvK3cqUytNKkUpLEE9dyp3K00qTS1vKm8saz0tKFQ/KEMrTWF0aC5zcXJ0KEMqQy00KlQqQSkpLygyKlQpOkEvQyk7cmV0dXJue3g6aSt3K1Mqayx5OnIrTStFKmsscjprfX1mdW5jdGlvbiBlTSh0LGUsbil7dmFyIGkscixvLGEscz10LngtZS54LGw9dC55LWUueSxjPXMqcytsKmw7Yz8ocj1lLnIrbi5yLGE9dC5yK24uciwocio9cik+KGEqPWEpPyhpPShjK2EtcikvKDIqYyksbz1NYXRoLnNxcnQoTWF0aC5tYXgoMCxhL2MtaSppKSksbi54PXQueC1pKnMtbypsLG4ueT10LnktaSpsK28qcyk6KGk9KGMrci1hKS8oMipjKSxvPU1hdGguc3FydChNYXRoLm1heCgwLHIvYy1pKmkpKSxuLng9ZS54K2kqcy1vKmwsbi55PWUueStpKmwrbypzKSk6KG4ueD1lLngrbi5yLG4ueT1lLnkpfWZ1bmN0aW9uIG5NKHQsZSl7dmFyIG49dC5yK2Uuci0xZS02LGk9ZS54LXQueCxyPWUueS10Lnk7cmV0dXJuIG4+MCYmbipuPmkqaStyKnJ9ZnVuY3Rpb24gaU0odCl7dmFyIGU9dC5fLG49dC5uZXh0Ll8saT1lLnIrbi5yLHI9KGUueCpuLnIrbi54KmUucikvaSxvPShlLnkqbi5yK24ueSplLnIpL2k7cmV0dXJuIHIqcitvKm99ZnVuY3Rpb24gck0odCl7dGhpcy5fPXQsdGhpcy5uZXh0PW51bGwsdGhpcy5wcmV2aW91cz1udWxsfWZ1bmN0aW9uIG9NKHQpe2lmKCEocj10Lmxlbmd0aCkpcmV0dXJuIDA7dmFyIGUsbixpLHIsbyxhLHMsbCxjLHUsaDtpZigoZT10WzBdKS54PTAsZS55PTAsIShyPjEpKXJldHVybiBlLnI7aWYoZS54PS0obj10WzFdKS5yLG4ueD1lLnIsbi55PTAsIShyPjIpKXJldHVybiBlLnIrbi5yO2VNKG4sZSxpPXRbMl0pLGU9bmV3IHJNKGUpLG49bmV3IHJNKG4pLGk9bmV3IHJNKGkpLGUubmV4dD1pLnByZXZpb3VzPW4sbi5uZXh0PWUucHJldmlvdXM9aSxpLm5leHQ9bi5wcmV2aW91cz1lO3Q6Zm9yKHM9MztzPHI7KytzKXtlTShlLl8sbi5fLGk9dFtzXSksaT1uZXcgck0oaSksbD1uLm5leHQsYz1lLnByZXZpb3VzLHU9bi5fLnIsaD1lLl8ucjtkb3tpZih1PD1oKXtpZihuTShsLl8saS5fKSl7ZS5uZXh0PW49bCxuLnByZXZpb3VzPWUsLS1zO2NvbnRpbnVlIHR9dSs9bC5fLnIsbD1sLm5leHR9ZWxzZXtpZihuTShjLl8saS5fKSl7KGU9YykubmV4dD1uLG4ucHJldmlvdXM9ZSwtLXM7Y29udGludWUgdH1oKz1jLl8ucixjPWMucHJldmlvdXN9fXdoaWxlKGwhPT1jLm5leHQpO2ZvcihpLnByZXZpb3VzPWUsaS5uZXh0PW4sZS5uZXh0PW4ucHJldmlvdXM9bj1pLG89aU0oZSk7KGk9aS5uZXh0KSE9PW47KShhPWlNKGkpKTxvJiYoZT1pLG89YSk7bj1lLm5leHR9Zm9yKGU9W24uX10saT1uOyhpPWkubmV4dCkhPT1uOyllLnB1c2goaS5fKTtmb3IoaT1ZUyhlKSxzPTA7czxyOysrcykoZT10W3NdKS54LT1pLngsZS55LT1pLnk7cmV0dXJuIGkucn1mdW5jdGlvbiBhTSh0KXtyZXR1cm4gbnVsbD09dD9udWxsOnNNKHQpfWZ1bmN0aW9uIHNNKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcjtyZXR1cm4gdH1mdW5jdGlvbiBsTSgpe3JldHVybiAwfWZ1bmN0aW9uIGNNKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiB1TSh0KXtyZXR1cm4gTWF0aC5zcXJ0KHQudmFsdWUpfWZ1bmN0aW9uIGhNKHQpe3JldHVybiBmdW5jdGlvbihlKXtlLmNoaWxkcmVufHwoZS5yPU1hdGgubWF4KDAsK3QoZSl8fDApKX19ZnVuY3Rpb24gZE0odCxlKXtyZXR1cm4gZnVuY3Rpb24obil7aWYoaT1uLmNoaWxkcmVuKXt2YXIgaSxyLG8sYT1pLmxlbmd0aCxzPXQobikqZXx8MDtpZihzKWZvcihyPTA7cjxhOysrcilpW3JdLnIrPXM7aWYobz1vTShpKSxzKWZvcihyPTA7cjxhOysrcilpW3JdLnItPXM7bi5yPW8rc319fWZ1bmN0aW9uIHBNKHQpe3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj1lLnBhcmVudDtlLnIqPXQsbiYmKGUueD1uLngrdCplLngsZS55PW4ueSt0KmUueSl9fWZ1bmN0aW9uIGZNKHQpe3QueDA9TWF0aC5yb3VuZCh0LngwKSx0LnkwPU1hdGgucm91bmQodC55MCksdC54MT1NYXRoLnJvdW5kKHQueDEpLHQueTE9TWF0aC5yb3VuZCh0LnkxKX1mdW5jdGlvbiBtTSh0LGUsbixpLHIpe2Zvcih2YXIgbyxhPXQuY2hpbGRyZW4scz0tMSxsPWEubGVuZ3RoLGM9dC52YWx1ZSYmKGktZSkvdC52YWx1ZTsrK3M8bDspKG89YVtzXSkueTA9bixvLnkxPXIsby54MD1lLG8ueDE9ZSs9by52YWx1ZSpjfXZhciBnTT17ZGVwdGg6LTF9LF9NPXt9O2Z1bmN0aW9uIHlNKHQpe3JldHVybiB0LmlkfWZ1bmN0aW9uIHZNKHQpe3JldHVybiB0LnBhcmVudElkfWZ1bmN0aW9uIGJNKHQsZSl7cmV0dXJuIHQucGFyZW50PT09ZS5wYXJlbnQ/MToyfWZ1bmN0aW9uIHhNKHQpe3ZhciBlPXQuY2hpbGRyZW47cmV0dXJuIGU/ZVswXTp0LnR9ZnVuY3Rpb24gd00odCl7dmFyIGU9dC5jaGlsZHJlbjtyZXR1cm4gZT9lW2UubGVuZ3RoLTFdOnQudH1mdW5jdGlvbiBTTSh0LGUsbil7dmFyIGk9bi8oZS5pLXQuaSk7ZS5jLT1pLGUucys9bix0LmMrPWksZS56Kz1uLGUubSs9bn1mdW5jdGlvbiBNTSh0LGUsbil7cmV0dXJuIHQuYS5wYXJlbnQ9PT1lLnBhcmVudD90LmE6bn1mdW5jdGlvbiBFTSh0LGUpe3RoaXMuXz10LHRoaXMucGFyZW50PW51bGwsdGhpcy5jaGlsZHJlbj1udWxsLHRoaXMuQT1udWxsLHRoaXMuYT10aGlzLHRoaXMuej0wLHRoaXMubT0wLHRoaXMuYz0wLHRoaXMucz0wLHRoaXMudD1udWxsLHRoaXMuaT1lfWZ1bmN0aW9uIFRNKHQsZSxuLGkscil7Zm9yKHZhciBvLGE9dC5jaGlsZHJlbixzPS0xLGw9YS5sZW5ndGgsYz10LnZhbHVlJiYoci1uKS90LnZhbHVlOysrczxsOykobz1hW3NdKS54MD1lLG8ueDE9aSxvLnkwPW4sby55MT1uKz1vLnZhbHVlKmN9RU0ucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoSVMucHJvdG90eXBlKTt2YXIgQ009KDErTWF0aC5zcXJ0KDUpKS8yO2Z1bmN0aW9uIEFNKHQsZSxuLGkscixvKXtmb3IodmFyIGEscyxsLGMsdSxoLGQscCxmLG0sZyxfPVtdLHk9ZS5jaGlsZHJlbix2PTAsYj0wLHg9eS5sZW5ndGgsdz1lLnZhbHVlO3Y8eDspe2w9ci1uLGM9by1pO2Rve3U9eVtiKytdLnZhbHVlfXdoaWxlKCF1JiZiPHgpO2ZvcihoPWQ9dSxnPXUqdSoobT1NYXRoLm1heChjL2wsbC9jKS8odyp0KSksZj1NYXRoLm1heChkL2csZy9oKTtiPHg7KytiKXtpZih1Kz1zPXlbYl0udmFsdWUsczxoJiYoaD1zKSxzPmQmJihkPXMpLGc9dSp1Km0sKHA9TWF0aC5tYXgoZC9nLGcvaCkpPmYpe3UtPXM7YnJlYWt9Zj1wfV8ucHVzaChhPXt2YWx1ZTp1LGRpY2U6bDxjLGNoaWxkcmVuOnkuc2xpY2UodixiKX0pLGEuZGljZT9tTShhLG4saSxyLHc/aSs9Yyp1L3c6byk6VE0oYSxuLGksdz9uKz1sKnUvdzpyLG8pLHctPXUsdj1ifXJldHVybiBffXZhciBrTT0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQsbixpLHIsbyl7QU0oZSx0LG4saSxyLG8pfXJldHVybiBuLnJhdGlvPWZ1bmN0aW9uKGUpe3JldHVybiB0KChlPStlKT4xP2U6MSl9LG59KShDTSk7dmFyIExNPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCxuLGkscixvKXtpZigoYT10Ll9zcXVhcmlmeSkmJmEucmF0aW89PT1lKWZvcih2YXIgYSxzLGwsYyx1LGg9LTEsZD1hLmxlbmd0aCxwPXQudmFsdWU7KytoPGQ7KXtmb3IobD0ocz1hW2hdKS5jaGlsZHJlbixjPXMudmFsdWU9MCx1PWwubGVuZ3RoO2M8dTsrK2Mpcy52YWx1ZSs9bFtjXS52YWx1ZTtzLmRpY2U/bU0ocyxuLGkscixpKz0oby1pKSpzLnZhbHVlL3ApOlRNKHMsbixpLG4rPShyLW4pKnMudmFsdWUvcCxvKSxwLT1zLnZhbHVlfWVsc2UgdC5fc3F1YXJpZnk9YT1BTShlLHQsbixpLHIsbyksYS5yYXRpbz1lfXJldHVybiBuLnJhdGlvPWZ1bmN0aW9uKGUpe3JldHVybiB0KChlPStlKT4xP2U6MSl9LG59KShDTSk7ZnVuY3Rpb24gUE0odCxlLG4pe3JldHVybihlWzBdLXRbMF0pKihuWzFdLXRbMV0pLShlWzFdLXRbMV0pKihuWzBdLXRbMF0pfWZ1bmN0aW9uIE5NKHQsZSl7cmV0dXJuIHRbMF0tZVswXXx8dFsxXS1lWzFdfWZ1bmN0aW9uIElNKHQpe2Zvcih2YXIgZT10Lmxlbmd0aCxuPVswLDFdLGk9MixyPTI7cjxlOysrcil7Zm9yKDtpPjEmJlBNKHRbbltpLTJdXSx0W25baS0xXV0sdFtyXSk8PTA7KS0taTtuW2krK109cn1yZXR1cm4gbi5zbGljZSgwLGkpfWZ1bmN0aW9uIFJNKCl7cmV0dXJuIE1hdGgucmFuZG9tKCl9dmFyIE9NPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCxuKXtyZXR1cm4gdD1udWxsPT10PzA6K3Qsbj1udWxsPT1uPzE6K24sMT09PWFyZ3VtZW50cy5sZW5ndGg/KG49dCx0PTApOm4tPXQsZnVuY3Rpb24oKXtyZXR1cm4gZSgpKm4rdH19cmV0dXJuIG4uc291cmNlPXQsbn0pKFJNKSx6TT0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQsbil7dmFyIGkscjtyZXR1cm4gdD1udWxsPT10PzA6K3Qsbj1udWxsPT1uPzE6K24sZnVuY3Rpb24oKXt2YXIgbztpZihudWxsIT1pKW89aSxpPW51bGw7ZWxzZSBkb3tpPTIqZSgpLTEsbz0yKmUoKS0xLHI9aSppK28qb313aGlsZSghcnx8cj4xKTtyZXR1cm4gdCtuKm8qTWF0aC5zcXJ0KC0yKk1hdGgubG9nKHIpL3IpfX1yZXR1cm4gbi5zb3VyY2U9dCxufSkoUk0pLERNPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4oKXt2YXIgdD16TS5zb3VyY2UoZSkuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBNYXRoLmV4cCh0KCkpfX1yZXR1cm4gbi5zb3VyY2U9dCxufSkoUk0pLEJNPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIGZ1bmN0aW9uKCl7Zm9yKHZhciBuPTAsaT0wO2k8dDsrK2kpbis9ZSgpO3JldHVybiBufX1yZXR1cm4gbi5zb3VyY2U9dCxufSkoUk0pLEhNPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7dmFyIG49Qk0uc291cmNlKGUpKHQpO3JldHVybiBmdW5jdGlvbigpe3JldHVybiBuKCkvdH19cmV0dXJuIG4uc291cmNlPXQsbn0pKFJNKSxGTT0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybi1NYXRoLmxvZygxLWUoKSkvdH19cmV0dXJuIG4uc291cmNlPXQsbn0pKFJNKTtmdW5jdGlvbiBWTSh0LGUpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6YnJlYWs7Y2FzZSAxOnRoaXMucmFuZ2UodCk7YnJlYWs7ZGVmYXVsdDp0aGlzLnJhbmdlKGUpLmRvbWFpbih0KX1yZXR1cm4gdGhpc31mdW5jdGlvbiBVTSh0LGUpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6YnJlYWs7Y2FzZSAxOnRoaXMuaW50ZXJwb2xhdG9yKHQpO2JyZWFrO2RlZmF1bHQ6dGhpcy5pbnRlcnBvbGF0b3IoZSkuZG9tYWluKHQpfXJldHVybiB0aGlzfXZhciBqTT1BcnJheS5wcm90b3R5cGUsR009ak0ubWFwLFdNPWpNLnNsaWNlLHFNPXtuYW1lOiJpbXBsaWNpdCJ9O2Z1bmN0aW9uIFlNKCl7dmFyIHQ9amcoKSxlPVtdLG49W10saT1xTTtmdW5jdGlvbiByKHIpe3ZhciBvPXIrIiIsYT10LmdldChvKTtpZighYSl7aWYoaSE9PXFNKXJldHVybiBpO3Quc2V0KG8sYT1lLnB1c2gocikpfXJldHVybiBuWyhhLTEpJW4ubGVuZ3RoXX1yZXR1cm4gci5kb21haW49ZnVuY3Rpb24obil7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGUuc2xpY2UoKTtlPVtdLHQ9amcoKTtmb3IodmFyIGksbyxhPS0xLHM9bi5sZW5ndGg7KythPHM7KXQuaGFzKG89KGk9blthXSkrIiIpfHx0LnNldChvLGUucHVzaChpKSk7cmV0dXJuIHJ9LHIucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49V00uY2FsbCh0KSxyKTpuLnNsaWNlKCl9LHIudW5rbm93bj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT10LHIpOml9LHIuY29weT1mdW5jdGlvbigpe3JldHVybiBZTShlLG4pLnVua25vd24oaSl9LFZNLmFwcGx5KHIsYXJndW1lbnRzKSxyfWZ1bmN0aW9uIFhNKCl7dmFyIHQsZSxuPVlNKCkudW5rbm93bih2b2lkIDApLGk9bi5kb21haW4scj1uLnJhbmdlLG89WzAsMV0sYT0hMSxzPTAsbD0wLGM9LjU7ZnVuY3Rpb24gdSgpe3ZhciBuPWkoKS5sZW5ndGgsdT1vWzFdPG9bMF0saD1vW3UtMF0sZD1vWzEtdV07dD0oZC1oKS9NYXRoLm1heCgxLG4tcysyKmwpLGEmJih0PU1hdGguZmxvb3IodCkpLGgrPShkLWgtdCoobi1zKSkqYyxlPXQqKDEtcyksYSYmKGg9TWF0aC5yb3VuZChoKSxlPU1hdGgucm91bmQoZSkpO3ZhciBwPUtsKG4pLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIGgrdCplfSkpO3JldHVybiByKHU/cC5yZXZlcnNlKCk6cCl9cmV0dXJuIGRlbGV0ZSBuLnVua25vd24sbi5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGkodCksdSgpKTppKCl9LG4ucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89Wyt0WzBdLCt0WzFdXSx1KCkpOm8uc2xpY2UoKX0sbi5yYW5nZVJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBvPVsrdFswXSwrdFsxXV0sYT0hMCx1KCl9LG4uYmFuZHdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIGV9LG4uc3RlcD1mdW5jdGlvbigpe3JldHVybiB0fSxuLnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSEhdCx1KCkpOmF9LG4ucGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1NYXRoLm1pbigxLGw9K3QpLHUoKSk6c30sbi5wYWRkaW5nSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9TWF0aC5taW4oMSx0KSx1KCkpOnN9LG4ucGFkZGluZ091dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPSt0LHUoKSk6bH0sbi5hbGlnbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz1NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpLHUoKSk6Y30sbi5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIFhNKGkoKSxvKS5yb3VuZChhKS5wYWRkaW5nSW5uZXIocykucGFkZGluZ091dGVyKGwpLmFsaWduKGMpfSxWTS5hcHBseSh1KCksYXJndW1lbnRzKX1mdW5jdGlvbiAkTSh0KXt2YXIgZT10LmNvcHk7cmV0dXJuIHQucGFkZGluZz10LnBhZGRpbmdPdXRlcixkZWxldGUgdC5wYWRkaW5nSW5uZXIsZGVsZXRlIHQucGFkZGluZ091dGVyLHQuY29weT1mdW5jdGlvbigpe3JldHVybiAkTShlKCkpfSx0fWZ1bmN0aW9uIEtNKCl7cmV0dXJuICRNKFhNLmFwcGx5KG51bGwsYXJndW1lbnRzKS5wYWRkaW5nSW5uZXIoMSkpfWZ1bmN0aW9uIFpNKHQpe3JldHVybit0fXZhciBKTT1bMCwxXTtmdW5jdGlvbiBRTSh0KXtyZXR1cm4gdH1mdW5jdGlvbiB0RSh0LGUpe3JldHVybihlLT10PSt0KT9mdW5jdGlvbihuKXtyZXR1cm4obi10KS9lfTooZnVuY3Rpb24gbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19KShpc05hTihlKT9OYU46LjUpfWZ1bmN0aW9uIGVFKHQpe3ZhciBlLG49dFswXSxpPXRbdC5sZW5ndGgtMV07cmV0dXJuIG4+aSYmKGU9bixuPWksaT1lKSxmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5tYXgobixNYXRoLm1pbihpLHQpKX19ZnVuY3Rpb24gbkUodCxlLG4pe3ZhciBpPXRbMF0scj10WzFdLG89ZVswXSxhPWVbMV07cmV0dXJuIHI8aT8oaT10RShyLGkpLG89bihhLG8pKTooaT10RShpLHIpLG89bihvLGEpKSxmdW5jdGlvbih0KXtyZXR1cm4gbyhpKHQpKX19ZnVuY3Rpb24gaUUodCxlLG4pe3ZhciBpPU1hdGgubWluKHQubGVuZ3RoLGUubGVuZ3RoKS0xLHI9bmV3IEFycmF5KGkpLG89bmV3IEFycmF5KGkpLGE9LTE7Zm9yKHRbaV08dFswXSYmKHQ9dC5zbGljZSgpLnJldmVyc2UoKSxlPWUuc2xpY2UoKS5yZXZlcnNlKCkpOysrYTxpOylyW2FdPXRFKHRbYV0sdFthKzFdKSxvW2FdPW4oZVthXSxlW2ErMV0pO3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj1EbCh0LGUsMSxpKS0xO3JldHVybiBvW25dKHJbbl0oZSkpfX1mdW5jdGlvbiByRSh0LGUpe3JldHVybiBlLmRvbWFpbih0LmRvbWFpbigpKS5yYW5nZSh0LnJhbmdlKCkpLmludGVycG9sYXRlKHQuaW50ZXJwb2xhdGUoKSkuY2xhbXAodC5jbGFtcCgpKS51bmtub3duKHQudW5rbm93bigpKX1mdW5jdGlvbiBvRSgpe3ZhciB0LGUsbixpLHIsbyxhPUpNLHM9Sk0sbD1jcCxjPVFNO2Z1bmN0aW9uIHUoKXtyZXR1cm4gaT1NYXRoLm1pbihhLmxlbmd0aCxzLmxlbmd0aCk+Mj9pRTpuRSxyPW89bnVsbCxofWZ1bmN0aW9uIGgoZSl7cmV0dXJuIGlzTmFOKGU9K2UpP246KHJ8fChyPWkoYS5tYXAodCkscyxsKSkpKHQoYyhlKSkpfXJldHVybiBoLmludmVydD1mdW5jdGlvbihuKXtyZXR1cm4gYyhlKChvfHwobz1pKHMsYS5tYXAodCkscnApKSkobikpKX0saC5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9R00uY2FsbCh0LFpNKSxjPT09UU18fChjPWVFKGEpKSx1KCkpOmEuc2xpY2UoKX0saC5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1XTS5jYWxsKHQpLHUoKSk6cy5zbGljZSgpfSxoLnJhbmdlUm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHM9V00uY2FsbCh0KSxsPXVwLHUoKX0saC5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz10P2VFKGEpOlFNLGgpOmMhPT1RTX0saC5pbnRlcnBvbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD10LHUoKSk6bH0saC51bmtub3duPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsaCk6bn0sZnVuY3Rpb24obixpKXtyZXR1cm4gdD1uLGU9aSx1KCl9fWZ1bmN0aW9uIGFFKHQsZSl7cmV0dXJuIG9FKCkodCxlKX1mdW5jdGlvbiBzRSh0LGUsbixpKXt2YXIgcixvPW5jKHQsZSxuKTtzd2l0Y2goKGk9a3kobnVsbD09aT8iLGYiOmkpKS50eXBlKXtjYXNlInMiOnZhciBhPU1hdGgubWF4KE1hdGguYWJzKHQpLE1hdGguYWJzKGUpKTtyZXR1cm4gbnVsbCE9aS5wcmVjaXNpb258fGlzTmFOKHI9R3kobyxhKSl8fChpLnByZWNpc2lvbj1yKSxCeShpLGEpO2Nhc2UiIjpjYXNlImUiOmNhc2UiZyI6Y2FzZSJwIjpjYXNlInIiOm51bGwhPWkucHJlY2lzaW9ufHxpc05hTihyPVd5KG8sTWF0aC5tYXgoTWF0aC5hYnModCksTWF0aC5hYnMoZSkpKSl8fChpLnByZWNpc2lvbj1yLSgiZSI9PT1pLnR5cGUpKTticmVhaztjYXNlImYiOmNhc2UiJSI6bnVsbCE9aS5wcmVjaXNpb258fGlzTmFOKHI9ankobykpfHwoaS5wcmVjaXNpb249ci0yKigiJSI9PT1pLnR5cGUpKX1yZXR1cm4gRHkoaSl9ZnVuY3Rpb24gbEUodCl7dmFyIGU9dC5kb21haW47cmV0dXJuIHQudGlja3M9ZnVuY3Rpb24odCl7dmFyIG49ZSgpO3JldHVybiB0YyhuWzBdLG5bbi5sZW5ndGgtMV0sbnVsbD09dD8xMDp0KX0sdC50aWNrRm9ybWF0PWZ1bmN0aW9uKHQsbil7dmFyIGk9ZSgpO3JldHVybiBzRShpWzBdLGlbaS5sZW5ndGgtMV0sbnVsbD09dD8xMDp0LG4pfSx0Lm5pY2U9ZnVuY3Rpb24obil7bnVsbD09biYmKG49MTApO3ZhciBpLHI9ZSgpLG89MCxhPXIubGVuZ3RoLTEscz1yW29dLGw9clthXTtyZXR1cm4gbDxzJiYoaT1zLHM9bCxsPWksaT1vLG89YSxhPWkpLChpPWVjKHMsbCxuKSk+MD9pPWVjKHM9TWF0aC5mbG9vcihzL2kpKmksbD1NYXRoLmNlaWwobC9pKSppLG4pOmk8MCYmKGk9ZWMocz1NYXRoLmNlaWwocyppKS9pLGw9TWF0aC5mbG9vcihsKmkpL2ksbikpLGk+MD8ocltvXT1NYXRoLmZsb29yKHMvaSkqaSxyW2FdPU1hdGguY2VpbChsL2kpKmksZShyKSk6aTwwJiYocltvXT1NYXRoLmNlaWwocyppKS9pLHJbYV09TWF0aC5mbG9vcihsKmkpL2ksZShyKSksdH0sdH1mdW5jdGlvbiBjRSgpe3ZhciB0PWFFKFFNLFFNKTtyZXR1cm4gdC5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHJFKHQsY0UoKSl9LFZNLmFwcGx5KHQsYXJndW1lbnRzKSxsRSh0KX1mdW5jdGlvbiB1RSh0LGUpe3ZhciBuLGk9MCxyPSh0PXQuc2xpY2UoKSkubGVuZ3RoLTEsbz10W2ldLGE9dFtyXTtyZXR1cm4gYTxvJiYobj1pLGk9cixyPW4sbj1vLG89YSxhPW4pLHRbaV09ZS5mbG9vcihvKSx0W3JdPWUuY2VpbChhKSx0fWZ1bmN0aW9uIGhFKHQpe3JldHVybiBNYXRoLmxvZyh0KX1mdW5jdGlvbiBkRSh0KXtyZXR1cm4gTWF0aC5leHAodCl9ZnVuY3Rpb24gcEUodCl7cmV0dXJuLU1hdGgubG9nKC10KX1mdW5jdGlvbiBmRSh0KXtyZXR1cm4tTWF0aC5leHAoLXQpfWZ1bmN0aW9uIG1FKHQpe3JldHVybiBpc0Zpbml0ZSh0KT8rKCIxZSIrdCk6dDwwPzA6dH1mdW5jdGlvbiBnRSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuLXQoLWUpfX1mdW5jdGlvbiBfRSh0KXt2YXIgZSxuLGk9dChoRSxkRSkscj1pLmRvbWFpbixvPTEwO2Z1bmN0aW9uIGEoKXtyZXR1cm4gZT0oZnVuY3Rpb24gYSh0KXtyZXR1cm4gdD09PU1hdGguRT9NYXRoLmxvZzoxMD09PXQmJk1hdGgubG9nMTB8fDI9PT10JiZNYXRoLmxvZzJ8fCh0PU1hdGgubG9nKHQpLGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmxvZyhlKS90fSl9KShvKSxuPShmdW5jdGlvbiBzKHQpe3JldHVybiAxMD09PXQ/bUU6dD09PU1hdGguRT9NYXRoLmV4cDpmdW5jdGlvbihlKXtyZXR1cm4gTWF0aC5wb3codCxlKX19KShvKSxyKClbMF08MD8oZT1nRShlKSxuPWdFKG4pLHQocEUsZkUpKTp0KGhFLGRFKSxpfXJldHVybiBpLmJhc2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K3QsYSgpKTpvfSxpLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocih0KSxhKCkpOnIoKX0saS50aWNrcz1mdW5jdGlvbih0KXt2YXIgaSxhPXIoKSxzPWFbMF0sbD1hW2EubGVuZ3RoLTFdOyhpPWw8cykmJihkPXMscz1sLGw9ZCk7dmFyIGMsdSxoLGQ9ZShzKSxwPWUobCksZj1udWxsPT10PzEwOit0LG09W107aWYoIShvJTEpJiZwLWQ8Zil7aWYoZD1NYXRoLnJvdW5kKGQpLTEscD1NYXRoLnJvdW5kKHApKzEscz4wKXtmb3IoO2Q8cDsrK2QpZm9yKHU9MSxjPW4oZCk7dTxvOysrdSlpZighKChoPWMqdSk8cykpe2lmKGg+bClicmVhazttLnB1c2goaCl9fWVsc2UgZm9yKDtkPHA7KytkKWZvcih1PW8tMSxjPW4oZCk7dT49MTstLXUpaWYoISgoaD1jKnUpPHMpKXtpZihoPmwpYnJlYWs7bS5wdXNoKGgpfX1lbHNlIG09dGMoZCxwLE1hdGgubWluKHAtZCxmKSkubWFwKG4pO3JldHVybiBpP20ucmV2ZXJzZSgpOm19LGkudGlja0Zvcm1hdD1mdW5jdGlvbih0LHIpe2lmKG51bGw9PXImJihyPTEwPT09bz8iLjBlIjoiLCIpLCJmdW5jdGlvbiIhPXR5cGVvZiByJiYocj1EeShyKSksdD09PTEvMClyZXR1cm4gcjtudWxsPT10JiYodD0xMCk7dmFyIGE9TWF0aC5tYXgoMSxvKnQvaS50aWNrcygpLmxlbmd0aCk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBpPXQvbihNYXRoLnJvdW5kKGUodCkpKTtyZXR1cm4gaSpvPG8tLjUmJihpKj1vKSxpPD1hP3IodCk6IiJ9fSxpLm5pY2U9ZnVuY3Rpb24oKXtyZXR1cm4gcih1RShyKCkse2Zsb29yOmZ1bmN0aW9uKHQpe3JldHVybiBuKE1hdGguZmxvb3IoZSh0KSkpfSxjZWlsOmZ1bmN0aW9uKHQpe3JldHVybiBuKE1hdGguY2VpbChlKHQpKSl9fSkpfSxpfWZ1bmN0aW9uIHlFKCl7dmFyIHQ9X0Uob0UoKSkuZG9tYWluKFsxLDEwXSk7cmV0dXJuIHQuY29weT1mdW5jdGlvbigpe3JldHVybiByRSh0LHlFKCkpLmJhc2UodC5iYXNlKCkpfSxWTS5hcHBseSh0LGFyZ3VtZW50cyksdH1mdW5jdGlvbiB2RSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGguc2lnbihlKSpNYXRoLmxvZzFwKE1hdGguYWJzKGUvdCkpfX1mdW5jdGlvbiBiRSh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGguc2lnbihlKSpNYXRoLmV4cG0xKE1hdGguYWJzKGUpKSp0fX1mdW5jdGlvbiB4RSh0KXt2YXIgZT0xLG49dCh2RShlKSxiRShlKSk7cmV0dXJuIG4uY29uc3RhbnQ9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dCh2RShlPStuKSxiRShlKSk6ZX0sbEUobil9ZnVuY3Rpb24gd0UodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlPDA/LU1hdGgucG93KC1lLHQpOk1hdGgucG93KGUsdCl9fWZ1bmN0aW9uIFNFKHQpe3JldHVybiB0PDA/LU1hdGguc3FydCgtdCk6TWF0aC5zcXJ0KHQpfWZ1bmN0aW9uIE1FKHQpe3JldHVybiB0PDA/LXQqdDp0KnR9ZnVuY3Rpb24gRUUodCl7dmFyIGU9dChRTSxRTSksbj0xO2Z1bmN0aW9uIGkoKXtyZXR1cm4gMT09PW4/dChRTSxRTSk6LjU9PT1uP3QoU0UsTUUpOnQod0Uobiksd0UoMS9uKSl9cmV0dXJuIGUuZXhwb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K3QsaSgpKTpufSxsRShlKX1mdW5jdGlvbiBURSgpe3ZhciB0PUVFKG9FKCkpO3JldHVybiB0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gckUodCxURSgpKS5leHBvbmVudCh0LmV4cG9uZW50KCkpfSxWTS5hcHBseSh0LGFyZ3VtZW50cyksdH1mdW5jdGlvbiBDRSgpe3ZhciB0LGU9W10sbj1bXSxpPVtdO2Z1bmN0aW9uIHIoKXt2YXIgdD0wLHI9TWF0aC5tYXgoMSxuLmxlbmd0aCk7Zm9yKGk9bmV3IEFycmF5KHItMSk7Kyt0PHI7KWlbdC0xXT1yYyhlLHQvcik7cmV0dXJuIG99ZnVuY3Rpb24gbyhlKXtyZXR1cm4gaXNOYU4oZT0rZSk/dDpuW0RsKGksZSldfXJldHVybiBvLmludmVydEV4dGVudD1mdW5jdGlvbih0KXt2YXIgcj1uLmluZGV4T2YodCk7cmV0dXJuIHI8MD9bTmFOLE5hTl06W3I+MD9pW3ItMV06ZVswXSxyPGkubGVuZ3RoP2lbcl06ZVtlLmxlbmd0aC0xXV19LG8uZG9tYWluPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBlLnNsaWNlKCk7ZT1bXTtmb3IodmFyIG4saT0wLG89dC5sZW5ndGg7aTxvOysraSludWxsPT0obj10W2ldKXx8aXNOYU4obj0rbil8fGUucHVzaChuKTtyZXR1cm4gZS5zb3J0KFJsKSxyKCl9LG8ucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49V00uY2FsbCh0KSxyKCkpOm4uc2xpY2UoKX0sby51bmtub3duPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsbyk6dH0sby5xdWFudGlsZXM9ZnVuY3Rpb24oKXtyZXR1cm4gaS5zbGljZSgpfSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gQ0UoKS5kb21haW4oZSkucmFuZ2UobikudW5rbm93bih0KX0sVk0uYXBwbHkobyxhcmd1bWVudHMpfWZ1bmN0aW9uIEFFKCl7dmFyIHQsZT0wLG49MSxpPTEscj1bLjVdLG89WzAsMV07ZnVuY3Rpb24gYShlKXtyZXR1cm4gZTw9ZT9vW0RsKHIsZSwwLGkpXTp0fWZ1bmN0aW9uIHMoKXt2YXIgdD0tMTtmb3Iocj1uZXcgQXJyYXkoaSk7Kyt0PGk7KXJbdF09KCh0KzEpKm4tKHQtaSkqZSkvKGkrMSk7cmV0dXJuIGF9cmV0dXJuIGEuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0WzBdLG49K3RbMV0scygpKTpbZSxuXX0sYS5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0obz1XTS5jYWxsKHQpKS5sZW5ndGgtMSxzKCkpOm8uc2xpY2UoKX0sYS5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIGE9by5pbmRleE9mKHQpO3JldHVybiBhPDA/W05hTixOYU5dOmE8MT9bZSxyWzBdXTphPj1pP1tyW2ktMV0sbl06W3JbYS0xXSxyW2FdXX0sYS51bmtub3duPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsYSk6YX0sYS50aHJlc2hvbGRzPWZ1bmN0aW9uKCl7cmV0dXJuIHIuc2xpY2UoKX0sYS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIEFFKCkuZG9tYWluKFtlLG5dKS5yYW5nZShvKS51bmtub3duKHQpfSxWTS5hcHBseShsRShhKSxhcmd1bWVudHMpfXZhciBrRT1uZXcgRGF0ZSxMRT1uZXcgRGF0ZTtmdW5jdGlvbiBQRSh0LGUsbixpKXtmdW5jdGlvbiByKGUpe3JldHVybiB0KGU9MD09PWFyZ3VtZW50cy5sZW5ndGg/bmV3IERhdGU6bmV3IERhdGUoK2UpKSxlfXJldHVybiByLmZsb29yPWZ1bmN0aW9uKGUpe3JldHVybiB0KGU9bmV3IERhdGUoK2UpKSxlfSxyLmNlaWw9ZnVuY3Rpb24obil7cmV0dXJuIHQobj1uZXcgRGF0ZShuLTEpKSxlKG4sMSksdChuKSxufSxyLnJvdW5kPWZ1bmN0aW9uKHQpe3ZhciBlPXIodCksbj1yLmNlaWwodCk7cmV0dXJuIHQtZTxuLXQ/ZTpufSxyLm9mZnNldD1mdW5jdGlvbih0LG4pe3JldHVybiBlKHQ9bmV3IERhdGUoK3QpLG51bGw9PW4/MTpNYXRoLmZsb29yKG4pKSx0fSxyLnJhbmdlPWZ1bmN0aW9uKG4saSxvKXt2YXIgYSxzPVtdO2lmKG49ci5jZWlsKG4pLG89bnVsbD09bz8xOk1hdGguZmxvb3IobyksIShuPGkmJm8+MCkpcmV0dXJuIHM7ZG97cy5wdXNoKGE9bmV3IERhdGUoK24pKSxlKG4sbyksdChuKX13aGlsZShhPG4mJm48aSk7cmV0dXJuIHN9LHIuZmlsdGVyPWZ1bmN0aW9uKG4pe3JldHVybiBQRSgoZnVuY3Rpb24oZSl7aWYoZT49ZSlmb3IoO3QoZSksIW4oZSk7KWUuc2V0VGltZShlLTEpfSksKGZ1bmN0aW9uKHQsaSl7aWYodD49dClpZihpPDApZm9yKDsrK2k8PTA7KWZvcig7ZSh0LC0xKSwhbih0KTspO2Vsc2UgZm9yKDstLWk+PTA7KWZvcig7ZSh0LDEpLCFuKHQpOyk7fSkpfSxuJiYoci5jb3VudD1mdW5jdGlvbihlLGkpe3JldHVybiBrRS5zZXRUaW1lKCtlKSxMRS5zZXRUaW1lKCtpKSx0KGtFKSx0KExFKSxNYXRoLmZsb29yKG4oa0UsTEUpKX0sci5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLGlzRmluaXRlKHQpJiZ0PjA/dD4xP3IuZmlsdGVyKGk/ZnVuY3Rpb24oZSl7cmV0dXJuIGkoZSkldD09MH06ZnVuY3Rpb24oZSl7cmV0dXJuIHIuY291bnQoMCxlKSV0PT0wfSk6cjpudWxsfSkscn12YXIgTkU9UEUoKGZ1bmN0aW9uKCl7fSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKCt0K2UpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUtdH0pKTtORS5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLGlzRmluaXRlKHQpJiZ0PjA/dD4xP1BFKChmdW5jdGlvbihlKXtlLnNldFRpbWUoTWF0aC5mbG9vcihlL3QpKnQpfSksKGZ1bmN0aW9uKGUsbil7ZS5zZXRUaW1lKCtlK24qdCl9KSwoZnVuY3Rpb24oZSxuKXtyZXR1cm4obi1lKS90fSkpOk5FOm51bGx9O3ZhciBJRT1ORSxSRT1ORS5yYW5nZSxPRT0xZTMsekU9NmU0LERFPTM2ZTUsQkU9ODY0ZTUsSEU9NjA0OGU1LEZFPVBFKChmdW5jdGlvbih0KXt0LnNldFRpbWUodC10LmdldE1pbGxpc2Vjb25kcygpKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VGltZSgrdCtlKk9FKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL09FfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ1NlY29uZHMoKX0pKSxWRT1GRSxVRT1GRS5yYW5nZSxqRT1QRSgoZnVuY3Rpb24odCl7dC5zZXRUaW1lKHQtdC5nZXRNaWxsaXNlY29uZHMoKS10LmdldFNlY29uZHMoKSpPRSl9KSwoZnVuY3Rpb24odCxlKXt0LnNldFRpbWUoK3QrZSp6RSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10KS96RX0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRNaW51dGVzKCl9KSksR0U9akUsV0U9akUucmFuZ2UscUU9UEUoKGZ1bmN0aW9uKHQpe3Quc2V0VGltZSh0LXQuZ2V0TWlsbGlzZWNvbmRzKCktdC5nZXRTZWNvbmRzKCkqT0UtdC5nZXRNaW51dGVzKCkqekUpfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKCt0K2UqREUpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuKGUtdCkvREV9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0SG91cnMoKX0pKSxZRT1xRSxYRT1xRS5yYW5nZSwkRT1QRSgoZnVuY3Rpb24odCl7dC5zZXRIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0RGF0ZSh0LmdldERhdGUoKStlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQtKGUuZ2V0VGltZXpvbmVPZmZzZXQoKS10LmdldFRpbWV6b25lT2Zmc2V0KCkpKnpFKS9CRX0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXREYXRlKCktMX0pKSxLRT0kRSxaRT0kRS5yYW5nZTtmdW5jdGlvbiBKRSh0KXtyZXR1cm4gUEUoKGZ1bmN0aW9uKGUpe2Uuc2V0RGF0ZShlLmdldERhdGUoKS0oZS5nZXREYXkoKSs3LXQpJTcpLGUuc2V0SG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldERhdGUodC5nZXREYXRlKCkrNyplKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQtKGUuZ2V0VGltZXpvbmVPZmZzZXQoKS10LmdldFRpbWV6b25lT2Zmc2V0KCkpKnpFKS9IRX0pKX12YXIgUUU9SkUoMCksdFQ9SkUoMSksZVQ9SkUoMiksblQ9SkUoMyksaVQ9SkUoNCksclQ9SkUoNSksb1Q9SkUoNiksYVQ9UUUucmFuZ2Usc1Q9dFQucmFuZ2UsbFQ9ZVQucmFuZ2UsY1Q9blQucmFuZ2UsdVQ9aVQucmFuZ2UsaFQ9clQucmFuZ2UsZFQ9b1QucmFuZ2UscFQ9UEUoKGZ1bmN0aW9uKHQpe3Quc2V0RGF0ZSgxKSx0LnNldEhvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRNb250aCh0LmdldE1vbnRoKCkrZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5nZXRNb250aCgpLXQuZ2V0TW9udGgoKSsxMiooZS5nZXRGdWxsWWVhcigpLXQuZ2V0RnVsbFllYXIoKSl9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TW9udGgoKX0pKSxmVD1wVCxtVD1wVC5yYW5nZSxnVD1QRSgoZnVuY3Rpb24odCl7dC5zZXRNb250aCgwLDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldEZ1bGxZZWFyKHQuZ2V0RnVsbFllYXIoKStlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybiBlLmdldEZ1bGxZZWFyKCktdC5nZXRGdWxsWWVhcigpfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEZ1bGxZZWFyKCl9KSk7Z1QuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9TWF0aC5mbG9vcih0KSkmJnQ+MD9QRSgoZnVuY3Rpb24oZSl7ZS5zZXRGdWxsWWVhcihNYXRoLmZsb29yKGUuZ2V0RnVsbFllYXIoKS90KSp0KSxlLnNldE1vbnRoKDAsMSksZS5zZXRIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbihlLG4pe2Uuc2V0RnVsbFllYXIoZS5nZXRGdWxsWWVhcigpK24qdCl9KSk6bnVsbH07dmFyIF9UPWdULHlUPWdULnJhbmdlLHZUPVBFKChmdW5jdGlvbih0KXt0LnNldFVUQ1NlY29uZHMoMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VGltZSgrdCtlKnpFKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL3pFfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ01pbnV0ZXMoKX0pKSxiVD12VCx4VD12VC5yYW5nZSx3VD1QRSgoZnVuY3Rpb24odCl7dC5zZXRVVENNaW51dGVzKDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VGltZSgrdCtlKkRFKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL0RFfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ0hvdXJzKCl9KSksU1Q9d1QsTVQ9d1QucmFuZ2UsRVQ9UEUoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDSG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldFVUQ0RhdGUodC5nZXRVVENEYXRlKCkrZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10KS9CRX0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENEYXRlKCktMX0pKSxUVD1FVCxDVD1FVC5yYW5nZTtmdW5jdGlvbiBBVCh0KXtyZXR1cm4gUEUoKGZ1bmN0aW9uKGUpe2Uuc2V0VVRDRGF0ZShlLmdldFVUQ0RhdGUoKS0oZS5nZXRVVENEYXkoKSs3LXQpJTcpLGUuc2V0VVRDSG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldFVUQ0RhdGUodC5nZXRVVENEYXRlKCkrNyplKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL0hFfSkpfXZhciBrVD1BVCgwKSxMVD1BVCgxKSxQVD1BVCgyKSxOVD1BVCgzKSxJVD1BVCg0KSxSVD1BVCg1KSxPVD1BVCg2KSx6VD1rVC5yYW5nZSxEVD1MVC5yYW5nZSxCVD1QVC5yYW5nZSxIVD1OVC5yYW5nZSxGVD1JVC5yYW5nZSxWVD1SVC5yYW5nZSxVVD1PVC5yYW5nZSxqVD1QRSgoZnVuY3Rpb24odCl7dC5zZXRVVENEYXRlKDEpLHQuc2V0VVRDSG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldFVUQ01vbnRoKHQuZ2V0VVRDTW9udGgoKStlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybiBlLmdldFVUQ01vbnRoKCktdC5nZXRVVENNb250aCgpKzEyKihlLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpKX0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENNb250aCgpfSkpLEdUPWpULFdUPWpULnJhbmdlLHFUPVBFKChmdW5jdGlvbih0KXt0LnNldFVUQ01vbnRoKDAsMSksdC5zZXRVVENIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VVRDRnVsbFllYXIodC5nZXRVVENGdWxsWWVhcigpK2UpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZ2V0VVRDRnVsbFllYXIoKS10LmdldFVUQ0Z1bGxZZWFyKCl9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDRnVsbFllYXIoKX0pKTtxVC5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gaXNGaW5pdGUodD1NYXRoLmZsb29yKHQpKSYmdD4wP1BFKChmdW5jdGlvbihlKXtlLnNldFVUQ0Z1bGxZZWFyKE1hdGguZmxvb3IoZS5nZXRVVENGdWxsWWVhcigpL3QpKnQpLGUuc2V0VVRDTW9udGgoMCwxKSxlLnNldFVUQ0hvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKGUsbil7ZS5zZXRVVENGdWxsWWVhcihlLmdldFVUQ0Z1bGxZZWFyKCkrbip0KX0pKTpudWxsfTt2YXIgWVQ9cVQsWFQ9cVQucmFuZ2U7ZnVuY3Rpb24gJFQodCl7aWYoMDw9dC55JiZ0Lnk8MTAwKXt2YXIgZT1uZXcgRGF0ZSgtMSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCk7cmV0dXJuIGUuc2V0RnVsbFllYXIodC55KSxlfXJldHVybiBuZXcgRGF0ZSh0LnksdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpfWZ1bmN0aW9uIEtUKHQpe2lmKDA8PXQueSYmdC55PDEwMCl7dmFyIGU9bmV3IERhdGUoRGF0ZS5VVEMoLTEsdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpKTtyZXR1cm4gZS5zZXRVVENGdWxsWWVhcih0LnkpLGV9cmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKHQueSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCkpfWZ1bmN0aW9uIFpUKHQsZSxuKXtyZXR1cm57eTp0LG06ZSxkOm4sSDowLE06MCxTOjAsTDowfX1mdW5jdGlvbiBKVCh0KXt2YXIgZT10LmRhdGVUaW1lLG49dC5kYXRlLGk9dC50aW1lLHI9dC5wZXJpb2RzLG89dC5kYXlzLGE9dC5zaG9ydERheXMscz10Lm1vbnRocyxsPXQuc2hvcnRNb250aHMsYz11QyhyKSx1PWhDKHIpLGg9dUMobyksZD1oQyhvKSxwPXVDKGEpLGY9aEMoYSksbT11QyhzKSxnPWhDKHMpLF89dUMobCkseT1oQyhsKSx2PXthOmZ1bmN0aW9uIGIodCl7cmV0dXJuIGFbdC5nZXREYXkoKV19LEE6ZnVuY3Rpb24geCh0KXtyZXR1cm4gb1t0LmdldERheSgpXX0sYjpmdW5jdGlvbiB3KHQpe3JldHVybiBsW3QuZ2V0TW9udGgoKV19LEI6ZnVuY3Rpb24gUyh0KXtyZXR1cm4gc1t0LmdldE1vbnRoKCldfSxjOm51bGwsZDpOQyxlOk5DLGY6REMsZzpYQyxHOktDLEg6SUMsSTpSQyxqOk9DLEw6ekMsbTpCQyxNOkhDLHA6ZnVuY3Rpb24gTSh0KXtyZXR1cm4gclsrKHQuZ2V0SG91cnMoKT49MTIpXX0scTpmdW5jdGlvbiBFKHQpe3JldHVybiAxK35+KHQuZ2V0TW9udGgoKS8zKX0sUTp2QSxzOmJBLFM6RkMsdTpWQyxVOlVDLFY6R0MsdzpXQyxXOnFDLHg6bnVsbCxYOm51bGwseTpZQyxZOiRDLFo6WkMsIiUiOnlBfSxUPXthOmZ1bmN0aW9uIEModCl7cmV0dXJuIGFbdC5nZXRVVENEYXkoKV19LEE6ZnVuY3Rpb24gQSh0KXtyZXR1cm4gb1t0LmdldFVUQ0RheSgpXX0sYjpmdW5jdGlvbiBrKHQpe3JldHVybiBsW3QuZ2V0VVRDTW9udGgoKV19LEI6ZnVuY3Rpb24gTCh0KXtyZXR1cm4gc1t0LmdldFVUQ01vbnRoKCldfSxjOm51bGwsZDpKQyxlOkpDLGY6aUEsZzpmQSxHOmdBLEg6UUMsSTp0QSxqOmVBLEw6bkEsbTpyQSxNOm9BLHA6ZnVuY3Rpb24gUCh0KXtyZXR1cm4gclsrKHQuZ2V0VVRDSG91cnMoKT49MTIpXX0scTpmdW5jdGlvbiBOKHQpe3JldHVybiAxK35+KHQuZ2V0VVRDTW9udGgoKS8zKX0sUTp2QSxzOmJBLFM6YUEsdTpzQSxVOmxBLFY6dUEsdzpoQSxXOmRBLHg6bnVsbCxYOm51bGwseTpwQSxZOm1BLFo6X0EsIiUiOnlBfSxJPXthOmZ1bmN0aW9uIFIodCxlLG4pe3ZhciBpPXAuZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gaT8odC53PWZbaVswXS50b0xvd2VyQ2FzZSgpXSxuK2lbMF0ubGVuZ3RoKTotMX0sQTpmdW5jdGlvbiBPKHQsZSxuKXt2YXIgaT1oLmV4ZWMoZS5zbGljZShuKSk7cmV0dXJuIGk/KHQudz1kW2lbMF0udG9Mb3dlckNhc2UoKV0sbitpWzBdLmxlbmd0aCk6LTF9LGI6ZnVuY3Rpb24geih0LGUsbil7dmFyIGk9Xy5leGVjKGUuc2xpY2UobikpO3JldHVybiBpPyh0Lm09eVtpWzBdLnRvTG93ZXJDYXNlKCldLG4raVswXS5sZW5ndGgpOi0xfSxCOmZ1bmN0aW9uIEQodCxlLG4pe3ZhciBpPW0uZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gaT8odC5tPWdbaVswXS50b0xvd2VyQ2FzZSgpXSxuK2lbMF0ubGVuZ3RoKTotMX0sYzpmdW5jdGlvbiBCKHQsbixpKXtyZXR1cm4gRyh0LGUsbixpKX0sZDp3QyxlOndDLGY6QUMsZzp5QyxHOl9DLEg6TUMsSTpNQyxqOlNDLEw6Q0MsbTp4QyxNOkVDLHA6ZnVuY3Rpb24gSCh0LGUsbil7dmFyIGk9Yy5leGVjKGUuc2xpY2UobikpO3JldHVybiBpPyh0LnA9dVtpWzBdLnRvTG93ZXJDYXNlKCldLG4raVswXS5sZW5ndGgpOi0xfSxxOmJDLFE6TEMsczpQQyxTOlRDLHU6cEMsVTpmQyxWOm1DLHc6ZEMsVzpnQyx4OmZ1bmN0aW9uIEYodCxlLGkpe3JldHVybiBHKHQsbixlLGkpfSxYOmZ1bmN0aW9uIFYodCxlLG4pe3JldHVybiBHKHQsaSxlLG4pfSx5OnlDLFk6X0MsWjp2QywiJSI6a0N9O2Z1bmN0aW9uIFUodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGkscixvLGE9W10scz0tMSxsPTAsYz10Lmxlbmd0aDtmb3IobiBpbnN0YW5jZW9mIERhdGV8fChuPW5ldyBEYXRlKCtuKSk7KytzPGM7KTM3PT09dC5jaGFyQ29kZUF0KHMpJiYoYS5wdXNoKHQuc2xpY2UobCxzKSksbnVsbCE9KHI9ckNbaT10LmNoYXJBdCgrK3MpXSk/aT10LmNoYXJBdCgrK3MpOnI9ImUiPT09aT8iICI6IjAiLChvPWVbaV0pJiYoaT1vKG4scikpLGEucHVzaChpKSxsPXMrMSk7cmV0dXJuIGEucHVzaCh0LnNsaWNlKGwscykpLGEuam9pbigiIil9fWZ1bmN0aW9uIGoodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGkscixvPVpUKDE5MDAsdm9pZCAwLDEpO2lmKEcobyx0LG4rPSIiLDApIT1uLmxlbmd0aClyZXR1cm4gbnVsbDtpZigiUSJpbiBvKXJldHVybiBuZXcgRGF0ZShvLlEpO2lmKCJzImluIG8pcmV0dXJuIG5ldyBEYXRlKDFlMypvLnMrKCJMImluIG8/by5MOjApKTtpZihlJiYhKCJaImluIG8pJiYoby5aPTApLCJwImluIG8mJihvLkg9by5IJTEyKzEyKm8ucCksdm9pZCAwPT09by5tJiYoby5tPSJxImluIG8/by5xOjApLCJWImluIG8pe2lmKG8uVjwxfHxvLlY+NTMpcmV0dXJuIG51bGw7InciaW4gb3x8KG8udz0xKSwiWiJpbiBvPyhyPShpPUtUKFpUKG8ueSwwLDEpKSkuZ2V0VVRDRGF5KCksaT1yPjR8fDA9PT1yP0xULmNlaWwoaSk6TFQoaSksaT1UVC5vZmZzZXQoaSw3KihvLlYtMSkpLG8ueT1pLmdldFVUQ0Z1bGxZZWFyKCksby5tPWkuZ2V0VVRDTW9udGgoKSxvLmQ9aS5nZXRVVENEYXRlKCkrKG8udys2KSU3KToocj0oaT0kVChaVChvLnksMCwxKSkpLmdldERheSgpLGk9cj40fHwwPT09cj90VC5jZWlsKGkpOnRUKGkpLGk9S0Uub2Zmc2V0KGksNyooby5WLTEpKSxvLnk9aS5nZXRGdWxsWWVhcigpLG8ubT1pLmdldE1vbnRoKCksby5kPWkuZ2V0RGF0ZSgpKyhvLncrNiklNyl9ZWxzZSgiVyJpbiBvfHwiVSJpbiBvKSYmKCJ3ImluIG98fChvLnc9InUiaW4gbz9vLnUlNzoiVyJpbiBvPzE6MCkscj0iWiJpbiBvP0tUKFpUKG8ueSwwLDEpKS5nZXRVVENEYXkoKTokVChaVChvLnksMCwxKSkuZ2V0RGF5KCksby5tPTAsby5kPSJXImluIG8/KG8udys2KSU3Kzcqby5XLShyKzUpJTc6by53Kzcqby5VLShyKzYpJTcpO3JldHVybiJaImluIG8/KG8uSCs9by5aLzEwMHwwLG8uTSs9by5aJTEwMCxLVChvKSk6JFQobyl9fWZ1bmN0aW9uIEcodCxlLG4saSl7Zm9yKHZhciByLG8sYT0wLHM9ZS5sZW5ndGgsbD1uLmxlbmd0aDthPHM7KXtpZihpPj1sKXJldHVybi0xO2lmKDM3PT09KHI9ZS5jaGFyQ29kZUF0KGErKykpKXtpZihyPWUuY2hhckF0KGErKyksIShvPUlbciBpbiByQz9lLmNoYXJBdChhKyspOnJdKXx8KGk9byh0LG4saSkpPDApcmV0dXJuLTF9ZWxzZSBpZihyIT1uLmNoYXJDb2RlQXQoaSsrKSlyZXR1cm4tMX1yZXR1cm4gaX1yZXR1cm4gdi54PVUobix2KSx2Llg9VShpLHYpLHYuYz1VKGUsdiksVC54PVUobixUKSxULlg9VShpLFQpLFQuYz1VKGUsVCkse2Zvcm1hdDpmdW5jdGlvbih0KXt2YXIgZT1VKHQrPSIiLHYpO3JldHVybiBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGV9LHBhcnNlOmZ1bmN0aW9uKHQpe3ZhciBlPWoodCs9IiIsITEpO3JldHVybiBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGV9LHV0Y0Zvcm1hdDpmdW5jdGlvbih0KXt2YXIgZT1VKHQrPSIiLFQpO3JldHVybiBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGV9LHV0Y1BhcnNlOmZ1bmN0aW9uKHQpe3ZhciBlPWoodCs9IiIsITApO3JldHVybiBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHR9LGV9fX12YXIgUVQsdEMsZUMsbkMsaUMsckM9eyItIjoiIixfOiIgIiwwOiIwIn0sb0M9L15ccypcZCsvLGFDPS9eJS8sc0M9L1tcXF4kKis/fFtcXSgpLnt9XS9nO2Z1bmN0aW9uIGxDKHQsZSxuKXt2YXIgaT10PDA/Ii0iOiIiLHI9KGk/LXQ6dCkrIiIsbz1yLmxlbmd0aDtyZXR1cm4gaSsobzxuP25ldyBBcnJheShuLW8rMSkuam9pbihlKStyOnIpfWZ1bmN0aW9uIGNDKHQpe3JldHVybiB0LnJlcGxhY2Uoc0MsIlxcJCYiKX1mdW5jdGlvbiB1Qyh0KXtyZXR1cm4gbmV3IFJlZ0V4cCgiXig/OiIrdC5tYXAoY0MpLmpvaW4oInwiKSsiKSIsImkiKX1mdW5jdGlvbiBoQyh0KXtmb3IodmFyIGU9e30sbj0tMSxpPXQubGVuZ3RoOysrbjxpOyllW3Rbbl0udG9Mb3dlckNhc2UoKV09bjtyZXR1cm4gZX1mdW5jdGlvbiBkQyh0LGUsbil7dmFyIGk9b0MuZXhlYyhlLnNsaWNlKG4sbisxKSk7cmV0dXJuIGk/KHQudz0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBwQyh0LGUsbil7dmFyIGk9b0MuZXhlYyhlLnNsaWNlKG4sbisxKSk7cmV0dXJuIGk/KHQudT0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBmQyh0LGUsbil7dmFyIGk9b0MuZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIGk/KHQuVT0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBtQyh0LGUsbil7dmFyIGk9b0MuZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIGk/KHQuVj0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBnQyh0LGUsbil7dmFyIGk9b0MuZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIGk/KHQuVz0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBfQyh0LGUsbil7dmFyIGk9b0MuZXhlYyhlLnNsaWNlKG4sbis0KSk7cmV0dXJuIGk/KHQueT0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB5Qyh0LGUsbil7dmFyIGk9b0MuZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIGk/KHQueT0raVswXSsoK2lbMF0+Njg/MTkwMDoyZTMpLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHZDKHQsZSxuKXt2YXIgaT0vXihaKXwoWystXVxkXGQpKD86Oj8oXGRcZCkpPy8uZXhlYyhlLnNsaWNlKG4sbis2KSk7cmV0dXJuIGk/KHQuWj1pWzFdPzA6LShpWzJdKyhpWzNdfHwiMDAiKSksbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gYkModCxlLG4pe3ZhciBpPW9DLmV4ZWMoZS5zbGljZShuLG4rMSkpO3JldHVybiBpPyh0LnE9MyppWzBdLTMsbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24geEModCxlLG4pe3ZhciBpPW9DLmV4ZWMoZS5zbGljZShuLG4rMikpO3JldHVybiBpPyh0Lm09aVswXS0xLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHdDKHQsZSxuKXt2YXIgaT1vQy5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5kPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFNDKHQsZSxuKXt2YXIgaT1vQy5leGVjKGUuc2xpY2UobixuKzMpKTtyZXR1cm4gaT8odC5tPTAsdC5kPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIE1DKHQsZSxuKXt2YXIgaT1vQy5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5IPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEVDKHQsZSxuKXt2YXIgaT1vQy5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5NPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFRDKHQsZSxuKXt2YXIgaT1vQy5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5TPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIENDKHQsZSxuKXt2YXIgaT1vQy5leGVjKGUuc2xpY2UobixuKzMpKTtyZXR1cm4gaT8odC5MPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEFDKHQsZSxuKXt2YXIgaT1vQy5leGVjKGUuc2xpY2UobixuKzYpKTtyZXR1cm4gaT8odC5MPU1hdGguZmxvb3IoaVswXS8xZTMpLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGtDKHQsZSxuKXt2YXIgaT1hQy5leGVjKGUuc2xpY2UobixuKzEpKTtyZXR1cm4gaT9uK2lbMF0ubGVuZ3RoOi0xfWZ1bmN0aW9uIExDKHQsZSxuKXt2YXIgaT1vQy5leGVjKGUuc2xpY2UobikpO3JldHVybiBpPyh0LlE9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gUEModCxlLG4pe3ZhciBpPW9DLmV4ZWMoZS5zbGljZShuKSk7cmV0dXJuIGk/KHQucz0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBOQyh0LGUpe3JldHVybiBsQyh0LmdldERhdGUoKSxlLDIpfWZ1bmN0aW9uIElDKHQsZSl7cmV0dXJuIGxDKHQuZ2V0SG91cnMoKSxlLDIpfWZ1bmN0aW9uIFJDKHQsZSl7cmV0dXJuIGxDKHQuZ2V0SG91cnMoKSUxMnx8MTIsZSwyKX1mdW5jdGlvbiBPQyh0LGUpe3JldHVybiBsQygxK0tFLmNvdW50KF9UKHQpLHQpLGUsMyl9ZnVuY3Rpb24gekModCxlKXtyZXR1cm4gbEModC5nZXRNaWxsaXNlY29uZHMoKSxlLDMpfWZ1bmN0aW9uIERDKHQsZSl7cmV0dXJuIHpDKHQsZSkrIjAwMCJ9ZnVuY3Rpb24gQkModCxlKXtyZXR1cm4gbEModC5nZXRNb250aCgpKzEsZSwyKX1mdW5jdGlvbiBIQyh0LGUpe3JldHVybiBsQyh0LmdldE1pbnV0ZXMoKSxlLDIpfWZ1bmN0aW9uIEZDKHQsZSl7cmV0dXJuIGxDKHQuZ2V0U2Vjb25kcygpLGUsMil9ZnVuY3Rpb24gVkModCl7dmFyIGU9dC5nZXREYXkoKTtyZXR1cm4gMD09PWU/NzplfWZ1bmN0aW9uIFVDKHQsZSl7cmV0dXJuIGxDKFFFLmNvdW50KF9UKHQpLTEsdCksZSwyKX1mdW5jdGlvbiBqQyh0KXt2YXIgZT10LmdldERheSgpO3JldHVybiBlPj00fHwwPT09ZT9pVCh0KTppVC5jZWlsKHQpfWZ1bmN0aW9uIEdDKHQsZSl7cmV0dXJuIHQ9akModCksbEMoaVQuY291bnQoX1QodCksdCkrKDQ9PT1fVCh0KS5nZXREYXkoKSksZSwyKX1mdW5jdGlvbiBXQyh0KXtyZXR1cm4gdC5nZXREYXkoKX1mdW5jdGlvbiBxQyh0LGUpe3JldHVybiBsQyh0VC5jb3VudChfVCh0KS0xLHQpLGUsMil9ZnVuY3Rpb24gWUModCxlKXtyZXR1cm4gbEModC5nZXRGdWxsWWVhcigpJTEwMCxlLDIpfWZ1bmN0aW9uIFhDKHQsZSl7cmV0dXJuIGxDKCh0PWpDKHQpKS5nZXRGdWxsWWVhcigpJTEwMCxlLDIpfWZ1bmN0aW9uICRDKHQsZSl7cmV0dXJuIGxDKHQuZ2V0RnVsbFllYXIoKSUxZTQsZSw0KX1mdW5jdGlvbiBLQyh0LGUpe3ZhciBuPXQuZ2V0RGF5KCk7cmV0dXJuIGxDKCh0PW4+PTR8fDA9PT1uP2lUKHQpOmlULmNlaWwodCkpLmdldEZ1bGxZZWFyKCklMWU0LGUsNCl9ZnVuY3Rpb24gWkModCl7dmFyIGU9dC5nZXRUaW1lem9uZU9mZnNldCgpO3JldHVybihlPjA/Ii0iOihlKj0tMSwiKyIpKStsQyhlLzYwfDAsIjAiLDIpK2xDKGUlNjAsIjAiLDIpfWZ1bmN0aW9uIEpDKHQsZSl7cmV0dXJuIGxDKHQuZ2V0VVRDRGF0ZSgpLGUsMil9ZnVuY3Rpb24gUUModCxlKXtyZXR1cm4gbEModC5nZXRVVENIb3VycygpLGUsMil9ZnVuY3Rpb24gdEEodCxlKXtyZXR1cm4gbEModC5nZXRVVENIb3VycygpJTEyfHwxMixlLDIpfWZ1bmN0aW9uIGVBKHQsZSl7cmV0dXJuIGxDKDErVFQuY291bnQoWVQodCksdCksZSwzKX1mdW5jdGlvbiBuQSh0LGUpe3JldHVybiBsQyh0LmdldFVUQ01pbGxpc2Vjb25kcygpLGUsMyl9ZnVuY3Rpb24gaUEodCxlKXtyZXR1cm4gbkEodCxlKSsiMDAwIn1mdW5jdGlvbiByQSh0LGUpe3JldHVybiBsQyh0LmdldFVUQ01vbnRoKCkrMSxlLDIpfWZ1bmN0aW9uIG9BKHQsZSl7cmV0dXJuIGxDKHQuZ2V0VVRDTWludXRlcygpLGUsMil9ZnVuY3Rpb24gYUEodCxlKXtyZXR1cm4gbEModC5nZXRVVENTZWNvbmRzKCksZSwyKX1mdW5jdGlvbiBzQSh0KXt2YXIgZT10LmdldFVUQ0RheSgpO3JldHVybiAwPT09ZT83OmV9ZnVuY3Rpb24gbEEodCxlKXtyZXR1cm4gbEMoa1QuY291bnQoWVQodCktMSx0KSxlLDIpfWZ1bmN0aW9uIGNBKHQpe3ZhciBlPXQuZ2V0VVRDRGF5KCk7cmV0dXJuIGU+PTR8fDA9PT1lP0lUKHQpOklULmNlaWwodCl9ZnVuY3Rpb24gdUEodCxlKXtyZXR1cm4gdD1jQSh0KSxsQyhJVC5jb3VudChZVCh0KSx0KSsoND09PVlUKHQpLmdldFVUQ0RheSgpKSxlLDIpfWZ1bmN0aW9uIGhBKHQpe3JldHVybiB0LmdldFVUQ0RheSgpfWZ1bmN0aW9uIGRBKHQsZSl7cmV0dXJuIGxDKExULmNvdW50KFlUKHQpLTEsdCksZSwyKX1mdW5jdGlvbiBwQSh0LGUpe3JldHVybiBsQyh0LmdldFVUQ0Z1bGxZZWFyKCklMTAwLGUsMil9ZnVuY3Rpb24gZkEodCxlKXtyZXR1cm4gbEMoKHQ9Y0EodCkpLmdldFVUQ0Z1bGxZZWFyKCklMTAwLGUsMil9ZnVuY3Rpb24gbUEodCxlKXtyZXR1cm4gbEModC5nZXRVVENGdWxsWWVhcigpJTFlNCxlLDQpfWZ1bmN0aW9uIGdBKHQsZSl7dmFyIG49dC5nZXRVVENEYXkoKTtyZXR1cm4gbEMoKHQ9bj49NHx8MD09PW4/SVQodCk6SVQuY2VpbCh0KSkuZ2V0VVRDRnVsbFllYXIoKSUxZTQsZSw0KX1mdW5jdGlvbiBfQSgpe3JldHVybiIrMDAwMCJ9ZnVuY3Rpb24geUEoKXtyZXR1cm4iJSJ9ZnVuY3Rpb24gdkEodCl7cmV0dXJuK3R9ZnVuY3Rpb24gYkEodCl7cmV0dXJuIE1hdGguZmxvb3IoK3QvMWUzKX1mdW5jdGlvbiB4QSh0KXtyZXR1cm4gUVQ9SlQodCksdEM9UVQuZm9ybWF0LGVDPVFULnBhcnNlLG5DPVFULnV0Y0Zvcm1hdCxpQz1RVC51dGNQYXJzZSxRVH14QSh7ZGF0ZVRpbWU6IiV4LCAlWCIsZGF0ZToiJS1tLyUtZC8lWSIsdGltZToiJS1JOiVNOiVTICVwIixwZXJpb2RzOlsiQU0iLCJQTSJdLGRheXM6WyJTdW5kYXkiLCJNb25kYXkiLCJUdWVzZGF5IiwiV2VkbmVzZGF5IiwiVGh1cnNkYXkiLCJGcmlkYXkiLCJTYXR1cmRheSJdLHNob3J0RGF5czpbIlN1biIsIk1vbiIsIlR1ZSIsIldlZCIsIlRodSIsIkZyaSIsIlNhdCJdLG1vbnRoczpbIkphbnVhcnkiLCJGZWJydWFyeSIsIk1hcmNoIiwiQXByaWwiLCJNYXkiLCJKdW5lIiwiSnVseSIsIkF1Z3VzdCIsIlNlcHRlbWJlciIsIk9jdG9iZXIiLCJOb3ZlbWJlciIsIkRlY2VtYmVyIl0sc2hvcnRNb250aHM6WyJKYW4iLCJGZWIiLCJNYXIiLCJBcHIiLCJNYXkiLCJKdW4iLCJKdWwiLCJBdWciLCJTZXAiLCJPY3QiLCJOb3YiLCJEZWMiXX0pO3ZhciB3QT0iJVktJW0tJWRUJUg6JU06JVMuJUxaIjt2YXIgU0E9RGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc/ZnVuY3Rpb24gTUEodCl7cmV0dXJuIHQudG9JU09TdHJpbmcoKX06bkMod0EpO3ZhciBFQT0rbmV3IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpP2Z1bmN0aW9uIFRBKHQpe3ZhciBlPW5ldyBEYXRlKHQpO3JldHVybiBpc05hTihlKT9udWxsOmV9OmlDKHdBKSxDQT0xZTMsQUE9NmU0LGtBPTM2ZTUsTEE9ODY0ZTUsUEE9MjU5MmU2LE5BPTMxNTM2ZTY7ZnVuY3Rpb24gSUEodCl7cmV0dXJuIG5ldyBEYXRlKHQpfWZ1bmN0aW9uIFJBKHQpe3JldHVybiB0IGluc3RhbmNlb2YgRGF0ZT8rdDorbmV3IERhdGUoK3QpfWZ1bmN0aW9uIE9BKHQsZSxuLGkscixvLGEscyxsKXt2YXIgYz1hRShRTSxRTSksdT1jLmludmVydCxoPWMuZG9tYWluLGQ9bCgiLiVMIikscD1sKCI6JVMiKSxmPWwoIiVJOiVNIiksbT1sKCIlSSAlcCIpLGc9bCgiJWEgJWQiKSxfPWwoIiViICVkIikseT1sKCIlQiIpLHY9bCgiJVkiKSxiPVtbYSwxLENBXSxbYSw1LDVlM10sW2EsMTUsMTVlM10sW2EsMzAsM2U0XSxbbywxLEFBXSxbbyw1LDNlNV0sW28sMTUsOWU1XSxbbywzMCwxOGU1XSxbciwxLGtBXSxbciwzLDEwOGU1XSxbciw2LDIxNmU1XSxbciwxMiw0MzJlNV0sW2ksMSxMQV0sW2ksMiwxNzI4ZTVdLFtuLDEsNjA0OGU1XSxbZSwxLFBBXSxbZSwzLDc3NzZlNl0sW3QsMSxOQV1dO2Z1bmN0aW9uIHgocyl7cmV0dXJuKGEocyk8cz9kOm8ocyk8cz9wOnIocyk8cz9mOmkocyk8cz9tOmUocyk8cz9uKHMpPHM/ZzpfOnQocyk8cz95OnYpKHMpfWZ1bmN0aW9uIHcoZSxuLGkscil7aWYobnVsbD09ZSYmKGU9MTApLCJudW1iZXIiPT10eXBlb2YgZSl7dmFyIG89TWF0aC5hYnMoaS1uKS9lLGE9T2woKGZ1bmN0aW9uKHQpe3JldHVybiB0WzJdfSkpLnJpZ2h0KGIsbyk7YT09PWIubGVuZ3RoPyhyPW5jKG4vTkEsaS9OQSxlKSxlPXQpOmE/KHI9KGE9YltvL2JbYS0xXVsyXTxiW2FdWzJdL28/YS0xOmFdKVsxXSxlPWFbMF0pOihyPU1hdGgubWF4KG5jKG4saSxlKSwxKSxlPXMpfXJldHVybiBudWxsPT1yP2U6ZS5ldmVyeShyKX1yZXR1cm4gYy5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBEYXRlKHUodCkpfSxjLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9oKEdNLmNhbGwodCxSQSkpOmgoKS5tYXAoSUEpfSxjLnRpY2tzPWZ1bmN0aW9uKHQsZSl7dmFyIG4saT1oKCkscj1pWzBdLG89aVtpLmxlbmd0aC0xXSxhPW88cjtyZXR1cm4gYSYmKG49cixyPW8sbz1uKSxuPShuPXcodCxyLG8sZSkpP24ucmFuZ2UocixvKzEpOltdLGE/bi5yZXZlcnNlKCk6bn0sYy50aWNrRm9ybWF0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PWU/eDpsKGUpfSxjLm5pY2U9ZnVuY3Rpb24odCxlKXt2YXIgbj1oKCk7cmV0dXJuKHQ9dyh0LG5bMF0sbltuLmxlbmd0aC0xXSxlKSk/aCh1RShuLHQpKTpjfSxjLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gckUoYyxPQSh0LGUsbixpLHIsbyxhLHMsbCkpfSxjfWZ1bmN0aW9uIHpBKCl7cmV0dXJuIFZNLmFwcGx5KE9BKF9ULGZULFFFLEtFLFlFLEdFLFZFLElFLHRDKS5kb21haW4oW25ldyBEYXRlKDJlMywwLDEpLG5ldyBEYXRlKDJlMywwLDIpXSksYXJndW1lbnRzKX1mdW5jdGlvbiBEQSgpe3ZhciB0LGUsbixpLHIsbz0wLGE9MSxzPVFNLGw9ITE7ZnVuY3Rpb24gYyhlKXtyZXR1cm4gaXNOYU4oZT0rZSk/cjpzKDA9PT1uPy41OihlPShpKGUpLXQpKm4sbD9NYXRoLm1heCgwLE1hdGgubWluKDEsZSkpOmUpKX1yZXR1cm4gYy5kb21haW49ZnVuY3Rpb24ocil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9aShvPStyWzBdKSxlPWkoYT0rclsxXSksbj10PT09ZT8wOjEvKGUtdCksYyk6W28sYV19LGMuY2xhbXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9ISF0LGMpOmx9LGMuaW50ZXJwb2xhdG9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPXQsYyk6c30sYy51bmtub3duPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsYyk6cn0sZnVuY3Rpb24ocil7cmV0dXJuIGk9cix0PXIobyksZT1yKGEpLG49dD09PWU/MDoxLyhlLXQpLGN9fWZ1bmN0aW9uIEJBKHQsZSl7cmV0dXJuIGUuZG9tYWluKHQuZG9tYWluKCkpLmludGVycG9sYXRvcih0LmludGVycG9sYXRvcigpKS5jbGFtcCh0LmNsYW1wKCkpLnVua25vd24odC51bmtub3duKCkpfWZ1bmN0aW9uIEhBKCl7dmFyIHQ9RUUoREEoKSk7cmV0dXJuIHQuY29weT1mdW5jdGlvbigpe3JldHVybiBCQSh0LEhBKCkpLmV4cG9uZW50KHQuZXhwb25lbnQoKSl9LFVNLmFwcGx5KHQsYXJndW1lbnRzKX1mdW5jdGlvbiBGQSgpe3ZhciB0LGUsbixpLHIsbyxhLHM9MCxsPS41LGM9MSx1PVFNLGg9ITE7ZnVuY3Rpb24gZCh0KXtyZXR1cm4gaXNOYU4odD0rdCk/YToodD0uNSsoKHQ9K28odCkpLWUpKih0PGU/aTpyKSx1KGg/TWF0aC5tYXgoMCxNYXRoLm1pbigxLHQpKTp0KSl9cmV0dXJuIGQuZG9tYWluPWZ1bmN0aW9uKGEpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW8ocz0rYVswXSksZT1vKGw9K2FbMV0pLG49byhjPSthWzJdKSxpPXQ9PT1lPzA6LjUvKGUtdCkscj1lPT09bj8wOi41LyhuLWUpLGQpOltzLGwsY119LGQuY2xhbXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9ISF0LGQpOmh9LGQuaW50ZXJwb2xhdG9yPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PXQsZCk6dX0sZC51bmtub3duPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQsZCk6YX0sZnVuY3Rpb24oYSl7cmV0dXJuIG89YSx0PWEocyksZT1hKGwpLG49YShjKSxpPXQ9PT1lPzA6LjUvKGUtdCkscj1lPT09bj8wOi41LyhuLWUpLGR9fWZ1bmN0aW9uIFZBKCl7dmFyIHQ9RUUoRkEoKSk7cmV0dXJuIHQuY29weT1mdW5jdGlvbigpe3JldHVybiBCQSh0LFZBKCkpLmV4cG9uZW50KHQuZXhwb25lbnQoKSl9LFVNLmFwcGx5KHQsYXJndW1lbnRzKX1mdW5jdGlvbiBVQSh0KXtmb3IodmFyIGU9dC5sZW5ndGgvNnwwLG49bmV3IEFycmF5KGUpLGk9MDtpPGU7KW5baV09IiMiK3Quc2xpY2UoNippLDYqKytpKTtyZXR1cm4gbn12YXIgakE9VUEoIjFmNzdiNGZmN2YwZTJjYTAyY2Q2MjcyODk0NjdiZDhjNTY0YmUzNzdjMjdmN2Y3ZmJjYmQyMjE3YmVjZiIpLEdBPVVBKCI3ZmM5N2ZiZWFlZDRmZGMwODZmZmZmOTkzODZjYjBmMDAyN2ZiZjViMTc2NjY2NjYiKSxXQT1VQSgiMWI5ZTc3ZDk1ZjAyNzU3MGIzZTcyOThhNjZhNjFlZTZhYjAyYTY3NjFkNjY2NjY2IikscUE9VUEoImE2Y2VlMzFmNzhiNGIyZGY4YTMzYTAyY2ZiOWE5OWUzMWExY2ZkYmY2ZmZmN2YwMGNhYjJkNjZhM2Q5YWZmZmY5OWIxNTkyOCIpLFlBPVVBKCJmYmI0YWViM2NkZTNjY2ViYzVkZWNiZTRmZWQ5YTZmZmZmY2NlNWQ4YmRmZGRhZWNmMmYyZjIiKSxYQT1VQSgiYjNlMmNkZmRjZGFjY2JkNWU4ZjRjYWU0ZTZmNWM5ZmZmMmFlZjFlMmNjY2NjY2NjIiksJEE9VUEoImU0MWExYzM3N2ViODRkYWY0YTk4NGVhM2ZmN2YwMGZmZmYzM2E2NTYyOGY3ODFiZjk5OTk5OSIpLEtBPVVBKCI2NmMyYTVmYzhkNjI4ZGEwY2JlNzhhYzNhNmQ4NTRmZmQ5MmZlNWM0OTRiM2IzYjMiKSxaQT1VQSgiOGRkM2M3ZmZmZmIzYmViYWRhZmI4MDcyODBiMWQzZmRiNDYyYjNkZTY5ZmNjZGU1ZDlkOWQ5YmM4MGJkY2NlYmM1ZmZlZDZmIiksSkE9VUEoIjRlNzlhN2YyOGUyY2UxNTc1OTc2YjdiMjU5YTE0ZmVkYzk0OWFmN2FhMWZmOWRhNzljNzU1ZmJhYjBhYiIpO2Z1bmN0aW9uIFFBKHQpe3JldHVybiBKZCh0W3QubGVuZ3RoLTFdKX12YXIgdGs9bmV3IEFycmF5KDMpLmNvbmNhdCgiZDhiMzY1ZjVmNWY1NWFiNGFjIiwiYTY2MTFhZGZjMjdkODBjZGMxMDE4NTcxIiwiYTY2MTFhZGZjMjdkZjVmNWY1ODBjZGMxMDE4NTcxIiwiOGM1MTBhZDhiMzY1ZjZlOGMzYzdlYWU1NWFiNGFjMDE2NjVlIiwiOGM1MTBhZDhiMzY1ZjZlOGMzZjVmNWY1YzdlYWU1NWFiNGFjMDE2NjVlIiwiOGM1MTBhYmY4MTJkZGZjMjdkZjZlOGMzYzdlYWU1ODBjZGMxMzU5NzhmMDE2NjVlIiwiOGM1MTBhYmY4MTJkZGZjMjdkZjZlOGMzZjVmNWY1YzdlYWU1ODBjZGMxMzU5NzhmMDE2NjVlIiwiNTQzMDA1OGM1MTBhYmY4MTJkZGZjMjdkZjZlOGMzYzdlYWU1ODBjZGMxMzU5NzhmMDE2NjVlMDAzYzMwIiwiNTQzMDA1OGM1MTBhYmY4MTJkZGZjMjdkZjZlOGMzZjVmNWY1YzdlYWU1ODBjZGMxMzU5NzhmMDE2NjVlMDAzYzMwIikubWFwKFVBKSxlaz1RQSh0ayksbms9bmV3IEFycmF5KDMpLmNvbmNhdCgiYWY4ZGMzZjdmN2Y3N2ZiZjdiIiwiN2IzMjk0YzJhNWNmYTZkYmEwMDA4ODM3IiwiN2IzMjk0YzJhNWNmZjdmN2Y3YTZkYmEwMDA4ODM3IiwiNzYyYTgzYWY4ZGMzZTdkNGU4ZDlmMGQzN2ZiZjdiMWI3ODM3IiwiNzYyYTgzYWY4ZGMzZTdkNGU4ZjdmN2Y3ZDlmMGQzN2ZiZjdiMWI3ODM3IiwiNzYyYTgzOTk3MGFiYzJhNWNmZTdkNGU4ZDlmMGQzYTZkYmEwNWFhZTYxMWI3ODM3IiwiNzYyYTgzOTk3MGFiYzJhNWNmZTdkNGU4ZjdmN2Y3ZDlmMGQzYTZkYmEwNWFhZTYxMWI3ODM3IiwiNDAwMDRiNzYyYTgzOTk3MGFiYzJhNWNmZTdkNGU4ZDlmMGQzYTZkYmEwNWFhZTYxMWI3ODM3MDA0NDFiIiwiNDAwMDRiNzYyYTgzOTk3MGFiYzJhNWNmZTdkNGU4ZjdmN2Y3ZDlmMGQzYTZkYmEwNWFhZTYxMWI3ODM3MDA0NDFiIikubWFwKFVBKSxpaz1RQShuaykscms9bmV3IEFycmF5KDMpLmNvbmNhdCgiZTlhM2M5ZjdmN2Y3YTFkNzZhIiwiZDAxYzhiZjFiNmRhYjhlMTg2NGRhYzI2IiwiZDAxYzhiZjFiNmRhZjdmN2Y3YjhlMTg2NGRhYzI2IiwiYzUxYjdkZTlhM2M5ZmRlMGVmZTZmNWQwYTFkNzZhNGQ5MjIxIiwiYzUxYjdkZTlhM2M5ZmRlMGVmZjdmN2Y3ZTZmNWQwYTFkNzZhNGQ5MjIxIiwiYzUxYjdkZGU3N2FlZjFiNmRhZmRlMGVmZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxIiwiYzUxYjdkZGU3N2FlZjFiNmRhZmRlMGVmZjdmN2Y3ZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxIiwiOGUwMTUyYzUxYjdkZGU3N2FlZjFiNmRhZmRlMGVmZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxMjc2NDE5IiwiOGUwMTUyYzUxYjdkZGU3N2FlZjFiNmRhZmRlMGVmZjdmN2Y3ZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxMjc2NDE5IikubWFwKFVBKSxvaz1RQShyayksYWs9bmV3IEFycmF5KDMpLmNvbmNhdCgiOTk4ZWMzZjdmN2Y3ZjFhMzQwIiwiNWUzYzk5YjJhYmQyZmRiODYzZTY2MTAxIiwiNWUzYzk5YjJhYmQyZjdmN2Y3ZmRiODYzZTY2MTAxIiwiNTQyNzg4OTk4ZWMzZDhkYWViZmVlMGI2ZjFhMzQwYjM1ODA2IiwiNTQyNzg4OTk4ZWMzZDhkYWViZjdmN2Y3ZmVlMGI2ZjFhMzQwYjM1ODA2IiwiNTQyNzg4ODA3M2FjYjJhYmQyZDhkYWViZmVlMGI2ZmRiODYzZTA4MjE0YjM1ODA2IiwiNTQyNzg4ODA3M2FjYjJhYmQyZDhkYWViZjdmN2Y3ZmVlMGI2ZmRiODYzZTA4MjE0YjM1ODA2IiwiMmQwMDRiNTQyNzg4ODA3M2FjYjJhYmQyZDhkYWViZmVlMGI2ZmRiODYzZTA4MjE0YjM1ODA2N2YzYjA4IiwiMmQwMDRiNTQyNzg4ODA3M2FjYjJhYmQyZDhkYWViZjdmN2Y3ZmVlMGI2ZmRiODYzZTA4MjE0YjM1ODA2N2YzYjA4IikubWFwKFVBKSxzaz1RQShhayksbGs9bmV3IEFycmF5KDMpLmNvbmNhdCgiZWY4YTYyZjdmN2Y3NjdhOWNmIiwiY2EwMDIwZjRhNTgyOTJjNWRlMDU3MWIwIiwiY2EwMDIwZjRhNTgyZjdmN2Y3OTJjNWRlMDU3MWIwIiwiYjIxODJiZWY4YTYyZmRkYmM3ZDFlNWYwNjdhOWNmMjE2NmFjIiwiYjIxODJiZWY4YTYyZmRkYmM3ZjdmN2Y3ZDFlNWYwNjdhOWNmMjE2NmFjIiwiYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZDFlNWYwOTJjNWRlNDM5M2MzMjE2NmFjIiwiYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZjdmN2Y3ZDFlNWYwOTJjNWRlNDM5M2MzMjE2NmFjIiwiNjcwMDFmYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZDFlNWYwOTJjNWRlNDM5M2MzMjE2NmFjMDUzMDYxIiwiNjcwMDFmYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZjdmN2Y3ZDFlNWYwOTJjNWRlNDM5M2MzMjE2NmFjMDUzMDYxIikubWFwKFVBKSxjaz1RQShsayksdWs9bmV3IEFycmF5KDMpLmNvbmNhdCgiZWY4YTYyZmZmZmZmOTk5OTk5IiwiY2EwMDIwZjRhNTgyYmFiYWJhNDA0MDQwIiwiY2EwMDIwZjRhNTgyZmZmZmZmYmFiYWJhNDA0MDQwIiwiYjIxODJiZWY4YTYyZmRkYmM3ZTBlMGUwOTk5OTk5NGQ0ZDRkIiwiYjIxODJiZWY4YTYyZmRkYmM3ZmZmZmZmZTBlMGUwOTk5OTk5NGQ0ZDRkIiwiYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkIiwiYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZmZmZmZmZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkIiwiNjcwMDFmYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkMWExYTFhIiwiNjcwMDFmYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZmZmZmZmZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkMWExYTFhIikubWFwKFVBKSxoaz1RQSh1ayksZGs9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmM4ZDU5ZmZmZmJmOTFiZmRiIiwiZDcxOTFjZmRhZTYxYWJkOWU5MmM3YmI2IiwiZDcxOTFjZmRhZTYxZmZmZmJmYWJkOWU5MmM3YmI2IiwiZDczMDI3ZmM4ZDU5ZmVlMDkwZTBmM2Y4OTFiZmRiNDU3NWI0IiwiZDczMDI3ZmM4ZDU5ZmVlMDkwZmZmZmJmZTBmM2Y4OTFiZmRiNDU3NWI0IiwiZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDkwZTBmM2Y4YWJkOWU5NzRhZGQxNDU3NWI0IiwiZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDkwZmZmZmJmZTBmM2Y4YWJkOWU5NzRhZGQxNDU3NWI0IiwiYTUwMDI2ZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDkwZTBmM2Y4YWJkOWU5NzRhZGQxNDU3NWI0MzEzNjk1IiwiYTUwMDI2ZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDkwZmZmZmJmZTBmM2Y4YWJkOWU5NzRhZGQxNDU3NWI0MzEzNjk1IikubWFwKFVBKSxwaz1RQShkayksZms9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmM4ZDU5ZmZmZmJmOTFjZjYwIiwiZDcxOTFjZmRhZTYxYTZkOTZhMWE5NjQxIiwiZDcxOTFjZmRhZTYxZmZmZmJmYTZkOTZhMWE5NjQxIiwiZDczMDI3ZmM4ZDU5ZmVlMDhiZDllZjhiOTFjZjYwMWE5ODUwIiwiZDczMDI3ZmM4ZDU5ZmVlMDhiZmZmZmJmZDllZjhiOTFjZjYwMWE5ODUwIiwiZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDhiZDllZjhiYTZkOTZhNjZiZDYzMWE5ODUwIiwiZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDhiZmZmZmJmZDllZjhiYTZkOTZhNjZiZDYzMWE5ODUwIiwiYTUwMDI2ZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDhiZDllZjhiYTZkOTZhNjZiZDYzMWE5ODUwMDA2ODM3IiwiYTUwMDI2ZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDhiZmZmZmJmZDllZjhiYTZkOTZhNjZiZDYzMWE5ODUwMDA2ODM3IikubWFwKFVBKSxtaz1RQShmayksZ2s9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmM4ZDU5ZmZmZmJmOTlkNTk0IiwiZDcxOTFjZmRhZTYxYWJkZGE0MmI4M2JhIiwiZDcxOTFjZmRhZTYxZmZmZmJmYWJkZGE0MmI4M2JhIiwiZDUzZTRmZmM4ZDU5ZmVlMDhiZTZmNTk4OTlkNTk0MzI4OGJkIiwiZDUzZTRmZmM4ZDU5ZmVlMDhiZmZmZmJmZTZmNTk4OTlkNTk0MzI4OGJkIiwiZDUzZTRmZjQ2ZDQzZmRhZTYxZmVlMDhiZTZmNTk4YWJkZGE0NjZjMmE1MzI4OGJkIiwiZDUzZTRmZjQ2ZDQzZmRhZTYxZmVlMDhiZmZmZmJmZTZmNTk4YWJkZGE0NjZjMmE1MzI4OGJkIiwiOWUwMTQyZDUzZTRmZjQ2ZDQzZmRhZTYxZmVlMDhiZTZmNTk4YWJkZGE0NjZjMmE1MzI4OGJkNWU0ZmEyIiwiOWUwMTQyZDUzZTRmZjQ2ZDQzZmRhZTYxZmVlMDhiZmZmZmJmZTZmNTk4YWJkZGE0NjZjMmE1MzI4OGJkNWU0ZmEyIikubWFwKFVBKSxfaz1RQShnaykseWs9bmV3IEFycmF5KDMpLmNvbmNhdCgiZTVmNWY5OTlkOGM5MmNhMjVmIiwiZWRmOGZiYjJlMmUyNjZjMmE0MjM4YjQ1IiwiZWRmOGZiYjJlMmUyNjZjMmE0MmNhMjVmMDA2ZDJjIiwiZWRmOGZiY2NlY2U2OTlkOGM5NjZjMmE0MmNhMjVmMDA2ZDJjIiwiZWRmOGZiY2NlY2U2OTlkOGM5NjZjMmE0NDFhZTc2MjM4YjQ1MDA1ODI0IiwiZjdmY2ZkZTVmNWY5Y2NlY2U2OTlkOGM5NjZjMmE0NDFhZTc2MjM4YjQ1MDA1ODI0IiwiZjdmY2ZkZTVmNWY5Y2NlY2U2OTlkOGM5NjZjMmE0NDFhZTc2MjM4YjQ1MDA2ZDJjMDA0NDFiIikubWFwKFVBKSx2az1RQSh5ayksYms9bmV3IEFycmF5KDMpLmNvbmNhdCgiZTBlY2Y0OWViY2RhODg1NmE3IiwiZWRmOGZiYjNjZGUzOGM5NmM2ODg0MTlkIiwiZWRmOGZiYjNjZGUzOGM5NmM2ODg1NmE3ODEwZjdjIiwiZWRmOGZiYmZkM2U2OWViY2RhOGM5NmM2ODg1NmE3ODEwZjdjIiwiZWRmOGZiYmZkM2U2OWViY2RhOGM5NmM2OGM2YmIxODg0MTlkNmUwMTZiIiwiZjdmY2ZkZTBlY2Y0YmZkM2U2OWViY2RhOGM5NmM2OGM2YmIxODg0MTlkNmUwMTZiIiwiZjdmY2ZkZTBlY2Y0YmZkM2U2OWViY2RhOGM5NmM2OGM2YmIxODg0MTlkODEwZjdjNGQwMDRiIikubWFwKFVBKSx4az1RQShiayksd2s9bmV3IEFycmF5KDMpLmNvbmNhdCgiZTBmM2RiYThkZGI1NDNhMmNhIiwiZjBmOWU4YmFlNGJjN2JjY2M0MmI4Y2JlIiwiZjBmOWU4YmFlNGJjN2JjY2M0NDNhMmNhMDg2OGFjIiwiZjBmOWU4Y2NlYmM1YThkZGI1N2JjY2M0NDNhMmNhMDg2OGFjIiwiZjBmOWU4Y2NlYmM1YThkZGI1N2JjY2M0NGViM2QzMmI4Y2JlMDg1ODllIiwiZjdmY2YwZTBmM2RiY2NlYmM1YThkZGI1N2JjY2M0NGViM2QzMmI4Y2JlMDg1ODllIiwiZjdmY2YwZTBmM2RiY2NlYmM1YThkZGI1N2JjY2M0NGViM2QzMmI4Y2JlMDg2OGFjMDg0MDgxIikubWFwKFVBKSxTaz1RQSh3ayksTWs9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmVlOGM4ZmRiYjg0ZTM0YTMzIiwiZmVmMGQ5ZmRjYzhhZmM4ZDU5ZDczMDFmIiwiZmVmMGQ5ZmRjYzhhZmM4ZDU5ZTM0YTMzYjMwMDAwIiwiZmVmMGQ5ZmRkNDllZmRiYjg0ZmM4ZDU5ZTM0YTMzYjMwMDAwIiwiZmVmMGQ5ZmRkNDllZmRiYjg0ZmM4ZDU5ZWY2NTQ4ZDczMDFmOTkwMDAwIiwiZmZmN2VjZmVlOGM4ZmRkNDllZmRiYjg0ZmM4ZDU5ZWY2NTQ4ZDczMDFmOTkwMDAwIiwiZmZmN2VjZmVlOGM4ZmRkNDllZmRiYjg0ZmM4ZDU5ZWY2NTQ4ZDczMDFmYjMwMDAwN2YwMDAwIikubWFwKFVBKSxFaz1RQShNayksVGs9bmV3IEFycmF5KDMpLmNvbmNhdCgiZWNlMmYwYTZiZGRiMWM5MDk5IiwiZjZlZmY3YmRjOWUxNjdhOWNmMDI4MThhIiwiZjZlZmY3YmRjOWUxNjdhOWNmMWM5MDk5MDE2YzU5IiwiZjZlZmY3ZDBkMWU2YTZiZGRiNjdhOWNmMWM5MDk5MDE2YzU5IiwiZjZlZmY3ZDBkMWU2YTZiZGRiNjdhOWNmMzY5MGMwMDI4MThhMDE2NDUwIiwiZmZmN2ZiZWNlMmYwZDBkMWU2YTZiZGRiNjdhOWNmMzY5MGMwMDI4MThhMDE2NDUwIiwiZmZmN2ZiZWNlMmYwZDBkMWU2YTZiZGRiNjdhOWNmMzY5MGMwMDI4MThhMDE2YzU5MDE0NjM2IikubWFwKFVBKSxDaz1RQShUayksQWs9bmV3IEFycmF5KDMpLmNvbmNhdCgiZWNlN2YyYTZiZGRiMmI4Y2JlIiwiZjFlZWY2YmRjOWUxNzRhOWNmMDU3MGIwIiwiZjFlZWY2YmRjOWUxNzRhOWNmMmI4Y2JlMDQ1YThkIiwiZjFlZWY2ZDBkMWU2YTZiZGRiNzRhOWNmMmI4Y2JlMDQ1YThkIiwiZjFlZWY2ZDBkMWU2YTZiZGRiNzRhOWNmMzY5MGMwMDU3MGIwMDM0ZTdiIiwiZmZmN2ZiZWNlN2YyZDBkMWU2YTZiZGRiNzRhOWNmMzY5MGMwMDU3MGIwMDM0ZTdiIiwiZmZmN2ZiZWNlN2YyZDBkMWU2YTZiZGRiNzRhOWNmMzY5MGMwMDU3MGIwMDQ1YThkMDIzODU4IikubWFwKFVBKSxraz1RQShBayksTGs9bmV3IEFycmF5KDMpLmNvbmNhdCgiZTdlMWVmYzk5NGM3ZGQxYzc3IiwiZjFlZWY2ZDdiNWQ4ZGY2NWIwY2UxMjU2IiwiZjFlZWY2ZDdiNWQ4ZGY2NWIwZGQxYzc3OTgwMDQzIiwiZjFlZWY2ZDRiOWRhYzk5NGM3ZGY2NWIwZGQxYzc3OTgwMDQzIiwiZjFlZWY2ZDRiOWRhYzk5NGM3ZGY2NWIwZTcyOThhY2UxMjU2OTEwMDNmIiwiZjdmNGY5ZTdlMWVmZDRiOWRhYzk5NGM3ZGY2NWIwZTcyOThhY2UxMjU2OTEwMDNmIiwiZjdmNGY5ZTdlMWVmZDRiOWRhYzk5NGM3ZGY2NWIwZTcyOThhY2UxMjU2OTgwMDQzNjcwMDFmIikubWFwKFVBKSxQaz1RQShMayksTms9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmRlMGRkZmE5ZmI1YzUxYjhhIiwiZmVlYmUyZmJiNGI5Zjc2OGExYWUwMTdlIiwiZmVlYmUyZmJiNGI5Zjc2OGExYzUxYjhhN2EwMTc3IiwiZmVlYmUyZmNjNWMwZmE5ZmI1Zjc2OGExYzUxYjhhN2EwMTc3IiwiZmVlYmUyZmNjNWMwZmE5ZmI1Zjc2OGExZGQzNDk3YWUwMTdlN2EwMTc3IiwiZmZmN2YzZmRlMGRkZmNjNWMwZmE5ZmI1Zjc2OGExZGQzNDk3YWUwMTdlN2EwMTc3IiwiZmZmN2YzZmRlMGRkZmNjNWMwZmE5ZmI1Zjc2OGExZGQzNDk3YWUwMTdlN2EwMTc3NDkwMDZhIikubWFwKFVBKSxJaz1RQShOayksUms9bmV3IEFycmF5KDMpLmNvbmNhdCgiZWRmOGIxN2ZjZGJiMmM3ZmI4IiwiZmZmZmNjYTFkYWI0NDFiNmM0MjI1ZWE4IiwiZmZmZmNjYTFkYWI0NDFiNmM0MmM3ZmI4MjUzNDk0IiwiZmZmZmNjYzdlOWI0N2ZjZGJiNDFiNmM0MmM3ZmI4MjUzNDk0IiwiZmZmZmNjYzdlOWI0N2ZjZGJiNDFiNmM0MWQ5MWMwMjI1ZWE4MGMyYzg0IiwiZmZmZmQ5ZWRmOGIxYzdlOWI0N2ZjZGJiNDFiNmM0MWQ5MWMwMjI1ZWE4MGMyYzg0IiwiZmZmZmQ5ZWRmOGIxYzdlOWI0N2ZjZGJiNDFiNmM0MWQ5MWMwMjI1ZWE4MjUzNDk0MDgxZDU4IikubWFwKFVBKSxPaz1RQShSayksems9bmV3IEFycmF5KDMpLmNvbmNhdCgiZjdmY2I5YWRkZDhlMzFhMzU0IiwiZmZmZmNjYzJlNjk5NzhjNjc5MjM4NDQzIiwiZmZmZmNjYzJlNjk5NzhjNjc5MzFhMzU0MDA2ODM3IiwiZmZmZmNjZDlmMGEzYWRkZDhlNzhjNjc5MzFhMzU0MDA2ODM3IiwiZmZmZmNjZDlmMGEzYWRkZDhlNzhjNjc5NDFhYjVkMjM4NDQzMDA1YTMyIiwiZmZmZmU1ZjdmY2I5ZDlmMGEzYWRkZDhlNzhjNjc5NDFhYjVkMjM4NDQzMDA1YTMyIiwiZmZmZmU1ZjdmY2I5ZDlmMGEzYWRkZDhlNzhjNjc5NDFhYjVkMjM4NDQzMDA2ODM3MDA0NTI5IikubWFwKFVBKSxEaz1RQSh6ayksQms9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmZmN2JjZmVjNDRmZDk1ZjBlIiwiZmZmZmQ0ZmVkOThlZmU5OTI5Y2M0YzAyIiwiZmZmZmQ0ZmVkOThlZmU5OTI5ZDk1ZjBlOTkzNDA0IiwiZmZmZmQ0ZmVlMzkxZmVjNDRmZmU5OTI5ZDk1ZjBlOTkzNDA0IiwiZmZmZmQ0ZmVlMzkxZmVjNDRmZmU5OTI5ZWM3MDE0Y2M0YzAyOGMyZDA0IiwiZmZmZmU1ZmZmN2JjZmVlMzkxZmVjNDRmZmU5OTI5ZWM3MDE0Y2M0YzAyOGMyZDA0IiwiZmZmZmU1ZmZmN2JjZmVlMzkxZmVjNDRmZmU5OTI5ZWM3MDE0Y2M0YzAyOTkzNDA0NjYyNTA2IikubWFwKFVBKSxIaz1RQShCayksRms9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmZlZGEwZmViMjRjZjAzYjIwIiwiZmZmZmIyZmVjYzVjZmQ4ZDNjZTMxYTFjIiwiZmZmZmIyZmVjYzVjZmQ4ZDNjZjAzYjIwYmQwMDI2IiwiZmZmZmIyZmVkOTc2ZmViMjRjZmQ4ZDNjZjAzYjIwYmQwMDI2IiwiZmZmZmIyZmVkOTc2ZmViMjRjZmQ4ZDNjZmM0ZTJhZTMxYTFjYjEwMDI2IiwiZmZmZmNjZmZlZGEwZmVkOTc2ZmViMjRjZmQ4ZDNjZmM0ZTJhZTMxYTFjYjEwMDI2IiwiZmZmZmNjZmZlZGEwZmVkOTc2ZmViMjRjZmQ4ZDNjZmM0ZTJhZTMxYTFjYmQwMDI2ODAwMDI2IikubWFwKFVBKSxWaz1RQShGayksVWs9bmV3IEFycmF5KDMpLmNvbmNhdCgiZGVlYmY3OWVjYWUxMzE4MmJkIiwiZWZmM2ZmYmRkN2U3NmJhZWQ2MjE3MWI1IiwiZWZmM2ZmYmRkN2U3NmJhZWQ2MzE4MmJkMDg1MTljIiwiZWZmM2ZmYzZkYmVmOWVjYWUxNmJhZWQ2MzE4MmJkMDg1MTljIiwiZWZmM2ZmYzZkYmVmOWVjYWUxNmJhZWQ2NDI5MmM2MjE3MWI1MDg0NTk0IiwiZjdmYmZmZGVlYmY3YzZkYmVmOWVjYWUxNmJhZWQ2NDI5MmM2MjE3MWI1MDg0NTk0IiwiZjdmYmZmZGVlYmY3YzZkYmVmOWVjYWUxNmJhZWQ2NDI5MmM2MjE3MWI1MDg1MTljMDgzMDZiIikubWFwKFVBKSxqaz1RQShVayksR2s9bmV3IEFycmF5KDMpLmNvbmNhdCgiZTVmNWUwYTFkOTliMzFhMzU0IiwiZWRmOGU5YmFlNGIzNzRjNDc2MjM4YjQ1IiwiZWRmOGU5YmFlNGIzNzRjNDc2MzFhMzU0MDA2ZDJjIiwiZWRmOGU5YzdlOWMwYTFkOTliNzRjNDc2MzFhMzU0MDA2ZDJjIiwiZWRmOGU5YzdlOWMwYTFkOTliNzRjNDc2NDFhYjVkMjM4YjQ1MDA1YTMyIiwiZjdmY2Y1ZTVmNWUwYzdlOWMwYTFkOTliNzRjNDc2NDFhYjVkMjM4YjQ1MDA1YTMyIiwiZjdmY2Y1ZTVmNWUwYzdlOWMwYTFkOTliNzRjNDc2NDFhYjVkMjM4YjQ1MDA2ZDJjMDA0NDFiIikubWFwKFVBKSxXaz1RQShHaykscWs9bmV3IEFycmF5KDMpLmNvbmNhdCgiZjBmMGYwYmRiZGJkNjM2MzYzIiwiZjdmN2Y3Y2NjY2NjOTY5Njk2NTI1MjUyIiwiZjdmN2Y3Y2NjY2NjOTY5Njk2NjM2MzYzMjUyNTI1IiwiZjdmN2Y3ZDlkOWQ5YmRiZGJkOTY5Njk2NjM2MzYzMjUyNTI1IiwiZjdmN2Y3ZDlkOWQ5YmRiZGJkOTY5Njk2NzM3MzczNTI1MjUyMjUyNTI1IiwiZmZmZmZmZjBmMGYwZDlkOWQ5YmRiZGJkOTY5Njk2NzM3MzczNTI1MjUyMjUyNTI1IiwiZmZmZmZmZjBmMGYwZDlkOWQ5YmRiZGJkOTY5Njk2NzM3MzczNTI1MjUyMjUyNTI1MDAwMDAwIikubWFwKFVBKSxZaz1RQShxayksWGs9bmV3IEFycmF5KDMpLmNvbmNhdCgiZWZlZGY1YmNiZGRjNzU2YmIxIiwiZjJmMGY3Y2JjOWUyOWU5YWM4NmE1MWEzIiwiZjJmMGY3Y2JjOWUyOWU5YWM4NzU2YmIxNTQyNzhmIiwiZjJmMGY3ZGFkYWViYmNiZGRjOWU5YWM4NzU2YmIxNTQyNzhmIiwiZjJmMGY3ZGFkYWViYmNiZGRjOWU5YWM4ODA3ZGJhNmE1MWEzNGExNDg2IiwiZmNmYmZkZWZlZGY1ZGFkYWViYmNiZGRjOWU5YWM4ODA3ZGJhNmE1MWEzNGExNDg2IiwiZmNmYmZkZWZlZGY1ZGFkYWViYmNiZGRjOWU5YWM4ODA3ZGJhNmE1MWEzNTQyNzhmM2YwMDdkIikubWFwKFVBKSwkaz1RQShYayksS2s9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmVlMGQyZmM5MjcyZGUyZDI2IiwiZmVlNWQ5ZmNhZTkxZmI2YTRhY2IxODFkIiwiZmVlNWQ5ZmNhZTkxZmI2YTRhZGUyZDI2YTUwZjE1IiwiZmVlNWQ5ZmNiYmExZmM5MjcyZmI2YTRhZGUyZDI2YTUwZjE1IiwiZmVlNWQ5ZmNiYmExZmM5MjcyZmI2YTRhZWYzYjJjY2IxODFkOTkwMDBkIiwiZmZmNWYwZmVlMGQyZmNiYmExZmM5MjcyZmI2YTRhZWYzYjJjY2IxODFkOTkwMDBkIiwiZmZmNWYwZmVlMGQyZmNiYmExZmM5MjcyZmI2YTRhZWYzYjJjY2IxODFkYTUwZjE1NjcwMDBkIikubWFwKFVBKSxaaz1RQShLayksSms9bmV3IEFycmF5KDMpLmNvbmNhdCgiZmVlNmNlZmRhZTZiZTY1NTBkIiwiZmVlZGRlZmRiZTg1ZmQ4ZDNjZDk0NzAxIiwiZmVlZGRlZmRiZTg1ZmQ4ZDNjZTY1NTBkYTYzNjAzIiwiZmVlZGRlZmRkMGEyZmRhZTZiZmQ4ZDNjZTY1NTBkYTYzNjAzIiwiZmVlZGRlZmRkMGEyZmRhZTZiZmQ4ZDNjZjE2OTEzZDk0ODAxOGMyZDA0IiwiZmZmNWViZmVlNmNlZmRkMGEyZmRhZTZiZmQ4ZDNjZjE2OTEzZDk0ODAxOGMyZDA0IiwiZmZmNWViZmVlNmNlZmRkMGEyZmRhZTZiZmQ4ZDNjZjE2OTEzZDk0ODAxYTYzNjAzN2YyNzA0IikubWFwKFVBKSxRaz1RQShKayk7dmFyIHRMPU9wKEZkKDMwMCwuNSwwKSxGZCgtMjQwLC41LDEpKSxlTD1PcChGZCgtMTAwLC43NSwuMzUpLEZkKDgwLDEuNSwuOCkpLG5MPU9wKEZkKDI2MCwuNzUsLjM1KSxGZCg4MCwxLjUsLjgpKSxpTD1GZCgpO3ZhciByTD1uZCgpLG9MPU1hdGguUEkvMyxhTD0yKk1hdGguUEkvMztmdW5jdGlvbiBzTCh0KXt2YXIgZT10Lmxlbmd0aDtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHRbTWF0aC5tYXgoMCxNYXRoLm1pbihlLTEsTWF0aC5mbG9vcihuKmUpKSldfX12YXIgbEw9c0woVUEoIjQ0MDE1NDQ0MDI1NjQ1MDQ1NzQ1MDU1OTQ2MDc1YTQ2MDg1YzQ2MGE1ZDQ2MGI1ZTQ3MGQ2MDQ3MGU2MTQ3MTA2MzQ3MTE2NDQ3MTM2NTQ4MTQ2NzQ4MTY2ODQ4MTc2OTQ4MTg2YTQ4MWE2YzQ4MWI2ZDQ4MWM2ZTQ4MWQ2ZjQ4MWY3MDQ4MjA3MTQ4MjE3MzQ4MjM3NDQ4MjQ3NTQ4MjU3NjQ4MjY3NzQ4Mjg3ODQ4Mjk3OTQ3MmE3YTQ3MmM3YTQ3MmQ3YjQ3MmU3YzQ3MmY3ZDQ2MzA3ZTQ2MzI3ZTQ2MzM3ZjQ2MzQ4MDQ1MzU4MTQ1Mzc4MTQ1Mzg4MjQ0Mzk4MzQ0M2E4MzQ0M2I4NDQzM2Q4NDQzM2U4NTQyM2Y4NTQyNDA4NjQyNDE4NjQxNDI4NzQxNDQ4NzQwNDU4ODQwNDY4ODNmNDc4ODNmNDg4OTNlNDk4OTNlNGE4OTNlNGM4YTNkNGQ4YTNkNGU4YTNjNGY4YTNjNTA4YjNiNTE4YjNiNTI4YjNhNTM4YjNhNTQ4YzM5NTU4YzM5NTY4YzM4NTg4YzM4NTk4YzM3NWE4YzM3NWI4ZDM2NWM4ZDM2NWQ4ZDM1NWU4ZDM1NWY4ZDM0NjA4ZDM0NjE4ZDMzNjI4ZDMzNjM4ZDMyNjQ4ZTMyNjU4ZTMxNjY4ZTMxNjc4ZTMxNjg4ZTMwNjk4ZTMwNmE4ZTJmNmI4ZTJmNmM4ZTJlNmQ4ZTJlNmU4ZTJlNmY4ZTJkNzA4ZTJkNzE4ZTJjNzE4ZTJjNzI4ZTJjNzM4ZTJiNzQ4ZTJiNzU4ZTJhNzY4ZTJhNzc4ZTJhNzg4ZTI5Nzk4ZTI5N2E4ZTI5N2I4ZTI4N2M4ZTI4N2Q4ZTI3N2U4ZTI3N2Y4ZTI3ODA4ZTI2ODE4ZTI2ODI4ZTI2ODI4ZTI1ODM4ZTI1ODQ4ZTI1ODU4ZTI0ODY4ZTI0ODc4ZTIzODg4ZTIzODk4ZTIzOGE4ZDIyOGI4ZDIyOGM4ZDIyOGQ4ZDIxOGU4ZDIxOGY4ZDIxOTA4ZDIxOTE4YzIwOTI4YzIwOTI4YzIwOTM4YzFmOTQ4YzFmOTU4YjFmOTY4YjFmOTc4YjFmOTg4YjFmOTk4YTFmOWE4YTFlOWI4YTFlOWM4OTFlOWQ4OTFmOWU4OTFmOWY4ODFmYTA4ODFmYTE4ODFmYTE4NzFmYTI4NzIwYTM4NjIwYTQ4NjIxYTU4NTIxYTY4NTIyYTc4NTIyYTg4NDIzYTk4MzI0YWE4MzI1YWI4MjI1YWM4MjI2YWQ4MTI3YWQ4MTI4YWU4MDI5YWY3ZjJhYjA3ZjJjYjE3ZTJkYjI3ZDJlYjM3YzJmYjQ3YzMxYjU3YjMyYjY3YTM0YjY3OTM1Yjc3OTM3Yjg3ODM4Yjk3NzNhYmE3NjNiYmI3NTNkYmM3NDNmYmM3MzQwYmQ3MjQyYmU3MTQ0YmY3MDQ2YzA2ZjQ4YzE2ZTRhYzE2ZDRjYzI2YzRlYzM2YjUwYzQ2YTUyYzU2OTU0YzU2ODU2YzY2NzU4Yzc2NTVhYzg2NDVjYzg2MzVlYzk2MjYwY2E2MDYzY2I1ZjY1Y2I1ZTY3Y2M1YzY5Y2Q1YjZjY2Q1YTZlY2U1ODcwY2Y1NzczZDA1Njc1ZDA1NDc3ZDE1MzdhZDE1MTdjZDI1MDdmZDM0ZTgxZDM0ZDg0ZDQ0Yjg2ZDU0OTg5ZDU0ODhiZDY0NjhlZDY0NTkwZDc0MzkzZDc0MTk1ZDg0MDk4ZDgzZTliZDkzYzlkZDkzYmEwZGEzOWEyZGEzN2E1ZGIzNmE4ZGIzNGFhZGMzMmFkZGMzMGIwZGQyZmIyZGQyZGI1ZGUyYmI4ZGUyOWJhZGUyOGJkZGYyNmMwZGYyNWMyZGYyM2M1ZTAyMWM4ZTAyMGNhZTExZmNkZTExZGQwZTExY2QyZTIxYmQ1ZTIxYWQ4ZTIxOWRhZTMxOWRkZTMxOGRmZTMxOGUyZTQxOGU1ZTQxOWU3ZTQxOWVhZTUxYWVjZTUxYmVmZTUxY2YxZTUxZGY0ZTYxZWY2ZTYyMGY4ZTYyMWZiZTcyM2ZkZTcyNSIpKSxjTD1zTChVQSgiMDAwMDA0MDEwMDA1MDEwMTA2MDEwMTA4MDIwMTA5MDIwMjBiMDIwMjBkMDMwMzBmMDMwMzEyMDQwNDE0MDUwNDE2MDYwNTE4MDYwNTFhMDcwNjFjMDgwNzFlMDkwNzIwMGEwODIyMGIwOTI0MGMwOTI2MGQwYTI5MGUwYjJiMTAwYjJkMTEwYzJmMTIwZDMxMTMwZDM0MTQwZTM2MTUwZTM4MTYwZjNiMTgwZjNkMTkxMDNmMWExMDQyMWMxMDQ0MWQxMTQ3MWUxMTQ5MjAxMTRiMjExMTRlMjIxMTUwMjQxMjUzMjUxMjU1MjcxMjU4MjkxMTVhMmExMTVjMmMxMTVmMmQxMTYxMmYxMTYzMzExMTY1MzMxMDY3MzQxMDY5MzYxMDZiMzgxMDZjMzkwZjZlM2IwZjcwM2QwZjcxM2YwZjcyNDAwZjc0NDIwZjc1NDQwZjc2NDUxMDc3NDcxMDc4NDkxMDc4NGExMDc5NGMxMTdhNGUxMTdiNGYxMjdiNTExMjdjNTIxMzdjNTQxMzdkNTYxNDdkNTcxNTdlNTkxNTdlNWExNjdlNWMxNjdmNWQxNzdmNWYxODdmNjAxODgwNjIxOTgwNjQxYTgwNjUxYTgwNjcxYjgwNjgxYzgxNmExYzgxNmIxZDgxNmQxZDgxNmUxZTgxNzAxZjgxNzIxZjgxNzMyMDgxNzUyMTgxNzYyMTgxNzgyMjgxNzkyMjgyN2IyMzgyN2MyMzgyN2UyNDgyODAyNTgyODEyNTgxODMyNjgxODQyNjgxODYyNzgxODgyNzgxODkyODgxOGIyOTgxOGMyOTgxOGUyYTgxOTAyYTgxOTEyYjgxOTMyYjgwOTQyYzgwOTYyYzgwOTgyZDgwOTkyZDgwOWIyZTdmOWMyZTdmOWUyZjdmYTAyZjdmYTEzMDdlYTMzMDdlYTUzMTdlYTYzMTdkYTgzMjdkYWEzMzdkYWIzMzdjYWQzNDdjYWUzNDdiYjAzNTdiYjIzNTdiYjMzNjdhYjUzNjdhYjczNzc5YjgzNzc5YmEzODc4YmMzOTc4YmQzOTc3YmYzYTc3YzAzYTc2YzIzYjc1YzQzYzc1YzUzYzc0YzczZDczYzgzZTczY2EzZTcyY2MzZjcxY2Q0MDcxY2Y0MDcwZDA0MTZmZDI0MjZmZDM0MzZlZDU0NDZkZDY0NTZjZDg0NTZjZDk0NjZiZGI0NzZhZGM0ODY5ZGU0OTY4ZGY0YTY4ZTA0YzY3ZTI0ZDY2ZTM0ZTY1ZTQ0ZjY0ZTU1MDY0ZTc1MjYzZTg1MzYyZTk1NDYyZWE1NjYxZWI1NzYwZWM1ODYwZWQ1YTVmZWU1YjVlZWY1ZDVlZjA1ZjVlZjE2MDVkZjI2MjVkZjI2NDVjZjM2NTVjZjQ2NzVjZjQ2OTVjZjU2YjVjZjY2YzVjZjY2ZTVjZjc3MDVjZjc3MjVjZjg3NDVjZjg3NjVjZjk3ODVkZjk3OTVkZjk3YjVkZmE3ZDVlZmE3ZjVlZmE4MTVmZmI4MzVmZmI4NTYwZmI4NzYxZmM4OTYxZmM4YTYyZmM4YzYzZmM4ZTY0ZmM5MDY1ZmQ5MjY2ZmQ5NDY3ZmQ5NjY4ZmQ5ODY5ZmQ5YTZhZmQ5YjZiZmU5ZDZjZmU5ZjZkZmVhMTZlZmVhMzZmZmVhNTcxZmVhNzcyZmVhOTczZmVhYTc0ZmVhYzc2ZmVhZTc3ZmViMDc4ZmViMjdhZmViNDdiZmViNjdjZmViNzdlZmViOTdmZmViYjgxZmViZDgyZmViZjg0ZmVjMTg1ZmVjMjg3ZmVjNDg4ZmVjNjhhZmVjODhjZmVjYThkZmVjYzhmZmVjZDkwZmVjZjkyZmVkMTk0ZmVkMzk1ZmVkNTk3ZmVkNzk5ZmVkODlhZmRkYTljZmRkYzllZmRkZWEwZmRlMGExZmRlMmEzZmRlM2E1ZmRlNWE3ZmRlN2E5ZmRlOWFhZmRlYmFjZmNlY2FlZmNlZWIwZmNmMGIyZmNmMmI0ZmNmNGI2ZmNmNmI4ZmNmN2I5ZmNmOWJiZmNmYmJkZmNmZGJmIikpLHVMPXNMKFVBKCIwMDAwMDQwMTAwMDUwMTAxMDYwMTAxMDgwMjAxMGEwMjAyMGMwMjAyMGUwMzAyMTAwNDAzMTIwNDAzMTQwNTA0MTcwNjA0MTkwNzA1MWIwODA1MWQwOTA2MWYwYTA3MjIwYjA3MjQwYzA4MjYwZDA4MjkwZTA5MmIxMDA5MmQxMTBhMzAxMjBhMzIxNDBiMzQxNTBiMzcxNjBiMzkxODBjM2MxOTBjM2UxYjBjNDExYzBjNDMxZTBjNDUxZjBjNDgyMTBjNGEyMzBjNGMyNDBjNGYyNjBjNTEyODBiNTMyOTBiNTUyYjBiNTcyZDBiNTkyZjBhNWIzMTBhNWMzMjBhNWUzNDBhNWYzNjA5NjEzODA5NjIzOTA5NjMzYjA5NjQzZDA5NjUzZTA5NjY0MDBhNjc0MjBhNjg0NDBhNjg0NTBhNjk0NzBiNmE0OTBiNmE0YTBjNmI0YzBjNmI0ZDBkNmM0ZjBkNmM1MTBlNmM1MjBlNmQ1NDBmNmQ1NTBmNmQ1NzEwNmU1OTEwNmU1YTExNmU1YzEyNmU1ZDEyNmU1ZjEzNmU2MTEzNmU2MjE0NmU2NDE1NmU2NTE1NmU2NzE2NmU2OTE2NmU2YTE3NmU2YzE4NmU2ZDE4NmU2ZjE5NmU3MTE5NmU3MjFhNmU3NDFhNmU3NTFiNmU3NzFjNmQ3ODFjNmQ3YTFkNmQ3YzFkNmQ3ZDFlNmQ3ZjFlNmM4MDFmNmM4MjIwNmM4NDIwNmI4NTIxNmI4NzIxNmI4ODIyNmE4YTIyNmE4YzIzNjk4ZDIzNjk4ZjI0Njk5MDI1Njg5MjI1Njg5MzI2Njc5NTI2Njc5NzI3NjY5ODI3NjY5YTI4NjU5YjI5NjQ5ZDI5NjQ5ZjJhNjNhMDJhNjNhMjJiNjJhMzJjNjFhNTJjNjBhNjJkNjBhODJlNWZhOTJlNWVhYjJmNWVhZDMwNWRhZTMwNWNiMDMxNWJiMTMyNWFiMzMyNWFiNDMzNTliNjM0NThiNzM1NTdiOTM1NTZiYTM2NTViYzM3NTRiZDM4NTNiZjM5NTJjMDNhNTFjMTNhNTBjMzNiNGZjNDNjNGVjNjNkNGRjNzNlNGNjODNmNGJjYTQwNGFjYjQxNDljYzQyNDhjZTQzNDdjZjQ0NDZkMDQ1NDVkMjQ2NDRkMzQ3NDNkNDQ4NDJkNTRhNDFkNzRiM2ZkODRjM2VkOTRkM2RkYTRlM2NkYjUwM2JkZDUxM2FkZTUyMzhkZjUzMzdlMDU1MzZlMTU2MzVlMjU3MzRlMzU5MzNlNDVhMzFlNTVjMzBlNjVkMmZlNzVlMmVlODYwMmRlOTYxMmJlYTYzMmFlYjY0MjllYjY2MjhlYzY3MjZlZDY5MjVlZTZhMjRlZjZjMjNlZjZlMjFmMDZmMjBmMTcxMWZmMTczMWRmMjc0MWNmMzc2MWJmMzc4MTlmNDc5MThmNTdiMTdmNTdkMTVmNjdlMTRmNjgwMTNmNzgyMTJmNzg0MTBmODg1MGZmODg3MGVmODg5MGNmOThiMGJmOThjMGFmOThlMDlmYTkwMDhmYTkyMDdmYTk0MDdmYjk2MDZmYjk3MDZmYjk5MDZmYjliMDZmYjlkMDdmYzlmMDdmY2ExMDhmY2EzMDlmY2E1MGFmY2E2MGNmY2E4MGRmY2FhMGZmY2FjMTFmY2FlMTJmY2IwMTRmY2IyMTZmY2I0MThmYmI2MWFmYmI4MWRmYmJhMWZmYmJjMjFmYmJlMjNmYWMwMjZmYWMyMjhmYWM0MmFmYWM2MmRmOWM3MmZmOWM5MzJmOWNiMzVmOGNkMzdmOGNmM2FmN2QxM2RmN2QzNDBmNmQ1NDNmNmQ3NDZmNWQ5NDlmNWRiNGNmNGRkNGZmNGRmNTNmNGUxNTZmM2UzNWFmM2U1NWRmMmU2NjFmMmU4NjVmMmVhNjlmMWVjNmRmMWVkNzFmMWVmNzVmMWYxNzlmMmYyN2RmMmY0ODJmM2Y1ODZmM2Y2OGFmNGY4OGVmNWY5OTJmNmZhOTZmOGZiOWFmOWZjOWRmYWZkYTFmY2ZmYTQiKSksaEw9c0woVUEoIjBkMDg4NzEwMDc4ODEzMDc4OTE2MDc4YTE5MDY4YzFiMDY4ZDFkMDY4ZTIwMDY4ZjIyMDY5MDI0MDY5MTI2MDU5MTI4MDU5MjJhMDU5MzJjMDU5NDJlMDU5NTJmMDU5NjMxMDU5NzMzMDU5NzM1MDQ5ODM3MDQ5OTM4MDQ5YTNhMDQ5YTNjMDQ5YjNlMDQ5YzNmMDQ5YzQxMDQ5ZDQzMDM5ZTQ0MDM5ZTQ2MDM5ZjQ4MDM5ZjQ5MDNhMDRiMDNhMTRjMDJhMTRlMDJhMjUwMDJhMjUxMDJhMzUzMDJhMzU1MDJhNDU2MDFhNDU4MDFhNDU5MDFhNTViMDFhNTVjMDFhNjVlMDFhNjYwMDFhNjYxMDBhNzYzMDBhNzY0MDBhNzY2MDBhNzY3MDBhODY5MDBhODZhMDBhODZjMDBhODZlMDBhODZmMDBhODcxMDBhODcyMDFhODc0MDFhODc1MDFhODc3MDFhODc4MDFhODdhMDJhODdiMDJhODdkMDNhODdlMDNhODgwMDRhODgxMDRhNzgzMDVhNzg0MDVhNzg2MDZhNjg3MDdhNjg4MDhhNjhhMDlhNThiMGFhNThkMGJhNThlMGNhNDhmMGRhNDkxMGVhMzkyMGZhMzk0MTBhMjk1MTFhMTk2MTNhMTk4MTRhMDk5MTU5ZjlhMTY5ZjljMTc5ZTlkMTg5ZDllMTk5ZGEwMWE5Y2ExMWI5YmEyMWQ5YWEzMWU5YWE1MWY5OWE2MjA5OGE3MjE5N2E4MjI5NmFhMjM5NWFiMjQ5NGFjMjY5NGFkMjc5M2FlMjg5MmIwMjk5MWIxMmE5MGIyMmI4ZmIzMmM4ZWI0MmU4ZGI1MmY4Y2I2MzA4YmI3MzE4YWI4MzI4OWJhMzM4OGJiMzQ4OGJjMzU4N2JkMzc4NmJlMzg4NWJmMzk4NGMwM2E4M2MxM2I4MmMyM2M4MWMzM2Q4MGM0M2U3ZmM1NDA3ZWM2NDE3ZGM3NDI3Y2M4NDM3YmM5NDQ3YWNhNDU3YWNiNDY3OWNjNDc3OGNjNDk3N2NkNGE3NmNlNGI3NWNmNGM3NGQwNGQ3M2QxNGU3MmQyNGY3MWQzNTE3MWQ0NTI3MGQ1NTM2ZmQ1NTQ2ZWQ2NTU2ZGQ3NTY2Y2Q4NTc2YmQ5NTg2YWRhNWE2YWRhNWI2OWRiNWM2OGRjNWQ2N2RkNWU2NmRlNWY2NWRlNjE2NGRmNjI2M2UwNjM2M2UxNjQ2MmUyNjU2MWUyNjY2MGUzNjg1ZmU0Njk1ZWU1NmE1ZGU1NmI1ZGU2NmM1Y2U3NmU1YmU3NmY1YWU4NzA1OWU5NzE1OGU5NzI1N2VhNzQ1N2ViNzU1NmViNzY1NWVjNzc1NGVkNzk1M2VkN2E1MmVlN2I1MWVmN2M1MWVmN2U1MGYwN2Y0ZmYwODA0ZWYxODE0ZGYxODM0Y2YyODQ0YmYzODU0YmYzODc0YWY0ODg0OWY0ODk0OGY1OGI0N2Y1OGM0NmY2OGQ0NWY2OGY0NGY3OTA0NGY3OTE0M2Y3OTM0MmY4OTQ0MWY4OTU0MGY5OTczZmY5OTgzZWY5OWEzZWZhOWIzZGZhOWMzY2ZhOWUzYmZiOWYzYWZiYTEzOWZiYTIzOGZjYTMzOGZjYTUzN2ZjYTYzNmZjYTgzNWZjYTkzNGZkYWIzM2ZkYWMzM2ZkYWUzMmZkYWYzMWZkYjEzMGZkYjIyZmZkYjQyZmZkYjUyZWZlYjcyZGZlYjgyY2ZlYmEyY2ZlYmIyYmZlYmQyYWZlYmUyYWZlYzAyOWZkYzIyOWZkYzMyOGZkYzUyN2ZkYzYyN2ZkYzgyN2ZkY2EyNmZkY2IyNmZjY2QyNWZjY2UyNWZjZDAyNWZjZDIyNWZiZDMyNGZiZDUyNGZiZDcyNGZhZDgyNGZhZGEyNGY5ZGMyNGY5ZGQyNWY4ZGYyNWY4ZTEyNWY3ZTIyNWY3ZTQyNWY2ZTYyNmY2ZTgyNmY1ZTkyNmY1ZWIyN2Y0ZWQyN2YzZWUyN2YzZjAyN2YyZjIyN2YxZjQyNmYxZjUyNWYwZjcyNGYwZjkyMSIpKTtmdW5jdGlvbiBkTCh0KXtyZXR1cm4gZnVuY3Rpb24gZSgpe3JldHVybiB0fX12YXIgcEw9TWF0aC5hYnMsZkw9TWF0aC5hdGFuMixtTD1NYXRoLmNvcyxnTD1NYXRoLm1heCxfTD1NYXRoLm1pbix5TD1NYXRoLnNpbix2TD1NYXRoLnNxcnQsYkw9MWUtMTIseEw9TWF0aC5QSSx3TD14TC8yLFNMPTIqeEw7ZnVuY3Rpb24gTUwodCl7cmV0dXJuIHQ+MT8wOnQ8LTE/eEw6TWF0aC5hY29zKHQpfWZ1bmN0aW9uIEVMKHQpe3JldHVybiB0Pj0xP3dMOnQ8PS0xPy13TDpNYXRoLmFzaW4odCl9ZnVuY3Rpb24gVEwodCl7cmV0dXJuIHQuaW5uZXJSYWRpdXN9ZnVuY3Rpb24gQ0wodCl7cmV0dXJuIHQub3V0ZXJSYWRpdXN9ZnVuY3Rpb24gQUwodCl7cmV0dXJuIHQuc3RhcnRBbmdsZX1mdW5jdGlvbiBrTCh0KXtyZXR1cm4gdC5lbmRBbmdsZX1mdW5jdGlvbiBMTCh0KXtyZXR1cm4gdCYmdC5wYWRBbmdsZX1mdW5jdGlvbiBQTCh0LGUsbixpLHIsbyxhLHMpe3ZhciBsPW4tdCxjPWktZSx1PWEtcixoPXMtbyxkPWgqbC11KmM7aWYoIShkKmQ8YkwpKXJldHVyblt0KyhkPSh1KihlLW8pLWgqKHQtcikpL2QpKmwsZStkKmNdfWZ1bmN0aW9uIE5MKHQsZSxuLGkscixvLGEpe3ZhciBzPXQtbixsPWUtaSxjPShhP286LW8pL3ZMKHMqcytsKmwpLHU9YypsLGg9LWMqcyxkPXQrdSxwPWUraCxmPW4rdSxtPWkraCxnPShkK2YpLzIsXz0ocCttKS8yLHk9Zi1kLHY9bS1wLGI9eSp5K3Yqdix4PXItbyx3PWQqbS1mKnAsUz0odjwwPy0xOjEpKnZMKGdMKDAseCp4KmItdyp3KSksTT0odyp2LXkqUykvYixFPSgtdyp5LXYqUykvYixUPSh3KnYreSpTKS9iLEM9KC13KnkrdipTKS9iLEE9TS1nLGs9RS1fLEw9VC1nLFA9Qy1fO3JldHVybiBBKkErayprPkwqTCtQKlAmJihNPVQsRT1DKSx7Y3g6TSxjeTpFLHgwMTotdSx5MDE6LWgseDExOk0qKHIveC0xKSx5MTE6RSooci94LTEpfX1mdW5jdGlvbiBJTCh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gUkwodCl7cmV0dXJuIG5ldyBJTCh0KX1mdW5jdGlvbiBPTCh0KXtyZXR1cm4gdFswXX1mdW5jdGlvbiB6TCh0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiBETCgpe3ZhciB0PU9MLGU9ekwsbj1kTCghMCksaT1udWxsLHI9Ukwsbz1udWxsO2Z1bmN0aW9uIGEoYSl7dmFyIHMsbCxjLHU9YS5sZW5ndGgsaD0hMTtmb3IobnVsbD09aSYmKG89cihjPU9nKCkpKSxzPTA7czw9dTsrK3MpIShzPHUmJm4obD1hW3NdLHMsYSkpPT09aCYmKChoPSFoKT9vLmxpbmVTdGFydCgpOm8ubGluZUVuZCgpKSxoJiZvLnBvaW50KCt0KGwscyxhKSwrZShsLHMsYSkpO2lmKGMpcmV0dXJuIG89bnVsbCxjKyIifHxudWxsfXJldHVybiBhLng9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpkTCgrZSksYSk6dH0sYS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ZEwoK3QpLGEpOmV9LGEuZGVmaW5lZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmRMKCEhdCksYSk6bn0sYS5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG51bGwhPWkmJihvPXIoaSkpLGEpOnJ9LGEuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09dD9pPW89bnVsbDpvPXIoaT10KSxhKTppfSxhfWZ1bmN0aW9uIEJMKCl7dmFyIHQ9T0wsZT1udWxsLG49ZEwoMCksaT16TCxyPWRMKCEwKSxvPW51bGwsYT1STCxzPW51bGw7ZnVuY3Rpb24gbChsKXt2YXIgYyx1LGgsZCxwLGY9bC5sZW5ndGgsbT0hMSxnPW5ldyBBcnJheShmKSxfPW5ldyBBcnJheShmKTtmb3IobnVsbD09byYmKHM9YShwPU9nKCkpKSxjPTA7Yzw9ZjsrK2Mpe2lmKCEoYzxmJiZyKGQ9bFtjXSxjLGwpKT09PW0paWYobT0hbSl1PWMscy5hcmVhU3RhcnQoKSxzLmxpbmVTdGFydCgpO2Vsc2V7Zm9yKHMubGluZUVuZCgpLHMubGluZVN0YXJ0KCksaD1jLTE7aD49dTstLWgpcy5wb2ludChnW2hdLF9baF0pO3MubGluZUVuZCgpLHMuYXJlYUVuZCgpfW0mJihnW2NdPSt0KGQsYyxsKSxfW2NdPStuKGQsYyxsKSxzLnBvaW50KGU/K2UoZCxjLGwpOmdbY10saT8raShkLGMsbCk6X1tjXSkpfWlmKHApcmV0dXJuIHM9bnVsbCxwKyIifHxudWxsfWZ1bmN0aW9uIGMoKXtyZXR1cm4gREwoKS5kZWZpbmVkKHIpLmN1cnZlKGEpLmNvbnRleHQobyl9cmV0dXJuIGwueD1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2Ygbj9uOmRMKCtuKSxlPW51bGwsbCk6dH0sbC54MD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOmRMKCtlKSxsKTp0fSxsLngxPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW51bGw9PXQ/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OmRMKCt0KSxsKTplfSxsLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpkTCgrdCksaT1udWxsLGwpOm59LGwueTA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpkTCgrdCksbCk6bn0sbC55MT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1udWxsPT10P251bGw6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpkTCgrdCksbCk6aX0sbC5saW5lWDA9bC5saW5lWTA9ZnVuY3Rpb24oKXtyZXR1cm4gYygpLngodCkueShuKX0sbC5saW5lWTE9ZnVuY3Rpb24oKXtyZXR1cm4gYygpLngodCkueShpKX0sbC5saW5lWDE9ZnVuY3Rpb24oKXtyZXR1cm4gYygpLngoZSkueShuKX0sbC5kZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ZEwoISF0KSxsKTpyfSxsLmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQsbnVsbCE9byYmKHM9YShvKSksbCk6YX0sbC5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P289cz1udWxsOnM9YShvPXQpLGwpOm99LGx9ZnVuY3Rpb24gSEwodCxlKXtyZXR1cm4gZTx0Py0xOmU+dD8xOmU+PXQ/MDpOYU59ZnVuY3Rpb24gRkwodCl7cmV0dXJuIHR9SUwucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxlKXtzd2l0Y2godD0rdCxlPStlLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsZSk6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxlKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjtkZWZhdWx0OnRoaXMuX2NvbnRleHQubGluZVRvKHQsZSl9fX07dmFyIFZMPWpMKFJMKTtmdW5jdGlvbiBVTCh0KXt0aGlzLl9jdXJ2ZT10fWZ1bmN0aW9uIGpMKHQpe2Z1bmN0aW9uIGUoZSl7cmV0dXJuIG5ldyBVTCh0KGUpKX1yZXR1cm4gZS5fY3VydmU9dCxlfWZ1bmN0aW9uIEdMKHQpe3ZhciBlPXQuY3VydmU7cmV0dXJuIHQuYW5nbGU9dC54LGRlbGV0ZSB0LngsdC5yYWRpdXM9dC55LGRlbGV0ZSB0LnksdC5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9lKGpMKHQpKTplKCkuX2N1cnZlfSx0fWZ1bmN0aW9uIFdMKCl7cmV0dXJuIEdMKERMKCkuY3VydmUoVkwpKX1mdW5jdGlvbiBxTCgpe3ZhciB0PUJMKCkuY3VydmUoVkwpLGU9dC5jdXJ2ZSxuPXQubGluZVgwLGk9dC5saW5lWDEscj10LmxpbmVZMCxvPXQubGluZVkxO3JldHVybiB0LmFuZ2xlPXQueCxkZWxldGUgdC54LHQuc3RhcnRBbmdsZT10LngwLGRlbGV0ZSB0LngwLHQuZW5kQW5nbGU9dC54MSxkZWxldGUgdC54MSx0LnJhZGl1cz10LnksZGVsZXRlIHQueSx0LmlubmVyUmFkaXVzPXQueTAsZGVsZXRlIHQueTAsdC5vdXRlclJhZGl1cz10LnkxLGRlbGV0ZSB0LnkxLHQubGluZVN0YXJ0QW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gR0wobigpKX0sZGVsZXRlIHQubGluZVgwLHQubGluZUVuZEFuZ2xlPWZ1bmN0aW9uKCl7cmV0dXJuIEdMKGkoKSl9LGRlbGV0ZSB0LmxpbmVYMSx0LmxpbmVJbm5lclJhZGl1cz1mdW5jdGlvbigpe3JldHVybiBHTChyKCkpfSxkZWxldGUgdC5saW5lWTAsdC5saW5lT3V0ZXJSYWRpdXM9ZnVuY3Rpb24oKXtyZXR1cm4gR0wobygpKX0sZGVsZXRlIHQubGluZVkxLHQuY3VydmU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/ZShqTCh0KSk6ZSgpLl9jdXJ2ZX0sdH1mdW5jdGlvbiBZTCh0LGUpe3JldHVyblsoZT0rZSkqTWF0aC5jb3ModC09TWF0aC5QSS8yKSxlKk1hdGguc2luKHQpXX1VTC5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmFyZWFTdGFydCgpfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUuYXJlYUVuZCgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmxpbmVFbmQoKX0scG9pbnQ6ZnVuY3Rpb24odCxlKXt0aGlzLl9jdXJ2ZS5wb2ludChlKk1hdGguc2luKHQpLGUqLU1hdGguY29zKHQpKX19O3ZhciBYTD1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZnVuY3Rpb24gJEwodCl7cmV0dXJuIHQuc291cmNlfWZ1bmN0aW9uIEtMKHQpe3JldHVybiB0LnRhcmdldH1mdW5jdGlvbiBaTCh0KXt2YXIgZT0kTCxuPUtMLGk9T0wscj16TCxvPW51bGw7ZnVuY3Rpb24gYSgpe3ZhciBhLHM9WEwuY2FsbChhcmd1bWVudHMpLGw9ZS5hcHBseSh0aGlzLHMpLGM9bi5hcHBseSh0aGlzLHMpO2lmKG98fChvPWE9T2coKSksdChvLCtpLmFwcGx5KHRoaXMsKHNbMF09bCxzKSksK3IuYXBwbHkodGhpcyxzKSwraS5hcHBseSh0aGlzLChzWzBdPWMscykpLCtyLmFwcGx5KHRoaXMscykpLGEpcmV0dXJuIG89bnVsbCxhKyIifHxudWxsfXJldHVybiBhLnNvdXJjZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LGEpOmV9LGEudGFyZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsYSk6bn0sYS54PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ZEwoK3QpLGEpOml9LGEueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmRMKCt0KSxhKTpyfSxhLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bnVsbD09dD9udWxsOnQsYSk6b30sYX1mdW5jdGlvbiBKTCh0LGUsbixpLHIpe3QubW92ZVRvKGUsbiksdC5iZXppZXJDdXJ2ZVRvKGU9KGUraSkvMixuLGUscixpLHIpfWZ1bmN0aW9uIFFMKHQsZSxuLGkscil7dC5tb3ZlVG8oZSxuKSx0LmJlemllckN1cnZlVG8oZSxuPShuK3IpLzIsaSxuLGkscil9ZnVuY3Rpb24gdFAodCxlLG4saSxyKXt2YXIgbz1ZTChlLG4pLGE9WUwoZSxuPShuK3IpLzIpLHM9WUwoaSxuKSxsPVlMKGkscik7dC5tb3ZlVG8ob1swXSxvWzFdKSx0LmJlemllckN1cnZlVG8oYVswXSxhWzFdLHNbMF0sc1sxXSxsWzBdLGxbMV0pfXZhciBlUD17ZHJhdzpmdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguc3FydChlL3hMKTt0Lm1vdmVUbyhuLDApLHQuYXJjKDAsMCxuLDAsU0wpfX0sblA9e2RyYXc6ZnVuY3Rpb24odCxlKXt2YXIgbj1NYXRoLnNxcnQoZS81KS8yO3QubW92ZVRvKC0zKm4sLW4pLHQubGluZVRvKC1uLC1uKSx0LmxpbmVUbygtbiwtMypuKSx0LmxpbmVUbyhuLC0zKm4pLHQubGluZVRvKG4sLW4pLHQubGluZVRvKDMqbiwtbiksdC5saW5lVG8oMypuLG4pLHQubGluZVRvKG4sbiksdC5saW5lVG8obiwzKm4pLHQubGluZVRvKC1uLDMqbiksdC5saW5lVG8oLW4sbiksdC5saW5lVG8oLTMqbixuKSx0LmNsb3NlUGF0aCgpfX0saVA9TWF0aC5zcXJ0KDEvMyksclA9MippUCxvUD17ZHJhdzpmdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguc3FydChlL3JQKSxpPW4qaVA7dC5tb3ZlVG8oMCwtbiksdC5saW5lVG8oaSwwKSx0LmxpbmVUbygwLG4pLHQubGluZVRvKC1pLDApLHQuY2xvc2VQYXRoKCl9fSxhUD1NYXRoLnNpbih4TC8xMCkvTWF0aC5zaW4oNyp4TC8xMCksc1A9TWF0aC5zaW4oU0wvMTApKmFQLGxQPS1NYXRoLmNvcyhTTC8xMCkqYVAsY1A9e2RyYXc6ZnVuY3Rpb24odCxlKXt2YXIgbj1NYXRoLnNxcnQoLjg5MDgxMzA5MTUyOTI4NTIqZSksaT1zUCpuLHI9bFAqbjt0Lm1vdmVUbygwLC1uKSx0LmxpbmVUbyhpLHIpO2Zvcih2YXIgbz0xO288NTsrK28pe3ZhciBhPVNMKm8vNSxzPU1hdGguY29zKGEpLGw9TWF0aC5zaW4oYSk7dC5saW5lVG8obCpuLC1zKm4pLHQubGluZVRvKHMqaS1sKnIsbCppK3Mqcil9dC5jbG9zZVBhdGgoKX19LHVQPXtkcmF3OmZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5zcXJ0KGUpLGk9LW4vMjt0LnJlY3QoaSxpLG4sbil9fSxoUD1NYXRoLnNxcnQoMyksZFA9e2RyYXc6ZnVuY3Rpb24odCxlKXt2YXIgbj0tTWF0aC5zcXJ0KGUvKDMqaFApKTt0Lm1vdmVUbygwLDIqbiksdC5saW5lVG8oLWhQKm4sLW4pLHQubGluZVRvKGhQKm4sLW4pLHQuY2xvc2VQYXRoKCl9fSxwUD0tLjUsZlA9TWF0aC5zcXJ0KDMpLzIsbVA9MS9NYXRoLnNxcnQoMTIpLGdQPTMqKG1QLzIrMSksX1A9e2RyYXc6ZnVuY3Rpb24odCxlKXt2YXIgbj1NYXRoLnNxcnQoZS9nUCksaT1uLzIscj1uKm1QLG89aSxhPW4qbVArbixzPS1vLGw9YTt0Lm1vdmVUbyhpLHIpLHQubGluZVRvKG8sYSksdC5saW5lVG8ocyxsKSx0LmxpbmVUbyhwUCppLWZQKnIsZlAqaStwUCpyKSx0LmxpbmVUbyhwUCpvLWZQKmEsZlAqbytwUCphKSx0LmxpbmVUbyhwUCpzLWZQKmwsZlAqcytwUCpsKSx0LmxpbmVUbyhwUCppK2ZQKnIscFAqci1mUCppKSx0LmxpbmVUbyhwUCpvK2ZQKmEscFAqYS1mUCpvKSx0LmxpbmVUbyhwUCpzK2ZQKmwscFAqbC1mUCpzKSx0LmNsb3NlUGF0aCgpfX0seVA9W2VQLG5QLG9QLHVQLGNQLGRQLF9QXTtmdW5jdGlvbiB2UCgpe31mdW5jdGlvbiBiUCh0LGUsbil7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKCgyKnQuX3gwK3QuX3gxKS8zLCgyKnQuX3kwK3QuX3kxKS8zLCh0Ll94MCsyKnQuX3gxKS8zLCh0Ll95MCsyKnQuX3kxKS8zLCh0Ll94MCs0KnQuX3gxK2UpLzYsKHQuX3kwKzQqdC5feTErbikvNil9ZnVuY3Rpb24geFAodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIHdQKHQpe3JldHVybiBuZXcgeFAodCl9ZnVuY3Rpb24gU1AodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIE1QKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBFUCh0LGUpe3RoaXMuX2Jhc2lzPW5ldyB4UCh0KSx0aGlzLl9iZXRhPWV9eFAucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMzpiUCh0aGlzLHRoaXMuX3gxLHRoaXMuX3kxKTtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDEsdGhpcy5feTEpfSh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxlKXtzd2l0Y2godD0rdCxlPStlLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsZSk6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxlKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9jb250ZXh0LmxpbmVUbygoNSp0aGlzLl94MCt0aGlzLl94MSkvNiwoNSp0aGlzLl95MCt0aGlzLl95MSkvNik7ZGVmYXVsdDpiUCh0aGlzLHQsZSl9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1lfX0sU1AucHJvdG90eXBlPXthcmVhU3RhcnQ6dlAsYXJlYUVuZDp2UCxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl94Mz10aGlzLl94ND10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj10aGlzLl95Mz10aGlzLl95ND1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAxOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLHRoaXMuX3kyKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMjp0aGlzLl9jb250ZXh0Lm1vdmVUbygodGhpcy5feDIrMip0aGlzLl94MykvMywodGhpcy5feTIrMip0aGlzLl95MykvMyksdGhpcy5fY29udGV4dC5saW5lVG8oKHRoaXMuX3gzKzIqdGhpcy5feDIpLzMsKHRoaXMuX3kzKzIqdGhpcy5feTIpLzMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDIsdGhpcy5feTIpLHRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpfX0scG9pbnQ6ZnVuY3Rpb24odCxlKXtzd2l0Y2godD0rdCxlPStlLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl94Mj10LHRoaXMuX3kyPWU7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5feDM9dCx0aGlzLl95Mz1lO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX3g0PXQsdGhpcy5feTQ9ZSx0aGlzLl9jb250ZXh0Lm1vdmVUbygodGhpcy5feDArNCp0aGlzLl94MSt0KS82LCh0aGlzLl95MCs0KnRoaXMuX3kxK2UpLzYpO2JyZWFrO2RlZmF1bHQ6YlAodGhpcyx0LGUpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9ZX19LE1QLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3kwPXRoaXMuX3kxPU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYzPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LGUpe3N3aXRjaCh0PSt0LGU9K2UsdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zO3ZhciBuPSh0aGlzLl94MCs0KnRoaXMuX3gxK3QpLzYsaT0odGhpcy5feTArNCp0aGlzLl95MStlKS82O3RoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8obixpKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyhuLGkpO2JyZWFrO2Nhc2UgMzp0aGlzLl9wb2ludD00O2RlZmF1bHQ6YlAodGhpcyx0LGUpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9ZX19LEVQLnByb3RvdHlwZT17bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD1bXSx0aGlzLl95PVtdLHRoaXMuX2Jhc2lzLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5feCxlPXRoaXMuX3ksbj10Lmxlbmd0aC0xO2lmKG4+MClmb3IodmFyIGkscj10WzBdLG89ZVswXSxhPXRbbl0tcixzPWVbbl0tbyxsPS0xOysrbDw9bjspdGhpcy5fYmFzaXMucG9pbnQodGhpcy5fYmV0YSp0W2xdKygxLXRoaXMuX2JldGEpKihyKyhpPWwvbikqYSksdGhpcy5fYmV0YSplW2xdKygxLXRoaXMuX2JldGEpKihvK2kqcykpO3RoaXMuX3g9dGhpcy5feT1udWxsLHRoaXMuX2Jhc2lzLmxpbmVFbmQoKX0scG9pbnQ6ZnVuY3Rpb24odCxlKXt0aGlzLl94LnB1c2goK3QpLHRoaXMuX3kucHVzaCgrZSl9fTt2YXIgVFA9KGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gMT09PWU/bmV3IHhQKHQpOm5ldyBFUCh0LGUpfXJldHVybiBuLmJldGE9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoK2UpfSxufSkoLjg1KTtmdW5jdGlvbiBDUCh0LGUsbil7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHQuX3gxK3QuX2sqKHQuX3gyLXQuX3gwKSx0Ll95MSt0Ll9rKih0Ll95Mi10Ll95MCksdC5feDIrdC5fayoodC5feDEtZSksdC5feTIrdC5fayoodC5feTEtbiksdC5feDIsdC5feTIpfWZ1bmN0aW9uIEFQKHQsZSl7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtZSkvNn1BUC5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6Q1AodGhpcyx0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LGUpe3N3aXRjaCh0PSt0LGU9K2UsdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxlKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LGUpO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX3gxPXQsdGhpcy5feTE9ZTticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0OkNQKHRoaXMsdCxlKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPWV9fTt2YXIga1A9KGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gbmV3IEFQKHQsZSl9cmV0dXJuIG4udGVuc2lvbj1mdW5jdGlvbihlKXtyZXR1cm4gdCgrZSl9LG59KSgwKTtmdW5jdGlvbiBMUCh0LGUpe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9rPSgxLWUpLzZ9TFAucHJvdG90eXBlPXthcmVhU3RhcnQ6dlAsYXJlYUVuZDp2UCxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl94Mz10aGlzLl94ND10aGlzLl94NT10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj10aGlzLl95Mz10aGlzLl95ND10aGlzLl95NT1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAxOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5wb2ludCh0aGlzLl94NCx0aGlzLl95NCksdGhpcy5wb2ludCh0aGlzLl94NSx0aGlzLl95NSl9fSxwb2ludDpmdW5jdGlvbih0LGUpe3N3aXRjaCh0PSt0LGU9K2UsdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX3gzPXQsdGhpcy5feTM9ZTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9Mix0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94ND10LHRoaXMuX3k0PWUpO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX3g1PXQsdGhpcy5feTU9ZTticmVhaztkZWZhdWx0OkNQKHRoaXMsdCxlKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPWV9fTt2YXIgUFA9KGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gbmV3IExQKHQsZSl9cmV0dXJuIG4udGVuc2lvbj1mdW5jdGlvbihlKXtyZXR1cm4gdCgrZSl9LG59KSgwKTtmdW5jdGlvbiBOUCh0LGUpe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9rPSgxLWUpLzZ9TlAucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHQ9K3QsZT0rZSx0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Mix0aGlzLl95Mik6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzp0aGlzLl9wb2ludD00O2RlZmF1bHQ6Q1AodGhpcyx0LGUpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9ZX19O3ZhciBJUD0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiBuZXcgTlAodCxlKX1yZXR1cm4gbi50ZW5zaW9uPWZ1bmN0aW9uKGUpe3JldHVybiB0KCtlKX0sbn0pKDApO2Z1bmN0aW9uIFJQKHQsZSxuKXt2YXIgaT10Ll94MSxyPXQuX3kxLG89dC5feDIsYT10Ll95MjtpZih0Ll9sMDFfYT5iTCl7dmFyIHM9Mip0Ll9sMDFfMmErMyp0Ll9sMDFfYSp0Ll9sMTJfYSt0Ll9sMTJfMmEsbD0zKnQuX2wwMV9hKih0Ll9sMDFfYSt0Ll9sMTJfYSk7aT0oaSpzLXQuX3gwKnQuX2wxMl8yYSt0Ll94Mip0Ll9sMDFfMmEpL2wscj0ocipzLXQuX3kwKnQuX2wxMl8yYSt0Ll95Mip0Ll9sMDFfMmEpL2x9aWYodC5fbDIzX2E+Ykwpe3ZhciBjPTIqdC5fbDIzXzJhKzMqdC5fbDIzX2EqdC5fbDEyX2ErdC5fbDEyXzJhLHU9Myp0Ll9sMjNfYSoodC5fbDIzX2ErdC5fbDEyX2EpO289KG8qYyt0Ll94MSp0Ll9sMjNfMmEtZSp0Ll9sMTJfMmEpL3UsYT0oYSpjK3QuX3kxKnQuX2wyM18yYS1uKnQuX2wxMl8yYSkvdX10Ll9jb250ZXh0LmJlemllckN1cnZlVG8oaSxyLG8sYSx0Ll94Mix0Ll95Mil9ZnVuY3Rpb24gT1AodCxlKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fYWxwaGE9ZX1PUC5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fbDAxX2E9dGhpcy5fbDEyX2E9dGhpcy5fbDIzX2E9dGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmE9dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Mix0aGlzLl95Mil9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LGUpe2lmKHQ9K3QsZT0rZSx0aGlzLl9wb2ludCl7dmFyIG49dGhpcy5feDItdCxpPXRoaXMuX3kyLWU7dGhpcy5fbDIzX2E9TWF0aC5zcXJ0KHRoaXMuX2wyM18yYT1NYXRoLnBvdyhuKm4raSppLHRoaXMuX2FscGhhKSl9c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsZSk6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxlKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0OlJQKHRoaXMsdCxlKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1lfX07dmFyIHpQPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIGU/bmV3IE9QKHQsZSk6bmV3IEFQKHQsMCl9cmV0dXJuIG4uYWxwaGE9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoK2UpfSxufSkoLjUpO2Z1bmN0aW9uIERQKHQsZSl7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPWV9RFAucHJvdG90eXBlPXthcmVhU3RhcnQ6dlAsYXJlYUVuZDp2UCxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl94Mz10aGlzLl94ND10aGlzLl94NT10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj10aGlzLl95Mz10aGlzLl95ND10aGlzLl95NT1OYU4sdGhpcy5fbDAxX2E9dGhpcy5fbDEyX2E9dGhpcy5fbDIzX2E9dGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmE9dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAxOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMjp0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDM6dGhpcy5wb2ludCh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5wb2ludCh0aGlzLl94NCx0aGlzLl95NCksdGhpcy5wb2ludCh0aGlzLl94NSx0aGlzLl95NSl9fSxwb2ludDpmdW5jdGlvbih0LGUpe2lmKHQ9K3QsZT0rZSx0aGlzLl9wb2ludCl7dmFyIG49dGhpcy5feDItdCxpPXRoaXMuX3kyLWU7dGhpcy5fbDIzX2E9TWF0aC5zcXJ0KHRoaXMuX2wyM18yYT1NYXRoLnBvdyhuKm4raSppLHRoaXMuX2FscGhhKSl9c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl94Mz10LHRoaXMuX3kzPWU7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDQ9dCx0aGlzLl95ND1lKTticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl94NT10LHRoaXMuX3k1PWU7YnJlYWs7ZGVmYXVsdDpSUCh0aGlzLHQsZSl9dGhpcy5fbDAxX2E9dGhpcy5fbDEyX2EsdGhpcy5fbDEyX2E9dGhpcy5fbDIzX2EsdGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYSx0aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhLHRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9ZX19O3ZhciBCUD0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiBlP25ldyBEUCh0LGUpOm5ldyBMUCh0LDApfXJldHVybiBuLmFscGhhPWZ1bmN0aW9uKGUpe3JldHVybiB0KCtlKX0sbn0pKC41KTtmdW5jdGlvbiBIUCh0LGUpe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9hbHBoYT1lfUhQLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPU5hTix0aGlzLl9sMDFfYT10aGlzLl9sMTJfYT10aGlzLl9sMjNfYT10aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYT10aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYzPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LGUpe2lmKHQ9K3QsZT0rZSx0aGlzLl9wb2ludCl7dmFyIG49dGhpcy5feDItdCxpPXRoaXMuX3kyLWU7dGhpcy5fbDIzX2E9TWF0aC5zcXJ0KHRoaXMuX2wyM18yYT1NYXRoLnBvdyhuKm4raSppLHRoaXMuX2FscGhhKSl9c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Mix0aGlzLl95Mik7YnJlYWs7Y2FzZSAzOnRoaXMuX3BvaW50PTQ7ZGVmYXVsdDpSUCh0aGlzLHQsZSl9dGhpcy5fbDAxX2E9dGhpcy5fbDEyX2EsdGhpcy5fbDEyX2E9dGhpcy5fbDIzX2EsdGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYSx0aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhLHRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9ZX19O3ZhciBGUD0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiBlP25ldyBIUCh0LGUpOm5ldyBOUCh0LDApfXJldHVybiBuLmFscGhhPWZ1bmN0aW9uKGUpe3JldHVybiB0KCtlKX0sbn0pKC41KTtmdW5jdGlvbiBWUCh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gVVAodCl7cmV0dXJuIHQ8MD8tMToxfWZ1bmN0aW9uIGpQKHQsZSxuKXt2YXIgaT10Ll94MS10Ll94MCxyPWUtdC5feDEsbz0odC5feTEtdC5feTApLyhpfHxyPDAmJi0wKSxhPShuLXQuX3kxKS8ocnx8aTwwJiYtMCkscz0obypyK2EqaSkvKGkrcik7cmV0dXJuKFVQKG8pK1VQKGEpKSpNYXRoLm1pbihNYXRoLmFicyhvKSxNYXRoLmFicyhhKSwuNSpNYXRoLmFicyhzKSl8fDB9ZnVuY3Rpb24gR1AodCxlKXt2YXIgbj10Ll94MS10Ll94MDtyZXR1cm4gbj8oMyoodC5feTEtdC5feTApL24tZSkvMjplfWZ1bmN0aW9uIFdQKHQsZSxuKXt2YXIgaT10Ll94MCxyPXQuX3gxLG89dC5feTEsYT0oci1pKS8zO3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhpK2EsdC5feTArYSplLHItYSxvLWEqbixyLG8pfWZ1bmN0aW9uIHFQKHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBZUCh0KXt0aGlzLl9jb250ZXh0PW5ldyBYUCh0KX1mdW5jdGlvbiBYUCh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gJFAodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIEtQKHQpe3ZhciBlLG4saT10Lmxlbmd0aC0xLHI9bmV3IEFycmF5KGkpLG89bmV3IEFycmF5KGkpLGE9bmV3IEFycmF5KGkpO2ZvcihyWzBdPTAsb1swXT0yLGFbMF09dFswXSsyKnRbMV0sZT0xO2U8aS0xOysrZSlyW2VdPTEsb1tlXT00LGFbZV09NCp0W2VdKzIqdFtlKzFdO2ZvcihyW2ktMV09MixvW2ktMV09NyxhW2ktMV09OCp0W2ktMV0rdFtpXSxlPTE7ZTxpOysrZSlvW2VdLT1uPXJbZV0vb1tlLTFdLGFbZV0tPW4qYVtlLTFdO2ZvcihyW2ktMV09YVtpLTFdL29baS0xXSxlPWktMjtlPj0wOy0tZSlyW2VdPShhW2VdLXJbZSsxXSkvb1tlXTtmb3Iob1tpLTFdPSh0W2ldK3JbaS0xXSkvMixlPTA7ZTxpLTE7KytlKW9bZV09Mip0W2UrMV0tcltlKzFdO3JldHVybltyLG9dfWZ1bmN0aW9uIFpQKHQsZSl7dGhpcy5fY29udGV4dD10LHRoaXMuX3Q9ZX1mdW5jdGlvbiBKUCh0LGUpe2lmKChyPXQubGVuZ3RoKT4xKWZvcih2YXIgbixpLHIsbz0xLGE9dFtlWzBdXSxzPWEubGVuZ3RoO288cjsrK28pZm9yKGk9YSxhPXRbZVtvXV0sbj0wO248czsrK24pYVtuXVsxXSs9YVtuXVswXT1pc05hTihpW25dWzFdKT9pW25dWzBdOmlbbl1bMV19ZnVuY3Rpb24gUVAodCl7Zm9yKHZhciBlPXQubGVuZ3RoLG49bmV3IEFycmF5KGUpOy0tZT49MDspbltlXT1lO3JldHVybiBufWZ1bmN0aW9uIHROKHQsZSl7cmV0dXJuIHRbZV19ZnVuY3Rpb24gZU4odCl7dmFyIGU9dC5tYXAobk4pO3JldHVybiBRUCh0KS5zb3J0KChmdW5jdGlvbih0LG4pe3JldHVybiBlW3RdLWVbbl19KSl9ZnVuY3Rpb24gbk4odCl7Zm9yKHZhciBlLG49LTEsaT0wLHI9dC5sZW5ndGgsbz0tMS8wOysrbjxyOykoZT0rdFtuXVsxXSk+byYmKG89ZSxpPW4pO3JldHVybiBpfWZ1bmN0aW9uIGlOKHQpe3ZhciBlPXQubWFwKHJOKTtyZXR1cm4gUVAodCkuc29ydCgoZnVuY3Rpb24odCxuKXtyZXR1cm4gZVt0XS1lW25dfSkpfWZ1bmN0aW9uIHJOKHQpe2Zvcih2YXIgZSxuPTAsaT0tMSxyPXQubGVuZ3RoOysraTxyOykoZT0rdFtpXVsxXSkmJihuKz1lKTtyZXR1cm4gbn1mdW5jdGlvbiBvTih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gYU4odCl7cmV0dXJuIHRbMF19ZnVuY3Rpb24gc04odCl7cmV0dXJuIHRbMV19ZnVuY3Rpb24gbE4oKXt0aGlzLl89bnVsbH1mdW5jdGlvbiBjTih0KXt0LlU9dC5DPXQuTD10LlI9dC5QPXQuTj1udWxsfWZ1bmN0aW9uIHVOKHQsZSl7dmFyIG49ZSxpPWUuUixyPW4uVTtyP3IuTD09PW4/ci5MPWk6ci5SPWk6dC5fPWksaS5VPXIsbi5VPWksbi5SPWkuTCxuLlImJihuLlIuVT1uKSxpLkw9bn1mdW5jdGlvbiBoTih0LGUpe3ZhciBuPWUsaT1lLkwscj1uLlU7cj9yLkw9PT1uP3IuTD1pOnIuUj1pOnQuXz1pLGkuVT1yLG4uVT1pLG4uTD1pLlIsbi5MJiYobi5MLlU9biksaS5SPW59ZnVuY3Rpb24gZE4odCl7Zm9yKDt0Lkw7KXQ9dC5MO3JldHVybiB0fWZ1bmN0aW9uIHBOKHQsZSxuLGkpe3ZhciByPVtudWxsLG51bGxdLG89RE4ucHVzaChyKS0xO3JldHVybiByLmxlZnQ9dCxyLnJpZ2h0PWUsbiYmbU4ocix0LGUsbiksaSYmbU4ocixlLHQsaSksT05bdC5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksT05bZS5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobykscn1mdW5jdGlvbiBmTih0LGUsbil7dmFyIGk9W2Usbl07cmV0dXJuIGkubGVmdD10LGl9ZnVuY3Rpb24gbU4odCxlLG4saSl7dFswXXx8dFsxXT90LmxlZnQ9PT1uP3RbMV09aTp0WzBdPWk6KHRbMF09aSx0LmxlZnQ9ZSx0LnJpZ2h0PW4pfWZ1bmN0aW9uIGdOKHQsZSxuLGkscil7dmFyIG8sYT10WzBdLHM9dFsxXSxsPWFbMF0sYz1hWzFdLHU9MCxoPTEsZD1zWzBdLWwscD1zWzFdLWM7aWYobz1lLWwsZHx8IShvPjApKXtpZihvLz1kLGQ8MCl7aWYobzx1KXJldHVybjtvPGgmJihoPW8pfWVsc2UgaWYoZD4wKXtpZihvPmgpcmV0dXJuO28+dSYmKHU9byl9aWYobz1pLWwsZHx8IShvPDApKXtpZihvLz1kLGQ8MCl7aWYobz5oKXJldHVybjtvPnUmJih1PW8pfWVsc2UgaWYoZD4wKXtpZihvPHUpcmV0dXJuO288aCYmKGg9byl9aWYobz1uLWMscHx8IShvPjApKXtpZihvLz1wLHA8MCl7aWYobzx1KXJldHVybjtvPGgmJihoPW8pfWVsc2UgaWYocD4wKXtpZihvPmgpcmV0dXJuO28+dSYmKHU9byl9aWYobz1yLWMscHx8IShvPDApKXtpZihvLz1wLHA8MCl7aWYobz5oKXJldHVybjtvPnUmJih1PW8pfWVsc2UgaWYocD4wKXtpZihvPHUpcmV0dXJuO288aCYmKGg9byl9cmV0dXJuISh1PjB8fGg8MSl8fCh1PjAmJih0WzBdPVtsK3UqZCxjK3UqcF0pLGg8MSYmKHRbMV09W2wraCpkLGMraCpwXSksITApfX19fX1mdW5jdGlvbiBfTih0LGUsbixpLHIpe3ZhciBvPXRbMV07aWYobylyZXR1cm4hMDt2YXIgYSxzLGw9dFswXSxjPXQubGVmdCx1PXQucmlnaHQsaD1jWzBdLGQ9Y1sxXSxwPXVbMF0sZj11WzFdLG09KGgrcCkvMjtpZihmPT09ZCl7aWYobTxlfHxtPj1pKXJldHVybjtpZihoPnApe2lmKGwpe2lmKGxbMV0+PXIpcmV0dXJufWVsc2UgbD1bbSxuXTtvPVttLHJdfWVsc2V7aWYobCl7aWYobFsxXTxuKXJldHVybn1lbHNlIGw9W20scl07bz1bbSxuXX19ZWxzZSBpZihzPShkK2YpLzItKGE9KGgtcCkvKGYtZCkpKm0sYTwtMXx8YT4xKWlmKGg+cCl7aWYobCl7aWYobFsxXT49cilyZXR1cm59ZWxzZSBsPVsobi1zKS9hLG5dO289WyhyLXMpL2Escl19ZWxzZXtpZihsKXtpZihsWzFdPG4pcmV0dXJufWVsc2UgbD1bKHItcykvYSxyXTtvPVsobi1zKS9hLG5dfWVsc2UgaWYoZDxmKXtpZihsKXtpZihsWzBdPj1pKXJldHVybn1lbHNlIGw9W2UsYSplK3NdO289W2ksYSppK3NdfWVsc2V7aWYobCl7aWYobFswXTxlKXJldHVybn1lbHNlIGw9W2ksYSppK3NdO289W2UsYSplK3NdfXJldHVybiB0WzBdPWwsdFsxXT1vLCEwfWZ1bmN0aW9uIHlOKHQsZSl7dmFyIG49dC5zaXRlLGk9ZS5sZWZ0LHI9ZS5yaWdodDtyZXR1cm4gbj09PXImJihyPWksaT1uKSxyP01hdGguYXRhbjIoclsxXS1pWzFdLHJbMF0taVswXSk6KG49PT1pPyhpPWVbMV0scj1lWzBdKTooaT1lWzBdLHI9ZVsxXSksTWF0aC5hdGFuMihpWzBdLXJbMF0sclsxXS1pWzFdKSl9ZnVuY3Rpb24gdk4odCxlKXtyZXR1cm4gZVsrKGUubGVmdCE9PXQuc2l0ZSldfWZ1bmN0aW9uIGJOKHQsZSl7cmV0dXJuIGVbKyhlLmxlZnQ9PT10LnNpdGUpXX1WUC5wcm90b3R5cGU9e2FyZWFTdGFydDp2UCxhcmVhRW5kOnZQLGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludCYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKX0scG9pbnQ6ZnVuY3Rpb24odCxlKXt0PSt0LGU9K2UsdGhpcy5fcG9pbnQ/dGhpcy5fY29udGV4dC5saW5lVG8odCxlKToodGhpcy5fcG9pbnQ9MSx0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LGUpKX19LHFQLnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3QwPU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDEsdGhpcy5feTEpO2JyZWFrO2Nhc2UgMzpXUCh0aGlzLHRoaXMuX3QwLEdQKHRoaXMsdGhpcy5fdDApKX0odGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsZSl7dmFyIG49TmFOO2lmKGU9K2UsKHQ9K3QpIT09dGhpcy5feDF8fGUhPT10aGlzLl95MSl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsZSk6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxlKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MyxXUCh0aGlzLEdQKHRoaXMsbj1qUCh0aGlzLHQsZSkpLG4pO2JyZWFrO2RlZmF1bHQ6V1AodGhpcyx0aGlzLl90MCxuPWpQKHRoaXMsdCxlKSl9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1lLHRoaXMuX3QwPW59fX0sKFlQLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHFQLnByb3RvdHlwZSkpLnBvaW50PWZ1bmN0aW9uKHQsZSl7cVAucHJvdG90eXBlLnBvaW50LmNhbGwodGhpcyxlLHQpfSxYUC5wcm90b3R5cGU9e21vdmVUbzpmdW5jdGlvbih0LGUpe3RoaXMuX2NvbnRleHQubW92ZVRvKGUsdCl9LGNsb3NlUGF0aDpmdW5jdGlvbigpe3RoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCl9LGxpbmVUbzpmdW5jdGlvbih0LGUpe3RoaXMuX2NvbnRleHQubGluZVRvKGUsdCl9LGJlemllckN1cnZlVG86ZnVuY3Rpb24odCxlLG4saSxyLG8pe3RoaXMuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhlLHQsaSxuLG8scil9fSwkUC5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94PVtdLHRoaXMuX3k9W119LGxpbmVFbmQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl94LGU9dGhpcy5feSxuPXQubGVuZ3RoO2lmKG4paWYodGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0WzBdLGVbMF0pOnRoaXMuX2NvbnRleHQubW92ZVRvKHRbMF0sZVswXSksMj09PW4pdGhpcy5fY29udGV4dC5saW5lVG8odFsxXSxlWzFdKTtlbHNlIGZvcih2YXIgaT1LUCh0KSxyPUtQKGUpLG89MCxhPTE7YTxuOysrbywrK2EpdGhpcy5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKGlbMF1bb10sclswXVtvXSxpWzFdW29dLHJbMV1bb10sdFthXSxlW2FdKTsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT1uKSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZSx0aGlzLl94PXRoaXMuX3k9bnVsbH0scG9pbnQ6ZnVuY3Rpb24odCxlKXt0aGlzLl94LnB1c2goK3QpLHRoaXMuX3kucHVzaCgrZSl9fSxaUC5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94PXRoaXMuX3k9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXswPHRoaXMuX3QmJnRoaXMuX3Q8MSYmMj09PXRoaXMuX3BvaW50JiZ0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94LHRoaXMuX3kpLCh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPj0wJiYodGhpcy5fdD0xLXRoaXMuX3QsdGhpcy5fbGluZT0xLXRoaXMuX2xpbmUpfSxwb2ludDpmdW5jdGlvbih0LGUpe3N3aXRjaCh0PSt0LGU9K2UsdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxlKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LGUpO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2RlZmF1bHQ6aWYodGhpcy5fdDw9MCl0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94LGUpLHRoaXMuX2NvbnRleHQubGluZVRvKHQsZSk7ZWxzZXt2YXIgbj10aGlzLl94KigxLXRoaXMuX3QpK3QqdGhpcy5fdDt0aGlzLl9jb250ZXh0LmxpbmVUbyhuLHRoaXMuX3kpLHRoaXMuX2NvbnRleHQubGluZVRvKG4sZSl9fXRoaXMuX3g9dCx0aGlzLl95PWV9fSxsTi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmxOLGluc2VydDpmdW5jdGlvbih0LGUpe3ZhciBuLGkscjtpZih0KXtpZihlLlA9dCxlLk49dC5OLHQuTiYmKHQuTi5QPWUpLHQuTj1lLHQuUil7Zm9yKHQ9dC5SO3QuTDspdD10Lkw7dC5MPWV9ZWxzZSB0LlI9ZTtuPXR9ZWxzZSB0aGlzLl8/KHQ9ZE4odGhpcy5fKSxlLlA9bnVsbCxlLk49dCx0LlA9dC5MPWUsbj10KTooZS5QPWUuTj1udWxsLHRoaXMuXz1lLG49bnVsbCk7Zm9yKGUuTD1lLlI9bnVsbCxlLlU9bixlLkM9ITAsdD1lO24mJm4uQzspbj09PShpPW4uVSkuTD8ocj1pLlIpJiZyLkM/KG4uQz1yLkM9ITEsaS5DPSEwLHQ9aSk6KHQ9PT1uLlImJih1Tih0aGlzLG4pLG49KHQ9bikuVSksbi5DPSExLGkuQz0hMCxoTih0aGlzLGkpKToocj1pLkwpJiZyLkM/KG4uQz1yLkM9ITEsaS5DPSEwLHQ9aSk6KHQ9PT1uLkwmJihoTih0aGlzLG4pLG49KHQ9bikuVSksbi5DPSExLGkuQz0hMCx1Tih0aGlzLGkpKSxuPXQuVTt0aGlzLl8uQz0hMX0scmVtb3ZlOmZ1bmN0aW9uKHQpe3QuTiYmKHQuTi5QPXQuUCksdC5QJiYodC5QLk49dC5OKSx0Lk49dC5QPW51bGw7dmFyIGUsbixpLHI9dC5VLG89dC5MLGE9dC5SO2lmKG49bz9hP2ROKGEpOm86YSxyP3IuTD09PXQ/ci5MPW46ci5SPW46dGhpcy5fPW4sbyYmYT8oaT1uLkMsbi5DPXQuQyxuLkw9byxvLlU9bixuIT09YT8ocj1uLlUsbi5VPXQuVSxyLkw9dD1uLlIsbi5SPWEsYS5VPW4pOihuLlU9cixyPW4sdD1uLlIpKTooaT10LkMsdD1uKSx0JiYodC5VPXIpLCFpKWlmKHQmJnQuQyl0LkM9ITE7ZWxzZXtkb3tpZih0PT09dGhpcy5fKWJyZWFrO2lmKHQ9PT1yLkwpe2lmKChlPXIuUikuQyYmKGUuQz0hMSxyLkM9ITAsdU4odGhpcyxyKSxlPXIuUiksZS5MJiZlLkwuQ3x8ZS5SJiZlLlIuQyl7ZS5SJiZlLlIuQ3x8KGUuTC5DPSExLGUuQz0hMCxoTih0aGlzLGUpLGU9ci5SKSxlLkM9ci5DLHIuQz1lLlIuQz0hMSx1Tih0aGlzLHIpLHQ9dGhpcy5fO2JyZWFrfX1lbHNlIGlmKChlPXIuTCkuQyYmKGUuQz0hMSxyLkM9ITAsaE4odGhpcyxyKSxlPXIuTCksZS5MJiZlLkwuQ3x8ZS5SJiZlLlIuQyl7ZS5MJiZlLkwuQ3x8KGUuUi5DPSExLGUuQz0hMCx1Tih0aGlzLGUpLGU9ci5MKSxlLkM9ci5DLHIuQz1lLkwuQz0hMSxoTih0aGlzLHIpLHQ9dGhpcy5fO2JyZWFrfWUuQz0hMCx0PXIscj1yLlV9d2hpbGUoIXQuQyk7dCYmKHQuQz0hMSl9fX07dmFyIHhOLHdOPVtdO2Z1bmN0aW9uIFNOKCl7Y04odGhpcyksdGhpcy54PXRoaXMueT10aGlzLmFyYz10aGlzLnNpdGU9dGhpcy5jeT1udWxsfWZ1bmN0aW9uIE1OKHQpe3ZhciBlPXQuUCxuPXQuTjtpZihlJiZuKXt2YXIgaT1lLnNpdGUscj10LnNpdGUsbz1uLnNpdGU7aWYoaSE9PW8pe3ZhciBhPXJbMF0scz1yWzFdLGw9aVswXS1hLGM9aVsxXS1zLHU9b1swXS1hLGg9b1sxXS1zLGQ9MioobCpoLWMqdSk7aWYoIShkPj0tSE4pKXt2YXIgcD1sKmwrYypjLGY9dSp1K2gqaCxtPShoKnAtYypmKS9kLGc9KGwqZi11KnApL2QsXz13Ti5wb3AoKXx8bmV3IFNOO18uYXJjPXQsXy5zaXRlPXIsXy54PW0rYSxfLnk9KF8uY3k9ZytzKStNYXRoLnNxcnQobSptK2cqZyksdC5jaXJjbGU9Xztmb3IodmFyIHk9bnVsbCx2PXpOLl87djspaWYoXy55PHYueXx8Xy55PT09di55JiZfLng8PXYueCl7aWYoIXYuTCl7eT12LlA7YnJlYWt9dj12Lkx9ZWxzZXtpZighdi5SKXt5PXY7YnJlYWt9dj12LlJ9ek4uaW5zZXJ0KHksXykseXx8KHhOPV8pfX19fWZ1bmN0aW9uIEVOKHQpe3ZhciBlPXQuY2lyY2xlO2UmJihlLlB8fCh4Tj1lLk4pLHpOLnJlbW92ZShlKSx3Ti5wdXNoKGUpLGNOKGUpLHQuY2lyY2xlPW51bGwpfXZhciBUTj1bXTtmdW5jdGlvbiBDTigpe2NOKHRoaXMpLHRoaXMuZWRnZT10aGlzLnNpdGU9dGhpcy5jaXJjbGU9bnVsbH1mdW5jdGlvbiBBTih0KXt2YXIgZT1UTi5wb3AoKXx8bmV3IENOO3JldHVybiBlLnNpdGU9dCxlfWZ1bmN0aW9uIGtOKHQpe0VOKHQpLFJOLnJlbW92ZSh0KSxUTi5wdXNoKHQpLGNOKHQpfWZ1bmN0aW9uIExOKHQpe3ZhciBlPXQuY2lyY2xlLG49ZS54LGk9ZS5jeSxyPVtuLGldLG89dC5QLGE9dC5OLHM9W3RdO2tOKHQpO2Zvcih2YXIgbD1vO2wuY2lyY2xlJiZNYXRoLmFicyhuLWwuY2lyY2xlLngpPEJOJiZNYXRoLmFicyhpLWwuY2lyY2xlLmN5KTxCTjspbz1sLlAscy51bnNoaWZ0KGwpLGtOKGwpLGw9bztzLnVuc2hpZnQobCksRU4obCk7Zm9yKHZhciBjPWE7Yy5jaXJjbGUmJk1hdGguYWJzKG4tYy5jaXJjbGUueCk8Qk4mJk1hdGguYWJzKGktYy5jaXJjbGUuY3kpPEJOOylhPWMuTixzLnB1c2goYyksa04oYyksYz1hO3MucHVzaChjKSxFTihjKTt2YXIgdSxoPXMubGVuZ3RoO2Zvcih1PTE7dTxoOysrdSltTigoYz1zW3VdKS5lZGdlLChsPXNbdS0xXSkuc2l0ZSxjLnNpdGUscik7KGM9c1toLTFdKS5lZGdlPXBOKChsPXNbMF0pLnNpdGUsYy5zaXRlLG51bGwsciksTU4obCksTU4oYyl9ZnVuY3Rpb24gUE4odCl7Zm9yKHZhciBlLG4saSxyLG89dFswXSxhPXRbMV0scz1STi5fO3M7KWlmKChpPU5OKHMsYSktbyk+Qk4pcz1zLkw7ZWxzZXtpZighKChyPW8tSU4ocyxhKSk+Qk4pKXtpPi1CTj8oZT1zLlAsbj1zKTpyPi1CTj8oZT1zLG49cy5OKTplPW49czticmVha31pZighcy5SKXtlPXM7YnJlYWt9cz1zLlJ9IShmdW5jdGlvbiBsKHQpe3JldHVybiBPTlt0LmluZGV4XT17c2l0ZTp0LGhhbGZlZGdlczpbXX19KSh0KTt2YXIgYz1BTih0KTtpZihSTi5pbnNlcnQoZSxjKSxlfHxuKXtpZihlPT09bilyZXR1cm4gRU4oZSksbj1BTihlLnNpdGUpLFJOLmluc2VydChjLG4pLGMuZWRnZT1uLmVkZ2U9cE4oZS5zaXRlLGMuc2l0ZSksTU4oZSksdm9pZCBNTihuKTtpZihuKXtFTihlKSxFTihuKTt2YXIgdT1lLnNpdGUsaD11WzBdLGQ9dVsxXSxwPXRbMF0taCxmPXRbMV0tZCxtPW4uc2l0ZSxnPW1bMF0taCxfPW1bMV0tZCx5PTIqKHAqXy1mKmcpLHY9cCpwK2YqZixiPWcqZytfKl8seD1bKF8qdi1mKmIpL3kraCwocCpiLWcqdikveStkXTttTihuLmVkZ2UsdSxtLHgpLGMuZWRnZT1wTih1LHQsbnVsbCx4KSxuLmVkZ2U9cE4odCxtLG51bGwseCksTU4oZSksTU4obil9ZWxzZSBjLmVkZ2U9cE4oZS5zaXRlLGMuc2l0ZSl9fWZ1bmN0aW9uIE5OKHQsZSl7dmFyIG49dC5zaXRlLGk9blswXSxyPW5bMV0sbz1yLWU7aWYoIW8pcmV0dXJuIGk7dmFyIGE9dC5QO2lmKCFhKXJldHVybi0xLzA7dmFyIHM9KG49YS5zaXRlKVswXSxsPW5bMV0sYz1sLWU7aWYoIWMpcmV0dXJuIHM7dmFyIHU9cy1pLGg9MS9vLTEvYyxkPXUvYztyZXR1cm4gaD8oLWQrTWF0aC5zcXJ0KGQqZC0yKmgqKHUqdS8oLTIqYyktbCtjLzIrci1vLzIpKSkvaCtpOihpK3MpLzJ9ZnVuY3Rpb24gSU4odCxlKXt2YXIgbj10Lk47aWYobilyZXR1cm4gTk4obixlKTt2YXIgaT10LnNpdGU7cmV0dXJuIGlbMV09PT1lP2lbMF06MS8wfXZhciBSTixPTix6TixETixCTj0xZS02LEhOPTFlLTEyO2Z1bmN0aW9uIEZOKHQsZSxuKXtyZXR1cm4odFswXS1uWzBdKSooZVsxXS10WzFdKS0odFswXS1lWzBdKSooblsxXS10WzFdKX1mdW5jdGlvbiBWTih0LGUpe3JldHVybiBlWzFdLXRbMV18fGVbMF0tdFswXX1mdW5jdGlvbiBVTih0LGUpe3ZhciBuLGkscixvPXQuc29ydChWTikucG9wKCk7Zm9yKEROPVtdLE9OPW5ldyBBcnJheSh0Lmxlbmd0aCksUk49bmV3IGxOLHpOPW5ldyBsTjs7KWlmKHI9eE4sbyYmKCFyfHxvWzFdPHIueXx8b1sxXT09PXIueSYmb1swXTxyLngpKW9bMF09PT1uJiZvWzFdPT09aXx8KFBOKG8pLG49b1swXSxpPW9bMV0pLG89dC5wb3AoKTtlbHNle2lmKCFyKWJyZWFrO0xOKHIuYXJjKX1pZigoZnVuY3Rpb24gYSgpe2Zvcih2YXIgdCxlLG4saSxyPTAsbz1PTi5sZW5ndGg7cjxvOysrcilpZigodD1PTltyXSkmJihpPShlPXQuaGFsZmVkZ2VzKS5sZW5ndGgpKXt2YXIgYT1uZXcgQXJyYXkoaSkscz1uZXcgQXJyYXkoaSk7Zm9yKG49MDtuPGk7KytuKWFbbl09bixzW25dPXlOKHQsRE5bZVtuXV0pO2ZvcihhLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHNbZV0tc1t0XX0pKSxuPTA7bjxpOysrbilzW25dPWVbYVtuXV07Zm9yKG49MDtuPGk7KytuKWVbbl09c1tuXX19KSgpLGUpe3ZhciBzPStlWzBdWzBdLGw9K2VbMF1bMV0sYz0rZVsxXVswXSx1PStlWzFdWzFdOyEoZnVuY3Rpb24gaCh0LGUsbixpKXtmb3IodmFyIHIsbz1ETi5sZW5ndGg7by0tOylfTihyPUROW29dLHQsZSxuLGkpJiZnTihyLHQsZSxuLGkpJiYoTWF0aC5hYnMoclswXVswXS1yWzFdWzBdKT5CTnx8TWF0aC5hYnMoclswXVsxXS1yWzFdWzFdKT5CTil8fGRlbGV0ZSBETltvXX0pKHMsbCxjLHUpLChmdW5jdGlvbiBkKHQsZSxuLGkpe3ZhciByLG8sYSxzLGwsYyx1LGgsZCxwLGYsbSxnPU9OLmxlbmd0aCxfPSEwO2ZvcihyPTA7cjxnOysrcilpZihvPU9OW3JdKXtmb3IoYT1vLnNpdGUscz0obD1vLmhhbGZlZGdlcykubGVuZ3RoO3MtLTspRE5bbFtzXV18fGwuc3BsaWNlKHMsMSk7Zm9yKHM9MCxjPWwubGVuZ3RoO3M8YzspZj0ocD1iTihvLEROW2xbc11dKSlbMF0sbT1wWzFdLGg9KHU9dk4obyxETltsWysrcyVjXV0pKVswXSxkPXVbMV0sKE1hdGguYWJzKGYtaCk+Qk58fE1hdGguYWJzKG0tZCk+Qk4pJiYobC5zcGxpY2UocywwLEROLnB1c2goZk4oYSxwLE1hdGguYWJzKGYtdCk8Qk4mJmktbT5CTj9bdCxNYXRoLmFicyhoLXQpPEJOP2Q6aV06TWF0aC5hYnMobS1pKTxCTiYmbi1mPkJOP1tNYXRoLmFicyhkLWkpPEJOP2g6bixpXTpNYXRoLmFicyhmLW4pPEJOJiZtLWU+Qk4/W24sTWF0aC5hYnMoaC1uKTxCTj9kOmVdOk1hdGguYWJzKG0tZSk8Qk4mJmYtdD5CTj9bTWF0aC5hYnMoZC1lKTxCTj9oOnQsZV06bnVsbCkpLTEpLCsrYyk7YyYmKF89ITEpfWlmKF8pe3ZhciB5LHYsYix4PTEvMDtmb3Iocj0wLF89bnVsbDtyPGc7KytyKShvPU9OW3JdKSYmKGI9KHk9KGE9by5zaXRlKVswXS10KSp5Kyh2PWFbMV0tZSkqdik8eCYmKHg9YixfPW8pO2lmKF8pe3ZhciB3PVt0LGVdLFM9W3QsaV0sTT1bbixpXSxFPVtuLGVdO18uaGFsZmVkZ2VzLnB1c2goRE4ucHVzaChmTihhPV8uc2l0ZSx3LFMpKS0xLEROLnB1c2goZk4oYSxTLE0pKS0xLEROLnB1c2goZk4oYSxNLEUpKS0xLEROLnB1c2goZk4oYSxFLHcpKS0xKX19Zm9yKHI9MDtyPGc7KytyKShvPU9OW3JdKSYmKG8uaGFsZmVkZ2VzLmxlbmd0aHx8ZGVsZXRlIE9OW3JdKX0pKHMsbCxjLHUpfXRoaXMuZWRnZXM9RE4sdGhpcy5jZWxscz1PTixSTj16Tj1ETj1PTj1udWxsfWZ1bmN0aW9uIGpOKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBHTih0LGUsbil7dGhpcy50YXJnZXQ9dCx0aGlzLnR5cGU9ZSx0aGlzLnRyYW5zZm9ybT1ufWZ1bmN0aW9uIFdOKHQsZSxuKXt0aGlzLms9dCx0aGlzLng9ZSx0aGlzLnk9bn1VTi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlVOLHBvbHlnb25zOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lZGdlcztyZXR1cm4gdGhpcy5jZWxscy5tYXAoKGZ1bmN0aW9uKGUpe3ZhciBuPWUuaGFsZmVkZ2VzLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIHZOKGUsdFtuXSl9KSk7cmV0dXJuIG4uZGF0YT1lLnNpdGUuZGF0YSxufSkpfSx0cmlhbmdsZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXSxlPXRoaXMuZWRnZXM7cmV0dXJuIHRoaXMuY2VsbHMuZm9yRWFjaCgoZnVuY3Rpb24obixpKXtpZihvPShyPW4uaGFsZmVkZ2VzKS5sZW5ndGgpZm9yKHZhciByLG8sYSxzPW4uc2l0ZSxsPS0xLGM9ZVtyW28tMV1dLHU9Yy5sZWZ0PT09cz9jLnJpZ2h0OmMubGVmdDsrK2w8bzspYT11LHU9KGM9ZVtyW2xdXSkubGVmdD09PXM/Yy5yaWdodDpjLmxlZnQsYSYmdSYmaTxhLmluZGV4JiZpPHUuaW5kZXgmJkZOKHMsYSx1KTwwJiZ0LnB1c2goW3MuZGF0YSxhLmRhdGEsdS5kYXRhXSl9KSksdH0sbGlua3M6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lZGdlcy5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnJpZ2h0fSkpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJue3NvdXJjZTp0LmxlZnQuZGF0YSx0YXJnZXQ6dC5yaWdodC5kYXRhfX0pKX0sZmluZDpmdW5jdGlvbih0LGUsbil7Zm9yKHZhciBpLHIsbz10aGlzLGE9by5fZm91bmR8fDAscz1vLmNlbGxzLmxlbmd0aDshKHI9by5jZWxsc1thXSk7KWlmKCsrYT49cylyZXR1cm4gbnVsbDt2YXIgbD10LXIuc2l0ZVswXSxjPWUtci5zaXRlWzFdLHU9bCpsK2MqYztkb3tyPW8uY2VsbHNbaT1hXSxhPW51bGwsci5oYWxmZWRnZXMuZm9yRWFjaCgoZnVuY3Rpb24obil7dmFyIGk9by5lZGdlc1tuXSxzPWkubGVmdDtpZihzIT09ci5zaXRlJiZzfHwocz1pLnJpZ2h0KSl7dmFyIGw9dC1zWzBdLGM9ZS1zWzFdLGg9bCpsK2MqYztoPHUmJih1PWgsYT1zLmluZGV4KX19KSl9d2hpbGUobnVsbCE9PWEpO3JldHVybiBvLl9mb3VuZD1pLG51bGw9PW58fHU8PW4qbj9yLnNpdGU6bnVsbH19LFdOLnByb3RvdHlwZT17Y29uc3RydWN0b3I6V04sc2NhbGU6ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10P3RoaXM6bmV3IFdOKHRoaXMuayp0LHRoaXMueCx0aGlzLnkpfSx0cmFuc2xhdGU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gMD09PXQmMD09PWU/dGhpczpuZXcgV04odGhpcy5rLHRoaXMueCt0aGlzLmsqdCx0aGlzLnkrdGhpcy5rKmUpfSxhcHBseTpmdW5jdGlvbih0KXtyZXR1cm5bdFswXSp0aGlzLmsrdGhpcy54LHRbMV0qdGhpcy5rK3RoaXMueV19LGFwcGx5WDpmdW5jdGlvbih0KXtyZXR1cm4gdCp0aGlzLmsrdGhpcy54fSxhcHBseVk6ZnVuY3Rpb24odCl7cmV0dXJuIHQqdGhpcy5rK3RoaXMueX0saW52ZXJ0OmZ1bmN0aW9uKHQpe3JldHVyblsodFswXS10aGlzLngpL3RoaXMuaywodFsxXS10aGlzLnkpL3RoaXMua119LGludmVydFg6ZnVuY3Rpb24odCl7cmV0dXJuKHQtdGhpcy54KS90aGlzLmt9LGludmVydFk6ZnVuY3Rpb24odCl7cmV0dXJuKHQtdGhpcy55KS90aGlzLmt9LHJlc2NhbGVYOmZ1bmN0aW9uKHQpe3JldHVybiB0LmNvcHkoKS5kb21haW4odC5yYW5nZSgpLm1hcCh0aGlzLmludmVydFgsdGhpcykubWFwKHQuaW52ZXJ0LHQpKX0scmVzY2FsZVk6ZnVuY3Rpb24odCl7cmV0dXJuIHQuY29weSgpLmRvbWFpbih0LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WSx0aGlzKS5tYXAodC5pbnZlcnQsdCkpfSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiJ0cmFuc2xhdGUoIit0aGlzLngrIiwiK3RoaXMueSsiKSBzY2FsZSgiK3RoaXMuaysiKSJ9fTt2YXIgcU49bmV3IFdOKDEsMCwwKTtmdW5jdGlvbiBZTih0KXtmb3IoOyF0Ll9fem9vbTspaWYoISh0PXQucGFyZW50Tm9kZSkpcmV0dXJuIHFOO3JldHVybiB0Ll9fem9vbX1mdW5jdGlvbiBYTigpe011LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uICROKCl7TXUucHJldmVudERlZmF1bHQoKSxNdS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiBLTigpe3JldHVybiFNdS5jdHJsS2V5JiYhTXUuYnV0dG9ufWZ1bmN0aW9uIFpOKCl7dmFyIHQ9dGhpcztyZXR1cm4gdCBpbnN0YW5jZW9mIFNWR0VsZW1lbnQ/KHQ9dC5vd25lclNWR0VsZW1lbnR8fHQpLmhhc0F0dHJpYnV0ZSgidmlld0JveCIpP1tbKHQ9dC52aWV3Qm94LmJhc2VWYWwpLngsdC55XSxbdC54K3Qud2lkdGgsdC55K3QuaGVpZ2h0XV06W1swLDBdLFt0LndpZHRoLmJhc2VWYWwudmFsdWUsdC5oZWlnaHQuYmFzZVZhbC52YWx1ZV1dOltbMCwwXSxbdC5jbGllbnRXaWR0aCx0LmNsaWVudEhlaWdodF1dfWZ1bmN0aW9uIEpOKCl7cmV0dXJuIHRoaXMuX196b29tfHxxTn1mdW5jdGlvbiBRTigpe3JldHVybi1NdS5kZWx0YVkqKDE9PT1NdS5kZWx0YU1vZGU/LjA1Ok11LmRlbHRhTW9kZT8xOi4wMDIpfWZ1bmN0aW9uIHRJKCl7cmV0dXJuIG5hdmlnYXRvci5tYXhUb3VjaFBvaW50c3x8Im9udG91Y2hzdGFydCJpbiB0aGlzfWZ1bmN0aW9uIGVJKHQsZSxuKXt2YXIgaT10LmludmVydFgoZVswXVswXSktblswXVswXSxyPXQuaW52ZXJ0WChlWzFdWzBdKS1uWzFdWzBdLG89dC5pbnZlcnRZKGVbMF1bMV0pLW5bMF1bMV0sYT10LmludmVydFkoZVsxXVsxXSktblsxXVsxXTtyZXR1cm4gdC50cmFuc2xhdGUocj5pPyhpK3IpLzI6TWF0aC5taW4oMCxpKXx8TWF0aC5tYXgoMCxyKSxhPm8/KG8rYSkvMjpNYXRoLm1pbigwLG8pfHxNYXRoLm1heCgwLGEpKX1mdW5jdGlvbiBuSSgpe3ZhciB0LGUsbj1LTixpPVpOLHI9ZUksbz1RTixhPXRJLHM9WzAsMS8wXSxsPVtbLTEvMCwtMS8wXSxbMS8wLDEvMF1dLGM9MjUwLHU9RXAsaD13Yygic3RhcnQiLCJ6b29tIiwiZW5kIiksZD01MDAscD0wO2Z1bmN0aW9uIGYodCl7dC5wcm9wZXJ0eSgiX196b29tIixKTikub24oIndoZWVsLnpvb20iLHgpLm9uKCJtb3VzZWRvd24uem9vbSIsdykub24oImRibGNsaWNrLnpvb20iLFMpLmZpbHRlcihhKS5vbigidG91Y2hzdGFydC56b29tIixNKS5vbigidG91Y2htb3ZlLnpvb20iLEUpLm9uKCJ0b3VjaGVuZC56b29tIHRvdWNoY2FuY2VsLnpvb20iLFQpLnN0eWxlKCJ0b3VjaC1hY3Rpb24iLCJub25lIikuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsInJnYmEoMCwwLDAsMCkiKX1mdW5jdGlvbiBtKHQsZSl7cmV0dXJuKGU9TWF0aC5tYXgoc1swXSxNYXRoLm1pbihzWzFdLGUpKSk9PT10Lms/dDpuZXcgV04oZSx0LngsdC55KX1mdW5jdGlvbiBnKHQsZSxuKXt2YXIgaT1lWzBdLW5bMF0qdC5rLHI9ZVsxXS1uWzFdKnQuaztyZXR1cm4gaT09PXQueCYmcj09PXQueT90Om5ldyBXTih0LmssaSxyKX1mdW5jdGlvbiBfKHQpe3JldHVyblsoK3RbMF1bMF0rICt0WzFdWzBdKS8yLCgrdFswXVsxXSsgK3RbMV1bMV0pLzJdfWZ1bmN0aW9uIHkodCxlLG4pe3Qub24oInN0YXJ0Lnpvb20iLChmdW5jdGlvbigpe3YodGhpcyxhcmd1bWVudHMpLnN0YXJ0KCl9KSkub24oImludGVycnVwdC56b29tIGVuZC56b29tIiwoZnVuY3Rpb24oKXt2KHRoaXMsYXJndW1lbnRzKS5lbmQoKX0pKS50d2Vlbigiem9vbSIsKGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxyPWFyZ3VtZW50cyxvPXYodCxyKSxhPWkuYXBwbHkodCxyKSxzPW51bGw9PW4/XyhhKToiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHQscik6bixsPU1hdGgubWF4KGFbMV1bMF0tYVswXVswXSxhWzFdWzFdLWFbMF1bMV0pLGM9dC5fX3pvb20saD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHQscik6ZSxkPXUoYy5pbnZlcnQocykuY29uY2F0KGwvYy5rKSxoLmludmVydChzKS5jb25jYXQobC9oLmspKTtyZXR1cm4gZnVuY3Rpb24odCl7aWYoMT09PXQpdD1oO2Vsc2V7dmFyIGU9ZCh0KSxuPWwvZVsyXTt0PW5ldyBXTihuLHNbMF0tZVswXSpuLHNbMV0tZVsxXSpuKX1vLnpvb20obnVsbCx0KX19KSl9ZnVuY3Rpb24gdih0LGUsbil7cmV0dXJuIW4mJnQuX196b29taW5nfHxuZXcgYih0LGUpfWZ1bmN0aW9uIGIodCxlKXt0aGlzLnRoYXQ9dCx0aGlzLmFyZ3M9ZSx0aGlzLmFjdGl2ZT0wLHRoaXMuZXh0ZW50PWkuYXBwbHkodCxlKSx0aGlzLnRhcHM9MH1mdW5jdGlvbiB4KCl7aWYobi5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciB0PXYodGhpcyxhcmd1bWVudHMpLGU9dGhpcy5fX3pvb20saT1NYXRoLm1heChzWzBdLE1hdGgubWluKHNbMV0sZS5rKk1hdGgucG93KDIsby5hcHBseSh0aGlzLGFyZ3VtZW50cykpKSksYT1iaCh0aGlzKTtpZih0LndoZWVsKXQubW91c2VbMF1bMF09PT1hWzBdJiZ0Lm1vdXNlWzBdWzFdPT09YVsxXXx8KHQubW91c2VbMV09ZS5pbnZlcnQodC5tb3VzZVswXT1hKSksY2xlYXJUaW1lb3V0KHQud2hlZWwpO2Vsc2V7aWYoZS5rPT09aSlyZXR1cm47dC5tb3VzZT1bYSxlLmludmVydChhKV0sbGYodGhpcyksdC5zdGFydCgpfSROKCksdC53aGVlbD1zZXRUaW1lb3V0KGMsMTUwKSx0Lnpvb20oIm1vdXNlIixyKGcobShlLGkpLHQubW91c2VbMF0sdC5tb3VzZVsxXSksdC5leHRlbnQsbCkpfWZ1bmN0aW9uIGMoKXt0LndoZWVsPW51bGwsdC5lbmQoKX19ZnVuY3Rpb24gdygpe2lmKCFlJiZuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIHQ9dih0aGlzLGFyZ3VtZW50cywhMCksaT1EdShNdS52aWV3KS5vbigibW91c2Vtb3ZlLnpvb20iLGMsITApLm9uKCJtb3VzZXVwLnpvb20iLHUsITApLG89YmgodGhpcyksYT1NdS5jbGllbnRYLHM9TXUuY2xpZW50WTtFaChNdS52aWV3KSxYTigpLHQubW91c2U9W28sdGhpcy5fX3pvb20uaW52ZXJ0KG8pXSxsZih0aGlzKSx0LnN0YXJ0KCl9ZnVuY3Rpb24gYygpe2lmKCROKCksIXQubW92ZWQpe3ZhciBlPU11LmNsaWVudFgtYSxuPU11LmNsaWVudFktczt0Lm1vdmVkPWUqZStuKm4+cH10Lnpvb20oIm1vdXNlIixyKGcodC50aGF0Ll9fem9vbSx0Lm1vdXNlWzBdPWJoKHQudGhhdCksdC5tb3VzZVsxXSksdC5leHRlbnQsbCkpfWZ1bmN0aW9uIHUoKXtpLm9uKCJtb3VzZW1vdmUuem9vbSBtb3VzZXVwLnpvb20iLG51bGwpLFRoKE11LnZpZXcsdC5tb3ZlZCksJE4oKSx0LmVuZCgpfX1mdW5jdGlvbiBTKCl7aWYobi5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciB0PXRoaXMuX196b29tLGU9YmgodGhpcyksbz10LmludmVydChlKSxhPXQuayooTXUuc2hpZnRLZXk/LjU6Mikscz1yKGcobSh0LGEpLGUsbyksaS5hcHBseSh0aGlzLGFyZ3VtZW50cyksbCk7JE4oKSxjPjA/RHUodGhpcykudHJhbnNpdGlvbigpLmR1cmF0aW9uKGMpLmNhbGwoeSxzLGUpOkR1KHRoaXMpLmNhbGwoZi50cmFuc2Zvcm0scyl9fWZ1bmN0aW9uIE0oKXtpZihuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIGUsaSxyLG8sYT1NdS50b3VjaGVzLHM9YS5sZW5ndGgsbD12KHRoaXMsYXJndW1lbnRzLE11LmNoYW5nZWRUb3VjaGVzLmxlbmd0aD09PXMpO2ZvcihYTigpLGk9MDtpPHM7KytpKW89W289d2godGhpcyxhLChyPWFbaV0pLmlkZW50aWZpZXIpLHRoaXMuX196b29tLmludmVydChvKSxyLmlkZW50aWZpZXJdLGwudG91Y2gwP2wudG91Y2gxfHxsLnRvdWNoMFsyXT09PW9bMl18fChsLnRvdWNoMT1vLGwudGFwcz0wKToobC50b3VjaDA9byxlPSEwLGwudGFwcz0xKyEhdCk7dCYmKHQ9Y2xlYXJUaW1lb3V0KHQpKSxlJiYobC50YXBzPDImJih0PXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dD1udWxsfSksZCkpLGxmKHRoaXMpLGwuc3RhcnQoKSl9fWZ1bmN0aW9uIEUoKXtpZih0aGlzLl9fem9vbWluZyl7dmFyIGUsbixpLG8sYT12KHRoaXMsYXJndW1lbnRzKSxzPU11LmNoYW5nZWRUb3VjaGVzLGM9cy5sZW5ndGg7Zm9yKCROKCksdCYmKHQ9Y2xlYXJUaW1lb3V0KHQpKSxhLnRhcHM9MCxlPTA7ZTxjOysrZSlpPXdoKHRoaXMscywobj1zW2VdKS5pZGVudGlmaWVyKSxhLnRvdWNoMCYmYS50b3VjaDBbMl09PT1uLmlkZW50aWZpZXI/YS50b3VjaDBbMF09aTphLnRvdWNoMSYmYS50b3VjaDFbMl09PT1uLmlkZW50aWZpZXImJihhLnRvdWNoMVswXT1pKTtpZihuPWEudGhhdC5fX3pvb20sYS50b3VjaDEpe3ZhciB1PWEudG91Y2gwWzBdLGg9YS50b3VjaDBbMV0sZD1hLnRvdWNoMVswXSxwPWEudG91Y2gxWzFdLGY9KGY9ZFswXS11WzBdKSpmKyhmPWRbMV0tdVsxXSkqZixfPShfPXBbMF0taFswXSkqXysoXz1wWzFdLWhbMV0pKl87bj1tKG4sTWF0aC5zcXJ0KGYvXykpLGk9Wyh1WzBdK2RbMF0pLzIsKHVbMV0rZFsxXSkvMl0sbz1bKGhbMF0rcFswXSkvMiwoaFsxXStwWzFdKS8yXX1lbHNle2lmKCFhLnRvdWNoMClyZXR1cm47aT1hLnRvdWNoMFswXSxvPWEudG91Y2gwWzFdfWEuem9vbSgidG91Y2giLHIoZyhuLGksbyksYS5leHRlbnQsbCkpfX1mdW5jdGlvbiBUKCl7aWYodGhpcy5fX3pvb21pbmcpe3ZhciB0LG4saT12KHRoaXMsYXJndW1lbnRzKSxyPU11LmNoYW5nZWRUb3VjaGVzLG89ci5sZW5ndGg7Zm9yKFhOKCksZSYmY2xlYXJUaW1lb3V0KGUpLGU9c2V0VGltZW91dCgoZnVuY3Rpb24oKXtlPW51bGx9KSxkKSx0PTA7dDxvOysrdCluPXJbdF0saS50b3VjaDAmJmkudG91Y2gwWzJdPT09bi5pZGVudGlmaWVyP2RlbGV0ZSBpLnRvdWNoMDppLnRvdWNoMSYmaS50b3VjaDFbMl09PT1uLmlkZW50aWZpZXImJmRlbGV0ZSBpLnRvdWNoMTtpZihpLnRvdWNoMSYmIWkudG91Y2gwJiYoaS50b3VjaDA9aS50b3VjaDEsZGVsZXRlIGkudG91Y2gxKSxpLnRvdWNoMClpLnRvdWNoMFsxXT10aGlzLl9fem9vbS5pbnZlcnQoaS50b3VjaDBbMF0pO2Vsc2UgaWYoaS5lbmQoKSwyPT09aS50YXBzKXt2YXIgYT1EdSh0aGlzKS5vbigiZGJsY2xpY2suem9vbSIpO2EmJmEuYXBwbHkodGhpcyxhcmd1bWVudHMpfX19cmV0dXJuIGYudHJhbnNmb3JtPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10LnNlbGVjdGlvbj90LnNlbGVjdGlvbigpOnQ7aS5wcm9wZXJ0eSgiX196b29tIixKTiksdCE9PWk/eSh0LGUsbik6aS5pbnRlcnJ1cHQoKS5lYWNoKChmdW5jdGlvbigpe3YodGhpcyxhcmd1bWVudHMpLnN0YXJ0KCkuem9vbShudWxsLCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyxhcmd1bWVudHMpOmUpLmVuZCgpfSkpfSxmLnNjYWxlQnk9ZnVuY3Rpb24odCxlLG4pe2Yuc2NhbGVUbyh0LChmdW5jdGlvbigpe3ZhciB0PXRoaXMuX196b29tLmssbj0iZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTplO3JldHVybiB0Km59KSxuKX0sZi5zY2FsZVRvPWZ1bmN0aW9uKHQsZSxuKXtmLnRyYW5zZm9ybSh0LChmdW5jdGlvbigpe3ZhciB0PWkuYXBwbHkodGhpcyxhcmd1bWVudHMpLG89dGhpcy5fX3pvb20sYT1udWxsPT1uP18odCk6ImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6bixzPW8uaW52ZXJ0KGEpLGM9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ZTtyZXR1cm4gcihnKG0obyxjKSxhLHMpLHQsbCl9KSxuKX0sZi50cmFuc2xhdGVCeT1mdW5jdGlvbih0LGUsbil7Zi50cmFuc2Zvcm0odCwoZnVuY3Rpb24oKXtyZXR1cm4gcih0aGlzLl9fem9vbS50cmFuc2xhdGUoImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ZSwiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuKSxpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxsKX0pKX0sZi50cmFuc2xhdGVUbz1mdW5jdGlvbih0LGUsbixvKXtmLnRyYW5zZm9ybSh0LChmdW5jdGlvbigpe3ZhciB0PWkuYXBwbHkodGhpcyxhcmd1bWVudHMpLGE9dGhpcy5fX3pvb20scz1udWxsPT1vP18odCk6ImZ1bmN0aW9uIj09dHlwZW9mIG8/by5hcHBseSh0aGlzLGFyZ3VtZW50cyk6bztyZXR1cm4gcihxTi50cmFuc2xhdGUoc1swXSxzWzFdKS5zY2FsZShhLmspLnRyYW5zbGF0ZSgiZnVuY3Rpb24iPT10eXBlb2YgZT8tZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6LWUsImZ1bmN0aW9uIj09dHlwZW9mIG4/LW4uYXBwbHkodGhpcyxhcmd1bWVudHMpOi1uKSx0LGwpfSksbyl9LGIucHJvdG90eXBlPXtzdGFydDpmdW5jdGlvbigpe3JldHVybiAxPT0rK3RoaXMuYWN0aXZlJiYodGhpcy50aGF0Ll9fem9vbWluZz10aGlzLHRoaXMuZW1pdCgic3RhcnQiKSksdGhpc30sem9vbTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLm1vdXNlJiYibW91c2UiIT09dCYmKHRoaXMubW91c2VbMV09ZS5pbnZlcnQodGhpcy5tb3VzZVswXSkpLHRoaXMudG91Y2gwJiYidG91Y2giIT09dCYmKHRoaXMudG91Y2gwWzFdPWUuaW52ZXJ0KHRoaXMudG91Y2gwWzBdKSksdGhpcy50b3VjaDEmJiJ0b3VjaCIhPT10JiYodGhpcy50b3VjaDFbMV09ZS5pbnZlcnQodGhpcy50b3VjaDFbMF0pKSx0aGlzLnRoYXQuX196b29tPWUsdGhpcy5lbWl0KCJ6b29tIiksdGhpc30sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIDA9PS0tdGhpcy5hY3RpdmUmJihkZWxldGUgdGhpcy50aGF0Ll9fem9vbWluZyx0aGlzLmVtaXQoImVuZCIpKSx0aGlzfSxlbWl0OmZ1bmN0aW9uKHQpe0x1KG5ldyBHTihmLHQsdGhpcy50aGF0Ll9fem9vbSksaC5hcHBseSxoLFt0LHRoaXMudGhhdCx0aGlzLmFyZ3NdKX19LGYud2hlZWxEZWx0YT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmpOKCt0KSxmKTpvfSxmLmZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmpOKCEhdCksZik6bn0sZi50b3VjaGFibGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpqTighIXQpLGYpOmF9LGYuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ak4oW1srdFswXVswXSwrdFswXVsxXV0sWyt0WzFdWzBdLCt0WzFdWzFdXV0pLGYpOml9LGYuc2NhbGVFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHNbMF09K3RbMF0sc1sxXT0rdFsxXSxmKTpbc1swXSxzWzFdXX0sZi50cmFuc2xhdGVFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGxbMF1bMF09K3RbMF1bMF0sbFsxXVswXT0rdFsxXVswXSxsWzBdWzFdPSt0WzBdWzFdLGxbMV1bMV09K3RbMV1bMV0sZik6W1tsWzBdWzBdLGxbMF1bMV1dLFtsWzFdWzBdLGxbMV1bMV1dXX0sZi5jb25zdHJhaW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9dCxmKTpyfSxmLmR1cmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSt0LGYpOmN9LGYuaW50ZXJwb2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dCxmKTp1fSxmLm9uPWZ1bmN0aW9uKCl7dmFyIHQ9aC5vbi5hcHBseShoLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1oP2Y6dH0sZi5jbGlja0Rpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhwPSh0PSt0KSp0LGYpOk1hdGguc3FydChwKX0sZn1ZTi5wcm90b3R5cGU9V04ucHJvdG90eXBlO3ZhciBpST1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCx2ZXJzaW9uOiI1LjcuMCIsYmlzZWN0OkRsLGJpc2VjdFJpZ2h0OkRsLGJpc2VjdExlZnQ6QmwsYXNjZW5kaW5nOlJsLGJpc2VjdG9yOk9sLGNyb3NzOkZsLGRlc2NlbmRpbmc6ZnVuY3Rpb24gckkodCxlKXtyZXR1cm4gZTx0Py0xOmU+dD8xOmU+PXQ/MDpOYU59LGRldmlhdGlvbjpqbCxleHRlbnQ6R2wsaGlzdG9ncmFtOmZ1bmN0aW9uIG9JKCl7dmFyIHQ9JGwsZT1HbCxuPWljO2Z1bmN0aW9uIGkoaSl7dmFyIHIsbyxhPWkubGVuZ3RoLHM9bmV3IEFycmF5KGEpO2ZvcihyPTA7cjxhOysrcilzW3JdPXQoaVtyXSxyLGkpO3ZhciBsPWUocyksYz1sWzBdLHU9bFsxXSxoPW4ocyxjLHUpO0FycmF5LmlzQXJyYXkoaCl8fChoPW5jKGMsdSxoKSxoPUtsKE1hdGguY2VpbChjL2gpKmgsdSxoKSk7Zm9yKHZhciBkPWgubGVuZ3RoO2hbMF08PWM7KWguc2hpZnQoKSwtLWQ7Zm9yKDtoW2QtMV0+dTspaC5wb3AoKSwtLWQ7dmFyIHAsZj1uZXcgQXJyYXkoZCsxKTtmb3Iocj0wO3I8PWQ7KytyKShwPWZbcl09W10pLngwPXI+MD9oW3ItMV06YyxwLngxPXI8ZD9oW3JdOnU7Zm9yKHI9MDtyPGE7KytyKWM8PShvPXNbcl0pJiZvPD11JiZmW0RsKGgsbywwLGQpXS5wdXNoKGlbcl0pO3JldHVybiBmfXJldHVybiBpLnZhbHVlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6WGwoZSksaSk6dH0saS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpYbChbdFswXSx0WzFdXSksaSk6ZX0saS50aHJlc2hvbGRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6QXJyYXkuaXNBcnJheSh0KT9YbChxbC5jYWxsKHQpKTpYbCh0KSxpKTpufSxpfSx0aHJlc2hvbGRGcmVlZG1hbkRpYWNvbmlzOmZ1bmN0aW9uIGFJKHQsZSxuKXtyZXR1cm4gdD1ZbC5jYWxsKHQsVmwpLnNvcnQoUmwpLE1hdGguY2VpbCgobi1lKS8oMioocmModCwuNzUpLXJjKHQsLjI1KSkqTWF0aC5wb3codC5sZW5ndGgsLTEvMykpKX0sdGhyZXNob2xkU2NvdHQ6ZnVuY3Rpb24gc0kodCxlLG4pe3JldHVybiBNYXRoLmNlaWwoKG4tZSkvKDMuNSpqbCh0KSpNYXRoLnBvdyh0Lmxlbmd0aCwtMS8zKSkpfSx0aHJlc2hvbGRTdHVyZ2VzOmljLG1heDpvYyxtZWFuOmZ1bmN0aW9uIGxJKHQsZSl7dmFyIG4saT10Lmxlbmd0aCxyPWksbz0tMSxhPTA7aWYobnVsbD09ZSlmb3IoOysrbzxpOylpc05hTihuPVZsKHRbb10pKT8tLXI6YSs9bjtlbHNlIGZvcig7KytvPGk7KWlzTmFOKG49VmwoZSh0W29dLG8sdCkpKT8tLXI6YSs9bjtpZihyKXJldHVybiBhL3J9LG1lZGlhbjpmdW5jdGlvbiBjSSh0LGUpe3ZhciBuLGk9dC5sZW5ndGgscj0tMSxvPVtdO2lmKG51bGw9PWUpZm9yKDsrK3I8aTspaXNOYU4obj1WbCh0W3JdKSl8fG8ucHVzaChuKTtlbHNlIGZvcig7KytyPGk7KWlzTmFOKG49VmwoZSh0W3JdLHIsdCkpKXx8by5wdXNoKG4pO3JldHVybiByYyhvLnNvcnQoUmwpLC41KX0sbWVyZ2U6YWMsbWluOnNjLHBhaXJzOmZ1bmN0aW9uIHVJKHQsZSl7bnVsbD09ZSYmKGU9SGwpO2Zvcih2YXIgbj0wLGk9dC5sZW5ndGgtMSxyPXRbMF0sbz1uZXcgQXJyYXkoaTwwPzA6aSk7bjxpOylvW25dPWUocixyPXRbKytuXSk7cmV0dXJuIG99LHBlcm11dGU6ZnVuY3Rpb24gaEkodCxlKXtmb3IodmFyIG49ZS5sZW5ndGgsaT1uZXcgQXJyYXkobik7bi0tOylpW25dPXRbZVtuXV07cmV0dXJuIGl9LHF1YW50aWxlOnJjLHJhbmdlOktsLHNjYW46ZnVuY3Rpb24gZEkodCxlKXtpZihuPXQubGVuZ3RoKXt2YXIgbixpLHI9MCxvPTAsYT10W29dO2ZvcihudWxsPT1lJiYoZT1SbCk7KytyPG47KShlKGk9dFtyXSxhKTwwfHwwIT09ZShhLGEpKSYmKGE9aSxvPXIpO3JldHVybiAwPT09ZShhLGEpP286dm9pZCAwfX0sc2h1ZmZsZTpmdW5jdGlvbiBwSSh0LGUsbil7Zm9yKHZhciBpLHIsbz0obnVsbD09bj90Lmxlbmd0aDpuKS0oZT1udWxsPT1lPzA6K2UpO287KXI9TWF0aC5yYW5kb20oKSpvLS18MCxpPXRbbytlXSx0W28rZV09dFtyK2VdLHRbcitlXT1pO3JldHVybiB0fSxzdW06ZnVuY3Rpb24gZkkodCxlKXt2YXIgbixpPXQubGVuZ3RoLHI9LTEsbz0wO2lmKG51bGw9PWUpZm9yKDsrK3I8aTspKG49K3Rbcl0pJiYobys9bik7ZWxzZSBmb3IoOysrcjxpOykobj0rZSh0W3JdLHIsdCkpJiYobys9bik7cmV0dXJuIG99LHRpY2tzOnRjLHRpY2tJbmNyZW1lbnQ6ZWMsdGlja1N0ZXA6bmMsdHJhbnNwb3NlOmxjLHZhcmlhbmNlOlVsLHppcDpmdW5jdGlvbiBtSSgpe3JldHVybiBsYyhhcmd1bWVudHMpfSxheGlzVG9wOmZ1bmN0aW9uIGdJKHQpe3JldHVybiB5YygxLHQpfSxheGlzUmlnaHQ6ZnVuY3Rpb24gX0kodCl7cmV0dXJuIHljKDIsdCl9LGF4aXNCb3R0b206dmMsYXhpc0xlZnQ6YmMsYnJ1c2g6dmcsYnJ1c2hYOmZ1bmN0aW9uIHlJKCl7cmV0dXJuIGJnKGlnKX0sYnJ1c2hZOnlnLGJydXNoU2VsZWN0aW9uOl9nLGNob3JkOmZ1bmN0aW9uIHZJKCl7dmFyIHQ9MCxlPW51bGwsbj1udWxsLGk9bnVsbDtmdW5jdGlvbiByKHIpe3ZhciBvLGEscyxsLGMsdSxoPXIubGVuZ3RoLGQ9W10scD1LbChoKSxmPVtdLG09W10sZz1tLmdyb3Vwcz1uZXcgQXJyYXkoaCksXz1uZXcgQXJyYXkoaCpoKTtmb3Iobz0wLGM9LTE7KytjPGg7KXtmb3IoYT0wLHU9LTE7Kyt1PGg7KWErPXJbY11bdV07ZC5wdXNoKGEpLGYucHVzaChLbChoKSksbys9YX1mb3IoZSYmcC5zb3J0KChmdW5jdGlvbih0LG4pe3JldHVybiBlKGRbdF0sZFtuXSl9KSksbiYmZi5mb3JFYWNoKChmdW5jdGlvbih0LGUpe3Quc29ydCgoZnVuY3Rpb24odCxpKXtyZXR1cm4gbihyW2VdW3RdLHJbZV1baV0pfSkpfSkpLGw9KG89VGcoMCxFZy10KmgpL28pP3Q6RWcvaCxhPTAsYz0tMTsrK2M8aDspe2ZvcihzPWEsdT0tMTsrK3U8aDspe3ZhciB5PXBbY10sdj1mW3ldW3VdLGI9clt5XVt2XSx4PWEsdz1hKz1iKm87X1t2KmgreV09e2luZGV4Onksc3ViaW5kZXg6dixzdGFydEFuZ2xlOngsZW5kQW5nbGU6dyx2YWx1ZTpifX1nW3ldPXtpbmRleDp5LHN0YXJ0QW5nbGU6cyxlbmRBbmdsZTphLHZhbHVlOmRbeV19LGErPWx9Zm9yKGM9LTE7KytjPGg7KWZvcih1PWMtMTsrK3U8aDspe3ZhciBTPV9bdSpoK2NdLE09X1tjKmgrdV07KFMudmFsdWV8fE0udmFsdWUpJiZtLnB1c2goUy52YWx1ZTxNLnZhbHVlP3tzb3VyY2U6TSx0YXJnZXQ6U306e3NvdXJjZTpTLHRhcmdldDpNfSl9cmV0dXJuIGk/bS5zb3J0KGkpOm19cmV0dXJuIHIucGFkQW5nbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9VGcoMCxlKSxyKTp0fSxyLnNvcnRHcm91cHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxyKTplfSxyLnNvcnRTdWJncm91cHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxyKTpufSxyLnNvcnRDaG9yZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/aT1udWxsOihpPUNnKHQpKS5fPXQscik6aSYmaS5ffSxyfSxyaWJib246ZnVuY3Rpb24gYkkoKXt2YXIgdD16ZyxlPURnLG49QmcsaT1IZyxyPUZnLG89bnVsbDtmdW5jdGlvbiBhKCl7dmFyIGEscz1BZy5jYWxsKGFyZ3VtZW50cyksbD10LmFwcGx5KHRoaXMscyksYz1lLmFwcGx5KHRoaXMscyksdT0rbi5hcHBseSh0aGlzLChzWzBdPWwscykpLGg9aS5hcHBseSh0aGlzLHMpLU1nLGQ9ci5hcHBseSh0aGlzLHMpLU1nLHA9dSp4ZyhoKSxmPXUqd2coaCksbT0rbi5hcHBseSh0aGlzLChzWzBdPWMscykpLGc9aS5hcHBseSh0aGlzLHMpLU1nLF89ci5hcHBseSh0aGlzLHMpLU1nO2lmKG98fChvPWE9T2coKSksby5tb3ZlVG8ocCxmKSxvLmFyYygwLDAsdSxoLGQpLGg9PT1nJiZkPT09X3x8KG8ucXVhZHJhdGljQ3VydmVUbygwLDAsbSp4ZyhnKSxtKndnKGcpKSxvLmFyYygwLDAsbSxnLF8pKSxvLnF1YWRyYXRpY0N1cnZlVG8oMCwwLHAsZiksby5jbG9zZVBhdGgoKSxhKXJldHVybiBvPW51bGwsYSsiInx8bnVsbH1yZXR1cm4gYS5yYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprZygrdCksYSk6bn0sYS5zdGFydEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6a2coK3QpLGEpOml9LGEuZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDprZygrdCksYSk6cn0sYS5zb3VyY2U9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ZSxhKTp0fSxhLnRhcmdldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LGEpOmV9LGEuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1udWxsPT10P251bGw6dCxhKTpvfSxhfSxuZXN0OmZ1bmN0aW9uIHhJKCl7dmFyIHQsZSxuLGk9W10scj1bXTtmdW5jdGlvbiBvKG4scixhLHMpe2lmKHI+PWkubGVuZ3RoKXJldHVybiBudWxsIT10JiZuLnNvcnQodCksbnVsbCE9ZT9lKG4pOm47Zm9yKHZhciBsLGMsdSxoPS0xLGQ9bi5sZW5ndGgscD1pW3IrK10sZj1qZygpLG09YSgpOysraDxkOykodT1mLmdldChsPXAoYz1uW2hdKSsiIikpP3UucHVzaChjKTpmLnNldChsLFtjXSk7cmV0dXJuIGYuZWFjaCgoZnVuY3Rpb24odCxlKXtzKG0sZSxvKHQscixhLHMpKX0pKSxtfWZ1bmN0aW9uIGEodCxuKXtpZigrK24+aS5sZW5ndGgpcmV0dXJuIHQ7dmFyIG8scz1yW24tMV07cmV0dXJuIG51bGwhPWUmJm4+PWkubGVuZ3RoP289dC5lbnRyaWVzKCk6KG89W10sdC5lYWNoKChmdW5jdGlvbih0LGUpe28ucHVzaCh7a2V5OmUsdmFsdWVzOmEodCxuKX0pfSkpKSxudWxsIT1zP28uc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gcyh0LmtleSxlLmtleSl9KSk6b31yZXR1cm4gbj17b2JqZWN0OmZ1bmN0aW9uKHQpe3JldHVybiBvKHQsMCxHZyxXZyl9LG1hcDpmdW5jdGlvbih0KXtyZXR1cm4gbyh0LDAscWcsWWcpfSxlbnRyaWVzOmZ1bmN0aW9uKHQpe3JldHVybiBhKG8odCwwLHFnLFlnKSwwKX0sa2V5OmZ1bmN0aW9uKHQpe3JldHVybiBpLnB1c2godCksbn0sc29ydEtleXM6ZnVuY3Rpb24odCl7cmV0dXJuIHJbaS5sZW5ndGgtMV09dCxufSxzb3J0VmFsdWVzOmZ1bmN0aW9uKGUpe3JldHVybiB0PWUsbn0scm9sbHVwOmZ1bmN0aW9uKHQpe3JldHVybiBlPXQsbn19fSxzZXQ6S2csbWFwOmpnLGtleXM6WmcsdmFsdWVzOmZ1bmN0aW9uIHdJKHQpe3ZhciBlPVtdO2Zvcih2YXIgbiBpbiB0KWUucHVzaCh0W25dKTtyZXR1cm4gZX0sZW50cmllczpmdW5jdGlvbiBTSSh0KXt2YXIgZT1bXTtmb3IodmFyIG4gaW4gdCllLnB1c2goe2tleTpuLHZhbHVlOnRbbl19KTtyZXR1cm4gZX0sY29sb3I6SmgscmdiOm5kLGhzbDpjZCxsYWI6eGQsaGNsOkFkLGxjaDpmdW5jdGlvbiBNSSh0LGUsbixpKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/Q2QodCk6bmV3IGtkKG4sZSx0LG51bGw9PWk/MTppKX0sZ3JheTpmdW5jdGlvbiBFSSh0LGUpe3JldHVybiBuZXcgd2QodCwwLDAsbnVsbD09ZT8xOmUpfSxjdWJlaGVsaXg6RmQsY29udG91cnM6YV8sY29udG91ckRlbnNpdHk6ZnVuY3Rpb24gVEkoKXt2YXIgdD1jXyxlPXVfLG49aF8saT05NjAscj01MDAsbz0yMCxhPTIscz0zKm8sbD1pKzIqcz4+YSxjPXIrMipzPj5hLHU9dF8oMjApO2Z1bmN0aW9uIGgoaSl7dmFyIHI9bmV3IEZsb2F0MzJBcnJheShsKmMpLGg9bmV3IEZsb2F0MzJBcnJheShsKmMpO2kuZm9yRWFjaCgoZnVuY3Rpb24oaSxvLHUpe3ZhciBoPSt0KGksbyx1KStzPj5hLGQ9K2UoaSxvLHUpK3M+PmEscD0rbihpLG8sdSk7aD49MCYmaDxsJiZkPj0wJiZkPGMmJihyW2grZCpsXSs9cCl9KSksc18oe3dpZHRoOmwsaGVpZ2h0OmMsZGF0YTpyfSx7d2lkdGg6bCxoZWlnaHQ6YyxkYXRhOmh9LG8+PmEpLGxfKHt3aWR0aDpsLGhlaWdodDpjLGRhdGE6aH0se3dpZHRoOmwsaGVpZ2h0OmMsZGF0YTpyfSxvPj5hKSxzXyh7d2lkdGg6bCxoZWlnaHQ6YyxkYXRhOnJ9LHt3aWR0aDpsLGhlaWdodDpjLGRhdGE6aH0sbz4+YSksbF8oe3dpZHRoOmwsaGVpZ2h0OmMsZGF0YTpofSx7d2lkdGg6bCxoZWlnaHQ6YyxkYXRhOnJ9LG8+PmEpLHNfKHt3aWR0aDpsLGhlaWdodDpjLGRhdGE6cn0se3dpZHRoOmwsaGVpZ2h0OmMsZGF0YTpofSxvPj5hKSxsXyh7d2lkdGg6bCxoZWlnaHQ6YyxkYXRhOmh9LHt3aWR0aDpsLGhlaWdodDpjLGRhdGE6cn0sbz4+YSk7dmFyIHA9dShyKTtpZighQXJyYXkuaXNBcnJheShwKSl7dmFyIGY9b2Mocik7cD1uYygwLGYscCksKHA9S2woMCxNYXRoLmZsb29yKGYvcCkqcCxwKSkuc2hpZnQoKX1yZXR1cm4gYV8oKS50aHJlc2hvbGRzKHApLnNpemUoW2wsY10pKHIpLm1hcChkKX1mdW5jdGlvbiBkKHQpe3JldHVybiB0LnZhbHVlKj1NYXRoLnBvdygyLC0yKmEpLHQuY29vcmRpbmF0ZXMuZm9yRWFjaChwKSx0fWZ1bmN0aW9uIHAodCl7dC5mb3JFYWNoKGYpfWZ1bmN0aW9uIGYodCl7dC5mb3JFYWNoKG0pfWZ1bmN0aW9uIG0odCl7dFswXT10WzBdKk1hdGgucG93KDIsYSktcyx0WzFdPXRbMV0qTWF0aC5wb3coMixhKS1zfWZ1bmN0aW9uIGcoKXtyZXR1cm4gbD1pKzIqKHM9MypvKT4+YSxjPXIrMipzPj5hLGh9cmV0dXJuIGgueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOnRfKCtlKSxoKTp0fSxoLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp0XygrdCksaCk6ZX0saC53ZWlnaHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDp0XygrdCksaCk6bn0saC5zaXplPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybltpLHJdO3ZhciBlPU1hdGguY2VpbCh0WzBdKSxuPU1hdGguY2VpbCh0WzFdKTtpZighKGU+PTB8fGU+PTApKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBzaXplIik7cmV0dXJuIGk9ZSxyPW4sZygpfSxoLmNlbGxTaXplPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiAxPDxhO2lmKCEoKHQ9K3QpPj0xKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2VsbCBzaXplIik7cmV0dXJuIGE9TWF0aC5mbG9vcihNYXRoLmxvZyh0KS9NYXRoLkxOMiksZygpfSxoLnRocmVzaG9sZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpBcnJheS5pc0FycmF5KHQpP3RfKEpnLmNhbGwodCkpOnRfKHQpLGgpOnV9LGguYmFuZHdpZHRoPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBNYXRoLnNxcnQobyoobysxKSk7aWYoISgodD0rdCk+PTApKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBiYW5kd2lkdGgiKTtyZXR1cm4gbz1NYXRoLnJvdW5kKChNYXRoLnNxcnQoNCp0KnQrMSktMSkvMiksZygpfSxofSxkaXNwYXRjaDp3YyxkcmFnOkloLGRyYWdEaXNhYmxlOkVoLGRyYWdFbmFibGU6VGgsZHN2Rm9ybWF0OnlfLGNzdlBhcnNlOmJfLGNzdlBhcnNlUm93czp4Xyxjc3ZGb3JtYXQ6d18sY3N2Rm9ybWF0Qm9keTpTXyxjc3ZGb3JtYXRSb3dzOk1fLGNzdkZvcm1hdFJvdzpFXyxjc3ZGb3JtYXRWYWx1ZTpUXyx0c3ZQYXJzZTpBXyx0c3ZQYXJzZVJvd3M6a18sdHN2Rm9ybWF0OkxfLHRzdkZvcm1hdEJvZHk6UF8sdHN2Rm9ybWF0Um93czpOXyx0c3ZGb3JtYXRSb3c6SV8sdHN2Rm9ybWF0VmFsdWU6Ul8sYXV0b1R5cGU6ZnVuY3Rpb24gQ0kodCl7Zm9yKHZhciBlIGluIHQpe3ZhciBuLGkscj10W2VdLnRyaW0oKTtpZihyKWlmKCJ0cnVlIj09PXIpcj0hMDtlbHNlIGlmKCJmYWxzZSI9PT1yKXI9ITE7ZWxzZSBpZigiTmFOIj09PXIpcj1OYU47ZWxzZSBpZihpc05hTihuPStyKSl7aWYoIShpPXIubWF0Y2goL14oWy0rXVxkezJ9KT9cZHs0fSgtXGR7Mn0oLVxkezJ9KT8pPyhUXGR7Mn06XGR7Mn0oOlxkezJ9KFwuXGR7M30pPyk/KFp8Wy0rXVxkezJ9OlxkezJ9KT8pPyQvKSkpY29udGludWU7T18mJmlbNF0mJiFpWzddJiYocj1yLnJlcGxhY2UoLy0vZywiLyIpLnJlcGxhY2UoL1QvLCIgIikpLHI9bmV3IERhdGUocil9ZWxzZSByPW47ZWxzZSByPW51bGw7dFtlXT1yfXJldHVybiB0fSxlYXNlTGluZWFyOkZmLGVhc2VRdWFkOmpmLGVhc2VRdWFkSW46VmYsZWFzZVF1YWRPdXQ6VWYsZWFzZVF1YWRJbk91dDpqZixlYXNlQ3ViaWM6cWYsZWFzZUN1YmljSW46R2YsZWFzZUN1YmljT3V0OldmLGVhc2VDdWJpY0luT3V0OnFmLGVhc2VQb2x5OmZtLGVhc2VQb2x5SW46ZG0sZWFzZVBvbHlPdXQ6cG0sZWFzZVBvbHlJbk91dDpmbSxlYXNlU2luOnZtLGVhc2VTaW5JbjpfbSxlYXNlU2luT3V0OnltLGVhc2VTaW5Jbk91dDp2bSxlYXNlRXhwOlNtLGVhc2VFeHBJbjp4bSxlYXNlRXhwT3V0OndtLGVhc2VFeHBJbk91dDpTbSxlYXNlQ2lyY2xlOlRtLGVhc2VDaXJjbGVJbjpNbSxlYXNlQ2lyY2xlT3V0OkVtLGVhc2VDaXJjbGVJbk91dDpUbSxlYXNlQm91bmNlOkxtLGVhc2VCb3VuY2VJbjprbSxlYXNlQm91bmNlT3V0OkxtLGVhc2VCb3VuY2VJbk91dDpQbSxlYXNlQmFjazpPbSxlYXNlQmFja0luOkltLGVhc2VCYWNrT3V0OlJtLGVhc2VCYWNrSW5PdXQ6T20sZWFzZUVsYXN0aWM6Qm0sZWFzZUVsYXN0aWNJbjpEbSxlYXNlRWxhc3RpY091dDpCbSxlYXNlRWxhc3RpY0luT3V0OkhtLGJsb2I6ZnVuY3Rpb24gQUkodCxlKXtyZXR1cm4gZmV0Y2godCxlKS50aGVuKHpfKX0sYnVmZmVyOmZ1bmN0aW9uIGtJKHQsZSl7cmV0dXJuIGZldGNoKHQsZSkudGhlbihEXyl9LGRzdjpmdW5jdGlvbiBMSSh0LGUsbixpKXszPT09YXJndW1lbnRzLmxlbmd0aCYmImZ1bmN0aW9uIj09dHlwZW9mIG4mJihpPW4sbj12b2lkIDApO3ZhciByPXlfKHQpO3JldHVybiBIXyhlLG4pLnRoZW4oKGZ1bmN0aW9uKHQpe3JldHVybiByLnBhcnNlKHQsaSl9KSl9LGNzdjpWXyx0c3Y6VV8saW1hZ2U6ZnVuY3Rpb24gUEkodCxlKXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKG4saSl7dmFyIHI9bmV3IEltYWdlO2Zvcih2YXIgbyBpbiBlKXJbb109ZVtvXTtyLm9uZXJyb3I9aSxyLm9ubG9hZD1mdW5jdGlvbigpe24ocil9LHIuc3JjPXR9KSl9LGpzb246ZnVuY3Rpb24gTkkodCxlKXtyZXR1cm4gZmV0Y2godCxlKS50aGVuKGpfKX0sdGV4dDpIXyx4bWw6V18saHRtbDpxXyxzdmc6WV8sZm9yY2VDZW50ZXI6ZnVuY3Rpb24gSUkodCxlKXt2YXIgbjtmdW5jdGlvbiBpKCl7dmFyIGkscixvPW4ubGVuZ3RoLGE9MCxzPTA7Zm9yKGk9MDtpPG87KytpKWErPShyPW5baV0pLngscys9ci55O2ZvcihhPWEvby10LHM9cy9vLWUsaT0wO2k8bzsrK2kpKHI9bltpXSkueC09YSxyLnktPXN9cmV0dXJuIG51bGw9PXQmJih0PTApLG51bGw9PWUmJihlPTApLGkuaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtuPXR9LGkueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rZSxpKTp0fSxpLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9K3QsaSk6ZX0saX0sZm9yY2VDb2xsaWRlOmZ1bmN0aW9uIFJJKHQpe3ZhciBlLG4saT0xLHI9MTtmdW5jdGlvbiBvKCl7Zm9yKHZhciB0LG8scyxsLGMsdSxoLGQ9ZS5sZW5ndGgscD0wO3A8cjsrK3ApZm9yKG89dHkoZSxyeSxveSkudmlzaXRBZnRlcihhKSx0PTA7dDxkOysrdCloPSh1PW5bKHM9ZVt0XSkuaW5kZXhdKSp1LGw9cy54K3MudngsYz1zLnkrcy52eSxvLnZpc2l0KGYpO2Z1bmN0aW9uIGYodCxlLG4scixvKXt2YXIgYT10LmRhdGEsZD10LnIscD11K2Q7aWYoIWEpcmV0dXJuIGU+bCtwfHxyPGwtcHx8bj5jK3B8fG88Yy1wO2lmKGEuaW5kZXg+cy5pbmRleCl7dmFyIGY9bC1hLngtYS52eCxtPWMtYS55LWEudnksZz1mKmYrbSptO2c8cCpwJiYoMD09PWYmJihnKz0oZj0kXygpKSpmKSwwPT09bSYmKGcrPShtPSRfKCkpKm0pLGc9KHAtKGc9TWF0aC5zcXJ0KGcpKSkvZyppLHMudngrPShmKj1nKSoocD0oZCo9ZCkvKGgrZCkpLHMudnkrPShtKj1nKSpwLGEudngtPWYqKHA9MS1wKSxhLnZ5LT1tKnApfX19ZnVuY3Rpb24gYSh0KXtpZih0LmRhdGEpcmV0dXJuIHQucj1uW3QuZGF0YS5pbmRleF07Zm9yKHZhciBlPXQucj0wO2U8NDsrK2UpdFtlXSYmdFtlXS5yPnQuciYmKHQucj10W2VdLnIpfWZ1bmN0aW9uIHMoKXtpZihlKXt2YXIgaSxyLG89ZS5sZW5ndGg7Zm9yKG49bmV3IEFycmF5KG8pLGk9MDtpPG87KytpKW5bKHI9ZVtpXSkuaW5kZXhdPSt0KHIsaSxlKX19cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVhfKG51bGw9PXQ/MTordCkpLG8uaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtlPXQscygpfSxvLml0ZXJhdGlvbnM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K3Qsbyk6cn0sby5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdCxvKTppfSxvLnJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOlhfKCtlKSxzKCksbyk6dH0sb30sZm9yY2VMaW5rOmZ1bmN0aW9uIE9JKHQpe3ZhciBlLG4saSxyLG8sYT1heSxzPWZ1bmN0aW9uIGwodCl7cmV0dXJuIDEvTWF0aC5taW4oclt0LnNvdXJjZS5pbmRleF0sclt0LnRhcmdldC5pbmRleF0pfSxjPVhfKDMwKSx1PTE7ZnVuY3Rpb24gaChpKXtmb3IodmFyIHI9MCxhPXQubGVuZ3RoO3I8dTsrK3IpZm9yKHZhciBzLGwsYyxoLGQscCxmLG09MDttPGE7KyttKWg9KGM9KHM9dFttXSkudGFyZ2V0KS54K2MudngtKGw9cy5zb3VyY2UpLngtbC52eHx8JF8oKSxkPWMueStjLnZ5LWwueS1sLnZ5fHwkXygpLGQqPXA9KChwPU1hdGguc3FydChoKmgrZCpkKSktblttXSkvcCppKmVbbV0sYy52eC09KGgqPXApKihmPW9bbV0pLGMudnktPWQqZixsLnZ4Kz1oKihmPTEtZiksbC52eSs9ZCpmfWZ1bmN0aW9uIGQoKXtpZihpKXt2YXIgcyxsLGM9aS5sZW5ndGgsdT10Lmxlbmd0aCxoPWpnKGksYSk7Zm9yKHM9MCxyPW5ldyBBcnJheShjKTtzPHU7KytzKShsPXRbc10pLmluZGV4PXMsIm9iamVjdCIhPXR5cGVvZiBsLnNvdXJjZSYmKGwuc291cmNlPXN5KGgsbC5zb3VyY2UpKSwib2JqZWN0IiE9dHlwZW9mIGwudGFyZ2V0JiYobC50YXJnZXQ9c3koaCxsLnRhcmdldCkpLHJbbC5zb3VyY2UuaW5kZXhdPShyW2wuc291cmNlLmluZGV4XXx8MCkrMSxyW2wudGFyZ2V0LmluZGV4XT0ocltsLnRhcmdldC5pbmRleF18fDApKzE7Zm9yKHM9MCxvPW5ldyBBcnJheSh1KTtzPHU7KytzKW9bc109clsobD10W3NdKS5zb3VyY2UuaW5kZXhdLyhyW2wuc291cmNlLmluZGV4XStyW2wudGFyZ2V0LmluZGV4XSk7ZT1uZXcgQXJyYXkodSkscCgpLG49bmV3IEFycmF5KHUpLGYoKX19ZnVuY3Rpb24gcCgpe2lmKGkpZm9yKHZhciBuPTAscj10Lmxlbmd0aDtuPHI7KytuKWVbbl09K3ModFtuXSxuLHQpfWZ1bmN0aW9uIGYoKXtpZihpKWZvcih2YXIgZT0wLHI9dC5sZW5ndGg7ZTxyOysrZSluW2VdPStjKHRbZV0sZSx0KX1yZXR1cm4gbnVsbD09dCYmKHQ9W10pLGguaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtpPXQsZCgpfSxoLmxpbmtzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsZCgpLGgpOnR9LGguaWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCxoKTphfSxoLml0ZXJhdGlvbnM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9K3QsaCk6dX0saC5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlhfKCt0KSxwKCksaCk6c30saC5kaXN0YW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlhfKCt0KSxmKCksaCk6Y30saH0sZm9yY2VNYW55Qm9keTpmdW5jdGlvbiB6SSgpe3ZhciB0LGUsbixpLHI9WF8oLTMwKSxvPTEsYT0xLzAscz0uODE7ZnVuY3Rpb24gbChpKXt2YXIgcixvPXQubGVuZ3RoLGE9dHkodCxseSxjeSkudmlzaXRBZnRlcih1KTtmb3Iobj1pLHI9MDtyPG87KytyKWU9dFtyXSxhLnZpc2l0KGgpfWZ1bmN0aW9uIGMoKXtpZih0KXt2YXIgZSxuLG89dC5sZW5ndGg7Zm9yKGk9bmV3IEFycmF5KG8pLGU9MDtlPG87KytlKWlbKG49dFtlXSkuaW5kZXhdPStyKG4sZSx0KX19ZnVuY3Rpb24gdSh0KXt2YXIgZSxuLHIsbyxhLHM9MCxsPTA7aWYodC5sZW5ndGgpe2ZvcihyPW89YT0wO2E8NDsrK2EpKGU9dFthXSkmJihuPU1hdGguYWJzKGUudmFsdWUpKSYmKHMrPWUudmFsdWUsbCs9bixyKz1uKmUueCxvKz1uKmUueSk7dC54PXIvbCx0Lnk9by9sfWVsc2V7KGU9dCkueD1lLmRhdGEueCxlLnk9ZS5kYXRhLnk7ZG97cys9aVtlLmRhdGEuaW5kZXhdfXdoaWxlKGU9ZS5uZXh0KX10LnZhbHVlPXN9ZnVuY3Rpb24gaCh0LHIsbCxjKXtpZighdC52YWx1ZSlyZXR1cm4hMDt2YXIgdT10LngtZS54LGg9dC55LWUueSxkPWMtcixwPXUqdStoKmg7aWYoZCpkL3M8cClyZXR1cm4gcDxhJiYoMD09PXUmJihwKz0odT0kXygpKSp1KSwwPT09aCYmKHArPShoPSRfKCkpKmgpLHA8byYmKHA9TWF0aC5zcXJ0KG8qcCkpLGUudngrPXUqdC52YWx1ZSpuL3AsZS52eSs9aCp0LnZhbHVlKm4vcCksITA7aWYoISh0Lmxlbmd0aHx8cD49YSkpeyh0LmRhdGEhPT1lfHx0Lm5leHQpJiYoMD09PXUmJihwKz0odT0kXygpKSp1KSwwPT09aCYmKHArPShoPSRfKCkpKmgpLHA8byYmKHA9TWF0aC5zcXJ0KG8qcCkpKTtkb3t0LmRhdGEhPT1lJiYoZS52eCs9dSooZD1pW3QuZGF0YS5pbmRleF0qbi9wKSxlLnZ5Kz1oKmQpfXdoaWxlKHQ9dC5uZXh0KX19cmV0dXJuIGwuaW5pdGlhbGl6ZT1mdW5jdGlvbihlKXt0PWUsYygpfSxsLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6WF8oK3QpLGMoKSxsKTpyfSxsLmRpc3RhbmNlTWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPXQqdCxsKTpNYXRoLnNxcnQobyl9LGwuZGlzdGFuY2VNYXg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCp0LGwpOk1hdGguc3FydChhKX0sbC50aGV0YT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz10KnQsbCk6TWF0aC5zcXJ0KHMpfSxsfSxmb3JjZVJhZGlhbDpmdW5jdGlvbiBESSh0LGUsbil7dmFyIGkscixvLGE9WF8oLjEpO2Z1bmN0aW9uIHModCl7Zm9yKHZhciBhPTAscz1pLmxlbmd0aDthPHM7KythKXt2YXIgbD1pW2FdLGM9bC54LWV8fDFlLTYsdT1sLnktbnx8MWUtNixoPU1hdGguc3FydChjKmMrdSp1KSxkPShvW2FdLWgpKnJbYV0qdC9oO2wudngrPWMqZCxsLnZ5Kz11KmR9fWZ1bmN0aW9uIGwoKXtpZihpKXt2YXIgZSxuPWkubGVuZ3RoO2ZvcihyPW5ldyBBcnJheShuKSxvPW5ldyBBcnJheShuKSxlPTA7ZTxuOysrZSlvW2VdPSt0KGlbZV0sZSxpKSxyW2VdPWlzTmFOKG9bZV0pPzA6K2EoaVtlXSxlLGkpfX1yZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9WF8oK3QpKSxudWxsPT1lJiYoZT0wKSxudWxsPT1uJiYobj0wKSxzLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7aT10LGwoKX0scy5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlhfKCt0KSxsKCkscyk6YX0scy5yYWRpdXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpYXygrZSksbCgpLHMpOnR9LHMueD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdCxzKTplfSxzLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K3Qscyk6bn0sc30sZm9yY2VTaW11bGF0aW9uOmZ1bmN0aW9uIEJJKHQpe3ZhciBlLG49MSxpPS4wMDEscj0xLU1hdGgucG93KGksMS8zMDApLG89MCxhPS42LHM9amcoKSxsPSRwKHUpLGM9d2MoInRpY2siLCJlbmQiKTtmdW5jdGlvbiB1KCl7aCgpLGMuY2FsbCgidGljayIsZSksbjxpJiYobC5zdG9wKCksYy5jYWxsKCJlbmQiLGUpKX1mdW5jdGlvbiBoKGkpe3ZhciBsLGMsdT10Lmxlbmd0aDt2b2lkIDA9PT1pJiYoaT0xKTtmb3IodmFyIGg9MDtoPGk7KytoKWZvcihuKz0oby1uKSpyLHMuZWFjaCgoZnVuY3Rpb24odCl7dChuKX0pKSxsPTA7bDx1OysrbCludWxsPT0oYz10W2xdKS5meD9jLngrPWMudngqPWE6KGMueD1jLmZ4LGMudng9MCksbnVsbD09Yy5meT9jLnkrPWMudnkqPWE6KGMueT1jLmZ5LGMudnk9MCk7cmV0dXJuIGV9ZnVuY3Rpb24gZCgpe2Zvcih2YXIgZSxuPTAsaT10Lmxlbmd0aDtuPGk7KytuKXtpZigoZT10W25dKS5pbmRleD1uLG51bGwhPWUuZngmJihlLng9ZS5meCksbnVsbCE9ZS5meSYmKGUueT1lLmZ5KSxpc05hTihlLngpfHxpc05hTihlLnkpKXt2YXIgcj0xMCpNYXRoLnNxcnQobiksbz1uKk15O2UueD1yKk1hdGguY29zKG8pLGUueT1yKk1hdGguc2luKG8pfShpc05hTihlLnZ4KXx8aXNOYU4oZS52eSkpJiYoZS52eD1lLnZ5PTApfX1mdW5jdGlvbiBwKGUpe3JldHVybiBlLmluaXRpYWxpemUmJmUuaW5pdGlhbGl6ZSh0KSxlfXJldHVybiBudWxsPT10JiYodD1bXSksZCgpLGU9e3RpY2s6aCxyZXN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIGwucmVzdGFydCh1KSxlfSxzdG9wOmZ1bmN0aW9uKCl7cmV0dXJuIGwuc3RvcCgpLGV9LG5vZGVzOmZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4sZCgpLHMuZWFjaChwKSxlKTp0fSxhbHBoYTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdCxlKTpufSxhbHBoYU1pbjpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdCxlKTppfSxhbHBoYURlY2F5OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0LGUpOityfSxhbHBoYVRhcmdldDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0rdCxlKTpvfSx2ZWxvY2l0eURlY2F5OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPTEtdCxlKToxLWF9LGZvcmNlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8obnVsbD09bj9zLnJlbW92ZSh0KTpzLnNldCh0LHAobikpLGUpOnMuZ2V0KHQpfSxmaW5kOmZ1bmN0aW9uKGUsbixpKXt2YXIgcixvLGEscyxsLGM9MCx1PXQubGVuZ3RoO2ZvcihudWxsPT1pP2k9MS8wOmkqPWksYz0wO2M8dTsrK2MpKGE9KHI9ZS0ocz10W2NdKS54KSpyKyhvPW4tcy55KSpvKTxpJiYobD1zLGk9YSk7cmV0dXJuIGx9LG9uOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8oYy5vbih0LG4pLGUpOmMub24odCl9fX0sZm9yY2VYOmZ1bmN0aW9uIEhJKHQpe3ZhciBlLG4saSxyPVhfKC4xKTtmdW5jdGlvbiBvKHQpe2Zvcih2YXIgcixvPTAsYT1lLmxlbmd0aDtvPGE7KytvKShyPWVbb10pLnZ4Kz0oaVtvXS1yLngpKm5bb10qdH1mdW5jdGlvbiBhKCl7aWYoZSl7dmFyIG8sYT1lLmxlbmd0aDtmb3Iobj1uZXcgQXJyYXkoYSksaT1uZXcgQXJyYXkoYSksbz0wO288YTsrK28pbltvXT1pc05hTihpW29dPSt0KGVbb10sbyxlKSk/MDorcihlW29dLG8sZSl9fXJldHVybiJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1YXyhudWxsPT10PzA6K3QpKSxvLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7ZT10LGEoKX0sby5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlhfKCt0KSxhKCksbyk6cn0sby54PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6WF8oK2UpLGEoKSxvKTp0fSxvfSxmb3JjZVk6ZnVuY3Rpb24gRkkodCl7dmFyIGUsbixpLHI9WF8oLjEpO2Z1bmN0aW9uIG8odCl7Zm9yKHZhciByLG89MCxhPWUubGVuZ3RoO288YTsrK28pKHI9ZVtvXSkudnkrPShpW29dLXIueSkqbltvXSp0fWZ1bmN0aW9uIGEoKXtpZihlKXt2YXIgbyxhPWUubGVuZ3RoO2ZvcihuPW5ldyBBcnJheShhKSxpPW5ldyBBcnJheShhKSxvPTA7bzxhOysrbyluW29dPWlzTmFOKGlbb109K3QoZVtvXSxvLGUpKT8wOityKGVbb10sbyxlKX19cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVhfKG51bGw9PXQ/MDordCkpLG8uaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtlPXQsYSgpfSxvLnN0cmVuZ3RoPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6WF8oK3QpLGEoKSxvKTpyfSxvLnk9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpYXygrZSksYSgpLG8pOnR9LG99LGZvcm1hdERlZmF1bHRMb2NhbGU6VXksZ2V0IGZvcm1hdCgpe3JldHVybiBEeX0sZ2V0IGZvcm1hdFByZWZpeCgpe3JldHVybiBCeX0sZm9ybWF0TG9jYWxlOlZ5LGZvcm1hdFNwZWNpZmllcjpreSxGb3JtYXRTcGVjaWZpZXI6THkscHJlY2lzaW9uRml4ZWQ6ankscHJlY2lzaW9uUHJlZml4Okd5LHByZWNpc2lvblJvdW5kOld5LGdlb0FyZWE6ZnVuY3Rpb24gVkkodCl7cmV0dXJuIE52LnJlc2V0KCksRXYodCxJdiksMipOdn0sZ2VvQm91bmRzOmZ1bmN0aW9uIFVJKHQpe3ZhciBlLG4saSxyLG8sYSxzO2lmKFh2PVl2PS0oV3Y9cXY9MS8wKSxRdj1bXSxFdih0LHliKSxuPVF2Lmxlbmd0aCl7Zm9yKFF2LnNvcnQoQ2IpLGU9MSxvPVtpPVF2WzBdXTtlPG47KytlKUFiKGksKHI9UXZbZV0pWzBdKXx8QWIoaSxyWzFdKT8oVGIoaVswXSxyWzFdKT5UYihpWzBdLGlbMV0pJiYoaVsxXT1yWzFdKSxUYihyWzBdLGlbMV0pPlRiKGlbMF0saVsxXSkmJihpWzBdPXJbMF0pKTpvLnB1c2goaT1yKTtmb3IoYT0tMS8wLGU9MCxpPW9bbj1vLmxlbmd0aC0xXTtlPD1uO2k9ciwrK2UpKHM9VGIoaVsxXSwocj1vW2VdKVswXSkpPmEmJihhPXMsV3Y9clswXSxZdj1pWzFdKX1yZXR1cm4gUXY9dGI9bnVsbCxXdj09PTEvMHx8cXY9PT0xLzA/W1tOYU4sTmFOXSxbTmFOLE5hTl1dOltbV3YscXZdLFtZdixYdl1dfSxnZW9DZW50cm9pZDpmdW5jdGlvbiBqSSh0KXtlYj1uYj1pYj1yYj1vYj1hYj1zYj1sYj1jYj11Yj1oYj0wLEV2KHQsa2IpO3ZhciBlPWNiLG49dWIsaT1oYixyPWUqZStuKm4raSppO3JldHVybiByPFp5JiYoZT1hYixuPXNiLGk9bGIsbmI8S3kmJihlPWliLG49cmIsaT1vYiksKHI9ZSplK24qbitpKmkpPFp5KT9bTmFOLE5hTl06W2F2KG4sZSkqbnYsX3YoaS9mdihyKSkqbnZdfSxnZW9DaXJjbGU6ZnVuY3Rpb24gR0koKXt2YXIgdCxlLG49RmIoWzAsMF0pLGk9RmIoOTApLHI9RmIoNiksbz17cG9pbnQ6ZnVuY3Rpb24gYShuLGkpe3QucHVzaChuPWUobixpKSksblswXSo9bnYsblsxXSo9bnZ9fTtmdW5jdGlvbiBzKCl7dmFyIGE9bi5hcHBseSh0aGlzLGFyZ3VtZW50cykscz1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKSppdixsPXIuYXBwbHkodGhpcyxhcmd1bWVudHMpKml2O3JldHVybiB0PVtdLGU9amIoLWFbMF0qaXYsLWFbMV0qaXYsMCkuaW52ZXJ0LFhiKG8scyxsLDEpLGE9e3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOlt0XX0sdD1lPW51bGwsYX1yZXR1cm4gcy5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpGYihbK3RbMF0sK3RbMV1dKSxzKTpufSxzLnJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkZiKCt0KSxzKTppfSxzLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkZiKCt0KSxzKTpyfSxzfSxnZW9DbGlwQW50aW1lcmlkaWFuOnN4LGdlb0NsaXBDaXJjbGU6dXgsZ2VvQ2xpcEV4dGVudDpmdW5jdGlvbiBXSSgpe3ZhciB0LGUsbixpPTAscj0wLG89OTYwLGE9NTAwO3JldHVybiBuPXtzdHJlYW06ZnVuY3Rpb24obil7cmV0dXJuIHQmJmU9PT1uP3Q6dD1weChpLHIsbyxhKShlPW4pfSxleHRlbnQ6ZnVuY3Rpb24ocyl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9K3NbMF1bMF0scj0rc1swXVsxXSxvPStzWzFdWzBdLGE9K3NbMV1bMV0sdD1lPW51bGwsbik6W1tpLHJdLFtvLGFdXX19fSxnZW9DbGlwUmVjdGFuZ2xlOnB4LGdlb0NvbnRhaW5zOmZ1bmN0aW9uIHFJKHQsZSl7cmV0dXJuKHQmJkN4Lmhhc093blByb3BlcnR5KHQudHlwZSk/Q3hbdC50eXBlXTpreCkodCxlKX0sZ2VvRGlzdGFuY2U6VHgsZ2VvR3JhdGljdWxlOkR4LGdlb0dyYXRpY3VsZTEwOmZ1bmN0aW9uIFlJKCl7cmV0dXJuIER4KCkoKX0sZ2VvSW50ZXJwb2xhdGU6ZnVuY3Rpb24gWEkodCxlKXt2YXIgbj10WzBdKml2LGk9dFsxXSppdixyPWVbMF0qaXYsbz1lWzFdKml2LGE9c3YoaSkscz1kdihpKSxsPXN2KG8pLGM9ZHYobyksdT1hKnN2KG4pLGg9YSpkdihuKSxkPWwqc3YocikscD1sKmR2KHIpLGY9Mipfdihmdih5dihvLWkpK2EqbCp5dihyLW4pKSksbT1kdihmKSxnPWY/ZnVuY3Rpb24odCl7dmFyIGU9ZHYodCo9ZikvbSxuPWR2KGYtdCkvbSxpPW4qdStlKmQscj1uKmgrZSpwLG89bipzK2UqYztyZXR1cm5bYXYocixpKSpudixhdihvLGZ2KGkqaStyKnIpKSpudl19OmZ1bmN0aW9uKCl7cmV0dXJuW24qbnYsaSpudl19O3JldHVybiBnLmRpc3RhbmNlPWYsZ30sZ2VvTGVuZ3RoOlN4LGdlb1BhdGg6ZnVuY3Rpb24gJEkodCxlKXt2YXIgbixpLHI9NC41O2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJigiZnVuY3Rpb24iPT10eXBlb2YgciYmaS5wb2ludFJhZGl1cygrci5hcHBseSh0aGlzLGFyZ3VtZW50cykpLEV2KHQsbihpKSkpLGkucmVzdWx0KCl9cmV0dXJuIG8uYXJlYT1mdW5jdGlvbih0KXtyZXR1cm4gRXYodCxuKEt4KSksS3gucmVzdWx0KCl9LG8ubWVhc3VyZT1mdW5jdGlvbih0KXtyZXR1cm4gRXYodCxuKER3KSksRHcucmVzdWx0KCl9LG8uYm91bmRzPWZ1bmN0aW9uKHQpe3JldHVybiBFdih0LG4ob3cpKSxvdy5yZXN1bHQoKX0sby5jZW50cm9pZD1mdW5jdGlvbih0KXtyZXR1cm4gRXYodCxuKFR3KSksVHcucmVzdWx0KCl9LG8ucHJvamVjdGlvbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1udWxsPT1lPyh0PW51bGwsQngpOih0PWUpLnN0cmVhbSxvKTp0fSxvLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09dD8oZT1udWxsLG5ldyBCdyk6bmV3IEN3KGU9dCksImZ1bmN0aW9uIiE9dHlwZW9mIHImJmkucG9pbnRSYWRpdXMociksbyk6ZX0sby5wb2ludFJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OihpLnBvaW50UmFkaXVzKCt0KSwrdCksbyk6cn0sby5wcm9qZWN0aW9uKHQpLmNvbnRleHQoZSl9LGdlb0FsYmVyczppUyxnZW9BbGJlcnNVc2E6ZnVuY3Rpb24gS0koKXt2YXIgdCxlLG4saSxyLG8sYT1pUygpLHM9blMoKS5yb3RhdGUoWzE1NCwwXSkuY2VudGVyKFstMiw1OC41XSkucGFyYWxsZWxzKFs1NSw2NV0pLGw9blMoKS5yb3RhdGUoWzE1NywwXSkuY2VudGVyKFstMywxOS45XSkucGFyYWxsZWxzKFs4LDE4XSksYz17cG9pbnQ6ZnVuY3Rpb24odCxlKXtvPVt0LGVdfX07ZnVuY3Rpb24gdSh0KXt2YXIgZT10WzBdLGE9dFsxXTtyZXR1cm4gbz1udWxsLG4ucG9pbnQoZSxhKSxvfHwoaS5wb2ludChlLGEpLG8pfHwoci5wb2ludChlLGEpLG8pfWZ1bmN0aW9uIGgoKXtyZXR1cm4gdD1lPW51bGwsdX1yZXR1cm4gdS5pbnZlcnQ9ZnVuY3Rpb24odCl7dmFyIGU9YS5zY2FsZSgpLG49YS50cmFuc2xhdGUoKSxpPSh0WzBdLW5bMF0pL2Uscj0odFsxXS1uWzFdKS9lO3JldHVybihyPj0uMTImJnI8LjIzNCYmaT49LS40MjUmJmk8LS4yMTQ/czpyPj0uMTY2JiZyPC4yMzQmJmk+PS0uMjE0JiZpPC0uMTE1P2w6YSkuaW52ZXJ0KHQpfSx1LnN0cmVhbT1mdW5jdGlvbihuKXtyZXR1cm4gdCYmZT09PW4/dDp0PShmdW5jdGlvbiBpKHQpe3ZhciBlPXQubGVuZ3RoO3JldHVybntwb2ludDpmdW5jdGlvbihuLGkpe2Zvcih2YXIgcj0tMTsrK3I8ZTspdFtyXS5wb2ludChuLGkpfSxzcGhlcmU6ZnVuY3Rpb24oKXtmb3IodmFyIG49LTE7KytuPGU7KXRbbl0uc3BoZXJlKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe2Zvcih2YXIgbj0tMTsrK248ZTspdFtuXS5saW5lU3RhcnQoKX0sbGluZUVuZDpmdW5jdGlvbigpe2Zvcih2YXIgbj0tMTsrK248ZTspdFtuXS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2Zvcih2YXIgbj0tMTsrK248ZTspdFtuXS5wb2x5Z29uU3RhcnQoKX0scG9seWdvbkVuZDpmdW5jdGlvbigpe2Zvcih2YXIgbj0tMTsrK248ZTspdFtuXS5wb2x5Z29uRW5kKCl9fX0pKFthLnN0cmVhbShlPW4pLHMuc3RyZWFtKG4pLGwuc3RyZWFtKG4pXSl9LHUucHJlY2lzaW9uPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhLnByZWNpc2lvbih0KSxzLnByZWNpc2lvbih0KSxsLnByZWNpc2lvbih0KSxoKCkpOmEucHJlY2lzaW9uKCl9LHUuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGEuc2NhbGUodCkscy5zY2FsZSguMzUqdCksbC5zY2FsZSh0KSx1LnRyYW5zbGF0ZShhLnRyYW5zbGF0ZSgpKSk6YS5zY2FsZSgpfSx1LnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gYS50cmFuc2xhdGUoKTt2YXIgZT1hLnNjYWxlKCksbz0rdFswXSx1PSt0WzFdO3JldHVybiBuPWEudHJhbnNsYXRlKHQpLmNsaXBFeHRlbnQoW1tvLS40NTUqZSx1LS4yMzgqZV0sW28rLjQ1NSplLHUrLjIzOCplXV0pLnN0cmVhbShjKSxpPXMudHJhbnNsYXRlKFtvLS4zMDcqZSx1Ky4yMDEqZV0pLmNsaXBFeHRlbnQoW1tvLS40MjUqZStLeSx1Ky4xMiplK0t5XSxbby0uMjE0KmUtS3ksdSsuMjM0KmUtS3ldXSkuc3RyZWFtKGMpLHI9bC50cmFuc2xhdGUoW28tLjIwNSplLHUrLjIxMiplXSkuY2xpcEV4dGVudChbW28tLjIxNCplK0t5LHUrLjE2NiplK0t5XSxbby0uMTE1KmUtS3ksdSsuMjM0KmUtS3ldXSkuc3RyZWFtKGMpLGgoKX0sdS5maXRFeHRlbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gancodSx0LGUpfSx1LmZpdFNpemU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gR3codSx0LGUpfSx1LmZpdFdpZHRoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFd3KHUsdCxlKX0sdS5maXRIZWlnaHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcXcodSx0LGUpfSx1LnNjYWxlKDEwNzApfSxnZW9BemltdXRoYWxFcXVhbEFyZWE6ZnVuY3Rpb24gWkkoKXtyZXR1cm4gSncoYVMpLnNjYWxlKDEyNC43NSkuY2xpcEFuZ2xlKDE3OS45OTkpfSxnZW9BemltdXRoYWxFcXVhbEFyZWFSYXc6YVMsZ2VvQXppbXV0aGFsRXF1aWRpc3RhbnQ6ZnVuY3Rpb24gSkkoKXtyZXR1cm4gSncoc1MpLnNjYWxlKDc5LjQxODgpLmNsaXBBbmdsZSgxNzkuOTk5KX0sZ2VvQXppbXV0aGFsRXF1aWRpc3RhbnRSYXc6c1MsZ2VvQ29uaWNDb25mb3JtYWw6ZnVuY3Rpb24gUUkoKXtyZXR1cm4gdFMoaFMpLnNjYWxlKDEwOS41KS5wYXJhbGxlbHMoWzMwLDMwXSl9LGdlb0NvbmljQ29uZm9ybWFsUmF3OmhTLGdlb0NvbmljRXF1YWxBcmVhOm5TLGdlb0NvbmljRXF1YWxBcmVhUmF3OmVTLGdlb0NvbmljRXF1aWRpc3RhbnQ6ZnVuY3Rpb24gdFIoKXtyZXR1cm4gdFMocFMpLnNjYWxlKDEzMS4xNTQpLmNlbnRlcihbMCwxMy45Mzg5XSl9LGdlb0NvbmljRXF1aWRpc3RhbnRSYXc6cFMsZ2VvRXF1YWxFYXJ0aDpmdW5jdGlvbiBlUigpe3JldHVybiBKdyh2Uykuc2NhbGUoMTc3LjE1OCl9LGdlb0VxdWFsRWFydGhSYXc6dlMsZ2VvRXF1aXJlY3Rhbmd1bGFyOmZ1bmN0aW9uIG5SKCl7cmV0dXJuIEp3KGRTKS5zY2FsZSgxNTIuNjMpfSxnZW9FcXVpcmVjdGFuZ3VsYXJSYXc6ZFMsZ2VvR25vbW9uaWM6ZnVuY3Rpb24gaVIoKXtyZXR1cm4gSncoYlMpLnNjYWxlKDE0NC4wNDkpLmNsaXBBbmdsZSg2MCl9LGdlb0dub21vbmljUmF3OmJTLGdlb0lkZW50aXR5OmZ1bmN0aW9uIHJSKCl7dmFyIHQsZSxuLGkscixvLGEscz0xLGw9MCxjPTAsdT0xLGg9MSxkPTAscD1udWxsLGY9MSxtPTEsZz1Gdyh7cG9pbnQ6ZnVuY3Rpb24odCxlKXt2YXIgbj12KFt0LGVdKTt0aGlzLnN0cmVhbS5wb2ludChuWzBdLG5bMV0pfX0pLF89Qng7ZnVuY3Rpb24geSgpe3JldHVybiBmPXMqdSxtPXMqaCxvPWE9bnVsbCx2fWZ1bmN0aW9uIHYobil7dmFyIGk9blswXSpmLHI9blsxXSptO2lmKGQpe3ZhciBvPXIqdC1pKmU7aT1pKnQrciplLHI9b31yZXR1cm5baStsLHIrY119cmV0dXJuIHYuaW52ZXJ0PWZ1bmN0aW9uKG4pe3ZhciBpPW5bMF0tbCxyPW5bMV0tYztpZihkKXt2YXIgbz1yKnQraSplO2k9aSp0LXIqZSxyPW99cmV0dXJuW2kvZixyL21dfSx2LnN0cmVhbT1mdW5jdGlvbih0KXtyZXR1cm4gbyYmYT09PXQ/bzpvPWcoXyhhPXQpKX0sdi5wb3N0Y2xpcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oXz10LHA9bj1pPXI9bnVsbCx5KCkpOl99LHYuY2xpcEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oXz1udWxsPT10PyhwPW49aT1yPW51bGwsQngpOnB4KHA9K3RbMF1bMF0sbj0rdFswXVsxXSxpPSt0WzFdWzBdLHI9K3RbMV1bMV0pLHkoKSk6bnVsbD09cD9udWxsOltbcCxuXSxbaSxyXV19LHYuc2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9K3QseSgpKTpzfSx2LnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD0rdFswXSxjPSt0WzFdLHkoKSk6W2wsY119LHYuYW5nbGU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ZHYoZD1uJTM2MCppdiksdD1zdihkKSx5KCkpOmQqbnZ9LHYucmVmbGVjdFg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHU9dD8tMToxLHkoKSk6dTwwfSx2LnJlZmxlY3RZPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPXQ/LTE6MSx5KCkpOmg8MH0sdi5maXRFeHRlbnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gancodix0LGUpfSx2LmZpdFNpemU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gR3codix0LGUpfSx2LmZpdFdpZHRoPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFd3KHYsdCxlKX0sdi5maXRIZWlnaHQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gcXcodix0LGUpfSx2fSxnZW9Qcm9qZWN0aW9uOkp3LGdlb1Byb2plY3Rpb25NdXRhdG9yOlF3LGdlb01lcmNhdG9yOmZ1bmN0aW9uIG9SKCl7cmV0dXJuIGNTKGxTKS5zY2FsZSg5NjEvZXYpfSxnZW9NZXJjYXRvclJhdzpsUyxnZW9OYXR1cmFsRWFydGgxOmZ1bmN0aW9uIGFSKCl7cmV0dXJuIEp3KHhTKS5zY2FsZSgxNzUuMjk1KX0sZ2VvTmF0dXJhbEVhcnRoMVJhdzp4UyxnZW9PcnRob2dyYXBoaWM6ZnVuY3Rpb24gc1IoKXtyZXR1cm4gSncod1MpLnNjYWxlKDI0OS41KS5jbGlwQW5nbGUoOTAuMDAwMDAxKX0sZ2VvT3J0aG9ncmFwaGljUmF3OndTLGdlb1N0ZXJlb2dyYXBoaWM6ZnVuY3Rpb24gbFIoKXtyZXR1cm4gSncoU1MpLnNjYWxlKDI1MCkuY2xpcEFuZ2xlKDE0Mil9LGdlb1N0ZXJlb2dyYXBoaWNSYXc6U1MsZ2VvVHJhbnN2ZXJzZU1lcmNhdG9yOmZ1bmN0aW9uIGNSKCl7dmFyIHQ9Y1MoTVMpLGU9dC5jZW50ZXIsbj10LnJvdGF0ZTtyZXR1cm4gdC5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/ZShbLXRbMV0sdFswXV0pOlsodD1lKCkpWzFdLC10WzBdXX0sdC5yb3RhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bihbdFswXSx0WzFdLHQubGVuZ3RoPjI/dFsyXSs5MDo5MF0pOlsodD1uKCkpWzBdLHRbMV0sdFsyXS05MF19LG4oWzAsMCw5MF0pLnNjYWxlKDE1OS4xNTUpfSxnZW9UcmFuc3ZlcnNlTWVyY2F0b3JSYXc6TVMsZ2VvUm90YXRpb246WWIsZ2VvU3RyZWFtOkV2LGdlb1RyYW5zZm9ybTpmdW5jdGlvbiB1Uih0KXtyZXR1cm57c3RyZWFtOkZ3KHQpfX0sY2x1c3RlcjpmdW5jdGlvbiBoUigpe3ZhciB0PUVTLGU9MSxuPTEsaT0hMTtmdW5jdGlvbiByKHIpe3ZhciBvLGE9MDtyLmVhY2hBZnRlcigoZnVuY3Rpb24oZSl7dmFyIG49ZS5jaGlsZHJlbjtuPyhlLng9KGZ1bmN0aW9uIGkodCl7cmV0dXJuIHQucmVkdWNlKFRTLDApL3QubGVuZ3RofSkobiksZS55PShmdW5jdGlvbiByKHQpe3JldHVybiAxK3QucmVkdWNlKENTLDApfSkobikpOihlLng9bz9hKz10KGUsbyk6MCxlLnk9MCxvPWUpfSkpO3ZhciBzPShmdW5jdGlvbiBsKHQpe2Zvcih2YXIgZTtlPXQuY2hpbGRyZW47KXQ9ZVswXTtyZXR1cm4gdH0pKHIpLGM9KGZ1bmN0aW9uIHUodCl7Zm9yKHZhciBlO2U9dC5jaGlsZHJlbjspdD1lW2UubGVuZ3RoLTFdO3JldHVybiB0fSkociksaD1zLngtdChzLGMpLzIsZD1jLngrdChjLHMpLzI7cmV0dXJuIHIuZWFjaEFmdGVyKGk/ZnVuY3Rpb24odCl7dC54PSh0Lngtci54KSplLHQueT0oci55LXQueSkqbn06ZnVuY3Rpb24odCl7dC54PSh0LngtaCkvKGQtaCkqZSx0Lnk9KDEtKHIueT90Lnkvci55OjEpKSpufSl9cmV0dXJuIHIuc2VwYXJhdGlvbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLHIpOnR9LHIuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0hMSxlPSt0WzBdLG49K3RbMV0scik6aT9udWxsOltlLG5dfSxyLm5vZGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSEwLGU9K3RbMF0sbj0rdFsxXSxyKTppP1tlLG5dOm51bGx9LHJ9LGhpZXJhcmNoeTprUyxwYWNrOmZ1bmN0aW9uIGRSKCl7dmFyIHQ9bnVsbCxlPTEsbj0xLGk9bE07ZnVuY3Rpb24gcihyKXtyZXR1cm4gci54PWUvMixyLnk9bi8yLHQ/ci5lYWNoQmVmb3JlKGhNKHQpKS5lYWNoQWZ0ZXIoZE0oaSwuNSkpLmVhY2hCZWZvcmUocE0oMSkpOnIuZWFjaEJlZm9yZShoTSh1TSkpLmVhY2hBZnRlcihkTShsTSwxKSkuZWFjaEFmdGVyKGRNKGksci5yL01hdGgubWluKGUsbikpKS5lYWNoQmVmb3JlKHBNKE1hdGgubWluKGUsbikvKDIqci5yKSkpLHJ9cmV0dXJuIHIucmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWFNKGUpLHIpOnR9LHIuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdFswXSxuPSt0WzFdLHIpOltlLG5dfSxyLnBhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpjTSgrdCkscik6aX0scn0scGFja1NpYmxpbmdzOmZ1bmN0aW9uIHBSKHQpe3JldHVybiBvTSh0KSx0fSxwYWNrRW5jbG9zZTpZUyxwYXJ0aXRpb246ZnVuY3Rpb24gZlIoKXt2YXIgdD0xLGU9MSxuPTAsaT0hMTtmdW5jdGlvbiByKHIpe3ZhciBvPXIuaGVpZ2h0KzE7cmV0dXJuIHIueDA9ci55MD1uLHIueDE9dCxyLnkxPWUvbyxyLmVhY2hCZWZvcmUoKGZ1bmN0aW9uIGEodCxlKXtyZXR1cm4gZnVuY3Rpb24oaSl7aS5jaGlsZHJlbiYmbU0oaSxpLngwLHQqKGkuZGVwdGgrMSkvZSxpLngxLHQqKGkuZGVwdGgrMikvZSk7dmFyIHI9aS54MCxvPWkueTAsYT1pLngxLW4scz1pLnkxLW47YTxyJiYocj1hPShyK2EpLzIpLHM8byYmKG89cz0obytzKS8yKSxpLngwPXIsaS55MD1vLGkueDE9YSxpLnkxPXN9fSkoZSxvKSksaSYmci5lYWNoQmVmb3JlKGZNKSxyfXJldHVybiByLnJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSEhdCxyKTppfSxyLnNpemU9ZnVuY3Rpb24obil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9K25bMF0sZT0rblsxXSxyKTpbdCxlXX0sci5wYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0LHIpOm59LHJ9LHN0cmF0aWZ5OmZ1bmN0aW9uIG1SKCl7dmFyIHQ9eU0sZT12TTtmdW5jdGlvbiBuKG4pe3ZhciBpLHIsbyxhLHMsbCxjLHU9bi5sZW5ndGgsaD1uZXcgQXJyYXkodSksZD17fTtmb3Iocj0wO3I8dTsrK3Ipcz1oW3JdPW5ldyBJUyhpPW5bcl0pLG51bGwhPShsPXQoaSxyLG4pKSYmKGwrPSIiKSYmKGRbYz0iJCIrKHMuaWQ9bCldPWMgaW4gZD9fTTpzKTtmb3Iocj0wO3I8dTsrK3IpaWYocz1oW3JdLG51bGwhPShsPWUobltyXSxyLG4pKSYmKGwrPSIiKSl7aWYoIShhPWRbIiQiK2xdKSl0aHJvdyBuZXcgRXJyb3IoIm1pc3Npbmc6ICIrbCk7aWYoYT09PV9NKXRocm93IG5ldyBFcnJvcigiYW1iaWd1b3VzOiAiK2wpO2EuY2hpbGRyZW4/YS5jaGlsZHJlbi5wdXNoKHMpOmEuY2hpbGRyZW49W3NdLHMucGFyZW50PWF9ZWxzZXtpZihvKXRocm93IG5ldyBFcnJvcigibXVsdGlwbGUgcm9vdHMiKTtvPXN9aWYoIW8pdGhyb3cgbmV3IEVycm9yKCJubyByb290Iik7aWYoby5wYXJlbnQ9Z00sby5lYWNoQmVmb3JlKChmdW5jdGlvbih0KXt0LmRlcHRoPXQucGFyZW50LmRlcHRoKzEsLS11fSkpLmVhY2hCZWZvcmUoTlMpLG8ucGFyZW50PW51bGwsdT4wKXRocm93IG5ldyBFcnJvcigiY3ljbGUiKTtyZXR1cm4gb31yZXR1cm4gbi5pZD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1zTShlKSxuKTp0fSxuLnBhcmVudElkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXNNKHQpLG4pOmV9LG59LHRyZWU6ZnVuY3Rpb24gZ1IoKXt2YXIgdD1iTSxlPTEsbj0xLGk9bnVsbDtmdW5jdGlvbiByKHIpe3ZhciBsPShmdW5jdGlvbiBjKHQpe2Zvcih2YXIgZSxuLGkscixvLGE9bmV3IEVNKHQsMCkscz1bYV07ZT1zLnBvcCgpOylpZihpPWUuXy5jaGlsZHJlbilmb3IoZS5jaGlsZHJlbj1uZXcgQXJyYXkobz1pLmxlbmd0aCkscj1vLTE7cj49MDstLXIpcy5wdXNoKG49ZS5jaGlsZHJlbltyXT1uZXcgRU0oaVtyXSxyKSksbi5wYXJlbnQ9ZTtyZXR1cm4oYS5wYXJlbnQ9bmV3IEVNKG51bGwsMCkpLmNoaWxkcmVuPVthXSxhfSkocik7aWYobC5lYWNoQWZ0ZXIobyksbC5wYXJlbnQubT0tbC56LGwuZWFjaEJlZm9yZShhKSxpKXIuZWFjaEJlZm9yZShzKTtlbHNle3ZhciB1PXIsaD1yLGQ9cjtyLmVhY2hCZWZvcmUoKGZ1bmN0aW9uKHQpe3QueDx1LngmJih1PXQpLHQueD5oLngmJihoPXQpLHQuZGVwdGg+ZC5kZXB0aCYmKGQ9dCl9KSk7dmFyIHA9dT09PWg/MTp0KHUsaCkvMixmPXAtdS54LG09ZS8oaC54K3ArZiksZz1uLyhkLmRlcHRofHwxKTtyLmVhY2hCZWZvcmUoKGZ1bmN0aW9uKHQpe3QueD0odC54K2YpKm0sdC55PXQuZGVwdGgqZ30pKX1yZXR1cm4gcn1mdW5jdGlvbiBvKGUpe3ZhciBuPWUuY2hpbGRyZW4saT1lLnBhcmVudC5jaGlsZHJlbixyPWUuaT9pW2UuaS0xXTpudWxsO2lmKG4peyEoZnVuY3Rpb24gbyh0KXtmb3IodmFyIGUsbj0wLGk9MCxyPXQuY2hpbGRyZW4sbz1yLmxlbmd0aDstLW8+PTA7KShlPXJbb10pLnorPW4sZS5tKz1uLG4rPWUucysoaSs9ZS5jKX0pKGUpO3ZhciBhPShuWzBdLnorbltuLmxlbmd0aC0xXS56KS8yO3I/KGUuej1yLnordChlLl8sci5fKSxlLm09ZS56LWEpOmUuej1hfWVsc2UgciYmKGUuej1yLnordChlLl8sci5fKSk7ZS5wYXJlbnQuQT0oZnVuY3Rpb24gcyhlLG4saSl7aWYobil7Zm9yKHZhciByLG89ZSxhPWUscz1uLGw9by5wYXJlbnQuY2hpbGRyZW5bMF0sYz1vLm0sdT1hLm0saD1zLm0sZD1sLm07cz13TShzKSxvPXhNKG8pLHMmJm87KWw9eE0obCksKGE9d00oYSkpLmE9ZSwocj1zLnoraC1vLnotYyt0KHMuXyxvLl8pKT4wJiYoU00oTU0ocyxlLGkpLGUsciksYys9cix1Kz1yKSxoKz1zLm0sYys9by5tLGQrPWwubSx1Kz1hLm07cyYmIXdNKGEpJiYoYS50PXMsYS5tKz1oLXUpLG8mJiF4TShsKSYmKGwudD1vLGwubSs9Yy1kLGk9ZSl9cmV0dXJuIGl9KShlLHIsZS5wYXJlbnQuQXx8aVswXSl9ZnVuY3Rpb24gYSh0KXt0Ll8ueD10LnordC5wYXJlbnQubSx0Lm0rPXQucGFyZW50Lm19ZnVuY3Rpb24gcyh0KXt0LngqPWUsdC55PXQuZGVwdGgqbn1yZXR1cm4gci5zZXBhcmF0aW9uPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUscik6dH0sci5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSExLGU9K3RbMF0sbj0rdFsxXSxyKTppP251bGw6W2Usbl19LHIubm9kZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ITAsZT0rdFswXSxuPSt0WzFdLHIpOmk/W2Usbl06bnVsbH0scn0sdHJlZW1hcDpmdW5jdGlvbiBfUigpe3ZhciB0PWtNLGU9ITEsbj0xLGk9MSxyPVswXSxvPWxNLGE9bE0scz1sTSxsPWxNLGM9bE07ZnVuY3Rpb24gdSh0KXtyZXR1cm4gdC54MD10LnkwPTAsdC54MT1uLHQueTE9aSx0LmVhY2hCZWZvcmUoaCkscj1bMF0sZSYmdC5lYWNoQmVmb3JlKGZNKSx0fWZ1bmN0aW9uIGgoZSl7dmFyIG49cltlLmRlcHRoXSxpPWUueDArbix1PWUueTArbixoPWUueDEtbixkPWUueTEtbjtoPGkmJihpPWg9KGkraCkvMiksZDx1JiYodT1kPSh1K2QpLzIpLGUueDA9aSxlLnkwPXUsZS54MT1oLGUueTE9ZCxlLmNoaWxkcmVuJiYobj1yW2UuZGVwdGgrMV09byhlKS8yLGkrPWMoZSktbix1Kz1hKGUpLW4sKGgtPXMoZSktbik8aSYmKGk9aD0oaStoKS8yKSwoZC09bChlKS1uKTx1JiYodT1kPSh1K2QpLzIpLHQoZSxpLHUsaCxkKSl9cmV0dXJuIHUucm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ISF0LHUpOmV9LHUuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdFswXSxpPSt0WzFdLHUpOltuLGldfSx1LnRpbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9c00oZSksdSk6dH0sdS5wYWRkaW5nPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3UucGFkZGluZ0lubmVyKHQpLnBhZGRpbmdPdXRlcih0KTp1LnBhZGRpbmdJbm5lcigpfSx1LnBhZGRpbmdJbm5lcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmNNKCt0KSx1KTpvfSx1LnBhZGRpbmdPdXRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD91LnBhZGRpbmdUb3AodCkucGFkZGluZ1JpZ2h0KHQpLnBhZGRpbmdCb3R0b20odCkucGFkZGluZ0xlZnQodCk6dS5wYWRkaW5nVG9wKCl9LHUucGFkZGluZ1RvcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmNNKCt0KSx1KTphfSx1LnBhZGRpbmdSaWdodD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmNNKCt0KSx1KTpzfSx1LnBhZGRpbmdCb3R0b209ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpjTSgrdCksdSk6bH0sdS5wYWRkaW5nTGVmdD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmNNKCt0KSx1KTpjfSx1fSx0cmVlbWFwQmluYXJ5OmZ1bmN0aW9uIHlSKHQsZSxuLGkscil7dmFyIG8sYSxzPXQuY2hpbGRyZW4sbD1zLmxlbmd0aCxjPW5ldyBBcnJheShsKzEpO2ZvcihjWzBdPWE9bz0wO288bDsrK28pY1tvKzFdPWErPXNbb10udmFsdWU7IShmdW5jdGlvbiB0KGUsbixpLHIsbyxhLGwpe2lmKGU+PW4tMSl7dmFyIHU9c1tlXTtyZXR1cm4gdS54MD1yLHUueTA9byx1LngxPWEsdm9pZCh1LnkxPWwpfXZhciBoPWNbZV0sZD1pLzIraCxwPWUrMSxmPW4tMTtmb3IoO3A8Zjspe3ZhciBtPXArZj4+PjE7Y1ttXTxkP3A9bSsxOmY9bX1kLWNbcC0xXTxjW3BdLWQmJmUrMTxwJiYtLXA7dmFyIGc9Y1twXS1oLF89aS1nO2lmKGEtcj5sLW8pe3ZhciB5PShyKl8rYSpnKS9pO3QoZSxwLGcscixvLHksbCksdChwLG4sXyx5LG8sYSxsKX1lbHNle3ZhciB2PShvKl8rbCpnKS9pO3QoZSxwLGcscixvLGEsdiksdChwLG4sXyxyLHYsYSxsKX19KSgwLGwsdC52YWx1ZSxlLG4saSxyKX0sdHJlZW1hcERpY2U6bU0sdHJlZW1hcFNsaWNlOlRNLHRyZWVtYXBTbGljZURpY2U6ZnVuY3Rpb24gdlIodCxlLG4saSxyKXsoMSZ0LmRlcHRoP1RNOm1NKSh0LGUsbixpLHIpfSx0cmVlbWFwU3F1YXJpZnk6a00sdHJlZW1hcFJlc3F1YXJpZnk6TE0saW50ZXJwb2xhdGU6Y3AsaW50ZXJwb2xhdGVBcnJheTpmdW5jdGlvbiBiUih0LGUpe3JldHVybihlcChlKT90cDpucCkodCxlKX0saW50ZXJwb2xhdGVCYXNpczpqZCxpbnRlcnBvbGF0ZUJhc2lzQ2xvc2VkOkdkLGludGVycG9sYXRlRGF0ZTppcCxpbnRlcnBvbGF0ZURpc2NyZXRlOmZ1bmN0aW9uIHhSKHQpe3ZhciBlPXQubGVuZ3RoO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdFtNYXRoLm1heCgwLE1hdGgubWluKGUtMSxNYXRoLmZsb29yKG4qZSkpKV19fSxpbnRlcnBvbGF0ZUh1ZTpmdW5jdGlvbiB3Uih0LGUpe3ZhciBuPVlkKCt0LCtlKTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGU9bih0KTtyZXR1cm4gZS0zNjAqTWF0aC5mbG9vcihlLzM2MCl9fSxpbnRlcnBvbGF0ZU51bWJlcjpycCxpbnRlcnBvbGF0ZU51bWJlckFycmF5OnRwLGludGVycG9sYXRlT2JqZWN0Om9wLGludGVycG9sYXRlUm91bmQ6dXAsaW50ZXJwb2xhdGVTdHJpbmc6bHAsaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3M6dnAsaW50ZXJwb2xhdGVUcmFuc2Zvcm1Tdmc6eHAsaW50ZXJwb2xhdGVab29tOkVwLGludGVycG9sYXRlUmdiOktkLGludGVycG9sYXRlUmdiQmFzaXM6SmQsaW50ZXJwb2xhdGVSZ2JCYXNpc0Nsb3NlZDpRZCxpbnRlcnBvbGF0ZUhzbDpDcCxpbnRlcnBvbGF0ZUhzbExvbmc6QXAsaW50ZXJwb2xhdGVMYWI6a3AsaW50ZXJwb2xhdGVIY2w6UHAsaW50ZXJwb2xhdGVIY2xMb25nOk5wLGludGVycG9sYXRlQ3ViZWhlbGl4OlJwLGludGVycG9sYXRlQ3ViZWhlbGl4TG9uZzpPcCxwaWVjZXdpc2U6ZnVuY3Rpb24gU1IodCxlKXtmb3IodmFyIG49MCxpPWUubGVuZ3RoLTEscj1lWzBdLG89bmV3IEFycmF5KGk8MD8wOmkpO248aTspb1tuXT10KHIscj1lWysrbl0pO3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT1NYXRoLm1heCgwLE1hdGgubWluKGktMSxNYXRoLmZsb29yKHQqPWkpKSk7cmV0dXJuIG9bZV0odC1lKX19LHF1YW50aXplOmZ1bmN0aW9uIE1SKHQsZSl7Zm9yKHZhciBuPW5ldyBBcnJheShlKSxpPTA7aTxlOysraSluW2ldPXQoaS8oZS0xKSk7cmV0dXJuIG59LHBhdGg6T2cscG9seWdvbkFyZWE6ZnVuY3Rpb24gRVIodCl7Zm9yKHZhciBlLG49LTEsaT10Lmxlbmd0aCxyPXRbaS0xXSxvPTA7KytuPGk7KW8rPShlPXIpWzFdKihyPXRbbl0pWzBdLWVbMF0qclsxXTtyZXR1cm4gby8yfSxwb2x5Z29uQ2VudHJvaWQ6ZnVuY3Rpb24gVFIodCl7Zm9yKHZhciBlLG4saT0tMSxyPXQubGVuZ3RoLG89MCxhPTAscz10W3ItMV0sbD0wOysraTxyOylsKz1uPShlPXMpWzBdKihzPXRbaV0pWzFdLXNbMF0qZVsxXSxvKz0oZVswXStzWzBdKSpuLGErPShlWzFdK3NbMV0pKm47cmV0dXJuW28vKGwqPTMpLGEvbF19LHBvbHlnb25IdWxsOmZ1bmN0aW9uIENSKHQpe2lmKChuPXQubGVuZ3RoKTwzKXJldHVybiBudWxsO3ZhciBlLG4saT1uZXcgQXJyYXkobikscj1uZXcgQXJyYXkobik7Zm9yKGU9MDtlPG47KytlKWlbZV09Wyt0W2VdWzBdLCt0W2VdWzFdLGVdO2ZvcihpLnNvcnQoTk0pLGU9MDtlPG47KytlKXJbZV09W2lbZV1bMF0sLWlbZV1bMV1dO3ZhciBvPUlNKGkpLGE9SU0ocikscz1hWzBdPT09b1swXSxsPWFbYS5sZW5ndGgtMV09PT1vW28ubGVuZ3RoLTFdLGM9W107Zm9yKGU9by5sZW5ndGgtMTtlPj0wOy0tZSljLnB1c2godFtpW29bZV1dWzJdXSk7Zm9yKGU9K3M7ZTxhLmxlbmd0aC1sOysrZSljLnB1c2godFtpW2FbZV1dWzJdXSk7cmV0dXJuIGN9LHBvbHlnb25Db250YWluczpmdW5jdGlvbiBBUih0LGUpe2Zvcih2YXIgbixpLHI9dC5sZW5ndGgsbz10W3ItMV0sYT1lWzBdLHM9ZVsxXSxsPW9bMF0sYz1vWzFdLHU9ITEsaD0wO2g8cjsrK2gpbj0obz10W2hdKVswXSwoaT1vWzFdKT5zIT1jPnMmJmE8KGwtbikqKHMtaSkvKGMtaSkrbiYmKHU9IXUpLGw9bixjPWk7cmV0dXJuIHV9LHBvbHlnb25MZW5ndGg6ZnVuY3Rpb24ga1IodCl7Zm9yKHZhciBlLG4saT0tMSxyPXQubGVuZ3RoLG89dFtyLTFdLGE9b1swXSxzPW9bMV0sbD0wOysraTxyOyllPWEsbj1zLGUtPWE9KG89dFtpXSlbMF0sbi09cz1vWzFdLGwrPU1hdGguc3FydChlKmUrbipuKTtyZXR1cm4gbH0scXVhZHRyZWU6dHkscmFuZG9tVW5pZm9ybTpPTSxyYW5kb21Ob3JtYWw6ek0scmFuZG9tTG9nTm9ybWFsOkRNLHJhbmRvbUJhdGVzOkhNLHJhbmRvbUlyd2luSGFsbDpCTSxyYW5kb21FeHBvbmVudGlhbDpGTSxzY2FsZUJhbmQ6WE0sc2NhbGVQb2ludDpLTSxzY2FsZUlkZW50aXR5OmZ1bmN0aW9uIHQoZSl7dmFyIG47ZnVuY3Rpb24gaSh0KXtyZXR1cm4gaXNOYU4odD0rdCk/bjp0fXJldHVybiBpLmludmVydD1pLGkuZG9tYWluPWkucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9R00uY2FsbCh0LFpNKSxpKTplLnNsaWNlKCl9LGkudW5rbm93bj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGkpOm59LGkuY29weT1mdW5jdGlvbigpe3JldHVybiB0KGUpLnVua25vd24obil9LGU9YXJndW1lbnRzLmxlbmd0aD9HTS5jYWxsKGUsWk0pOlswLDFdLGxFKGkpfSxzY2FsZUxpbmVhcjpjRSxzY2FsZUxvZzp5RSxzY2FsZVN5bWxvZzpmdW5jdGlvbiB0KCl7dmFyIGU9eEUob0UoKSk7cmV0dXJuIGUuY29weT1mdW5jdGlvbigpe3JldHVybiByRShlLHQoKSkuY29uc3RhbnQoZS5jb25zdGFudCgpKX0sVk0uYXBwbHkoZSxhcmd1bWVudHMpfSxzY2FsZU9yZGluYWw6WU0sc2NhbGVJbXBsaWNpdDpxTSxzY2FsZVBvdzpURSxzY2FsZVNxcnQ6ZnVuY3Rpb24gTFIoKXtyZXR1cm4gVEUuYXBwbHkobnVsbCxhcmd1bWVudHMpLmV4cG9uZW50KC41KX0sc2NhbGVRdWFudGlsZTpDRSxzY2FsZVF1YW50aXplOkFFLHNjYWxlVGhyZXNob2xkOmZ1bmN0aW9uIHQoKXt2YXIgZSxuPVsuNV0saT1bMCwxXSxyPTE7ZnVuY3Rpb24gbyh0KXtyZXR1cm4gdDw9dD9pW0RsKG4sdCwwLHIpXTplfXJldHVybiBvLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1XTS5jYWxsKHQpLHI9TWF0aC5taW4obi5sZW5ndGgsaS5sZW5ndGgtMSksbyk6bi5zbGljZSgpfSxvLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPVdNLmNhbGwodCkscj1NYXRoLm1pbihuLmxlbmd0aCxpLmxlbmd0aC0xKSxvKTppLnNsaWNlKCl9LG8uaW52ZXJ0RXh0ZW50PWZ1bmN0aW9uKHQpe3ZhciBlPWkuaW5kZXhPZih0KTtyZXR1cm5bbltlLTFdLG5bZV1dfSxvLnVua25vd249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxvKTplfSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLmRvbWFpbihuKS5yYW5nZShpKS51bmtub3duKGUpfSxWTS5hcHBseShvLGFyZ3VtZW50cyl9LHNjYWxlVGltZTp6QSxzY2FsZVV0YzpmdW5jdGlvbiBQUigpe3JldHVybiBWTS5hcHBseShPQShZVCxHVCxrVCxUVCxTVCxiVCxWRSxJRSxuQykuZG9tYWluKFtEYXRlLlVUQygyZTMsMCwxKSxEYXRlLlVUQygyZTMsMCwyKV0pLGFyZ3VtZW50cyl9LHNjYWxlU2VxdWVudGlhbDpmdW5jdGlvbiB0KCl7dmFyIGU9bEUoREEoKShRTSkpO3JldHVybiBlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gQkEoZSx0KCkpfSxVTS5hcHBseShlLGFyZ3VtZW50cyl9LHNjYWxlU2VxdWVudGlhbExvZzpmdW5jdGlvbiB0KCl7dmFyIGU9X0UoREEoKSkuZG9tYWluKFsxLDEwXSk7cmV0dXJuIGUuY29weT1mdW5jdGlvbigpe3JldHVybiBCQShlLHQoKSkuYmFzZShlLmJhc2UoKSl9LFVNLmFwcGx5KGUsYXJndW1lbnRzKX0sc2NhbGVTZXF1ZW50aWFsUG93OkhBLHNjYWxlU2VxdWVudGlhbFNxcnQ6ZnVuY3Rpb24gTlIoKXtyZXR1cm4gSEEuYXBwbHkobnVsbCxhcmd1bWVudHMpLmV4cG9uZW50KC41KX0sc2NhbGVTZXF1ZW50aWFsU3ltbG9nOmZ1bmN0aW9uIHQoKXt2YXIgZT14RShEQSgpKTtyZXR1cm4gZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIEJBKGUsdCgpKS5jb25zdGFudChlLmNvbnN0YW50KCkpfSxVTS5hcHBseShlLGFyZ3VtZW50cyl9LHNjYWxlU2VxdWVudGlhbFF1YW50aWxlOmZ1bmN0aW9uIHQoKXt2YXIgZT1bXSxuPVFNO2Z1bmN0aW9uIGkodCl7aWYoIWlzTmFOKHQ9K3QpKXJldHVybiBuKChEbChlLHQpLTEpLyhlLmxlbmd0aC0xKSl9cmV0dXJuIGkuZG9tYWluPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiBlLnNsaWNlKCk7ZT1bXTtmb3IodmFyIG4scj0wLG89dC5sZW5ndGg7cjxvOysrciludWxsPT0obj10W3JdKXx8aXNOYU4obj0rbil8fGUucHVzaChuKTtyZXR1cm4gZS5zb3J0KFJsKSxpfSxpLmludGVycG9sYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj10LGkpOm59LGkuY29weT1mdW5jdGlvbigpe3JldHVybiB0KG4pLmRvbWFpbihlKX0sVU0uYXBwbHkoaSxhcmd1bWVudHMpfSxzY2FsZURpdmVyZ2luZzpmdW5jdGlvbiB0KCl7dmFyIGU9bEUoRkEoKShRTSkpO3JldHVybiBlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gQkEoZSx0KCkpfSxVTS5hcHBseShlLGFyZ3VtZW50cyl9LHNjYWxlRGl2ZXJnaW5nTG9nOmZ1bmN0aW9uIHQoKXt2YXIgZT1fRShGQSgpKS5kb21haW4oWy4xLDEsMTBdKTtyZXR1cm4gZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIEJBKGUsdCgpKS5iYXNlKGUuYmFzZSgpKX0sVU0uYXBwbHkoZSxhcmd1bWVudHMpfSxzY2FsZURpdmVyZ2luZ1BvdzpWQSxzY2FsZURpdmVyZ2luZ1NxcnQ6ZnVuY3Rpb24gSVIoKXtyZXR1cm4gVkEuYXBwbHkobnVsbCxhcmd1bWVudHMpLmV4cG9uZW50KC41KX0sc2NhbGVEaXZlcmdpbmdTeW1sb2c6ZnVuY3Rpb24gdCgpe3ZhciBlPXhFKEZBKCkpO3JldHVybiBlLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gQkEoZSx0KCkpLmNvbnN0YW50KGUuY29uc3RhbnQoKSl9LFVNLmFwcGx5KGUsYXJndW1lbnRzKX0sdGlja0Zvcm1hdDpzRSxzY2hlbWVDYXRlZ29yeTEwOmpBLHNjaGVtZUFjY2VudDpHQSxzY2hlbWVEYXJrMjpXQSxzY2hlbWVQYWlyZWQ6cUEsc2NoZW1lUGFzdGVsMTpZQSxzY2hlbWVQYXN0ZWwyOlhBLHNjaGVtZVNldDE6JEEsc2NoZW1lU2V0MjpLQSxzY2hlbWVTZXQzOlpBLHNjaGVtZVRhYmxlYXUxMDpKQSxpbnRlcnBvbGF0ZUJyQkc6ZWssc2NoZW1lQnJCRzp0ayxpbnRlcnBvbGF0ZVBSR246aWssc2NoZW1lUFJHbjpuayxpbnRlcnBvbGF0ZVBpWUc6b2ssc2NoZW1lUGlZRzpyayxpbnRlcnBvbGF0ZVB1T3I6c2ssc2NoZW1lUHVPcjphayxpbnRlcnBvbGF0ZVJkQnU6Y2ssc2NoZW1lUmRCdTpsayxpbnRlcnBvbGF0ZVJkR3k6aGssc2NoZW1lUmRHeTp1ayxpbnRlcnBvbGF0ZVJkWWxCdTpwayxzY2hlbWVSZFlsQnU6ZGssaW50ZXJwb2xhdGVSZFlsR246bWssc2NoZW1lUmRZbEduOmZrLGludGVycG9sYXRlU3BlY3RyYWw6X2ssc2NoZW1lU3BlY3RyYWw6Z2ssaW50ZXJwb2xhdGVCdUduOnZrLHNjaGVtZUJ1R246eWssaW50ZXJwb2xhdGVCdVB1OnhrLHNjaGVtZUJ1UHU6YmssaW50ZXJwb2xhdGVHbkJ1OlNrLHNjaGVtZUduQnU6d2ssaW50ZXJwb2xhdGVPclJkOkVrLHNjaGVtZU9yUmQ6TWssaW50ZXJwb2xhdGVQdUJ1R246Q2ssc2NoZW1lUHVCdUduOlRrLGludGVycG9sYXRlUHVCdTprayxzY2hlbWVQdUJ1OkFrLGludGVycG9sYXRlUHVSZDpQayxzY2hlbWVQdVJkOkxrLGludGVycG9sYXRlUmRQdTpJayxzY2hlbWVSZFB1Ok5rLGludGVycG9sYXRlWWxHbkJ1Ok9rLHNjaGVtZVlsR25CdTpSayxpbnRlcnBvbGF0ZVlsR246RGssc2NoZW1lWWxHbjp6ayxpbnRlcnBvbGF0ZVlsT3JCcjpIayxzY2hlbWVZbE9yQnI6QmssaW50ZXJwb2xhdGVZbE9yUmQ6Vmssc2NoZW1lWWxPclJkOkZrLGludGVycG9sYXRlQmx1ZXM6amssc2NoZW1lQmx1ZXM6VWssaW50ZXJwb2xhdGVHcmVlbnM6V2ssc2NoZW1lR3JlZW5zOkdrLGludGVycG9sYXRlR3JleXM6WWssc2NoZW1lR3JleXM6cWssaW50ZXJwb2xhdGVQdXJwbGVzOiRrLHNjaGVtZVB1cnBsZXM6WGssaW50ZXJwb2xhdGVSZWRzOlprLHNjaGVtZVJlZHM6S2ssaW50ZXJwb2xhdGVPcmFuZ2VzOlFrLHNjaGVtZU9yYW5nZXM6SmssaW50ZXJwb2xhdGVDaXZpZGlzOmZ1bmN0aW9uIFJSKHQpe3JldHVybiB0PU1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSksInJnYigiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQoLTQuNTQtdCooMzUuMzQtdCooMjM4MS43My10Kig2NDAyLjctdCooNzAyNC43Mi0yNzEwLjU3KnQpKSkpKSkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCgzMi40OSt0KigxNzAuNzMrdCooNTIuODItdCooMTMxLjQ2LXQqKDE3Ni41OC02Ny4zNyp0KSkpKSkpKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQoODEuMjQrdCooNDQyLjM2LXQqKDI0ODIuNDMtdCooNjE2Ny4yNC10Kig2NjE0Ljk0LTI0NzUuNjcqdCkpKSkpKSkrIikifSxpbnRlcnBvbGF0ZUN1YmVoZWxpeERlZmF1bHQ6dEwsaW50ZXJwb2xhdGVSYWluYm93OmZ1bmN0aW9uIE9SKHQpeyh0PDB8fHQ+MSkmJih0LT1NYXRoLmZsb29yKHQpKTt2YXIgZT1NYXRoLmFicyh0LS41KTtyZXR1cm4gaUwuaD0zNjAqdC0xMDAsaUwucz0xLjUtMS41KmUsaUwubD0uOC0uOSplLGlMKyIifSxpbnRlcnBvbGF0ZVdhcm06ZUwsaW50ZXJwb2xhdGVDb29sOm5MLGludGVycG9sYXRlU2luZWJvdzpmdW5jdGlvbiB6Uih0KXt2YXIgZTtyZXR1cm4gdD0oLjUtdCkqTWF0aC5QSSxyTC5yPTI1NSooZT1NYXRoLnNpbih0KSkqZSxyTC5nPTI1NSooZT1NYXRoLnNpbih0K29MKSkqZSxyTC5iPTI1NSooZT1NYXRoLnNpbih0K2FMKSkqZSxyTCsiIn0saW50ZXJwb2xhdGVUdXJibzpmdW5jdGlvbiBEUih0KXtyZXR1cm4gdD1NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpLCJyZ2IoIitNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKDM0LjYxK3QqKDExNzIuMzMtdCooMTA3OTMuNTYtdCooMzMzMDAuMTItdCooMzgzOTQuNDktMTQ4MjUuMDUqdCkpKSkpKSkrIiwgIitNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKDIzLjMxK3QqKDU1Ny4zMyt0KigxMjI1LjMzLXQqKDM1NzQuOTYtdCooMTA3My43Nys3MDcuNTYqdCkpKSkpKSkrIiwgIitNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKDI3LjIrdCooMzIxMS4xLXQqKDE1MzI3Ljk3LXQqKDI3ODE0LXQqKDIyNTY5LjE4LTY4MzguNjYqdCkpKSkpKSkrIikifSxpbnRlcnBvbGF0ZVZpcmlkaXM6bEwsaW50ZXJwb2xhdGVNYWdtYTpjTCxpbnRlcnBvbGF0ZUluZmVybm86dUwsaW50ZXJwb2xhdGVQbGFzbWE6aEwsY3JlYXRlOmZ1bmN0aW9uIEJSKHQpe3JldHVybiBEdShOYyh0KS5jYWxsKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpfSxjcmVhdG9yOk5jLGxvY2FsOmdoLG1hdGNoZXI6RGMsbW91c2U6YmgsbmFtZXNwYWNlOmtjLG5hbWVzcGFjZXM6QWMsY2xpZW50UG9pbnQ6dmgsc2VsZWN0OkR1LHNlbGVjdEFsbDp4aCxzZWxlY3Rpb246enUsc2VsZWN0b3I6UmMsc2VsZWN0b3JBbGw6emMsc3R5bGU6UWMsdG91Y2g6d2gsdG91Y2hlczpmdW5jdGlvbiBIUih0LGUpe251bGw9PWUmJihlPXloKCkudG91Y2hlcyk7Zm9yKHZhciBuPTAsaT1lP2UubGVuZ3RoOjAscj1uZXcgQXJyYXkoaSk7bjxpOysrbilyW25dPXZoKHQsZVtuXSk7cmV0dXJuIHJ9LHdpbmRvdzokYyxnZXQgZXZlbnQoKXtyZXR1cm4gTXV9LGN1c3RvbUV2ZW50Okx1LGFyYzpmdW5jdGlvbiBGUigpe3ZhciB0PVRMLGU9Q0wsbj1kTCgwKSxpPW51bGwscj1BTCxvPWtMLGE9TEwscz1udWxsO2Z1bmN0aW9uIGwoKXt2YXIgbCxjLHU9K3QuYXBwbHkodGhpcyxhcmd1bWVudHMpLGg9K2UuYXBwbHkodGhpcyxhcmd1bWVudHMpLGQ9ci5hcHBseSh0aGlzLGFyZ3VtZW50cyktd0wscD1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKS13TCxmPXBMKHAtZCksbT1wPmQ7aWYoc3x8KHM9bD1PZygpKSxoPHUmJihjPWgsaD11LHU9YyksaD5iTClpZihmPlNMLWJMKXMubW92ZVRvKGgqbUwoZCksaCp5TChkKSkscy5hcmMoMCwwLGgsZCxwLCFtKSx1PmJMJiYocy5tb3ZlVG8odSptTChwKSx1KnlMKHApKSxzLmFyYygwLDAsdSxwLGQsbSkpO2Vsc2V7dmFyIGcsXyx5PWQsdj1wLGI9ZCx4PXAsdz1mLFM9ZixNPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpLzIsRT1NPmJMJiYoaT8raS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6dkwodSp1K2gqaCkpLFQ9X0wocEwoaC11KS8yLCtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksQz1ULEE9VDtpZihFPmJMKXt2YXIgaz1FTChFL3UqeUwoTSkpLEw9RUwoRS9oKnlMKE0pKTsody09MiprKT5iTD8oYis9ayo9bT8xOi0xLHgtPWspOih3PTAsYj14PShkK3ApLzIpLChTLT0yKkwpPmJMPyh5Kz1MKj1tPzE6LTEsdi09TCk6KFM9MCx5PXY9KGQrcCkvMil9dmFyIFA9aCptTCh5KSxOPWgqeUwoeSksST11Km1MKHgpLFI9dSp5TCh4KTtpZihUPmJMKXt2YXIgTyx6PWgqbUwodiksRD1oKnlMKHYpLEI9dSptTChiKSxIPXUqeUwoYik7aWYoZjx4TCYmKE89UEwoUCxOLEIsSCx6LEQsSSxSKSkpe3ZhciBGPVAtT1swXSxWPU4tT1sxXSxVPXotT1swXSxqPUQtT1sxXSxHPTEveUwoTUwoKEYqVStWKmopLyh2TChGKkYrVipWKSp2TChVKlUraipqKSkpLzIpLFc9dkwoT1swXSpPWzBdK09bMV0qT1sxXSk7Qz1fTChULCh1LVcpLyhHLTEpKSxBPV9MKFQsKGgtVykvKEcrMSkpfX1TPmJMP0E+Ykw/KGc9TkwoQixILFAsTixoLEEsbSksXz1OTCh6LEQsSSxSLGgsQSxtKSxzLm1vdmVUbyhnLmN4K2cueDAxLGcuY3krZy55MDEpLEE8VD9zLmFyYyhnLmN4LGcuY3ksQSxmTChnLnkwMSxnLngwMSksZkwoXy55MDEsXy54MDEpLCFtKToocy5hcmMoZy5jeCxnLmN5LEEsZkwoZy55MDEsZy54MDEpLGZMKGcueTExLGcueDExKSwhbSkscy5hcmMoMCwwLGgsZkwoZy5jeStnLnkxMSxnLmN4K2cueDExKSxmTChfLmN5K18ueTExLF8uY3grXy54MTEpLCFtKSxzLmFyYyhfLmN4LF8uY3ksQSxmTChfLnkxMSxfLngxMSksZkwoXy55MDEsXy54MDEpLCFtKSkpOihzLm1vdmVUbyhQLE4pLHMuYXJjKDAsMCxoLHksdiwhbSkpOnMubW92ZVRvKFAsTiksdT5iTCYmdz5iTD9DPmJMPyhnPU5MKEksUix6LEQsdSwtQyxtKSxfPU5MKFAsTixCLEgsdSwtQyxtKSxzLmxpbmVUbyhnLmN4K2cueDAxLGcuY3krZy55MDEpLEM8VD9zLmFyYyhnLmN4LGcuY3ksQyxmTChnLnkwMSxnLngwMSksZkwoXy55MDEsXy54MDEpLCFtKToocy5hcmMoZy5jeCxnLmN5LEMsZkwoZy55MDEsZy54MDEpLGZMKGcueTExLGcueDExKSwhbSkscy5hcmMoMCwwLHUsZkwoZy5jeStnLnkxMSxnLmN4K2cueDExKSxmTChfLmN5K18ueTExLF8uY3grXy54MTEpLG0pLHMuYXJjKF8uY3gsXy5jeSxDLGZMKF8ueTExLF8ueDExKSxmTChfLnkwMSxfLngwMSksIW0pKSk6cy5hcmMoMCwwLHUseCxiLG0pOnMubGluZVRvKEksUil9ZWxzZSBzLm1vdmVUbygwLDApO2lmKHMuY2xvc2VQYXRoKCksbClyZXR1cm4gcz1udWxsLGwrIiJ8fG51bGx9cmV0dXJuIGwuY2VudHJvaWQ9ZnVuY3Rpb24oKXt2YXIgbj0oK3QuYXBwbHkodGhpcyxhcmd1bWVudHMpKyArZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLzIsaT0oK3IuYXBwbHkodGhpcyxhcmd1bWVudHMpKyArby5hcHBseSh0aGlzLGFyZ3VtZW50cykpLzIteEwvMjtyZXR1cm5bbUwoaSkqbix5TChpKSpuXX0sbC5pbm5lclJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOmRMKCtlKSxsKTp0fSxsLm91dGVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ZEwoK3QpLGwpOmV9LGwuY29ybmVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ZEwoK3QpLGwpOm59LGwucGFkUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGw9PXQ/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OmRMKCt0KSxsKTppfSxsLnN0YXJ0QW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpkTCgrdCksbCk6cn0sbC5lbmRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmRMKCt0KSxsKTpvfSxsLnBhZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ZEwoK3QpLGwpOmF9LGwuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1udWxsPT10P251bGw6dCxsKTpzfSxsfSxhcmVhOkJMLGxpbmU6REwscGllOmZ1bmN0aW9uIFZSKCl7dmFyIHQ9RkwsZT1ITCxuPW51bGwsaT1kTCgwKSxyPWRMKFNMKSxvPWRMKDApO2Z1bmN0aW9uIGEoYSl7dmFyIHMsbCxjLHUsaCxkPWEubGVuZ3RoLHA9MCxmPW5ldyBBcnJheShkKSxtPW5ldyBBcnJheShkKSxnPStpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxfPU1hdGgubWluKFNMLE1hdGgubWF4KC1TTCxyLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1nKSkseT1NYXRoLm1pbihNYXRoLmFicyhfKS9kLG8uYXBwbHkodGhpcyxhcmd1bWVudHMpKSx2PXkqKF88MD8tMToxKTtmb3Iocz0wO3M8ZDsrK3MpKGg9bVtmW3NdPXNdPSt0KGFbc10scyxhKSk+MCYmKHArPWgpO2ZvcihudWxsIT1lP2Yuc29ydCgoZnVuY3Rpb24odCxuKXtyZXR1cm4gZShtW3RdLG1bbl0pfSkpOm51bGwhPW4mJmYuc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gbihhW3RdLGFbZV0pfSkpLHM9MCxjPXA/KF8tZCp2KS9wOjA7czxkOysrcyxnPXUpbVtsPWZbc11dPXtkYXRhOmFbbF0saW5kZXg6cyx2YWx1ZTpoPW1bbF0sc3RhcnRBbmdsZTpnLGVuZEFuZ2xlOnU9ZysoaD4wP2gqYzowKSt2LHBhZEFuZ2xlOnl9O3JldHVybiBtfXJldHVybiBhLnZhbHVlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6ZEwoK2UpLGEpOnR9LGEuc29ydFZhbHVlcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LG49bnVsbCxhKTplfSxhLnNvcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxlPW51bGwsYSk6bn0sYS5zdGFydEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ZEwoK3QpLGEpOml9LGEuZW5kQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpkTCgrdCksYSk6cn0sYS5wYWRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmRMKCt0KSxhKTpvfSxhfSxhcmVhUmFkaWFsOnFMLHJhZGlhbEFyZWE6cUwsbGluZVJhZGlhbDpXTCxyYWRpYWxMaW5lOldMLHBvaW50UmFkaWFsOllMLGxpbmtIb3Jpem9udGFsOmZ1bmN0aW9uIFVSKCl7cmV0dXJuIFpMKEpMKX0sbGlua1ZlcnRpY2FsOmZ1bmN0aW9uIGpSKCl7cmV0dXJuIFpMKFFMKX0sbGlua1JhZGlhbDpmdW5jdGlvbiBHUigpe3ZhciB0PVpMKHRQKTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnJhZGl1cz10LnksZGVsZXRlIHQueSx0fSxzeW1ib2w6ZnVuY3Rpb24gV1IoKXt2YXIgdD1kTChlUCksZT1kTCg2NCksbj1udWxsO2Z1bmN0aW9uIGkoKXt2YXIgaTtpZihufHwobj1pPU9nKCkpLHQuYXBwbHkodGhpcyxhcmd1bWVudHMpLmRyYXcobiwrZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLGkpcmV0dXJuIG49bnVsbCxpKyIifHxudWxsfXJldHVybiBpLnR5cGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpkTChlKSxpKTp0fSxpLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpkTCgrdCksaSk6ZX0saS5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPW51bGw9PXQ/bnVsbDp0LGkpOm59LGl9LHN5bWJvbHM6eVAsc3ltYm9sQ2lyY2xlOmVQLHN5bWJvbENyb3NzOm5QLHN5bWJvbERpYW1vbmQ6b1Asc3ltYm9sU3F1YXJlOnVQLHN5bWJvbFN0YXI6Y1Asc3ltYm9sVHJpYW5nbGU6ZFAsc3ltYm9sV3llOl9QLGN1cnZlQmFzaXNDbG9zZWQ6ZnVuY3Rpb24gcVIodCl7cmV0dXJuIG5ldyBTUCh0KX0sY3VydmVCYXNpc09wZW46ZnVuY3Rpb24gWVIodCl7cmV0dXJuIG5ldyBNUCh0KX0sY3VydmVCYXNpczp3UCxjdXJ2ZUJ1bmRsZTpUUCxjdXJ2ZUNhcmRpbmFsQ2xvc2VkOlBQLGN1cnZlQ2FyZGluYWxPcGVuOklQLGN1cnZlQ2FyZGluYWw6a1AsY3VydmVDYXRtdWxsUm9tQ2xvc2VkOkJQLGN1cnZlQ2F0bXVsbFJvbU9wZW46RlAsY3VydmVDYXRtdWxsUm9tOnpQLGN1cnZlTGluZWFyQ2xvc2VkOmZ1bmN0aW9uIFhSKHQpe3JldHVybiBuZXcgVlAodCl9LGN1cnZlTGluZWFyOlJMLGN1cnZlTW9ub3RvbmVYOmZ1bmN0aW9uICRSKHQpe3JldHVybiBuZXcgcVAodCl9LGN1cnZlTW9ub3RvbmVZOmZ1bmN0aW9uIEtSKHQpe3JldHVybiBuZXcgWVAodCl9LGN1cnZlTmF0dXJhbDpmdW5jdGlvbiBaUih0KXtyZXR1cm4gbmV3ICRQKHQpfSxjdXJ2ZVN0ZXA6ZnVuY3Rpb24gSlIodCl7cmV0dXJuIG5ldyBaUCh0LC41KX0sY3VydmVTdGVwQWZ0ZXI6ZnVuY3Rpb24gUVIodCl7cmV0dXJuIG5ldyBaUCh0LDEpfSxjdXJ2ZVN0ZXBCZWZvcmU6ZnVuY3Rpb24gdE8odCl7cmV0dXJuIG5ldyBaUCh0LDApfSxzdGFjazpmdW5jdGlvbiBlTygpe3ZhciB0PWRMKFtdKSxlPVFQLG49SlAsaT10TjtmdW5jdGlvbiByKHIpe3ZhciBvLGEscz10LmFwcGx5KHRoaXMsYXJndW1lbnRzKSxsPXIubGVuZ3RoLGM9cy5sZW5ndGgsdT1uZXcgQXJyYXkoYyk7Zm9yKG89MDtvPGM7KytvKXtmb3IodmFyIGgsZD1zW29dLHA9dVtvXT1uZXcgQXJyYXkobCksZj0wO2Y8bDsrK2YpcFtmXT1oPVswLCtpKHJbZl0sZCxmLHIpXSxoLmRhdGE9cltmXTtwLmtleT1kfWZvcihvPTAsYT1lKHUpO288YzsrK28pdVthW29dXS5pbmRleD1vO3JldHVybiBuKHUsYSksdX1yZXR1cm4gci5rZXlzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6ZEwoWEwuY2FsbChlKSkscik6dH0sci52YWx1ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OmRMKCt0KSxyKTppfSxyLm9yZGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPW51bGw9PXQ/UVA6ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpkTChYTC5jYWxsKHQpKSxyKTplfSxyLm9mZnNldD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1udWxsPT10P0pQOnQscik6bn0scn0sc3RhY2tPZmZzZXRFeHBhbmQ6ZnVuY3Rpb24gbk8odCxlKXtpZigoaT10Lmxlbmd0aCk+MCl7Zm9yKHZhciBuLGkscixvPTAsYT10WzBdLmxlbmd0aDtvPGE7KytvKXtmb3Iocj1uPTA7bjxpOysrbilyKz10W25dW29dWzFdfHwwO2lmKHIpZm9yKG49MDtuPGk7KytuKXRbbl1bb11bMV0vPXJ9SlAodCxlKX19LHN0YWNrT2Zmc2V0RGl2ZXJnaW5nOmZ1bmN0aW9uIGlPKHQsZSl7aWYoKHM9dC5sZW5ndGgpPjApZm9yKHZhciBuLGkscixvLGEscyxsPTAsYz10W2VbMF1dLmxlbmd0aDtsPGM7KytsKWZvcihvPWE9MCxuPTA7bjxzOysrbikocj0oaT10W2Vbbl1dW2xdKVsxXS1pWzBdKT4wPyhpWzBdPW8saVsxXT1vKz1yKTpyPDA/KGlbMV09YSxpWzBdPWErPXIpOihpWzBdPTAsaVsxXT1yKX0sc3RhY2tPZmZzZXROb25lOkpQLHN0YWNrT2Zmc2V0U2lsaG91ZXR0ZTpmdW5jdGlvbiByTyh0LGUpe2lmKChuPXQubGVuZ3RoKT4wKXtmb3IodmFyIG4saT0wLHI9dFtlWzBdXSxvPXIubGVuZ3RoO2k8bzsrK2kpe2Zvcih2YXIgYT0wLHM9MDthPG47KythKXMrPXRbYV1baV1bMV18fDA7cltpXVsxXSs9cltpXVswXT0tcy8yfUpQKHQsZSl9fSxzdGFja09mZnNldFdpZ2dsZTpmdW5jdGlvbiBvTyh0LGUpe2lmKChyPXQubGVuZ3RoKT4wJiYoaT0obj10W2VbMF1dKS5sZW5ndGgpPjApe2Zvcih2YXIgbixpLHIsbz0wLGE9MTthPGk7KythKXtmb3IodmFyIHM9MCxsPTAsYz0wO3M8cjsrK3Mpe2Zvcih2YXIgdT10W2Vbc11dLGg9dVthXVsxXXx8MCxkPShoLSh1W2EtMV1bMV18fDApKS8yLHA9MDtwPHM7KytwKXt2YXIgZj10W2VbcF1dO2QrPShmW2FdWzFdfHwwKS0oZlthLTFdWzFdfHwwKX1sKz1oLGMrPWQqaH1uW2EtMV1bMV0rPW5bYS0xXVswXT1vLGwmJihvLT1jL2wpfW5bYS0xXVsxXSs9blthLTFdWzBdPW8sSlAodCxlKX19LHN0YWNrT3JkZXJBcHBlYXJhbmNlOmVOLHN0YWNrT3JkZXJBc2NlbmRpbmc6aU4sc3RhY2tPcmRlckRlc2NlbmRpbmc6ZnVuY3Rpb24gYU8odCl7cmV0dXJuIGlOKHQpLnJldmVyc2UoKX0sc3RhY2tPcmRlckluc2lkZU91dDpmdW5jdGlvbiBzTyh0KXt2YXIgZSxuLGk9dC5sZW5ndGgscj10Lm1hcChyTiksbz1lTih0KSxhPTAscz0wLGw9W10sYz1bXTtmb3IoZT0wO2U8aTsrK2Upbj1vW2VdLGE8cz8oYSs9cltuXSxsLnB1c2gobikpOihzKz1yW25dLGMucHVzaChuKSk7cmV0dXJuIGMucmV2ZXJzZSgpLmNvbmNhdChsKX0sc3RhY2tPcmRlck5vbmU6UVAsc3RhY2tPcmRlclJldmVyc2U6ZnVuY3Rpb24gbE8odCl7cmV0dXJuIFFQKHQpLnJldmVyc2UoKX0sdGltZUludGVydmFsOlBFLHRpbWVNaWxsaXNlY29uZDpJRSx0aW1lTWlsbGlzZWNvbmRzOlJFLHV0Y01pbGxpc2Vjb25kOklFLHV0Y01pbGxpc2Vjb25kczpSRSx0aW1lU2Vjb25kOlZFLHRpbWVTZWNvbmRzOlVFLHV0Y1NlY29uZDpWRSx1dGNTZWNvbmRzOlVFLHRpbWVNaW51dGU6R0UsdGltZU1pbnV0ZXM6V0UsdGltZUhvdXI6WUUsdGltZUhvdXJzOlhFLHRpbWVEYXk6S0UsdGltZURheXM6WkUsdGltZVdlZWs6UUUsdGltZVdlZWtzOmFULHRpbWVTdW5kYXk6UUUsdGltZVN1bmRheXM6YVQsdGltZU1vbmRheTp0VCx0aW1lTW9uZGF5czpzVCx0aW1lVHVlc2RheTplVCx0aW1lVHVlc2RheXM6bFQsdGltZVdlZG5lc2RheTpuVCx0aW1lV2VkbmVzZGF5czpjVCx0aW1lVGh1cnNkYXk6aVQsdGltZVRodXJzZGF5czp1VCx0aW1lRnJpZGF5OnJULHRpbWVGcmlkYXlzOmhULHRpbWVTYXR1cmRheTpvVCx0aW1lU2F0dXJkYXlzOmRULHRpbWVNb250aDpmVCx0aW1lTW9udGhzOm1ULHRpbWVZZWFyOl9ULHRpbWVZZWFyczp5VCx1dGNNaW51dGU6YlQsdXRjTWludXRlczp4VCx1dGNIb3VyOlNULHV0Y0hvdXJzOk1ULHV0Y0RheTpUVCx1dGNEYXlzOkNULHV0Y1dlZWs6a1QsdXRjV2Vla3M6elQsdXRjU3VuZGF5OmtULHV0Y1N1bmRheXM6elQsdXRjTW9uZGF5OkxULHV0Y01vbmRheXM6RFQsdXRjVHVlc2RheTpQVCx1dGNUdWVzZGF5czpCVCx1dGNXZWRuZXNkYXk6TlQsdXRjV2VkbmVzZGF5czpIVCx1dGNUaHVyc2RheTpJVCx1dGNUaHVyc2RheXM6RlQsdXRjRnJpZGF5OlJULHV0Y0ZyaWRheXM6VlQsdXRjU2F0dXJkYXk6T1QsdXRjU2F0dXJkYXlzOlVULHV0Y01vbnRoOkdULHV0Y01vbnRoczpXVCx1dGNZZWFyOllULHV0Y1llYXJzOlhULHRpbWVGb3JtYXREZWZhdWx0TG9jYWxlOnhBLGdldCB0aW1lRm9ybWF0KCl7cmV0dXJuIHRDfSxnZXQgdGltZVBhcnNlKCl7cmV0dXJuIGVDfSxnZXQgdXRjRm9ybWF0KCl7cmV0dXJuIG5DfSxnZXQgdXRjUGFyc2UoKXtyZXR1cm4gaUN9LHRpbWVGb3JtYXRMb2NhbGU6SlQsaXNvRm9ybWF0OlNBLGlzb1BhcnNlOkVBLG5vdzpxcCx0aW1lcjokcCx0aW1lckZsdXNoOktwLHRpbWVvdXQ6dGYsaW50ZXJ2YWw6ZnVuY3Rpb24gY08odCxlLG4pe3ZhciBpPW5ldyBYcCxyPWU7cmV0dXJuIG51bGw9PWU/KGkucmVzdGFydCh0LGUsbiksaSk6KGU9K2Usbj1udWxsPT1uP3FwKCk6K24saS5yZXN0YXJ0KChmdW5jdGlvbiBvKGEpe2ErPXIsaS5yZXN0YXJ0KG8scis9ZSxuKSx0KGEpfSksZSxuKSxpKX0sdHJhbnNpdGlvbjpEZixhY3RpdmU6ZnVuY3Rpb24gdU8odCxlKXt2YXIgbixpLHI9dC5fX3RyYW5zaXRpb247aWYocilmb3IoaSBpbiBlPW51bGw9PWU/bnVsbDplKyIiLHIpaWYoKG49cltpXSkuc3RhdGU+MSYmbi5uYW1lPT09ZSlyZXR1cm4gbmV3IHpmKFtbdF1dLFdtLGUsK2kpO3JldHVybiBudWxsfSxpbnRlcnJ1cHQ6bGYsdm9yb25vaTpmdW5jdGlvbiBoTygpe3ZhciB0PWFOLGU9c04sbj1udWxsO2Z1bmN0aW9uIGkoaSl7cmV0dXJuIG5ldyBVTihpLm1hcCgoZnVuY3Rpb24obixyKXt2YXIgbz1bTWF0aC5yb3VuZCh0KG4scixpKS9CTikqQk4sTWF0aC5yb3VuZChlKG4scixpKS9CTikqQk5dO3JldHVybiBvLmluZGV4PXIsby5kYXRhPW4sb30pKSxuKX1yZXR1cm4gaS5wb2x5Z29ucz1mdW5jdGlvbih0KXtyZXR1cm4gaSh0KS5wb2x5Z29ucygpfSxpLmxpbmtzPWZ1bmN0aW9uKHQpe3JldHVybiBpKHQpLmxpbmtzKCl9LGkudHJpYW5nbGVzPWZ1bmN0aW9uKHQpe3JldHVybiBpKHQpLnRyaWFuZ2xlcygpfSxpLng9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpvTigrZSksaSk6dH0saS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6b04oK3QpLGkpOmV9LGkuZXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPW51bGw9PXQ/bnVsbDpbWyt0WzBdWzBdLCt0WzBdWzFdXSxbK3RbMV1bMF0sK3RbMV1bMV1dXSxpKTpuJiZbW25bMF1bMF0sblswXVsxXV0sW25bMV1bMF0sblsxXVsxXV1dfSxpLnNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49bnVsbD09dD9udWxsOltbMCwwXSxbK3RbMF0sK3RbMV1dXSxpKTpuJiZbblsxXVswXS1uWzBdWzBdLG5bMV1bMV0tblswXVsxXV19LGl9LHpvb206bkksem9vbVRyYW5zZm9ybTpZTix6b29tSWRlbnRpdHk6cU59KTtjbGFzcyBkTyBleHRlbmRzIGtse2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9leHBlcmltZW50cz1bXX1sb2FkKCl7Y29uc3QgdD1FcigpLmV4cGVyaW1lbnRzKCk7cmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdCh0KS50aGVuKCh0PT57Q2UuZXhwb3J0cy5pc0VxdWFsKHRoaXMuX2V4cGVyaW1lbnRzLHQpfHwodGhpcy5fZXhwZXJpbWVudHM9dCx0aGlzLmVtaXRDaGFuZ2UoKSl9KSl9Z2V0RXhwZXJpbWVudHMoKXtyZXR1cm4gdGhpcy5fZXhwZXJpbWVudHMuc2xpY2UoKX19Y29uc3QgcE89bmV3IGRPLGZPPVsiI2ZmNzA0MyIsIiMwMDc3YmIiLCIjY2MzMzExIiwiIzMzYmJlZSIsIiNlZTMzNzciLCIjMDA5OTg4IiwiI2JiYmJiYiJdO2NsYXNzIG1Pe2NvbnN0cnVjdG9yKHQ9Zk8pe3RoaXMucGFsZXR0ZT10LHRoaXMuaWRlbnRpZmllcnM9amcoKX1zZXREb21haW4odCl7cmV0dXJuIHRoaXMuaWRlbnRpZmllcnM9amcoKSx0LmZvckVhY2goKCh0LGUpPT57dGhpcy5pZGVudGlmaWVycy5zZXQodCx0aGlzLnBhbGV0dGVbZSV0aGlzLnBhbGV0dGUubGVuZ3RoXSl9KSksdGhpc31nZXRDb2xvcih0KXtpZighdGhpcy5pZGVudGlmaWVycy5oYXModCkpdGhyb3cgbmV3IEVycm9yKGBTdHJpbmcgJHt0fSB3YXMgbm90IGluIHRoZSBkb21haW4uYCk7cmV0dXJuIHRoaXMuaWRlbnRpZmllcnMuZ2V0KHQpfX1mdW5jdGlvbiBnTyh0LGUpe2NvbnN0IG49bmV3IG1PO2Z1bmN0aW9uIGkoKXtuLnNldERvbWFpbihlKCkpfXJldHVybiB0LmFkZExpc3RlbmVyKGkpLGkoKSx0PT5uLmdldENvbG9yKHQpfWNvbnN0IF9PPWdPKElsLCgoKT0+SWwuZ2V0UnVucygpKSk7Z08ocE8sKCgpPT5wTy5nZXRFeHBlcmltZW50cygpLm1hcCgoKHtuYW1lOnR9KT0+dCkpKSksbWwoe21vZHVsZU5hbWU6InJ1bi1jb2xvci1zdHlsZSIsc3R5bGVDb250ZW50OiJcbiAgICBbY29sb3ItY2xhc3M9J2xpZ2h0LWJsdWUnXSBwYXBlci1jaGVja2JveCB7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWxpZ2h0LWJsdWUtNTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWxpZ2h0LWJsdWUtNTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1saWdodC1ibHVlLTkwMCk7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWxpZ2h0LWJsdWUtOTAwKTtcbiAgICB9XG4gICAgW2NvbG9yLWNsYXNzPSdyZWQnXSBwYXBlci1jaGVja2JveCB7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXJlZC01MDApO1xuICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcmVkLTUwMCk7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcmVkLTkwMCk7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXJlZC05MDApO1xuICAgIH1cbiAgICBbY29sb3ItY2xhc3M9J2dyZWVuJ10gcGFwZXItY2hlY2tib3gge1xuICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1ncmVlbi01MDApO1xuICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItZ3JlZW4tNTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1ncmVlbi05MDApO1xuICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1ncmVlbi05MDApO1xuICAgIH1cbiAgICBbY29sb3ItY2xhc3M9J3B1cnBsZSddIHBhcGVyLWNoZWNrYm94IHtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcHVycGxlLTUwMCk7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1wdXJwbGUtNTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1wdXJwbGUtOTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcHVycGxlLTkwMCk7XG4gICAgfVxuICAgIFtjb2xvci1jbGFzcz0ndGVhbCddIHBhcGVyLWNoZWNrYm94IHtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItdGVhbC01MDApO1xuICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItdGVhbC01MDApO1xuICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXRlYWwtOTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItdGVhbC05MDApO1xuICAgIH1cbiAgICBbY29sb3ItY2xhc3M9J3BpbmsnXSBwYXBlci1jaGVja2JveCB7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXBpbmstNTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXBpbmstNTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1waW5rLTkwMCk7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXBpbmstOTAwKTtcbiAgICB9XG4gICAgW2NvbG9yLWNsYXNzPSdvcmFuZ2UnXSBwYXBlci1jaGVja2JveCB7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLW9yYW5nZS01MDApO1xuICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTUwMCk7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTkwMCk7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLW9yYW5nZS05MDApO1xuICAgIH1cbiAgICBbY29sb3ItY2xhc3M9J2Jyb3duJ10gcGFwZXItY2hlY2tib3gge1xuICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1icm93bi01MDApO1xuICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItYnJvd24tNTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1icm93bi05MDApO1xuICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1icm93bi05MDApO1xuICAgIH1cbiAgICBbY29sb3ItY2xhc3M9J2luZGlnbyddIHBhcGVyLWNoZWNrYm94IHtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTUwMCk7XG4gICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tNTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tOTAwKTtcbiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTkwMCk7XG4gICAgfVxuICAifSk7bGV0IHlPPWNsYXNzIGV4dGVuZHMoY3Iod2UpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5uYW1lcz1bXSx0aGlzLmNvbG9yaW5nPXtnZXRDb2xvcjooKT0+IiJ9LHRoaXMucmVnZXg9IiIsdGhpcy5zZWxlY3Rpb25TdGF0ZT17fSx0aGlzLm1heE5hbWVzVG9FbmFibGVCeURlZmF1bHQ9NDAsdGhpcy5fZGVib3VuY2VkUmVnZXhDaGFuZ2U9dGhpcy5fZGVib3VuY2VkUmVnZXhDaGFuZ2VJbXBsKCl9X2RlYm91bmNlZFJlZ2V4Q2hhbmdlSW1wbCgpe3ZhciB0PUNlLmV4cG9ydHMuZGVib3VuY2UoKHQ9Pnt0aGlzLnJlZ2V4PXR9KSwxNTAse2xlYWRpbmc6ITF9KTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLiQkKCIjbmFtZXMtcmVnZXgiKS52YWx1ZTsiIj09ZT90aGlzLmFzeW5jKCgoKT0+e3RoaXMucmVnZXg9ZX0pLDMwKTp0KGUpfX1nZXQgX3JlZ2V4KCl7dmFyIHQ9dGhpcy5yZWdleDt0cnl7cmV0dXJuIG5ldyBSZWdFeHAodCl9Y2F0Y2godCl7cmV0dXJuIG51bGx9fV9zZXRJc29sYXRvckljb24oKXt2YXIgdD10aGlzLnNlbGVjdGlvblN0YXRlLGU9Q2UuZXhwb3J0cy5maWx0ZXIoQ2UuZXhwb3J0cy52YWx1ZXModCkpLmxlbmd0aDtBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgiLmlzb2xhdG9yIikpLmZvckVhY2goKGZ1bmN0aW9uKG4pe24uaWNvbj0xPT09ZSYmdFtuLm5hbWVdPyJyYWRpby1idXR0b24tY2hlY2tlZCI6InJhZGlvLWJ1dHRvbi11bmNoZWNrZWQifSkpfWNvbXB1dGVOYW1lc01hdGNoaW5nUmVnZXgodCxlKXtjb25zdCBuPXRoaXMuX3JlZ2V4O3JldHVybiBuP3RoaXMubmFtZXMuZmlsdGVyKCh0PT5uLnRlc3QodCkpKTp0aGlzLm5hbWVzfWNvbXB1dGVPdXRTZWxlY3RlZCh0LGUpe3ZhciBuPXRoaXMuc2VsZWN0aW9uU3RhdGUsaT10aGlzLm5hbWVzTWF0Y2hpbmdSZWdleC5sZW5ndGg8PXRoaXMubWF4TmFtZXNUb0VuYWJsZUJ5RGVmYXVsdDtyZXR1cm4gdGhpcy5uYW1lc01hdGNoaW5nUmVnZXguZmlsdGVyKCh0PT5udWxsPT1uW3RdP2k6blt0XSkpfXN5bmNocm9uaXplQ29sb3JzKHQpe3RoaXMuX3NldElzb2xhdG9ySWNvbigpO3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJwYXBlci1jaGVja2JveCIpLmZvckVhY2goKHQ9Pntjb25zdCBlPXRoaXMuY29sb3JpbmcuZ2V0Q29sb3IodC5uYW1lKTt0LnVwZGF0ZVN0eWxlcyh7Ii0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvciI6ZSwiLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvciI6ZSwiLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3IiOmUsIi0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvciI6ZX0pfSkpO3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIuaXNvbGF0b3IiKS5mb3JFYWNoKCh0PT57Y29uc3QgZT10aGlzLmNvbG9yaW5nLmdldENvbG9yKHQubmFtZSk7dC5zdHlsZS5jb2xvcj1lfSkpLHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT57dGhpcy51cGRhdGVTdHlsZXMoKX0pKX1faXNvbGF0ZU5hbWUodCl7dmFyIGU9dC50YXJnZXQubmFtZSxuPXt9O3RoaXMubmFtZXMuZm9yRWFjaCgoZnVuY3Rpb24odCl7blt0XT10PT1lfSkpLHRoaXMuc2VsZWN0aW9uU3RhdGU9bn1fY2hlY2tib3hDaGFuZ2UodCl7dmFyIGU9dC50YXJnZXQ7Y29uc3Qgbj1DZS5leHBvcnRzLmNsb25lKHRoaXMuc2VsZWN0aW9uU3RhdGUpO25bZS5uYW1lXT1lLmNoZWNrZWQsdGhpcy5zZWxlY3Rpb25TdGF0ZT1ufV9pc0NoZWNrZWQodCxlKXtyZXR1cm4tMSE9dGhpcy5vdXRTZWxlY3RlZC5pbmRleE9mKHQpfXRvZ2dsZUFsbCgpe2NvbnN0IHQ9dGhpcy5uYW1lc01hdGNoaW5nUmVnZXguc29tZSgodD0+dGhpcy5vdXRTZWxlY3RlZC5pbmNsdWRlcyh0KSkpLGU9e307dGhpcy5uYW1lcy5mb3JFYWNoKChuPT57ZVtuXT0hdH0pKSx0aGlzLnNlbGVjdGlvblN0YXRlPWV9fTt5Ty50ZW1wbGF0ZT14ZWAKICAgIDxzdHlsZSBpbmNsdWRlPSJzY3JvbGxiYXItc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icnVuLWNvbG9yLXN0eWxlIj48L3N0eWxlPgoKICAgIDxwYXBlci1pbnB1dAogICAgICBpZD0ibmFtZXMtcmVnZXgiCiAgICAgIG5vLWxhYmVsLWZsb2F0PSIiCiAgICAgIGxhYmVsPSJXcml0ZSBhIHJlZ2V4IHRvIGZpbHRlciBydW5zIgogICAgICB2YWx1ZT0iW1tyZWdleF1dIgogICAgICBvbi1iaW5kLXZhbHVlLWNoYW5nZWQ9Il9kZWJvdW5jZWRSZWdleENoYW5nZSIKICAgID48L3BhcGVyLWlucHV0PgogICAgPGRpdiBpZD0ib3V0ZXItY29udGFpbmVyIiBjbGFzcz0ic2Nyb2xsYmFyIj4KICAgICAgPHRlbXBsYXRlCiAgICAgICAgaXM9ImRvbS1yZXBlYXQiCiAgICAgICAgaXRlbXM9IltbbmFtZXNNYXRjaGluZ1JlZ2V4XV0iCiAgICAgICAgb24tZG9tLWNoYW5nZT0ic3luY2hyb25pemVDb2xvcnMiCiAgICAgID4KICAgICAgICA8ZGl2IGNsYXNzPSJuYW1lLXJvdyI+CiAgICAgICAgICA8ZGl2CiAgICAgICAgICAgIGNsYXNzPSJpY29uLWNvbnRhaW5lciBjaGVja2JveC1jb250YWluZXIgdmVydGljYWwtYWxpZ24tY29udGFpbmVyIgogICAgICAgICAgPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3gKICAgICAgICAgICAgICBjbGFzcz0iY2hlY2tib3ggdmVydGljYWwtYWxpZ24tY2VudGVyIgogICAgICAgICAgICAgIGlkJD0iY2hlY2tib3gtW1tpdGVtXV0iCiAgICAgICAgICAgICAgbmFtZT0iW1tpdGVtXV0iCiAgICAgICAgICAgICAgY2hlY2tlZCQ9IltbX2lzQ2hlY2tlZChpdGVtLCBzZWxlY3Rpb25TdGF0ZS4qKV1dIgogICAgICAgICAgICAgIG9uLWNoYW5nZT0iX2NoZWNrYm94Q2hhbmdlIgogICAgICAgICAgICA+PC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdgogICAgICAgICAgICBjbGFzcz0iaWNvbi1jb250YWluZXIgaXNvbGF0b3ItY29udGFpbmVyIHZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciIKICAgICAgICAgID4KICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgICAgICAgaWNvbj0icmFkaW8tYnV0dG9uLXVuY2hlY2tlZCIKICAgICAgICAgICAgICBjbGFzcz0iaXNvbGF0b3IgdmVydGljYWwtYWxpZ24tY2VudGVyIgogICAgICAgICAgICAgIG9uLXRhcD0iX2lzb2xhdGVOYW1lIgogICAgICAgICAgICAgIG5hbWU9IltbaXRlbV1dIgogICAgICAgICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iaXRlbS1sYWJlbC1jb250YWluZXIiPgogICAgICAgICAgICA8c3Bhbj5bW2l0ZW1dXTwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIHBhcGVyLWlucHV0IHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgIH0KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAjb3V0ZXItY29udGFpbmVyIHsKICAgICAgICBjb250YWluOiBjb250ZW50OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgfQogICAgICAubmFtZS1yb3cgewogICAgICAgIGNvbnRhaW46IGNvbnRlbnQ7CiAgICAgICAgcGFkZGluZy10b3A6IDVweDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogNXB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgd29yZC1icmVhazogYnJlYWstYWxsOyAvKiBtYWtlcyB3cmFwcGluZyBvZiBoeXBlcnBhcmFtIHN0cmluZ3MgYmV0dGVyICovCiAgICAgIH0KICAgICAgLmljb24tY29udGFpbmVyIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAycHg7CiAgICAgIH0KICAgICAgLmNoZWNrYm94IHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDJweDsKICAgICAgICB3aWR0aDogMThweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgIH0KICAgICAgLmlzb2xhdG9yIHsKICAgICAgICB3aWR0aDogMThweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgICAgcGFkZGluZzogMHB4OwogICAgICB9CiAgICAgIC5pc29sYXRvci1jb250YWluZXIgewogICAgICAgIHBhZGRpbmctbGVmdDogNnB4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKICAgICAgfQogICAgICAuY2hlY2tib3gtY29udGFpbmVyIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDJweDsKICAgICAgfQogICAgICAuaXRlbS1sYWJlbC1jb250YWluZXIgewogICAgICAgIHBhZGRpbmctbGVmdDogNXB4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICB3aWR0aDogMHB4OyAvKiBoYWNrIHRvIGdldCB0aGUgZmxleC1ncm93IHRvIHdvcmsgcHJvcGVybHkgKi8KICAgICAgfQogICAgICAudG9vbHRpcC12YWx1ZS1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIHBhZGRpbmctbGVmdDogMnB4OwogICAgICB9CiAgICAgIC52ZXJ0aWNhbC1hbGlnbi1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KICAgICAgLnZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciAudmVydGljYWwtYWxpZ24tY2VudGVyIHsKICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgIH0KICAgICAgLnZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciAudmVydGljYWwtYWxpZ24tdG9wIHsKICAgICAgICBhbGlnbi1zZWxmOiBzdGFydDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSx5Ty5wcm90b3R5cGUsIm5hbWVzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHlPLnByb3RvdHlwZSwiY29sb3JpbmciLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLHlPLnByb3RvdHlwZSwicmVnZXgiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheSxjb21wdXRlZDoiY29tcHV0ZU5hbWVzTWF0Y2hpbmdSZWdleChuYW1lcy4qLCBfcmVnZXgpIn0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLHlPLnByb3RvdHlwZSwibmFtZXNNYXRjaGluZ1JlZ2V4Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0LG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSx5Ty5wcm90b3R5cGUsInNlbGVjdGlvblN0YXRlIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXksbm90aWZ5OiEwLGNvbXB1dGVkOiJjb21wdXRlT3V0U2VsZWN0ZWQobmFtZXNNYXRjaGluZ1JlZ2V4LiosIHNlbGVjdGlvblN0YXRlLiopIn0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLHlPLnByb3RvdHlwZSwib3V0U2VsZWN0ZWQiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0seU8ucHJvdG90eXBlLCJtYXhOYW1lc1RvRW5hYmxlQnlEZWZhdWx0Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHlPLnByb3RvdHlwZSwiX2RlYm91bmNlZFJlZ2V4Q2hhbmdlIix2b2lkIDApLHQoW3MoInJlZ2V4IiksZSgiZGVzaWduOnR5cGUiLFJlZ0V4cCksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0seU8ucHJvdG90eXBlLCJfcmVnZXgiLG51bGwpLHQoW2EoInNlbGVjdGlvblN0YXRlIiwibmFtZXMiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLHlPLnByb3RvdHlwZSwiX3NldElzb2xhdG9ySWNvbiIsbnVsbCkseU89dChbaSgidGYtbXVsdGktY2hlY2tib3giKV0seU8pO2xldCB2Tz1jbGFzcyBleHRlbmRzIHdle2dldCBfcGFydHMoKXt2YXIgdD10aGlzLnZhbHVlLGU9dGhpcy5kZWxpbWl0ZXJQYXR0ZXJuO2NvbnN0IG49W107Zm9yKDs7KXtjb25zdCBpPW5ldyBSZWdFeHAoZSwiZyIpO2lmKGkudGVzdCh0KSwwPT09aS5sYXN0SW5kZXgpe24ucHVzaCh0KTticmVha31uLnB1c2godC5zbGljZSgwLGkubGFzdEluZGV4KSksdD10LnNsaWNlKGkubGFzdEluZGV4KX1yZXR1cm4gbn19O3ZPLnRlbXBsYXRlPXhlYAogICAgPCEtLQogICAgICBUaGlzIHVnbHkgZm9ybWF0dGluZyBpcyByZXF1aXJlZCB0byBwcmV2ZW50IHNwYWNlcyBmcm9tIHNsaXBwaW5nCiAgICAgIGludG8gdGhlIEhUTUwuCiAgICAtLT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3BhcnRzXV0iIGFzPSJwYXJ0IgogICAgICA+W1twYXJ0XV08d2JyCiAgICAvPjwvdGVtcGxhdGU+CiAgYCx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSx2Ty5wcm90b3R5cGUsInZhbHVlIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLHZPLnByb3RvdHlwZSwiZGVsaW1pdGVyUGF0dGVybiIsdm9pZCAwKSx0KFtzKCJ2YWx1ZSIsImRlbGltaXRlclBhdHRlcm4iKSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLHZPLnByb3RvdHlwZSwiX3BhcnRzIixudWxsKSx2Tz10KFtpKCJ0Zi13YnItc3RyaW5nIildLHZPKTtsZXQgYk89Y2xhc3MgZXh0ZW5kcyhjcih3ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLnJ1blNlbGVjdGlvblN0YXRlPWNsKCJydW5TZWxlY3Rpb25TdGF0ZSIse2RlZmF1bHRWYWx1ZTp7fX0pLmNhbGwodGhpcyksdGhpcy5yZWdleElucHV0PVhzKCJyZWdleElucHV0Iix7ZGVmYXVsdFZhbHVlOiIifSkuY2FsbCh0aGlzKSx0aGlzLl9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoPTI1MCx0aGlzLl9kYXRhTG9jYXRpb25EZWxpbWl0ZXJQYXR0ZXJuPSJbLz1fLC1dIix0aGlzLmNvbG9yaW5nPXtnZXRDb2xvcjpfT30sdGhpcy5fc3RvcmVSdW5TZWxlY3Rpb25TdGF0ZT11bCgicnVuU2VsZWN0aW9uU3RhdGUiLHtkZWZhdWx0VmFsdWU6e319KSx0aGlzLl9yZWdleE9ic2VydmVyPSRzKCJyZWdleElucHV0Iix7ZGVmYXVsdFZhbHVlOiIifSl9YXR0YWNoZWQoKXt0aGlzLl9ydW5TdG9yZUxpc3RlbmVyPUlsLmFkZExpc3RlbmVyKCgoKT0+e3RoaXMuc2V0KCJydW5zIixJbC5nZXRSdW5zKCkpfSkpLHRoaXMuc2V0KCJydW5zIixJbC5nZXRSdW5zKCkpLHRoaXMuX2VudlN0b3JlTGlzdGVuZXI9UGwuYWRkTGlzdGVuZXIoKCgpPT57dGhpcy5zZXQoImRhdGFMb2NhdGlvbiIsUGwuZ2V0RGF0YUxvY2F0aW9uKCkpfSkpLHRoaXMuc2V0KCJkYXRhTG9jYXRpb24iLFBsLmdldERhdGFMb2NhdGlvbigpKX1kZXRhY2hlZCgpe0lsLnJlbW92ZUxpc3RlbmVyQnlLZXkodGhpcy5fcnVuU3RvcmVMaXN0ZW5lciksUGwucmVtb3ZlTGlzdGVuZXJCeUtleSh0aGlzLl9lbnZTdG9yZUxpc3RlbmVyKX1fdG9nZ2xlQWxsKCl7dGhpcy4kLm11bHRpQ2hlY2tib3gudG9nZ2xlQWxsKCl9Z2V0IF9jbGlwcGVkRGF0YUxvY2F0aW9uKCl7dmFyIHQ9dGhpcy5kYXRhTG9jYXRpb24sZT10aGlzLl9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoO2lmKHZvaWQgMCE9PXQpcmV0dXJuIHQubGVuZ3RoPmU/dC5zdWJzdHJpbmcoMCxlKTp0fV9vcGVuRGF0YUxvY2F0aW9uRGlhbG9nKHQpe3QucHJldmVudERlZmF1bHQoKSx0aGlzLiQkKCIjZGF0YS1sb2NhdGlvbi1kaWFsb2ciKS5vcGVuKCl9X3Nob3VsZFNob3dFeHBhbmREYXRhTG9jYXRpb25CdXR0b24odCxlKXtyZXR1cm4gdCYmdC5sZW5ndGg+ZX19O2JPLnRlbXBsYXRlPXhlYAogICAgPHBhcGVyLWRpYWxvZyB3aXRoLWJhY2tkcm9wPSIiIGlkPSJkYXRhLWxvY2F0aW9uLWRpYWxvZyI+CiAgICAgIDxoMj5EYXRhIExvY2F0aW9uPC9oMj4KICAgICAgPHRmLXdici1zdHJpbmcKICAgICAgICB2YWx1ZT0iW1tkYXRhTG9jYXRpb25dXSIKICAgICAgICBkZWxpbWl0ZXItcGF0dGVybj0iW1tfZGF0YUxvY2F0aW9uRGVsaW1pdGVyUGF0dGVybl1dIgogICAgICA+CiAgICAgIDwvdGYtd2JyLXN0cmluZwogICAgPjwvcGFwZXItZGlhbG9nPgogICAgPGRpdiBpZD0idG9wLXRleHQiPgogICAgICA8aDMgaWQ9InRvb2x0aXAtaGVscCIgY2xhc3M9InRvb2x0aXAtY29udGFpbmVyIj5SdW5zPC9oMz4KICAgIDwvZGl2PgogICAgPHRmLW11bHRpLWNoZWNrYm94CiAgICAgIGlkPSJtdWx0aUNoZWNrYm94IgogICAgICBuYW1lcz0iW1tydW5zXV0iCiAgICAgIHNlbGVjdGlvbi1zdGF0ZT0ie3tydW5TZWxlY3Rpb25TdGF0ZX19IgogICAgICBvdXQtc2VsZWN0ZWQ9Int7c2VsZWN0ZWRSdW5zfX0iCiAgICAgIHJlZ2V4PSJ7e3JlZ2V4SW5wdXR9fSIKICAgICAgY29sb3Jpbmc9IltbY29sb3JpbmddXSIKICAgID48L3RmLW11bHRpLWNoZWNrYm94PgogICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0ieC1idXR0b24iIGlkPSJ0b2dnbGUtYWxsIiBvbi10YXA9Il90b2dnbGVBbGwiPgogICAgICBUb2dnbGUgQWxsIFJ1bnMKICAgIDwvcGFwZXItYnV0dG9uPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2RhdGFMb2NhdGlvbl1dIj4KICAgICAgPGRpdiBpZD0iZGF0YS1sb2NhdGlvbiI+CiAgICAgICAgPHRmLXdici1zdHJpbmcKICAgICAgICAgIHZhbHVlPSJbW19jbGlwcGVkRGF0YUxvY2F0aW9uXV0iCiAgICAgICAgICBkZWxpbWl0ZXItcGF0dGVybj0iW1tfZGF0YUxvY2F0aW9uRGVsaW1pdGVyUGF0dGVybl1dIgogICAgICAgID48L3RmLXdici1zdHJpbmcKICAgICAgICA+PCEtLQogICAgICAgICAgV2UgdXNlIEhUTUwgY29tbWVudHMgdG8gcmVtb3ZlIHNwYWNlcyBiZWZvcmUgdGhlIGVsbGlwc2lzLgogICAgICAgIC0tPjx0ZW1wbGF0ZQogICAgICAgICAgaXM9ImRvbS1pZiIKICAgICAgICAgIGlmPSJbW19zaG91bGRTaG93RXhwYW5kRGF0YUxvY2F0aW9uQnV0dG9uKGRhdGFMb2NhdGlvbiwgX2RhdGFMb2NhdGlvbkNsaXBMZW5ndGgpXV0iCiAgICAgICAgICA+PCEtLQogICAgICAgICAgLS0+PGEgaHJlZj0iIiBvbi1jbGljaz0iX29wZW5EYXRhTG9jYXRpb25EaWFsb2ciPuKApjwvYT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMTBweDsKICAgICAgfQogICAgICAjdG9wLXRleHQgewogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1zZWNvbmRhcnktdGV4dC1jb2xvcik7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDE2cHg7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgfQogICAgICB0Zi13YnItc3RyaW5nIHsKICAgICAgICBvdmVyZmxvdy13cmFwOiBicmVhay13b3JkOwogICAgICB9CiAgICAgIHRmLW11bHRpLWNoZWNrYm94IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIC54LWJ1dHRvbiB7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgfQogICAgICAjdG9vbHRpcC1oZWxwIHsKICAgICAgICBjb2xvcjogdmFyKC0tdGItc2Vjb25kYXJ5LXRleHQtY29sb3IpOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgIH0KICAgICAgcGFwZXItYnV0dG9uIHsKICAgICAgICBtYXJnaW4tbGVmdDogMDsKICAgICAgfQogICAgICAjZGF0YS1sb2NhdGlvbiB7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbWFyZ2luOiA1cHggMCAwIDA7CiAgICAgICAgbWF4LXdpZHRoOiAyODhweDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfc3RvcmVSdW5TZWxlY3Rpb25TdGF0ZSJ9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sYk8ucHJvdG90eXBlLCJydW5TZWxlY3Rpb25TdGF0ZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxvYnNlcnZlcjoiX3JlZ2V4T2JzZXJ2ZXIifSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLGJPLnByb3RvdHlwZSwicmVnZXhJbnB1dCIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5LG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLGJPLnByb3RvdHlwZSwic2VsZWN0ZWRSdW5zIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxiTy5wcm90b3R5cGUsInJ1bnMiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLGJPLnByb3RvdHlwZSwiZGF0YUxvY2F0aW9uIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLGJPLnByb3RvdHlwZSwiX2RhdGFMb2NhdGlvbkNsaXBMZW5ndGgiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sYk8ucHJvdG90eXBlLCJfZGF0YUxvY2F0aW9uRGVsaW1pdGVyUGF0dGVybiIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxiTy5wcm90b3R5cGUsImNvbG9yaW5nIix2b2lkIDApLHQoW3MoImRhdGFMb2NhdGlvbiIsIl9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoIiksZSgiZGVzaWduOnR5cGUiLFN0cmluZyksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sYk8ucHJvdG90eXBlLCJfY2xpcHBlZERhdGFMb2NhdGlvbiIsbnVsbCksYk89dChbaSgidGYtcnVucy1zZWxlY3RvciIpXSxiTyk7Y2xhc3MgeE97Y29uc3RydWN0b3IoKXt0aGlzLmNhbmNlbGxhdGlvbkNvdW50PTB9Y2FuY2VsbGFibGUodCl7Y29uc3QgZT10aGlzLmNhbmNlbGxhdGlvbkNvdW50O3JldHVybiBuPT50KHt2YWx1ZTpuLGNhbmNlbGxlZDp0aGlzLmNhbmNlbGxhdGlvbkNvdW50IT09ZX0pfWNhbmNlbEFsbCgpe3RoaXMuY2FuY2VsbGF0aW9uQ291bnQrK319bGV0IHdPPWNsYXNzIGV4dGVuZHMoY3Iod2UpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5odG1sPSIifWdldCBzYW5pdGl6ZWRIdG1sKCl7cmV0dXJuIHRoaXMuaHRtbH1hdHRhY2hlZCgpe3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT57dGhpcy5zY29wZVN1YnRyZWUodGhpcy4kLm1hcmtkb3duLCEwKX0pKX19O2Z1bmN0aW9uIFNPKHQpe3JldHVybiB0P3QudG9TdHJpbmcoKS5yZXBsYWNlKC9HTVQtXGQrIFwoKFteKV0rKVwpLywiJDEiKToiIn1mdW5jdGlvbiBNTyh0KXtjb25zdCBlPShmdW5jdGlvbiBuKHQpe2lmKCF0KXJldHVybiBudWxsO2xldCBlPXQubWF0Y2goL14jKFswLTlhLWZdezEsMn0pKFswLTlhLWZdezEsMn0pKFswLTlhLWZdezEsMn0pJC8pO2lmKCFlKXJldHVybiBudWxsO2lmKDQ9PXQubGVuZ3RoKWZvcih2YXIgbj0xO248PTM7bisrKWVbbl09ZVtuXStlW25dO3JldHVybltwYXJzZUludChlWzFdLDE2KSxwYXJzZUludChlWzJdLDE2KSxwYXJzZUludChlWzNdLDE2KV19KSh0KTtpZighZSlyZXR1cm4iaW5oZXJpdCI7cmV0dXJuIE1hdGgucm91bmQoKDI5OSplWzBdKzU4NyplWzFdKzExNCplWzJdKS8xZTMpPjEyNT8iaW5oZXJpdCI6IiNlZWUifXdPLnRlbXBsYXRlPXhlYAogICAgPGRpdiBpZD0ibWFya2Rvd24iIGlubmVyLWgtdC1tLWw9Iltbc2FuaXRpemVkSHRtbF1dIj48L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLyoKICAgICAgICogUmVkdWNlIHRvcG1vc3QgYW5kIGJvdHRvbW1vc3QgbWFyZ2lucyBmcm9tIDE2cHggdG8gMC4zZW0gKHJlbmRlcnMKICAgICAgICogYXQgYWJvdXQgNC44cHgpIHRvIGtlZXAgdGhlIGxheW91dCBjb21wYWN0LiBUaGlzIGltcHJvdmVzIHRoZQogICAgICAgKiBhcHBlYXJhbmNlIHdoZW4gdGhlcmUgaXMgb25seSBvbmUgbGluZSBvZiB0ZXh0OyBzdGFuZGFyZCBNYXJrZG93bgogICAgICAgKiByZW5kZXJlcnMgd2lsbCBzdGlsbCBpbmNsdWRlIGEgXGA8cD5cYCBlbGVtZW50LgogICAgICAgKgogICAgICAgKiBCeSB0YXJnZXRpbmcgb25seSB0aGUgdG9wLWxldmVsLCBleHRyZW1hbCBlbGVtZW50cywgd2UgcHJlc2VydmUgYW55CiAgICAgICAqIGFjdHVhbCBwYXJhZ3JhcGggYnJlYWtzIGFuZCBvbmx5IGNoYW5nZSB0aGUgcGFkZGluZyBhZ2FpbnN0IHRoZQogICAgICAgKiBjb21wb25lbnQgZWRnZXMuCiAgICAgICAqLwogICAgICAjbWFya2Rvd24gPiBwOmZpcnN0LWNoaWxkIHsKICAgICAgICBtYXJnaW4tdG9wOiAwLjNlbTsKICAgICAgfQogICAgICAjbWFya2Rvd24gPiBwOmxhc3QtY2hpbGQgewogICAgICAgIG1hcmdpbi1ib3R0b206IDAuM2VtOwogICAgICB9CgogICAgICAvKiBQbGVhc2FudCBzdHlsZXMgZm9yIE1hcmtkb3duIHRhYmxlcy4gKi8KICAgICAgI21hcmtkb3duIHRhYmxlIHsKICAgICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgICB9CiAgICAgICNtYXJrZG93biB0YWJsZSB0aCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgfQogICAgICAjbWFya2Rvd24gdGFibGUgdGgsCiAgICAgICNtYXJrZG93biB0YWJsZSB0ZCB7CiAgICAgICAgcGFkZGluZzogNnB4IDEzcHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgdmFyKC0tdGItdWktYm9yZGVyLCAjZGZlMmU1KTsKICAgICAgfQogICAgICAjbWFya2Rvd24gdGFibGUgdHIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHZhcigtLXRiLXVpLWJvcmRlciwgI2M2Y2JkMSk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSx3Ty5wcm90b3R5cGUsImh0bWwiLHZvaWQgMCksdChbcygiaHRtbCIpLGUoImRlc2lnbjp0eXBlIixPYmplY3QpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLHdPLnByb3RvdHlwZSwic2FuaXRpemVkSHRtbCIsbnVsbCksd089dChbaSgidGYtbWFya2Rvd24tdmlldyIpXSx3TyksbWwoe21vZHVsZU5hbWU6InRmLWNhcmQtaGVhZGluZy1zdHlsZSIsc3R5bGVDb250ZW50OiJcbiAgICBmaWdjYXB0aW9uIHtcbiAgICAgIHdpZHRoOiAxMDAlO1xuICAgIH1cblxuICAgIC8qKiBIb3Jpem9udGFsIGxpbmUgb2YgbGFiZWxzLiAqL1xuICAgIC5oZWFkaW5nLXJvdyB7XG4gICAgICBtYXJnaW4tdG9wOiAtNHB4O1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gICAgICBmbGV4LXdyYXA6IHdyYXA7XG4gICAgfVxuXG4gICAgLyoqIFBpZWNlIG9mIHRleHQgaW4gdGhlIGZpZ3VyZSBjYXB0aW9uLiAqL1xuICAgIC5oZWFkaW5nLWxhYmVsIHtcbiAgICAgIGZsZXgtZ3JvdzogMTtcbiAgICAgIG1hcmdpbi10b3A6IDRweDtcbiAgICAgIG1heC13aWR0aDogMTAwJTtcbiAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDtcbiAgICB9XG5cbiAgICAvKiogTWFrZXMgbGFiZWwgc2hvdyBvbiB0aGUgcmlnaHQuICovXG4gICAgLmhlYWRpbmctcmlnaHQge1xuICAgICAgZmxleC1ncm93OiAwO1xuICAgIH1cbiAgIn0pO2xldCBFTz1jbGFzcyBleHRlbmRzIHdle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmRpc3BsYXlOYW1lPW51bGwsdGhpcy50YWc9bnVsbCx0aGlzLnJ1bj1udWxsLHRoaXMuZGVzY3JpcHRpb249bnVsbCx0aGlzLmNvbG9yPW51bGx9X3VwZGF0ZUhlYWRpbmdTdHlsZSgpe3RoaXMudXBkYXRlU3R5bGVzKHsiLS10Zi1jYXJkLWhlYWRpbmctYmFja2dyb3VuZC1jb2xvciI6dGhpcy5fcnVuQmFja2dyb3VuZCwiLS10Zi1jYXJkLWhlYWRpbmctY29sb3IiOnRoaXMuX3J1bkNvbG9yfSl9X2NvbXB1dGVSdW5CYWNrZ3JvdW5kKHQpe3JldHVybiB0fHwibm9uZSJ9X2NvbXB1dGVSdW5Db2xvcih0KXtyZXR1cm4gTU8odCl9Z2V0IF9uYW1lTGFiZWwoKXtyZXR1cm4gdGhpcy5kaXNwbGF5TmFtZXx8dGhpcy50YWd8fCIifWdldCBfdGFnTGFiZWwoKXt2YXIgdD10aGlzLnRhZztyZXR1cm4gdCYmdCE9PXRoaXMuZGlzcGxheU5hbWU/dDoiIn1fdG9nZ2xlRGVzY3JpcHRpb25EaWFsb2codCl7Y29uc3QgZT10aGlzLiQuZGVzY3JpcHRpb25EaWFsb2c7ZS5wb3NpdGlvblRhcmdldD10LnRhcmdldCxlLnRvZ2dsZSgpfX07RU8udGVtcGxhdGU9eGVgCiAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICA8ZmlnY2FwdGlvbiBjbGFzcz0iY29udGVudCI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19uYW1lTGFiZWxdXSI+CiAgICAgICAgICAgIDxkaXYgaXRlbXByb3A9Im5hbWUiIGNsYXNzPSJoZWFkaW5nLWxhYmVsIG5hbWUiPltbX25hbWVMYWJlbF1dPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3J1bl1dIj4KICAgICAgICAgICAgPCEtLSBFeHRyYSB3cmFwcGluZyBzcGFuIG5lZWRlZCB0byBhdm9pZCBmbGV4Ym94IGJsb2NraWZpY2F0aW9uLiAtLT4KICAgICAgICAgICAgPCEtLSAoc2VlIGZsZXhib3ggc3BlYywgc2VjdGlvbiA0ICJGbGV4IEl0ZW1zIikgLS0+CiAgICAgICAgICAgIDxzcGFuPgogICAgICAgICAgICAgIDxzcGFuCiAgICAgICAgICAgICAgICBpdGVtcHJvcD0icnVuIgogICAgICAgICAgICAgICAgaWQ9ImhlYWRpbmctcnVuIgogICAgICAgICAgICAgICAgY2xhc3M9ImhlYWRpbmctbGFiZWwgaGVhZGluZy1yaWdodCBydW4iCiAgICAgICAgICAgICAgICA+W1tydW5dXTwvc3BhbgogICAgICAgICAgICAgID4KICAgICAgICAgICAgPC9zcGFuPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3RhZ0xhYmVsXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIj4KICAgICAgICAgICAgICB0YWc6IDxzcGFuIGl0ZW1wcm9wPSJ0YWciPltbX3RhZ0xhYmVsXV08L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8c2xvdD48L3Nsb3Q+CiAgICAgIDwvZmlnY2FwdGlvbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2Rlc2NyaXB0aW9uXV0iPgogICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbgogICAgICAgICAgaWNvbj0iaW5mbyIKICAgICAgICAgIG9uLXRhcD0iX3RvZ2dsZURlc2NyaXB0aW9uRGlhbG9nIgogICAgICAgICAgdGl0bGU9IlNob3cgc3VtbWFyeSBkZXNjcmlwdGlvbiIKICAgICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHBhcGVyLWRpYWxvZwogICAgICAgIGlkPSJkZXNjcmlwdGlvbkRpYWxvZyIKICAgICAgICBuby1vdmVybGFwPSIiCiAgICAgICAgaG9yaXpvbnRhbC1hbGlnbj0iYXV0byIKICAgICAgICB2ZXJ0aWNhbC1hbGlnbj0iYXV0byIKICAgICAgPgogICAgICAgIDxwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZT4KICAgICAgICAgIDx0Zi1tYXJrZG93bi12aWV3IGh0bWw9IltbZGVzY3JpcHRpb25dXSI+PC90Zi1tYXJrZG93bi12aWV3PgogICAgICAgIDwvcGFwZXItZGlhbG9nLXNjcm9sbGFibGU+CiAgICAgIDwvcGFwZXItZGlhbG9nPgogICAgPC9kaXY+CiAgICA8c3R5bGUgaW5jbHVkZT0idGYtY2FyZC1oZWFkaW5nLXN0eWxlIj4KICAgICAgLmNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQogICAgICAuY29udGVudCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAubmFtZSB7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICB9CiAgICAgIC5ydW4gewogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICB3aWR0aDogYXV0bzsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgcGFkZGluZzogMXB4IDRweCAycHg7CiAgICAgIH0KICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgfQogICAgICBwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZSB7CiAgICAgICAgbWF4LXdpZHRoOiA2NDBweDsKICAgICAgfQogICAgICAjaGVhZGluZy1ydW4gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRmLWNhcmQtaGVhZGluZy1iYWNrZ3JvdW5kLWNvbG9yKTsKICAgICAgICBjb2xvcjogdmFyKC0tdGYtY2FyZC1oZWFkaW5nLWNvbG9yKTsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLEVPLnByb3RvdHlwZSwiZGlzcGxheU5hbWUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sRU8ucHJvdG90eXBlLCJ0YWciLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sRU8ucHJvdG90eXBlLCJydW4iLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sRU8ucHJvdG90eXBlLCJkZXNjcmlwdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxFTy5wcm90b3R5cGUsImNvbG9yIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nLGNvbXB1dGVkOiJfY29tcHV0ZVJ1bkJhY2tncm91bmQoY29sb3IpIixyZWFkT25seTohMCxvYnNlcnZlcjoiX3VwZGF0ZUhlYWRpbmdTdHlsZSJ9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sRU8ucHJvdG90eXBlLCJfcnVuQmFja2dyb3VuZCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxjb21wdXRlZDoiX2NvbXB1dGVSdW5Db2xvcihjb2xvcikiLHJlYWRPbmx5OiEwLG9ic2VydmVyOiJfdXBkYXRlSGVhZGluZ1N0eWxlIn0pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxFTy5wcm90b3R5cGUsIl9ydW5Db2xvciIsdm9pZCAwKSx0KFtzKCJkaXNwbGF5TmFtZSIsInRhZyIpLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLEVPLnByb3RvdHlwZSwiX25hbWVMYWJlbCIsbnVsbCksdChbcygiZGlzcGxheU5hbWUiLCJ0YWciKSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxFTy5wcm90b3R5cGUsIl90YWdMYWJlbCIsbnVsbCksRU89dChbaSgidGYtY2FyZC1oZWFkaW5nIildLEVPKTtsZXQgVE89Y2xhc3MgZXh0ZW5kcyhjcih3ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9tZXRhZGF0YUNhbmNlbGxlcj1uZXcgeE8sdGhpcy5fc3RlcHM9W10sdGhpcy5fYXR0YWNoZWQ9ITF9Z2V0IF9ydW5Db2xvcigpe3JldHVybiBfTyh0aGlzLnJ1bil9Z2V0IF9oYXNBdExlYXN0T25lU3RlcCgpe3ZhciB0PXRoaXMuX3N0ZXBzO3JldHVybiEhdCYmdC5sZW5ndGg+MH1nZXQgX2hhc011bHRpcGxlU3RlcHMoKXt2YXIgdD10aGlzLl9zdGVwcztyZXR1cm4hIXQmJnQubGVuZ3RoPjF9Z2V0IF9tYXhTdGVwSW5kZXgoKXtyZXR1cm4gdGhpcy5fc3RlcHMubGVuZ3RoLTF9Z2V0IF9jdXJyZW50RGF0dW0oKXtyZXR1cm4gdGhpcy5fc3RlcHNbdGhpcy5fc3RlcEluZGV4XX1nZXQgX3NhbXBsZVRleHQoKXtyZXR1cm5gJHt0aGlzLnNhbXBsZSsxfWB9Z2V0IF9oYXNNdWx0aXBsZVNhbXBsZXMoKXtyZXR1cm4gdGhpcy50b3RhbFNhbXBsZXM+MX1hdHRhY2hlZCgpe3RoaXMuX2F0dGFjaGVkPSEwLHRoaXMucmVsb2FkKCl9X3JlbG9hZE9uUnVuVGFnQ2hhbmdlKCl7dGhpcy5yZWxvYWQoKX1yZWxvYWQoKXtpZighdGhpcy5fYXR0YWNoZWQpcmV0dXJuO3RoaXMuX21ldGFkYXRhQ2FuY2VsbGVyLmNhbmNlbEFsbCgpO2NvbnN0IHQ9RXIoKS5wbHVnaW5Sb3V0ZSgiYXVkaW8iLCIvYXVkaW8iLG5ldyBVUkxTZWFyY2hQYXJhbXMoe3RhZzp0aGlzLnRhZyxydW46dGhpcy5ydW4sc2FtcGxlOlN0cmluZyh0aGlzLnNhbXBsZSl9KSksZT10aGlzLl9tZXRhZGF0YUNhbmNlbGxlci5jYW5jZWxsYWJsZSgodD0+e2lmKHQuY2FuY2VsbGVkKXJldHVybjtjb25zdCBlPXQudmFsdWUubWFwKHRoaXMuX2NyZWF0ZVN0ZXBEYXR1bS5iaW5kKHRoaXMpKTt0aGlzLnNldCgiX3N0ZXBzIixlKSx0aGlzLnNldCgiX3N0ZXBJbmRleCIsZS5sZW5ndGgtMSl9KSk7dGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHQpLnRoZW4oZSl9X2NyZWF0ZVN0ZXBEYXR1bSh0KXtjb25zdCBlPW5ldyBVUkxTZWFyY2hQYXJhbXModC5xdWVyeSk7ZS5hcHBlbmQoInRzIixTdHJpbmcodC53YWxsX3RpbWUpKTtjb25zdCBuPUVyKCkucGx1Z2luUm91dGUoImF1ZGlvIiwiL2luZGl2aWR1YWxBdWRpbyIsZSk7cmV0dXJue3dhbGxfdGltZTpTTyhuZXcgRGF0ZSgxZTMqdC53YWxsX3RpbWUpKSxzdGVwOnQuc3RlcCxsYWJlbDp0LmxhYmVsLGNvbnRlbnRUeXBlOnQuY29udGVudFR5cGUsdXJsOm59fX07VE8udGVtcGxhdGU9eGVgCiAgICA8dGYtY2FyZC1oZWFkaW5nCiAgICAgIHRhZz0iW1t0YWddXSIKICAgICAgcnVuPSJbW3J1bl1dIgogICAgICBkaXNwbGF5LW5hbWU9IltbdGFnTWV0YWRhdGEuZGlzcGxheU5hbWVdXSIKICAgICAgZGVzY3JpcHRpb249IltbdGFnTWV0YWRhdGEuZGVzY3JpcHRpb25dXSIKICAgICAgY29sb3I9IltbX3J1bkNvbG9yXV0iCiAgICA+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTXVsdGlwbGVTYW1wbGVzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwiPgogICAgICAgICAgICBzYW1wbGU6IFtbX3NhbXBsZVRleHRdXSBvZiBbW3RvdGFsU2FtcGxlc11dCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNBdExlYXN0T25lU3RlcF1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLXJvdyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIj4KICAgICAgICAgICAgc3RlcCA8c3Ryb25nPltbX2N1cnJlbnREYXR1bS5zdGVwXV08L3N0cm9uZz4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19jdXJyZW50RGF0dW0ud2FsbF90aW1lXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIGhlYWRpbmctcmlnaHQiPgogICAgICAgICAgICAgIFtbX2N1cnJlbnREYXR1bS53YWxsX3RpbWVdXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTXVsdGlwbGVTdGVwc11dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLXJvdyI+CiAgICAgICAgICA8cGFwZXItc2xpZGVyCiAgICAgICAgICAgIGlkPSJzdGVwcyIKICAgICAgICAgICAgaW1tZWRpYXRlLXZhbHVlPSJ7e19zdGVwSW5kZXh9fSIKICAgICAgICAgICAgbWF4PSJbW19tYXhTdGVwSW5kZXhdXSIKICAgICAgICAgICAgbWF4LW1hcmtlcnM9IltbX21heFN0ZXBJbmRleF1dIgogICAgICAgICAgICBzbmFwcz0iIgogICAgICAgICAgICBzdGVwPSIxIgogICAgICAgICAgICB2YWx1ZT0ie3tfc3RlcEluZGV4fX0iCiAgICAgICAgICA+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3RmLWNhcmQtaGVhZGluZz4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzQXRMZWFzdE9uZVN0ZXBdXSI+CiAgICAgIDxhdWRpbwogICAgICAgIGNvbnRyb2xzPSIiCiAgICAgICAgc3JjJD0iW1tfY3VycmVudERhdHVtLnVybF1dIgogICAgICAgIHR5cGUkPSJbW19jdXJyZW50RGF0dW0uY29udGVudFR5cGVdXSIKICAgICAgPjwvYXVkaW8+CiAgICAgIDx0Zi1tYXJrZG93bi12aWV3IGh0bWw9IltbX2N1cnJlbnREYXR1bS5sYWJlbF1dIj48L3RmLW1hcmtkb3duLXZpZXc+CiAgICA8L3RlbXBsYXRlPgogICAgPGRpdiBpZD0ibWFpbi1hdWRpby1jb250YWluZXIiPjwvZGl2PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJ0Zi1jYXJkLWhlYWRpbmctc3R5bGUiPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDM1MHB4OwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yOiAjNDI0MjQyOwogICAgICAgIG1hcmdpbi1yaWdodDogMTVweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CgogICAgICAjc3RlcHMgewogICAgICAgIGhlaWdodDogMTVweDsKICAgICAgICBtYXJnaW46IDAgMCAwIC0xNXB4OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgcGFkZGluZzogMCA1cHg7IC8qIHNvIHRoZSBzbGlkZXIga25vYiBkb2Vzbid0IGJ1dHQgb3V0ICovCiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICAgIC0tcGFwZXItc2xpZGVyLWFjdGl2ZS1jb2xvcjogdmFyKC0tc3RlcC1zbGlkZXIta25vYi1jb2xvcik7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1jb2xvcjogdmFyKC0tc3RlcC1zbGlkZXIta25vYi1jb2xvcik7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvcjogdmFyKC0tc3RlcC1zbGlkZXIta25vYi1jb2xvcik7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLXN0YXJ0LWNvbG9yOiB2YXIoLS1zdGVwLXNsaWRlci1rbm9iLWNvbG9yKTsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFRPLnByb3RvdHlwZSwicnVuIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFRPLnByb3RvdHlwZSwidGFnIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLFRPLnByb3RvdHlwZSwic2FtcGxlIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLFRPLnByb3RvdHlwZSwidG90YWxTYW1wbGVzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFRPLnByb3RvdHlwZSwidGFnTWV0YWRhdGEiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsYnIpXSxUTy5wcm90b3R5cGUsInJlcXVlc3RNYW5hZ2VyIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLHhPKV0sVE8ucHJvdG90eXBlLCJfbWV0YWRhdGFDYW5jZWxsZXIiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLFRPLnByb3RvdHlwZSwiX3N0ZXBzIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLFRPLnByb3RvdHlwZSwiX3N0ZXBJbmRleCIsdm9pZCAwKSx0KFtzKCJydW4iKSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxUTy5wcm90b3R5cGUsIl9ydW5Db2xvciIsbnVsbCksdChbcygiX3N0ZXBzIiksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLFRPLnByb3RvdHlwZSwiX2hhc0F0TGVhc3RPbmVTdGVwIixudWxsKSx0KFtzKCJfc3RlcHMiKSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sVE8ucHJvdG90eXBlLCJfaGFzTXVsdGlwbGVTdGVwcyIsbnVsbCksdChbcygiX3N0ZXBzIiksZSgiZGVzaWduOnR5cGUiLE51bWJlciksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sVE8ucHJvdG90eXBlLCJfbWF4U3RlcEluZGV4IixudWxsKSx0KFtzKCJfc3RlcHMiLCJfc3RlcEluZGV4IiksZSgiZGVzaWduOnR5cGUiLE9iamVjdCksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sVE8ucHJvdG90eXBlLCJfY3VycmVudERhdHVtIixudWxsKSx0KFtzKCJzYW1wbGUiKSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxUTy5wcm90b3R5cGUsIl9zYW1wbGVUZXh0IixudWxsKSx0KFtzKCJ0b3RhbFNhbXBsZXMiKSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sVE8ucHJvdG90eXBlLCJfaGFzTXVsdGlwbGVTYW1wbGVzIixudWxsKSx0KFthKCJydW4iLCJ0YWciKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLFRPLnByb3RvdHlwZSwiX3JlbG9hZE9uUnVuVGFnQ2hhbmdlIixudWxsKSxUTz10KFtpKCJ0Zi1hdWRpby1sb2FkZXIiKV0sVE8pO2xldCBDTz1jbGFzcyBleHRlbmRzKGNyKHdlKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMucmVsb2FkT25SZWFkeT0hMCx0aGlzLl90YWdGaWx0ZXI9IiIsdGhpcy5fcmVxdWVzdE1hbmFnZXI9bmV3IGJyfXJlYWR5KCl7c3VwZXIucmVhZHkoKSx0aGlzLnJlbG9hZE9uUmVhZHkmJnRoaXMucmVsb2FkKCl9cmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbigoKCk9Pnt0aGlzLl9yZWxvYWRBdWRpbygpfSkpfV9mZXRjaFRhZ3MoKXtjb25zdCB0PUVyKCkucGx1Z2luUm91dGUoImF1ZGlvIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh0KS50aGVuKCh0PT57aWYoQ2UuZXhwb3J0cy5pc0VxdWFsKHQsdGhpcy5fcnVuVG9UYWdJbmZvKSlyZXR1cm47Y29uc3QgZT1mcihDZS5leHBvcnRzLm1hcFZhbHVlcyh0LCh0PT5PYmplY3Qua2V5cyh0KSkpKTt0aGlzLnNldCgiX2RhdGFOb3RGb3VuZCIsMD09PWUubGVuZ3RoKSx0aGlzLnNldCgiX3J1blRvVGFnSW5mbyIsdCl9KSl9X3JlbG9hZEF1ZGlvKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLWF1ZGlvLWxvYWRlciIpLmZvckVhY2goKHQ9Pnt0LnJlbG9hZCgpfSkpfV9zaG91bGRPcGVuKHQpe3JldHVybiB0PD0yfWdldCBfY2F0ZWdvcmllcygpe3ZhciB0PXRoaXMuX3J1blRvVGFnSW5mbyxlPXRoaXMuX3NlbGVjdGVkUnVucyxuPXRoaXMuX3RhZ0ZpbHRlcjtmdW5jdGlvbiBpKGUpe2NvbnN0IG49dFtlLnJ1bl1bZS50YWddLnNhbXBsZXM7cmV0dXJuIENlLmV4cG9ydHMucmFuZ2UobikubWFwKCh0PT5PYmplY3QuYXNzaWduKHt9LGUse3NhbXBsZTp0LHRvdGFsU2FtcGxlczpufSkpKX1yZXR1cm4gSXIoQ2UuZXhwb3J0cy5tYXBWYWx1ZXModCwodD0+T2JqZWN0LmtleXModCkpKSxlLG4pLm1hcCgodD0+T2JqZWN0LmFzc2lnbih7fSx0LHtpdGVtczpbXS5jb25jYXQuYXBwbHkoW10sdC5pdGVtcy5tYXAoaSkpfSkpKX1fdGFnTWV0YWRhdGEodCxlLG4pe3JldHVybiB0W2VdW25dfX07Q08udGVtcGxhdGU9eGVgCiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIHJ1bnMtc2VsZWN0b3IiPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3IKICAgICAgICAgICAgaWQ9InJ1bnMtc2VsZWN0b3IiCiAgICAgICAgICAgIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319IgogICAgICAgICAgPjwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBhdWRpbyBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6PC9wPgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPllvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgYXVkaW8gZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiCiAgICAgICAgICAgICAgICA+UkVBRE1FPC9hCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIgogICAgICAgICAgICAgICAgPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hCiAgICAgICAgICAgICAgPi4KICAgICAgICAgICAgPC9wPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyIKICAgICAgICAgICAgICAgID50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICA8L3A+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcKICAgICAgICAgICAgICBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIgogICAgICAgICAgICAgIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLWF1ZGlvLWxvYWRlcgogICAgICAgICAgICAgICAgICBhY3RpdmU9IltbYWN0aXZlXV0iCiAgICAgICAgICAgICAgICAgIHJ1bj0iW1tpdGVtLnJ1bl1dIgogICAgICAgICAgICAgICAgICB0YWc9IltbaXRlbS50YWddXSIKICAgICAgICAgICAgICAgICAgc2FtcGxlPSJbW2l0ZW0uc2FtcGxlXV0iCiAgICAgICAgICAgICAgICAgIHRvdGFsLXNhbXBsZXM9IltbaXRlbS50b3RhbFNhbXBsZXNdXSIKICAgICAgICAgICAgICAgICAgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShfcnVuVG9UYWdJbmZvLCBpdGVtLnJ1biwgaXRlbS50YWcpXV0iCiAgICAgICAgICAgICAgICAgIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIKICAgICAgICAgICAgICAgID48L3RmLWF1ZGlvLWxvYWRlcj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxDTy5wcm90b3R5cGUsInJlbG9hZE9uUmVhZHkiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLENPLnByb3RvdHlwZSwiX3NlbGVjdGVkUnVucyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxDTy5wcm90b3R5cGUsIl9ydW5Ub1RhZ0luZm8iLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxDTy5wcm90b3R5cGUsIl9kYXRhTm90Rm91bmQiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sQ08ucHJvdG90eXBlLCJfdGFnRmlsdGVyIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLGJyKV0sQ08ucHJvdG90eXBlLCJfcmVxdWVzdE1hbmFnZXIiLHZvaWQgMCksdChbcygiX3J1blRvVGFnSW5mbyIsIl9zZWxlY3RlZFJ1bnMiLCJfdGFnRmlsdGVyIiksZSgiZGVzaWduOnR5cGUiLEFycmF5KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxDTy5wcm90b3R5cGUsIl9jYXRlZ29yaWVzIixudWxsKSxDTz10KFtpKCJ0Zi1hdWRpby1kYXNoYm9hcmQiKV0sQ08pO2xldCBBTz1jbGFzcyBleHRlbmRzKGNyKHdlKSl7YXR0YWNoZWQoKXt0aGlzLmFzeW5jKChmdW5jdGlvbigpe3RoaXMuZ2V0RWZmZWN0aXZlQ2hpbGRyZW4oKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3RoaXMubGlzdGVuKHQsInRhcCIsIl9zZWxlY3RUYXJnZXQiKX0uYmluZCh0aGlzKSl9KSl9X3NlbGVjdFRhcmdldCh0KXt0aGlzLnNlbGVjdGVkSWQ9dC5jdXJyZW50VGFyZ2V0LmlkfV9zZWxlY3RlZElkQ2hhbmdlZCgpe3ZhciB0PXRoaXMucXVlcnlFZmZlY3RpdmVDaGlsZHJlbigiIyIrdGhpcy5zZWxlY3RlZElkKTt0JiYodGhpcy5nZXRFZmZlY3RpdmVDaGlsZHJlbigpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuY2xhc3NMaXN0LnJlbW92ZSgic2VsZWN0ZWQiKX0pKSx0LmNsYXNzTGlzdC5hZGQoInNlbGVjdGVkIikpfX07ZnVuY3Rpb24ga08odCxlKXtsZXQgbjtjb25zdCBpPXt9O09iamVjdC5rZXlzKHQpLmZvckVhY2goKGU9Pntjb25zdCByPXRbZV07dm9pZCAwPT09biYmKG49ci5kaXNwbGF5TmFtZSksbiE9PXIuZGlzcGxheU5hbWUmJihuPW51bGwpLHZvaWQgMD09PWlbci5kZXNjcmlwdGlvbl0mJihpW3IuZGVzY3JpcHRpb25dPVtdKSxpW3IuZGVzY3JpcHRpb25dLnB1c2goZSl9KSk7cmV0dXJue2Rpc3BsYXlOYW1lOm51bGwhPW4/bjplLGRlc2NyaXB0aW9uOigoKT0+e2NvbnN0IHQ9T2JqZWN0LmtleXMoaSk7aWYoMD09PXQubGVuZ3RoKXJldHVybiIiO2lmKDE9PT10Lmxlbmd0aClyZXR1cm4gdFswXTtyZXR1cm5gJHsiPHA+PHN0cm9uZz5NdWx0aXBsZSBkZXNjcmlwdGlvbnM6PC9zdHJvbmc+PC9wPiJ9PHVsPiR7dC5tYXAoKHQ9Pntjb25zdCBlPWlbdF0ubWFwKCh0PT5gPGNvZGU+JHt0LnJlcGxhY2UoLzwvZywiJmx0OyIpLnJlcGxhY2UoLz4vZywiJmd0OyIpLnJlcGxhY2UoLyYvZywiJmFtcDsiKX08L2NvZGU+YCkpLG49ZS5sZW5ndGg+Mj9lLnNsaWNlKDAsZS5sZW5ndGgtMSkuam9pbigiLCAiKSsiLCBhbmQgIitlW2UubGVuZ3RoLTFdOmUuam9pbigiIGFuZCAiKTtyZXR1cm5gPGxpPjxwPkZvciAkeyhmdW5jdGlvbiByKHQsZSxuKXtyZXR1cm4gMT09PXQ/ZTpufSkoZS5sZW5ndGgsInJ1biIsInJ1bnMiKX0gJHtufTo8L3A+JHt0fTwvbGk+YH0pKS5qb2luKCIiKX08L3VsPmB9KSgpfX1BTy50ZW1wbGF0ZT14ZWAKICAgIDxkaXYgaWQ9IndyYXAiPgogICAgICA8aDM+W1tuYW1lXV08L2gzPgogICAgICA8ZGl2IGNsYXNzPSJjb250ZW50LXdyYXBwZXIiPjxzbG90Pjwvc2xvdD48L2Rpdj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICAuY29udGVudC13cmFwcGVyIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgICBjb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICB9CgogICAgICAuY29udGVudC13cmFwcGVyIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgICBjb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICB9CgogICAgICAuY29udGVudC13cmFwcGVyIDo6c2xvdHRlZCguc2VsZWN0ZWQpIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10Yi11aS1kYXJrLWFjY2VudCk7CiAgICAgICAgY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIGgzIHsKICAgICAgICBjb2xvcjogdmFyKC0tdGItc2Vjb25kYXJ5LXRleHQtY29sb3IpOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIG1hcmdpbjogMCAwIDVweDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLEFPLnByb3RvdHlwZSwibmFtZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxub3RpZnk6ITAsb2JzZXJ2ZXI6Il9zZWxlY3RlZElkQ2hhbmdlZCJ9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sQU8ucHJvdG90eXBlLCJzZWxlY3RlZElkIix2b2lkIDApLEFPPXQoW2koInRmLW9wdGlvbi1zZWxlY3RvciIpXSxBTyk7bGV0IExPPWNsYXNzIGV4dGVuZHMgd2V7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMud2VpZ2h0PS42LHRoaXMuX3VwZGF0ZVdlaWdodD1DZS5leHBvcnRzLmRlYm91bmNlKChmdW5jdGlvbih0KXt0aGlzLndlaWdodD10fSksMjUwKX1faW1tZWRpYXRlV2VpZ2h0TnVtYmVyRm9yUGFwZXJTbGlkZXJDaGFuZ2VkKCl7dGhpcy5faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0PXRoaXMuX2ltbWVkaWF0ZVdlaWdodE51bWJlckZvclBhcGVyU2xpZGVyLnRvU3RyaW5nKCksdGhpcy5fdXBkYXRlV2VpZ2h0LmNhbGwodGhpcyx0aGlzLl9pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlcil9X2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dENoYW5nZWQoKXsrdGhpcy5faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0PDA/dGhpcy5faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0PSIwIjordGhpcy5faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0PjEmJih0aGlzLl9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXQ9IjEiKTt2YXIgdD0rdGhpcy5faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0O2lzTmFOKHQpfHx0aGlzLl91cGRhdGVXZWlnaHQuY2FsbCh0aGlzLHQpfX07ZnVuY3Rpb24gUE8odCxlKXtjb25zdCBuPU9iamVjdC5rZXlzKGUpLnNvcnQoKS5maWx0ZXIoKHQ9PnZvaWQgMCE9PWVbdF0pKTtpZighbi5sZW5ndGgpcmV0dXJuIHQ7Y29uc3QgaT0tMSE9PXQuaW5kZXhPZigiPyIpPyImIjoiPyI7cmV0dXJuIHQraStbXS5jb25jYXQoLi4ubi5tYXAoKHQ9Pntjb25zdCBuPWVbdF07cmV0dXJuKEFycmF5LmlzQXJyYXkobik/bjpbbl0pLm1hcCgoZT0+YCR7dH09JHsoZnVuY3Rpb24gbih0KXtyZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHQpLnJlcGxhY2UoL1woL2csIiUyOCIpLnJlcGxhY2UoL1wpL2csIiUyOSIpfSkoZSl9YCkpfSkpKS5qb2luKCImIil9TE8udGVtcGxhdGU9eGVgCiAgICA8aDMgY2xhc3M9InRpdGxlIj5TbW9vdGhpbmc8L2gzPgogICAgPGRpdiBjbGFzcz0ic21vb3RoaW5nLWJsb2NrIj4KICAgICAgPHBhcGVyLXNsaWRlcgogICAgICAgIGlkPSJzbGlkZXIiCiAgICAgICAgaW1tZWRpYXRlLXZhbHVlPSJ7e19pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlcn19IgogICAgICAgIG1heD0iW1ttYXhdXSIKICAgICAgICBtaW49IltbbWluXV0iCiAgICAgICAgcGluCiAgICAgICAgc3RlcD0iW1tzdGVwXV0iCiAgICAgICAgdHlwZT0ibnVtYmVyIgogICAgICAgIHZhbHVlPSJ7e3dlaWdodH19IgogICAgICA+PC9wYXBlci1zbGlkZXI+CiAgICAgIDxwYXBlci1pbnB1dAogICAgICAgIGlkPSJpbnB1dCIKICAgICAgICBsYWJlbD0id2VpZ2h0IgogICAgICAgIG5vLWxhYmVsLWZsb2F0CiAgICAgICAgdmFsdWU9Int7X2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dH19IgogICAgICAgIHR5cGU9Im51bWJlciIKICAgICAgICBzdGVwPSJbW3N0ZXBdXSIKICAgICAgICBtaW49IltbbWluXV0iCiAgICAgICAgbWF4PSJbW21heF1dIgogICAgICA+PC9wYXBlci1pbnB1dD4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICAudGl0bGUgewogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1zZWNvbmRhcnktdGV4dC1jb2xvcik7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDVweDsKICAgICAgfQoKICAgICAgLnNtb290aGluZy1ibG9jayB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgcGFwZXItc2xpZGVyIHsKICAgICAgICAtLXBhcGVyLXNsaWRlci1hY3RpdmUtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1tYXJrZXJzLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgZmxleC1ncm93OiAyOwogICAgICB9CgogICAgICBwYXBlci1pbnB1dCB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItZm9jdXMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOiB7CiAgICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgfQogICAgICAgIHdpZHRoOiA2MHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sTE8ucHJvdG90eXBlLCJzdGVwIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLExPLnByb3RvdHlwZSwibWF4Iix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLExPLnByb3RvdHlwZSwibWluIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyLG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxMTy5wcm90b3R5cGUsIndlaWdodCIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcixub3RpZnk6ITAsb2JzZXJ2ZXI6Il9pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlckNoYW5nZWQifSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLExPLnByb3RvdHlwZSwiX2ltbWVkaWF0ZVdlaWdodE51bWJlckZvclBhcGVyU2xpZGVyIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nLG5vdGlmeTohMCxvYnNlcnZlcjoiX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dENoYW5nZWQifSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLExPLnByb3RvdHlwZSwiX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dCIsdm9pZCAwKSxMTz10KFtpKCJ0Zi1zbW9vdGhpbmctaW5wdXQiKV0sTE8pO3ZhciBOTz17fSxJTz1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX07Ci8qISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlCiAgICB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZQogICAgTGljZW5zZSBhdCBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBUSElTIENPREUgSVMgUFJPVklERUQgT04gQU4gKkFTIElTKiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCiAgICBLSU5ELCBFSVRIRVIgRVhQUkVTUyBPUiBJTVBMSUVELCBJTkNMVURJTkcgV0lUSE9VVCBMSU1JVEFUSU9OIEFOWSBJTVBMSUVECiAgICBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLAogICAgTUVSQ0hBTlRBQkxJVFkgT1IgTk9OLUlORlJJTkdFTUVOVC4KCiAgICBTZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMKICAgIGFuZCBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovdmFyIFJPPU9iamVjdC5hc3NpZ258fGZ1bmN0aW9uIHQoZSl7Zm9yKHZhciBuLGk9MSxyPWFyZ3VtZW50cy5sZW5ndGg7aTxyO2krKylmb3IodmFyIG8gaW4gbj1hcmd1bWVudHNbaV0pT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG4sbykmJihlW29dPW5bb10pO3JldHVybiBlfTtmdW5jdGlvbiBPTyh0KXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0W1N5bWJvbC5pdGVyYXRvcl0sbj0wO3JldHVybiBlP2UuY2FsbCh0KTp7bmV4dDpmdW5jdGlvbigpe3JldHVybiB0JiZuPj10Lmxlbmd0aCYmKHQ9dm9pZCAwKSx7dmFsdWU6dCYmdFtuKytdLGRvbmU6IXR9fX19ZnVuY3Rpb24gek8odCxlKXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiZ0W1N5bWJvbC5pdGVyYXRvcl07aWYoIW4pcmV0dXJuIHQ7dmFyIGkscixvPW4uY2FsbCh0KSxhPVtdO3RyeXtmb3IoOyh2b2lkIDA9PT1lfHxlLS0gPjApJiYhKGk9by5uZXh0KCkpLmRvbmU7KWEucHVzaChpLnZhbHVlKX1jYXRjaCh0KXtyPXtlcnJvcjp0fX1maW5hbGx5e3RyeXtpJiYhaS5kb25lJiYobj1vLnJldHVybikmJm4uY2FsbChvKX1maW5hbGx5e2lmKHIpdGhyb3cgci5lcnJvcn19cmV0dXJuIGF9ZnVuY3Rpb24gRE8odCl7cmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBETz8odGhpcy52PXQsdGhpcyk6bmV3IERPKHQpfXZhciBCTz1NZShPYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxfX2V4dGVuZHM6ZnVuY3Rpb24gSE8odCxlKXtmdW5jdGlvbiBuKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fUlPKHQsZSksdC5wcm90b3R5cGU9bnVsbD09PWU/T2JqZWN0LmNyZWF0ZShlKToobi5wcm90b3R5cGU9ZS5wcm90b3R5cGUsbmV3IG4pfSxfX2Fzc2lnbjpSTyxfX3Jlc3Q6ZnVuY3Rpb24gRk8odCxlKXt2YXIgbj17fTtmb3IodmFyIGkgaW4gdClPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxpKSYmZS5pbmRleE9mKGkpPDAmJihuW2ldPXRbaV0pO2lmKG51bGwhPXQmJiJmdW5jdGlvbiI9PXR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKXt2YXIgcj0wO2ZvcihpPU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHModCk7cjxpLmxlbmd0aDtyKyspZS5pbmRleE9mKGlbcl0pPDAmJihuW2lbcl1dPXRbaVtyXV0pfXJldHVybiBufSxfX2RlY29yYXRlOmZ1bmN0aW9uIFZPKHQsZSxuLGkpe3ZhciByLG89YXJndW1lbnRzLmxlbmd0aCxhPW88Mz9lOm51bGw9PT1pP2k9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLG4pOmk7aWYoIm9iamVjdCI9PXR5cGVvZiBSZWZsZWN0JiYiZnVuY3Rpb24iPT10eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSlhPVJlZmxlY3QuZGVjb3JhdGUodCxlLG4saSk7ZWxzZSBmb3IodmFyIHM9dC5sZW5ndGgtMTtzPj0wO3MtLSkocj10W3NdKSYmKGE9KG88Mz9yKGEpOm8+Mz9yKGUsbixhKTpyKGUsbikpfHxhKTtyZXR1cm4gbz4zJiZhJiZPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxuLGEpLGF9LF9fcGFyYW06ZnVuY3Rpb24gVU8odCxlKXtyZXR1cm4gZnVuY3Rpb24obixpKXtlKG4saSx0KX19LF9fbWV0YWRhdGE6ZnVuY3Rpb24gak8odCxlKXtpZigib2JqZWN0Ij09dHlwZW9mIFJlZmxlY3QmJiJmdW5jdGlvbiI9PXR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhKXJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKHQsZSl9LF9fYXdhaXRlcjpmdW5jdGlvbiBHTyh0LGUsbixpKXtyZXR1cm4gbmV3KG58fChuPVByb21pc2UpKSgoZnVuY3Rpb24ocixvKXtmdW5jdGlvbiBhKHQpe3RyeXtsKGkubmV4dCh0KSl9Y2F0Y2godCl7byh0KX19ZnVuY3Rpb24gcyh0KXt0cnl7bChpLnRocm93KHQpKX1jYXRjaCh0KXtvKHQpfX1mdW5jdGlvbiBsKHQpe3QuZG9uZT9yKHQudmFsdWUpOm5ldyBuKChmdW5jdGlvbihlKXtlKHQudmFsdWUpfSkpLnRoZW4oYSxzKX1sKChpPWkuYXBwbHkodCxlfHxbXSkpLm5leHQoKSl9KSl9LF9fZ2VuZXJhdG9yOmZ1bmN0aW9uIFdPKHQsZSl7dmFyIG4saSxyLG8sYT17bGFiZWw6MCxzZW50OmZ1bmN0aW9uKCl7aWYoMSZyWzBdKXRocm93IHJbMV07cmV0dXJuIHJbMV19LHRyeXM6W10sb3BzOltdfTtyZXR1cm4gbz17bmV4dDpzKDApLHRocm93OnMoMSkscmV0dXJuOnMoMil9LCJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJihvW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30pLG87ZnVuY3Rpb24gcyhvKXtyZXR1cm4gZnVuY3Rpb24ocyl7cmV0dXJuKGZ1bmN0aW9uIGwobyl7aWYobil0aHJvdyBuZXcgVHlwZUVycm9yKCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuIik7Zm9yKDthOyl0cnl7aWYobj0xLGkmJihyPWlbMiZvWzBdPyJyZXR1cm4iOm9bMF0/InRocm93IjoibmV4dCJdKSYmIShyPXIuY2FsbChpLG9bMV0pKS5kb25lKXJldHVybiByO3N3aXRjaChpPTAsciYmKG89WzAsci52YWx1ZV0pLG9bMF0pe2Nhc2UgMDpjYXNlIDE6cj1vO2JyZWFrO2Nhc2UgNDpyZXR1cm4gYS5sYWJlbCsrLHt2YWx1ZTpvWzFdLGRvbmU6ITF9O2Nhc2UgNTphLmxhYmVsKyssaT1vWzFdLG89WzBdO2NvbnRpbnVlO2Nhc2UgNzpvPWEub3BzLnBvcCgpLGEudHJ5cy5wb3AoKTtjb250aW51ZTtkZWZhdWx0OmlmKCEocj1hLnRyeXMsKHI9ci5sZW5ndGg+MCYmcltyLmxlbmd0aC0xXSl8fDYhPT1vWzBdJiYyIT09b1swXSkpe2E9MDtjb250aW51ZX1pZigzPT09b1swXSYmKCFyfHxvWzFdPnJbMF0mJm9bMV08clszXSkpe2EubGFiZWw9b1sxXTticmVha31pZig2PT09b1swXSYmYS5sYWJlbDxyWzFdKXthLmxhYmVsPXJbMV0scj1vO2JyZWFrfWlmKHImJmEubGFiZWw8clsyXSl7YS5sYWJlbD1yWzJdLGEub3BzLnB1c2gobyk7YnJlYWt9clsyXSYmYS5vcHMucG9wKCksYS50cnlzLnBvcCgpO2NvbnRpbnVlfW89ZS5jYWxsKHQsYSl9Y2F0Y2godCl7bz1bNix0XSxpPTB9ZmluYWxseXtuPXI9MH1pZig1Jm9bMF0pdGhyb3cgb1sxXTtyZXR1cm57dmFsdWU6b1swXT9vWzFdOnZvaWQgMCxkb25lOiEwfX0pKFtvLHNdKX19fSxfX2V4cG9ydFN0YXI6ZnVuY3Rpb24gcU8odCxlKXtmb3IodmFyIG4gaW4gdCllLmhhc093blByb3BlcnR5KG4pfHwoZVtuXT10W25dKX0sX192YWx1ZXM6T08sX19yZWFkOnpPLF9fc3ByZWFkOmZ1bmN0aW9uIFlPKCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXQ9dC5jb25jYXQoek8oYXJndW1lbnRzW2VdKSk7cmV0dXJuIHR9LF9fYXdhaXQ6RE8sX19hc3luY0dlbmVyYXRvcjpmdW5jdGlvbiBYTyh0LGUsbil7aWYoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLiIpO3ZhciBpLHI9bi5hcHBseSh0LGV8fFtdKSxvPVtdO3JldHVybiBpPXt9LGEoIm5leHQiKSxhKCJ0aHJvdyIpLGEoInJldHVybiIpLGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGk7ZnVuY3Rpb24gYSh0KXtyW3RdJiYoaVt0XT1mdW5jdGlvbihlKXtyZXR1cm4gbmV3IFByb21pc2UoKGZ1bmN0aW9uKG4saSl7by5wdXNoKFt0LGUsbixpXSk+MXx8cyh0LGUpfSkpfSl9ZnVuY3Rpb24gcyh0LGUpe3RyeXshKGZ1bmN0aW9uIG4odCl7dC52YWx1ZSBpbnN0YW5jZW9mIERPP1Byb21pc2UucmVzb2x2ZSh0LnZhbHVlLnYpLnRoZW4obCxjKTp1KG9bMF1bMl0sdCl9KShyW3RdKGUpKX1jYXRjaCh0KXt1KG9bMF1bM10sdCl9fWZ1bmN0aW9uIGwodCl7cygibmV4dCIsdCl9ZnVuY3Rpb24gYyh0KXtzKCJ0aHJvdyIsdCl9ZnVuY3Rpb24gdSh0LGUpe3QoZSksby5zaGlmdCgpLG8ubGVuZ3RoJiZzKG9bMF1bMF0sb1swXVsxXSl9fSxfX2FzeW5jRGVsZWdhdG9yOmZ1bmN0aW9uICRPKHQpe3ZhciBlLG47cmV0dXJuIGU9e30saSgibmV4dCIpLGkoInRocm93IiwoZnVuY3Rpb24odCl7dGhyb3cgdH0pKSxpKCJyZXR1cm4iKSxlW1N5bWJvbC5pdGVyYXRvcl09ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZTtmdW5jdGlvbiBpKGkscil7dFtpXSYmKGVbaV09ZnVuY3Rpb24oZSl7cmV0dXJuKG49IW4pP3t2YWx1ZTpETyh0W2ldKGUpKSxkb25lOiJyZXR1cm4iPT09aX06cj9yKGUpOmV9KX19LF9fYXN5bmNWYWx1ZXM6ZnVuY3Rpb24gS08odCl7aWYoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKXRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLiIpO3ZhciBlPXRbU3ltYm9sLmFzeW5jSXRlcmF0b3JdO3JldHVybiBlP2UuY2FsbCh0KTpPTyh0KX0sX19tYWtlVGVtcGxhdGVPYmplY3Q6ZnVuY3Rpb24gWk8odCxlKXtyZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJyYXciLHt2YWx1ZTplfSk6dC5yYXc9ZSx0fX0pKTtmdW5jdGlvbiBKTyh0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6dD49ZT8wOk5hTn1mdW5jdGlvbiBRTyh0KXtyZXR1cm4gMT09PXQubGVuZ3RoJiYodD0oZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXtyZXR1cm4gSk8odChlKSxuKX19KSh0KSkse2xlZnQ6ZnVuY3Rpb24oZSxuLGkscil7Zm9yKG51bGw9PWkmJihpPTApLG51bGw9PXImJihyPWUubGVuZ3RoKTtpPHI7KXt2YXIgbz1pK3I+Pj4xO3QoZVtvXSxuKTwwP2k9bysxOnI9b31yZXR1cm4gaX0scmlnaHQ6ZnVuY3Rpb24oZSxuLGkscil7Zm9yKG51bGw9PWkmJihpPTApLG51bGw9PXImJihyPWUubGVuZ3RoKTtpPHI7KXt2YXIgbz1pK3I+Pj4xO3QoZVtvXSxuKT4wP3I9bzppPW8rMX1yZXR1cm4gaX19fXZhciB0ej1RTyhKTyksZXo9dHoucmlnaHQsbno9dHoubGVmdDtmdW5jdGlvbiBpeih0LGUpe3JldHVyblt0LGVdfWZ1bmN0aW9uIHJ6KHQpe3JldHVybiBudWxsPT09dD9OYU46K3R9ZnVuY3Rpb24gb3oodCxlKXt2YXIgbixpLHI9dC5sZW5ndGgsbz0wLGE9LTEscz0wLGw9MDtpZihudWxsPT1lKWZvcig7KythPHI7KWlzTmFOKG49cnoodFthXSkpfHwobCs9KGk9bi1zKSoobi0ocys9aS8rK28pKSk7ZWxzZSBmb3IoOysrYTxyOylpc05hTihuPXJ6KGUodFthXSxhLHQpKSl8fChsKz0oaT1uLXMpKihuLShzKz1pLysrbykpKTtpZihvPjEpcmV0dXJuIGwvKG8tMSl9ZnVuY3Rpb24gYXoodCxlKXt2YXIgbj1veih0LGUpO3JldHVybiBuP01hdGguc3FydChuKTpufWZ1bmN0aW9uIHN6KHQsZSl7dmFyIG4saSxyLG89dC5sZW5ndGgsYT0tMTtpZihudWxsPT1lKXtmb3IoOysrYTxvOylpZihudWxsIT0obj10W2FdKSYmbj49bilmb3IoaT1yPW47KythPG87KW51bGwhPShuPXRbYV0pJiYoaT5uJiYoaT1uKSxyPG4mJihyPW4pKX1lbHNlIGZvcig7KythPG87KWlmKG51bGwhPShuPWUodFthXSxhLHQpKSYmbj49bilmb3IoaT1yPW47KythPG87KW51bGwhPShuPWUodFthXSxhLHQpKSYmKGk+biYmKGk9bikscjxuJiYocj1uKSk7cmV0dXJuW2kscl19dmFyIGx6PUFycmF5LnByb3RvdHlwZSxjej1sei5zbGljZSx1ej1sei5tYXA7ZnVuY3Rpb24gaHoodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIGR6KHQpe3JldHVybiB0fWZ1bmN0aW9uIHB6KHQsZSxuKXt0PSt0LGU9K2Usbj0ocj1hcmd1bWVudHMubGVuZ3RoKTwyPyhlPXQsdD0wLDEpOnI8Mz8xOituO2Zvcih2YXIgaT0tMSxyPTB8TWF0aC5tYXgoMCxNYXRoLmNlaWwoKGUtdCkvbikpLG89bmV3IEFycmF5KHIpOysraTxyOylvW2ldPXQraSpuO3JldHVybiBvfXZhciBmej1NYXRoLnNxcnQoNTApLG16PU1hdGguc3FydCgxMCksZ3o9TWF0aC5zcXJ0KDIpO2Z1bmN0aW9uIF96KHQsZSxuKXt2YXIgaT0oZS10KS9NYXRoLm1heCgwLG4pLHI9TWF0aC5mbG9vcihNYXRoLmxvZyhpKS9NYXRoLkxOMTApLG89aS9NYXRoLnBvdygxMCxyKTtyZXR1cm4gcj49MD8obz49Zno/MTA6bz49bXo/NTpvPj1nej8yOjEpKk1hdGgucG93KDEwLHIpOi1NYXRoLnBvdygxMCwtcikvKG8+PWZ6PzEwOm8+PW16PzU6bz49Z3o/MjoxKX1mdW5jdGlvbiB5eih0LGUsbil7dmFyIGk9TWF0aC5hYnMoZS10KS9NYXRoLm1heCgwLG4pLHI9TWF0aC5wb3coMTAsTWF0aC5mbG9vcihNYXRoLmxvZyhpKS9NYXRoLkxOMTApKSxvPWkvcjtyZXR1cm4gbz49Zno/cio9MTA6bz49bXo/cio9NTpvPj1neiYmKHIqPTIpLGU8dD8tcjpyfWZ1bmN0aW9uIHZ6KHQpe3JldHVybiBNYXRoLmNlaWwoTWF0aC5sb2codC5sZW5ndGgpL01hdGguTE4yKSsxfWZ1bmN0aW9uIGJ6KHQsZSxuKXtpZihudWxsPT1uJiYobj1yeiksaT10Lmxlbmd0aCl7aWYoKGU9K2UpPD0wfHxpPDIpcmV0dXJuK24odFswXSwwLHQpO2lmKGU+PTEpcmV0dXJuK24odFtpLTFdLGktMSx0KTt2YXIgaSxyPShpLTEpKmUsbz1NYXRoLmZsb29yKHIpLGE9K24odFtvXSxvLHQpO3JldHVybiBhKygrbih0W28rMV0sbysxLHQpLWEpKihyLW8pfX1mdW5jdGlvbiB4eih0LGUpe3ZhciBuLGkscj10Lmxlbmd0aCxvPS0xO2lmKG51bGw9PWUpe2Zvcig7KytvPHI7KWlmKG51bGwhPShuPXRbb10pJiZuPj1uKWZvcihpPW47KytvPHI7KW51bGwhPShuPXRbb10pJiZpPm4mJihpPW4pfWVsc2UgZm9yKDsrK288cjspaWYobnVsbCE9KG49ZSh0W29dLG8sdCkpJiZuPj1uKWZvcihpPW47KytvPHI7KW51bGwhPShuPWUodFtvXSxvLHQpKSYmaT5uJiYoaT1uKTtyZXR1cm4gaX1mdW5jdGlvbiB3eih0KXtpZighKHI9dC5sZW5ndGgpKXJldHVybltdO2Zvcih2YXIgZT0tMSxuPXh6KHQsU3opLGk9bmV3IEFycmF5KG4pOysrZTxuOylmb3IodmFyIHIsbz0tMSxhPWlbZV09bmV3IEFycmF5KHIpOysrbzxyOylhW29dPXRbb11bZV07cmV0dXJuIGl9ZnVuY3Rpb24gU3oodCl7cmV0dXJuIHQubGVuZ3RofXZhciBNej1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZnVuY3Rpb24gRXoodCl7cmV0dXJuIHR9dmFyIFR6PTFlLTY7ZnVuY3Rpb24gQ3oodCl7cmV0dXJuInRyYW5zbGF0ZSgiKyh0Ky41KSsiLDApIn1mdW5jdGlvbiBBeih0KXtyZXR1cm4idHJhbnNsYXRlKDAsIisodCsuNSkrIikifWZ1bmN0aW9uIGt6KHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4rdChlKX19ZnVuY3Rpb24gTHoodCl7dmFyIGU9TWF0aC5tYXgoMCx0LmJhbmR3aWR0aCgpLTEpLzI7cmV0dXJuIHQucm91bmQoKSYmKGU9TWF0aC5yb3VuZChlKSksZnVuY3Rpb24obil7cmV0dXJuK3QobikrZX19ZnVuY3Rpb24gUHooKXtyZXR1cm4hdGhpcy5fX2F4aXN9ZnVuY3Rpb24gTnoodCxlKXt2YXIgbj1bXSxpPW51bGwscj1udWxsLG89NixhPTYscz0zLGw9MT09PXR8fDQ9PT10Py0xOjEsYz00PT09dHx8Mj09PXQ/IngiOiJ5Iix1PTE9PT10fHwzPT09dD9DejpBejtmdW5jdGlvbiBoKGgpe3ZhciBkPW51bGw9PWk/ZS50aWNrcz9lLnRpY2tzLmFwcGx5KGUsbik6ZS5kb21haW4oKTppLHA9bnVsbD09cj9lLnRpY2tGb3JtYXQ/ZS50aWNrRm9ybWF0LmFwcGx5KGUsbik6RXo6cixmPU1hdGgubWF4KG8sMCkrcyxtPWUucmFuZ2UoKSxnPSttWzBdKy41LF89K21bbS5sZW5ndGgtMV0rLjUseT0oZS5iYW5kd2lkdGg/THo6a3opKGUuY29weSgpKSx2PWguc2VsZWN0aW9uP2guc2VsZWN0aW9uKCk6aCxiPXYuc2VsZWN0QWxsKCIuZG9tYWluIikuZGF0YShbbnVsbF0pLHg9di5zZWxlY3RBbGwoIi50aWNrIikuZGF0YShkLGUpLm9yZGVyKCksdz14LmV4aXQoKSxTPXguZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsInRpY2siKSxNPXguc2VsZWN0KCJsaW5lIiksRT14LnNlbGVjdCgidGV4dCIpO2I9Yi5tZXJnZShiLmVudGVyKCkuaW5zZXJ0KCJwYXRoIiwiLnRpY2siKS5hdHRyKCJjbGFzcyIsImRvbWFpbiIpLmF0dHIoInN0cm9rZSIsIiMwMDAiKSkseD14Lm1lcmdlKFMpLE09TS5tZXJnZShTLmFwcGVuZCgibGluZSIpLmF0dHIoInN0cm9rZSIsIiMwMDAiKS5hdHRyKGMrIjIiLGwqbykpLEU9RS5tZXJnZShTLmFwcGVuZCgidGV4dCIpLmF0dHIoImZpbGwiLCIjMDAwIikuYXR0cihjLGwqZikuYXR0cigiZHkiLDE9PT10PyIwZW0iOjM9PT10PyIwLjcxZW0iOiIwLjMyZW0iKSksaCE9PXYmJihiPWIudHJhbnNpdGlvbihoKSx4PXgudHJhbnNpdGlvbihoKSxNPU0udHJhbnNpdGlvbihoKSxFPUUudHJhbnNpdGlvbihoKSx3PXcudHJhbnNpdGlvbihoKS5hdHRyKCJvcGFjaXR5IixUeikuYXR0cigidHJhbnNmb3JtIiwoZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9eSh0KSk/dSh0KTp0aGlzLmdldEF0dHJpYnV0ZSgidHJhbnNmb3JtIil9KSksUy5hdHRyKCJvcGFjaXR5IixUeikuYXR0cigidHJhbnNmb3JtIiwoZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5wYXJlbnROb2RlLl9fYXhpcztyZXR1cm4gdShlJiZpc0Zpbml0ZShlPWUodCkpP2U6eSh0KSl9KSkpLHcucmVtb3ZlKCksYi5hdHRyKCJkIiw0PT09dHx8Mj09dD8iTSIrbCphKyIsIitnKyJIMC41ViIrXysiSCIrbCphOiJNIitnKyIsIitsKmErIlYwLjVIIitfKyJWIitsKmEpLHguYXR0cigib3BhY2l0eSIsMSkuYXR0cigidHJhbnNmb3JtIiwoZnVuY3Rpb24odCl7cmV0dXJuIHUoeSh0KSl9KSksTS5hdHRyKGMrIjIiLGwqbyksRS5hdHRyKGMsbCpmKS50ZXh0KHApLHYuZmlsdGVyKFB6KS5hdHRyKCJmaWxsIiwibm9uZSIpLmF0dHIoImZvbnQtc2l6ZSIsMTApLmF0dHIoImZvbnQtZmFtaWx5Iiwic2Fucy1zZXJpZiIpLmF0dHIoInRleHQtYW5jaG9yIiwyPT09dD8ic3RhcnQiOjQ9PT10PyJlbmQiOiJtaWRkbGUiKSx2LmVhY2goKGZ1bmN0aW9uKCl7dGhpcy5fX2F4aXM9eX0pKX1yZXR1cm4gaC5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT10LGgpOmV9LGgudGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gbj1Nei5jYWxsKGFyZ3VtZW50cyksaH0saC50aWNrQXJndW1lbnRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPW51bGw9PXQ/W106TXouY2FsbCh0KSxoKTpuLnNsaWNlKCl9LGgudGlja1ZhbHVlcz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT1udWxsPT10P251bGw6TXouY2FsbCh0KSxoKTppJiZpLnNsaWNlKCl9LGgudGlja0Zvcm1hdD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LGgpOnJ9LGgudGlja1NpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89YT0rdCxoKTpvfSxoLnRpY2tTaXplSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89K3QsaCk6b30saC50aWNrU2l6ZU91dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSt0LGgpOmF9LGgudGlja1BhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9K3QsaCk6c30saH12YXIgSXo9e3ZhbHVlOmZ1bmN0aW9uKCl7fX07ZnVuY3Rpb24gUnooKXtmb3IodmFyIHQsZT0wLG49YXJndW1lbnRzLmxlbmd0aCxpPXt9O2U8bjsrK2Upe2lmKCEodD1hcmd1bWVudHNbZV0rIiIpfHx0IGluIGl8fC9bXHMuXS8udGVzdCh0KSl0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgdHlwZTogIit0KTtpW3RdPVtdfXJldHVybiBuZXcgT3ooaSl9ZnVuY3Rpb24gT3oodCl7dGhpcy5fPXR9ZnVuY3Rpb24genoodCxlKXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLykubWFwKChmdW5jdGlvbih0KXt2YXIgbj0iIixpPXQuaW5kZXhPZigiLiIpO2lmKGk+PTAmJihuPXQuc2xpY2UoaSsxKSx0PXQuc2xpY2UoMCxpKSksdCYmIWUuaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7cmV0dXJue3R5cGU6dCxuYW1lOm59fSkpfWZ1bmN0aW9uIER6KHQsZSl7Zm9yKHZhciBuLGk9MCxyPXQubGVuZ3RoO2k8cjsrK2kpaWYoKG49dFtpXSkubmFtZT09PWUpcmV0dXJuIG4udmFsdWV9ZnVuY3Rpb24gQnoodCxlLG4pe2Zvcih2YXIgaT0wLHI9dC5sZW5ndGg7aTxyOysraSlpZih0W2ldLm5hbWU9PT1lKXt0W2ldPUl6LHQ9dC5zbGljZSgwLGkpLmNvbmNhdCh0LnNsaWNlKGkrMSkpO2JyZWFrfXJldHVybiBudWxsIT1uJiZ0LnB1c2goe25hbWU6ZSx2YWx1ZTpufSksdH1Pei5wcm90b3R5cGU9UnoucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpPeixvbjpmdW5jdGlvbih0LGUpe3ZhciBuLGk9dGhpcy5fLHI9enoodCsiIixpKSxvPS0xLGE9ci5sZW5ndGg7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtpZihudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIrZSk7Zm9yKDsrK288YTspaWYobj0odD1yW29dKS50eXBlKWlbbl09QnooaVtuXSx0Lm5hbWUsZSk7ZWxzZSBpZihudWxsPT1lKWZvcihuIGluIGkpaVtuXT1CeihpW25dLHQubmFtZSxudWxsKTtyZXR1cm4gdGhpc31mb3IoOysrbzxhOylpZigobj0odD1yW29dKS50eXBlKSYmKG49RHooaVtuXSx0Lm5hbWUpKSlyZXR1cm4gbn0sY29weTpmdW5jdGlvbigpe3ZhciB0PXt9LGU9dGhpcy5fO2Zvcih2YXIgbiBpbiBlKXRbbl09ZVtuXS5zbGljZSgpO3JldHVybiBuZXcgT3oodCl9LGNhbGw6ZnVuY3Rpb24odCxlKXtpZigobj1hcmd1bWVudHMubGVuZ3RoLTIpPjApZm9yKHZhciBuLGkscj1uZXcgQXJyYXkobiksbz0wO288bjsrK28pcltvXT1hcmd1bWVudHNbbysyXTtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO2ZvcihvPTAsbj0oaT10aGlzLl9bdF0pLmxlbmd0aDtvPG47KytvKWlbb10udmFsdWUuYXBwbHkoZSxyKX0sYXBwbHk6ZnVuY3Rpb24odCxlLG4pe2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7Zm9yKHZhciBpPXRoaXMuX1t0XSxyPTAsbz1pLmxlbmd0aDtyPG87KytyKWlbcl0udmFsdWUuYXBwbHkoZSxuKX19O3ZhciBIej0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsRno9e3N2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHhodG1sOkh6LHhsaW5rOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIix4bWw6Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIn07ZnVuY3Rpb24gVnoodCl7dmFyIGU9dCs9IiIsbj1lLmluZGV4T2YoIjoiKTtyZXR1cm4gbj49MCYmInhtbG5zIiE9PShlPXQuc2xpY2UoMCxuKSkmJih0PXQuc2xpY2UobisxKSksRnouaGFzT3duUHJvcGVydHkoZSk/e3NwYWNlOkZ6W2VdLGxvY2FsOnR9OnR9ZnVuY3Rpb24gVXoodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vd25lckRvY3VtZW50LG49dGhpcy5uYW1lc3BhY2VVUkk7cmV0dXJuIG49PT1IeiYmZS5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJPT09SHo/ZS5jcmVhdGVFbGVtZW50KHQpOmUuY3JlYXRlRWxlbWVudE5TKG4sdCl9fWZ1bmN0aW9uIGp6KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIEd6KHQpe3ZhciBlPVZ6KHQpO3JldHVybihlLmxvY2FsP2p6OlV6KShlKX1mdW5jdGlvbiBXeigpe31mdW5jdGlvbiBxeih0KXtyZXR1cm4gbnVsbD09dD9XejpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IodCl9fWZ1bmN0aW9uIFl6KCl7cmV0dXJuW119ZnVuY3Rpb24gWHoodCl7cmV0dXJuIG51bGw9PXQ/WXo6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHQpfX1mdW5jdGlvbiAkeih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXRjaGVzKHQpfX1mdW5jdGlvbiBLeih0KXtyZXR1cm4gbmV3IEFycmF5KHQubGVuZ3RoKX1mdW5jdGlvbiBaeih0LGUpe3RoaXMub3duZXJEb2N1bWVudD10Lm93bmVyRG9jdW1lbnQsdGhpcy5uYW1lc3BhY2VVUkk9dC5uYW1lc3BhY2VVUkksdGhpcy5fbmV4dD1udWxsLHRoaXMuX3BhcmVudD10LHRoaXMuX19kYXRhX189ZX1aei5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlp6LGFwcGVuZENoaWxkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKHQsdGhpcy5fbmV4dCl9LGluc2VydEJlZm9yZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKHQsZSl9LHF1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yKHQpfSxxdWVyeVNlbGVjdG9yQWxsOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbCh0KX19O2Z1bmN0aW9uIEp6KHQsZSxuLGkscixvKXtmb3IodmFyIGEscz0wLGw9ZS5sZW5ndGgsYz1vLmxlbmd0aDtzPGM7KytzKShhPWVbc10pPyhhLl9fZGF0YV9fPW9bc10saVtzXT1hKTpuW3NdPW5ldyBaeih0LG9bc10pO2Zvcig7czxsOysrcykoYT1lW3NdKSYmKHJbc109YSl9ZnVuY3Rpb24gUXoodCxlLG4saSxyLG8sYSl7dmFyIHMsbCxjLHU9e30saD1lLmxlbmd0aCxkPW8ubGVuZ3RoLHA9bmV3IEFycmF5KGgpO2ZvcihzPTA7czxoOysrcykobD1lW3NdKSYmKHBbc109Yz0iJCIrYS5jYWxsKGwsbC5fX2RhdGFfXyxzLGUpLGMgaW4gdT9yW3NdPWw6dVtjXT1sKTtmb3Iocz0wO3M8ZDsrK3MpKGw9dVtjPSIkIithLmNhbGwodCxvW3NdLHMsbyldKT8oaVtzXT1sLGwuX19kYXRhX189b1tzXSx1W2NdPW51bGwpOm5bc109bmV3IFp6KHQsb1tzXSk7Zm9yKHM9MDtzPGg7KytzKShsPWVbc10pJiZ1W3Bbc11dPT09bCYmKHJbc109bCl9ZnVuY3Rpb24gdEQodCxlKXtyZXR1cm4gdDxlPy0xOnQ+ZT8xOnQ+PWU/MDpOYU59ZnVuY3Rpb24gZUQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fWZ1bmN0aW9uIG5EKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19ZnVuY3Rpb24gaUQodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZSh0LGUpfX1mdW5jdGlvbiByRCh0LGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLGUpfX1mdW5jdGlvbiBvRCh0LGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PW4/dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCk6dGhpcy5zZXRBdHRyaWJ1dGUodCxuKX19ZnVuY3Rpb24gYUQodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1uP3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKTp0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxuKX19ZnVuY3Rpb24gc0QodCl7cmV0dXJuIHQub3duZXJEb2N1bWVudCYmdC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3fHx0LmRvY3VtZW50JiZ0fHx0LmRlZmF1bHRWaWV3fWZ1bmN0aW9uIGxEKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fWZ1bmN0aW9uIGNEKHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQsZSxuKX19ZnVuY3Rpb24gdUQodCxlLG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciBpPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWk/dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KTp0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQsaSxuKX19ZnVuY3Rpb24gaEQodCxlKXtyZXR1cm4gdC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKGUpfHxzRCh0KS5nZXRDb21wdXRlZFN0eWxlKHQsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShlKX1mdW5jdGlvbiBkRCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtkZWxldGUgdGhpc1t0XX19ZnVuY3Rpb24gcEQodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzW3RdPWV9fWZ1bmN0aW9uIGZEKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09bj9kZWxldGUgdGhpc1t0XTp0aGlzW3RdPW59fWZ1bmN0aW9uIG1EKHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKX1mdW5jdGlvbiBnRCh0KXtyZXR1cm4gdC5jbGFzc0xpc3R8fG5ldyBfRCh0KX1mdW5jdGlvbiBfRCh0KXt0aGlzLl9ub2RlPXQsdGhpcy5fbmFtZXM9bUQodC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX1mdW5jdGlvbiB5RCh0LGUpe2Zvcih2YXIgbj1nRCh0KSxpPS0xLHI9ZS5sZW5ndGg7KytpPHI7KW4uYWRkKGVbaV0pfWZ1bmN0aW9uIHZEKHQsZSl7Zm9yKHZhciBuPWdEKHQpLGk9LTEscj1lLmxlbmd0aDsrK2k8cjspbi5yZW1vdmUoZVtpXSl9ZnVuY3Rpb24gYkQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7eUQodGhpcyx0KX19ZnVuY3Rpb24geEQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dkQodGhpcyx0KX19ZnVuY3Rpb24gd0QodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXsoZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk/eUQ6dkQpKHRoaXMsdCl9fWZ1bmN0aW9uIFNEKCl7dGhpcy50ZXh0Q29udGVudD0iIn1mdW5jdGlvbiBNRCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fWZ1bmN0aW9uIEVEKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09ZT8iIjplfX1mdW5jdGlvbiBURCgpe3RoaXMuaW5uZXJIVE1MPSIifWZ1bmN0aW9uIENEKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuaW5uZXJIVE1MPXR9fWZ1bmN0aW9uIEFEKHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaW5uZXJIVE1MPW51bGw9PWU/IiI6ZX19ZnVuY3Rpb24ga0QoKXt0aGlzLm5leHRTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyl9ZnVuY3Rpb24gTEQoKXt0aGlzLnByZXZpb3VzU2libGluZyYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKX1mdW5jdGlvbiBQRCgpe3JldHVybiBudWxsfWZ1bmN0aW9uIE5EKCl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO3QmJnQucmVtb3ZlQ2hpbGQodGhpcyl9ZnVuY3Rpb24gSUQoKXt2YXIgdD10aGlzLmNsb25lTm9kZSghMSksZT10aGlzLnBhcmVudE5vZGU7cmV0dXJuIGU/ZS5pbnNlcnRCZWZvcmUodCx0aGlzLm5leHRTaWJsaW5nKTp0fWZ1bmN0aW9uIFJEKCl7dmFyIHQ9dGhpcy5jbG9uZU5vZGUoITApLGU9dGhpcy5wYXJlbnROb2RlO3JldHVybiBlP2UuaW5zZXJ0QmVmb3JlKHQsdGhpcy5uZXh0U2libGluZyk6dH1fRC5wcm90b3R5cGU9e2FkZDpmdW5jdGlvbih0KXt0aGlzLl9uYW1lcy5pbmRleE9mKHQpPDAmJih0aGlzLl9uYW1lcy5wdXNoKHQpLHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsdGhpcy5fbmFtZXMuam9pbigiICIpKSl9LHJlbW92ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLl9uYW1lcy5pbmRleE9mKHQpO2U+PTAmJih0aGlzLl9uYW1lcy5zcGxpY2UoZSwxKSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxjb250YWluczpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbmFtZXMuaW5kZXhPZih0KT49MH19O3ZhciBPRD17fSx6RD1udWxsOyJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJigib25tb3VzZWVudGVyImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8KE9EPXttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0In0pKTtmdW5jdGlvbiBERCh0LGUsbil7cmV0dXJuIHQ9QkQodCxlLG4pLGZ1bmN0aW9uKGUpe3ZhciBuPWUucmVsYXRlZFRhcmdldDtuJiYobj09PXRoaXN8fDgmbi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzKSl8fHQuY2FsbCh0aGlzLGUpfX1mdW5jdGlvbiBCRCh0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKGkpe3ZhciByPXpEO3pEPWk7dHJ5e3QuY2FsbCh0aGlzLHRoaXMuX19kYXRhX18sZSxuKX1maW5hbGx5e3pEPXJ9fX1mdW5jdGlvbiBIRCh0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLykubWFwKChmdW5jdGlvbih0KXt2YXIgZT0iIixuPXQuaW5kZXhPZigiLiIpO3JldHVybiBuPj0wJiYoZT10LnNsaWNlKG4rMSksdD10LnNsaWNlKDAsbikpLHt0eXBlOnQsbmFtZTplfX0pKX1mdW5jdGlvbiBGRCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9fb247aWYoZSl7Zm9yKHZhciBuLGk9MCxyPS0xLG89ZS5sZW5ndGg7aTxvOysraSluPWVbaV0sdC50eXBlJiZuLnR5cGUhPT10LnR5cGV8fG4ubmFtZSE9PXQubmFtZT9lWysrcl09bjp0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIobi50eXBlLG4ubGlzdGVuZXIsbi5jYXB0dXJlKTsrK3I/ZS5sZW5ndGg9cjpkZWxldGUgdGhpcy5fX29ufX19ZnVuY3Rpb24gVkQodCxlLG4pe3ZhciBpPU9ELmhhc093blByb3BlcnR5KHQudHlwZSk/REQ6QkQ7cmV0dXJuIGZ1bmN0aW9uKHIsbyxhKXt2YXIgcyxsPXRoaXMuX19vbixjPWkoZSxvLGEpO2lmKGwpZm9yKHZhciB1PTAsaD1sLmxlbmd0aDt1PGg7Kyt1KWlmKChzPWxbdV0pLnR5cGU9PT10LnR5cGUmJnMubmFtZT09PXQubmFtZSlyZXR1cm4gdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKHMudHlwZSxzLmxpc3RlbmVyLHMuY2FwdHVyZSksdGhpcy5hZGRFdmVudExpc3RlbmVyKHMudHlwZSxzLmxpc3RlbmVyPWMscy5jYXB0dXJlPW4pLHZvaWQocy52YWx1ZT1lKTt0aGlzLmFkZEV2ZW50TGlzdGVuZXIodC50eXBlLGMsbikscz17dHlwZTp0LnR5cGUsbmFtZTp0Lm5hbWUsdmFsdWU6ZSxsaXN0ZW5lcjpjLGNhcHR1cmU6bn0sbD9sLnB1c2gocyk6dGhpcy5fX29uPVtzXX19ZnVuY3Rpb24gVUQodCxlLG4pe3ZhciBpPXNEKHQpLHI9aS5DdXN0b21FdmVudDsiZnVuY3Rpb24iPT10eXBlb2Ygcj9yPW5ldyByKGUsbik6KHI9aS5kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxuPyhyLmluaXRFdmVudChlLG4uYnViYmxlcyxuLmNhbmNlbGFibGUpLHIuZGV0YWlsPW4uZGV0YWlsKTpyLmluaXRFdmVudChlLCExLCExKSksdC5kaXNwYXRjaEV2ZW50KHIpfWZ1bmN0aW9uIGpEKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIFVEKHRoaXMsdCxlKX19ZnVuY3Rpb24gR0QodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gVUQodGhpcyx0LGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX19dmFyIFdEPVtudWxsXTtmdW5jdGlvbiBxRCh0LGUpe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9ZX1mdW5jdGlvbiBZRCgpe3JldHVybiBuZXcgcUQoW1tkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdXSxXRCl9ZnVuY3Rpb24gWEQodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P25ldyBxRChbW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodCldXSxbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSk6bmV3IHFEKFtbdF1dLFdEKX1mdW5jdGlvbiAkRCh0KXt2YXIgZT0oZnVuY3Rpb24gbigpe2Zvcih2YXIgdCxlPXpEO3Q9ZS5zb3VyY2VFdmVudDspZT10O3JldHVybiBlfSkoKTtyZXR1cm4gZS5jaGFuZ2VkVG91Y2hlcyYmKGU9ZS5jaGFuZ2VkVG91Y2hlc1swXSksKGZ1bmN0aW9uIGkodCxlKXt2YXIgbj10Lm93bmVyU1ZHRWxlbWVudHx8dDtpZihuLmNyZWF0ZVNWR1BvaW50KXt2YXIgaT1uLmNyZWF0ZVNWR1BvaW50KCk7cmV0dXJuIGkueD1lLmNsaWVudFgsaS55PWUuY2xpZW50WSxbKGk9aS5tYXRyaXhUcmFuc2Zvcm0odC5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpKS54LGkueV19dmFyIHI9dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtyZXR1cm5bZS5jbGllbnRYLXIubGVmdC10LmNsaWVudExlZnQsZS5jbGllbnRZLXIudG9wLXQuY2xpZW50VG9wXX0pKHQsZSl9ZnVuY3Rpb24gS0QoKXt6RC5wcmV2ZW50RGVmYXVsdCgpLHpELnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIFpEKHQpe3ZhciBlPXQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LG49WEQodCkub24oImRyYWdzdGFydC5kcmFnIixLRCwhMCk7Im9uc2VsZWN0c3RhcnQiaW4gZT9uLm9uKCJzZWxlY3RzdGFydC5kcmFnIixLRCwhMCk6KGUuX19ub3NlbGVjdD1lLnN0eWxlLk1velVzZXJTZWxlY3QsZS5zdHlsZS5Nb3pVc2VyU2VsZWN0PSJub25lIil9ZnVuY3Rpb24gSkQodCxlKXt2YXIgbj10LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxpPVhEKHQpLm9uKCJkcmFnc3RhcnQuZHJhZyIsbnVsbCk7ZSYmKGkub24oImNsaWNrLmRyYWciLEtELCEwKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2kub24oImNsaWNrLmRyYWciLG51bGwpfSksMCkpLCJvbnNlbGVjdHN0YXJ0ImluIG4/aS5vbigic2VsZWN0c3RhcnQuZHJhZyIsbnVsbCk6KG4uc3R5bGUuTW96VXNlclNlbGVjdD1uLl9fbm9zZWxlY3QsZGVsZXRlIG4uX19ub3NlbGVjdCl9ZnVuY3Rpb24gUUQodCxlLG4pe3QucHJvdG90eXBlPWUucHJvdG90eXBlPW4sbi5jb25zdHJ1Y3Rvcj10fWZ1bmN0aW9uIHRCKHQsZSl7dmFyIG49T2JqZWN0LmNyZWF0ZSh0LnByb3RvdHlwZSk7Zm9yKHZhciBpIGluIGUpbltpXT1lW2ldO3JldHVybiBufWZ1bmN0aW9uIGVCKCl7fXFELnByb3RvdHlwZT1ZRC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOnFELHNlbGVjdDpmdW5jdGlvbiBuQih0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9cXoodCkpO2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj1lLmxlbmd0aCxpPW5ldyBBcnJheShuKSxyPTA7cjxuOysrcilmb3IodmFyIG8sYSxzPWVbcl0sbD1zLmxlbmd0aCxjPWlbcl09bmV3IEFycmF5KGwpLHU9MDt1PGw7Kyt1KShvPXNbdV0pJiYoYT10LmNhbGwobyxvLl9fZGF0YV9fLHUscykpJiYoIl9fZGF0YV9fImluIG8mJihhLl9fZGF0YV9fPW8uX19kYXRhX18pLGNbdV09YSk7cmV0dXJuIG5ldyBxRChpLHRoaXMuX3BhcmVudHMpfSxzZWxlY3RBbGw6ZnVuY3Rpb24gaUIodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVh6KHQpKTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49ZS5sZW5ndGgsaT1bXSxyPVtdLG89MDtvPG47KytvKWZvcih2YXIgYSxzPWVbb10sbD1zLmxlbmd0aCxjPTA7YzxsOysrYykoYT1zW2NdKSYmKGkucHVzaCh0LmNhbGwoYSxhLl9fZGF0YV9fLGMscykpLHIucHVzaChhKSk7cmV0dXJuIG5ldyBxRChpLHIpfSxmaWx0ZXI6ZnVuY3Rpb24gckIodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PSR6KHQpKTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49ZS5sZW5ndGgsaT1uZXcgQXJyYXkobikscj0wO3I8bjsrK3IpZm9yKHZhciBvLGE9ZVtyXSxzPWEubGVuZ3RoLGw9aVtyXT1bXSxjPTA7YzxzOysrYykobz1hW2NdKSYmdC5jYWxsKG8sby5fX2RhdGFfXyxjLGEpJiZsLnB1c2gobyk7cmV0dXJuIG5ldyBxRChpLHRoaXMuX3BhcmVudHMpfSxkYXRhOmZ1bmN0aW9uIG9CKHQsZSl7aWYoIXQpcmV0dXJuIGY9bmV3IEFycmF5KHRoaXMuc2l6ZSgpKSx1PS0xLHRoaXMuZWFjaCgoZnVuY3Rpb24odCl7ZlsrK3VdPXR9KSksZjt2YXIgbj1lP1F6Okp6LGk9dGhpcy5fcGFyZW50cyxyPXRoaXMuX2dyb3VwczsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9KGZ1bmN0aW9uIG8odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSkodCkpO2Zvcih2YXIgYT1yLmxlbmd0aCxzPW5ldyBBcnJheShhKSxsPW5ldyBBcnJheShhKSxjPW5ldyBBcnJheShhKSx1PTA7dTxhOysrdSl7dmFyIGg9aVt1XSxkPXJbdV0scD1kLmxlbmd0aCxmPXQuY2FsbChoLGgmJmguX19kYXRhX18sdSxpKSxtPWYubGVuZ3RoLGc9bFt1XT1uZXcgQXJyYXkobSksXz1zW3VdPW5ldyBBcnJheShtKTtuKGgsZCxnLF8sY1t1XT1uZXcgQXJyYXkocCksZixlKTtmb3IodmFyIHksdixiPTAseD0wO2I8bTsrK2IpaWYoeT1nW2JdKXtmb3IoYj49eCYmKHg9YisxKTshKHY9X1t4XSkmJisreDxtOyk7eS5fbmV4dD12fHxudWxsfX1yZXR1cm4ocz1uZXcgcUQocyxpKSkuX2VudGVyPWwscy5fZXhpdD1jLHN9LGVudGVyOmZ1bmN0aW9uIGFCKCl7cmV0dXJuIG5ldyBxRCh0aGlzLl9lbnRlcnx8dGhpcy5fZ3JvdXBzLm1hcChLeiksdGhpcy5fcGFyZW50cyl9LGV4aXQ6ZnVuY3Rpb24gc0IoKXtyZXR1cm4gbmV3IHFEKHRoaXMuX2V4aXR8fHRoaXMuX2dyb3Vwcy5tYXAoS3opLHRoaXMuX3BhcmVudHMpfSxqb2luOmZ1bmN0aW9uIGxCKHQsZSxuKXt2YXIgaT10aGlzLmVudGVyKCkscj10aGlzLG89dGhpcy5leGl0KCk7cmV0dXJuIGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dChpKTppLmFwcGVuZCh0KyIiKSxudWxsIT1lJiYocj1lKHIpKSxudWxsPT1uP28ucmVtb3ZlKCk6bihvKSxpJiZyP2kubWVyZ2Uocikub3JkZXIoKTpyfSxtZXJnZTpmdW5jdGlvbiBjQih0KXtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49dC5fZ3JvdXBzLGk9ZS5sZW5ndGgscj1NYXRoLm1pbihpLG4ubGVuZ3RoKSxvPW5ldyBBcnJheShpKSxhPTA7YTxyOysrYSlmb3IodmFyIHMsbD1lW2FdLGM9blthXSx1PWwubGVuZ3RoLGg9b1thXT1uZXcgQXJyYXkodSksZD0wO2Q8dTsrK2QpKHM9bFtkXXx8Y1tkXSkmJihoW2RdPXMpO2Zvcig7YTxpOysrYSlvW2FdPWVbYV07cmV0dXJuIG5ldyBxRChvLHRoaXMuX3BhcmVudHMpfSxvcmRlcjpmdW5jdGlvbiB1Qigpe2Zvcih2YXIgdD10aGlzLl9ncm91cHMsZT0tMSxuPXQubGVuZ3RoOysrZTxuOylmb3IodmFyIGkscj10W2VdLG89ci5sZW5ndGgtMSxhPXJbb107LS1vPj0wOykoaT1yW29dKSYmKGEmJjReaS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihhKSYmYS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShpLGEpLGE9aSk7cmV0dXJuIHRoaXN9LHNvcnQ6ZnVuY3Rpb24gaEIodCl7ZnVuY3Rpb24gZShlLG4pe3JldHVybiBlJiZuP3QoZS5fX2RhdGFfXyxuLl9fZGF0YV9fKTohZS0hbn10fHwodD10RCk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxpPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGkpLG89MDtvPGk7KytvKXtmb3IodmFyIGEscz1uW29dLGw9cy5sZW5ndGgsYz1yW29dPW5ldyBBcnJheShsKSx1PTA7dTxsOysrdSkoYT1zW3VdKSYmKGNbdV09YSk7Yy5zb3J0KGUpfXJldHVybiBuZXcgcUQocix0aGlzLl9wYXJlbnRzKS5vcmRlcigpfSxjYWxsOmZ1bmN0aW9uIGRCKCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBhcmd1bWVudHNbMF09dGhpcyx0LmFwcGx5KG51bGwsYXJndW1lbnRzKSx0aGlzfSxub2RlczpmdW5jdGlvbiBwQigpe3ZhciB0PW5ldyBBcnJheSh0aGlzLnNpemUoKSksZT0tMTtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe3RbKytlXT10aGlzfSkpLHR9LG5vZGU6ZnVuY3Rpb24gZkIoKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLGU9MCxuPXQubGVuZ3RoO2U8bjsrK2UpZm9yKHZhciBpPXRbZV0scj0wLG89aS5sZW5ndGg7cjxvOysrcil7dmFyIGE9aVtyXTtpZihhKXJldHVybiBhfXJldHVybiBudWxsfSxzaXplOmZ1bmN0aW9uIG1CKCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpeysrdH0pKSx0fSxlbXB0eTpmdW5jdGlvbiBnQigpe3JldHVybiF0aGlzLm5vZGUoKX0sZWFjaDpmdW5jdGlvbiBfQih0KXtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49MCxpPWUubGVuZ3RoO248aTsrK24pZm9yKHZhciByLG89ZVtuXSxhPTAscz1vLmxlbmd0aDthPHM7KythKShyPW9bYV0pJiZ0LmNhbGwocixyLl9fZGF0YV9fLGEsbyk7cmV0dXJuIHRoaXN9LGF0dHI6ZnVuY3Rpb24geUIodCxlKXt2YXIgbj1Weih0KTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciBpPXRoaXMubm9kZSgpO3JldHVybiBuLmxvY2FsP2kuZ2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsKTppLmdldEF0dHJpYnV0ZShuKX1yZXR1cm4gdGhpcy5lYWNoKChudWxsPT1lP24ubG9jYWw/bkQ6ZUQ6ImZ1bmN0aW9uIj09dHlwZW9mIGU/bi5sb2NhbD9hRDpvRDpuLmxvY2FsP3JEOmlEKShuLGUpKX0sc3R5bGU6ZnVuY3Rpb24gdkIodCxlLG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/dGhpcy5lYWNoKChudWxsPT1lP2xEOiJmdW5jdGlvbiI9PXR5cGVvZiBlP3VEOmNEKSh0LGUsbnVsbD09bj8iIjpuKSk6aEQodGhpcy5ub2RlKCksdCl9LHByb3BlcnR5OmZ1bmN0aW9uIGJCKHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goKG51bGw9PWU/ZEQ6ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZkQ6cEQpKHQsZSkpOnRoaXMubm9kZSgpW3RdfSxjbGFzc2VkOmZ1bmN0aW9uIHhCKHQsZSl7dmFyIG49bUQodCsiIik7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtmb3IodmFyIGk9Z0QodGhpcy5ub2RlKCkpLHI9LTEsbz1uLmxlbmd0aDsrK3I8bzspaWYoIWkuY29udGFpbnMobltyXSkpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIHRoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIGU/d0Q6ZT9iRDp4RCkobixlKSl9LHRleHQ6ZnVuY3Rpb24gd0IodCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKG51bGw9PXQ/U0Q6KCJmdW5jdGlvbiI9PXR5cGVvZiB0P0VEOk1EKSh0KSk6dGhpcy5ub2RlKCkudGV4dENvbnRlbnR9LGh0bWw6ZnVuY3Rpb24gU0IodCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKG51bGw9PXQ/VEQ6KCJmdW5jdGlvbiI9PXR5cGVvZiB0P0FEOkNEKSh0KSk6dGhpcy5ub2RlKCkuaW5uZXJIVE1MfSxyYWlzZTpmdW5jdGlvbiBNQigpe3JldHVybiB0aGlzLmVhY2goa0QpfSxsb3dlcjpmdW5jdGlvbiBFQigpe3JldHVybiB0aGlzLmVhY2goTEQpfSxhcHBlbmQ6ZnVuY3Rpb24gVEIodCl7dmFyIGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpHeih0KTtyZXR1cm4gdGhpcy5zZWxlY3QoKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSkpfSxpbnNlcnQ6ZnVuY3Rpb24gQ0IodCxlKXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2YgdD90Okd6KHQpLGk9bnVsbD09ZT9QRDoiZnVuY3Rpb24iPT10eXBlb2YgZT9lOnF6KGUpO3JldHVybiB0aGlzLnNlbGVjdCgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUobi5hcHBseSh0aGlzLGFyZ3VtZW50cyksaS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fG51bGwpfSkpfSxyZW1vdmU6ZnVuY3Rpb24gQUIoKXtyZXR1cm4gdGhpcy5lYWNoKE5EKX0sY2xvbmU6ZnVuY3Rpb24ga0IodCl7cmV0dXJuIHRoaXMuc2VsZWN0KHQ/UkQ6SUQpfSxkYXR1bTpmdW5jdGlvbiBMQih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIsdCk6dGhpcy5ub2RlKCkuX19kYXRhX199LG9uOmZ1bmN0aW9uIFBCKHQsZSxuKXt2YXIgaSxyLG89SEQodCsiIiksYT1vLmxlbmd0aDtpZighKGFyZ3VtZW50cy5sZW5ndGg8Mikpe2ZvcihzPWU/VkQ6RkQsbnVsbD09biYmKG49ITEpLGk9MDtpPGE7KytpKXRoaXMuZWFjaChzKG9baV0sZSxuKSk7cmV0dXJuIHRoaXN9dmFyIHM9dGhpcy5ub2RlKCkuX19vbjtpZihzKWZvcih2YXIgbCxjPTAsdT1zLmxlbmd0aDtjPHU7KytjKWZvcihpPTAsbD1zW2NdO2k8YTsrK2kpaWYoKHI9b1tpXSkudHlwZT09PWwudHlwZSYmci5uYW1lPT09bC5uYW1lKXJldHVybiBsLnZhbHVlfSxkaXNwYXRjaDpmdW5jdGlvbiBOQih0LGUpe3JldHVybiB0aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiBlP0dEOmpEKSh0LGUpKX19O3ZhciBJQj0uNyxSQj0xL0lCLE9CPSJcXHMqKFsrLV0/XFxkKylcXHMqIix6Qj0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIixEQj0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPyklXFxzKiIsQkI9L14jKFswLTlhLWZdezMsOH0pJC8sSEI9bmV3IFJlZ0V4cCgiXnJnYlxcKCIrW09CLE9CLE9CXSsiXFwpJCIpLEZCPW5ldyBSZWdFeHAoIl5yZ2JcXCgiK1tEQixEQixEQl0rIlxcKSQiKSxWQj1uZXcgUmVnRXhwKCJecmdiYVxcKCIrW09CLE9CLE9CLHpCXSsiXFwpJCIpLFVCPW5ldyBSZWdFeHAoIl5yZ2JhXFwoIitbREIsREIsREIsekJdKyJcXCkkIiksakI9bmV3IFJlZ0V4cCgiXmhzbFxcKCIrW3pCLERCLERCXSsiXFwpJCIpLEdCPW5ldyBSZWdFeHAoIl5oc2xhXFwoIitbekIsREIsREIsekJdKyJcXCkkIiksV0I9e2FsaWNlYmx1ZToxNTc5MjM4MyxhbnRpcXVld2hpdGU6MTY0NDQzNzUsYXF1YTo2NTUzNSxhcXVhbWFyaW5lOjgzODg1NjQsYXp1cmU6MTU3OTQxNzUsYmVpZ2U6MTYxMTkyNjAsYmlzcXVlOjE2NzcwMjQ0LGJsYWNrOjAsYmxhbmNoZWRhbG1vbmQ6MTY3NzIwNDUsYmx1ZToyNTUsYmx1ZXZpb2xldDo5MDU1MjAyLGJyb3duOjEwODI0MjM0LGJ1cmx5d29vZDoxNDU5NjIzMSxjYWRldGJsdWU6NjI2NjUyOCxjaGFydHJldXNlOjgzODgzNTIsY2hvY29sYXRlOjEzNzg5NDcwLGNvcmFsOjE2NzQ0MjcyLGNvcm5mbG93ZXJibHVlOjY1OTE5ODEsY29ybnNpbGs6MTY3NzUzODgsY3JpbXNvbjoxNDQyMzEwMCxjeWFuOjY1NTM1LGRhcmtibHVlOjEzOSxkYXJrY3lhbjozNTcyMyxkYXJrZ29sZGVucm9kOjEyMDkyOTM5LGRhcmtncmF5OjExMTE5MDE3LGRhcmtncmVlbjoyNTYwMCxkYXJrZ3JleToxMTExOTAxNyxkYXJra2hha2k6MTI0MzMyNTksZGFya21hZ2VudGE6OTEwOTY0MyxkYXJrb2xpdmVncmVlbjo1NTk3OTk5LGRhcmtvcmFuZ2U6MTY3NDc1MjAsZGFya29yY2hpZDoxMDA0MDAxMixkYXJrcmVkOjkxMDk1MDQsZGFya3NhbG1vbjoxNTMwODQxMCxkYXJrc2VhZ3JlZW46OTQxOTkxOSxkYXJrc2xhdGVibHVlOjQ3MzQzNDcsZGFya3NsYXRlZ3JheTozMTAwNDk1LGRhcmtzbGF0ZWdyZXk6MzEwMDQ5NSxkYXJrdHVycXVvaXNlOjUyOTQ1LGRhcmt2aW9sZXQ6OTY5OTUzOSxkZWVwcGluazoxNjcxNjk0NyxkZWVwc2t5Ymx1ZTo0OTE1MSxkaW1ncmF5OjY5MDgyNjUsZGltZ3JleTo2OTA4MjY1LGRvZGdlcmJsdWU6MjAwMzE5OSxmaXJlYnJpY2s6MTE2NzQxNDYsZmxvcmFsd2hpdGU6MTY3NzU5MjAsZm9yZXN0Z3JlZW46MjI2Mzg0MixmdWNoc2lhOjE2NzExOTM1LGdhaW5zYm9ybzoxNDQ3NDQ2MCxnaG9zdHdoaXRlOjE2MzE2NjcxLGdvbGQ6MTY3NjY3MjAsZ29sZGVucm9kOjE0MzI5MTIwLGdyYXk6ODQyMTUwNCxncmVlbjozMjc2OCxncmVlbnllbGxvdzoxMTQwMzA1NSxncmV5Ojg0MjE1MDQsaG9uZXlkZXc6MTU3OTQxNjAsaG90cGluazoxNjczODc0MCxpbmRpYW5yZWQ6MTM0NTg1MjQsaW5kaWdvOjQ5MTUzMzAsaXZvcnk6MTY3NzcyMDAsa2hha2k6MTU3ODc2NjAsbGF2ZW5kZXI6MTUxMzI0MTAsbGF2ZW5kZXJibHVzaDoxNjc3MzM2NSxsYXduZ3JlZW46ODE5MDk3NixsZW1vbmNoaWZmb246MTY3NzU4ODUsbGlnaHRibHVlOjExMzkzMjU0LGxpZ2h0Y29yYWw6MTU3NjE1MzYsbGlnaHRjeWFuOjE0NzQ1NTk5LGxpZ2h0Z29sZGVucm9keWVsbG93OjE2NDQ4MjEwLGxpZ2h0Z3JheToxMzg4MjMyMyxsaWdodGdyZWVuOjk0OTgyNTYsbGlnaHRncmV5OjEzODgyMzIzLGxpZ2h0cGluazoxNjc1ODQ2NSxsaWdodHNhbG1vbjoxNjc1Mjc2MixsaWdodHNlYWdyZWVuOjIxNDI4OTAsbGlnaHRza3libHVlOjg5MDAzNDYsbGlnaHRzbGF0ZWdyYXk6NzgzMzc1MyxsaWdodHNsYXRlZ3JleTo3ODMzNzUzLGxpZ2h0c3RlZWxibHVlOjExNTg0NzM0LGxpZ2h0eWVsbG93OjE2Nzc3MTg0LGxpbWU6NjUyODAsbGltZWdyZWVuOjMzMjkzMzAsbGluZW46MTY0NDU2NzAsbWFnZW50YToxNjcxMTkzNSxtYXJvb246ODM4ODYwOCxtZWRpdW1hcXVhbWFyaW5lOjY3MzczMjIsbWVkaXVtYmx1ZToyMDUsbWVkaXVtb3JjaGlkOjEyMjExNjY3LG1lZGl1bXB1cnBsZTo5NjYyNjgzLG1lZGl1bXNlYWdyZWVuOjM5NzgwOTcsbWVkaXVtc2xhdGVibHVlOjgwODc3OTAsbWVkaXVtc3ByaW5nZ3JlZW46NjQxNTQsbWVkaXVtdHVycXVvaXNlOjQ3NzIzMDAsbWVkaXVtdmlvbGV0cmVkOjEzMDQ3MTczLG1pZG5pZ2h0Ymx1ZToxNjQ0OTEyLG1pbnRjcmVhbToxNjEyMTg1MCxtaXN0eXJvc2U6MTY3NzAyNzMsbW9jY2FzaW46MTY3NzAyMjksbmF2YWpvd2hpdGU6MTY3Njg2ODUsbmF2eToxMjgsb2xkbGFjZToxNjY0MzU1OCxvbGl2ZTo4NDIxMzc2LG9saXZlZHJhYjo3MDQ4NzM5LG9yYW5nZToxNjc1MzkyMCxvcmFuZ2VyZWQ6MTY3MjkzNDQsb3JjaGlkOjE0MzE1NzM0LHBhbGVnb2xkZW5yb2Q6MTU2NTcxMzAscGFsZWdyZWVuOjEwMDI1ODgwLHBhbGV0dXJxdW9pc2U6MTE1Mjk5NjYscGFsZXZpb2xldHJlZDoxNDM4MTIwMyxwYXBheWF3aGlwOjE2NzczMDc3LHBlYWNocHVmZjoxNjc2NzY3MyxwZXJ1OjEzNDY4OTkxLHBpbms6MTY3NjEwMzUscGx1bToxNDUyNDYzNyxwb3dkZXJibHVlOjExNTkxOTEwLHB1cnBsZTo4Mzg4NzM2LHJlYmVjY2FwdXJwbGU6NjY5Nzg4MSxyZWQ6MTY3MTE2ODAscm9zeWJyb3duOjEyMzU3NTE5LHJveWFsYmx1ZTo0Mjg2OTQ1LHNhZGRsZWJyb3duOjkxMjcxODcsc2FsbW9uOjE2NDE2ODgyLHNhbmR5YnJvd246MTYwMzI4NjQsc2VhZ3JlZW46MzA1MDMyNyxzZWFzaGVsbDoxNjc3NDYzOCxzaWVubmE6MTA1MDY3OTcsc2lsdmVyOjEyNjMyMjU2LHNreWJsdWU6ODkwMDMzMSxzbGF0ZWJsdWU6Njk3MDA2MSxzbGF0ZWdyYXk6NzM3Mjk0NCxzbGF0ZWdyZXk6NzM3Mjk0NCxzbm93OjE2Nzc1OTMwLHNwcmluZ2dyZWVuOjY1NDA3LHN0ZWVsYmx1ZTo0NjIwOTgwLHRhbjoxMzgwODc4MCx0ZWFsOjMyODk2LHRoaXN0bGU6MTQyMDQ4ODgsdG9tYXRvOjE2NzM3MDk1LHR1cnF1b2lzZTo0MjUxODU2LHZpb2xldDoxNTYzMTA4Nix3aGVhdDoxNjExMzMzMSx3aGl0ZToxNjc3NzIxNSx3aGl0ZXNtb2tlOjE2MTE5Mjg1LHllbGxvdzoxNjc3Njk2MCx5ZWxsb3dncmVlbjoxMDE0NTA3NH07ZnVuY3Rpb24gcUIoKXtyZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXgoKX1mdW5jdGlvbiBZQigpe3JldHVybiB0aGlzLnJnYigpLmZvcm1hdFJnYigpfWZ1bmN0aW9uIFhCKHQpe3ZhciBlLG47cmV0dXJuIHQ9KHQrIiIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpLChlPUJCLmV4ZWModCkpPyhuPWVbMV0ubGVuZ3RoLGU9cGFyc2VJbnQoZVsxXSwxNiksNj09PW4/JEIoZSk6Mz09PW4/bmV3IFFCKGU+PjgmMTV8ZT4+NCYyNDAsZT4+NCYxNXwyNDAmZSwoMTUmZSk8PDR8MTUmZSwxKTo4PT09bj9LQihlPj4yNCYyNTUsZT4+MTYmMjU1LGU+PjgmMjU1LCgyNTUmZSkvMjU1KTo0PT09bj9LQihlPj4xMiYxNXxlPj44JjI0MCxlPj44JjE1fGU+PjQmMjQwLGU+PjQmMTV8MjQwJmUsKCgxNSZlKTw8NHwxNSZlKS8yNTUpOm51bGwpOihlPUhCLmV4ZWModCkpP25ldyBRQihlWzFdLGVbMl0sZVszXSwxKTooZT1GQi5leGVjKHQpKT9uZXcgUUIoMjU1KmVbMV0vMTAwLDI1NSplWzJdLzEwMCwyNTUqZVszXS8xMDAsMSk6KGU9VkIuZXhlYyh0KSk/S0IoZVsxXSxlWzJdLGVbM10sZVs0XSk6KGU9VUIuZXhlYyh0KSk/S0IoMjU1KmVbMV0vMTAwLDI1NSplWzJdLzEwMCwyNTUqZVszXS8xMDAsZVs0XSk6KGU9akIuZXhlYyh0KSk/aUgoZVsxXSxlWzJdLzEwMCxlWzNdLzEwMCwxKTooZT1HQi5leGVjKHQpKT9pSChlWzFdLGVbMl0vMTAwLGVbM10vMTAwLGVbNF0pOldCLmhhc093blByb3BlcnR5KHQpPyRCKFdCW3RdKToidHJhbnNwYXJlbnQiPT09dD9uZXcgUUIoTmFOLE5hTixOYU4sMCk6bnVsbH1mdW5jdGlvbiAkQih0KXtyZXR1cm4gbmV3IFFCKHQ+PjE2JjI1NSx0Pj44JjI1NSwyNTUmdCwxKX1mdW5jdGlvbiBLQih0LGUsbixpKXtyZXR1cm4gaTw9MCYmKHQ9ZT1uPU5hTiksbmV3IFFCKHQsZSxuLGkpfWZ1bmN0aW9uIFpCKHQpe3JldHVybiB0IGluc3RhbmNlb2YgZUJ8fCh0PVhCKHQpKSx0P25ldyBRQigodD10LnJnYigpKS5yLHQuZyx0LmIsdC5vcGFjaXR5KTpuZXcgUUJ9ZnVuY3Rpb24gSkIodCxlLG4saSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP1pCKHQpOm5ldyBRQih0LGUsbixudWxsPT1pPzE6aSl9ZnVuY3Rpb24gUUIodCxlLG4saSl7dGhpcy5yPSt0LHRoaXMuZz0rZSx0aGlzLmI9K24sdGhpcy5vcGFjaXR5PStpfWZ1bmN0aW9uIHRIKCl7cmV0dXJuIiMiK25IKHRoaXMucikrbkgodGhpcy5nKStuSCh0aGlzLmIpfWZ1bmN0aW9uIGVIKCl7dmFyIHQ9dGhpcy5vcGFjaXR5O3JldHVybigxPT09KHQ9aXNOYU4odCk/MTpNYXRoLm1heCgwLE1hdGgubWluKDEsdCkpKT8icmdiKCI6InJnYmEoIikrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLnIpfHwwKSkrIiwgIitNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMuZyl8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5iKXx8MCkpKygxPT09dD8iKSI6IiwgIit0KyIpIil9ZnVuY3Rpb24gbkgodCl7cmV0dXJuKCh0PU1hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodCl8fDApKSk8MTY/IjAiOiIiKSt0LnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBpSCh0LGUsbixpKXtyZXR1cm4gaTw9MD90PWU9bj1OYU46bjw9MHx8bj49MT90PWU9TmFOOmU8PTAmJih0PU5hTiksbmV3IG9IKHQsZSxuLGkpfWZ1bmN0aW9uIHJIKHQpe2lmKHQgaW5zdGFuY2VvZiBvSClyZXR1cm4gbmV3IG9IKHQuaCx0LnMsdC5sLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIGVCfHwodD1YQih0KSksIXQpcmV0dXJuIG5ldyBvSDtpZih0IGluc3RhbmNlb2Ygb0gpcmV0dXJuIHQ7dmFyIGU9KHQ9dC5yZ2IoKSkuci8yNTUsbj10LmcvMjU1LGk9dC5iLzI1NSxyPU1hdGgubWluKGUsbixpKSxvPU1hdGgubWF4KGUsbixpKSxhPU5hTixzPW8tcixsPShvK3IpLzI7cmV0dXJuIHM/KGE9ZT09PW8/KG4taSkvcys2KihuPGkpOm49PT1vPyhpLWUpL3MrMjooZS1uKS9zKzQscy89bDwuNT9vK3I6Mi1vLXIsYSo9NjApOnM9bD4wJiZsPDE/MDphLG5ldyBvSChhLHMsbCx0Lm9wYWNpdHkpfWZ1bmN0aW9uIG9IKHQsZSxuLGkpe3RoaXMuaD0rdCx0aGlzLnM9K2UsdGhpcy5sPStuLHRoaXMub3BhY2l0eT0raX1mdW5jdGlvbiBhSCh0LGUsbil7cmV0dXJuIDI1NSoodDw2MD9lKyhuLWUpKnQvNjA6dDwxODA/bjp0PDI0MD9lKyhuLWUpKigyNDAtdCkvNjA6ZSl9ZnVuY3Rpb24gc0godCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIGxIKHQpe3JldHVybiAxPT0odD0rdCk/Y0g6ZnVuY3Rpb24oZSxuKXtyZXR1cm4gbi1lPyhmdW5jdGlvbiBpKHQsZSxuKXtyZXR1cm4gdD1NYXRoLnBvdyh0LG4pLGU9TWF0aC5wb3coZSxuKS10LG49MS9uLGZ1bmN0aW9uKGkpe3JldHVybiBNYXRoLnBvdyh0K2kqZSxuKX19KShlLG4sdCk6c0goaXNOYU4oZSk/bjplKX19ZnVuY3Rpb24gY0godCxlKXt2YXIgbj1lLXQ7cmV0dXJuIG4/KGZ1bmN0aW9uIGkodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHQrbiplfX0pKHQsbik6c0goaXNOYU4odCk/ZTp0KX1RRChlQixYQix7Y29weTpmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgdGhpcy5jb25zdHJ1Y3Rvcix0aGlzLHQpfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCl9LGhleDpxQixmb3JtYXRIZXg6cUIsZm9ybWF0SHNsOmZ1bmN0aW9uIHVIKCl7cmV0dXJuIHJIKHRoaXMpLmZvcm1hdEhzbCgpfSxmb3JtYXRSZ2I6WUIsdG9TdHJpbmc6WUJ9KSxRRChRQixKQix0QihlQix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9SQjpNYXRoLnBvdyhSQix0KSxuZXcgUUIodGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/SUI6TWF0aC5wb3coSUIsdCksbmV3IFFCKHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiB0aGlzfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybi0uNTw9dGhpcy5yJiZ0aGlzLnI8MjU1LjUmJi0uNTw9dGhpcy5nJiZ0aGlzLmc8MjU1LjUmJi0uNTw9dGhpcy5iJiZ0aGlzLmI8MjU1LjUmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxoZXg6dEgsZm9ybWF0SGV4OnRILGZvcm1hdFJnYjplSCx0b1N0cmluZzplSH0pKSxRRChvSCwoZnVuY3Rpb24gaEgodCxlLG4saSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3JIKHQpOm5ldyBvSCh0LGUsbixudWxsPT1pPzE6aSl9KSx0QihlQix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9SQjpNYXRoLnBvdyhSQix0KSxuZXcgb0godGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9JQjpNYXRoLnBvdyhJQix0KSxuZXcgb0godGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmglMzYwKzM2MCoodGhpcy5oPDApLGU9aXNOYU4odCl8fGlzTmFOKHRoaXMucyk/MDp0aGlzLnMsbj10aGlzLmwsaT1uKyhuPC41P246MS1uKSplLHI9MipuLWk7cmV0dXJuIG5ldyBRQihhSCh0Pj0yNDA/dC0yNDA6dCsxMjAscixpKSxhSCh0LHIsaSksYUgodDwxMjA/dCsyNDA6dC0xMjAscixpKSx0aGlzLm9wYWNpdHkpfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybigwPD10aGlzLnMmJnRoaXMuczw9MXx8aXNOYU4odGhpcy5zKSkmJjA8PXRoaXMubCYmdGhpcy5sPD0xJiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0sZm9ybWF0SHNsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcGFjaXR5O3JldHVybigxPT09KHQ9aXNOYU4odCk/MTpNYXRoLm1heCgwLE1hdGgubWluKDEsdCkpKT8iaHNsKCI6ImhzbGEoIikrKHRoaXMuaHx8MCkrIiwgIisxMDAqKHRoaXMuc3x8MCkrIiUsICIrMTAwKih0aGlzLmx8fDApKyIlIisoMT09PXQ/IikiOiIsICIrdCsiKSIpfX0pKTt2YXIgZEg9KGZ1bmN0aW9uIHQoZSl7dmFyIG49bEgoZSk7ZnVuY3Rpb24gaSh0LGUpe3ZhciBpPW4oKHQ9SkIodCkpLnIsKGU9SkIoZSkpLnIpLHI9bih0LmcsZS5nKSxvPW4odC5iLGUuYiksYT1jSCh0Lm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQucj1pKGUpLHQuZz1yKGUpLHQuYj1vKGUpLHQub3BhY2l0eT1hKGUpLHQrIiJ9fXJldHVybiBpLmdhbW1hPXQsaX0pKDEpO2Z1bmN0aW9uIHBIKHQsZSl7ZXx8KGU9W10pO3ZhciBuLGk9dD9NYXRoLm1pbihlLmxlbmd0aCx0Lmxlbmd0aCk6MCxyPWUuc2xpY2UoKTtyZXR1cm4gZnVuY3Rpb24obyl7Zm9yKG49MDtuPGk7KytuKXJbbl09dFtuXSooMS1vKStlW25dKm87cmV0dXJuIHJ9fWZ1bmN0aW9uIGZIKHQsZSl7dmFyIG4saT1lP2UubGVuZ3RoOjAscj10P01hdGgubWluKGksdC5sZW5ndGgpOjAsbz1uZXcgQXJyYXkociksYT1uZXcgQXJyYXkoaSk7Zm9yKG49MDtuPHI7KytuKW9bbl09eEgodFtuXSxlW25dKTtmb3IoO248aTsrK24pYVtuXT1lW25dO3JldHVybiBmdW5jdGlvbih0KXtmb3Iobj0wO248cjsrK24pYVtuXT1vW25dKHQpO3JldHVybiBhfX1mdW5jdGlvbiBtSCh0LGUpe3ZhciBuPW5ldyBEYXRlO3JldHVybiB0PSt0LGU9K2UsZnVuY3Rpb24oaSl7cmV0dXJuIG4uc2V0VGltZSh0KigxLWkpK2UqaSksbn19ZnVuY3Rpb24gZ0godCxlKXtyZXR1cm4gdD0rdCxlPStlLGZ1bmN0aW9uKG4pe3JldHVybiB0KigxLW4pK2Uqbn19ZnVuY3Rpb24gX0godCxlKXt2YXIgbixpPXt9LHI9e307Zm9yKG4gaW4gbnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdHx8KHQ9e30pLG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV8fChlPXt9KSxlKW4gaW4gdD9pW25dPXhIKHRbbl0sZVtuXSk6cltuXT1lW25dO3JldHVybiBmdW5jdGlvbih0KXtmb3IobiBpbiBpKXJbbl09aVtuXSh0KTtyZXR1cm4gcn19dmFyIHlIPS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyx2SD1uZXcgUmVnRXhwKHlILnNvdXJjZSwiZyIpO2Z1bmN0aW9uIGJIKHQsZSl7dmFyIG4saSxyLG89eUgubGFzdEluZGV4PXZILmxhc3RJbmRleD0wLGE9LTEscz1bXSxsPVtdO2Zvcih0Kz0iIixlKz0iIjsobj15SC5leGVjKHQpKSYmKGk9dkguZXhlYyhlKSk7KShyPWkuaW5kZXgpPm8mJihyPWUuc2xpY2UobyxyKSxzW2FdP3NbYV0rPXI6c1srK2FdPXIpLChuPW5bMF0pPT09KGk9aVswXSk/c1thXT9zW2FdKz1pOnNbKythXT1pOihzWysrYV09bnVsbCxsLnB1c2goe2k6YSx4OmdIKG4saSl9KSksbz12SC5sYXN0SW5kZXg7cmV0dXJuIG88ZS5sZW5ndGgmJihyPWUuc2xpY2Uobyksc1thXT9zW2FdKz1yOnNbKythXT1yKSxzLmxlbmd0aDwyP2xbMF0/KGZ1bmN0aW9uIGModCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpKyIifX0pKGxbMF0ueCk6KGZ1bmN0aW9uIHUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSkoZSk6KGU9bC5sZW5ndGgsZnVuY3Rpb24odCl7Zm9yKHZhciBuLGk9MDtpPGU7KytpKXNbKG49bFtpXSkuaV09bi54KHQpO3JldHVybiBzLmpvaW4oIiIpfSl9ZnVuY3Rpb24geEgodCxlKXt2YXIgbixpPXR5cGVvZiBlO3JldHVybiBudWxsPT1lfHwiYm9vbGVhbiI9PT1pP3NIKGUpOigibnVtYmVyIj09PWk/Z0g6InN0cmluZyI9PT1pPyhuPVhCKGUpKT8oZT1uLGRIKTpiSDplIGluc3RhbmNlb2YgWEI/ZEg6ZSBpbnN0YW5jZW9mIERhdGU/bUg6KGZ1bmN0aW9uIHIodCl7cmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyh0KSYmISh0IGluc3RhbmNlb2YgRGF0YVZpZXcpfSkoZSk/cEg6QXJyYXkuaXNBcnJheShlKT9mSDoiZnVuY3Rpb24iIT10eXBlb2YgZS52YWx1ZU9mJiYiZnVuY3Rpb24iIT10eXBlb2YgZS50b1N0cmluZ3x8aXNOYU4oZSk/X0g6Z0gpKHQsZSl9dmFyIHdILFNILE1ILEVILFRIPTE4MC9NYXRoLlBJLENIPXt0cmFuc2xhdGVYOjAsdHJhbnNsYXRlWTowLHJvdGF0ZTowLHNrZXdYOjAsc2NhbGVYOjEsc2NhbGVZOjF9O2Z1bmN0aW9uIEFIKHQsZSxuLGkscixvKXt2YXIgYSxzLGw7cmV0dXJuKGE9TWF0aC5zcXJ0KHQqdCtlKmUpKSYmKHQvPWEsZS89YSksKGw9dCpuK2UqaSkmJihuLT10KmwsaS09ZSpsKSwocz1NYXRoLnNxcnQobipuK2kqaSkpJiYobi89cyxpLz1zLGwvPXMpLHQqaTxlKm4mJih0PS10LGU9LWUsbD0tbCxhPS1hKSx7dHJhbnNsYXRlWDpyLHRyYW5zbGF0ZVk6byxyb3RhdGU6TWF0aC5hdGFuMihlLHQpKlRILHNrZXdYOk1hdGguYXRhbihsKSpUSCxzY2FsZVg6YSxzY2FsZVk6c319ZnVuY3Rpb24ga0godCxlLG4saSl7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdC5sZW5ndGg/dC5wb3AoKSsiICI6IiJ9cmV0dXJuIGZ1bmN0aW9uKG8sYSl7dmFyIHM9W10sbD1bXTtyZXR1cm4gbz10KG8pLGE9dChhKSwoZnVuY3Rpb24gYyh0LGkscixvLGEscyl7aWYodCE9PXJ8fGkhPT1vKXt2YXIgbD1hLnB1c2goInRyYW5zbGF0ZSgiLG51bGwsZSxudWxsLG4pO3MucHVzaCh7aTpsLTQseDpnSCh0LHIpfSx7aTpsLTIseDpnSChpLG8pfSl9ZWxzZShyfHxvKSYmYS5wdXNoKCJ0cmFuc2xhdGUoIityK2UrbytuKX0pKG8udHJhbnNsYXRlWCxvLnRyYW5zbGF0ZVksYS50cmFuc2xhdGVYLGEudHJhbnNsYXRlWSxzLGwpLChmdW5jdGlvbiB1KHQsZSxuLG8pe3QhPT1lPyh0LWU+MTgwP2UrPTM2MDplLXQ+MTgwJiYodCs9MzYwKSxvLnB1c2goe2k6bi5wdXNoKHIobikrInJvdGF0ZSgiLG51bGwsaSktMix4OmdIKHQsZSl9KSk6ZSYmbi5wdXNoKHIobikrInJvdGF0ZSgiK2UraSl9KShvLnJvdGF0ZSxhLnJvdGF0ZSxzLGwpLChmdW5jdGlvbiBoKHQsZSxuLG8pe3QhPT1lP28ucHVzaCh7aTpuLnB1c2gocihuKSsic2tld1goIixudWxsLGkpLTIseDpnSCh0LGUpfSk6ZSYmbi5wdXNoKHIobikrInNrZXdYKCIrZStpKX0pKG8uc2tld1gsYS5za2V3WCxzLGwpLChmdW5jdGlvbiBkKHQsZSxuLGksbyxhKXtpZih0IT09bnx8ZSE9PWkpe3ZhciBzPW8ucHVzaChyKG8pKyJzY2FsZSgiLG51bGwsIiwiLG51bGwsIikiKTthLnB1c2goe2k6cy00LHg6Z0godCxuKX0se2k6cy0yLHg6Z0goZSxpKX0pfWVsc2UgMT09PW4mJjE9PT1pfHxvLnB1c2gocihvKSsic2NhbGUoIituKyIsIitpKyIpIil9KShvLnNjYWxlWCxvLnNjYWxlWSxhLnNjYWxlWCxhLnNjYWxlWSxzLGwpLG89YT1udWxsLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPS0xLGk9bC5sZW5ndGg7KytuPGk7KXNbKGU9bFtuXSkuaV09ZS54KHQpO3JldHVybiBzLmpvaW4oIiIpfX19dmFyIExILFBILE5IPWtIKChmdW5jdGlvbiBJSCh0KXtyZXR1cm4ibm9uZSI9PT10P0NIOih3SHx8KHdIPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLFNIPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxNSD1kb2N1bWVudC5kZWZhdWx0Vmlldyksd0guc3R5bGUudHJhbnNmb3JtPXQsdD1NSC5nZXRDb21wdXRlZFN0eWxlKFNILmFwcGVuZENoaWxkKHdIKSxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2Zvcm0iKSxTSC5yZW1vdmVDaGlsZCh3SCksQUgoKyh0PXQuc2xpY2UoNywtMSkuc3BsaXQoIiwiKSlbMF0sK3RbMV0sK3RbMl0sK3RbM10sK3RbNF0sK3RbNV0pKX0pLCJweCwgIiwicHgpIiwiZGVnKSIpLFJIPWtIKChmdW5jdGlvbiBPSCh0KXtyZXR1cm4gbnVsbD09dD9DSDooRUh8fChFSD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwiZyIpKSxFSC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsdCksKHQ9RUgudHJhbnNmb3JtLmJhc2VWYWwuY29uc29saWRhdGUoKSk/QUgoKHQ9dC5tYXRyaXgpLmEsdC5iLHQuYyx0LmQsdC5lLHQuZik6Q0gpfSksIiwgIiwiKSIsIikiKSx6SD0wLERIPTAsQkg9MCxISD0wLEZIPTAsVkg9MCxVSD0ib2JqZWN0Ij09dHlwZW9mIHBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3c/cGVyZm9ybWFuY2U6RGF0ZSxqSD0ib2JqZWN0Ij09dHlwZW9mIHdpbmRvdyYmd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KTpmdW5jdGlvbih0KXtzZXRUaW1lb3V0KHQsMTcpfTtmdW5jdGlvbiBHSCgpe3JldHVybiBGSHx8KGpIKFdIKSxGSD1VSC5ub3coKStWSCl9ZnVuY3Rpb24gV0goKXtGSD0wfWZ1bmN0aW9uIHFIKCl7dGhpcy5fY2FsbD10aGlzLl90aW1lPXRoaXMuX25leHQ9bnVsbH1mdW5jdGlvbiBZSCh0LGUsbil7dmFyIGk9bmV3IHFIO3JldHVybiBpLnJlc3RhcnQodCxlLG4pLGl9ZnVuY3Rpb24gWEgoKXtGSD0oSEg9VUgubm93KCkpK1ZILHpIPURIPTA7dHJ5eyEoZnVuY3Rpb24gdCgpe0dIKCksKyt6SDtmb3IodmFyIHQsZT1MSDtlOykodD1GSC1lLl90aW1lKT49MCYmZS5fY2FsbC5jYWxsKG51bGwsdCksZT1lLl9uZXh0Oy0tekh9KSgpfWZpbmFsbHl7ekg9MCwoZnVuY3Rpb24gZSgpe3ZhciB0LGUsbj1MSCxpPTEvMDtmb3IoO247KW4uX2NhbGw/KGk+bi5fdGltZSYmKGk9bi5fdGltZSksdD1uLG49bi5fbmV4dCk6KGU9bi5fbmV4dCxuLl9uZXh0PW51bGwsbj10P3QuX25leHQ9ZTpMSD1lKTtQSD10LEtIKGkpfSkoKSxGSD0wfX1mdW5jdGlvbiAkSCgpe3ZhciB0PVVILm5vdygpLGU9dC1ISDtlPjFlMyYmKFZILT1lLEhIPXQpfWZ1bmN0aW9uIEtIKHQpe3pIfHwoREgmJihESD1jbGVhclRpbWVvdXQoREgpKSx0LUZIPjI0Pyh0PDEvMCYmKERIPXNldFRpbWVvdXQoWEgsdC1VSC5ub3coKS1WSCkpLEJIJiYoQkg9Y2xlYXJJbnRlcnZhbChCSCkpKTooQkh8fChISD1VSC5ub3coKSxCSD1zZXRJbnRlcnZhbCgkSCwxZTMpKSx6SD0xLGpIKFhIKSkpfWZ1bmN0aW9uIFpIKHQsZSxuKXt2YXIgaT1uZXcgcUg7cmV0dXJuIGkucmVzdGFydCgoZnVuY3Rpb24obil7aS5zdG9wKCksdChuK2UpfSksZT1udWxsPT1lPzA6K2UsbiksaX1xSC5wcm90b3R5cGU9WUgucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpxSCxyZXN0YXJ0OmZ1bmN0aW9uKHQsZSxuKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbiIpO249KG51bGw9PW4/R0goKTorbikrKG51bGw9PWU/MDorZSksdGhpcy5fbmV4dHx8UEg9PT10aGlzfHwoUEg/UEguX25leHQ9dGhpczpMSD10aGlzLFBIPXRoaXMpLHRoaXMuX2NhbGw9dCx0aGlzLl90aW1lPW4sS0goKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuX2NhbGwmJih0aGlzLl9jYWxsPW51bGwsdGhpcy5fdGltZT0xLzAsS0goKSl9fTt2YXIgSkg9UnooInN0YXJ0IiwiZW5kIiwiY2FuY2VsIiwiaW50ZXJydXB0IiksUUg9W107ZnVuY3Rpb24gdEYodCxlLG4saSxyLG8pe3ZhciBhPXQuX190cmFuc2l0aW9uO2lmKGEpe2lmKG4gaW4gYSlyZXR1cm59ZWxzZSB0Ll9fdHJhbnNpdGlvbj17fTshKGZ1bmN0aW9uIHModCxlLG4pe3ZhciBpLHI9dC5fX3RyYW5zaXRpb247ZnVuY3Rpb24gbyh0KXtuLnN0YXRlPTEsbi50aW1lci5yZXN0YXJ0KGEsbi5kZWxheSxuLnRpbWUpLG4uZGVsYXk8PXQmJmEodC1uLmRlbGF5KX1mdW5jdGlvbiBhKG8pe3ZhciBjLHUsaCxkO2lmKDEhPT1uLnN0YXRlKXJldHVybiBsKCk7Zm9yKGMgaW4gcilpZigoZD1yW2NdKS5uYW1lPT09bi5uYW1lKXtpZigzPT09ZC5zdGF0ZSlyZXR1cm4gWkgoYSk7ND09PWQuc3RhdGU/KGQuc3RhdGU9NixkLnRpbWVyLnN0b3AoKSxkLm9uLmNhbGwoImludGVycnVwdCIsdCx0Ll9fZGF0YV9fLGQuaW5kZXgsZC5ncm91cCksZGVsZXRlIHJbY10pOitjPGUmJihkLnN0YXRlPTYsZC50aW1lci5zdG9wKCksZC5vbi5jYWxsKCJjYW5jZWwiLHQsdC5fX2RhdGFfXyxkLmluZGV4LGQuZ3JvdXApLGRlbGV0ZSByW2NdKX1pZihaSCgoZnVuY3Rpb24oKXszPT09bi5zdGF0ZSYmKG4uc3RhdGU9NCxuLnRpbWVyLnJlc3RhcnQocyxuLmRlbGF5LG4udGltZSkscyhvKSl9KSksbi5zdGF0ZT0yLG4ub24uY2FsbCgic3RhcnQiLHQsdC5fX2RhdGFfXyxuLmluZGV4LG4uZ3JvdXApLDI9PT1uLnN0YXRlKXtmb3Iobi5zdGF0ZT0zLGk9bmV3IEFycmF5KGg9bi50d2Vlbi5sZW5ndGgpLGM9MCx1PS0xO2M8aDsrK2MpKGQ9bi50d2VlbltjXS52YWx1ZS5jYWxsKHQsdC5fX2RhdGFfXyxuLmluZGV4LG4uZ3JvdXApKSYmKGlbKyt1XT1kKTtpLmxlbmd0aD11KzF9fWZ1bmN0aW9uIHMoZSl7Zm9yKHZhciByPWU8bi5kdXJhdGlvbj9uLmVhc2UuY2FsbChudWxsLGUvbi5kdXJhdGlvbik6KG4udGltZXIucmVzdGFydChsKSxuLnN0YXRlPTUsMSksbz0tMSxhPWkubGVuZ3RoOysrbzxhOylpW29dLmNhbGwodCxyKTs1PT09bi5zdGF0ZSYmKG4ub24uY2FsbCgiZW5kIix0LHQuX19kYXRhX18sbi5pbmRleCxuLmdyb3VwKSxsKCkpfWZ1bmN0aW9uIGwoKXtmb3IodmFyIGkgaW4gbi5zdGF0ZT02LG4udGltZXIuc3RvcCgpLGRlbGV0ZSByW2VdLHIpcmV0dXJuO2RlbGV0ZSB0Ll9fdHJhbnNpdGlvbn1yW2VdPW4sbi50aW1lcj1ZSChvLDAsbi50aW1lKX0pKHQsbix7bmFtZTplLGluZGV4OmksZ3JvdXA6cixvbjpKSCx0d2VlbjpRSCx0aW1lOm8udGltZSxkZWxheTpvLmRlbGF5LGR1cmF0aW9uOm8uZHVyYXRpb24sZWFzZTpvLmVhc2UsdGltZXI6bnVsbCxzdGF0ZTowfSl9ZnVuY3Rpb24gZUYodCxlKXt2YXIgbj1pRih0LGUpO2lmKG4uc3RhdGU+MCl0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHNjaGVkdWxlZCIpO3JldHVybiBufWZ1bmN0aW9uIG5GKHQsZSl7dmFyIG49aUYodCxlKTtpZihuLnN0YXRlPjMpdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZTsgYWxyZWFkeSBydW5uaW5nIik7cmV0dXJuIG59ZnVuY3Rpb24gaUYodCxlKXt2YXIgbj10Ll9fdHJhbnNpdGlvbjtpZighbnx8IShuPW5bZV0pKXRocm93IG5ldyBFcnJvcigidHJhbnNpdGlvbiBub3QgZm91bmQiKTtyZXR1cm4gbn1mdW5jdGlvbiByRih0LGUpe3ZhciBuLGkscixvPXQuX190cmFuc2l0aW9uLGE9ITA7aWYobyl7Zm9yKHIgaW4gZT1udWxsPT1lP251bGw6ZSsiIixvKShuPW9bcl0pLm5hbWU9PT1lPyhpPW4uc3RhdGU+MiYmbi5zdGF0ZTw1LG4uc3RhdGU9NixuLnRpbWVyLnN0b3AoKSxuLm9uLmNhbGwoaT8iaW50ZXJydXB0IjoiY2FuY2VsIix0LHQuX19kYXRhX18sbi5pbmRleCxuLmdyb3VwKSxkZWxldGUgb1tyXSk6YT0hMTthJiZkZWxldGUgdC5fX3RyYW5zaXRpb259fWZ1bmN0aW9uIG9GKHQsZSl7dmFyIG4saTtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcj1uRih0aGlzLHQpLG89ci50d2VlbjtpZihvIT09bilmb3IodmFyIGE9MCxzPShpPW49bykubGVuZ3RoO2E8czsrK2EpaWYoaVthXS5uYW1lPT09ZSl7KGk9aS5zbGljZSgpKS5zcGxpY2UoYSwxKTticmVha31yLnR3ZWVuPWl9fWZ1bmN0aW9uIGFGKHQsZSxuKXt2YXIgaSxyO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBuKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz1uRih0aGlzLHQpLGE9by50d2VlbjtpZihhIT09aSl7cj0oaT1hKS5zbGljZSgpO2Zvcih2YXIgcz17bmFtZTplLHZhbHVlOm59LGw9MCxjPXIubGVuZ3RoO2w8YzsrK2wpaWYocltsXS5uYW1lPT09ZSl7cltsXT1zO2JyZWFrfWw9PT1jJiZyLnB1c2gocyl9by50d2Vlbj1yfX1mdW5jdGlvbiBzRih0LGUsbil7dmFyIGk9dC5faWQ7cmV0dXJuIHQuZWFjaCgoZnVuY3Rpb24oKXt2YXIgdD1uRih0aGlzLGkpOyh0LnZhbHVlfHwodC52YWx1ZT17fSkpW2VdPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpfSkpLGZ1bmN0aW9uKHQpe3JldHVybiBpRih0LGkpLnZhbHVlW2VdfX1mdW5jdGlvbiBsRih0LGUpe3ZhciBuO3JldHVybigibnVtYmVyIj09dHlwZW9mIGU/Z0g6ZSBpbnN0YW5jZW9mIFhCP2RIOihuPVhCKGUpKT8oZT1uLGRIKTpiSCkodCxlKX1mdW5jdGlvbiBjRih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19ZnVuY3Rpb24gdUYodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX1mdW5jdGlvbiBoRih0LGUsbil7dmFyIGkscixvPW4rIiI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRBdHRyaWJ1dGUodCk7cmV0dXJuIGE9PT1vP251bGw6YT09PWk/cjpyPWUoaT1hLG4pfX1mdW5jdGlvbiBkRih0LGUsbil7dmFyIGkscixvPW4rIiI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpO3JldHVybiBhPT09bz9udWxsOmE9PT1pP3I6cj1lKGk9YSxuKX19ZnVuY3Rpb24gcEYodCxlLG4pe3ZhciBpLHIsbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYSxzLGw9bih0aGlzKTtpZihudWxsIT1sKXJldHVybihhPXRoaXMuZ2V0QXR0cmlidXRlKHQpKT09PShzPWwrIiIpP251bGw6YT09PWkmJnM9PT1yP286KHI9cyxvPWUoaT1hLGwpKTt0aGlzLnJlbW92ZUF0dHJpYnV0ZSh0KX19ZnVuY3Rpb24gZkYodCxlLG4pe3ZhciBpLHIsbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYSxzLGw9bih0aGlzKTtpZihudWxsIT1sKXJldHVybihhPXRoaXMuZ2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKSk9PT0ocz1sKyIiKT9udWxsOmE9PT1pJiZzPT09cj9vOihyPXMsbz1lKGk9YSxsKSk7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX1mdW5jdGlvbiBtRih0LGUpe3JldHVybiBmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZSh0LGUuY2FsbCh0aGlzLG4pKX19ZnVuY3Rpb24gZ0YodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsZS5jYWxsKHRoaXMsbikpfX1mdW5jdGlvbiBfRih0LGUpe3ZhciBuLGk7ZnVuY3Rpb24gcigpe3ZhciByPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiByIT09aSYmKG49KGk9cikmJmdGKHQscikpLG59cmV0dXJuIHIuX3ZhbHVlPWUscn1mdW5jdGlvbiB5Rih0LGUpe3ZhciBuLGk7ZnVuY3Rpb24gcigpe3ZhciByPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiByIT09aSYmKG49KGk9cikmJm1GKHQscikpLG59cmV0dXJuIHIuX3ZhbHVlPWUscn1mdW5jdGlvbiB2Rih0LGUpe3JldHVybiBmdW5jdGlvbigpe2VGKHRoaXMsdCkuZGVsYXk9K2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiBiRih0LGUpe3JldHVybiBlPStlLGZ1bmN0aW9uKCl7ZUYodGhpcyx0KS5kZWxheT1lfX1mdW5jdGlvbiB4Rih0LGUpe3JldHVybiBmdW5jdGlvbigpe25GKHRoaXMsdCkuZHVyYXRpb249K2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiB3Rih0LGUpe3JldHVybiBlPStlLGZ1bmN0aW9uKCl7bkYodGhpcyx0KS5kdXJhdGlvbj1lfX1mdW5jdGlvbiBTRih0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gZnVuY3Rpb24oKXtuRih0aGlzLHQpLmVhc2U9ZX19ZnVuY3Rpb24gTUYodCxlLG4pe3ZhciBpLHIsbz0oZnVuY3Rpb24gYSh0KXtyZXR1cm4odCsiIikudHJpbSgpLnNwbGl0KC9efFxzKy8pLmV2ZXJ5KChmdW5jdGlvbih0KXt2YXIgZT10LmluZGV4T2YoIi4iKTtyZXR1cm4gZT49MCYmKHQ9dC5zbGljZSgwLGUpKSwhdHx8InN0YXJ0Ij09PXR9KSl9KShlKT9lRjpuRjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT1vKHRoaXMsdCkscz1hLm9uO3MhPT1pJiYocj0oaT1zKS5jb3B5KCkpLm9uKGUsbiksYS5vbj1yfX12YXIgRUY9WUQucHJvdG90eXBlLmNvbnN0cnVjdG9yO2Z1bmN0aW9uIFRGKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fWZ1bmN0aW9uIENGKHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24oaSl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSh0LGUuY2FsbCh0aGlzLGkpLG4pfX1mdW5jdGlvbiBBRih0LGUsbil7dmFyIGkscjtmdW5jdGlvbiBvKCl7dmFyIG89ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG8hPT1yJiYoaT0ocj1vKSYmQ0YodCxvLG4pKSxpfXJldHVybiBvLl92YWx1ZT1lLG99ZnVuY3Rpb24ga0YodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3RoaXMudGV4dENvbnRlbnQ9dC5jYWxsKHRoaXMsZSl9fWZ1bmN0aW9uIExGKHQpe3ZhciBlLG47ZnVuY3Rpb24gaSgpe3ZhciBpPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBpIT09biYmKGU9KG49aSkmJmtGKGkpKSxlfXJldHVybiBpLl92YWx1ZT10LGl9dmFyIFBGPTA7ZnVuY3Rpb24gTkYodCxlLG4saSl7dGhpcy5fZ3JvdXBzPXQsdGhpcy5fcGFyZW50cz1lLHRoaXMuX25hbWU9bix0aGlzLl9pZD1pfWZ1bmN0aW9uIElGKCl7cmV0dXJuKytQRn12YXIgUkY9WUQucHJvdG90eXBlO05GLnByb3RvdHlwZT17Y29uc3RydWN0b3I6TkYsc2VsZWN0OmZ1bmN0aW9uIE9GKHQpe3ZhciBlPXRoaXMuX25hbWUsbj10aGlzLl9pZDsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9cXoodCkpO2Zvcih2YXIgaT10aGlzLl9ncm91cHMscj1pLmxlbmd0aCxvPW5ldyBBcnJheShyKSxhPTA7YTxyOysrYSlmb3IodmFyIHMsbCxjPWlbYV0sdT1jLmxlbmd0aCxoPW9bYV09bmV3IEFycmF5KHUpLGQ9MDtkPHU7KytkKShzPWNbZF0pJiYobD10LmNhbGwocyxzLl9fZGF0YV9fLGQsYykpJiYoIl9fZGF0YV9fImluIHMmJihsLl9fZGF0YV9fPXMuX19kYXRhX18pLGhbZF09bCx0RihoW2RdLGUsbixkLGgsaUYocyxuKSkpO3JldHVybiBuZXcgTkYobyx0aGlzLl9wYXJlbnRzLGUsbil9LHNlbGVjdEFsbDpmdW5jdGlvbiB6Rih0KXt2YXIgZT10aGlzLl9uYW1lLG49dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVh6KHQpKTtmb3IodmFyIGk9dGhpcy5fZ3JvdXBzLHI9aS5sZW5ndGgsbz1bXSxhPVtdLHM9MDtzPHI7KytzKWZvcih2YXIgbCxjPWlbc10sdT1jLmxlbmd0aCxoPTA7aDx1OysraClpZihsPWNbaF0pe2Zvcih2YXIgZCxwPXQuY2FsbChsLGwuX19kYXRhX18saCxjKSxmPWlGKGwsbiksbT0wLGc9cC5sZW5ndGg7bTxnOysrbSkoZD1wW21dKSYmdEYoZCxlLG4sbSxwLGYpO28ucHVzaChwKSxhLnB1c2gobCl9cmV0dXJuIG5ldyBORihvLGEsZSxuKX0sZmlsdGVyOmZ1bmN0aW9uIERGKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD0keih0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLGk9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWZvcih2YXIgbyxhPWVbcl0scz1hLmxlbmd0aCxsPWlbcl09W10sYz0wO2M8czsrK2MpKG89YVtjXSkmJnQuY2FsbChvLG8uX19kYXRhX18sYyxhKSYmbC5wdXNoKG8pO3JldHVybiBuZXcgTkYoaSx0aGlzLl9wYXJlbnRzLHRoaXMuX25hbWUsdGhpcy5faWQpfSxtZXJnZTpmdW5jdGlvbiBCRih0KXtpZih0Ll9pZCE9PXRoaXMuX2lkKXRocm93IG5ldyBFcnJvcjtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49dC5fZ3JvdXBzLGk9ZS5sZW5ndGgscj1NYXRoLm1pbihpLG4ubGVuZ3RoKSxvPW5ldyBBcnJheShpKSxhPTA7YTxyOysrYSlmb3IodmFyIHMsbD1lW2FdLGM9blthXSx1PWwubGVuZ3RoLGg9b1thXT1uZXcgQXJyYXkodSksZD0wO2Q8dTsrK2QpKHM9bFtkXXx8Y1tkXSkmJihoW2RdPXMpO2Zvcig7YTxpOysrYSlvW2FdPWVbYV07cmV0dXJuIG5ldyBORihvLHRoaXMuX3BhcmVudHMsdGhpcy5fbmFtZSx0aGlzLl9pZCl9LHNlbGVjdGlvbjpmdW5jdGlvbiBIRigpe3JldHVybiBuZXcgRUYodGhpcy5fZ3JvdXBzLHRoaXMuX3BhcmVudHMpfSx0cmFuc2l0aW9uOmZ1bmN0aW9uIEZGKCl7Zm9yKHZhciB0PXRoaXMuX25hbWUsZT10aGlzLl9pZCxuPUlGKCksaT10aGlzLl9ncm91cHMscj1pLmxlbmd0aCxvPTA7bzxyOysrbylmb3IodmFyIGEscz1pW29dLGw9cy5sZW5ndGgsYz0wO2M8bDsrK2MpaWYoYT1zW2NdKXt2YXIgdT1pRihhLGUpO3RGKGEsdCxuLGMscyx7dGltZTp1LnRpbWUrdS5kZWxheSt1LmR1cmF0aW9uLGRlbGF5OjAsZHVyYXRpb246dS5kdXJhdGlvbixlYXNlOnUuZWFzZX0pfXJldHVybiBuZXcgTkYoaSx0aGlzLl9wYXJlbnRzLHQsbil9LGNhbGw6UkYuY2FsbCxub2RlczpSRi5ub2Rlcyxub2RlOlJGLm5vZGUsc2l6ZTpSRi5zaXplLGVtcHR5OlJGLmVtcHR5LGVhY2g6UkYuZWFjaCxvbjpmdW5jdGlvbiBWRih0LGUpe3ZhciBuPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDI/aUYodGhpcy5ub2RlKCksbikub24ub24odCk6dGhpcy5lYWNoKE1GKG4sdCxlKSl9LGF0dHI6ZnVuY3Rpb24gVUYodCxlKXt2YXIgbj1Weih0KSxpPSJ0cmFuc2Zvcm0iPT09bj9SSDpsRjtyZXR1cm4gdGhpcy5hdHRyVHdlZW4odCwiZnVuY3Rpb24iPT10eXBlb2YgZT8obi5sb2NhbD9mRjpwRikobixpLHNGKHRoaXMsImF0dHIuIit0LGUpKTpudWxsPT1lPyhuLmxvY2FsP3VGOmNGKShuKToobi5sb2NhbD9kRjpoRikobixpLGUpKX0sYXR0clR3ZWVuOmZ1bmN0aW9uIGpGKHQsZSl7dmFyIG49ImF0dHIuIit0O2lmKGFyZ3VtZW50cy5sZW5ndGg8MilyZXR1cm4obj10aGlzLnR3ZWVuKG4pKSYmbi5fdmFsdWU7aWYobnVsbD09ZSlyZXR1cm4gdGhpcy50d2VlbihuLG51bGwpO2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcjt2YXIgaT1Weih0KTtyZXR1cm4gdGhpcy50d2VlbihuLChpLmxvY2FsP19GOnlGKShpLGUpKX0sc3R5bGU6ZnVuY3Rpb24gR0YodCxlLG4pe3ZhciBpPSJ0cmFuc2Zvcm0iPT0odCs9IiIpP05IOmxGO3JldHVybiBudWxsPT1lP3RoaXMuc3R5bGVUd2Vlbih0LChmdW5jdGlvbiByKHQsZSl7dmFyIG4saSxyO3JldHVybiBmdW5jdGlvbigpe3ZhciBvPWhEKHRoaXMsdCksYT0odGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KSxoRCh0aGlzLHQpKTtyZXR1cm4gbz09PWE/bnVsbDpvPT09biYmYT09PWk/cjpyPWUobj1vLGk9YSl9fSkodCxpKSkub24oImVuZC5zdHlsZS4iK3QsVEYodCkpOiJmdW5jdGlvbiI9PXR5cGVvZiBlP3RoaXMuc3R5bGVUd2Vlbih0LChmdW5jdGlvbiBhKHQsZSxuKXt2YXIgaSxyLG87cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9aEQodGhpcyx0KSxzPW4odGhpcyksbD1zKyIiO3JldHVybiBudWxsPT1zJiYodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KSxsPXM9aEQodGhpcyx0KSksYT09PWw/bnVsbDphPT09aSYmbD09PXI/bzoocj1sLG89ZShpPWEscykpfX0pKHQsaSxzRih0aGlzLCJzdHlsZS4iK3QsZSkpKS5lYWNoKChmdW5jdGlvbiBvKHQsZSl7dmFyIG4saSxyLG8sYT0ic3R5bGUuIitlLHM9ImVuZC4iK2E7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGw9bkYodGhpcyx0KSxjPWwub24sdT1udWxsPT1sLnZhbHVlW2FdP298fChvPVRGKGUpKTp2b2lkIDA7Yz09PW4mJnI9PT11fHwoaT0obj1jKS5jb3B5KCkpLm9uKHMscj11KSxsLm9uPWl9fSkodGhpcy5faWQsdCkpOnRoaXMuc3R5bGVUd2Vlbih0LChmdW5jdGlvbiBzKHQsZSxuKXt2YXIgaSxyLG89bisiIjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT1oRCh0aGlzLHQpO3JldHVybiBhPT09bz9udWxsOmE9PT1pP3I6cj1lKGk9YSxuKX19KSh0LGksZSksbikub24oImVuZC5zdHlsZS4iK3QsbnVsbCl9LHN0eWxlVHdlZW46ZnVuY3Rpb24gV0YodCxlLG4pe3ZhciBpPSJzdHlsZS4iKyh0Kz0iIik7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXJldHVybihpPXRoaXMudHdlZW4oaSkpJiZpLl92YWx1ZTtpZihudWxsPT1lKXJldHVybiB0aGlzLnR3ZWVuKGksbnVsbCk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yO3JldHVybiB0aGlzLnR3ZWVuKGksQUYodCxlLG51bGw9PW4/IiI6bikpfSx0ZXh0OmZ1bmN0aW9uIHFGKHQpe3JldHVybiB0aGlzLnR3ZWVuKCJ0ZXh0IiwiZnVuY3Rpb24iPT10eXBlb2YgdD8oZnVuY3Rpb24gZSh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10KHRoaXMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09ZT8iIjplfX0pKHNGKHRoaXMsInRleHQiLHQpKTooZnVuY3Rpb24gbih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fSkobnVsbD09dD8iIjp0KyIiKSl9LHRleHRUd2VlbjpmdW5jdGlvbiBZRih0KXt2YXIgZT0idGV4dCI7aWYoYXJndW1lbnRzLmxlbmd0aDwxKXJldHVybihlPXRoaXMudHdlZW4oZSkpJiZlLl92YWx1ZTtpZihudWxsPT10KXJldHVybiB0aGlzLnR3ZWVuKGUsbnVsbCk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yO3JldHVybiB0aGlzLnR3ZWVuKGUsTEYodCkpfSxyZW1vdmU6ZnVuY3Rpb24gWEYoKXtyZXR1cm4gdGhpcy5vbigiZW5kLnJlbW92ZSIsKGZ1bmN0aW9uIHQoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO2Zvcih2YXIgbiBpbiB0aGlzLl9fdHJhbnNpdGlvbilpZigrbiE9PWUpcmV0dXJuO3QmJnQucmVtb3ZlQ2hpbGQodGhpcyl9fSkodGhpcy5faWQpKX0sdHdlZW46ZnVuY3Rpb24gJEYodCxlKXt2YXIgbj10aGlzLl9pZDtpZih0Kz0iIixhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgaSxyPWlGKHRoaXMubm9kZSgpLG4pLnR3ZWVuLG89MCxhPXIubGVuZ3RoO288YTsrK28paWYoKGk9cltvXSkubmFtZT09PXQpcmV0dXJuIGkudmFsdWU7cmV0dXJuIG51bGx9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09ZT9vRjphRikobix0LGUpKX0sZGVsYXk6ZnVuY3Rpb24gS0YodCl7dmFyIGU9dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD92RjpiRikoZSx0KSk6aUYodGhpcy5ub2RlKCksZSkuZGVsYXl9LGR1cmF0aW9uOmZ1bmN0aW9uIFpGKHQpe3ZhciBlPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIHQ/eEY6d0YpKGUsdCkpOmlGKHRoaXMubm9kZSgpLGUpLmR1cmF0aW9ufSxlYXNlOmZ1bmN0aW9uIEpGKHQpe3ZhciBlPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChTRihlLHQpKTppRih0aGlzLm5vZGUoKSxlKS5lYXNlfSxlbmQ6ZnVuY3Rpb24gUUYoKXt2YXIgdCxlLG49dGhpcyxpPW4uX2lkLHI9bi5zaXplKCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihvLGEpe3ZhciBzPXt2YWx1ZTphfSxsPXt2YWx1ZTpmdW5jdGlvbigpezA9PS0tciYmbygpfX07bi5lYWNoKChmdW5jdGlvbigpe3ZhciBuPW5GKHRoaXMsaSkscj1uLm9uO3IhPT10JiYoKGU9KHQ9cikuY29weSgpKS5fLmNhbmNlbC5wdXNoKHMpLGUuXy5pbnRlcnJ1cHQucHVzaChzKSxlLl8uZW5kLnB1c2gobCkpLG4ub249ZX0pKX0pKX19O3ZhciB0Vj17dGltZTpudWxsLGRlbGF5OjAsZHVyYXRpb246MjUwLGVhc2U6cWZ9O2Z1bmN0aW9uIGVWKHQsZSl7Zm9yKHZhciBuOyEobj10Ll9fdHJhbnNpdGlvbil8fCEobj1uW2VdKTspaWYoISh0PXQucGFyZW50Tm9kZSkpcmV0dXJuIHRWLnRpbWU9R0goKSx0VjtyZXR1cm4gbn1mdW5jdGlvbiBuVih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gaVYodCxlLG4pe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPWUsdGhpcy5zZWxlY3Rpb249bn1mdW5jdGlvbiByVigpe3pELnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIG9WKCl7ekQucHJldmVudERlZmF1bHQoKSx6RC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1ZRC5wcm90b3R5cGUuaW50ZXJydXB0PWZ1bmN0aW9uIGFWKHQpe3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7ckYodGhpcyx0KX0pKX0sWUQucHJvdG90eXBlLnRyYW5zaXRpb249ZnVuY3Rpb24gc1YodCl7dmFyIGUsbjt0IGluc3RhbmNlb2YgTkY/KGU9dC5faWQsdD10Ll9uYW1lKTooZT1JRigpLChuPXRWKS50aW1lPUdIKCksdD1udWxsPT10P251bGw6dCsiIik7Zm9yKHZhciBpPXRoaXMuX2dyb3VwcyxyPWkubGVuZ3RoLG89MDtvPHI7KytvKWZvcih2YXIgYSxzPWlbb10sbD1zLmxlbmd0aCxjPTA7YzxsOysrYykoYT1zW2NdKSYmdEYoYSx0LGUsYyxzLG58fGVWKGEsZSkpO3JldHVybiBuZXcgTkYoaSx0aGlzLl9wYXJlbnRzLHQsZSl9O3ZhciBsVj17bmFtZToiZHJhZyJ9LGNWPXtuYW1lOiJzcGFjZSJ9LHVWPXtuYW1lOiJoYW5kbGUifSxoVj17bmFtZToiY2VudGVyIn0sZFY9e25hbWU6IngiLGhhbmRsZXM6WyJlIiwidyJdLm1hcChiViksaW5wdXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmW1t0WzBdLGVbMF1bMV1dLFt0WzFdLGVbMV1bMV1dXX0sb3V0cHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0JiZbdFswXVswXSx0WzFdWzBdXX19LHBWPXtuYW1lOiJ5IixoYW5kbGVzOlsibiIsInMiXS5tYXAoYlYpLGlucHV0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQmJltbZVswXVswXSx0WzBdXSxbZVsxXVswXSx0WzFdXV19LG91dHB1dDpmdW5jdGlvbih0KXtyZXR1cm4gdCYmW3RbMF1bMV0sdFsxXVsxXV19fSxmVj17bmFtZToieHkiLGhhbmRsZXM6WyJuIiwiZSIsInMiLCJ3IiwibnciLCJuZSIsInNlIiwic3ciXS5tYXAoYlYpLGlucHV0OmZ1bmN0aW9uKHQpe3JldHVybiB0fSxvdXRwdXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHR9fSxtVj17b3ZlcmxheToiY3Jvc3NoYWlyIixzZWxlY3Rpb246Im1vdmUiLG46Im5zLXJlc2l6ZSIsZToiZXctcmVzaXplIixzOiJucy1yZXNpemUiLHc6ImV3LXJlc2l6ZSIsbnc6Im53c2UtcmVzaXplIixuZToibmVzdy1yZXNpemUiLHNlOiJud3NlLXJlc2l6ZSIsc3c6Im5lc3ctcmVzaXplIn0sZ1Y9e2U6InciLHc6ImUiLG53OiJuZSIsbmU6Im53IixzZToic3ciLHN3OiJzZSJ9LF9WPXtuOiJzIixzOiJuIixudzoic3ciLG5lOiJzZSIsc2U6Im5lIixzdzoibncifSx5Vj17b3ZlcmxheToxLHNlbGVjdGlvbjoxLG46bnVsbCxlOjEsczpudWxsLHc6LTEsbnc6LTEsbmU6MSxzZToxLHN3Oi0xfSx2Vj17b3ZlcmxheToxLHNlbGVjdGlvbjoxLG46LTEsZTpudWxsLHM6MSx3Om51bGwsbnc6LTEsbmU6LTEsc2U6MSxzdzoxfTtmdW5jdGlvbiBiVih0KXtyZXR1cm57dHlwZTp0fX1mdW5jdGlvbiB4Vigpe3JldHVybiF6RC5idXR0b259ZnVuY3Rpb24gd1YoKXt2YXIgdD10aGlzLm93bmVyU1ZHRWxlbWVudHx8dGhpcztyZXR1cm5bWzAsMF0sW3Qud2lkdGguYmFzZVZhbC52YWx1ZSx0LmhlaWdodC5iYXNlVmFsLnZhbHVlXV19ZnVuY3Rpb24gU1YodCl7Zm9yKDshdC5fX2JydXNoOylpZighKHQ9dC5wYXJlbnROb2RlKSlyZXR1cm47cmV0dXJuIHQuX19icnVzaH1mdW5jdGlvbiBNVih0KXtyZXR1cm4gdFswXVswXT09PXRbMV1bMF18fHRbMF1bMV09PT10WzFdWzFdfWZ1bmN0aW9uIEVWKHQpe3ZhciBlLG49d1YsaT14VixyPVJ6KGEsInN0YXJ0IiwiYnJ1c2giLCJlbmQiKSxvPTY7ZnVuY3Rpb24gYShlKXt2YXIgbj1lLnByb3BlcnR5KCJfX2JydXNoIixoKS5zZWxlY3RBbGwoIi5vdmVybGF5IikuZGF0YShbYlYoIm92ZXJsYXkiKV0pO24uZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsIm92ZXJsYXkiKS5hdHRyKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLmF0dHIoImN1cnNvciIsbVYub3ZlcmxheSkubWVyZ2UobikuZWFjaCgoZnVuY3Rpb24oKXt2YXIgdD1TVih0aGlzKS5leHRlbnQ7WEQodGhpcykuYXR0cigieCIsdFswXVswXSkuYXR0cigieSIsdFswXVsxXSkuYXR0cigid2lkdGgiLHRbMV1bMF0tdFswXVswXSkuYXR0cigiaGVpZ2h0Iix0WzFdWzFdLXRbMF1bMV0pfSkpLGUuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuZGF0YShbYlYoInNlbGVjdGlvbiIpXSkuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJjbGFzcyIsInNlbGVjdGlvbiIpLmF0dHIoImN1cnNvciIsbVYuc2VsZWN0aW9uKS5hdHRyKCJmaWxsIiwiIzc3NyIpLmF0dHIoImZpbGwtb3BhY2l0eSIsLjMpLmF0dHIoInN0cm9rZSIsIiNmZmYiKS5hdHRyKCJzaGFwZS1yZW5kZXJpbmciLCJjcmlzcEVkZ2VzIik7dmFyIGk9ZS5zZWxlY3RBbGwoIi5oYW5kbGUiKS5kYXRhKHQuaGFuZGxlcywoZnVuY3Rpb24odCl7cmV0dXJuIHQudHlwZX0pKTtpLmV4aXQoKS5yZW1vdmUoKSxpLmVudGVyKCkuYXBwZW5kKCJyZWN0IikuYXR0cigiY2xhc3MiLChmdW5jdGlvbih0KXtyZXR1cm4iaGFuZGxlIGhhbmRsZS0tIit0LnR5cGV9KSkuYXR0cigiY3Vyc29yIiwoZnVuY3Rpb24odCl7cmV0dXJuIG1WW3QudHlwZV19KSksZS5lYWNoKHMpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigicG9pbnRlci1ldmVudHMiLCJhbGwiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpLm9uKCJtb3VzZWRvd24uYnJ1c2ggdG91Y2hzdGFydC5icnVzaCIsdSl9ZnVuY3Rpb24gcygpe3ZhciB0PVhEKHRoaXMpLGU9U1YodGhpcykuc2VsZWN0aW9uO2U/KHQuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikuc3R5bGUoImRpc3BsYXkiLG51bGwpLmF0dHIoIngiLGVbMF1bMF0pLmF0dHIoInkiLGVbMF1bMV0pLmF0dHIoIndpZHRoIixlWzFdWzBdLWVbMF1bMF0pLmF0dHIoImhlaWdodCIsZVsxXVsxXS1lWzBdWzFdKSx0LnNlbGVjdEFsbCgiLmhhbmRsZSIpLnN0eWxlKCJkaXNwbGF5IixudWxsKS5hdHRyKCJ4IiwoZnVuY3Rpb24odCl7cmV0dXJuImUiPT09dC50eXBlW3QudHlwZS5sZW5ndGgtMV0/ZVsxXVswXS1vLzI6ZVswXVswXS1vLzJ9KSkuYXR0cigieSIsKGZ1bmN0aW9uKHQpe3JldHVybiJzIj09PXQudHlwZVswXT9lWzFdWzFdLW8vMjplWzBdWzFdLW8vMn0pKS5hdHRyKCJ3aWR0aCIsKGZ1bmN0aW9uKHQpe3JldHVybiJuIj09PXQudHlwZXx8InMiPT09dC50eXBlP2VbMV1bMF0tZVswXVswXStvOm99KSkuYXR0cigiaGVpZ2h0IiwoZnVuY3Rpb24odCl7cmV0dXJuImUiPT09dC50eXBlfHwidyI9PT10LnR5cGU/ZVsxXVsxXS1lWzBdWzFdK286b30pKSk6dC5zZWxlY3RBbGwoIi5zZWxlY3Rpb24sLmhhbmRsZSIpLnN0eWxlKCJkaXNwbGF5Iiwibm9uZSIpLmF0dHIoIngiLG51bGwpLmF0dHIoInkiLG51bGwpLmF0dHIoIndpZHRoIixudWxsKS5hdHRyKCJoZWlnaHQiLG51bGwpfWZ1bmN0aW9uIGwodCxlKXtyZXR1cm4gdC5fX2JydXNoLmVtaXR0ZXJ8fG5ldyBjKHQsZSl9ZnVuY3Rpb24gYyh0LGUpe3RoaXMudGhhdD10LHRoaXMuYXJncz1lLHRoaXMuc3RhdGU9dC5fX2JydXNoLHRoaXMuYWN0aXZlPTB9ZnVuY3Rpb24gdSgpe2lmKHpELnRvdWNoZXMpe2lmKHpELmNoYW5nZWRUb3VjaGVzLmxlbmd0aDx6RC50b3VjaGVzLmxlbmd0aClyZXR1cm4gb1YoKX1lbHNlIGlmKGUpcmV0dXJuO2lmKGkuYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgbixyLG8sYSxjLHUsaCxkLHAsZixtLGcsXyx5PXRoaXMsdj16RC50YXJnZXQuX19kYXRhX18udHlwZSxiPSJzZWxlY3Rpb24iPT09KHpELm1ldGFLZXk/dj0ib3ZlcmxheSI6dik/bFY6ekQuYWx0S2V5P2hWOnVWLHg9dD09PXBWP251bGw6eVZbdl0sdz10PT09ZFY/bnVsbDp2Vlt2XSxTPVNWKHkpLE09Uy5leHRlbnQsRT1TLnNlbGVjdGlvbixUPU1bMF1bMF0sQz1NWzBdWzFdLEE9TVsxXVswXSxrPU1bMV1bMV0sTD14JiZ3JiZ6RC5zaGlmdEtleSxQPSREKHkpLE49UCxJPWwoeSxhcmd1bWVudHMpLmJlZm9yZXN0YXJ0KCk7Im92ZXJsYXkiPT09dj9TLnNlbGVjdGlvbj1FPVtbbj10PT09cFY/VDpQWzBdLG89dD09PWRWP0M6UFsxXV0sW2M9dD09PXBWP0E6bixoPXQ9PT1kVj9rOm9dXToobj1FWzBdWzBdLG89RVswXVsxXSxjPUVbMV1bMF0saD1FWzFdWzFdKSxyPW4sYT1vLHU9YyxkPWg7dmFyIFI9WEQoeSkuYXR0cigicG9pbnRlci1ldmVudHMiLCJub25lIiksTz1SLnNlbGVjdEFsbCgiLm92ZXJsYXkiKS5hdHRyKCJjdXJzb3IiLG1WW3ZdKTtpZih6RC50b3VjaGVzKVIub24oInRvdWNobW92ZS5icnVzaCIsRCwhMCkub24oInRvdWNoZW5kLmJydXNoIHRvdWNoY2FuY2VsLmJydXNoIixILCEwKTtlbHNle3ZhciB6PVhEKHpELnZpZXcpLm9uKCJrZXlkb3duLmJydXNoIixGLCEwKS5vbigia2V5dXAuYnJ1c2giLFYsITApLm9uKCJtb3VzZW1vdmUuYnJ1c2giLEQsITApLm9uKCJtb3VzZXVwLmJydXNoIixILCEwKTtaRCh6RC52aWV3KX1yVigpLHJGKHkpLHMuY2FsbCh5KSxJLnN0YXJ0KCl9ZnVuY3Rpb24gRCgpe3ZhciB0PSREKHkpOyFMfHxnfHxffHwoTWF0aC5hYnModFswXS1OWzBdKT5NYXRoLmFicyh0WzFdLU5bMV0pP189ITA6Zz0hMCksTj10LG09ITAsb1YoKSxCKCl9ZnVuY3Rpb24gQigpe3ZhciB0O3N3aXRjaChwPU5bMF0tUFswXSxmPU5bMV0tUFsxXSxiKXtjYXNlIGNWOmNhc2UgbFY6eCYmKHA9TWF0aC5tYXgoVC1uLE1hdGgubWluKEEtYyxwKSkscj1uK3AsdT1jK3ApLHcmJihmPU1hdGgubWF4KEMtbyxNYXRoLm1pbihrLWgsZikpLGE9bytmLGQ9aCtmKTticmVhaztjYXNlIHVWOng8MD8ocD1NYXRoLm1heChULW4sTWF0aC5taW4oQS1uLHApKSxyPW4rcCx1PWMpOng+MCYmKHA9TWF0aC5tYXgoVC1jLE1hdGgubWluKEEtYyxwKSkscj1uLHU9YytwKSx3PDA/KGY9TWF0aC5tYXgoQy1vLE1hdGgubWluKGstbyxmKSksYT1vK2YsZD1oKTp3PjAmJihmPU1hdGgubWF4KEMtaCxNYXRoLm1pbihrLWgsZikpLGE9byxkPWgrZik7YnJlYWs7Y2FzZSBoVjp4JiYocj1NYXRoLm1heChULE1hdGgubWluKEEsbi1wKngpKSx1PU1hdGgubWF4KFQsTWF0aC5taW4oQSxjK3AqeCkpKSx3JiYoYT1NYXRoLm1heChDLE1hdGgubWluKGssby1mKncpKSxkPU1hdGgubWF4KEMsTWF0aC5taW4oayxoK2YqdykpKX11PHImJih4Kj0tMSx0PW4sbj1jLGM9dCx0PXIscj11LHU9dCx2IGluIGdWJiZPLmF0dHIoImN1cnNvciIsbVZbdj1nVlt2XV0pKSxkPGEmJih3Kj0tMSx0PW8sbz1oLGg9dCx0PWEsYT1kLGQ9dCx2IGluIF9WJiZPLmF0dHIoImN1cnNvciIsbVZbdj1fVlt2XV0pKSxTLnNlbGVjdGlvbiYmKEU9Uy5zZWxlY3Rpb24pLGcmJihyPUVbMF1bMF0sdT1FWzFdWzBdKSxfJiYoYT1FWzBdWzFdLGQ9RVsxXVsxXSksRVswXVswXT09PXImJkVbMF1bMV09PT1hJiZFWzFdWzBdPT09dSYmRVsxXVsxXT09PWR8fChTLnNlbGVjdGlvbj1bW3IsYV0sW3UsZF1dLHMuY2FsbCh5KSxJLmJydXNoKCkpfWZ1bmN0aW9uIEgoKXtpZihyVigpLHpELnRvdWNoZXMpe2lmKHpELnRvdWNoZXMubGVuZ3RoKXJldHVybjtlJiZjbGVhclRpbWVvdXQoZSksZT1zZXRUaW1lb3V0KChmdW5jdGlvbigpe2U9bnVsbH0pLDUwMCksUi5vbigidG91Y2htb3ZlLmJydXNoIHRvdWNoZW5kLmJydXNoIHRvdWNoY2FuY2VsLmJydXNoIixudWxsKX1lbHNlIEpEKHpELnZpZXcsbSksei5vbigia2V5ZG93bi5icnVzaCBrZXl1cC5icnVzaCBtb3VzZW1vdmUuYnJ1c2ggbW91c2V1cC5icnVzaCIsbnVsbCk7Ui5hdHRyKCJwb2ludGVyLWV2ZW50cyIsImFsbCIpLE8uYXR0cigiY3Vyc29yIixtVi5vdmVybGF5KSxTLnNlbGVjdGlvbiYmKEU9Uy5zZWxlY3Rpb24pLE1WKEUpJiYoUy5zZWxlY3Rpb249bnVsbCxzLmNhbGwoeSkpLEkuZW5kKCl9ZnVuY3Rpb24gRigpe3N3aXRjaCh6RC5rZXlDb2RlKXtjYXNlIDE2Okw9eCYmdzticmVhaztjYXNlIDE4OmI9PT11ViYmKHgmJihjPXUtcCp4LG49citwKngpLHcmJihoPWQtZip3LG89YStmKncpLGI9aFYsQigpKTticmVhaztjYXNlIDMyOmIhPT11ViYmYiE9PWhWfHwoeDwwP2M9dS1wOng+MCYmKG49ci1wKSx3PDA/aD1kLWY6dz4wJiYobz1hLWYpLGI9Y1YsTy5hdHRyKCJjdXJzb3IiLG1WLnNlbGVjdGlvbiksQigpKTticmVhaztkZWZhdWx0OnJldHVybn1vVigpfWZ1bmN0aW9uIFYoKXtzd2l0Y2goekQua2V5Q29kZSl7Y2FzZSAxNjpMJiYoZz1fPUw9ITEsQigpKTticmVhaztjYXNlIDE4OmI9PT1oViYmKHg8MD9jPXU6eD4wJiYobj1yKSx3PDA/aD1kOnc+MCYmKG89YSksYj11VixCKCkpO2JyZWFrO2Nhc2UgMzI6Yj09PWNWJiYoekQuYWx0S2V5Pyh4JiYoYz11LXAqeCxuPXIrcCp4KSx3JiYoaD1kLWYqdyxvPWErZip3KSxiPWhWKTooeDwwP2M9dTp4PjAmJihuPXIpLHc8MD9oPWQ6dz4wJiYobz1hKSxiPXVWKSxPLmF0dHIoImN1cnNvciIsbVZbdl0pLEIoKSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm59b1YoKX19ZnVuY3Rpb24gaCgpe3ZhciBlPXRoaXMuX19icnVzaHx8e3NlbGVjdGlvbjpudWxsfTtyZXR1cm4gZS5leHRlbnQ9bi5hcHBseSh0aGlzLGFyZ3VtZW50cyksZS5kaW09dCxlfXJldHVybiBhLm1vdmU9ZnVuY3Rpb24oZSxuKXtlLnNlbGVjdGlvbj9lLm9uKCJzdGFydC5icnVzaCIsKGZ1bmN0aW9uKCl7bCh0aGlzLGFyZ3VtZW50cykuYmVmb3Jlc3RhcnQoKS5zdGFydCgpfSkpLm9uKCJpbnRlcnJ1cHQuYnJ1c2ggZW5kLmJydXNoIiwoZnVuY3Rpb24oKXtsKHRoaXMsYXJndW1lbnRzKS5lbmQoKX0pKS50d2VlbigiYnJ1c2giLChmdW5jdGlvbigpe3ZhciBlPXRoaXMsaT1lLl9fYnJ1c2gscj1sKGUsYXJndW1lbnRzKSxvPWkuc2VsZWN0aW9uLGE9dC5pbnB1dCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTpuLGkuZXh0ZW50KSxjPXhIKG8sYSk7ZnVuY3Rpb24gdSh0KXtpLnNlbGVjdGlvbj0xPT09dCYmTVYoYSk/bnVsbDpjKHQpLHMuY2FsbChlKSxyLmJydXNoKCl9cmV0dXJuIG8mJmE/dTp1KDEpfSkpOmUuZWFjaCgoZnVuY3Rpb24oKXt2YXIgZT10aGlzLGk9YXJndW1lbnRzLHI9ZS5fX2JydXNoLG89dC5pbnB1dCgiZnVuY3Rpb24iPT10eXBlb2Ygbj9uLmFwcGx5KGUsaSk6bixyLmV4dGVudCksYT1sKGUsaSkuYmVmb3Jlc3RhcnQoKTtyRihlKSxyLnNlbGVjdGlvbj1udWxsPT1vfHxNVihvKT9udWxsOm8scy5jYWxsKGUpLGEuc3RhcnQoKS5icnVzaCgpLmVuZCgpfSkpfSxjLnByb3RvdHlwZT17YmVmb3Jlc3RhcnQ6ZnVuY3Rpb24oKXtyZXR1cm4gMT09Kyt0aGlzLmFjdGl2ZSYmKHRoaXMuc3RhdGUuZW1pdHRlcj10aGlzLHRoaXMuc3RhcnRpbmc9ITApLHRoaXN9LHN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RhcnRpbmcmJih0aGlzLnN0YXJ0aW5nPSExLHRoaXMuZW1pdCgic3RhcnQiKSksdGhpc30sYnJ1c2g6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbWl0KCJicnVzaCIpLHRoaXN9LGVuZDpmdW5jdGlvbigpe3JldHVybiAwPT0tLXRoaXMuYWN0aXZlJiYoZGVsZXRlIHRoaXMuc3RhdGUuZW1pdHRlcix0aGlzLmVtaXQoImVuZCIpKSx0aGlzfSxlbWl0OmZ1bmN0aW9uKGUpeyEoZnVuY3Rpb24gbih0LGUsaSxyKXt2YXIgbz16RDt0LnNvdXJjZUV2ZW50PXpELHpEPXQ7dHJ5e3JldHVybiBlLmFwcGx5KGkscil9ZmluYWxseXt6RD1vfX0pKG5ldyBpVihhLGUsdC5vdXRwdXQodGhpcy5zdGF0ZS5zZWxlY3Rpb24pKSxyLmFwcGx5LHIsW2UsdGhpcy50aGF0LHRoaXMuYXJnc10pfX0sYS5leHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpuVihbWyt0WzBdWzBdLCt0WzBdWzFdXSxbK3RbMV1bMF0sK3RbMV1bMV1dXSksYSk6bn0sYS5maWx0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpuVighIXQpLGEpOml9LGEuaGFuZGxlU2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0rdCxhKTpvfSxhLm9uPWZ1bmN0aW9uKCl7dmFyIHQ9ci5vbi5hcHBseShyLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1yP2E6dH0sYX1mdW5jdGlvbiBUVih0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6dD49ZT8wOk5hTn1mdW5jdGlvbiBDVih0LGUsbil7dD0rdCxlPStlLG49KHI9YXJndW1lbnRzLmxlbmd0aCk8Mj8oZT10LHQ9MCwxKTpyPDM/MTorbjtmb3IodmFyIGk9LTEscj0wfE1hdGgubWF4KDAsTWF0aC5jZWlsKChlLXQpL24pKSxvPW5ldyBBcnJheShyKTsrK2k8cjspb1tpXT10K2kqbjtyZXR1cm4gb30hKGZ1bmN0aW9uIEFWKHQpe3JldHVybiAxPT09dC5sZW5ndGgmJih0PShmdW5jdGlvbiBlKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3JldHVybiBUVih0KGUpLG4pfX0pKHQpKSx7bGVmdDpmdW5jdGlvbihlLG4saSxyKXtmb3IobnVsbD09aSYmKGk9MCksbnVsbD09ciYmKHI9ZS5sZW5ndGgpO2k8cjspe3ZhciBvPWkrcj4+PjE7dChlW29dLG4pPDA/aT1vKzE6cj1vfXJldHVybiBpfSxyaWdodDpmdW5jdGlvbihlLG4saSxyKXtmb3IobnVsbD09aSYmKGk9MCksbnVsbD09ciYmKHI9ZS5sZW5ndGgpO2k8cjspe3ZhciBvPWkrcj4+PjE7dChlW29dLG4pPjA/cj1vOmk9bysxfXJldHVybiBpfX19KShUVik7dmFyIGtWPU1hdGguY29zLExWPU1hdGguc2luLFBWPU1hdGguUEksTlY9UFYvMixJVj0yKlBWLFJWPU1hdGgubWF4O2Z1bmN0aW9uIE9WKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3JldHVybiB0KGUuc291cmNlLnZhbHVlK2UudGFyZ2V0LnZhbHVlLG4uc291cmNlLnZhbHVlK24udGFyZ2V0LnZhbHVlKX19dmFyIHpWPUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBEVih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19dmFyIEJWPU1hdGguUEksSFY9MipCVixGVj0xZS02LFZWPUhWLUZWO2Z1bmN0aW9uIFVWKCl7dGhpcy5feDA9dGhpcy5feTA9dGhpcy5feDE9dGhpcy5feTE9bnVsbCx0aGlzLl89IiJ9ZnVuY3Rpb24galYoKXtyZXR1cm4gbmV3IFVWfWZ1bmN0aW9uIEdWKHQpe3JldHVybiB0LnNvdXJjZX1mdW5jdGlvbiBXVih0KXtyZXR1cm4gdC50YXJnZXR9ZnVuY3Rpb24gcVYodCl7cmV0dXJuIHQucmFkaXVzfWZ1bmN0aW9uIFlWKHQpe3JldHVybiB0LnN0YXJ0QW5nbGV9ZnVuY3Rpb24gWFYodCl7cmV0dXJuIHQuZW5kQW5nbGV9VVYucHJvdG90eXBlPWpWLnByb3RvdHlwZT17Y29uc3RydWN0b3I6VVYsbW92ZVRvOmZ1bmN0aW9uKHQsZSl7dGhpcy5fKz0iTSIrKHRoaXMuX3gwPXRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kwPXRoaXMuX3kxPStlKX0sY2xvc2VQYXRoOmZ1bmN0aW9uKCl7bnVsbCE9PXRoaXMuX3gxJiYodGhpcy5feDE9dGhpcy5feDAsdGhpcy5feTE9dGhpcy5feTAsdGhpcy5fKz0iWiIpfSxsaW5lVG86ZnVuY3Rpb24odCxlKXt0aGlzLl8rPSJMIisodGhpcy5feDE9K3QpKyIsIisodGhpcy5feTE9K2UpfSxxdWFkcmF0aWNDdXJ2ZVRvOmZ1bmN0aW9uKHQsZSxuLGkpe3RoaXMuXys9IlEiKyArdCsiLCIrICtlKyIsIisodGhpcy5feDE9K24pKyIsIisodGhpcy5feTE9K2kpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKHQsZSxuLGkscixvKXt0aGlzLl8rPSJDIisgK3QrIiwiKyArZSsiLCIrICtuKyIsIisgK2krIiwiKyh0aGlzLl94MT0rcikrIiwiKyh0aGlzLl95MT0rbyl9LGFyY1RvOmZ1bmN0aW9uKHQsZSxuLGkscil7dmFyIG89dGhpcy5feDEsYT10aGlzLl95MSxzPShuPStuKS0odD0rdCksbD0oaT0raSktKGU9K2UpLGM9by10LHU9YS1lLGg9YypjK3UqdTtpZigocj0rcik8MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIityKTtpZihudWxsPT09dGhpcy5feDEpdGhpcy5fKz0iTSIrKHRoaXMuX3gxPXQpKyIsIisodGhpcy5feTE9ZSk7ZWxzZSBpZihoPkZWKWlmKE1hdGguYWJzKHUqcy1sKmMpPkZWJiZyKXt2YXIgZD1uLW8scD1pLWEsZj1zKnMrbCpsLG09ZCpkK3AqcCxnPU1hdGguc3FydChmKSxfPU1hdGguc3FydChoKSx5PXIqTWF0aC50YW4oKEJWLU1hdGguYWNvcygoZitoLW0pLygyKmcqXykpKS8yKSx2PXkvXyxiPXkvZztNYXRoLmFicyh2LTEpPkZWJiYodGhpcy5fKz0iTCIrKHQrdipjKSsiLCIrKGUrdip1KSksdGhpcy5fKz0iQSIrcisiLCIrcisiLDAsMCwiKyArKHUqZD5jKnApKyIsIisodGhpcy5feDE9dCtiKnMpKyIsIisodGhpcy5feTE9ZStiKmwpfWVsc2UgdGhpcy5fKz0iTCIrKHRoaXMuX3gxPXQpKyIsIisodGhpcy5feTE9ZSk7ZWxzZTt9LGFyYzpmdW5jdGlvbih0LGUsbixpLHIsbyl7dD0rdCxlPStlLG89ISFvO3ZhciBhPShuPStuKSpNYXRoLmNvcyhpKSxzPW4qTWF0aC5zaW4oaSksbD10K2EsYz1lK3MsdT0xXm8saD1vP2ktcjpyLWk7aWYobjwwKXRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzOiAiK24pO251bGw9PT10aGlzLl94MT90aGlzLl8rPSJNIitsKyIsIitjOihNYXRoLmFicyh0aGlzLl94MS1sKT5GVnx8TWF0aC5hYnModGhpcy5feTEtYyk+RlYpJiYodGhpcy5fKz0iTCIrbCsiLCIrYyksbiYmKGg8MCYmKGg9aCVIVitIViksaD5WVj90aGlzLl8rPSJBIituKyIsIituKyIsMCwxLCIrdSsiLCIrKHQtYSkrIiwiKyhlLXMpKyJBIituKyIsIituKyIsMCwxLCIrdSsiLCIrKHRoaXMuX3gxPWwpKyIsIisodGhpcy5feTE9Yyk6aD5GViYmKHRoaXMuXys9IkEiK24rIiwiK24rIiwwLCIrICsoaD49QlYpKyIsIit1KyIsIisodGhpcy5feDE9dCtuKk1hdGguY29zKHIpKSsiLCIrKHRoaXMuX3kxPWUrbipNYXRoLnNpbihyKSkpKX0scmVjdDpmdW5jdGlvbih0LGUsbixpKXt0aGlzLl8rPSJNIisodGhpcy5feDA9dGhpcy5feDE9K3QpKyIsIisodGhpcy5feTA9dGhpcy5feTE9K2UpKyJoIisgK24rInYiKyAraSsiaCIrLW4rIloifSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl99fTt2YXIgJFY9IiQiO2Z1bmN0aW9uIEtWKCl7fWZ1bmN0aW9uIFpWKHQsZSl7dmFyIG49bmV3IEtWO2lmKHQgaW5zdGFuY2VvZiBLVil0LmVhY2goKGZ1bmN0aW9uKHQsZSl7bi5zZXQoZSx0KX0pKTtlbHNlIGlmKEFycmF5LmlzQXJyYXkodCkpe3ZhciBpLHI9LTEsbz10Lmxlbmd0aDtpZihudWxsPT1lKWZvcig7KytyPG87KW4uc2V0KHIsdFtyXSk7ZWxzZSBmb3IoOysrcjxvOyluLnNldChlKGk9dFtyXSxyLHQpLGkpfWVsc2UgaWYodClmb3IodmFyIGEgaW4gdCluLnNldChhLHRbYV0pO3JldHVybiBufWZ1bmN0aW9uIEpWKCl7cmV0dXJue319ZnVuY3Rpb24gUVYodCxlLG4pe3RbZV09bn1mdW5jdGlvbiB0VSgpe3JldHVybiBaVigpfWZ1bmN0aW9uIGVVKHQsZSxuKXt0LnNldChlLG4pfWZ1bmN0aW9uIG5VKCl7fUtWLnByb3RvdHlwZT1aVi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOktWLGhhczpmdW5jdGlvbih0KXtyZXR1cm4gJFYrdCBpbiB0aGlzfSxnZXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbJFYrdF19LHNldDpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzWyRWK3RdPWUsdGhpc30scmVtb3ZlOmZ1bmN0aW9uKHQpe3ZhciBlPSRWK3Q7cmV0dXJuIGUgaW4gdGhpcyYmZGVsZXRlIHRoaXNbZV19LGNsZWFyOmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpdFswXT09PSRWJiZkZWxldGUgdGhpc1t0XX0sa2V5czpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiB0aGlzKWVbMF09PT0kViYmdC5wdXNoKGUuc2xpY2UoMSkpO3JldHVybiB0fSx2YWx1ZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gdGhpcyllWzBdPT09JFYmJnQucHVzaCh0aGlzW2VdKTtyZXR1cm4gdH0sZW50cmllczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiB0aGlzKWVbMF09PT0kViYmdC5wdXNoKHtrZXk6ZS5zbGljZSgxKSx2YWx1ZTp0aGlzW2VdfSk7cmV0dXJuIHR9LHNpemU6ZnVuY3Rpb24oKXt2YXIgdD0wO2Zvcih2YXIgZSBpbiB0aGlzKWVbMF09PT0kViYmKyt0O3JldHVybiB0fSxlbXB0eTpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzKWlmKHRbMF09PT0kVilyZXR1cm4hMTtyZXR1cm4hMH0sZWFjaDpmdW5jdGlvbih0KXtmb3IodmFyIGUgaW4gdGhpcyllWzBdPT09JFYmJnQodGhpc1tlXSxlLnNsaWNlKDEpLHRoaXMpfX07dmFyIGlVPVpWLnByb3RvdHlwZTtmdW5jdGlvbiByVSh0LGUpe3ZhciBuPW5ldyBuVTtpZih0IGluc3RhbmNlb2YgblUpdC5lYWNoKChmdW5jdGlvbih0KXtuLmFkZCh0KX0pKTtlbHNlIGlmKHQpe3ZhciBpPS0xLHI9dC5sZW5ndGg7aWYobnVsbD09ZSlmb3IoOysraTxyOyluLmFkZCh0W2ldKTtlbHNlIGZvcig7KytpPHI7KW4uYWRkKGUodFtpXSxpLHQpKX1yZXR1cm4gbn1mdW5jdGlvbiBvVSh0LGUsbil7dC5wcm90b3R5cGU9ZS5wcm90b3R5cGU9bixuLmNvbnN0cnVjdG9yPXR9ZnVuY3Rpb24gYVUodCxlKXt2YXIgbj1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKTtmb3IodmFyIGkgaW4gZSluW2ldPWVbaV07cmV0dXJuIG59ZnVuY3Rpb24gc1UoKXt9blUucHJvdG90eXBlPXJVLnByb3RvdHlwZT17Y29uc3RydWN0b3I6blUsaGFzOmlVLmhhcyxhZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbJFYrKHQrPSIiKV09dCx0aGlzfSxyZW1vdmU6aVUucmVtb3ZlLGNsZWFyOmlVLmNsZWFyLHZhbHVlczppVS5rZXlzLHNpemU6aVUuc2l6ZSxlbXB0eTppVS5lbXB0eSxlYWNoOmlVLmVhY2h9O3ZhciBsVT0uNyxjVT0xL2xVLHVVPSJcXHMqKFsrLV0/XFxkKylcXHMqIixoVT0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIixkVT0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPyklXFxzKiIscFU9L14jKFswLTlhLWZdezN9KSQvLGZVPS9eIyhbMC05YS1mXXs2fSkkLyxtVT1uZXcgUmVnRXhwKCJecmdiXFwoIitbdVUsdVUsdVVdKyJcXCkkIiksZ1U9bmV3IFJlZ0V4cCgiXnJnYlxcKCIrW2RVLGRVLGRVXSsiXFwpJCIpLF9VPW5ldyBSZWdFeHAoIl5yZ2JhXFwoIitbdVUsdVUsdVUsaFVdKyJcXCkkIikseVU9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tkVSxkVSxkVSxoVV0rIlxcKSQiKSx2VT1uZXcgUmVnRXhwKCJeaHNsXFwoIitbaFUsZFUsZFVdKyJcXCkkIiksYlU9bmV3IFJlZ0V4cCgiXmhzbGFcXCgiK1toVSxkVSxkVSxoVV0rIlxcKSQiKSx4VT17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fTtmdW5jdGlvbiB3VSh0KXt2YXIgZTtyZXR1cm4gdD0odCsiIikudHJpbSgpLnRvTG93ZXJDYXNlKCksKGU9cFUuZXhlYyh0KSk/bmV3IENVKChlPXBhcnNlSW50KGVbMV0sMTYpKT4+OCYxNXxlPj40JjI0MCxlPj40JjE1fDI0MCZlLCgxNSZlKTw8NHwxNSZlLDEpOihlPWZVLmV4ZWModCkpP1NVKHBhcnNlSW50KGVbMV0sMTYpKTooZT1tVS5leGVjKHQpKT9uZXcgQ1UoZVsxXSxlWzJdLGVbM10sMSk6KGU9Z1UuZXhlYyh0KSk/bmV3IENVKDI1NSplWzFdLzEwMCwyNTUqZVsyXS8xMDAsMjU1KmVbM10vMTAwLDEpOihlPV9VLmV4ZWModCkpP01VKGVbMV0sZVsyXSxlWzNdLGVbNF0pOihlPXlVLmV4ZWModCkpP01VKDI1NSplWzFdLzEwMCwyNTUqZVsyXS8xMDAsMjU1KmVbM10vMTAwLGVbNF0pOihlPXZVLmV4ZWModCkpP0FVKGVbMV0sZVsyXS8xMDAsZVszXS8xMDAsMSk6KGU9YlUuZXhlYyh0KSk/QVUoZVsxXSxlWzJdLzEwMCxlWzNdLzEwMCxlWzRdKTp4VS5oYXNPd25Qcm9wZXJ0eSh0KT9TVSh4VVt0XSk6InRyYW5zcGFyZW50Ij09PXQ/bmV3IENVKE5hTixOYU4sTmFOLDApOm51bGx9ZnVuY3Rpb24gU1UodCl7cmV0dXJuIG5ldyBDVSh0Pj4xNiYyNTUsdD4+OCYyNTUsMjU1JnQsMSl9ZnVuY3Rpb24gTVUodCxlLG4saSl7cmV0dXJuIGk8PTAmJih0PWU9bj1OYU4pLG5ldyBDVSh0LGUsbixpKX1mdW5jdGlvbiBFVSh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIHNVfHwodD13VSh0KSksdD9uZXcgQ1UoKHQ9dC5yZ2IoKSkucix0LmcsdC5iLHQub3BhY2l0eSk6bmV3IENVfWZ1bmN0aW9uIFRVKHQsZSxuLGkpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9FVSh0KTpuZXcgQ1UodCxlLG4sbnVsbD09aT8xOmkpfWZ1bmN0aW9uIENVKHQsZSxuLGkpe3RoaXMucj0rdCx0aGlzLmc9K2UsdGhpcy5iPStuLHRoaXMub3BhY2l0eT0raX1mdW5jdGlvbiBBVSh0LGUsbixpKXtyZXR1cm4gaTw9MD90PWU9bj1OYU46bjw9MHx8bj49MT90PWU9TmFOOmU8PTAmJih0PU5hTiksbmV3IFBVKHQsZSxuLGkpfWZ1bmN0aW9uIGtVKHQpe2lmKHQgaW5zdGFuY2VvZiBQVSlyZXR1cm4gbmV3IFBVKHQuaCx0LnMsdC5sLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIHNVfHwodD13VSh0KSksIXQpcmV0dXJuIG5ldyBQVTtpZih0IGluc3RhbmNlb2YgUFUpcmV0dXJuIHQ7dmFyIGU9KHQ9dC5yZ2IoKSkuci8yNTUsbj10LmcvMjU1LGk9dC5iLzI1NSxyPU1hdGgubWluKGUsbixpKSxvPU1hdGgubWF4KGUsbixpKSxhPU5hTixzPW8tcixsPShvK3IpLzI7cmV0dXJuIHM/KGE9ZT09PW8/KG4taSkvcys2KihuPGkpOm49PT1vPyhpLWUpL3MrMjooZS1uKS9zKzQscy89bDwuNT9vK3I6Mi1vLXIsYSo9NjApOnM9bD4wJiZsPDE/MDphLG5ldyBQVShhLHMsbCx0Lm9wYWNpdHkpfWZ1bmN0aW9uIExVKHQsZSxuLGkpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD9rVSh0KTpuZXcgUFUodCxlLG4sbnVsbD09aT8xOmkpfWZ1bmN0aW9uIFBVKHQsZSxuLGkpe3RoaXMuaD0rdCx0aGlzLnM9K2UsdGhpcy5sPStuLHRoaXMub3BhY2l0eT0raX1mdW5jdGlvbiBOVSh0LGUsbil7cmV0dXJuIDI1NSoodDw2MD9lKyhuLWUpKnQvNjA6dDwxODA/bjp0PDI0MD9lKyhuLWUpKigyNDAtdCkvNjA6ZSl9b1Uoc1Usd1Use2Rpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZ2IoKSsiIn19KSxvVShDVSxUVSxhVShzVSx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9jVTpNYXRoLnBvdyhjVSx0KSxuZXcgQ1UodGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/bFU6TWF0aC5wb3cobFUsdCksbmV3IENVKHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiB0aGlzfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybiAwPD10aGlzLnImJnRoaXMucjw9MjU1JiYwPD10aGlzLmcmJnRoaXMuZzw9MjU1JiYwPD10aGlzLmImJnRoaXMuYjw9MjU1JiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0sdG9TdHJpbmc6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX19KSksb1UoUFUsTFUsYVUoc1Use2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/Y1U6TWF0aC5wb3coY1UsdCksbmV3IFBVKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/bFU6TWF0aC5wb3cobFUsdCksbmV3IFBVKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5oJTM2MCszNjAqKHRoaXMuaDwwKSxlPWlzTmFOKHQpfHxpc05hTih0aGlzLnMpPzA6dGhpcy5zLG49dGhpcy5sLGk9bisobjwuNT9uOjEtbikqZSxyPTIqbi1pO3JldHVybiBuZXcgQ1UoTlUodD49MjQwP3QtMjQwOnQrMTIwLHIsaSksTlUodCxyLGkpLE5VKHQ8MTIwP3QrMjQwOnQtMTIwLHIsaSksdGhpcy5vcGFjaXR5KX0sZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4oMDw9dGhpcy5zJiZ0aGlzLnM8PTF8fGlzTmFOKHRoaXMucykpJiYwPD10aGlzLmwmJnRoaXMubDw9MSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9fSkpO3ZhciBJVT1NYXRoLlBJLzE4MCxSVT0xODAvTWF0aC5QSSxPVT0uOTUwNDcselU9MS4wODg4MyxEVT00LzI5LEJVPTYvMjksSFU9MypCVSpCVTtmdW5jdGlvbiBGVSh0KXtpZih0IGluc3RhbmNlb2YgVVUpcmV0dXJuIG5ldyBVVSh0LmwsdC5hLHQuYix0Lm9wYWNpdHkpO2lmKHQgaW5zdGFuY2VvZiAkVSl7dmFyIGU9dC5oKklVO3JldHVybiBuZXcgVVUodC5sLE1hdGguY29zKGUpKnQuYyxNYXRoLnNpbihlKSp0LmMsdC5vcGFjaXR5KX10IGluc3RhbmNlb2YgQ1V8fCh0PUVVKHQpKTt2YXIgbj1xVSh0LnIpLGk9cVUodC5nKSxyPXFVKHQuYiksbz1qVSgoLjQxMjQ1NjQqbisuMzU3NTc2MSppKy4xODA0Mzc1KnIpL09VKSxhPWpVKCguMjEyNjcyOSpuKy43MTUxNTIyKmkrLjA3MjE3NSpyKS8xKTtyZXR1cm4gbmV3IFVVKDExNiphLTE2LDUwMCooby1hKSwyMDAqKGEtalUoKC4wMTkzMzM5Km4rLjExOTE5MippKy45NTAzMDQxKnIpL3pVKSksdC5vcGFjaXR5KX1mdW5jdGlvbiBWVSh0LGUsbixpKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/RlUodCk6bmV3IFVVKHQsZSxuLG51bGw9PWk/MTppKX1mdW5jdGlvbiBVVSh0LGUsbixpKXt0aGlzLmw9K3QsdGhpcy5hPStlLHRoaXMuYj0rbix0aGlzLm9wYWNpdHk9K2l9ZnVuY3Rpb24galUodCl7cmV0dXJuIHQ+LjAwODg1NjQ1MTY3OTAzNTYzMT9NYXRoLnBvdyh0LDEvMyk6dC9IVStEVX1mdW5jdGlvbiBHVSh0KXtyZXR1cm4gdD5CVT90KnQqdDpIVSoodC1EVSl9ZnVuY3Rpb24gV1UodCl7cmV0dXJuIDI1NSoodDw9LjAwMzEzMDg/MTIuOTIqdDoxLjA1NSpNYXRoLnBvdyh0LDEvMi40KS0uMDU1KX1mdW5jdGlvbiBxVSh0KXtyZXR1cm4odC89MjU1KTw9LjA0MDQ1P3QvMTIuOTI6TWF0aC5wb3coKHQrLjA1NSkvMS4wNTUsMi40KX1mdW5jdGlvbiBZVSh0KXtpZih0IGluc3RhbmNlb2YgJFUpcmV0dXJuIG5ldyAkVSh0LmgsdC5jLHQubCx0Lm9wYWNpdHkpO3QgaW5zdGFuY2VvZiBVVXx8KHQ9RlUodCkpO3ZhciBlPU1hdGguYXRhbjIodC5iLHQuYSkqUlU7cmV0dXJuIG5ldyAkVShlPDA/ZSszNjA6ZSxNYXRoLnNxcnQodC5hKnQuYSt0LmIqdC5iKSx0LmwsdC5vcGFjaXR5KX1mdW5jdGlvbiBYVSh0LGUsbixpKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/WVUodCk6bmV3ICRVKHQsZSxuLG51bGw9PWk/MTppKX1mdW5jdGlvbiAkVSh0LGUsbixpKXt0aGlzLmg9K3QsdGhpcy5jPStlLHRoaXMubD0rbix0aGlzLm9wYWNpdHk9K2l9b1UoVVUsVlUsYVUoc1Use2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgVVUodGhpcy5sKzE4KihudWxsPT10PzE6dCksdGhpcy5hLHRoaXMuYix0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBVVSh0aGlzLmwtMTgqKG51bGw9PXQ/MTp0KSx0aGlzLmEsdGhpcy5iLHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3ZhciB0PSh0aGlzLmwrMTYpLzExNixlPWlzTmFOKHRoaXMuYSk/dDp0K3RoaXMuYS81MDAsbj1pc05hTih0aGlzLmIpP3Q6dC10aGlzLmIvMjAwO3JldHVybiB0PTEqR1UodCksbmV3IENVKFdVKDMuMjQwNDU0MiooZT1PVSpHVShlKSktMS41MzcxMzg1KnQtLjQ5ODUzMTQqKG49elUqR1UobikpKSxXVSgtLjk2OTI2NiplKzEuODc2MDEwOCp0Ky4wNDE1NTYqbiksV1UoLjA1NTY0MzQqZS0uMjA0MDI1OSp0KzEuMDU3MjI1MipuKSx0aGlzLm9wYWNpdHkpfX0pKSxvVSgkVSxYVSxhVShzVSx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyAkVSh0aGlzLmgsdGhpcy5jLHRoaXMubCsxOCoobnVsbD09dD8xOnQpLHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3ICRVKHRoaXMuaCx0aGlzLmMsdGhpcy5sLTE4KihudWxsPT10PzE6dCksdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7cmV0dXJuIEZVKHRoaXMpLnJnYigpfX0pKTt2YXIgS1U9LS4xNDg2MSxaVT0xLjc4Mjc3LEpVPS0uMjkyMjcsUVU9LS45MDY0OSx0aj0xLjk3Mjk0LGVqPXRqKlFVLG5qPXRqKlpVLGlqPVpVKkpVLVFVKktVO2Z1bmN0aW9uIHJqKHQpe2lmKHQgaW5zdGFuY2VvZiBhailyZXR1cm4gbmV3IGFqKHQuaCx0LnMsdC5sLHQub3BhY2l0eSk7dCBpbnN0YW5jZW9mIENVfHwodD1FVSh0KSk7dmFyIGU9dC5nLzI1NSxuPXQuYi8yNTUsaT0oaWoqbitlaioodC5yLzI1NSktbmoqZSkvLTUuOTYxNTEyMjkxMixyPW4taSxvPSh0aiooZS1pKS1KVSpyKS9RVSxhPU1hdGguc3FydChvKm8rcipyKS8odGoqaSooMS1pKSkscz1hP01hdGguYXRhbjIobyxyKSpSVS0xMjA6TmFOO3JldHVybiBuZXcgYWooczwwP3MrMzYwOnMsYSxpLHQub3BhY2l0eSl9ZnVuY3Rpb24gb2oodCxlLG4saSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP3JqKHQpOm5ldyBhaih0LGUsbixudWxsPT1pPzE6aSl9ZnVuY3Rpb24gYWoodCxlLG4saSl7dGhpcy5oPSt0LHRoaXMucz0rZSx0aGlzLmw9K24sdGhpcy5vcGFjaXR5PStpfW9VKGFqLG9qLGFVKHNVLHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10P2NVOk1hdGgucG93KGNVLHQpLG5ldyBhaih0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10P2xVOk1hdGgucG93KGxVLHQpLG5ldyBhaih0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3ZhciB0PWlzTmFOKHRoaXMuaCk/MDoodGhpcy5oKzEyMCkqSVUsZT0rdGhpcy5sLG49aXNOYU4odGhpcy5zKT8wOnRoaXMucyplKigxLWUpLGk9TWF0aC5jb3ModCkscj1NYXRoLnNpbih0KTtyZXR1cm4gbmV3IENVKDI1NSooZStuKihLVSppK1pVKnIpKSwyNTUqKGUrbiooSlUqaStRVSpyKSksMjU1KihlK24qKHRqKmkpKSx0aGlzLm9wYWNpdHkpfX0pKTt2YXIgc2o9e3ZhbHVlOmZ1bmN0aW9uKCl7fX07ZnVuY3Rpb24gbGooKXtmb3IodmFyIHQsZT0wLG49YXJndW1lbnRzLmxlbmd0aCxpPXt9O2U8bjsrK2Upe2lmKCEodD1hcmd1bWVudHNbZV0rIiIpfHx0IGluIGkpdGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIHR5cGU6ICIrdCk7aVt0XT1bXX1yZXR1cm4gbmV3IGNqKGkpfWZ1bmN0aW9uIGNqKHQpe3RoaXMuXz10fWZ1bmN0aW9uIHVqKHQsZSl7cmV0dXJuIHQudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcCgoZnVuY3Rpb24odCl7dmFyIG49IiIsaT10LmluZGV4T2YoIi4iKTtpZihpPj0wJiYobj10LnNsaWNlKGkrMSksdD10LnNsaWNlKDAsaSkpLHQmJiFlLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO3JldHVybnt0eXBlOnQsbmFtZTpufX0pKX1mdW5jdGlvbiBoaih0LGUpe2Zvcih2YXIgbixpPTAscj10Lmxlbmd0aDtpPHI7KytpKWlmKChuPXRbaV0pLm5hbWU9PT1lKXJldHVybiBuLnZhbHVlfWZ1bmN0aW9uIGRqKHQsZSxuKXtmb3IodmFyIGk9MCxyPXQubGVuZ3RoO2k8cjsrK2kpaWYodFtpXS5uYW1lPT09ZSl7dFtpXT1zaix0PXQuc2xpY2UoMCxpKS5jb25jYXQodC5zbGljZShpKzEpKTticmVha31yZXR1cm4gbnVsbCE9biYmdC5wdXNoKHtuYW1lOmUsdmFsdWU6bn0pLHR9Y2oucHJvdG90eXBlPWxqLnByb3RvdHlwZT17Y29uc3RydWN0b3I6Y2osb246ZnVuY3Rpb24odCxlKXt2YXIgbixpPXRoaXMuXyxyPXVqKHQrIiIsaSksbz0tMSxhPXIubGVuZ3RoO2lmKCEoYXJndW1lbnRzLmxlbmd0aDwyKSl7aWYobnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrOiAiK2UpO2Zvcig7KytvPGE7KWlmKG49KHQ9cltvXSkudHlwZSlpW25dPWRqKGlbbl0sdC5uYW1lLGUpO2Vsc2UgaWYobnVsbD09ZSlmb3IobiBpbiBpKWlbbl09ZGooaVtuXSx0Lm5hbWUsbnVsbCk7cmV0dXJuIHRoaXN9Zm9yKDsrK288YTspaWYoKG49KHQ9cltvXSkudHlwZSkmJihuPWhqKGlbbl0sdC5uYW1lKSkpcmV0dXJuIG59LGNvcHk6ZnVuY3Rpb24oKXt2YXIgdD17fSxlPXRoaXMuXztmb3IodmFyIG4gaW4gZSl0W25dPWVbbl0uc2xpY2UoKTtyZXR1cm4gbmV3IGNqKHQpfSxjYWxsOmZ1bmN0aW9uKHQsZSl7aWYoKG49YXJndW1lbnRzLmxlbmd0aC0yKT4wKWZvcih2YXIgbixpLHI9bmV3IEFycmF5KG4pLG89MDtvPG47KytvKXJbb109YXJndW1lbnRzW28rMl07aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3Iobz0wLG49KGk9dGhpcy5fW3RdKS5sZW5ndGg7bzxuOysrbylpW29dLnZhbHVlLmFwcGx5KGUscil9LGFwcGx5OmZ1bmN0aW9uKHQsZSxuKXtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO2Zvcih2YXIgaT10aGlzLl9bdF0scj0wLG89aS5sZW5ndGg7cjxvOysrcilpW3JdLnZhbHVlLmFwcGx5KGUsbil9fTt2YXIgcGo9e3ZhbHVlOmZ1bmN0aW9uKCl7fX07ZnVuY3Rpb24gZmooKXtmb3IodmFyIHQsZT0wLG49YXJndW1lbnRzLmxlbmd0aCxpPXt9O2U8bjsrK2Upe2lmKCEodD1hcmd1bWVudHNbZV0rIiIpfHx0IGluIGl8fC9bXHMuXS8udGVzdCh0KSl0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgdHlwZTogIit0KTtpW3RdPVtdfXJldHVybiBuZXcgbWooaSl9ZnVuY3Rpb24gbWoodCl7dGhpcy5fPXR9ZnVuY3Rpb24gZ2oodCxlKXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLykubWFwKChmdW5jdGlvbih0KXt2YXIgbj0iIixpPXQuaW5kZXhPZigiLiIpO2lmKGk+PTAmJihuPXQuc2xpY2UoaSsxKSx0PXQuc2xpY2UoMCxpKSksdCYmIWUuaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7cmV0dXJue3R5cGU6dCxuYW1lOm59fSkpfWZ1bmN0aW9uIF9qKHQsZSl7Zm9yKHZhciBuLGk9MCxyPXQubGVuZ3RoO2k8cjsrK2kpaWYoKG49dFtpXSkubmFtZT09PWUpcmV0dXJuIG4udmFsdWV9ZnVuY3Rpb24geWoodCxlLG4pe2Zvcih2YXIgaT0wLHI9dC5sZW5ndGg7aTxyOysraSlpZih0W2ldLm5hbWU9PT1lKXt0W2ldPXBqLHQ9dC5zbGljZSgwLGkpLmNvbmNhdCh0LnNsaWNlKGkrMSkpO2JyZWFrfXJldHVybiBudWxsIT1uJiZ0LnB1c2goe25hbWU6ZSx2YWx1ZTpufSksdH1tai5wcm90b3R5cGU9ZmoucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjptaixvbjpmdW5jdGlvbih0LGUpe3ZhciBuLGk9dGhpcy5fLHI9Z2oodCsiIixpKSxvPS0xLGE9ci5sZW5ndGg7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtpZihudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIrZSk7Zm9yKDsrK288YTspaWYobj0odD1yW29dKS50eXBlKWlbbl09eWooaVtuXSx0Lm5hbWUsZSk7ZWxzZSBpZihudWxsPT1lKWZvcihuIGluIGkpaVtuXT15aihpW25dLHQubmFtZSxudWxsKTtyZXR1cm4gdGhpc31mb3IoOysrbzxhOylpZigobj0odD1yW29dKS50eXBlKSYmKG49X2ooaVtuXSx0Lm5hbWUpKSlyZXR1cm4gbn0sY29weTpmdW5jdGlvbigpe3ZhciB0PXt9LGU9dGhpcy5fO2Zvcih2YXIgbiBpbiBlKXRbbl09ZVtuXS5zbGljZSgpO3JldHVybiBuZXcgbWoodCl9LGNhbGw6ZnVuY3Rpb24odCxlKXtpZigobj1hcmd1bWVudHMubGVuZ3RoLTIpPjApZm9yKHZhciBuLGkscj1uZXcgQXJyYXkobiksbz0wO288bjsrK28pcltvXT1hcmd1bWVudHNbbysyXTtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO2ZvcihvPTAsbj0oaT10aGlzLl9bdF0pLmxlbmd0aDtvPG47KytvKWlbb10udmFsdWUuYXBwbHkoZSxyKX0sYXBwbHk6ZnVuY3Rpb24odCxlLG4pe2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7Zm9yKHZhciBpPXRoaXMuX1t0XSxyPTAsbz1pLmxlbmd0aDtyPG87KytyKWlbcl0udmFsdWUuYXBwbHkoZSxuKX19O3ZhciB2aj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsYmo9e3N2ZzoiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLHhodG1sOnZqLHhsaW5rOiJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIix4bWw6Imh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIseG1sbnM6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIn07ZnVuY3Rpb24geGoodCl7dmFyIGU9dCs9IiIsbj1lLmluZGV4T2YoIjoiKTtyZXR1cm4gbj49MCYmInhtbG5zIiE9PShlPXQuc2xpY2UoMCxuKSkmJih0PXQuc2xpY2UobisxKSksYmouaGFzT3duUHJvcGVydHkoZSk/e3NwYWNlOmJqW2VdLGxvY2FsOnR9OnR9ZnVuY3Rpb24gd2oodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vd25lckRvY3VtZW50LG49dGhpcy5uYW1lc3BhY2VVUkk7cmV0dXJuIG49PT12aiYmZS5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJPT09dmo/ZS5jcmVhdGVFbGVtZW50KHQpOmUuY3JlYXRlRWxlbWVudE5TKG4sdCl9fWZ1bmN0aW9uIFNqKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIE1qKHQpe3ZhciBlPXhqKHQpO3JldHVybihlLmxvY2FsP1NqOndqKShlKX1mdW5jdGlvbiBFaigpe31mdW5jdGlvbiBUaih0KXtyZXR1cm4gbnVsbD09dD9FajpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3IodCl9fWZ1bmN0aW9uIENqKCl7cmV0dXJuW119ZnVuY3Rpb24gQWoodCl7cmV0dXJuIG5ldyBBcnJheSh0Lmxlbmd0aCl9ZnVuY3Rpb24ga2oodCxlKXt0aGlzLm93bmVyRG9jdW1lbnQ9dC5vd25lckRvY3VtZW50LHRoaXMubmFtZXNwYWNlVVJJPXQubmFtZXNwYWNlVVJJLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9wYXJlbnQ9dCx0aGlzLl9fZGF0YV9fPWV9a2oucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpraixhcHBlbmRDaGlsZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LHRoaXMuX25leHQpfSxpbnNlcnRCZWZvcmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZSh0LGUpfSxxdWVyeVNlbGVjdG9yOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3Rvcih0KX0scXVlcnlTZWxlY3RvckFsbDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwodCl9fTtmdW5jdGlvbiBMaih0LGUsbixpLHIsbyl7Zm9yKHZhciBhLHM9MCxsPWUubGVuZ3RoLGM9by5sZW5ndGg7czxjOysrcykoYT1lW3NdKT8oYS5fX2RhdGFfXz1vW3NdLGlbc109YSk6bltzXT1uZXcga2oodCxvW3NdKTtmb3IoO3M8bDsrK3MpKGE9ZVtzXSkmJihyW3NdPWEpfWZ1bmN0aW9uIFBqKHQsZSxuLGkscixvLGEpe3ZhciBzLGwsYyx1PXt9LGg9ZS5sZW5ndGgsZD1vLmxlbmd0aCxwPW5ldyBBcnJheShoKTtmb3Iocz0wO3M8aDsrK3MpKGw9ZVtzXSkmJihwW3NdPWM9IiQiK2EuY2FsbChsLGwuX19kYXRhX18scyxlKSxjIGluIHU/cltzXT1sOnVbY109bCk7Zm9yKHM9MDtzPGQ7KytzKShsPXVbYz0iJCIrYS5jYWxsKHQsb1tzXSxzLG8pXSk/KGlbc109bCxsLl9fZGF0YV9fPW9bc10sdVtjXT1udWxsKTpuW3NdPW5ldyBraih0LG9bc10pO2ZvcihzPTA7czxoOysrcykobD1lW3NdKSYmdVtwW3NdXT09PWwmJihyW3NdPWwpfWZ1bmN0aW9uIE5qKHQsZSl7cmV0dXJuIHQ8ZT8tMTp0PmU/MTp0Pj1lPzA6TmFOfWZ1bmN0aW9uIElqKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX1mdW5jdGlvbiBSaih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIE9qKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zZXRBdHRyaWJ1dGUodCxlKX19ZnVuY3Rpb24gemoodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxlKX19ZnVuY3Rpb24gRGoodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1uP3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpOnRoaXMuc2V0QXR0cmlidXRlKHQsbil9fWZ1bmN0aW9uIEJqKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09bj90aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk6dGhpcy5zZXRBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwsbil9fWZ1bmN0aW9uIEhqKHQpe3JldHVybiB0Lm93bmVyRG9jdW1lbnQmJnQub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlld3x8dC5kb2N1bWVudCYmdHx8dC5kZWZhdWx0Vmlld31mdW5jdGlvbiBGaih0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfX1mdW5jdGlvbiBWaih0LGUsbil7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSh0LGUsbil9fWZ1bmN0aW9uIFVqKHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgaT1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1pP3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCk6dGhpcy5zdHlsZS5zZXRQcm9wZXJ0eSh0LGksbil9fWZ1bmN0aW9uIGpqKHQsZSl7cmV0dXJuIHQuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShlKXx8SGoodCkuZ2V0Q29tcHV0ZWRTdHlsZSh0LG51bGwpLmdldFByb3BlcnR5VmFsdWUoZSl9ZnVuY3Rpb24gR2oodCl7cmV0dXJuIGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbdF19fWZ1bmN0aW9uIFdqKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpc1t0XT1lfX1mdW5jdGlvbiBxaih0LGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PW4/ZGVsZXRlIHRoaXNbdF06dGhpc1t0XT1ufX1mdW5jdGlvbiBZaih0KXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLyl9ZnVuY3Rpb24gWGoodCl7cmV0dXJuIHQuY2xhc3NMaXN0fHxuZXcgJGoodCl9ZnVuY3Rpb24gJGoodCl7dGhpcy5fbm9kZT10LHRoaXMuX25hbWVzPVlqKHQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9ZnVuY3Rpb24gS2oodCxlKXtmb3IodmFyIG49WGoodCksaT0tMSxyPWUubGVuZ3RoOysraTxyOyluLmFkZChlW2ldKX1mdW5jdGlvbiBaaih0LGUpe2Zvcih2YXIgbj1Yaih0KSxpPS0xLHI9ZS5sZW5ndGg7KytpPHI7KW4ucmVtb3ZlKGVbaV0pfWZ1bmN0aW9uIEpqKHQpe3JldHVybiBmdW5jdGlvbigpe0tqKHRoaXMsdCl9fWZ1bmN0aW9uIFFqKHQpe3JldHVybiBmdW5jdGlvbigpe1pqKHRoaXMsdCl9fWZ1bmN0aW9uIHRHKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7KGUuYXBwbHkodGhpcyxhcmd1bWVudHMpP0tqOlpqKSh0aGlzLHQpfX1mdW5jdGlvbiBlRygpe3RoaXMudGV4dENvbnRlbnQ9IiJ9ZnVuY3Rpb24gbkcodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy50ZXh0Q29udGVudD10fX1mdW5jdGlvbiBpRyh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PWU/IiI6ZX19ZnVuY3Rpb24gckcoKXt0aGlzLmlubmVySFRNTD0iIn1mdW5jdGlvbiBvRyh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLmlubmVySFRNTD10fX1mdW5jdGlvbiBhRyh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10LmFwcGx5KHRoaXMsYXJndW1lbnRzKTt0aGlzLmlubmVySFRNTD1udWxsPT1lPyIiOmV9fWZ1bmN0aW9uIHNHKCl7dGhpcy5uZXh0U2libGluZyYmdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpfWZ1bmN0aW9uIGxHKCl7dGhpcy5wcmV2aW91c1NpYmxpbmcmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcyx0aGlzLnBhcmVudE5vZGUuZmlyc3RDaGlsZCl9ZnVuY3Rpb24gY0coKXtyZXR1cm4gbnVsbH1mdW5jdGlvbiB1Rygpe3ZhciB0PXRoaXMucGFyZW50Tm9kZTt0JiZ0LnJlbW92ZUNoaWxkKHRoaXMpfWZ1bmN0aW9uIGhHKCl7dmFyIHQ9dGhpcy5jbG9uZU5vZGUoITEpLGU9dGhpcy5wYXJlbnROb2RlO3JldHVybiBlP2UuaW5zZXJ0QmVmb3JlKHQsdGhpcy5uZXh0U2libGluZyk6dH1mdW5jdGlvbiBkRygpe3ZhciB0PXRoaXMuY2xvbmVOb2RlKCEwKSxlPXRoaXMucGFyZW50Tm9kZTtyZXR1cm4gZT9lLmluc2VydEJlZm9yZSh0LHRoaXMubmV4dFNpYmxpbmcpOnR9JGoucHJvdG90eXBlPXthZGQ6ZnVuY3Rpb24odCl7dGhpcy5fbmFtZXMuaW5kZXhPZih0KTwwJiYodGhpcy5fbmFtZXMucHVzaCh0KSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbmFtZXMuaW5kZXhPZih0KTtlPj0wJiYodGhpcy5fbmFtZXMuc3BsaWNlKGUsMSksdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLl9uYW1lcy5qb2luKCIgIikpKX0sY29udGFpbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YodCk+PTB9fTt2YXIgcEc9e30sZkc9bnVsbDsidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiYoIm9ubW91c2VlbnRlciJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fChwRz17bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9KSk7ZnVuY3Rpb24gbUcodCxlLG4pe3JldHVybiB0PWdHKHQsZSxuKSxmdW5jdGlvbihlKXt2YXIgbj1lLnJlbGF0ZWRUYXJnZXQ7biYmKG49PT10aGlzfHw4Jm4uY29tcGFyZURvY3VtZW50UG9zaXRpb24odGhpcykpfHx0LmNhbGwodGhpcyxlKX19ZnVuY3Rpb24gZ0codCxlLG4pe3JldHVybiBmdW5jdGlvbihpKXt2YXIgcj1mRztmRz1pO3RyeXt0LmNhbGwodGhpcyx0aGlzLl9fZGF0YV9fLGUsbil9ZmluYWxseXtmRz1yfX19ZnVuY3Rpb24gX0codCl7cmV0dXJuIHQudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcCgoZnVuY3Rpb24odCl7dmFyIGU9IiIsbj10LmluZGV4T2YoIi4iKTtyZXR1cm4gbj49MCYmKGU9dC5zbGljZShuKzEpLHQ9dC5zbGljZSgwLG4pKSx7dHlwZTp0LG5hbWU6ZX19KSl9ZnVuY3Rpb24geUcodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fX29uO2lmKGUpe2Zvcih2YXIgbixpPTAscj0tMSxvPWUubGVuZ3RoO2k8bzsrK2kpbj1lW2ldLHQudHlwZSYmbi50eXBlIT09dC50eXBlfHxuLm5hbWUhPT10Lm5hbWU/ZVsrK3JdPW46dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG4udHlwZSxuLmxpc3RlbmVyLG4uY2FwdHVyZSk7KytyP2UubGVuZ3RoPXI6ZGVsZXRlIHRoaXMuX19vbn19fWZ1bmN0aW9uIHZHKHQsZSxuKXt2YXIgaT1wRy5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpP21HOmdHO3JldHVybiBmdW5jdGlvbihyLG8sYSl7dmFyIHMsbD10aGlzLl9fb24sYz1pKGUsbyxhKTtpZihsKWZvcih2YXIgdT0wLGg9bC5sZW5ndGg7dTxoOysrdSlpZigocz1sW3VdKS50eXBlPT09dC50eXBlJiZzLm5hbWU9PT10Lm5hbWUpcmV0dXJuIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihzLnR5cGUscy5saXN0ZW5lcixzLmNhcHR1cmUpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihzLnR5cGUscy5saXN0ZW5lcj1jLHMuY2FwdHVyZT1uKSx2b2lkKHMudmFsdWU9ZSk7dGhpcy5hZGRFdmVudExpc3RlbmVyKHQudHlwZSxjLG4pLHM9e3R5cGU6dC50eXBlLG5hbWU6dC5uYW1lLHZhbHVlOmUsbGlzdGVuZXI6YyxjYXB0dXJlOm59LGw/bC5wdXNoKHMpOnRoaXMuX19vbj1bc119fWZ1bmN0aW9uIGJHKHQsZSxuLGkpe3ZhciByPWZHO3Quc291cmNlRXZlbnQ9ZkcsZkc9dDt0cnl7cmV0dXJuIGUuYXBwbHkobixpKX1maW5hbGx5e2ZHPXJ9fWZ1bmN0aW9uIHhHKHQsZSxuKXt2YXIgaT1Iaih0KSxyPWkuQ3VzdG9tRXZlbnQ7ImZ1bmN0aW9uIj09dHlwZW9mIHI/cj1uZXcgcihlLG4pOihyPWkuZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50Iiksbj8oci5pbml0RXZlbnQoZSxuLmJ1YmJsZXMsbi5jYW5jZWxhYmxlKSxyLmRldGFpbD1uLmRldGFpbCk6ci5pbml0RXZlbnQoZSwhMSwhMSkpLHQuZGlzcGF0Y2hFdmVudChyKX1mdW5jdGlvbiB3Ryh0LGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB4Ryh0aGlzLHQsZSl9fWZ1bmN0aW9uIFNHKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHhHKHRoaXMsdCxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fXZhciBNRz1bbnVsbF07ZnVuY3Rpb24gRUcodCxlKXt0aGlzLl9ncm91cHM9dCx0aGlzLl9wYXJlbnRzPWV9ZnVuY3Rpb24gVEcodCl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiB0P25ldyBFRyhbW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IodCldXSxbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSk6bmV3IEVHKFtbdF1dLE1HKX1mdW5jdGlvbiBDRygpe2Zvcih2YXIgdCxlPWZHO3Q9ZS5zb3VyY2VFdmVudDspZT10O3JldHVybiBlfWZ1bmN0aW9uIEFHKHQsZSl7dmFyIG49dC5vd25lclNWR0VsZW1lbnR8fHQ7aWYobi5jcmVhdGVTVkdQb2ludCl7dmFyIGk9bi5jcmVhdGVTVkdQb2ludCgpO3JldHVybiBpLng9ZS5jbGllbnRYLGkueT1lLmNsaWVudFksWyhpPWkubWF0cml4VHJhbnNmb3JtKHQuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKSkueCxpLnldfXZhciByPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuW2UuY2xpZW50WC1yLmxlZnQtdC5jbGllbnRMZWZ0LGUuY2xpZW50WS1yLnRvcC10LmNsaWVudFRvcF19ZnVuY3Rpb24ga0codCl7dmFyIGU9Q0coKTtyZXR1cm4gZS5jaGFuZ2VkVG91Y2hlcyYmKGU9ZS5jaGFuZ2VkVG91Y2hlc1swXSksQUcodCxlKX1mdW5jdGlvbiBMRyh0LGUsbil7YXJndW1lbnRzLmxlbmd0aDwzJiYobj1lLGU9Q0coKS5jaGFuZ2VkVG91Y2hlcyk7Zm9yKHZhciBpLHI9MCxvPWU/ZS5sZW5ndGg6MDtyPG87KytyKWlmKChpPWVbcl0pLmlkZW50aWZpZXI9PT1uKXJldHVybiBBRyh0LGkpO3JldHVybiBudWxsfWZ1bmN0aW9uIFBHKCl7Zkcuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gTkcoKXtmRy5wcmV2ZW50RGVmYXVsdCgpLGZHLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfWZ1bmN0aW9uIElHKHQpe3ZhciBlPXQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LG49VEcodCkub24oImRyYWdzdGFydC5kcmFnIixORywhMCk7Im9uc2VsZWN0c3RhcnQiaW4gZT9uLm9uKCJzZWxlY3RzdGFydC5kcmFnIixORywhMCk6KGUuX19ub3NlbGVjdD1lLnN0eWxlLk1velVzZXJTZWxlY3QsZS5zdHlsZS5Nb3pVc2VyU2VsZWN0PSJub25lIil9ZnVuY3Rpb24gUkcodCxlKXt2YXIgbj10LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxpPVRHKHQpLm9uKCJkcmFnc3RhcnQuZHJhZyIsbnVsbCk7ZSYmKGkub24oImNsaWNrLmRyYWciLE5HLCEwKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2kub24oImNsaWNrLmRyYWciLG51bGwpfSksMCkpLCJvbnNlbGVjdHN0YXJ0ImluIG4/aS5vbigic2VsZWN0c3RhcnQuZHJhZyIsbnVsbCk6KG4uc3R5bGUuTW96VXNlclNlbGVjdD1uLl9fbm9zZWxlY3QsZGVsZXRlIG4uX19ub3NlbGVjdCl9ZnVuY3Rpb24gT0codCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIHpHKHQsZSxuLGkscixvLGEscyxsLGMpe3RoaXMudGFyZ2V0PXQsdGhpcy50eXBlPWUsdGhpcy5zdWJqZWN0PW4sdGhpcy5pZGVudGlmaWVyPWksdGhpcy5hY3RpdmU9cix0aGlzLng9byx0aGlzLnk9YSx0aGlzLmR4PXMsdGhpcy5keT1sLHRoaXMuXz1jfWZ1bmN0aW9uIERHKCl7cmV0dXJuIWZHLmJ1dHRvbn1mdW5jdGlvbiBCRygpe3JldHVybiB0aGlzLnBhcmVudE5vZGV9ZnVuY3Rpb24gSEcodCl7cmV0dXJuIG51bGw9PXQ/e3g6ZkcueCx5OmZHLnl9OnR9ZnVuY3Rpb24gRkcoKXtyZXR1cm4ib250b3VjaHN0YXJ0ImluIHRoaXN9RUcucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpFRyxzZWxlY3Q6ZnVuY3Rpb24gVkcodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVRqKHQpKTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49ZS5sZW5ndGgsaT1uZXcgQXJyYXkobikscj0wO3I8bjsrK3IpZm9yKHZhciBvLGEscz1lW3JdLGw9cy5sZW5ndGgsYz1pW3JdPW5ldyBBcnJheShsKSx1PTA7dTxsOysrdSkobz1zW3VdKSYmKGE9dC5jYWxsKG8sby5fX2RhdGFfXyx1LHMpKSYmKCJfX2RhdGFfXyJpbiBvJiYoYS5fX2RhdGFfXz1vLl9fZGF0YV9fKSxjW3VdPWEpO3JldHVybiBuZXcgRUcoaSx0aGlzLl9wYXJlbnRzKX0sc2VsZWN0QWxsOmZ1bmN0aW9uIFVHKHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD0oZnVuY3Rpb24gZSh0KXtyZXR1cm4gbnVsbD09dD9DajpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwodCl9fSkodCkpO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsaT1uLmxlbmd0aCxyPVtdLG89W10sYT0wO2E8aTsrK2EpZm9yKHZhciBzLGw9blthXSxjPWwubGVuZ3RoLHU9MDt1PGM7Kyt1KShzPWxbdV0pJiYoci5wdXNoKHQuY2FsbChzLHMuX19kYXRhX18sdSxsKSksby5wdXNoKHMpKTtyZXR1cm4gbmV3IEVHKHIsbyl9LGZpbHRlcjpmdW5jdGlvbiBqRyh0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9KGZ1bmN0aW9uIGUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWF0Y2hlcyh0KX19KSh0KSk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxpPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGkpLG89MDtvPGk7KytvKWZvcih2YXIgYSxzPW5bb10sbD1zLmxlbmd0aCxjPXJbb109W10sdT0wO3U8bDsrK3UpKGE9c1t1XSkmJnQuY2FsbChhLGEuX19kYXRhX18sdSxzKSYmYy5wdXNoKGEpO3JldHVybiBuZXcgRUcocix0aGlzLl9wYXJlbnRzKX0sZGF0YTpmdW5jdGlvbiBHRyh0LGUpe2lmKCF0KXJldHVybiBmPW5ldyBBcnJheSh0aGlzLnNpemUoKSksdT0tMSx0aGlzLmVhY2goKGZ1bmN0aW9uKHQpe2ZbKyt1XT10fSkpLGY7dmFyIG49ZT9QajpMaixpPXRoaXMuX3BhcmVudHMscj10aGlzLl9ncm91cHM7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PShmdW5jdGlvbiBvKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0pKHQpKTtmb3IodmFyIGE9ci5sZW5ndGgscz1uZXcgQXJyYXkoYSksbD1uZXcgQXJyYXkoYSksYz1uZXcgQXJyYXkoYSksdT0wO3U8YTsrK3Upe3ZhciBoPWlbdV0sZD1yW3VdLHA9ZC5sZW5ndGgsZj10LmNhbGwoaCxoJiZoLl9fZGF0YV9fLHUsaSksbT1mLmxlbmd0aCxnPWxbdV09bmV3IEFycmF5KG0pLF89c1t1XT1uZXcgQXJyYXkobSk7bihoLGQsZyxfLGNbdV09bmV3IEFycmF5KHApLGYsZSk7Zm9yKHZhciB5LHYsYj0wLHg9MDtiPG07KytiKWlmKHk9Z1tiXSl7Zm9yKGI+PXgmJih4PWIrMSk7ISh2PV9beF0pJiYrK3g8bTspO3kuX25leHQ9dnx8bnVsbH19cmV0dXJuKHM9bmV3IEVHKHMsaSkpLl9lbnRlcj1sLHMuX2V4aXQ9YyxzfSxlbnRlcjpmdW5jdGlvbiBXRygpe3JldHVybiBuZXcgRUcodGhpcy5fZW50ZXJ8fHRoaXMuX2dyb3Vwcy5tYXAoQWopLHRoaXMuX3BhcmVudHMpfSxleGl0OmZ1bmN0aW9uIHFHKCl7cmV0dXJuIG5ldyBFRyh0aGlzLl9leGl0fHx0aGlzLl9ncm91cHMubWFwKEFqKSx0aGlzLl9wYXJlbnRzKX0sam9pbjpmdW5jdGlvbiBZRyh0LGUsbil7dmFyIGk9dGhpcy5lbnRlcigpLHI9dGhpcyxvPXRoaXMuZXhpdCgpO3JldHVybiBpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3QoaSk6aS5hcHBlbmQodCsiIiksbnVsbCE9ZSYmKHI9ZShyKSksbnVsbD09bj9vLnJlbW92ZSgpOm4obyksaSYmcj9pLm1lcmdlKHIpLm9yZGVyKCk6cn0sbWVyZ2U6ZnVuY3Rpb24gWEcodCl7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPXQuX2dyb3VwcyxpPWUubGVuZ3RoLHI9TWF0aC5taW4oaSxuLmxlbmd0aCksbz1uZXcgQXJyYXkoaSksYT0wO2E8cjsrK2EpZm9yKHZhciBzLGw9ZVthXSxjPW5bYV0sdT1sLmxlbmd0aCxoPW9bYV09bmV3IEFycmF5KHUpLGQ9MDtkPHU7KytkKShzPWxbZF18fGNbZF0pJiYoaFtkXT1zKTtmb3IoO2E8aTsrK2Epb1thXT1lW2FdO3JldHVybiBuZXcgRUcobyx0aGlzLl9wYXJlbnRzKX0sb3JkZXI6ZnVuY3Rpb24gJEcoKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLGU9LTEsbj10Lmxlbmd0aDsrK2U8bjspZm9yKHZhciBpLHI9dFtlXSxvPXIubGVuZ3RoLTEsYT1yW29dOy0tbz49MDspKGk9cltvXSkmJihhJiY0XmkuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYSkmJmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaSxhKSxhPWkpO3JldHVybiB0aGlzfSxzb3J0OmZ1bmN0aW9uIEtHKHQpe2Z1bmN0aW9uIGUoZSxuKXtyZXR1cm4gZSYmbj90KGUuX19kYXRhX18sbi5fX2RhdGFfXyk6IWUtIW59dHx8KHQ9TmopO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsaT1uLmxlbmd0aCxyPW5ldyBBcnJheShpKSxvPTA7bzxpOysrbyl7Zm9yKHZhciBhLHM9bltvXSxsPXMubGVuZ3RoLGM9cltvXT1uZXcgQXJyYXkobCksdT0wO3U8bDsrK3UpKGE9c1t1XSkmJihjW3VdPWEpO2Muc29ydChlKX1yZXR1cm4gbmV3IEVHKHIsdGhpcy5fcGFyZW50cykub3JkZXIoKX0sY2FsbDpmdW5jdGlvbiBaRygpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gYXJndW1lbnRzWzBdPXRoaXMsdC5hcHBseShudWxsLGFyZ3VtZW50cyksdGhpc30sbm9kZXM6ZnVuY3Rpb24gSkcoKXt2YXIgdD1uZXcgQXJyYXkodGhpcy5zaXplKCkpLGU9LTE7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXt0WysrZV09dGhpc30pKSx0fSxub2RlOmZ1bmN0aW9uIFFHKCl7Zm9yKHZhciB0PXRoaXMuX2dyb3VwcyxlPTAsbj10Lmxlbmd0aDtlPG47KytlKWZvcih2YXIgaT10W2VdLHI9MCxvPWkubGVuZ3RoO3I8bzsrK3Ipe3ZhciBhPWlbcl07aWYoYSlyZXR1cm4gYX1yZXR1cm4gbnVsbH0sc2l6ZTpmdW5jdGlvbiB0Vygpe3ZhciB0PTA7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXsrK3R9KSksdH0sZW1wdHk6ZnVuY3Rpb24gZVcoKXtyZXR1cm4hdGhpcy5ub2RlKCl9LGVhY2g6ZnVuY3Rpb24gblcodCl7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPTAsaT1lLmxlbmd0aDtuPGk7KytuKWZvcih2YXIgcixvPWVbbl0sYT0wLHM9by5sZW5ndGg7YTxzOysrYSkocj1vW2FdKSYmdC5jYWxsKHIsci5fX2RhdGFfXyxhLG8pO3JldHVybiB0aGlzfSxhdHRyOmZ1bmN0aW9uIGlXKHQsZSl7dmFyIG49eGoodCk7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXt2YXIgaT10aGlzLm5vZGUoKTtyZXR1cm4gbi5sb2NhbD9pLmdldEF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCk6aS5nZXRBdHRyaWJ1dGUobil9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09ZT9uLmxvY2FsP1JqOklqOiJmdW5jdGlvbiI9PXR5cGVvZiBlP24ubG9jYWw/Qmo6RGo6bi5sb2NhbD96ajpPaikobixlKSl9LHN0eWxlOmZ1bmN0aW9uIHJXKHQsZSxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09ZT9GajoiZnVuY3Rpb24iPT10eXBlb2YgZT9VajpWaikodCxlLG51bGw9PW4/IiI6bikpOmpqKHRoaXMubm9kZSgpLHQpfSxwcm9wZXJ0eTpmdW5jdGlvbiBvVyh0LGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/dGhpcy5lYWNoKChudWxsPT1lP0dqOiJmdW5jdGlvbiI9PXR5cGVvZiBlP3FqOldqKSh0LGUpKTp0aGlzLm5vZGUoKVt0XX0sY2xhc3NlZDpmdW5jdGlvbiBhVyh0LGUpe3ZhciBuPVlqKHQrIiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHZhciBpPVhqKHRoaXMubm9kZSgpKSxyPS0xLG89bi5sZW5ndGg7KytyPG87KWlmKCFpLmNvbnRhaW5zKG5bcl0pKXJldHVybiExO3JldHVybiEwfXJldHVybiB0aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiBlP3RHOmU/Smo6UWopKG4sZSkpfSx0ZXh0OmZ1bmN0aW9uIHNXKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChudWxsPT10P2VHOigiZnVuY3Rpb24iPT10eXBlb2YgdD9pRzpuRykodCkpOnRoaXMubm9kZSgpLnRleHRDb250ZW50fSxodG1sOmZ1bmN0aW9uIGxXKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChudWxsPT10P3JHOigiZnVuY3Rpb24iPT10eXBlb2YgdD9hRzpvRykodCkpOnRoaXMubm9kZSgpLmlubmVySFRNTH0scmFpc2U6ZnVuY3Rpb24gY1coKXtyZXR1cm4gdGhpcy5lYWNoKHNHKX0sbG93ZXI6ZnVuY3Rpb24gdVcoKXtyZXR1cm4gdGhpcy5lYWNoKGxHKX0sYXBwZW5kOmZ1bmN0aW9uIGhXKHQpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6TWoodCk7cmV0dXJuIHRoaXMuc2VsZWN0KChmdW5jdGlvbigpe3JldHVybiB0aGlzLmFwcGVuZENoaWxkKGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0pKX0saW5zZXJ0OmZ1bmN0aW9uIGRXKHQsZSl7dmFyIG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpNaih0KSxpPW51bGw9PWU/Y0c6ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpUaihlKTtyZXR1cm4gdGhpcy5zZWxlY3QoKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpLGkuYXBwbHkodGhpcyxhcmd1bWVudHMpfHxudWxsKX0pKX0scmVtb3ZlOmZ1bmN0aW9uIHBXKCl7cmV0dXJuIHRoaXMuZWFjaCh1Ryl9LGNsb25lOmZ1bmN0aW9uIGZXKHQpe3JldHVybiB0aGlzLnNlbGVjdCh0P2RHOmhHKX0sZGF0dW06ZnVuY3Rpb24gbVcodCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iLHQpOnRoaXMubm9kZSgpLl9fZGF0YV9ffSxvbjpmdW5jdGlvbiBnVyh0LGUsbil7dmFyIGkscixvPV9HKHQrIiIpLGE9by5sZW5ndGg7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtmb3Iocz1lP3ZHOnlHLG51bGw9PW4mJihuPSExKSxpPTA7aTxhOysraSl0aGlzLmVhY2gocyhvW2ldLGUsbikpO3JldHVybiB0aGlzfXZhciBzPXRoaXMubm9kZSgpLl9fb247aWYocylmb3IodmFyIGwsYz0wLHU9cy5sZW5ndGg7Yzx1OysrYylmb3IoaT0wLGw9c1tjXTtpPGE7KytpKWlmKChyPW9baV0pLnR5cGU9PT1sLnR5cGUmJnIubmFtZT09PWwubmFtZSlyZXR1cm4gbC52YWx1ZX0sZGlzcGF0Y2g6ZnVuY3Rpb24gX1codCxlKXtyZXR1cm4gdGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgZT9TRzp3RykodCxlKSl9fSx6Ry5wcm90b3R5cGUub249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl8ub24uYXBwbHkodGhpcy5fLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT10aGlzLl8/dGhpczp0fTt2YXIgeVc9e30sdlc9e307ZnVuY3Rpb24gYlcodCl7cmV0dXJuIG5ldyBGdW5jdGlvbigiZCIsInJldHVybiB7Iit0Lm1hcCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gSlNPTi5zdHJpbmdpZnkodCkrIjogZFsiK2UrIl0ifSkpLmpvaW4oIiwiKSsifSIpfWZ1bmN0aW9uIHhXKHQpe3ZhciBlPW5ldyBSZWdFeHAoJ1siJyt0KyJcblxyXSIpLG49dC5jaGFyQ29kZUF0KDApO2Z1bmN0aW9uIGkodCxlKXt2YXIgaSxyPVtdLG89dC5sZW5ndGgsYT0wLHM9MCxsPW88PTAsYz0hMTtmdW5jdGlvbiB1KCl7aWYobClyZXR1cm4gdlc7aWYoYylyZXR1cm4gYz0hMSx5Vzt2YXIgZSxpLHI9YTtpZigzND09PXQuY2hhckNvZGVBdChyKSl7Zm9yKDthKys8byYmMzQhPT10LmNoYXJDb2RlQXQoYSl8fDM0PT09dC5jaGFyQ29kZUF0KCsrYSk7KTtyZXR1cm4oZT1hKT49bz9sPSEwOjEwPT09KGk9dC5jaGFyQ29kZUF0KGErKykpP2M9ITA6MTM9PT1pJiYoYz0hMCwxMD09PXQuY2hhckNvZGVBdChhKSYmKythKSx0LnNsaWNlKHIrMSxlLTEpLnJlcGxhY2UoLyIiL2csJyInKX1mb3IoO2E8bzspe2lmKDEwPT09KGk9dC5jaGFyQ29kZUF0KGU9YSsrKSkpYz0hMDtlbHNlIGlmKDEzPT09aSljPSEwLDEwPT09dC5jaGFyQ29kZUF0KGEpJiYrK2E7ZWxzZSBpZihpIT09biljb250aW51ZTtyZXR1cm4gdC5zbGljZShyLGUpfXJldHVybiBsPSEwLHQuc2xpY2UocixvKX1mb3IoMTA9PT10LmNoYXJDb2RlQXQoby0xKSYmLS1vLDEzPT09dC5jaGFyQ29kZUF0KG8tMSkmJi0tbzsoaT11KCkpIT09dlc7KXtmb3IodmFyIGg9W107aSE9PXlXJiZpIT09dlc7KWgucHVzaChpKSxpPXUoKTtlJiZudWxsPT0oaD1lKGgscysrKSl8fHIucHVzaChoKX1yZXR1cm4gcn1mdW5jdGlvbiByKGUpe3JldHVybiBlLm1hcChvKS5qb2luKHQpfWZ1bmN0aW9uIG8odCl7cmV0dXJuIG51bGw9PXQ/IiI6ZS50ZXN0KHQrPSIiKT8nIicrdC5yZXBsYWNlKC8iL2csJyIiJykrJyInOnR9cmV0dXJue3BhcnNlOmZ1bmN0aW9uIGEodCxlKXt2YXIgbixyLG89aSh0LChmdW5jdGlvbih0LGkpe2lmKG4pcmV0dXJuIG4odCxpLTEpO3I9dCxuPWU/KGZ1bmN0aW9uIG8odCxlKXt2YXIgbj1iVyh0KTtyZXR1cm4gZnVuY3Rpb24oaSxyKXtyZXR1cm4gZShuKGkpLHIsdCl9fSkodCxlKTpiVyh0KX0pKTtyZXR1cm4gby5jb2x1bW5zPXJ8fFtdLG99LHBhcnNlUm93czppLGZvcm1hdDpmdW5jdGlvbiBzKGUsbil7cmV0dXJuIG51bGw9PW4mJihuPShmdW5jdGlvbiBpKHQpe3ZhciBlPU9iamVjdC5jcmVhdGUobnVsbCksbj1bXTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtmb3IodmFyIGkgaW4gdClpIGluIGV8fG4ucHVzaChlW2ldPWkpfSkpLG59KShlKSksW24ubWFwKG8pLmpvaW4odCldLmNvbmNhdChlLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIG4ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gbyhlW3RdKX0pKS5qb2luKHQpfSkpKS5qb2luKCJcbiIpfSxmb3JtYXRSb3dzOmZ1bmN0aW9uIGwodCl7cmV0dXJuIHQubWFwKHIpLmpvaW4oIlxuIil9fX12YXIgd1c9eFcoIiwiKSxTVz13Vy5wYXJzZSxNVz13Vy5wYXJzZVJvd3MsRVc9d1cuZm9ybWF0LFRXPXdXLmZvcm1hdFJvd3MsQ1c9eFcoIlx0IiksQVc9Q1cucGFyc2Usa1c9Q1cucGFyc2VSb3dzLExXPUNXLmZvcm1hdCxQVz1DVy5mb3JtYXRSb3dzO2Z1bmN0aW9uIE5XKHQpe3JldHVybigodCo9Mik8PTE/dCp0Oi0tdCooMi10KSsxKS8yfWZ1bmN0aW9uIElXKHQpe3JldHVybigodCo9Mik8PTE/dCp0KnQ6KHQtPTIpKnQqdCsyKS8yfXZhciBSVz0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiBNYXRoLnBvdyh0LGUpfXJldHVybiBlPStlLG4uZXhwb25lbnQ9dCxufSkoMyksT1c9KGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gMS1NYXRoLnBvdygxLXQsZSl9cmV0dXJuIGU9K2Usbi5leHBvbmVudD10LG59KSgzKSx6Vz0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybigodCo9Mik8PTE/TWF0aC5wb3codCxlKToyLU1hdGgucG93KDItdCxlKSkvMn1yZXR1cm4gZT0rZSxuLmV4cG9uZW50PXQsbn0pKDMpLERXPU1hdGguUEksQlc9RFcvMjtmdW5jdGlvbiBIVyh0KXtyZXR1cm4oMS1NYXRoLmNvcyhEVyp0KSkvMn1mdW5jdGlvbiBGVyh0KXtyZXR1cm4oKHQqPTIpPD0xP01hdGgucG93KDIsMTAqdC0xMCk6Mi1NYXRoLnBvdygyLDEwLTEwKnQpKS8yfWZ1bmN0aW9uIFZXKHQpe3JldHVybigodCo9Mik8PTE/MS1NYXRoLnNxcnQoMS10KnQpOk1hdGguc3FydCgxLSh0LT0yKSp0KSsxKS8yfXZhciBVVz00LzExLGpXPTcuNTYyNTtmdW5jdGlvbiBHVyh0KXtyZXR1cm4odD0rdCk8VVc/alcqdCp0OnQ8LjcyNzI3MjcyNzI3MjcyNzM/alcqKHQtPS41NDU0NTQ1NDU0NTQ1NDU0KSp0Ky43NTp0PC45MDkwOTA5MDkwOTA5MDkxP2pXKih0LT0uODE4MTgxODE4MTgxODE4MikqdCsuOTM3NTpqVyoodC09Ljk1NDU0NTQ1NDU0NTQ1NDYpKnQrLjk4NDM3NX12YXIgV1c9MS43MDE1OCxxVz0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiB0KnQqKChlKzEpKnQtZSl9cmV0dXJuIGU9K2Usbi5vdmVyc2hvb3Q9dCxufSkoV1cpLFlXPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuLS10KnQqKChlKzEpKnQrZSkrMX1yZXR1cm4gZT0rZSxuLm92ZXJzaG9vdD10LG59KShXVyksWFc9KGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4oKHQqPTIpPDE/dCp0KigoZSsxKSp0LWUpOih0LT0yKSp0KigoZSsxKSp0K2UpKzIpLzJ9cmV0dXJuIGU9K2Usbi5vdmVyc2hvb3Q9dCxufSkoV1cpLCRXPTIqTWF0aC5QSSxLVz0oZnVuY3Rpb24gdChlLG4pe3ZhciBpPU1hdGguYXNpbigxLyhlPU1hdGgubWF4KDEsZSkpKSoobi89JFcpO2Z1bmN0aW9uIHIodCl7cmV0dXJuIGUqTWF0aC5wb3coMiwxMCotLXQpKk1hdGguc2luKChpLXQpL24pfXJldHVybiByLmFtcGxpdHVkZT1mdW5jdGlvbihlKXtyZXR1cm4gdChlLG4qJFcpfSxyLnBlcmlvZD1mdW5jdGlvbihuKXtyZXR1cm4gdChlLG4pfSxyfSkoMSwuMyksWlc9KGZ1bmN0aW9uIHQoZSxuKXt2YXIgaT1NYXRoLmFzaW4oMS8oZT1NYXRoLm1heCgxLGUpKSkqKG4vPSRXKTtmdW5jdGlvbiByKHQpe3JldHVybiAxLWUqTWF0aC5wb3coMiwtMTAqKHQ9K3QpKSpNYXRoLnNpbigodCtpKS9uKX1yZXR1cm4gci5hbXBsaXR1ZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSxuKiRXKX0sci5wZXJpb2Q9ZnVuY3Rpb24obil7cmV0dXJuIHQoZSxuKX0scn0pKDEsLjMpLEpXPShmdW5jdGlvbiB0KGUsbil7dmFyIGk9TWF0aC5hc2luKDEvKGU9TWF0aC5tYXgoMSxlKSkpKihuLz0kVyk7ZnVuY3Rpb24gcih0KXtyZXR1cm4oKHQ9Mip0LTEpPDA/ZSpNYXRoLnBvdygyLDEwKnQpKk1hdGguc2luKChpLXQpL24pOjItZSpNYXRoLnBvdygyLC0xMCp0KSpNYXRoLnNpbigoaSt0KS9uKSkvMn1yZXR1cm4gci5hbXBsaXR1ZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSxuKiRXKX0sci5wZXJpb2Q9ZnVuY3Rpb24obil7cmV0dXJuIHQoZSxuKX0scn0pKDEsLjMpO2Z1bmN0aW9uIFFXKHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiB0cSgpe3JldHVybiAxZS02KihNYXRoLnJhbmRvbSgpLS41KX1mdW5jdGlvbiBlcSh0LGUsbixpKXtpZihpc05hTihlKXx8aXNOYU4obikpcmV0dXJuIHQ7dmFyIHIsbyxhLHMsbCxjLHUsaCxkLHA9dC5fcm9vdCxmPXtkYXRhOml9LG09dC5feDAsZz10Ll95MCxfPXQuX3gxLHk9dC5feTE7aWYoIXApcmV0dXJuIHQuX3Jvb3Q9Zix0O2Zvcig7cC5sZW5ndGg7KWlmKChjPWU+PShvPShtK18pLzIpKT9tPW86Xz1vLCh1PW4+PShhPShnK3kpLzIpKT9nPWE6eT1hLHI9cCwhKHA9cFtoPXU8PDF8Y10pKXJldHVybiByW2hdPWYsdDtpZihzPSt0Ll94LmNhbGwobnVsbCxwLmRhdGEpLGw9K3QuX3kuY2FsbChudWxsLHAuZGF0YSksZT09PXMmJm49PT1sKXJldHVybiBmLm5leHQ9cCxyP3JbaF09Zjp0Ll9yb290PWYsdDtkb3tyPXI/cltoXT1uZXcgQXJyYXkoNCk6dC5fcm9vdD1uZXcgQXJyYXkoNCksKGM9ZT49KG89KG0rXykvMikpP209bzpfPW8sKHU9bj49KGE9KGcreSkvMikpP2c9YTp5PWF9d2hpbGUoKGg9dTw8MXxjKT09KGQ9KGw+PWEpPDwxfHM+PW8pKTtyZXR1cm4gcltkXT1wLHJbaF09Zix0fWZ1bmN0aW9uIG5xKHQsZSxuLGkscil7dGhpcy5ub2RlPXQsdGhpcy54MD1lLHRoaXMueTA9bix0aGlzLngxPWksdGhpcy55MT1yfWZ1bmN0aW9uIGlxKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIHJxKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIG9xKHQsZSxuKXt2YXIgaT1uZXcgYXEobnVsbD09ZT9pcTplLG51bGw9PW4/cnE6bixOYU4sTmFOLE5hTixOYU4pO3JldHVybiBudWxsPT10P2k6aS5hZGRBbGwodCl9ZnVuY3Rpb24gYXEodCxlLG4saSxyLG8pe3RoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5feDA9bix0aGlzLl95MD1pLHRoaXMuX3gxPXIsdGhpcy5feTE9byx0aGlzLl9yb290PXZvaWQgMH1mdW5jdGlvbiBzcSh0KXtmb3IodmFyIGU9e2RhdGE6dC5kYXRhfSxuPWU7dD10Lm5leHQ7KW49bi5uZXh0PXtkYXRhOnQuZGF0YX07cmV0dXJuIGV9dmFyIGxxPW9xLnByb3RvdHlwZT1hcS5wcm90b3R5cGU7ZnVuY3Rpb24gY3EodCl7cmV0dXJuIHQueCt0LnZ4fWZ1bmN0aW9uIHVxKHQpe3JldHVybiB0LnkrdC52eX1scS5jb3B5PWZ1bmN0aW9uKCl7dmFyIHQsZSxuPW5ldyBhcSh0aGlzLl94LHRoaXMuX3ksdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpLGk9dGhpcy5fcm9vdDtpZighaSlyZXR1cm4gbjtpZighaS5sZW5ndGgpcmV0dXJuIG4uX3Jvb3Q9c3EoaSksbjtmb3IodD1be3NvdXJjZTppLHRhcmdldDpuLl9yb290PW5ldyBBcnJheSg0KX1dO2k9dC5wb3AoKTspZm9yKHZhciByPTA7cjw0OysrcikoZT1pLnNvdXJjZVtyXSkmJihlLmxlbmd0aD90LnB1c2goe3NvdXJjZTplLHRhcmdldDppLnRhcmdldFtyXT1uZXcgQXJyYXkoNCl9KTppLnRhcmdldFtyXT1zcShlKSk7cmV0dXJuIG59LGxxLmFkZD1mdW5jdGlvbiBocSh0KXt2YXIgZT0rdGhpcy5feC5jYWxsKG51bGwsdCksbj0rdGhpcy5feS5jYWxsKG51bGwsdCk7cmV0dXJuIGVxKHRoaXMuY292ZXIoZSxuKSxlLG4sdCl9LGxxLmFkZEFsbD1mdW5jdGlvbiBkcSh0KXt2YXIgZSxuLGkscixvPXQubGVuZ3RoLGE9bmV3IEFycmF5KG8pLHM9bmV3IEFycmF5KG8pLGw9MS8wLGM9MS8wLHU9LTEvMCxoPS0xLzA7Zm9yKG49MDtuPG87KytuKWlzTmFOKGk9K3RoaXMuX3guY2FsbChudWxsLGU9dFtuXSkpfHxpc05hTihyPSt0aGlzLl95LmNhbGwobnVsbCxlKSl8fChhW25dPWksc1tuXT1yLGk8bCYmKGw9aSksaT51JiYodT1pKSxyPGMmJihjPXIpLHI+aCYmKGg9cikpO2lmKGw+dXx8Yz5oKXJldHVybiB0aGlzO2Zvcih0aGlzLmNvdmVyKGwsYykuY292ZXIodSxoKSxuPTA7bjxvOysrbillcSh0aGlzLGFbbl0sc1tuXSx0W25dKTtyZXR1cm4gdGhpc30sbHEuY292ZXI9ZnVuY3Rpb24gcHEodCxlKXtpZihpc05hTih0PSt0KXx8aXNOYU4oZT0rZSkpcmV0dXJuIHRoaXM7dmFyIG49dGhpcy5feDAsaT10aGlzLl95MCxyPXRoaXMuX3gxLG89dGhpcy5feTE7aWYoaXNOYU4obikpcj0obj1NYXRoLmZsb29yKHQpKSsxLG89KGk9TWF0aC5mbG9vcihlKSkrMTtlbHNle2Zvcih2YXIgYSxzLGw9ci1uLGM9dGhpcy5fcm9vdDtuPnR8fHQ+PXJ8fGk+ZXx8ZT49bzspc3dpdGNoKHM9KGU8aSk8PDF8dDxuLChhPW5ldyBBcnJheSg0KSlbc109YyxjPWEsbCo9MixzKXtjYXNlIDA6cj1uK2wsbz1pK2w7YnJlYWs7Y2FzZSAxOm49ci1sLG89aStsO2JyZWFrO2Nhc2UgMjpyPW4rbCxpPW8tbDticmVhaztjYXNlIDM6bj1yLWwsaT1vLWx9dGhpcy5fcm9vdCYmdGhpcy5fcm9vdC5sZW5ndGgmJih0aGlzLl9yb290PWMpfXJldHVybiB0aGlzLl94MD1uLHRoaXMuX3kwPWksdGhpcy5feDE9cix0aGlzLl95MT1vLHRoaXN9LGxxLmRhdGE9ZnVuY3Rpb24gZnEoKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy52aXNpdCgoZnVuY3Rpb24oZSl7aWYoIWUubGVuZ3RoKWRve3QucHVzaChlLmRhdGEpfXdoaWxlKGU9ZS5uZXh0KX0pKSx0fSxscS5leHRlbnQ9ZnVuY3Rpb24gbXEodCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5jb3ZlcigrdFswXVswXSwrdFswXVsxXSkuY292ZXIoK3RbMV1bMF0sK3RbMV1bMV0pOmlzTmFOKHRoaXMuX3gwKT92b2lkIDA6W1t0aGlzLl94MCx0aGlzLl95MF0sW3RoaXMuX3gxLHRoaXMuX3kxXV19LGxxLmZpbmQ9ZnVuY3Rpb24gZ3EodCxlLG4pe3ZhciBpLHIsbyxhLHMsbCxjLHU9dGhpcy5feDAsaD10aGlzLl95MCxkPXRoaXMuX3gxLHA9dGhpcy5feTEsZj1bXSxtPXRoaXMuX3Jvb3Q7Zm9yKG0mJmYucHVzaChuZXcgbnEobSx1LGgsZCxwKSksbnVsbD09bj9uPTEvMDoodT10LW4saD1lLW4sZD10K24scD1lK24sbio9bik7bD1mLnBvcCgpOylpZighKCEobT1sLm5vZGUpfHwocj1sLngwKT5kfHwobz1sLnkwKT5wfHwoYT1sLngxKTx1fHwocz1sLnkxKTxoKSlpZihtLmxlbmd0aCl7dmFyIGc9KHIrYSkvMixfPShvK3MpLzI7Zi5wdXNoKG5ldyBucShtWzNdLGcsXyxhLHMpLG5ldyBucShtWzJdLHIsXyxnLHMpLG5ldyBucShtWzFdLGcsbyxhLF8pLG5ldyBucShtWzBdLHIsbyxnLF8pKSwoYz0oZT49Xyk8PDF8dD49ZykmJihsPWZbZi5sZW5ndGgtMV0sZltmLmxlbmd0aC0xXT1mW2YubGVuZ3RoLTEtY10sZltmLmxlbmd0aC0xLWNdPWwpfWVsc2V7dmFyIHk9dC0rdGhpcy5feC5jYWxsKG51bGwsbS5kYXRhKSx2PWUtK3RoaXMuX3kuY2FsbChudWxsLG0uZGF0YSksYj15Knkrdip2O2lmKGI8bil7dmFyIHg9TWF0aC5zcXJ0KG49Yik7dT10LXgsaD1lLXgsZD10K3gscD1lK3gsaT1tLmRhdGF9fXJldHVybiBpfSxscS5yZW1vdmU9ZnVuY3Rpb24gX3EodCl7aWYoaXNOYU4obz0rdGhpcy5feC5jYWxsKG51bGwsdCkpfHxpc05hTihhPSt0aGlzLl95LmNhbGwobnVsbCx0KSkpcmV0dXJuIHRoaXM7dmFyIGUsbixpLHIsbyxhLHMsbCxjLHUsaCxkLHA9dGhpcy5fcm9vdCxmPXRoaXMuX3gwLG09dGhpcy5feTAsZz10aGlzLl94MSxfPXRoaXMuX3kxO2lmKCFwKXJldHVybiB0aGlzO2lmKHAubGVuZ3RoKWZvcig7Oyl7aWYoKGM9bz49KHM9KGYrZykvMikpP2Y9czpnPXMsKHU9YT49KGw9KG0rXykvMikpP209bDpfPWwsZT1wLCEocD1wW2g9dTw8MXxjXSkpcmV0dXJuIHRoaXM7aWYoIXAubGVuZ3RoKWJyZWFrOyhlW2grMSYzXXx8ZVtoKzImM118fGVbaCszJjNdKSYmKG49ZSxkPWgpfWZvcig7cC5kYXRhIT09dDspaWYoaT1wLCEocD1wLm5leHQpKXJldHVybiB0aGlzO3JldHVybihyPXAubmV4dCkmJmRlbGV0ZSBwLm5leHQsaT8ocj9pLm5leHQ9cjpkZWxldGUgaS5uZXh0LHRoaXMpOmU/KHI/ZVtoXT1yOmRlbGV0ZSBlW2hdLChwPWVbMF18fGVbMV18fGVbMl18fGVbM10pJiZwPT09KGVbM118fGVbMl18fGVbMV18fGVbMF0pJiYhcC5sZW5ndGgmJihuP25bZF09cDp0aGlzLl9yb290PXApLHRoaXMpOih0aGlzLl9yb290PXIsdGhpcyl9LGxxLnJlbW92ZUFsbD1mdW5jdGlvbiB5cSh0KXtmb3IodmFyIGU9MCxuPXQubGVuZ3RoO2U8bjsrK2UpdGhpcy5yZW1vdmUodFtlXSk7cmV0dXJuIHRoaXN9LGxxLnJvb3Q9ZnVuY3Rpb24gdnEoKXtyZXR1cm4gdGhpcy5fcm9vdH0sbHEuc2l6ZT1mdW5jdGlvbiBicSgpe3ZhciB0PTA7cmV0dXJuIHRoaXMudmlzaXQoKGZ1bmN0aW9uKGUpe2lmKCFlLmxlbmd0aClkb3srK3R9d2hpbGUoZT1lLm5leHQpfSkpLHR9LGxxLnZpc2l0PWZ1bmN0aW9uIHhxKHQpe3ZhciBlLG4saSxyLG8sYSxzPVtdLGw9dGhpcy5fcm9vdDtmb3IobCYmcy5wdXNoKG5ldyBucShsLHRoaXMuX3gwLHRoaXMuX3kwLHRoaXMuX3gxLHRoaXMuX3kxKSk7ZT1zLnBvcCgpOylpZighdChsPWUubm9kZSxpPWUueDAscj1lLnkwLG89ZS54MSxhPWUueTEpJiZsLmxlbmd0aCl7dmFyIGM9KGkrbykvMix1PShyK2EpLzI7KG49bFszXSkmJnMucHVzaChuZXcgbnEobixjLHUsbyxhKSksKG49bFsyXSkmJnMucHVzaChuZXcgbnEobixpLHUsYyxhKSksKG49bFsxXSkmJnMucHVzaChuZXcgbnEobixjLHIsbyx1KSksKG49bFswXSkmJnMucHVzaChuZXcgbnEobixpLHIsYyx1KSl9cmV0dXJuIHRoaXN9LGxxLnZpc2l0QWZ0ZXI9ZnVuY3Rpb24gd3EodCl7dmFyIGUsbj1bXSxpPVtdO2Zvcih0aGlzLl9yb290JiZuLnB1c2gobmV3IG5xKHRoaXMuX3Jvb3QsdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpKTtlPW4ucG9wKCk7KXt2YXIgcj1lLm5vZGU7aWYoci5sZW5ndGgpe3ZhciBvLGE9ZS54MCxzPWUueTAsbD1lLngxLGM9ZS55MSx1PShhK2wpLzIsaD0ocytjKS8yOyhvPXJbMF0pJiZuLnB1c2gobmV3IG5xKG8sYSxzLHUsaCkpLChvPXJbMV0pJiZuLnB1c2gobmV3IG5xKG8sdSxzLGwsaCkpLChvPXJbMl0pJiZuLnB1c2gobmV3IG5xKG8sYSxoLHUsYykpLChvPXJbM10pJiZuLnB1c2gobmV3IG5xKG8sdSxoLGwsYykpfWkucHVzaChlKX1mb3IoO2U9aS5wb3AoKTspdChlLm5vZGUsZS54MCxlLnkwLGUueDEsZS55MSk7cmV0dXJuIHRoaXN9LGxxLng9ZnVuY3Rpb24gU3EodCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3g9dCx0aGlzKTp0aGlzLl94fSxscS55PWZ1bmN0aW9uIE1xKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0aGlzLl95PXQsdGhpcyk6dGhpcy5feX07dmFyIEVxPSIkIjtmdW5jdGlvbiBUcSgpe31mdW5jdGlvbiBDcSh0LGUpe3ZhciBuPW5ldyBUcTtpZih0IGluc3RhbmNlb2YgVHEpdC5lYWNoKChmdW5jdGlvbih0LGUpe24uc2V0KGUsdCl9KSk7ZWxzZSBpZihBcnJheS5pc0FycmF5KHQpKXt2YXIgaSxyPS0xLG89dC5sZW5ndGg7aWYobnVsbD09ZSlmb3IoOysrcjxvOyluLnNldChyLHRbcl0pO2Vsc2UgZm9yKDsrK3I8bzspbi5zZXQoZShpPXRbcl0scix0KSxpKX1lbHNlIGlmKHQpZm9yKHZhciBhIGluIHQpbi5zZXQoYSx0W2FdKTtyZXR1cm4gbn1mdW5jdGlvbiBBcSgpe31UcS5wcm90b3R5cGU9Q3EucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpUcSxoYXM6ZnVuY3Rpb24odCl7cmV0dXJuIEVxK3QgaW4gdGhpc30sZ2V0OmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzW0VxK3RdfSxzZXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpc1tFcSt0XT1lLHRoaXN9LHJlbW92ZTpmdW5jdGlvbih0KXt2YXIgZT1FcSt0O3JldHVybiBlIGluIHRoaXMmJmRlbGV0ZSB0aGlzW2VdfSxjbGVhcjpmdW5jdGlvbigpe2Zvcih2YXIgdCBpbiB0aGlzKXRbMF09PT1FcSYmZGVsZXRlIHRoaXNbdF19LGtleXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gdGhpcyllWzBdPT09RXEmJnQucHVzaChlLnNsaWNlKDEpKTtyZXR1cm4gdH0sdmFsdWVzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBlIGluIHRoaXMpZVswXT09PUVxJiZ0LnB1c2godGhpc1tlXSk7cmV0dXJuIHR9LGVudHJpZXM6ZnVuY3Rpb24oKXt2YXIgdD1bXTtmb3IodmFyIGUgaW4gdGhpcyllWzBdPT09RXEmJnQucHVzaCh7a2V5OmUuc2xpY2UoMSksdmFsdWU6dGhpc1tlXX0pO3JldHVybiB0fSxzaXplOmZ1bmN0aW9uKCl7dmFyIHQ9MDtmb3IodmFyIGUgaW4gdGhpcyllWzBdPT09RXEmJisrdDtyZXR1cm4gdH0sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcylpZih0WzBdPT09RXEpcmV0dXJuITE7cmV0dXJuITB9LGVhY2g6ZnVuY3Rpb24odCl7Zm9yKHZhciBlIGluIHRoaXMpZVswXT09PUVxJiZ0KHRoaXNbZV0sZS5zbGljZSgxKSx0aGlzKX19O3ZhciBrcT1DcS5wcm90b3R5cGU7ZnVuY3Rpb24gTHEodCl7cmV0dXJuIHQuaW5kZXh9ZnVuY3Rpb24gUHEodCxlKXt2YXIgbj10LmdldChlKTtpZighbil0aHJvdyBuZXcgRXJyb3IoIm1pc3Npbmc6ICIrZSk7cmV0dXJuIG59QXEucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpBcSxoYXM6a3EuaGFzLGFkZDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpc1tFcSsodCs9IiIpXT10LHRoaXN9LHJlbW92ZTprcS5yZW1vdmUsY2xlYXI6a3EuY2xlYXIsdmFsdWVzOmtxLmtleXMsc2l6ZTprcS5zaXplLGVtcHR5OmtxLmVtcHR5LGVhY2g6a3EuZWFjaH07dmFyIE5xPXt2YWx1ZTpmdW5jdGlvbigpe319O2Z1bmN0aW9uIElxKCl7Zm9yKHZhciB0LGU9MCxuPWFyZ3VtZW50cy5sZW5ndGgsaT17fTtlPG47KytlKXtpZighKHQ9YXJndW1lbnRzW2VdKyIiKXx8dCBpbiBpfHwvW1xzLl0vLnRlc3QodCkpdGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIHR5cGU6ICIrdCk7aVt0XT1bXX1yZXR1cm4gbmV3IFJxKGkpfWZ1bmN0aW9uIFJxKHQpe3RoaXMuXz10fWZ1bmN0aW9uIE9xKHQsZSl7cmV0dXJuIHQudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcCgoZnVuY3Rpb24odCl7dmFyIG49IiIsaT10LmluZGV4T2YoIi4iKTtpZihpPj0wJiYobj10LnNsaWNlKGkrMSksdD10LnNsaWNlKDAsaSkpLHQmJiFlLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO3JldHVybnt0eXBlOnQsbmFtZTpufX0pKX1mdW5jdGlvbiB6cSh0LGUpe2Zvcih2YXIgbixpPTAscj10Lmxlbmd0aDtpPHI7KytpKWlmKChuPXRbaV0pLm5hbWU9PT1lKXJldHVybiBuLnZhbHVlfWZ1bmN0aW9uIERxKHQsZSxuKXtmb3IodmFyIGk9MCxyPXQubGVuZ3RoO2k8cjsrK2kpaWYodFtpXS5uYW1lPT09ZSl7dFtpXT1OcSx0PXQuc2xpY2UoMCxpKS5jb25jYXQodC5zbGljZShpKzEpKTticmVha31yZXR1cm4gbnVsbCE9biYmdC5wdXNoKHtuYW1lOmUsdmFsdWU6bn0pLHR9UnEucHJvdG90eXBlPUlxLnByb3RvdHlwZT17Y29uc3RydWN0b3I6UnEsb246ZnVuY3Rpb24odCxlKXt2YXIgbixpPXRoaXMuXyxyPU9xKHQrIiIsaSksbz0tMSxhPXIubGVuZ3RoO2lmKCEoYXJndW1lbnRzLmxlbmd0aDwyKSl7aWYobnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrOiAiK2UpO2Zvcig7KytvPGE7KWlmKG49KHQ9cltvXSkudHlwZSlpW25dPURxKGlbbl0sdC5uYW1lLGUpO2Vsc2UgaWYobnVsbD09ZSlmb3IobiBpbiBpKWlbbl09RHEoaVtuXSx0Lm5hbWUsbnVsbCk7cmV0dXJuIHRoaXN9Zm9yKDsrK288YTspaWYoKG49KHQ9cltvXSkudHlwZSkmJihuPXpxKGlbbl0sdC5uYW1lKSkpcmV0dXJuIG59LGNvcHk6ZnVuY3Rpb24oKXt2YXIgdD17fSxlPXRoaXMuXztmb3IodmFyIG4gaW4gZSl0W25dPWVbbl0uc2xpY2UoKTtyZXR1cm4gbmV3IFJxKHQpfSxjYWxsOmZ1bmN0aW9uKHQsZSl7aWYoKG49YXJndW1lbnRzLmxlbmd0aC0yKT4wKWZvcih2YXIgbixpLHI9bmV3IEFycmF5KG4pLG89MDtvPG47KytvKXJbb109YXJndW1lbnRzW28rMl07aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3Iobz0wLG49KGk9dGhpcy5fW3RdKS5sZW5ndGg7bzxuOysrbylpW29dLnZhbHVlLmFwcGx5KGUscil9LGFwcGx5OmZ1bmN0aW9uKHQsZSxuKXtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO2Zvcih2YXIgaT10aGlzLl9bdF0scj0wLG89aS5sZW5ndGg7cjxvOysrcilpW3JdLnZhbHVlLmFwcGx5KGUsbil9fTt2YXIgQnEsSHEsRnE9MCxWcT0wLFVxPTAsanE9MCxHcT0wLFdxPTAscXE9Im9iamVjdCI9PXR5cGVvZiBwZXJmb3JtYW5jZSYmcGVyZm9ybWFuY2Uubm93P3BlcmZvcm1hbmNlOkRhdGUsWXE9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdyk6ZnVuY3Rpb24odCl7c2V0VGltZW91dCh0LDE3KX07ZnVuY3Rpb24gWHEoKXtyZXR1cm4gR3F8fChZcSgkcSksR3E9cXEubm93KCkrV3EpfWZ1bmN0aW9uICRxKCl7R3E9MH1mdW5jdGlvbiBLcSgpe3RoaXMuX2NhbGw9dGhpcy5fdGltZT10aGlzLl9uZXh0PW51bGx9ZnVuY3Rpb24gWnEodCxlLG4pe3ZhciBpPW5ldyBLcTtyZXR1cm4gaS5yZXN0YXJ0KHQsZSxuKSxpfWZ1bmN0aW9uIEpxKCl7R3E9KGpxPXFxLm5vdygpKStXcSxGcT1WcT0wO3RyeXshKGZ1bmN0aW9uIHQoKXtYcSgpLCsrRnE7Zm9yKHZhciB0LGU9QnE7ZTspKHQ9R3EtZS5fdGltZSk+PTAmJmUuX2NhbGwuY2FsbChudWxsLHQpLGU9ZS5fbmV4dDstLUZxfSkoKX1maW5hbGx5e0ZxPTAsKGZ1bmN0aW9uIGUoKXt2YXIgdCxlLG49QnEsaT0xLzA7Zm9yKDtuOyluLl9jYWxsPyhpPm4uX3RpbWUmJihpPW4uX3RpbWUpLHQ9bixuPW4uX25leHQpOihlPW4uX25leHQsbi5fbmV4dD1udWxsLG49dD90Ll9uZXh0PWU6QnE9ZSk7SHE9dCx0WShpKX0pKCksR3E9MH19ZnVuY3Rpb24gUXEoKXt2YXIgdD1xcS5ub3coKSxlPXQtanE7ZT4xZTMmJihXcS09ZSxqcT10KX1mdW5jdGlvbiB0WSh0KXtGcXx8KFZxJiYoVnE9Y2xlYXJUaW1lb3V0KFZxKSksdC1HcT4yND8odDwxLzAmJihWcT1zZXRUaW1lb3V0KEpxLHQtcXEubm93KCktV3EpKSxVcSYmKFVxPWNsZWFySW50ZXJ2YWwoVXEpKSk6KFVxfHwoanE9cXEubm93KCksVXE9c2V0SW50ZXJ2YWwoUXEsMWUzKSksRnE9MSxZcShKcSkpKX1mdW5jdGlvbiBlWSh0KXtyZXR1cm4gdC54fWZ1bmN0aW9uIG5ZKHQpe3JldHVybiB0Lnl9S3EucHJvdG90eXBlPVpxLnByb3RvdHlwZT17Y29uc3RydWN0b3I6S3EscmVzdGFydDpmdW5jdGlvbih0LGUsbil7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb24iKTtuPShudWxsPT1uP1hxKCk6K24pKyhudWxsPT1lPzA6K2UpLHRoaXMuX25leHR8fEhxPT09dGhpc3x8KEhxP0hxLl9uZXh0PXRoaXM6QnE9dGhpcyxIcT10aGlzKSx0aGlzLl9jYWxsPXQsdGhpcy5fdGltZT1uLHRZKCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLl9jYWxsJiYodGhpcy5fY2FsbD1udWxsLHRoaXMuX3RpbWU9MS8wLHRZKCkpfX07dmFyIGlZLHJZPU1hdGguUEkqKDMtTWF0aC5zcXJ0KDUpKTtmdW5jdGlvbiBvWSh0LGUpe2lmKChuPSh0PWU/dC50b0V4cG9uZW50aWFsKGUtMSk6dC50b0V4cG9uZW50aWFsKCkpLmluZGV4T2YoImUiKSk8MClyZXR1cm4gbnVsbDt2YXIgbixpPXQuc2xpY2UoMCxuKTtyZXR1cm5baS5sZW5ndGg+MT9pWzBdK2kuc2xpY2UoMik6aSwrdC5zbGljZShuKzEpXX1mdW5jdGlvbiBhWSh0KXtyZXR1cm4odD1vWShNYXRoLmFicyh0KSkpP3RbMV06TmFOfWZ1bmN0aW9uIHNZKHQsZSl7dmFyIG49b1kodCxlKTtpZighbilyZXR1cm4gdCsiIjt2YXIgaT1uWzBdLHI9blsxXTtyZXR1cm4gcjwwPyIwLiIrbmV3IEFycmF5KC1yKS5qb2luKCIwIikraTppLmxlbmd0aD5yKzE/aS5zbGljZSgwLHIrMSkrIi4iK2kuc2xpY2UocisxKTppK25ldyBBcnJheShyLWkubGVuZ3RoKzIpLmpvaW4oIjAiKX12YXIgbFk9eyIiOmZ1bmN0aW9uIGNZKHQsZSl7dDpmb3IodmFyIG4saT0odD10LnRvUHJlY2lzaW9uKGUpKS5sZW5ndGgscj0xLG89LTE7cjxpOysrcilzd2l0Y2godFtyXSl7Y2FzZSIuIjpvPW49cjticmVhaztjYXNlIjAiOjA9PT1vJiYobz1yKSxuPXI7YnJlYWs7Y2FzZSJlIjpicmVhayB0O2RlZmF1bHQ6bz4wJiYobz0wKX1yZXR1cm4gbz4wP3Quc2xpY2UoMCxvKSt0LnNsaWNlKG4rMSk6dH0sIiUiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuKDEwMCp0KS50b0ZpeGVkKGUpfSxiOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDIpfSxjOmZ1bmN0aW9uKHQpe3JldHVybiB0KyIifSxkOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDEwKX0sZTpmdW5jdGlvbih0LGUpe3JldHVybiB0LnRvRXhwb25lbnRpYWwoZSl9LGY6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC50b0ZpeGVkKGUpfSxnOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudG9QcmVjaXNpb24oZSl9LG86ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoOCl9LHA6ZnVuY3Rpb24odCxlKXtyZXR1cm4gc1koMTAwKnQsZSl9LHI6c1ksczpmdW5jdGlvbiB1WSh0LGUpe3ZhciBuPW9ZKHQsZSk7aWYoIW4pcmV0dXJuIHQrIiI7dmFyIGk9blswXSxyPW5bMV0sbz1yLShpWT0zKk1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihyLzMpKSkpKzEsYT1pLmxlbmd0aDtyZXR1cm4gbz09PWE/aTpvPmE/aStuZXcgQXJyYXkoby1hKzEpLmpvaW4oIjAiKTpvPjA/aS5zbGljZSgwLG8pKyIuIitpLnNsaWNlKG8pOiIwLiIrbmV3IEFycmF5KDEtbykuam9pbigiMCIpK29ZKHQsTWF0aC5tYXgoMCxlK28tMSkpWzBdfSxYOmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpfSx4OmZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLnJvdW5kKHQpLnRvU3RyaW5nKDE2KX19LGhZPS9eKD86KC4pPyhbPD49Xl0pKT8oWytcLVwoIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLlxkKyk/KFthLXolXSk/JC9pO2Z1bmN0aW9uIGRZKHQpe3JldHVybiBuZXcgcFkodCl9ZnVuY3Rpb24gcFkodCl7aWYoIShlPWhZLmV4ZWModCkpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBmb3JtYXQ6ICIrdCk7dmFyIGUsbj1lWzFdfHwiICIsaT1lWzJdfHwiPiIscj1lWzNdfHwiLSIsbz1lWzRdfHwiIixhPSEhZVs1XSxzPWVbNl0mJitlWzZdLGw9ISFlWzddLGM9ZVs4XSYmK2VbOF0uc2xpY2UoMSksdT1lWzldfHwiIjsibiI9PT11PyhsPSEwLHU9ImciKTpsWVt1XXx8KHU9IiIpLChhfHwiMCI9PT1uJiYiPSI9PT1pKSYmKGE9ITAsbj0iMCIsaT0iPSIpLHRoaXMuZmlsbD1uLHRoaXMuYWxpZ249aSx0aGlzLnNpZ249cix0aGlzLnN5bWJvbD1vLHRoaXMuemVybz1hLHRoaXMud2lkdGg9cyx0aGlzLmNvbW1hPWwsdGhpcy5wcmVjaXNpb249Yyx0aGlzLnR5cGU9dX1mdW5jdGlvbiBmWSh0KXtyZXR1cm4gdH1kWS5wcm90b3R5cGU9cFkucHJvdG90eXBlLHBZLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0aGlzLmZpbGwrdGhpcy5hbGlnbit0aGlzLnNpZ24rdGhpcy5zeW1ib2wrKHRoaXMuemVybz8iMCI6IiIpKyhudWxsPT10aGlzLndpZHRoPyIiOk1hdGgubWF4KDEsMHx0aGlzLndpZHRoKSkrKHRoaXMuY29tbWE/IiwiOiIiKSsobnVsbD09dGhpcy5wcmVjaXNpb24/IiI6Ii4iK01hdGgubWF4KDAsMHx0aGlzLnByZWNpc2lvbikpK3RoaXMudHlwZX07dmFyIG1ZLGdZLF9ZLHlZPVsieSIsInoiLCJhIiwiZiIsInAiLCJuIiwiwrUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXTtmdW5jdGlvbiB2WSh0KXt2YXIgZT10Lmdyb3VwaW5nJiZ0LnRob3VzYW5kcz8oZnVuY3Rpb24gbih0LGUpe3JldHVybiBmdW5jdGlvbihuLGkpe2Zvcih2YXIgcj1uLmxlbmd0aCxvPVtdLGE9MCxzPXRbMF0sbD0wO3I+MCYmcz4wJiYobCtzKzE+aSYmKHM9TWF0aC5tYXgoMSxpLWwpKSxvLnB1c2gobi5zdWJzdHJpbmcoci09cyxyK3MpKSwhKChsKz1zKzEpPmkpKTspcz10W2E9KGErMSkldC5sZW5ndGhdO3JldHVybiBvLnJldmVyc2UoKS5qb2luKGUpfX0pKHQuZ3JvdXBpbmcsdC50aG91c2FuZHMpOmZZLGk9dC5jdXJyZW5jeSxyPXQuZGVjaW1hbCxvPXQubnVtZXJhbHM/KGZ1bmN0aW9uIGEodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoL1swLTldL2csKGZ1bmN0aW9uKGUpe3JldHVybiB0WytlXX0pKX19KSh0Lm51bWVyYWxzKTpmWSxzPXQucGVyY2VudHx8IiUiO2Z1bmN0aW9uIGwodCl7dmFyIG49KHQ9ZFkodCkpLmZpbGwsYT10LmFsaWduLGw9dC5zaWduLGM9dC5zeW1ib2wsdT10Lnplcm8saD10LndpZHRoLGQ9dC5jb21tYSxwPXQucHJlY2lzaW9uLGY9dC50eXBlLG09IiQiPT09Yz9pWzBdOiIjIj09PWMmJi9bYm94WF0vLnRlc3QoZik/IjAiK2YudG9Mb3dlckNhc2UoKToiIixnPSIkIj09PWM/aVsxXTovWyVwXS8udGVzdChmKT9zOiIiLF89bFlbZl0seT0hZnx8L1tkZWZncHJzJV0vLnRlc3QoZik7ZnVuY3Rpb24gdih0KXt2YXIgaSxzLGMsdj1tLGI9ZztpZigiYyI9PT1mKWI9Xyh0KStiLHQ9IiI7ZWxzZXt2YXIgeD0odD0rdCk8MDtpZih0PV8oTWF0aC5hYnModCkscCkseCYmMD09K3QmJih4PSExKSx2PSh4PyIoIj09PWw/bDoiLSI6Ii0iPT09bHx8IigiPT09bD8iIjpsKSt2LGI9KCJzIj09PWY/eVlbOCtpWS8zXToiIikrYisoeCYmIigiPT09bD8iKSI6IiIpLHkpZm9yKGk9LTEscz10Lmxlbmd0aDsrK2k8czspaWYoNDg+KGM9dC5jaGFyQ29kZUF0KGkpKXx8Yz41Nyl7Yj0oNDY9PT1jP3IrdC5zbGljZShpKzEpOnQuc2xpY2UoaSkpK2IsdD10LnNsaWNlKDAsaSk7YnJlYWt9fWQmJiF1JiYodD1lKHQsMS8wKSk7dmFyIHc9di5sZW5ndGgrdC5sZW5ndGgrYi5sZW5ndGgsUz13PGg/bmV3IEFycmF5KGgtdysxKS5qb2luKG4pOiIiO3N3aXRjaChkJiZ1JiYodD1lKFMrdCxTLmxlbmd0aD9oLWIubGVuZ3RoOjEvMCksUz0iIiksYSl7Y2FzZSI8Ijp0PXYrdCtiK1M7YnJlYWs7Y2FzZSI9Ijp0PXYrUyt0K2I7YnJlYWs7Y2FzZSJeIjp0PVMuc2xpY2UoMCx3PVMubGVuZ3RoPj4xKSt2K3QrYitTLnNsaWNlKHcpO2JyZWFrO2RlZmF1bHQ6dD1TK3YrdCtifXJldHVybiBvKHQpfXJldHVybiBwPW51bGw9PXA/Zj82OjEyOi9bZ3Byc10vLnRlc3QoZik/TWF0aC5tYXgoMSxNYXRoLm1pbigyMSxwKSk6TWF0aC5tYXgoMCxNYXRoLm1pbigyMCxwKSksdi50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0KyIifSx2fXJldHVybntmb3JtYXQ6bCxmb3JtYXRQcmVmaXg6ZnVuY3Rpb24gYyh0LGUpe3ZhciBuPWwoKCh0PWRZKHQpKS50eXBlPSJmIix0KSksaT0zKk1hdGgubWF4KC04LE1hdGgubWluKDgsTWF0aC5mbG9vcihhWShlKS8zKSkpLHI9TWF0aC5wb3coMTAsLWkpLG89eVlbOCtpLzNdO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gbihyKnQpK299fX19ZnVuY3Rpb24gYlkodCl7cmV0dXJuIG1ZPXZZKHQpLGdZPW1ZLmZvcm1hdCxfWT1tWS5mb3JtYXRQcmVmaXgsbVl9ZnVuY3Rpb24geFkoKXtyZXR1cm4gbmV3IHdZfWZ1bmN0aW9uIHdZKCl7dGhpcy5yZXNldCgpfWJZKHtkZWNpbWFsOiIuIix0aG91c2FuZHM6IiwiLGdyb3VwaW5nOlszXSxjdXJyZW5jeTpbIiQiLCIiXX0pLHdZLnByb3RvdHlwZT17Y29uc3RydWN0b3I6d1kscmVzZXQ6ZnVuY3Rpb24oKXt0aGlzLnM9dGhpcy50PTB9LGFkZDpmdW5jdGlvbih0KXtNWShTWSx0LHRoaXMudCksTVkodGhpcyxTWS5zLHRoaXMucyksdGhpcy5zP3RoaXMudCs9U1kudDp0aGlzLnM9U1kudH0sdmFsdWVPZjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnN9fTt2YXIgU1k9bmV3IHdZO2Z1bmN0aW9uIE1ZKHQsZSxuKXt2YXIgaT10LnM9ZStuLHI9aS1lO3QudD1lLShpLXIpKyhuLXIpfXZhciBFWT0xZS02LFRZPU1hdGguUEksQ1k9VFkvMixBWT1UWS80LGtZPTIqVFksTFk9MTgwL1RZLFBZPVRZLzE4MCxOWT1NYXRoLmFicyxJWT1NYXRoLmF0YW4sUlk9TWF0aC5hdGFuMixPWT1NYXRoLmNvcyx6WT1NYXRoLmNlaWwsRFk9TWF0aC5leHAsQlk9TWF0aC5sb2csSFk9TWF0aC5wb3csRlk9TWF0aC5zaW4sVlk9TWF0aC5zaWdufHxmdW5jdGlvbih0KXtyZXR1cm4gdD4wPzE6dDwwPy0xOjB9LFVZPU1hdGguc3FydCxqWT1NYXRoLnRhbjtmdW5jdGlvbiBHWSh0KXtyZXR1cm4gdD4xPzA6dDwtMT9UWTpNYXRoLmFjb3ModCl9ZnVuY3Rpb24gV1kodCl7cmV0dXJuIHQ+MT9DWTp0PC0xPy1DWTpNYXRoLmFzaW4odCl9ZnVuY3Rpb24gcVkodCl7cmV0dXJuKHQ9RlkodC8yKSkqdH1mdW5jdGlvbiBZWSgpe31mdW5jdGlvbiBYWSh0LGUpe3QmJktZLmhhc093blByb3BlcnR5KHQudHlwZSkmJktZW3QudHlwZV0odCxlKX12YXIgJFk9e0ZlYXR1cmU6ZnVuY3Rpb24odCxlKXtYWSh0Lmdlb21ldHJ5LGUpfSxGZWF0dXJlQ29sbGVjdGlvbjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmZlYXR1cmVzLGk9LTEscj1uLmxlbmd0aDsrK2k8cjspWFkobltpXS5nZW9tZXRyeSxlKX19LEtZPXtTcGhlcmU6ZnVuY3Rpb24odCxlKXtlLnNwaGVyZSgpfSxQb2ludDpmdW5jdGlvbih0LGUpe2UucG9pbnQoKHQ9dC5jb29yZGluYXRlcylbMF0sdFsxXSx0WzJdKX0sTXVsdGlQb2ludDpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmNvb3JkaW5hdGVzLGk9LTEscj1uLmxlbmd0aDsrK2k8cjspZS5wb2ludCgodD1uW2ldKVswXSx0WzFdLHRbMl0pfSxMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsZSl7WlkodC5jb29yZGluYXRlcyxlLDApfSxNdWx0aUxpbmVTdHJpbmc6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5jb29yZGluYXRlcyxpPS0xLHI9bi5sZW5ndGg7KytpPHI7KVpZKG5baV0sZSwwKX0sUG9seWdvbjpmdW5jdGlvbih0LGUpe0pZKHQuY29vcmRpbmF0ZXMsZSl9LE11bHRpUG9seWdvbjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmNvb3JkaW5hdGVzLGk9LTEscj1uLmxlbmd0aDsrK2k8cjspSlkobltpXSxlKX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuZ2VvbWV0cmllcyxpPS0xLHI9bi5sZW5ndGg7KytpPHI7KVhZKG5baV0sZSl9fTtmdW5jdGlvbiBaWSh0LGUsbil7dmFyIGkscj0tMSxvPXQubGVuZ3RoLW47Zm9yKGUubGluZVN0YXJ0KCk7KytyPG87KWUucG9pbnQoKGk9dFtyXSlbMF0saVsxXSxpWzJdKTtlLmxpbmVFbmQoKX1mdW5jdGlvbiBKWSh0LGUpe3ZhciBuPS0xLGk9dC5sZW5ndGg7Zm9yKGUucG9seWdvblN0YXJ0KCk7KytuPGk7KVpZKHRbbl0sZSwxKTtlLnBvbHlnb25FbmQoKX1mdW5jdGlvbiBRWSh0LGUpe3QmJiRZLmhhc093blByb3BlcnR5KHQudHlwZSk/JFlbdC50eXBlXSh0LGUpOlhZKHQsZSl9dmFyIHRYLGVYLG5YLGlYLHJYLG9YPXhZKCksYVg9eFkoKSxzWD17cG9pbnQ6WVksbGluZVN0YXJ0OllZLGxpbmVFbmQ6WVkscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7b1gucmVzZXQoKSxzWC5saW5lU3RhcnQ9bFgsc1gubGluZUVuZD1jWH0scG9seWdvbkVuZDpmdW5jdGlvbigpe3ZhciB0PStvWDthWC5hZGQodDwwP2tZK3Q6dCksdGhpcy5saW5lU3RhcnQ9dGhpcy5saW5lRW5kPXRoaXMucG9pbnQ9WVl9LHNwaGVyZTpmdW5jdGlvbigpe2FYLmFkZChrWSl9fTtmdW5jdGlvbiBsWCgpe3NYLnBvaW50PXVYfWZ1bmN0aW9uIGNYKCl7aFgodFgsZVgpfWZ1bmN0aW9uIHVYKHQsZSl7c1gucG9pbnQ9aFgsdFg9dCxlWD1lLG5YPXQqPVBZLGlYPU9ZKGU9KGUqPVBZKS8yK0FZKSxyWD1GWShlKX1mdW5jdGlvbiBoWCh0LGUpe3ZhciBuPSh0Kj1QWSktblgsaT1uPj0wPzE6LTEscj1pKm4sbz1PWShlPShlKj1QWSkvMitBWSksYT1GWShlKSxzPXJYKmEsbD1pWCpvK3MqT1kociksYz1zKmkqRlkocik7b1guYWRkKFJZKGMsbCkpLG5YPXQsaVg9byxyWD1hfWZ1bmN0aW9uIGRYKHQpe3JldHVybltSWSh0WzFdLHRbMF0pLFdZKHRbMl0pXX1mdW5jdGlvbiBwWCh0KXt2YXIgZT10WzBdLG49dFsxXSxpPU9ZKG4pO3JldHVybltpKk9ZKGUpLGkqRlkoZSksRlkobildfWZ1bmN0aW9uIGZYKHQsZSl7cmV0dXJuIHRbMF0qZVswXSt0WzFdKmVbMV0rdFsyXSplWzJdfWZ1bmN0aW9uIG1YKHQsZSl7cmV0dXJuW3RbMV0qZVsyXS10WzJdKmVbMV0sdFsyXSplWzBdLXRbMF0qZVsyXSx0WzBdKmVbMV0tdFsxXSplWzBdXX1mdW5jdGlvbiBnWCh0LGUpe3RbMF0rPWVbMF0sdFsxXSs9ZVsxXSx0WzJdKz1lWzJdfWZ1bmN0aW9uIF9YKHQsZSl7cmV0dXJuW3RbMF0qZSx0WzFdKmUsdFsyXSplXX1mdW5jdGlvbiB5WCh0KXt2YXIgZT1VWSh0WzBdKnRbMF0rdFsxXSp0WzFdK3RbMl0qdFsyXSk7dFswXS89ZSx0WzFdLz1lLHRbMl0vPWV9dmFyIHZYLGJYLHhYLHdYLFNYLE1YLEVYLFRYLENYLEFYLGtYLExYLFBYLE5YLElYLFJYLE9YLHpYLERYLEJYLEhYLEZYLFZYLFVYLGpYLEdYLFdYPXhZKCkscVg9e3BvaW50OllYLGxpbmVTdGFydDokWCxsaW5lRW5kOktYLHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3FYLnBvaW50PVpYLHFYLmxpbmVTdGFydD1KWCxxWC5saW5lRW5kPVFYLFdYLnJlc2V0KCksc1gucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtzWC5wb2x5Z29uRW5kKCkscVgucG9pbnQ9WVgscVgubGluZVN0YXJ0PSRYLHFYLmxpbmVFbmQ9S1gsb1g8MD8odlg9LSh4WD0xODApLGJYPS0od1g9OTApKTpXWD5FWT93WD05MDpXWDwtMWUtNiYmKGJYPS05MCksQVhbMF09dlgsQVhbMV09eFh9fTtmdW5jdGlvbiBZWCh0LGUpe0NYLnB1c2goQVg9W3ZYPXQseFg9dF0pLGU8YlgmJihiWD1lKSxlPndYJiYod1g9ZSl9ZnVuY3Rpb24gWFgodCxlKXt2YXIgbj1wWChbdCpQWSxlKlBZXSk7aWYoVFgpe3ZhciBpPW1YKFRYLG4pLHI9bVgoW2lbMV0sLWlbMF0sMF0saSk7eVgocikscj1kWChyKTt2YXIgbyxhPXQtU1gscz1hPjA/MTotMSxsPXJbMF0qTFkqcyxjPU5ZKGEpPjE4MDtjXihzKlNYPGwmJmw8cyp0KT8obz1yWzFdKkxZKT53WCYmKHdYPW8pOmNeKHMqU1g8KGw9KGwrMzYwKSUzNjAtMTgwKSYmbDxzKnQpPyhvPS1yWzFdKkxZKTxiWCYmKGJYPW8pOihlPGJYJiYoYlg9ZSksZT53WCYmKHdYPWUpKSxjP3Q8U1g/dCQodlgsdCk+dCQodlgseFgpJiYoeFg9dCk6dCQodCx4WCk+dCQodlgseFgpJiYodlg9dCk6eFg+PXZYPyh0PHZYJiYodlg9dCksdD54WCYmKHhYPXQpKTp0PlNYP3QkKHZYLHQpPnQkKHZYLHhYKSYmKHhYPXQpOnQkKHQseFgpPnQkKHZYLHhYKSYmKHZYPXQpfWVsc2UgQ1gucHVzaChBWD1bdlg9dCx4WD10XSk7ZTxiWCYmKGJYPWUpLGU+d1gmJih3WD1lKSxUWD1uLFNYPXR9ZnVuY3Rpb24gJFgoKXtxWC5wb2ludD1YWH1mdW5jdGlvbiBLWCgpe0FYWzBdPXZYLEFYWzFdPXhYLHFYLnBvaW50PVlYLFRYPW51bGx9ZnVuY3Rpb24gWlgodCxlKXtpZihUWCl7dmFyIG49dC1TWDtXWC5hZGQoTlkobik+MTgwP24rKG4+MD8zNjA6LTM2MCk6bil9ZWxzZSBNWD10LEVYPWU7c1gucG9pbnQodCxlKSxYWCh0LGUpfWZ1bmN0aW9uIEpYKCl7c1gubGluZVN0YXJ0KCl9ZnVuY3Rpb24gUVgoKXtaWChNWCxFWCksc1gubGluZUVuZCgpLE5ZKFdYKT5FWSYmKHZYPS0oeFg9MTgwKSksQVhbMF09dlgsQVhbMV09eFgsVFg9bnVsbH1mdW5jdGlvbiB0JCh0LGUpe3JldHVybihlLT10KTwwP2UrMzYwOmV9ZnVuY3Rpb24gZSQodCxlKXtyZXR1cm4gdFswXS1lWzBdfWZ1bmN0aW9uIG4kKHQsZSl7cmV0dXJuIHRbMF08PXRbMV0/dFswXTw9ZSYmZTw9dFsxXTplPHRbMF18fHRbMV08ZX12YXIgaSQ9e3NwaGVyZTpZWSxwb2ludDpyJCxsaW5lU3RhcnQ6YSQsbGluZUVuZDpjJCxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtpJC5saW5lU3RhcnQ9dSQsaSQubGluZUVuZD1oJH0scG9seWdvbkVuZDpmdW5jdGlvbigpe2kkLmxpbmVTdGFydD1hJCxpJC5saW5lRW5kPWMkfX07ZnVuY3Rpb24gciQodCxlKXt0Kj1QWTt2YXIgbj1PWShlKj1QWSk7byQobipPWSh0KSxuKkZZKHQpLEZZKGUpKX1mdW5jdGlvbiBvJCh0LGUsbil7KytrWCxQWCs9KHQtUFgpL2tYLE5YKz0oZS1OWCkva1gsSVgrPShuLUlYKS9rWH1mdW5jdGlvbiBhJCgpe2kkLnBvaW50PXMkfWZ1bmN0aW9uIHMkKHQsZSl7dCo9UFk7dmFyIG49T1koZSo9UFkpO1VYPW4qT1kodCksalg9bipGWSh0KSxHWD1GWShlKSxpJC5wb2ludD1sJCxvJChVWCxqWCxHWCl9ZnVuY3Rpb24gbCQodCxlKXt0Kj1QWTt2YXIgbj1PWShlKj1QWSksaT1uKk9ZKHQpLHI9bipGWSh0KSxvPUZZKGUpLGE9UlkoVVkoKGE9algqby1HWCpyKSphKyhhPUdYKmktVVgqbykqYSsoYT1VWCpyLWpYKmkpKmEpLFVYKmkralgqcitHWCpvKTtMWCs9YSxSWCs9YSooVVgrKFVYPWkpKSxPWCs9YSooalgrKGpYPXIpKSx6WCs9YSooR1grKEdYPW8pKSxvJChVWCxqWCxHWCl9ZnVuY3Rpb24gYyQoKXtpJC5wb2ludD1yJH1mdW5jdGlvbiB1JCgpe2kkLnBvaW50PWQkfWZ1bmN0aW9uIGgkKCl7cCQoRlgsVlgpLGkkLnBvaW50PXIkfWZ1bmN0aW9uIGQkKHQsZSl7Rlg9dCxWWD1lLHQqPVBZLGUqPVBZLGkkLnBvaW50PXAkO3ZhciBuPU9ZKGUpO1VYPW4qT1kodCksalg9bipGWSh0KSxHWD1GWShlKSxvJChVWCxqWCxHWCl9ZnVuY3Rpb24gcCQodCxlKXt0Kj1QWTt2YXIgbj1PWShlKj1QWSksaT1uKk9ZKHQpLHI9bipGWSh0KSxvPUZZKGUpLGE9algqby1HWCpyLHM9R1gqaS1VWCpvLGw9VVgqci1qWCppLGM9VVkoYSphK3MqcytsKmwpLHU9V1koYyksaD1jJiYtdS9jO0RYKz1oKmEsQlgrPWgqcyxIWCs9aCpsLExYKz11LFJYKz11KihVWCsoVVg9aSkpLE9YKz11KihqWCsoalg9cikpLHpYKz11KihHWCsoR1g9bykpLG8kKFVYLGpYLEdYKX1mdW5jdGlvbiBmJCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gbSQodCxlKXtmdW5jdGlvbiBuKG4saSl7cmV0dXJuIG49dChuLGkpLGUoblswXSxuWzFdKX1yZXR1cm4gdC5pbnZlcnQmJmUuaW52ZXJ0JiYobi5pbnZlcnQ9ZnVuY3Rpb24obixpKXtyZXR1cm4obj1lLmludmVydChuLGkpKSYmdC5pbnZlcnQoblswXSxuWzFdKX0pLG59ZnVuY3Rpb24gZyQodCxlKXtyZXR1cm5bdD5UWT90LWtZOnQ8LVRZP3Qra1k6dCxlXX1mdW5jdGlvbiBfJCh0LGUsbil7cmV0dXJuKHQlPWtZKT9lfHxuP20kKHYkKHQpLGIkKGUsbikpOnYkKHQpOmV8fG4/YiQoZSxuKTpnJH1mdW5jdGlvbiB5JCh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXtyZXR1cm5bKGUrPXQpPlRZP2Uta1k6ZTwtVFk/ZStrWTplLG5dfX1mdW5jdGlvbiB2JCh0KXt2YXIgZT15JCh0KTtyZXR1cm4gZS5pbnZlcnQ9eSQoLXQpLGV9ZnVuY3Rpb24gYiQodCxlKXt2YXIgbj1PWSh0KSxpPUZZKHQpLHI9T1koZSksbz1GWShlKTtmdW5jdGlvbiBhKHQsZSl7dmFyIGE9T1koZSkscz1PWSh0KSphLGw9RlkodCkqYSxjPUZZKGUpLHU9YypuK3MqaTtyZXR1cm5bUlkobCpyLXUqbyxzKm4tYyppKSxXWSh1KnIrbCpvKV19cmV0dXJuIGEuaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7dmFyIGE9T1koZSkscz1PWSh0KSphLGw9RlkodCkqYSxjPUZZKGUpLHU9YypyLWwqbztyZXR1cm5bUlkobCpyK2MqbyxzKm4rdSppKSxXWSh1Km4tcyppKV19LGF9ZnVuY3Rpb24geCQodCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4oZT10KGVbMF0qUFksZVsxXSpQWSkpWzBdKj1MWSxlWzFdKj1MWSxlfXJldHVybiB0PV8kKHRbMF0qUFksdFsxXSpQWSx0Lmxlbmd0aD4yP3RbMl0qUFk6MCksZS5pbnZlcnQ9ZnVuY3Rpb24oZSl7cmV0dXJuKGU9dC5pbnZlcnQoZVswXSpQWSxlWzFdKlBZKSlbMF0qPUxZLGVbMV0qPUxZLGV9LGV9ZnVuY3Rpb24gdyQodCxlLG4saSxyLG8pe2lmKG4pe3ZhciBhPU9ZKGUpLHM9RlkoZSksbD1pKm47bnVsbD09cj8ocj1lK2kqa1ksbz1lLWwvMik6KHI9UyQoYSxyKSxvPVMkKGEsbyksKGk+MD9yPG86cj5vKSYmKHIrPWkqa1kpKTtmb3IodmFyIGMsdT1yO2k+MD91Pm86dTxvO3UtPWwpYz1kWChbYSwtcypPWSh1KSwtcypGWSh1KV0pLHQucG9pbnQoY1swXSxjWzFdKX19ZnVuY3Rpb24gUyQodCxlKXsoZT1wWChlKSlbMF0tPXQseVgoZSk7dmFyIG49R1koLWVbMV0pO3JldHVybigoLWVbMl08MD8tbjpuKStrWS1FWSkla1l9ZnVuY3Rpb24gTSQoKXt2YXIgdCxlPVtdO3JldHVybntwb2ludDpmdW5jdGlvbihlLG4pe3QucHVzaChbZSxuXSl9LGxpbmVTdGFydDpmdW5jdGlvbigpe2UucHVzaCh0PVtdKX0sbGluZUVuZDpZWSxyZWpvaW46ZnVuY3Rpb24oKXtlLmxlbmd0aD4xJiZlLnB1c2goZS5wb3AoKS5jb25jYXQoZS5zaGlmdCgpKSl9LHJlc3VsdDpmdW5jdGlvbigpe3ZhciBuPWU7cmV0dXJuIGU9W10sdD1udWxsLG59fX1mdW5jdGlvbiBFJCh0LGUpe3JldHVybiBOWSh0WzBdLWVbMF0pPEVZJiZOWSh0WzFdLWVbMV0pPEVZfWZ1bmN0aW9uIFQkKHQsZSxuLGkpe3RoaXMueD10LHRoaXMuej1lLHRoaXMubz1uLHRoaXMuZT1pLHRoaXMudj0hMSx0aGlzLm49dGhpcy5wPW51bGx9ZnVuY3Rpb24gQyQodCxlLG4saSxyKXt2YXIgbyxhLHM9W10sbD1bXTtpZih0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKCEoKGU9dC5sZW5ndGgtMSk8PTApKXt2YXIgZSxuLGk9dFswXSxhPXRbZV07aWYoRSQoaSxhKSl7Zm9yKHIubGluZVN0YXJ0KCksbz0wO288ZTsrK28pci5wb2ludCgoaT10W29dKVswXSxpWzFdKTtyLmxpbmVFbmQoKX1lbHNlIHMucHVzaChuPW5ldyBUJChpLHQsbnVsbCwhMCkpLGwucHVzaChuLm89bmV3IFQkKGksbnVsbCxuLCExKSkscy5wdXNoKG49bmV3IFQkKGEsdCxudWxsLCExKSksbC5wdXNoKG4ubz1uZXcgVCQoYSxudWxsLG4sITApKX19KSkscy5sZW5ndGgpe2ZvcihsLnNvcnQoZSksQSQocyksQSQobCksbz0wLGE9bC5sZW5ndGg7bzxhOysrbylsW29dLmU9bj0hbjtmb3IodmFyIGMsdSxoPXNbMF07Oyl7Zm9yKHZhciBkPWgscD0hMDtkLnY7KWlmKChkPWQubik9PT1oKXJldHVybjtjPWQueixyLmxpbmVTdGFydCgpO2Rve2lmKGQudj1kLm8udj0hMCxkLmUpe2lmKHApZm9yKG89MCxhPWMubGVuZ3RoO288YTsrK28pci5wb2ludCgodT1jW29dKVswXSx1WzFdKTtlbHNlIGkoZC54LGQubi54LDEscik7ZD1kLm59ZWxzZXtpZihwKWZvcihvPShjPWQucC56KS5sZW5ndGgtMTtvPj0wOy0tbylyLnBvaW50KCh1PWNbb10pWzBdLHVbMV0pO2Vsc2UgaShkLngsZC5wLngsLTEscik7ZD1kLnB9Yz0oZD1kLm8pLnoscD0hcH13aGlsZSghZC52KTtyLmxpbmVFbmQoKX19fWZ1bmN0aW9uIEEkKHQpe2lmKGU9dC5sZW5ndGgpe2Zvcih2YXIgZSxuLGk9MCxyPXRbMF07KytpPGU7KXIubj1uPXRbaV0sbi5wPXIscj1uO3Iubj1uPXRbMF0sbi5wPXJ9fWckLmludmVydD1nJDt2YXIgayQ9eFkoKTtmdW5jdGlvbiBMJCh0LGUpe3ZhciBuPWVbMF0saT1lWzFdLHI9W0ZZKG4pLC1PWShuKSwwXSxvPTAsYT0wO2skLnJlc2V0KCk7Zm9yKHZhciBzPTAsbD10Lmxlbmd0aDtzPGw7KytzKWlmKHU9KGM9dFtzXSkubGVuZ3RoKWZvcih2YXIgYyx1LGg9Y1t1LTFdLGQ9aFswXSxwPWhbMV0vMitBWSxmPUZZKHApLG09T1kocCksZz0wO2c8dTsrK2csZD15LGY9YixtPXgsaD1fKXt2YXIgXz1jW2ddLHk9X1swXSx2PV9bMV0vMitBWSxiPUZZKHYpLHg9T1kodiksdz15LWQsUz13Pj0wPzE6LTEsTT1TKncsRT1NPlRZLFQ9ZipiO2lmKGskLmFkZChSWShUKlMqRlkoTSksbSp4K1QqT1koTSkpKSxvKz1FP3crUyprWTp3LEVeZD49bl55Pj1uKXt2YXIgQz1tWChwWChoKSxwWChfKSk7eVgoQyk7dmFyIEE9bVgocixDKTt5WChBKTt2YXIgaz0oRV53Pj0wPy0xOjEpKldZKEFbMl0pOyhpPmt8fGk9PT1rJiYoQ1swXXx8Q1sxXSkpJiYoYSs9RV53Pj0wPzE6LTEpfX1yZXR1cm4obzwtMWUtNnx8bzxFWSYmayQ8LTFlLTYpXjEmYX1mdW5jdGlvbiBQJCh0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6dD49ZT8wOk5hTn1mdW5jdGlvbiBOJCh0LGUsbil7dD0rdCxlPStlLG49KHI9YXJndW1lbnRzLmxlbmd0aCk8Mj8oZT10LHQ9MCwxKTpyPDM/MTorbjtmb3IodmFyIGk9LTEscj0wfE1hdGgubWF4KDAsTWF0aC5jZWlsKChlLXQpL24pKSxvPW5ldyBBcnJheShyKTsrK2k8cjspb1tpXT10K2kqbjtyZXR1cm4gb31mdW5jdGlvbiBJJCh0KXtmb3IodmFyIGUsbixpLHI9dC5sZW5ndGgsbz0tMSxhPTA7KytvPHI7KWErPXRbb10ubGVuZ3RoO2ZvcihuPW5ldyBBcnJheShhKTstLXI+PTA7KWZvcihlPShpPXRbcl0pLmxlbmd0aDstLWU+PTA7KW5bLS1hXT1pW2VdO3JldHVybiBufWZ1bmN0aW9uIFIkKHQsZSxuLGkpe3JldHVybiBmdW5jdGlvbihyKXt2YXIgbyxhLHMsbD1lKHIpLGM9TSQoKSx1PWUoYyksaD0hMSxkPXtwb2ludDpwLGxpbmVTdGFydDptLGxpbmVFbmQ6Zyxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtkLnBvaW50PV8sZC5saW5lU3RhcnQ9eSxkLmxpbmVFbmQ9dixhPVtdLG89W119LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtkLnBvaW50PXAsZC5saW5lU3RhcnQ9bSxkLmxpbmVFbmQ9ZyxhPUkkKGEpO3ZhciB0PUwkKG8saSk7YS5sZW5ndGg/KGh8fChyLnBvbHlnb25TdGFydCgpLGg9ITApLEMkKGEseiQsdCxuLHIpKTp0JiYoaHx8KHIucG9seWdvblN0YXJ0KCksaD0hMCksci5saW5lU3RhcnQoKSxuKG51bGwsbnVsbCwxLHIpLHIubGluZUVuZCgpKSxoJiYoci5wb2x5Z29uRW5kKCksaD0hMSksYT1vPW51bGx9LHNwaGVyZTpmdW5jdGlvbigpe3IucG9seWdvblN0YXJ0KCksci5saW5lU3RhcnQoKSxuKG51bGwsbnVsbCwxLHIpLHIubGluZUVuZCgpLHIucG9seWdvbkVuZCgpfX07ZnVuY3Rpb24gcChlLG4pe3QoZSxuKSYmci5wb2ludChlLG4pfWZ1bmN0aW9uIGYodCxlKXtsLnBvaW50KHQsZSl9ZnVuY3Rpb24gbSgpe2QucG9pbnQ9ZixsLmxpbmVTdGFydCgpfWZ1bmN0aW9uIGcoKXtkLnBvaW50PXAsbC5saW5lRW5kKCl9ZnVuY3Rpb24gXyh0LGUpe3MucHVzaChbdCxlXSksdS5wb2ludCh0LGUpfWZ1bmN0aW9uIHkoKXt1LmxpbmVTdGFydCgpLHM9W119ZnVuY3Rpb24gdigpe18oc1swXVswXSxzWzBdWzFdKSx1LmxpbmVFbmQoKTt2YXIgdCxlLG4saSxsPXUuY2xlYW4oKSxkPWMucmVzdWx0KCkscD1kLmxlbmd0aDtpZihzLnBvcCgpLG8ucHVzaChzKSxzPW51bGwscClpZigxJmwpe2lmKChlPShuPWRbMF0pLmxlbmd0aC0xKT4wKXtmb3IoaHx8KHIucG9seWdvblN0YXJ0KCksaD0hMCksci5saW5lU3RhcnQoKSx0PTA7dDxlOysrdClyLnBvaW50KChpPW5bdF0pWzBdLGlbMV0pO3IubGluZUVuZCgpfX1lbHNlIHA+MSYmMiZsJiZkLnB1c2goZC5wb3AoKS5jb25jYXQoZC5zaGlmdCgpKSksYS5wdXNoKGQuZmlsdGVyKE8kKSl9cmV0dXJuIGR9fWZ1bmN0aW9uIE8kKHQpe3JldHVybiB0Lmxlbmd0aD4xfWZ1bmN0aW9uIHokKHQsZSl7cmV0dXJuKCh0PXQueClbMF08MD90WzFdLUNZLUVZOkNZLXRbMV0pLSgoZT1lLngpWzBdPDA/ZVsxXS1DWS1FWTpDWS1lWzFdKX0hKGZ1bmN0aW9uIEQkKHQpe3JldHVybiAxPT09dC5sZW5ndGgmJih0PShmdW5jdGlvbiBlKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3JldHVybiBQJCh0KGUpLG4pfX0pKHQpKSx7bGVmdDpmdW5jdGlvbihlLG4saSxyKXtmb3IobnVsbD09aSYmKGk9MCksbnVsbD09ciYmKHI9ZS5sZW5ndGgpO2k8cjspe3ZhciBvPWkrcj4+PjE7dChlW29dLG4pPDA/aT1vKzE6cj1vfXJldHVybiBpfSxyaWdodDpmdW5jdGlvbihlLG4saSxyKXtmb3IobnVsbD09aSYmKGk9MCksbnVsbD09ciYmKHI9ZS5sZW5ndGgpO2k8cjspe3ZhciBvPWkrcj4+PjE7dChlW29dLG4pPjA/cj1vOmk9bysxfXJldHVybiBpfX19KShQJCk7dmFyIEIkPVIkKChmdW5jdGlvbigpe3JldHVybiEwfSksKGZ1bmN0aW9uIEgkKHQpe3ZhciBlLG49TmFOLGk9TmFOLHI9TmFOO3JldHVybntsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0LmxpbmVTdGFydCgpLGU9MX0scG9pbnQ6ZnVuY3Rpb24obyxhKXt2YXIgcz1vPjA/VFk6LVRZLGw9Tlkoby1uKTtOWShsLVRZKTxFWT8odC5wb2ludChuLGk9KGkrYSkvMj4wP0NZOi1DWSksdC5wb2ludChyLGkpLHQubGluZUVuZCgpLHQubGluZVN0YXJ0KCksdC5wb2ludChzLGkpLHQucG9pbnQobyxpKSxlPTApOnIhPT1zJiZsPj1UWSYmKE5ZKG4tcik8RVkmJihuLT1yKkVZKSxOWShvLXMpPEVZJiYoby09cypFWSksaT0oZnVuY3Rpb24gYyh0LGUsbixpKXt2YXIgcixvLGE9RlkodC1uKTtyZXR1cm4gTlkoYSk+RVk/SVkoKEZZKGUpKihvPU9ZKGkpKSpGWShuKS1GWShpKSoocj1PWShlKSkqRlkodCkpLyhyKm8qYSkpOihlK2kpLzJ9KShuLGksbyxhKSx0LnBvaW50KHIsaSksdC5saW5lRW5kKCksdC5saW5lU3RhcnQoKSx0LnBvaW50KHMsaSksZT0wKSx0LnBvaW50KG49byxpPWEpLHI9c30sbGluZUVuZDpmdW5jdGlvbigpe3QubGluZUVuZCgpLG49aT1OYU59LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIDItZX19fSksKGZ1bmN0aW9uIEYkKHQsZSxuLGkpe3ZhciByO2lmKG51bGw9PXQpaS5wb2ludCgtVFkscj1uKkNZKSxpLnBvaW50KDAsciksaS5wb2ludChUWSxyKSxpLnBvaW50KFRZLDApLGkucG9pbnQoVFksLXIpLGkucG9pbnQoMCwtciksaS5wb2ludCgtVFksLXIpLGkucG9pbnQoLVRZLDApLGkucG9pbnQoLVRZLHIpO2Vsc2UgaWYoTlkodFswXS1lWzBdKT5FWSl7dmFyIG89dFswXTxlWzBdP1RZOi1UWTtpLnBvaW50KC1vLHI9bipvLzIpLGkucG9pbnQoMCxyKSxpLnBvaW50KG8scil9ZWxzZSBpLnBvaW50KGVbMF0sZVsxXSl9KSxbLVRZLC1DWV0pO2Z1bmN0aW9uIFYkKHQpe3ZhciBlPU9ZKHQpLG49NipQWSxpPWU+MCxyPU5ZKGUpPkVZO2Z1bmN0aW9uIG8odCxuKXtyZXR1cm4gT1kodCkqT1kobik+ZX1mdW5jdGlvbiBhKHQsbixpKXt2YXIgcj1bMSwwLDBdLG89bVgocFgodCkscFgobikpLGE9ZlgobyxvKSxzPW9bMF0sbD1hLXMqcztpZighbClyZXR1cm4haSYmdDt2YXIgYz1lKmEvbCx1PS1lKnMvbCxoPW1YKHIsbyksZD1fWChyLGMpO2dYKGQsX1gobyx1KSk7dmFyIHA9aCxmPWZYKGQscCksbT1mWChwLHApLGc9ZipmLW0qKGZYKGQsZCktMSk7aWYoIShnPDApKXt2YXIgXz1VWShnKSx5PV9YKHAsKC1mLV8pL20pO2lmKGdYKHksZCkseT1kWCh5KSwhaSlyZXR1cm4geTt2YXIgdixiPXRbMF0seD1uWzBdLHc9dFsxXSxTPW5bMV07eDxiJiYodj1iLGI9eCx4PXYpO3ZhciBNPXgtYixFPU5ZKE0tVFkpPEVZO2lmKCFFJiZTPHcmJih2PXcsdz1TLFM9diksRXx8TTxFWT9FP3crUz4wXnlbMV08KE5ZKHlbMF0tYik8RVk/dzpTKTp3PD15WzFdJiZ5WzFdPD1TOk0+VFleKGI8PXlbMF0mJnlbMF08PXgpKXt2YXIgVD1fWChwLCgtZitfKS9tKTtyZXR1cm4gZ1goVCxkKSxbeSxkWChUKV19fX1mdW5jdGlvbiBzKGUsbil7dmFyIHI9aT90OlRZLXQsbz0wO3JldHVybiBlPC1yP298PTE6ZT5yJiYob3w9Miksbjwtcj9vfD00Om4+ciYmKG98PTgpLG99cmV0dXJuIFIkKG8sKGZ1bmN0aW9uIGwodCl7dmFyIGUsbixsLGMsdTtyZXR1cm57bGluZVN0YXJ0OmZ1bmN0aW9uKCl7Yz1sPSExLHU9MX0scG9pbnQ6ZnVuY3Rpb24oaCxkKXt2YXIgcCxmPVtoLGRdLG09byhoLGQpLGc9aT9tPzA6cyhoLGQpOm0/cyhoKyhoPDA/VFk6LVRZKSxkKTowO2lmKCFlJiYoYz1sPW0pJiZ0LmxpbmVTdGFydCgpLG0hPT1sJiYoIShwPWEoZSxmKSl8fEUkKGUscCl8fEUkKGYscCkpJiYoZlswXSs9RVksZlsxXSs9RVksbT1vKGZbMF0sZlsxXSkpLG0hPT1sKXU9MCxtPyh0LmxpbmVTdGFydCgpLHA9YShmLGUpLHQucG9pbnQocFswXSxwWzFdKSk6KHA9YShlLGYpLHQucG9pbnQocFswXSxwWzFdKSx0LmxpbmVFbmQoKSksZT1wO2Vsc2UgaWYociYmZSYmaV5tKXt2YXIgXztnJm58fCEoXz1hKGYsZSwhMCkpfHwodT0wLGk/KHQubGluZVN0YXJ0KCksdC5wb2ludChfWzBdWzBdLF9bMF1bMV0pLHQucG9pbnQoX1sxXVswXSxfWzFdWzFdKSx0LmxpbmVFbmQoKSk6KHQucG9pbnQoX1sxXVswXSxfWzFdWzFdKSx0LmxpbmVFbmQoKSx0LmxpbmVTdGFydCgpLHQucG9pbnQoX1swXVswXSxfWzBdWzFdKSkpfSFtfHxlJiZFJChlLGYpfHx0LnBvaW50KGZbMF0sZlsxXSksZT1mLGw9bSxuPWd9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtsJiZ0LmxpbmVFbmQoKSxlPW51bGx9LGNsZWFuOmZ1bmN0aW9uKCl7cmV0dXJuIHV8KGMmJmwpPDwxfX19KSwoZnVuY3Rpb24gYyhlLGkscixvKXt3JChvLHQsbixyLGUsaSl9KSxpP1swLC10XTpbLVRZLHQtVFldKX12YXIgVSQ9MWU5LGokPS1VJDtmdW5jdGlvbiBHJCh0LGUsbixpKXtmdW5jdGlvbiByKHIsbyl7cmV0dXJuIHQ8PXImJnI8PW4mJmU8PW8mJm88PWl9ZnVuY3Rpb24gbyhyLG8scyxjKXt2YXIgdT0wLGg9MDtpZihudWxsPT1yfHwodT1hKHIscykpIT09KGg9YShvLHMpKXx8bChyLG8pPDBecz4wKWRve2MucG9pbnQoMD09PXV8fDM9PT11P3Q6bix1PjE/aTplKX13aGlsZSgodT0odStzKzQpJTQpIT09aCk7ZWxzZSBjLnBvaW50KG9bMF0sb1sxXSl9ZnVuY3Rpb24gYShpLHIpe3JldHVybiBOWShpWzBdLXQpPEVZP3I+MD8wOjM6TlkoaVswXS1uKTxFWT9yPjA/MjoxOk5ZKGlbMV0tZSk8RVk/cj4wPzE6MDpyPjA/MzoyfWZ1bmN0aW9uIHModCxlKXtyZXR1cm4gbCh0LngsZS54KX1mdW5jdGlvbiBsKHQsZSl7dmFyIG49YSh0LDEpLGk9YShlLDEpO3JldHVybiBuIT09aT9uLWk6MD09PW4/ZVsxXS10WzFdOjE9PT1uP3RbMF0tZVswXToyPT09bj90WzFdLWVbMV06ZVswXS10WzBdfXJldHVybiBmdW5jdGlvbihhKXt2YXIgbCxjLHUsaCxkLHAsZixtLGcsXyx5LHY9YSxiPU0kKCkseD17cG9pbnQ6VCxsaW5lU3RhcnQ6ZnVuY3Rpb24gdygpe3gucG9pbnQ9QyxjJiZjLnB1c2godT1bXSk7Xz0hMCxnPSExLGY9bT1OYU59LGxpbmVFbmQ6ZnVuY3Rpb24gUygpe2wmJihDKGgsZCkscCYmZyYmYi5yZWpvaW4oKSxsLnB1c2goYi5yZXN1bHQoKSkpO3gucG9pbnQ9VCxnJiZ2LmxpbmVFbmQoKX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uIE0oKXt2PWIsbD1bXSxjPVtdLHk9ITB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24gRSgpe3ZhciBlPShmdW5jdGlvbiBuKCl7Zm9yKHZhciBlPTAsbj0wLHI9Yy5sZW5ndGg7bjxyOysrbilmb3IodmFyIG8sYSxzPWNbbl0sbD0xLHU9cy5sZW5ndGgsaD1zWzBdLGQ9aFswXSxwPWhbMV07bDx1OysrbClvPWQsYT1wLGQ9KGg9c1tsXSlbMF0scD1oWzFdLGE8PWk/cD5pJiYoZC1vKSooaS1hKT4ocC1hKSoodC1vKSYmKytlOnA8PWkmJihkLW8pKihpLWEpPChwLWEpKih0LW8pJiYtLWU7cmV0dXJuIGV9KSgpLHI9eSYmZSxoPShsPUkkKGwpKS5sZW5ndGg7KHJ8fGgpJiYoYS5wb2x5Z29uU3RhcnQoKSxyJiYoYS5saW5lU3RhcnQoKSxvKG51bGwsbnVsbCwxLGEpLGEubGluZUVuZCgpKSxoJiZDJChsLHMsZSxvLGEpLGEucG9seWdvbkVuZCgpKTt2PWEsbD1jPXU9bnVsbH19O2Z1bmN0aW9uIFQodCxlKXtyKHQsZSkmJnYucG9pbnQodCxlKX1mdW5jdGlvbiBDKG8sYSl7dmFyIHM9cihvLGEpO2lmKGMmJnUucHVzaChbbyxhXSksXyloPW8sZD1hLHA9cyxfPSExLHMmJih2LmxpbmVTdGFydCgpLHYucG9pbnQobyxhKSk7ZWxzZSBpZihzJiZnKXYucG9pbnQobyxhKTtlbHNle3ZhciBsPVtmPU1hdGgubWF4KGokLE1hdGgubWluKFUkLGYpKSxtPU1hdGgubWF4KGokLE1hdGgubWluKFUkLG0pKV0sYj1bbz1NYXRoLm1heChqJCxNYXRoLm1pbihVJCxvKSksYT1NYXRoLm1heChqJCxNYXRoLm1pbihVJCxhKSldOyEoZnVuY3Rpb24geCh0LGUsbixpLHIsbyl7dmFyIGEscz10WzBdLGw9dFsxXSxjPTAsdT0xLGg9ZVswXS1zLGQ9ZVsxXS1sO2lmKGE9bi1zLGh8fCEoYT4wKSl7aWYoYS89aCxoPDApe2lmKGE8YylyZXR1cm47YTx1JiYodT1hKX1lbHNlIGlmKGg+MCl7aWYoYT51KXJldHVybjthPmMmJihjPWEpfWlmKGE9ci1zLGh8fCEoYTwwKSl7aWYoYS89aCxoPDApe2lmKGE+dSlyZXR1cm47YT5jJiYoYz1hKX1lbHNlIGlmKGg+MCl7aWYoYTxjKXJldHVybjthPHUmJih1PWEpfWlmKGE9aS1sLGR8fCEoYT4wKSl7aWYoYS89ZCxkPDApe2lmKGE8YylyZXR1cm47YTx1JiYodT1hKX1lbHNlIGlmKGQ+MCl7aWYoYT51KXJldHVybjthPmMmJihjPWEpfWlmKGE9by1sLGR8fCEoYTwwKSl7aWYoYS89ZCxkPDApe2lmKGE+dSlyZXR1cm47YT5jJiYoYz1hKX1lbHNlIGlmKGQ+MCl7aWYoYTxjKXJldHVybjthPHUmJih1PWEpfXJldHVybiBjPjAmJih0WzBdPXMrYypoLHRbMV09bCtjKmQpLHU8MSYmKGVbMF09cyt1KmgsZVsxXT1sK3UqZCksITB9fX19fSkobCxiLHQsZSxuLGkpP3MmJih2LmxpbmVTdGFydCgpLHYucG9pbnQobyxhKSx5PSExKTooZ3x8KHYubGluZVN0YXJ0KCksdi5wb2ludChsWzBdLGxbMV0pKSx2LnBvaW50KGJbMF0sYlsxXSksc3x8di5saW5lRW5kKCkseT0hMSl9Zj1vLG09YSxnPXN9cmV0dXJuIHh9fXZhciBXJCxxJCxZJCxYJD14WSgpLCQkPXtzcGhlcmU6WVkscG9pbnQ6WVksbGluZVN0YXJ0OmZ1bmN0aW9uIEskKCl7JCQucG9pbnQ9SiQsJCQubGluZUVuZD1aJH0sbGluZUVuZDpZWSxwb2x5Z29uU3RhcnQ6WVkscG9seWdvbkVuZDpZWX07ZnVuY3Rpb24gWiQoKXskJC5wb2ludD0kJC5saW5lRW5kPVlZfWZ1bmN0aW9uIEokKHQsZSl7VyQ9dCo9UFkscSQ9RlkoZSo9UFkpLFkkPU9ZKGUpLCQkLnBvaW50PVEkfWZ1bmN0aW9uIFEkKHQsZSl7dCo9UFk7dmFyIG49RlkoZSo9UFkpLGk9T1koZSkscj1OWSh0LVckKSxvPU9ZKHIpLGE9aSpGWShyKSxzPVkkKm4tcSQqaSpvLGw9cSQqbitZJCppKm87WCQuYWRkKFJZKFVZKGEqYStzKnMpLGwpKSxXJD10LHEkPW4sWSQ9aX1mdW5jdGlvbiB0Syh0KXtyZXR1cm4gWCQucmVzZXQoKSxRWSh0LCQkKSwrWCR9dmFyIGVLPVtudWxsLG51bGxdLG5LPXt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczplS307ZnVuY3Rpb24gaUsodCxlKXtyZXR1cm4gZUtbMF09dCxlS1sxXT1lLHRLKG5LKX12YXIgcks9e0ZlYXR1cmU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gYUsodC5nZW9tZXRyeSxlKX0sRmVhdHVyZUNvbGxlY3Rpb246ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5mZWF0dXJlcyxpPS0xLHI9bi5sZW5ndGg7KytpPHI7KWlmKGFLKG5baV0uZ2VvbWV0cnksZSkpcmV0dXJuITA7cmV0dXJuITF9fSxvSz17U3BoZXJlOmZ1bmN0aW9uKCl7cmV0dXJuITB9LFBvaW50OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHNLKHQuY29vcmRpbmF0ZXMsZSl9LE11bHRpUG9pbnQ6ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49dC5jb29yZGluYXRlcyxpPS0xLHI9bi5sZW5ndGg7KytpPHI7KWlmKHNLKG5baV0sZSkpcmV0dXJuITA7cmV0dXJuITF9LExpbmVTdHJpbmc6ZnVuY3Rpb24odCxlKXtyZXR1cm4gbEsodC5jb29yZGluYXRlcyxlKX0sTXVsdGlMaW5lU3RyaW5nOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuY29vcmRpbmF0ZXMsaT0tMSxyPW4ubGVuZ3RoOysraTxyOylpZihsSyhuW2ldLGUpKXJldHVybiEwO3JldHVybiExfSxQb2x5Z29uOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGNLKHQuY29vcmRpbmF0ZXMsZSl9LE11bHRpUG9seWdvbjpmdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10LmNvb3JkaW5hdGVzLGk9LTEscj1uLmxlbmd0aDsrK2k8cjspaWYoY0sobltpXSxlKSlyZXR1cm4hMDtyZXR1cm4hMX0sR2VvbWV0cnlDb2xsZWN0aW9uOmZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXQuZ2VvbWV0cmllcyxpPS0xLHI9bi5sZW5ndGg7KytpPHI7KWlmKGFLKG5baV0sZSkpcmV0dXJuITA7cmV0dXJuITF9fTtmdW5jdGlvbiBhSyh0LGUpe3JldHVybiEoIXR8fCFvSy5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpKSYmb0tbdC50eXBlXSh0LGUpfWZ1bmN0aW9uIHNLKHQsZSl7cmV0dXJuIDA9PT1pSyh0LGUpfWZ1bmN0aW9uIGxLKHQsZSl7dmFyIG49aUsodFswXSx0WzFdKTtyZXR1cm4gaUsodFswXSxlKStpSyhlLHRbMV0pPD1uK0VZfWZ1bmN0aW9uIGNLKHQsZSl7cmV0dXJuISFMJCh0Lm1hcCh1SyksaEsoZSkpfWZ1bmN0aW9uIHVLKHQpe3JldHVybih0PXQubWFwKGhLKSkucG9wKCksdH1mdW5jdGlvbiBoSyh0KXtyZXR1cm5bdFswXSpQWSx0WzFdKlBZXX1mdW5jdGlvbiBkSyh0LGUsbil7dmFyIGk9TiQodCxlLUVZLG4pLmNvbmNhdChlKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGkubWFwKChmdW5jdGlvbihlKXtyZXR1cm5bdCxlXX0pKX19ZnVuY3Rpb24gcEsodCxlLG4pe3ZhciBpPU4kKHQsZS1FWSxuKS5jb25jYXQoZSk7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuW2UsdF19KSl9fWZ1bmN0aW9uIGZLKCl7dmFyIHQsZSxuLGkscixvLGEscyxsLGMsdSxoLGQ9MTAscD1kLGY9OTAsbT0zNjAsZz0yLjU7ZnVuY3Rpb24gXygpe3JldHVybnt0eXBlOiJNdWx0aUxpbmVTdHJpbmciLGNvb3JkaW5hdGVzOnkoKX19ZnVuY3Rpb24geSgpe3JldHVybiBOJCh6WShpL2YpKmYsbixmKS5tYXAodSkuY29uY2F0KE4kKHpZKHMvbSkqbSxhLG0pLm1hcChoKSkuY29uY2F0KE4kKHpZKGUvZCkqZCx0LGQpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIE5ZKHQlZik+RVl9KSkubWFwKGwpKS5jb25jYXQoTiQoelkoby9wKSpwLHIscCkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gTlkodCVtKT5FWX0pKS5tYXAoYykpfXJldHVybiBfLmxpbmVzPWZ1bmN0aW9uKCl7cmV0dXJuIHkoKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybnt0eXBlOiJMaW5lU3RyaW5nIixjb29yZGluYXRlczp0fX0pKX0sXy5vdXRsaW5lPWZ1bmN0aW9uKCl7cmV0dXJue3R5cGU6IlBvbHlnb24iLGNvb3JkaW5hdGVzOlt1KGkpLmNvbmNhdChoKGEpLnNsaWNlKDEpLHUobikucmV2ZXJzZSgpLnNsaWNlKDEpLGgocykucmV2ZXJzZSgpLnNsaWNlKDEpKV19fSxfLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9fLmV4dGVudE1ham9yKHQpLmV4dGVudE1pbm9yKHQpOl8uZXh0ZW50TWlub3IoKX0sXy5leHRlbnRNYWpvcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz0rdFswXVsxXSxhPSt0WzFdWzFdLChpPSt0WzBdWzBdKT4obj0rdFsxXVswXSkmJih0PWksaT1uLG49dCkscz5hJiYodD1zLHM9YSxhPXQpLF8ucHJlY2lzaW9uKGcpKTpbW2ksc10sW24sYV1dfSxfLmV4dGVudE1pbm9yPWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPStuWzBdWzFdLHI9K25bMV1bMV0sKGU9K25bMF1bMF0pPih0PStuWzFdWzBdKSYmKG49ZSxlPXQsdD1uKSxvPnImJihuPW8sbz1yLHI9biksXy5wcmVjaXNpb24oZykpOltbZSxvXSxbdCxyXV19LF8uc3RlcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9fLnN0ZXBNYWpvcih0KS5zdGVwTWlub3IodCk6Xy5zdGVwTWlub3IoKX0sXy5zdGVwTWFqb3I9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9K3RbMF0sbT0rdFsxXSxfKTpbZixtXX0sXy5zdGVwTWlub3I9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9K3RbMF0scD0rdFsxXSxfKTpbZCxwXX0sXy5wcmVjaXNpb249ZnVuY3Rpb24oZCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGc9K2QsbD1kSyhvLHIsOTApLGM9cEsoZSx0LGcpLHU9ZEsocyxhLDkwKSxoPXBLKGksbixnKSxfKTpnfSxfLmV4dGVudE1ham9yKFtbLTE4MCwtODkuOTk5OTk5XSxbMTgwLDg5Ljk5OTk5OV1dKS5leHRlbnRNaW5vcihbWy0xODAsLTgwLjAwMDAwMV0sWzE4MCw4MC4wMDAwMDFdXSl9ZnVuY3Rpb24gbUsodCl7cmV0dXJuIHR9dmFyIGdLLF9LLHlLLHZLLGJLPXhZKCkseEs9eFkoKSx3Sz17cG9pbnQ6WVksbGluZVN0YXJ0OllZLGxpbmVFbmQ6WVkscG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7d0subGluZVN0YXJ0PVNLLHdLLmxpbmVFbmQ9VEt9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXt3Sy5saW5lU3RhcnQ9d0subGluZUVuZD13Sy5wb2ludD1ZWSxiSy5hZGQoTlkoeEspKSx4Sy5yZXNldCgpfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgdD1iSy8yO3JldHVybiBiSy5yZXNldCgpLHR9fTtmdW5jdGlvbiBTSygpe3dLLnBvaW50PU1LfWZ1bmN0aW9uIE1LKHQsZSl7d0sucG9pbnQ9RUssZ0s9eUs9dCxfSz12Sz1lfWZ1bmN0aW9uIEVLKHQsZSl7eEsuYWRkKHZLKnQteUsqZSkseUs9dCx2Sz1lfWZ1bmN0aW9uIFRLKCl7RUsoZ0ssX0spfXZhciBDSz0xLzAsQUs9Q0ssa0s9LUNLLExLPWtLLFBLPXtwb2ludDpmdW5jdGlvbiBOSyh0LGUpe3Q8Q0smJihDSz10KTt0PmtLJiYoa0s9dCk7ZTxBSyYmKEFLPWUpO2U+TEsmJihMSz1lKX0sbGluZVN0YXJ0OllZLGxpbmVFbmQ6WVkscG9seWdvblN0YXJ0OllZLHBvbHlnb25FbmQ6WVkscmVzdWx0OmZ1bmN0aW9uKCl7dmFyIHQ9W1tDSyxBS10sW2tLLExLXV07cmV0dXJuIGtLPUxLPS0oQUs9Q0s9MS8wKSx0fX07dmFyIElLLFJLLE9LLHpLLERLPTAsQks9MCxISz0wLEZLPTAsVks9MCxVSz0wLGpLPTAsR0s9MCxXSz0wLHFLPXtwb2ludDpZSyxsaW5lU3RhcnQ6WEssbGluZUVuZDpaSyxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtxSy5saW5lU3RhcnQ9SksscUsubGluZUVuZD1RS30scG9seWdvbkVuZDpmdW5jdGlvbigpe3FLLnBvaW50PVlLLHFLLmxpbmVTdGFydD1YSyxxSy5saW5lRW5kPVpLfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgdD1XSz9baksvV0ssR0svV0tdOlVLP1tGSy9VSyxWSy9VS106SEs/W0RLL0hLLEJLL0hLXTpbTmFOLE5hTl07cmV0dXJuIERLPUJLPUhLPUZLPVZLPVVLPWpLPUdLPVdLPTAsdH19O2Z1bmN0aW9uIFlLKHQsZSl7REsrPXQsQksrPWUsKytIS31mdW5jdGlvbiBYSygpe3FLLnBvaW50PSRLfWZ1bmN0aW9uICRLKHQsZSl7cUsucG9pbnQ9S0ssWUsoT0s9dCx6Sz1lKX1mdW5jdGlvbiBLSyh0LGUpe3ZhciBuPXQtT0ssaT1lLXpLLHI9VVkobipuK2kqaSk7RksrPXIqKE9LK3QpLzIsVksrPXIqKHpLK2UpLzIsVUsrPXIsWUsoT0s9dCx6Sz1lKX1mdW5jdGlvbiBaSygpe3FLLnBvaW50PVlLfWZ1bmN0aW9uIEpLKCl7cUsucG9pbnQ9dFp9ZnVuY3Rpb24gUUsoKXtlWihJSyxSSyl9ZnVuY3Rpb24gdFoodCxlKXtxSy5wb2ludD1lWixZSyhJSz1PSz10LFJLPXpLPWUpfWZ1bmN0aW9uIGVaKHQsZSl7dmFyIG49dC1PSyxpPWUteksscj1VWShuKm4raSppKTtGSys9ciooT0srdCkvMixWSys9ciooeksrZSkvMixVSys9cixqSys9KHI9eksqdC1PSyplKSooT0srdCksR0srPXIqKHpLK2UpLFdLKz0zKnIsWUsoT0s9dCx6Sz1lKX1mdW5jdGlvbiBuWih0KXt0aGlzLl9jb250ZXh0PXR9bloucHJvdG90eXBlPXtfcmFkaXVzOjQuNSxwb2ludFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmFkaXVzPXQsdGhpc30scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXswPT09dGhpcy5fbGluZSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9wb2ludD1OYU59LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxlKSx0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9jb250ZXh0LmxpbmVUbyh0LGUpO2JyZWFrO2RlZmF1bHQ6dGhpcy5fY29udGV4dC5tb3ZlVG8odCt0aGlzLl9yYWRpdXMsZSksdGhpcy5fY29udGV4dC5hcmModCxlLHRoaXMuX3JhZGl1cywwLGtZKX19LHJlc3VsdDpZWX07dmFyIGlaLHJaLG9aLGFaLHNaLGxaPXhZKCksY1o9e3BvaW50OllZLGxpbmVTdGFydDpmdW5jdGlvbigpe2NaLnBvaW50PXVafSxsaW5lRW5kOmZ1bmN0aW9uKCl7aVomJmhaKHJaLG9aKSxjWi5wb2ludD1ZWX0scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7aVo9ITB9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtpWj1udWxsfSxyZXN1bHQ6ZnVuY3Rpb24oKXt2YXIgdD0rbFo7cmV0dXJuIGxaLnJlc2V0KCksdH19O2Z1bmN0aW9uIHVaKHQsZSl7Y1oucG9pbnQ9aFosclo9YVo9dCxvWj1zWj1lfWZ1bmN0aW9uIGhaKHQsZSl7bFouYWRkKFVZKChhWi09dCkqYVorKHNaLT1lKSpzWikpLGFaPXQsc1o9ZX1mdW5jdGlvbiBkWigpe3RoaXMuX3N0cmluZz1bXX1mdW5jdGlvbiBwWih0KXtyZXR1cm4ibTAsIit0KyJhIit0KyIsIit0KyIgMCAxLDEgMCwiKy0yKnQrImEiK3QrIiwiK3QrIiAwIDEsMSAwLCIrMip0KyJ6In1mdW5jdGlvbiBmWih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49bmV3IG1aO2Zvcih2YXIgaSBpbiB0KW5baV09dFtpXTtyZXR1cm4gbi5zdHJlYW09ZSxufX1mdW5jdGlvbiBtWigpe31mdW5jdGlvbiBnWih0LGUsbil7dmFyIGk9dC5jbGlwRXh0ZW50JiZ0LmNsaXBFeHRlbnQoKTtyZXR1cm4gdC5zY2FsZSgxNTApLnRyYW5zbGF0ZShbMCwwXSksbnVsbCE9aSYmdC5jbGlwRXh0ZW50KG51bGwpLFFZKG4sdC5zdHJlYW0oUEspKSxlKFBLLnJlc3VsdCgpKSxudWxsIT1pJiZ0LmNsaXBFeHRlbnQoaSksdH1mdW5jdGlvbiBfWih0LGUsbil7cmV0dXJuIGdaKHQsKGZ1bmN0aW9uKG4pe3ZhciBpPWVbMV1bMF0tZVswXVswXSxyPWVbMV1bMV0tZVswXVsxXSxvPU1hdGgubWluKGkvKG5bMV1bMF0tblswXVswXSksci8oblsxXVsxXS1uWzBdWzFdKSksYT0rZVswXVswXSsoaS1vKihuWzFdWzBdK25bMF1bMF0pKS8yLHM9K2VbMF1bMV0rKHItbyooblsxXVsxXStuWzBdWzFdKSkvMjt0LnNjYWxlKDE1MCpvKS50cmFuc2xhdGUoW2Esc10pfSksbil9ZnVuY3Rpb24geVoodCxlLG4pe3JldHVybiBfWih0LFtbMCwwXSxlXSxuKX1mdW5jdGlvbiB2Wih0LGUsbil7cmV0dXJuIGdaKHQsKGZ1bmN0aW9uKG4pe3ZhciBpPStlLHI9aS8oblsxXVswXS1uWzBdWzBdKSxvPShpLXIqKG5bMV1bMF0rblswXVswXSkpLzIsYT0tcipuWzBdWzFdO3Quc2NhbGUoMTUwKnIpLnRyYW5zbGF0ZShbbyxhXSl9KSxuKX1mdW5jdGlvbiBiWih0LGUsbil7cmV0dXJuIGdaKHQsKGZ1bmN0aW9uKG4pe3ZhciBpPStlLHI9aS8oblsxXVsxXS1uWzBdWzFdKSxvPS1yKm5bMF1bMF0sYT0oaS1yKihuWzFdWzFdK25bMF1bMV0pKS8yO3Quc2NhbGUoMTUwKnIpLnRyYW5zbGF0ZShbbyxhXSl9KSxuKX1kWi5wcm90b3R5cGU9e19yYWRpdXM6NC41LF9jaXJjbGU6cFooNC41KSxwb2ludFJhZGl1czpmdW5jdGlvbih0KXtyZXR1cm4odD0rdCkhPT10aGlzLl9yYWRpdXMmJih0aGlzLl9yYWRpdXM9dCx0aGlzLl9jaXJjbGU9bnVsbCksdGhpc30scG9seWdvblN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXswPT09dGhpcy5fbGluZSYmdGhpcy5fc3RyaW5nLnB1c2goIloiKSx0aGlzLl9wb2ludD1OYU59LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fc3RyaW5nLnB1c2goIk0iLHQsIiwiLGUpLHRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3N0cmluZy5wdXNoKCJMIix0LCIsIixlKTticmVhaztkZWZhdWx0Om51bGw9PXRoaXMuX2NpcmNsZSYmKHRoaXMuX2NpcmNsZT1wWih0aGlzLl9yYWRpdXMpKSx0aGlzLl9zdHJpbmcucHVzaCgiTSIsdCwiLCIsZSx0aGlzLl9jaXJjbGUpfX0scmVzdWx0OmZ1bmN0aW9uKCl7aWYodGhpcy5fc3RyaW5nLmxlbmd0aCl7dmFyIHQ9dGhpcy5fc3RyaW5nLmpvaW4oIiIpO3JldHVybiB0aGlzLl9zdHJpbmc9W10sdH1yZXR1cm4gbnVsbH19LG1aLnByb3RvdHlwZT17Y29uc3RydWN0b3I6bVoscG9pbnQ6ZnVuY3Rpb24odCxlKXt0aGlzLnN0cmVhbS5wb2ludCh0LGUpfSxzcGhlcmU6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5zcGhlcmUoKX0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXt0aGlzLnN0cmVhbS5saW5lRW5kKCl9LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe3RoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpfSxwb2x5Z29uRW5kOmZ1bmN0aW9uKCl7dGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpfX07dmFyIHhaPU9ZKDMwKlBZKTtmdW5jdGlvbiB3Wih0LGUpe3JldHVybitlPyhmdW5jdGlvbiBuKHQsZSl7ZnVuY3Rpb24gbihpLHIsbyxhLHMsbCxjLHUsaCxkLHAsZixtLGcpe3ZhciBfPWMtaSx5PXUtcix2PV8qXyt5Knk7aWYodj40KmUmJm0tLSl7dmFyIGI9YStkLHg9cytwLHc9bCtmLFM9VVkoYipiK3gqeCt3KncpLE09V1kody89UyksRT1OWShOWSh3KS0xKTxFWXx8Tlkoby1oKTxFWT8obytoKS8yOlJZKHgsYiksVD10KEUsTSksQz1UWzBdLEE9VFsxXSxrPUMtaSxMPUEtcixQPXkqay1fKkw7KFAqUC92PmV8fE5ZKChfKmsreSpMKS92LS41KT4uM3x8YSpkK3MqcCtsKmY8eFopJiYobihpLHIsbyxhLHMsbCxDLEEsRSxiLz1TLHgvPVMsdyxtLGcpLGcucG9pbnQoQyxBKSxuKEMsQSxFLGIseCx3LGMsdSxoLGQscCxmLG0sZykpfX1yZXR1cm4gZnVuY3Rpb24oZSl7dmFyIGkscixvLGEscyxsLGMsdSxoLGQscCxmLG09e3BvaW50OmcsbGluZVN0YXJ0Ol8sbGluZUVuZDp2LHBvbHlnb25TdGFydDpmdW5jdGlvbigpe2UucG9seWdvblN0YXJ0KCksbS5saW5lU3RhcnQ9Yn0scG9seWdvbkVuZDpmdW5jdGlvbigpe2UucG9seWdvbkVuZCgpLG0ubGluZVN0YXJ0PV99fTtmdW5jdGlvbiBnKG4saSl7bj10KG4saSksZS5wb2ludChuWzBdLG5bMV0pfWZ1bmN0aW9uIF8oKXt1PU5hTixtLnBvaW50PXksZS5saW5lU3RhcnQoKX1mdW5jdGlvbiB5KGkscil7dmFyIG89cFgoW2kscl0pLGE9dChpLHIpO24odSxoLGMsZCxwLGYsdT1hWzBdLGg9YVsxXSxjPWksZD1vWzBdLHA9b1sxXSxmPW9bMl0sMTYsZSksZS5wb2ludCh1LGgpfWZ1bmN0aW9uIHYoKXttLnBvaW50PWcsZS5saW5lRW5kKCl9ZnVuY3Rpb24gYigpe18oKSxtLnBvaW50PXgsbS5saW5lRW5kPXd9ZnVuY3Rpb24geCh0LGUpe3koaT10LGUpLHI9dSxvPWgsYT1kLHM9cCxsPWYsbS5wb2ludD15fWZ1bmN0aW9uIHcoKXtuKHUsaCxjLGQscCxmLHIsbyxpLGEscyxsLDE2LGUpLG0ubGluZUVuZD12LHYoKX1yZXR1cm4gbX19KSh0LGUpOihmdW5jdGlvbiBpKHQpe3JldHVybiBmWih7cG9pbnQ6ZnVuY3Rpb24oZSxuKXtlPXQoZSxuKSx0aGlzLnN0cmVhbS5wb2ludChlWzBdLGVbMV0pfX0pfSkodCl9dmFyIFNaPWZaKHtwb2ludDpmdW5jdGlvbih0LGUpe3RoaXMuc3RyZWFtLnBvaW50KHQqUFksZSpQWSl9fSk7ZnVuY3Rpb24gTVoodCl7cmV0dXJuIEVaKChmdW5jdGlvbigpe3JldHVybiB0fSkpKCl9ZnVuY3Rpb24gRVoodCl7dmFyIGUsbixpLHIsbyxhLHMsbCxjLHUsaD0xNTAsZD00ODAscD0yNTAsZj0wLG09MCxnPTAsXz0wLHk9MCx2PW51bGwsYj1CJCx4PW51bGwsdz1tSyxTPS41LE09d1ooQyxTKTtmdW5jdGlvbiBFKHQpe3JldHVyblsodD1vKHRbMF0qUFksdFsxXSpQWSkpWzBdKmgrbixpLXRbMV0qaF19ZnVuY3Rpb24gVCh0KXtyZXR1cm4odD1vLmludmVydCgodFswXS1uKS9oLChpLXRbMV0pL2gpKSYmW3RbMF0qTFksdFsxXSpMWV19ZnVuY3Rpb24gQyh0LHIpe3JldHVyblsodD1lKHQscikpWzBdKmgrbixpLXRbMV0qaF19ZnVuY3Rpb24gQSgpe289bSQocj1fJChnLF8seSksZSk7dmFyIHQ9ZShmLG0pO3JldHVybiBuPWQtdFswXSpoLGk9cCt0WzFdKmgsaygpfWZ1bmN0aW9uIGsoKXtyZXR1cm4gYz11PW51bGwsRX1yZXR1cm4gRS5zdHJlYW09ZnVuY3Rpb24odCl7cmV0dXJuIGMmJnU9PT10P2M6Yz1TWigoZnVuY3Rpb24gZSh0KXtyZXR1cm4gZlooe3BvaW50OmZ1bmN0aW9uKGUsbil7dmFyIGk9dChlLG4pO3JldHVybiB0aGlzLnN0cmVhbS5wb2ludChpWzBdLGlbMV0pfX0pfSkocikoYihNKHcodT10KSkpKSl9LEUucHJlY2xpcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYj10LHY9dm9pZCAwLGsoKSk6Yn0sRS5wb3N0Y2xpcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odz10LHg9YT1zPWw9bnVsbCxrKCkpOnd9LEUuY2xpcEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhiPSt0P1YkKHY9dCpQWSk6KHY9bnVsbCxCJCksaygpKTp2KkxZfSxFLmNsaXBFeHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHc9bnVsbD09dD8oeD1hPXM9bD1udWxsLG1LKTpHJCh4PSt0WzBdWzBdLGE9K3RbMF1bMV0scz0rdFsxXVswXSxsPSt0WzFdWzFdKSxrKCkpOm51bGw9PXg/bnVsbDpbW3gsYV0sW3MsbF1dfSxFLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSt0LEEoKSk6aH0sRS50cmFuc2xhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGQ9K3RbMF0scD0rdFsxXSxBKCkpOltkLHBdfSxFLmNlbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZj10WzBdJTM2MCpQWSxtPXRbMV0lMzYwKlBZLEEoKSk6W2YqTFksbSpMWV19LEUucm90YXRlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhnPXRbMF0lMzYwKlBZLF89dFsxXSUzNjAqUFkseT10Lmxlbmd0aD4yP3RbMl0lMzYwKlBZOjAsQSgpKTpbZypMWSxfKkxZLHkqTFldfSxFLnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oTT13WihDLFM9dCp0KSxrKCkpOlVZKFMpfSxFLmZpdEV4dGVudD1mdW5jdGlvbih0LGUpe3JldHVybiBfWihFLHQsZSl9LEUuZml0U2l6ZT1mdW5jdGlvbih0LGUpe3JldHVybiB5WihFLHQsZSl9LEUuZml0V2lkdGg9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdlooRSx0LGUpfSxFLmZpdEhlaWdodD1mdW5jdGlvbih0LGUpe3JldHVybiBiWihFLHQsZSl9LGZ1bmN0aW9uKCl7cmV0dXJuIGU9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyksRS5pbnZlcnQ9ZS5pbnZlcnQmJlQsQSgpfX1mdW5jdGlvbiBUWih0KXt2YXIgZT0wLG49VFkvMyxpPUVaKHQpLHI9aShlLG4pO3JldHVybiByLnBhcmFsbGVscz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9pKGU9dFswXSpQWSxuPXRbMV0qUFkpOltlKkxZLG4qTFldfSxyfWZ1bmN0aW9uIENaKHQsZSl7dmFyIG49RlkodCksaT0obitGWShlKSkvMjtpZihOWShpKTxFWSlyZXR1cm4oZnVuY3Rpb24gcih0KXt2YXIgZT1PWSh0KTtmdW5jdGlvbiBuKHQsbil7cmV0dXJuW3QqZSxGWShuKS9lXX1yZXR1cm4gbi5pbnZlcnQ9ZnVuY3Rpb24odCxuKXtyZXR1cm5bdC9lLFdZKG4qZSldfSxufSkodCk7dmFyIG89MStuKigyKmktbiksYT1VWShvKS9pO2Z1bmN0aW9uIHModCxlKXt2YXIgbj1VWShvLTIqaSpGWShlKSkvaTtyZXR1cm5bbipGWSh0Kj1pKSxhLW4qT1kodCldfXJldHVybiBzLmludmVydD1mdW5jdGlvbih0LGUpe3ZhciBuPWEtZTtyZXR1cm5bUlkodCxOWShuKSkvaSpWWShuKSxXWSgoby0odCp0K24qbikqaSppKS8oMippKSldfSxzfWZ1bmN0aW9uIEFaKCl7cmV0dXJuIFRaKENaKS5zY2FsZSgxNTUuNDI0KS5jZW50ZXIoWzAsMzMuNjQ0Ml0pfWZ1bmN0aW9uIGtaKCl7cmV0dXJuIEFaKCkucGFyYWxsZWxzKFsyOS41LDQ1LjVdKS5zY2FsZSgxMDcwKS50cmFuc2xhdGUoWzQ4MCwyNTBdKS5yb3RhdGUoWzk2LDBdKS5jZW50ZXIoWy0uNiwzOC43XSl9ZnVuY3Rpb24gTFoodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dmFyIGk9T1koZSkscj1PWShuKSxvPXQoaSpyKTtyZXR1cm5bbypyKkZZKGUpLG8qRlkobildfX1mdW5jdGlvbiBQWih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXt2YXIgaT1VWShlKmUrbipuKSxyPXQoaSksbz1GWShyKSxhPU9ZKHIpO3JldHVybltSWShlKm8saSphKSxXWShpJiZuKm8vaSldfX12YXIgTlo9TFooKGZ1bmN0aW9uKHQpe3JldHVybiBVWSgyLygxK3QpKX0pKTtOWi5pbnZlcnQ9UFooKGZ1bmN0aW9uKHQpe3JldHVybiAyKldZKHQvMil9KSk7dmFyIElaPUxaKChmdW5jdGlvbih0KXtyZXR1cm4odD1HWSh0KSkmJnQvRlkodCl9KSk7ZnVuY3Rpb24gUloodCxlKXtyZXR1cm5bdCxCWShqWSgoQ1krZSkvMikpXX1mdW5jdGlvbiBPWih0KXt2YXIgZSxuLGkscj1NWih0KSxvPXIuY2VudGVyLGE9ci5zY2FsZSxzPXIudHJhbnNsYXRlLGw9ci5jbGlwRXh0ZW50LGM9bnVsbDtmdW5jdGlvbiB1KCl7dmFyIG89VFkqYSgpLHM9cih4JChyLnJvdGF0ZSgpKS5pbnZlcnQoWzAsMF0pKTtyZXR1cm4gbChudWxsPT1jP1tbc1swXS1vLHNbMV0tb10sW3NbMF0rbyxzWzFdK29dXTp0PT09Ulo/W1tNYXRoLm1heChzWzBdLW8sYyksZV0sW01hdGgubWluKHNbMF0rbyxuKSxpXV06W1tjLE1hdGgubWF4KHNbMV0tbyxlKV0sW24sTWF0aC5taW4oc1sxXStvLGkpXV0pfXJldHVybiByLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhKHQpLHUoKSk6YSgpfSxyLnRyYW5zbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocyh0KSx1KCkpOnMoKX0sci5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG8odCksdSgpKTpvKCl9LHIuY2xpcEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obnVsbD09dD9jPWU9bj1pPW51bGw6KGM9K3RbMF1bMF0sZT0rdFswXVsxXSxuPSt0WzFdWzBdLGk9K3RbMV1bMV0pLHUoKSk6bnVsbD09Yz9udWxsOltbYyxlXSxbbixpXV19LHUoKX1mdW5jdGlvbiB6Wih0KXtyZXR1cm4galkoKENZK3QpLzIpfWZ1bmN0aW9uIERaKHQsZSl7dmFyIG49T1kodCksaT10PT09ZT9GWSh0KTpCWShuL09ZKGUpKS9CWSh6WihlKS96Wih0KSkscj1uKkhZKHpaKHQpLGkpL2k7aWYoIWkpcmV0dXJuIFJaO2Z1bmN0aW9uIG8odCxlKXtyPjA/ZTwtQ1krRVkmJihlPS1DWStFWSk6ZT5DWS1FWSYmKGU9Q1ktRVkpO3ZhciBuPXIvSFkoelooZSksaSk7cmV0dXJuW24qRlkoaSp0KSxyLW4qT1koaSp0KV19cmV0dXJuIG8uaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7dmFyIG49ci1lLG89VlkoaSkqVVkodCp0K24qbik7cmV0dXJuW1JZKHQsTlkobikpL2kqVlkobiksMipJWShIWShyL28sMS9pKSktQ1ldfSxvfWZ1bmN0aW9uIEJaKHQsZSl7cmV0dXJuW3QsZV19ZnVuY3Rpb24gSFoodCxlKXt2YXIgbj1PWSh0KSxpPXQ9PT1lP0ZZKHQpOihuLU9ZKGUpKS8oZS10KSxyPW4vaSt0O2lmKE5ZKGkpPEVZKXJldHVybiBCWjtmdW5jdGlvbiBvKHQsZSl7dmFyIG49ci1lLG89aSp0O3JldHVybltuKkZZKG8pLHItbipPWShvKV19cmV0dXJuIG8uaW52ZXJ0PWZ1bmN0aW9uKHQsZSl7dmFyIG49ci1lO3JldHVybltSWSh0LE5ZKG4pKS9pKlZZKG4pLHItVlkoaSkqVVkodCp0K24qbildfSxvfWZ1bmN0aW9uIEZaKHQsZSl7dmFyIG49T1koZSksaT1PWSh0KSpuO3JldHVybltuKkZZKHQpL2ksRlkoZSkvaV19ZnVuY3Rpb24gVloodCxlLG4saSl7cmV0dXJuIDE9PT10JiYxPT09ZSYmMD09PW4mJjA9PT1pP21LOmZaKHtwb2ludDpmdW5jdGlvbihyLG8pe3RoaXMuc3RyZWFtLnBvaW50KHIqdCtuLG8qZStpKX19KX1mdW5jdGlvbiBVWih0LGUpe3ZhciBuPWUqZSxpPW4qbjtyZXR1cm5bdCooLjg3MDctLjEzMTk3OSpuK2kqKGkqKC4wMDM5NzEqbi0uMDAxNTI5KmkpLS4wMTM3OTEpKSxlKigxLjAwNzIyNituKiguMDE1MDg1K2kqKC4wMjg4NzQqbi0uMDQ0NDc1LS4wMDU5MTYqaSkpKV19ZnVuY3Rpb24galoodCxlKXtyZXR1cm5bT1koZSkqRlkodCksRlkoZSldfWZ1bmN0aW9uIEdaKHQsZSl7dmFyIG49T1koZSksaT0xK09ZKHQpKm47cmV0dXJuW24qRlkodCkvaSxGWShlKS9pXX1mdW5jdGlvbiBXWih0LGUpe3JldHVybltCWShqWSgoQ1krZSkvMikpLC10XX1mdW5jdGlvbiBxWih0LGUpe3JldHVybiB0LnBhcmVudD09PWUucGFyZW50PzE6Mn1mdW5jdGlvbiBZWih0LGUpe3JldHVybiB0K2UueH1mdW5jdGlvbiBYWih0LGUpe3JldHVybiBNYXRoLm1heCh0LGUueSl9ZnVuY3Rpb24gJFoodCl7dmFyIGU9MCxuPXQuY2hpbGRyZW4saT1uJiZuLmxlbmd0aDtpZihpKWZvcig7LS1pPj0wOyllKz1uW2ldLnZhbHVlO2Vsc2UgZT0xO3QudmFsdWU9ZX1mdW5jdGlvbiBLWih0LGUpe3ZhciBuLGkscixvLGEscz1uZXcgdEoodCksbD0rdC52YWx1ZSYmKHMudmFsdWU9dC52YWx1ZSksYz1bc107Zm9yKG51bGw9PWUmJihlPVpaKTtuPWMucG9wKCk7KWlmKGwmJihuLnZhbHVlPStuLmRhdGEudmFsdWUpLChyPWUobi5kYXRhKSkmJihhPXIubGVuZ3RoKSlmb3Iobi5jaGlsZHJlbj1uZXcgQXJyYXkoYSksbz1hLTE7bz49MDstLW8pYy5wdXNoKGk9bi5jaGlsZHJlbltvXT1uZXcgdEoocltvXSkpLGkucGFyZW50PW4saS5kZXB0aD1uLmRlcHRoKzE7cmV0dXJuIHMuZWFjaEJlZm9yZShRWil9ZnVuY3Rpb24gWloodCl7cmV0dXJuIHQuY2hpbGRyZW59ZnVuY3Rpb24gSloodCl7dC5kYXRhPXQuZGF0YS5kYXRhfWZ1bmN0aW9uIFFaKHQpe3ZhciBlPTA7ZG97dC5oZWlnaHQ9ZX13aGlsZSgodD10LnBhcmVudCkmJnQuaGVpZ2h0PCsrZSl9ZnVuY3Rpb24gdEoodCl7dGhpcy5kYXRhPXQsdGhpcy5kZXB0aD10aGlzLmhlaWdodD0wLHRoaXMucGFyZW50PW51bGx9SVouaW52ZXJ0PVBaKChmdW5jdGlvbih0KXtyZXR1cm4gdH0pKSxSWi5pbnZlcnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm5bdCwyKklZKERZKGUpKS1DWV19LEJaLmludmVydD1CWixGWi5pbnZlcnQ9UFooSVkpLFVaLmludmVydD1mdW5jdGlvbih0LGUpe3ZhciBuLGk9ZSxyPTI1O2Rve3ZhciBvPWkqaSxhPW8qbztpLT1uPShpKigxLjAwNzIyNitvKiguMDE1MDg1K2EqKC4wMjg4NzQqby0uMDQ0NDc1LS4wMDU5MTYqYSkpKS1lKS8oMS4wMDcyMjYrbyooLjA0NTI1NSthKiguMjU5ODY2Km8tLjMxMTMyNS0uMDA1OTE2KjExKmEpKSl9d2hpbGUoTlkobik+RVkmJi0tcj4wKTtyZXR1cm5bdC8oLjg3MDcrKG89aSppKSoobyoobypvKm8qKC4wMDM5NzEtLjAwMTUyOSpvKS0uMDEzNzkxKS0uMTMxOTc5KSksaV19LGpaLmludmVydD1QWihXWSksR1ouaW52ZXJ0PVBaKChmdW5jdGlvbih0KXtyZXR1cm4gMipJWSh0KX0pKSxXWi5pbnZlcnQ9ZnVuY3Rpb24odCxlKXtyZXR1cm5bLWUsMipJWShEWSh0KSktQ1ldfSx0Si5wcm90b3R5cGU9S1oucHJvdG90eXBlPXtjb25zdHJ1Y3Rvcjp0Sixjb3VudDpmdW5jdGlvbiBlSigpe3JldHVybiB0aGlzLmVhY2hBZnRlcigkWil9LGVhY2g6ZnVuY3Rpb24gbkoodCl7dmFyIGUsbixpLHIsbz10aGlzLGE9W29dO2Rve2ZvcihlPWEucmV2ZXJzZSgpLGE9W107bz1lLnBvcCgpOylpZih0KG8pLG49by5jaGlsZHJlbilmb3IoaT0wLHI9bi5sZW5ndGg7aTxyOysraSlhLnB1c2gobltpXSl9d2hpbGUoYS5sZW5ndGgpO3JldHVybiB0aGlzfSxlYWNoQWZ0ZXI6ZnVuY3Rpb24gaUoodCl7Zm9yKHZhciBlLG4saSxyPXRoaXMsbz1bcl0sYT1bXTtyPW8ucG9wKCk7KWlmKGEucHVzaChyKSxlPXIuY2hpbGRyZW4pZm9yKG49MCxpPWUubGVuZ3RoO248aTsrK24pby5wdXNoKGVbbl0pO2Zvcig7cj1hLnBvcCgpOyl0KHIpO3JldHVybiB0aGlzfSxlYWNoQmVmb3JlOmZ1bmN0aW9uIHJKKHQpe2Zvcih2YXIgZSxuLGk9dGhpcyxyPVtpXTtpPXIucG9wKCk7KWlmKHQoaSksZT1pLmNoaWxkcmVuKWZvcihuPWUubGVuZ3RoLTE7bj49MDstLW4pci5wdXNoKGVbbl0pO3JldHVybiB0aGlzfSxzdW06ZnVuY3Rpb24gb0oodCl7cmV0dXJuIHRoaXMuZWFjaEFmdGVyKChmdW5jdGlvbihlKXtmb3IodmFyIG49K3QoZS5kYXRhKXx8MCxpPWUuY2hpbGRyZW4scj1pJiZpLmxlbmd0aDstLXI+PTA7KW4rPWlbcl0udmFsdWU7ZS52YWx1ZT1ufSkpfSxzb3J0OmZ1bmN0aW9uIGFKKHQpe3JldHVybiB0aGlzLmVhY2hCZWZvcmUoKGZ1bmN0aW9uKGUpe2UuY2hpbGRyZW4mJmUuY2hpbGRyZW4uc29ydCh0KX0pKX0scGF0aDpmdW5jdGlvbiBzSih0KXtmb3IodmFyIGU9dGhpcyxuPShmdW5jdGlvbiBpKHQsZSl7aWYodD09PWUpcmV0dXJuIHQ7dmFyIG49dC5hbmNlc3RvcnMoKSxpPWUuYW5jZXN0b3JzKCkscj1udWxsO3Q9bi5wb3AoKSxlPWkucG9wKCk7Zm9yKDt0PT09ZTspcj10LHQ9bi5wb3AoKSxlPWkucG9wKCk7cmV0dXJuIHJ9KShlLHQpLHI9W2VdO2UhPT1uOylyLnB1c2goZT1lLnBhcmVudCk7Zm9yKHZhciBvPXIubGVuZ3RoO3QhPT1uOylyLnNwbGljZShvLDAsdCksdD10LnBhcmVudDtyZXR1cm4gcn0sYW5jZXN0b3JzOmZ1bmN0aW9uIGxKKCl7Zm9yKHZhciB0PXRoaXMsZT1bdF07dD10LnBhcmVudDspZS5wdXNoKHQpO3JldHVybiBlfSxkZXNjZW5kYW50czpmdW5jdGlvbiBjSigpe3ZhciB0PVtdO3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKGUpe3QucHVzaChlKX0pKSx0fSxsZWF2ZXM6ZnVuY3Rpb24gdUooKXt2YXIgdD1bXTtyZXR1cm4gdGhpcy5lYWNoQmVmb3JlKChmdW5jdGlvbihlKXtlLmNoaWxkcmVufHx0LnB1c2goZSl9KSksdH0sbGlua3M6ZnVuY3Rpb24gaEooKXt2YXIgdD10aGlzLGU9W107cmV0dXJuIHQuZWFjaCgoZnVuY3Rpb24obil7biE9PXQmJmUucHVzaCh7c291cmNlOm4ucGFyZW50LHRhcmdldDpufSl9KSksZX0sY29weTpmdW5jdGlvbiBkSigpe3JldHVybiBLWih0aGlzKS5lYWNoQmVmb3JlKEpaKX19O3ZhciBwSj1BcnJheS5wcm90b3R5cGUuc2xpY2U7ZnVuY3Rpb24gZkoodCl7Zm9yKHZhciBlLG4saT0wLHI9KHQ9KGZ1bmN0aW9uIG8odCl7Zm9yKHZhciBlLG4saT10Lmxlbmd0aDtpOyluPU1hdGgucmFuZG9tKCkqaS0tfDAsZT10W2ldLHRbaV09dFtuXSx0W25dPWU7cmV0dXJuIHR9KShwSi5jYWxsKHQpKSkubGVuZ3RoLGE9W107aTxyOyllPXRbaV0sbiYmX0oobixlKT8rK2k6KG49dkooYT1tSihhLGUpKSxpPTApO3JldHVybiBufWZ1bmN0aW9uIG1KKHQsZSl7dmFyIG4saTtpZih5SihlLHQpKXJldHVybltlXTtmb3Iobj0wO248dC5sZW5ndGg7KytuKWlmKGdKKGUsdFtuXSkmJnlKKGJKKHRbbl0sZSksdCkpcmV0dXJuW3Rbbl0sZV07Zm9yKG49MDtuPHQubGVuZ3RoLTE7KytuKWZvcihpPW4rMTtpPHQubGVuZ3RoOysraSlpZihnSihiSih0W25dLHRbaV0pLGUpJiZnSihiSih0W25dLGUpLHRbaV0pJiZnSihiSih0W2ldLGUpLHRbbl0pJiZ5Sih4Sih0W25dLHRbaV0sZSksdCkpcmV0dXJuW3Rbbl0sdFtpXSxlXTt0aHJvdyBuZXcgRXJyb3J9ZnVuY3Rpb24gZ0oodCxlKXt2YXIgbj10LnItZS5yLGk9ZS54LXQueCxyPWUueS10Lnk7cmV0dXJuIG48MHx8bipuPGkqaStyKnJ9ZnVuY3Rpb24gX0oodCxlKXt2YXIgbj10LnItZS5yKzFlLTYsaT1lLngtdC54LHI9ZS55LXQueTtyZXR1cm4gbj4wJiZuKm4+aSppK3Iqcn1mdW5jdGlvbiB5Sih0LGUpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7KytuKWlmKCFfSih0LGVbbl0pKXJldHVybiExO3JldHVybiEwfWZ1bmN0aW9uIHZKKHQpe3N3aXRjaCh0Lmxlbmd0aCl7Y2FzZSAxOnJldHVybihmdW5jdGlvbiBlKHQpe3JldHVybnt4OnQueCx5OnQueSxyOnQucn19KSh0WzBdKTtjYXNlIDI6cmV0dXJuIGJKKHRbMF0sdFsxXSk7Y2FzZSAzOnJldHVybiB4Sih0WzBdLHRbMV0sdFsyXSl9fWZ1bmN0aW9uIGJKKHQsZSl7dmFyIG49dC54LGk9dC55LHI9dC5yLG89ZS54LGE9ZS55LHM9ZS5yLGw9by1uLGM9YS1pLHU9cy1yLGg9TWF0aC5zcXJ0KGwqbCtjKmMpO3JldHVybnt4OihuK28rbC9oKnUpLzIseTooaSthK2MvaCp1KS8yLHI6KGgrcitzKS8yfX1mdW5jdGlvbiB4Sih0LGUsbil7dmFyIGk9dC54LHI9dC55LG89dC5yLGE9ZS54LHM9ZS55LGw9ZS5yLGM9bi54LHU9bi55LGg9bi5yLGQ9aS1hLHA9aS1jLGY9ci1zLG09ci11LGc9bC1vLF89aC1vLHk9aSppK3Iqci1vKm8sdj15LWEqYS1zKnMrbCpsLGI9eS1jKmMtdSp1K2gqaCx4PXAqZi1kKm0sdz0oZipiLW0qdikvKDIqeCktaSxTPShtKmctZipfKS94LE09KHAqdi1kKmIpLygyKngpLXIsRT0oZCpfLXAqZykveCxUPVMqUytFKkUtMSxDPTIqKG8rdypTK00qRSksQT13KncrTSpNLW8qbyxrPS0oVD8oQytNYXRoLnNxcnQoQypDLTQqVCpBKSkvKDIqVCk6QS9DKTtyZXR1cm57eDppK3crUyprLHk6citNK0UqayxyOmt9fWZ1bmN0aW9uIHdKKHQsZSxuKXt2YXIgaT10Lngscj10Lnksbz1lLnIrbi5yLGE9dC5yK24ucixzPWUueC1pLGw9ZS55LXIsYz1zKnMrbCpsO2lmKGMpe3ZhciB1PS41KygoYSo9YSktKG8qPW8pKS8oMipjKSxoPU1hdGguc3FydChNYXRoLm1heCgwLDIqbyooYStjKS0oYS09YykqYS1vKm8pKS8oMipjKTtuLng9aSt1KnMraCpsLG4ueT1yK3UqbC1oKnN9ZWxzZSBuLng9aSthLG4ueT1yfWZ1bmN0aW9uIFNKKHQsZSl7dmFyIG49ZS54LXQueCxpPWUueS10Lnkscj10LnIrZS5yO3JldHVybiByKnItMWUtNj5uKm4raSppfWZ1bmN0aW9uIE1KKHQpe3ZhciBlPXQuXyxuPXQubmV4dC5fLGk9ZS5yK24ucixyPShlLngqbi5yK24ueCplLnIpL2ksbz0oZS55Km4ucituLnkqZS5yKS9pO3JldHVybiByKnIrbypvfWZ1bmN0aW9uIEVKKHQpe3RoaXMuXz10LHRoaXMubmV4dD1udWxsLHRoaXMucHJldmlvdXM9bnVsbH1mdW5jdGlvbiBUSih0KXtpZighKHI9dC5sZW5ndGgpKXJldHVybiAwO3ZhciBlLG4saSxyLG8sYSxzLGwsYyx1LGg7aWYoKGU9dFswXSkueD0wLGUueT0wLCEocj4xKSlyZXR1cm4gZS5yO2lmKGUueD0tKG49dFsxXSkucixuLng9ZS5yLG4ueT0wLCEocj4yKSlyZXR1cm4gZS5yK24ucjt3SihuLGUsaT10WzJdKSxlPW5ldyBFSihlKSxuPW5ldyBFSihuKSxpPW5ldyBFSihpKSxlLm5leHQ9aS5wcmV2aW91cz1uLG4ubmV4dD1lLnByZXZpb3VzPWksaS5uZXh0PW4ucHJldmlvdXM9ZTt0OmZvcihzPTM7czxyOysrcyl7d0ooZS5fLG4uXyxpPXRbc10pLGk9bmV3IEVKKGkpLGw9bi5uZXh0LGM9ZS5wcmV2aW91cyx1PW4uXy5yLGg9ZS5fLnI7ZG97aWYodTw9aCl7aWYoU0oobC5fLGkuXykpe2UubmV4dD1uPWwsbi5wcmV2aW91cz1lLC0tcztjb250aW51ZSB0fXUrPWwuXy5yLGw9bC5uZXh0fWVsc2V7aWYoU0ooYy5fLGkuXykpeyhlPWMpLm5leHQ9bixuLnByZXZpb3VzPWUsLS1zO2NvbnRpbnVlIHR9aCs9Yy5fLnIsYz1jLnByZXZpb3VzfX13aGlsZShsIT09Yy5uZXh0KTtmb3IoaS5wcmV2aW91cz1lLGkubmV4dD1uLGUubmV4dD1uLnByZXZpb3VzPW49aSxvPU1KKGUpOyhpPWkubmV4dCkhPT1uOykoYT1NSihpKSk8byYmKGU9aSxvPWEpO249ZS5uZXh0fWZvcihlPVtuLl9dLGk9bjsoaT1pLm5leHQpIT09bjspZS5wdXNoKGkuXyk7Zm9yKGk9ZkooZSkscz0wO3M8cjsrK3MpKGU9dFtzXSkueC09aS54LGUueS09aS55O3JldHVybiBpLnJ9ZnVuY3Rpb24gQ0oodCl7cmV0dXJuIG51bGw9PXQ/bnVsbDpBSih0KX1mdW5jdGlvbiBBSih0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHR9ZnVuY3Rpb24ga0ooKXtyZXR1cm4gMH1mdW5jdGlvbiBMSih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gUEoodCl7cmV0dXJuIE1hdGguc3FydCh0LnZhbHVlKX1mdW5jdGlvbiBOSih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7ZS5jaGlsZHJlbnx8KGUucj1NYXRoLm1heCgwLCt0KGUpfHwwKSl9fWZ1bmN0aW9uIElKKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe2lmKGk9bi5jaGlsZHJlbil7dmFyIGkscixvLGE9aS5sZW5ndGgscz10KG4pKmV8fDA7aWYocylmb3Iocj0wO3I8YTsrK3IpaVtyXS5yKz1zO2lmKG89VEooaSkscylmb3Iocj0wO3I8YTsrK3IpaVtyXS5yLT1zO24ucj1vK3N9fX1mdW5jdGlvbiBSSih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49ZS5wYXJlbnQ7ZS5yKj10LG4mJihlLng9bi54K3QqZS54LGUueT1uLnkrdCplLnkpfX1mdW5jdGlvbiBPSih0KXt0LngwPU1hdGgucm91bmQodC54MCksdC55MD1NYXRoLnJvdW5kKHQueTApLHQueDE9TWF0aC5yb3VuZCh0LngxKSx0LnkxPU1hdGgucm91bmQodC55MSl9ZnVuY3Rpb24gekoodCxlLG4saSxyKXtmb3IodmFyIG8sYT10LmNoaWxkcmVuLHM9LTEsbD1hLmxlbmd0aCxjPXQudmFsdWUmJihpLWUpL3QudmFsdWU7KytzPGw7KShvPWFbc10pLnkwPW4sby55MT1yLG8ueDA9ZSxvLngxPWUrPW8udmFsdWUqY312YXIgREo9e2RlcHRoOi0xfSxCSj17fTtmdW5jdGlvbiBISih0KXtyZXR1cm4gdC5pZH1mdW5jdGlvbiBGSih0KXtyZXR1cm4gdC5wYXJlbnRJZH1mdW5jdGlvbiBWSih0LGUpe3JldHVybiB0LnBhcmVudD09PWUucGFyZW50PzE6Mn1mdW5jdGlvbiBVSih0KXt2YXIgZT10LmNoaWxkcmVuO3JldHVybiBlP2VbMF06dC50fWZ1bmN0aW9uIGpKKHQpe3ZhciBlPXQuY2hpbGRyZW47cmV0dXJuIGU/ZVtlLmxlbmd0aC0xXTp0LnR9ZnVuY3Rpb24gR0oodCxlLG4pe3ZhciBpPW4vKGUuaS10LmkpO2UuYy09aSxlLnMrPW4sdC5jKz1pLGUueis9bixlLm0rPW59ZnVuY3Rpb24gV0oodCxlLG4pe3JldHVybiB0LmEucGFyZW50PT09ZS5wYXJlbnQ/dC5hOm59ZnVuY3Rpb24gcUoodCxlKXt0aGlzLl89dCx0aGlzLnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW49bnVsbCx0aGlzLkE9bnVsbCx0aGlzLmE9dGhpcyx0aGlzLno9MCx0aGlzLm09MCx0aGlzLmM9MCx0aGlzLnM9MCx0aGlzLnQ9bnVsbCx0aGlzLmk9ZX1mdW5jdGlvbiBZSih0LGUsbixpLHIpe2Zvcih2YXIgbyxhPXQuY2hpbGRyZW4scz0tMSxsPWEubGVuZ3RoLGM9dC52YWx1ZSYmKHItbikvdC52YWx1ZTsrK3M8bDspKG89YVtzXSkueDA9ZSxvLngxPWksby55MD1uLG8ueTE9bis9by52YWx1ZSpjfXFKLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKHRKLnByb3RvdHlwZSk7dmFyIFhKPSgxK01hdGguc3FydCg1KSkvMjtmdW5jdGlvbiAkSih0LGUsbixpLHIsbyl7Zm9yKHZhciBhLHMsbCxjLHUsaCxkLHAsZixtLGcsXz1bXSx5PWUuY2hpbGRyZW4sdj0wLGI9MCx4PXkubGVuZ3RoLHc9ZS52YWx1ZTt2PHg7KXtsPXItbixjPW8taTtkb3t1PXlbYisrXS52YWx1ZX13aGlsZSghdSYmYjx4KTtmb3IoaD1kPXUsZz11KnUqKG09TWF0aC5tYXgoYy9sLGwvYykvKHcqdCkpLGY9TWF0aC5tYXgoZC9nLGcvaCk7Yjx4OysrYil7aWYodSs9cz15W2JdLnZhbHVlLHM8aCYmKGg9cykscz5kJiYoZD1zKSxnPXUqdSptLChwPU1hdGgubWF4KGQvZyxnL2gpKT5mKXt1LT1zO2JyZWFrfWY9cH1fLnB1c2goYT17dmFsdWU6dSxkaWNlOmw8YyxjaGlsZHJlbjp5LnNsaWNlKHYsYil9KSxhLmRpY2U/ekooYSxuLGkscix3P2krPWMqdS93Om8pOllKKGEsbixpLHc/bis9bCp1L3c6cixvKSx3LT11LHY9Yn1yZXR1cm4gX312YXIgS0o9KGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0LG4saSxyLG8peyRKKGUsdCxuLGkscixvKX1yZXR1cm4gbi5yYXRpbz1mdW5jdGlvbihlKXtyZXR1cm4gdCgoZT0rZSk+MT9lOjEpfSxufSkoWEopO3ZhciBaSj0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQsbixpLHIsbyl7aWYoKGE9dC5fc3F1YXJpZnkpJiZhLnJhdGlvPT09ZSlmb3IodmFyIGEscyxsLGMsdSxoPS0xLGQ9YS5sZW5ndGgscD10LnZhbHVlOysraDxkOyl7Zm9yKGw9KHM9YVtoXSkuY2hpbGRyZW4sYz1zLnZhbHVlPTAsdT1sLmxlbmd0aDtjPHU7KytjKXMudmFsdWUrPWxbY10udmFsdWU7cy5kaWNlP3pKKHMsbixpLHIsaSs9KG8taSkqcy52YWx1ZS9wKTpZSihzLG4saSxuKz0oci1uKSpzLnZhbHVlL3AsbykscC09cy52YWx1ZX1lbHNlIHQuX3NxdWFyaWZ5PWE9JEooZSx0LG4saSxyLG8pLGEucmF0aW89ZX1yZXR1cm4gbi5yYXRpbz1mdW5jdGlvbihlKXtyZXR1cm4gdCgoZT0rZSk+MT9lOjEpfSxufSkoWEopO2Z1bmN0aW9uIEpKKHQsZSxuKXt0LnByb3RvdHlwZT1lLnByb3RvdHlwZT1uLG4uY29uc3RydWN0b3I9dH1mdW5jdGlvbiBRSih0LGUpe3ZhciBuPU9iamVjdC5jcmVhdGUodC5wcm90b3R5cGUpO2Zvcih2YXIgaSBpbiBlKW5baV09ZVtpXTtyZXR1cm4gbn1mdW5jdGlvbiB0USgpe312YXIgZVE9LjcsblE9MS9lUSxpUT0iXFxzKihbKy1dP1xcZCspXFxzKiIsclE9IlxccyooWystXT9cXGQqXFwuP1xcZCsoPzpbZUVdWystXT9cXGQrKT8pXFxzKiIsb1E9IlxccyooWystXT9cXGQqXFwuP1xcZCsoPzpbZUVdWystXT9cXGQrKT8pJVxccyoiLGFRPS9eIyhbMC05YS1mXXszLDh9KSQvLHNRPW5ldyBSZWdFeHAoIl5yZ2JcXCgiK1tpUSxpUSxpUV0rIlxcKSQiKSxsUT1uZXcgUmVnRXhwKCJecmdiXFwoIitbb1Esb1Esb1FdKyJcXCkkIiksY1E9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tpUSxpUSxpUSxyUV0rIlxcKSQiKSx1UT1uZXcgUmVnRXhwKCJecmdiYVxcKCIrW29RLG9RLG9RLHJRXSsiXFwpJCIpLGhRPW5ldyBSZWdFeHAoIl5oc2xcXCgiK1tyUSxvUSxvUV0rIlxcKSQiKSxkUT1uZXcgUmVnRXhwKCJeaHNsYVxcKCIrW3JRLG9RLG9RLHJRXSsiXFwpJCIpLHBRPXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9O2Z1bmN0aW9uIGZRKCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4KCl9ZnVuY3Rpb24gbVEoKXtyZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRSZ2IoKX1mdW5jdGlvbiBnUSh0KXt2YXIgZSxuO3JldHVybiB0PSh0KyIiKS50cmltKCkudG9Mb3dlckNhc2UoKSwoZT1hUS5leGVjKHQpKT8obj1lWzFdLmxlbmd0aCxlPXBhcnNlSW50KGVbMV0sMTYpLDY9PT1uP19RKGUpOjM9PT1uP25ldyB4UShlPj44JjE1fGU+PjQmMjQwLGU+PjQmMTV8MjQwJmUsKDE1JmUpPDw0fDE1JmUsMSk6OD09PW4/eVEoZT4+MjQmMjU1LGU+PjE2JjI1NSxlPj44JjI1NSwoMjU1JmUpLzI1NSk6ND09PW4/eVEoZT4+MTImMTV8ZT4+OCYyNDAsZT4+OCYxNXxlPj40JjI0MCxlPj40JjE1fDI0MCZlLCgoMTUmZSk8PDR8MTUmZSkvMjU1KTpudWxsKTooZT1zUS5leGVjKHQpKT9uZXcgeFEoZVsxXSxlWzJdLGVbM10sMSk6KGU9bFEuZXhlYyh0KSk/bmV3IHhRKDI1NSplWzFdLzEwMCwyNTUqZVsyXS8xMDAsMjU1KmVbM10vMTAwLDEpOihlPWNRLmV4ZWModCkpP3lRKGVbMV0sZVsyXSxlWzNdLGVbNF0pOihlPXVRLmV4ZWModCkpP3lRKDI1NSplWzFdLzEwMCwyNTUqZVsyXS8xMDAsMjU1KmVbM10vMTAwLGVbNF0pOihlPWhRLmV4ZWModCkpP0VRKGVbMV0sZVsyXS8xMDAsZVszXS8xMDAsMSk6KGU9ZFEuZXhlYyh0KSk/RVEoZVsxXSxlWzJdLzEwMCxlWzNdLzEwMCxlWzRdKTpwUS5oYXNPd25Qcm9wZXJ0eSh0KT9fUShwUVt0XSk6InRyYW5zcGFyZW50Ij09PXQ/bmV3IHhRKE5hTixOYU4sTmFOLDApOm51bGx9ZnVuY3Rpb24gX1EodCl7cmV0dXJuIG5ldyB4USh0Pj4xNiYyNTUsdD4+OCYyNTUsMjU1JnQsMSl9ZnVuY3Rpb24geVEodCxlLG4saSl7cmV0dXJuIGk8PTAmJih0PWU9bj1OYU4pLG5ldyB4USh0LGUsbixpKX1mdW5jdGlvbiB2USh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIHRRfHwodD1nUSh0KSksdD9uZXcgeFEoKHQ9dC5yZ2IoKSkucix0LmcsdC5iLHQub3BhY2l0eSk6bmV3IHhRfWZ1bmN0aW9uIGJRKHQsZSxuLGkpe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD92USh0KTpuZXcgeFEodCxlLG4sbnVsbD09aT8xOmkpfWZ1bmN0aW9uIHhRKHQsZSxuLGkpe3RoaXMucj0rdCx0aGlzLmc9K2UsdGhpcy5iPStuLHRoaXMub3BhY2l0eT0raX1mdW5jdGlvbiB3USgpe3JldHVybiIjIitNUSh0aGlzLnIpK01RKHRoaXMuZykrTVEodGhpcy5iKX1mdW5jdGlvbiBTUSgpe3ZhciB0PXRoaXMub3BhY2l0eTtyZXR1cm4oMT09PSh0PWlzTmFOKHQpPzE6TWF0aC5tYXgoMCxNYXRoLm1pbigxLHQpKSk/InJnYigiOiJyZ2JhKCIpK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5yKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmcpfHwwKSkrIiwgIitNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMuYil8fDApKSsoMT09PXQ/IikiOiIsICIrdCsiKSIpfWZ1bmN0aW9uIE1RKHQpe3JldHVybigodD1NYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHQpfHwwKSkpPDE2PyIwIjoiIikrdC50b1N0cmluZygxNil9ZnVuY3Rpb24gRVEodCxlLG4saSl7cmV0dXJuIGk8PTA/dD1lPW49TmFOOm48PTB8fG4+PTE/dD1lPU5hTjplPD0wJiYodD1OYU4pLG5ldyBBUSh0LGUsbixpKX1mdW5jdGlvbiBUUSh0KXtpZih0IGluc3RhbmNlb2YgQVEpcmV0dXJuIG5ldyBBUSh0LmgsdC5zLHQubCx0Lm9wYWNpdHkpO2lmKHQgaW5zdGFuY2VvZiB0UXx8KHQ9Z1EodCkpLCF0KXJldHVybiBuZXcgQVE7aWYodCBpbnN0YW5jZW9mIEFRKXJldHVybiB0O3ZhciBlPSh0PXQucmdiKCkpLnIvMjU1LG49dC5nLzI1NSxpPXQuYi8yNTUscj1NYXRoLm1pbihlLG4saSksbz1NYXRoLm1heChlLG4saSksYT1OYU4scz1vLXIsbD0obytyKS8yO3JldHVybiBzPyhhPWU9PT1vPyhuLWkpL3MrNioobjxpKTpuPT09bz8oaS1lKS9zKzI6KGUtbikvcys0LHMvPWw8LjU/bytyOjItby1yLGEqPTYwKTpzPWw+MCYmbDwxPzA6YSxuZXcgQVEoYSxzLGwsdC5vcGFjaXR5KX1mdW5jdGlvbiBDUSh0LGUsbixpKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/VFEodCk6bmV3IEFRKHQsZSxuLG51bGw9PWk/MTppKX1mdW5jdGlvbiBBUSh0LGUsbixpKXt0aGlzLmg9K3QsdGhpcy5zPStlLHRoaXMubD0rbix0aGlzLm9wYWNpdHk9K2l9ZnVuY3Rpb24ga1EodCxlLG4pe3JldHVybiAyNTUqKHQ8NjA/ZSsobi1lKSp0LzYwOnQ8MTgwP246dDwyNDA/ZSsobi1lKSooMjQwLXQpLzYwOmUpfUpKKHRRLGdRLHtjb3B5OmZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QuYXNzaWduKG5ldyB0aGlzLmNvbnN0cnVjdG9yLHRoaXMsdCl9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKX0saGV4OmZRLGZvcm1hdEhleDpmUSxmb3JtYXRIc2w6ZnVuY3Rpb24gTFEoKXtyZXR1cm4gVFEodGhpcykuZm9ybWF0SHNsKCl9LGZvcm1hdFJnYjptUSx0b1N0cmluZzptUX0pLEpKKHhRLGJRLFFKKHRRLHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10P25ROk1hdGgucG93KG5RLHQpLG5ldyB4USh0aGlzLnIqdCx0aGlzLmcqdCx0aGlzLmIqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9lUTpNYXRoLnBvdyhlUSx0KSxuZXcgeFEodGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuLS41PD10aGlzLnImJnRoaXMucjwyNTUuNSYmLS41PD10aGlzLmcmJnRoaXMuZzwyNTUuNSYmLS41PD10aGlzLmImJnRoaXMuYjwyNTUuNSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9LGhleDp3USxmb3JtYXRIZXg6d1EsZm9ybWF0UmdiOlNRLHRvU3RyaW5nOlNRfSkpLEpKKEFRLENRLFFKKHRRLHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10P25ROk1hdGgucG93KG5RLHQpLG5ldyBBUSh0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10P2VROk1hdGgucG93KGVRLHQpLG5ldyBBUSh0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3ZhciB0PXRoaXMuaCUzNjArMzYwKih0aGlzLmg8MCksZT1pc05hTih0KXx8aXNOYU4odGhpcy5zKT8wOnRoaXMucyxuPXRoaXMubCxpPW4rKG48LjU/bjoxLW4pKmUscj0yKm4taTtyZXR1cm4gbmV3IHhRKGtRKHQ+PTI0MD90LTI0MDp0KzEyMCxyLGkpLGtRKHQscixpKSxrUSh0PDEyMD90KzI0MDp0LTEyMCxyLGkpLHRoaXMub3BhY2l0eSl9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuKDA8PXRoaXMucyYmdGhpcy5zPD0xfHxpc05hTih0aGlzLnMpKSYmMDw9dGhpcy5sJiZ0aGlzLmw8PTEmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxmb3JtYXRIc2w6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJoc2woIjoiaHNsYSgiKSsodGhpcy5ofHwwKSsiLCAiKzEwMCoodGhpcy5zfHwwKSsiJSwgIisxMDAqKHRoaXMubHx8MCkrIiUiKygxPT09dD8iKSI6IiwgIit0KyIpIil9fSkpO3ZhciBQUT1NYXRoLlBJLzE4MCxOUT0xODAvTWF0aC5QSSxJUT0uOTY0MjIsUlE9LjgyNTIxLE9RPTQvMjkselE9Ni8yOSxEUT0zKnpRKnpRO2Z1bmN0aW9uIEJRKHQpe2lmKHQgaW5zdGFuY2VvZiBGUSlyZXR1cm4gbmV3IEZRKHQubCx0LmEsdC5iLHQub3BhY2l0eSk7aWYodCBpbnN0YW5jZW9mIFlRKXJldHVybiBYUSh0KTt0IGluc3RhbmNlb2YgeFF8fCh0PXZRKHQpKTt2YXIgZSxuLGk9R1EodC5yKSxyPUdRKHQuZyksbz1HUSh0LmIpLGE9VlEoKC4yMjI1MDQ1KmkrLjcxNjg3ODYqcisuMDYwNjE2OSpvKS8xKTtyZXR1cm4gaT09PXImJnI9PT1vP2U9bj1hOihlPVZRKCguNDM2MDc0NyppKy4zODUwNjQ5KnIrLjE0MzA4MDQqbykvSVEpLG49VlEoKC4wMTM5MzIyKmkrLjA5NzEwNDUqcisuNzE0MTczMypvKS9SUSkpLG5ldyBGUSgxMTYqYS0xNiw1MDAqKGUtYSksMjAwKihhLW4pLHQub3BhY2l0eSl9ZnVuY3Rpb24gSFEodCxlLG4saSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP0JRKHQpOm5ldyBGUSh0LGUsbixudWxsPT1pPzE6aSl9ZnVuY3Rpb24gRlEodCxlLG4saSl7dGhpcy5sPSt0LHRoaXMuYT0rZSx0aGlzLmI9K24sdGhpcy5vcGFjaXR5PStpfWZ1bmN0aW9uIFZRKHQpe3JldHVybiB0Pi4wMDg4NTY0NTE2NzkwMzU2MzE/TWF0aC5wb3codCwxLzMpOnQvRFErT1F9ZnVuY3Rpb24gVVEodCl7cmV0dXJuIHQ+elE/dCp0KnQ6RFEqKHQtT1EpfWZ1bmN0aW9uIGpRKHQpe3JldHVybiAyNTUqKHQ8PS4wMDMxMzA4PzEyLjkyKnQ6MS4wNTUqTWF0aC5wb3codCwxLzIuNCktLjA1NSl9ZnVuY3Rpb24gR1EodCl7cmV0dXJuKHQvPTI1NSk8PS4wNDA0NT90LzEyLjkyOk1hdGgucG93KCh0Ky4wNTUpLzEuMDU1LDIuNCl9ZnVuY3Rpb24gV1EodCl7aWYodCBpbnN0YW5jZW9mIFlRKXJldHVybiBuZXcgWVEodC5oLHQuYyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2YgRlF8fCh0PUJRKHQpKSwwPT09dC5hJiYwPT09dC5iKXJldHVybiBuZXcgWVEoTmFOLDA8dC5sJiZ0Lmw8MTAwPzA6TmFOLHQubCx0Lm9wYWNpdHkpO3ZhciBlPU1hdGguYXRhbjIodC5iLHQuYSkqTlE7cmV0dXJuIG5ldyBZUShlPDA/ZSszNjA6ZSxNYXRoLnNxcnQodC5hKnQuYSt0LmIqdC5iKSx0LmwsdC5vcGFjaXR5KX1mdW5jdGlvbiBxUSh0LGUsbixpKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/V1EodCk6bmV3IFlRKHQsZSxuLG51bGw9PWk/MTppKX1mdW5jdGlvbiBZUSh0LGUsbixpKXt0aGlzLmg9K3QsdGhpcy5jPStlLHRoaXMubD0rbix0aGlzLm9wYWNpdHk9K2l9ZnVuY3Rpb24gWFEodCl7aWYoaXNOYU4odC5oKSlyZXR1cm4gbmV3IEZRKHQubCwwLDAsdC5vcGFjaXR5KTt2YXIgZT10LmgqUFE7cmV0dXJuIG5ldyBGUSh0LmwsTWF0aC5jb3MoZSkqdC5jLE1hdGguc2luKGUpKnQuYyx0Lm9wYWNpdHkpfUpKKEZRLEhRLFFKKHRRLHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IEZRKHRoaXMubCsxOCoobnVsbD09dD8xOnQpLHRoaXMuYSx0aGlzLmIsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRlEodGhpcy5sLTE4KihudWxsPT10PzE6dCksdGhpcy5hLHRoaXMuYix0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD0odGhpcy5sKzE2KS8xMTYsZT1pc05hTih0aGlzLmEpP3Q6dCt0aGlzLmEvNTAwLG49aXNOYU4odGhpcy5iKT90OnQtdGhpcy5iLzIwMDtyZXR1cm4gbmV3IHhRKGpRKDMuMTMzODU2MSooZT1JUSpVUShlKSktMS42MTY4NjY3Kih0PTEqVVEodCkpLS40OTA2MTQ2KihuPVJRKlVRKG4pKSksalEoLS45Nzg3Njg0KmUrMS45MTYxNDE1KnQrLjAzMzQ1NCpuKSxqUSguMDcxOTQ1MyplLS4yMjg5OTE0KnQrMS40MDUyNDI3Km4pLHRoaXMub3BhY2l0eSl9fSkpLEpKKFlRLHFRLFFKKHRRLHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gbmV3IFlRKHRoaXMuaCx0aGlzLmMsdGhpcy5sKzE4KihudWxsPT10PzE6dCksdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiBuZXcgWVEodGhpcy5oLHRoaXMuYyx0aGlzLmwtMTgqKG51bGw9PXQ/MTp0KSx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXtyZXR1cm4gWFEodGhpcykucmdiKCl9fSkpO3ZhciAkUT0tLjE0ODYxLEtRPTEuNzgyNzcsWlE9LS4yOTIyNyxKUT0tLjkwNjQ5LFFRPTEuOTcyOTQsdDE9UVEqSlEsZTE9UVEqS1EsbjE9S1EqWlEtSlEqJFE7ZnVuY3Rpb24gaTEodCl7aWYodCBpbnN0YW5jZW9mIG8xKXJldHVybiBuZXcgbzEodC5oLHQucyx0LmwsdC5vcGFjaXR5KTt0IGluc3RhbmNlb2YgeFF8fCh0PXZRKHQpKTt2YXIgZT10LmcvMjU1LG49dC5iLzI1NSxpPShuMSpuK3QxKih0LnIvMjU1KS1lMSplKS8tNS45NjE1MTIyOTEyLHI9bi1pLG89KFFRKihlLWkpLVpRKnIpL0pRLGE9TWF0aC5zcXJ0KG8qbytyKnIpLyhRUSppKigxLWkpKSxzPWE/TWF0aC5hdGFuMihvLHIpKk5RLTEyMDpOYU47cmV0dXJuIG5ldyBvMShzPDA/cyszNjA6cyxhLGksdC5vcGFjaXR5KX1mdW5jdGlvbiByMSh0LGUsbixpKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/aTEodCk6bmV3IG8xKHQsZSxuLG51bGw9PWk/MTppKX1mdW5jdGlvbiBvMSh0LGUsbixpKXt0aGlzLmg9K3QsdGhpcy5zPStlLHRoaXMubD0rbix0aGlzLm9wYWNpdHk9K2l9ZnVuY3Rpb24gYTEodCxlLG4saSxyKXt2YXIgbz10KnQsYT1vKnQ7cmV0dXJuKCgxLTMqdCszKm8tYSkqZSsoNC02Km8rMyphKSpuKygxKzMqdCszKm8tMyphKSppK2EqcikvNn1mdW5jdGlvbiBzMSh0KXt2YXIgZT10Lmxlbmd0aC0xO3JldHVybiBmdW5jdGlvbihuKXt2YXIgaT1uPD0wP249MDpuPj0xPyhuPTEsZS0xKTpNYXRoLmZsb29yKG4qZSkscj10W2ldLG89dFtpKzFdO3JldHVybiBhMSgobi1pL2UpKmUsaT4wP3RbaS0xXToyKnItbyxyLG8saTxlLTE/dFtpKzJdOjIqby1yKX19ZnVuY3Rpb24gbDEodCl7dmFyIGU9dC5sZW5ndGg7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBpPU1hdGguZmxvb3IoKChuJT0xKTwwPysrbjpuKSplKTtyZXR1cm4gYTEoKG4taS9lKSplLHRbKGkrZS0xKSVlXSx0W2klZV0sdFsoaSsxKSVlXSx0WyhpKzIpJWVdKX19ZnVuY3Rpb24gYzEodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIHUxKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0K24qZX19ZnVuY3Rpb24gaDEodCxlKXt2YXIgbj1lLXQ7cmV0dXJuIG4/dTEodCxuPjE4MHx8bjwtMTgwP24tMzYwKk1hdGgucm91bmQobi8zNjApOm4pOmMxKGlzTmFOKHQpP2U6dCl9ZnVuY3Rpb24gZDEodCl7cmV0dXJuIDE9PSh0PSt0KT9wMTpmdW5jdGlvbihlLG4pe3JldHVybiBuLWU/KGZ1bmN0aW9uIGkodCxlLG4pe3JldHVybiB0PU1hdGgucG93KHQsbiksZT1NYXRoLnBvdyhlLG4pLXQsbj0xL24sZnVuY3Rpb24oaSl7cmV0dXJuIE1hdGgucG93KHQraSplLG4pfX0pKGUsbix0KTpjMShpc05hTihlKT9uOmUpfX1mdW5jdGlvbiBwMSh0LGUpe3ZhciBuPWUtdDtyZXR1cm4gbj91MSh0LG4pOmMxKGlzTmFOKHQpP2U6dCl9SkoobzEscjEsUUoodFEse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/blE6TWF0aC5wb3coblEsdCksbmV3IG8xKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/ZVE6TWF0aC5wb3coZVEsdCksbmV3IG8xKHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9aXNOYU4odGhpcy5oKT8wOih0aGlzLmgrMTIwKSpQUSxlPSt0aGlzLmwsbj1pc05hTih0aGlzLnMpPzA6dGhpcy5zKmUqKDEtZSksaT1NYXRoLmNvcyh0KSxyPU1hdGguc2luKHQpO3JldHVybiBuZXcgeFEoMjU1KihlK24qKCRRKmkrS1EqcikpLDI1NSooZStuKihaUSppK0pRKnIpKSwyNTUqKGUrbiooUVEqaSkpLHRoaXMub3BhY2l0eSl9fSkpO3ZhciBmMT0oZnVuY3Rpb24gdChlKXt2YXIgbj1kMShlKTtmdW5jdGlvbiBpKHQsZSl7dmFyIGk9bigodD1iUSh0KSkuciwoZT1iUShlKSkucikscj1uKHQuZyxlLmcpLG89bih0LmIsZS5iKSxhPXAxKHQub3BhY2l0eSxlLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdC5yPWkoZSksdC5nPXIoZSksdC5iPW8oZSksdC5vcGFjaXR5PWEoZSksdCsiIn19cmV0dXJuIGkuZ2FtbWE9dCxpfSkoMSk7ZnVuY3Rpb24gbTEodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuLGkscj1lLmxlbmd0aCxvPW5ldyBBcnJheShyKSxhPW5ldyBBcnJheShyKSxzPW5ldyBBcnJheShyKTtmb3Iobj0wO248cjsrK24paT1iUShlW25dKSxvW25dPWkucnx8MCxhW25dPWkuZ3x8MCxzW25dPWkuYnx8MDtyZXR1cm4gbz10KG8pLGE9dChhKSxzPXQocyksaS5vcGFjaXR5PTEsZnVuY3Rpb24odCl7cmV0dXJuIGkucj1vKHQpLGkuZz1hKHQpLGkuYj1zKHQpLGkrIiJ9fX12YXIgZzE9bTEoczEpLF8xPW0xKGwxKTtmdW5jdGlvbiB5MSh0LGUpe3ZhciBuLGk9ZT9lLmxlbmd0aDowLHI9dD9NYXRoLm1pbihpLHQubGVuZ3RoKTowLG89bmV3IEFycmF5KHIpLGE9bmV3IEFycmF5KGkpO2ZvcihuPTA7bjxyOysrbilvW25dPUUxKHRbbl0sZVtuXSk7Zm9yKDtuPGk7KytuKWFbbl09ZVtuXTtyZXR1cm4gZnVuY3Rpb24odCl7Zm9yKG49MDtuPHI7KytuKWFbbl09b1tuXSh0KTtyZXR1cm4gYX19ZnVuY3Rpb24gdjEodCxlKXt2YXIgbj1uZXcgRGF0ZTtyZXR1cm4gZS09dD0rdCxmdW5jdGlvbihpKXtyZXR1cm4gbi5zZXRUaW1lKHQrZSppKSxufX1mdW5jdGlvbiBiMSh0LGUpe3JldHVybiBlLT10PSt0LGZ1bmN0aW9uKG4pe3JldHVybiB0K2Uqbn19ZnVuY3Rpb24geDEodCxlKXt2YXIgbixpPXt9LHI9e307Zm9yKG4gaW4gbnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdHx8KHQ9e30pLG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV8fChlPXt9KSxlKW4gaW4gdD9pW25dPUUxKHRbbl0sZVtuXSk6cltuXT1lW25dO3JldHVybiBmdW5jdGlvbih0KXtmb3IobiBpbiBpKXJbbl09aVtuXSh0KTtyZXR1cm4gcn19dmFyIHcxPS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyxTMT1uZXcgUmVnRXhwKHcxLnNvdXJjZSwiZyIpO2Z1bmN0aW9uIE0xKHQsZSl7dmFyIG4saSxyLG89dzEubGFzdEluZGV4PVMxLmxhc3RJbmRleD0wLGE9LTEscz1bXSxsPVtdO2Zvcih0Kz0iIixlKz0iIjsobj13MS5leGVjKHQpKSYmKGk9UzEuZXhlYyhlKSk7KShyPWkuaW5kZXgpPm8mJihyPWUuc2xpY2UobyxyKSxzW2FdP3NbYV0rPXI6c1srK2FdPXIpLChuPW5bMF0pPT09KGk9aVswXSk/c1thXT9zW2FdKz1pOnNbKythXT1pOihzWysrYV09bnVsbCxsLnB1c2goe2k6YSx4OmIxKG4saSl9KSksbz1TMS5sYXN0SW5kZXg7cmV0dXJuIG88ZS5sZW5ndGgmJihyPWUuc2xpY2Uobyksc1thXT9zW2FdKz1yOnNbKythXT1yKSxzLmxlbmd0aDwyP2xbMF0/KGZ1bmN0aW9uIGModCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpKyIifX0pKGxbMF0ueCk6KGZ1bmN0aW9uIHUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSkoZSk6KGU9bC5sZW5ndGgsZnVuY3Rpb24odCl7Zm9yKHZhciBuLGk9MDtpPGU7KytpKXNbKG49bFtpXSkuaV09bi54KHQpO3JldHVybiBzLmpvaW4oIiIpfSl9ZnVuY3Rpb24gRTEodCxlKXt2YXIgbixpPXR5cGVvZiBlO3JldHVybiBudWxsPT1lfHwiYm9vbGVhbiI9PT1pP2MxKGUpOigibnVtYmVyIj09PWk/YjE6InN0cmluZyI9PT1pPyhuPWdRKGUpKT8oZT1uLGYxKTpNMTplIGluc3RhbmNlb2YgZ1E/ZjE6ZSBpbnN0YW5jZW9mIERhdGU/djE6QXJyYXkuaXNBcnJheShlKT95MToiZnVuY3Rpb24iIT10eXBlb2YgZS52YWx1ZU9mJiYiZnVuY3Rpb24iIT10eXBlb2YgZS50b1N0cmluZ3x8aXNOYU4oZSk/eDE6YjEpKHQsZSl9dmFyIFQxLEMxLEExLGsxLEwxPTE4MC9NYXRoLlBJLFAxPXt0cmFuc2xhdGVYOjAsdHJhbnNsYXRlWTowLHJvdGF0ZTowLHNrZXdYOjAsc2NhbGVYOjEsc2NhbGVZOjF9O2Z1bmN0aW9uIE4xKHQsZSxuLGkscixvKXt2YXIgYSxzLGw7cmV0dXJuKGE9TWF0aC5zcXJ0KHQqdCtlKmUpKSYmKHQvPWEsZS89YSksKGw9dCpuK2UqaSkmJihuLT10KmwsaS09ZSpsKSwocz1NYXRoLnNxcnQobipuK2kqaSkpJiYobi89cyxpLz1zLGwvPXMpLHQqaTxlKm4mJih0PS10LGU9LWUsbD0tbCxhPS1hKSx7dHJhbnNsYXRlWDpyLHRyYW5zbGF0ZVk6byxyb3RhdGU6TWF0aC5hdGFuMihlLHQpKkwxLHNrZXdYOk1hdGguYXRhbihsKSpMMSxzY2FsZVg6YSxzY2FsZVk6c319ZnVuY3Rpb24gSTEodCxlLG4saSl7ZnVuY3Rpb24gcih0KXtyZXR1cm4gdC5sZW5ndGg/dC5wb3AoKSsiICI6IiJ9cmV0dXJuIGZ1bmN0aW9uKG8sYSl7dmFyIHM9W10sbD1bXTtyZXR1cm4gbz10KG8pLGE9dChhKSwoZnVuY3Rpb24gYyh0LGkscixvLGEscyl7aWYodCE9PXJ8fGkhPT1vKXt2YXIgbD1hLnB1c2goInRyYW5zbGF0ZSgiLG51bGwsZSxudWxsLG4pO3MucHVzaCh7aTpsLTQseDpiMSh0LHIpfSx7aTpsLTIseDpiMShpLG8pfSl9ZWxzZShyfHxvKSYmYS5wdXNoKCJ0cmFuc2xhdGUoIityK2UrbytuKX0pKG8udHJhbnNsYXRlWCxvLnRyYW5zbGF0ZVksYS50cmFuc2xhdGVYLGEudHJhbnNsYXRlWSxzLGwpLChmdW5jdGlvbiB1KHQsZSxuLG8pe3QhPT1lPyh0LWU+MTgwP2UrPTM2MDplLXQ+MTgwJiYodCs9MzYwKSxvLnB1c2goe2k6bi5wdXNoKHIobikrInJvdGF0ZSgiLG51bGwsaSktMix4OmIxKHQsZSl9KSk6ZSYmbi5wdXNoKHIobikrInJvdGF0ZSgiK2UraSl9KShvLnJvdGF0ZSxhLnJvdGF0ZSxzLGwpLChmdW5jdGlvbiBoKHQsZSxuLG8pe3QhPT1lP28ucHVzaCh7aTpuLnB1c2gocihuKSsic2tld1goIixudWxsLGkpLTIseDpiMSh0LGUpfSk6ZSYmbi5wdXNoKHIobikrInNrZXdYKCIrZStpKX0pKG8uc2tld1gsYS5za2V3WCxzLGwpLChmdW5jdGlvbiBkKHQsZSxuLGksbyxhKXtpZih0IT09bnx8ZSE9PWkpe3ZhciBzPW8ucHVzaChyKG8pKyJzY2FsZSgiLG51bGwsIiwiLG51bGwsIikiKTthLnB1c2goe2k6cy00LHg6YjEodCxuKX0se2k6cy0yLHg6YjEoZSxpKX0pfWVsc2UgMT09PW4mJjE9PT1pfHxvLnB1c2gocihvKSsic2NhbGUoIituKyIsIitpKyIpIil9KShvLnNjYWxlWCxvLnNjYWxlWSxhLnNjYWxlWCxhLnNjYWxlWSxzLGwpLG89YT1udWxsLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPS0xLGk9bC5sZW5ndGg7KytuPGk7KXNbKGU9bFtuXSkuaV09ZS54KHQpO3JldHVybiBzLmpvaW4oIiIpfX19dmFyIFIxPUkxKChmdW5jdGlvbiBPMSh0KXtyZXR1cm4ibm9uZSI9PT10P1AxOihUMXx8KFQxPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLEMxPWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxBMT1kb2N1bWVudC5kZWZhdWx0VmlldyksVDEuc3R5bGUudHJhbnNmb3JtPXQsdD1BMS5nZXRDb21wdXRlZFN0eWxlKEMxLmFwcGVuZENoaWxkKFQxKSxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2Zvcm0iKSxDMS5yZW1vdmVDaGlsZChUMSksTjEoKyh0PXQuc2xpY2UoNywtMSkuc3BsaXQoIiwiKSlbMF0sK3RbMV0sK3RbMl0sK3RbM10sK3RbNF0sK3RbNV0pKX0pLCJweCwgIiwicHgpIiwiZGVnKSIpLHoxPUkxKChmdW5jdGlvbiBEMSh0KXtyZXR1cm4gbnVsbD09dD9QMTooazF8fChrMT1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwiZyIpKSxrMS5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsdCksKHQ9azEudHJhbnNmb3JtLmJhc2VWYWwuY29uc29saWRhdGUoKSk/TjEoKHQ9dC5tYXRyaXgpLmEsdC5iLHQuYyx0LmQsdC5lLHQuZik6UDEpfSksIiwgIiwiKSIsIikiKSxCMT1NYXRoLlNRUlQyO2Z1bmN0aW9uIEgxKHQpe3JldHVybigodD1NYXRoLmV4cCh0KSkrMS90KS8yfWZ1bmN0aW9uIEYxKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3ZhciBpPXQoKGU9Q1EoZSkpLmgsKG49Q1EobikpLmgpLHI9cDEoZS5zLG4ucyksbz1wMShlLmwsbi5sKSxhPXAxKGUub3BhY2l0eSxuLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZS5oPWkodCksZS5zPXIodCksZS5sPW8odCksZS5vcGFjaXR5PWEodCksZSsiIn19fXZhciBWMT1GMShoMSksVTE9RjEocDEpO2Z1bmN0aW9uIGoxKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3ZhciBpPXQoKGU9cVEoZSkpLmgsKG49cVEobikpLmgpLHI9cDEoZS5jLG4uYyksbz1wMShlLmwsbi5sKSxhPXAxKGUub3BhY2l0eSxuLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZS5oPWkodCksZS5jPXIodCksZS5sPW8odCksZS5vcGFjaXR5PWEodCksZSsiIn19fXZhciBHMT1qMShoMSksVzE9ajEocDEpO2Z1bmN0aW9uIHExKHQpe3JldHVybihmdW5jdGlvbiBlKG4pe2Z1bmN0aW9uIGkoZSxpKXt2YXIgcj10KChlPXIxKGUpKS5oLChpPXIxKGkpKS5oKSxvPXAxKGUucyxpLnMpLGE9cDEoZS5sLGkubCkscz1wMShlLm9wYWNpdHksaS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIGUuaD1yKHQpLGUucz1vKHQpLGUubD1hKE1hdGgucG93KHQsbikpLGUub3BhY2l0eT1zKHQpLGUrIiJ9fXJldHVybiBuPStuLGkuZ2FtbWE9ZSxpfSkoMSl9dmFyIFkxPXExKGgxKSxYMT1xMShwMSk7dmFyICQxPU1hdGguUEksSzE9MiokMSxaMT0xZS02LEoxPUsxLVoxO2Z1bmN0aW9uIFExKCl7dGhpcy5feDA9dGhpcy5feTA9dGhpcy5feDE9dGhpcy5feTE9bnVsbCx0aGlzLl89IiJ9ZnVuY3Rpb24gdDAoKXtyZXR1cm4gbmV3IFExfWZ1bmN0aW9uIGUwKHQsZSxuKXtyZXR1cm4oZVswXS10WzBdKSooblsxXS10WzFdKS0oZVsxXS10WzFdKSooblswXS10WzBdKX1mdW5jdGlvbiBuMCh0LGUpe3JldHVybiB0WzBdLWVbMF18fHRbMV0tZVsxXX1mdW5jdGlvbiBpMCh0KXtmb3IodmFyIGU9dC5sZW5ndGgsbj1bMCwxXSxpPTIscj0yO3I8ZTsrK3Ipe2Zvcig7aT4xJiZlMCh0W25baS0yXV0sdFtuW2ktMV1dLHRbcl0pPD0wOyktLWk7bltpKytdPXJ9cmV0dXJuIG4uc2xpY2UoMCxpKX1mdW5jdGlvbiByMCh0LGUsbixpKXtpZihpc05hTihlKXx8aXNOYU4obikpcmV0dXJuIHQ7dmFyIHIsbyxhLHMsbCxjLHUsaCxkLHA9dC5fcm9vdCxmPXtkYXRhOml9LG09dC5feDAsZz10Ll95MCxfPXQuX3gxLHk9dC5feTE7aWYoIXApcmV0dXJuIHQuX3Jvb3Q9Zix0O2Zvcig7cC5sZW5ndGg7KWlmKChjPWU+PShvPShtK18pLzIpKT9tPW86Xz1vLCh1PW4+PShhPShnK3kpLzIpKT9nPWE6eT1hLHI9cCwhKHA9cFtoPXU8PDF8Y10pKXJldHVybiByW2hdPWYsdDtpZihzPSt0Ll94LmNhbGwobnVsbCxwLmRhdGEpLGw9K3QuX3kuY2FsbChudWxsLHAuZGF0YSksZT09PXMmJm49PT1sKXJldHVybiBmLm5leHQ9cCxyP3JbaF09Zjp0Ll9yb290PWYsdDtkb3tyPXI/cltoXT1uZXcgQXJyYXkoNCk6dC5fcm9vdD1uZXcgQXJyYXkoNCksKGM9ZT49KG89KG0rXykvMikpP209bzpfPW8sKHU9bj49KGE9KGcreSkvMikpP2c9YTp5PWF9d2hpbGUoKGg9dTw8MXxjKT09KGQ9KGw+PWEpPDwxfHM+PW8pKTtyZXR1cm4gcltkXT1wLHJbaF09Zix0fWZ1bmN0aW9uIG8wKHQsZSxuLGkscil7dGhpcy5ub2RlPXQsdGhpcy54MD1lLHRoaXMueTA9bix0aGlzLngxPWksdGhpcy55MT1yfWZ1bmN0aW9uIGEwKHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIHMwKHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIGwwKHQsZSxuKXt2YXIgaT1uZXcgYzAobnVsbD09ZT9hMDplLG51bGw9PW4/czA6bixOYU4sTmFOLE5hTixOYU4pO3JldHVybiBudWxsPT10P2k6aS5hZGRBbGwodCl9ZnVuY3Rpb24gYzAodCxlLG4saSxyLG8pe3RoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5feDA9bix0aGlzLl95MD1pLHRoaXMuX3gxPXIsdGhpcy5feTE9byx0aGlzLl9yb290PXZvaWQgMH1mdW5jdGlvbiB1MCh0KXtmb3IodmFyIGU9e2RhdGE6dC5kYXRhfSxuPWU7dD10Lm5leHQ7KW49bi5uZXh0PXtkYXRhOnQuZGF0YX07cmV0dXJuIGV9UTEucHJvdG90eXBlPXQwLnByb3RvdHlwZT17Y29uc3RydWN0b3I6UTEsbW92ZVRvOmZ1bmN0aW9uKHQsZSl7dGhpcy5fKz0iTSIrKHRoaXMuX3gwPXRoaXMuX3gxPSt0KSsiLCIrKHRoaXMuX3kwPXRoaXMuX3kxPStlKX0sY2xvc2VQYXRoOmZ1bmN0aW9uKCl7bnVsbCE9PXRoaXMuX3gxJiYodGhpcy5feDE9dGhpcy5feDAsdGhpcy5feTE9dGhpcy5feTAsdGhpcy5fKz0iWiIpfSxsaW5lVG86ZnVuY3Rpb24odCxlKXt0aGlzLl8rPSJMIisodGhpcy5feDE9K3QpKyIsIisodGhpcy5feTE9K2UpfSxxdWFkcmF0aWNDdXJ2ZVRvOmZ1bmN0aW9uKHQsZSxuLGkpe3RoaXMuXys9IlEiKyArdCsiLCIrICtlKyIsIisodGhpcy5feDE9K24pKyIsIisodGhpcy5feTE9K2kpfSxiZXppZXJDdXJ2ZVRvOmZ1bmN0aW9uKHQsZSxuLGkscixvKXt0aGlzLl8rPSJDIisgK3QrIiwiKyArZSsiLCIrICtuKyIsIisgK2krIiwiKyh0aGlzLl94MT0rcikrIiwiKyh0aGlzLl95MT0rbyl9LGFyY1RvOmZ1bmN0aW9uKHQsZSxuLGkscil7dmFyIG89dGhpcy5feDEsYT10aGlzLl95MSxzPShuPStuKS0odD0rdCksbD0oaT0raSktKGU9K2UpLGM9by10LHU9YS1lLGg9YypjK3UqdTtpZigocj0rcik8MCl0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIityKTtpZihudWxsPT09dGhpcy5feDEpdGhpcy5fKz0iTSIrKHRoaXMuX3gxPXQpKyIsIisodGhpcy5feTE9ZSk7ZWxzZSBpZihoPloxKWlmKE1hdGguYWJzKHUqcy1sKmMpPloxJiZyKXt2YXIgZD1uLW8scD1pLWEsZj1zKnMrbCpsLG09ZCpkK3AqcCxnPU1hdGguc3FydChmKSxfPU1hdGguc3FydChoKSx5PXIqTWF0aC50YW4oKCQxLU1hdGguYWNvcygoZitoLW0pLygyKmcqXykpKS8yKSx2PXkvXyxiPXkvZztNYXRoLmFicyh2LTEpPloxJiYodGhpcy5fKz0iTCIrKHQrdipjKSsiLCIrKGUrdip1KSksdGhpcy5fKz0iQSIrcisiLCIrcisiLDAsMCwiKyArKHUqZD5jKnApKyIsIisodGhpcy5feDE9dCtiKnMpKyIsIisodGhpcy5feTE9ZStiKmwpfWVsc2UgdGhpcy5fKz0iTCIrKHRoaXMuX3gxPXQpKyIsIisodGhpcy5feTE9ZSk7ZWxzZTt9LGFyYzpmdW5jdGlvbih0LGUsbixpLHIsbyl7dD0rdCxlPStlO3ZhciBhPShuPStuKSpNYXRoLmNvcyhpKSxzPW4qTWF0aC5zaW4oaSksbD10K2EsYz1lK3MsdT0xXm8saD1vP2ktcjpyLWk7aWYobjwwKXRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzOiAiK24pO251bGw9PT10aGlzLl94MT90aGlzLl8rPSJNIitsKyIsIitjOihNYXRoLmFicyh0aGlzLl94MS1sKT5aMXx8TWF0aC5hYnModGhpcy5feTEtYyk+WjEpJiYodGhpcy5fKz0iTCIrbCsiLCIrYyksbiYmKGg8MCYmKGg9aCVLMStLMSksaD5KMT90aGlzLl8rPSJBIituKyIsIituKyIsMCwxLCIrdSsiLCIrKHQtYSkrIiwiKyhlLXMpKyJBIituKyIsIituKyIsMCwxLCIrdSsiLCIrKHRoaXMuX3gxPWwpKyIsIisodGhpcy5feTE9Yyk6aD5aMSYmKHRoaXMuXys9IkEiK24rIiwiK24rIiwwLCIrICsoaD49JDEpKyIsIit1KyIsIisodGhpcy5feDE9dCtuKk1hdGguY29zKHIpKSsiLCIrKHRoaXMuX3kxPWUrbipNYXRoLnNpbihyKSkpKX0scmVjdDpmdW5jdGlvbih0LGUsbixpKXt0aGlzLl8rPSJNIisodGhpcy5feDA9dGhpcy5feDE9K3QpKyIsIisodGhpcy5feTA9dGhpcy5feTE9K2UpKyJoIisgK24rInYiKyAraSsiaCIrLW4rIloifSx0b1N0cmluZzpmdW5jdGlvbigpe3JldHVybiB0aGlzLl99fTt2YXIgaDA9bDAucHJvdG90eXBlPWMwLnByb3RvdHlwZTtoMC5jb3B5PWZ1bmN0aW9uKCl7dmFyIHQsZSxuPW5ldyBjMCh0aGlzLl94LHRoaXMuX3ksdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpLGk9dGhpcy5fcm9vdDtpZighaSlyZXR1cm4gbjtpZighaS5sZW5ndGgpcmV0dXJuIG4uX3Jvb3Q9dTAoaSksbjtmb3IodD1be3NvdXJjZTppLHRhcmdldDpuLl9yb290PW5ldyBBcnJheSg0KX1dO2k9dC5wb3AoKTspZm9yKHZhciByPTA7cjw0OysrcikoZT1pLnNvdXJjZVtyXSkmJihlLmxlbmd0aD90LnB1c2goe3NvdXJjZTplLHRhcmdldDppLnRhcmdldFtyXT1uZXcgQXJyYXkoNCl9KTppLnRhcmdldFtyXT11MChlKSk7cmV0dXJuIG59LGgwLmFkZD1mdW5jdGlvbiBkMCh0KXt2YXIgZT0rdGhpcy5feC5jYWxsKG51bGwsdCksbj0rdGhpcy5feS5jYWxsKG51bGwsdCk7cmV0dXJuIHIwKHRoaXMuY292ZXIoZSxuKSxlLG4sdCl9LGgwLmFkZEFsbD1mdW5jdGlvbiBwMCh0KXt2YXIgZSxuLGkscixvPXQubGVuZ3RoLGE9bmV3IEFycmF5KG8pLHM9bmV3IEFycmF5KG8pLGw9MS8wLGM9MS8wLHU9LTEvMCxoPS0xLzA7Zm9yKG49MDtuPG87KytuKWlzTmFOKGk9K3RoaXMuX3guY2FsbChudWxsLGU9dFtuXSkpfHxpc05hTihyPSt0aGlzLl95LmNhbGwobnVsbCxlKSl8fChhW25dPWksc1tuXT1yLGk8bCYmKGw9aSksaT51JiYodT1pKSxyPGMmJihjPXIpLHI+aCYmKGg9cikpO2Zvcih1PGwmJihsPXRoaXMuX3gwLHU9dGhpcy5feDEpLGg8YyYmKGM9dGhpcy5feTAsaD10aGlzLl95MSksdGhpcy5jb3ZlcihsLGMpLmNvdmVyKHUsaCksbj0wO248bzsrK24pcjAodGhpcyxhW25dLHNbbl0sdFtuXSk7cmV0dXJuIHRoaXN9LGgwLmNvdmVyPWZ1bmN0aW9uIGYwKHQsZSl7aWYoaXNOYU4odD0rdCl8fGlzTmFOKGU9K2UpKXJldHVybiB0aGlzO3ZhciBuPXRoaXMuX3gwLGk9dGhpcy5feTAscj10aGlzLl94MSxvPXRoaXMuX3kxO2lmKGlzTmFOKG4pKXI9KG49TWF0aC5mbG9vcih0KSkrMSxvPShpPU1hdGguZmxvb3IoZSkpKzE7ZWxzZXtpZighKG4+dHx8dD5yfHxpPmV8fGU+bykpcmV0dXJuIHRoaXM7dmFyIGEscyxsPXItbixjPXRoaXMuX3Jvb3Q7c3dpdGNoKHM9KGU8KGkrbykvMik8PDF8dDwobityKS8yKXtjYXNlIDA6ZG97KGE9bmV3IEFycmF5KDQpKVtzXT1jLGM9YX13aGlsZShvPWkrKGwqPTIpLHQ+KHI9bitsKXx8ZT5vKTticmVhaztjYXNlIDE6ZG97KGE9bmV3IEFycmF5KDQpKVtzXT1jLGM9YX13aGlsZShvPWkrKGwqPTIpLChuPXItbCk+dHx8ZT5vKTticmVhaztjYXNlIDI6ZG97KGE9bmV3IEFycmF5KDQpKVtzXT1jLGM9YX13aGlsZShpPW8tKGwqPTIpLHQ+KHI9bitsKXx8aT5lKTticmVhaztjYXNlIDM6ZG97KGE9bmV3IEFycmF5KDQpKVtzXT1jLGM9YX13aGlsZShpPW8tKGwqPTIpLChuPXItbCk+dHx8aT5lKX10aGlzLl9yb290JiZ0aGlzLl9yb290Lmxlbmd0aCYmKHRoaXMuX3Jvb3Q9Yyl9cmV0dXJuIHRoaXMuX3gwPW4sdGhpcy5feTA9aSx0aGlzLl94MT1yLHRoaXMuX3kxPW8sdGhpc30saDAuZGF0YT1mdW5jdGlvbiBtMCgpe3ZhciB0PVtdO3JldHVybiB0aGlzLnZpc2l0KChmdW5jdGlvbihlKXtpZighZS5sZW5ndGgpZG97dC5wdXNoKGUuZGF0YSl9d2hpbGUoZT1lLm5leHQpfSkpLHR9LGgwLmV4dGVudD1mdW5jdGlvbiBnMCh0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmNvdmVyKCt0WzBdWzBdLCt0WzBdWzFdKS5jb3ZlcigrdFsxXVswXSwrdFsxXVsxXSk6aXNOYU4odGhpcy5feDApP3ZvaWQgMDpbW3RoaXMuX3gwLHRoaXMuX3kwXSxbdGhpcy5feDEsdGhpcy5feTFdXX0saDAuZmluZD1mdW5jdGlvbiBfMCh0LGUsbil7dmFyIGkscixvLGEscyxsLGMsdT10aGlzLl94MCxoPXRoaXMuX3kwLGQ9dGhpcy5feDEscD10aGlzLl95MSxmPVtdLG09dGhpcy5fcm9vdDtmb3IobSYmZi5wdXNoKG5ldyBvMChtLHUsaCxkLHApKSxudWxsPT1uP249MS8wOih1PXQtbixoPWUtbixkPXQrbixwPWUrbixuKj1uKTtsPWYucG9wKCk7KWlmKCEoIShtPWwubm9kZSl8fChyPWwueDApPmR8fChvPWwueTApPnB8fChhPWwueDEpPHV8fChzPWwueTEpPGgpKWlmKG0ubGVuZ3RoKXt2YXIgZz0ocithKS8yLF89KG8rcykvMjtmLnB1c2gobmV3IG8wKG1bM10sZyxfLGEscyksbmV3IG8wKG1bMl0scixfLGcscyksbmV3IG8wKG1bMV0sZyxvLGEsXyksbmV3IG8wKG1bMF0scixvLGcsXykpLChjPShlPj1fKTw8MXx0Pj1nKSYmKGw9ZltmLmxlbmd0aC0xXSxmW2YubGVuZ3RoLTFdPWZbZi5sZW5ndGgtMS1jXSxmW2YubGVuZ3RoLTEtY109bCl9ZWxzZXt2YXIgeT10LSt0aGlzLl94LmNhbGwobnVsbCxtLmRhdGEpLHY9ZS0rdGhpcy5feS5jYWxsKG51bGwsbS5kYXRhKSxiPXkqeSt2KnY7aWYoYjxuKXt2YXIgeD1NYXRoLnNxcnQobj1iKTt1PXQteCxoPWUteCxkPXQreCxwPWUreCxpPW0uZGF0YX19cmV0dXJuIGl9LGgwLnJlbW92ZT1mdW5jdGlvbiB5MCh0KXtpZihpc05hTihvPSt0aGlzLl94LmNhbGwobnVsbCx0KSl8fGlzTmFOKGE9K3RoaXMuX3kuY2FsbChudWxsLHQpKSlyZXR1cm4gdGhpczt2YXIgZSxuLGkscixvLGEscyxsLGMsdSxoLGQscD10aGlzLl9yb290LGY9dGhpcy5feDAsbT10aGlzLl95MCxnPXRoaXMuX3gxLF89dGhpcy5feTE7aWYoIXApcmV0dXJuIHRoaXM7aWYocC5sZW5ndGgpZm9yKDs7KXtpZigoYz1vPj0ocz0oZitnKS8yKSk/Zj1zOmc9cywodT1hPj0obD0obStfKS8yKSk/bT1sOl89bCxlPXAsIShwPXBbaD11PDwxfGNdKSlyZXR1cm4gdGhpcztpZighcC5sZW5ndGgpYnJlYWs7KGVbaCsxJjNdfHxlW2grMiYzXXx8ZVtoKzMmM10pJiYobj1lLGQ9aCl9Zm9yKDtwLmRhdGEhPT10OylpZihpPXAsIShwPXAubmV4dCkpcmV0dXJuIHRoaXM7cmV0dXJuKHI9cC5uZXh0KSYmZGVsZXRlIHAubmV4dCxpPyhyP2kubmV4dD1yOmRlbGV0ZSBpLm5leHQsdGhpcyk6ZT8ocj9lW2hdPXI6ZGVsZXRlIGVbaF0sKHA9ZVswXXx8ZVsxXXx8ZVsyXXx8ZVszXSkmJnA9PT0oZVszXXx8ZVsyXXx8ZVsxXXx8ZVswXSkmJiFwLmxlbmd0aCYmKG4/bltkXT1wOnRoaXMuX3Jvb3Q9cCksdGhpcyk6KHRoaXMuX3Jvb3Q9cix0aGlzKX0saDAucmVtb3ZlQWxsPWZ1bmN0aW9uIHYwKHQpe2Zvcih2YXIgZT0wLG49dC5sZW5ndGg7ZTxuOysrZSl0aGlzLnJlbW92ZSh0W2VdKTtyZXR1cm4gdGhpc30saDAucm9vdD1mdW5jdGlvbiBiMCgpe3JldHVybiB0aGlzLl9yb290fSxoMC5zaXplPWZ1bmN0aW9uIHgwKCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy52aXNpdCgoZnVuY3Rpb24oZSl7aWYoIWUubGVuZ3RoKWRveysrdH13aGlsZShlPWUubmV4dCl9KSksdH0saDAudmlzaXQ9ZnVuY3Rpb24gdzAodCl7dmFyIGUsbixpLHIsbyxhLHM9W10sbD10aGlzLl9yb290O2ZvcihsJiZzLnB1c2gobmV3IG8wKGwsdGhpcy5feDAsdGhpcy5feTAsdGhpcy5feDEsdGhpcy5feTEpKTtlPXMucG9wKCk7KWlmKCF0KGw9ZS5ub2RlLGk9ZS54MCxyPWUueTAsbz1lLngxLGE9ZS55MSkmJmwubGVuZ3RoKXt2YXIgYz0oaStvKS8yLHU9KHIrYSkvMjsobj1sWzNdKSYmcy5wdXNoKG5ldyBvMChuLGMsdSxvLGEpKSwobj1sWzJdKSYmcy5wdXNoKG5ldyBvMChuLGksdSxjLGEpKSwobj1sWzFdKSYmcy5wdXNoKG5ldyBvMChuLGMscixvLHUpKSwobj1sWzBdKSYmcy5wdXNoKG5ldyBvMChuLGkscixjLHUpKX1yZXR1cm4gdGhpc30saDAudmlzaXRBZnRlcj1mdW5jdGlvbiBTMCh0KXt2YXIgZSxuPVtdLGk9W107Zm9yKHRoaXMuX3Jvb3QmJm4ucHVzaChuZXcgbzAodGhpcy5fcm9vdCx0aGlzLl94MCx0aGlzLl95MCx0aGlzLl94MSx0aGlzLl95MSkpO2U9bi5wb3AoKTspe3ZhciByPWUubm9kZTtpZihyLmxlbmd0aCl7dmFyIG8sYT1lLngwLHM9ZS55MCxsPWUueDEsYz1lLnkxLHU9KGErbCkvMixoPShzK2MpLzI7KG89clswXSkmJm4ucHVzaChuZXcgbzAobyxhLHMsdSxoKSksKG89clsxXSkmJm4ucHVzaChuZXcgbzAobyx1LHMsbCxoKSksKG89clsyXSkmJm4ucHVzaChuZXcgbzAobyxhLGgsdSxjKSksKG89clszXSkmJm4ucHVzaChuZXcgbzAobyx1LGgsbCxjKSl9aS5wdXNoKGUpfWZvcig7ZT1pLnBvcCgpOyl0KGUubm9kZSxlLngwLGUueTAsZS54MSxlLnkxKTtyZXR1cm4gdGhpc30saDAueD1mdW5jdGlvbiBNMCh0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odGhpcy5feD10LHRoaXMpOnRoaXMuX3h9LGgwLnk9ZnVuY3Rpb24gRTAodCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHRoaXMuX3k9dCx0aGlzKTp0aGlzLl95fTt2YXIgVDA9W10uc2xpY2UsQzA9e307ZnVuY3Rpb24gQTAodCl7dGhpcy5fc2l6ZT10LHRoaXMuX2NhbGw9dGhpcy5fZXJyb3I9bnVsbCx0aGlzLl90YXNrcz1bXSx0aGlzLl9kYXRhPVtdLHRoaXMuX3dhaXRpbmc9dGhpcy5fYWN0aXZlPXRoaXMuX2VuZGVkPXRoaXMuX3N0YXJ0PTB9ZnVuY3Rpb24gazAodCl7aWYoIXQuX3N0YXJ0KXRyeXshKGZ1bmN0aW9uIGUodCl7Zm9yKDt0Ll9zdGFydD10Ll93YWl0aW5nJiZ0Ll9hY3RpdmU8dC5fc2l6ZTspe3ZhciBlPXQuX2VuZGVkK3QuX2FjdGl2ZSxuPXQuX3Rhc2tzW2VdLGk9bi5sZW5ndGgtMSxyPW5baV07bltpXT1MMCh0LGUpLC0tdC5fd2FpdGluZywrK3QuX2FjdGl2ZSxuPXIuYXBwbHkobnVsbCxuKSx0Ll90YXNrc1tlXSYmKHQuX3Rhc2tzW2VdPW58fEMwKX19KSh0KX1jYXRjaChlKXtpZih0Ll90YXNrc1t0Ll9lbmRlZCt0Ll9hY3RpdmUtMV0pUDAodCxlKTtlbHNlIGlmKCF0Ll9kYXRhKXRocm93IGV9fWZ1bmN0aW9uIEwwKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4saSl7dC5fdGFza3NbZV0mJigtLXQuX2FjdGl2ZSwrK3QuX2VuZGVkLHQuX3Rhc2tzW2VdPW51bGwsbnVsbD09dC5fZXJyb3ImJihudWxsIT1uP1AwKHQsbik6KHQuX2RhdGFbZV09aSx0Ll93YWl0aW5nP2swKHQpOk4wKHQpKSkpfX1mdW5jdGlvbiBQMCh0LGUpe3ZhciBuLGk9dC5fdGFza3MubGVuZ3RoO2Zvcih0Ll9lcnJvcj1lLHQuX2RhdGE9dm9pZCAwLHQuX3dhaXRpbmc9TmFOOy0taT49MDspaWYoKG49dC5fdGFza3NbaV0pJiYodC5fdGFza3NbaV09bnVsbCxuLmFib3J0KSl0cnl7bi5hYm9ydCgpfWNhdGNoKGUpe310Ll9hY3RpdmU9TmFOLE4wKHQpfWZ1bmN0aW9uIE4wKHQpe2lmKCF0Ll9hY3RpdmUmJnQuX2NhbGwpe3ZhciBlPXQuX2RhdGE7dC5fZGF0YT12b2lkIDAsdC5fY2FsbCh0Ll9lcnJvcixlKX19ZnVuY3Rpb24gSTAodCl7aWYobnVsbD09dCl0PTEvMDtlbHNlIGlmKCEoKHQ9K3QpPj0xKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY29uY3VycmVuY3kiKTtyZXR1cm4gbmV3IEEwKHQpfWZ1bmN0aW9uIFIwKCl7cmV0dXJuIE1hdGgucmFuZG9tKCl9QTAucHJvdG90eXBlPUkwLnByb3RvdHlwZT17Y29uc3RydWN0b3I6QTAsZGVmZXI6ZnVuY3Rpb24odCl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrIik7aWYodGhpcy5fY2FsbCl0aHJvdyBuZXcgRXJyb3IoImRlZmVyIGFmdGVyIGF3YWl0Iik7aWYobnVsbCE9dGhpcy5fZXJyb3IpcmV0dXJuIHRoaXM7dmFyIGU9VDAuY2FsbChhcmd1bWVudHMsMSk7cmV0dXJuIGUucHVzaCh0KSwrK3RoaXMuX3dhaXRpbmcsdGhpcy5fdGFza3MucHVzaChlKSxrMCh0aGlzKSx0aGlzfSxhYm9ydDpmdW5jdGlvbigpe3JldHVybiBudWxsPT10aGlzLl9lcnJvciYmUDAodGhpcyxuZXcgRXJyb3IoImFib3J0IikpLHRoaXN9LGF3YWl0OmZ1bmN0aW9uKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjYWxsYmFjayIpO2lmKHRoaXMuX2NhbGwpdGhyb3cgbmV3IEVycm9yKCJtdWx0aXBsZSBhd2FpdCIpO3JldHVybiB0aGlzLl9jYWxsPWZ1bmN0aW9uKGUsbil7dC5hcHBseShudWxsLFtlXS5jb25jYXQobikpfSxOMCh0aGlzKSx0aGlzfSxhd2FpdEFsbDpmdW5jdGlvbih0KXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2siKTtpZih0aGlzLl9jYWxsKXRocm93IG5ldyBFcnJvcigibXVsdGlwbGUgYXdhaXQiKTtyZXR1cm4gdGhpcy5fY2FsbD10LE4wKHRoaXMpLHRoaXN9fTt2YXIgTzA9KGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0LG4pe3JldHVybiB0PW51bGw9PXQ/MDordCxuPW51bGw9PW4/MTorbiwxPT09YXJndW1lbnRzLmxlbmd0aD8obj10LHQ9MCk6bi09dCxmdW5jdGlvbigpe3JldHVybiBlKCkqbit0fX1yZXR1cm4gbi5zb3VyY2U9dCxufSkoUjApLHowPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCxuKXt2YXIgaSxyO3JldHVybiB0PW51bGw9PXQ/MDordCxuPW51bGw9PW4/MTorbixmdW5jdGlvbigpe3ZhciBvO2lmKG51bGwhPWkpbz1pLGk9bnVsbDtlbHNlIGRve2k9MiplKCktMSxvPTIqZSgpLTEscj1pKmkrbypvfXdoaWxlKCFyfHxyPjEpO3JldHVybiB0K24qbypNYXRoLnNxcnQoLTIqTWF0aC5sb2cocikvcil9fXJldHVybiBuLnNvdXJjZT10LG59KShSMCksRDA9KGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbigpe3ZhciB0PXowLnNvdXJjZShlKS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIE1hdGguZXhwKHQoKSl9fXJldHVybiBuLnNvdXJjZT10LG59KShSMCksQjA9KGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtmb3IodmFyIG49MCxpPTA7aTx0OysraSluKz1lKCk7cmV0dXJuIG59fXJldHVybiBuLnNvdXJjZT10LG59KShSMCksSDA9KGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0KXt2YXIgbj1CMC5zb3VyY2UoZSkodCk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIG4oKS90fX1yZXR1cm4gbi5zb3VyY2U9dCxufSkoUjApLEYwPShmdW5jdGlvbiB0KGUpe2Z1bmN0aW9uIG4odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuLU1hdGgubG9nKDEtZSgpKS90fX1yZXR1cm4gbi5zb3VyY2U9dCxufSkoUjApO2Z1bmN0aW9uIFYwKHQsZSl7dmFyIG4saSxyLG8sYT13YygiYmVmb3Jlc2VuZCIsInByb2dyZXNzIiwibG9hZCIsImVycm9yIikscz1qZygpLGw9bmV3IFhNTEh0dHBSZXF1ZXN0LGM9bnVsbCx1PW51bGwsaD0wO2Z1bmN0aW9uIGQodCl7dmFyIGUsaT1sLnN0YXR1cztpZighaSYmKGZ1bmN0aW9uIG8odCl7dmFyIGU9dC5yZXNwb25zZVR5cGU7cmV0dXJuIGUmJiJ0ZXh0IiE9PWU/dC5yZXNwb25zZTp0LnJlc3BvbnNlVGV4dH0pKGwpfHxpPj0yMDAmJmk8MzAwfHwzMDQ9PT1pKXtpZihyKXRyeXtlPXIuY2FsbChuLGwpfWNhdGNoKHQpe3JldHVybiB2b2lkIGEuY2FsbCgiZXJyb3IiLG4sdCl9ZWxzZSBlPWw7YS5jYWxsKCJsb2FkIixuLGUpfWVsc2UgYS5jYWxsKCJlcnJvciIsbix0KX1pZigidW5kZWZpbmVkIiE9dHlwZW9mIFhEb21haW5SZXF1ZXN0JiYhKCJ3aXRoQ3JlZGVudGlhbHMiaW4gbCkmJi9eKGh0dHAocyk/Oik/XC9cLy8udGVzdCh0KSYmKGw9bmV3IFhEb21haW5SZXF1ZXN0KSwib25sb2FkImluIGw/bC5vbmxvYWQ9bC5vbmVycm9yPWwub250aW1lb3V0PWQ6bC5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24odCl7bC5yZWFkeVN0YXRlPjMmJmQodCl9LGwub25wcm9ncmVzcz1mdW5jdGlvbih0KXthLmNhbGwoInByb2dyZXNzIixuLHQpfSxuPXtoZWFkZXI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdD0odCsiIikudG9Mb3dlckNhc2UoKSxhcmd1bWVudHMubGVuZ3RoPDI/cy5nZXQodCk6KG51bGw9PWU/cy5yZW1vdmUodCk6cy5zZXQodCxlKyIiKSxuKX0sbWltZVR5cGU6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09dD9udWxsOnQrIiIsbik6aX0scmVzcG9uc2VUeXBlOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPXQsbik6b30sdGltZW91dDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD0rdCxuKTpofSx1c2VyOmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPDE/YzooYz1udWxsPT10P251bGw6dCsiIixuKX0scGFzc3dvcmQ6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8MT91Oih1PW51bGw9PXQ/bnVsbDp0KyIiLG4pfSxyZXNwb25zZTpmdW5jdGlvbih0KXtyZXR1cm4gcj10LG59LGdldDpmdW5jdGlvbih0LGUpe3JldHVybiBuLnNlbmQoIkdFVCIsdCxlKX0scG9zdDpmdW5jdGlvbih0LGUpe3JldHVybiBuLnNlbmQoIlBPU1QiLHQsZSl9LHNlbmQ6ZnVuY3Rpb24oZSxyLGQpe3JldHVybiBsLm9wZW4oZSx0LCEwLGMsdSksbnVsbD09aXx8cy5oYXMoImFjY2VwdCIpfHxzLnNldCgiYWNjZXB0IixpKyIsKi8qIiksbC5zZXRSZXF1ZXN0SGVhZGVyJiZzLmVhY2goKGZ1bmN0aW9uKHQsZSl7bC5zZXRSZXF1ZXN0SGVhZGVyKGUsdCl9KSksbnVsbCE9aSYmbC5vdmVycmlkZU1pbWVUeXBlJiZsLm92ZXJyaWRlTWltZVR5cGUoaSksbnVsbCE9byYmKGwucmVzcG9uc2VUeXBlPW8pLGg+MCYmKGwudGltZW91dD1oKSxudWxsPT1kJiYiZnVuY3Rpb24iPT10eXBlb2YgciYmKGQ9cixyPW51bGwpLG51bGwhPWQmJjE9PT1kLmxlbmd0aCYmKGQ9KGZ1bmN0aW9uIHAodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7dChudWxsPT1lP246bnVsbCl9fSkoZCkpLG51bGwhPWQmJm4ub24oImVycm9yIixkKS5vbigibG9hZCIsKGZ1bmN0aW9uKHQpe2QobnVsbCx0KX0pKSxhLmNhbGwoImJlZm9yZXNlbmQiLG4sbCksbC5zZW5kKG51bGw9PXI/bnVsbDpyKSxufSxhYm9ydDpmdW5jdGlvbigpe3JldHVybiBsLmFib3J0KCksbn0sb246ZnVuY3Rpb24oKXt2YXIgdD1hLm9uLmFwcGx5KGEsYXJndW1lbnRzKTtyZXR1cm4gdD09PWE/bjp0fX0sbnVsbCE9ZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrOiAiK2UpO3JldHVybiBuLmdldChlKX1yZXR1cm4gbn1mdW5jdGlvbiBVMCh0LGUpe3JldHVybiBmdW5jdGlvbihuLGkpe3ZhciByPVYwKG4pLm1pbWVUeXBlKHQpLnJlc3BvbnNlKGUpO2lmKG51bGwhPWkpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBpKXRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjYWxsYmFjazogIitpKTtyZXR1cm4gci5nZXQoaSl9cmV0dXJuIHJ9fXZhciBqMD1VMCgidGV4dC9odG1sIiwoZnVuY3Rpb24odCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkuY3JlYXRlQ29udGV4dHVhbEZyYWdtZW50KHQucmVzcG9uc2VUZXh0KX0pKSxHMD1VMCgiYXBwbGljYXRpb24vanNvbiIsKGZ1bmN0aW9uKHQpe3JldHVybiBKU09OLnBhcnNlKHQucmVzcG9uc2VUZXh0KX0pKSxXMD1VMCgidGV4dC9wbGFpbiIsKGZ1bmN0aW9uKHQpe3JldHVybiB0LnJlc3BvbnNlVGV4dH0pKSxxMD1VMCgiYXBwbGljYXRpb24veG1sIiwoZnVuY3Rpb24odCl7dmFyIGU9dC5yZXNwb25zZVhNTDtpZighZSl0aHJvdyBuZXcgRXJyb3IoInBhcnNlIGVycm9yIik7cmV0dXJuIGV9KSk7ZnVuY3Rpb24gWTAodCxlKXtyZXR1cm4gZnVuY3Rpb24obixpLHIpe2FyZ3VtZW50cy5sZW5ndGg8MyYmKHI9aSxpPW51bGwpO3ZhciBvPVYwKG4pLm1pbWVUeXBlKHQpO3JldHVybiBvLnJvdz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9vLnJlc3BvbnNlKFgwKGUsaT10KSk6aX0sby5yb3coaSkscj9vLmdldChyKTpvfX1mdW5jdGlvbiBYMCh0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdChuLnJlc3BvbnNlVGV4dCxlKX19dmFyICQwPVkwKCJ0ZXh0L2NzdiIsYl8pLEswPVkwKCJ0ZXh0L3RhYi1zZXBhcmF0ZWQtdmFsdWVzIixBXyk7ZnVuY3Rpb24gWjAodCxlKXtyZXR1cm4gdDxlPy0xOnQ+ZT8xOnQ+PWU/MDpOYU59ZnVuY3Rpb24gSjAodCl7cmV0dXJuIDE9PT10Lmxlbmd0aCYmKHQ9KGZ1bmN0aW9uIGUodCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7cmV0dXJuIFowKHQoZSksbil9fSkodCkpLHtsZWZ0OmZ1bmN0aW9uKGUsbixpLHIpe2ZvcihudWxsPT1pJiYoaT0wKSxudWxsPT1yJiYocj1lLmxlbmd0aCk7aTxyOyl7dmFyIG89aStyPj4+MTt0KGVbb10sbik8MD9pPW8rMTpyPW99cmV0dXJuIGl9LHJpZ2h0OmZ1bmN0aW9uKGUsbixpLHIpe2ZvcihudWxsPT1pJiYoaT0wKSxudWxsPT1yJiYocj1lLmxlbmd0aCk7aTxyOyl7dmFyIG89aStyPj4+MTt0KGVbb10sbik+MD9yPW86aT1vKzF9cmV0dXJuIGl9fX12YXIgUTA9SjAoWjApLnJpZ2h0O2Z1bmN0aW9uIHQyKHQpe3JldHVybiBudWxsPT09dD9OYU46K3R9dmFyIGUyPU1hdGguc3FydCg1MCksbjI9TWF0aC5zcXJ0KDEwKSxpMj1NYXRoLnNxcnQoMik7ZnVuY3Rpb24gcjIodCxlLG4pe3ZhciBpLHIsbyxhLHM9LTE7aWYobj0rbiwodD0rdCk9PT0oZT0rZSkmJm4+MClyZXR1cm5bdF07aWYoKGk9ZTx0KSYmKHI9dCx0PWUsZT1yKSwwPT09KGE9bzIodCxlLG4pKXx8IWlzRmluaXRlKGEpKXJldHVybltdO2lmKGE+MClmb3IodD1NYXRoLmNlaWwodC9hKSxlPU1hdGguZmxvb3IoZS9hKSxvPW5ldyBBcnJheShyPU1hdGguY2VpbChlLXQrMSkpOysrczxyOylvW3NdPSh0K3MpKmE7ZWxzZSBmb3IodD1NYXRoLmZsb29yKHQqYSksZT1NYXRoLmNlaWwoZSphKSxvPW5ldyBBcnJheShyPU1hdGguY2VpbCh0LWUrMSkpOysrczxyOylvW3NdPSh0LXMpL2E7cmV0dXJuIGkmJm8ucmV2ZXJzZSgpLG99ZnVuY3Rpb24gbzIodCxlLG4pe3ZhciBpPShlLXQpL01hdGgubWF4KDAsbikscj1NYXRoLmZsb29yKE1hdGgubG9nKGkpL01hdGguTE4xMCksbz1pL01hdGgucG93KDEwLHIpO3JldHVybiByPj0wPyhvPj1lMj8xMDpvPj1uMj81Om8+PWkyPzI6MSkqTWF0aC5wb3coMTAscik6LU1hdGgucG93KDEwLC1yKS8obz49ZTI/MTA6bz49bjI/NTpvPj1pMj8yOjEpfWZ1bmN0aW9uIGEyKHQsZSxuKXt2YXIgaT1NYXRoLmFicyhlLXQpL01hdGgubWF4KDAsbikscj1NYXRoLnBvdygxMCxNYXRoLmZsb29yKE1hdGgubG9nKGkpL01hdGguTE4xMCkpLG89aS9yO3JldHVybiBvPj1lMj9yKj0xMDpvPj1uMj9yKj01Om8+PWkyJiYocio9MiksZTx0Py1yOnJ9ZnVuY3Rpb24gczIodCxlLG4pe2lmKG51bGw9PW4mJihuPXQyKSxpPXQubGVuZ3RoKXtpZigoZT0rZSk8PTB8fGk8MilyZXR1cm4rbih0WzBdLDAsdCk7aWYoZT49MSlyZXR1cm4rbih0W2ktMV0saS0xLHQpO3ZhciBpLHI9KGktMSkqZSxvPU1hdGguZmxvb3IociksYT0rbih0W29dLG8sdCk7cmV0dXJuIGErKCtuKHRbbysxXSxvKzEsdCktYSkqKHItbyl9fXZhciBsMj0iJCI7ZnVuY3Rpb24gYzIoKXt9ZnVuY3Rpb24gdTIodCxlKXt2YXIgbj1uZXcgYzI7aWYodCBpbnN0YW5jZW9mIGMyKXQuZWFjaCgoZnVuY3Rpb24odCxlKXtuLnNldChlLHQpfSkpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheSh0KSl7dmFyIGkscj0tMSxvPXQubGVuZ3RoO2lmKG51bGw9PWUpZm9yKDsrK3I8bzspbi5zZXQocix0W3JdKTtlbHNlIGZvcig7KytyPG87KW4uc2V0KGUoaT10W3JdLHIsdCksaSl9ZWxzZSBpZih0KWZvcih2YXIgYSBpbiB0KW4uc2V0KGEsdFthXSk7cmV0dXJuIG59ZnVuY3Rpb24gaDIoKXt9YzIucHJvdG90eXBlPXUyLnByb3RvdHlwZT17Y29uc3RydWN0b3I6YzIsaGFzOmZ1bmN0aW9uKHQpe3JldHVybiBsMit0IGluIHRoaXN9LGdldDpmdW5jdGlvbih0KXtyZXR1cm4gdGhpc1tsMit0XX0sc2V0OmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXNbbDIrdF09ZSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIGU9bDIrdDtyZXR1cm4gZSBpbiB0aGlzJiZkZWxldGUgdGhpc1tlXX0sY2xlYXI6ZnVuY3Rpb24oKXtmb3IodmFyIHQgaW4gdGhpcyl0WzBdPT09bDImJmRlbGV0ZSB0aGlzW3RdfSxrZXlzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBlIGluIHRoaXMpZVswXT09PWwyJiZ0LnB1c2goZS5zbGljZSgxKSk7cmV0dXJuIHR9LHZhbHVlczpmdW5jdGlvbigpe3ZhciB0PVtdO2Zvcih2YXIgZSBpbiB0aGlzKWVbMF09PT1sMiYmdC5wdXNoKHRoaXNbZV0pO3JldHVybiB0fSxlbnRyaWVzOmZ1bmN0aW9uKCl7dmFyIHQ9W107Zm9yKHZhciBlIGluIHRoaXMpZVswXT09PWwyJiZ0LnB1c2goe2tleTplLnNsaWNlKDEpLHZhbHVlOnRoaXNbZV19KTtyZXR1cm4gdH0sc2l6ZTpmdW5jdGlvbigpe3ZhciB0PTA7Zm9yKHZhciBlIGluIHRoaXMpZVswXT09PWwyJiYrK3Q7cmV0dXJuIHR9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciB0IGluIHRoaXMpaWYodFswXT09PWwyKXJldHVybiExO3JldHVybiEwfSxlYWNoOmZ1bmN0aW9uKHQpe2Zvcih2YXIgZSBpbiB0aGlzKWVbMF09PT1sMiYmdCh0aGlzW2VdLGUuc2xpY2UoMSksdGhpcyl9fTt2YXIgZDI9dTIucHJvdG90eXBlO2gyLnByb3RvdHlwZT17Y29uc3RydWN0b3I6aDIsaGFzOmQyLmhhcyxhZGQ6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXNbbDIrKHQrPSIiKV09dCx0aGlzfSxyZW1vdmU6ZDIucmVtb3ZlLGNsZWFyOmQyLmNsZWFyLHZhbHVlczpkMi5rZXlzLHNpemU6ZDIuc2l6ZSxlbXB0eTpkMi5lbXB0eSxlYWNoOmQyLmVhY2h9O3ZhciBwMj1BcnJheS5wcm90b3R5cGUsZjI9cDIubWFwLG0yPXAyLnNsaWNlLGcyPXtuYW1lOiJpbXBsaWNpdCJ9O2Z1bmN0aW9uIF8yKHQpe3ZhciBlPXUyKCksbj1bXSxpPWcyO2Z1bmN0aW9uIHIocil7dmFyIG89cisiIixhPWUuZ2V0KG8pO2lmKCFhKXtpZihpIT09ZzIpcmV0dXJuIGk7ZS5zZXQobyxhPW4ucHVzaChyKSl9cmV0dXJuIHRbKGEtMSkldC5sZW5ndGhdfXJldHVybiB0PW51bGw9PXQ/W106bTIuY2FsbCh0KSxyLmRvbWFpbj1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gbi5zbGljZSgpO249W10sZT11MigpO2Zvcih2YXIgaSxvLGE9LTEscz10Lmxlbmd0aDsrK2E8czspZS5oYXMobz0oaT10W2FdKSsiIil8fGUuc2V0KG8sbi5wdXNoKGkpKTtyZXR1cm4gcn0sci5yYW5nZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1tMi5jYWxsKGUpLHIpOnQuc2xpY2UoKX0sci51bmtub3duPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPXQscik6aX0sci5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIF8yKCkuZG9tYWluKG4pLnJhbmdlKHQpLnVua25vd24oaSl9LHJ9ZnVuY3Rpb24geTIoKXt2YXIgdCxlLG49XzIoKS51bmtub3duKHZvaWQgMCksaT1uLmRvbWFpbixyPW4ucmFuZ2Usbz1bMCwxXSxhPSExLHM9MCxsPTAsYz0uNTtmdW5jdGlvbiB1KCl7dmFyIG49aSgpLmxlbmd0aCx1PW9bMV08b1swXSxoPW9bdS0wXSxkPW9bMS11XTt0PShkLWgpL01hdGgubWF4KDEsbi1zKzIqbCksYSYmKHQ9TWF0aC5mbG9vcih0KSksaCs9KGQtaC10KihuLXMpKSpjLGU9dCooMS1zKSxhJiYoaD1NYXRoLnJvdW5kKGgpLGU9TWF0aC5yb3VuZChlKSk7dmFyIHA9KGZ1bmN0aW9uIGYodCxlLG4pe3Q9K3QsZT0rZSxuPShyPWFyZ3VtZW50cy5sZW5ndGgpPDI/KGU9dCx0PTAsMSk6cjwzPzE6K247Zm9yKHZhciBpPS0xLHI9MHxNYXRoLm1heCgwLE1hdGguY2VpbCgoZS10KS9uKSksbz1uZXcgQXJyYXkocik7KytpPHI7KW9baV09dCtpKm47cmV0dXJuIG99KShuKS5tYXAoKGZ1bmN0aW9uKGUpe3JldHVybiBoK3QqZX0pKTtyZXR1cm4gcih1P3AucmV2ZXJzZSgpOnApfXJldHVybiBkZWxldGUgbi51bmtub3duLG4uZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpKHQpLHUoKSk6aSgpfSxuLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPVsrdFswXSwrdFsxXV0sdSgpKTpvLnNsaWNlKCl9LG4ucmFuZ2VSb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gbz1bK3RbMF0sK3RbMV1dLGE9ITAsdSgpfSxuLmJhbmR3aWR0aD1mdW5jdGlvbigpe3JldHVybiBlfSxuLnN0ZXA9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sbi5yb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0hIXQsdSgpKTphfSxuLnBhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9bD1NYXRoLm1heCgwLE1hdGgubWluKDEsdCkpLHUoKSk6c30sbi5wYWRkaW5nSW5uZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9TWF0aC5tYXgoMCxNYXRoLm1pbigxLHQpKSx1KCkpOnN9LG4ucGFkZGluZ091dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhsPU1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSksdSgpKTpsfSxuLmFsaWduPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPU1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSksdSgpKTpjfSxuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4geTIoKS5kb21haW4oaSgpKS5yYW5nZShvKS5yb3VuZChhKS5wYWRkaW5nSW5uZXIocykucGFkZGluZ091dGVyKGwpLmFsaWduKGMpfSx1KCl9ZnVuY3Rpb24gdjIodCl7dmFyIGU9dC5jb3B5O3JldHVybiB0LnBhZGRpbmc9dC5wYWRkaW5nT3V0ZXIsZGVsZXRlIHQucGFkZGluZ0lubmVyLGRlbGV0ZSB0LnBhZGRpbmdPdXRlcix0LmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdjIoZSgpKX0sdH1mdW5jdGlvbiBiMih0LGUsbil7dC5wcm90b3R5cGU9ZS5wcm90b3R5cGU9bixuLmNvbnN0cnVjdG9yPXR9ZnVuY3Rpb24geDIodCxlKXt2YXIgbj1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKTtmb3IodmFyIGkgaW4gZSluW2ldPWVbaV07cmV0dXJuIG59ZnVuY3Rpb24gdzIoKXt9dmFyIFMyPS43LE0yPTEvUzIsRTI9IlxccyooWystXT9cXGQrKVxccyoiLFQyPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLEMyPSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIixBMj0vXiMoWzAtOWEtZl17Myw4fSkkLyxrMj1uZXcgUmVnRXhwKCJecmdiXFwoIitbRTIsRTIsRTJdKyJcXCkkIiksTDI9bmV3IFJlZ0V4cCgiXnJnYlxcKCIrW0MyLEMyLEMyXSsiXFwpJCIpLFAyPW5ldyBSZWdFeHAoIl5yZ2JhXFwoIitbRTIsRTIsRTIsVDJdKyJcXCkkIiksTjI9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tDMixDMixDMixUMl0rIlxcKSQiKSxJMj1uZXcgUmVnRXhwKCJeaHNsXFwoIitbVDIsQzIsQzJdKyJcXCkkIiksUjI9bmV3IFJlZ0V4cCgiXmhzbGFcXCgiK1tUMixDMixDMixUMl0rIlxcKSQiKSxPMj17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fTtmdW5jdGlvbiB6Migpe3JldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleCgpfWZ1bmN0aW9uIEQyKCl7cmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0UmdiKCl9ZnVuY3Rpb24gQjIodCl7dmFyIGUsbjtyZXR1cm4gdD0odCsiIikudHJpbSgpLnRvTG93ZXJDYXNlKCksKGU9QTIuZXhlYyh0KSk/KG49ZVsxXS5sZW5ndGgsZT1wYXJzZUludChlWzFdLDE2KSw2PT09bj9IMihlKTozPT09bj9uZXcgajIoZT4+OCYxNXxlPj40JjI0MCxlPj40JjE1fDI0MCZlLCgxNSZlKTw8NHwxNSZlLDEpOjg9PT1uP0YyKGU+PjI0JjI1NSxlPj4xNiYyNTUsZT4+OCYyNTUsKDI1NSZlKS8yNTUpOjQ9PT1uP0YyKGU+PjEyJjE1fGU+PjgmMjQwLGU+PjgmMTV8ZT4+NCYyNDAsZT4+NCYxNXwyNDAmZSwoKDE1JmUpPDw0fDE1JmUpLzI1NSk6bnVsbCk6KGU9azIuZXhlYyh0KSk/bmV3IGoyKGVbMV0sZVsyXSxlWzNdLDEpOihlPUwyLmV4ZWModCkpP25ldyBqMigyNTUqZVsxXS8xMDAsMjU1KmVbMl0vMTAwLDI1NSplWzNdLzEwMCwxKTooZT1QMi5leGVjKHQpKT9GMihlWzFdLGVbMl0sZVszXSxlWzRdKTooZT1OMi5leGVjKHQpKT9GMigyNTUqZVsxXS8xMDAsMjU1KmVbMl0vMTAwLDI1NSplWzNdLzEwMCxlWzRdKTooZT1JMi5leGVjKHQpKT9ZMihlWzFdLGVbMl0vMTAwLGVbM10vMTAwLDEpOihlPVIyLmV4ZWModCkpP1kyKGVbMV0sZVsyXS8xMDAsZVszXS8xMDAsZVs0XSk6TzIuaGFzT3duUHJvcGVydHkodCk/SDIoTzJbdF0pOiJ0cmFuc3BhcmVudCI9PT10P25ldyBqMihOYU4sTmFOLE5hTiwwKTpudWxsfWZ1bmN0aW9uIEgyKHQpe3JldHVybiBuZXcgajIodD4+MTYmMjU1LHQ+PjgmMjU1LDI1NSZ0LDEpfWZ1bmN0aW9uIEYyKHQsZSxuLGkpe3JldHVybiBpPD0wJiYodD1lPW49TmFOKSxuZXcgajIodCxlLG4saSl9ZnVuY3Rpb24gVjIodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiB3Mnx8KHQ9QjIodCkpLHQ/bmV3IGoyKCh0PXQucmdiKCkpLnIsdC5nLHQuYix0Lm9wYWNpdHkpOm5ldyBqMn1mdW5jdGlvbiBVMih0LGUsbixpKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/VjIodCk6bmV3IGoyKHQsZSxuLG51bGw9PWk/MTppKX1mdW5jdGlvbiBqMih0LGUsbixpKXt0aGlzLnI9K3QsdGhpcy5nPStlLHRoaXMuYj0rbix0aGlzLm9wYWNpdHk9K2l9ZnVuY3Rpb24gRzIoKXtyZXR1cm4iIyIrcTIodGhpcy5yKStxMih0aGlzLmcpK3EyKHRoaXMuYil9ZnVuY3Rpb24gVzIoKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX1mdW5jdGlvbiBxMih0KXtyZXR1cm4oKHQ9TWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0KXx8MCkpKTwxNj8iMCI6IiIpK3QudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIFkyKHQsZSxuLGkpe3JldHVybiBpPD0wP3Q9ZT1uPU5hTjpuPD0wfHxuPj0xP3Q9ZT1OYU46ZTw9MCYmKHQ9TmFOKSxuZXcgJDIodCxlLG4saSl9ZnVuY3Rpb24gWDIodCl7aWYodCBpbnN0YW5jZW9mICQyKXJldHVybiBuZXcgJDIodC5oLHQucyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2YgdzJ8fCh0PUIyKHQpKSwhdClyZXR1cm4gbmV3ICQyO2lmKHQgaW5zdGFuY2VvZiAkMilyZXR1cm4gdDt2YXIgZT0odD10LnJnYigpKS5yLzI1NSxuPXQuZy8yNTUsaT10LmIvMjU1LHI9TWF0aC5taW4oZSxuLGkpLG89TWF0aC5tYXgoZSxuLGkpLGE9TmFOLHM9by1yLGw9KG8rcikvMjtyZXR1cm4gcz8oYT1lPT09bz8obi1pKS9zKzYqKG48aSk6bj09PW8/KGktZSkvcysyOihlLW4pL3MrNCxzLz1sPC41P28rcjoyLW8tcixhKj02MCk6cz1sPjAmJmw8MT8wOmEsbmV3ICQyKGEscyxsLHQub3BhY2l0eSl9ZnVuY3Rpb24gJDIodCxlLG4saSl7dGhpcy5oPSt0LHRoaXMucz0rZSx0aGlzLmw9K24sdGhpcy5vcGFjaXR5PStpfWZ1bmN0aW9uIEsyKHQsZSxuKXtyZXR1cm4gMjU1Kih0PDYwP2UrKG4tZSkqdC82MDp0PDE4MD9uOnQ8MjQwP2UrKG4tZSkqKDI0MC10KS82MDplKX1iMih3MixCMix7Y29weTpmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgdGhpcy5jb25zdHJ1Y3Rvcix0aGlzLHQpfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCl9LGhleDp6Mixmb3JtYXRIZXg6ejIsZm9ybWF0SHNsOmZ1bmN0aW9uIFoyKCl7cmV0dXJuIFgyKHRoaXMpLmZvcm1hdEhzbCgpfSxmb3JtYXRSZ2I6RDIsdG9TdHJpbmc6RDJ9KSxiMihqMixVMix4Mih3Mix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9NMjpNYXRoLnBvdyhNMix0KSxuZXcgajIodGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/UzI6TWF0aC5wb3coUzIsdCksbmV3IGoyKHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3JldHVybiB0aGlzfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybi0uNTw9dGhpcy5yJiZ0aGlzLnI8MjU1LjUmJi0uNTw9dGhpcy5nJiZ0aGlzLmc8MjU1LjUmJi0uNTw9dGhpcy5iJiZ0aGlzLmI8MjU1LjUmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxoZXg6RzIsZm9ybWF0SGV4OkcyLGZvcm1hdFJnYjpXMix0b1N0cmluZzpXMn0pKSxiMigkMiwoZnVuY3Rpb24gSjIodCxlLG4saSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP1gyKHQpOm5ldyAkMih0LGUsbixudWxsPT1pPzE6aSl9KSx4Mih3Mix7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9NMjpNYXRoLnBvdyhNMix0KSxuZXcgJDIodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9TMjpNYXRoLnBvdyhTMix0KSxuZXcgJDIodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmglMzYwKzM2MCoodGhpcy5oPDApLGU9aXNOYU4odCl8fGlzTmFOKHRoaXMucyk/MDp0aGlzLnMsbj10aGlzLmwsaT1uKyhuPC41P246MS1uKSplLHI9MipuLWk7cmV0dXJuIG5ldyBqMihLMih0Pj0yNDA/dC0yNDA6dCsxMjAscixpKSxLMih0LHIsaSksSzIodDwxMjA/dCsyNDA6dC0xMjAscixpKSx0aGlzLm9wYWNpdHkpfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybigwPD10aGlzLnMmJnRoaXMuczw9MXx8aXNOYU4odGhpcy5zKSkmJjA8PXRoaXMubCYmdGhpcy5sPD0xJiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0sZm9ybWF0SHNsOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcGFjaXR5O3JldHVybigxPT09KHQ9aXNOYU4odCk/MTpNYXRoLm1heCgwLE1hdGgubWluKDEsdCkpKT8iaHNsKCI6ImhzbGEoIikrKHRoaXMuaHx8MCkrIiwgIisxMDAqKHRoaXMuc3x8MCkrIiUsICIrMTAwKih0aGlzLmx8fDApKyIlIisoMT09PXQ/IikiOiIsICIrdCsiKSIpfX0pKTt2YXIgUTI9TWF0aC5QSS8xODAsdDU9MTgwL01hdGguUEksZTU9LS4xNDg2MSxuNT0xLjc4Mjc3LGk1PS0uMjkyMjcscjU9LS45MDY0OSxvNT0xLjk3Mjk0LGE1PW81KnI1LHM1PW81Km41LGw1PW41Kmk1LXI1KmU1O2Z1bmN0aW9uIGM1KHQpe2lmKHQgaW5zdGFuY2VvZiBoNSlyZXR1cm4gbmV3IGg1KHQuaCx0LnMsdC5sLHQub3BhY2l0eSk7dCBpbnN0YW5jZW9mIGoyfHwodD1WMih0KSk7dmFyIGU9dC5nLzI1NSxuPXQuYi8yNTUsaT0obDUqbithNSoodC5yLzI1NSktczUqZSkvKGw1K2E1LXM1KSxyPW4taSxvPShvNSooZS1pKS1pNSpyKS9yNSxhPU1hdGguc3FydChvKm8rcipyKS8obzUqaSooMS1pKSkscz1hP01hdGguYXRhbjIobyxyKSp0NS0xMjA6TmFOO3JldHVybiBuZXcgaDUoczwwP3MrMzYwOnMsYSxpLHQub3BhY2l0eSl9ZnVuY3Rpb24gdTUodCxlLG4saSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP2M1KHQpOm5ldyBoNSh0LGUsbixudWxsPT1pPzE6aSl9ZnVuY3Rpb24gaDUodCxlLG4saSl7dGhpcy5oPSt0LHRoaXMucz0rZSx0aGlzLmw9K24sdGhpcy5vcGFjaXR5PStpfWZ1bmN0aW9uIGQ1KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBwNSh0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdCtuKmV9fWZ1bmN0aW9uIGY1KHQpe3JldHVybiAxPT0odD0rdCk/bTU6ZnVuY3Rpb24oZSxuKXtyZXR1cm4gbi1lPyhmdW5jdGlvbiBpKHQsZSxuKXtyZXR1cm4gdD1NYXRoLnBvdyh0LG4pLGU9TWF0aC5wb3coZSxuKS10LG49MS9uLGZ1bmN0aW9uKGkpe3JldHVybiBNYXRoLnBvdyh0K2kqZSxuKX19KShlLG4sdCk6ZDUoaXNOYU4oZSk/bjplKX19ZnVuY3Rpb24gbTUodCxlKXt2YXIgbj1lLXQ7cmV0dXJuIG4/cDUodCxuKTpkNShpc05hTih0KT9lOnQpfWIyKGg1LHU1LHgyKHcyLHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10P00yOk1hdGgucG93KE0yLHQpLG5ldyBoNSh0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10P1MyOk1hdGgucG93KFMyLHQpLG5ldyBoNSh0aGlzLmgsdGhpcy5zLHRoaXMubCp0LHRoaXMub3BhY2l0eSl9LHJnYjpmdW5jdGlvbigpe3ZhciB0PWlzTmFOKHRoaXMuaCk/MDoodGhpcy5oKzEyMCkqUTIsZT0rdGhpcy5sLG49aXNOYU4odGhpcy5zKT8wOnRoaXMucyplKigxLWUpLGk9TWF0aC5jb3ModCkscj1NYXRoLnNpbih0KTtyZXR1cm4gbmV3IGoyKDI1NSooZStuKihlNSppK241KnIpKSwyNTUqKGUrbiooaTUqaStyNSpyKSksMjU1KihlK24qKG81KmkpKSx0aGlzLm9wYWNpdHkpfX0pKTt2YXIgZzU9KGZ1bmN0aW9uIHQoZSl7dmFyIG49ZjUoZSk7ZnVuY3Rpb24gaSh0LGUpe3ZhciBpPW4oKHQ9VTIodCkpLnIsKGU9VTIoZSkpLnIpLHI9bih0LmcsZS5nKSxvPW4odC5iLGUuYiksYT1tNSh0Lm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQucj1pKGUpLHQuZz1yKGUpLHQuYj1vKGUpLHQub3BhY2l0eT1hKGUpLHQrIiJ9fXJldHVybiBpLmdhbW1hPXQsaX0pKDEpO2Z1bmN0aW9uIF81KHQsZSl7ZXx8KGU9W10pO3ZhciBuLGk9dD9NYXRoLm1pbihlLmxlbmd0aCx0Lmxlbmd0aCk6MCxyPWUuc2xpY2UoKTtyZXR1cm4gZnVuY3Rpb24obyl7Zm9yKG49MDtuPGk7KytuKXJbbl09dFtuXSooMS1vKStlW25dKm87cmV0dXJuIHJ9fWZ1bmN0aW9uIHk1KHQsZSl7dmFyIG4saT1lP2UubGVuZ3RoOjAscj10P01hdGgubWluKGksdC5sZW5ndGgpOjAsbz1uZXcgQXJyYXkociksYT1uZXcgQXJyYXkoaSk7Zm9yKG49MDtuPHI7KytuKW9bbl09RTUodFtuXSxlW25dKTtmb3IoO248aTsrK24pYVtuXT1lW25dO3JldHVybiBmdW5jdGlvbih0KXtmb3Iobj0wO248cjsrK24pYVtuXT1vW25dKHQpO3JldHVybiBhfX1mdW5jdGlvbiB2NSh0LGUpe3ZhciBuPW5ldyBEYXRlO3JldHVybiB0PSt0LGU9K2UsZnVuY3Rpb24oaSl7cmV0dXJuIG4uc2V0VGltZSh0KigxLWkpK2UqaSksbn19ZnVuY3Rpb24gYjUodCxlKXtyZXR1cm4gdD0rdCxlPStlLGZ1bmN0aW9uKG4pe3JldHVybiB0KigxLW4pK2Uqbn19ZnVuY3Rpb24geDUodCxlKXt2YXIgbixpPXt9LHI9e307Zm9yKG4gaW4gbnVsbCE9PXQmJiJvYmplY3QiPT10eXBlb2YgdHx8KHQ9e30pLG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV8fChlPXt9KSxlKW4gaW4gdD9pW25dPUU1KHRbbl0sZVtuXSk6cltuXT1lW25dO3JldHVybiBmdW5jdGlvbih0KXtmb3IobiBpbiBpKXJbbl09aVtuXSh0KTtyZXR1cm4gcn19dmFyIHc1PS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyxTNT1uZXcgUmVnRXhwKHc1LnNvdXJjZSwiZyIpO2Z1bmN0aW9uIE01KHQsZSl7dmFyIG4saSxyLG89dzUubGFzdEluZGV4PVM1Lmxhc3RJbmRleD0wLGE9LTEscz1bXSxsPVtdO2Zvcih0Kz0iIixlKz0iIjsobj13NS5leGVjKHQpKSYmKGk9UzUuZXhlYyhlKSk7KShyPWkuaW5kZXgpPm8mJihyPWUuc2xpY2UobyxyKSxzW2FdP3NbYV0rPXI6c1srK2FdPXIpLChuPW5bMF0pPT09KGk9aVswXSk/c1thXT9zW2FdKz1pOnNbKythXT1pOihzWysrYV09bnVsbCxsLnB1c2goe2k6YSx4OmI1KG4saSl9KSksbz1TNS5sYXN0SW5kZXg7cmV0dXJuIG88ZS5sZW5ndGgmJihyPWUuc2xpY2Uobyksc1thXT9zW2FdKz1yOnNbKythXT1yKSxzLmxlbmd0aDwyP2xbMF0/KGZ1bmN0aW9uIGModCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpKyIifX0pKGxbMF0ueCk6KGZ1bmN0aW9uIHUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSkoZSk6KGU9bC5sZW5ndGgsZnVuY3Rpb24odCl7Zm9yKHZhciBuLGk9MDtpPGU7KytpKXNbKG49bFtpXSkuaV09bi54KHQpO3JldHVybiBzLmpvaW4oIiIpfSl9ZnVuY3Rpb24gRTUodCxlKXt2YXIgbixpPXR5cGVvZiBlO3JldHVybiBudWxsPT1lfHwiYm9vbGVhbiI9PT1pP2Q1KGUpOigibnVtYmVyIj09PWk/YjU6InN0cmluZyI9PT1pPyhuPUIyKGUpKT8oZT1uLGc1KTpNNTplIGluc3RhbmNlb2YgQjI/ZzU6ZSBpbnN0YW5jZW9mIERhdGU/djU6KGZ1bmN0aW9uIHIodCl7cmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyh0KSYmISh0IGluc3RhbmNlb2YgRGF0YVZpZXcpfSkoZSk/XzU6QXJyYXkuaXNBcnJheShlKT95NToiZnVuY3Rpb24iIT10eXBlb2YgZS52YWx1ZU9mJiYiZnVuY3Rpb24iIT10eXBlb2YgZS50b1N0cmluZ3x8aXNOYU4oZSk/eDU6YjUpKHQsZSl9ZnVuY3Rpb24gVDUodCxlKXtyZXR1cm4gdD0rdCxlPStlLGZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnJvdW5kKHQqKDEtbikrZSpuKX19ZnVuY3Rpb24gQzUodCl7cmV0dXJuKGZ1bmN0aW9uIGUobil7ZnVuY3Rpb24gaShlLGkpe3ZhciByPXQoKGU9dTUoZSkpLmgsKGk9dTUoaSkpLmgpLG89bTUoZS5zLGkucyksYT1tNShlLmwsaS5sKSxzPW01KGUub3BhY2l0eSxpLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gZS5oPXIodCksZS5zPW8odCksZS5sPWEoTWF0aC5wb3codCxuKSksZS5vcGFjaXR5PXModCksZSsiIn19cmV0dXJuIG49K24saS5nYW1tYT1lLGl9KSgxKX1DNSgoZnVuY3Rpb24gQTUodCxlKXt2YXIgbj1lLXQ7cmV0dXJuIG4/cDUodCxuPjE4MHx8bjwtMTgwP24tMzYwKk1hdGgucm91bmQobi8zNjApOm4pOmQ1KGlzTmFOKHQpP2U6dCl9KSk7dmFyIGs1PUM1KG01KTtmdW5jdGlvbiBMNSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gUDUodCl7cmV0dXJuK3R9dmFyIE41PVswLDFdO2Z1bmN0aW9uIEk1KHQsZSl7cmV0dXJuKGUtPXQ9K3QpP2Z1bmN0aW9uKG4pe3JldHVybihuLXQpL2V9Okw1KGUpfWZ1bmN0aW9uIFI1KHQsZSxuLGkpe3ZhciByPXRbMF0sbz10WzFdLGE9ZVswXSxzPWVbMV07cmV0dXJuIG88cj8ocj1uKG8sciksYT1pKHMsYSkpOihyPW4ocixvKSxhPWkoYSxzKSksZnVuY3Rpb24odCl7cmV0dXJuIGEocih0KSl9fWZ1bmN0aW9uIE81KHQsZSxuLGkpe3ZhciByPU1hdGgubWluKHQubGVuZ3RoLGUubGVuZ3RoKS0xLG89bmV3IEFycmF5KHIpLGE9bmV3IEFycmF5KHIpLHM9LTE7Zm9yKHRbcl08dFswXSYmKHQ9dC5zbGljZSgpLnJldmVyc2UoKSxlPWUuc2xpY2UoKS5yZXZlcnNlKCkpOysrczxyOylvW3NdPW4odFtzXSx0W3MrMV0pLGFbc109aShlW3NdLGVbcysxXSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPVEwKHQsZSwxLHIpLTE7cmV0dXJuIGFbbl0ob1tuXShlKSl9fWZ1bmN0aW9uIHo1KHQsZSl7cmV0dXJuIGUuZG9tYWluKHQuZG9tYWluKCkpLnJhbmdlKHQucmFuZ2UoKSkuaW50ZXJwb2xhdGUodC5pbnRlcnBvbGF0ZSgpKS5jbGFtcCh0LmNsYW1wKCkpfWZ1bmN0aW9uIEQ1KHQsZSl7dmFyIG4saSxyLG89TjUsYT1ONSxzPUU1LGw9ITE7ZnVuY3Rpb24gYygpe3JldHVybiBuPU1hdGgubWluKG8ubGVuZ3RoLGEubGVuZ3RoKT4yP081OlI1LGk9cj1udWxsLHV9ZnVuY3Rpb24gdShlKXtyZXR1cm4oaXx8KGk9bihvLGEsbD8oZnVuY3Rpb24gcih0KXtyZXR1cm4gZnVuY3Rpb24oZSxuKXt2YXIgaT10KGU9K2Usbj0rbik7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiB0PD1lPzA6dD49bj8xOmkodCl9fX0pKHQpOnQscykpKSgrZSl9cmV0dXJuIHUuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybihyfHwocj1uKGEsbyxJNSxsPyhmdW5jdGlvbiBpKHQpe3JldHVybiBmdW5jdGlvbihlLG4pe3ZhciBpPXQoZT0rZSxuPStuKTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIHQ8PTA/ZTp0Pj0xP246aSh0KX19fSkoZSk6ZSkpKSgrdCl9LHUuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPWYyLmNhbGwodCxQNSksYygpKTpvLnNsaWNlKCl9LHUucmFuZ2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9bTIuY2FsbCh0KSxjKCkpOmEuc2xpY2UoKX0sdS5yYW5nZVJvdW5kPWZ1bmN0aW9uKHQpe3JldHVybiBhPW0yLmNhbGwodCkscz1UNSxjKCl9LHUuY2xhbXA9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGw9ISF0LGMoKSk6bH0sdS5pbnRlcnBvbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz10LGMoKSk6c30sYygpfWZ1bmN0aW9uIEI1KHQsZSl7aWYoKG49KHQ9ZT90LnRvRXhwb25lbnRpYWwoZS0xKTp0LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZigiZSIpKTwwKXJldHVybiBudWxsO3ZhciBuLGk9dC5zbGljZSgwLG4pO3JldHVybltpLmxlbmd0aD4xP2lbMF0raS5zbGljZSgyKTppLCt0LnNsaWNlKG4rMSldfWZ1bmN0aW9uIEg1KHQpe3JldHVybih0PUI1KE1hdGguYWJzKHQpKSk/dFsxXTpOYU59dmFyIEY1LFY1PS9eKD86KC4pPyhbPD49Xl0pKT8oWytcLSggXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuXGQrKT8ofik/KFthLXolXSk/JC9pO2Z1bmN0aW9uIFU1KHQpe2lmKCEoZT1WNS5leGVjKHQpKSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZm9ybWF0OiAiK3QpO3ZhciBlO3JldHVybiBuZXcgajUoe2ZpbGw6ZVsxXSxhbGlnbjplWzJdLHNpZ246ZVszXSxzeW1ib2w6ZVs0XSx6ZXJvOmVbNV0sd2lkdGg6ZVs2XSxjb21tYTplWzddLHByZWNpc2lvbjplWzhdJiZlWzhdLnNsaWNlKDEpLHRyaW06ZVs5XSx0eXBlOmVbMTBdfSl9ZnVuY3Rpb24gajUodCl7dGhpcy5maWxsPXZvaWQgMD09PXQuZmlsbD8iICI6dC5maWxsKyIiLHRoaXMuYWxpZ249dm9pZCAwPT09dC5hbGlnbj8iPiI6dC5hbGlnbisiIix0aGlzLnNpZ249dm9pZCAwPT09dC5zaWduPyItIjp0LnNpZ24rIiIsdGhpcy5zeW1ib2w9dm9pZCAwPT09dC5zeW1ib2w/IiI6dC5zeW1ib2wrIiIsdGhpcy56ZXJvPSEhdC56ZXJvLHRoaXMud2lkdGg9dm9pZCAwPT09dC53aWR0aD92b2lkIDA6K3Qud2lkdGgsdGhpcy5jb21tYT0hIXQuY29tbWEsdGhpcy5wcmVjaXNpb249dm9pZCAwPT09dC5wcmVjaXNpb24/dm9pZCAwOit0LnByZWNpc2lvbix0aGlzLnRyaW09ISF0LnRyaW0sdGhpcy50eXBlPXZvaWQgMD09PXQudHlwZT8iIjp0LnR5cGUrIiJ9ZnVuY3Rpb24gRzUodCxlKXt2YXIgbj1CNSh0LGUpO2lmKCFuKXJldHVybiB0KyIiO3ZhciBpPW5bMF0scj1uWzFdO3JldHVybiByPDA/IjAuIituZXcgQXJyYXkoLXIpLmpvaW4oIjAiKStpOmkubGVuZ3RoPnIrMT9pLnNsaWNlKDAscisxKSsiLiIraS5zbGljZShyKzEpOmkrbmV3IEFycmF5KHItaS5sZW5ndGgrMikuam9pbigiMCIpfVU1LnByb3RvdHlwZT1qNS5wcm90b3R5cGUsajUucHJvdG90eXBlLnRvU3RyaW5nPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZmlsbCt0aGlzLmFsaWduK3RoaXMuc2lnbit0aGlzLnN5bWJvbCsodGhpcy56ZXJvPyIwIjoiIikrKHZvaWQgMD09PXRoaXMud2lkdGg/IiI6TWF0aC5tYXgoMSwwfHRoaXMud2lkdGgpKSsodGhpcy5jb21tYT8iLCI6IiIpKyh2b2lkIDA9PT10aGlzLnByZWNpc2lvbj8iIjoiLiIrTWF0aC5tYXgoMCwwfHRoaXMucHJlY2lzaW9uKSkrKHRoaXMudHJpbT8ifiI6IiIpK3RoaXMudHlwZX07dmFyIFc1PXsiJSI6ZnVuY3Rpb24odCxlKXtyZXR1cm4oMTAwKnQpLnRvRml4ZWQoZSl9LGI6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMil9LGM6ZnVuY3Rpb24odCl7cmV0dXJuIHQrIiJ9LGQ6ZnVuY3Rpb24gcTUodCl7cmV0dXJuIE1hdGguYWJzKHQ9TWF0aC5yb3VuZCh0KSk+PTFlMjE/dC50b0xvY2FsZVN0cmluZygiZW4iKS5yZXBsYWNlKC8sL2csIiIpOnQudG9TdHJpbmcoMTApfSxlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQudG9FeHBvbmVudGlhbChlKX0sZjpmdW5jdGlvbih0LGUpe3JldHVybiB0LnRvRml4ZWQoZSl9LGc6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC50b1ByZWNpc2lvbihlKX0sbzpmdW5jdGlvbih0KXtyZXR1cm4gTWF0aC5yb3VuZCh0KS50b1N0cmluZyg4KX0scDpmdW5jdGlvbih0LGUpe3JldHVybiBHNSgxMDAqdCxlKX0scjpHNSxzOmZ1bmN0aW9uIFk1KHQsZSl7dmFyIG49QjUodCxlKTtpZighbilyZXR1cm4gdCsiIjt2YXIgaT1uWzBdLHI9blsxXSxvPXItKEY1PTMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKHIvMykpKSkrMSxhPWkubGVuZ3RoO3JldHVybiBvPT09YT9pOm8+YT9pK25ldyBBcnJheShvLWErMSkuam9pbigiMCIpOm8+MD9pLnNsaWNlKDAsbykrIi4iK2kuc2xpY2Uobyk6IjAuIituZXcgQXJyYXkoMS1vKS5qb2luKCIwIikrQjUodCxNYXRoLm1heCgwLGUrby0xKSlbMF19LFg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCl9LHg6ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGgucm91bmQodCkudG9TdHJpbmcoMTYpfX07ZnVuY3Rpb24gWDUodCl7cmV0dXJuIHR9dmFyICQ1LEs1LFo1LEo1PUFycmF5LnByb3RvdHlwZS5tYXAsUTU9WyJ5IiwieiIsImEiLCJmIiwicCIsIm4iLCLCtSIsIm0iLCIiLCJrIiwiTSIsIkciLCJUIiwiUCIsIkUiLCJaIiwiWSJdO2Z1bmN0aW9uIHQzKHQpe3ZhciBlPXZvaWQgMD09PXQuZ3JvdXBpbmd8fHZvaWQgMD09PXQudGhvdXNhbmRzP1g1OihmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4saSl7Zm9yKHZhciByPW4ubGVuZ3RoLG89W10sYT0wLHM9dFswXSxsPTA7cj4wJiZzPjAmJihsK3MrMT5pJiYocz1NYXRoLm1heCgxLGktbCkpLG8ucHVzaChuLnN1YnN0cmluZyhyLT1zLHIrcykpLCEoKGwrPXMrMSk+aSkpOylzPXRbYT0oYSsxKSV0Lmxlbmd0aF07cmV0dXJuIG8ucmV2ZXJzZSgpLmpvaW4oZSl9fSkoSjUuY2FsbCh0Lmdyb3VwaW5nLE51bWJlciksdC50aG91c2FuZHMrIiIpLGk9dm9pZCAwPT09dC5jdXJyZW5jeT8iIjp0LmN1cnJlbmN5WzBdKyIiLHI9dm9pZCAwPT09dC5jdXJyZW5jeT8iIjp0LmN1cnJlbmN5WzFdKyIiLG89dm9pZCAwPT09dC5kZWNpbWFsPyIuIjp0LmRlY2ltYWwrIiIsYT12b2lkIDA9PT10Lm51bWVyYWxzP1g1OihmdW5jdGlvbiBzKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKC9bMC05XS9nLChmdW5jdGlvbihlKXtyZXR1cm4gdFsrZV19KSl9fSkoSjUuY2FsbCh0Lm51bWVyYWxzLFN0cmluZykpLGw9dm9pZCAwPT09dC5wZXJjZW50PyIlIjp0LnBlcmNlbnQrIiIsYz12b2lkIDA9PT10Lm1pbnVzPyItIjp0Lm1pbnVzKyIiLHU9dm9pZCAwPT09dC5uYW4/Ik5hTiI6dC5uYW4rIiI7ZnVuY3Rpb24gaCh0KXt2YXIgbj0odD1VNSh0KSkuZmlsbCxzPXQuYWxpZ24saD10LnNpZ24sZD10LnN5bWJvbCxwPXQuemVybyxmPXQud2lkdGgsbT10LmNvbW1hLGc9dC5wcmVjaXNpb24sXz10LnRyaW0seT10LnR5cGU7Im4iPT09eT8obT0hMCx5PSJnIik6VzVbeV18fCh2b2lkIDA9PT1nJiYoZz0xMiksXz0hMCx5PSJnIiksKHB8fCIwIj09PW4mJiI9Ij09PXMpJiYocD0hMCxuPSIwIixzPSI9Iik7dmFyIHY9IiQiPT09ZD9pOiIjIj09PWQmJi9bYm94WF0vLnRlc3QoeSk/IjAiK3kudG9Mb3dlckNhc2UoKToiIixiPSIkIj09PWQ/cjovWyVwXS8udGVzdCh5KT9sOiIiLHg9VzVbeV0sdz0vW2RlZmdwcnMlXS8udGVzdCh5KTtmdW5jdGlvbiBTKHQpe3ZhciBpLHIsbCxkPXYsUz1iO2lmKCJjIj09PXkpUz14KHQpK1MsdD0iIjtlbHNle3ZhciBNPSh0PSt0KTwwfHwxL3Q8MDtpZih0PWlzTmFOKHQpP3U6eChNYXRoLmFicyh0KSxnKSxfJiYodD0oZnVuY3Rpb24gRSh0KXt0OmZvcih2YXIgZSxuPXQubGVuZ3RoLGk9MSxyPS0xO2k8bjsrK2kpc3dpdGNoKHRbaV0pe2Nhc2UiLiI6cj1lPWk7YnJlYWs7Y2FzZSIwIjowPT09ciYmKHI9aSksZT1pO2JyZWFrO2RlZmF1bHQ6aWYoISt0W2ldKWJyZWFrIHQ7cj4wJiYocj0wKX1yZXR1cm4gcj4wP3Quc2xpY2UoMCxyKSt0LnNsaWNlKGUrMSk6dH0pKHQpKSxNJiYwPT0rdCYmIisiIT09aCYmKE09ITEpLGQ9KE0/IigiPT09aD9oOmM6Ii0iPT09aHx8IigiPT09aD8iIjpoKStkLFM9KCJzIj09PXk/UTVbOCtGNS8zXToiIikrUysoTSYmIigiPT09aD8iKSI6IiIpLHcpZm9yKGk9LTEscj10Lmxlbmd0aDsrK2k8cjspaWYoNDg+KGw9dC5jaGFyQ29kZUF0KGkpKXx8bD41Nyl7Uz0oNDY9PT1sP28rdC5zbGljZShpKzEpOnQuc2xpY2UoaSkpK1MsdD10LnNsaWNlKDAsaSk7YnJlYWt9fW0mJiFwJiYodD1lKHQsMS8wKSk7dmFyIFQ9ZC5sZW5ndGgrdC5sZW5ndGgrUy5sZW5ndGgsQz1UPGY/bmV3IEFycmF5KGYtVCsxKS5qb2luKG4pOiIiO3N3aXRjaChtJiZwJiYodD1lKEMrdCxDLmxlbmd0aD9mLVMubGVuZ3RoOjEvMCksQz0iIikscyl7Y2FzZSI8Ijp0PWQrdCtTK0M7YnJlYWs7Y2FzZSI9Ijp0PWQrQyt0K1M7YnJlYWs7Y2FzZSJeIjp0PUMuc2xpY2UoMCxUPUMubGVuZ3RoPj4xKStkK3QrUytDLnNsaWNlKFQpO2JyZWFrO2RlZmF1bHQ6dD1DK2QrdCtTfXJldHVybiBhKHQpfXJldHVybiBnPXZvaWQgMD09PWc/NjovW2dwcnNdLy50ZXN0KHkpP01hdGgubWF4KDEsTWF0aC5taW4oMjEsZykpOk1hdGgubWF4KDAsTWF0aC5taW4oMjAsZykpLFMudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdCsiIn0sU31yZXR1cm57Zm9ybWF0OmgsZm9ybWF0UHJlZml4OmZ1bmN0aW9uIGQodCxlKXt2YXIgbj1oKCgodD1VNSh0KSkudHlwZT0iZiIsdCkpLGk9MypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoSDUoZSkvMykpKSxyPU1hdGgucG93KDEwLC1pKSxvPVE1WzgraS8zXTtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuIG4ocip0KStvfX19fWZ1bmN0aW9uIGUzKHQsZSxuKXt2YXIgaSxyPXRbMF0sbz10W3QubGVuZ3RoLTFdLGE9YTIocixvLG51bGw9PWU/MTA6ZSk7c3dpdGNoKChuPVU1KG51bGw9PW4/IixmIjpuKSkudHlwZSl7Y2FzZSJzIjp2YXIgcz1NYXRoLm1heChNYXRoLmFicyhyKSxNYXRoLmFicyhvKSk7cmV0dXJuIG51bGwhPW4ucHJlY2lzaW9ufHxpc05hTihpPShmdW5jdGlvbiBsKHQsZSl7cmV0dXJuIE1hdGgubWF4KDAsMypNYXRoLm1heCgtOCxNYXRoLm1pbig4LE1hdGguZmxvb3IoSDUoZSkvMykpKS1INShNYXRoLmFicyh0KSkpfSkoYSxzKSl8fChuLnByZWNpc2lvbj1pKSxaNShuLHMpO2Nhc2UiIjpjYXNlImUiOmNhc2UiZyI6Y2FzZSJwIjpjYXNlInIiOm51bGwhPW4ucHJlY2lzaW9ufHxpc05hTihpPShmdW5jdGlvbiBjKHQsZSl7cmV0dXJuIHQ9TWF0aC5hYnModCksZT1NYXRoLmFicyhlKS10LE1hdGgubWF4KDAsSDUoZSktSDUodCkpKzF9KShhLE1hdGgubWF4KE1hdGguYWJzKHIpLE1hdGguYWJzKG8pKSkpfHwobi5wcmVjaXNpb249aS0oImUiPT09bi50eXBlKSk7YnJlYWs7Y2FzZSJmIjpjYXNlIiUiOm51bGwhPW4ucHJlY2lzaW9ufHxpc05hTihpPShmdW5jdGlvbiB1KHQpe3JldHVybiBNYXRoLm1heCgwLC1INShNYXRoLmFicyh0KSkpfSkoYSkpfHwobi5wcmVjaXNpb249aS0yKigiJSI9PT1uLnR5cGUpKX1yZXR1cm4gSzUobil9ZnVuY3Rpb24gbjModCl7dmFyIGU9dC5kb21haW47cmV0dXJuIHQudGlja3M9ZnVuY3Rpb24odCl7dmFyIG49ZSgpO3JldHVybiByMihuWzBdLG5bbi5sZW5ndGgtMV0sbnVsbD09dD8xMDp0KX0sdC50aWNrRm9ybWF0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIGUzKGUoKSx0LG4pfSx0Lm5pY2U9ZnVuY3Rpb24obil7bnVsbD09biYmKG49MTApO3ZhciBpLHI9ZSgpLG89MCxhPXIubGVuZ3RoLTEscz1yW29dLGw9clthXTtyZXR1cm4gbDxzJiYoaT1zLHM9bCxsPWksaT1vLG89YSxhPWkpLChpPW8yKHMsbCxuKSk+MD9pPW8yKHM9TWF0aC5mbG9vcihzL2kpKmksbD1NYXRoLmNlaWwobC9pKSppLG4pOmk8MCYmKGk9bzIocz1NYXRoLmNlaWwocyppKS9pLGw9TWF0aC5mbG9vcihsKmkpL2ksbikpLGk+MD8ocltvXT1NYXRoLmZsb29yKHMvaSkqaSxyW2FdPU1hdGguY2VpbChsL2kpKmksZShyKSk6aTwwJiYocltvXT1NYXRoLmNlaWwocyppKS9pLHJbYV09TWF0aC5mbG9vcihsKmkpL2ksZShyKSksdH0sdH1mdW5jdGlvbiBpMyh0LGUpe3ZhciBuLGk9MCxyPSh0PXQuc2xpY2UoKSkubGVuZ3RoLTEsbz10W2ldLGE9dFtyXTtyZXR1cm4gYTxvJiYobj1pLGk9cixyPW4sbj1vLG89YSxhPW4pLHRbaV09ZS5mbG9vcihvKSx0W3JdPWUuY2VpbChhKSx0fWZ1bmN0aW9uIHIzKHQsZSl7cmV0dXJuKGU9TWF0aC5sb2coZS90KSk/ZnVuY3Rpb24obil7cmV0dXJuIE1hdGgubG9nKG4vdCkvZX06TDUoZSl9ZnVuY3Rpb24gbzModCxlKXtyZXR1cm4gdDwwP2Z1bmN0aW9uKG4pe3JldHVybi1NYXRoLnBvdygtZSxuKSpNYXRoLnBvdygtdCwxLW4pfTpmdW5jdGlvbihuKXtyZXR1cm4gTWF0aC5wb3coZSxuKSpNYXRoLnBvdyh0LDEtbil9fWZ1bmN0aW9uIGEzKHQpe3JldHVybiBpc0Zpbml0ZSh0KT8rKCIxZSIrdCk6dDwwPzA6dH1mdW5jdGlvbiBzMyh0KXtyZXR1cm4gMTA9PT10P2EzOnQ9PT1NYXRoLkU/TWF0aC5leHA6ZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucG93KHQsZSl9fWZ1bmN0aW9uIGwzKHQpe3JldHVybiB0PT09TWF0aC5FP01hdGgubG9nOjEwPT09dCYmTWF0aC5sb2cxMHx8Mj09PXQmJk1hdGgubG9nMnx8KHQ9TWF0aC5sb2codCksZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgubG9nKGUpL3R9KX1mdW5jdGlvbiBjMyh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuLXQoLWUpfX1mdW5jdGlvbiB1Myh0LGUpe3JldHVybiB0PDA/LU1hdGgucG93KC10LGUpOk1hdGgucG93KHQsZSl9ZnVuY3Rpb24gaDMoKXt2YXIgdD0xLGU9RDUoKGZ1bmN0aW9uIG4oZSxpKXtyZXR1cm4oaT11MyhpLHQpLShlPXUzKGUsdCkpKT9mdW5jdGlvbihuKXtyZXR1cm4odTMobix0KS1lKS9pfTpMNShpKX0pLChmdW5jdGlvbiBpKGUsbil7cmV0dXJuIG49dTMobix0KS0oZT11MyhlLHQpKSxmdW5jdGlvbihpKXtyZXR1cm4gdTMoZStuKmksMS90KX19KSkscj1lLmRvbWFpbjtyZXR1cm4gZS5leHBvbmVudD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rZSxyKHIoKSkpOnR9LGUuY29weT1mdW5jdGlvbigpe3JldHVybiB6NShlLGgzKCkuZXhwb25lbnQodCkpfSxuMyhlKX0hKGZ1bmN0aW9uIGQzKHQpe3JldHVybiAkNT10Myh0KSxLNT0kNS5mb3JtYXQsWjU9JDUuZm9ybWF0UHJlZml4LCQ1fSkoe2RlY2ltYWw6Ii4iLHRob3VzYW5kczoiLCIsZ3JvdXBpbmc6WzNdLGN1cnJlbmN5OlsiJCIsIiJdLG1pbnVzOiItIn0pO3ZhciBwMz1uZXcgRGF0ZSxmMz1uZXcgRGF0ZTtmdW5jdGlvbiBtMyh0LGUsbixpKXtmdW5jdGlvbiByKGUpe3JldHVybiB0KGU9MD09PWFyZ3VtZW50cy5sZW5ndGg/bmV3IERhdGU6bmV3IERhdGUoK2UpKSxlfXJldHVybiByLmZsb29yPWZ1bmN0aW9uKGUpe3JldHVybiB0KGU9bmV3IERhdGUoK2UpKSxlfSxyLmNlaWw9ZnVuY3Rpb24obil7cmV0dXJuIHQobj1uZXcgRGF0ZShuLTEpKSxlKG4sMSksdChuKSxufSxyLnJvdW5kPWZ1bmN0aW9uKHQpe3ZhciBlPXIodCksbj1yLmNlaWwodCk7cmV0dXJuIHQtZTxuLXQ/ZTpufSxyLm9mZnNldD1mdW5jdGlvbih0LG4pe3JldHVybiBlKHQ9bmV3IERhdGUoK3QpLG51bGw9PW4/MTpNYXRoLmZsb29yKG4pKSx0fSxyLnJhbmdlPWZ1bmN0aW9uKG4saSxvKXt2YXIgYSxzPVtdO2lmKG49ci5jZWlsKG4pLG89bnVsbD09bz8xOk1hdGguZmxvb3IobyksIShuPGkmJm8+MCkpcmV0dXJuIHM7ZG97cy5wdXNoKGE9bmV3IERhdGUoK24pKSxlKG4sbyksdChuKX13aGlsZShhPG4mJm48aSk7cmV0dXJuIHN9LHIuZmlsdGVyPWZ1bmN0aW9uKG4pe3JldHVybiBtMygoZnVuY3Rpb24oZSl7aWYoZT49ZSlmb3IoO3QoZSksIW4oZSk7KWUuc2V0VGltZShlLTEpfSksKGZ1bmN0aW9uKHQsaSl7aWYodD49dClpZihpPDApZm9yKDsrK2k8PTA7KWZvcig7ZSh0LC0xKSwhbih0KTspO2Vsc2UgZm9yKDstLWk+PTA7KWZvcig7ZSh0LDEpLCFuKHQpOyk7fSkpfSxuJiYoci5jb3VudD1mdW5jdGlvbihlLGkpe3JldHVybiBwMy5zZXRUaW1lKCtlKSxmMy5zZXRUaW1lKCtpKSx0KHAzKSx0KGYzKSxNYXRoLmZsb29yKG4ocDMsZjMpKX0sci5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLGlzRmluaXRlKHQpJiZ0PjA/dD4xP3IuZmlsdGVyKGk/ZnVuY3Rpb24oZSl7cmV0dXJuIGkoZSkldD09MH06ZnVuY3Rpb24oZSl7cmV0dXJuIHIuY291bnQoMCxlKSV0PT0wfSk6cjpudWxsfSkscn12YXIgZzM9bTMoKGZ1bmN0aW9uKCl7fSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKCt0K2UpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUtdH0pKTtnMy5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLGlzRmluaXRlKHQpJiZ0PjA/dD4xP20zKChmdW5jdGlvbihlKXtlLnNldFRpbWUoTWF0aC5mbG9vcihlL3QpKnQpfSksKGZ1bmN0aW9uKGUsbil7ZS5zZXRUaW1lKCtlK24qdCl9KSwoZnVuY3Rpb24oZSxuKXtyZXR1cm4obi1lKS90fSkpOmczOm51bGx9O3ZhciBfMz1nMyx5Mz0xZTMsdjM9NmU0LGIzPTM2ZTUseDM9ODY0ZTUsdzM9NjA0OGU1LFMzPW0zKChmdW5jdGlvbih0KXt0LnNldFRpbWUodC10LmdldE1pbGxpc2Vjb25kcygpKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VGltZSgrdCtlKnkzKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL3kzfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ1NlY29uZHMoKX0pKSxNMz1tMygoZnVuY3Rpb24odCl7dC5zZXRUaW1lKHQtdC5nZXRNaWxsaXNlY29uZHMoKS10LmdldFNlY29uZHMoKSp5Myl9KSwoZnVuY3Rpb24odCxlKXt0LnNldFRpbWUoK3QrZSp2Myl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10KS92M30pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRNaW51dGVzKCl9KSksRTM9bTMoKGZ1bmN0aW9uKHQpe3Quc2V0VGltZSh0LXQuZ2V0TWlsbGlzZWNvbmRzKCktdC5nZXRTZWNvbmRzKCkqeTMtdC5nZXRNaW51dGVzKCkqdjMpfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKCt0K2UqYjMpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuKGUtdCkvYjN9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0SG91cnMoKX0pKSxUMz1tMygoZnVuY3Rpb24odCl7dC5zZXRIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0RGF0ZSh0LmdldERhdGUoKStlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQtKGUuZ2V0VGltZXpvbmVPZmZzZXQoKS10LmdldFRpbWV6b25lT2Zmc2V0KCkpKnYzKS94M30pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXREYXRlKCktMX0pKTtmdW5jdGlvbiBDMyh0KXtyZXR1cm4gbTMoKGZ1bmN0aW9uKGUpe2Uuc2V0RGF0ZShlLmdldERhdGUoKS0oZS5nZXREYXkoKSs3LXQpJTcpLGUuc2V0SG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldERhdGUodC5nZXREYXRlKCkrNyplKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQtKGUuZ2V0VGltZXpvbmVPZmZzZXQoKS10LmdldFRpbWV6b25lT2Zmc2V0KCkpKnYzKS93M30pKX12YXIgQTM9QzMoMCksazM9QzMoMSk7QzMoMiksQzMoMyk7dmFyIEwzPUMzKDQpO0MzKDUpLEMzKDYpO3ZhciBQMz1tMygoZnVuY3Rpb24odCl7dC5zZXREYXRlKDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldE1vbnRoKHQuZ2V0TW9udGgoKStlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybiBlLmdldE1vbnRoKCktdC5nZXRNb250aCgpKzEyKihlLmdldEZ1bGxZZWFyKCktdC5nZXRGdWxsWWVhcigpKX0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRNb250aCgpfSkpLE4zPW0zKChmdW5jdGlvbih0KXt0LnNldE1vbnRoKDAsMSksdC5zZXRIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0RnVsbFllYXIodC5nZXRGdWxsWWVhcigpK2UpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCl9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0RnVsbFllYXIoKX0pKTtOMy5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gaXNGaW5pdGUodD1NYXRoLmZsb29yKHQpKSYmdD4wP20zKChmdW5jdGlvbihlKXtlLnNldEZ1bGxZZWFyKE1hdGguZmxvb3IoZS5nZXRGdWxsWWVhcigpL3QpKnQpLGUuc2V0TW9udGgoMCwxKSxlLnNldEhvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKGUsbil7ZS5zZXRGdWxsWWVhcihlLmdldEZ1bGxZZWFyKCkrbip0KX0pKTpudWxsfTt2YXIgSTM9TjMsUjM9bTMoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDU2Vjb25kcygwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKCt0K2UqdjMpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuKGUtdCkvdjN9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDTWludXRlcygpfSkpLE8zPW0zKChmdW5jdGlvbih0KXt0LnNldFVUQ01pbnV0ZXMoMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKCt0K2UqYjMpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuKGUtdCkvYjN9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDSG91cnMoKX0pKSx6Mz1tMygoZnVuY3Rpb24odCl7dC5zZXRVVENIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VVRDRGF0ZSh0LmdldFVUQ0RhdGUoKStlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL3gzfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ0RhdGUoKS0xfSkpO2Z1bmN0aW9uIEQzKHQpe3JldHVybiBtMygoZnVuY3Rpb24oZSl7ZS5zZXRVVENEYXRlKGUuZ2V0VVRDRGF0ZSgpLShlLmdldFVUQ0RheSgpKzctdCklNyksZS5zZXRVVENIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VVRDRGF0ZSh0LmdldFVUQ0RhdGUoKSs3KmUpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuKGUtdCkvdzN9KSl9dmFyIEIzPUQzKDApLEgzPUQzKDEpO0QzKDIpLEQzKDMpO3ZhciBGMz1EMyg0KTtEMyg1KSxEMyg2KTt2YXIgVjM9bTMoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDRGF0ZSgxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRVVENNb250aCh0LmdldFVUQ01vbnRoKCkrZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5nZXRVVENNb250aCgpLXQuZ2V0VVRDTW9udGgoKSsxMiooZS5nZXRVVENGdWxsWWVhcigpLXQuZ2V0VVRDRnVsbFllYXIoKSl9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDTW9udGgoKX0pKSxVMz1tMygoZnVuY3Rpb24odCl7dC5zZXRVVENNb250aCgwLDEpLHQuc2V0VVRDSG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldFVUQ0Z1bGxZZWFyKHQuZ2V0VVRDRnVsbFllYXIoKStlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybiBlLmdldFVUQ0Z1bGxZZWFyKCktdC5nZXRVVENGdWxsWWVhcigpfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ0Z1bGxZZWFyKCl9KSk7VTMuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9TWF0aC5mbG9vcih0KSkmJnQ+MD9tMygoZnVuY3Rpb24oZSl7ZS5zZXRVVENGdWxsWWVhcihNYXRoLmZsb29yKGUuZ2V0VVRDRnVsbFllYXIoKS90KSp0KSxlLnNldFVUQ01vbnRoKDAsMSksZS5zZXRVVENIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbihlLG4pe2Uuc2V0VVRDRnVsbFllYXIoZS5nZXRVVENGdWxsWWVhcigpK24qdCl9KSk6bnVsbH07dmFyIGozPVUzO2Z1bmN0aW9uIEczKHQpe2lmKDA8PXQueSYmdC55PDEwMCl7dmFyIGU9bmV3IERhdGUoLTEsdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpO3JldHVybiBlLnNldEZ1bGxZZWFyKHQueSksZX1yZXR1cm4gbmV3IERhdGUodC55LHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKX1mdW5jdGlvbiBXMyh0KXtpZigwPD10LnkmJnQueTwxMDApe3ZhciBlPW5ldyBEYXRlKERhdGUuVVRDKC0xLHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKSk7cmV0dXJuIGUuc2V0VVRDRnVsbFllYXIodC55KSxlfXJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyh0LnksdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpKX1mdW5jdGlvbiBxMyh0LGUsbil7cmV0dXJue3k6dCxtOmUsZDpuLEg6MCxNOjAsUzowLEw6MH19dmFyIFkzLFgzLCQzLEszPXsiLSI6IiIsXzoiICIsMDoiMCJ9LFozPS9eXHMqXGQrLyxKMz0vXiUvLFEzPS9bXFxeJCorP3xbXF0oKS57fV0vZztmdW5jdGlvbiB0NCh0LGUsbil7dmFyIGk9dDwwPyItIjoiIixyPShpPy10OnQpKyIiLG89ci5sZW5ndGg7cmV0dXJuIGkrKG88bj9uZXcgQXJyYXkobi1vKzEpLmpvaW4oZSkrcjpyKX1mdW5jdGlvbiBlNCh0KXtyZXR1cm4gdC5yZXBsYWNlKFEzLCJcXCQmIil9ZnVuY3Rpb24gbjQodCl7cmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiK3QubWFwKGU0KS5qb2luKCJ8IikrIikiLCJpIil9ZnVuY3Rpb24gaTQodCl7Zm9yKHZhciBlPXt9LG49LTEsaT10Lmxlbmd0aDsrK248aTspZVt0W25dLnRvTG93ZXJDYXNlKCldPW47cmV0dXJuIGV9ZnVuY3Rpb24gcjQodCxlLG4pe3ZhciBpPVozLmV4ZWMoZS5zbGljZShuLG4rMSkpO3JldHVybiBpPyh0Lnc9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gbzQodCxlLG4pe3ZhciBpPVozLmV4ZWMoZS5zbGljZShuLG4rMSkpO3JldHVybiBpPyh0LnU9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gYTQodCxlLG4pe3ZhciBpPVozLmV4ZWMoZS5zbGljZShuLG4rMikpO3JldHVybiBpPyh0LlU9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gczQodCxlLG4pe3ZhciBpPVozLmV4ZWMoZS5zbGljZShuLG4rMikpO3JldHVybiBpPyh0LlY9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gbDQodCxlLG4pe3ZhciBpPVozLmV4ZWMoZS5zbGljZShuLG4rMikpO3JldHVybiBpPyh0Llc9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gYzQodCxlLG4pe3ZhciBpPVozLmV4ZWMoZS5zbGljZShuLG4rNCkpO3JldHVybiBpPyh0Lnk9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gdTQodCxlLG4pe3ZhciBpPVozLmV4ZWMoZS5zbGljZShuLG4rMikpO3JldHVybiBpPyh0Lnk9K2lbMF0rKCtpWzBdPjY4PzE5MDA6MmUzKSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBoNCh0LGUsbil7dmFyIGk9L14oWil8KFsrLV1cZFxkKSg/Ojo/KFxkXGQpKT8vLmV4ZWMoZS5zbGljZShuLG4rNikpO3JldHVybiBpPyh0Llo9aVsxXT8wOi0oaVsyXSsoaVszXXx8IjAwIikpLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGQ0KHQsZSxuKXt2YXIgaT1aMy5leGVjKGUuc2xpY2UobixuKzEpKTtyZXR1cm4gaT8odC5xPTMqaVswXS0zLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHA0KHQsZSxuKXt2YXIgaT1aMy5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5tPWlbMF0tMSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBmNCh0LGUsbil7dmFyIGk9WjMuZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIGk/KHQuZD0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBtNCh0LGUsbil7dmFyIGk9WjMuZXhlYyhlLnNsaWNlKG4sbiszKSk7cmV0dXJuIGk/KHQubT0wLHQuZD0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBnNCh0LGUsbil7dmFyIGk9WjMuZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIGk/KHQuSD0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBfNCh0LGUsbil7dmFyIGk9WjMuZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIGk/KHQuTT0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB5NCh0LGUsbil7dmFyIGk9WjMuZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIGk/KHQuUz0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB2NCh0LGUsbil7dmFyIGk9WjMuZXhlYyhlLnNsaWNlKG4sbiszKSk7cmV0dXJuIGk/KHQuTD0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBiNCh0LGUsbil7dmFyIGk9WjMuZXhlYyhlLnNsaWNlKG4sbis2KSk7cmV0dXJuIGk/KHQuTD1NYXRoLmZsb29yKGlbMF0vMWUzKSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB4NCh0LGUsbil7dmFyIGk9SjMuZXhlYyhlLnNsaWNlKG4sbisxKSk7cmV0dXJuIGk/bitpWzBdLmxlbmd0aDotMX1mdW5jdGlvbiB3NCh0LGUsbil7dmFyIGk9WjMuZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gaT8odC5RPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIFM0KHQsZSxuKXt2YXIgaT1aMy5leGVjKGUuc2xpY2UobikpO3JldHVybiBpPyh0LnM9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gTTQodCxlKXtyZXR1cm4gdDQodC5nZXREYXRlKCksZSwyKX1mdW5jdGlvbiBFNCh0LGUpe3JldHVybiB0NCh0LmdldEhvdXJzKCksZSwyKX1mdW5jdGlvbiBUNCh0LGUpe3JldHVybiB0NCh0LmdldEhvdXJzKCklMTJ8fDEyLGUsMil9ZnVuY3Rpb24gQzQodCxlKXtyZXR1cm4gdDQoMStUMy5jb3VudChJMyh0KSx0KSxlLDMpfWZ1bmN0aW9uIEE0KHQsZSl7cmV0dXJuIHQ0KHQuZ2V0TWlsbGlzZWNvbmRzKCksZSwzKX1mdW5jdGlvbiBrNCh0LGUpe3JldHVybiBBNCh0LGUpKyIwMDAifWZ1bmN0aW9uIEw0KHQsZSl7cmV0dXJuIHQ0KHQuZ2V0TW9udGgoKSsxLGUsMil9ZnVuY3Rpb24gUDQodCxlKXtyZXR1cm4gdDQodC5nZXRNaW51dGVzKCksZSwyKX1mdW5jdGlvbiBONCh0LGUpe3JldHVybiB0NCh0LmdldFNlY29uZHMoKSxlLDIpfWZ1bmN0aW9uIEk0KHQpe3ZhciBlPXQuZ2V0RGF5KCk7cmV0dXJuIDA9PT1lPzc6ZX1mdW5jdGlvbiBSNCh0LGUpe3JldHVybiB0NChBMy5jb3VudChJMyh0KS0xLHQpLGUsMil9ZnVuY3Rpb24gTzQodCl7dmFyIGU9dC5nZXREYXkoKTtyZXR1cm4gZT49NHx8MD09PWU/TDModCk6TDMuY2VpbCh0KX1mdW5jdGlvbiB6NCh0LGUpe3JldHVybiB0PU80KHQpLHQ0KEwzLmNvdW50KEkzKHQpLHQpKyg0PT09STModCkuZ2V0RGF5KCkpLGUsMil9ZnVuY3Rpb24gRDQodCl7cmV0dXJuIHQuZ2V0RGF5KCl9ZnVuY3Rpb24gQjQodCxlKXtyZXR1cm4gdDQoazMuY291bnQoSTModCktMSx0KSxlLDIpfWZ1bmN0aW9uIEg0KHQsZSl7cmV0dXJuIHQ0KHQuZ2V0RnVsbFllYXIoKSUxMDAsZSwyKX1mdW5jdGlvbiBGNCh0LGUpe3JldHVybiB0NCgodD1PNCh0KSkuZ2V0RnVsbFllYXIoKSUxMDAsZSwyKX1mdW5jdGlvbiBWNCh0LGUpe3JldHVybiB0NCh0LmdldEZ1bGxZZWFyKCklMWU0LGUsNCl9ZnVuY3Rpb24gVTQodCxlKXt2YXIgbj10LmdldERheSgpO3JldHVybiB0NCgodD1uPj00fHwwPT09bj9MMyh0KTpMMy5jZWlsKHQpKS5nZXRGdWxsWWVhcigpJTFlNCxlLDQpfWZ1bmN0aW9uIGo0KHQpe3ZhciBlPXQuZ2V0VGltZXpvbmVPZmZzZXQoKTtyZXR1cm4oZT4wPyItIjooZSo9LTEsIisiKSkrdDQoZS82MHwwLCIwIiwyKSt0NChlJTYwLCIwIiwyKX1mdW5jdGlvbiBHNCh0LGUpe3JldHVybiB0NCh0LmdldFVUQ0RhdGUoKSxlLDIpfWZ1bmN0aW9uIFc0KHQsZSl7cmV0dXJuIHQ0KHQuZ2V0VVRDSG91cnMoKSxlLDIpfWZ1bmN0aW9uIHE0KHQsZSl7cmV0dXJuIHQ0KHQuZ2V0VVRDSG91cnMoKSUxMnx8MTIsZSwyKX1mdW5jdGlvbiBZNCh0LGUpe3JldHVybiB0NCgxK3ozLmNvdW50KGozKHQpLHQpLGUsMyl9ZnVuY3Rpb24gWDQodCxlKXtyZXR1cm4gdDQodC5nZXRVVENNaWxsaXNlY29uZHMoKSxlLDMpfWZ1bmN0aW9uICQ0KHQsZSl7cmV0dXJuIFg0KHQsZSkrIjAwMCJ9ZnVuY3Rpb24gSzQodCxlKXtyZXR1cm4gdDQodC5nZXRVVENNb250aCgpKzEsZSwyKX1mdW5jdGlvbiBaNCh0LGUpe3JldHVybiB0NCh0LmdldFVUQ01pbnV0ZXMoKSxlLDIpfWZ1bmN0aW9uIEo0KHQsZSl7cmV0dXJuIHQ0KHQuZ2V0VVRDU2Vjb25kcygpLGUsMil9ZnVuY3Rpb24gUTQodCl7dmFyIGU9dC5nZXRVVENEYXkoKTtyZXR1cm4gMD09PWU/NzplfWZ1bmN0aW9uIHQ2KHQsZSl7cmV0dXJuIHQ0KEIzLmNvdW50KGozKHQpLTEsdCksZSwyKX1mdW5jdGlvbiBlNih0KXt2YXIgZT10LmdldFVUQ0RheSgpO3JldHVybiBlPj00fHwwPT09ZT9GMyh0KTpGMy5jZWlsKHQpfWZ1bmN0aW9uIG42KHQsZSl7cmV0dXJuIHQ9ZTYodCksdDQoRjMuY291bnQoajModCksdCkrKDQ9PT1qMyh0KS5nZXRVVENEYXkoKSksZSwyKX1mdW5jdGlvbiBpNih0KXtyZXR1cm4gdC5nZXRVVENEYXkoKX1mdW5jdGlvbiByNih0LGUpe3JldHVybiB0NChIMy5jb3VudChqMyh0KS0xLHQpLGUsMil9ZnVuY3Rpb24gbzYodCxlKXtyZXR1cm4gdDQodC5nZXRVVENGdWxsWWVhcigpJTEwMCxlLDIpfWZ1bmN0aW9uIGE2KHQsZSl7cmV0dXJuIHQ0KCh0PWU2KHQpKS5nZXRVVENGdWxsWWVhcigpJTEwMCxlLDIpfWZ1bmN0aW9uIHM2KHQsZSl7cmV0dXJuIHQ0KHQuZ2V0VVRDRnVsbFllYXIoKSUxZTQsZSw0KX1mdW5jdGlvbiBsNih0LGUpe3ZhciBuPXQuZ2V0VVRDRGF5KCk7cmV0dXJuIHQ0KCh0PW4+PTR8fDA9PT1uP0YzKHQpOkYzLmNlaWwodCkpLmdldFVUQ0Z1bGxZZWFyKCklMWU0LGUsNCl9ZnVuY3Rpb24gYzYoKXtyZXR1cm4iKzAwMDAifWZ1bmN0aW9uIHU2KCl7cmV0dXJuIiUifWZ1bmN0aW9uIGg2KHQpe3JldHVybit0fWZ1bmN0aW9uIGQ2KHQpe3JldHVybiBNYXRoLmZsb29yKCt0LzFlMyl9IShmdW5jdGlvbiBwNih0KXtyZXR1cm4gWTM9KGZ1bmN0aW9uIGUodCl7dmFyIGU9dC5kYXRlVGltZSxuPXQuZGF0ZSxpPXQudGltZSxyPXQucGVyaW9kcyxvPXQuZGF5cyxhPXQuc2hvcnREYXlzLHM9dC5tb250aHMsbD10LnNob3J0TW9udGhzLGM9bjQociksdT1pNChyKSxoPW40KG8pLGQ9aTQobykscD1uNChhKSxmPWk0KGEpLG09bjQocyksZz1pNChzKSxfPW40KGwpLHk9aTQobCksdj17YTpmdW5jdGlvbiBiKHQpe3JldHVybiBhW3QuZ2V0RGF5KCldfSxBOmZ1bmN0aW9uIHgodCl7cmV0dXJuIG9bdC5nZXREYXkoKV19LGI6ZnVuY3Rpb24gdyh0KXtyZXR1cm4gbFt0LmdldE1vbnRoKCldfSxCOmZ1bmN0aW9uIFModCl7cmV0dXJuIHNbdC5nZXRNb250aCgpXX0sYzpudWxsLGQ6TTQsZTpNNCxmOms0LGc6RjQsRzpVNCxIOkU0LEk6VDQsajpDNCxMOkE0LG06TDQsTTpQNCxwOmZ1bmN0aW9uIE0odCl7cmV0dXJuIHJbKyh0LmdldEhvdXJzKCk+PTEyKV19LHE6ZnVuY3Rpb24gRSh0KXtyZXR1cm4gMSt+fih0LmdldE1vbnRoKCkvMyl9LFE6aDYsczpkNixTOk40LHU6STQsVTpSNCxWOno0LHc6RDQsVzpCNCx4Om51bGwsWDpudWxsLHk6SDQsWTpWNCxaOmo0LCIlIjp1Nn0sVD17YTpmdW5jdGlvbiBDKHQpe3JldHVybiBhW3QuZ2V0VVRDRGF5KCldfSxBOmZ1bmN0aW9uIEEodCl7cmV0dXJuIG9bdC5nZXRVVENEYXkoKV19LGI6ZnVuY3Rpb24gayh0KXtyZXR1cm4gbFt0LmdldFVUQ01vbnRoKCldfSxCOmZ1bmN0aW9uIEwodCl7cmV0dXJuIHNbdC5nZXRVVENNb250aCgpXX0sYzpudWxsLGQ6RzQsZTpHNCxmOiQ0LGc6YTYsRzpsNixIOlc0LEk6cTQsajpZNCxMOlg0LG06SzQsTTpaNCxwOmZ1bmN0aW9uIFAodCl7cmV0dXJuIHJbKyh0LmdldFVUQ0hvdXJzKCk+PTEyKV19LHE6ZnVuY3Rpb24gTih0KXtyZXR1cm4gMSt+fih0LmdldFVUQ01vbnRoKCkvMyl9LFE6aDYsczpkNixTOko0LHU6UTQsVTp0NixWOm42LHc6aTYsVzpyNix4Om51bGwsWDpudWxsLHk6bzYsWTpzNixaOmM2LCIlIjp1Nn0sST17YTpmdW5jdGlvbiBSKHQsZSxuKXt2YXIgaT1wLmV4ZWMoZS5zbGljZShuKSk7cmV0dXJuIGk/KHQudz1mW2lbMF0udG9Mb3dlckNhc2UoKV0sbitpWzBdLmxlbmd0aCk6LTF9LEE6ZnVuY3Rpb24gTyh0LGUsbil7dmFyIGk9aC5leGVjKGUuc2xpY2UobikpO3JldHVybiBpPyh0Lnc9ZFtpWzBdLnRvTG93ZXJDYXNlKCldLG4raVswXS5sZW5ndGgpOi0xfSxiOmZ1bmN0aW9uIHoodCxlLG4pe3ZhciBpPV8uZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gaT8odC5tPXlbaVswXS50b0xvd2VyQ2FzZSgpXSxuK2lbMF0ubGVuZ3RoKTotMX0sQjpmdW5jdGlvbiBEKHQsZSxuKXt2YXIgaT1tLmV4ZWMoZS5zbGljZShuKSk7cmV0dXJuIGk/KHQubT1nW2lbMF0udG9Mb3dlckNhc2UoKV0sbitpWzBdLmxlbmd0aCk6LTF9LGM6ZnVuY3Rpb24gQih0LG4saSl7cmV0dXJuIEcodCxlLG4saSl9LGQ6ZjQsZTpmNCxmOmI0LGc6dTQsRzpjNCxIOmc0LEk6ZzQsajptNCxMOnY0LG06cDQsTTpfNCxwOmZ1bmN0aW9uIEgodCxlLG4pe3ZhciBpPWMuZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gaT8odC5wPXVbaVswXS50b0xvd2VyQ2FzZSgpXSxuK2lbMF0ubGVuZ3RoKTotMX0scTpkNCxROnc0LHM6UzQsUzp5NCx1Om80LFU6YTQsVjpzNCx3OnI0LFc6bDQseDpmdW5jdGlvbiBGKHQsZSxpKXtyZXR1cm4gRyh0LG4sZSxpKX0sWDpmdW5jdGlvbiBWKHQsZSxuKXtyZXR1cm4gRyh0LGksZSxuKX0seTp1NCxZOmM0LFo6aDQsIiUiOng0fTtmdW5jdGlvbiBVKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBpLHIsbyxhPVtdLHM9LTEsbD0wLGM9dC5sZW5ndGg7Zm9yKG4gaW5zdGFuY2VvZiBEYXRlfHwobj1uZXcgRGF0ZSgrbikpOysrczxjOykzNz09PXQuY2hhckNvZGVBdChzKSYmKGEucHVzaCh0LnNsaWNlKGwscykpLG51bGwhPShyPUszW2k9dC5jaGFyQXQoKytzKV0pP2k9dC5jaGFyQXQoKytzKTpyPSJlIj09PWk/IiAiOiIwIiwobz1lW2ldKSYmKGk9byhuLHIpKSxhLnB1c2goaSksbD1zKzEpO3JldHVybiBhLnB1c2godC5zbGljZShsLHMpKSxhLmpvaW4oIiIpfX1mdW5jdGlvbiBqKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3ZhciBpLHIsbz1xMygxOTAwLHZvaWQgMCwxKTtpZihHKG8sdCxuKz0iIiwwKSE9bi5sZW5ndGgpcmV0dXJuIG51bGw7aWYoIlEiaW4gbylyZXR1cm4gbmV3IERhdGUoby5RKTtpZigicyJpbiBvKXJldHVybiBuZXcgRGF0ZSgxZTMqby5zKygiTCJpbiBvP28uTDowKSk7aWYoZSYmISgiWiJpbiBvKSYmKG8uWj0wKSwicCJpbiBvJiYoby5IPW8uSCUxMisxMipvLnApLHZvaWQgMD09PW8ubSYmKG8ubT0icSJpbiBvP28ucTowKSwiViJpbiBvKXtpZihvLlY8MXx8by5WPjUzKXJldHVybiBudWxsOyJ3ImluIG98fChvLnc9MSksIloiaW4gbz8ocj0oaT1XMyhxMyhvLnksMCwxKSkpLmdldFVUQ0RheSgpLGk9cj40fHwwPT09cj9IMy5jZWlsKGkpOkgzKGkpLGk9ejMub2Zmc2V0KGksNyooby5WLTEpKSxvLnk9aS5nZXRVVENGdWxsWWVhcigpLG8ubT1pLmdldFVUQ01vbnRoKCksby5kPWkuZ2V0VVRDRGF0ZSgpKyhvLncrNiklNyk6KHI9KGk9RzMocTMoby55LDAsMSkpKS5nZXREYXkoKSxpPXI+NHx8MD09PXI/azMuY2VpbChpKTprMyhpKSxpPVQzLm9mZnNldChpLDcqKG8uVi0xKSksby55PWkuZ2V0RnVsbFllYXIoKSxvLm09aS5nZXRNb250aCgpLG8uZD1pLmdldERhdGUoKSsoby53KzYpJTcpfWVsc2UoIlciaW4gb3x8IlUiaW4gbykmJigidyJpbiBvfHwoby53PSJ1ImluIG8/by51JTc6IlciaW4gbz8xOjApLHI9IloiaW4gbz9XMyhxMyhvLnksMCwxKSkuZ2V0VVRDRGF5KCk6RzMocTMoby55LDAsMSkpLmdldERheSgpLG8ubT0wLG8uZD0iVyJpbiBvPyhvLncrNiklNys3Km8uVy0ocis1KSU3Om8udys3Km8uVS0ocis2KSU3KTtyZXR1cm4iWiJpbiBvPyhvLkgrPW8uWi8xMDB8MCxvLk0rPW8uWiUxMDAsVzMobykpOkczKG8pfX1mdW5jdGlvbiBHKHQsZSxuLGkpe2Zvcih2YXIgcixvLGE9MCxzPWUubGVuZ3RoLGw9bi5sZW5ndGg7YTxzOyl7aWYoaT49bClyZXR1cm4tMTtpZigzNz09PShyPWUuY2hhckNvZGVBdChhKyspKSl7aWYocj1lLmNoYXJBdChhKyspLCEobz1JW3IgaW4gSzM/ZS5jaGFyQXQoYSsrKTpyXSl8fChpPW8odCxuLGkpKTwwKXJldHVybi0xfWVsc2UgaWYociE9bi5jaGFyQ29kZUF0KGkrKykpcmV0dXJuLTF9cmV0dXJuIGl9cmV0dXJuIHYueD1VKG4sdiksdi5YPVUoaSx2KSx2LmM9VShlLHYpLFQueD1VKG4sVCksVC5YPVUoaSxUKSxULmM9VShlLFQpLHtmb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIGU9VSh0Kz0iIix2KTtyZXR1cm4gZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxlfSxwYXJzZTpmdW5jdGlvbih0KXt2YXIgZT1qKHQrPSIiLCExKTtyZXR1cm4gZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxlfSx1dGNGb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIGU9VSh0Kz0iIixUKTtyZXR1cm4gZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxlfSx1dGNQYXJzZTpmdW5jdGlvbih0KXt2YXIgZT1qKHQrPSIiLCEwKTtyZXR1cm4gZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxlfX19KSh0KSxYMz1ZMy5mb3JtYXQsJDM9WTMudXRjRm9ybWF0LFkzfSkoe2RhdGVUaW1lOiIleCwgJVgiLGRhdGU6IiUtbS8lLWQvJVkiLHRpbWU6IiUtSTolTTolUyAlcCIscGVyaW9kczpbIkFNIiwiUE0iXSxkYXlzOlsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxzaG9ydERheXM6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxtb250aHM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLHNob3J0TW9udGhzOlsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl19KTt2YXIgZjY9MWUzLG02PTZlNCxnNj0zNmU1LF82PTg2NGU1LHk2PTI1OTJlNix2Nj0zMTUzNmU2O2Z1bmN0aW9uIGI2KHQpe3JldHVybiBuZXcgRGF0ZSh0KX1mdW5jdGlvbiB4Nih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIERhdGU/K3Q6K25ldyBEYXRlKCt0KX1mdW5jdGlvbiB3Nih0LGUsbixpLHIsbyxhLHMsbCl7dmFyIGM9RDUoSTUsYjUpLHU9Yy5pbnZlcnQsaD1jLmRvbWFpbixkPWwoIi4lTCIpLHA9bCgiOiVTIiksZj1sKCIlSTolTSIpLG09bCgiJUkgJXAiKSxnPWwoIiVhICVkIiksXz1sKCIlYiAlZCIpLHk9bCgiJUIiKSx2PWwoIiVZIiksYj1bW2EsMSxmNl0sW2EsNSw1ZTNdLFthLDE1LDE1ZTNdLFthLDMwLDNlNF0sW28sMSxtNl0sW28sNSwzZTVdLFtvLDE1LDllNV0sW28sMzAsMThlNV0sW3IsMSxnNl0sW3IsMywxMDhlNV0sW3IsNiwyMTZlNV0sW3IsMTIsNDMyZTVdLFtpLDEsXzZdLFtpLDIsMTcyOGU1XSxbbiwxLDYwNDhlNV0sW2UsMSx5Nl0sW2UsMyw3Nzc2ZTZdLFt0LDEsdjZdXTtmdW5jdGlvbiB4KHMpe3JldHVybihhKHMpPHM/ZDpvKHMpPHM/cDpyKHMpPHM/ZjppKHMpPHM/bTplKHMpPHM/bihzKTxzP2c6Xzp0KHMpPHM/eTp2KShzKX1mdW5jdGlvbiB3KGUsbixpLHIpe2lmKG51bGw9PWUmJihlPTEwKSwibnVtYmVyIj09dHlwZW9mIGUpe3ZhciBvPU1hdGguYWJzKGktbikvZSxhPUowKChmdW5jdGlvbih0KXtyZXR1cm4gdFsyXX0pKS5yaWdodChiLG8pO2E9PT1iLmxlbmd0aD8ocj1hMihuL3Y2LGkvdjYsZSksZT10KTphPyhyPShhPWJbby9iW2EtMV1bMl08YlthXVsyXS9vP2EtMTphXSlbMV0sZT1hWzBdKToocj1NYXRoLm1heChhMihuLGksZSksMSksZT1zKX1yZXR1cm4gbnVsbD09cj9lOmUuZXZlcnkocil9cmV0dXJuIGMuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRGF0ZSh1KHQpKX0sYy5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/aChmMi5jYWxsKHQseDYpKTpoKCkubWFwKGI2KX0sYy50aWNrcz1mdW5jdGlvbih0LGUpe3ZhciBuLGk9aCgpLHI9aVswXSxvPWlbaS5sZW5ndGgtMV0sYT1vPHI7cmV0dXJuIGEmJihuPXIscj1vLG89biksbj0obj13KHQscixvLGUpKT9uLnJhbmdlKHIsbysxKTpbXSxhP24ucmV2ZXJzZSgpOm59LGMudGlja0Zvcm1hdD1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT1lP3g6bChlKX0sYy5uaWNlPWZ1bmN0aW9uKHQsZSl7dmFyIG49aCgpO3JldHVybih0PXcodCxuWzBdLG5bbi5sZW5ndGgtMV0sZSkpP2goaTMobix0KSk6Y30sYy5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHo1KGMsdzYodCxlLG4saSxyLG8sYSxzLGwpKX0sY31mdW5jdGlvbiBTNih0KXtyZXR1cm4gdC5tYXRjaCgvLns2fS9nKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiIjIit0fSkpfXZhciBNNj1TNigiMWY3N2I0ZmY3ZjBlMmNhMDJjZDYyNzI4OTQ2N2JkOGM1NjRiZTM3N2MyN2Y3ZjdmYmNiZDIyMTdiZWNmIiksRTY9UzYoIjM5M2I3OTUyNTRhMzZiNmVjZjljOWVkZTYzNzkzOThjYTI1MmI1Y2Y2YmNlZGI5YzhjNmQzMWJkOWUzOWU3YmE1MmU3Y2I5NDg0M2MzOWFkNDk0YWQ2NjE2YmU3OTY5YzdiNDE3M2E1NTE5NGNlNmRiZGRlOWVkNiIpLFQ2PVM2KCIzMTgyYmQ2YmFlZDY5ZWNhZTFjNmRiZWZlNjU1MGRmZDhkM2NmZGFlNmJmZGQwYTIzMWEzNTQ3NGM0NzZhMWQ5OWJjN2U5YzA3NTZiYjE5ZTlhYzhiY2JkZGNkYWRhZWI2MzYzNjM5Njk2OTZiZGJkYmRkOWQ5ZDkiKSxDNj1TNigiMWY3N2I0YWVjN2U4ZmY3ZjBlZmZiYjc4MmNhMDJjOThkZjhhZDYyNzI4ZmY5ODk2OTQ2N2JkYzViMGQ1OGM1NjRiYzQ5Yzk0ZTM3N2MyZjdiNmQyN2Y3ZjdmYzdjN2M3YmNiZDIyZGJkYjhkMTdiZWNmOWVkYWU1IiksQTY9azUodTUoMzAwLC41LDApLHU1KC0yNDAsLjUsMSkpLGs2PWs1KHU1KC0xMDAsLjc1LC4zNSksdTUoODAsMS41LC44KSksTDY9azUodTUoMjYwLC43NSwuMzUpLHU1KDgwLDEuNSwuOCkpLFA2PXU1KCk7ZnVuY3Rpb24gTjYodCl7dmFyIGU9dC5sZW5ndGg7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0W01hdGgubWF4KDAsTWF0aC5taW4oZS0xLE1hdGguZmxvb3IobiplKSkpXX19dmFyIEk2PU42KFM2KCI0NDAxNTQ0NDAyNTY0NTA0NTc0NTA1NTk0NjA3NWE0NjA4NWM0NjBhNWQ0NjBiNWU0NzBkNjA0NzBlNjE0NzEwNjM0NzExNjQ0NzEzNjU0ODE0Njc0ODE2Njg0ODE3Njk0ODE4NmE0ODFhNmM0ODFiNmQ0ODFjNmU0ODFkNmY0ODFmNzA0ODIwNzE0ODIxNzM0ODIzNzQ0ODI0NzU0ODI1NzY0ODI2Nzc0ODI4Nzg0ODI5Nzk0NzJhN2E0NzJjN2E0NzJkN2I0NzJlN2M0NzJmN2Q0NjMwN2U0NjMyN2U0NjMzN2Y0NjM0ODA0NTM1ODE0NTM3ODE0NTM4ODI0NDM5ODM0NDNhODM0NDNiODQ0MzNkODQ0MzNlODU0MjNmODU0MjQwODY0MjQxODY0MTQyODc0MTQ0ODc0MDQ1ODg0MDQ2ODgzZjQ3ODgzZjQ4ODkzZTQ5ODkzZTRhODkzZTRjOGEzZDRkOGEzZDRlOGEzYzRmOGEzYzUwOGIzYjUxOGIzYjUyOGIzYTUzOGIzYTU0OGMzOTU1OGMzOTU2OGMzODU4OGMzODU5OGMzNzVhOGMzNzViOGQzNjVjOGQzNjVkOGQzNTVlOGQzNTVmOGQzNDYwOGQzNDYxOGQzMzYyOGQzMzYzOGQzMjY0OGUzMjY1OGUzMTY2OGUzMTY3OGUzMTY4OGUzMDY5OGUzMDZhOGUyZjZiOGUyZjZjOGUyZTZkOGUyZTZlOGUyZTZmOGUyZDcwOGUyZDcxOGUyYzcxOGUyYzcyOGUyYzczOGUyYjc0OGUyYjc1OGUyYTc2OGUyYTc3OGUyYTc4OGUyOTc5OGUyOTdhOGUyOTdiOGUyODdjOGUyODdkOGUyNzdlOGUyNzdmOGUyNzgwOGUyNjgxOGUyNjgyOGUyNjgyOGUyNTgzOGUyNTg0OGUyNTg1OGUyNDg2OGUyNDg3OGUyMzg4OGUyMzg5OGUyMzhhOGQyMjhiOGQyMjhjOGQyMjhkOGQyMThlOGQyMThmOGQyMTkwOGQyMTkxOGMyMDkyOGMyMDkyOGMyMDkzOGMxZjk0OGMxZjk1OGIxZjk2OGIxZjk3OGIxZjk4OGIxZjk5OGExZjlhOGExZTliOGExZTljODkxZTlkODkxZjllODkxZjlmODgxZmEwODgxZmExODgxZmExODcxZmEyODcyMGEzODYyMGE0ODYyMWE1ODUyMWE2ODUyMmE3ODUyMmE4ODQyM2E5ODMyNGFhODMyNWFiODIyNWFjODIyNmFkODEyN2FkODEyOGFlODAyOWFmN2YyYWIwN2YyY2IxN2UyZGIyN2QyZWIzN2MyZmI0N2MzMWI1N2IzMmI2N2EzNGI2NzkzNWI3NzkzN2I4NzgzOGI5NzczYWJhNzYzYmJiNzUzZGJjNzQzZmJjNzM0MGJkNzI0MmJlNzE0NGJmNzA0NmMwNmY0OGMxNmU0YWMxNmQ0Y2MyNmM0ZWMzNmI1MGM0NmE1MmM1Njk1NGM1Njg1NmM2Njc1OGM3NjU1YWM4NjQ1Y2M4NjM1ZWM5NjI2MGNhNjA2M2NiNWY2NWNiNWU2N2NjNWM2OWNkNWI2Y2NkNWE2ZWNlNTg3MGNmNTc3M2QwNTY3NWQwNTQ3N2QxNTM3YWQxNTE3Y2QyNTA3ZmQzNGU4MWQzNGQ4NGQ0NGI4NmQ1NDk4OWQ1NDg4YmQ2NDY4ZWQ2NDU5MGQ3NDM5M2Q3NDE5NWQ4NDA5OGQ4M2U5YmQ5M2M5ZGQ5M2JhMGRhMzlhMmRhMzdhNWRiMzZhOGRiMzRhYWRjMzJhZGRjMzBiMGRkMmZiMmRkMmRiNWRlMmJiOGRlMjliYWRlMjhiZGRmMjZjMGRmMjVjMmRmMjNjNWUwMjFjOGUwMjBjYWUxMWZjZGUxMWRkMGUxMWNkMmUyMWJkNWUyMWFkOGUyMTlkYWUzMTlkZGUzMThkZmUzMThlMmU0MThlNWU0MTllN2U0MTllYWU1MWFlY2U1MWJlZmU1MWNmMWU1MWRmNGU2MWVmNmU2MjBmOGU2MjFmYmU3MjNmZGU3MjUiKSksUjY9TjYoUzYoIjAwMDAwNDAxMDAwNTAxMDEwNjAxMDEwODAyMDEwOTAyMDIwYjAyMDIwZDAzMDMwZjAzMDMxMjA0MDQxNDA1MDQxNjA2MDUxODA2MDUxYTA3MDYxYzA4MDcxZTA5MDcyMDBhMDgyMjBiMDkyNDBjMDkyNjBkMGEyOTBlMGIyYjEwMGIyZDExMGMyZjEyMGQzMTEzMGQzNDE0MGUzNjE1MGUzODE2MGYzYjE4MGYzZDE5MTAzZjFhMTA0MjFjMTA0NDFkMTE0NzFlMTE0OTIwMTE0YjIxMTE0ZTIyMTE1MDI0MTI1MzI1MTI1NTI3MTI1ODI5MTE1YTJhMTE1YzJjMTE1ZjJkMTE2MTJmMTE2MzMxMTE2NTMzMTA2NzM0MTA2OTM2MTA2YjM4MTA2YzM5MGY2ZTNiMGY3MDNkMGY3MTNmMGY3MjQwMGY3NDQyMGY3NTQ0MGY3NjQ1MTA3NzQ3MTA3ODQ5MTA3ODRhMTA3OTRjMTE3YTRlMTE3YjRmMTI3YjUxMTI3YzUyMTM3YzU0MTM3ZDU2MTQ3ZDU3MTU3ZTU5MTU3ZTVhMTY3ZTVjMTY3ZjVkMTc3ZjVmMTg3ZjYwMTg4MDYyMTk4MDY0MWE4MDY1MWE4MDY3MWI4MDY4MWM4MTZhMWM4MTZiMWQ4MTZkMWQ4MTZlMWU4MTcwMWY4MTcyMWY4MTczMjA4MTc1MjE4MTc2MjE4MTc4MjI4MTc5MjI4MjdiMjM4MjdjMjM4MjdlMjQ4MjgwMjU4MjgxMjU4MTgzMjY4MTg0MjY4MTg2Mjc4MTg4Mjc4MTg5Mjg4MThiMjk4MThjMjk4MThlMmE4MTkwMmE4MTkxMmI4MTkzMmI4MDk0MmM4MDk2MmM4MDk4MmQ4MDk5MmQ4MDliMmU3ZjljMmU3ZjllMmY3ZmEwMmY3ZmExMzA3ZWEzMzA3ZWE1MzE3ZWE2MzE3ZGE4MzI3ZGFhMzM3ZGFiMzM3Y2FkMzQ3Y2FlMzQ3YmIwMzU3YmIyMzU3YmIzMzY3YWI1MzY3YWI3Mzc3OWI4Mzc3OWJhMzg3OGJjMzk3OGJkMzk3N2JmM2E3N2MwM2E3NmMyM2I3NWM0M2M3NWM1M2M3NGM3M2Q3M2M4M2U3M2NhM2U3MmNjM2Y3MWNkNDA3MWNmNDA3MGQwNDE2ZmQyNDI2ZmQzNDM2ZWQ1NDQ2ZGQ2NDU2Y2Q4NDU2Y2Q5NDY2YmRiNDc2YWRjNDg2OWRlNDk2OGRmNGE2OGUwNGM2N2UyNGQ2NmUzNGU2NWU0NGY2NGU1NTA2NGU3NTI2M2U4NTM2MmU5NTQ2MmVhNTY2MWViNTc2MGVjNTg2MGVkNWE1ZmVlNWI1ZWVmNWQ1ZWYwNWY1ZWYxNjA1ZGYyNjI1ZGYyNjQ1Y2YzNjU1Y2Y0Njc1Y2Y0Njk1Y2Y1NmI1Y2Y2NmM1Y2Y2NmU1Y2Y3NzA1Y2Y3NzI1Y2Y4NzQ1Y2Y4NzY1Y2Y5Nzg1ZGY5Nzk1ZGY5N2I1ZGZhN2Q1ZWZhN2Y1ZWZhODE1ZmZiODM1ZmZiODU2MGZiODc2MWZjODk2MWZjOGE2MmZjOGM2M2ZjOGU2NGZjOTA2NWZkOTI2NmZkOTQ2N2ZkOTY2OGZkOTg2OWZkOWE2YWZkOWI2YmZlOWQ2Y2ZlOWY2ZGZlYTE2ZWZlYTM2ZmZlYTU3MWZlYTc3MmZlYTk3M2ZlYWE3NGZlYWM3NmZlYWU3N2ZlYjA3OGZlYjI3YWZlYjQ3YmZlYjY3Y2ZlYjc3ZWZlYjk3ZmZlYmI4MWZlYmQ4MmZlYmY4NGZlYzE4NWZlYzI4N2ZlYzQ4OGZlYzY4YWZlYzg4Y2ZlY2E4ZGZlY2M4ZmZlY2Q5MGZlY2Y5MmZlZDE5NGZlZDM5NWZlZDU5N2ZlZDc5OWZlZDg5YWZkZGE5Y2ZkZGM5ZWZkZGVhMGZkZTBhMWZkZTJhM2ZkZTNhNWZkZTVhN2ZkZTdhOWZkZTlhYWZkZWJhY2ZjZWNhZWZjZWViMGZjZjBiMmZjZjJiNGZjZjRiNmZjZjZiOGZjZjdiOWZjZjliYmZjZmJiZGZjZmRiZiIpKSxPNj1ONihTNigiMDAwMDA0MDEwMDA1MDEwMTA2MDEwMTA4MDIwMTBhMDIwMjBjMDIwMjBlMDMwMjEwMDQwMzEyMDQwMzE0MDUwNDE3MDYwNDE5MDcwNTFiMDgwNTFkMDkwNjFmMGEwNzIyMGIwNzI0MGMwODI2MGQwODI5MGUwOTJiMTAwOTJkMTEwYTMwMTIwYTMyMTQwYjM0MTUwYjM3MTYwYjM5MTgwYzNjMTkwYzNlMWIwYzQxMWMwYzQzMWUwYzQ1MWYwYzQ4MjEwYzRhMjMwYzRjMjQwYzRmMjYwYzUxMjgwYjUzMjkwYjU1MmIwYjU3MmQwYjU5MmYwYTViMzEwYTVjMzIwYTVlMzQwYTVmMzYwOTYxMzgwOTYyMzkwOTYzM2IwOTY0M2QwOTY1M2UwOTY2NDAwYTY3NDIwYTY4NDQwYTY4NDUwYTY5NDcwYjZhNDkwYjZhNGEwYzZiNGMwYzZiNGQwZDZjNGYwZDZjNTEwZTZjNTIwZTZkNTQwZjZkNTUwZjZkNTcxMDZlNTkxMDZlNWExMTZlNWMxMjZlNWQxMjZlNWYxMzZlNjExMzZlNjIxNDZlNjQxNTZlNjUxNTZlNjcxNjZlNjkxNjZlNmExNzZlNmMxODZlNmQxODZlNmYxOTZlNzExOTZlNzIxYTZlNzQxYTZlNzUxYjZlNzcxYzZkNzgxYzZkN2ExZDZkN2MxZDZkN2QxZTZkN2YxZTZjODAxZjZjODIyMDZjODQyMDZiODUyMTZiODcyMTZiODgyMjZhOGEyMjZhOGMyMzY5OGQyMzY5OGYyNDY5OTAyNTY4OTIyNTY4OTMyNjY3OTUyNjY3OTcyNzY2OTgyNzY2OWEyODY1OWIyOTY0OWQyOTY0OWYyYTYzYTAyYTYzYTIyYjYyYTMyYzYxYTUyYzYwYTYyZDYwYTgyZTVmYTkyZTVlYWIyZjVlYWQzMDVkYWUzMDVjYjAzMTViYjEzMjVhYjMzMjVhYjQzMzU5YjYzNDU4YjczNTU3YjkzNTU2YmEzNjU1YmMzNzU0YmQzODUzYmYzOTUyYzAzYTUxYzEzYTUwYzMzYjRmYzQzYzRlYzYzZDRkYzczZTRjYzgzZjRiY2E0MDRhY2I0MTQ5Y2M0MjQ4Y2U0MzQ3Y2Y0NDQ2ZDA0NTQ1ZDI0NjQ0ZDM0NzQzZDQ0ODQyZDU0YTQxZDc0YjNmZDg0YzNlZDk0ZDNkZGE0ZTNjZGI1MDNiZGQ1MTNhZGU1MjM4ZGY1MzM3ZTA1NTM2ZTE1NjM1ZTI1NzM0ZTM1OTMzZTQ1YTMxZTU1YzMwZTY1ZDJmZTc1ZTJlZTg2MDJkZTk2MTJiZWE2MzJhZWI2NDI5ZWI2NjI4ZWM2NzI2ZWQ2OTI1ZWU2YTI0ZWY2YzIzZWY2ZTIxZjA2ZjIwZjE3MTFmZjE3MzFkZjI3NDFjZjM3NjFiZjM3ODE5ZjQ3OTE4ZjU3YjE3ZjU3ZDE1ZjY3ZTE0ZjY4MDEzZjc4MjEyZjc4NDEwZjg4NTBmZjg4NzBlZjg4OTBjZjk4YjBiZjk4YzBhZjk4ZTA5ZmE5MDA4ZmE5MjA3ZmE5NDA3ZmI5NjA2ZmI5NzA2ZmI5OTA2ZmI5YjA2ZmI5ZDA3ZmM5ZjA3ZmNhMTA4ZmNhMzA5ZmNhNTBhZmNhNjBjZmNhODBkZmNhYTBmZmNhYzExZmNhZTEyZmNiMDE0ZmNiMjE2ZmNiNDE4ZmJiNjFhZmJiODFkZmJiYTFmZmJiYzIxZmJiZTIzZmFjMDI2ZmFjMjI4ZmFjNDJhZmFjNjJkZjljNzJmZjljOTMyZjljYjM1ZjhjZDM3ZjhjZjNhZjdkMTNkZjdkMzQwZjZkNTQzZjZkNzQ2ZjVkOTQ5ZjVkYjRjZjRkZDRmZjRkZjUzZjRlMTU2ZjNlMzVhZjNlNTVkZjJlNjYxZjJlODY1ZjJlYTY5ZjFlYzZkZjFlZDcxZjFlZjc1ZjFmMTc5ZjJmMjdkZjJmNDgyZjNmNTg2ZjNmNjhhZjRmODhlZjVmOTkyZjZmYTk2ZjhmYjlhZjlmYzlkZmFmZGExZmNmZmE0IikpLHo2PU42KFM2KCIwZDA4ODcxMDA3ODgxMzA3ODkxNjA3OGExOTA2OGMxYjA2OGQxZDA2OGUyMDA2OGYyMjA2OTAyNDA2OTEyNjA1OTEyODA1OTIyYTA1OTMyYzA1OTQyZTA1OTUyZjA1OTYzMTA1OTczMzA1OTczNTA0OTgzNzA0OTkzODA0OWEzYTA0OWEzYzA0OWIzZTA0OWMzZjA0OWM0MTA0OWQ0MzAzOWU0NDAzOWU0NjAzOWY0ODAzOWY0OTAzYTA0YjAzYTE0YzAyYTE0ZTAyYTI1MDAyYTI1MTAyYTM1MzAyYTM1NTAyYTQ1NjAxYTQ1ODAxYTQ1OTAxYTU1YjAxYTU1YzAxYTY1ZTAxYTY2MDAxYTY2MTAwYTc2MzAwYTc2NDAwYTc2NjAwYTc2NzAwYTg2OTAwYTg2YTAwYTg2YzAwYTg2ZTAwYTg2ZjAwYTg3MTAwYTg3MjAxYTg3NDAxYTg3NTAxYTg3NzAxYTg3ODAxYTg3YTAyYTg3YjAyYTg3ZDAzYTg3ZTAzYTg4MDA0YTg4MTA0YTc4MzA1YTc4NDA1YTc4NjA2YTY4NzA3YTY4ODA4YTY4YTA5YTU4YjBhYTU4ZDBiYTU4ZTBjYTQ4ZjBkYTQ5MTBlYTM5MjBmYTM5NDEwYTI5NTExYTE5NjEzYTE5ODE0YTA5OTE1OWY5YTE2OWY5YzE3OWU5ZDE4OWQ5ZTE5OWRhMDFhOWNhMTFiOWJhMjFkOWFhMzFlOWFhNTFmOTlhNjIwOThhNzIxOTdhODIyOTZhYTIzOTVhYjI0OTRhYzI2OTRhZDI3OTNhZTI4OTJiMDI5OTFiMTJhOTBiMjJiOGZiMzJjOGViNDJlOGRiNTJmOGNiNjMwOGJiNzMxOGFiODMyODliYTMzODhiYjM0ODhiYzM1ODdiZDM3ODZiZTM4ODViZjM5ODRjMDNhODNjMTNiODJjMjNjODFjMzNkODBjNDNlN2ZjNTQwN2VjNjQxN2RjNzQyN2NjODQzN2JjOTQ0N2FjYTQ1N2FjYjQ2NzljYzQ3NzhjYzQ5NzdjZDRhNzZjZTRiNzVjZjRjNzRkMDRkNzNkMTRlNzJkMjRmNzFkMzUxNzFkNDUyNzBkNTUzNmZkNTU0NmVkNjU1NmRkNzU2NmNkODU3NmJkOTU4NmFkYTVhNmFkYTViNjlkYjVjNjhkYzVkNjdkZDVlNjZkZTVmNjVkZTYxNjRkZjYyNjNlMDYzNjNlMTY0NjJlMjY1NjFlMjY2NjBlMzY4NWZlNDY5NWVlNTZhNWRlNTZiNWRlNjZjNWNlNzZlNWJlNzZmNWFlODcwNTllOTcxNThlOTcyNTdlYTc0NTdlYjc1NTZlYjc2NTVlYzc3NTRlZDc5NTNlZDdhNTJlZTdiNTFlZjdjNTFlZjdlNTBmMDdmNGZmMDgwNGVmMTgxNGRmMTgzNGNmMjg0NGJmMzg1NGJmMzg3NGFmNDg4NDlmNDg5NDhmNThiNDdmNThjNDZmNjhkNDVmNjhmNDRmNzkwNDRmNzkxNDNmNzkzNDJmODk0NDFmODk1NDBmOTk3M2ZmOTk4M2VmOTlhM2VmYTliM2RmYTljM2NmYTllM2JmYjlmM2FmYmExMzlmYmEyMzhmY2EzMzhmY2E1MzdmY2E2MzZmY2E4MzVmY2E5MzRmZGFiMzNmZGFjMzNmZGFlMzJmZGFmMzFmZGIxMzBmZGIyMmZmZGI0MmZmZGI1MmVmZWI3MmRmZWI4MmNmZWJhMmNmZWJiMmJmZWJkMmFmZWJlMmFmZWMwMjlmZGMyMjlmZGMzMjhmZGM1MjdmZGM2MjdmZGM4MjdmZGNhMjZmZGNiMjZmY2NkMjVmY2NlMjVmY2QwMjVmY2QyMjVmYmQzMjRmYmQ1MjRmYmQ3MjRmYWQ4MjRmYWRhMjRmOWRjMjRmOWRkMjVmOGRmMjVmOGUxMjVmN2UyMjVmN2U0MjVmNmU2MjZmNmU4MjZmNWU5MjZmNWViMjdmNGVkMjdmM2VlMjdmM2YwMjdmMmYyMjdmMWY0MjZmMWY1MjVmMGY3MjRmMGY5MjEiKSk7dmFyIEQ2PSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIixCNj17c3ZnOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIseGh0bWw6RDYseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifTtmdW5jdGlvbiBINih0KXt2YXIgZT10Kz0iIixuPWUuaW5kZXhPZigiOiIpO3JldHVybiBuPj0wJiYieG1sbnMiIT09KGU9dC5zbGljZSgwLG4pKSYmKHQ9dC5zbGljZShuKzEpKSxCNi5oYXNPd25Qcm9wZXJ0eShlKT97c3BhY2U6QjZbZV0sbG9jYWw6dH06dH1mdW5jdGlvbiBGNih0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLm93bmVyRG9jdW1lbnQsbj10aGlzLm5hbWVzcGFjZVVSSTtyZXR1cm4gbj09PUQ2JiZlLmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkk9PT1ENj9lLmNyZWF0ZUVsZW1lbnQodCk6ZS5jcmVhdGVFbGVtZW50TlMobix0KX19ZnVuY3Rpb24gVjYodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlModC5zcGFjZSx0LmxvY2FsKX19ZnVuY3Rpb24gVTYodCl7dmFyIGU9SDYodCk7cmV0dXJuKGUubG9jYWw/VjY6RjYpKGUpfWZ1bmN0aW9uIGo2KCl7fWZ1bmN0aW9uIEc2KHQpe3JldHVybiBudWxsPT10P2o2OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucXVlcnlTZWxlY3Rvcih0KX19ZnVuY3Rpb24gVzYoKXtyZXR1cm5bXX1mdW5jdGlvbiBxNih0KXtyZXR1cm4gbnVsbD09dD9XNjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwodCl9fXZhciBZNj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXRjaGVzKHQpfX07aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudCl7dmFyIFg2PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtpZighWDYubWF0Y2hlcyl7dmFyICQ2PVg2LndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8WDYubXNNYXRjaGVzU2VsZWN0b3J8fFg2Lm1vek1hdGNoZXNTZWxlY3Rvcnx8WDYub01hdGNoZXNTZWxlY3RvcjtZNj1mdW5jdGlvbih0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gJDYuY2FsbCh0aGlzLHQpfX19fXZhciBLNj1ZNjtmdW5jdGlvbiBaNih0KXtyZXR1cm4gbmV3IEFycmF5KHQubGVuZ3RoKX1mdW5jdGlvbiBKNih0LGUpe3RoaXMub3duZXJEb2N1bWVudD10Lm93bmVyRG9jdW1lbnQsdGhpcy5uYW1lc3BhY2VVUkk9dC5uYW1lc3BhY2VVUkksdGhpcy5fbmV4dD1udWxsLHRoaXMuX3BhcmVudD10LHRoaXMuX19kYXRhX189ZX1KNi5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOko2LGFwcGVuZENoaWxkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKHQsdGhpcy5fbmV4dCl9LGluc2VydEJlZm9yZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKHQsZSl9LHF1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yKHQpfSxxdWVyeVNlbGVjdG9yQWxsOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbCh0KX19O2Z1bmN0aW9uIFE2KHQsZSxuLGkscixvKXtmb3IodmFyIGEscz0wLGw9ZS5sZW5ndGgsYz1vLmxlbmd0aDtzPGM7KytzKShhPWVbc10pPyhhLl9fZGF0YV9fPW9bc10saVtzXT1hKTpuW3NdPW5ldyBKNih0LG9bc10pO2Zvcig7czxsOysrcykoYT1lW3NdKSYmKHJbc109YSl9ZnVuY3Rpb24gdDkodCxlLG4saSxyLG8sYSl7dmFyIHMsbCxjLHU9e30saD1lLmxlbmd0aCxkPW8ubGVuZ3RoLHA9bmV3IEFycmF5KGgpO2ZvcihzPTA7czxoOysrcykobD1lW3NdKSYmKHBbc109Yz0iJCIrYS5jYWxsKGwsbC5fX2RhdGFfXyxzLGUpLGMgaW4gdT9yW3NdPWw6dVtjXT1sKTtmb3Iocz0wO3M8ZDsrK3MpKGw9dVtjPSIkIithLmNhbGwodCxvW3NdLHMsbyldKT8oaVtzXT1sLGwuX19kYXRhX189b1tzXSx1W2NdPW51bGwpOm5bc109bmV3IEo2KHQsb1tzXSk7Zm9yKHM9MDtzPGg7KytzKShsPWVbc10pJiZ1W3Bbc11dPT09bCYmKHJbc109bCl9ZnVuY3Rpb24gZTkodCxlKXtyZXR1cm4gdDxlPy0xOnQ+ZT8xOnQ+PWU/MDpOYU59ZnVuY3Rpb24gbjkodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fWZ1bmN0aW9uIGk5KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKX19ZnVuY3Rpb24gcjkodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnNldEF0dHJpYnV0ZSh0LGUpfX1mdW5jdGlvbiBvOSh0LGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLGUpfX1mdW5jdGlvbiBhOSh0LGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PW4/dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCk6dGhpcy5zZXRBdHRyaWJ1dGUodCxuKX19ZnVuY3Rpb24gczkodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1uP3RoaXMucmVtb3ZlQXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKTp0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxuKX19ZnVuY3Rpb24gbDkodCl7cmV0dXJuIHQub3duZXJEb2N1bWVudCYmdC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3fHx0LmRvY3VtZW50JiZ0fHx0LmRlZmF1bHRWaWV3fWZ1bmN0aW9uIGM5KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkodCl9fWZ1bmN0aW9uIHU5KHQsZSxuKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQsZSxuKX19ZnVuY3Rpb24gaDkodCxlLG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciBpPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWk/dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KTp0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQsaSxuKX19ZnVuY3Rpb24gZDkodCxlKXtyZXR1cm4gdC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKGUpfHxsOSh0KS5nZXRDb21wdXRlZFN0eWxlKHQsbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShlKX1mdW5jdGlvbiBwOSh0KXtyZXR1cm4gZnVuY3Rpb24oKXtkZWxldGUgdGhpc1t0XX19ZnVuY3Rpb24gZjkodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzW3RdPWV9fWZ1bmN0aW9uIG05KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG49ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7bnVsbD09bj9kZWxldGUgdGhpc1t0XTp0aGlzW3RdPW59fWZ1bmN0aW9uIGc5KHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKX1mdW5jdGlvbiBfOSh0KXtyZXR1cm4gdC5jbGFzc0xpc3R8fG5ldyB5OSh0KX1mdW5jdGlvbiB5OSh0KXt0aGlzLl9ub2RlPXQsdGhpcy5fbmFtZXM9ZzkodC5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX1mdW5jdGlvbiB2OSh0LGUpe2Zvcih2YXIgbj1fOSh0KSxpPS0xLHI9ZS5sZW5ndGg7KytpPHI7KW4uYWRkKGVbaV0pfWZ1bmN0aW9uIGI5KHQsZSl7Zm9yKHZhciBuPV85KHQpLGk9LTEscj1lLmxlbmd0aDsrK2k8cjspbi5yZW1vdmUoZVtpXSl9ZnVuY3Rpb24geDkodCl7cmV0dXJuIGZ1bmN0aW9uKCl7djkodGhpcyx0KX19ZnVuY3Rpb24gdzkodCl7cmV0dXJuIGZ1bmN0aW9uKCl7YjkodGhpcyx0KX19ZnVuY3Rpb24gUzkodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXsoZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk/djk6YjkpKHRoaXMsdCl9fWZ1bmN0aW9uIE05KCl7dGhpcy50ZXh0Q29udGVudD0iIn1mdW5jdGlvbiBFOSh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnRleHRDb250ZW50PXR9fWZ1bmN0aW9uIFQ5KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09ZT8iIjplfX1mdW5jdGlvbiBDOSgpe3RoaXMuaW5uZXJIVE1MPSIifWZ1bmN0aW9uIEE5KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuaW5uZXJIVE1MPXR9fWZ1bmN0aW9uIGs5KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaW5uZXJIVE1MPW51bGw9PWU/IiI6ZX19ZnVuY3Rpb24gTDkoKXt0aGlzLm5leHRTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyl9ZnVuY3Rpb24gUDkoKXt0aGlzLnByZXZpb3VzU2libGluZyYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKX1mdW5jdGlvbiBOOSgpe3JldHVybiBudWxsfWZ1bmN0aW9uIEk5KCl7dmFyIHQ9dGhpcy5wYXJlbnROb2RlO3QmJnQucmVtb3ZlQ2hpbGQodGhpcyl9ZnVuY3Rpb24gUjkoKXtyZXR1cm4gdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmNsb25lTm9kZSghMSksdGhpcy5uZXh0U2libGluZyl9ZnVuY3Rpb24gTzkoKXtyZXR1cm4gdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmNsb25lTm9kZSghMCksdGhpcy5uZXh0U2libGluZyl9eTkucHJvdG90eXBlPXthZGQ6ZnVuY3Rpb24odCl7dGhpcy5fbmFtZXMuaW5kZXhPZih0KTwwJiYodGhpcy5fbmFtZXMucHVzaCh0KSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbmFtZXMuaW5kZXhPZih0KTtlPj0wJiYodGhpcy5fbmFtZXMuc3BsaWNlKGUsMSksdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLl9uYW1lcy5qb2luKCIgIikpKX0sY29udGFpbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YodCk+PTB9fTt2YXIgejk9e30sRDk9bnVsbDsidW5kZWZpbmVkIiE9dHlwZW9mIGRvY3VtZW50JiYoIm9ubW91c2VlbnRlciJpbiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnR8fCh6OT17bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9KSk7ZnVuY3Rpb24gQjkodCxlLG4pe3JldHVybiB0PUg5KHQsZSxuKSxmdW5jdGlvbihlKXt2YXIgbj1lLnJlbGF0ZWRUYXJnZXQ7biYmKG49PT10aGlzfHw4Jm4uY29tcGFyZURvY3VtZW50UG9zaXRpb24odGhpcykpfHx0LmNhbGwodGhpcyxlKX19ZnVuY3Rpb24gSDkodCxlLG4pe3JldHVybiBmdW5jdGlvbihpKXt2YXIgcj1EOTtEOT1pO3RyeXt0LmNhbGwodGhpcyx0aGlzLl9fZGF0YV9fLGUsbil9ZmluYWxseXtEOT1yfX19ZnVuY3Rpb24gRjkodCl7cmV0dXJuIHQudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcCgoZnVuY3Rpb24odCl7dmFyIGU9IiIsbj10LmluZGV4T2YoIi4iKTtyZXR1cm4gbj49MCYmKGU9dC5zbGljZShuKzEpLHQ9dC5zbGljZSgwLG4pKSx7dHlwZTp0LG5hbWU6ZX19KSl9ZnVuY3Rpb24gVjkodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5fX29uO2lmKGUpe2Zvcih2YXIgbixpPTAscj0tMSxvPWUubGVuZ3RoO2k8bzsrK2kpbj1lW2ldLHQudHlwZSYmbi50eXBlIT09dC50eXBlfHxuLm5hbWUhPT10Lm5hbWU/ZVsrK3JdPW46dGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG4udHlwZSxuLmxpc3RlbmVyLG4uY2FwdHVyZSk7KytyP2UubGVuZ3RoPXI6ZGVsZXRlIHRoaXMuX19vbn19fWZ1bmN0aW9uIFU5KHQsZSxuKXt2YXIgaT16OS5oYXNPd25Qcm9wZXJ0eSh0LnR5cGUpP0I5Okg5O3JldHVybiBmdW5jdGlvbihyLG8sYSl7dmFyIHMsbD10aGlzLl9fb24sYz1pKGUsbyxhKTtpZihsKWZvcih2YXIgdT0wLGg9bC5sZW5ndGg7dTxoOysrdSlpZigocz1sW3VdKS50eXBlPT09dC50eXBlJiZzLm5hbWU9PT10Lm5hbWUpcmV0dXJuIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihzLnR5cGUscy5saXN0ZW5lcixzLmNhcHR1cmUpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihzLnR5cGUscy5saXN0ZW5lcj1jLHMuY2FwdHVyZT1uKSx2b2lkKHMudmFsdWU9ZSk7dGhpcy5hZGRFdmVudExpc3RlbmVyKHQudHlwZSxjLG4pLHM9e3R5cGU6dC50eXBlLG5hbWU6dC5uYW1lLHZhbHVlOmUsbGlzdGVuZXI6YyxjYXB0dXJlOm59LGw/bC5wdXNoKHMpOnRoaXMuX19vbj1bc119fWZ1bmN0aW9uIGo5KHQsZSxuKXt2YXIgaT1sOSh0KSxyPWkuQ3VzdG9tRXZlbnQ7ImZ1bmN0aW9uIj09dHlwZW9mIHI/cj1uZXcgcihlLG4pOihyPWkuZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50Iiksbj8oci5pbml0RXZlbnQoZSxuLmJ1YmJsZXMsbi5jYW5jZWxhYmxlKSxyLmRldGFpbD1uLmRldGFpbCk6ci5pbml0RXZlbnQoZSwhMSwhMSkpLHQuZGlzcGF0Y2hFdmVudChyKX1mdW5jdGlvbiBHOSh0LGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBqOSh0aGlzLHQsZSl9fWZ1bmN0aW9uIFc5KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGo5KHRoaXMsdCxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fXZhciBxOT1bbnVsbF07ZnVuY3Rpb24gWTkodCxlKXt0aGlzLl9ncm91cHM9dCx0aGlzLl9wYXJlbnRzPWV9ZnVuY3Rpb24gWDkoKXtyZXR1cm4gbmV3IFk5KFtbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XV0scTkpfWZ1bmN0aW9uICQ5KHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9uZXcgWTkoW1tkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHQpXV0sW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pOm5ldyBZOShbW3RdXSxxOSl9WTkucHJvdG90eXBlPVg5LnByb3RvdHlwZT17Y29uc3RydWN0b3I6WTksc2VsZWN0OmZ1bmN0aW9uIEs5KHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1HNih0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLGk9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWZvcih2YXIgbyxhLHM9ZVtyXSxsPXMubGVuZ3RoLGM9aVtyXT1uZXcgQXJyYXkobCksdT0wO3U8bDsrK3UpKG89c1t1XSkmJihhPXQuY2FsbChvLG8uX19kYXRhX18sdSxzKSkmJigiX19kYXRhX18iaW4gbyYmKGEuX19kYXRhX189by5fX2RhdGFfXyksY1t1XT1hKTtyZXR1cm4gbmV3IFk5KGksdGhpcy5fcGFyZW50cyl9LHNlbGVjdEFsbDpmdW5jdGlvbiBaOSh0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9cTYodCkpO2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj1lLmxlbmd0aCxpPVtdLHI9W10sbz0wO288bjsrK28pZm9yKHZhciBhLHM9ZVtvXSxsPXMubGVuZ3RoLGM9MDtjPGw7KytjKShhPXNbY10pJiYoaS5wdXNoKHQuY2FsbChhLGEuX19kYXRhX18sYyxzKSksci5wdXNoKGEpKTtyZXR1cm4gbmV3IFk5KGkscil9LGZpbHRlcjpmdW5jdGlvbiBKOSh0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9SzYodCkpO2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj1lLmxlbmd0aCxpPW5ldyBBcnJheShuKSxyPTA7cjxuOysrcilmb3IodmFyIG8sYT1lW3JdLHM9YS5sZW5ndGgsbD1pW3JdPVtdLGM9MDtjPHM7KytjKShvPWFbY10pJiZ0LmNhbGwobyxvLl9fZGF0YV9fLGMsYSkmJmwucHVzaChvKTtyZXR1cm4gbmV3IFk5KGksdGhpcy5fcGFyZW50cyl9LGRhdGE6ZnVuY3Rpb24gUTkodCxlKXtpZighdClyZXR1cm4gZj1uZXcgQXJyYXkodGhpcy5zaXplKCkpLHU9LTEsdGhpcy5lYWNoKChmdW5jdGlvbih0KXtmWysrdV09dH0pKSxmO3ZhciBuPWU/dDk6UTYsaT10aGlzLl9wYXJlbnRzLHI9dGhpcy5fZ3JvdXBzOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD0oZnVuY3Rpb24gbyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19KSh0KSk7Zm9yKHZhciBhPXIubGVuZ3RoLHM9bmV3IEFycmF5KGEpLGw9bmV3IEFycmF5KGEpLGM9bmV3IEFycmF5KGEpLHU9MDt1PGE7Kyt1KXt2YXIgaD1pW3VdLGQ9clt1XSxwPWQubGVuZ3RoLGY9dC5jYWxsKGgsaCYmaC5fX2RhdGFfXyx1LGkpLG09Zi5sZW5ndGgsZz1sW3VdPW5ldyBBcnJheShtKSxfPXNbdV09bmV3IEFycmF5KG0pO24oaCxkLGcsXyxjW3VdPW5ldyBBcnJheShwKSxmLGUpO2Zvcih2YXIgeSx2LGI9MCx4PTA7YjxtOysrYilpZih5PWdbYl0pe2ZvcihiPj14JiYoeD1iKzEpOyEodj1fW3hdKSYmKyt4PG07KTt5Ll9uZXh0PXZ8fG51bGx9fXJldHVybihzPW5ldyBZOShzLGkpKS5fZW50ZXI9bCxzLl9leGl0PWMsc30sZW50ZXI6ZnVuY3Rpb24gdDgoKXtyZXR1cm4gbmV3IFk5KHRoaXMuX2VudGVyfHx0aGlzLl9ncm91cHMubWFwKFo2KSx0aGlzLl9wYXJlbnRzKX0sZXhpdDpmdW5jdGlvbiBlOCgpe3JldHVybiBuZXcgWTkodGhpcy5fZXhpdHx8dGhpcy5fZ3JvdXBzLm1hcChaNiksdGhpcy5fcGFyZW50cyl9LG1lcmdlOmZ1bmN0aW9uIG44KHQpe2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj10Ll9ncm91cHMsaT1lLmxlbmd0aCxyPU1hdGgubWluKGksbi5sZW5ndGgpLG89bmV3IEFycmF5KGkpLGE9MDthPHI7KythKWZvcih2YXIgcyxsPWVbYV0sYz1uW2FdLHU9bC5sZW5ndGgsaD1vW2FdPW5ldyBBcnJheSh1KSxkPTA7ZDx1OysrZCkocz1sW2RdfHxjW2RdKSYmKGhbZF09cyk7Zm9yKDthPGk7KythKW9bYV09ZVthXTtyZXR1cm4gbmV3IFk5KG8sdGhpcy5fcGFyZW50cyl9LG9yZGVyOmZ1bmN0aW9uIGk4KCl7Zm9yKHZhciB0PXRoaXMuX2dyb3VwcyxlPS0xLG49dC5sZW5ndGg7KytlPG47KWZvcih2YXIgaSxyPXRbZV0sbz1yLmxlbmd0aC0xLGE9cltvXTstLW8+PTA7KShpPXJbb10pJiYoYSYmYSE9PWkubmV4dFNpYmxpbmcmJmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaSxhKSxhPWkpO3JldHVybiB0aGlzfSxzb3J0OmZ1bmN0aW9uIHI4KHQpe2Z1bmN0aW9uIGUoZSxuKXtyZXR1cm4gZSYmbj90KGUuX19kYXRhX18sbi5fX2RhdGFfXyk6IWUtIW59dHx8KHQ9ZTkpO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsaT1uLmxlbmd0aCxyPW5ldyBBcnJheShpKSxvPTA7bzxpOysrbyl7Zm9yKHZhciBhLHM9bltvXSxsPXMubGVuZ3RoLGM9cltvXT1uZXcgQXJyYXkobCksdT0wO3U8bDsrK3UpKGE9c1t1XSkmJihjW3VdPWEpO2Muc29ydChlKX1yZXR1cm4gbmV3IFk5KHIsdGhpcy5fcGFyZW50cykub3JkZXIoKX0sY2FsbDpmdW5jdGlvbiBvOCgpe3ZhciB0PWFyZ3VtZW50c1swXTtyZXR1cm4gYXJndW1lbnRzWzBdPXRoaXMsdC5hcHBseShudWxsLGFyZ3VtZW50cyksdGhpc30sbm9kZXM6ZnVuY3Rpb24gYTgoKXt2YXIgdD1uZXcgQXJyYXkodGhpcy5zaXplKCkpLGU9LTE7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXt0WysrZV09dGhpc30pKSx0fSxub2RlOmZ1bmN0aW9uIHM4KCl7Zm9yKHZhciB0PXRoaXMuX2dyb3VwcyxlPTAsbj10Lmxlbmd0aDtlPG47KytlKWZvcih2YXIgaT10W2VdLHI9MCxvPWkubGVuZ3RoO3I8bzsrK3Ipe3ZhciBhPWlbcl07aWYoYSlyZXR1cm4gYX1yZXR1cm4gbnVsbH0sc2l6ZTpmdW5jdGlvbiBsOCgpe3ZhciB0PTA7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXsrK3R9KSksdH0sZW1wdHk6ZnVuY3Rpb24gYzgoKXtyZXR1cm4hdGhpcy5ub2RlKCl9LGVhY2g6ZnVuY3Rpb24gdTgodCl7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPTAsaT1lLmxlbmd0aDtuPGk7KytuKWZvcih2YXIgcixvPWVbbl0sYT0wLHM9by5sZW5ndGg7YTxzOysrYSkocj1vW2FdKSYmdC5jYWxsKHIsci5fX2RhdGFfXyxhLG8pO3JldHVybiB0aGlzfSxhdHRyOmZ1bmN0aW9uIGg4KHQsZSl7dmFyIG49SDYodCk7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXt2YXIgaT10aGlzLm5vZGUoKTtyZXR1cm4gbi5sb2NhbD9pLmdldEF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCk6aS5nZXRBdHRyaWJ1dGUobil9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09ZT9uLmxvY2FsP2k5Om45OiJmdW5jdGlvbiI9PXR5cGVvZiBlP24ubG9jYWw/czk6YTk6bi5sb2NhbD9vOTpyOSkobixlKSl9LHN0eWxlOmZ1bmN0aW9uIGQ4KHQsZSxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09ZT9jOToiZnVuY3Rpb24iPT10eXBlb2YgZT9oOTp1OSkodCxlLG51bGw9PW4/IiI6bikpOmQ5KHRoaXMubm9kZSgpLHQpfSxwcm9wZXJ0eTpmdW5jdGlvbiBwOCh0LGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/dGhpcy5lYWNoKChudWxsPT1lP3A5OiJmdW5jdGlvbiI9PXR5cGVvZiBlP205OmY5KSh0LGUpKTp0aGlzLm5vZGUoKVt0XX0sY2xhc3NlZDpmdW5jdGlvbiBmOCh0LGUpe3ZhciBuPWc5KHQrIiIpO2lmKGFyZ3VtZW50cy5sZW5ndGg8Mil7Zm9yKHZhciBpPV85KHRoaXMubm9kZSgpKSxyPS0xLG89bi5sZW5ndGg7KytyPG87KWlmKCFpLmNvbnRhaW5zKG5bcl0pKXJldHVybiExO3JldHVybiEwfXJldHVybiB0aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiBlP1M5OmU/eDk6dzkpKG4sZSkpfSx0ZXh0OmZ1bmN0aW9uIG04KHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChudWxsPT10P005OigiZnVuY3Rpb24iPT10eXBlb2YgdD9UOTpFOSkodCkpOnRoaXMubm9kZSgpLnRleHRDb250ZW50fSxodG1sOmZ1bmN0aW9uIGc4KHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChudWxsPT10P0M5OigiZnVuY3Rpb24iPT10eXBlb2YgdD9rOTpBOSkodCkpOnRoaXMubm9kZSgpLmlubmVySFRNTH0scmFpc2U6ZnVuY3Rpb24gXzgoKXtyZXR1cm4gdGhpcy5lYWNoKEw5KX0sbG93ZXI6ZnVuY3Rpb24geTgoKXtyZXR1cm4gdGhpcy5lYWNoKFA5KX0sYXBwZW5kOmZ1bmN0aW9uIHY4KHQpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6VTYodCk7cmV0dXJuIHRoaXMuc2VsZWN0KChmdW5jdGlvbigpe3JldHVybiB0aGlzLmFwcGVuZENoaWxkKGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0pKX0saW5zZXJ0OmZ1bmN0aW9uIGI4KHQsZSl7dmFyIG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpVNih0KSxpPW51bGw9PWU/Tjk6ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpHNihlKTtyZXR1cm4gdGhpcy5zZWxlY3QoKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpLGkuYXBwbHkodGhpcyxhcmd1bWVudHMpfHxudWxsKX0pKX0scmVtb3ZlOmZ1bmN0aW9uIHg4KCl7cmV0dXJuIHRoaXMuZWFjaChJOSl9LGNsb25lOmZ1bmN0aW9uIHc4KHQpe3JldHVybiB0aGlzLnNlbGVjdCh0P085OlI5KX0sZGF0dW06ZnVuY3Rpb24gUzgodCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iLHQpOnRoaXMubm9kZSgpLl9fZGF0YV9ffSxvbjpmdW5jdGlvbiBNOCh0LGUsbil7dmFyIGkscixvPUY5KHQrIiIpLGE9by5sZW5ndGg7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtmb3Iocz1lP1U5OlY5LG51bGw9PW4mJihuPSExKSxpPTA7aTxhOysraSl0aGlzLmVhY2gocyhvW2ldLGUsbikpO3JldHVybiB0aGlzfXZhciBzPXRoaXMubm9kZSgpLl9fb247aWYocylmb3IodmFyIGwsYz0wLHU9cy5sZW5ndGg7Yzx1OysrYylmb3IoaT0wLGw9c1tjXTtpPGE7KytpKWlmKChyPW9baV0pLnR5cGU9PT1sLnR5cGUmJnIubmFtZT09PWwubmFtZSlyZXR1cm4gbC52YWx1ZX0sZGlzcGF0Y2g6ZnVuY3Rpb24gRTgodCxlKXtyZXR1cm4gdGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgZT9XOTpHOSkodCxlKSl9fTt2YXIgVDg9MDtmdW5jdGlvbiBDOCgpe3JldHVybiBuZXcgQTh9ZnVuY3Rpb24gQTgoKXt0aGlzLl89IkAiKygrK1Q4KS50b1N0cmluZygzNil9ZnVuY3Rpb24gazgoKXtmb3IodmFyIHQsZT1EOTt0PWUuc291cmNlRXZlbnQ7KWU9dDtyZXR1cm4gZX1mdW5jdGlvbiBMOCh0LGUpe3ZhciBuPXQub3duZXJTVkdFbGVtZW50fHx0O2lmKG4uY3JlYXRlU1ZHUG9pbnQpe3ZhciBpPW4uY3JlYXRlU1ZHUG9pbnQoKTtyZXR1cm4gaS54PWUuY2xpZW50WCxpLnk9ZS5jbGllbnRZLFsoaT1pLm1hdHJpeFRyYW5zZm9ybSh0LmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSkpLngsaS55XX12YXIgcj10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybltlLmNsaWVudFgtci5sZWZ0LXQuY2xpZW50TGVmdCxlLmNsaWVudFktci50b3AtdC5jbGllbnRUb3BdfUE4LnByb3RvdHlwZT1DOC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkE4LGdldDpmdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5fOyEoZSBpbiB0KTspaWYoISh0PXQucGFyZW50Tm9kZSkpcmV0dXJuO3JldHVybiB0W2VdfSxzZXQ6ZnVuY3Rpb24odCxlKXtyZXR1cm4gdFt0aGlzLl9dPWV9LHJlbW92ZTpmdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fIGluIHQmJmRlbGV0ZSB0W3RoaXMuX119LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX319O3ZhciBQOD1NYXRoLlBJLE44PTIqUDgsSTg9MWUtNixSOD1OOC1JODtmdW5jdGlvbiBPOCgpe3RoaXMuX3gwPXRoaXMuX3kwPXRoaXMuX3gxPXRoaXMuX3kxPW51bGwsdGhpcy5fPSIifWZ1bmN0aW9uIHo4KCl7cmV0dXJuIG5ldyBPOH1mdW5jdGlvbiBEOCh0KXtyZXR1cm4gZnVuY3Rpb24gZSgpe3JldHVybiB0fX1POC5wcm90b3R5cGU9ejgucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpPOCxtb3ZlVG86ZnVuY3Rpb24odCxlKXt0aGlzLl8rPSJNIisodGhpcy5feDA9dGhpcy5feDE9K3QpKyIsIisodGhpcy5feTA9dGhpcy5feTE9K2UpfSxjbG9zZVBhdGg6ZnVuY3Rpb24oKXtudWxsIT09dGhpcy5feDEmJih0aGlzLl94MT10aGlzLl94MCx0aGlzLl95MT10aGlzLl95MCx0aGlzLl8rPSJaIil9LGxpbmVUbzpmdW5jdGlvbih0LGUpe3RoaXMuXys9IkwiKyh0aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MT0rZSl9LHF1YWRyYXRpY0N1cnZlVG86ZnVuY3Rpb24odCxlLG4saSl7dGhpcy5fKz0iUSIrICt0KyIsIisgK2UrIiwiKyh0aGlzLl94MT0rbikrIiwiKyh0aGlzLl95MT0raSl9LGJlemllckN1cnZlVG86ZnVuY3Rpb24odCxlLG4saSxyLG8pe3RoaXMuXys9IkMiKyArdCsiLCIrICtlKyIsIisgK24rIiwiKyAraSsiLCIrKHRoaXMuX3gxPStyKSsiLCIrKHRoaXMuX3kxPStvKX0sYXJjVG86ZnVuY3Rpb24odCxlLG4saSxyKXt2YXIgbz10aGlzLl94MSxhPXRoaXMuX3kxLHM9KG49K24pLSh0PSt0KSxsPShpPStpKS0oZT0rZSksYz1vLXQsdT1hLWUsaD1jKmMrdSp1O2lmKChyPStyKTwwKXRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzOiAiK3IpO2lmKG51bGw9PT10aGlzLl94MSl0aGlzLl8rPSJNIisodGhpcy5feDE9dCkrIiwiKyh0aGlzLl95MT1lKTtlbHNlIGlmKGg+STgpaWYoTWF0aC5hYnModSpzLWwqYyk+STgmJnIpe3ZhciBkPW4tbyxwPWktYSxmPXMqcytsKmwsbT1kKmQrcCpwLGc9TWF0aC5zcXJ0KGYpLF89TWF0aC5zcXJ0KGgpLHk9cipNYXRoLnRhbigoUDgtTWF0aC5hY29zKChmK2gtbSkvKDIqZypfKSkpLzIpLHY9eS9fLGI9eS9nO01hdGguYWJzKHYtMSk+STgmJih0aGlzLl8rPSJMIisodCt2KmMpKyIsIisoZSt2KnUpKSx0aGlzLl8rPSJBIityKyIsIityKyIsMCwwLCIrICsodSpkPmMqcCkrIiwiKyh0aGlzLl94MT10K2IqcykrIiwiKyh0aGlzLl95MT1lK2IqbCl9ZWxzZSB0aGlzLl8rPSJMIisodGhpcy5feDE9dCkrIiwiKyh0aGlzLl95MT1lKTtlbHNlO30sYXJjOmZ1bmN0aW9uKHQsZSxuLGkscixvKXt0PSt0LGU9K2Usbz0hIW87dmFyIGE9KG49K24pKk1hdGguY29zKGkpLHM9bipNYXRoLnNpbihpKSxsPXQrYSxjPWUrcyx1PTFebyxoPW8/aS1yOnItaTtpZihuPDApdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXM6ICIrbik7bnVsbD09PXRoaXMuX3gxP3RoaXMuXys9Ik0iK2wrIiwiK2M6KE1hdGguYWJzKHRoaXMuX3gxLWwpPkk4fHxNYXRoLmFicyh0aGlzLl95MS1jKT5JOCkmJih0aGlzLl8rPSJMIitsKyIsIitjKSxuJiYoaDwwJiYoaD1oJU44K044KSxoPlI4P3RoaXMuXys9IkEiK24rIiwiK24rIiwwLDEsIit1KyIsIisodC1hKSsiLCIrKGUtcykrIkEiK24rIiwiK24rIiwwLDEsIit1KyIsIisodGhpcy5feDE9bCkrIiwiKyh0aGlzLl95MT1jKTpoPkk4JiYodGhpcy5fKz0iQSIrbisiLCIrbisiLDAsIisgKyhoPj1QOCkrIiwiK3UrIiwiKyh0aGlzLl94MT10K24qTWF0aC5jb3MocikpKyIsIisodGhpcy5feTE9ZStuKk1hdGguc2luKHIpKSkpfSxyZWN0OmZ1bmN0aW9uKHQsZSxuLGkpe3RoaXMuXys9Ik0iKyh0aGlzLl94MD10aGlzLl94MT0rdCkrIiwiKyh0aGlzLl95MD10aGlzLl95MT0rZSkrImgiKyArbisidiIrICtpKyJoIistbisiWiJ9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX319O3ZhciBCOD1NYXRoLmFicyxIOD1NYXRoLmF0YW4yLEY4PU1hdGguY29zLFY4PU1hdGgubWF4LFU4PU1hdGgubWluLGo4PU1hdGguc2luLEc4PU1hdGguc3FydCxXOD0xZS0xMixxOD1NYXRoLlBJLFk4PXE4LzIsWDg9MipxODtmdW5jdGlvbiAkOCh0KXtyZXR1cm4gdD4xPzA6dDwtMT9xODpNYXRoLmFjb3ModCl9ZnVuY3Rpb24gSzgodCl7cmV0dXJuIHQ+PTE/WTg6dDw9LTE/LVk4Ok1hdGguYXNpbih0KX1mdW5jdGlvbiBaOCh0KXtyZXR1cm4gdC5pbm5lclJhZGl1c31mdW5jdGlvbiBKOCh0KXtyZXR1cm4gdC5vdXRlclJhZGl1c31mdW5jdGlvbiBROCh0KXtyZXR1cm4gdC5zdGFydEFuZ2xlfWZ1bmN0aW9uIHQ3KHQpe3JldHVybiB0LmVuZEFuZ2xlfWZ1bmN0aW9uIGU3KHQpe3JldHVybiB0JiZ0LnBhZEFuZ2xlfWZ1bmN0aW9uIG43KHQsZSxuLGkscixvLGEscyl7dmFyIGw9bi10LGM9aS1lLHU9YS1yLGg9cy1vLGQ9KHUqKGUtbyktaCoodC1yKSkvKGgqbC11KmMpO3JldHVyblt0K2QqbCxlK2QqY119ZnVuY3Rpb24gaTcodCxlLG4saSxyLG8sYSl7dmFyIHM9dC1uLGw9ZS1pLGM9KGE/bzotbykvRzgocypzK2wqbCksdT1jKmwsaD0tYypzLGQ9dCt1LHA9ZStoLGY9bit1LG09aStoLGc9KGQrZikvMixfPShwK20pLzIseT1mLWQsdj1tLXAsYj15Knkrdip2LHg9ci1vLHc9ZCptLWYqcCxTPSh2PDA/LTE6MSkqRzgoVjgoMCx4KngqYi13KncpKSxNPSh3KnYteSpTKS9iLEU9KC13KnktdipTKS9iLFQ9KHcqdit5KlMpL2IsQz0oLXcqeSt2KlMpL2IsQT1NLWcsaz1FLV8sTD1ULWcsUD1DLV87cmV0dXJuIEEqQStrKms+TCpMK1AqUCYmKE09VCxFPUMpLHtjeDpNLGN5OkUseDAxOi11LHkwMTotaCx4MTE6TSooci94LTEpLHkxMTpFKihyL3gtMSl9fWZ1bmN0aW9uIHI3KHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiBvNyh0KXtyZXR1cm4gbmV3IHI3KHQpfWZ1bmN0aW9uIGE3KHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIHM3KHQpe3JldHVybiB0WzFdfWZ1bmN0aW9uIGw3KCl7dmFyIHQ9YTcsZT1zNyxuPUQ4KCEwKSxpPW51bGwscj1vNyxvPW51bGw7ZnVuY3Rpb24gYShhKXt2YXIgcyxsLGMsdT1hLmxlbmd0aCxoPSExO2ZvcihudWxsPT1pJiYobz1yKGM9ejgoKSkpLHM9MDtzPD11OysrcykhKHM8dSYmbihsPWFbc10scyxhKSk9PT1oJiYoKGg9IWgpP28ubGluZVN0YXJ0KCk6by5saW5lRW5kKCkpLGgmJm8ucG9pbnQoK3QobCxzLGEpLCtlKGwscyxhKSk7aWYoYylyZXR1cm4gbz1udWxsLGMrIiJ8fG51bGx9cmV0dXJuIGEueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOkQ4KCtlKSxhKTp0fSxhLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpEOCgrdCksYSk6ZX0sYS5kZWZpbmVkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RDgoISF0KSxhKTpufSxhLmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPXQsbnVsbCE9aSYmKG89cihpKSksYSk6cn0sYS5jb250ZXh0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhudWxsPT10P2k9bz1udWxsOm89cihpPXQpLGEpOml9LGF9ZnVuY3Rpb24gYzcoKXt2YXIgdD1hNyxlPW51bGwsbj1EOCgwKSxpPXM3LHI9RDgoITApLG89bnVsbCxhPW83LHM9bnVsbDtmdW5jdGlvbiBsKGwpe3ZhciBjLHUsaCxkLHAsZj1sLmxlbmd0aCxtPSExLGc9bmV3IEFycmF5KGYpLF89bmV3IEFycmF5KGYpO2ZvcihudWxsPT1vJiYocz1hKHA9ejgoKSkpLGM9MDtjPD1mOysrYyl7aWYoIShjPGYmJnIoZD1sW2NdLGMsbCkpPT09bSlpZihtPSFtKXU9YyxzLmFyZWFTdGFydCgpLHMubGluZVN0YXJ0KCk7ZWxzZXtmb3Iocy5saW5lRW5kKCkscy5saW5lU3RhcnQoKSxoPWMtMTtoPj11Oy0taClzLnBvaW50KGdbaF0sX1toXSk7cy5saW5lRW5kKCkscy5hcmVhRW5kKCl9bSYmKGdbY109K3QoZCxjLGwpLF9bY109K24oZCxjLGwpLHMucG9pbnQoZT8rZShkLGMsbCk6Z1tjXSxpPytpKGQsYyxsKTpfW2NdKSl9aWYocClyZXR1cm4gcz1udWxsLHArIiJ8fG51bGx9ZnVuY3Rpb24gYygpe3JldHVybiBsNygpLmRlZmluZWQocikuY3VydmUoYSkuY29udGV4dChvKX1yZXR1cm4gbC54PWZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBuP246RDgoK24pLGU9bnVsbCxsKTp0fSxsLngwPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6RDgoK2UpLGwpOnR9LGwueDE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bnVsbD09dD9udWxsOiJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RDgoK3QpLGwpOmV9LGwueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkQ4KCt0KSxpPW51bGwsbCk6bn0sbC55MD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkQ4KCt0KSxsKTpufSxsLnkxPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGw9PXQ/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OkQ4KCt0KSxsKTppfSxsLmxpbmVYMD1sLmxpbmVZMD1mdW5jdGlvbigpe3JldHVybiBjKCkueCh0KS55KG4pfSxsLmxpbmVZMT1mdW5jdGlvbigpe3JldHVybiBjKCkueCh0KS55KGkpfSxsLmxpbmVYMT1mdW5jdGlvbigpe3JldHVybiBjKCkueChlKS55KG4pfSxsLmRlZmluZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpEOCghIXQpLGwpOnJ9LGwuY3VydmU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9dCxudWxsIT1vJiYocz1hKG8pKSxsKTphfSxsLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/bz1zPW51bGw6cz1hKG89dCksbCk6b30sbH1mdW5jdGlvbiB1Nyh0LGUpe3JldHVybiBlPHQ/LTE6ZT50PzE6ZT49dD8wOk5hTn1mdW5jdGlvbiBoNyh0KXtyZXR1cm4gdH1yNy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LGUpe3N3aXRjaCh0PSt0LGU9K2UsdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxlKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LGUpO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2RlZmF1bHQ6dGhpcy5fY29udGV4dC5saW5lVG8odCxlKX19fTt2YXIgZDc9ZjcobzcpO2Z1bmN0aW9uIHA3KHQpe3RoaXMuX2N1cnZlPXR9ZnVuY3Rpb24gZjcodCl7ZnVuY3Rpb24gZShlKXtyZXR1cm4gbmV3IHA3KHQoZSkpfXJldHVybiBlLl9jdXJ2ZT10LGV9ZnVuY3Rpb24gbTcodCl7dmFyIGU9dC5jdXJ2ZTtyZXR1cm4gdC5hbmdsZT10LngsZGVsZXRlIHQueCx0LnJhZGl1cz10LnksZGVsZXRlIHQueSx0LmN1cnZlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP2UoZjcodCkpOmUoKS5fY3VydmV9LHR9ZnVuY3Rpb24gZzcoKXtyZXR1cm4gbTcobDcoKS5jdXJ2ZShkNykpfWZ1bmN0aW9uIF83KCl7dmFyIHQ9YzcoKS5jdXJ2ZShkNyksZT10LmN1cnZlLG49dC5saW5lWDAsaT10LmxpbmVYMSxyPXQubGluZVkwLG89dC5saW5lWTE7cmV0dXJuIHQuYW5nbGU9dC54LGRlbGV0ZSB0LngsdC5zdGFydEFuZ2xlPXQueDAsZGVsZXRlIHQueDAsdC5lbmRBbmdsZT10LngxLGRlbGV0ZSB0LngxLHQucmFkaXVzPXQueSxkZWxldGUgdC55LHQuaW5uZXJSYWRpdXM9dC55MCxkZWxldGUgdC55MCx0Lm91dGVyUmFkaXVzPXQueTEsZGVsZXRlIHQueTEsdC5saW5lU3RhcnRBbmdsZT1mdW5jdGlvbigpe3JldHVybiBtNyhuKCkpfSxkZWxldGUgdC5saW5lWDAsdC5saW5lRW5kQW5nbGU9ZnVuY3Rpb24oKXtyZXR1cm4gbTcoaSgpKX0sZGVsZXRlIHQubGluZVgxLHQubGluZUlubmVyUmFkaXVzPWZ1bmN0aW9uKCl7cmV0dXJuIG03KHIoKSl9LGRlbGV0ZSB0LmxpbmVZMCx0LmxpbmVPdXRlclJhZGl1cz1mdW5jdGlvbigpe3JldHVybiBtNyhvKCkpfSxkZWxldGUgdC5saW5lWTEsdC5jdXJ2ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD9lKGY3KHQpKTplKCkuX2N1cnZlfSx0fWZ1bmN0aW9uIHk3KHQsZSl7cmV0dXJuWyhlPStlKSpNYXRoLmNvcyh0LT1NYXRoLlBJLzIpLGUqTWF0aC5zaW4odCldfXA3LnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUuYXJlYVN0YXJ0KCl9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9jdXJ2ZS5hcmVhRW5kKCl9LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX2N1cnZlLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dGhpcy5fY3VydmUubGluZUVuZCgpfSxwb2ludDpmdW5jdGlvbih0LGUpe3RoaXMuX2N1cnZlLnBvaW50KGUqTWF0aC5zaW4odCksZSotTWF0aC5jb3ModCkpfX07dmFyIHY3PUFycmF5LnByb3RvdHlwZS5zbGljZTtmdW5jdGlvbiBiNyh0KXtyZXR1cm4gdC5zb3VyY2V9ZnVuY3Rpb24geDcodCl7cmV0dXJuIHQudGFyZ2V0fWZ1bmN0aW9uIHc3KHQpe3ZhciBlPWI3LG49eDcsaT1hNyxyPXM3LG89bnVsbDtmdW5jdGlvbiBhKCl7dmFyIGEscz12Ny5jYWxsKGFyZ3VtZW50cyksbD1lLmFwcGx5KHRoaXMscyksYz1uLmFwcGx5KHRoaXMscyk7aWYob3x8KG89YT16OCgpKSx0KG8sK2kuYXBwbHkodGhpcywoc1swXT1sLHMpKSwrci5hcHBseSh0aGlzLHMpLCtpLmFwcGx5KHRoaXMsKHNbMF09YyxzKSksK3IuYXBwbHkodGhpcyxzKSksYSlyZXR1cm4gbz1udWxsLGErIiJ8fG51bGx9cmV0dXJuIGEuc291cmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPXQsYSk6ZX0sYS50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxhKTpufSxhLng9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpEOCgrdCksYSk6aX0sYS55PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RDgoK3QpLGEpOnJ9LGEuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz1udWxsPT10P251bGw6dCxhKTpvfSxhfWZ1bmN0aW9uIFM3KHQsZSxuLGkscil7dC5tb3ZlVG8oZSxuKSx0LmJlemllckN1cnZlVG8oZT0oZStpKS8yLG4sZSxyLGkscil9ZnVuY3Rpb24gTTcodCxlLG4saSxyKXt0Lm1vdmVUbyhlLG4pLHQuYmV6aWVyQ3VydmVUbyhlLG49KG4rcikvMixpLG4saSxyKX1mdW5jdGlvbiBFNyh0LGUsbixpLHIpe3ZhciBvPXk3KGUsbiksYT15NyhlLG49KG4rcikvMikscz15NyhpLG4pLGw9eTcoaSxyKTt0Lm1vdmVUbyhvWzBdLG9bMV0pLHQuYmV6aWVyQ3VydmVUbyhhWzBdLGFbMV0sc1swXSxzWzFdLGxbMF0sbFsxXSl9dmFyIFQ3PXtkcmF3OmZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5zcXJ0KGUvcTgpO3QubW92ZVRvKG4sMCksdC5hcmMoMCwwLG4sMCxYOCl9fSxDNz17ZHJhdzpmdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguc3FydChlLzUpLzI7dC5tb3ZlVG8oLTMqbiwtbiksdC5saW5lVG8oLW4sLW4pLHQubGluZVRvKC1uLC0zKm4pLHQubGluZVRvKG4sLTMqbiksdC5saW5lVG8obiwtbiksdC5saW5lVG8oMypuLC1uKSx0LmxpbmVUbygzKm4sbiksdC5saW5lVG8obixuKSx0LmxpbmVUbyhuLDMqbiksdC5saW5lVG8oLW4sMypuKSx0LmxpbmVUbygtbixuKSx0LmxpbmVUbygtMypuLG4pLHQuY2xvc2VQYXRoKCl9fSxBNz1NYXRoLnNxcnQoMS8zKSxrNz0yKkE3LEw3PXtkcmF3OmZ1bmN0aW9uKHQsZSl7dmFyIG49TWF0aC5zcXJ0KGUvazcpLGk9bipBNzt0Lm1vdmVUbygwLC1uKSx0LmxpbmVUbyhpLDApLHQubGluZVRvKDAsbiksdC5saW5lVG8oLWksMCksdC5jbG9zZVBhdGgoKX19LFA3PU1hdGguc2luKHE4LzEwKS9NYXRoLnNpbig3KnE4LzEwKSxONz1NYXRoLnNpbihYOC8xMCkqUDcsSTc9LU1hdGguY29zKFg4LzEwKSpQNyxSNz17ZHJhdzpmdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguc3FydCguODkwODEzMDkxNTI5Mjg1MiplKSxpPU43Km4scj1JNypuO3QubW92ZVRvKDAsLW4pLHQubGluZVRvKGkscik7Zm9yKHZhciBvPTE7bzw1Oysrbyl7dmFyIGE9WDgqby81LHM9TWF0aC5jb3MoYSksbD1NYXRoLnNpbihhKTt0LmxpbmVUbyhsKm4sLXMqbiksdC5saW5lVG8ocyppLWwqcixsKmkrcypyKX10LmNsb3NlUGF0aCgpfX0sTzc9e2RyYXc6ZnVuY3Rpb24odCxlKXt2YXIgbj1NYXRoLnNxcnQoZSksaT0tbi8yO3QucmVjdChpLGksbixuKX19LHo3PU1hdGguc3FydCgzKSxENz17ZHJhdzpmdW5jdGlvbih0LGUpe3ZhciBuPS1NYXRoLnNxcnQoZS8oMyp6NykpO3QubW92ZVRvKDAsMipuKSx0LmxpbmVUbygtejcqbiwtbiksdC5saW5lVG8oejcqbiwtbiksdC5jbG9zZVBhdGgoKX19LEI3PS0uNSxINz1NYXRoLnNxcnQoMykvMixGNz0xL01hdGguc3FydCgxMiksVjc9MyooRjcvMisxKSxVNz17ZHJhdzpmdW5jdGlvbih0LGUpe3ZhciBuPU1hdGguc3FydChlL1Y3KSxpPW4vMixyPW4qRjcsbz1pLGE9bipGNytuLHM9LW8sbD1hO3QubW92ZVRvKGksciksdC5saW5lVG8obyxhKSx0LmxpbmVUbyhzLGwpLHQubGluZVRvKEI3KmktSDcqcixINyppK0I3KnIpLHQubGluZVRvKEI3Km8tSDcqYSxINypvK0I3KmEpLHQubGluZVRvKEI3KnMtSDcqbCxINypzK0I3KmwpLHQubGluZVRvKEI3KmkrSDcqcixCNypyLUg3KmkpLHQubGluZVRvKEI3Km8rSDcqYSxCNyphLUg3Km8pLHQubGluZVRvKEI3KnMrSDcqbCxCNypsLUg3KnMpLHQuY2xvc2VQYXRoKCl9fSxqNz1bVDcsQzcsTDcsTzcsUjcsRDcsVTddO2Z1bmN0aW9uIEc3KCl7fWZ1bmN0aW9uIFc3KHQsZSxuKXt0Ll9jb250ZXh0LmJlemllckN1cnZlVG8oKDIqdC5feDArdC5feDEpLzMsKDIqdC5feTArdC5feTEpLzMsKHQuX3gwKzIqdC5feDEpLzMsKHQuX3kwKzIqdC5feTEpLzMsKHQuX3gwKzQqdC5feDErZSkvNiwodC5feTArNCp0Ll95MStuKS82KX1mdW5jdGlvbiBxNyh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gWTcodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIFg3KHQpe3RoaXMuX2NvbnRleHQ9dH1mdW5jdGlvbiAkNyh0LGUpe3RoaXMuX2Jhc2lzPW5ldyBxNyh0KSx0aGlzLl9iZXRhPWV9cTcucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feTA9dGhpcy5feTE9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMzpXNyh0aGlzLHRoaXMuX3gxLHRoaXMuX3kxKTtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDEsdGhpcy5feTEpfSh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxlKXtzd2l0Y2godD0rdCxlPStlLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl9saW5lP3RoaXMuX2NvbnRleHQubGluZVRvKHQsZSk6dGhpcy5fY29udGV4dC5tb3ZlVG8odCxlKTticmVhaztjYXNlIDE6dGhpcy5fcG9pbnQ9MjticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9Myx0aGlzLl9jb250ZXh0LmxpbmVUbygoNSp0aGlzLl94MCt0aGlzLl94MSkvNiwoNSp0aGlzLl95MCt0aGlzLl95MSkvNik7ZGVmYXVsdDpXNyh0aGlzLHQsZSl9dGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT1lfX0sWTcucHJvdG90eXBlPXthcmVhU3RhcnQ6RzcsYXJlYUVuZDpHNyxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl94Mz10aGlzLl94ND10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj10aGlzLl95Mz10aGlzLl95ND1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAxOnRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLHRoaXMuX3kyKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMjp0aGlzLl9jb250ZXh0Lm1vdmVUbygodGhpcy5feDIrMip0aGlzLl94MykvMywodGhpcy5feTIrMip0aGlzLl95MykvMyksdGhpcy5fY29udGV4dC5saW5lVG8oKHRoaXMuX3gzKzIqdGhpcy5feDIpLzMsKHRoaXMuX3kzKzIqdGhpcy5feTIpLzMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDIsdGhpcy5feTIpLHRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpfX0scG9pbnQ6ZnVuY3Rpb24odCxlKXtzd2l0Y2godD0rdCxlPStlLHRoaXMuX3BvaW50KXtjYXNlIDA6dGhpcy5fcG9pbnQ9MSx0aGlzLl94Mj10LHRoaXMuX3kyPWU7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTIsdGhpcy5feDM9dCx0aGlzLl95Mz1lO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLHRoaXMuX3g0PXQsdGhpcy5feTQ9ZSx0aGlzLl9jb250ZXh0Lm1vdmVUbygodGhpcy5feDArNCp0aGlzLl94MSt0KS82LCh0aGlzLl95MCs0KnRoaXMuX3kxK2UpLzYpO2JyZWFrO2RlZmF1bHQ6VzcodGhpcyx0LGUpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9ZX19LFg3LnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3kwPXRoaXMuX3kxPU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYzPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LGUpe3N3aXRjaCh0PSt0LGU9K2UsdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zO3ZhciBuPSh0aGlzLl94MCs0KnRoaXMuX3gxK3QpLzYsaT0odGhpcy5feTArNCp0aGlzLl95MStlKS82O3RoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8obixpKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyhuLGkpO2JyZWFrO2Nhc2UgMzp0aGlzLl9wb2ludD00O2RlZmF1bHQ6VzcodGhpcyx0LGUpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9ZX19LCQ3LnByb3RvdHlwZT17bGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feD1bXSx0aGlzLl95PVtdLHRoaXMuX2Jhc2lzLmxpbmVTdGFydCgpfSxsaW5lRW5kOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5feCxlPXRoaXMuX3ksbj10Lmxlbmd0aC0xO2lmKG4+MClmb3IodmFyIGkscj10WzBdLG89ZVswXSxhPXRbbl0tcixzPWVbbl0tbyxsPS0xOysrbDw9bjspdGhpcy5fYmFzaXMucG9pbnQodGhpcy5fYmV0YSp0W2xdKygxLXRoaXMuX2JldGEpKihyKyhpPWwvbikqYSksdGhpcy5fYmV0YSplW2xdKygxLXRoaXMuX2JldGEpKihvK2kqcykpO3RoaXMuX3g9dGhpcy5feT1udWxsLHRoaXMuX2Jhc2lzLmxpbmVFbmQoKX0scG9pbnQ6ZnVuY3Rpb24odCxlKXt0aGlzLl94LnB1c2goK3QpLHRoaXMuX3kucHVzaCgrZSl9fTt2YXIgSzc9KGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gMT09PWU/bmV3IHE3KHQpOm5ldyAkNyh0LGUpfXJldHVybiBuLmJldGE9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoK2UpfSxufSkoLjg1KTtmdW5jdGlvbiBaNyh0LGUsbil7dC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHQuX3gxK3QuX2sqKHQuX3gyLXQuX3gwKSx0Ll95MSt0Ll9rKih0Ll95Mi10Ll95MCksdC5feDIrdC5fayoodC5feDEtZSksdC5feTIrdC5fayoodC5feTEtbiksdC5feDIsdC5feTIpfWZ1bmN0aW9uIEo3KHQsZSl7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtZSkvNn1KNy5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3N3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLHRoaXMuX3kyKTticmVhaztjYXNlIDM6WjcodGhpcyx0aGlzLl94MSx0aGlzLl95MSl9KHRoaXMuX2xpbmV8fDAhPT10aGlzLl9saW5lJiYxPT09dGhpcy5fcG9pbnQpJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lfSxwb2ludDpmdW5jdGlvbih0LGUpe3N3aXRjaCh0PSt0LGU9K2UsdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxlKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LGUpO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX3gxPXQsdGhpcy5feTE9ZTticmVhaztjYXNlIDI6dGhpcy5fcG9pbnQ9MztkZWZhdWx0Olo3KHRoaXMsdCxlKX10aGlzLl94MD10aGlzLl94MSx0aGlzLl94MT10aGlzLl94Mix0aGlzLl94Mj10LHRoaXMuX3kwPXRoaXMuX3kxLHRoaXMuX3kxPXRoaXMuX3kyLHRoaXMuX3kyPWV9fTt2YXIgUTc9KGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gbmV3IEo3KHQsZSl9cmV0dXJuIG4udGVuc2lvbj1mdW5jdGlvbihlKXtyZXR1cm4gdCgrZSl9LG59KSgwKTtmdW5jdGlvbiB0dHQodCxlKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5faz0oMS1lKS82fXR0dC5wcm90b3R5cGU9e2FyZWFTdGFydDpHNyxhcmVhRW5kOkc3LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3gzPXRoaXMuX3g0PXRoaXMuX3g1PXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPXRoaXMuX3kzPXRoaXMuX3k0PXRoaXMuX3k1PU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDE6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAyOnRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gzLHRoaXMuX3kzKSx0aGlzLnBvaW50KHRoaXMuX3g0LHRoaXMuX3k0KSx0aGlzLnBvaW50KHRoaXMuX3g1LHRoaXMuX3k1KX19LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHQ9K3QsZT0rZSx0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDM9dCx0aGlzLl95Mz1lO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0PXQsdGhpcy5feTQ9ZSk7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDU9dCx0aGlzLl95NT1lO2JyZWFrO2RlZmF1bHQ6WjcodGhpcyx0LGUpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9ZX19O3ZhciBldHQ9KGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gbmV3IHR0dCh0LGUpfXJldHVybiBuLnRlbnNpb249ZnVuY3Rpb24oZSl7cmV0dXJuIHQoK2UpfSxufSkoMCk7ZnVuY3Rpb24gbnR0KHQsZSl7dGhpcy5fY29udGV4dD10LHRoaXMuX2s9KDEtZSkvNn1udHQucHJvdG90eXBlPXthcmVhU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPTB9LGFyZWFFbmQ6ZnVuY3Rpb24oKXt0aGlzLl9saW5lPU5hTn0sbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXsodGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjM9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsZSl7c3dpdGNoKHQ9K3QsZT0rZSx0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Mix0aGlzLl95Mik6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzp0aGlzLl9wb2ludD00O2RlZmF1bHQ6WjcodGhpcyx0LGUpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXRoaXMuX3gyLHRoaXMuX3gyPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9dGhpcy5feTIsdGhpcy5feTI9ZX19O3ZhciBpdHQ9KGZ1bmN0aW9uIHQoZSl7ZnVuY3Rpb24gbih0KXtyZXR1cm4gbmV3IG50dCh0LGUpfXJldHVybiBuLnRlbnNpb249ZnVuY3Rpb24oZSl7cmV0dXJuIHQoK2UpfSxufSkoMCk7ZnVuY3Rpb24gcnR0KHQsZSxuKXt2YXIgaT10Ll94MSxyPXQuX3kxLG89dC5feDIsYT10Ll95MjtpZih0Ll9sMDFfYT5XOCl7dmFyIHM9Mip0Ll9sMDFfMmErMyp0Ll9sMDFfYSp0Ll9sMTJfYSt0Ll9sMTJfMmEsbD0zKnQuX2wwMV9hKih0Ll9sMDFfYSt0Ll9sMTJfYSk7aT0oaSpzLXQuX3gwKnQuX2wxMl8yYSt0Ll94Mip0Ll9sMDFfMmEpL2wscj0ocipzLXQuX3kwKnQuX2wxMl8yYSt0Ll95Mip0Ll9sMDFfMmEpL2x9aWYodC5fbDIzX2E+Vzgpe3ZhciBjPTIqdC5fbDIzXzJhKzMqdC5fbDIzX2EqdC5fbDEyX2ErdC5fbDEyXzJhLHU9Myp0Ll9sMjNfYSoodC5fbDIzX2ErdC5fbDEyX2EpO289KG8qYyt0Ll94MSp0Ll9sMjNfMmEtZSp0Ll9sMTJfMmEpL3UsYT0oYSpjK3QuX3kxKnQuX2wyM18yYS1uKnQuX2wxMl8yYSkvdX10Ll9jb250ZXh0LmJlemllckN1cnZlVG8oaSxyLG8sYSx0Ll94Mix0Ll95Mil9ZnVuY3Rpb24gb3R0KHQsZSl7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPWV9b3R0LnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3gyPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3kyPU5hTix0aGlzLl9sMDFfYT10aGlzLl9sMTJfYT10aGlzLl9sMjNfYT10aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhPXRoaXMuX2wyM18yYT10aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzp0aGlzLnBvaW50KHRoaXMuX3gyLHRoaXMuX3kyKX0odGhpcy5fbGluZXx8MCE9PXRoaXMuX2xpbmUmJjE9PT10aGlzLl9wb2ludCkmJnRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCksdGhpcy5fbGluZT0xLXRoaXMuX2xpbmV9LHBvaW50OmZ1bmN0aW9uKHQsZSl7aWYodD0rdCxlPStlLHRoaXMuX3BvaW50KXt2YXIgbj10aGlzLl94Mi10LGk9dGhpcy5feTItZTt0aGlzLl9sMjNfYT1NYXRoLnNxcnQodGhpcy5fbDIzXzJhPU1hdGgucG93KG4qbitpKmksdGhpcy5fYWxwaGEpKX1zd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxlKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LGUpO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zO2RlZmF1bHQ6cnR0KHRoaXMsdCxlKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1lfX07dmFyIGF0dD0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiBlP25ldyBvdHQodCxlKTpuZXcgSjcodCwwKX1yZXR1cm4gbi5hbHBoYT1mdW5jdGlvbihlKXtyZXR1cm4gdCgrZSl9LG59KSguNSk7ZnVuY3Rpb24gc3R0KHQsZSl7dGhpcy5fY29udGV4dD10LHRoaXMuX2FscGhhPWV9c3R0LnByb3RvdHlwZT17YXJlYVN0YXJ0Okc3LGFyZWFFbmQ6RzcsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5feDA9dGhpcy5feDE9dGhpcy5feDI9dGhpcy5feDM9dGhpcy5feDQ9dGhpcy5feDU9dGhpcy5feTA9dGhpcy5feTE9dGhpcy5feTI9dGhpcy5feTM9dGhpcy5feTQ9dGhpcy5feTU9TmFOLHRoaXMuX2wwMV9hPXRoaXMuX2wxMl9hPXRoaXMuX2wyM19hPXRoaXMuX2wwMV8yYT10aGlzLl9sMTJfMmE9dGhpcy5fbDIzXzJhPXRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94Myx0aGlzLl95MyksdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTticmVhaztjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsdGhpcy5feTMpLHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7YnJlYWs7Y2FzZSAzOnRoaXMucG9pbnQodGhpcy5feDMsdGhpcy5feTMpLHRoaXMucG9pbnQodGhpcy5feDQsdGhpcy5feTQpLHRoaXMucG9pbnQodGhpcy5feDUsdGhpcy5feTUpfX0scG9pbnQ6ZnVuY3Rpb24odCxlKXtpZih0PSt0LGU9K2UsdGhpcy5fcG9pbnQpe3ZhciBuPXRoaXMuX3gyLXQsaT10aGlzLl95Mi1lO3RoaXMuX2wyM19hPU1hdGguc3FydCh0aGlzLl9sMjNfMmE9TWF0aC5wb3cobipuK2kqaSx0aGlzLl9hbHBoYSkpfXN3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTEsdGhpcy5feDM9dCx0aGlzLl95Mz1lO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yLHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0PXQsdGhpcy5feTQ9ZSk7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5feDU9dCx0aGlzLl95NT1lO2JyZWFrO2RlZmF1bHQ6cnR0KHRoaXMsdCxlKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1lfX07dmFyIGx0dD0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiBlP25ldyBzdHQodCxlKTpuZXcgdHR0KHQsMCl9cmV0dXJuIG4uYWxwaGE9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoK2UpfSxufSkoLjUpO2Z1bmN0aW9uIGN0dCh0LGUpe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl9hbHBoYT1lfWN0dC5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94MD10aGlzLl94MT10aGlzLl94Mj10aGlzLl95MD10aGlzLl95MT10aGlzLl95Mj1OYU4sdGhpcy5fbDAxX2E9dGhpcy5fbDEyX2E9dGhpcy5fbDIzX2E9dGhpcy5fbDAxXzJhPXRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmE9dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpeyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMz09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxlKXtpZih0PSt0LGU9K2UsdGhpcy5fcG9pbnQpe3ZhciBuPXRoaXMuX3gyLXQsaT10aGlzLl95Mi1lO3RoaXMuX2wyM19hPU1hdGguc3FydCh0aGlzLl9sMjNfMmE9TWF0aC5wb3cobipuK2kqaSx0aGlzLl9hbHBoYSkpfXN3aXRjaCh0aGlzLl9wb2ludCl7Y2FzZSAwOnRoaXMuX3BvaW50PTE7YnJlYWs7Y2FzZSAxOnRoaXMuX3BvaW50PTI7YnJlYWs7Y2FzZSAyOnRoaXMuX3BvaW50PTMsdGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94Mix0aGlzLl95Mik6dGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsdGhpcy5feTIpO2JyZWFrO2Nhc2UgMzp0aGlzLl9wb2ludD00O2RlZmF1bHQ6cnR0KHRoaXMsdCxlKX10aGlzLl9sMDFfYT10aGlzLl9sMTJfYSx0aGlzLl9sMTJfYT10aGlzLl9sMjNfYSx0aGlzLl9sMDFfMmE9dGhpcy5fbDEyXzJhLHRoaXMuX2wxMl8yYT10aGlzLl9sMjNfMmEsdGhpcy5feDA9dGhpcy5feDEsdGhpcy5feDE9dGhpcy5feDIsdGhpcy5feDI9dCx0aGlzLl95MD10aGlzLl95MSx0aGlzLl95MT10aGlzLl95Mix0aGlzLl95Mj1lfX07dmFyIHV0dD0oZnVuY3Rpb24gdChlKXtmdW5jdGlvbiBuKHQpe3JldHVybiBlP25ldyBjdHQodCxlKTpuZXcgbnR0KHQsMCl9cmV0dXJuIG4uYWxwaGE9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoK2UpfSxufSkoLjUpO2Z1bmN0aW9uIGh0dCh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gZHR0KHQpe3JldHVybiB0PDA/LTE6MX1mdW5jdGlvbiBwdHQodCxlLG4pe3ZhciBpPXQuX3gxLXQuX3gwLHI9ZS10Ll94MSxvPSh0Ll95MS10Ll95MCkvKGl8fHI8MCYmLTApLGE9KG4tdC5feTEpLyhyfHxpPDAmJi0wKSxzPShvKnIrYSppKS8oaStyKTtyZXR1cm4oZHR0KG8pK2R0dChhKSkqTWF0aC5taW4oTWF0aC5hYnMobyksTWF0aC5hYnMoYSksLjUqTWF0aC5hYnMocykpfHwwfWZ1bmN0aW9uIGZ0dCh0LGUpe3ZhciBuPXQuX3gxLXQuX3gwO3JldHVybiBuPygzKih0Ll95MS10Ll95MCkvbi1lKS8yOmV9ZnVuY3Rpb24gbXR0KHQsZSxuKXt2YXIgaT10Ll94MCxyPXQuX3gxLG89dC5feTEsYT0oci1pKS8zO3QuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhpK2EsdC5feTArYSplLHItYSxvLWEqbixyLG8pfWZ1bmN0aW9uIGd0dCh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gX3R0KHQpe3RoaXMuX2NvbnRleHQ9bmV3IHl0dCh0KX1mdW5jdGlvbiB5dHQodCl7dGhpcy5fY29udGV4dD10fWZ1bmN0aW9uIHZ0dCh0KXt0aGlzLl9jb250ZXh0PXR9ZnVuY3Rpb24gYnR0KHQpe3ZhciBlLG4saT10Lmxlbmd0aC0xLHI9bmV3IEFycmF5KGkpLG89bmV3IEFycmF5KGkpLGE9bmV3IEFycmF5KGkpO2ZvcihyWzBdPTAsb1swXT0yLGFbMF09dFswXSsyKnRbMV0sZT0xO2U8aS0xOysrZSlyW2VdPTEsb1tlXT00LGFbZV09NCp0W2VdKzIqdFtlKzFdO2ZvcihyW2ktMV09MixvW2ktMV09NyxhW2ktMV09OCp0W2ktMV0rdFtpXSxlPTE7ZTxpOysrZSlvW2VdLT1uPXJbZV0vb1tlLTFdLGFbZV0tPW4qYVtlLTFdO2ZvcihyW2ktMV09YVtpLTFdL29baS0xXSxlPWktMjtlPj0wOy0tZSlyW2VdPShhW2VdLXJbZSsxXSkvb1tlXTtmb3Iob1tpLTFdPSh0W2ldK3JbaS0xXSkvMixlPTA7ZTxpLTE7KytlKW9bZV09Mip0W2UrMV0tcltlKzFdO3JldHVybltyLG9dfWZ1bmN0aW9uIHh0dCh0LGUpe3RoaXMuX2NvbnRleHQ9dCx0aGlzLl90PWV9ZnVuY3Rpb24gd3R0KHQsZSl7aWYoKHI9dC5sZW5ndGgpPjEpZm9yKHZhciBuLGkscixvPTEsYT10W2VbMF1dLHM9YS5sZW5ndGg7bzxyOysrbylmb3IoaT1hLGE9dFtlW29dXSxuPTA7bjxzOysrbilhW25dWzFdKz1hW25dWzBdPWlzTmFOKGlbbl1bMV0pP2lbbl1bMF06aVtuXVsxXX1mdW5jdGlvbiBTdHQodCl7Zm9yKHZhciBlPXQubGVuZ3RoLG49bmV3IEFycmF5KGUpOy0tZT49MDspbltlXT1lO3JldHVybiBufWZ1bmN0aW9uIE10dCh0LGUpe3JldHVybiB0W2VdfWZ1bmN0aW9uIEV0dCh0KXt2YXIgZT10Lm1hcChUdHQpO3JldHVybiBTdHQodCkuc29ydCgoZnVuY3Rpb24odCxuKXtyZXR1cm4gZVt0XS1lW25dfSkpfWZ1bmN0aW9uIFR0dCh0KXtmb3IodmFyIGUsbj0wLGk9LTEscj10Lmxlbmd0aDsrK2k8cjspKGU9K3RbaV1bMV0pJiYobis9ZSk7cmV0dXJuIG59aHR0LnByb3RvdHlwZT17YXJlYVN0YXJ0Okc3LGFyZWFFbmQ6RzcsbGluZVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fcG9pbnQ9MH0sbGluZUVuZDpmdW5jdGlvbigpe3RoaXMuX3BvaW50JiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpfSxwb2ludDpmdW5jdGlvbih0LGUpe3Q9K3QsZT0rZSx0aGlzLl9wb2ludD90aGlzLl9jb250ZXh0LmxpbmVUbyh0LGUpOih0aGlzLl9wb2ludD0xLHRoaXMuX2NvbnRleHQubW92ZVRvKHQsZSkpfX0sZ3R0LnByb3RvdHlwZT17YXJlYVN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5fbGluZT0wfSxhcmVhRW5kOmZ1bmN0aW9uKCl7dGhpcy5fbGluZT1OYU59LGxpbmVTdGFydDpmdW5jdGlvbigpe3RoaXMuX3gwPXRoaXMuX3gxPXRoaXMuX3kwPXRoaXMuX3kxPXRoaXMuX3QwPU5hTix0aGlzLl9wb2ludD0wfSxsaW5lRW5kOmZ1bmN0aW9uKCl7c3dpdGNoKHRoaXMuX3BvaW50KXtjYXNlIDI6dGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDEsdGhpcy5feTEpO2JyZWFrO2Nhc2UgMzptdHQodGhpcyx0aGlzLl90MCxmdHQodGhpcyx0aGlzLl90MCkpfSh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPTEtdGhpcy5fbGluZX0scG9pbnQ6ZnVuY3Rpb24odCxlKXt2YXIgbj1OYU47aWYoZT0rZSwodD0rdCkhPT10aGlzLl94MXx8ZSE9PXRoaXMuX3kxKXtzd2l0Y2godGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxlKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LGUpO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2JyZWFrO2Nhc2UgMjp0aGlzLl9wb2ludD0zLG10dCh0aGlzLGZ0dCh0aGlzLG49cHR0KHRoaXMsdCxlKSksbik7YnJlYWs7ZGVmYXVsdDptdHQodGhpcyx0aGlzLl90MCxuPXB0dCh0aGlzLHQsZSkpfXRoaXMuX3gwPXRoaXMuX3gxLHRoaXMuX3gxPXQsdGhpcy5feTA9dGhpcy5feTEsdGhpcy5feTE9ZSx0aGlzLl90MD1ufX19LChfdHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZ3R0LnByb3RvdHlwZSkpLnBvaW50PWZ1bmN0aW9uKHQsZSl7Z3R0LnByb3RvdHlwZS5wb2ludC5jYWxsKHRoaXMsZSx0KX0seXR0LnByb3RvdHlwZT17bW92ZVRvOmZ1bmN0aW9uKHQsZSl7dGhpcy5fY29udGV4dC5tb3ZlVG8oZSx0KX0sY2xvc2VQYXRoOmZ1bmN0aW9uKCl7dGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKX0sbGluZVRvOmZ1bmN0aW9uKHQsZSl7dGhpcy5fY29udGV4dC5saW5lVG8oZSx0KX0sYmV6aWVyQ3VydmVUbzpmdW5jdGlvbih0LGUsbixpLHIsbyl7dGhpcy5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKGUsdCxpLG4sbyxyKX19LHZ0dC5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94PVtdLHRoaXMuX3k9W119LGxpbmVFbmQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl94LGU9dGhpcy5feSxuPXQubGVuZ3RoO2lmKG4paWYodGhpcy5fbGluZT90aGlzLl9jb250ZXh0LmxpbmVUbyh0WzBdLGVbMF0pOnRoaXMuX2NvbnRleHQubW92ZVRvKHRbMF0sZVswXSksMj09PW4pdGhpcy5fY29udGV4dC5saW5lVG8odFsxXSxlWzFdKTtlbHNlIGZvcih2YXIgaT1idHQodCkscj1idHQoZSksbz0wLGE9MTthPG47KytvLCsrYSl0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8oaVswXVtvXSxyWzBdW29dLGlbMV1bb10sclsxXVtvXSx0W2FdLGVbYV0pOyh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PW4pJiZ0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpLHRoaXMuX2xpbmU9MS10aGlzLl9saW5lLHRoaXMuX3g9dGhpcy5feT1udWxsfSxwb2ludDpmdW5jdGlvbih0LGUpe3RoaXMuX3gucHVzaCgrdCksdGhpcy5feS5wdXNoKCtlKX19LHh0dC5wcm90b3R5cGU9e2FyZWFTdGFydDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9MH0sYXJlYUVuZDpmdW5jdGlvbigpe3RoaXMuX2xpbmU9TmFOfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXt0aGlzLl94PXRoaXMuX3k9TmFOLHRoaXMuX3BvaW50PTB9LGxpbmVFbmQ6ZnVuY3Rpb24oKXswPHRoaXMuX3QmJnRoaXMuX3Q8MSYmMj09PXRoaXMuX3BvaW50JiZ0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94LHRoaXMuX3kpLCh0aGlzLl9saW5lfHwwIT09dGhpcy5fbGluZSYmMT09PXRoaXMuX3BvaW50KSYmdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKSx0aGlzLl9saW5lPj0wJiYodGhpcy5fdD0xLXRoaXMuX3QsdGhpcy5fbGluZT0xLXRoaXMuX2xpbmUpfSxwb2ludDpmdW5jdGlvbih0LGUpe3N3aXRjaCh0PSt0LGU9K2UsdGhpcy5fcG9pbnQpe2Nhc2UgMDp0aGlzLl9wb2ludD0xLHRoaXMuX2xpbmU/dGhpcy5fY29udGV4dC5saW5lVG8odCxlKTp0aGlzLl9jb250ZXh0Lm1vdmVUbyh0LGUpO2JyZWFrO2Nhc2UgMTp0aGlzLl9wb2ludD0yO2RlZmF1bHQ6aWYodGhpcy5fdDw9MCl0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94LGUpLHRoaXMuX2NvbnRleHQubGluZVRvKHQsZSk7ZWxzZXt2YXIgbj10aGlzLl94KigxLXRoaXMuX3QpK3QqdGhpcy5fdDt0aGlzLl9jb250ZXh0LmxpbmVUbyhuLHRoaXMuX3kpLHRoaXMuX2NvbnRleHQubGluZVRvKG4sZSl9fXRoaXMuX3g9dCx0aGlzLl95PWV9fTt2YXIgQ3R0PW5ldyBEYXRlLEF0dD1uZXcgRGF0ZTtmdW5jdGlvbiBrdHQodCxlLG4saSl7ZnVuY3Rpb24gcihlKXtyZXR1cm4gdChlPW5ldyBEYXRlKCtlKSksZX1yZXR1cm4gci5mbG9vcj1yLHIuY2VpbD1mdW5jdGlvbihuKXtyZXR1cm4gdChuPW5ldyBEYXRlKG4tMSkpLGUobiwxKSx0KG4pLG59LHIucm91bmQ9ZnVuY3Rpb24odCl7dmFyIGU9cih0KSxuPXIuY2VpbCh0KTtyZXR1cm4gdC1lPG4tdD9lOm59LHIub2Zmc2V0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIGUodD1uZXcgRGF0ZSgrdCksbnVsbD09bj8xOk1hdGguZmxvb3IobikpLHR9LHIucmFuZ2U9ZnVuY3Rpb24obixpLG8pe3ZhciBhLHM9W107aWYobj1yLmNlaWwobiksbz1udWxsPT1vPzE6TWF0aC5mbG9vcihvKSwhKG48aSYmbz4wKSlyZXR1cm4gcztkb3tzLnB1c2goYT1uZXcgRGF0ZSgrbikpLGUobixvKSx0KG4pfXdoaWxlKGE8biYmbjxpKTtyZXR1cm4gc30sci5maWx0ZXI9ZnVuY3Rpb24obil7cmV0dXJuIGt0dCgoZnVuY3Rpb24oZSl7aWYoZT49ZSlmb3IoO3QoZSksIW4oZSk7KWUuc2V0VGltZShlLTEpfSksKGZ1bmN0aW9uKHQsaSl7aWYodD49dClpZihpPDApZm9yKDsrK2k8PTA7KWZvcig7ZSh0LC0xKSwhbih0KTspO2Vsc2UgZm9yKDstLWk+PTA7KWZvcig7ZSh0LDEpLCFuKHQpOyk7fSkpfSxuJiYoci5jb3VudD1mdW5jdGlvbihlLGkpe3JldHVybiBDdHQuc2V0VGltZSgrZSksQXR0LnNldFRpbWUoK2kpLHQoQ3R0KSx0KEF0dCksTWF0aC5mbG9vcihuKEN0dCxBdHQpKX0sci5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLGlzRmluaXRlKHQpJiZ0PjA/dD4xP3IuZmlsdGVyKGk/ZnVuY3Rpb24oZSl7cmV0dXJuIGkoZSkldD09MH06ZnVuY3Rpb24oZSl7cmV0dXJuIHIuY291bnQoMCxlKSV0PT0wfSk6cjpudWxsfSkscn12YXIgTHR0PWt0dCgoZnVuY3Rpb24oKXt9KSwoZnVuY3Rpb24odCxlKXt0LnNldFRpbWUoK3QrZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS10fSkpO0x0dC5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLGlzRmluaXRlKHQpJiZ0PjA/dD4xP2t0dCgoZnVuY3Rpb24oZSl7ZS5zZXRUaW1lKE1hdGguZmxvb3IoZS90KSp0KX0pLChmdW5jdGlvbihlLG4pe2Uuc2V0VGltZSgrZStuKnQpfSksKGZ1bmN0aW9uKGUsbil7cmV0dXJuKG4tZSkvdH0pKTpMdHQ6bnVsbH07dmFyIFB0dD1MdHQucmFuZ2UsTnR0PTFlMyxJdHQ9NmU0LFJ0dD0zNmU1LE90dD04NjRlNSx6dHQ9NjA0OGU1LER0dD1rdHQoKGZ1bmN0aW9uKHQpe3Quc2V0VGltZShNYXRoLmZsb29yKHQvTnR0KSpOdHQpfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKCt0K2UqTnR0KX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL050dH0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENTZWNvbmRzKCl9KSksQnR0PUR0dC5yYW5nZSxIdHQ9a3R0KChmdW5jdGlvbih0KXt0LnNldFRpbWUoTWF0aC5mbG9vcih0L0l0dCkqSXR0KX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VGltZSgrdCtlKkl0dCl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10KS9JdHR9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0TWludXRlcygpfSkpLEZ0dD1IdHQucmFuZ2UsVnR0PWt0dCgoZnVuY3Rpb24odCl7dmFyIGU9dC5nZXRUaW1lem9uZU9mZnNldCgpKkl0dCVSdHQ7ZTwwJiYoZSs9UnR0KSx0LnNldFRpbWUoTWF0aC5mbG9vcigoK3QtZSkvUnR0KSpSdHQrZSl9KSwoZnVuY3Rpb24odCxlKXt0LnNldFRpbWUoK3QrZSpSdHQpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuKGUtdCkvUnR0fSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEhvdXJzKCl9KSksVXR0PVZ0dC5yYW5nZSxqdHQ9a3R0KChmdW5jdGlvbih0KXt0LnNldEhvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXREYXRlKHQuZ2V0RGF0ZSgpK2UpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuKGUtdC0oZS5nZXRUaW1lem9uZU9mZnNldCgpLXQuZ2V0VGltZXpvbmVPZmZzZXQoKSkqSXR0KS9PdHR9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0RGF0ZSgpLTF9KSksR3R0PWp0dC5yYW5nZTtmdW5jdGlvbiBXdHQodCl7cmV0dXJuIGt0dCgoZnVuY3Rpb24oZSl7ZS5zZXREYXRlKGUuZ2V0RGF0ZSgpLShlLmdldERheSgpKzctdCklNyksZS5zZXRIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0RGF0ZSh0LmdldERhdGUoKSs3KmUpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuKGUtdC0oZS5nZXRUaW1lem9uZU9mZnNldCgpLXQuZ2V0VGltZXpvbmVPZmZzZXQoKSkqSXR0KS96dHR9KSl9dmFyIHF0dD1XdHQoMCksWXR0PVd0dCgxKSxYdHQ9V3R0KDIpLCR0dD1XdHQoMyksS3R0PVd0dCg0KSxadHQ9V3R0KDUpLEp0dD1XdHQoNiksUXR0PXF0dC5yYW5nZSx0ZXQ9WXR0LnJhbmdlLGVldD1YdHQucmFuZ2UsbmV0PSR0dC5yYW5nZSxpZXQ9S3R0LnJhbmdlLHJldD1adHQucmFuZ2Usb2V0PUp0dC5yYW5nZSxhZXQ9a3R0KChmdW5jdGlvbih0KXt0LnNldERhdGUoMSksdC5zZXRIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0TW9udGgodC5nZXRNb250aCgpK2UpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZ2V0TW9udGgoKS10LmdldE1vbnRoKCkrMTIqKGUuZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCkpfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldE1vbnRoKCl9KSksc2V0PWFldC5yYW5nZSxjZXQ9a3R0KChmdW5jdGlvbih0KXt0LnNldE1vbnRoKDAsMSksdC5zZXRIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0RnVsbFllYXIodC5nZXRGdWxsWWVhcigpK2UpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZ2V0RnVsbFllYXIoKS10LmdldEZ1bGxZZWFyKCl9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0RnVsbFllYXIoKX0pKTtjZXQuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9TWF0aC5mbG9vcih0KSkmJnQ+MD9rdHQoKGZ1bmN0aW9uKGUpe2Uuc2V0RnVsbFllYXIoTWF0aC5mbG9vcihlLmdldEZ1bGxZZWFyKCkvdCkqdCksZS5zZXRNb250aCgwLDEpLGUuc2V0SG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24oZSxuKXtlLnNldEZ1bGxZZWFyKGUuZ2V0RnVsbFllYXIoKStuKnQpfSkpOm51bGx9O3ZhciB1ZXQ9Y2V0LnJhbmdlLGhldD1rdHQoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDU2Vjb25kcygwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKCt0K2UqSXR0KX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL0l0dH0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENNaW51dGVzKCl9KSksZGV0PWhldC5yYW5nZSxwZXQ9a3R0KChmdW5jdGlvbih0KXt0LnNldFVUQ01pbnV0ZXMoMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRUaW1lKCt0K2UqUnR0KX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL1J0dH0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENIb3VycygpfSkpLGZldD1wZXQucmFuZ2UsbWV0PWt0dCgoZnVuY3Rpb24odCl7dC5zZXRVVENIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VVRDRGF0ZSh0LmdldFVUQ0RhdGUoKStlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQpL090dH0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENEYXRlKCktMX0pKSxnZXQ9bWV0LnJhbmdlO2Z1bmN0aW9uIF9ldCh0KXtyZXR1cm4ga3R0KChmdW5jdGlvbihlKXtlLnNldFVUQ0RhdGUoZS5nZXRVVENEYXRlKCktKGUuZ2V0VVRDRGF5KCkrNy10KSU3KSxlLnNldFVUQ0hvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRVVENEYXRlKHQuZ2V0VVRDRGF0ZSgpKzcqZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10KS96dHR9KSl9dmFyIHlldD1fZXQoMCksdmV0PV9ldCgxKSxiZXQ9X2V0KDIpLHhldD1fZXQoMyksd2V0PV9ldCg0KSxNZXQ9X2V0KDUpLEVldD1fZXQoNiksVGV0PXlldC5yYW5nZSxDZXQ9dmV0LnJhbmdlLEFldD1iZXQucmFuZ2Usa2V0PXhldC5yYW5nZSxMZXQ9d2V0LnJhbmdlLFBldD1NZXQucmFuZ2UsTmV0PUVldC5yYW5nZSxJZXQ9a3R0KChmdW5jdGlvbih0KXt0LnNldFVUQ0RhdGUoMSksdC5zZXRVVENIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VVRDTW9udGgodC5nZXRVVENNb250aCgpK2UpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZ2V0VVRDTW9udGgoKS10LmdldFVUQ01vbnRoKCkrMTIqKGUuZ2V0VVRDRnVsbFllYXIoKS10LmdldFVUQ0Z1bGxZZWFyKCkpfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ01vbnRoKCl9KSksUmV0PUlldC5yYW5nZSxPZXQ9a3R0KChmdW5jdGlvbih0KXt0LnNldFVUQ01vbnRoKDAsMSksdC5zZXRVVENIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0VVRDRnVsbFllYXIodC5nZXRVVENGdWxsWWVhcigpK2UpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUuZ2V0VVRDRnVsbFllYXIoKS10LmdldFVUQ0Z1bGxZZWFyKCl9KSwoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2V0VVRDRnVsbFllYXIoKX0pKTtPZXQuZXZlcnk9ZnVuY3Rpb24odCl7cmV0dXJuIGlzRmluaXRlKHQ9TWF0aC5mbG9vcih0KSkmJnQ+MD9rdHQoKGZ1bmN0aW9uKGUpe2Uuc2V0VVRDRnVsbFllYXIoTWF0aC5mbG9vcihlLmdldFVUQ0Z1bGxZZWFyKCkvdCkqdCksZS5zZXRVVENNb250aCgwLDEpLGUuc2V0VVRDSG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24oZSxuKXtlLnNldFVUQ0Z1bGxZZWFyKGUuZ2V0VVRDRnVsbFllYXIoKStuKnQpfSkpOm51bGx9O3ZhciB6ZXQ9T2V0LnJhbmdlLERldD1uZXcgRGF0ZSxCZXQ9bmV3IERhdGU7ZnVuY3Rpb24gSGV0KHQsZSxuLGkpe2Z1bmN0aW9uIHIoZSl7cmV0dXJuIHQoZT0wPT09YXJndW1lbnRzLmxlbmd0aD9uZXcgRGF0ZTpuZXcgRGF0ZSgrZSkpLGV9cmV0dXJuIHIuZmxvb3I9ZnVuY3Rpb24oZSl7cmV0dXJuIHQoZT1uZXcgRGF0ZSgrZSkpLGV9LHIuY2VpbD1mdW5jdGlvbihuKXtyZXR1cm4gdChuPW5ldyBEYXRlKG4tMSkpLGUobiwxKSx0KG4pLG59LHIucm91bmQ9ZnVuY3Rpb24odCl7dmFyIGU9cih0KSxuPXIuY2VpbCh0KTtyZXR1cm4gdC1lPG4tdD9lOm59LHIub2Zmc2V0PWZ1bmN0aW9uKHQsbil7cmV0dXJuIGUodD1uZXcgRGF0ZSgrdCksbnVsbD09bj8xOk1hdGguZmxvb3IobikpLHR9LHIucmFuZ2U9ZnVuY3Rpb24obixpLG8pe3ZhciBhLHM9W107aWYobj1yLmNlaWwobiksbz1udWxsPT1vPzE6TWF0aC5mbG9vcihvKSwhKG48aSYmbz4wKSlyZXR1cm4gcztkb3tzLnB1c2goYT1uZXcgRGF0ZSgrbikpLGUobixvKSx0KG4pfXdoaWxlKGE8biYmbjxpKTtyZXR1cm4gc30sci5maWx0ZXI9ZnVuY3Rpb24obil7cmV0dXJuIEhldCgoZnVuY3Rpb24oZSl7aWYoZT49ZSlmb3IoO3QoZSksIW4oZSk7KWUuc2V0VGltZShlLTEpfSksKGZ1bmN0aW9uKHQsaSl7aWYodD49dClpZihpPDApZm9yKDsrK2k8PTA7KWZvcig7ZSh0LC0xKSwhbih0KTspO2Vsc2UgZm9yKDstLWk+PTA7KWZvcig7ZSh0LDEpLCFuKHQpOyk7fSkpfSxuJiYoci5jb3VudD1mdW5jdGlvbihlLGkpe3JldHVybiBEZXQuc2V0VGltZSgrZSksQmV0LnNldFRpbWUoK2kpLHQoRGV0KSx0KEJldCksTWF0aC5mbG9vcihuKERldCxCZXQpKX0sci5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gdD1NYXRoLmZsb29yKHQpLGlzRmluaXRlKHQpJiZ0PjA/dD4xP3IuZmlsdGVyKGk/ZnVuY3Rpb24oZSl7cmV0dXJuIGkoZSkldD09MH06ZnVuY3Rpb24oZSl7cmV0dXJuIHIuY291bnQoMCxlKSV0PT0wfSk6cjpudWxsfSkscn12YXIgRmV0PTg2NGU1LFZldD02MDQ4ZTUsVWV0PUhldCgoZnVuY3Rpb24odCl7dC5zZXRIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbih0LGUpe3Quc2V0RGF0ZSh0LmdldERhdGUoKStlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybihlLXQtNmU0KihlLmdldFRpbWV6b25lT2Zmc2V0KCktdC5nZXRUaW1lem9uZU9mZnNldCgpKSkvRmV0fSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldERhdGUoKS0xfSkpO2Z1bmN0aW9uIGpldCh0KXtyZXR1cm4gSGV0KChmdW5jdGlvbihlKXtlLnNldERhdGUoZS5nZXREYXRlKCktKGUuZ2V0RGF5KCkrNy10KSU3KSxlLnNldEhvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXREYXRlKHQuZ2V0RGF0ZSgpKzcqZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10LTZlNCooZS5nZXRUaW1lem9uZU9mZnNldCgpLXQuZ2V0VGltZXpvbmVPZmZzZXQoKSkpL1ZldH0pKX12YXIgR2V0PWpldCgwKSxXZXQ9amV0KDEpO2pldCgyKSxqZXQoMyk7dmFyIHFldD1qZXQoNCk7amV0KDUpLGpldCg2KTt2YXIgWWV0PUhldCgoZnVuY3Rpb24odCl7dC5zZXRNb250aCgwLDEpLHQuc2V0SG91cnMoMCwwLDAsMCl9KSwoZnVuY3Rpb24odCxlKXt0LnNldEZ1bGxZZWFyKHQuZ2V0RnVsbFllYXIoKStlKX0pLChmdW5jdGlvbih0LGUpe3JldHVybiBlLmdldEZ1bGxZZWFyKCktdC5nZXRGdWxsWWVhcigpfSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEZ1bGxZZWFyKCl9KSk7WWV0LmV2ZXJ5PWZ1bmN0aW9uKHQpe3JldHVybiBpc0Zpbml0ZSh0PU1hdGguZmxvb3IodCkpJiZ0PjA/SGV0KChmdW5jdGlvbihlKXtlLnNldEZ1bGxZZWFyKE1hdGguZmxvb3IoZS5nZXRGdWxsWWVhcigpL3QpKnQpLGUuc2V0TW9udGgoMCwxKSxlLnNldEhvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKGUsbil7ZS5zZXRGdWxsWWVhcihlLmdldEZ1bGxZZWFyKCkrbip0KX0pKTpudWxsfTt2YXIgWGV0PVlldCwkZXQ9SGV0KChmdW5jdGlvbih0KXt0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRVVENEYXRlKHQuZ2V0VVRDRGF0ZSgpK2UpfSksKGZ1bmN0aW9uKHQsZSl7cmV0dXJuKGUtdCkvRmV0fSksKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFVUQ0RhdGUoKS0xfSkpO2Z1bmN0aW9uIEtldCh0KXtyZXR1cm4gSGV0KChmdW5jdGlvbihlKXtlLnNldFVUQ0RhdGUoZS5nZXRVVENEYXRlKCktKGUuZ2V0VVRDRGF5KCkrNy10KSU3KSxlLnNldFVUQ0hvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRVVENEYXRlKHQuZ2V0VVRDRGF0ZSgpKzcqZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4oZS10KS9WZXR9KSl9dmFyIFpldD1LZXQoMCksSmV0PUtldCgxKTtLZXQoMiksS2V0KDMpO3ZhciBRZXQ9S2V0KDQpO0tldCg1KSxLZXQoNik7dmFyIHRudD1IZXQoKGZ1bmN0aW9uKHQpe3Quc2V0VVRDTW9udGgoMCwxKSx0LnNldFVUQ0hvdXJzKDAsMCwwLDApfSksKGZ1bmN0aW9uKHQsZSl7dC5zZXRVVENGdWxsWWVhcih0LmdldFVUQ0Z1bGxZZWFyKCkrZSl9KSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5nZXRVVENGdWxsWWVhcigpLXQuZ2V0VVRDRnVsbFllYXIoKX0pLChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRVVENGdWxsWWVhcigpfSkpO3RudC5ldmVyeT1mdW5jdGlvbih0KXtyZXR1cm4gaXNGaW5pdGUodD1NYXRoLmZsb29yKHQpKSYmdD4wP0hldCgoZnVuY3Rpb24oZSl7ZS5zZXRVVENGdWxsWWVhcihNYXRoLmZsb29yKGUuZ2V0VVRDRnVsbFllYXIoKS90KSp0KSxlLnNldFVUQ01vbnRoKDAsMSksZS5zZXRVVENIb3VycygwLDAsMCwwKX0pLChmdW5jdGlvbihlLG4pe2Uuc2V0VVRDRnVsbFllYXIoZS5nZXRVVENGdWxsWWVhcigpK24qdCl9KSk6bnVsbH07dmFyIGVudD10bnQ7ZnVuY3Rpb24gbm50KHQpe2lmKDA8PXQueSYmdC55PDEwMCl7dmFyIGU9bmV3IERhdGUoLTEsdC5tLHQuZCx0LkgsdC5NLHQuUyx0LkwpO3JldHVybiBlLnNldEZ1bGxZZWFyKHQueSksZX1yZXR1cm4gbmV3IERhdGUodC55LHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKX1mdW5jdGlvbiBpbnQodCl7aWYoMDw9dC55JiZ0Lnk8MTAwKXt2YXIgZT1uZXcgRGF0ZShEYXRlLlVUQygtMSx0Lm0sdC5kLHQuSCx0Lk0sdC5TLHQuTCkpO3JldHVybiBlLnNldFVUQ0Z1bGxZZWFyKHQueSksZX1yZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEModC55LHQubSx0LmQsdC5ILHQuTSx0LlMsdC5MKSl9ZnVuY3Rpb24gcm50KHQpe3JldHVybnt5OnQsbTowLGQ6MSxIOjAsTTowLFM6MCxMOjB9fWZ1bmN0aW9uIG9udCh0KXt2YXIgZT10LmRhdGVUaW1lLG49dC5kYXRlLGk9dC50aW1lLHI9dC5wZXJpb2RzLG89dC5kYXlzLGE9dC5zaG9ydERheXMscz10Lm1vbnRocyxsPXQuc2hvcnRNb250aHMsYz1fbnQociksdT15bnQociksaD1fbnQobyksZD15bnQobykscD1fbnQoYSksZj15bnQoYSksbT1fbnQocyksZz15bnQocyksXz1fbnQobCkseT15bnQobCksdj17YTpmdW5jdGlvbiBiKHQpe3JldHVybiBhW3QuZ2V0RGF5KCldfSxBOmZ1bmN0aW9uIHgodCl7cmV0dXJuIG9bdC5nZXREYXkoKV19LGI6ZnVuY3Rpb24gdyh0KXtyZXR1cm4gbFt0LmdldE1vbnRoKCldfSxCOmZ1bmN0aW9uIFModCl7cmV0dXJuIHNbdC5nZXRNb250aCgpXX0sYzpudWxsLGQ6Qm50LGU6Qm50LGY6am50LEg6SG50LEk6Rm50LGo6Vm50LEw6VW50LG06R250LE06V250LHA6ZnVuY3Rpb24gTSh0KXtyZXR1cm4gclsrKHQuZ2V0SG91cnMoKT49MTIpXX0sUTp2aXQsczpiaXQsUzpxbnQsdTpZbnQsVTpYbnQsVjokbnQsdzpLbnQsVzpabnQseDpudWxsLFg6bnVsbCx5OkpudCxZOlFudCxaOnRpdCwiJSI6eWl0fSxFPXthOmZ1bmN0aW9uIFQodCl7cmV0dXJuIGFbdC5nZXRVVENEYXkoKV19LEE6ZnVuY3Rpb24gQyh0KXtyZXR1cm4gb1t0LmdldFVUQ0RheSgpXX0sYjpmdW5jdGlvbiBBKHQpe3JldHVybiBsW3QuZ2V0VVRDTW9udGgoKV19LEI6ZnVuY3Rpb24gayh0KXtyZXR1cm4gc1t0LmdldFVUQ01vbnRoKCldfSxjOm51bGwsZDplaXQsZTplaXQsZjphaXQsSDpuaXQsSTppaXQsajpyaXQsTDpvaXQsbTpzaXQsTTpsaXQscDpmdW5jdGlvbiBMKHQpe3JldHVybiByWysodC5nZXRVVENIb3VycygpPj0xMildfSxROnZpdCxzOmJpdCxTOmNpdCx1OnVpdCxVOmhpdCxWOmRpdCx3OnBpdCxXOmZpdCx4Om51bGwsWDpudWxsLHk6bWl0LFk6Z2l0LFo6X2l0LCIlIjp5aXR9LFA9e2E6ZnVuY3Rpb24gTih0LGUsbil7dmFyIGk9cC5leGVjKGUuc2xpY2UobikpO3JldHVybiBpPyh0Lnc9ZltpWzBdLnRvTG93ZXJDYXNlKCldLG4raVswXS5sZW5ndGgpOi0xfSxBOmZ1bmN0aW9uIEkodCxlLG4pe3ZhciBpPWguZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gaT8odC53PWRbaVswXS50b0xvd2VyQ2FzZSgpXSxuK2lbMF0ubGVuZ3RoKTotMX0sYjpmdW5jdGlvbiBSKHQsZSxuKXt2YXIgaT1fLmV4ZWMoZS5zbGljZShuKSk7cmV0dXJuIGk/KHQubT15W2lbMF0udG9Mb3dlckNhc2UoKV0sbitpWzBdLmxlbmd0aCk6LTF9LEI6ZnVuY3Rpb24gTyh0LGUsbil7dmFyIGk9bS5leGVjKGUuc2xpY2UobikpO3JldHVybiBpPyh0Lm09Z1tpWzBdLnRvTG93ZXJDYXNlKCldLG4raVswXS5sZW5ndGgpOi0xfSxjOmZ1bmN0aW9uIHoodCxuLGkpe3JldHVybiBVKHQsZSxuLGkpfSxkOkFudCxlOkFudCxmOlJudCxIOkxudCxJOkxudCxqOmtudCxMOkludCxtOkNudCxNOlBudCxwOmZ1bmN0aW9uIEQodCxlLG4pe3ZhciBpPWMuZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gaT8odC5wPXVbaVswXS50b0xvd2VyQ2FzZSgpXSxuK2lbMF0ubGVuZ3RoKTotMX0sUTp6bnQsczpEbnQsUzpObnQsdTpibnQsVTp4bnQsVjp3bnQsdzp2bnQsVzpTbnQseDpmdW5jdGlvbiBCKHQsZSxpKXtyZXR1cm4gVSh0LG4sZSxpKX0sWDpmdW5jdGlvbiBIKHQsZSxuKXtyZXR1cm4gVSh0LGksZSxuKX0seTpFbnQsWTpNbnQsWjpUbnQsIiUiOk9udH07ZnVuY3Rpb24gRih0LGUpe3JldHVybiBmdW5jdGlvbihuKXt2YXIgaSxyLG8sYT1bXSxzPS0xLGw9MCxjPXQubGVuZ3RoO2ZvcihuIGluc3RhbmNlb2YgRGF0ZXx8KG49bmV3IERhdGUoK24pKTsrK3M8YzspMzc9PT10LmNoYXJDb2RlQXQocykmJihhLnB1c2godC5zbGljZShsLHMpKSxudWxsIT0ocj1obnRbaT10LmNoYXJBdCgrK3MpXSk/aT10LmNoYXJBdCgrK3MpOnI9ImUiPT09aT8iICI6IjAiLChvPWVbaV0pJiYoaT1vKG4scikpLGEucHVzaChpKSxsPXMrMSk7cmV0dXJuIGEucHVzaCh0LnNsaWNlKGwscykpLGEuam9pbigiIil9fWZ1bmN0aW9uIFYodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7dmFyIGkscixvPXJudCgxOTAwKTtpZihVKG8sdCxuKz0iIiwwKSE9bi5sZW5ndGgpcmV0dXJuIG51bGw7aWYoIlEiaW4gbylyZXR1cm4gbmV3IERhdGUoby5RKTtpZigicCJpbiBvJiYoby5IPW8uSCUxMisxMipvLnApLCJWImluIG8pe2lmKG8uVjwxfHxvLlY+NTMpcmV0dXJuIG51bGw7InciaW4gb3x8KG8udz0xKSwiWiJpbiBvPyhyPShpPWludChybnQoby55KSkpLmdldFVUQ0RheSgpLGk9cj40fHwwPT09cj9KZXQuY2VpbChpKTpKZXQoaSksaT0kZXQub2Zmc2V0KGksNyooby5WLTEpKSxvLnk9aS5nZXRVVENGdWxsWWVhcigpLG8ubT1pLmdldFVUQ01vbnRoKCksby5kPWkuZ2V0VVRDRGF0ZSgpKyhvLncrNiklNyk6KHI9KGk9ZShybnQoby55KSkpLmdldERheSgpLGk9cj40fHwwPT09cj9XZXQuY2VpbChpKTpXZXQoaSksaT1VZXQub2Zmc2V0KGksNyooby5WLTEpKSxvLnk9aS5nZXRGdWxsWWVhcigpLG8ubT1pLmdldE1vbnRoKCksby5kPWkuZ2V0RGF0ZSgpKyhvLncrNiklNyl9ZWxzZSgiVyJpbiBvfHwiVSJpbiBvKSYmKCJ3ImluIG98fChvLnc9InUiaW4gbz9vLnUlNzoiVyJpbiBvPzE6MCkscj0iWiJpbiBvP2ludChybnQoby55KSkuZ2V0VVRDRGF5KCk6ZShybnQoby55KSkuZ2V0RGF5KCksby5tPTAsby5kPSJXImluIG8/KG8udys2KSU3Kzcqby5XLShyKzUpJTc6by53Kzcqby5VLShyKzYpJTcpO3JldHVybiJaImluIG8/KG8uSCs9by5aLzEwMHwwLG8uTSs9by5aJTEwMCxpbnQobykpOmUobyl9fWZ1bmN0aW9uIFUodCxlLG4saSl7Zm9yKHZhciByLG8sYT0wLHM9ZS5sZW5ndGgsbD1uLmxlbmd0aDthPHM7KXtpZihpPj1sKXJldHVybi0xO2lmKDM3PT09KHI9ZS5jaGFyQ29kZUF0KGErKykpKXtpZihyPWUuY2hhckF0KGErKyksIShvPVBbciBpbiBobnQ/ZS5jaGFyQXQoYSsrKTpyXSl8fChpPW8odCxuLGkpKTwwKXJldHVybi0xfWVsc2UgaWYociE9bi5jaGFyQ29kZUF0KGkrKykpcmV0dXJuLTF9cmV0dXJuIGl9cmV0dXJuIHYueD1GKG4sdiksdi5YPUYoaSx2KSx2LmM9RihlLHYpLEUueD1GKG4sRSksRS5YPUYoaSxFKSxFLmM9RihlLEUpLHtmb3JtYXQ6ZnVuY3Rpb24odCl7dmFyIGU9Rih0Kz0iIix2KTtyZXR1cm4gZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiB0fSxlfSxwYXJzZTpmdW5jdGlvbih0KXt2YXIgZT1WKHQrPSIiLG5udCk7cmV0dXJuIGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sZX0sdXRjRm9ybWF0OmZ1bmN0aW9uKHQpe3ZhciBlPUYodCs9IiIsRSk7cmV0dXJuIGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sZX0sdXRjUGFyc2U6ZnVuY3Rpb24odCl7dmFyIGU9Vih0LGludCk7cmV0dXJuIGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdH0sZX19fXZhciBhbnQsc250LGxudCxjbnQsdW50LGhudD17Ii0iOiIiLF86IiAiLDA6IjAifSxkbnQ9L15ccypcZCsvLHBudD0vXiUvLGZudD0vW1xcXiQqKz98W1xdKCkue31dL2c7ZnVuY3Rpb24gbW50KHQsZSxuKXt2YXIgaT10PDA/Ii0iOiIiLHI9KGk/LXQ6dCkrIiIsbz1yLmxlbmd0aDtyZXR1cm4gaSsobzxuP25ldyBBcnJheShuLW8rMSkuam9pbihlKStyOnIpfWZ1bmN0aW9uIGdudCh0KXtyZXR1cm4gdC5yZXBsYWNlKGZudCwiXFwkJiIpfWZ1bmN0aW9uIF9udCh0KXtyZXR1cm4gbmV3IFJlZ0V4cCgiXig/OiIrdC5tYXAoZ250KS5qb2luKCJ8IikrIikiLCJpIil9ZnVuY3Rpb24geW50KHQpe2Zvcih2YXIgZT17fSxuPS0xLGk9dC5sZW5ndGg7KytuPGk7KWVbdFtuXS50b0xvd2VyQ2FzZSgpXT1uO3JldHVybiBlfWZ1bmN0aW9uIHZudCh0LGUsbil7dmFyIGk9ZG50LmV4ZWMoZS5zbGljZShuLG4rMSkpO3JldHVybiBpPyh0Lnc9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gYm50KHQsZSxuKXt2YXIgaT1kbnQuZXhlYyhlLnNsaWNlKG4sbisxKSk7cmV0dXJuIGk/KHQudT0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiB4bnQodCxlLG4pe3ZhciBpPWRudC5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5VPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIHdudCh0LGUsbil7dmFyIGk9ZG50LmV4ZWMoZS5zbGljZShuLG4rMikpO3JldHVybiBpPyh0LlY9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gU250KHQsZSxuKXt2YXIgaT1kbnQuZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIGk/KHQuVz0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBNbnQodCxlLG4pe3ZhciBpPWRudC5leGVjKGUuc2xpY2UobixuKzQpKTtyZXR1cm4gaT8odC55PStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIEVudCh0LGUsbil7dmFyIGk9ZG50LmV4ZWMoZS5zbGljZShuLG4rMikpO3JldHVybiBpPyh0Lnk9K2lbMF0rKCtpWzBdPjY4PzE5MDA6MmUzKSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBUbnQodCxlLG4pe3ZhciBpPS9eKFopfChbKy1dXGRcZCkoPzo6PyhcZFxkKSk/Ly5leGVjKGUuc2xpY2UobixuKzYpKTtyZXR1cm4gaT8odC5aPWlbMV0/MDotKGlbMl0rKGlbM118fCIwMCIpKSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBDbnQodCxlLG4pe3ZhciBpPWRudC5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5tPWlbMF0tMSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBBbnQodCxlLG4pe3ZhciBpPWRudC5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5kPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIGtudCh0LGUsbil7dmFyIGk9ZG50LmV4ZWMoZS5zbGljZShuLG4rMykpO3JldHVybiBpPyh0Lm09MCx0LmQ9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gTG50KHQsZSxuKXt2YXIgaT1kbnQuZXhlYyhlLnNsaWNlKG4sbisyKSk7cmV0dXJuIGk/KHQuSD0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBQbnQodCxlLG4pe3ZhciBpPWRudC5leGVjKGUuc2xpY2UobixuKzIpKTtyZXR1cm4gaT8odC5NPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIE5udCh0LGUsbil7dmFyIGk9ZG50LmV4ZWMoZS5zbGljZShuLG4rMikpO3JldHVybiBpPyh0LlM9K2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gSW50KHQsZSxuKXt2YXIgaT1kbnQuZXhlYyhlLnNsaWNlKG4sbiszKSk7cmV0dXJuIGk/KHQuTD0raVswXSxuK2lbMF0ubGVuZ3RoKTotMX1mdW5jdGlvbiBSbnQodCxlLG4pe3ZhciBpPWRudC5leGVjKGUuc2xpY2UobixuKzYpKTtyZXR1cm4gaT8odC5MPU1hdGguZmxvb3IoaVswXS8xZTMpLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIE9udCh0LGUsbil7dmFyIGk9cG50LmV4ZWMoZS5zbGljZShuLG4rMSkpO3JldHVybiBpP24raVswXS5sZW5ndGg6LTF9ZnVuY3Rpb24gem50KHQsZSxuKXt2YXIgaT1kbnQuZXhlYyhlLnNsaWNlKG4pKTtyZXR1cm4gaT8odC5RPStpWzBdLG4raVswXS5sZW5ndGgpOi0xfWZ1bmN0aW9uIERudCh0LGUsbil7dmFyIGk9ZG50LmV4ZWMoZS5zbGljZShuKSk7cmV0dXJuIGk/KHQuUT0xZTMqK2lbMF0sbitpWzBdLmxlbmd0aCk6LTF9ZnVuY3Rpb24gQm50KHQsZSl7cmV0dXJuIG1udCh0LmdldERhdGUoKSxlLDIpfWZ1bmN0aW9uIEhudCh0LGUpe3JldHVybiBtbnQodC5nZXRIb3VycygpLGUsMil9ZnVuY3Rpb24gRm50KHQsZSl7cmV0dXJuIG1udCh0LmdldEhvdXJzKCklMTJ8fDEyLGUsMil9ZnVuY3Rpb24gVm50KHQsZSl7cmV0dXJuIG1udCgxK1VldC5jb3VudChYZXQodCksdCksZSwzKX1mdW5jdGlvbiBVbnQodCxlKXtyZXR1cm4gbW50KHQuZ2V0TWlsbGlzZWNvbmRzKCksZSwzKX1mdW5jdGlvbiBqbnQodCxlKXtyZXR1cm4gVW50KHQsZSkrIjAwMCJ9ZnVuY3Rpb24gR250KHQsZSl7cmV0dXJuIG1udCh0LmdldE1vbnRoKCkrMSxlLDIpfWZ1bmN0aW9uIFdudCh0LGUpe3JldHVybiBtbnQodC5nZXRNaW51dGVzKCksZSwyKX1mdW5jdGlvbiBxbnQodCxlKXtyZXR1cm4gbW50KHQuZ2V0U2Vjb25kcygpLGUsMil9ZnVuY3Rpb24gWW50KHQpe3ZhciBlPXQuZ2V0RGF5KCk7cmV0dXJuIDA9PT1lPzc6ZX1mdW5jdGlvbiBYbnQodCxlKXtyZXR1cm4gbW50KEdldC5jb3VudChYZXQodCksdCksZSwyKX1mdW5jdGlvbiAkbnQodCxlKXt2YXIgbj10LmdldERheSgpO3JldHVybiB0PW4+PTR8fDA9PT1uP3FldCh0KTpxZXQuY2VpbCh0KSxtbnQocWV0LmNvdW50KFhldCh0KSx0KSsoND09PVhldCh0KS5nZXREYXkoKSksZSwyKX1mdW5jdGlvbiBLbnQodCl7cmV0dXJuIHQuZ2V0RGF5KCl9ZnVuY3Rpb24gWm50KHQsZSl7cmV0dXJuIG1udChXZXQuY291bnQoWGV0KHQpLHQpLGUsMil9ZnVuY3Rpb24gSm50KHQsZSl7cmV0dXJuIG1udCh0LmdldEZ1bGxZZWFyKCklMTAwLGUsMil9ZnVuY3Rpb24gUW50KHQsZSl7cmV0dXJuIG1udCh0LmdldEZ1bGxZZWFyKCklMWU0LGUsNCl9ZnVuY3Rpb24gdGl0KHQpe3ZhciBlPXQuZ2V0VGltZXpvbmVPZmZzZXQoKTtyZXR1cm4oZT4wPyItIjooZSo9LTEsIisiKSkrbW50KGUvNjB8MCwiMCIsMikrbW50KGUlNjAsIjAiLDIpfWZ1bmN0aW9uIGVpdCh0LGUpe3JldHVybiBtbnQodC5nZXRVVENEYXRlKCksZSwyKX1mdW5jdGlvbiBuaXQodCxlKXtyZXR1cm4gbW50KHQuZ2V0VVRDSG91cnMoKSxlLDIpfWZ1bmN0aW9uIGlpdCh0LGUpe3JldHVybiBtbnQodC5nZXRVVENIb3VycygpJTEyfHwxMixlLDIpfWZ1bmN0aW9uIHJpdCh0LGUpe3JldHVybiBtbnQoMSskZXQuY291bnQoZW50KHQpLHQpLGUsMyl9ZnVuY3Rpb24gb2l0KHQsZSl7cmV0dXJuIG1udCh0LmdldFVUQ01pbGxpc2Vjb25kcygpLGUsMyl9ZnVuY3Rpb24gYWl0KHQsZSl7cmV0dXJuIG9pdCh0LGUpKyIwMDAifWZ1bmN0aW9uIHNpdCh0LGUpe3JldHVybiBtbnQodC5nZXRVVENNb250aCgpKzEsZSwyKX1mdW5jdGlvbiBsaXQodCxlKXtyZXR1cm4gbW50KHQuZ2V0VVRDTWludXRlcygpLGUsMil9ZnVuY3Rpb24gY2l0KHQsZSl7cmV0dXJuIG1udCh0LmdldFVUQ1NlY29uZHMoKSxlLDIpfWZ1bmN0aW9uIHVpdCh0KXt2YXIgZT10LmdldFVUQ0RheSgpO3JldHVybiAwPT09ZT83OmV9ZnVuY3Rpb24gaGl0KHQsZSl7cmV0dXJuIG1udChaZXQuY291bnQoZW50KHQpLHQpLGUsMil9ZnVuY3Rpb24gZGl0KHQsZSl7dmFyIG49dC5nZXRVVENEYXkoKTtyZXR1cm4gdD1uPj00fHwwPT09bj9RZXQodCk6UWV0LmNlaWwodCksbW50KFFldC5jb3VudChlbnQodCksdCkrKDQ9PT1lbnQodCkuZ2V0VVRDRGF5KCkpLGUsMil9ZnVuY3Rpb24gcGl0KHQpe3JldHVybiB0LmdldFVUQ0RheSgpfWZ1bmN0aW9uIGZpdCh0LGUpe3JldHVybiBtbnQoSmV0LmNvdW50KGVudCh0KSx0KSxlLDIpfWZ1bmN0aW9uIG1pdCh0LGUpe3JldHVybiBtbnQodC5nZXRVVENGdWxsWWVhcigpJTEwMCxlLDIpfWZ1bmN0aW9uIGdpdCh0LGUpe3JldHVybiBtbnQodC5nZXRVVENGdWxsWWVhcigpJTFlNCxlLDQpfWZ1bmN0aW9uIF9pdCgpe3JldHVybiIrMDAwMCJ9ZnVuY3Rpb24geWl0KCl7cmV0dXJuIiUifWZ1bmN0aW9uIHZpdCh0KXtyZXR1cm4rdH1mdW5jdGlvbiBiaXQodCl7cmV0dXJuIE1hdGguZmxvb3IoK3QvMWUzKX1mdW5jdGlvbiB4aXQodCl7cmV0dXJuIGFudD1vbnQodCksc250PWFudC5mb3JtYXQsbG50PWFudC5wYXJzZSxjbnQ9YW50LnV0Y0Zvcm1hdCx1bnQ9YW50LnV0Y1BhcnNlLGFudH14aXQoe2RhdGVUaW1lOiIleCwgJVgiLGRhdGU6IiUtbS8lLWQvJVkiLHRpbWU6IiUtSTolTTolUyAlcCIscGVyaW9kczpbIkFNIiwiUE0iXSxkYXlzOlsiU3VuZGF5IiwiTW9uZGF5IiwiVHVlc2RheSIsIldlZG5lc2RheSIsIlRodXJzZGF5IiwiRnJpZGF5IiwiU2F0dXJkYXkiXSxzaG9ydERheXM6WyJTdW4iLCJNb24iLCJUdWUiLCJXZWQiLCJUaHUiLCJGcmkiLCJTYXQiXSxtb250aHM6WyJKYW51YXJ5IiwiRmVicnVhcnkiLCJNYXJjaCIsIkFwcmlsIiwiTWF5IiwiSnVuZSIsIkp1bHkiLCJBdWd1c3QiLCJTZXB0ZW1iZXIiLCJPY3RvYmVyIiwiTm92ZW1iZXIiLCJEZWNlbWJlciJdLHNob3J0TW9udGhzOlsiSmFuIiwiRmViIiwiTWFyIiwiQXByIiwiTWF5IiwiSnVuIiwiSnVsIiwiQXVnIiwiU2VwIiwiT2N0IiwiTm92IiwiRGVjIl19KTt2YXIgd2l0PSIlWS0lbS0lZFQlSDolTTolUy4lTFoiO3ZhciBTaXQ9RGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmc/ZnVuY3Rpb24gTWl0KHQpe3JldHVybiB0LnRvSVNPU3RyaW5nKCl9OmNudCh3aXQpO3ZhciBFaXQsVGl0LENpdD0rbmV3IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpP2Z1bmN0aW9uIEFpdCh0KXt2YXIgZT1uZXcgRGF0ZSh0KTtyZXR1cm4gaXNOYU4oZSk/bnVsbDplfTp1bnQod2l0KSxraXQ9MCxMaXQ9MCxQaXQ9MCxOaXQ9MCxJaXQ9MCxSaXQ9MCxPaXQ9Im9iamVjdCI9PXR5cGVvZiBwZXJmb3JtYW5jZSYmcGVyZm9ybWFuY2Uubm93P3BlcmZvcm1hbmNlOkRhdGUseml0PSJvYmplY3QiPT10eXBlb2Ygd2luZG93JiZ3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lP3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpOmZ1bmN0aW9uKHQpe3NldFRpbWVvdXQodCwxNyl9O2Z1bmN0aW9uIERpdCgpe3JldHVybiBJaXR8fCh6aXQoQml0KSxJaXQ9T2l0Lm5vdygpK1JpdCl9ZnVuY3Rpb24gQml0KCl7SWl0PTB9ZnVuY3Rpb24gSGl0KCl7dGhpcy5fY2FsbD10aGlzLl90aW1lPXRoaXMuX25leHQ9bnVsbH1mdW5jdGlvbiBGaXQodCxlLG4pe3ZhciBpPW5ldyBIaXQ7cmV0dXJuIGkucmVzdGFydCh0LGUsbiksaX1mdW5jdGlvbiBWaXQoKXtEaXQoKSwrK2tpdDtmb3IodmFyIHQsZT1FaXQ7ZTspKHQ9SWl0LWUuX3RpbWUpPj0wJiZlLl9jYWxsLmNhbGwobnVsbCx0KSxlPWUuX25leHQ7LS1raXR9ZnVuY3Rpb24gVWl0KCl7SWl0PShOaXQ9T2l0Lm5vdygpKStSaXQsa2l0PUxpdD0wO3RyeXtWaXQoKX1maW5hbGx5e2tpdD0wLChmdW5jdGlvbiB0KCl7dmFyIHQsZSxuPUVpdCxpPTEvMDtmb3IoO247KW4uX2NhbGw/KGk+bi5fdGltZSYmKGk9bi5fdGltZSksdD1uLG49bi5fbmV4dCk6KGU9bi5fbmV4dCxuLl9uZXh0PW51bGwsbj10P3QuX25leHQ9ZTpFaXQ9ZSk7VGl0PXQsR2l0KGkpfSkoKSxJaXQ9MH19ZnVuY3Rpb24gaml0KCl7dmFyIHQ9T2l0Lm5vdygpLGU9dC1OaXQ7ZT4xZTMmJihSaXQtPWUsTml0PXQpfWZ1bmN0aW9uIEdpdCh0KXtraXR8fChMaXQmJihMaXQ9Y2xlYXJUaW1lb3V0KExpdCkpLHQtSWl0PjI0Pyh0PDEvMCYmKExpdD1zZXRUaW1lb3V0KFVpdCx0LU9pdC5ub3coKS1SaXQpKSxQaXQmJihQaXQ9Y2xlYXJJbnRlcnZhbChQaXQpKSk6KFBpdHx8KE5pdD1PaXQubm93KCksUGl0PXNldEludGVydmFsKGppdCwxZTMpKSxraXQ9MSx6aXQoVWl0KSkpfUhpdC5wcm90b3R5cGU9Rml0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6SGl0LHJlc3RhcnQ6ZnVuY3Rpb24odCxlLG4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uIik7bj0obnVsbD09bj9EaXQoKTorbikrKG51bGw9PWU/MDorZSksdGhpcy5fbmV4dHx8VGl0PT09dGhpc3x8KFRpdD9UaXQuX25leHQ9dGhpczpFaXQ9dGhpcyxUaXQ9dGhpcyksdGhpcy5fY2FsbD10LHRoaXMuX3RpbWU9bixHaXQoKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuX2NhbGwmJih0aGlzLl9jYWxsPW51bGwsdGhpcy5fdGltZT0xLzAsR2l0KCkpfX07dmFyIFdpdD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIscWl0PXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDpXaXQseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifTtmdW5jdGlvbiBZaXQodCl7dmFyIGU9dCs9IiIsbj1lLmluZGV4T2YoIjoiKTtyZXR1cm4gbj49MCYmInhtbG5zIiE9PShlPXQuc2xpY2UoMCxuKSkmJih0PXQuc2xpY2UobisxKSkscWl0Lmhhc093blByb3BlcnR5KGUpP3tzcGFjZTpxaXRbZV0sbG9jYWw6dH06dH1mdW5jdGlvbiBYaXQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vd25lckRvY3VtZW50LG49dGhpcy5uYW1lc3BhY2VVUkk7cmV0dXJuIG49PT1XaXQmJmUuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSST09PVdpdD9lLmNyZWF0ZUVsZW1lbnQodCk6ZS5jcmVhdGVFbGVtZW50TlMobix0KX19ZnVuY3Rpb24gJGl0KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIEtpdCh0KXt2YXIgZT1ZaXQodCk7cmV0dXJuKGUubG9jYWw/JGl0OlhpdCkoZSl9ZnVuY3Rpb24gWml0KCl7fWZ1bmN0aW9uIEppdCh0KXtyZXR1cm4gbnVsbD09dD9aaXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHQpfX1mdW5jdGlvbiBRaXQoKXtyZXR1cm5bXX1mdW5jdGlvbiB0cnQodCl7cmV0dXJuIG51bGw9PXQ/UWl0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbCh0KX19ZnVuY3Rpb24gZXJ0KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hdGNoZXModCl9fWZ1bmN0aW9uIG5ydCh0KXtyZXR1cm4gbmV3IEFycmF5KHQubGVuZ3RoKX1mdW5jdGlvbiBpcnQodCxlKXt0aGlzLm93bmVyRG9jdW1lbnQ9dC5vd25lckRvY3VtZW50LHRoaXMubmFtZXNwYWNlVVJJPXQubmFtZXNwYWNlVVJJLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9wYXJlbnQ9dCx0aGlzLl9fZGF0YV9fPWV9aXJ0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6aXJ0LGFwcGVuZENoaWxkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKHQsdGhpcy5fbmV4dCl9LGluc2VydEJlZm9yZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKHQsZSl9LHF1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yKHQpfSxxdWVyeVNlbGVjdG9yQWxsOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbCh0KX19O2Z1bmN0aW9uIHJydCh0LGUsbixpLHIsbyl7Zm9yKHZhciBhLHM9MCxsPWUubGVuZ3RoLGM9by5sZW5ndGg7czxjOysrcykoYT1lW3NdKT8oYS5fX2RhdGFfXz1vW3NdLGlbc109YSk6bltzXT1uZXcgaXJ0KHQsb1tzXSk7Zm9yKDtzPGw7KytzKShhPWVbc10pJiYocltzXT1hKX1mdW5jdGlvbiBvcnQodCxlLG4saSxyLG8sYSl7dmFyIHMsbCxjLHU9e30saD1lLmxlbmd0aCxkPW8ubGVuZ3RoLHA9bmV3IEFycmF5KGgpO2ZvcihzPTA7czxoOysrcykobD1lW3NdKSYmKHBbc109Yz0iJCIrYS5jYWxsKGwsbC5fX2RhdGFfXyxzLGUpLGMgaW4gdT9yW3NdPWw6dVtjXT1sKTtmb3Iocz0wO3M8ZDsrK3MpKGw9dVtjPSIkIithLmNhbGwodCxvW3NdLHMsbyldKT8oaVtzXT1sLGwuX19kYXRhX189b1tzXSx1W2NdPW51bGwpOm5bc109bmV3IGlydCh0LG9bc10pO2ZvcihzPTA7czxoOysrcykobD1lW3NdKSYmdVtwW3NdXT09PWwmJihyW3NdPWwpfWZ1bmN0aW9uIGFydCh0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6dD49ZT8wOk5hTn1mdW5jdGlvbiBzcnQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fWZ1bmN0aW9uIGxydCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIGNydCh0LGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlKHQsZSl9fWZ1bmN0aW9uIHVydCh0LGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLGUpfX1mdW5jdGlvbiBocnQodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1uP3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpOnRoaXMuc2V0QXR0cmlidXRlKHQsbil9fWZ1bmN0aW9uIGRydCh0LGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PW4/dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpOnRoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLG4pfX1mdW5jdGlvbiBwcnQodCl7cmV0dXJuIHQub3duZXJEb2N1bWVudCYmdC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3fHx0LmRvY3VtZW50JiZ0fHx0LmRlZmF1bHRWaWV3fWZ1bmN0aW9uIGZydCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfX1mdW5jdGlvbiBtcnQodCxlLG4pe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxlLG4pfX1mdW5jdGlvbiBncnQodCxlLG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciBpPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWk/dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KTp0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQsaSxuKX19ZnVuY3Rpb24gX3J0KHQsZSl7cmV0dXJuIHQuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShlKXx8cHJ0KHQpLmdldENvbXB1dGVkU3R5bGUodCxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKGUpfWZ1bmN0aW9uIHlydCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtkZWxldGUgdGhpc1t0XX19ZnVuY3Rpb24gdnJ0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpc1t0XT1lfX1mdW5jdGlvbiBicnQodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1uP2RlbGV0ZSB0aGlzW3RdOnRoaXNbdF09bn19ZnVuY3Rpb24geHJ0KHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKX1mdW5jdGlvbiB3cnQodCl7cmV0dXJuIHQuY2xhc3NMaXN0fHxuZXcgU3J0KHQpfWZ1bmN0aW9uIFNydCh0KXt0aGlzLl9ub2RlPXQsdGhpcy5fbmFtZXM9eHJ0KHQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9ZnVuY3Rpb24gTXJ0KHQsZSl7Zm9yKHZhciBuPXdydCh0KSxpPS0xLHI9ZS5sZW5ndGg7KytpPHI7KW4uYWRkKGVbaV0pfWZ1bmN0aW9uIEVydCh0LGUpe2Zvcih2YXIgbj13cnQodCksaT0tMSxyPWUubGVuZ3RoOysraTxyOyluLnJlbW92ZShlW2ldKX1mdW5jdGlvbiBUcnQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7TXJ0KHRoaXMsdCl9fWZ1bmN0aW9uIENydCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtFcnQodGhpcyx0KX19ZnVuY3Rpb24gQXJ0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7KGUuYXBwbHkodGhpcyxhcmd1bWVudHMpP01ydDpFcnQpKHRoaXMsdCl9fWZ1bmN0aW9uIGtydCgpe3RoaXMudGV4dENvbnRlbnQ9IiJ9ZnVuY3Rpb24gTHJ0KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19ZnVuY3Rpb24gUHJ0KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09ZT8iIjplfX1mdW5jdGlvbiBOcnQoKXt0aGlzLmlubmVySFRNTD0iIn1mdW5jdGlvbiBJcnQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5pbm5lckhUTUw9dH19ZnVuY3Rpb24gUnJ0KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaW5uZXJIVE1MPW51bGw9PWU/IiI6ZX19ZnVuY3Rpb24gT3J0KCl7dGhpcy5uZXh0U2libGluZyYmdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpfWZ1bmN0aW9uIHpydCgpe3RoaXMucHJldmlvdXNTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMsdGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpfWZ1bmN0aW9uIERydCgpe3JldHVybiBudWxsfWZ1bmN0aW9uIEJydCgpe3ZhciB0PXRoaXMucGFyZW50Tm9kZTt0JiZ0LnJlbW92ZUNoaWxkKHRoaXMpfWZ1bmN0aW9uIEhydCgpe3ZhciB0PXRoaXMuY2xvbmVOb2RlKCExKSxlPXRoaXMucGFyZW50Tm9kZTtyZXR1cm4gZT9lLmluc2VydEJlZm9yZSh0LHRoaXMubmV4dFNpYmxpbmcpOnR9ZnVuY3Rpb24gRnJ0KCl7dmFyIHQ9dGhpcy5jbG9uZU5vZGUoITApLGU9dGhpcy5wYXJlbnROb2RlO3JldHVybiBlP2UuaW5zZXJ0QmVmb3JlKHQsdGhpcy5uZXh0U2libGluZyk6dH1TcnQucHJvdG90eXBlPXthZGQ6ZnVuY3Rpb24odCl7dGhpcy5fbmFtZXMuaW5kZXhPZih0KTwwJiYodGhpcy5fbmFtZXMucHVzaCh0KSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbmFtZXMuaW5kZXhPZih0KTtlPj0wJiYodGhpcy5fbmFtZXMuc3BsaWNlKGUsMSksdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLl9uYW1lcy5qb2luKCIgIikpKX0sY29udGFpbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YodCk+PTB9fTt2YXIgVnJ0PXt9OyJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJigib25tb3VzZWVudGVyImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8KFZydD17bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9KSk7ZnVuY3Rpb24gVXJ0KHQsZSxuKXtyZXR1cm4gdD1qcnQodCxlLG4pLGZ1bmN0aW9uKGUpe3ZhciBuPWUucmVsYXRlZFRhcmdldDtuJiYobj09PXRoaXN8fDgmbi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzKSl8fHQuY2FsbCh0aGlzLGUpfX1mdW5jdGlvbiBqcnQodCxlLG4pe3JldHVybiBmdW5jdGlvbihpKXt0cnl7dC5jYWxsKHRoaXMsdGhpcy5fX2RhdGFfXyxlLG4pfWZpbmFsbHl7fX19ZnVuY3Rpb24gR3J0KHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBlPSIiLG49dC5pbmRleE9mKCIuIik7cmV0dXJuIG4+PTAmJihlPXQuc2xpY2UobisxKSx0PXQuc2xpY2UoMCxuKSkse3R5cGU6dCxuYW1lOmV9fSkpfWZ1bmN0aW9uIFdydCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9fb247aWYoZSl7Zm9yKHZhciBuLGk9MCxyPS0xLG89ZS5sZW5ndGg7aTxvOysraSluPWVbaV0sdC50eXBlJiZuLnR5cGUhPT10LnR5cGV8fG4ubmFtZSE9PXQubmFtZT9lWysrcl09bjp0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIobi50eXBlLG4ubGlzdGVuZXIsbi5jYXB0dXJlKTsrK3I/ZS5sZW5ndGg9cjpkZWxldGUgdGhpcy5fX29ufX19ZnVuY3Rpb24gcXJ0KHQsZSxuKXt2YXIgaT1WcnQuaGFzT3duUHJvcGVydHkodC50eXBlKT9VcnQ6anJ0O3JldHVybiBmdW5jdGlvbihyLG8sYSl7dmFyIHMsbD10aGlzLl9fb24sYz1pKGUsbyxhKTtpZihsKWZvcih2YXIgdT0wLGg9bC5sZW5ndGg7dTxoOysrdSlpZigocz1sW3VdKS50eXBlPT09dC50eXBlJiZzLm5hbWU9PT10Lm5hbWUpcmV0dXJuIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihzLnR5cGUscy5saXN0ZW5lcixzLmNhcHR1cmUpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihzLnR5cGUscy5saXN0ZW5lcj1jLHMuY2FwdHVyZT1uKSx2b2lkKHMudmFsdWU9ZSk7dGhpcy5hZGRFdmVudExpc3RlbmVyKHQudHlwZSxjLG4pLHM9e3R5cGU6dC50eXBlLG5hbWU6dC5uYW1lLHZhbHVlOmUsbGlzdGVuZXI6YyxjYXB0dXJlOm59LGw/bC5wdXNoKHMpOnRoaXMuX19vbj1bc119fWZ1bmN0aW9uIFlydCh0LGUsbil7dmFyIGk9cHJ0KHQpLHI9aS5DdXN0b21FdmVudDsiZnVuY3Rpb24iPT10eXBlb2Ygcj9yPW5ldyByKGUsbik6KHI9aS5kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxuPyhyLmluaXRFdmVudChlLG4uYnViYmxlcyxuLmNhbmNlbGFibGUpLHIuZGV0YWlsPW4uZGV0YWlsKTpyLmluaXRFdmVudChlLCExLCExKSksdC5kaXNwYXRjaEV2ZW50KHIpfWZ1bmN0aW9uIFhydCh0LGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBZcnQodGhpcyx0LGUpfX1mdW5jdGlvbiAkcnQodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gWXJ0KHRoaXMsdCxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fXZhciBLcnQ9W251bGxdO2Z1bmN0aW9uIFpydCh0LGUpe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9ZX1mdW5jdGlvbiBKcnQoKXtyZXR1cm4gbmV3IFpydChbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLEtydCl9WnJ0LnByb3RvdHlwZT1KcnQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpacnQsc2VsZWN0OmZ1bmN0aW9uIFFydCh0KXsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9Sml0KHQpKTtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49ZS5sZW5ndGgsaT1uZXcgQXJyYXkobikscj0wO3I8bjsrK3IpZm9yKHZhciBvLGEscz1lW3JdLGw9cy5sZW5ndGgsYz1pW3JdPW5ldyBBcnJheShsKSx1PTA7dTxsOysrdSkobz1zW3VdKSYmKGE9dC5jYWxsKG8sby5fX2RhdGFfXyx1LHMpKSYmKCJfX2RhdGFfXyJpbiBvJiYoYS5fX2RhdGFfXz1vLl9fZGF0YV9fKSxjW3VdPWEpO3JldHVybiBuZXcgWnJ0KGksdGhpcy5fcGFyZW50cyl9LHNlbGVjdEFsbDpmdW5jdGlvbiB0b3QodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXRydCh0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLGk9W10scj1bXSxvPTA7bzxuOysrbylmb3IodmFyIGEscz1lW29dLGw9cy5sZW5ndGgsYz0wO2M8bDsrK2MpKGE9c1tjXSkmJihpLnB1c2godC5jYWxsKGEsYS5fX2RhdGFfXyxjLHMpKSxyLnB1c2goYSkpO3JldHVybiBuZXcgWnJ0KGkscil9LGZpbHRlcjpmdW5jdGlvbiBlb3QodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PWVydCh0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLGk9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWZvcih2YXIgbyxhPWVbcl0scz1hLmxlbmd0aCxsPWlbcl09W10sYz0wO2M8czsrK2MpKG89YVtjXSkmJnQuY2FsbChvLG8uX19kYXRhX18sYyxhKSYmbC5wdXNoKG8pO3JldHVybiBuZXcgWnJ0KGksdGhpcy5fcGFyZW50cyl9LGRhdGE6ZnVuY3Rpb24gbm90KHQsZSl7aWYoIXQpcmV0dXJuIGY9bmV3IEFycmF5KHRoaXMuc2l6ZSgpKSx1PS0xLHRoaXMuZWFjaCgoZnVuY3Rpb24odCl7ZlsrK3VdPXR9KSksZjt2YXIgbj1lP29ydDpycnQsaT10aGlzLl9wYXJlbnRzLHI9dGhpcy5fZ3JvdXBzOyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD0oZnVuY3Rpb24gbyh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19KSh0KSk7Zm9yKHZhciBhPXIubGVuZ3RoLHM9bmV3IEFycmF5KGEpLGw9bmV3IEFycmF5KGEpLGM9bmV3IEFycmF5KGEpLHU9MDt1PGE7Kyt1KXt2YXIgaD1pW3VdLGQ9clt1XSxwPWQubGVuZ3RoLGY9dC5jYWxsKGgsaCYmaC5fX2RhdGFfXyx1LGkpLG09Zi5sZW5ndGgsZz1sW3VdPW5ldyBBcnJheShtKSxfPXNbdV09bmV3IEFycmF5KG0pO24oaCxkLGcsXyxjW3VdPW5ldyBBcnJheShwKSxmLGUpO2Zvcih2YXIgeSx2LGI9MCx4PTA7YjxtOysrYilpZih5PWdbYl0pe2ZvcihiPj14JiYoeD1iKzEpOyEodj1fW3hdKSYmKyt4PG07KTt5Ll9uZXh0PXZ8fG51bGx9fXJldHVybihzPW5ldyBacnQocyxpKSkuX2VudGVyPWwscy5fZXhpdD1jLHN9LGVudGVyOmZ1bmN0aW9uIGlvdCgpe3JldHVybiBuZXcgWnJ0KHRoaXMuX2VudGVyfHx0aGlzLl9ncm91cHMubWFwKG5ydCksdGhpcy5fcGFyZW50cyl9LGV4aXQ6ZnVuY3Rpb24gcm90KCl7cmV0dXJuIG5ldyBacnQodGhpcy5fZXhpdHx8dGhpcy5fZ3JvdXBzLm1hcChucnQpLHRoaXMuX3BhcmVudHMpfSxqb2luOmZ1bmN0aW9uIG9vdCh0LGUsbil7dmFyIGk9dGhpcy5lbnRlcigpLHI9dGhpcyxvPXRoaXMuZXhpdCgpO3JldHVybiBpPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3QoaSk6aS5hcHBlbmQodCsiIiksbnVsbCE9ZSYmKHI9ZShyKSksbnVsbD09bj9vLnJlbW92ZSgpOm4obyksaSYmcj9pLm1lcmdlKHIpLm9yZGVyKCk6cn0sbWVyZ2U6ZnVuY3Rpb24gYW90KHQpe2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj10Ll9ncm91cHMsaT1lLmxlbmd0aCxyPU1hdGgubWluKGksbi5sZW5ndGgpLG89bmV3IEFycmF5KGkpLGE9MDthPHI7KythKWZvcih2YXIgcyxsPWVbYV0sYz1uW2FdLHU9bC5sZW5ndGgsaD1vW2FdPW5ldyBBcnJheSh1KSxkPTA7ZDx1OysrZCkocz1sW2RdfHxjW2RdKSYmKGhbZF09cyk7Zm9yKDthPGk7KythKW9bYV09ZVthXTtyZXR1cm4gbmV3IFpydChvLHRoaXMuX3BhcmVudHMpfSxvcmRlcjpmdW5jdGlvbiBzb3QoKXtmb3IodmFyIHQ9dGhpcy5fZ3JvdXBzLGU9LTEsbj10Lmxlbmd0aDsrK2U8bjspZm9yKHZhciBpLHI9dFtlXSxvPXIubGVuZ3RoLTEsYT1yW29dOy0tbz49MDspKGk9cltvXSkmJihhJiY0XmkuY29tcGFyZURvY3VtZW50UG9zaXRpb24oYSkmJmEucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoaSxhKSxhPWkpO3JldHVybiB0aGlzfSxzb3J0OmZ1bmN0aW9uIGxvdCh0KXtmdW5jdGlvbiBlKGUsbil7cmV0dXJuIGUmJm4/dChlLl9fZGF0YV9fLG4uX19kYXRhX18pOiFlLSFufXR8fCh0PWFydCk7Zm9yKHZhciBuPXRoaXMuX2dyb3VwcyxpPW4ubGVuZ3RoLHI9bmV3IEFycmF5KGkpLG89MDtvPGk7KytvKXtmb3IodmFyIGEscz1uW29dLGw9cy5sZW5ndGgsYz1yW29dPW5ldyBBcnJheShsKSx1PTA7dTxsOysrdSkoYT1zW3VdKSYmKGNbdV09YSk7Yy5zb3J0KGUpfXJldHVybiBuZXcgWnJ0KHIsdGhpcy5fcGFyZW50cykub3JkZXIoKX0sY2FsbDpmdW5jdGlvbiBjb3QoKXt2YXIgdD1hcmd1bWVudHNbMF07cmV0dXJuIGFyZ3VtZW50c1swXT10aGlzLHQuYXBwbHkobnVsbCxhcmd1bWVudHMpLHRoaXN9LG5vZGVzOmZ1bmN0aW9uIHVvdCgpe3ZhciB0PW5ldyBBcnJheSh0aGlzLnNpemUoKSksZT0tMTtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpe3RbKytlXT10aGlzfSkpLHR9LG5vZGU6ZnVuY3Rpb24gaG90KCl7Zm9yKHZhciB0PXRoaXMuX2dyb3VwcyxlPTAsbj10Lmxlbmd0aDtlPG47KytlKWZvcih2YXIgaT10W2VdLHI9MCxvPWkubGVuZ3RoO3I8bzsrK3Ipe3ZhciBhPWlbcl07aWYoYSlyZXR1cm4gYX1yZXR1cm4gbnVsbH0sc2l6ZTpmdW5jdGlvbiBkb3QoKXt2YXIgdD0wO3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7Kyt0fSkpLHR9LGVtcHR5OmZ1bmN0aW9uIHBvdCgpe3JldHVybiF0aGlzLm5vZGUoKX0sZWFjaDpmdW5jdGlvbiBmb3QodCl7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPTAsaT1lLmxlbmd0aDtuPGk7KytuKWZvcih2YXIgcixvPWVbbl0sYT0wLHM9by5sZW5ndGg7YTxzOysrYSkocj1vW2FdKSYmdC5jYWxsKHIsci5fX2RhdGFfXyxhLG8pO3JldHVybiB0aGlzfSxhdHRyOmZ1bmN0aW9uIG1vdCh0LGUpe3ZhciBuPVlpdCh0KTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe3ZhciBpPXRoaXMubm9kZSgpO3JldHVybiBuLmxvY2FsP2kuZ2V0QXR0cmlidXRlTlMobi5zcGFjZSxuLmxvY2FsKTppLmdldEF0dHJpYnV0ZShuKX1yZXR1cm4gdGhpcy5lYWNoKChudWxsPT1lP24ubG9jYWw/bHJ0OnNydDoiZnVuY3Rpb24iPT10eXBlb2YgZT9uLmxvY2FsP2RydDpocnQ6bi5sb2NhbD91cnQ6Y3J0KShuLGUpKX0sc3R5bGU6ZnVuY3Rpb24gZ290KHQsZSxuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD4xP3RoaXMuZWFjaCgobnVsbD09ZT9mcnQ6ImZ1bmN0aW9uIj09dHlwZW9mIGU/Z3J0Om1ydCkodCxlLG51bGw9PW4/IiI6bikpOl9ydCh0aGlzLm5vZGUoKSx0KX0scHJvcGVydHk6ZnVuY3Rpb24gX290KHQsZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goKG51bGw9PWU/eXJ0OiJmdW5jdGlvbiI9PXR5cGVvZiBlP2JydDp2cnQpKHQsZSkpOnRoaXMubm9kZSgpW3RdfSxjbGFzc2VkOmZ1bmN0aW9uIHlvdCh0LGUpe3ZhciBuPXhydCh0KyIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgaT13cnQodGhpcy5ub2RlKCkpLHI9LTEsbz1uLmxlbmd0aDsrK3I8bzspaWYoIWkuY29udGFpbnMobltyXSkpcmV0dXJuITE7cmV0dXJuITB9cmV0dXJuIHRoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIGU/QXJ0OmU/VHJ0OkNydCkobixlKSl9LHRleHQ6ZnVuY3Rpb24gdm90KHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChudWxsPT10P2tydDooImZ1bmN0aW9uIj09dHlwZW9mIHQ/UHJ0OkxydCkodCkpOnRoaXMubm9kZSgpLnRleHRDb250ZW50fSxodG1sOmZ1bmN0aW9uIGJvdCh0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD9OcnQ6KCJmdW5jdGlvbiI9PXR5cGVvZiB0P1JydDpJcnQpKHQpKTp0aGlzLm5vZGUoKS5pbm5lckhUTUx9LHJhaXNlOmZ1bmN0aW9uIHhvdCgpe3JldHVybiB0aGlzLmVhY2goT3J0KX0sbG93ZXI6ZnVuY3Rpb24gd290KCl7cmV0dXJuIHRoaXMuZWFjaCh6cnQpfSxhcHBlbmQ6ZnVuY3Rpb24gU290KHQpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6S2l0KHQpO3JldHVybiB0aGlzLnNlbGVjdCgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9KSl9LGluc2VydDpmdW5jdGlvbiBNb3QodCxlKXt2YXIgbj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OktpdCh0KSxpPW51bGw9PWU/RHJ0OiJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6Sml0KGUpO3JldHVybiB0aGlzLnNlbGVjdCgoZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUobi5hcHBseSh0aGlzLGFyZ3VtZW50cyksaS5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fG51bGwpfSkpfSxyZW1vdmU6ZnVuY3Rpb24gRW90KCl7cmV0dXJuIHRoaXMuZWFjaChCcnQpfSxjbG9uZTpmdW5jdGlvbiBUb3QodCl7cmV0dXJuIHRoaXMuc2VsZWN0KHQ/RnJ0OkhydCl9LGRhdHVtOmZ1bmN0aW9uIENvdCh0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIsdCk6dGhpcy5ub2RlKCkuX19kYXRhX199LG9uOmZ1bmN0aW9uIEFvdCh0LGUsbil7dmFyIGkscixvPUdydCh0KyIiKSxhPW8ubGVuZ3RoO2lmKCEoYXJndW1lbnRzLmxlbmd0aDwyKSl7Zm9yKHM9ZT9xcnQ6V3J0LG51bGw9PW4mJihuPSExKSxpPTA7aTxhOysraSl0aGlzLmVhY2gocyhvW2ldLGUsbikpO3JldHVybiB0aGlzfXZhciBzPXRoaXMubm9kZSgpLl9fb247aWYocylmb3IodmFyIGwsYz0wLHU9cy5sZW5ndGg7Yzx1OysrYylmb3IoaT0wLGw9c1tjXTtpPGE7KytpKWlmKChyPW9baV0pLnR5cGU9PT1sLnR5cGUmJnIubmFtZT09PWwubmFtZSlyZXR1cm4gbC52YWx1ZX0sZGlzcGF0Y2g6ZnVuY3Rpb24ga290KHQsZSl7cmV0dXJuIHRoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIGU/JHJ0OlhydCkodCxlKSl9fTt2YXIgTG90PXt2YWx1ZTpmdW5jdGlvbigpe319O2Z1bmN0aW9uIFBvdCgpe2Zvcih2YXIgdCxlPTAsbj1hcmd1bWVudHMubGVuZ3RoLGk9e307ZTxuOysrZSl7aWYoISh0PWFyZ3VtZW50c1tlXSsiIil8fHQgaW4gaXx8L1tccy5dLy50ZXN0KHQpKXRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiK3QpO2lbdF09W119cmV0dXJuIG5ldyBOb3QoaSl9ZnVuY3Rpb24gTm90KHQpe3RoaXMuXz10fWZ1bmN0aW9uIElvdCh0LGUpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBuPSIiLGk9dC5pbmRleE9mKCIuIik7aWYoaT49MCYmKG49dC5zbGljZShpKzEpLHQ9dC5zbGljZSgwLGkpKSx0JiYhZS5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtyZXR1cm57dHlwZTp0LG5hbWU6bn19KSl9ZnVuY3Rpb24gUm90KHQsZSl7Zm9yKHZhciBuLGk9MCxyPXQubGVuZ3RoO2k8cjsrK2kpaWYoKG49dFtpXSkubmFtZT09PWUpcmV0dXJuIG4udmFsdWV9ZnVuY3Rpb24gT290KHQsZSxuKXtmb3IodmFyIGk9MCxyPXQubGVuZ3RoO2k8cjsrK2kpaWYodFtpXS5uYW1lPT09ZSl7dFtpXT1Mb3QsdD10LnNsaWNlKDAsaSkuY29uY2F0KHQuc2xpY2UoaSsxKSk7YnJlYWt9cmV0dXJuIG51bGwhPW4mJnQucHVzaCh7bmFtZTplLHZhbHVlOm59KSx0fU5vdC5wcm90b3R5cGU9UG90LnByb3RvdHlwZT17Y29uc3RydWN0b3I6Tm90LG9uOmZ1bmN0aW9uKHQsZSl7dmFyIG4saT10aGlzLl8scj1Jb3QodCsiIixpKSxvPS0xLGE9ci5sZW5ndGg7aWYoIShhcmd1bWVudHMubGVuZ3RoPDIpKXtpZihudWxsIT1lJiYiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIrZSk7Zm9yKDsrK288YTspaWYobj0odD1yW29dKS50eXBlKWlbbl09T290KGlbbl0sdC5uYW1lLGUpO2Vsc2UgaWYobnVsbD09ZSlmb3IobiBpbiBpKWlbbl09T290KGlbbl0sdC5uYW1lLG51bGwpO3JldHVybiB0aGlzfWZvcig7KytvPGE7KWlmKChuPSh0PXJbb10pLnR5cGUpJiYobj1Sb3QoaVtuXSx0Lm5hbWUpKSlyZXR1cm4gbn0sY29weTpmdW5jdGlvbigpe3ZhciB0PXt9LGU9dGhpcy5fO2Zvcih2YXIgbiBpbiBlKXRbbl09ZVtuXS5zbGljZSgpO3JldHVybiBuZXcgTm90KHQpfSxjYWxsOmZ1bmN0aW9uKHQsZSl7aWYoKG49YXJndW1lbnRzLmxlbmd0aC0yKT4wKWZvcih2YXIgbixpLHI9bmV3IEFycmF5KG4pLG89MDtvPG47KytvKXJbb109YXJndW1lbnRzW28rMl07aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3Iobz0wLG49KGk9dGhpcy5fW3RdKS5sZW5ndGg7bzxuOysrbylpW29dLnZhbHVlLmFwcGx5KGUscil9LGFwcGx5OmZ1bmN0aW9uKHQsZSxuKXtpZighdGhpcy5fLmhhc093blByb3BlcnR5KHQpKXRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiK3QpO2Zvcih2YXIgaT10aGlzLl9bdF0scj0wLG89aS5sZW5ndGg7cjxvOysrcilpW3JdLnZhbHVlLmFwcGx5KGUsbil9fTt2YXIgem90LERvdCxCb3Q9MCxIb3Q9MCxGb3Q9MCxWb3Q9MCxVb3Q9MCxqb3Q9MCxHb3Q9Im9iamVjdCI9PXR5cGVvZiBwZXJmb3JtYW5jZSYmcGVyZm9ybWFuY2Uubm93P3BlcmZvcm1hbmNlOkRhdGUsV290PSJvYmplY3QiPT10eXBlb2Ygd2luZG93JiZ3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lP3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpOmZ1bmN0aW9uKHQpe3NldFRpbWVvdXQodCwxNyl9O2Z1bmN0aW9uIHFvdCgpe3JldHVybiBVb3R8fChXb3QoWW90KSxVb3Q9R290Lm5vdygpK2pvdCl9ZnVuY3Rpb24gWW90KCl7VW90PTB9ZnVuY3Rpb24gWG90KCl7dGhpcy5fY2FsbD10aGlzLl90aW1lPXRoaXMuX25leHQ9bnVsbH1mdW5jdGlvbiAkb3QodCxlLG4pe3ZhciBpPW5ldyBYb3Q7cmV0dXJuIGkucmVzdGFydCh0LGUsbiksaX1mdW5jdGlvbiBLb3QoKXtVb3Q9KFZvdD1Hb3Qubm93KCkpK2pvdCxCb3Q9SG90PTA7dHJ5eyEoZnVuY3Rpb24gdCgpe3FvdCgpLCsrQm90O2Zvcih2YXIgdCxlPXpvdDtlOykodD1Vb3QtZS5fdGltZSk+PTAmJmUuX2NhbGwuY2FsbChudWxsLHQpLGU9ZS5fbmV4dDstLUJvdH0pKCl9ZmluYWxseXtCb3Q9MCwoZnVuY3Rpb24gZSgpe3ZhciB0LGUsbj16b3QsaT0xLzA7Zm9yKDtuOyluLl9jYWxsPyhpPm4uX3RpbWUmJihpPW4uX3RpbWUpLHQ9bixuPW4uX25leHQpOihlPW4uX25leHQsbi5fbmV4dD1udWxsLG49dD90Ll9uZXh0PWU6em90PWUpO0RvdD10LEpvdChpKX0pKCksVW90PTB9fWZ1bmN0aW9uIFpvdCgpe3ZhciB0PUdvdC5ub3coKSxlPXQtVm90O2U+MWUzJiYoam90LT1lLFZvdD10KX1mdW5jdGlvbiBKb3QodCl7Qm90fHwoSG90JiYoSG90PWNsZWFyVGltZW91dChIb3QpKSx0LVVvdD4yND8odDwxLzAmJihIb3Q9c2V0VGltZW91dChLb3QsdC1Hb3Qubm93KCktam90KSksRm90JiYoRm90PWNsZWFySW50ZXJ2YWwoRm90KSkpOihGb3R8fChWb3Q9R290Lm5vdygpLEZvdD1zZXRJbnRlcnZhbChab3QsMWUzKSksQm90PTEsV290KEtvdCkpKX1mdW5jdGlvbiBRb3QodCxlLG4pe3ZhciBpPW5ldyBYb3Q7cmV0dXJuIGkucmVzdGFydCgoZnVuY3Rpb24obil7aS5zdG9wKCksdChuK2UpfSksZT1udWxsPT1lPzA6K2UsbiksaX1Yb3QucHJvdG90eXBlPSRvdC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOlhvdCxyZXN0YXJ0OmZ1bmN0aW9uKHQsZSxuKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbiIpO249KG51bGw9PW4/cW90KCk6K24pKyhudWxsPT1lPzA6K2UpLHRoaXMuX25leHR8fERvdD09PXRoaXN8fChEb3Q/RG90Ll9uZXh0PXRoaXM6em90PXRoaXMsRG90PXRoaXMpLHRoaXMuX2NhbGw9dCx0aGlzLl90aW1lPW4sSm90KCl9LHN0b3A6ZnVuY3Rpb24oKXt0aGlzLl9jYWxsJiYodGhpcy5fY2FsbD1udWxsLHRoaXMuX3RpbWU9MS8wLEpvdCgpKX19O3ZhciB0YXQ9UG90KCJzdGFydCIsImVuZCIsImludGVycnVwdCIpLGVhdD1bXTtmdW5jdGlvbiBuYXQodCxlLG4saSxyLG8pe3ZhciBhPXQuX190cmFuc2l0aW9uO2lmKGEpe2lmKG4gaW4gYSlyZXR1cm59ZWxzZSB0Ll9fdHJhbnNpdGlvbj17fTshKGZ1bmN0aW9uIHModCxlLG4pe3ZhciBpLHI9dC5fX3RyYW5zaXRpb247ZnVuY3Rpb24gbyh0KXtuLnN0YXRlPTEsbi50aW1lci5yZXN0YXJ0KGEsbi5kZWxheSxuLnRpbWUpLG4uZGVsYXk8PXQmJmEodC1uLmRlbGF5KX1mdW5jdGlvbiBhKG8pe3ZhciBjLHUsaCxkO2lmKDEhPT1uLnN0YXRlKXJldHVybiBsKCk7Zm9yKGMgaW4gcilpZigoZD1yW2NdKS5uYW1lPT09bi5uYW1lKXtpZigzPT09ZC5zdGF0ZSlyZXR1cm4gUW90KGEpOzQ9PT1kLnN0YXRlPyhkLnN0YXRlPTYsZC50aW1lci5zdG9wKCksZC5vbi5jYWxsKCJpbnRlcnJ1cHQiLHQsdC5fX2RhdGFfXyxkLmluZGV4LGQuZ3JvdXApLGRlbGV0ZSByW2NdKTorYzxlJiYoZC5zdGF0ZT02LGQudGltZXIuc3RvcCgpLGRlbGV0ZSByW2NdKX1pZihRb3QoKGZ1bmN0aW9uKCl7Mz09PW4uc3RhdGUmJihuLnN0YXRlPTQsbi50aW1lci5yZXN0YXJ0KHMsbi5kZWxheSxuLnRpbWUpLHMobykpfSkpLG4uc3RhdGU9MixuLm9uLmNhbGwoInN0YXJ0Iix0LHQuX19kYXRhX18sbi5pbmRleCxuLmdyb3VwKSwyPT09bi5zdGF0ZSl7Zm9yKG4uc3RhdGU9MyxpPW5ldyBBcnJheShoPW4udHdlZW4ubGVuZ3RoKSxjPTAsdT0tMTtjPGg7KytjKShkPW4udHdlZW5bY10udmFsdWUuY2FsbCh0LHQuX19kYXRhX18sbi5pbmRleCxuLmdyb3VwKSkmJihpWysrdV09ZCk7aS5sZW5ndGg9dSsxfX1mdW5jdGlvbiBzKGUpe2Zvcih2YXIgcj1lPG4uZHVyYXRpb24/bi5lYXNlLmNhbGwobnVsbCxlL24uZHVyYXRpb24pOihuLnRpbWVyLnJlc3RhcnQobCksbi5zdGF0ZT01LDEpLG89LTEsYT1pLmxlbmd0aDsrK288YTspaVtvXS5jYWxsKG51bGwscik7NT09PW4uc3RhdGUmJihuLm9uLmNhbGwoImVuZCIsdCx0Ll9fZGF0YV9fLG4uaW5kZXgsbi5ncm91cCksbCgpKX1mdW5jdGlvbiBsKCl7Zm9yKHZhciBpIGluIG4uc3RhdGU9NixuLnRpbWVyLnN0b3AoKSxkZWxldGUgcltlXSxyKXJldHVybjtkZWxldGUgdC5fX3RyYW5zaXRpb259cltlXT1uLG4udGltZXI9JG90KG8sMCxuLnRpbWUpfSkodCxuLHtuYW1lOmUsaW5kZXg6aSxncm91cDpyLG9uOnRhdCx0d2VlbjplYXQsdGltZTpvLnRpbWUsZGVsYXk6by5kZWxheSxkdXJhdGlvbjpvLmR1cmF0aW9uLGVhc2U6by5lYXNlLHRpbWVyOm51bGwsc3RhdGU6MH0pfWZ1bmN0aW9uIGlhdCh0LGUpe3ZhciBuPW9hdCh0LGUpO2lmKG4uc3RhdGU+MCl0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHNjaGVkdWxlZCIpO3JldHVybiBufWZ1bmN0aW9uIHJhdCh0LGUpe3ZhciBuPW9hdCh0LGUpO2lmKG4uc3RhdGU+Mil0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHN0YXJ0ZWQiKTtyZXR1cm4gbn1mdW5jdGlvbiBvYXQodCxlKXt2YXIgbj10Ll9fdHJhbnNpdGlvbjtpZighbnx8IShuPW5bZV0pKXRocm93IG5ldyBFcnJvcigidHJhbnNpdGlvbiBub3QgZm91bmQiKTtyZXR1cm4gbn1mdW5jdGlvbiBhYXQodCxlKXt2YXIgbixpLHIsbz10Ll9fdHJhbnNpdGlvbixhPSEwO2lmKG8pe2ZvcihyIGluIGU9bnVsbD09ZT9udWxsOmUrIiIsbykobj1vW3JdKS5uYW1lPT09ZT8oaT1uLnN0YXRlPjImJm4uc3RhdGU8NSxuLnN0YXRlPTYsbi50aW1lci5zdG9wKCksaSYmbi5vbi5jYWxsKCJpbnRlcnJ1cHQiLHQsdC5fX2RhdGFfXyxuLmluZGV4LG4uZ3JvdXApLGRlbGV0ZSBvW3JdKTphPSExO2EmJmRlbGV0ZSB0Ll9fdHJhbnNpdGlvbn19ZnVuY3Rpb24gc2F0KHQsZSxuKXt0LnByb3RvdHlwZT1lLnByb3RvdHlwZT1uLG4uY29uc3RydWN0b3I9dH1mdW5jdGlvbiBsYXQodCxlKXt2YXIgbj1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKTtmb3IodmFyIGkgaW4gZSluW2ldPWVbaV07cmV0dXJuIG59ZnVuY3Rpb24gY2F0KCl7fXZhciB1YXQ9LjcsaGF0PTEvdWF0LGRhdD0iXFxzKihbKy1dP1xcZCspXFxzKiIscGF0PSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLGZhdD0iXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPyklXFxzKiIsbWF0PS9eIyhbMC05YS1mXXszLDh9KSQvLGdhdD1uZXcgUmVnRXhwKCJecmdiXFwoIitbZGF0LGRhdCxkYXRdKyJcXCkkIiksX2F0PW5ldyBSZWdFeHAoIl5yZ2JcXCgiK1tmYXQsZmF0LGZhdF0rIlxcKSQiKSx5YXQ9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tkYXQsZGF0LGRhdCxwYXRdKyJcXCkkIiksdmF0PW5ldyBSZWdFeHAoIl5yZ2JhXFwoIitbZmF0LGZhdCxmYXQscGF0XSsiXFwpJCIpLGJhdD1uZXcgUmVnRXhwKCJeaHNsXFwoIitbcGF0LGZhdCxmYXRdKyJcXCkkIikseGF0PW5ldyBSZWdFeHAoIl5oc2xhXFwoIitbcGF0LGZhdCxmYXQscGF0XSsiXFwpJCIpLHdhdD17YWxpY2VibHVlOjE1NzkyMzgzLGFudGlxdWV3aGl0ZToxNjQ0NDM3NSxhcXVhOjY1NTM1LGFxdWFtYXJpbmU6ODM4ODU2NCxhenVyZToxNTc5NDE3NSxiZWlnZToxNjExOTI2MCxiaXNxdWU6MTY3NzAyNDQsYmxhY2s6MCxibGFuY2hlZGFsbW9uZDoxNjc3MjA0NSxibHVlOjI1NSxibHVldmlvbGV0OjkwNTUyMDIsYnJvd246MTA4MjQyMzQsYnVybHl3b29kOjE0NTk2MjMxLGNhZGV0Ymx1ZTo2MjY2NTI4LGNoYXJ0cmV1c2U6ODM4ODM1MixjaG9jb2xhdGU6MTM3ODk0NzAsY29yYWw6MTY3NDQyNzIsY29ybmZsb3dlcmJsdWU6NjU5MTk4MSxjb3Juc2lsazoxNjc3NTM4OCxjcmltc29uOjE0NDIzMTAwLGN5YW46NjU1MzUsZGFya2JsdWU6MTM5LGRhcmtjeWFuOjM1NzIzLGRhcmtnb2xkZW5yb2Q6MTIwOTI5MzksZGFya2dyYXk6MTExMTkwMTcsZGFya2dyZWVuOjI1NjAwLGRhcmtncmV5OjExMTE5MDE3LGRhcmtraGFraToxMjQzMzI1OSxkYXJrbWFnZW50YTo5MTA5NjQzLGRhcmtvbGl2ZWdyZWVuOjU1OTc5OTksZGFya29yYW5nZToxNjc0NzUyMCxkYXJrb3JjaGlkOjEwMDQwMDEyLGRhcmtyZWQ6OTEwOTUwNCxkYXJrc2FsbW9uOjE1MzA4NDEwLGRhcmtzZWFncmVlbjo5NDE5OTE5LGRhcmtzbGF0ZWJsdWU6NDczNDM0NyxkYXJrc2xhdGVncmF5OjMxMDA0OTUsZGFya3NsYXRlZ3JleTozMTAwNDk1LGRhcmt0dXJxdW9pc2U6NTI5NDUsZGFya3Zpb2xldDo5Njk5NTM5LGRlZXBwaW5rOjE2NzE2OTQ3LGRlZXBza3libHVlOjQ5MTUxLGRpbWdyYXk6NjkwODI2NSxkaW1ncmV5OjY5MDgyNjUsZG9kZ2VyYmx1ZToyMDAzMTk5LGZpcmVicmljazoxMTY3NDE0NixmbG9yYWx3aGl0ZToxNjc3NTkyMCxmb3Jlc3RncmVlbjoyMjYzODQyLGZ1Y2hzaWE6MTY3MTE5MzUsZ2FpbnNib3JvOjE0NDc0NDYwLGdob3N0d2hpdGU6MTYzMTY2NzEsZ29sZDoxNjc2NjcyMCxnb2xkZW5yb2Q6MTQzMjkxMjAsZ3JheTo4NDIxNTA0LGdyZWVuOjMyNzY4LGdyZWVueWVsbG93OjExNDAzMDU1LGdyZXk6ODQyMTUwNCxob25leWRldzoxNTc5NDE2MCxob3RwaW5rOjE2NzM4NzQwLGluZGlhbnJlZDoxMzQ1ODUyNCxpbmRpZ286NDkxNTMzMCxpdm9yeToxNjc3NzIwMCxraGFraToxNTc4NzY2MCxsYXZlbmRlcjoxNTEzMjQxMCxsYXZlbmRlcmJsdXNoOjE2NzczMzY1LGxhd25ncmVlbjo4MTkwOTc2LGxlbW9uY2hpZmZvbjoxNjc3NTg4NSxsaWdodGJsdWU6MTEzOTMyNTQsbGlnaHRjb3JhbDoxNTc2MTUzNixsaWdodGN5YW46MTQ3NDU1OTksbGlnaHRnb2xkZW5yb2R5ZWxsb3c6MTY0NDgyMTAsbGlnaHRncmF5OjEzODgyMzIzLGxpZ2h0Z3JlZW46OTQ5ODI1NixsaWdodGdyZXk6MTM4ODIzMjMsbGlnaHRwaW5rOjE2NzU4NDY1LGxpZ2h0c2FsbW9uOjE2NzUyNzYyLGxpZ2h0c2VhZ3JlZW46MjE0Mjg5MCxsaWdodHNreWJsdWU6ODkwMDM0NixsaWdodHNsYXRlZ3JheTo3ODMzNzUzLGxpZ2h0c2xhdGVncmV5Ojc4MzM3NTMsbGlnaHRzdGVlbGJsdWU6MTE1ODQ3MzQsbGlnaHR5ZWxsb3c6MTY3NzcxODQsbGltZTo2NTI4MCxsaW1lZ3JlZW46MzMyOTMzMCxsaW5lbjoxNjQ0NTY3MCxtYWdlbnRhOjE2NzExOTM1LG1hcm9vbjo4Mzg4NjA4LG1lZGl1bWFxdWFtYXJpbmU6NjczNzMyMixtZWRpdW1ibHVlOjIwNSxtZWRpdW1vcmNoaWQ6MTIyMTE2NjcsbWVkaXVtcHVycGxlOjk2NjI2ODMsbWVkaXVtc2VhZ3JlZW46Mzk3ODA5NyxtZWRpdW1zbGF0ZWJsdWU6ODA4Nzc5MCxtZWRpdW1zcHJpbmdncmVlbjo2NDE1NCxtZWRpdW10dXJxdW9pc2U6NDc3MjMwMCxtZWRpdW12aW9sZXRyZWQ6MTMwNDcxNzMsbWlkbmlnaHRibHVlOjE2NDQ5MTIsbWludGNyZWFtOjE2MTIxODUwLG1pc3R5cm9zZToxNjc3MDI3Myxtb2NjYXNpbjoxNjc3MDIyOSxuYXZham93aGl0ZToxNjc2ODY4NSxuYXZ5OjEyOCxvbGRsYWNlOjE2NjQzNTU4LG9saXZlOjg0MjEzNzYsb2xpdmVkcmFiOjcwNDg3Mzksb3JhbmdlOjE2NzUzOTIwLG9yYW5nZXJlZDoxNjcyOTM0NCxvcmNoaWQ6MTQzMTU3MzQscGFsZWdvbGRlbnJvZDoxNTY1NzEzMCxwYWxlZ3JlZW46MTAwMjU4ODAscGFsZXR1cnF1b2lzZToxMTUyOTk2NixwYWxldmlvbGV0cmVkOjE0MzgxMjAzLHBhcGF5YXdoaXA6MTY3NzMwNzcscGVhY2hwdWZmOjE2NzY3NjczLHBlcnU6MTM0Njg5OTEscGluazoxNjc2MTAzNSxwbHVtOjE0NTI0NjM3LHBvd2RlcmJsdWU6MTE1OTE5MTAscHVycGxlOjgzODg3MzYscmViZWNjYXB1cnBsZTo2Njk3ODgxLHJlZDoxNjcxMTY4MCxyb3N5YnJvd246MTIzNTc1MTkscm95YWxibHVlOjQyODY5NDUsc2FkZGxlYnJvd246OTEyNzE4NyxzYWxtb246MTY0MTY4ODIsc2FuZHlicm93bjoxNjAzMjg2NCxzZWFncmVlbjozMDUwMzI3LHNlYXNoZWxsOjE2Nzc0NjM4LHNpZW5uYToxMDUwNjc5NyxzaWx2ZXI6MTI2MzIyNTYsc2t5Ymx1ZTo4OTAwMzMxLHNsYXRlYmx1ZTo2OTcwMDYxLHNsYXRlZ3JheTo3MzcyOTQ0LHNsYXRlZ3JleTo3MzcyOTQ0LHNub3c6MTY3NzU5MzAsc3ByaW5nZ3JlZW46NjU0MDcsc3RlZWxibHVlOjQ2MjA5ODAsdGFuOjEzODA4NzgwLHRlYWw6MzI4OTYsdGhpc3RsZToxNDIwNDg4OCx0b21hdG86MTY3MzcwOTUsdHVycXVvaXNlOjQyNTE4NTYsdmlvbGV0OjE1NjMxMDg2LHdoZWF0OjE2MTEzMzMxLHdoaXRlOjE2Nzc3MjE1LHdoaXRlc21va2U6MTYxMTkyODUseWVsbG93OjE2Nzc2OTYwLHllbGxvd2dyZWVuOjEwMTQ1MDc0fTtmdW5jdGlvbiBTYXQoKXtyZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXgoKX1mdW5jdGlvbiBNYXQoKXtyZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRSZ2IoKX1mdW5jdGlvbiBFYXQodCl7dmFyIGUsbjtyZXR1cm4gdD0odCsiIikudHJpbSgpLnRvTG93ZXJDYXNlKCksKGU9bWF0LmV4ZWModCkpPyhuPWVbMV0ubGVuZ3RoLGU9cGFyc2VJbnQoZVsxXSwxNiksNj09PW4/VGF0KGUpOjM9PT1uP25ldyBMYXQoZT4+OCYxNXxlPj40JjI0MCxlPj40JjE1fDI0MCZlLCgxNSZlKTw8NHwxNSZlLDEpOjg9PT1uP0NhdChlPj4yNCYyNTUsZT4+MTYmMjU1LGU+PjgmMjU1LCgyNTUmZSkvMjU1KTo0PT09bj9DYXQoZT4+MTImMTV8ZT4+OCYyNDAsZT4+OCYxNXxlPj40JjI0MCxlPj40JjE1fDI0MCZlLCgoMTUmZSk8PDR8MTUmZSkvMjU1KTpudWxsKTooZT1nYXQuZXhlYyh0KSk/bmV3IExhdChlWzFdLGVbMl0sZVszXSwxKTooZT1fYXQuZXhlYyh0KSk/bmV3IExhdCgyNTUqZVsxXS8xMDAsMjU1KmVbMl0vMTAwLDI1NSplWzNdLzEwMCwxKTooZT15YXQuZXhlYyh0KSk/Q2F0KGVbMV0sZVsyXSxlWzNdLGVbNF0pOihlPXZhdC5leGVjKHQpKT9DYXQoMjU1KmVbMV0vMTAwLDI1NSplWzJdLzEwMCwyNTUqZVszXS8xMDAsZVs0XSk6KGU9YmF0LmV4ZWModCkpP1JhdChlWzFdLGVbMl0vMTAwLGVbM10vMTAwLDEpOihlPXhhdC5leGVjKHQpKT9SYXQoZVsxXSxlWzJdLzEwMCxlWzNdLzEwMCxlWzRdKTp3YXQuaGFzT3duUHJvcGVydHkodCk/VGF0KHdhdFt0XSk6InRyYW5zcGFyZW50Ij09PXQ/bmV3IExhdChOYU4sTmFOLE5hTiwwKTpudWxsfWZ1bmN0aW9uIFRhdCh0KXtyZXR1cm4gbmV3IExhdCh0Pj4xNiYyNTUsdD4+OCYyNTUsMjU1JnQsMSl9ZnVuY3Rpb24gQ2F0KHQsZSxuLGkpe3JldHVybiBpPD0wJiYodD1lPW49TmFOKSxuZXcgTGF0KHQsZSxuLGkpfWZ1bmN0aW9uIEFhdCh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIGNhdHx8KHQ9RWF0KHQpKSx0P25ldyBMYXQoKHQ9dC5yZ2IoKSkucix0LmcsdC5iLHQub3BhY2l0eSk6bmV3IExhdH1mdW5jdGlvbiBrYXQodCxlLG4saSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP0FhdCh0KTpuZXcgTGF0KHQsZSxuLG51bGw9PWk/MTppKX1mdW5jdGlvbiBMYXQodCxlLG4saSl7dGhpcy5yPSt0LHRoaXMuZz0rZSx0aGlzLmI9K24sdGhpcy5vcGFjaXR5PStpfWZ1bmN0aW9uIFBhdCgpe3JldHVybiIjIitJYXQodGhpcy5yKStJYXQodGhpcy5nKStJYXQodGhpcy5iKX1mdW5jdGlvbiBOYXQoKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJyZ2IoIjoicmdiYSgiKStNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMucil8fDApKSsiLCAiK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5nKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmIpfHwwKSkrKDE9PT10PyIpIjoiLCAiK3QrIikiKX1mdW5jdGlvbiBJYXQodCl7cmV0dXJuKCh0PU1hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodCl8fDApKSk8MTY/IjAiOiIiKSt0LnRvU3RyaW5nKDE2KX1mdW5jdGlvbiBSYXQodCxlLG4saSl7cmV0dXJuIGk8PTA/dD1lPW49TmFOOm48PTB8fG4+PTE/dD1lPU5hTjplPD0wJiYodD1OYU4pLG5ldyB6YXQodCxlLG4saSl9ZnVuY3Rpb24gT2F0KHQpe2lmKHQgaW5zdGFuY2VvZiB6YXQpcmV0dXJuIG5ldyB6YXQodC5oLHQucyx0LmwsdC5vcGFjaXR5KTtpZih0IGluc3RhbmNlb2YgY2F0fHwodD1FYXQodCkpLCF0KXJldHVybiBuZXcgemF0O2lmKHQgaW5zdGFuY2VvZiB6YXQpcmV0dXJuIHQ7dmFyIGU9KHQ9dC5yZ2IoKSkuci8yNTUsbj10LmcvMjU1LGk9dC5iLzI1NSxyPU1hdGgubWluKGUsbixpKSxvPU1hdGgubWF4KGUsbixpKSxhPU5hTixzPW8tcixsPShvK3IpLzI7cmV0dXJuIHM/KGE9ZT09PW8/KG4taSkvcys2KihuPGkpOm49PT1vPyhpLWUpL3MrMjooZS1uKS9zKzQscy89bDwuNT9vK3I6Mi1vLXIsYSo9NjApOnM9bD4wJiZsPDE/MDphLG5ldyB6YXQoYSxzLGwsdC5vcGFjaXR5KX1mdW5jdGlvbiB6YXQodCxlLG4saSl7dGhpcy5oPSt0LHRoaXMucz0rZSx0aGlzLmw9K24sdGhpcy5vcGFjaXR5PStpfWZ1bmN0aW9uIERhdCh0LGUsbil7cmV0dXJuIDI1NSoodDw2MD9lKyhuLWUpKnQvNjA6dDwxODA/bjp0PDI0MD9lKyhuLWUpKigyNDAtdCkvNjA6ZSl9ZnVuY3Rpb24gQmF0KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX1mdW5jdGlvbiBIYXQodCl7cmV0dXJuIDE9PSh0PSt0KT9GYXQ6ZnVuY3Rpb24oZSxuKXtyZXR1cm4gbi1lPyhmdW5jdGlvbiBpKHQsZSxuKXtyZXR1cm4gdD1NYXRoLnBvdyh0LG4pLGU9TWF0aC5wb3coZSxuKS10LG49MS9uLGZ1bmN0aW9uKGkpe3JldHVybiBNYXRoLnBvdyh0K2kqZSxuKX19KShlLG4sdCk6QmF0KGlzTmFOKGUpP246ZSl9fWZ1bmN0aW9uIEZhdCh0LGUpe3ZhciBuPWUtdDtyZXR1cm4gbj8oZnVuY3Rpb24gaSh0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdCtuKmV9fSkodCxuKTpCYXQoaXNOYU4odCk/ZTp0KX1zYXQoY2F0LEVhdCx7Y29weTpmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgdGhpcy5jb25zdHJ1Y3Rvcix0aGlzLHQpfSxkaXNwbGF5YWJsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCl9LGhleDpTYXQsZm9ybWF0SGV4OlNhdCxmb3JtYXRIc2w6ZnVuY3Rpb24gVmF0KCl7cmV0dXJuIE9hdCh0aGlzKS5mb3JtYXRIc2woKX0sZm9ybWF0UmdiOk1hdCx0b1N0cmluZzpNYXR9KSxzYXQoTGF0LGthdCxsYXQoY2F0LHticmlnaHRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10P2hhdDpNYXRoLnBvdyhoYXQsdCksbmV3IExhdCh0aGlzLnIqdCx0aGlzLmcqdCx0aGlzLmIqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD91YXQ6TWF0aC5wb3codWF0LHQpLG5ldyBMYXQodGhpcy5yKnQsdGhpcy5nKnQsdGhpcy5iKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuLS41PD10aGlzLnImJnRoaXMucjwyNTUuNSYmLS41PD10aGlzLmcmJnRoaXMuZzwyNTUuNSYmLS41PD10aGlzLmImJnRoaXMuYjwyNTUuNSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9LGhleDpQYXQsZm9ybWF0SGV4OlBhdCxmb3JtYXRSZ2I6TmF0LHRvU3RyaW5nOk5hdH0pKSxzYXQoemF0LChmdW5jdGlvbiBVYXQodCxlLG4saSl7cmV0dXJuIDE9PT1hcmd1bWVudHMubGVuZ3RoP09hdCh0KTpuZXcgemF0KHQsZSxuLG51bGw9PWk/MTppKX0pLGxhdChjYXQse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/aGF0Ok1hdGgucG93KGhhdCx0KSxuZXcgemF0KHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0sZGFya2VyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/dWF0Ok1hdGgucG93KHVhdCx0KSxuZXcgemF0KHRoaXMuaCx0aGlzLnMsdGhpcy5sKnQsdGhpcy5vcGFjaXR5KX0scmdiOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5oJTM2MCszNjAqKHRoaXMuaDwwKSxlPWlzTmFOKHQpfHxpc05hTih0aGlzLnMpPzA6dGhpcy5zLG49dGhpcy5sLGk9bisobjwuNT9uOjEtbikqZSxyPTIqbi1pO3JldHVybiBuZXcgTGF0KERhdCh0Pj0yNDA/dC0yNDA6dCsxMjAscixpKSxEYXQodCxyLGkpLERhdCh0PDEyMD90KzI0MDp0LTEyMCxyLGkpLHRoaXMub3BhY2l0eSl9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuKDA8PXRoaXMucyYmdGhpcy5zPD0xfHxpc05hTih0aGlzLnMpKSYmMDw9dGhpcy5sJiZ0aGlzLmw8PTEmJjA8PXRoaXMub3BhY2l0eSYmdGhpcy5vcGFjaXR5PD0xfSxmb3JtYXRIc2w6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLm9wYWNpdHk7cmV0dXJuKDE9PT0odD1pc05hTih0KT8xOk1hdGgubWF4KDAsTWF0aC5taW4oMSx0KSkpPyJoc2woIjoiaHNsYSgiKSsodGhpcy5ofHwwKSsiLCAiKzEwMCoodGhpcy5zfHwwKSsiJSwgIisxMDAqKHRoaXMubHx8MCkrIiUiKygxPT09dD8iKSI6IiwgIit0KyIpIil9fSkpO3ZhciBqYXQ9KGZ1bmN0aW9uIHQoZSl7dmFyIG49SGF0KGUpO2Z1bmN0aW9uIGkodCxlKXt2YXIgaT1uKCh0PWthdCh0KSkuciwoZT1rYXQoZSkpLnIpLHI9bih0LmcsZS5nKSxvPW4odC5iLGUuYiksYT1GYXQodC5vcGFjaXR5LGUub3BhY2l0eSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0LnI9aShlKSx0Lmc9cihlKSx0LmI9byhlKSx0Lm9wYWNpdHk9YShlKSx0KyIifX1yZXR1cm4gaS5nYW1tYT10LGl9KSgxKTtmdW5jdGlvbiBHYXQodCxlKXtyZXR1cm4gdD0rdCxlPStlLGZ1bmN0aW9uKG4pe3JldHVybiB0KigxLW4pK2Uqbn19dmFyIFdhdD0vWy0rXT8oPzpcZCtcLj9cZCp8XC4/XGQrKSg/OltlRV1bLStdP1xkKyk/L2cscWF0PW5ldyBSZWdFeHAoV2F0LnNvdXJjZSwiZyIpO2Z1bmN0aW9uIFlhdCh0LGUpe3ZhciBuLGkscixvPVdhdC5sYXN0SW5kZXg9cWF0Lmxhc3RJbmRleD0wLGE9LTEscz1bXSxsPVtdO2Zvcih0Kz0iIixlKz0iIjsobj1XYXQuZXhlYyh0KSkmJihpPXFhdC5leGVjKGUpKTspKHI9aS5pbmRleCk+byYmKHI9ZS5zbGljZShvLHIpLHNbYV0/c1thXSs9cjpzWysrYV09ciksKG49blswXSk9PT0oaT1pWzBdKT9zW2FdP3NbYV0rPWk6c1srK2FdPWk6KHNbKythXT1udWxsLGwucHVzaCh7aTphLHg6R2F0KG4saSl9KSksbz1xYXQubGFzdEluZGV4O3JldHVybiBvPGUubGVuZ3RoJiYocj1lLnNsaWNlKG8pLHNbYV0/c1thXSs9cjpzWysrYV09cikscy5sZW5ndGg8Mj9sWzBdPyhmdW5jdGlvbiBjKHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdChlKSsiIn19KShsWzBdLngpOihmdW5jdGlvbiB1KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0fX0pKGUpOihlPWwubGVuZ3RoLGZ1bmN0aW9uKHQpe2Zvcih2YXIgbixpPTA7aTxlOysraSlzWyhuPWxbaV0pLmldPW4ueCh0KTtyZXR1cm4gcy5qb2luKCIiKX0pfXZhciBYYXQsJGF0LEthdCxaYXQsSmF0PTE4MC9NYXRoLlBJLFFhdD17dHJhbnNsYXRlWDowLHRyYW5zbGF0ZVk6MCxyb3RhdGU6MCxza2V3WDowLHNjYWxlWDoxLHNjYWxlWToxfTtmdW5jdGlvbiB0c3QodCxlLG4saSxyLG8pe3ZhciBhLHMsbDtyZXR1cm4oYT1NYXRoLnNxcnQodCp0K2UqZSkpJiYodC89YSxlLz1hKSwobD10Km4rZSppKSYmKG4tPXQqbCxpLT1lKmwpLChzPU1hdGguc3FydChuKm4raSppKSkmJihuLz1zLGkvPXMsbC89cyksdCppPGUqbiYmKHQ9LXQsZT0tZSxsPS1sLGE9LWEpLHt0cmFuc2xhdGVYOnIsdHJhbnNsYXRlWTpvLHJvdGF0ZTpNYXRoLmF0YW4yKGUsdCkqSmF0LHNrZXdYOk1hdGguYXRhbihsKSpKYXQsc2NhbGVYOmEsc2NhbGVZOnN9fWZ1bmN0aW9uIGVzdCh0LGUsbixpKXtmdW5jdGlvbiByKHQpe3JldHVybiB0Lmxlbmd0aD90LnBvcCgpKyIgIjoiIn1yZXR1cm4gZnVuY3Rpb24obyxhKXt2YXIgcz1bXSxsPVtdO3JldHVybiBvPXQobyksYT10KGEpLChmdW5jdGlvbiBjKHQsaSxyLG8sYSxzKXtpZih0IT09cnx8aSE9PW8pe3ZhciBsPWEucHVzaCgidHJhbnNsYXRlKCIsbnVsbCxlLG51bGwsbik7cy5wdXNoKHtpOmwtNCx4OkdhdCh0LHIpfSx7aTpsLTIseDpHYXQoaSxvKX0pfWVsc2Uocnx8bykmJmEucHVzaCgidHJhbnNsYXRlKCIrcitlK28rbil9KShvLnRyYW5zbGF0ZVgsby50cmFuc2xhdGVZLGEudHJhbnNsYXRlWCxhLnRyYW5zbGF0ZVkscyxsKSwoZnVuY3Rpb24gdSh0LGUsbixvKXt0IT09ZT8odC1lPjE4MD9lKz0zNjA6ZS10PjE4MCYmKHQrPTM2MCksby5wdXNoKHtpOm4ucHVzaChyKG4pKyJyb3RhdGUoIixudWxsLGkpLTIseDpHYXQodCxlKX0pKTplJiZuLnB1c2gocihuKSsicm90YXRlKCIrZStpKX0pKG8ucm90YXRlLGEucm90YXRlLHMsbCksKGZ1bmN0aW9uIGgodCxlLG4sbyl7dCE9PWU/by5wdXNoKHtpOm4ucHVzaChyKG4pKyJza2V3WCgiLG51bGwsaSktMix4OkdhdCh0LGUpfSk6ZSYmbi5wdXNoKHIobikrInNrZXdYKCIrZStpKX0pKG8uc2tld1gsYS5za2V3WCxzLGwpLChmdW5jdGlvbiBkKHQsZSxuLGksbyxhKXtpZih0IT09bnx8ZSE9PWkpe3ZhciBzPW8ucHVzaChyKG8pKyJzY2FsZSgiLG51bGwsIiwiLG51bGwsIikiKTthLnB1c2goe2k6cy00LHg6R2F0KHQsbil9LHtpOnMtMix4OkdhdChlLGkpfSl9ZWxzZSAxPT09biYmMT09PWl8fG8ucHVzaChyKG8pKyJzY2FsZSgiK24rIiwiK2krIikiKX0pKG8uc2NhbGVYLG8uc2NhbGVZLGEuc2NhbGVYLGEuc2NhbGVZLHMsbCksbz1hPW51bGwsZnVuY3Rpb24odCl7Zm9yKHZhciBlLG49LTEsaT1sLmxlbmd0aDsrK248aTspc1soZT1sW25dKS5pXT1lLngodCk7cmV0dXJuIHMuam9pbigiIil9fX12YXIgbnN0PWVzdCgoZnVuY3Rpb24gaXN0KHQpe3JldHVybiJub25lIj09PXQ/UWF0OihYYXR8fChYYXQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIiksJGF0PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxLYXQ9ZG9jdW1lbnQuZGVmYXVsdFZpZXcpLFhhdC5zdHlsZS50cmFuc2Zvcm09dCx0PUthdC5nZXRDb21wdXRlZFN0eWxlKCRhdC5hcHBlbmRDaGlsZChYYXQpLG51bGwpLmdldFByb3BlcnR5VmFsdWUoInRyYW5zZm9ybSIpLCRhdC5yZW1vdmVDaGlsZChYYXQpLHRzdCgrKHQ9dC5zbGljZSg3LC0xKS5zcGxpdCgiLCIpKVswXSwrdFsxXSwrdFsyXSwrdFszXSwrdFs0XSwrdFs1XSkpfSksInB4LCAiLCJweCkiLCJkZWcpIikscnN0PWVzdCgoZnVuY3Rpb24gb3N0KHQpe3JldHVybiBudWxsPT10P1FhdDooWmF0fHwoWmF0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCJnIikpLFphdC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsdCksKHQ9WmF0LnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkpP3RzdCgodD10Lm1hdHJpeCkuYSx0LmIsdC5jLHQuZCx0LmUsdC5mKTpRYXQpfSksIiwgIiwiKSIsIikiKTtmdW5jdGlvbiBhc3QodCxlKXt2YXIgbixpO3JldHVybiBmdW5jdGlvbigpe3ZhciByPXJhdCh0aGlzLHQpLG89ci50d2VlbjtpZihvIT09bilmb3IodmFyIGE9MCxzPShpPW49bykubGVuZ3RoO2E8czsrK2EpaWYoaVthXS5uYW1lPT09ZSl7KGk9aS5zbGljZSgpKS5zcGxpY2UoYSwxKTticmVha31yLnR3ZWVuPWl9fWZ1bmN0aW9uIHNzdCh0LGUsbil7dmFyIGkscjtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89cmF0KHRoaXMsdCksYT1vLnR3ZWVuO2lmKGEhPT1pKXtyPShpPWEpLnNsaWNlKCk7Zm9yKHZhciBzPXtuYW1lOmUsdmFsdWU6bn0sbD0wLGM9ci5sZW5ndGg7bDxjOysrbClpZihyW2xdLm5hbWU9PT1lKXtyW2xdPXM7YnJlYWt9bD09PWMmJnIucHVzaChzKX1vLnR3ZWVuPXJ9fWZ1bmN0aW9uIGxzdCh0LGUsbil7dmFyIGk9dC5faWQ7cmV0dXJuIHQuZWFjaCgoZnVuY3Rpb24oKXt2YXIgdD1yYXQodGhpcyxpKTsodC52YWx1ZXx8KHQudmFsdWU9e30pKVtlXT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pKSxmdW5jdGlvbih0KXtyZXR1cm4gb2F0KHQsaSkudmFsdWVbZV19fWZ1bmN0aW9uIGNzdCh0LGUpe3ZhciBuO3JldHVybigibnVtYmVyIj09dHlwZW9mIGU/R2F0OmUgaW5zdGFuY2VvZiBFYXQ/amF0OihuPUVhdChlKSk/KGU9bixqYXQpOllhdCkodCxlKX1mdW5jdGlvbiB1c3QodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fWZ1bmN0aW9uIGhzdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIGRzdCh0LGUsbil7dmFyIGkscjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz10aGlzLmdldEF0dHJpYnV0ZSh0KTtyZXR1cm4gbz09PW4/bnVsbDpvPT09aT9yOnI9ZShpPW8sbil9fWZ1bmN0aW9uIHBzdCh0LGUsbil7dmFyIGkscjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz10aGlzLmdldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCk7cmV0dXJuIG89PT1uP251bGw6bz09PWk/cjpyPWUoaT1vLG4pfX1mdW5jdGlvbiBmc3QodCxlLG4pe3ZhciBpLHIsbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYSxzPW4odGhpcyk7aWYobnVsbCE9cylyZXR1cm4oYT10aGlzLmdldEF0dHJpYnV0ZSh0KSk9PT1zP251bGw6YT09PWkmJnM9PT1yP286bz1lKGk9YSxyPXMpO3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX1mdW5jdGlvbiBtc3QodCxlLG4pe3ZhciBpLHIsbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYSxzPW4odGhpcyk7aWYobnVsbCE9cylyZXR1cm4oYT10aGlzLmdldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCkpPT09cz9udWxsOmE9PT1pJiZzPT09cj9vOm89ZShpPWEscj1zKTt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIGdzdCh0LGUpe2Z1bmN0aW9uIG4oKXt2YXIgbj10aGlzLGk9ZS5hcHBseShuLGFyZ3VtZW50cyk7cmV0dXJuIGkmJmZ1bmN0aW9uKGUpe24uc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLGkoZSkpfX1yZXR1cm4gbi5fdmFsdWU9ZSxufWZ1bmN0aW9uIF9zdCh0LGUpe2Z1bmN0aW9uIG4oKXt2YXIgbj10aGlzLGk9ZS5hcHBseShuLGFyZ3VtZW50cyk7cmV0dXJuIGkmJmZ1bmN0aW9uKGUpe24uc2V0QXR0cmlidXRlKHQsaShlKSl9fXJldHVybiBuLl92YWx1ZT1lLG59ZnVuY3Rpb24geXN0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7aWF0KHRoaXMsdCkuZGVsYXk9K2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiB2c3QodCxlKXtyZXR1cm4gZT0rZSxmdW5jdGlvbigpe2lhdCh0aGlzLHQpLmRlbGF5PWV9fWZ1bmN0aW9uIGJzdCh0LGUpe3JldHVybiBmdW5jdGlvbigpe3JhdCh0aGlzLHQpLmR1cmF0aW9uPStlLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19ZnVuY3Rpb24geHN0KHQsZSl7cmV0dXJuIGU9K2UsZnVuY3Rpb24oKXtyYXQodGhpcyx0KS5kdXJhdGlvbj1lfX1mdW5jdGlvbiB3c3QodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7cmF0KHRoaXMsdCkuZWFzZT1lfX1mdW5jdGlvbiBTc3QodCxlLG4pe3ZhciBpLHIsbz0oZnVuY3Rpb24gYSh0KXtyZXR1cm4odCsiIikudHJpbSgpLnNwbGl0KC9efFxzKy8pLmV2ZXJ5KChmdW5jdGlvbih0KXt2YXIgZT10LmluZGV4T2YoIi4iKTtyZXR1cm4gZT49MCYmKHQ9dC5zbGljZSgwLGUpKSwhdHx8InN0YXJ0Ij09PXR9KSl9KShlKT9pYXQ6cmF0O3JldHVybiBmdW5jdGlvbigpe3ZhciBhPW8odGhpcyx0KSxzPWEub247cyE9PWkmJihyPShpPXMpLmNvcHkoKSkub24oZSxuKSxhLm9uPXJ9fXZhciBNc3Q9SnJ0LnByb3RvdHlwZS5jb25zdHJ1Y3RvcjtmdW5jdGlvbiBFc3QodCxlLG4pe2Z1bmN0aW9uIGkoKXt2YXIgaT10aGlzLHI9ZS5hcHBseShpLGFyZ3VtZW50cyk7cmV0dXJuIHImJmZ1bmN0aW9uKGUpe2kuc3R5bGUuc2V0UHJvcGVydHkodCxyKGUpLG4pfX1yZXR1cm4gaS5fdmFsdWU9ZSxpfXZhciBUc3Q9MDtmdW5jdGlvbiBDc3QodCxlLG4saSl7dGhpcy5fZ3JvdXBzPXQsdGhpcy5fcGFyZW50cz1lLHRoaXMuX25hbWU9bix0aGlzLl9pZD1pfWZ1bmN0aW9uIEFzdCh0KXtyZXR1cm4gSnJ0KCkudHJhbnNpdGlvbih0KX1mdW5jdGlvbiBrc3QoKXtyZXR1cm4rK1RzdH12YXIgTHN0PUpydC5wcm90b3R5cGU7Q3N0LnByb3RvdHlwZT1Bc3QucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpDc3Qsc2VsZWN0OmZ1bmN0aW9uIFBzdCh0KXt2YXIgZT10aGlzLl9uYW1lLG49dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PUppdCh0KSk7Zm9yKHZhciBpPXRoaXMuX2dyb3VwcyxyPWkubGVuZ3RoLG89bmV3IEFycmF5KHIpLGE9MDthPHI7KythKWZvcih2YXIgcyxsLGM9aVthXSx1PWMubGVuZ3RoLGg9b1thXT1uZXcgQXJyYXkodSksZD0wO2Q8dTsrK2QpKHM9Y1tkXSkmJihsPXQuY2FsbChzLHMuX19kYXRhX18sZCxjKSkmJigiX19kYXRhX18iaW4gcyYmKGwuX19kYXRhX189cy5fX2RhdGFfXyksaFtkXT1sLG5hdChoW2RdLGUsbixkLGgsb2F0KHMsbikpKTtyZXR1cm4gbmV3IENzdChvLHRoaXMuX3BhcmVudHMsZSxuKX0sc2VsZWN0QWxsOmZ1bmN0aW9uIE5zdCh0KXt2YXIgZT10aGlzLl9uYW1lLG49dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PXRydCh0KSk7Zm9yKHZhciBpPXRoaXMuX2dyb3VwcyxyPWkubGVuZ3RoLG89W10sYT1bXSxzPTA7czxyOysrcylmb3IodmFyIGwsYz1pW3NdLHU9Yy5sZW5ndGgsaD0wO2g8dTsrK2gpaWYobD1jW2hdKXtmb3IodmFyIGQscD10LmNhbGwobCxsLl9fZGF0YV9fLGgsYyksZj1vYXQobCxuKSxtPTAsZz1wLmxlbmd0aDttPGc7KyttKShkPXBbbV0pJiZuYXQoZCxlLG4sbSxwLGYpO28ucHVzaChwKSxhLnB1c2gobCl9cmV0dXJuIG5ldyBDc3QobyxhLGUsbil9LGZpbHRlcjpmdW5jdGlvbiBJc3QodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PWVydCh0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLGk9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWZvcih2YXIgbyxhPWVbcl0scz1hLmxlbmd0aCxsPWlbcl09W10sYz0wO2M8czsrK2MpKG89YVtjXSkmJnQuY2FsbChvLG8uX19kYXRhX18sYyxhKSYmbC5wdXNoKG8pO3JldHVybiBuZXcgQ3N0KGksdGhpcy5fcGFyZW50cyx0aGlzLl9uYW1lLHRoaXMuX2lkKX0sbWVyZ2U6ZnVuY3Rpb24gUnN0KHQpe2lmKHQuX2lkIT09dGhpcy5faWQpdGhyb3cgbmV3IEVycm9yO2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj10Ll9ncm91cHMsaT1lLmxlbmd0aCxyPU1hdGgubWluKGksbi5sZW5ndGgpLG89bmV3IEFycmF5KGkpLGE9MDthPHI7KythKWZvcih2YXIgcyxsPWVbYV0sYz1uW2FdLHU9bC5sZW5ndGgsaD1vW2FdPW5ldyBBcnJheSh1KSxkPTA7ZDx1OysrZCkocz1sW2RdfHxjW2RdKSYmKGhbZF09cyk7Zm9yKDthPGk7KythKW9bYV09ZVthXTtyZXR1cm4gbmV3IENzdChvLHRoaXMuX3BhcmVudHMsdGhpcy5fbmFtZSx0aGlzLl9pZCl9LHNlbGVjdGlvbjpmdW5jdGlvbiBPc3QoKXtyZXR1cm4gbmV3IE1zdCh0aGlzLl9ncm91cHMsdGhpcy5fcGFyZW50cyl9LHRyYW5zaXRpb246ZnVuY3Rpb24genN0KCl7Zm9yKHZhciB0PXRoaXMuX25hbWUsZT10aGlzLl9pZCxuPWtzdCgpLGk9dGhpcy5fZ3JvdXBzLHI9aS5sZW5ndGgsbz0wO288cjsrK28pZm9yKHZhciBhLHM9aVtvXSxsPXMubGVuZ3RoLGM9MDtjPGw7KytjKWlmKGE9c1tjXSl7dmFyIHU9b2F0KGEsZSk7bmF0KGEsdCxuLGMscyx7dGltZTp1LnRpbWUrdS5kZWxheSt1LmR1cmF0aW9uLGRlbGF5OjAsZHVyYXRpb246dS5kdXJhdGlvbixlYXNlOnUuZWFzZX0pfXJldHVybiBuZXcgQ3N0KGksdGhpcy5fcGFyZW50cyx0LG4pfSxjYWxsOkxzdC5jYWxsLG5vZGVzOkxzdC5ub2Rlcyxub2RlOkxzdC5ub2RlLHNpemU6THN0LnNpemUsZW1wdHk6THN0LmVtcHR5LGVhY2g6THN0LmVhY2gsb246ZnVuY3Rpb24gRHN0KHQsZSl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj9vYXQodGhpcy5ub2RlKCksbikub24ub24odCk6dGhpcy5lYWNoKFNzdChuLHQsZSkpfSxhdHRyOmZ1bmN0aW9uIEJzdCh0LGUpe3ZhciBuPVlpdCh0KSxpPSJ0cmFuc2Zvcm0iPT09bj9yc3Q6Y3N0O3JldHVybiB0aGlzLmF0dHJUd2Vlbih0LCJmdW5jdGlvbiI9PXR5cGVvZiBlPyhuLmxvY2FsP21zdDpmc3QpKG4saSxsc3QodGhpcywiYXR0ci4iK3QsZSkpOm51bGw9PWU/KG4ubG9jYWw/aHN0OnVzdCkobik6KG4ubG9jYWw/cHN0OmRzdCkobixpLGUrIiIpKX0sYXR0clR3ZWVuOmZ1bmN0aW9uIEhzdCh0LGUpe3ZhciBuPSJhdHRyLiIrdDtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKG49dGhpcy50d2VlbihuKSkmJm4uX3ZhbHVlO2lmKG51bGw9PWUpcmV0dXJuIHRoaXMudHdlZW4obixudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3I7dmFyIGk9WWl0KHQpO3JldHVybiB0aGlzLnR3ZWVuKG4sKGkubG9jYWw/Z3N0Ol9zdCkoaSxlKSl9LHN0eWxlOmZ1bmN0aW9uIEZzdCh0LGUsbil7dmFyIGk9InRyYW5zZm9ybSI9PSh0Kz0iIik/bnN0OmNzdDtyZXR1cm4gbnVsbD09ZT90aGlzLnN0eWxlVHdlZW4odCwoZnVuY3Rpb24gbyh0LGUpe3ZhciBuLGkscjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz1fcnQodGhpcyx0KSxhPSh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLF9ydCh0aGlzLHQpKTtyZXR1cm4gbz09PWE/bnVsbDpvPT09biYmYT09PWk/cjpyPWUobj1vLGk9YSl9fSkodCxpKSkub24oImVuZC5zdHlsZS4iK3QsKGZ1bmN0aW9uIHIodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KX19KSh0KSk6dGhpcy5zdHlsZVR3ZWVuKHQsImZ1bmN0aW9uIj09dHlwZW9mIGU/KGZ1bmN0aW9uIGEodCxlLG4pe3ZhciBpLHIsbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT1fcnQodGhpcyx0KSxzPW4odGhpcyk7cmV0dXJuIG51bGw9PXMmJih0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLHM9X3J0KHRoaXMsdCkpLGE9PT1zP251bGw6YT09PWkmJnM9PT1yP286bz1lKGk9YSxyPXMpfX0pKHQsaSxsc3QodGhpcywic3R5bGUuIit0LGUpKTooZnVuY3Rpb24gcyh0LGUsbil7dmFyIGkscjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz1fcnQodGhpcyx0KTtyZXR1cm4gbz09PW4/bnVsbDpvPT09aT9yOnI9ZShpPW8sbil9fSkodCxpLGUrIiIpLG4pfSxzdHlsZVR3ZWVuOmZ1bmN0aW9uIFZzdCh0LGUsbil7dmFyIGk9InN0eWxlLiIrKHQrPSIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKGk9dGhpcy50d2VlbihpKSkmJmkuX3ZhbHVlO2lmKG51bGw9PWUpcmV0dXJuIHRoaXMudHdlZW4oaSxudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHRoaXMudHdlZW4oaSxFc3QodCxlLG51bGw9PW4/IiI6bikpfSx0ZXh0OmZ1bmN0aW9uIFVzdCh0KXtyZXR1cm4gdGhpcy50d2VlbigidGV4dCIsImZ1bmN0aW9uIj09dHlwZW9mIHQ/KGZ1bmN0aW9uIGUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dCh0aGlzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PWU/IiI6ZX19KShsc3QodGhpcywidGV4dCIsdCkpOihmdW5jdGlvbiBuKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19KShudWxsPT10PyIiOnQrIiIpKX0scmVtb3ZlOmZ1bmN0aW9uIGpzdCgpe3JldHVybiB0aGlzLm9uKCJlbmQucmVtb3ZlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD10aGlzLnBhcmVudE5vZGU7Zm9yKHZhciBuIGluIHRoaXMuX190cmFuc2l0aW9uKWlmKCtuIT09ZSlyZXR1cm47dCYmdC5yZW1vdmVDaGlsZCh0aGlzKX19KSh0aGlzLl9pZCkpfSx0d2VlbjpmdW5jdGlvbiBHc3QodCxlKXt2YXIgbj10aGlzLl9pZDtpZih0Kz0iIixhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgaSxyPW9hdCh0aGlzLm5vZGUoKSxuKS50d2VlbixvPTAsYT1yLmxlbmd0aDtvPGE7KytvKWlmKChpPXJbb10pLm5hbWU9PT10KXJldHVybiBpLnZhbHVlO3JldHVybiBudWxsfXJldHVybiB0aGlzLmVhY2goKG51bGw9PWU/YXN0OnNzdCkobix0LGUpKX0sZGVsYXk6ZnVuY3Rpb24gV3N0KHQpe3ZhciBlPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIHQ/eXN0OnZzdCkoZSx0KSk6b2F0KHRoaXMubm9kZSgpLGUpLmRlbGF5fSxkdXJhdGlvbjpmdW5jdGlvbiBxc3QodCl7dmFyIGU9dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9ic3Q6eHN0KShlLHQpKTpvYXQodGhpcy5ub2RlKCksZSkuZHVyYXRpb259LGVhc2U6ZnVuY3Rpb24gWXN0KHQpe3ZhciBlPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCh3c3QoZSx0KSk6b2F0KHRoaXMubm9kZSgpLGUpLmVhc2V9fTt2YXIgWHN0PXt0aW1lOm51bGwsZGVsYXk6MCxkdXJhdGlvbjoyNTAsZWFzZTpxZn07ZnVuY3Rpb24gJHN0KHQsZSl7Zm9yKHZhciBuOyEobj10Ll9fdHJhbnNpdGlvbil8fCEobj1uW2VdKTspaWYoISh0PXQucGFyZW50Tm9kZSkpcmV0dXJuIFhzdC50aW1lPXFvdCgpLFhzdDtyZXR1cm4gbn1KcnQucHJvdG90eXBlLmludGVycnVwdD1mdW5jdGlvbiBLc3QodCl7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXthYXQodGhpcyx0KX0pKX0sSnJ0LnByb3RvdHlwZS50cmFuc2l0aW9uPWZ1bmN0aW9uIFpzdCh0KXt2YXIgZSxuO3QgaW5zdGFuY2VvZiBDc3Q/KGU9dC5faWQsdD10Ll9uYW1lKTooZT1rc3QoKSwobj1Yc3QpLnRpbWU9cW90KCksdD1udWxsPT10P251bGw6dCsiIik7Zm9yKHZhciBpPXRoaXMuX2dyb3VwcyxyPWkubGVuZ3RoLG89MDtvPHI7KytvKWZvcih2YXIgYSxzPWlbb10sbD1zLmxlbmd0aCxjPTA7YzxsOysrYykoYT1zW2NdKSYmbmF0KGEsdCxlLGMscyxufHwkc3QoYSxlKSk7cmV0dXJuIG5ldyBDc3QoaSx0aGlzLl9wYXJlbnRzLHQsZSl9O3ZhciBKc3Q9W251bGxdO2Z1bmN0aW9uIFFzdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19ZnVuY3Rpb24gdGx0KHQpe3JldHVybiB0WzBdfWZ1bmN0aW9uIGVsdCh0KXtyZXR1cm4gdFsxXX1mdW5jdGlvbiBubHQoKXt0aGlzLl89bnVsbH1mdW5jdGlvbiBpbHQodCl7dC5VPXQuQz10Lkw9dC5SPXQuUD10Lk49bnVsbH1mdW5jdGlvbiBybHQodCxlKXt2YXIgbj1lLGk9ZS5SLHI9bi5VO3I/ci5MPT09bj9yLkw9aTpyLlI9aTp0Ll89aSxpLlU9cixuLlU9aSxuLlI9aS5MLG4uUiYmKG4uUi5VPW4pLGkuTD1ufWZ1bmN0aW9uIG9sdCh0LGUpe3ZhciBuPWUsaT1lLkwscj1uLlU7cj9yLkw9PT1uP3IuTD1pOnIuUj1pOnQuXz1pLGkuVT1yLG4uVT1pLG4uTD1pLlIsbi5MJiYobi5MLlU9biksaS5SPW59ZnVuY3Rpb24gYWx0KHQpe2Zvcig7dC5MOyl0PXQuTDtyZXR1cm4gdH1mdW5jdGlvbiBzbHQodCxlLG4saSl7dmFyIHI9W251bGwsbnVsbF0sbz1QbHQucHVzaChyKS0xO3JldHVybiByLmxlZnQ9dCxyLnJpZ2h0PWUsbiYmY2x0KHIsdCxlLG4pLGkmJmNsdChyLGUsdCxpKSxrbHRbdC5pbmRleF0uaGFsZmVkZ2VzLnB1c2gobyksa2x0W2UuaW5kZXhdLmhhbGZlZGdlcy5wdXNoKG8pLHJ9ZnVuY3Rpb24gbGx0KHQsZSxuKXt2YXIgaT1bZSxuXTtyZXR1cm4gaS5sZWZ0PXQsaX1mdW5jdGlvbiBjbHQodCxlLG4saSl7dFswXXx8dFsxXT90LmxlZnQ9PT1uP3RbMV09aTp0WzBdPWk6KHRbMF09aSx0LmxlZnQ9ZSx0LnJpZ2h0PW4pfWZ1bmN0aW9uIHVsdCh0LGUsbixpLHIpe3ZhciBvLGE9dFswXSxzPXRbMV0sbD1hWzBdLGM9YVsxXSx1PTAsaD0xLGQ9c1swXS1sLHA9c1sxXS1jO2lmKG89ZS1sLGR8fCEobz4wKSl7aWYoby89ZCxkPDApe2lmKG88dSlyZXR1cm47bzxoJiYoaD1vKX1lbHNlIGlmKGQ+MCl7aWYobz5oKXJldHVybjtvPnUmJih1PW8pfWlmKG89aS1sLGR8fCEobzwwKSl7aWYoby89ZCxkPDApe2lmKG8+aClyZXR1cm47bz51JiYodT1vKX1lbHNlIGlmKGQ+MCl7aWYobzx1KXJldHVybjtvPGgmJihoPW8pfWlmKG89bi1jLHB8fCEobz4wKSl7aWYoby89cCxwPDApe2lmKG88dSlyZXR1cm47bzxoJiYoaD1vKX1lbHNlIGlmKHA+MCl7aWYobz5oKXJldHVybjtvPnUmJih1PW8pfWlmKG89ci1jLHB8fCEobzwwKSl7aWYoby89cCxwPDApe2lmKG8+aClyZXR1cm47bz51JiYodT1vKX1lbHNlIGlmKHA+MCl7aWYobzx1KXJldHVybjtvPGgmJihoPW8pfXJldHVybiEodT4wfHxoPDEpfHwodT4wJiYodFswXT1bbCt1KmQsYyt1KnBdKSxoPDEmJih0WzFdPVtsK2gqZCxjK2gqcF0pLCEwKX19fX19ZnVuY3Rpb24gaGx0KHQsZSxuLGkscil7dmFyIG89dFsxXTtpZihvKXJldHVybiEwO3ZhciBhLHMsbD10WzBdLGM9dC5sZWZ0LHU9dC5yaWdodCxoPWNbMF0sZD1jWzFdLHA9dVswXSxmPXVbMV0sbT0oaCtwKS8yO2lmKGY9PT1kKXtpZihtPGV8fG0+PWkpcmV0dXJuO2lmKGg+cCl7aWYobCl7aWYobFsxXT49cilyZXR1cm59ZWxzZSBsPVttLG5dO289W20scl19ZWxzZXtpZihsKXtpZihsWzFdPG4pcmV0dXJufWVsc2UgbD1bbSxyXTtvPVttLG5dfX1lbHNlIGlmKHM9KGQrZikvMi0oYT0oaC1wKS8oZi1kKSkqbSxhPC0xfHxhPjEpaWYoaD5wKXtpZihsKXtpZihsWzFdPj1yKXJldHVybn1lbHNlIGw9WyhuLXMpL2Esbl07bz1bKHItcykvYSxyXX1lbHNle2lmKGwpe2lmKGxbMV08bilyZXR1cm59ZWxzZSBsPVsoci1zKS9hLHJdO289WyhuLXMpL2Esbl19ZWxzZSBpZihkPGYpe2lmKGwpe2lmKGxbMF0+PWkpcmV0dXJufWVsc2UgbD1bZSxhKmUrc107bz1baSxhKmkrc119ZWxzZXtpZihsKXtpZihsWzBdPGUpcmV0dXJufWVsc2UgbD1baSxhKmkrc107bz1bZSxhKmUrc119cmV0dXJuIHRbMF09bCx0WzFdPW8sITB9ZnVuY3Rpb24gZGx0KHQsZSl7dmFyIG49dC5zaXRlLGk9ZS5sZWZ0LHI9ZS5yaWdodDtyZXR1cm4gbj09PXImJihyPWksaT1uKSxyP01hdGguYXRhbjIoclsxXS1pWzFdLHJbMF0taVswXSk6KG49PT1pPyhpPWVbMV0scj1lWzBdKTooaT1lWzBdLHI9ZVsxXSksTWF0aC5hdGFuMihpWzBdLXJbMF0sclsxXS1pWzFdKSl9ZnVuY3Rpb24gcGx0KHQsZSl7cmV0dXJuIGVbKyhlLmxlZnQhPT10LnNpdGUpXX1mdW5jdGlvbiBmbHQodCxlKXtyZXR1cm4gZVsrKGUubGVmdD09PXQuc2l0ZSldfW5sdC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOm5sdCxpbnNlcnQ6ZnVuY3Rpb24odCxlKXt2YXIgbixpLHI7aWYodCl7aWYoZS5QPXQsZS5OPXQuTix0Lk4mJih0Lk4uUD1lKSx0Lk49ZSx0LlIpe2Zvcih0PXQuUjt0Lkw7KXQ9dC5MO3QuTD1lfWVsc2UgdC5SPWU7bj10fWVsc2UgdGhpcy5fPyh0PWFsdCh0aGlzLl8pLGUuUD1udWxsLGUuTj10LHQuUD10Lkw9ZSxuPXQpOihlLlA9ZS5OPW51bGwsdGhpcy5fPWUsbj1udWxsKTtmb3IoZS5MPWUuUj1udWxsLGUuVT1uLGUuQz0hMCx0PWU7biYmbi5DOyluPT09KGk9bi5VKS5MPyhyPWkuUikmJnIuQz8obi5DPXIuQz0hMSxpLkM9ITAsdD1pKToodD09PW4uUiYmKHJsdCh0aGlzLG4pLG49KHQ9bikuVSksbi5DPSExLGkuQz0hMCxvbHQodGhpcyxpKSk6KHI9aS5MKSYmci5DPyhuLkM9ci5DPSExLGkuQz0hMCx0PWkpOih0PT09bi5MJiYob2x0KHRoaXMsbiksbj0odD1uKS5VKSxuLkM9ITEsaS5DPSEwLHJsdCh0aGlzLGkpKSxuPXQuVTt0aGlzLl8uQz0hMX0scmVtb3ZlOmZ1bmN0aW9uKHQpe3QuTiYmKHQuTi5QPXQuUCksdC5QJiYodC5QLk49dC5OKSx0Lk49dC5QPW51bGw7dmFyIGUsbixpLHI9dC5VLG89dC5MLGE9dC5SO2lmKG49bz9hP2FsdChhKTpvOmEscj9yLkw9PT10P3IuTD1uOnIuUj1uOnRoaXMuXz1uLG8mJmE/KGk9bi5DLG4uQz10LkMsbi5MPW8sby5VPW4sbiE9PWE/KHI9bi5VLG4uVT10LlUsci5MPXQ9bi5SLG4uUj1hLGEuVT1uKToobi5VPXIscj1uLHQ9bi5SKSk6KGk9dC5DLHQ9biksdCYmKHQuVT1yKSwhaSlpZih0JiZ0LkMpdC5DPSExO2Vsc2V7ZG97aWYodD09PXRoaXMuXylicmVhaztpZih0PT09ci5MKXtpZigoZT1yLlIpLkMmJihlLkM9ITEsci5DPSEwLHJsdCh0aGlzLHIpLGU9ci5SKSxlLkwmJmUuTC5DfHxlLlImJmUuUi5DKXtlLlImJmUuUi5DfHwoZS5MLkM9ITEsZS5DPSEwLG9sdCh0aGlzLGUpLGU9ci5SKSxlLkM9ci5DLHIuQz1lLlIuQz0hMSxybHQodGhpcyxyKSx0PXRoaXMuXzticmVha319ZWxzZSBpZigoZT1yLkwpLkMmJihlLkM9ITEsci5DPSEwLG9sdCh0aGlzLHIpLGU9ci5MKSxlLkwmJmUuTC5DfHxlLlImJmUuUi5DKXtlLkwmJmUuTC5DfHwoZS5SLkM9ITEsZS5DPSEwLHJsdCh0aGlzLGUpLGU9ci5MKSxlLkM9ci5DLHIuQz1lLkwuQz0hMSxvbHQodGhpcyxyKSx0PXRoaXMuXzticmVha31lLkM9ITAsdD1yLHI9ci5VfXdoaWxlKCF0LkMpO3QmJih0LkM9ITEpfX19O3ZhciBtbHQsZ2x0PVtdO2Z1bmN0aW9uIF9sdCgpe2lsdCh0aGlzKSx0aGlzLng9dGhpcy55PXRoaXMuYXJjPXRoaXMuc2l0ZT10aGlzLmN5PW51bGx9ZnVuY3Rpb24geWx0KHQpe3ZhciBlPXQuUCxuPXQuTjtpZihlJiZuKXt2YXIgaT1lLnNpdGUscj10LnNpdGUsbz1uLnNpdGU7aWYoaSE9PW8pe3ZhciBhPXJbMF0scz1yWzFdLGw9aVswXS1hLGM9aVsxXS1zLHU9b1swXS1hLGg9b1sxXS1zLGQ9MioobCpoLWMqdSk7aWYoIShkPj0tSWx0KSl7dmFyIHA9bCpsK2MqYyxmPXUqdStoKmgsbT0oaCpwLWMqZikvZCxnPShsKmYtdSpwKS9kLF89Z2x0LnBvcCgpfHxuZXcgX2x0O18uYXJjPXQsXy5zaXRlPXIsXy54PW0rYSxfLnk9KF8uY3k9ZytzKStNYXRoLnNxcnQobSptK2cqZyksdC5jaXJjbGU9Xztmb3IodmFyIHk9bnVsbCx2PUxsdC5fO3Y7KWlmKF8ueTx2Lnl8fF8ueT09PXYueSYmXy54PD12Lngpe2lmKCF2Lkwpe3k9di5QO2JyZWFrfXY9di5MfWVsc2V7aWYoIXYuUil7eT12O2JyZWFrfXY9di5SfUxsdC5pbnNlcnQoeSxfKSx5fHwobWx0PV8pfX19fWZ1bmN0aW9uIHZsdCh0KXt2YXIgZT10LmNpcmNsZTtlJiYoZS5QfHwobWx0PWUuTiksTGx0LnJlbW92ZShlKSxnbHQucHVzaChlKSxpbHQoZSksdC5jaXJjbGU9bnVsbCl9dmFyIGJsdD1bXTtmdW5jdGlvbiB4bHQoKXtpbHQodGhpcyksdGhpcy5lZGdlPXRoaXMuc2l0ZT10aGlzLmNpcmNsZT1udWxsfWZ1bmN0aW9uIHdsdCh0KXt2YXIgZT1ibHQucG9wKCl8fG5ldyB4bHQ7cmV0dXJuIGUuc2l0ZT10LGV9ZnVuY3Rpb24gU2x0KHQpe3ZsdCh0KSxBbHQucmVtb3ZlKHQpLGJsdC5wdXNoKHQpLGlsdCh0KX1mdW5jdGlvbiBNbHQodCl7dmFyIGU9dC5jaXJjbGUsbj1lLngsaT1lLmN5LHI9W24saV0sbz10LlAsYT10Lk4scz1bdF07U2x0KHQpO2Zvcih2YXIgbD1vO2wuY2lyY2xlJiZNYXRoLmFicyhuLWwuY2lyY2xlLngpPE5sdCYmTWF0aC5hYnMoaS1sLmNpcmNsZS5jeSk8Tmx0OylvPWwuUCxzLnVuc2hpZnQobCksU2x0KGwpLGw9bztzLnVuc2hpZnQobCksdmx0KGwpO2Zvcih2YXIgYz1hO2MuY2lyY2xlJiZNYXRoLmFicyhuLWMuY2lyY2xlLngpPE5sdCYmTWF0aC5hYnMoaS1jLmNpcmNsZS5jeSk8Tmx0OylhPWMuTixzLnB1c2goYyksU2x0KGMpLGM9YTtzLnB1c2goYyksdmx0KGMpO3ZhciB1LGg9cy5sZW5ndGg7Zm9yKHU9MTt1PGg7Kyt1KWNsdCgoYz1zW3VdKS5lZGdlLChsPXNbdS0xXSkuc2l0ZSxjLnNpdGUscik7KGM9c1toLTFdKS5lZGdlPXNsdCgobD1zWzBdKS5zaXRlLGMuc2l0ZSxudWxsLHIpLHlsdChsKSx5bHQoYyl9ZnVuY3Rpb24gRWx0KHQpe2Zvcih2YXIgZSxuLGkscixvPXRbMF0sYT10WzFdLHM9QWx0Ll87czspaWYoKGk9VGx0KHMsYSktbyk+Tmx0KXM9cy5MO2Vsc2V7aWYoISgocj1vLUNsdChzLGEpKT5ObHQpKXtpPi1ObHQ/KGU9cy5QLG49cyk6cj4tTmx0PyhlPXMsbj1zLk4pOmU9bj1zO2JyZWFrfWlmKCFzLlIpe2U9czticmVha31zPXMuUn0hKGZ1bmN0aW9uIGwodCl7cmV0dXJuIGtsdFt0LmluZGV4XT17c2l0ZTp0LGhhbGZlZGdlczpbXX19KSh0KTt2YXIgYz13bHQodCk7aWYoQWx0Lmluc2VydChlLGMpLGV8fG4pe2lmKGU9PT1uKXJldHVybiB2bHQoZSksbj13bHQoZS5zaXRlKSxBbHQuaW5zZXJ0KGMsbiksYy5lZGdlPW4uZWRnZT1zbHQoZS5zaXRlLGMuc2l0ZSkseWx0KGUpLHZvaWQgeWx0KG4pO2lmKG4pe3ZsdChlKSx2bHQobik7dmFyIHU9ZS5zaXRlLGg9dVswXSxkPXVbMV0scD10WzBdLWgsZj10WzFdLWQsbT1uLnNpdGUsZz1tWzBdLWgsXz1tWzFdLWQseT0yKihwKl8tZipnKSx2PXAqcCtmKmYsYj1nKmcrXypfLHg9WyhfKnYtZipiKS95K2gsKHAqYi1nKnYpL3krZF07Y2x0KG4uZWRnZSx1LG0seCksYy5lZGdlPXNsdCh1LHQsbnVsbCx4KSxuLmVkZ2U9c2x0KHQsbSxudWxsLHgpLHlsdChlKSx5bHQobil9ZWxzZSBjLmVkZ2U9c2x0KGUuc2l0ZSxjLnNpdGUpfX1mdW5jdGlvbiBUbHQodCxlKXt2YXIgbj10LnNpdGUsaT1uWzBdLHI9blsxXSxvPXItZTtpZighbylyZXR1cm4gaTt2YXIgYT10LlA7aWYoIWEpcmV0dXJuLTEvMDt2YXIgcz0obj1hLnNpdGUpWzBdLGw9blsxXSxjPWwtZTtpZighYylyZXR1cm4gczt2YXIgdT1zLWksaD0xL28tMS9jLGQ9dS9jO3JldHVybiBoPygtZCtNYXRoLnNxcnQoZCpkLTIqaCoodSp1LygtMipjKS1sK2MvMityLW8vMikpKS9oK2k6KGkrcykvMn1mdW5jdGlvbiBDbHQodCxlKXt2YXIgbj10Lk47aWYobilyZXR1cm4gVGx0KG4sZSk7dmFyIGk9dC5zaXRlO3JldHVybiBpWzFdPT09ZT9pWzBdOjEvMH12YXIgQWx0LGtsdCxMbHQsUGx0LE5sdD0xZS02LElsdD0xZS0xMjtmdW5jdGlvbiBSbHQodCxlLG4pe3JldHVybih0WzBdLW5bMF0pKihlWzFdLXRbMV0pLSh0WzBdLWVbMF0pKihuWzFdLXRbMV0pfWZ1bmN0aW9uIE9sdCh0LGUpe3JldHVybiBlWzFdLXRbMV18fGVbMF0tdFswXX1mdW5jdGlvbiB6bHQodCxlKXt2YXIgbixpLHIsbz10LnNvcnQoT2x0KS5wb3AoKTtmb3IoUGx0PVtdLGtsdD1uZXcgQXJyYXkodC5sZW5ndGgpLEFsdD1uZXcgbmx0LExsdD1uZXcgbmx0OzspaWYocj1tbHQsbyYmKCFyfHxvWzFdPHIueXx8b1sxXT09PXIueSYmb1swXTxyLngpKW9bMF09PT1uJiZvWzFdPT09aXx8KEVsdChvKSxuPW9bMF0saT1vWzFdKSxvPXQucG9wKCk7ZWxzZXtpZighcilicmVhaztNbHQoci5hcmMpfWlmKChmdW5jdGlvbiBhKCl7Zm9yKHZhciB0LGUsbixpLHI9MCxvPWtsdC5sZW5ndGg7cjxvOysrcilpZigodD1rbHRbcl0pJiYoaT0oZT10LmhhbGZlZGdlcykubGVuZ3RoKSl7dmFyIGE9bmV3IEFycmF5KGkpLHM9bmV3IEFycmF5KGkpO2ZvcihuPTA7bjxpOysrbilhW25dPW4sc1tuXT1kbHQodCxQbHRbZVtuXV0pO2ZvcihhLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHNbZV0tc1t0XX0pKSxuPTA7bjxpOysrbilzW25dPWVbYVtuXV07Zm9yKG49MDtuPGk7KytuKWVbbl09c1tuXX19KSgpLGUpe3ZhciBzPStlWzBdWzBdLGw9K2VbMF1bMV0sYz0rZVsxXVswXSx1PStlWzFdWzFdOyEoZnVuY3Rpb24gaCh0LGUsbixpKXtmb3IodmFyIHIsbz1QbHQubGVuZ3RoO28tLTspaGx0KHI9UGx0W29dLHQsZSxuLGkpJiZ1bHQocix0LGUsbixpKSYmKE1hdGguYWJzKHJbMF1bMF0tclsxXVswXSk+Tmx0fHxNYXRoLmFicyhyWzBdWzFdLXJbMV1bMV0pPk5sdCl8fGRlbGV0ZSBQbHRbb119KShzLGwsYyx1KSwoZnVuY3Rpb24gZCh0LGUsbixpKXt2YXIgcixvLGEscyxsLGMsdSxoLGQscCxmLG0sZz1rbHQubGVuZ3RoLF89ITA7Zm9yKHI9MDtyPGc7KytyKWlmKG89a2x0W3JdKXtmb3IoYT1vLnNpdGUscz0obD1vLmhhbGZlZGdlcykubGVuZ3RoO3MtLTspUGx0W2xbc11dfHxsLnNwbGljZShzLDEpO2ZvcihzPTAsYz1sLmxlbmd0aDtzPGM7KWY9KHA9Zmx0KG8sUGx0W2xbc11dKSlbMF0sbT1wWzFdLGg9KHU9cGx0KG8sUGx0W2xbKytzJWNdXSkpWzBdLGQ9dVsxXSwoTWF0aC5hYnMoZi1oKT5ObHR8fE1hdGguYWJzKG0tZCk+Tmx0KSYmKGwuc3BsaWNlKHMsMCxQbHQucHVzaChsbHQoYSxwLE1hdGguYWJzKGYtdCk8Tmx0JiZpLW0+Tmx0P1t0LE1hdGguYWJzKGgtdCk8Tmx0P2Q6aV06TWF0aC5hYnMobS1pKTxObHQmJm4tZj5ObHQ/W01hdGguYWJzKGQtaSk8Tmx0P2g6bixpXTpNYXRoLmFicyhmLW4pPE5sdCYmbS1lPk5sdD9bbixNYXRoLmFicyhoLW4pPE5sdD9kOmVdOk1hdGguYWJzKG0tZSk8Tmx0JiZmLXQ+Tmx0P1tNYXRoLmFicyhkLWUpPE5sdD9oOnQsZV06bnVsbCkpLTEpLCsrYyk7YyYmKF89ITEpfWlmKF8pe3ZhciB5LHYsYix4PTEvMDtmb3Iocj0wLF89bnVsbDtyPGc7KytyKShvPWtsdFtyXSkmJihiPSh5PShhPW8uc2l0ZSlbMF0tdCkqeSsodj1hWzFdLWUpKnYpPHgmJih4PWIsXz1vKTtpZihfKXt2YXIgdz1bdCxlXSxTPVt0LGldLE09W24saV0sRT1bbixlXTtfLmhhbGZlZGdlcy5wdXNoKFBsdC5wdXNoKGxsdChhPV8uc2l0ZSx3LFMpKS0xLFBsdC5wdXNoKGxsdChhLFMsTSkpLTEsUGx0LnB1c2gobGx0KGEsTSxFKSktMSxQbHQucHVzaChsbHQoYSxFLHcpKS0xKX19Zm9yKHI9MDtyPGc7KytyKShvPWtsdFtyXSkmJihvLmhhbGZlZGdlcy5sZW5ndGh8fGRlbGV0ZSBrbHRbcl0pfSkocyxsLGMsdSl9dGhpcy5lZGdlcz1QbHQsdGhpcy5jZWxscz1rbHQsQWx0PUxsdD1QbHQ9a2x0PW51bGx9emx0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6emx0LHBvbHlnb25zOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lZGdlcztyZXR1cm4gdGhpcy5jZWxscy5tYXAoKGZ1bmN0aW9uKGUpe3ZhciBuPWUuaGFsZmVkZ2VzLm1hcCgoZnVuY3Rpb24obil7cmV0dXJuIHBsdChlLHRbbl0pfSkpO3JldHVybiBuLmRhdGE9ZS5zaXRlLmRhdGEsbn0pKX0sdHJpYW5nbGVzOmZ1bmN0aW9uKCl7dmFyIHQ9W10sZT10aGlzLmVkZ2VzO3JldHVybiB0aGlzLmNlbGxzLmZvckVhY2goKGZ1bmN0aW9uKG4saSl7aWYobz0ocj1uLmhhbGZlZGdlcykubGVuZ3RoKWZvcih2YXIgcixvLGEscz1uLnNpdGUsbD0tMSxjPWVbcltvLTFdXSx1PWMubGVmdD09PXM/Yy5yaWdodDpjLmxlZnQ7KytsPG87KWE9dSx1PShjPWVbcltsXV0pLmxlZnQ9PT1zP2MucmlnaHQ6Yy5sZWZ0LGEmJnUmJmk8YS5pbmRleCYmaTx1LmluZGV4JiZSbHQocyxhLHUpPDAmJnQucHVzaChbcy5kYXRhLGEuZGF0YSx1LmRhdGFdKX0pKSx0fSxsaW5rczpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVkZ2VzLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIHQucmlnaHR9KSkubWFwKChmdW5jdGlvbih0KXtyZXR1cm57c291cmNlOnQubGVmdC5kYXRhLHRhcmdldDp0LnJpZ2h0LmRhdGF9fSkpfSxmaW5kOmZ1bmN0aW9uKHQsZSxuKXtmb3IodmFyIGkscixvPXRoaXMsYT1vLl9mb3VuZHx8MCxzPW8uY2VsbHMubGVuZ3RoOyEocj1vLmNlbGxzW2FdKTspaWYoKythPj1zKXJldHVybiBudWxsO3ZhciBsPXQtci5zaXRlWzBdLGM9ZS1yLnNpdGVbMV0sdT1sKmwrYypjO2Rve3I9by5jZWxsc1tpPWFdLGE9bnVsbCxyLmhhbGZlZGdlcy5mb3JFYWNoKChmdW5jdGlvbihuKXt2YXIgaT1vLmVkZ2VzW25dLHM9aS5sZWZ0O2lmKHMhPT1yLnNpdGUmJnN8fChzPWkucmlnaHQpKXt2YXIgbD10LXNbMF0sYz1lLXNbMV0saD1sKmwrYypjO2g8dSYmKHU9aCxhPXMuaW5kZXgpfX0pKX13aGlsZShudWxsIT09YSk7cmV0dXJuIG8uX2ZvdW5kPWksbnVsbD09bnx8dTw9bipuP3Iuc2l0ZTpudWxsfX07dmFyIERsdD17dmFsdWU6ZnVuY3Rpb24oKXt9fTtmdW5jdGlvbiBCbHQoKXtmb3IodmFyIHQsZT0wLG49YXJndW1lbnRzLmxlbmd0aCxpPXt9O2U8bjsrK2Upe2lmKCEodD1hcmd1bWVudHNbZV0rIiIpfHx0IGluIGl8fC9bXHMuXS8udGVzdCh0KSl0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgdHlwZTogIit0KTtpW3RdPVtdfXJldHVybiBuZXcgSGx0KGkpfWZ1bmN0aW9uIEhsdCh0KXt0aGlzLl89dH1mdW5jdGlvbiBGbHQodCxlKXtyZXR1cm4gdC50cmltKCkuc3BsaXQoL158XHMrLykubWFwKChmdW5jdGlvbih0KXt2YXIgbj0iIixpPXQuaW5kZXhPZigiLiIpO2lmKGk+PTAmJihuPXQuc2xpY2UoaSsxKSx0PXQuc2xpY2UoMCxpKSksdCYmIWUuaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7cmV0dXJue3R5cGU6dCxuYW1lOm59fSkpfWZ1bmN0aW9uIFZsdCh0LGUpe2Zvcih2YXIgbixpPTAscj10Lmxlbmd0aDtpPHI7KytpKWlmKChuPXRbaV0pLm5hbWU9PT1lKXJldHVybiBuLnZhbHVlfWZ1bmN0aW9uIFVsdCh0LGUsbil7Zm9yKHZhciBpPTAscj10Lmxlbmd0aDtpPHI7KytpKWlmKHRbaV0ubmFtZT09PWUpe3RbaV09RGx0LHQ9dC5zbGljZSgwLGkpLmNvbmNhdCh0LnNsaWNlKGkrMSkpO2JyZWFrfXJldHVybiBudWxsIT1uJiZ0LnB1c2goe25hbWU6ZSx2YWx1ZTpufSksdH1IbHQucHJvdG90eXBlPUJsdC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOkhsdCxvbjpmdW5jdGlvbih0LGUpe3ZhciBuLGk9dGhpcy5fLHI9Rmx0KHQrIiIsaSksbz0tMSxhPXIubGVuZ3RoO2lmKCEoYXJndW1lbnRzLmxlbmd0aDwyKSl7aWYobnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrOiAiK2UpO2Zvcig7KytvPGE7KWlmKG49KHQ9cltvXSkudHlwZSlpW25dPVVsdChpW25dLHQubmFtZSxlKTtlbHNlIGlmKG51bGw9PWUpZm9yKG4gaW4gaSlpW25dPVVsdChpW25dLHQubmFtZSxudWxsKTtyZXR1cm4gdGhpc31mb3IoOysrbzxhOylpZigobj0odD1yW29dKS50eXBlKSYmKG49Vmx0KGlbbl0sdC5uYW1lKSkpcmV0dXJuIG59LGNvcHk6ZnVuY3Rpb24oKXt2YXIgdD17fSxlPXRoaXMuXztmb3IodmFyIG4gaW4gZSl0W25dPWVbbl0uc2xpY2UoKTtyZXR1cm4gbmV3IEhsdCh0KX0sY2FsbDpmdW5jdGlvbih0LGUpe2lmKChuPWFyZ3VtZW50cy5sZW5ndGgtMik+MClmb3IodmFyIG4saSxyPW5ldyBBcnJheShuKSxvPTA7bzxuOysrbylyW29dPWFyZ3VtZW50c1tvKzJdO2lmKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodCkpdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIrdCk7Zm9yKG89MCxuPShpPXRoaXMuX1t0XSkubGVuZ3RoO288bjsrK28paVtvXS52YWx1ZS5hcHBseShlLHIpfSxhcHBseTpmdW5jdGlvbih0LGUsbil7aWYoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0KSl0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIit0KTtmb3IodmFyIGk9dGhpcy5fW3RdLHI9MCxvPWkubGVuZ3RoO3I8bzsrK3IpaVtyXS52YWx1ZS5hcHBseShlLG4pfX07dmFyIGpsdD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsR2x0PXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIix4aHRtbDpqbHQseGxpbms6Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLHhtbDoiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIix4bWxuczoiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8ifTtmdW5jdGlvbiBXbHQodCl7dmFyIGU9dCs9IiIsbj1lLmluZGV4T2YoIjoiKTtyZXR1cm4gbj49MCYmInhtbG5zIiE9PShlPXQuc2xpY2UoMCxuKSkmJih0PXQuc2xpY2UobisxKSksR2x0Lmhhc093blByb3BlcnR5KGUpP3tzcGFjZTpHbHRbZV0sbG9jYWw6dH06dH1mdW5jdGlvbiBxbHQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vd25lckRvY3VtZW50LG49dGhpcy5uYW1lc3BhY2VVUkk7cmV0dXJuIG49PT1qbHQmJmUuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSST09PWpsdD9lLmNyZWF0ZUVsZW1lbnQodCk6ZS5jcmVhdGVFbGVtZW50TlMobix0KX19ZnVuY3Rpb24gWWx0KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIFhsdCh0KXt2YXIgZT1XbHQodCk7cmV0dXJuKGUubG9jYWw/WWx0OnFsdCkoZSl9ZnVuY3Rpb24gJGx0KCl7fWZ1bmN0aW9uIEtsdCh0KXtyZXR1cm4gbnVsbD09dD8kbHQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHQpfX1mdW5jdGlvbiBabHQoKXtyZXR1cm5bXX1mdW5jdGlvbiBKbHQodCl7cmV0dXJuIG51bGw9PXQ/Wmx0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbCh0KX19ZnVuY3Rpb24gUWx0KHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hdGNoZXModCl9fWZ1bmN0aW9uIHRjdCh0KXtyZXR1cm4gbmV3IEFycmF5KHQubGVuZ3RoKX1mdW5jdGlvbiBlY3QodCxlKXt0aGlzLm93bmVyRG9jdW1lbnQ9dC5vd25lckRvY3VtZW50LHRoaXMubmFtZXNwYWNlVVJJPXQubmFtZXNwYWNlVVJJLHRoaXMuX25leHQ9bnVsbCx0aGlzLl9wYXJlbnQ9dCx0aGlzLl9fZGF0YV9fPWV9ZWN0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6ZWN0LGFwcGVuZENoaWxkOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKHQsdGhpcy5fbmV4dCl9LGluc2VydEJlZm9yZTpmdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKHQsZSl9LHF1ZXJ5U2VsZWN0b3I6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yKHQpfSxxdWVyeVNlbGVjdG9yQWxsOmZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbCh0KX19O2Z1bmN0aW9uIG5jdCh0LGUsbixpLHIsbyl7Zm9yKHZhciBhLHM9MCxsPWUubGVuZ3RoLGM9by5sZW5ndGg7czxjOysrcykoYT1lW3NdKT8oYS5fX2RhdGFfXz1vW3NdLGlbc109YSk6bltzXT1uZXcgZWN0KHQsb1tzXSk7Zm9yKDtzPGw7KytzKShhPWVbc10pJiYocltzXT1hKX1mdW5jdGlvbiBpY3QodCxlLG4saSxyLG8sYSl7dmFyIHMsbCxjLHU9e30saD1lLmxlbmd0aCxkPW8ubGVuZ3RoLHA9bmV3IEFycmF5KGgpO2ZvcihzPTA7czxoOysrcykobD1lW3NdKSYmKHBbc109Yz0iJCIrYS5jYWxsKGwsbC5fX2RhdGFfXyxzLGUpLGMgaW4gdT9yW3NdPWw6dVtjXT1sKTtmb3Iocz0wO3M8ZDsrK3MpKGw9dVtjPSIkIithLmNhbGwodCxvW3NdLHMsbyldKT8oaVtzXT1sLGwuX19kYXRhX189b1tzXSx1W2NdPW51bGwpOm5bc109bmV3IGVjdCh0LG9bc10pO2ZvcihzPTA7czxoOysrcykobD1lW3NdKSYmdVtwW3NdXT09PWwmJihyW3NdPWwpfWZ1bmN0aW9uIHJjdCh0LGUpe3JldHVybiB0PGU/LTE6dD5lPzE6dD49ZT8wOk5hTn1mdW5jdGlvbiBvY3QodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fWZ1bmN0aW9uIGFjdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIHNjdCh0LGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlKHQsZSl9fWZ1bmN0aW9uIGxjdCh0LGUpe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLGUpfX1mdW5jdGlvbiBjY3QodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1uP3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpOnRoaXMuc2V0QXR0cmlidXRlKHQsbil9fWZ1bmN0aW9uIHVjdCh0LGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciBuPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PW4/dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpOnRoaXMuc2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsLG4pfX1mdW5jdGlvbiBoY3QodCl7cmV0dXJuIHQub3duZXJEb2N1bWVudCYmdC5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3fHx0LmRvY3VtZW50JiZ0fHx0LmRlZmF1bHRWaWV3fWZ1bmN0aW9uIGRjdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfX1mdW5jdGlvbiBwY3QodCxlLG4pe3JldHVybiBmdW5jdGlvbigpe3RoaXMuc3R5bGUuc2V0UHJvcGVydHkodCxlLG4pfX1mdW5jdGlvbiBmY3QodCxlLG4pe3JldHVybiBmdW5jdGlvbigpe3ZhciBpPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO251bGw9PWk/dGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSh0KTp0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQsaSxuKX19ZnVuY3Rpb24gbWN0KHQsZSl7cmV0dXJuIHQuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShlKXx8aGN0KHQpLmdldENvbXB1dGVkU3R5bGUodCxudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKGUpfWZ1bmN0aW9uIGdjdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtkZWxldGUgdGhpc1t0XX19ZnVuY3Rpb24gX2N0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpc1t0XT1lfX1mdW5jdGlvbiB5Y3QodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtudWxsPT1uP2RlbGV0ZSB0aGlzW3RdOnRoaXNbdF09bn19ZnVuY3Rpb24gdmN0KHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKX1mdW5jdGlvbiBiY3QodCl7cmV0dXJuIHQuY2xhc3NMaXN0fHxuZXcgeGN0KHQpfWZ1bmN0aW9uIHhjdCh0KXt0aGlzLl9ub2RlPXQsdGhpcy5fbmFtZXM9dmN0KHQuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9ZnVuY3Rpb24gd2N0KHQsZSl7Zm9yKHZhciBuPWJjdCh0KSxpPS0xLHI9ZS5sZW5ndGg7KytpPHI7KW4uYWRkKGVbaV0pfWZ1bmN0aW9uIFNjdCh0LGUpe2Zvcih2YXIgbj1iY3QodCksaT0tMSxyPWUubGVuZ3RoOysraTxyOyluLnJlbW92ZShlW2ldKX1mdW5jdGlvbiBNY3QodCl7cmV0dXJuIGZ1bmN0aW9uKCl7d2N0KHRoaXMsdCl9fWZ1bmN0aW9uIEVjdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtTY3QodGhpcyx0KX19ZnVuY3Rpb24gVGN0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7KGUuYXBwbHkodGhpcyxhcmd1bWVudHMpP3djdDpTY3QpKHRoaXMsdCl9fWZ1bmN0aW9uIENjdCgpe3RoaXMudGV4dENvbnRlbnQ9IiJ9ZnVuY3Rpb24gQWN0KHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19ZnVuY3Rpb24ga2N0KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMudGV4dENvbnRlbnQ9bnVsbD09ZT8iIjplfX1mdW5jdGlvbiBMY3QoKXt0aGlzLmlubmVySFRNTD0iIn1mdW5jdGlvbiBQY3QodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5pbm5lckhUTUw9dH19ZnVuY3Rpb24gTmN0KHQpe3JldHVybiBmdW5jdGlvbigpe3ZhciBlPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3RoaXMuaW5uZXJIVE1MPW51bGw9PWU/IiI6ZX19ZnVuY3Rpb24gSWN0KCl7dGhpcy5uZXh0U2libGluZyYmdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpfWZ1bmN0aW9uIFJjdCgpe3RoaXMucHJldmlvdXNTaWJsaW5nJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMsdGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpfWZ1bmN0aW9uIE9jdCgpe3JldHVybiBudWxsfWZ1bmN0aW9uIHpjdCgpe3ZhciB0PXRoaXMucGFyZW50Tm9kZTt0JiZ0LnJlbW92ZUNoaWxkKHRoaXMpfWZ1bmN0aW9uIERjdCgpe3ZhciB0PXRoaXMuY2xvbmVOb2RlKCExKSxlPXRoaXMucGFyZW50Tm9kZTtyZXR1cm4gZT9lLmluc2VydEJlZm9yZSh0LHRoaXMubmV4dFNpYmxpbmcpOnR9ZnVuY3Rpb24gQmN0KCl7dmFyIHQ9dGhpcy5jbG9uZU5vZGUoITApLGU9dGhpcy5wYXJlbnROb2RlO3JldHVybiBlP2UuaW5zZXJ0QmVmb3JlKHQsdGhpcy5uZXh0U2libGluZyk6dH14Y3QucHJvdG90eXBlPXthZGQ6ZnVuY3Rpb24odCl7dGhpcy5fbmFtZXMuaW5kZXhPZih0KTwwJiYodGhpcy5fbmFtZXMucHVzaCh0KSx0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHRoaXMuX25hbWVzLmpvaW4oIiAiKSkpfSxyZW1vdmU6ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fbmFtZXMuaW5kZXhPZih0KTtlPj0wJiYodGhpcy5fbmFtZXMuc3BsaWNlKGUsMSksdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIix0aGlzLl9uYW1lcy5qb2luKCIgIikpKX0sY29udGFpbnM6ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YodCk+PTB9fTt2YXIgSGN0PXt9LEZjdD1udWxsOyJ1bmRlZmluZWQiIT10eXBlb2YgZG9jdW1lbnQmJigib25tb3VzZWVudGVyImluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudHx8KEhjdD17bW91c2VlbnRlcjoibW91c2VvdmVyIixtb3VzZWxlYXZlOiJtb3VzZW91dCJ9KSk7ZnVuY3Rpb24gVmN0KHQsZSxuKXtyZXR1cm4gdD1VY3QodCxlLG4pLGZ1bmN0aW9uKGUpe3ZhciBuPWUucmVsYXRlZFRhcmdldDtuJiYobj09PXRoaXN8fDgmbi5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzKSl8fHQuY2FsbCh0aGlzLGUpfX1mdW5jdGlvbiBVY3QodCxlLG4pe3JldHVybiBmdW5jdGlvbihpKXt2YXIgcj1GY3Q7RmN0PWk7dHJ5e3QuY2FsbCh0aGlzLHRoaXMuX19kYXRhX18sZSxuKX1maW5hbGx5e0ZjdD1yfX19ZnVuY3Rpb24gamN0KHQpe3JldHVybiB0LnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBlPSIiLG49dC5pbmRleE9mKCIuIik7cmV0dXJuIG4+PTAmJihlPXQuc2xpY2UobisxKSx0PXQuc2xpY2UoMCxuKSkse3R5cGU6dCxuYW1lOmV9fSkpfWZ1bmN0aW9uIEdjdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgZT10aGlzLl9fb247aWYoZSl7Zm9yKHZhciBuLGk9MCxyPS0xLG89ZS5sZW5ndGg7aTxvOysraSluPWVbaV0sdC50eXBlJiZuLnR5cGUhPT10LnR5cGV8fG4ubmFtZSE9PXQubmFtZT9lWysrcl09bjp0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIobi50eXBlLG4ubGlzdGVuZXIsbi5jYXB0dXJlKTsrK3I/ZS5sZW5ndGg9cjpkZWxldGUgdGhpcy5fX29ufX19ZnVuY3Rpb24gV2N0KHQsZSxuKXt2YXIgaT1IY3QuaGFzT3duUHJvcGVydHkodC50eXBlKT9WY3Q6VWN0O3JldHVybiBmdW5jdGlvbihyLG8sYSl7dmFyIHMsbD10aGlzLl9fb24sYz1pKGUsbyxhKTtpZihsKWZvcih2YXIgdT0wLGg9bC5sZW5ndGg7dTxoOysrdSlpZigocz1sW3VdKS50eXBlPT09dC50eXBlJiZzLm5hbWU9PT10Lm5hbWUpcmV0dXJuIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihzLnR5cGUscy5saXN0ZW5lcixzLmNhcHR1cmUpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihzLnR5cGUscy5saXN0ZW5lcj1jLHMuY2FwdHVyZT1uKSx2b2lkKHMudmFsdWU9ZSk7dGhpcy5hZGRFdmVudExpc3RlbmVyKHQudHlwZSxjLG4pLHM9e3R5cGU6dC50eXBlLG5hbWU6dC5uYW1lLHZhbHVlOmUsbGlzdGVuZXI6YyxjYXB0dXJlOm59LGw/bC5wdXNoKHMpOnRoaXMuX19vbj1bc119fWZ1bmN0aW9uIHFjdCh0LGUsbil7dmFyIGk9aGN0KHQpLHI9aS5DdXN0b21FdmVudDsiZnVuY3Rpb24iPT10eXBlb2Ygcj9yPW5ldyByKGUsbik6KHI9aS5kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKSxuPyhyLmluaXRFdmVudChlLG4uYnViYmxlcyxuLmNhbmNlbGFibGUpLHIuZGV0YWlsPW4uZGV0YWlsKTpyLmluaXRFdmVudChlLCExLCExKSksdC5kaXNwYXRjaEV2ZW50KHIpfWZ1bmN0aW9uIFljdCh0LGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBxY3QodGhpcyx0LGUpfX1mdW5jdGlvbiBYY3QodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gcWN0KHRoaXMsdCxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fXZhciAkY3Q9W251bGxdO2Z1bmN0aW9uIEtjdCh0LGUpe3RoaXMuX2dyb3Vwcz10LHRoaXMuX3BhcmVudHM9ZX1mdW5jdGlvbiBaY3QoKXtyZXR1cm4gbmV3IEtjdChbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLCRjdCl9ZnVuY3Rpb24gSmN0KHQpe3JldHVybiJzdHJpbmciPT10eXBlb2YgdD9uZXcgS2N0KFtbZG9jdW1lbnQucXVlcnlTZWxlY3Rvcih0KV1dLFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKTpuZXcgS2N0KFtbdF1dLCRjdCl9ZnVuY3Rpb24gUWN0KCl7Zm9yKHZhciB0LGU9RmN0O3Q9ZS5zb3VyY2VFdmVudDspZT10O3JldHVybiBlfWZ1bmN0aW9uIHR1dCh0LGUpe3ZhciBuPXQub3duZXJTVkdFbGVtZW50fHx0O2lmKG4uY3JlYXRlU1ZHUG9pbnQpe3ZhciBpPW4uY3JlYXRlU1ZHUG9pbnQoKTtyZXR1cm4gaS54PWUuY2xpZW50WCxpLnk9ZS5jbGllbnRZLFsoaT1pLm1hdHJpeFRyYW5zZm9ybSh0LmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSkpLngsaS55XX12YXIgcj10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybltlLmNsaWVudFgtci5sZWZ0LXQuY2xpZW50TGVmdCxlLmNsaWVudFktci50b3AtdC5jbGllbnRUb3BdfWZ1bmN0aW9uIGV1dCh0KXt2YXIgZT1RY3QoKTtyZXR1cm4gZS5jaGFuZ2VkVG91Y2hlcyYmKGU9ZS5jaGFuZ2VkVG91Y2hlc1swXSksdHV0KHQsZSl9ZnVuY3Rpb24gbnV0KHQsZSxuKXthcmd1bWVudHMubGVuZ3RoPDMmJihuPWUsZT1RY3QoKS5jaGFuZ2VkVG91Y2hlcyk7Zm9yKHZhciBpLHI9MCxvPWU/ZS5sZW5ndGg6MDtyPG87KytyKWlmKChpPWVbcl0pLmlkZW50aWZpZXI9PT1uKXJldHVybiB0dXQodCxpKTtyZXR1cm4gbnVsbH1mdW5jdGlvbiBpdXQoKXtGY3QucHJldmVudERlZmF1bHQoKSxGY3Quc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gcnV0KHQpe3ZhciBlPXQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LG49SmN0KHQpLm9uKCJkcmFnc3RhcnQuZHJhZyIsaXV0LCEwKTsib25zZWxlY3RzdGFydCJpbiBlP24ub24oInNlbGVjdHN0YXJ0LmRyYWciLGl1dCwhMCk6KGUuX19ub3NlbGVjdD1lLnN0eWxlLk1velVzZXJTZWxlY3QsZS5zdHlsZS5Nb3pVc2VyU2VsZWN0PSJub25lIil9ZnVuY3Rpb24gb3V0KHQsZSl7dmFyIG49dC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsaT1KY3QodCkub24oImRyYWdzdGFydC5kcmFnIixudWxsKTtlJiYoaS5vbigiY2xpY2suZHJhZyIsaXV0LCEwKSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe2kub24oImNsaWNrLmRyYWciLG51bGwpfSksMCkpLCJvbnNlbGVjdHN0YXJ0ImluIG4/aS5vbigic2VsZWN0c3RhcnQuZHJhZyIsbnVsbCk6KG4uc3R5bGUuTW96VXNlclNlbGVjdD1uLl9fbm9zZWxlY3QsZGVsZXRlIG4uX19ub3NlbGVjdCl9ZnVuY3Rpb24gYXV0KHQsZSxuKXt0LnByb3RvdHlwZT1lLnByb3RvdHlwZT1uLG4uY29uc3RydWN0b3I9dH1mdW5jdGlvbiBzdXQodCxlKXt2YXIgbj1PYmplY3QuY3JlYXRlKHQucHJvdG90eXBlKTtmb3IodmFyIGkgaW4gZSluW2ldPWVbaV07cmV0dXJuIG59ZnVuY3Rpb24gbHV0KCl7fUtjdC5wcm90b3R5cGU9WmN0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6S2N0LHNlbGVjdDpmdW5jdGlvbiBjdXQodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PUtsdCh0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLGk9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWZvcih2YXIgbyxhLHM9ZVtyXSxsPXMubGVuZ3RoLGM9aVtyXT1uZXcgQXJyYXkobCksdT0wO3U8bDsrK3UpKG89c1t1XSkmJihhPXQuY2FsbChvLG8uX19kYXRhX18sdSxzKSkmJigiX19kYXRhX18iaW4gbyYmKGEuX19kYXRhX189by5fX2RhdGFfXyksY1t1XT1hKTtyZXR1cm4gbmV3IEtjdChpLHRoaXMuX3BhcmVudHMpfSxzZWxlY3RBbGw6ZnVuY3Rpb24gdXV0KHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1KbHQodCkpO2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj1lLmxlbmd0aCxpPVtdLHI9W10sbz0wO288bjsrK28pZm9yKHZhciBhLHM9ZVtvXSxsPXMubGVuZ3RoLGM9MDtjPGw7KytjKShhPXNbY10pJiYoaS5wdXNoKHQuY2FsbChhLGEuX19kYXRhX18sYyxzKSksci5wdXNoKGEpKTtyZXR1cm4gbmV3IEtjdChpLHIpfSxmaWx0ZXI6ZnVuY3Rpb24gaHV0KHQpeyJmdW5jdGlvbiIhPXR5cGVvZiB0JiYodD1RbHQodCkpO2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj1lLmxlbmd0aCxpPW5ldyBBcnJheShuKSxyPTA7cjxuOysrcilmb3IodmFyIG8sYT1lW3JdLHM9YS5sZW5ndGgsbD1pW3JdPVtdLGM9MDtjPHM7KytjKShvPWFbY10pJiZ0LmNhbGwobyxvLl9fZGF0YV9fLGMsYSkmJmwucHVzaChvKTtyZXR1cm4gbmV3IEtjdChpLHRoaXMuX3BhcmVudHMpfSxkYXRhOmZ1bmN0aW9uIGR1dCh0LGUpe2lmKCF0KXJldHVybiBmPW5ldyBBcnJheSh0aGlzLnNpemUoKSksdT0tMSx0aGlzLmVhY2goKGZ1bmN0aW9uKHQpe2ZbKyt1XT10fSkpLGY7dmFyIG49ZT9pY3Q6bmN0LGk9dGhpcy5fcGFyZW50cyxyPXRoaXMuX2dyb3VwczsiZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9KGZ1bmN0aW9uIG8odCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSkodCkpO2Zvcih2YXIgYT1yLmxlbmd0aCxzPW5ldyBBcnJheShhKSxsPW5ldyBBcnJheShhKSxjPW5ldyBBcnJheShhKSx1PTA7dTxhOysrdSl7dmFyIGg9aVt1XSxkPXJbdV0scD1kLmxlbmd0aCxmPXQuY2FsbChoLGgmJmguX19kYXRhX18sdSxpKSxtPWYubGVuZ3RoLGc9bFt1XT1uZXcgQXJyYXkobSksXz1zW3VdPW5ldyBBcnJheShtKTtuKGgsZCxnLF8sY1t1XT1uZXcgQXJyYXkocCksZixlKTtmb3IodmFyIHksdixiPTAseD0wO2I8bTsrK2IpaWYoeT1nW2JdKXtmb3IoYj49eCYmKHg9YisxKTshKHY9X1t4XSkmJisreDxtOyk7eS5fbmV4dD12fHxudWxsfX1yZXR1cm4ocz1uZXcgS2N0KHMsaSkpLl9lbnRlcj1sLHMuX2V4aXQ9YyxzfSxlbnRlcjpmdW5jdGlvbiBwdXQoKXtyZXR1cm4gbmV3IEtjdCh0aGlzLl9lbnRlcnx8dGhpcy5fZ3JvdXBzLm1hcCh0Y3QpLHRoaXMuX3BhcmVudHMpfSxleGl0OmZ1bmN0aW9uIGZ1dCgpe3JldHVybiBuZXcgS2N0KHRoaXMuX2V4aXR8fHRoaXMuX2dyb3Vwcy5tYXAodGN0KSx0aGlzLl9wYXJlbnRzKX0sam9pbjpmdW5jdGlvbiBtdXQodCxlLG4pe3ZhciBpPXRoaXMuZW50ZXIoKSxyPXRoaXMsbz10aGlzLmV4aXQoKTtyZXR1cm4gaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90KGkpOmkuYXBwZW5kKHQrIiIpLG51bGwhPWUmJihyPWUocikpLG51bGw9PW4/by5yZW1vdmUoKTpuKG8pLGkmJnI/aS5tZXJnZShyKS5vcmRlcigpOnJ9LG1lcmdlOmZ1bmN0aW9uIGd1dCh0KXtmb3IodmFyIGU9dGhpcy5fZ3JvdXBzLG49dC5fZ3JvdXBzLGk9ZS5sZW5ndGgscj1NYXRoLm1pbihpLG4ubGVuZ3RoKSxvPW5ldyBBcnJheShpKSxhPTA7YTxyOysrYSlmb3IodmFyIHMsbD1lW2FdLGM9blthXSx1PWwubGVuZ3RoLGg9b1thXT1uZXcgQXJyYXkodSksZD0wO2Q8dTsrK2QpKHM9bFtkXXx8Y1tkXSkmJihoW2RdPXMpO2Zvcig7YTxpOysrYSlvW2FdPWVbYV07cmV0dXJuIG5ldyBLY3Qobyx0aGlzLl9wYXJlbnRzKX0sb3JkZXI6ZnVuY3Rpb24gX3V0KCl7Zm9yKHZhciB0PXRoaXMuX2dyb3VwcyxlPS0xLG49dC5sZW5ndGg7KytlPG47KWZvcih2YXIgaSxyPXRbZV0sbz1yLmxlbmd0aC0xLGE9cltvXTstLW8+PTA7KShpPXJbb10pJiYoYSYmNF5pLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGEpJiZhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGksYSksYT1pKTtyZXR1cm4gdGhpc30sc29ydDpmdW5jdGlvbiB5dXQodCl7ZnVuY3Rpb24gZShlLG4pe3JldHVybiBlJiZuP3QoZS5fX2RhdGFfXyxuLl9fZGF0YV9fKTohZS0hbn10fHwodD1yY3QpO2Zvcih2YXIgbj10aGlzLl9ncm91cHMsaT1uLmxlbmd0aCxyPW5ldyBBcnJheShpKSxvPTA7bzxpOysrbyl7Zm9yKHZhciBhLHM9bltvXSxsPXMubGVuZ3RoLGM9cltvXT1uZXcgQXJyYXkobCksdT0wO3U8bDsrK3UpKGE9c1t1XSkmJihjW3VdPWEpO2Muc29ydChlKX1yZXR1cm4gbmV3IEtjdChyLHRoaXMuX3BhcmVudHMpLm9yZGVyKCl9LGNhbGw6ZnVuY3Rpb24gdnV0KCl7dmFyIHQ9YXJndW1lbnRzWzBdO3JldHVybiBhcmd1bWVudHNbMF09dGhpcyx0LmFwcGx5KG51bGwsYXJndW1lbnRzKSx0aGlzfSxub2RlczpmdW5jdGlvbiBidXQoKXt2YXIgdD1uZXcgQXJyYXkodGhpcy5zaXplKCkpLGU9LTE7cmV0dXJuIHRoaXMuZWFjaCgoZnVuY3Rpb24oKXt0WysrZV09dGhpc30pKSx0fSxub2RlOmZ1bmN0aW9uIHh1dCgpe2Zvcih2YXIgdD10aGlzLl9ncm91cHMsZT0wLG49dC5sZW5ndGg7ZTxuOysrZSlmb3IodmFyIGk9dFtlXSxyPTAsbz1pLmxlbmd0aDtyPG87KytyKXt2YXIgYT1pW3JdO2lmKGEpcmV0dXJuIGF9cmV0dXJuIG51bGx9LHNpemU6ZnVuY3Rpb24gd3V0KCl7dmFyIHQ9MDtyZXR1cm4gdGhpcy5lYWNoKChmdW5jdGlvbigpeysrdH0pKSx0fSxlbXB0eTpmdW5jdGlvbiBTdXQoKXtyZXR1cm4hdGhpcy5ub2RlKCl9LGVhY2g6ZnVuY3Rpb24gTXV0KHQpe2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj0wLGk9ZS5sZW5ndGg7bjxpOysrbilmb3IodmFyIHIsbz1lW25dLGE9MCxzPW8ubGVuZ3RoO2E8czsrK2EpKHI9b1thXSkmJnQuY2FsbChyLHIuX19kYXRhX18sYSxvKTtyZXR1cm4gdGhpc30sYXR0cjpmdW5jdGlvbiBFdXQodCxlKXt2YXIgbj1XbHQodCk7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXt2YXIgaT10aGlzLm5vZGUoKTtyZXR1cm4gbi5sb2NhbD9pLmdldEF0dHJpYnV0ZU5TKG4uc3BhY2Usbi5sb2NhbCk6aS5nZXRBdHRyaWJ1dGUobil9cmV0dXJuIHRoaXMuZWFjaCgobnVsbD09ZT9uLmxvY2FsP2FjdDpvY3Q6ImZ1bmN0aW9uIj09dHlwZW9mIGU/bi5sb2NhbD91Y3Q6Y2N0Om4ubG9jYWw/bGN0OnNjdCkobixlKSl9LHN0eWxlOmZ1bmN0aW9uIFR1dCh0LGUsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT90aGlzLmVhY2goKG51bGw9PWU/ZGN0OiJmdW5jdGlvbiI9PXR5cGVvZiBlP2ZjdDpwY3QpKHQsZSxudWxsPT1uPyIiOm4pKTptY3QodGhpcy5ub2RlKCksdCl9LHByb3BlcnR5OmZ1bmN0aW9uIEN1dCh0LGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPjE/dGhpcy5lYWNoKChudWxsPT1lP2djdDoiZnVuY3Rpb24iPT10eXBlb2YgZT95Y3Q6X2N0KSh0LGUpKTp0aGlzLm5vZGUoKVt0XX0sY2xhc3NlZDpmdW5jdGlvbiBBdXQodCxlKXt2YXIgbj12Y3QodCsiIik7aWYoYXJndW1lbnRzLmxlbmd0aDwyKXtmb3IodmFyIGk9YmN0KHRoaXMubm9kZSgpKSxyPS0xLG89bi5sZW5ndGg7KytyPG87KWlmKCFpLmNvbnRhaW5zKG5bcl0pKXJldHVybiExO3JldHVybiEwfXJldHVybiB0aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiBlP1RjdDplP01jdDpFY3QpKG4sZSkpfSx0ZXh0OmZ1bmN0aW9uIGt1dCh0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD90aGlzLmVhY2gobnVsbD09dD9DY3Q6KCJmdW5jdGlvbiI9PXR5cGVvZiB0P2tjdDpBY3QpKHQpKTp0aGlzLm5vZGUoKS50ZXh0Q29udGVudH0saHRtbDpmdW5jdGlvbiBMdXQodCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKG51bGw9PXQ/TGN0OigiZnVuY3Rpb24iPT10eXBlb2YgdD9OY3Q6UGN0KSh0KSk6dGhpcy5ub2RlKCkuaW5uZXJIVE1MfSxyYWlzZTpmdW5jdGlvbiBQdXQoKXtyZXR1cm4gdGhpcy5lYWNoKEljdCl9LGxvd2VyOmZ1bmN0aW9uIE51dCgpe3JldHVybiB0aGlzLmVhY2goUmN0KX0sYXBwZW5kOmZ1bmN0aW9uIEl1dCh0KXt2YXIgZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlhsdCh0KTtyZXR1cm4gdGhpcy5zZWxlY3QoKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfSkpfSxpbnNlcnQ6ZnVuY3Rpb24gUnV0KHQsZSl7dmFyIG49ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpYbHQodCksaT1udWxsPT1lP09jdDoiZnVuY3Rpb24iPT10eXBlb2YgZT9lOktsdChlKTtyZXR1cm4gdGhpcy5zZWxlY3QoKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpLGkuYXBwbHkodGhpcyxhcmd1bWVudHMpfHxudWxsKX0pKX0scmVtb3ZlOmZ1bmN0aW9uIE91dCgpe3JldHVybiB0aGlzLmVhY2goemN0KX0sY2xvbmU6ZnVuY3Rpb24genV0KHQpe3JldHVybiB0aGlzLnNlbGVjdCh0P0JjdDpEY3QpfSxkYXR1bTpmdW5jdGlvbiBEdXQodCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iLHQpOnRoaXMubm9kZSgpLl9fZGF0YV9ffSxvbjpmdW5jdGlvbiBCdXQodCxlLG4pe3ZhciBpLHIsbz1qY3QodCsiIiksYT1vLmxlbmd0aDtpZighKGFyZ3VtZW50cy5sZW5ndGg8Mikpe2ZvcihzPWU/V2N0OkdjdCxudWxsPT1uJiYobj0hMSksaT0wO2k8YTsrK2kpdGhpcy5lYWNoKHMob1tpXSxlLG4pKTtyZXR1cm4gdGhpc312YXIgcz10aGlzLm5vZGUoKS5fX29uO2lmKHMpZm9yKHZhciBsLGM9MCx1PXMubGVuZ3RoO2M8dTsrK2MpZm9yKGk9MCxsPXNbY107aTxhOysraSlpZigocj1vW2ldKS50eXBlPT09bC50eXBlJiZyLm5hbWU9PT1sLm5hbWUpcmV0dXJuIGwudmFsdWV9LGRpc3BhdGNoOmZ1bmN0aW9uIEh1dCh0LGUpe3JldHVybiB0aGlzLmVhY2goKCJmdW5jdGlvbiI9PXR5cGVvZiBlP1hjdDpZY3QpKHQsZSkpfX07dmFyIEZ1dD0uNyxWdXQ9MS9GdXQsVXV0PSJcXHMqKFsrLV0/XFxkKylcXHMqIixqdXQ9IlxccyooWystXT9cXGQqXFwuP1xcZCsoPzpbZUVdWystXT9cXGQrKT8pXFxzKiIsR3V0PSJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIixXdXQ9L14jKFswLTlhLWZdezMsOH0pJC8scXV0PW5ldyBSZWdFeHAoIl5yZ2JcXCgiK1tVdXQsVXV0LFV1dF0rIlxcKSQiKSxZdXQ9bmV3IFJlZ0V4cCgiXnJnYlxcKCIrW0d1dCxHdXQsR3V0XSsiXFwpJCIpLFh1dD1uZXcgUmVnRXhwKCJecmdiYVxcKCIrW1V1dCxVdXQsVXV0LGp1dF0rIlxcKSQiKSwkdXQ9bmV3IFJlZ0V4cCgiXnJnYmFcXCgiK1tHdXQsR3V0LEd1dCxqdXRdKyJcXCkkIiksS3V0PW5ldyBSZWdFeHAoIl5oc2xcXCgiK1tqdXQsR3V0LEd1dF0rIlxcKSQiKSxadXQ9bmV3IFJlZ0V4cCgiXmhzbGFcXCgiK1tqdXQsR3V0LEd1dCxqdXRdKyJcXCkkIiksSnV0PXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9O2Z1bmN0aW9uIFF1dCgpe3JldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleCgpfWZ1bmN0aW9uIHRodCgpe3JldHVybiB0aGlzLnJnYigpLmZvcm1hdFJnYigpfWZ1bmN0aW9uIGVodCh0KXt2YXIgZSxuO3JldHVybiB0PSh0KyIiKS50cmltKCkudG9Mb3dlckNhc2UoKSwoZT1XdXQuZXhlYyh0KSk/KG49ZVsxXS5sZW5ndGgsZT1wYXJzZUludChlWzFdLDE2KSw2PT09bj9uaHQoZSk6Mz09PW4/bmV3IGFodChlPj44JjE1fGU+PjQmMjQwLGU+PjQmMTV8MjQwJmUsKDE1JmUpPDw0fDE1JmUsMSk6OD09PW4/aWh0KGU+PjI0JjI1NSxlPj4xNiYyNTUsZT4+OCYyNTUsKDI1NSZlKS8yNTUpOjQ9PT1uP2lodChlPj4xMiYxNXxlPj44JjI0MCxlPj44JjE1fGU+PjQmMjQwLGU+PjQmMTV8MjQwJmUsKCgxNSZlKTw8NHwxNSZlKS8yNTUpOm51bGwpOihlPXF1dC5leGVjKHQpKT9uZXcgYWh0KGVbMV0sZVsyXSxlWzNdLDEpOihlPVl1dC5leGVjKHQpKT9uZXcgYWh0KDI1NSplWzFdLzEwMCwyNTUqZVsyXS8xMDAsMjU1KmVbM10vMTAwLDEpOihlPVh1dC5leGVjKHQpKT9paHQoZVsxXSxlWzJdLGVbM10sZVs0XSk6KGU9JHV0LmV4ZWModCkpP2lodCgyNTUqZVsxXS8xMDAsMjU1KmVbMl0vMTAwLDI1NSplWzNdLzEwMCxlWzRdKTooZT1LdXQuZXhlYyh0KSk/dWh0KGVbMV0sZVsyXS8xMDAsZVszXS8xMDAsMSk6KGU9WnV0LmV4ZWModCkpP3VodChlWzFdLGVbMl0vMTAwLGVbM10vMTAwLGVbNF0pOkp1dC5oYXNPd25Qcm9wZXJ0eSh0KT9uaHQoSnV0W3RdKToidHJhbnNwYXJlbnQiPT09dD9uZXcgYWh0KE5hTixOYU4sTmFOLDApOm51bGx9ZnVuY3Rpb24gbmh0KHQpe3JldHVybiBuZXcgYWh0KHQ+PjE2JjI1NSx0Pj44JjI1NSwyNTUmdCwxKX1mdW5jdGlvbiBpaHQodCxlLG4saSl7cmV0dXJuIGk8PTAmJih0PWU9bj1OYU4pLG5ldyBhaHQodCxlLG4saSl9ZnVuY3Rpb24gcmh0KHQpe3JldHVybiB0IGluc3RhbmNlb2YgbHV0fHwodD1laHQodCkpLHQ/bmV3IGFodCgodD10LnJnYigpKS5yLHQuZyx0LmIsdC5vcGFjaXR5KTpuZXcgYWh0fWZ1bmN0aW9uIG9odCh0LGUsbixpKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/cmh0KHQpOm5ldyBhaHQodCxlLG4sbnVsbD09aT8xOmkpfWZ1bmN0aW9uIGFodCh0LGUsbixpKXt0aGlzLnI9K3QsdGhpcy5nPStlLHRoaXMuYj0rbix0aGlzLm9wYWNpdHk9K2l9ZnVuY3Rpb24gc2h0KCl7cmV0dXJuIiMiK2NodCh0aGlzLnIpK2NodCh0aGlzLmcpK2NodCh0aGlzLmIpfWZ1bmN0aW9uIGxodCgpe3ZhciB0PXRoaXMub3BhY2l0eTtyZXR1cm4oMT09PSh0PWlzTmFOKHQpPzE6TWF0aC5tYXgoMCxNYXRoLm1pbigxLHQpKSk/InJnYigiOiJyZ2JhKCIpK01hdGgubWF4KDAsTWF0aC5taW4oMjU1LE1hdGgucm91bmQodGhpcy5yKXx8MCkpKyIsICIrTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0aGlzLmcpfHwwKSkrIiwgIitNYXRoLm1heCgwLE1hdGgubWluKDI1NSxNYXRoLnJvdW5kKHRoaXMuYil8fDApKSsoMT09PXQ/IikiOiIsICIrdCsiKSIpfWZ1bmN0aW9uIGNodCh0KXtyZXR1cm4oKHQ9TWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsTWF0aC5yb3VuZCh0KXx8MCkpKTwxNj8iMCI6IiIpK3QudG9TdHJpbmcoMTYpfWZ1bmN0aW9uIHVodCh0LGUsbixpKXtyZXR1cm4gaTw9MD90PWU9bj1OYU46bjw9MHx8bj49MT90PWU9TmFOOmU8PTAmJih0PU5hTiksbmV3IGRodCh0LGUsbixpKX1mdW5jdGlvbiBoaHQodCl7aWYodCBpbnN0YW5jZW9mIGRodClyZXR1cm4gbmV3IGRodCh0LmgsdC5zLHQubCx0Lm9wYWNpdHkpO2lmKHQgaW5zdGFuY2VvZiBsdXR8fCh0PWVodCh0KSksIXQpcmV0dXJuIG5ldyBkaHQ7aWYodCBpbnN0YW5jZW9mIGRodClyZXR1cm4gdDt2YXIgZT0odD10LnJnYigpKS5yLzI1NSxuPXQuZy8yNTUsaT10LmIvMjU1LHI9TWF0aC5taW4oZSxuLGkpLG89TWF0aC5tYXgoZSxuLGkpLGE9TmFOLHM9by1yLGw9KG8rcikvMjtyZXR1cm4gcz8oYT1lPT09bz8obi1pKS9zKzYqKG48aSk6bj09PW8/KGktZSkvcysyOihlLW4pL3MrNCxzLz1sPC41P28rcjoyLW8tcixhKj02MCk6cz1sPjAmJmw8MT8wOmEsbmV3IGRodChhLHMsbCx0Lm9wYWNpdHkpfWZ1bmN0aW9uIGRodCh0LGUsbixpKXt0aGlzLmg9K3QsdGhpcy5zPStlLHRoaXMubD0rbix0aGlzLm9wYWNpdHk9K2l9ZnVuY3Rpb24gcGh0KHQsZSxuKXtyZXR1cm4gMjU1Kih0PDYwP2UrKG4tZSkqdC82MDp0PDE4MD9uOnQ8MjQwP2UrKG4tZSkqKDI0MC10KS82MDplKX1mdW5jdGlvbiBmaHQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIG1odCh0KXtyZXR1cm4gMT09KHQ9K3QpP2dodDpmdW5jdGlvbihlLG4pe3JldHVybiBuLWU/KGZ1bmN0aW9uIGkodCxlLG4pe3JldHVybiB0PU1hdGgucG93KHQsbiksZT1NYXRoLnBvdyhlLG4pLXQsbj0xL24sZnVuY3Rpb24oaSl7cmV0dXJuIE1hdGgucG93KHQraSplLG4pfX0pKGUsbix0KTpmaHQoaXNOYU4oZSk/bjplKX19ZnVuY3Rpb24gZ2h0KHQsZSl7dmFyIG49ZS10O3JldHVybiBuPyhmdW5jdGlvbiBpKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0K24qZX19KSh0LG4pOmZodChpc05hTih0KT9lOnQpfWF1dChsdXQsZWh0LHtjb3B5OmZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QuYXNzaWduKG5ldyB0aGlzLmNvbnN0cnVjdG9yLHRoaXMsdCl9LGRpc3BsYXlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKX0saGV4OlF1dCxmb3JtYXRIZXg6UXV0LGZvcm1hdEhzbDpmdW5jdGlvbiBfaHQoKXtyZXR1cm4gaGh0KHRoaXMpLmZvcm1hdEhzbCgpfSxmb3JtYXRSZ2I6dGh0LHRvU3RyaW5nOnRodH0pLGF1dChhaHQsb2h0LHN1dChsdXQse2JyaWdodGVyOmZ1bmN0aW9uKHQpe3JldHVybiB0PW51bGw9PXQ/VnV0Ok1hdGgucG93KFZ1dCx0KSxuZXcgYWh0KHRoaXMucip0LHRoaXMuZyp0LHRoaXMuYip0LHRoaXMub3BhY2l0eSl9LGRhcmtlcjpmdW5jdGlvbih0KXtyZXR1cm4gdD1udWxsPT10P0Z1dDpNYXRoLnBvdyhGdXQsdCksbmV3IGFodCh0aGlzLnIqdCx0aGlzLmcqdCx0aGlzLmIqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30sZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4tLjU8PXRoaXMuciYmdGhpcy5yPDI1NS41JiYtLjU8PXRoaXMuZyYmdGhpcy5nPDI1NS41JiYtLjU8PXRoaXMuYiYmdGhpcy5iPDI1NS41JiYwPD10aGlzLm9wYWNpdHkmJnRoaXMub3BhY2l0eTw9MX0saGV4OnNodCxmb3JtYXRIZXg6c2h0LGZvcm1hdFJnYjpsaHQsdG9TdHJpbmc6bGh0fSkpLGF1dChkaHQsKGZ1bmN0aW9uIHlodCh0LGUsbixpKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/aGh0KHQpOm5ldyBkaHQodCxlLG4sbnVsbD09aT8xOmkpfSksc3V0KGx1dCx7YnJpZ2h0ZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9WdXQ6TWF0aC5wb3coVnV0LHQpLG5ldyBkaHQodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxkYXJrZXI6ZnVuY3Rpb24odCl7cmV0dXJuIHQ9bnVsbD09dD9GdXQ6TWF0aC5wb3coRnV0LHQpLG5ldyBkaHQodGhpcy5oLHRoaXMucyx0aGlzLmwqdCx0aGlzLm9wYWNpdHkpfSxyZ2I6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmglMzYwKzM2MCoodGhpcy5oPDApLGU9aXNOYU4odCl8fGlzTmFOKHRoaXMucyk/MDp0aGlzLnMsbj10aGlzLmwsaT1uKyhuPC41P246MS1uKSplLHI9MipuLWk7cmV0dXJuIG5ldyBhaHQocGh0KHQ+PTI0MD90LTI0MDp0KzEyMCxyLGkpLHBodCh0LHIsaSkscGh0KHQ8MTIwP3QrMjQwOnQtMTIwLHIsaSksdGhpcy5vcGFjaXR5KX0sZGlzcGxheWFibGU6ZnVuY3Rpb24oKXtyZXR1cm4oMDw9dGhpcy5zJiZ0aGlzLnM8PTF8fGlzTmFOKHRoaXMucykpJiYwPD10aGlzLmwmJnRoaXMubDw9MSYmMDw9dGhpcy5vcGFjaXR5JiZ0aGlzLm9wYWNpdHk8PTF9LGZvcm1hdEhzbDpmdW5jdGlvbigpe3ZhciB0PXRoaXMub3BhY2l0eTtyZXR1cm4oMT09PSh0PWlzTmFOKHQpPzE6TWF0aC5tYXgoMCxNYXRoLm1pbigxLHQpKSk/ImhzbCgiOiJoc2xhKCIpKyh0aGlzLmh8fDApKyIsICIrMTAwKih0aGlzLnN8fDApKyIlLCAiKzEwMCoodGhpcy5sfHwwKSsiJSIrKDE9PT10PyIpIjoiLCAiK3QrIikiKX19KSk7dmFyIHZodD0oZnVuY3Rpb24gdChlKXt2YXIgbj1taHQoZSk7ZnVuY3Rpb24gaSh0LGUpe3ZhciBpPW4oKHQ9b2h0KHQpKS5yLChlPW9odChlKSkucikscj1uKHQuZyxlLmcpLG89bih0LmIsZS5iKSxhPWdodCh0Lm9wYWNpdHksZS5vcGFjaXR5KTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQucj1pKGUpLHQuZz1yKGUpLHQuYj1vKGUpLHQub3BhY2l0eT1hKGUpLHQrIiJ9fXJldHVybiBpLmdhbW1hPXQsaX0pKDEpO2Z1bmN0aW9uIGJodCh0LGUpe3JldHVybiB0PSt0LGU9K2UsZnVuY3Rpb24obil7cmV0dXJuIHQqKDEtbikrZSpufX12YXIgeGh0PS9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZyx3aHQ9bmV3IFJlZ0V4cCh4aHQuc291cmNlLCJnIik7ZnVuY3Rpb24gU2h0KHQsZSl7dmFyIG4saSxyLG89eGh0Lmxhc3RJbmRleD13aHQubGFzdEluZGV4PTAsYT0tMSxzPVtdLGw9W107Zm9yKHQrPSIiLGUrPSIiOyhuPXhodC5leGVjKHQpKSYmKGk9d2h0LmV4ZWMoZSkpOykocj1pLmluZGV4KT5vJiYocj1lLnNsaWNlKG8sciksc1thXT9zW2FdKz1yOnNbKythXT1yKSwobj1uWzBdKT09PShpPWlbMF0pP3NbYV0/c1thXSs9aTpzWysrYV09aTooc1srK2FdPW51bGwsbC5wdXNoKHtpOmEseDpiaHQobixpKX0pKSxvPXdodC5sYXN0SW5kZXg7cmV0dXJuIG88ZS5sZW5ndGgmJihyPWUuc2xpY2Uobyksc1thXT9zW2FdKz1yOnNbKythXT1yKSxzLmxlbmd0aDwyP2xbMF0/KGZ1bmN0aW9uIGModCl7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiB0KGUpKyIifX0pKGxbMF0ueCk6KGZ1bmN0aW9uIHUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fSkoZSk6KGU9bC5sZW5ndGgsZnVuY3Rpb24odCl7Zm9yKHZhciBuLGk9MDtpPGU7KytpKXNbKG49bFtpXSkuaV09bi54KHQpO3JldHVybiBzLmpvaW4oIiIpfSl9dmFyIE1odCxFaHQsVGh0LENodCxBaHQ9MTgwL01hdGguUEksa2h0PXt0cmFuc2xhdGVYOjAsdHJhbnNsYXRlWTowLHJvdGF0ZTowLHNrZXdYOjAsc2NhbGVYOjEsc2NhbGVZOjF9O2Z1bmN0aW9uIExodCh0LGUsbixpLHIsbyl7dmFyIGEscyxsO3JldHVybihhPU1hdGguc3FydCh0KnQrZSplKSkmJih0Lz1hLGUvPWEpLChsPXQqbitlKmkpJiYobi09dCpsLGktPWUqbCksKHM9TWF0aC5zcXJ0KG4qbitpKmkpKSYmKG4vPXMsaS89cyxsLz1zKSx0Kmk8ZSpuJiYodD0tdCxlPS1lLGw9LWwsYT0tYSkse3RyYW5zbGF0ZVg6cix0cmFuc2xhdGVZOm8scm90YXRlOk1hdGguYXRhbjIoZSx0KSpBaHQsc2tld1g6TWF0aC5hdGFuKGwpKkFodCxzY2FsZVg6YSxzY2FsZVk6c319ZnVuY3Rpb24gUGh0KHQsZSxuLGkpe2Z1bmN0aW9uIHIodCl7cmV0dXJuIHQubGVuZ3RoP3QucG9wKCkrIiAiOiIifXJldHVybiBmdW5jdGlvbihvLGEpe3ZhciBzPVtdLGw9W107cmV0dXJuIG89dChvKSxhPXQoYSksKGZ1bmN0aW9uIGModCxpLHIsbyxhLHMpe2lmKHQhPT1yfHxpIT09byl7dmFyIGw9YS5wdXNoKCJ0cmFuc2xhdGUoIixudWxsLGUsbnVsbCxuKTtzLnB1c2goe2k6bC00LHg6Ymh0KHQscil9LHtpOmwtMix4OmJodChpLG8pfSl9ZWxzZShyfHxvKSYmYS5wdXNoKCJ0cmFuc2xhdGUoIityK2UrbytuKX0pKG8udHJhbnNsYXRlWCxvLnRyYW5zbGF0ZVksYS50cmFuc2xhdGVYLGEudHJhbnNsYXRlWSxzLGwpLChmdW5jdGlvbiB1KHQsZSxuLG8pe3QhPT1lPyh0LWU+MTgwP2UrPTM2MDplLXQ+MTgwJiYodCs9MzYwKSxvLnB1c2goe2k6bi5wdXNoKHIobikrInJvdGF0ZSgiLG51bGwsaSktMix4OmJodCh0LGUpfSkpOmUmJm4ucHVzaChyKG4pKyJyb3RhdGUoIitlK2kpfSkoby5yb3RhdGUsYS5yb3RhdGUscyxsKSwoZnVuY3Rpb24gaCh0LGUsbixvKXt0IT09ZT9vLnB1c2goe2k6bi5wdXNoKHIobikrInNrZXdYKCIsbnVsbCxpKS0yLHg6Ymh0KHQsZSl9KTplJiZuLnB1c2gocihuKSsic2tld1goIitlK2kpfSkoby5za2V3WCxhLnNrZXdYLHMsbCksKGZ1bmN0aW9uIGQodCxlLG4saSxvLGEpe2lmKHQhPT1ufHxlIT09aSl7dmFyIHM9by5wdXNoKHIobykrInNjYWxlKCIsbnVsbCwiLCIsbnVsbCwiKSIpO2EucHVzaCh7aTpzLTQseDpiaHQodCxuKX0se2k6cy0yLHg6Ymh0KGUsaSl9KX1lbHNlIDE9PT1uJiYxPT09aXx8by5wdXNoKHIobykrInNjYWxlKCIrbisiLCIraSsiKSIpfSkoby5zY2FsZVgsby5zY2FsZVksYS5zY2FsZVgsYS5zY2FsZVkscyxsKSxvPWE9bnVsbCxmdW5jdGlvbih0KXtmb3IodmFyIGUsbj0tMSxpPWwubGVuZ3RoOysrbjxpOylzWyhlPWxbbl0pLmldPWUueCh0KTtyZXR1cm4gcy5qb2luKCIiKX19fXZhciBOaHQ9UGh0KChmdW5jdGlvbiBJaHQodCl7cmV0dXJuIm5vbmUiPT09dD9raHQ6KE1odHx8KE1odD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSxFaHQ9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LFRodD1kb2N1bWVudC5kZWZhdWx0VmlldyksTWh0LnN0eWxlLnRyYW5zZm9ybT10LHQ9VGh0LmdldENvbXB1dGVkU3R5bGUoRWh0LmFwcGVuZENoaWxkKE1odCksbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSgidHJhbnNmb3JtIiksRWh0LnJlbW92ZUNoaWxkKE1odCksTGh0KCsodD10LnNsaWNlKDcsLTEpLnNwbGl0KCIsIikpWzBdLCt0WzFdLCt0WzJdLCt0WzNdLCt0WzRdLCt0WzVdKSl9KSwicHgsICIsInB4KSIsImRlZykiKSxSaHQ9UGh0KChmdW5jdGlvbiBPaHQodCl7cmV0dXJuIG51bGw9PXQ/a2h0OihDaHR8fChDaHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsImciKSksQ2h0LnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIix0KSwodD1DaHQudHJhbnNmb3JtLmJhc2VWYWwuY29uc29saWRhdGUoKSk/TGh0KCh0PXQubWF0cml4KS5hLHQuYix0LmMsdC5kLHQuZSx0LmYpOmtodCl9KSwiLCAiLCIpIiwiKSIpLHpodD1NYXRoLlNRUlQyO2Z1bmN0aW9uIERodCh0KXtyZXR1cm4oKHQ9TWF0aC5leHAodCkpKzEvdCkvMn1mdW5jdGlvbiBCaHQodCxlKXt2YXIgbixpLHI9dFswXSxvPXRbMV0sYT10WzJdLHM9ZVsyXSxsPWVbMF0tcixjPWVbMV0tbyx1PWwqbCtjKmM7aWYodTwxZS0xMilpPU1hdGgubG9nKHMvYSkvemh0LG49ZnVuY3Rpb24odCl7cmV0dXJuW3IrdCpsLG8rdCpjLGEqTWF0aC5leHAoemh0KnQqaSldfTtlbHNle3ZhciBoPU1hdGguc3FydCh1KSxkPShzKnMtYSphKzQqdSkvKDIqYSoyKmgpLHA9KHMqcy1hKmEtNCp1KS8oMipzKjIqaCksZj1NYXRoLmxvZyhNYXRoLnNxcnQoZCpkKzEpLWQpLG09TWF0aC5sb2coTWF0aC5zcXJ0KHAqcCsxKS1wKTtpPShtLWYpL3podCxuPWZ1bmN0aW9uKHQpe3ZhciBlPXQqaSxuPURodChmKSxzPWEvKDIqaCkqKG4qKGZ1bmN0aW9uIHUodCl7cmV0dXJuKCh0PU1hdGguZXhwKDIqdCkpLTEpLyh0KzEpfSkoemh0KmUrZiktKGZ1bmN0aW9uIGQodCl7cmV0dXJuKCh0PU1hdGguZXhwKHQpKS0xL3QpLzJ9KShmKSk7cmV0dXJuW3IrcypsLG8rcypjLGEqbi9EaHQoemh0KmUrZildfX1yZXR1cm4gbi5kdXJhdGlvbj0xZTMqaSxufXZhciBIaHQsRmh0LFZodD0wLFVodD0wLGpodD0wLEdodD0wLFdodD0wLHFodD0wLFlodD0ib2JqZWN0Ij09dHlwZW9mIHBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3c/cGVyZm9ybWFuY2U6RGF0ZSxYaHQ9Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdyk6ZnVuY3Rpb24odCl7c2V0VGltZW91dCh0LDE3KX07ZnVuY3Rpb24gJGh0KCl7cmV0dXJuIFdodHx8KFhodChLaHQpLFdodD1ZaHQubm93KCkrcWh0KX1mdW5jdGlvbiBLaHQoKXtXaHQ9MH1mdW5jdGlvbiBaaHQoKXt0aGlzLl9jYWxsPXRoaXMuX3RpbWU9dGhpcy5fbmV4dD1udWxsfWZ1bmN0aW9uIEpodCh0LGUsbil7dmFyIGk9bmV3IFpodDtyZXR1cm4gaS5yZXN0YXJ0KHQsZSxuKSxpfWZ1bmN0aW9uIFFodCgpe1dodD0oR2h0PVlodC5ub3coKSkrcWh0LFZodD1VaHQ9MDt0cnl7IShmdW5jdGlvbiB0KCl7JGh0KCksKytWaHQ7Zm9yKHZhciB0LGU9SGh0O2U7KSh0PVdodC1lLl90aW1lKT49MCYmZS5fY2FsbC5jYWxsKG51bGwsdCksZT1lLl9uZXh0Oy0tVmh0fSkoKX1maW5hbGx5e1ZodD0wLChmdW5jdGlvbiBlKCl7dmFyIHQsZSxuPUhodCxpPTEvMDtmb3IoO247KW4uX2NhbGw/KGk+bi5fdGltZSYmKGk9bi5fdGltZSksdD1uLG49bi5fbmV4dCk6KGU9bi5fbmV4dCxuLl9uZXh0PW51bGwsbj10P3QuX25leHQ9ZTpIaHQ9ZSk7Rmh0PXQsZWR0KGkpfSkoKSxXaHQ9MH19ZnVuY3Rpb24gdGR0KCl7dmFyIHQ9WWh0Lm5vdygpLGU9dC1HaHQ7ZT4xZTMmJihxaHQtPWUsR2h0PXQpfWZ1bmN0aW9uIGVkdCh0KXtWaHR8fChVaHQmJihVaHQ9Y2xlYXJUaW1lb3V0KFVodCkpLHQtV2h0PjI0Pyh0PDEvMCYmKFVodD1zZXRUaW1lb3V0KFFodCx0LVlodC5ub3coKS1xaHQpKSxqaHQmJihqaHQ9Y2xlYXJJbnRlcnZhbChqaHQpKSk6KGpodHx8KEdodD1ZaHQubm93KCksamh0PXNldEludGVydmFsKHRkdCwxZTMpKSxWaHQ9MSxYaHQoUWh0KSkpfWZ1bmN0aW9uIG5kdCh0LGUsbil7dmFyIGk9bmV3IFpodDtyZXR1cm4gaS5yZXN0YXJ0KChmdW5jdGlvbihuKXtpLnN0b3AoKSx0KG4rZSl9KSxlPW51bGw9PWU/MDorZSxuKSxpfVpodC5wcm90b3R5cGU9Smh0LnByb3RvdHlwZT17Y29uc3RydWN0b3I6Wmh0LHJlc3RhcnQ6ZnVuY3Rpb24odCxlLG4pe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBUeXBlRXJyb3IoImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uIik7bj0obnVsbD09bj8kaHQoKTorbikrKG51bGw9PWU/MDorZSksdGhpcy5fbmV4dHx8Rmh0PT09dGhpc3x8KEZodD9GaHQuX25leHQ9dGhpczpIaHQ9dGhpcyxGaHQ9dGhpcyksdGhpcy5fY2FsbD10LHRoaXMuX3RpbWU9bixlZHQoKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuX2NhbGwmJih0aGlzLl9jYWxsPW51bGwsdGhpcy5fdGltZT0xLzAsZWR0KCkpfX07dmFyIGlkdD1CbHQoInN0YXJ0IiwiZW5kIiwiY2FuY2VsIiwiaW50ZXJydXB0IikscmR0PVtdO2Z1bmN0aW9uIG9kdCh0LGUsbixpLHIsbyl7dmFyIGE9dC5fX3RyYW5zaXRpb247aWYoYSl7aWYobiBpbiBhKXJldHVybn1lbHNlIHQuX190cmFuc2l0aW9uPXt9OyEoZnVuY3Rpb24gcyh0LGUsbil7dmFyIGkscj10Ll9fdHJhbnNpdGlvbjtmdW5jdGlvbiBvKHQpe24uc3RhdGU9MSxuLnRpbWVyLnJlc3RhcnQoYSxuLmRlbGF5LG4udGltZSksbi5kZWxheTw9dCYmYSh0LW4uZGVsYXkpfWZ1bmN0aW9uIGEobyl7dmFyIGMsdSxoLGQ7aWYoMSE9PW4uc3RhdGUpcmV0dXJuIGwoKTtmb3IoYyBpbiByKWlmKChkPXJbY10pLm5hbWU9PT1uLm5hbWUpe2lmKDM9PT1kLnN0YXRlKXJldHVybiBuZHQoYSk7ND09PWQuc3RhdGU/KGQuc3RhdGU9NixkLnRpbWVyLnN0b3AoKSxkLm9uLmNhbGwoImludGVycnVwdCIsdCx0Ll9fZGF0YV9fLGQuaW5kZXgsZC5ncm91cCksZGVsZXRlIHJbY10pOitjPGUmJihkLnN0YXRlPTYsZC50aW1lci5zdG9wKCksZC5vbi5jYWxsKCJjYW5jZWwiLHQsdC5fX2RhdGFfXyxkLmluZGV4LGQuZ3JvdXApLGRlbGV0ZSByW2NdKX1pZihuZHQoKGZ1bmN0aW9uKCl7Mz09PW4uc3RhdGUmJihuLnN0YXRlPTQsbi50aW1lci5yZXN0YXJ0KHMsbi5kZWxheSxuLnRpbWUpLHMobykpfSkpLG4uc3RhdGU9MixuLm9uLmNhbGwoInN0YXJ0Iix0LHQuX19kYXRhX18sbi5pbmRleCxuLmdyb3VwKSwyPT09bi5zdGF0ZSl7Zm9yKG4uc3RhdGU9MyxpPW5ldyBBcnJheShoPW4udHdlZW4ubGVuZ3RoKSxjPTAsdT0tMTtjPGg7KytjKShkPW4udHdlZW5bY10udmFsdWUuY2FsbCh0LHQuX19kYXRhX18sbi5pbmRleCxuLmdyb3VwKSkmJihpWysrdV09ZCk7aS5sZW5ndGg9dSsxfX1mdW5jdGlvbiBzKGUpe2Zvcih2YXIgcj1lPG4uZHVyYXRpb24/bi5lYXNlLmNhbGwobnVsbCxlL24uZHVyYXRpb24pOihuLnRpbWVyLnJlc3RhcnQobCksbi5zdGF0ZT01LDEpLG89LTEsYT1pLmxlbmd0aDsrK288YTspaVtvXS5jYWxsKHQscik7NT09PW4uc3RhdGUmJihuLm9uLmNhbGwoImVuZCIsdCx0Ll9fZGF0YV9fLG4uaW5kZXgsbi5ncm91cCksbCgpKX1mdW5jdGlvbiBsKCl7Zm9yKHZhciBpIGluIG4uc3RhdGU9NixuLnRpbWVyLnN0b3AoKSxkZWxldGUgcltlXSxyKXJldHVybjtkZWxldGUgdC5fX3RyYW5zaXRpb259cltlXT1uLG4udGltZXI9Smh0KG8sMCxuLnRpbWUpfSkodCxuLHtuYW1lOmUsaW5kZXg6aSxncm91cDpyLG9uOmlkdCx0d2VlbjpyZHQsdGltZTpvLnRpbWUsZGVsYXk6by5kZWxheSxkdXJhdGlvbjpvLmR1cmF0aW9uLGVhc2U6by5lYXNlLHRpbWVyOm51bGwsc3RhdGU6MH0pfWZ1bmN0aW9uIGFkdCh0LGUpe3ZhciBuPWxkdCh0LGUpO2lmKG4uc3RhdGU+MCl0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHNjaGVkdWxlZCIpO3JldHVybiBufWZ1bmN0aW9uIHNkdCh0LGUpe3ZhciBuPWxkdCh0LGUpO2lmKG4uc3RhdGU+Myl0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHJ1bm5pbmciKTtyZXR1cm4gbn1mdW5jdGlvbiBsZHQodCxlKXt2YXIgbj10Ll9fdHJhbnNpdGlvbjtpZighbnx8IShuPW5bZV0pKXRocm93IG5ldyBFcnJvcigidHJhbnNpdGlvbiBub3QgZm91bmQiKTtyZXR1cm4gbn1mdW5jdGlvbiBjZHQodCxlKXt2YXIgbixpLHIsbz10Ll9fdHJhbnNpdGlvbixhPSEwO2lmKG8pe2ZvcihyIGluIGU9bnVsbD09ZT9udWxsOmUrIiIsbykobj1vW3JdKS5uYW1lPT09ZT8oaT1uLnN0YXRlPjImJm4uc3RhdGU8NSxuLnN0YXRlPTYsbi50aW1lci5zdG9wKCksbi5vbi5jYWxsKGk/ImludGVycnVwdCI6ImNhbmNlbCIsdCx0Ll9fZGF0YV9fLG4uaW5kZXgsbi5ncm91cCksZGVsZXRlIG9bcl0pOmE9ITE7YSYmZGVsZXRlIHQuX190cmFuc2l0aW9ufX1mdW5jdGlvbiB1ZHQodCxlKXt2YXIgbixpO3JldHVybiBmdW5jdGlvbigpe3ZhciByPXNkdCh0aGlzLHQpLG89ci50d2VlbjtpZihvIT09bilmb3IodmFyIGE9MCxzPShpPW49bykubGVuZ3RoO2E8czsrK2EpaWYoaVthXS5uYW1lPT09ZSl7KGk9aS5zbGljZSgpKS5zcGxpY2UoYSwxKTticmVha31yLnR3ZWVuPWl9fWZ1bmN0aW9uIGhkdCh0LGUsbil7dmFyIGkscjtpZigiZnVuY3Rpb24iIT10eXBlb2Ygbil0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIG89c2R0KHRoaXMsdCksYT1vLnR3ZWVuO2lmKGEhPT1pKXtyPShpPWEpLnNsaWNlKCk7Zm9yKHZhciBzPXtuYW1lOmUsdmFsdWU6bn0sbD0wLGM9ci5sZW5ndGg7bDxjOysrbClpZihyW2xdLm5hbWU9PT1lKXtyW2xdPXM7YnJlYWt9bD09PWMmJnIucHVzaChzKX1vLnR3ZWVuPXJ9fWZ1bmN0aW9uIGRkdCh0LGUsbil7dmFyIGk9dC5faWQ7cmV0dXJuIHQuZWFjaCgoZnVuY3Rpb24oKXt2YXIgdD1zZHQodGhpcyxpKTsodC52YWx1ZXx8KHQudmFsdWU9e30pKVtlXT1uLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0pKSxmdW5jdGlvbih0KXtyZXR1cm4gbGR0KHQsaSkudmFsdWVbZV19fWZ1bmN0aW9uIHBkdCh0LGUpe3ZhciBuO3JldHVybigibnVtYmVyIj09dHlwZW9mIGU/Ymh0OmUgaW5zdGFuY2VvZiBlaHQ/dmh0OihuPWVodChlKSk/KGU9bix2aHQpOlNodCkodCxlKX1mdW5jdGlvbiBmZHQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dGhpcy5yZW1vdmVBdHRyaWJ1dGUodCl9fWZ1bmN0aW9uIG1kdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCl9fWZ1bmN0aW9uIGdkdCh0LGUsbil7dmFyIGkscixvPW4rIiI7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5nZXRBdHRyaWJ1dGUodCk7cmV0dXJuIGE9PT1vP251bGw6YT09PWk/cjpyPWUoaT1hLG4pfX1mdW5jdGlvbiBfZHQodCxlLG4pe3ZhciBpLHIsbz1uKyIiO3JldHVybiBmdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKTtyZXR1cm4gYT09PW8/bnVsbDphPT09aT9yOnI9ZShpPWEsbil9fWZ1bmN0aW9uIHlkdCh0LGUsbil7dmFyIGkscixvO3JldHVybiBmdW5jdGlvbigpe3ZhciBhLHMsbD1uKHRoaXMpO2lmKG51bGwhPWwpcmV0dXJuKGE9dGhpcy5nZXRBdHRyaWJ1dGUodCkpPT09KHM9bCsiIik/bnVsbDphPT09aSYmcz09PXI/bzoocj1zLG89ZShpPWEsbCkpO3RoaXMucmVtb3ZlQXR0cmlidXRlKHQpfX1mdW5jdGlvbiB2ZHQodCxlLG4pe3ZhciBpLHIsbztyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYSxzLGw9bih0aGlzKTtpZihudWxsIT1sKXJldHVybihhPXRoaXMuZ2V0QXR0cmlidXRlTlModC5zcGFjZSx0LmxvY2FsKSk9PT0ocz1sKyIiKT9udWxsOmE9PT1pJiZzPT09cj9vOihyPXMsbz1lKGk9YSxsKSk7dGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyh0LnNwYWNlLHQubG9jYWwpfX1mdW5jdGlvbiBiZHQodCxlKXtyZXR1cm4gZnVuY3Rpb24obil7dGhpcy5zZXRBdHRyaWJ1dGUodCxlLmNhbGwodGhpcyxuKSl9fWZ1bmN0aW9uIHhkdCh0LGUpe3JldHVybiBmdW5jdGlvbihuKXt0aGlzLnNldEF0dHJpYnV0ZU5TKHQuc3BhY2UsdC5sb2NhbCxlLmNhbGwodGhpcyxuKSl9fWZ1bmN0aW9uIHdkdCh0LGUpe3ZhciBuLGk7ZnVuY3Rpb24gcigpe3ZhciByPWUuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiByIT09aSYmKG49KGk9cikmJnhkdCh0LHIpKSxufXJldHVybiByLl92YWx1ZT1lLHJ9ZnVuY3Rpb24gU2R0KHQsZSl7dmFyIG4saTtmdW5jdGlvbiByKCl7dmFyIHI9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIHIhPT1pJiYobj0oaT1yKSYmYmR0KHQscikpLG59cmV0dXJuIHIuX3ZhbHVlPWUscn1mdW5jdGlvbiBNZHQodCxlKXtyZXR1cm4gZnVuY3Rpb24oKXthZHQodGhpcyx0KS5kZWxheT0rZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWZ1bmN0aW9uIEVkdCh0LGUpe3JldHVybiBlPStlLGZ1bmN0aW9uKCl7YWR0KHRoaXMsdCkuZGVsYXk9ZX19ZnVuY3Rpb24gVGR0KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKCl7c2R0KHRoaXMsdCkuZHVyYXRpb249K2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfX1mdW5jdGlvbiBDZHQodCxlKXtyZXR1cm4gZT0rZSxmdW5jdGlvbigpe3NkdCh0aGlzLHQpLmR1cmF0aW9uPWV9fWZ1bmN0aW9uIEFkdCh0LGUpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiBlKXRocm93IG5ldyBFcnJvcjtyZXR1cm4gZnVuY3Rpb24oKXtzZHQodGhpcyx0KS5lYXNlPWV9fWZ1bmN0aW9uIGtkdCh0LGUsbil7dmFyIGkscixvPShmdW5jdGlvbiBhKHQpe3JldHVybih0KyIiKS50cmltKCkuc3BsaXQoL158XHMrLykuZXZlcnkoKGZ1bmN0aW9uKHQpe3ZhciBlPXQuaW5kZXhPZigiLiIpO3JldHVybiBlPj0wJiYodD10LnNsaWNlKDAsZSkpLCF0fHwic3RhcnQiPT09dH0pKX0pKGUpP2FkdDpzZHQ7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGE9byh0aGlzLHQpLHM9YS5vbjtzIT09aSYmKHI9KGk9cykuY29weSgpKS5vbihlLG4pLGEub249cn19dmFyIExkdD1aY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yO2Z1bmN0aW9uIFBkdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXt0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpfX1mdW5jdGlvbiBOZHQodCxlLG4pe3JldHVybiBmdW5jdGlvbihpKXt0aGlzLnN0eWxlLnNldFByb3BlcnR5KHQsZS5jYWxsKHRoaXMsaSksbil9fWZ1bmN0aW9uIElkdCh0LGUsbil7dmFyIGkscjtmdW5jdGlvbiBvKCl7dmFyIG89ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIG8hPT1yJiYoaT0ocj1vKSYmTmR0KHQsbyxuKSksaX1yZXR1cm4gby5fdmFsdWU9ZSxvfWZ1bmN0aW9uIFJkdCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7dGhpcy50ZXh0Q29udGVudD10LmNhbGwodGhpcyxlKX19ZnVuY3Rpb24gT2R0KHQpe3ZhciBlLG47ZnVuY3Rpb24gaSgpe3ZhciBpPXQuYXBwbHkodGhpcyxhcmd1bWVudHMpO3JldHVybiBpIT09biYmKGU9KG49aSkmJlJkdChpKSksZX1yZXR1cm4gaS5fdmFsdWU9dCxpfXZhciB6ZHQ9MDtmdW5jdGlvbiBEZHQodCxlLG4saSl7dGhpcy5fZ3JvdXBzPXQsdGhpcy5fcGFyZW50cz1lLHRoaXMuX25hbWU9bix0aGlzLl9pZD1pfWZ1bmN0aW9uIEJkdCgpe3JldHVybisremR0fXZhciBIZHQ9WmN0LnByb3RvdHlwZTtEZHQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpEZHQsc2VsZWN0OmZ1bmN0aW9uIEZkdCh0KXt2YXIgZT10aGlzLl9uYW1lLG49dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PUtsdCh0KSk7Zm9yKHZhciBpPXRoaXMuX2dyb3VwcyxyPWkubGVuZ3RoLG89bmV3IEFycmF5KHIpLGE9MDthPHI7KythKWZvcih2YXIgcyxsLGM9aVthXSx1PWMubGVuZ3RoLGg9b1thXT1uZXcgQXJyYXkodSksZD0wO2Q8dTsrK2QpKHM9Y1tkXSkmJihsPXQuY2FsbChzLHMuX19kYXRhX18sZCxjKSkmJigiX19kYXRhX18iaW4gcyYmKGwuX19kYXRhX189cy5fX2RhdGFfXyksaFtkXT1sLG9kdChoW2RdLGUsbixkLGgsbGR0KHMsbikpKTtyZXR1cm4gbmV3IERkdChvLHRoaXMuX3BhcmVudHMsZSxuKX0sc2VsZWN0QWxsOmZ1bmN0aW9uIFZkdCh0KXt2YXIgZT10aGlzLl9uYW1lLG49dGhpcy5faWQ7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PUpsdCh0KSk7Zm9yKHZhciBpPXRoaXMuX2dyb3VwcyxyPWkubGVuZ3RoLG89W10sYT1bXSxzPTA7czxyOysrcylmb3IodmFyIGwsYz1pW3NdLHU9Yy5sZW5ndGgsaD0wO2g8dTsrK2gpaWYobD1jW2hdKXtmb3IodmFyIGQscD10LmNhbGwobCxsLl9fZGF0YV9fLGgsYyksZj1sZHQobCxuKSxtPTAsZz1wLmxlbmd0aDttPGc7KyttKShkPXBbbV0pJiZvZHQoZCxlLG4sbSxwLGYpO28ucHVzaChwKSxhLnB1c2gobCl9cmV0dXJuIG5ldyBEZHQobyxhLGUsbil9LGZpbHRlcjpmdW5jdGlvbiBVZHQodCl7ImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVFsdCh0KSk7Zm9yKHZhciBlPXRoaXMuX2dyb3VwcyxuPWUubGVuZ3RoLGk9bmV3IEFycmF5KG4pLHI9MDtyPG47KytyKWZvcih2YXIgbyxhPWVbcl0scz1hLmxlbmd0aCxsPWlbcl09W10sYz0wO2M8czsrK2MpKG89YVtjXSkmJnQuY2FsbChvLG8uX19kYXRhX18sYyxhKSYmbC5wdXNoKG8pO3JldHVybiBuZXcgRGR0KGksdGhpcy5fcGFyZW50cyx0aGlzLl9uYW1lLHRoaXMuX2lkKX0sbWVyZ2U6ZnVuY3Rpb24gamR0KHQpe2lmKHQuX2lkIT09dGhpcy5faWQpdGhyb3cgbmV3IEVycm9yO2Zvcih2YXIgZT10aGlzLl9ncm91cHMsbj10Ll9ncm91cHMsaT1lLmxlbmd0aCxyPU1hdGgubWluKGksbi5sZW5ndGgpLG89bmV3IEFycmF5KGkpLGE9MDthPHI7KythKWZvcih2YXIgcyxsPWVbYV0sYz1uW2FdLHU9bC5sZW5ndGgsaD1vW2FdPW5ldyBBcnJheSh1KSxkPTA7ZDx1OysrZCkocz1sW2RdfHxjW2RdKSYmKGhbZF09cyk7Zm9yKDthPGk7KythKW9bYV09ZVthXTtyZXR1cm4gbmV3IERkdChvLHRoaXMuX3BhcmVudHMsdGhpcy5fbmFtZSx0aGlzLl9pZCl9LHNlbGVjdGlvbjpmdW5jdGlvbiBHZHQoKXtyZXR1cm4gbmV3IExkdCh0aGlzLl9ncm91cHMsdGhpcy5fcGFyZW50cyl9LHRyYW5zaXRpb246ZnVuY3Rpb24gV2R0KCl7Zm9yKHZhciB0PXRoaXMuX25hbWUsZT10aGlzLl9pZCxuPUJkdCgpLGk9dGhpcy5fZ3JvdXBzLHI9aS5sZW5ndGgsbz0wO288cjsrK28pZm9yKHZhciBhLHM9aVtvXSxsPXMubGVuZ3RoLGM9MDtjPGw7KytjKWlmKGE9c1tjXSl7dmFyIHU9bGR0KGEsZSk7b2R0KGEsdCxuLGMscyx7dGltZTp1LnRpbWUrdS5kZWxheSt1LmR1cmF0aW9uLGRlbGF5OjAsZHVyYXRpb246dS5kdXJhdGlvbixlYXNlOnUuZWFzZX0pfXJldHVybiBuZXcgRGR0KGksdGhpcy5fcGFyZW50cyx0LG4pfSxjYWxsOkhkdC5jYWxsLG5vZGVzOkhkdC5ub2Rlcyxub2RlOkhkdC5ub2RlLHNpemU6SGR0LnNpemUsZW1wdHk6SGR0LmVtcHR5LGVhY2g6SGR0LmVhY2gsb246ZnVuY3Rpb24gcWR0KHQsZSl7dmFyIG49dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg8Mj9sZHQodGhpcy5ub2RlKCksbikub24ub24odCk6dGhpcy5lYWNoKGtkdChuLHQsZSkpfSxhdHRyOmZ1bmN0aW9uIFlkdCh0LGUpe3ZhciBuPVdsdCh0KSxpPSJ0cmFuc2Zvcm0iPT09bj9SaHQ6cGR0O3JldHVybiB0aGlzLmF0dHJUd2Vlbih0LCJmdW5jdGlvbiI9PXR5cGVvZiBlPyhuLmxvY2FsP3ZkdDp5ZHQpKG4saSxkZHQodGhpcywiYXR0ci4iK3QsZSkpOm51bGw9PWU/KG4ubG9jYWw/bWR0OmZkdCkobik6KG4ubG9jYWw/X2R0OmdkdCkobixpLGUpKX0sYXR0clR3ZWVuOmZ1bmN0aW9uIFhkdCh0LGUpe3ZhciBuPSJhdHRyLiIrdDtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKG49dGhpcy50d2VlbihuKSkmJm4uX3ZhbHVlO2lmKG51bGw9PWUpcmV0dXJuIHRoaXMudHdlZW4obixudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3I7dmFyIGk9V2x0KHQpO3JldHVybiB0aGlzLnR3ZWVuKG4sKGkubG9jYWw/d2R0OlNkdCkoaSxlKSl9LHN0eWxlOmZ1bmN0aW9uICRkdCh0LGUsbil7dmFyIGk9InRyYW5zZm9ybSI9PSh0Kz0iIik/Tmh0OnBkdDtyZXR1cm4gbnVsbD09ZT90aGlzLnN0eWxlVHdlZW4odCwoZnVuY3Rpb24gcih0LGUpe3ZhciBuLGkscjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgbz1tY3QodGhpcyx0KSxhPSh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLG1jdCh0aGlzLHQpKTtyZXR1cm4gbz09PWE/bnVsbDpvPT09biYmYT09PWk/cjpyPWUobj1vLGk9YSl9fSkodCxpKSkub24oImVuZC5zdHlsZS4iK3QsUGR0KHQpKToiZnVuY3Rpb24iPT10eXBlb2YgZT90aGlzLnN0eWxlVHdlZW4odCwoZnVuY3Rpb24gYSh0LGUsbil7dmFyIGkscixvO3JldHVybiBmdW5jdGlvbigpe3ZhciBhPW1jdCh0aGlzLHQpLHM9bih0aGlzKSxsPXMrIiI7cmV0dXJuIG51bGw9PXMmJih0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KHQpLGw9cz1tY3QodGhpcyx0KSksYT09PWw/bnVsbDphPT09aSYmbD09PXI/bzoocj1sLG89ZShpPWEscykpfX0pKHQsaSxkZHQodGhpcywic3R5bGUuIit0LGUpKSkuZWFjaCgoZnVuY3Rpb24gbyh0LGUpe3ZhciBuLGkscixvLGE9InN0eWxlLiIrZSxzPSJlbmQuIithO3JldHVybiBmdW5jdGlvbigpe3ZhciBsPXNkdCh0aGlzLHQpLGM9bC5vbix1PW51bGw9PWwudmFsdWVbYV0/b3x8KG89UGR0KGUpKTp2b2lkIDA7Yz09PW4mJnI9PT11fHwoaT0obj1jKS5jb3B5KCkpLm9uKHMscj11KSxsLm9uPWl9fSkodGhpcy5faWQsdCkpOnRoaXMuc3R5bGVUd2Vlbih0LChmdW5jdGlvbiBzKHQsZSxuKXt2YXIgaSxyLG89bisiIjtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgYT1tY3QodGhpcyx0KTtyZXR1cm4gYT09PW8/bnVsbDphPT09aT9yOnI9ZShpPWEsbil9fSkodCxpLGUpLG4pLm9uKCJlbmQuc3R5bGUuIit0LG51bGwpfSxzdHlsZVR3ZWVuOmZ1bmN0aW9uIEtkdCh0LGUsbil7dmFyIGk9InN0eWxlLiIrKHQrPSIiKTtpZihhcmd1bWVudHMubGVuZ3RoPDIpcmV0dXJuKGk9dGhpcy50d2VlbihpKSkmJmkuX3ZhbHVlO2lmKG51bGw9PWUpcmV0dXJuIHRoaXMudHdlZW4oaSxudWxsKTtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBuZXcgRXJyb3I7cmV0dXJuIHRoaXMudHdlZW4oaSxJZHQodCxlLG51bGw9PW4/IiI6bikpfSx0ZXh0OmZ1bmN0aW9uIFpkdCh0KXtyZXR1cm4gdGhpcy50d2VlbigidGV4dCIsImZ1bmN0aW9uIj09dHlwZW9mIHQ/KGZ1bmN0aW9uIGUodCl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGU9dCh0aGlzKTt0aGlzLnRleHRDb250ZW50PW51bGw9PWU/IiI6ZX19KShkZHQodGhpcywidGV4dCIsdCkpOihmdW5jdGlvbiBuKHQpe3JldHVybiBmdW5jdGlvbigpe3RoaXMudGV4dENvbnRlbnQ9dH19KShudWxsPT10PyIiOnQrIiIpKX0sdGV4dFR3ZWVuOmZ1bmN0aW9uIEpkdCh0KXt2YXIgZT0idGV4dCI7aWYoYXJndW1lbnRzLmxlbmd0aDwxKXJldHVybihlPXRoaXMudHdlZW4oZSkpJiZlLl92YWx1ZTtpZihudWxsPT10KXJldHVybiB0aGlzLnR3ZWVuKGUsbnVsbCk7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIHQpdGhyb3cgbmV3IEVycm9yO3JldHVybiB0aGlzLnR3ZWVuKGUsT2R0KHQpKX0scmVtb3ZlOmZ1bmN0aW9uIFFkdCgpe3JldHVybiB0aGlzLm9uKCJlbmQucmVtb3ZlIiwoZnVuY3Rpb24gdChlKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgdD10aGlzLnBhcmVudE5vZGU7Zm9yKHZhciBuIGluIHRoaXMuX190cmFuc2l0aW9uKWlmKCtuIT09ZSlyZXR1cm47dCYmdC5yZW1vdmVDaGlsZCh0aGlzKX19KSh0aGlzLl9pZCkpfSx0d2VlbjpmdW5jdGlvbiB0cHQodCxlKXt2YXIgbj10aGlzLl9pZDtpZih0Kz0iIixhcmd1bWVudHMubGVuZ3RoPDIpe2Zvcih2YXIgaSxyPWxkdCh0aGlzLm5vZGUoKSxuKS50d2VlbixvPTAsYT1yLmxlbmd0aDtvPGE7KytvKWlmKChpPXJbb10pLm5hbWU9PT10KXJldHVybiBpLnZhbHVlO3JldHVybiBudWxsfXJldHVybiB0aGlzLmVhY2goKG51bGw9PWU/dWR0OmhkdCkobix0LGUpKX0sZGVsYXk6ZnVuY3Rpb24gZXB0KHQpe3ZhciBlPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaCgoImZ1bmN0aW9uIj09dHlwZW9mIHQ/TWR0OkVkdCkoZSx0KSk6bGR0KHRoaXMubm9kZSgpLGUpLmRlbGF5fSxkdXJhdGlvbjpmdW5jdGlvbiBucHQodCl7dmFyIGU9dGhpcy5faWQ7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dGhpcy5lYWNoKCgiZnVuY3Rpb24iPT10eXBlb2YgdD9UZHQ6Q2R0KShlLHQpKTpsZHQodGhpcy5ub2RlKCksZSkuZHVyYXRpb259LGVhc2U6ZnVuY3Rpb24gaXB0KHQpe3ZhciBlPXRoaXMuX2lkO3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3RoaXMuZWFjaChBZHQoZSx0KSk6bGR0KHRoaXMubm9kZSgpLGUpLmVhc2V9LGVuZDpmdW5jdGlvbiBycHQoKXt2YXIgdCxlLG49dGhpcyxpPW4uX2lkLHI9bi5zaXplKCk7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihvLGEpe3ZhciBzPXt2YWx1ZTphfSxsPXt2YWx1ZTpmdW5jdGlvbigpezA9PS0tciYmbygpfX07bi5lYWNoKChmdW5jdGlvbigpe3ZhciBuPXNkdCh0aGlzLGkpLHI9bi5vbjtyIT09dCYmKChlPSh0PXIpLmNvcHkoKSkuXy5jYW5jZWwucHVzaChzKSxlLl8uaW50ZXJydXB0LnB1c2gocyksZS5fLmVuZC5wdXNoKGwpKSxuLm9uPWV9KSl9KSl9fTt2YXIgb3B0PXt0aW1lOm51bGwsZGVsYXk6MCxkdXJhdGlvbjoyNTAsZWFzZTpxZn07ZnVuY3Rpb24gYXB0KHQsZSl7Zm9yKHZhciBuOyEobj10Ll9fdHJhbnNpdGlvbil8fCEobj1uW2VdKTspaWYoISh0PXQucGFyZW50Tm9kZSkpcmV0dXJuIG9wdC50aW1lPSRodCgpLG9wdDtyZXR1cm4gbn1mdW5jdGlvbiBzcHQodCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHR9fWZ1bmN0aW9uIGxwdCh0LGUsbil7dGhpcy50YXJnZXQ9dCx0aGlzLnR5cGU9ZSx0aGlzLnRyYW5zZm9ybT1ufWZ1bmN0aW9uIGNwdCh0LGUsbil7dGhpcy5rPXQsdGhpcy54PWUsdGhpcy55PW59WmN0LnByb3RvdHlwZS5pbnRlcnJ1cHQ9ZnVuY3Rpb24gdXB0KHQpe3JldHVybiB0aGlzLmVhY2goKGZ1bmN0aW9uKCl7Y2R0KHRoaXMsdCl9KSl9LFpjdC5wcm90b3R5cGUudHJhbnNpdGlvbj1mdW5jdGlvbiBocHQodCl7dmFyIGUsbjt0IGluc3RhbmNlb2YgRGR0PyhlPXQuX2lkLHQ9dC5fbmFtZSk6KGU9QmR0KCksKG49b3B0KS50aW1lPSRodCgpLHQ9bnVsbD09dD9udWxsOnQrIiIpO2Zvcih2YXIgaT10aGlzLl9ncm91cHMscj1pLmxlbmd0aCxvPTA7bzxyOysrbylmb3IodmFyIGEscz1pW29dLGw9cy5sZW5ndGgsYz0wO2M8bDsrK2MpKGE9c1tjXSkmJm9kdChhLHQsZSxjLHMsbnx8YXB0KGEsZSkpO3JldHVybiBuZXcgRGR0KGksdGhpcy5fcGFyZW50cyx0LGUpfSxjcHQucHJvdG90eXBlPXtjb25zdHJ1Y3RvcjpjcHQsc2NhbGU6ZnVuY3Rpb24odCl7cmV0dXJuIDE9PT10P3RoaXM6bmV3IGNwdCh0aGlzLmsqdCx0aGlzLngsdGhpcy55KX0sdHJhbnNsYXRlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIDA9PT10JjA9PT1lP3RoaXM6bmV3IGNwdCh0aGlzLmssdGhpcy54K3RoaXMuayp0LHRoaXMueSt0aGlzLmsqZSl9LGFwcGx5OmZ1bmN0aW9uKHQpe3JldHVyblt0WzBdKnRoaXMuayt0aGlzLngsdFsxXSp0aGlzLmsrdGhpcy55XX0sYXBwbHlYOmZ1bmN0aW9uKHQpe3JldHVybiB0KnRoaXMuayt0aGlzLnh9LGFwcGx5WTpmdW5jdGlvbih0KXtyZXR1cm4gdCp0aGlzLmsrdGhpcy55fSxpbnZlcnQ6ZnVuY3Rpb24odCl7cmV0dXJuWyh0WzBdLXRoaXMueCkvdGhpcy5rLCh0WzFdLXRoaXMueSkvdGhpcy5rXX0saW52ZXJ0WDpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLngpL3RoaXMua30saW52ZXJ0WTpmdW5jdGlvbih0KXtyZXR1cm4odC10aGlzLnkpL3RoaXMua30scmVzY2FsZVg6ZnVuY3Rpb24odCl7cmV0dXJuIHQuY29weSgpLmRvbWFpbih0LnJhbmdlKCkubWFwKHRoaXMuaW52ZXJ0WCx0aGlzKS5tYXAodC5pbnZlcnQsdCkpfSxyZXNjYWxlWTpmdW5jdGlvbih0KXtyZXR1cm4gdC5jb3B5KCkuZG9tYWluKHQucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRZLHRoaXMpLm1hcCh0LmludmVydCx0KSl9LHRvU3RyaW5nOmZ1bmN0aW9uKCl7cmV0dXJuInRyYW5zbGF0ZSgiK3RoaXMueCsiLCIrdGhpcy55KyIpIHNjYWxlKCIrdGhpcy5rKyIpIn19O3ZhciBkcHQ9bmV3IGNwdCgxLDAsMCk7ZnVuY3Rpb24gcHB0KHQpe3JldHVybiB0Ll9fem9vbXx8ZHB0fWZ1bmN0aW9uIGZwdCgpe0ZjdC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKX1mdW5jdGlvbiBtcHQoKXtGY3QucHJldmVudERlZmF1bHQoKSxGY3Quc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCl9ZnVuY3Rpb24gZ3B0KCl7cmV0dXJuIUZjdC5idXR0b259ZnVuY3Rpb24gX3B0KCl7dmFyIHQsZSxuPXRoaXM7cmV0dXJuIG4gaW5zdGFuY2VvZiBTVkdFbGVtZW50Pyh0PShuPW4ub3duZXJTVkdFbGVtZW50fHxuKS53aWR0aC5iYXNlVmFsLnZhbHVlLGU9bi5oZWlnaHQuYmFzZVZhbC52YWx1ZSk6KHQ9bi5jbGllbnRXaWR0aCxlPW4uY2xpZW50SGVpZ2h0KSxbWzAsMF0sW3QsZV1dfWZ1bmN0aW9uIHlwdCgpe3JldHVybiB0aGlzLl9fem9vbXx8ZHB0fWZ1bmN0aW9uIHZwdCgpe3JldHVybi1GY3QuZGVsdGFZKihGY3QuZGVsdGFNb2RlPzEyMDoxKS81MDB9ZnVuY3Rpb24gYnB0KCl7cmV0dXJuIm9udG91Y2hzdGFydCJpbiB0aGlzfWZ1bmN0aW9uIHhwdCh0LGUsbil7dmFyIGk9dC5pbnZlcnRYKGVbMF1bMF0pLW5bMF1bMF0scj10LmludmVydFgoZVsxXVswXSktblsxXVswXSxvPXQuaW52ZXJ0WShlWzBdWzFdKS1uWzBdWzFdLGE9dC5pbnZlcnRZKGVbMV1bMV0pLW5bMV1bMV07cmV0dXJuIHQudHJhbnNsYXRlKHI+aT8oaStyKS8yOk1hdGgubWluKDAsaSl8fE1hdGgubWF4KDAsciksYT5vPyhvK2EpLzI6TWF0aC5taW4oMCxvKXx8TWF0aC5tYXgoMCxhKSl9cHB0LnByb3RvdHlwZT1jcHQucHJvdG90eXBlO3ZhciB3cHQ9TWUoT2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsdmVyc2lvbjoiNC4xMy4wIixiaXNlY3Q6ZXosYmlzZWN0UmlnaHQ6ZXosYmlzZWN0TGVmdDpueixhc2NlbmRpbmc6Sk8sYmlzZWN0b3I6UU8sY3Jvc3M6ZnVuY3Rpb24gU3B0KHQsZSxuKXt2YXIgaSxyLG8sYSxzPXQubGVuZ3RoLGw9ZS5sZW5ndGgsYz1uZXcgQXJyYXkocypsKTtmb3IobnVsbD09biYmKG49aXopLGk9bz0wO2k8czsrK2kpZm9yKGE9dFtpXSxyPTA7cjxsOysrciwrK28pY1tvXT1uKGEsZVtyXSk7cmV0dXJuIGN9LGRlc2NlbmRpbmc6ZnVuY3Rpb24gTXB0KHQsZSl7cmV0dXJuIGU8dD8tMTplPnQ/MTplPj10PzA6TmFOfSxkZXZpYXRpb246YXosZXh0ZW50OnN6LGhpc3RvZ3JhbTpmdW5jdGlvbiBFcHQoKXt2YXIgdD1keixlPXN6LG49dno7ZnVuY3Rpb24gaShpKXt2YXIgcixvLGE9aS5sZW5ndGgscz1uZXcgQXJyYXkoYSk7Zm9yKHI9MDtyPGE7KytyKXNbcl09dChpW3JdLHIsaSk7dmFyIGw9ZShzKSxjPWxbMF0sdT1sWzFdLGg9bihzLGMsdSk7QXJyYXkuaXNBcnJheShoKXx8KGg9eXooYyx1LGgpLGg9cHooTWF0aC5jZWlsKGMvaCkqaCxNYXRoLmZsb29yKHUvaCkqaCxoKSk7Zm9yKHZhciBkPWgubGVuZ3RoO2hbMF08PWM7KWguc2hpZnQoKSwtLWQ7Zm9yKDtoW2QtMV0+dTspaC5wb3AoKSwtLWQ7dmFyIHAsZj1uZXcgQXJyYXkoZCsxKTtmb3Iocj0wO3I8PWQ7KytyKShwPWZbcl09W10pLngwPXI+MD9oW3ItMV06YyxwLngxPXI8ZD9oW3JdOnU7Zm9yKHI9MDtyPGE7KytyKWM8PShvPXNbcl0pJiZvPD11JiZmW2V6KGgsbywwLGQpXS5wdXNoKGlbcl0pO3JldHVybiBmfXJldHVybiBpLnZhbHVlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6aHooZSksaSk6dH0saS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpoeihbdFswXSx0WzFdXSksaSk6ZX0saS50aHJlc2hvbGRzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6QXJyYXkuaXNBcnJheSh0KT9oeihjei5jYWxsKHQpKTpoeih0KSxpKTpufSxpfSx0aHJlc2hvbGRGcmVlZG1hbkRpYWNvbmlzOmZ1bmN0aW9uIFRwdCh0LGUsbil7cmV0dXJuIHQ9dXouY2FsbCh0LHJ6KS5zb3J0KEpPKSxNYXRoLmNlaWwoKG4tZSkvKDIqKGJ6KHQsLjc1KS1ieih0LC4yNSkpKk1hdGgucG93KHQubGVuZ3RoLC0xLzMpKSl9LHRocmVzaG9sZFNjb3R0OmZ1bmN0aW9uIENwdCh0LGUsbil7cmV0dXJuIE1hdGguY2VpbCgobi1lKS8oMy41KmF6KHQpKk1hdGgucG93KHQubGVuZ3RoLC0xLzMpKSl9LHRocmVzaG9sZFN0dXJnZXM6dnosbWF4OmZ1bmN0aW9uIEFwdCh0LGUpe3ZhciBuLGkscj10Lmxlbmd0aCxvPS0xO2lmKG51bGw9PWUpe2Zvcig7KytvPHI7KWlmKG51bGwhPShuPXRbb10pJiZuPj1uKWZvcihpPW47KytvPHI7KW51bGwhPShuPXRbb10pJiZuPmkmJihpPW4pfWVsc2UgZm9yKDsrK288cjspaWYobnVsbCE9KG49ZSh0W29dLG8sdCkpJiZuPj1uKWZvcihpPW47KytvPHI7KW51bGwhPShuPWUodFtvXSxvLHQpKSYmbj5pJiYoaT1uKTtyZXR1cm4gaX0sbWVhbjpmdW5jdGlvbiBrcHQodCxlKXt2YXIgbixpPXQubGVuZ3RoLHI9aSxvPS0xLGE9MDtpZihudWxsPT1lKWZvcig7KytvPGk7KWlzTmFOKG49cnoodFtvXSkpPy0tcjphKz1uO2Vsc2UgZm9yKDsrK288aTspaXNOYU4obj1yeihlKHRbb10sbyx0KSkpPy0tcjphKz1uO2lmKHIpcmV0dXJuIGEvcn0sbWVkaWFuOmZ1bmN0aW9uIExwdCh0LGUpe3ZhciBuLGk9dC5sZW5ndGgscj0tMSxvPVtdO2lmKG51bGw9PWUpZm9yKDsrK3I8aTspaXNOYU4obj1yeih0W3JdKSl8fG8ucHVzaChuKTtlbHNlIGZvcig7KytyPGk7KWlzTmFOKG49cnooZSh0W3JdLHIsdCkpKXx8by5wdXNoKG4pO3JldHVybiBieihvLnNvcnQoSk8pLC41KX0sbWVyZ2U6ZnVuY3Rpb24gUHB0KHQpe2Zvcih2YXIgZSxuLGkscj10Lmxlbmd0aCxvPS0xLGE9MDsrK288cjspYSs9dFtvXS5sZW5ndGg7Zm9yKG49bmV3IEFycmF5KGEpOy0tcj49MDspZm9yKGU9KGk9dFtyXSkubGVuZ3RoOy0tZT49MDspblstLWFdPWlbZV07cmV0dXJuIG59LG1pbjp4eixwYWlyczpmdW5jdGlvbiBOcHQodCxlKXtudWxsPT1lJiYoZT1peik7Zm9yKHZhciBuPTAsaT10Lmxlbmd0aC0xLHI9dFswXSxvPW5ldyBBcnJheShpPDA/MDppKTtuPGk7KW9bbl09ZShyLHI9dFsrK25dKTtyZXR1cm4gb30scGVybXV0ZTpmdW5jdGlvbiBJcHQodCxlKXtmb3IodmFyIG49ZS5sZW5ndGgsaT1uZXcgQXJyYXkobik7bi0tOylpW25dPXRbZVtuXV07cmV0dXJuIGl9LHF1YW50aWxlOmJ6LHJhbmdlOnB6LHNjYW46ZnVuY3Rpb24gUnB0KHQsZSl7aWYobj10Lmxlbmd0aCl7dmFyIG4saSxyPTAsbz0wLGE9dFtvXTtmb3IobnVsbD09ZSYmKGU9Sk8pOysrcjxuOykoZShpPXRbcl0sYSk8MHx8MCE9PWUoYSxhKSkmJihhPWksbz1yKTtyZXR1cm4gMD09PWUoYSxhKT9vOnZvaWQgMH19LHNodWZmbGU6ZnVuY3Rpb24gT3B0KHQsZSxuKXtmb3IodmFyIGkscixvPShudWxsPT1uP3QubGVuZ3RoOm4pLShlPW51bGw9PWU/MDorZSk7bzspcj1NYXRoLnJhbmRvbSgpKm8tLXwwLGk9dFtvK2VdLHRbbytlXT10W3IrZV0sdFtyK2VdPWk7cmV0dXJuIHR9LHN1bTpmdW5jdGlvbiB6cHQodCxlKXt2YXIgbixpPXQubGVuZ3RoLHI9LTEsbz0wO2lmKG51bGw9PWUpZm9yKDsrK3I8aTspKG49K3Rbcl0pJiYobys9bik7ZWxzZSBmb3IoOysrcjxpOykobj0rZSh0W3JdLHIsdCkpJiYobys9bik7cmV0dXJuIG99LHRpY2tzOmZ1bmN0aW9uIERwdCh0LGUsbil7dmFyIGkscixvLGEscz0tMTtpZihuPStuLCh0PSt0KT09PShlPStlKSYmbj4wKXJldHVyblt0XTtpZigoaT1lPHQpJiYocj10LHQ9ZSxlPXIpLDA9PT0oYT1feih0LGUsbikpfHwhaXNGaW5pdGUoYSkpcmV0dXJuW107aWYoYT4wKWZvcih0PU1hdGguY2VpbCh0L2EpLGU9TWF0aC5mbG9vcihlL2EpLG89bmV3IEFycmF5KHI9TWF0aC5jZWlsKGUtdCsxKSk7KytzPHI7KW9bc109KHQrcykqYTtlbHNlIGZvcih0PU1hdGguZmxvb3IodCphKSxlPU1hdGguY2VpbChlKmEpLG89bmV3IEFycmF5KHI9TWF0aC5jZWlsKHQtZSsxKSk7KytzPHI7KW9bc109KHQtcykvYTtyZXR1cm4gaSYmby5yZXZlcnNlKCksb30sdGlja0luY3JlbWVudDpfeix0aWNrU3RlcDp5eix0cmFuc3Bvc2U6d3osdmFyaWFuY2U6b3osemlwOmZ1bmN0aW9uIEJwdCgpe3JldHVybiB3eihhcmd1bWVudHMpfSxheGlzVG9wOmZ1bmN0aW9uIEhwdCh0KXtyZXR1cm4gTnooMSx0KX0sYXhpc1JpZ2h0OmZ1bmN0aW9uIEZwdCh0KXtyZXR1cm4gTnooMix0KX0sYXhpc0JvdHRvbTpmdW5jdGlvbiBWcHQodCl7cmV0dXJuIE56KDMsdCl9LGF4aXNMZWZ0OmZ1bmN0aW9uIFVwdCh0KXtyZXR1cm4gTnooNCx0KX0sYnJ1c2g6ZnVuY3Rpb24ganB0KCl7cmV0dXJuIEVWKGZWKX0sYnJ1c2hYOmZ1bmN0aW9uIEdwdCgpe3JldHVybiBFVihkVil9LGJydXNoWTpmdW5jdGlvbiBXcHQoKXtyZXR1cm4gRVYocFYpfSxicnVzaFNlbGVjdGlvbjpmdW5jdGlvbiBxcHQodCl7dmFyIGU9dC5fX2JydXNoO3JldHVybiBlP2UuZGltLm91dHB1dChlLnNlbGVjdGlvbik6bnVsbH0sY2hvcmQ6ZnVuY3Rpb24gWXB0KCl7dmFyIHQ9MCxlPW51bGwsbj1udWxsLGk9bnVsbDtmdW5jdGlvbiByKHIpe3ZhciBvLGEscyxsLGMsdSxoPXIubGVuZ3RoLGQ9W10scD1DVihoKSxmPVtdLG09W10sZz1tLmdyb3Vwcz1uZXcgQXJyYXkoaCksXz1uZXcgQXJyYXkoaCpoKTtmb3Iobz0wLGM9LTE7KytjPGg7KXtmb3IoYT0wLHU9LTE7Kyt1PGg7KWErPXJbY11bdV07ZC5wdXNoKGEpLGYucHVzaChDVihoKSksbys9YX1mb3IoZSYmcC5zb3J0KChmdW5jdGlvbih0LG4pe3JldHVybiBlKGRbdF0sZFtuXSl9KSksbiYmZi5mb3JFYWNoKChmdW5jdGlvbih0LGUpe3Quc29ydCgoZnVuY3Rpb24odCxpKXtyZXR1cm4gbihyW2VdW3RdLHJbZV1baV0pfSkpfSkpLGw9KG89UlYoMCxJVi10KmgpL28pP3Q6SVYvaCxhPTAsYz0tMTsrK2M8aDspe2ZvcihzPWEsdT0tMTsrK3U8aDspe3ZhciB5PXBbY10sdj1mW3ldW3VdLGI9clt5XVt2XSx4PWEsdz1hKz1iKm87X1t2KmgreV09e2luZGV4Onksc3ViaW5kZXg6dixzdGFydEFuZ2xlOngsZW5kQW5nbGU6dyx2YWx1ZTpifX1nW3ldPXtpbmRleDp5LHN0YXJ0QW5nbGU6cyxlbmRBbmdsZTphLHZhbHVlOmRbeV19LGErPWx9Zm9yKGM9LTE7KytjPGg7KWZvcih1PWMtMTsrK3U8aDspe3ZhciBTPV9bdSpoK2NdLE09X1tjKmgrdV07KFMudmFsdWV8fE0udmFsdWUpJiZtLnB1c2goUy52YWx1ZTxNLnZhbHVlP3tzb3VyY2U6TSx0YXJnZXQ6U306e3NvdXJjZTpTLHRhcmdldDpNfSl9cmV0dXJuIGk/bS5zb3J0KGkpOm19cmV0dXJuIHIucGFkQW5nbGU9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9UlYoMCxlKSxyKTp0fSxyLnNvcnRHcm91cHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxyKTplfSxyLnNvcnRTdWJncm91cHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49dCxyKTpufSxyLnNvcnRDaG9yZHM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG51bGw9PXQ/aT1udWxsOihpPU9WKHQpKS5fPXQscik6aSYmaS5ffSxyfSxyaWJib246ZnVuY3Rpb24gWHB0KCl7dmFyIHQ9R1YsZT1XVixuPXFWLGk9WVYscj1YVixvPW51bGw7ZnVuY3Rpb24gYSgpe3ZhciBhLHM9elYuY2FsbChhcmd1bWVudHMpLGw9dC5hcHBseSh0aGlzLHMpLGM9ZS5hcHBseSh0aGlzLHMpLHU9K24uYXBwbHkodGhpcywoc1swXT1sLHMpKSxoPWkuYXBwbHkodGhpcyxzKS1OVixkPXIuYXBwbHkodGhpcyxzKS1OVixwPXUqa1YoaCksZj11KkxWKGgpLG09K24uYXBwbHkodGhpcywoc1swXT1jLHMpKSxnPWkuYXBwbHkodGhpcyxzKS1OVixfPXIuYXBwbHkodGhpcyxzKS1OVjtpZihvfHwobz1hPWpWKCkpLG8ubW92ZVRvKHAsZiksby5hcmMoMCwwLHUsaCxkKSxoPT09ZyYmZD09PV98fChvLnF1YWRyYXRpY0N1cnZlVG8oMCwwLG0qa1YoZyksbSpMVihnKSksby5hcmMoMCwwLG0sZyxfKSksby5xdWFkcmF0aWNDdXJ2ZVRvKDAsMCxwLGYpLG8uY2xvc2VQYXRoKCksYSlyZXR1cm4gbz1udWxsLGErIiJ8fG51bGx9cmV0dXJuIGEucmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RFYoK3QpLGEpOm59LGEuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkRWKCt0KSxhKTppfSxhLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RFYoK3QpLGEpOnJ9LGEuc291cmNlPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUsYSk6dH0sYS50YXJnZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxhKTplfSxhLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89bnVsbD09dD9udWxsOnQsYSk6b30sYX0sbmVzdDpmdW5jdGlvbiAkcHQoKXt2YXIgdCxlLG4saT1bXSxyPVtdO2Z1bmN0aW9uIG8obixyLGEscyl7aWYocj49aS5sZW5ndGgpcmV0dXJuIG51bGwhPXQmJm4uc29ydCh0KSxudWxsIT1lP2Uobik6bjtmb3IodmFyIGwsYyx1LGg9LTEsZD1uLmxlbmd0aCxwPWlbcisrXSxmPVpWKCksbT1hKCk7KytoPGQ7KSh1PWYuZ2V0KGw9cChjPW5baF0pKyIiKSk/dS5wdXNoKGMpOmYuc2V0KGwsW2NdKTtyZXR1cm4gZi5lYWNoKChmdW5jdGlvbih0LGUpe3MobSxlLG8odCxyLGEscykpfSkpLG19ZnVuY3Rpb24gYSh0LG4pe2lmKCsrbj5pLmxlbmd0aClyZXR1cm4gdDt2YXIgbyxzPXJbbi0xXTtyZXR1cm4gbnVsbCE9ZSYmbj49aS5sZW5ndGg/bz10LmVudHJpZXMoKToobz1bXSx0LmVhY2goKGZ1bmN0aW9uKHQsZSl7by5wdXNoKHtrZXk6ZSx2YWx1ZXM6YSh0LG4pfSl9KSkpLG51bGwhPXM/by5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiBzKHQua2V5LGUua2V5KX0pKTpvfXJldHVybiBuPXtvYmplY3Q6ZnVuY3Rpb24odCl7cmV0dXJuIG8odCwwLEpWLFFWKX0sbWFwOmZ1bmN0aW9uKHQpe3JldHVybiBvKHQsMCx0VSxlVSl9LGVudHJpZXM6ZnVuY3Rpb24odCl7cmV0dXJuIGEobyh0LDAsdFUsZVUpLDApfSxrZXk6ZnVuY3Rpb24odCl7cmV0dXJuIGkucHVzaCh0KSxufSxzb3J0S2V5czpmdW5jdGlvbih0KXtyZXR1cm4gcltpLmxlbmd0aC0xXT10LG59LHNvcnRWYWx1ZXM6ZnVuY3Rpb24oZSl7cmV0dXJuIHQ9ZSxufSxyb2xsdXA6ZnVuY3Rpb24odCl7cmV0dXJuIGU9dCxufX19LHNldDpyVSxtYXA6WlYsa2V5czpmdW5jdGlvbiBLcHQodCl7dmFyIGU9W107Zm9yKHZhciBuIGluIHQpZS5wdXNoKG4pO3JldHVybiBlfSx2YWx1ZXM6ZnVuY3Rpb24gWnB0KHQpe3ZhciBlPVtdO2Zvcih2YXIgbiBpbiB0KWUucHVzaCh0W25dKTtyZXR1cm4gZX0sZW50cmllczpmdW5jdGlvbiBKcHQodCl7dmFyIGU9W107Zm9yKHZhciBuIGluIHQpZS5wdXNoKHtrZXk6bix2YWx1ZTp0W25dfSk7cmV0dXJuIGV9LGNvbG9yOndVLHJnYjpUVSxoc2w6TFUsbGFiOlZVLGhjbDpYVSxjdWJlaGVsaXg6b2osZGlzcGF0Y2g6bGosZHJhZzpmdW5jdGlvbiBRcHQoKXt2YXIgdCxlLG4saSxyPURHLG89QkcsYT1IRyxzPUZHLGw9e30sYz1maigic3RhcnQiLCJkcmFnIiwiZW5kIiksdT0wLGg9MDtmdW5jdGlvbiBkKHQpe3Qub24oIm1vdXNlZG93bi5kcmFnIixwKS5maWx0ZXIocykub24oInRvdWNoc3RhcnQuZHJhZyIsZykub24oInRvdWNobW92ZS5kcmFnIixfKS5vbigidG91Y2hlbmQuZHJhZyB0b3VjaGNhbmNlbC5kcmFnIix5KS5zdHlsZSgidG91Y2gtYWN0aW9uIiwibm9uZSIpLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCJyZ2JhKDAsMCwwLDApIil9ZnVuY3Rpb24gcCgpe2lmKCFpJiZyLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIGE9digibW91c2UiLG8uYXBwbHkodGhpcyxhcmd1bWVudHMpLGtHLHRoaXMsYXJndW1lbnRzKTthJiYoVEcoZkcudmlldykub24oIm1vdXNlbW92ZS5kcmFnIixmLCEwKS5vbigibW91c2V1cC5kcmFnIixtLCEwKSxJRyhmRy52aWV3KSxQRygpLG49ITEsdD1mRy5jbGllbnRYLGU9ZkcuY2xpZW50WSxhKCJzdGFydCIpKX19ZnVuY3Rpb24gZigpe2lmKE5HKCksIW4pe3ZhciBpPWZHLmNsaWVudFgtdCxyPWZHLmNsaWVudFktZTtuPWkqaStyKnI+aH1sLm1vdXNlKCJkcmFnIil9ZnVuY3Rpb24gbSgpe1RHKGZHLnZpZXcpLm9uKCJtb3VzZW1vdmUuZHJhZyBtb3VzZXVwLmRyYWciLG51bGwpLFJHKGZHLnZpZXcsbiksTkcoKSxsLm1vdXNlKCJlbmQiKX1mdW5jdGlvbiBnKCl7aWYoci5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciB0LGUsbj1mRy5jaGFuZ2VkVG91Y2hlcyxpPW8uYXBwbHkodGhpcyxhcmd1bWVudHMpLGE9bi5sZW5ndGg7Zm9yKHQ9MDt0PGE7Kyt0KShlPXYoblt0XS5pZGVudGlmaWVyLGksTEcsdGhpcyxhcmd1bWVudHMpKSYmKFBHKCksZSgic3RhcnQiKSl9fWZ1bmN0aW9uIF8oKXt2YXIgdCxlLG49ZkcuY2hhbmdlZFRvdWNoZXMsaT1uLmxlbmd0aDtmb3IodD0wO3Q8aTsrK3QpKGU9bFtuW3RdLmlkZW50aWZpZXJdKSYmKE5HKCksZSgiZHJhZyIpKX1mdW5jdGlvbiB5KCl7dmFyIHQsZSxuPWZHLmNoYW5nZWRUb3VjaGVzLHI9bi5sZW5ndGg7Zm9yKGkmJmNsZWFyVGltZW91dChpKSxpPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aT1udWxsfSksNTAwKSx0PTA7dDxyOysrdCkoZT1sW25bdF0uaWRlbnRpZmllcl0pJiYoUEcoKSxlKCJlbmQiKSl9ZnVuY3Rpb24gdih0LGUsbixpLHIpe3ZhciBvLHMsaCxwPW4oZSx0KSxmPWMuY29weSgpO2lmKGJHKG5ldyB6RyhkLCJiZWZvcmVzdGFydCIsbyx0LHUscFswXSxwWzFdLDAsMCxmKSwoZnVuY3Rpb24oKXtyZXR1cm4gbnVsbCE9KGZHLnN1YmplY3Q9bz1hLmFwcGx5KGkscikpJiYocz1vLngtcFswXXx8MCxoPW8ueS1wWzFdfHwwLCEwKX0pKSlyZXR1cm4gZnVuY3Rpb24gYShjKXt2YXIgbSxnPXA7c3dpdGNoKGMpe2Nhc2Uic3RhcnQiOmxbdF09YSxtPXUrKzticmVhaztjYXNlImVuZCI6ZGVsZXRlIGxbdF0sLS11O2Nhc2UiZHJhZyI6cD1uKGUsdCksbT11fWJHKG5ldyB6RyhkLGMsbyx0LG0scFswXStzLHBbMV0raCxwWzBdLWdbMF0scFsxXS1nWzFdLGYpLGYuYXBwbHksZixbYyxpLHJdKX19cmV0dXJuIGQuZmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6T0coISF0KSxkKTpyfSxkLmNvbnRhaW5lcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90Ok9HKHQpLGQpOm99LGQuc3ViamVjdD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2YgdD90Ok9HKHQpLGQpOmF9LGQudG91Y2hhYmxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6T0coISF0KSxkKTpzfSxkLm9uPWZ1bmN0aW9uKCl7dmFyIHQ9Yy5vbi5hcHBseShjLGFyZ3VtZW50cyk7cmV0dXJuIHQ9PT1jP2Q6dH0sZC5jbGlja0Rpc3RhbmNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhoPSh0PSt0KSp0LGQpOk1hdGguc3FydChoKX0sZH0sZHJhZ0Rpc2FibGU6SUcsZHJhZ0VuYWJsZTpSRyxkc3ZGb3JtYXQ6eFcsY3N2UGFyc2U6U1csY3N2UGFyc2VSb3dzOk1XLGNzdkZvcm1hdDpFVyxjc3ZGb3JtYXRSb3dzOlRXLHRzdlBhcnNlOkFXLHRzdlBhcnNlUm93czprVyx0c3ZGb3JtYXQ6TFcsdHN2Rm9ybWF0Um93czpQVyxlYXNlTGluZWFyOmZ1bmN0aW9uIHRmdCh0KXtyZXR1cm4rdH0sZWFzZVF1YWQ6TlcsZWFzZVF1YWRJbjpmdW5jdGlvbiBlZnQodCl7cmV0dXJuIHQqdH0sZWFzZVF1YWRPdXQ6ZnVuY3Rpb24gbmZ0KHQpe3JldHVybiB0KigyLXQpfSxlYXNlUXVhZEluT3V0Ok5XLGVhc2VDdWJpYzpJVyxlYXNlQ3ViaWNJbjpmdW5jdGlvbiBpZnQodCl7cmV0dXJuIHQqdCp0fSxlYXNlQ3ViaWNPdXQ6ZnVuY3Rpb24gcmZ0KHQpe3JldHVybi0tdCp0KnQrMX0sZWFzZUN1YmljSW5PdXQ6SVcsZWFzZVBvbHk6elcsZWFzZVBvbHlJbjpSVyxlYXNlUG9seU91dDpPVyxlYXNlUG9seUluT3V0OnpXLGVhc2VTaW46SFcsZWFzZVNpbkluOmZ1bmN0aW9uIG9mdCh0KXtyZXR1cm4gMS1NYXRoLmNvcyh0KkJXKX0sZWFzZVNpbk91dDpmdW5jdGlvbiBhZnQodCl7cmV0dXJuIE1hdGguc2luKHQqQlcpfSxlYXNlU2luSW5PdXQ6SFcsZWFzZUV4cDpGVyxlYXNlRXhwSW46ZnVuY3Rpb24gc2Z0KHQpe3JldHVybiBNYXRoLnBvdygyLDEwKnQtMTApfSxlYXNlRXhwT3V0OmZ1bmN0aW9uIGxmdCh0KXtyZXR1cm4gMS1NYXRoLnBvdygyLC0xMCp0KX0sZWFzZUV4cEluT3V0OkZXLGVhc2VDaXJjbGU6VlcsZWFzZUNpcmNsZUluOmZ1bmN0aW9uIGNmdCh0KXtyZXR1cm4gMS1NYXRoLnNxcnQoMS10KnQpfSxlYXNlQ2lyY2xlT3V0OmZ1bmN0aW9uIHVmdCh0KXtyZXR1cm4gTWF0aC5zcXJ0KDEtIC0tdCp0KX0sZWFzZUNpcmNsZUluT3V0OlZXLGVhc2VCb3VuY2U6R1csZWFzZUJvdW5jZUluOmZ1bmN0aW9uIGhmdCh0KXtyZXR1cm4gMS1HVygxLXQpfSxlYXNlQm91bmNlT3V0OkdXLGVhc2VCb3VuY2VJbk91dDpmdW5jdGlvbiBkZnQodCl7cmV0dXJuKCh0Kj0yKTw9MT8xLUdXKDEtdCk6R1codC0xKSsxKS8yfSxlYXNlQmFjazpYVyxlYXNlQmFja0luOnFXLGVhc2VCYWNrT3V0OllXLGVhc2VCYWNrSW5PdXQ6WFcsZWFzZUVsYXN0aWM6WlcsZWFzZUVsYXN0aWNJbjpLVyxlYXNlRWxhc3RpY091dDpaVyxlYXNlRWxhc3RpY0luT3V0OkpXLGZvcmNlQ2VudGVyOmZ1bmN0aW9uIHBmdCh0LGUpe3ZhciBuO2Z1bmN0aW9uIGkoKXt2YXIgaSxyLG89bi5sZW5ndGgsYT0wLHM9MDtmb3IoaT0wO2k8bzsrK2kpYSs9KHI9bltpXSkueCxzKz1yLnk7Zm9yKGE9YS9vLXQscz1zL28tZSxpPTA7aTxvOysraSkocj1uW2ldKS54LT1hLHIueS09c31yZXR1cm4gbnVsbD09dCYmKHQ9MCksbnVsbD09ZSYmKGU9MCksaS5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe249dH0saS54PWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PStlLGkpOnR9LGkueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdCxpKTplfSxpfSxmb3JjZUNvbGxpZGU6ZnVuY3Rpb24gZmZ0KHQpe3ZhciBlLG4saT0xLHI9MTtmdW5jdGlvbiBvKCl7Zm9yKHZhciB0LG8scyxsLGMsdSxoLGQ9ZS5sZW5ndGgscD0wO3A8cjsrK3ApZm9yKG89b3EoZSxjcSx1cSkudmlzaXRBZnRlcihhKSx0PTA7dDxkOysrdCloPSh1PW5bKHM9ZVt0XSkuaW5kZXhdKSp1LGw9cy54K3MudngsYz1zLnkrcy52eSxvLnZpc2l0KGYpO2Z1bmN0aW9uIGYodCxlLG4scixvKXt2YXIgYT10LmRhdGEsZD10LnIscD11K2Q7aWYoIWEpcmV0dXJuIGU+bCtwfHxyPGwtcHx8bj5jK3B8fG88Yy1wO2lmKGEuaW5kZXg+cy5pbmRleCl7dmFyIGY9bC1hLngtYS52eCxtPWMtYS55LWEudnksZz1mKmYrbSptO2c8cCpwJiYoMD09PWYmJihnKz0oZj10cSgpKSpmKSwwPT09bSYmKGcrPShtPXRxKCkpKm0pLGc9KHAtKGc9TWF0aC5zcXJ0KGcpKSkvZyppLHMudngrPShmKj1nKSoocD0oZCo9ZCkvKGgrZCkpLHMudnkrPShtKj1nKSpwLGEudngtPWYqKHA9MS1wKSxhLnZ5LT1tKnApfX19ZnVuY3Rpb24gYSh0KXtpZih0LmRhdGEpcmV0dXJuIHQucj1uW3QuZGF0YS5pbmRleF07Zm9yKHZhciBlPXQucj0wO2U8NDsrK2UpdFtlXSYmdFtlXS5yPnQuciYmKHQucj10W2VdLnIpfWZ1bmN0aW9uIHMoKXtpZihlKXt2YXIgaSxyLG89ZS5sZW5ndGg7Zm9yKG49bmV3IEFycmF5KG8pLGk9MDtpPG87KytpKW5bKHI9ZVtpXSkuaW5kZXhdPSt0KHIsaSxlKX19cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQmJih0PVFXKG51bGw9PXQ/MTordCkpLG8uaW5pdGlhbGl6ZT1mdW5jdGlvbih0KXtlPXQscygpfSxvLml0ZXJhdGlvbnM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9K3Qsbyk6cn0sby5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdCxvKTppfSxvLnJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOlFXKCtlKSxzKCksbyk6dH0sb30sZm9yY2VMaW5rOmZ1bmN0aW9uIG1mdCh0KXt2YXIgZSxuLGkscixvLGE9THEscz1mdW5jdGlvbiBsKHQpe3JldHVybiAxL01hdGgubWluKHJbdC5zb3VyY2UuaW5kZXhdLHJbdC50YXJnZXQuaW5kZXhdKX0sYz1RVygzMCksdT0xO2Z1bmN0aW9uIGgoaSl7Zm9yKHZhciByPTAsYT10Lmxlbmd0aDtyPHU7KytyKWZvcih2YXIgcyxsLGMsaCxkLHAsZixtPTA7bTxhOysrbSloPShjPShzPXRbbV0pLnRhcmdldCkueCtjLnZ4LShsPXMuc291cmNlKS54LWwudnh8fHRxKCksZD1jLnkrYy52eS1sLnktbC52eXx8dHEoKSxkKj1wPSgocD1NYXRoLnNxcnQoaCpoK2QqZCkpLW5bbV0pL3AqaSplW21dLGMudngtPShoKj1wKSooZj1vW21dKSxjLnZ5LT1kKmYsbC52eCs9aCooZj0xLWYpLGwudnkrPWQqZn1mdW5jdGlvbiBkKCl7aWYoaSl7dmFyIHMsbCxjPWkubGVuZ3RoLHU9dC5sZW5ndGgsaD1DcShpLGEpO2ZvcihzPTAscj1uZXcgQXJyYXkoYyk7czx1OysrcykobD10W3NdKS5pbmRleD1zLCJvYmplY3QiIT10eXBlb2YgbC5zb3VyY2UmJihsLnNvdXJjZT1QcShoLGwuc291cmNlKSksIm9iamVjdCIhPXR5cGVvZiBsLnRhcmdldCYmKGwudGFyZ2V0PVBxKGgsbC50YXJnZXQpKSxyW2wuc291cmNlLmluZGV4XT0ocltsLnNvdXJjZS5pbmRleF18fDApKzEscltsLnRhcmdldC5pbmRleF09KHJbbC50YXJnZXQuaW5kZXhdfHwwKSsxO2ZvcihzPTAsbz1uZXcgQXJyYXkodSk7czx1OysrcylvW3NdPXJbKGw9dFtzXSkuc291cmNlLmluZGV4XS8ocltsLnNvdXJjZS5pbmRleF0rcltsLnRhcmdldC5pbmRleF0pO2U9bmV3IEFycmF5KHUpLHAoKSxuPW5ldyBBcnJheSh1KSxmKCl9fWZ1bmN0aW9uIHAoKXtpZihpKWZvcih2YXIgbj0wLHI9dC5sZW5ndGg7bjxyOysrbillW25dPStzKHRbbl0sbix0KX1mdW5jdGlvbiBmKCl7aWYoaSlmb3IodmFyIGU9MCxyPXQubGVuZ3RoO2U8cjsrK2UpbltlXT0rYyh0W2VdLGUsdCl9cmV0dXJuIG51bGw9PXQmJih0PVtdKSxoLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7aT10LGQoKX0saC5saW5rcz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLGQoKSxoKTp0fSxoLmlkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPXQsaCk6YX0saC5pdGVyYXRpb25zPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh1PSt0LGgpOnV9LGguc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHM9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpRVygrdCkscCgpLGgpOnN9LGguZGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpRVygrdCksZigpLGgpOmN9LGh9LGZvcmNlTWFueUJvZHk6ZnVuY3Rpb24gZ2Z0KCl7dmFyIHQsZSxuLGkscj1RVygtMzApLG89MSxhPTEvMCxzPS44MTtmdW5jdGlvbiBsKGkpe3ZhciByLG89dC5sZW5ndGgsYT1vcSh0LGVZLG5ZKS52aXNpdEFmdGVyKHUpO2ZvcihuPWkscj0wO3I8bzsrK3IpZT10W3JdLGEudmlzaXQoaCl9ZnVuY3Rpb24gYygpe2lmKHQpe3ZhciBlLG4sbz10Lmxlbmd0aDtmb3IoaT1uZXcgQXJyYXkobyksZT0wO2U8bzsrK2UpaVsobj10W2VdKS5pbmRleF09K3IobixlLHQpfX1mdW5jdGlvbiB1KHQpe3ZhciBlLG4scixvLGEscz0wLGw9MDtpZih0Lmxlbmd0aCl7Zm9yKHI9bz1hPTA7YTw0OysrYSkoZT10W2FdKSYmKG49TWF0aC5hYnMoZS52YWx1ZSkpJiYocys9ZS52YWx1ZSxsKz1uLHIrPW4qZS54LG8rPW4qZS55KTt0Lng9ci9sLHQueT1vL2x9ZWxzZXsoZT10KS54PWUuZGF0YS54LGUueT1lLmRhdGEueTtkb3tzKz1pW2UuZGF0YS5pbmRleF19d2hpbGUoZT1lLm5leHQpfXQudmFsdWU9c31mdW5jdGlvbiBoKHQscixsLGMpe2lmKCF0LnZhbHVlKXJldHVybiEwO3ZhciB1PXQueC1lLngsaD10LnktZS55LGQ9Yy1yLHA9dSp1K2gqaDtpZihkKmQvczxwKXJldHVybiBwPGEmJigwPT09dSYmKHArPSh1PXRxKCkpKnUpLDA9PT1oJiYocCs9KGg9dHEoKSkqaCkscDxvJiYocD1NYXRoLnNxcnQobypwKSksZS52eCs9dSp0LnZhbHVlKm4vcCxlLnZ5Kz1oKnQudmFsdWUqbi9wKSwhMDtpZighKHQubGVuZ3RofHxwPj1hKSl7KHQuZGF0YSE9PWV8fHQubmV4dCkmJigwPT09dSYmKHArPSh1PXRxKCkpKnUpLDA9PT1oJiYocCs9KGg9dHEoKSkqaCkscDxvJiYocD1NYXRoLnNxcnQobypwKSkpO2Rve3QuZGF0YSE9PWUmJihlLnZ4Kz11KihkPWlbdC5kYXRhLmluZGV4XSpuL3ApLGUudnkrPWgqZCl9d2hpbGUodD10Lm5leHQpfX1yZXR1cm4gbC5pbml0aWFsaXplPWZ1bmN0aW9uKGUpe3Q9ZSxjKCl9LGwuc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpRVygrdCksYygpLGwpOnJ9LGwuZGlzdGFuY2VNaW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89dCp0LGwpOk1hdGguc3FydChvKX0sbC5kaXN0YW5jZU1heD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT10KnQsbCk6TWF0aC5zcXJ0KGEpfSxsLnRoZXRhPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPXQqdCxsKTpNYXRoLnNxcnQocyl9LGx9LGZvcmNlUmFkaWFsOmZ1bmN0aW9uIF9mdCh0LGUsbil7dmFyIGkscixvLGE9UVcoLjEpO2Z1bmN0aW9uIHModCl7Zm9yKHZhciBhPTAscz1pLmxlbmd0aDthPHM7KythKXt2YXIgbD1pW2FdLGM9bC54LWV8fDFlLTYsdT1sLnktbnx8MWUtNixoPU1hdGguc3FydChjKmMrdSp1KSxkPShvW2FdLWgpKnJbYV0qdC9oO2wudngrPWMqZCxsLnZ5Kz11KmR9fWZ1bmN0aW9uIGwoKXtpZihpKXt2YXIgZSxuPWkubGVuZ3RoO2ZvcihyPW5ldyBBcnJheShuKSxvPW5ldyBBcnJheShuKSxlPTA7ZTxuOysrZSlvW2VdPSt0KGlbZV0sZSxpKSxyW2VdPWlzTmFOKG9bZV0pPzA6K2EoaVtlXSxlLGkpfX1yZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9UVcoK3QpKSxudWxsPT1lJiYoZT0wKSxudWxsPT1uJiYobj0wKSxzLmluaXRpYWxpemU9ZnVuY3Rpb24odCl7aT10LGwoKX0scy5zdHJlbmd0aD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlFXKCt0KSxsKCkscyk6YX0scy5yYWRpdXM9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpRVygrZSksbCgpLHMpOnR9LHMueD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdCxzKTplfSxzLnk9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K3Qscyk6bn0sc30sZm9yY2VTaW11bGF0aW9uOmZ1bmN0aW9uIHlmdCh0KXt2YXIgZSxuPTEsaT0uMDAxLHI9MS1NYXRoLnBvdyhpLDEvMzAwKSxvPTAsYT0uNixzPUNxKCksbD1acSh1KSxjPUlxKCJ0aWNrIiwiZW5kIik7ZnVuY3Rpb24gdSgpe2goKSxjLmNhbGwoInRpY2siLGUpLG48aSYmKGwuc3RvcCgpLGMuY2FsbCgiZW5kIixlKSl9ZnVuY3Rpb24gaCgpe3ZhciBlLGksbD10Lmxlbmd0aDtmb3Iobis9KG8tbikqcixzLmVhY2goKGZ1bmN0aW9uKHQpe3Qobil9KSksZT0wO2U8bDsrK2UpbnVsbD09KGk9dFtlXSkuZng/aS54Kz1pLnZ4Kj1hOihpLng9aS5meCxpLnZ4PTApLG51bGw9PWkuZnk/aS55Kz1pLnZ5Kj1hOihpLnk9aS5meSxpLnZ5PTApfWZ1bmN0aW9uIGQoKXtmb3IodmFyIGUsbj0wLGk9dC5sZW5ndGg7bjxpOysrbil7aWYoKGU9dFtuXSkuaW5kZXg9bixpc05hTihlLngpfHxpc05hTihlLnkpKXt2YXIgcj0xMCpNYXRoLnNxcnQobiksbz1uKnJZO2UueD1yKk1hdGguY29zKG8pLGUueT1yKk1hdGguc2luKG8pfShpc05hTihlLnZ4KXx8aXNOYU4oZS52eSkpJiYoZS52eD1lLnZ5PTApfX1mdW5jdGlvbiBwKGUpe3JldHVybiBlLmluaXRpYWxpemUmJmUuaW5pdGlhbGl6ZSh0KSxlfXJldHVybiBudWxsPT10JiYodD1bXSksZCgpLGU9e3RpY2s6aCxyZXN0YXJ0OmZ1bmN0aW9uKCl7cmV0dXJuIGwucmVzdGFydCh1KSxlfSxzdG9wOmZ1bmN0aW9uKCl7cmV0dXJuIGwuc3RvcCgpLGV9LG5vZGVzOmZ1bmN0aW9uKG4pe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PW4sZCgpLHMuZWFjaChwKSxlKTp0fSxhbHBoYTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj0rdCxlKTpufSxhbHBoYU1pbjpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rdCxlKTppfSxhbHBoYURlY2F5OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSt0LGUpOityfSxhbHBoYVRhcmdldDpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0rdCxlKTpvfSx2ZWxvY2l0eURlY2F5OmZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPTEtdCxlKToxLWF9LGZvcmNlOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8obnVsbD09bj9zLnJlbW92ZSh0KTpzLnNldCh0LHAobikpLGUpOnMuZ2V0KHQpfSxmaW5kOmZ1bmN0aW9uKGUsbixpKXt2YXIgcixvLGEscyxsLGM9MCx1PXQubGVuZ3RoO2ZvcihudWxsPT1pP2k9MS8wOmkqPWksYz0wO2M8dTsrK2MpKGE9KHI9ZS0ocz10W2NdKS54KSpyKyhvPW4tcy55KSpvKTxpJiYobD1zLGk9YSk7cmV0dXJuIGx9LG9uOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MT8oYy5vbih0LG4pLGUpOmMub24odCl9fX0sZm9yY2VYOmZ1bmN0aW9uIHZmdCh0KXt2YXIgZSxuLGkscj1RVyguMSk7ZnVuY3Rpb24gbyh0KXtmb3IodmFyIHIsbz0wLGE9ZS5sZW5ndGg7bzxhOysrbykocj1lW29dKS52eCs9KGlbb10tci54KSpuW29dKnR9ZnVuY3Rpb24gYSgpe2lmKGUpe3ZhciBvLGE9ZS5sZW5ndGg7Zm9yKG49bmV3IEFycmF5KGEpLGk9bmV3IEFycmF5KGEpLG89MDtvPGE7KytvKW5bb109aXNOYU4oaVtvXT0rdChlW29dLG8sZSkpPzA6K3IoZVtvXSxvLGUpfX1yZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9UVcobnVsbD09dD8wOit0KSksby5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe2U9dCxhKCl9LG8uc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpRVygrdCksYSgpLG8pOnJ9LG8ueD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOlFXKCtlKSxhKCksbyk6dH0sb30sZm9yY2VZOmZ1bmN0aW9uIGJmdCh0KXt2YXIgZSxuLGkscj1RVyguMSk7ZnVuY3Rpb24gbyh0KXtmb3IodmFyIHIsbz0wLGE9ZS5sZW5ndGg7bzxhOysrbykocj1lW29dKS52eSs9KGlbb10tci55KSpuW29dKnR9ZnVuY3Rpb24gYSgpe2lmKGUpe3ZhciBvLGE9ZS5sZW5ndGg7Zm9yKG49bmV3IEFycmF5KGEpLGk9bmV3IEFycmF5KGEpLG89MDtvPGE7KytvKW5bb109aXNOYU4oaVtvXT0rdChlW29dLG8sZSkpPzA6K3IoZVtvXSxvLGUpfX1yZXR1cm4iZnVuY3Rpb24iIT10eXBlb2YgdCYmKHQ9UVcobnVsbD09dD8wOit0KSksby5pbml0aWFsaXplPWZ1bmN0aW9uKHQpe2U9dCxhKCl9LG8uc3RyZW5ndGg9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpRVygrdCksYSgpLG8pOnJ9LG8ueT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOlFXKCtlKSxhKCksbyk6dH0sb30sZm9ybWF0RGVmYXVsdExvY2FsZTpiWSxnZXQgZm9ybWF0KCl7cmV0dXJuIGdZfSxnZXQgZm9ybWF0UHJlZml4KCl7cmV0dXJuIF9ZfSxmb3JtYXRMb2NhbGU6dlksZm9ybWF0U3BlY2lmaWVyOmRZLHByZWNpc2lvbkZpeGVkOmZ1bmN0aW9uIHhmdCh0KXtyZXR1cm4gTWF0aC5tYXgoMCwtYVkoTWF0aC5hYnModCkpKX0scHJlY2lzaW9uUHJlZml4OmZ1bmN0aW9uIHdmdCh0LGUpe3JldHVybiBNYXRoLm1heCgwLDMqTWF0aC5tYXgoLTgsTWF0aC5taW4oOCxNYXRoLmZsb29yKGFZKGUpLzMpKSktYVkoTWF0aC5hYnModCkpKX0scHJlY2lzaW9uUm91bmQ6ZnVuY3Rpb24gU2Z0KHQsZSl7cmV0dXJuIHQ9TWF0aC5hYnModCksZT1NYXRoLmFicyhlKS10LE1hdGgubWF4KDAsYVkoZSktYVkodCkpKzF9LGdlb0FyZWE6ZnVuY3Rpb24gTWZ0KHQpe3JldHVybiBhWC5yZXNldCgpLFFZKHQsc1gpLDIqYVh9LGdlb0JvdW5kczpmdW5jdGlvbiBFZnQodCl7dmFyIGUsbixpLHIsbyxhLHM7aWYod1g9eFg9LSh2WD1iWD0xLzApLENYPVtdLFFZKHQscVgpLG49Q1gubGVuZ3RoKXtmb3IoQ1guc29ydChlJCksZT0xLG89W2k9Q1hbMF1dO2U8bjsrK2UpbiQoaSwocj1DWFtlXSlbMF0pfHxuJChpLHJbMV0pPyh0JChpWzBdLHJbMV0pPnQkKGlbMF0saVsxXSkmJihpWzFdPXJbMV0pLHQkKHJbMF0saVsxXSk+dCQoaVswXSxpWzFdKSYmKGlbMF09clswXSkpOm8ucHVzaChpPXIpO2ZvcihhPS0xLzAsZT0wLGk9b1tuPW8ubGVuZ3RoLTFdO2U8PW47aT1yLCsrZSkocz10JChpWzFdLChyPW9bZV0pWzBdKSk+YSYmKGE9cyx2WD1yWzBdLHhYPWlbMV0pfXJldHVybiBDWD1BWD1udWxsLHZYPT09MS8wfHxiWD09PTEvMD9bW05hTixOYU5dLFtOYU4sTmFOXV06W1t2WCxiWF0sW3hYLHdYXV19LGdlb0NlbnRyb2lkOmZ1bmN0aW9uIFRmdCh0KXtrWD1MWD1QWD1OWD1JWD1SWD1PWD16WD1EWD1CWD1IWD0wLFFZKHQsaSQpO3ZhciBlPURYLG49QlgsaT1IWCxyPWUqZStuKm4raSppO3JldHVybiByPDFlLTEyJiYoZT1SWCxuPU9YLGk9elgsTFg8RVkmJihlPVBYLG49TlgsaT1JWCksKHI9ZSplK24qbitpKmkpPDFlLTEyKT9bTmFOLE5hTl06W1JZKG4sZSkqTFksV1koaS9VWShyKSkqTFldfSxnZW9DaXJjbGU6ZnVuY3Rpb24gQ2Z0KCl7dmFyIHQsZSxuPWYkKFswLDBdKSxpPWYkKDkwKSxyPWYkKDYpLG89e3BvaW50OmZ1bmN0aW9uIGEobixpKXt0LnB1c2gobj1lKG4saSkpLG5bMF0qPUxZLG5bMV0qPUxZfX07ZnVuY3Rpb24gcygpe3ZhciBhPW4uYXBwbHkodGhpcyxhcmd1bWVudHMpLHM9aS5hcHBseSh0aGlzLGFyZ3VtZW50cykqUFksbD1yLmFwcGx5KHRoaXMsYXJndW1lbnRzKSpQWTtyZXR1cm4gdD1bXSxlPV8kKC1hWzBdKlBZLC1hWzFdKlBZLDApLmludmVydCx3JChvLHMsbCwxKSxhPXt0eXBlOiJQb2x5Z29uIixjb29yZGluYXRlczpbdF19LHQ9ZT1udWxsLGF9cmV0dXJuIHMuY2VudGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6ZiQoWyt0WzBdLCt0WzFdXSkscyk6bn0scy5yYWRpdXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpmJCgrdCkscyk6aX0scy5wcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpmJCgrdCkscyk6cn0sc30sZ2VvQ2xpcEFudGltZXJpZGlhbjpCJCxnZW9DbGlwQ2lyY2xlOlYkLGdlb0NsaXBFeHRlbnQ6ZnVuY3Rpb24gQWZ0KCl7dmFyIHQsZSxuLGk9MCxyPTAsbz05NjAsYT01MDA7cmV0dXJuIG49e3N0cmVhbTpmdW5jdGlvbihuKXtyZXR1cm4gdCYmZT09PW4/dDp0PUckKGkscixvLGEpKGU9bil9LGV4dGVudDpmdW5jdGlvbihzKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0rc1swXVswXSxyPStzWzBdWzFdLG89K3NbMV1bMF0sYT0rc1sxXVsxXSx0PWU9bnVsbCxuKTpbW2kscl0sW28sYV1dfX19LGdlb0NsaXBSZWN0YW5nbGU6RyQsZ2VvQ29udGFpbnM6ZnVuY3Rpb24ga2Z0KHQsZSl7cmV0dXJuKHQmJnJLLmhhc093blByb3BlcnR5KHQudHlwZSk/cktbdC50eXBlXTphSykodCxlKX0sZ2VvRGlzdGFuY2U6aUssZ2VvR3JhdGljdWxlOmZLLGdlb0dyYXRpY3VsZTEwOmZ1bmN0aW9uIExmdCgpe3JldHVybiBmSygpKCl9LGdlb0ludGVycG9sYXRlOmZ1bmN0aW9uIFBmdCh0LGUpe3ZhciBuPXRbMF0qUFksaT10WzFdKlBZLHI9ZVswXSpQWSxvPWVbMV0qUFksYT1PWShpKSxzPUZZKGkpLGw9T1kobyksYz1GWShvKSx1PWEqT1kobiksaD1hKkZZKG4pLGQ9bCpPWShyKSxwPWwqRlkociksZj0yKldZKFVZKHFZKG8taSkrYSpsKnFZKHItbikpKSxtPUZZKGYpLGc9Zj9mdW5jdGlvbih0KXt2YXIgZT1GWSh0Kj1mKS9tLG49RlkoZi10KS9tLGk9bip1K2UqZCxyPW4qaCtlKnAsbz1uKnMrZSpjO3JldHVybltSWShyLGkpKkxZLFJZKG8sVVkoaSppK3IqcikpKkxZXX06ZnVuY3Rpb24oKXtyZXR1cm5bbipMWSxpKkxZXX07cmV0dXJuIGcuZGlzdGFuY2U9ZixnfSxnZW9MZW5ndGg6dEssZ2VvUGF0aDpmdW5jdGlvbiBOZnQodCxlKXt2YXIgbixpLHI9NC41O2Z1bmN0aW9uIG8odCl7cmV0dXJuIHQmJigiZnVuY3Rpb24iPT10eXBlb2YgciYmaS5wb2ludFJhZGl1cygrci5hcHBseSh0aGlzLGFyZ3VtZW50cykpLFFZKHQsbihpKSkpLGkucmVzdWx0KCl9cmV0dXJuIG8uYXJlYT1mdW5jdGlvbih0KXtyZXR1cm4gUVkodCxuKHdLKSksd0sucmVzdWx0KCl9LG8ubWVhc3VyZT1mdW5jdGlvbih0KXtyZXR1cm4gUVkodCxuKGNaKSksY1oucmVzdWx0KCl9LG8uYm91bmRzPWZ1bmN0aW9uKHQpe3JldHVybiBRWSh0LG4oUEspKSxQSy5yZXN1bHQoKX0sby5jZW50cm9pZD1mdW5jdGlvbih0KXtyZXR1cm4gUVkodCxuKHFLKSkscUsucmVzdWx0KCl9LG8ucHJvamVjdGlvbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1udWxsPT1lPyh0PW51bGwsbUspOih0PWUpLnN0cmVhbSxvKTp0fSxvLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9bnVsbD09dD8oZT1udWxsLG5ldyBkWik6bmV3IG5aKGU9dCksImZ1bmN0aW9uIiE9dHlwZW9mIHImJmkucG9pbnRSYWRpdXMociksbyk6ZX0sby5wb2ludFJhZGl1cz1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0iZnVuY3Rpb24iPT10eXBlb2YgdD90OihpLnBvaW50UmFkaXVzKCt0KSwrdCksbyk6cn0sby5wcm9qZWN0aW9uKHQpLmNvbnRleHQoZSl9LGdlb0FsYmVyczprWixnZW9BbGJlcnNVc2E6ZnVuY3Rpb24gSWZ0KCl7dmFyIHQsZSxuLGkscixvLGE9a1ooKSxzPUFaKCkucm90YXRlKFsxNTQsMF0pLmNlbnRlcihbLTIsNTguNV0pLnBhcmFsbGVscyhbNTUsNjVdKSxsPUFaKCkucm90YXRlKFsxNTcsMF0pLmNlbnRlcihbLTMsMTkuOV0pLnBhcmFsbGVscyhbOCwxOF0pLGM9e3BvaW50OmZ1bmN0aW9uKHQsZSl7bz1bdCxlXX19O2Z1bmN0aW9uIHUodCl7dmFyIGU9dFswXSxhPXRbMV07cmV0dXJuIG89bnVsbCxuLnBvaW50KGUsYSksb3x8KGkucG9pbnQoZSxhKSxvKXx8KHIucG9pbnQoZSxhKSxvKX1mdW5jdGlvbiBoKCl7cmV0dXJuIHQ9ZT1udWxsLHV9cmV0dXJuIHUuaW52ZXJ0PWZ1bmN0aW9uKHQpe3ZhciBlPWEuc2NhbGUoKSxuPWEudHJhbnNsYXRlKCksaT0odFswXS1uWzBdKS9lLHI9KHRbMV0tblsxXSkvZTtyZXR1cm4ocj49LjEyJiZyPC4yMzQmJmk+PS0uNDI1JiZpPC0uMjE0P3M6cj49LjE2NiYmcjwuMjM0JiZpPj0tLjIxNCYmaTwtLjExNT9sOmEpLmludmVydCh0KX0sdS5zdHJlYW09ZnVuY3Rpb24obil7cmV0dXJuIHQmJmU9PT1uP3Q6dD0oZnVuY3Rpb24gaSh0KXt2YXIgZT10Lmxlbmd0aDtyZXR1cm57cG9pbnQ6ZnVuY3Rpb24obixpKXtmb3IodmFyIHI9LTE7KytyPGU7KXRbcl0ucG9pbnQobixpKX0sc3BoZXJlOmZ1bmN0aW9uKCl7Zm9yKHZhciBuPS0xOysrbjxlOyl0W25dLnNwaGVyZSgpfSxsaW5lU3RhcnQ6ZnVuY3Rpb24oKXtmb3IodmFyIG49LTE7KytuPGU7KXRbbl0ubGluZVN0YXJ0KCl9LGxpbmVFbmQ6ZnVuY3Rpb24oKXtmb3IodmFyIG49LTE7KytuPGU7KXRbbl0ubGluZUVuZCgpfSxwb2x5Z29uU3RhcnQ6ZnVuY3Rpb24oKXtmb3IodmFyIG49LTE7KytuPGU7KXRbbl0ucG9seWdvblN0YXJ0KCl9LHBvbHlnb25FbmQ6ZnVuY3Rpb24oKXtmb3IodmFyIG49LTE7KytuPGU7KXRbbl0ucG9seWdvbkVuZCgpfX19KShbYS5zdHJlYW0oZT1uKSxzLnN0cmVhbShuKSxsLnN0cmVhbShuKV0pfSx1LnByZWNpc2lvbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oYS5wcmVjaXNpb24odCkscy5wcmVjaXNpb24odCksbC5wcmVjaXNpb24odCksaCgpKTphLnByZWNpc2lvbigpfSx1LnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhLnNjYWxlKHQpLHMuc2NhbGUoLjM1KnQpLGwuc2NhbGUodCksdS50cmFuc2xhdGUoYS50cmFuc2xhdGUoKSkpOmEuc2NhbGUoKX0sdS50cmFuc2xhdGU9ZnVuY3Rpb24odCl7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIGEudHJhbnNsYXRlKCk7dmFyIGU9YS5zY2FsZSgpLG89K3RbMF0sdT0rdFsxXTtyZXR1cm4gbj1hLnRyYW5zbGF0ZSh0KS5jbGlwRXh0ZW50KFtbby0uNDU1KmUsdS0uMjM4KmVdLFtvKy40NTUqZSx1Ky4yMzgqZV1dKS5zdHJlYW0oYyksaT1zLnRyYW5zbGF0ZShbby0uMzA3KmUsdSsuMjAxKmVdKS5jbGlwRXh0ZW50KFtbby0uNDI1KmUrRVksdSsuMTIqZStFWV0sW28tLjIxNCplLUVZLHUrLjIzNCplLUVZXV0pLnN0cmVhbShjKSxyPWwudHJhbnNsYXRlKFtvLS4yMDUqZSx1Ky4yMTIqZV0pLmNsaXBFeHRlbnQoW1tvLS4yMTQqZStFWSx1Ky4xNjYqZStFWV0sW28tLjExNSplLUVZLHUrLjIzNCplLUVZXV0pLnN0cmVhbShjKSxoKCl9LHUuZml0RXh0ZW50PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIF9aKHUsdCxlKX0sdS5maXRTaXplPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHlaKHUsdCxlKX0sdS5maXRXaWR0aD1mdW5jdGlvbih0LGUpe3JldHVybiB2Wih1LHQsZSl9LHUuZml0SGVpZ2h0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGJaKHUsdCxlKX0sdS5zY2FsZSgxMDcwKX0sZ2VvQXppbXV0aGFsRXF1YWxBcmVhOmZ1bmN0aW9uIFJmdCgpe3JldHVybiBNWihOWikuc2NhbGUoMTI0Ljc1KS5jbGlwQW5nbGUoMTc5Ljk5OSl9LGdlb0F6aW11dGhhbEVxdWFsQXJlYVJhdzpOWixnZW9BemltdXRoYWxFcXVpZGlzdGFudDpmdW5jdGlvbiBPZnQoKXtyZXR1cm4gTVooSVopLnNjYWxlKDc5LjQxODgpLmNsaXBBbmdsZSgxNzkuOTk5KX0sZ2VvQXppbXV0aGFsRXF1aWRpc3RhbnRSYXc6SVosZ2VvQ29uaWNDb25mb3JtYWw6ZnVuY3Rpb24gemZ0KCl7cmV0dXJuIFRaKERaKS5zY2FsZSgxMDkuNSkucGFyYWxsZWxzKFszMCwzMF0pfSxnZW9Db25pY0NvbmZvcm1hbFJhdzpEWixnZW9Db25pY0VxdWFsQXJlYTpBWixnZW9Db25pY0VxdWFsQXJlYVJhdzpDWixnZW9Db25pY0VxdWlkaXN0YW50OmZ1bmN0aW9uIERmdCgpe3JldHVybiBUWihIWikuc2NhbGUoMTMxLjE1NCkuY2VudGVyKFswLDEzLjkzODldKX0sZ2VvQ29uaWNFcXVpZGlzdGFudFJhdzpIWixnZW9FcXVpcmVjdGFuZ3VsYXI6ZnVuY3Rpb24gQmZ0KCl7cmV0dXJuIE1aKEJaKS5zY2FsZSgxNTIuNjMpfSxnZW9FcXVpcmVjdGFuZ3VsYXJSYXc6QlosZ2VvR25vbW9uaWM6ZnVuY3Rpb24gSGZ0KCl7cmV0dXJuIE1aKEZaKS5zY2FsZSgxNDQuMDQ5KS5jbGlwQW5nbGUoNjApfSxnZW9Hbm9tb25pY1JhdzpGWixnZW9JZGVudGl0eTpmdW5jdGlvbiBGZnQoKXt2YXIgdCxlLG4saSxyLG8sYT0xLHM9MCxsPTAsYz0xLHU9MSxoPW1LLGQ9bnVsbCxwPW1LO2Z1bmN0aW9uIGYoKXtyZXR1cm4gaT1yPW51bGwsb31yZXR1cm4gbz17c3RyZWFtOmZ1bmN0aW9uKHQpe3JldHVybiBpJiZyPT09dD9pOmk9aChwKHI9dCkpfSxwb3N0Y2xpcDpmdW5jdGlvbihpKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocD1pLGQ9dD1lPW49bnVsbCxmKCkpOnB9LGNsaXBFeHRlbnQ6ZnVuY3Rpb24oaSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHA9bnVsbD09aT8oZD10PWU9bj1udWxsLG1LKTpHJChkPStpWzBdWzBdLHQ9K2lbMF1bMV0sZT0raVsxXVswXSxuPStpWzFdWzFdKSxmKCkpOm51bGw9PWQ/bnVsbDpbW2QsdF0sW2Usbl1dfSxzY2FsZTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD1WWigoYT0rdCkqYyxhKnUscyxsKSxmKCkpOmF9LHRyYW5zbGF0ZTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD1WWihhKmMsYSp1LHM9K3RbMF0sbD0rdFsxXSksZigpKTpbcyxsXX0scmVmbGVjdFg6ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGg9VlooYSooYz10Py0xOjEpLGEqdSxzLGwpLGYoKSk6YzwwfSxyZWZsZWN0WTpmdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaD1WWihhKmMsYSoodT10Py0xOjEpLHMsbCksZigpKTp1PDB9LGZpdEV4dGVudDpmdW5jdGlvbih0LGUpe3JldHVybiBfWihvLHQsZSl9LGZpdFNpemU6ZnVuY3Rpb24odCxlKXtyZXR1cm4geVoobyx0LGUpfSxmaXRXaWR0aDpmdW5jdGlvbih0LGUpe3JldHVybiB2WihvLHQsZSl9LGZpdEhlaWdodDpmdW5jdGlvbih0LGUpe3JldHVybiBiWihvLHQsZSl9fX0sZ2VvUHJvamVjdGlvbjpNWixnZW9Qcm9qZWN0aW9uTXV0YXRvcjpFWixnZW9NZXJjYXRvcjpmdW5jdGlvbiBWZnQoKXtyZXR1cm4gT1ooUlopLnNjYWxlKDk2MS9rWSl9LGdlb01lcmNhdG9yUmF3OlJaLGdlb05hdHVyYWxFYXJ0aDE6ZnVuY3Rpb24gVWZ0KCl7cmV0dXJuIE1aKFVaKS5zY2FsZSgxNzUuMjk1KX0sZ2VvTmF0dXJhbEVhcnRoMVJhdzpVWixnZW9PcnRob2dyYXBoaWM6ZnVuY3Rpb24gamZ0KCl7cmV0dXJuIE1aKGpaKS5zY2FsZSgyNDkuNSkuY2xpcEFuZ2xlKDkwLjAwMDAwMSl9LGdlb09ydGhvZ3JhcGhpY1JhdzpqWixnZW9TdGVyZW9ncmFwaGljOmZ1bmN0aW9uIEdmdCgpe3JldHVybiBNWihHWikuc2NhbGUoMjUwKS5jbGlwQW5nbGUoMTQyKX0sZ2VvU3RlcmVvZ3JhcGhpY1JhdzpHWixnZW9UcmFuc3ZlcnNlTWVyY2F0b3I6ZnVuY3Rpb24gV2Z0KCl7dmFyIHQ9T1ooV1opLGU9dC5jZW50ZXIsbj10LnJvdGF0ZTtyZXR1cm4gdC5jZW50ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/ZShbLXRbMV0sdFswXV0pOlsodD1lKCkpWzFdLC10WzBdXX0sdC5yb3RhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/bihbdFswXSx0WzFdLHQubGVuZ3RoPjI/dFsyXSs5MDo5MF0pOlsodD1uKCkpWzBdLHRbMV0sdFsyXS05MF19LG4oWzAsMCw5MF0pLnNjYWxlKDE1OS4xNTUpfSxnZW9UcmFuc3ZlcnNlTWVyY2F0b3JSYXc6V1osZ2VvUm90YXRpb246eCQsZ2VvU3RyZWFtOlFZLGdlb1RyYW5zZm9ybTpmdW5jdGlvbiBxZnQodCl7cmV0dXJue3N0cmVhbTpmWih0KX19LGNsdXN0ZXI6ZnVuY3Rpb24gWWZ0KCl7dmFyIHQ9cVosZT0xLG49MSxpPSExO2Z1bmN0aW9uIHIocil7dmFyIG8sYT0wO3IuZWFjaEFmdGVyKChmdW5jdGlvbihlKXt2YXIgbj1lLmNoaWxkcmVuO24/KGUueD0oZnVuY3Rpb24gaSh0KXtyZXR1cm4gdC5yZWR1Y2UoWVosMCkvdC5sZW5ndGh9KShuKSxlLnk9KGZ1bmN0aW9uIHIodCl7cmV0dXJuIDErdC5yZWR1Y2UoWFosMCl9KShuKSk6KGUueD1vP2ErPXQoZSxvKTowLGUueT0wLG89ZSl9KSk7dmFyIHM9KGZ1bmN0aW9uIGwodCl7Zm9yKHZhciBlO2U9dC5jaGlsZHJlbjspdD1lWzBdO3JldHVybiB0fSkociksYz0oZnVuY3Rpb24gdSh0KXtmb3IodmFyIGU7ZT10LmNoaWxkcmVuOyl0PWVbZS5sZW5ndGgtMV07cmV0dXJuIHR9KShyKSxoPXMueC10KHMsYykvMixkPWMueCt0KGMscykvMjtyZXR1cm4gci5lYWNoQWZ0ZXIoaT9mdW5jdGlvbih0KXt0Lng9KHQueC1yLngpKmUsdC55PShyLnktdC55KSpufTpmdW5jdGlvbih0KXt0Lng9KHQueC1oKS8oZC1oKSplLHQueT0oMS0oci55P3QueS9yLnk6MSkpKm59KX1yZXR1cm4gci5zZXBhcmF0aW9uPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PWUscik6dH0sci5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSExLGU9K3RbMF0sbj0rdFsxXSxyKTppP251bGw6W2Usbl19LHIubm9kZVNpemU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ITAsZT0rdFswXSxuPSt0WzFdLHIpOmk/W2Usbl06bnVsbH0scn0saGllcmFyY2h5OktaLHBhY2s6ZnVuY3Rpb24gWGZ0KCl7dmFyIHQ9bnVsbCxlPTEsbj0xLGk9a0o7ZnVuY3Rpb24gcihyKXtyZXR1cm4gci54PWUvMixyLnk9bi8yLHQ/ci5lYWNoQmVmb3JlKE5KKHQpKS5lYWNoQWZ0ZXIoSUooaSwuNSkpLmVhY2hCZWZvcmUoUkooMSkpOnIuZWFjaEJlZm9yZShOSihQSikpLmVhY2hBZnRlcihJSihrSiwxKSkuZWFjaEFmdGVyKElKKGksci5yL01hdGgubWluKGUsbikpKS5lYWNoQmVmb3JlKFJKKE1hdGgubWluKGUsbikvKDIqci5yKSkpLHJ9cmV0dXJuIHIucmFkaXVzPWZ1bmN0aW9uKGUpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyh0PUNKKGUpLHIpOnR9LHIuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0rdFswXSxuPSt0WzFdLHIpOltlLG5dfSxyLnBhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpMSigrdCkscik6aX0scn0scGFja1NpYmxpbmdzOmZ1bmN0aW9uICRmdCh0KXtyZXR1cm4gVEoodCksdH0scGFja0VuY2xvc2U6ZkoscGFydGl0aW9uOmZ1bmN0aW9uIEtmdCgpe3ZhciB0PTEsZT0xLG49MCxpPSExO2Z1bmN0aW9uIHIocil7dmFyIG89ci5oZWlnaHQrMTtyZXR1cm4gci54MD1yLnkwPW4sci54MT10LHIueTE9ZS9vLHIuZWFjaEJlZm9yZSgoZnVuY3Rpb24gYSh0LGUpe3JldHVybiBmdW5jdGlvbihpKXtpLmNoaWxkcmVuJiZ6SihpLGkueDAsdCooaS5kZXB0aCsxKS9lLGkueDEsdCooaS5kZXB0aCsyKS9lKTt2YXIgcj1pLngwLG89aS55MCxhPWkueDEtbixzPWkueTEtbjthPHImJihyPWE9KHIrYSkvMiksczxvJiYobz1zPShvK3MpLzIpLGkueDA9cixpLnkwPW8saS54MT1hLGkueTE9c319KShlLG8pKSxpJiZyLmVhY2hCZWZvcmUoT0opLHJ9cmV0dXJuIHIucm91bmQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ISF0LHIpOml9LHIuc2l6ZT1mdW5jdGlvbihuKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0rblswXSxlPStuWzFdLHIpOlt0LGVdfSxyLnBhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K3Qscik6bn0scn0sc3RyYXRpZnk6ZnVuY3Rpb24gWmZ0KCl7dmFyIHQ9SEosZT1GSjtmdW5jdGlvbiBuKG4pe3ZhciBpLHIsbyxhLHMsbCxjLHU9bi5sZW5ndGgsaD1uZXcgQXJyYXkodSksZD17fTtmb3Iocj0wO3I8dTsrK3Ipcz1oW3JdPW5ldyB0SihpPW5bcl0pLG51bGwhPShsPXQoaSxyLG4pKSYmKGwrPSIiKSYmKGRbYz0iJCIrKHMuaWQ9bCldPWMgaW4gZD9CSjpzKTtmb3Iocj0wO3I8dTsrK3IpaWYocz1oW3JdLG51bGwhPShsPWUobltyXSxyLG4pKSYmKGwrPSIiKSl7aWYoIShhPWRbIiQiK2xdKSl0aHJvdyBuZXcgRXJyb3IoIm1pc3Npbmc6ICIrbCk7aWYoYT09PUJKKXRocm93IG5ldyBFcnJvcigiYW1iaWd1b3VzOiAiK2wpO2EuY2hpbGRyZW4/YS5jaGlsZHJlbi5wdXNoKHMpOmEuY2hpbGRyZW49W3NdLHMucGFyZW50PWF9ZWxzZXtpZihvKXRocm93IG5ldyBFcnJvcigibXVsdGlwbGUgcm9vdHMiKTtvPXN9aWYoIW8pdGhyb3cgbmV3IEVycm9yKCJubyByb290Iik7aWYoby5wYXJlbnQ9REosby5lYWNoQmVmb3JlKChmdW5jdGlvbih0KXt0LmRlcHRoPXQucGFyZW50LmRlcHRoKzEsLS11fSkpLmVhY2hCZWZvcmUoUVopLG8ucGFyZW50PW51bGwsdT4wKXRocm93IG5ldyBFcnJvcigiY3ljbGUiKTtyZXR1cm4gb31yZXR1cm4gbi5pZD1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1BSihlKSxuKTp0fSxuLnBhcmVudElkPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPUFKKHQpLG4pOmV9LG59LHRyZWU6ZnVuY3Rpb24gSmZ0KCl7dmFyIHQ9VkosZT0xLG49MSxpPW51bGw7ZnVuY3Rpb24gcihyKXt2YXIgbD0oZnVuY3Rpb24gYyh0KXtmb3IodmFyIGUsbixpLHIsbyxhPW5ldyBxSih0LDApLHM9W2FdO2U9cy5wb3AoKTspaWYoaT1lLl8uY2hpbGRyZW4pZm9yKGUuY2hpbGRyZW49bmV3IEFycmF5KG89aS5sZW5ndGgpLHI9by0xO3I+PTA7LS1yKXMucHVzaChuPWUuY2hpbGRyZW5bcl09bmV3IHFKKGlbcl0scikpLG4ucGFyZW50PWU7cmV0dXJuKGEucGFyZW50PW5ldyBxSihudWxsLDApKS5jaGlsZHJlbj1bYV0sYX0pKHIpO2lmKGwuZWFjaEFmdGVyKG8pLGwucGFyZW50Lm09LWwueixsLmVhY2hCZWZvcmUoYSksaSlyLmVhY2hCZWZvcmUocyk7ZWxzZXt2YXIgdT1yLGg9cixkPXI7ci5lYWNoQmVmb3JlKChmdW5jdGlvbih0KXt0Lng8dS54JiYodT10KSx0Lng+aC54JiYoaD10KSx0LmRlcHRoPmQuZGVwdGgmJihkPXQpfSkpO3ZhciBwPXU9PT1oPzE6dCh1LGgpLzIsZj1wLXUueCxtPWUvKGgueCtwK2YpLGc9bi8oZC5kZXB0aHx8MSk7ci5lYWNoQmVmb3JlKChmdW5jdGlvbih0KXt0Lng9KHQueCtmKSptLHQueT10LmRlcHRoKmd9KSl9cmV0dXJuIHJ9ZnVuY3Rpb24gbyhlKXt2YXIgbj1lLmNoaWxkcmVuLGk9ZS5wYXJlbnQuY2hpbGRyZW4scj1lLmk/aVtlLmktMV06bnVsbDtpZihuKXshKGZ1bmN0aW9uIG8odCl7Zm9yKHZhciBlLG49MCxpPTAscj10LmNoaWxkcmVuLG89ci5sZW5ndGg7LS1vPj0wOykoZT1yW29dKS56Kz1uLGUubSs9bixuKz1lLnMrKGkrPWUuYyl9KShlKTt2YXIgYT0oblswXS56K25bbi5sZW5ndGgtMV0ueikvMjtyPyhlLno9ci56K3QoZS5fLHIuXyksZS5tPWUuei1hKTplLno9YX1lbHNlIHImJihlLno9ci56K3QoZS5fLHIuXykpO2UucGFyZW50LkE9KGZ1bmN0aW9uIHMoZSxuLGkpe2lmKG4pe2Zvcih2YXIgcixvPWUsYT1lLHM9bixsPW8ucGFyZW50LmNoaWxkcmVuWzBdLGM9by5tLHU9YS5tLGg9cy5tLGQ9bC5tO3M9akoocyksbz1VSihvKSxzJiZvOylsPVVKKGwpLChhPWpKKGEpKS5hPWUsKHI9cy56K2gtby56LWMrdChzLl8sby5fKSk+MCYmKEdKKFdKKHMsZSxpKSxlLHIpLGMrPXIsdSs9ciksaCs9cy5tLGMrPW8ubSxkKz1sLm0sdSs9YS5tO3MmJiFqSihhKSYmKGEudD1zLGEubSs9aC11KSxvJiYhVUoobCkmJihsLnQ9byxsLm0rPWMtZCxpPWUpfXJldHVybiBpfSkoZSxyLGUucGFyZW50LkF8fGlbMF0pfWZ1bmN0aW9uIGEodCl7dC5fLng9dC56K3QucGFyZW50Lm0sdC5tKz10LnBhcmVudC5tfWZ1bmN0aW9uIHModCl7dC54Kj1lLHQueT10LmRlcHRoKm59cmV0dXJuIHIuc2VwYXJhdGlvbj1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1lLHIpOnR9LHIuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0hMSxlPSt0WzBdLG49K3RbMV0scik6aT9udWxsOltlLG5dfSxyLm5vZGVTaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSEwLGU9K3RbMF0sbj0rdFsxXSxyKTppP1tlLG5dOm51bGx9LHJ9LHRyZWVtYXA6ZnVuY3Rpb24gUWZ0KCl7dmFyIHQ9S0osZT0hMSxuPTEsaT0xLHI9WzBdLG89a0osYT1rSixzPWtKLGw9a0osYz1rSjtmdW5jdGlvbiB1KHQpe3JldHVybiB0LngwPXQueTA9MCx0LngxPW4sdC55MT1pLHQuZWFjaEJlZm9yZShoKSxyPVswXSxlJiZ0LmVhY2hCZWZvcmUoT0opLHR9ZnVuY3Rpb24gaChlKXt2YXIgbj1yW2UuZGVwdGhdLGk9ZS54MCtuLHU9ZS55MCtuLGg9ZS54MS1uLGQ9ZS55MS1uO2g8aSYmKGk9aD0oaStoKS8yKSxkPHUmJih1PWQ9KHUrZCkvMiksZS54MD1pLGUueTA9dSxlLngxPWgsZS55MT1kLGUuY2hpbGRyZW4mJihuPXJbZS5kZXB0aCsxXT1vKGUpLzIsaSs9YyhlKS1uLHUrPWEoZSktbiwoaC09cyhlKS1uKTxpJiYoaT1oPShpK2gpLzIpLChkLT1sKGUpLW4pPHUmJih1PWQ9KHUrZCkvMiksdChlLGksdSxoLGQpKX1yZXR1cm4gdS5yb3VuZD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0hIXQsdSk6ZX0sdS5zaXplPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSt0WzBdLGk9K3RbMV0sdSk6W24saV19LHUudGlsZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD1BSihlKSx1KTp0fSx1LnBhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/dS5wYWRkaW5nSW5uZXIodCkucGFkZGluZ091dGVyKHQpOnUucGFkZGluZ0lubmVyKCl9LHUucGFkZGluZ0lubmVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhvPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6TEooK3QpLHUpOm99LHUucGFkZGluZ091dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoP3UucGFkZGluZ1RvcCh0KS5wYWRkaW5nUmlnaHQodCkucGFkZGluZ0JvdHRvbSh0KS5wYWRkaW5nTGVmdCh0KTp1LnBhZGRpbmdUb3AoKX0sdS5wYWRkaW5nVG9wPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6TEooK3QpLHUpOmF9LHUucGFkZGluZ1JpZ2h0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhzPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6TEooK3QpLHUpOnN9LHUucGFkZGluZ0JvdHRvbT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obD0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkxKKCt0KSx1KTpsfSx1LnBhZGRpbmdMZWZ0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhjPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6TEooK3QpLHUpOmN9LHV9LHRyZWVtYXBCaW5hcnk6ZnVuY3Rpb24gdG10KHQsZSxuLGkscil7dmFyIG8sYSxzPXQuY2hpbGRyZW4sbD1zLmxlbmd0aCxjPW5ldyBBcnJheShsKzEpO2ZvcihjWzBdPWE9bz0wO288bDsrK28pY1tvKzFdPWErPXNbb10udmFsdWU7IShmdW5jdGlvbiB0KGUsbixpLHIsbyxhLGwpe2lmKGU+PW4tMSl7dmFyIHU9c1tlXTtyZXR1cm4gdS54MD1yLHUueTA9byx1LngxPWEsdm9pZCh1LnkxPWwpfXZhciBoPWNbZV0sZD1pLzIraCxwPWUrMSxmPW4tMTtmb3IoO3A8Zjspe3ZhciBtPXArZj4+PjE7Y1ttXTxkP3A9bSsxOmY9bX1kLWNbcC0xXTxjW3BdLWQmJmUrMTxwJiYtLXA7dmFyIGc9Y1twXS1oLF89aS1nO2lmKGEtcj5sLW8pe3ZhciB5PShyKl8rYSpnKS9pO3QoZSxwLGcscixvLHksbCksdChwLG4sXyx5LG8sYSxsKX1lbHNle3ZhciB2PShvKl8rbCpnKS9pO3QoZSxwLGcscixvLGEsdiksdChwLG4sXyxyLHYsYSxsKX19KSgwLGwsdC52YWx1ZSxlLG4saSxyKX0sdHJlZW1hcERpY2U6ekosdHJlZW1hcFNsaWNlOllKLHRyZWVtYXBTbGljZURpY2U6ZnVuY3Rpb24gZW10KHQsZSxuLGkscil7KDEmdC5kZXB0aD9ZSjp6SikodCxlLG4saSxyKX0sdHJlZW1hcFNxdWFyaWZ5OktKLHRyZWVtYXBSZXNxdWFyaWZ5OlpKLGludGVycG9sYXRlOkUxLGludGVycG9sYXRlQXJyYXk6eTEsaW50ZXJwb2xhdGVCYXNpczpzMSxpbnRlcnBvbGF0ZUJhc2lzQ2xvc2VkOmwxLGludGVycG9sYXRlRGF0ZTp2MSxpbnRlcnBvbGF0ZU51bWJlcjpiMSxpbnRlcnBvbGF0ZU9iamVjdDp4MSxpbnRlcnBvbGF0ZVJvdW5kOmZ1bmN0aW9uIG5tdCh0LGUpe3JldHVybiBlLT10PSt0LGZ1bmN0aW9uKG4pe3JldHVybiBNYXRoLnJvdW5kKHQrZSpuKX19LGludGVycG9sYXRlU3RyaW5nOk0xLGludGVycG9sYXRlVHJhbnNmb3JtQ3NzOlIxLGludGVycG9sYXRlVHJhbnNmb3JtU3ZnOnoxLGludGVycG9sYXRlWm9vbTpmdW5jdGlvbiBpbXQodCxlKXt2YXIgbixpLHI9dFswXSxvPXRbMV0sYT10WzJdLHM9ZVsyXSxsPWVbMF0tcixjPWVbMV0tbyx1PWwqbCtjKmM7aWYodTwxZS0xMilpPU1hdGgubG9nKHMvYSkvQjEsbj1mdW5jdGlvbih0KXtyZXR1cm5bcit0Kmwsbyt0KmMsYSpNYXRoLmV4cChCMSp0KmkpXX07ZWxzZXt2YXIgaD1NYXRoLnNxcnQodSksZD0ocypzLWEqYSs0KnUpLygyKmEqMipoKSxwPShzKnMtYSphLTQqdSkvKDIqcyoyKmgpLGY9TWF0aC5sb2coTWF0aC5zcXJ0KGQqZCsxKS1kKSxtPU1hdGgubG9nKE1hdGguc3FydChwKnArMSktcCk7aT0obS1mKS9CMSxuPWZ1bmN0aW9uKHQpe3ZhciBlPXQqaSxuPUgxKGYpLHM9YS8oMipoKSoobiooZnVuY3Rpb24gdSh0KXtyZXR1cm4oKHQ9TWF0aC5leHAoMip0KSktMSkvKHQrMSl9KShCMSplK2YpLShmdW5jdGlvbiBkKHQpe3JldHVybigodD1NYXRoLmV4cCh0KSktMS90KS8yfSkoZikpO3JldHVybltyK3MqbCxvK3MqYyxhKm4vSDEoQjEqZStmKV19fXJldHVybiBuLmR1cmF0aW9uPTFlMyppLG59LGludGVycG9sYXRlUmdiOmYxLGludGVycG9sYXRlUmdiQmFzaXM6ZzEsaW50ZXJwb2xhdGVSZ2JCYXNpc0Nsb3NlZDpfMSxpbnRlcnBvbGF0ZUhzbDpWMSxpbnRlcnBvbGF0ZUhzbExvbmc6VTEsaW50ZXJwb2xhdGVMYWI6ZnVuY3Rpb24gcm10KHQsZSl7dmFyIG49cDEoKHQ9SFEodCkpLmwsKGU9SFEoZSkpLmwpLGk9cDEodC5hLGUuYSkscj1wMSh0LmIsZS5iKSxvPXAxKHQub3BhY2l0eSxlLm9wYWNpdHkpO3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gdC5sPW4oZSksdC5hPWkoZSksdC5iPXIoZSksdC5vcGFjaXR5PW8oZSksdCsiIn19LGludGVycG9sYXRlSGNsOkcxLGludGVycG9sYXRlSGNsTG9uZzpXMSxpbnRlcnBvbGF0ZUN1YmVoZWxpeDpZMSxpbnRlcnBvbGF0ZUN1YmVoZWxpeExvbmc6WDEscXVhbnRpemU6ZnVuY3Rpb24gb210KHQsZSl7Zm9yKHZhciBuPW5ldyBBcnJheShlKSxpPTA7aTxlOysraSluW2ldPXQoaS8oZS0xKSk7cmV0dXJuIG59LHBhdGg6dDAscG9seWdvbkFyZWE6ZnVuY3Rpb24gYW10KHQpe2Zvcih2YXIgZSxuPS0xLGk9dC5sZW5ndGgscj10W2ktMV0sbz0wOysrbjxpOylvKz0oZT1yKVsxXSoocj10W25dKVswXS1lWzBdKnJbMV07cmV0dXJuIG8vMn0scG9seWdvbkNlbnRyb2lkOmZ1bmN0aW9uIHNtdCh0KXtmb3IodmFyIGUsbixpPS0xLHI9dC5sZW5ndGgsbz0wLGE9MCxzPXRbci0xXSxsPTA7KytpPHI7KWwrPW49KGU9cylbMF0qKHM9dFtpXSlbMV0tc1swXSplWzFdLG8rPShlWzBdK3NbMF0pKm4sYSs9KGVbMV0rc1sxXSkqbjtyZXR1cm5bby8obCo9MyksYS9sXX0scG9seWdvbkh1bGw6ZnVuY3Rpb24gbG10KHQpe2lmKChuPXQubGVuZ3RoKTwzKXJldHVybiBudWxsO3ZhciBlLG4saT1uZXcgQXJyYXkobikscj1uZXcgQXJyYXkobik7Zm9yKGU9MDtlPG47KytlKWlbZV09Wyt0W2VdWzBdLCt0W2VdWzFdLGVdO2ZvcihpLnNvcnQobjApLGU9MDtlPG47KytlKXJbZV09W2lbZV1bMF0sLWlbZV1bMV1dO3ZhciBvPWkwKGkpLGE9aTAocikscz1hWzBdPT09b1swXSxsPWFbYS5sZW5ndGgtMV09PT1vW28ubGVuZ3RoLTFdLGM9W107Zm9yKGU9by5sZW5ndGgtMTtlPj0wOy0tZSljLnB1c2godFtpW29bZV1dWzJdXSk7Zm9yKGU9K3M7ZTxhLmxlbmd0aC1sOysrZSljLnB1c2godFtpW2FbZV1dWzJdXSk7cmV0dXJuIGN9LHBvbHlnb25Db250YWluczpmdW5jdGlvbiBjbXQodCxlKXtmb3IodmFyIG4saSxyPXQubGVuZ3RoLG89dFtyLTFdLGE9ZVswXSxzPWVbMV0sbD1vWzBdLGM9b1sxXSx1PSExLGg9MDtoPHI7KytoKW49KG89dFtoXSlbMF0sKGk9b1sxXSk+cyE9Yz5zJiZhPChsLW4pKihzLWkpLyhjLWkpK24mJih1PSF1KSxsPW4sYz1pO3JldHVybiB1fSxwb2x5Z29uTGVuZ3RoOmZ1bmN0aW9uIHVtdCh0KXtmb3IodmFyIGUsbixpPS0xLHI9dC5sZW5ndGgsbz10W3ItMV0sYT1vWzBdLHM9b1sxXSxsPTA7KytpPHI7KWU9YSxuPXMsZS09YT0obz10W2ldKVswXSxuLT1zPW9bMV0sbCs9TWF0aC5zcXJ0KGUqZStuKm4pO3JldHVybiBsfSxxdWFkdHJlZTpsMCxxdWV1ZTpJMCxyYW5kb21Vbmlmb3JtOk8wLHJhbmRvbU5vcm1hbDp6MCxyYW5kb21Mb2dOb3JtYWw6RDAscmFuZG9tQmF0ZXM6SDAscmFuZG9tSXJ3aW5IYWxsOkIwLHJhbmRvbUV4cG9uZW50aWFsOkYwLHJlcXVlc3Q6VjAsaHRtbDpqMCxqc29uOkcwLHRleHQ6VzAseG1sOnEwLGNzdjokMCx0c3Y6SzAsc2NhbGVCYW5kOnkyLHNjYWxlUG9pbnQ6ZnVuY3Rpb24gaG10KCl7cmV0dXJuIHYyKHkyKCkucGFkZGluZ0lubmVyKDEpKX0sc2NhbGVJZGVudGl0eTpmdW5jdGlvbiB0KCl7dmFyIGU9WzAsMV07ZnVuY3Rpb24gbih0KXtyZXR1cm4rdH1yZXR1cm4gbi5pbnZlcnQ9bixuLmRvbWFpbj1uLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPWYyLmNhbGwodCxQNSksbik6ZS5zbGljZSgpfSxuLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdCgpLmRvbWFpbihlKX0sbjMobil9LHNjYWxlTGluZWFyOmZ1bmN0aW9uIHQoKXt2YXIgZT1ENShJNSxiNSk7cmV0dXJuIGUuY29weT1mdW5jdGlvbigpe3JldHVybiB6NShlLHQoKSl9LG4zKGUpfSxzY2FsZUxvZzpmdW5jdGlvbiB0KCl7dmFyIGU9RDUocjMsbzMpLmRvbWFpbihbMSwxMF0pLG49ZS5kb21haW4saT0xMCxyPWwzKDEwKSxvPXMzKDEwKTtmdW5jdGlvbiBhKCl7cmV0dXJuIHI9bDMoaSksbz1zMyhpKSxuKClbMF08MCYmKHI9YzMociksbz1jMyhvKSksZX1yZXR1cm4gZS5iYXNlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPSt0LGEoKSk6aX0sZS5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG4odCksYSgpKTpuKCl9LGUudGlja3M9ZnVuY3Rpb24odCl7dmFyIGUsYT1uKCkscz1hWzBdLGw9YVthLmxlbmd0aC0xXTsoZT1sPHMpJiYoZD1zLHM9bCxsPWQpO3ZhciBjLHUsaCxkPXIocykscD1yKGwpLGY9bnVsbD09dD8xMDordCxtPVtdO2lmKCEoaSUxKSYmcC1kPGYpe2lmKGQ9TWF0aC5yb3VuZChkKS0xLHA9TWF0aC5yb3VuZChwKSsxLHM+MCl7Zm9yKDtkPHA7KytkKWZvcih1PTEsYz1vKGQpO3U8aTsrK3UpaWYoISgoaD1jKnUpPHMpKXtpZihoPmwpYnJlYWs7bS5wdXNoKGgpfX1lbHNlIGZvcig7ZDxwOysrZClmb3IodT1pLTEsYz1vKGQpO3U+PTE7LS11KWlmKCEoKGg9Yyp1KTxzKSl7aWYoaD5sKWJyZWFrO20ucHVzaChoKX19ZWxzZSBtPXIyKGQscCxNYXRoLm1pbihwLWQsZikpLm1hcChvKTtyZXR1cm4gZT9tLnJldmVyc2UoKTptfSxlLnRpY2tGb3JtYXQ9ZnVuY3Rpb24odCxuKXtpZihudWxsPT1uJiYobj0xMD09PWk/Ii4wZSI6IiwiKSwiZnVuY3Rpb24iIT10eXBlb2YgbiYmKG49SzUobikpLHQ9PT0xLzApcmV0dXJuIG47bnVsbD09dCYmKHQ9MTApO3ZhciBhPU1hdGgubWF4KDEsaSp0L2UudGlja3MoKS5sZW5ndGgpO3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT10L28oTWF0aC5yb3VuZChyKHQpKSk7cmV0dXJuIGUqaTxpLS41JiYoZSo9aSksZTw9YT9uKHQpOiIifX0sZS5uaWNlPWZ1bmN0aW9uKCl7cmV0dXJuIG4oaTMobigpLHtmbG9vcjpmdW5jdGlvbih0KXtyZXR1cm4gbyhNYXRoLmZsb29yKHIodCkpKX0sY2VpbDpmdW5jdGlvbih0KXtyZXR1cm4gbyhNYXRoLmNlaWwocih0KSkpfX0pKX0sZS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHo1KGUsdCgpLmJhc2UoaSkpfSxlfSxzY2FsZU9yZGluYWw6XzIsc2NhbGVJbXBsaWNpdDpnMixzY2FsZVBvdzpoMyxzY2FsZVNxcnQ6ZnVuY3Rpb24gZG10KCl7cmV0dXJuIGgzKCkuZXhwb25lbnQoLjUpfSxzY2FsZVF1YW50aWxlOmZ1bmN0aW9uIHQoKXt2YXIgZT1bXSxuPVtdLGk9W107ZnVuY3Rpb24gcigpe3ZhciB0PTAscj1NYXRoLm1heCgxLG4ubGVuZ3RoKTtmb3IoaT1uZXcgQXJyYXkoci0xKTsrK3Q8cjspaVt0LTFdPXMyKGUsdC9yKTtyZXR1cm4gb31mdW5jdGlvbiBvKHQpe2lmKCFpc05hTih0PSt0KSlyZXR1cm4gbltRMChpLHQpXX1yZXR1cm4gby5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIHI9bi5pbmRleE9mKHQpO3JldHVybiByPDA/W05hTixOYU5dOltyPjA/aVtyLTFdOmVbMF0scjxpLmxlbmd0aD9pW3JdOmVbZS5sZW5ndGgtMV1dfSxvLmRvbWFpbj1mdW5jdGlvbih0KXtpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gZS5zbGljZSgpO2U9W107Zm9yKHZhciBuLGk9MCxvPXQubGVuZ3RoO2k8bzsrK2kpbnVsbD09KG49dFtpXSl8fGlzTmFOKG49K24pfHxlLnB1c2gobik7cmV0dXJuIGUuc29ydChaMCkscigpfSxvLnJhbmdlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPW0yLmNhbGwodCkscigpKTpuLnNsaWNlKCl9LG8ucXVhbnRpbGVzPWZ1bmN0aW9uKCl7cmV0dXJuIGkuc2xpY2UoKX0sby5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5kb21haW4oZSkucmFuZ2Uobil9LG99LHNjYWxlUXVhbnRpemU6ZnVuY3Rpb24gdCgpe3ZhciBlPTAsbj0xLGk9MSxyPVsuNV0sbz1bMCwxXTtmdW5jdGlvbiBhKHQpe2lmKHQ8PXQpcmV0dXJuIG9bUTAocix0LDAsaSldfWZ1bmN0aW9uIHMoKXt2YXIgdD0tMTtmb3Iocj1uZXcgQXJyYXkoaSk7Kyt0PGk7KXJbdF09KCh0KzEpKm4tKHQtaSkqZSkvKGkrMSk7cmV0dXJuIGF9cmV0dXJuIGEuZG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSt0WzBdLG49K3RbMV0scygpKTpbZSxuXX0sYS5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0obz1tMi5jYWxsKHQpKS5sZW5ndGgtMSxzKCkpOm8uc2xpY2UoKX0sYS5pbnZlcnRFeHRlbnQ9ZnVuY3Rpb24odCl7dmFyIGE9by5pbmRleE9mKHQpO3JldHVybiBhPDA/W05hTixOYU5dOmE8MT9bZSxyWzBdXTphPj1pP1tyW2ktMV0sbl06W3JbYS0xXSxyW2FdXX0sYS5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5kb21haW4oW2Usbl0pLnJhbmdlKG8pfSxuMyhhKX0sc2NhbGVUaHJlc2hvbGQ6ZnVuY3Rpb24gdCgpe3ZhciBlPVsuNV0sbj1bMCwxXSxpPTE7ZnVuY3Rpb24gcih0KXtpZih0PD10KXJldHVybiBuW1EwKGUsdCwwLGkpXX1yZXR1cm4gci5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9bTIuY2FsbCh0KSxpPU1hdGgubWluKGUubGVuZ3RoLG4ubGVuZ3RoLTEpLHIpOmUuc2xpY2UoKX0sci5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1tMi5jYWxsKHQpLGk9TWF0aC5taW4oZS5sZW5ndGgsbi5sZW5ndGgtMSkscik6bi5zbGljZSgpfSxyLmludmVydEV4dGVudD1mdW5jdGlvbih0KXt2YXIgaT1uLmluZGV4T2YodCk7cmV0dXJuW2VbaS0xXSxlW2ldXX0sci5jb3B5PWZ1bmN0aW9uKCl7cmV0dXJuIHQoKS5kb21haW4oZSkucmFuZ2Uobil9LHJ9LHNjYWxlVGltZTpmdW5jdGlvbiBwbXQoKXtyZXR1cm4gdzYoSTMsUDMsQTMsVDMsRTMsTTMsUzMsXzMsWDMpLmRvbWFpbihbbmV3IERhdGUoMmUzLDAsMSksbmV3IERhdGUoMmUzLDAsMildKX0sc2NhbGVVdGM6ZnVuY3Rpb24gZm10KCl7cmV0dXJuIHc2KGozLFYzLEIzLHozLE8zLFIzLFMzLF8zLCQzKS5kb21haW4oW0RhdGUuVVRDKDJlMywwLDEpLERhdGUuVVRDKDJlMywwLDIpXSl9LHNjaGVtZUNhdGVnb3J5MTA6TTYsc2NoZW1lQ2F0ZWdvcnkyMGI6RTYsc2NoZW1lQ2F0ZWdvcnkyMGM6VDYsc2NoZW1lQ2F0ZWdvcnkyMDpDNixpbnRlcnBvbGF0ZUN1YmVoZWxpeERlZmF1bHQ6QTYsaW50ZXJwb2xhdGVSYWluYm93OmZ1bmN0aW9uIG1tdCh0KXsodDwwfHx0PjEpJiYodC09TWF0aC5mbG9vcih0KSk7dmFyIGU9TWF0aC5hYnModC0uNSk7cmV0dXJuIFA2Lmg9MzYwKnQtMTAwLFA2LnM9MS41LTEuNSplLFA2Lmw9LjgtLjkqZSxQNisiIn0saW50ZXJwb2xhdGVXYXJtOms2LGludGVycG9sYXRlQ29vbDpMNixpbnRlcnBvbGF0ZVZpcmlkaXM6STYsaW50ZXJwb2xhdGVNYWdtYTpSNixpbnRlcnBvbGF0ZUluZmVybm86TzYsaW50ZXJwb2xhdGVQbGFzbWE6ejYsc2NhbGVTZXF1ZW50aWFsOmZ1bmN0aW9uIHQoZSl7dmFyIG49MCxpPTEscj0hMTtmdW5jdGlvbiBvKHQpe3ZhciBvPSh0LW4pLyhpLW4pO3JldHVybiBlKHI/TWF0aC5tYXgoMCxNYXRoLm1pbigxLG8pKTpvKX1yZXR1cm4gby5kb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49K3RbMF0saT0rdFsxXSxvKTpbbixpXX0sby5jbGFtcD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj0hIXQsbyk6cn0sby5pbnRlcnBvbGF0b3I9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxvKTplfSxvLmNvcHk9ZnVuY3Rpb24oKXtyZXR1cm4gdChlKS5kb21haW4oW24saV0pLmNsYW1wKHIpfSxuMyhvKX0sY3JlYXRlOmZ1bmN0aW9uIGdtdCh0KXtyZXR1cm4gJDkoVTYodCkuY2FsbChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKX0sY3JlYXRvcjpVNixsb2NhbDpDOCxtYXRjaGVyOks2LG1vdXNlOmZ1bmN0aW9uIF9tdCh0KXt2YXIgZT1rOCgpO3JldHVybiBlLmNoYW5nZWRUb3VjaGVzJiYoZT1lLmNoYW5nZWRUb3VjaGVzWzBdKSxMOCh0LGUpfSxuYW1lc3BhY2U6SDYsbmFtZXNwYWNlczpCNixjbGllbnRQb2ludDpMOCxzZWxlY3Q6JDksc2VsZWN0QWxsOmZ1bmN0aW9uIHltdCh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHQ/bmV3IFk5KFtkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHQpXSxbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSk6bmV3IFk5KFtudWxsPT10P1tdOnRdLHE5KX0sc2VsZWN0aW9uOlg5LHNlbGVjdG9yOkc2LHNlbGVjdG9yQWxsOnE2LHN0eWxlOmQ5LHRvdWNoOmZ1bmN0aW9uIHZtdCh0LGUsbil7YXJndW1lbnRzLmxlbmd0aDwzJiYobj1lLGU9azgoKS5jaGFuZ2VkVG91Y2hlcyk7Zm9yKHZhciBpLHI9MCxvPWU/ZS5sZW5ndGg6MDtyPG87KytyKWlmKChpPWVbcl0pLmlkZW50aWZpZXI9PT1uKXJldHVybiBMOCh0LGkpO3JldHVybiBudWxsfSx0b3VjaGVzOmZ1bmN0aW9uIGJtdCh0LGUpe251bGw9PWUmJihlPWs4KCkudG91Y2hlcyk7Zm9yKHZhciBuPTAsaT1lP2UubGVuZ3RoOjAscj1uZXcgQXJyYXkoaSk7bjxpOysrbilyW25dPUw4KHQsZVtuXSk7cmV0dXJuIHJ9LHdpbmRvdzpsOSxnZXQgZXZlbnQoKXtyZXR1cm4gRDl9LGN1c3RvbUV2ZW50OmZ1bmN0aW9uIHhtdCh0LGUsbixpKXt2YXIgcj1EOTt0LnNvdXJjZUV2ZW50PUQ5LEQ5PXQ7dHJ5e3JldHVybiBlLmFwcGx5KG4saSl9ZmluYWxseXtEOT1yfX0sYXJjOmZ1bmN0aW9uIHdtdCgpe3ZhciB0PVo4LGU9Sjgsbj1EOCgwKSxpPW51bGwscj1ROCxvPXQ3LGE9ZTcscz1udWxsO2Z1bmN0aW9uIGwoKXt2YXIgbCxjLHU9K3QuYXBwbHkodGhpcyxhcmd1bWVudHMpLGg9K2UuYXBwbHkodGhpcyxhcmd1bWVudHMpLGQ9ci5hcHBseSh0aGlzLGFyZ3VtZW50cyktWTgscD1vLmFwcGx5KHRoaXMsYXJndW1lbnRzKS1ZOCxmPUI4KHAtZCksbT1wPmQ7aWYoc3x8KHM9bD16OCgpKSxoPHUmJihjPWgsaD11LHU9YyksaD5XOClpZihmPlg4LVc4KXMubW92ZVRvKGgqRjgoZCksaCpqOChkKSkscy5hcmMoMCwwLGgsZCxwLCFtKSx1Plc4JiYocy5tb3ZlVG8odSpGOChwKSx1Kmo4KHApKSxzLmFyYygwLDAsdSxwLGQsbSkpO2Vsc2V7dmFyIGcsXyx5PWQsdj1wLGI9ZCx4PXAsdz1mLFM9ZixNPWEuYXBwbHkodGhpcyxhcmd1bWVudHMpLzIsRT1NPlc4JiYoaT8raS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6RzgodSp1K2gqaCkpLFQ9VTgoQjgoaC11KS8yLCtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksQz1ULEE9VDtpZihFPlc4KXt2YXIgaz1LOChFL3UqajgoTSkpLEw9SzgoRS9oKmo4KE0pKTsody09MiprKT5XOD8oYis9ayo9bT8xOi0xLHgtPWspOih3PTAsYj14PShkK3ApLzIpLChTLT0yKkwpPlc4Pyh5Kz1MKj1tPzE6LTEsdi09TCk6KFM9MCx5PXY9KGQrcCkvMil9dmFyIFA9aCpGOCh5KSxOPWgqajgoeSksST11KkY4KHgpLFI9dSpqOCh4KTtpZihUPlc4KXt2YXIgTz1oKkY4KHYpLHo9aCpqOCh2KSxEPXUqRjgoYiksQj11Kmo4KGIpO2lmKGY8cTgpe3ZhciBIPXc+Vzg/bjcoUCxOLEQsQixPLHosSSxSKTpbSSxSXSxGPVAtSFswXSxWPU4tSFsxXSxVPU8tSFswXSxqPXotSFsxXSxHPTEvajgoJDgoKEYqVStWKmopLyhHOChGKkYrVipWKSpHOChVKlUraipqKSkpLzIpLFc9RzgoSFswXSpIWzBdK0hbMV0qSFsxXSk7Qz1VOChULCh1LVcpLyhHLTEpKSxBPVU4KFQsKGgtVykvKEcrMSkpfX1TPlc4P0E+Vzg/KGc9aTcoRCxCLFAsTixoLEEsbSksXz1pNyhPLHosSSxSLGgsQSxtKSxzLm1vdmVUbyhnLmN4K2cueDAxLGcuY3krZy55MDEpLEE8VD9zLmFyYyhnLmN4LGcuY3ksQSxIOChnLnkwMSxnLngwMSksSDgoXy55MDEsXy54MDEpLCFtKToocy5hcmMoZy5jeCxnLmN5LEEsSDgoZy55MDEsZy54MDEpLEg4KGcueTExLGcueDExKSwhbSkscy5hcmMoMCwwLGgsSDgoZy5jeStnLnkxMSxnLmN4K2cueDExKSxIOChfLmN5K18ueTExLF8uY3grXy54MTEpLCFtKSxzLmFyYyhfLmN4LF8uY3ksQSxIOChfLnkxMSxfLngxMSksSDgoXy55MDEsXy54MDEpLCFtKSkpOihzLm1vdmVUbyhQLE4pLHMuYXJjKDAsMCxoLHksdiwhbSkpOnMubW92ZVRvKFAsTiksdT5XOCYmdz5XOD9DPlc4PyhnPWk3KEksUixPLHosdSwtQyxtKSxfPWk3KFAsTixELEIsdSwtQyxtKSxzLmxpbmVUbyhnLmN4K2cueDAxLGcuY3krZy55MDEpLEM8VD9zLmFyYyhnLmN4LGcuY3ksQyxIOChnLnkwMSxnLngwMSksSDgoXy55MDEsXy54MDEpLCFtKToocy5hcmMoZy5jeCxnLmN5LEMsSDgoZy55MDEsZy54MDEpLEg4KGcueTExLGcueDExKSwhbSkscy5hcmMoMCwwLHUsSDgoZy5jeStnLnkxMSxnLmN4K2cueDExKSxIOChfLmN5K18ueTExLF8uY3grXy54MTEpLG0pLHMuYXJjKF8uY3gsXy5jeSxDLEg4KF8ueTExLF8ueDExKSxIOChfLnkwMSxfLngwMSksIW0pKSk6cy5hcmMoMCwwLHUseCxiLG0pOnMubGluZVRvKEksUil9ZWxzZSBzLm1vdmVUbygwLDApO2lmKHMuY2xvc2VQYXRoKCksbClyZXR1cm4gcz1udWxsLGwrIiJ8fG51bGx9cmV0dXJuIGwuY2VudHJvaWQ9ZnVuY3Rpb24oKXt2YXIgbj0oK3QuYXBwbHkodGhpcyxhcmd1bWVudHMpKyArZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpLzIsaT0oK3IuYXBwbHkodGhpcyxhcmd1bWVudHMpKyArby5hcHBseSh0aGlzLGFyZ3VtZW50cykpLzItcTgvMjtyZXR1cm5bRjgoaSkqbixqOChpKSpuXX0sbC5pbm5lclJhZGl1cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOkQ4KCtlKSxsKTp0fSxsLm91dGVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhlPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RDgoK3QpLGwpOmV9LGwuY29ybmVyUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RDgoK3QpLGwpOm59LGwucGFkUmFkaXVzPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhpPW51bGw9PXQ/bnVsbDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OkQ4KCt0KSxsKTppfSxsLnN0YXJ0QW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpEOCgrdCksbCk6cn0sbC5lbmRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obz0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkQ4KCt0KSxsKTpvfSxsLnBhZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhhPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RDgoK3QpLGwpOmF9LGwuY29udGV4dD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocz1udWxsPT10P251bGw6dCxsKTpzfSxsfSxhcmVhOmM3LGxpbmU6bDcscGllOmZ1bmN0aW9uIFNtdCgpe3ZhciB0PWg3LGU9dTcsbj1udWxsLGk9RDgoMCkscj1EOChYOCksbz1EOCgwKTtmdW5jdGlvbiBhKGEpe3ZhciBzLGwsYyx1LGgsZD1hLmxlbmd0aCxwPTAsZj1uZXcgQXJyYXkoZCksbT1uZXcgQXJyYXkoZCksZz0raS5hcHBseSh0aGlzLGFyZ3VtZW50cyksXz1NYXRoLm1pbihYOCxNYXRoLm1heCgtWDgsci5hcHBseSh0aGlzLGFyZ3VtZW50cyktZykpLHk9TWF0aC5taW4oTWF0aC5hYnMoXykvZCxvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksdj15KihfPDA/LTE6MSk7Zm9yKHM9MDtzPGQ7KytzKShoPW1bZltzXT1zXT0rdChhW3NdLHMsYSkpPjAmJihwKz1oKTtmb3IobnVsbCE9ZT9mLnNvcnQoKGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUobVt0XSxtW25dKX0pKTpudWxsIT1uJiZmLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4oYVt0XSxhW2VdKX0pKSxzPTAsYz1wPyhfLWQqdikvcDowO3M8ZDsrK3MsZz11KW1bbD1mW3NdXT17ZGF0YTphW2xdLGluZGV4OnMsdmFsdWU6aD1tW2xdLHN0YXJ0QW5nbGU6ZyxlbmRBbmdsZTp1PWcrKGg+MD9oKmM6MCkrdixwYWRBbmdsZTp5fTtyZXR1cm4gbX1yZXR1cm4gYS52YWx1ZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOkQ4KCtlKSxhKTp0fSxhLnNvcnRWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGU9dCxuPW51bGwsYSk6ZX0sYS5zb3J0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPXQsZT1udWxsLGEpOm59LGEuc3RhcnRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkQ4KCt0KSxhKTppfSxhLmVuZEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhyPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6RDgoK3QpLGEpOnJ9LGEucGFkQW5nbGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpEOCgrdCksYSk6b30sYX0sYXJlYVJhZGlhbDpfNyxyYWRpYWxBcmVhOl83LGxpbmVSYWRpYWw6ZzcscmFkaWFsTGluZTpnNyxwb2ludFJhZGlhbDp5NyxsaW5rSG9yaXpvbnRhbDpmdW5jdGlvbiBNbXQoKXtyZXR1cm4gdzcoUzcpfSxsaW5rVmVydGljYWw6ZnVuY3Rpb24gRW10KCl7cmV0dXJuIHc3KE03KX0sbGlua1JhZGlhbDpmdW5jdGlvbiBUbXQoKXt2YXIgdD13NyhFNyk7cmV0dXJuIHQuYW5nbGU9dC54LGRlbGV0ZSB0LngsdC5yYWRpdXM9dC55LGRlbGV0ZSB0LnksdH0sc3ltYm9sOmZ1bmN0aW9uIENtdCgpe3ZhciB0PUQ4KFQ3KSxlPUQ4KDY0KSxuPW51bGw7ZnVuY3Rpb24gaSgpe3ZhciBpO2lmKG58fChuPWk9ejgoKSksdC5hcHBseSh0aGlzLGFyZ3VtZW50cykuZHJhdyhuLCtlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSksaSlyZXR1cm4gbj1udWxsLGkrIiJ8fG51bGx9cmV0dXJuIGkudHlwZT1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOkQ4KGUpLGkpOnR9LGkuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OkQ4KCt0KSxpKTplfSxpLmNvbnRleHQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49bnVsbD09dD9udWxsOnQsaSk6bn0saX0sc3ltYm9sczpqNyxzeW1ib2xDaXJjbGU6VDcsc3ltYm9sQ3Jvc3M6Qzcsc3ltYm9sRGlhbW9uZDpMNyxzeW1ib2xTcXVhcmU6Tzcsc3ltYm9sU3RhcjpSNyxzeW1ib2xUcmlhbmdsZTpENyxzeW1ib2xXeWU6VTcsY3VydmVCYXNpc0Nsb3NlZDpmdW5jdGlvbiBBbXQodCl7cmV0dXJuIG5ldyBZNyh0KX0sY3VydmVCYXNpc09wZW46ZnVuY3Rpb24ga210KHQpe3JldHVybiBuZXcgWDcodCl9LGN1cnZlQmFzaXM6ZnVuY3Rpb24gTG10KHQpe3JldHVybiBuZXcgcTcodCl9LGN1cnZlQnVuZGxlOks3LGN1cnZlQ2FyZGluYWxDbG9zZWQ6ZXR0LGN1cnZlQ2FyZGluYWxPcGVuOml0dCxjdXJ2ZUNhcmRpbmFsOlE3LGN1cnZlQ2F0bXVsbFJvbUNsb3NlZDpsdHQsY3VydmVDYXRtdWxsUm9tT3Blbjp1dHQsY3VydmVDYXRtdWxsUm9tOmF0dCxjdXJ2ZUxpbmVhckNsb3NlZDpmdW5jdGlvbiBQbXQodCl7cmV0dXJuIG5ldyBodHQodCl9LGN1cnZlTGluZWFyOm83LGN1cnZlTW9ub3RvbmVYOmZ1bmN0aW9uIE5tdCh0KXtyZXR1cm4gbmV3IGd0dCh0KX0sY3VydmVNb25vdG9uZVk6ZnVuY3Rpb24gSW10KHQpe3JldHVybiBuZXcgX3R0KHQpfSxjdXJ2ZU5hdHVyYWw6ZnVuY3Rpb24gUm10KHQpe3JldHVybiBuZXcgdnR0KHQpfSxjdXJ2ZVN0ZXA6ZnVuY3Rpb24gT210KHQpe3JldHVybiBuZXcgeHR0KHQsLjUpfSxjdXJ2ZVN0ZXBBZnRlcjpmdW5jdGlvbiB6bXQodCl7cmV0dXJuIG5ldyB4dHQodCwxKX0sY3VydmVTdGVwQmVmb3JlOmZ1bmN0aW9uIERtdCh0KXtyZXR1cm4gbmV3IHh0dCh0LDApfSxzdGFjazpmdW5jdGlvbiBCbXQoKXt2YXIgdD1EOChbXSksZT1TdHQsbj13dHQsaT1NdHQ7ZnVuY3Rpb24gcihyKXt2YXIgbyxhLHM9dC5hcHBseSh0aGlzLGFyZ3VtZW50cyksbD1yLmxlbmd0aCxjPXMubGVuZ3RoLHU9bmV3IEFycmF5KGMpO2ZvcihvPTA7bzxjOysrbyl7Zm9yKHZhciBoLGQ9c1tvXSxwPXVbb109bmV3IEFycmF5KGwpLGY9MDtmPGw7KytmKXBbZl09aD1bMCwraShyW2ZdLGQsZixyKV0saC5kYXRhPXJbZl07cC5rZXk9ZH1mb3Iobz0wLGE9ZSh1KTtvPGM7KytvKXVbYVtvXV0uaW5kZXg9bztyZXR1cm4gbih1LGEpLHV9cmV0dXJuIHIua2V5cz1mdW5jdGlvbihlKXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odD0iZnVuY3Rpb24iPT10eXBlb2YgZT9lOkQ4KHY3LmNhbGwoZSkpLHIpOnR9LHIudmFsdWU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGk9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpEOCgrdCkscik6aX0sci5vcmRlcj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT1udWxsPT10P1N0dDoiZnVuY3Rpb24iPT10eXBlb2YgdD90OkQ4KHY3LmNhbGwodCkpLHIpOmV9LHIub2Zmc2V0PWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPW51bGw9PXQ/d3R0OnQscik6bn0scn0sc3RhY2tPZmZzZXRFeHBhbmQ6ZnVuY3Rpb24gSG10KHQsZSl7aWYoKGk9dC5sZW5ndGgpPjApe2Zvcih2YXIgbixpLHIsbz0wLGE9dFswXS5sZW5ndGg7bzxhOysrbyl7Zm9yKHI9bj0wO248aTsrK24pcis9dFtuXVtvXVsxXXx8MDtpZihyKWZvcihuPTA7bjxpOysrbil0W25dW29dWzFdLz1yfXd0dCh0LGUpfX0sc3RhY2tPZmZzZXREaXZlcmdpbmc6ZnVuY3Rpb24gRm10KHQsZSl7aWYoKHM9dC5sZW5ndGgpPjEpZm9yKHZhciBuLGkscixvLGEscyxsPTAsYz10W2VbMF1dLmxlbmd0aDtsPGM7KytsKWZvcihvPWE9MCxuPTA7bjxzOysrbikocj0oaT10W2Vbbl1dW2xdKVsxXS1pWzBdKT49MD8oaVswXT1vLGlbMV09bys9cik6cjwwPyhpWzFdPWEsaVswXT1hKz1yKTppWzBdPW99LHN0YWNrT2Zmc2V0Tm9uZTp3dHQsc3RhY2tPZmZzZXRTaWxob3VldHRlOmZ1bmN0aW9uIFZtdCh0LGUpe2lmKChuPXQubGVuZ3RoKT4wKXtmb3IodmFyIG4saT0wLHI9dFtlWzBdXSxvPXIubGVuZ3RoO2k8bzsrK2kpe2Zvcih2YXIgYT0wLHM9MDthPG47KythKXMrPXRbYV1baV1bMV18fDA7cltpXVsxXSs9cltpXVswXT0tcy8yfXd0dCh0LGUpfX0sc3RhY2tPZmZzZXRXaWdnbGU6ZnVuY3Rpb24gVW10KHQsZSl7aWYoKHI9dC5sZW5ndGgpPjAmJihpPShuPXRbZVswXV0pLmxlbmd0aCk+MCl7Zm9yKHZhciBuLGkscixvPTAsYT0xO2E8aTsrK2Epe2Zvcih2YXIgcz0wLGw9MCxjPTA7czxyOysrcyl7Zm9yKHZhciB1PXRbZVtzXV0saD11W2FdWzFdfHwwLGQ9KGgtKHVbYS0xXVsxXXx8MCkpLzIscD0wO3A8czsrK3Ape3ZhciBmPXRbZVtwXV07ZCs9KGZbYV1bMV18fDApLShmW2EtMV1bMV18fDApfWwrPWgsYys9ZCpofW5bYS0xXVsxXSs9blthLTFdWzBdPW8sbCYmKG8tPWMvbCl9blthLTFdWzFdKz1uW2EtMV1bMF09byx3dHQodCxlKX19LHN0YWNrT3JkZXJBc2NlbmRpbmc6RXR0LHN0YWNrT3JkZXJEZXNjZW5kaW5nOmZ1bmN0aW9uIGptdCh0KXtyZXR1cm4gRXR0KHQpLnJldmVyc2UoKX0sc3RhY2tPcmRlckluc2lkZU91dDpmdW5jdGlvbiBHbXQodCl7dmFyIGUsbixpPXQubGVuZ3RoLHI9dC5tYXAoVHR0KSxvPVN0dCh0KS5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiByW2VdLXJbdF19KSksYT0wLHM9MCxsPVtdLGM9W107Zm9yKGU9MDtlPGk7KytlKW49b1tlXSxhPHM/KGErPXJbbl0sbC5wdXNoKG4pKToocys9cltuXSxjLnB1c2gobikpO3JldHVybiBjLnJldmVyc2UoKS5jb25jYXQobCl9LHN0YWNrT3JkZXJOb25lOlN0dCxzdGFja09yZGVyUmV2ZXJzZTpmdW5jdGlvbiBXbXQodCl7cmV0dXJuIFN0dCh0KS5yZXZlcnNlKCl9LHRpbWVJbnRlcnZhbDprdHQsdGltZU1pbGxpc2Vjb25kOkx0dCx0aW1lTWlsbGlzZWNvbmRzOlB0dCx1dGNNaWxsaXNlY29uZDpMdHQsdXRjTWlsbGlzZWNvbmRzOlB0dCx0aW1lU2Vjb25kOkR0dCx0aW1lU2Vjb25kczpCdHQsdXRjU2Vjb25kOkR0dCx1dGNTZWNvbmRzOkJ0dCx0aW1lTWludXRlOkh0dCx0aW1lTWludXRlczpGdHQsdGltZUhvdXI6VnR0LHRpbWVIb3VyczpVdHQsdGltZURheTpqdHQsdGltZURheXM6R3R0LHRpbWVXZWVrOnF0dCx0aW1lV2Vla3M6UXR0LHRpbWVTdW5kYXk6cXR0LHRpbWVTdW5kYXlzOlF0dCx0aW1lTW9uZGF5Oll0dCx0aW1lTW9uZGF5czp0ZXQsdGltZVR1ZXNkYXk6WHR0LHRpbWVUdWVzZGF5czplZXQsdGltZVdlZG5lc2RheTokdHQsdGltZVdlZG5lc2RheXM6bmV0LHRpbWVUaHVyc2RheTpLdHQsdGltZVRodXJzZGF5czppZXQsdGltZUZyaWRheTpadHQsdGltZUZyaWRheXM6cmV0LHRpbWVTYXR1cmRheTpKdHQsdGltZVNhdHVyZGF5czpvZXQsdGltZU1vbnRoOmFldCx0aW1lTW9udGhzOnNldCx0aW1lWWVhcjpjZXQsdGltZVllYXJzOnVldCx1dGNNaW51dGU6aGV0LHV0Y01pbnV0ZXM6ZGV0LHV0Y0hvdXI6cGV0LHV0Y0hvdXJzOmZldCx1dGNEYXk6bWV0LHV0Y0RheXM6Z2V0LHV0Y1dlZWs6eWV0LHV0Y1dlZWtzOlRldCx1dGNTdW5kYXk6eWV0LHV0Y1N1bmRheXM6VGV0LHV0Y01vbmRheTp2ZXQsdXRjTW9uZGF5czpDZXQsdXRjVHVlc2RheTpiZXQsdXRjVHVlc2RheXM6QWV0LHV0Y1dlZG5lc2RheTp4ZXQsdXRjV2VkbmVzZGF5czprZXQsdXRjVGh1cnNkYXk6d2V0LHV0Y1RodXJzZGF5czpMZXQsdXRjRnJpZGF5Ok1ldCx1dGNGcmlkYXlzOlBldCx1dGNTYXR1cmRheTpFZXQsdXRjU2F0dXJkYXlzOk5ldCx1dGNNb250aDpJZXQsdXRjTW9udGhzOlJldCx1dGNZZWFyOk9ldCx1dGNZZWFyczp6ZXQsdGltZUZvcm1hdERlZmF1bHRMb2NhbGU6eGl0LGdldCB0aW1lRm9ybWF0KCl7cmV0dXJuIHNudH0sZ2V0IHRpbWVQYXJzZSgpe3JldHVybiBsbnR9LGdldCB1dGNGb3JtYXQoKXtyZXR1cm4gY250fSxnZXQgdXRjUGFyc2UoKXtyZXR1cm4gdW50fSx0aW1lRm9ybWF0TG9jYWxlOm9udCxpc29Gb3JtYXQ6U2l0LGlzb1BhcnNlOkNpdCxub3c6RGl0LHRpbWVyOkZpdCx0aW1lckZsdXNoOlZpdCx0aW1lb3V0OmZ1bmN0aW9uIHFtdCh0LGUsbil7dmFyIGk9bmV3IEhpdDtyZXR1cm4gaS5yZXN0YXJ0KChmdW5jdGlvbihuKXtpLnN0b3AoKSx0KG4rZSl9KSxlPW51bGw9PWU/MDorZSxuKSxpfSxpbnRlcnZhbDpmdW5jdGlvbiBZbXQodCxlLG4pe3ZhciBpPW5ldyBIaXQscj1lO3JldHVybiBudWxsPT1lPyhpLnJlc3RhcnQodCxlLG4pLGkpOihlPStlLG49bnVsbD09bj9EaXQoKTorbixpLnJlc3RhcnQoKGZ1bmN0aW9uIG8oYSl7YSs9cixpLnJlc3RhcnQobyxyKz1lLG4pLHQoYSl9KSxlLG4pLGkpfSx0cmFuc2l0aW9uOkFzdCxhY3RpdmU6ZnVuY3Rpb24gWG10KHQsZSl7dmFyIG4saSxyPXQuX190cmFuc2l0aW9uO2lmKHIpZm9yKGkgaW4gZT1udWxsPT1lP251bGw6ZSsiIixyKWlmKChuPXJbaV0pLnN0YXRlPjEmJm4ubmFtZT09PWUpcmV0dXJuIG5ldyBDc3QoW1t0XV0sSnN0LGUsK2kpO3JldHVybiBudWxsfSxpbnRlcnJ1cHQ6YWF0LHZvcm9ub2k6ZnVuY3Rpb24gJG10KCl7dmFyIHQ9dGx0LGU9ZWx0LG49bnVsbDtmdW5jdGlvbiBpKGkpe3JldHVybiBuZXcgemx0KGkubWFwKChmdW5jdGlvbihuLHIpe3ZhciBvPVtNYXRoLnJvdW5kKHQobixyLGkpL05sdCkqTmx0LE1hdGgucm91bmQoZShuLHIsaSkvTmx0KSpObHRdO3JldHVybiBvLmluZGV4PXIsby5kYXRhPW4sb30pKSxuKX1yZXR1cm4gaS5wb2x5Z29ucz1mdW5jdGlvbih0KXtyZXR1cm4gaSh0KS5wb2x5Z29ucygpfSxpLmxpbmtzPWZ1bmN0aW9uKHQpe3JldHVybiBpKHQpLmxpbmtzKCl9LGkudHJpYW5nbGVzPWZ1bmN0aW9uKHQpe3JldHVybiBpKHQpLnRyaWFuZ2xlcygpfSxpLng9ZnVuY3Rpb24oZSl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KHQ9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpRc3QoK2UpLGkpOnR9LGkueT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oZT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OlFzdCgrdCksaSk6ZX0saS5leHRlbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG49bnVsbD09dD9udWxsOltbK3RbMF1bMF0sK3RbMF1bMV1dLFsrdFsxXVswXSwrdFsxXVsxXV1dLGkpOm4mJltbblswXVswXSxuWzBdWzFdXSxbblsxXVswXSxuWzFdWzFdXV19LGkuc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obj1udWxsPT10P251bGw6W1swLDBdLFsrdFswXSwrdFsxXV1dLGkpOm4mJltuWzFdWzBdLW5bMF1bMF0sblsxXVsxXS1uWzBdWzFdXX0saX0sem9vbTpmdW5jdGlvbiBLbXQoKXt2YXIgdCxlLG49Z3B0LGk9X3B0LHI9eHB0LG89dnB0LGE9YnB0LHM9WzAsMS8wXSxsPVtbLTEvMCwtMS8wXSxbMS8wLDEvMF1dLGM9MjUwLHU9Qmh0LGg9W10sZD1CbHQoInN0YXJ0Iiwiem9vbSIsImVuZCIpLHA9NTAwLGY9MDtmdW5jdGlvbiBtKHQpe3QucHJvcGVydHkoIl9fem9vbSIseXB0KS5vbigid2hlZWwuem9vbSIsdykub24oIm1vdXNlZG93bi56b29tIixTKS5vbigiZGJsY2xpY2suem9vbSIsTSkuZmlsdGVyKGEpLm9uKCJ0b3VjaHN0YXJ0Lnpvb20iLEUpLm9uKCJ0b3VjaG1vdmUuem9vbSIsVCkub24oInRvdWNoZW5kLnpvb20gdG91Y2hjYW5jZWwuem9vbSIsQykuc3R5bGUoInRvdWNoLWFjdGlvbiIsIm5vbmUiKS5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwicmdiYSgwLDAsMCwwKSIpfWZ1bmN0aW9uIGcodCxlKXtyZXR1cm4oZT1NYXRoLm1heChzWzBdLE1hdGgubWluKHNbMV0sZSkpKT09PXQuaz90Om5ldyBjcHQoZSx0LngsdC55KX1mdW5jdGlvbiBfKHQsZSxuKXt2YXIgaT1lWzBdLW5bMF0qdC5rLHI9ZVsxXS1uWzFdKnQuaztyZXR1cm4gaT09PXQueCYmcj09PXQueT90Om5ldyBjcHQodC5rLGkscil9ZnVuY3Rpb24geSh0KXtyZXR1cm5bKCt0WzBdWzBdKyArdFsxXVswXSkvMiwoK3RbMF1bMV0rICt0WzFdWzFdKS8yXX1mdW5jdGlvbiB2KHQsZSxuKXt0Lm9uKCJzdGFydC56b29tIiwoZnVuY3Rpb24oKXtiKHRoaXMsYXJndW1lbnRzKS5zdGFydCgpfSkpLm9uKCJpbnRlcnJ1cHQuem9vbSBlbmQuem9vbSIsKGZ1bmN0aW9uKCl7Yih0aGlzLGFyZ3VtZW50cykuZW5kKCl9KSkudHdlZW4oInpvb20iLChmdW5jdGlvbigpe3ZhciB0PXRoaXMscj1hcmd1bWVudHMsbz1iKHQsciksYT1pLmFwcGx5KHQscikscz1ufHx5KGEpLGw9TWF0aC5tYXgoYVsxXVswXS1hWzBdWzBdLGFbMV1bMV0tYVswXVsxXSksYz10Ll9fem9vbSxoPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodCxyKTplLGQ9dShjLmludmVydChzKS5jb25jYXQobC9jLmspLGguaW52ZXJ0KHMpLmNvbmNhdChsL2guaykpO3JldHVybiBmdW5jdGlvbih0KXtpZigxPT09dCl0PWg7ZWxzZXt2YXIgZT1kKHQpLG49bC9lWzJdO3Q9bmV3IGNwdChuLHNbMF0tZVswXSpuLHNbMV0tZVsxXSpuKX1vLnpvb20obnVsbCx0KX19KSl9ZnVuY3Rpb24gYih0LGUpe2Zvcih2YXIgbixpPTAscj1oLmxlbmd0aDtpPHI7KytpKWlmKChuPWhbaV0pLnRoYXQ9PT10KXJldHVybiBuO3JldHVybiBuZXcgeCh0LGUpfWZ1bmN0aW9uIHgodCxlKXt0aGlzLnRoYXQ9dCx0aGlzLmFyZ3M9ZSx0aGlzLmluZGV4PS0xLHRoaXMuYWN0aXZlPTAsdGhpcy5leHRlbnQ9aS5hcHBseSh0LGUpfWZ1bmN0aW9uIHcoKXtpZihuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl7dmFyIHQ9Yih0aGlzLGFyZ3VtZW50cyksZT10aGlzLl9fem9vbSxpPU1hdGgubWF4KHNbMF0sTWF0aC5taW4oc1sxXSxlLmsqTWF0aC5wb3coMixvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSkpKSxhPWV1dCh0aGlzKTtpZih0LndoZWVsKXQubW91c2VbMF1bMF09PT1hWzBdJiZ0Lm1vdXNlWzBdWzFdPT09YVsxXXx8KHQubW91c2VbMV09ZS5pbnZlcnQodC5tb3VzZVswXT1hKSksY2xlYXJUaW1lb3V0KHQud2hlZWwpO2Vsc2V7aWYoZS5rPT09aSlyZXR1cm47dC5tb3VzZT1bYSxlLmludmVydChhKV0sY2R0KHRoaXMpLHQuc3RhcnQoKX1tcHQoKSx0LndoZWVsPXNldFRpbWVvdXQoYywxNTApLHQuem9vbSgibW91c2UiLHIoXyhnKGUsaSksdC5tb3VzZVswXSx0Lm1vdXNlWzFdKSx0LmV4dGVudCxsKSl9ZnVuY3Rpb24gYygpe3Qud2hlZWw9bnVsbCx0LmVuZCgpfX1mdW5jdGlvbiBTKCl7aWYoIWUmJm4uYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgdD1iKHRoaXMsYXJndW1lbnRzKSxpPUpjdChGY3Qudmlldykub24oIm1vdXNlbW92ZS56b29tIixjLCEwKS5vbigibW91c2V1cC56b29tIix1LCEwKSxvPWV1dCh0aGlzKSxhPUZjdC5jbGllbnRYLHM9RmN0LmNsaWVudFk7cnV0KEZjdC52aWV3KSxmcHQoKSx0Lm1vdXNlPVtvLHRoaXMuX196b29tLmludmVydChvKV0sY2R0KHRoaXMpLHQuc3RhcnQoKX1mdW5jdGlvbiBjKCl7aWYobXB0KCksIXQubW92ZWQpe3ZhciBlPUZjdC5jbGllbnRYLWEsbj1GY3QuY2xpZW50WS1zO3QubW92ZWQ9ZSplK24qbj5mfXQuem9vbSgibW91c2UiLHIoXyh0LnRoYXQuX196b29tLHQubW91c2VbMF09ZXV0KHQudGhhdCksdC5tb3VzZVsxXSksdC5leHRlbnQsbCkpfWZ1bmN0aW9uIHUoKXtpLm9uKCJtb3VzZW1vdmUuem9vbSBtb3VzZXVwLnpvb20iLG51bGwpLG91dChGY3Qudmlldyx0Lm1vdmVkKSxtcHQoKSx0LmVuZCgpfX1mdW5jdGlvbiBNKCl7aWYobi5hcHBseSh0aGlzLGFyZ3VtZW50cykpe3ZhciB0PXRoaXMuX196b29tLGU9ZXV0KHRoaXMpLG89dC5pbnZlcnQoZSksYT10LmsqKEZjdC5zaGlmdEtleT8uNToyKSxzPXIoXyhnKHQsYSksZSxvKSxpLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxsKTttcHQoKSxjPjA/SmN0KHRoaXMpLnRyYW5zaXRpb24oKS5kdXJhdGlvbihjKS5jYWxsKHYscyxlKTpKY3QodGhpcykuY2FsbChtLnRyYW5zZm9ybSxzKX19ZnVuY3Rpb24gRSgpe2lmKG4uYXBwbHkodGhpcyxhcmd1bWVudHMpKXt2YXIgZSxpLHIsbyxhPWIodGhpcyxhcmd1bWVudHMpLHM9RmN0LmNoYW5nZWRUb3VjaGVzLGw9cy5sZW5ndGg7Zm9yKGZwdCgpLGk9MDtpPGw7KytpKW89W289bnV0KHRoaXMscywocj1zW2ldKS5pZGVudGlmaWVyKSx0aGlzLl9fem9vbS5pbnZlcnQobyksci5pZGVudGlmaWVyXSxhLnRvdWNoMD9hLnRvdWNoMXx8KGEudG91Y2gxPW8pOihhLnRvdWNoMD1vLGU9ITApO2lmKHQmJih0PWNsZWFyVGltZW91dCh0KSwhYS50b3VjaDEpKXJldHVybiBhLmVuZCgpLHZvaWQoKG89SmN0KHRoaXMpLm9uKCJkYmxjbGljay56b29tIikpJiZvLmFwcGx5KHRoaXMsYXJndW1lbnRzKSk7ZSYmKHQ9c2V0VGltZW91dCgoZnVuY3Rpb24oKXt0PW51bGx9KSxwKSxjZHQodGhpcyksYS5zdGFydCgpKX19ZnVuY3Rpb24gVCgpe3ZhciBlLG4saSxvLGE9Yih0aGlzLGFyZ3VtZW50cykscz1GY3QuY2hhbmdlZFRvdWNoZXMsYz1zLmxlbmd0aDtmb3IobXB0KCksdCYmKHQ9Y2xlYXJUaW1lb3V0KHQpKSxlPTA7ZTxjOysrZSlpPW51dCh0aGlzLHMsKG49c1tlXSkuaWRlbnRpZmllciksYS50b3VjaDAmJmEudG91Y2gwWzJdPT09bi5pZGVudGlmaWVyP2EudG91Y2gwWzBdPWk6YS50b3VjaDEmJmEudG91Y2gxWzJdPT09bi5pZGVudGlmaWVyJiYoYS50b3VjaDFbMF09aSk7aWYobj1hLnRoYXQuX196b29tLGEudG91Y2gxKXt2YXIgdT1hLnRvdWNoMFswXSxoPWEudG91Y2gwWzFdLGQ9YS50b3VjaDFbMF0scD1hLnRvdWNoMVsxXSxmPShmPWRbMF0tdVswXSkqZisoZj1kWzFdLXVbMV0pKmYsbT0obT1wWzBdLWhbMF0pKm0rKG09cFsxXS1oWzFdKSptO249ZyhuLE1hdGguc3FydChmL20pKSxpPVsodVswXStkWzBdKS8yLCh1WzFdK2RbMV0pLzJdLG89WyhoWzBdK3BbMF0pLzIsKGhbMV0rcFsxXSkvMl19ZWxzZXtpZighYS50b3VjaDApcmV0dXJuO2k9YS50b3VjaDBbMF0sbz1hLnRvdWNoMFsxXX1hLnpvb20oInRvdWNoIixyKF8obixpLG8pLGEuZXh0ZW50LGwpKX1mdW5jdGlvbiBDKCl7dmFyIHQsbixpPWIodGhpcyxhcmd1bWVudHMpLHI9RmN0LmNoYW5nZWRUb3VjaGVzLG89ci5sZW5ndGg7Zm9yKGZwdCgpLGUmJmNsZWFyVGltZW91dChlKSxlPXNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7ZT1udWxsfSkscCksdD0wO3Q8bzsrK3Qpbj1yW3RdLGkudG91Y2gwJiZpLnRvdWNoMFsyXT09PW4uaWRlbnRpZmllcj9kZWxldGUgaS50b3VjaDA6aS50b3VjaDEmJmkudG91Y2gxWzJdPT09bi5pZGVudGlmaWVyJiZkZWxldGUgaS50b3VjaDE7aS50b3VjaDEmJiFpLnRvdWNoMCYmKGkudG91Y2gwPWkudG91Y2gxLGRlbGV0ZSBpLnRvdWNoMSksaS50b3VjaDA/aS50b3VjaDBbMV09dGhpcy5fX3pvb20uaW52ZXJ0KGkudG91Y2gwWzBdKTppLmVuZCgpfXJldHVybiBtLnRyYW5zZm9ybT1mdW5jdGlvbih0LGUpe3ZhciBuPXQuc2VsZWN0aW9uP3Quc2VsZWN0aW9uKCk6dDtuLnByb3BlcnR5KCJfX3pvb20iLHlwdCksdCE9PW4/dih0LGUpOm4uaW50ZXJydXB0KCkuZWFjaCgoZnVuY3Rpb24oKXtiKHRoaXMsYXJndW1lbnRzKS5zdGFydCgpLnpvb20obnVsbCwiZnVuY3Rpb24iPT10eXBlb2YgZT9lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTplKS5lbmQoKX0pKX0sbS5zY2FsZUJ5PWZ1bmN0aW9uKHQsZSl7bS5zY2FsZVRvKHQsKGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fX3pvb20uayxuPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyxhcmd1bWVudHMpOmU7cmV0dXJuIHQqbn0pKX0sbS5zY2FsZVRvPWZ1bmN0aW9uKHQsZSl7bS50cmFuc2Zvcm0odCwoZnVuY3Rpb24oKXt2YXIgdD1pLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxuPXRoaXMuX196b29tLG89eSh0KSxhPW4uaW52ZXJ0KG8pLHM9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyk6ZTtyZXR1cm4gcihfKGcobixzKSxvLGEpLHQsbCl9KSl9LG0udHJhbnNsYXRlQnk9ZnVuY3Rpb24odCxlLG4pe20udHJhbnNmb3JtKHQsKGZ1bmN0aW9uKCl7cmV0dXJuIHIodGhpcy5fX3pvb20udHJhbnNsYXRlKCJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuYXBwbHkodGhpcyxhcmd1bWVudHMpOmUsImZ1bmN0aW9uIj09dHlwZW9mIG4/bi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6biksaS5hcHBseSh0aGlzLGFyZ3VtZW50cyksbCl9KSl9LG0udHJhbnNsYXRlVG89ZnVuY3Rpb24odCxlLG4pe20udHJhbnNmb3JtKHQsKGZ1bmN0aW9uKCl7dmFyIHQ9aS5hcHBseSh0aGlzLGFyZ3VtZW50cyksbz10aGlzLl9fem9vbSxhPXkodCk7cmV0dXJuIHIoZHB0LnRyYW5zbGF0ZShhWzBdLGFbMV0pLnNjYWxlKG8uaykudHJhbnNsYXRlKCJmdW5jdGlvbiI9PXR5cGVvZiBlPy1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKTotZSwiZnVuY3Rpb24iPT10eXBlb2Ygbj8tbi5hcHBseSh0aGlzLGFyZ3VtZW50cyk6LW4pLHQsbCl9KSl9LHgucHJvdG90eXBlPXtzdGFydDpmdW5jdGlvbigpe3JldHVybiAxPT0rK3RoaXMuYWN0aXZlJiYodGhpcy5pbmRleD1oLnB1c2godGhpcyktMSx0aGlzLmVtaXQoInN0YXJ0IikpLHRoaXN9LHpvb206ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5tb3VzZSYmIm1vdXNlIiE9PXQmJih0aGlzLm1vdXNlWzFdPWUuaW52ZXJ0KHRoaXMubW91c2VbMF0pKSx0aGlzLnRvdWNoMCYmInRvdWNoIiE9PXQmJih0aGlzLnRvdWNoMFsxXT1lLmludmVydCh0aGlzLnRvdWNoMFswXSkpLHRoaXMudG91Y2gxJiYidG91Y2giIT09dCYmKHRoaXMudG91Y2gxWzFdPWUuaW52ZXJ0KHRoaXMudG91Y2gxWzBdKSksdGhpcy50aGF0Ll9fem9vbT1lLHRoaXMuZW1pdCgiem9vbSIpLHRoaXN9LGVuZDpmdW5jdGlvbigpe3JldHVybiAwPT0tLXRoaXMuYWN0aXZlJiYoaC5zcGxpY2UodGhpcy5pbmRleCwxKSx0aGlzLmluZGV4PS0xLHRoaXMuZW1pdCgiZW5kIikpLHRoaXN9LGVtaXQ6ZnVuY3Rpb24odCl7IShmdW5jdGlvbiBlKHQsbixpLHIpe3ZhciBvPUZjdDt0LnNvdXJjZUV2ZW50PUZjdCxGY3Q9dDt0cnl7cmV0dXJuIG4uYXBwbHkoaSxyKX1maW5hbGx5e0ZjdD1vfX0pKG5ldyBscHQobSx0LHRoaXMudGhhdC5fX3pvb20pLGQuYXBwbHksZCxbdCx0aGlzLnRoYXQsdGhpcy5hcmdzXSl9fSxtLndoZWVsRGVsdGE9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KG89ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpzcHQoK3QpLG0pOm99LG0uZmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPyhuPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3Q6c3B0KCEhdCksbSk6bn0sbS50b3VjaGFibGU9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpzcHQoISF0KSxtKTphfSxtLmV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oaT0iZnVuY3Rpb24iPT10eXBlb2YgdD90OnNwdChbWyt0WzBdWzBdLCt0WzBdWzFdXSxbK3RbMV1bMF0sK3RbMV1bMV1dXSksbSk6aX0sbS5zY2FsZUV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8oc1swXT0rdFswXSxzWzFdPSt0WzFdLG0pOltzWzBdLHNbMV1dfSxtLnRyYW5zbGF0ZUV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8obFswXVswXT0rdFswXVswXSxsWzFdWzBdPSt0WzFdWzBdLGxbMF1bMV09K3RbMF1bMV0sbFsxXVsxXT0rdFsxXVsxXSxtKTpbW2xbMF1bMF0sbFswXVsxXV0sW2xbMV1bMF0sbFsxXVsxXV1dfSxtLmNvbnN0cmFpbj1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8ocj10LG0pOnJ9LG0uZHVyYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGM9K3QsbSk6Y30sbS5pbnRlcnBvbGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gYXJndW1lbnRzLmxlbmd0aD8odT10LG0pOnV9LG0ub249ZnVuY3Rpb24oKXt2YXIgdD1kLm9uLmFwcGx5KGQsYXJndW1lbnRzKTtyZXR1cm4gdD09PWQ/bTp0fSxtLmNsaWNrRGlzdGFuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg/KGY9KHQ9K3QpKnQsbSk6TWF0aC5zcXJ0KGYpfSxtfSx6b29tVHJhbnNmb3JtOnBwdCx6b29tSWRlbnRpdHk6ZHB0fSkpOwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IG1hbnVhbGx5IGFkZCBkMy1zZWxlY3Rpb24tbXVsdGkgdG8gZDMgZGVmYXVsdCBidW5kbGUuIE1vc3Qgb2YgdGhpcyBjb2RlIGlzCiAgICAgKiBjb3BpZWQgZnJvbSBkMy1zZWxlY3Rpb24tbXVsdGlAMS4wLjAuCiAgICAgKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2QzL2QzLXNlbGVjdGlvbi1tdWx0aS9pc3N1ZXMvMTEgZm9yIHdoeSB3ZSBoYXZlIHRvIGRvIHRoaXMKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBabXQ9d3B0LEptdD13cHQ7ZnVuY3Rpb24gUW10KHQsZSl7cmV0dXJuIHQuZWFjaCgoZnVuY3Rpb24oKXt2YXIgdD1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxuPVptdC5zZWxlY3QodGhpcyk7Zm9yKHZhciBpIGluIHQpbi5hdHRyKGksdFtpXSl9KSl9ZnVuY3Rpb24gdGd0KHQsZSl7Zm9yKHZhciBuIGluIGUpdC5hdHRyKG4sZVtuXSk7cmV0dXJuIHR9ZnVuY3Rpb24gZWd0KHQsZSxuKXtyZXR1cm4gdC5lYWNoKChmdW5jdGlvbigpe3ZhciB0PWUuYXBwbHkodGhpcyxhcmd1bWVudHMpLGk9Wm10LnNlbGVjdCh0aGlzKTtmb3IodmFyIHIgaW4gdClpLnN0eWxlKHIsdFtyXSxuKX0pKX1mdW5jdGlvbiBuZ3QodCxlLG4pe2Zvcih2YXIgaSBpbiBlKXQuc3R5bGUoaSxlW2ldLG4pO3JldHVybiB0fWZ1bmN0aW9uIGlndCh0LGUpe3JldHVybiB0LmVhY2goKGZ1bmN0aW9uKCl7dmFyIHQ9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyksbj1abXQuc2VsZWN0KHRoaXMpO2Zvcih2YXIgaSBpbiB0KW4ucHJvcGVydHkoaSx0W2ldKX0pKX1mdW5jdGlvbiByZ3QodCxlKXtmb3IodmFyIG4gaW4gZSl0LnByb3BlcnR5KG4sZVtuXSk7cmV0dXJuIHR9ZnVuY3Rpb24gb2d0KHQsZSl7cmV0dXJuIHQuZWFjaCgoZnVuY3Rpb24oKXt2YXIgbj1lLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxpPVptdC5zZWxlY3QodGhpcykudHJhbnNpdGlvbih0KTtmb3IodmFyIHIgaW4gbilpLmF0dHIocixuW3JdKX0pKX1mdW5jdGlvbiBhZ3QodCxlKXtmb3IodmFyIG4gaW4gZSl0LmF0dHIobixlW25dKTtyZXR1cm4gdH1mdW5jdGlvbiBzZ3QodCxlLG4pe3JldHVybiB0LmVhY2goKGZ1bmN0aW9uKCl7dmFyIGk9ZS5hcHBseSh0aGlzLGFyZ3VtZW50cykscj1abXQuc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24odCk7Zm9yKHZhciBvIGluIGkpci5zdHlsZShvLGlbb10sbil9KSl9ZnVuY3Rpb24gbGd0KHQsZSxuKXtmb3IodmFyIGkgaW4gZSl0LnN0eWxlKGksZVtpXSxuKTtyZXR1cm4gdH1abXQuc2VsZWN0aW9uLnByb3RvdHlwZS5hdHRycz1mdW5jdGlvbiBjZ3QodCl7cmV0dXJuKCJmdW5jdGlvbiI9PXR5cGVvZiB0P1FtdDp0Z3QpKHRoaXMsdCl9LFptdC5zZWxlY3Rpb24ucHJvdG90eXBlLnN0eWxlcz1mdW5jdGlvbiB1Z3QodCxlKXtyZXR1cm4oImZ1bmN0aW9uIj09dHlwZW9mIHQ/ZWd0Om5ndCkodGhpcyx0LG51bGw9PWU/IiI6ZSl9LFptdC5zZWxlY3Rpb24ucHJvdG90eXBlLnByb3BlcnRpZXM9ZnVuY3Rpb24gaGd0KHQpe3JldHVybigiZnVuY3Rpb24iPT10eXBlb2YgdD9pZ3Q6cmd0KSh0aGlzLHQpfSxKbXQudHJhbnNpdGlvbi5wcm90b3R5cGUuYXR0cnM9ZnVuY3Rpb24gZGd0KHQpe3JldHVybigiZnVuY3Rpb24iPT10eXBlb2YgdD9vZ3Q6YWd0KSh0aGlzLHQpfSxKbXQudHJhbnNpdGlvbi5wcm90b3R5cGUuc3R5bGVzPWZ1bmN0aW9uIHBndCh0LGUpe3JldHVybigiZnVuY3Rpb24iPT10eXBlb2YgdD9zZ3Q6bGd0KSh0aGlzLHQsbnVsbD09ZT8iIjplKX07dmFyIGZndD17fSxtZ3Q9e30sZ2d0PU1lKEZtKSxfZ3Q9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KF9ndCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHlndD13cHQ7X2d0LmNvZXJjZUV4dGVybmFsRDM9ZnVuY3Rpb24gdmd0KHQpe2lmKG51bGw9PXQuYXR0cnMpe2lmKG51bGw9PXQubm9kZXMpe3ZhciBlPVtdO3JldHVybiB0LmVhY2goKGZ1bmN0aW9uKCl7ZS5wdXNoKHRoaXMpfSkpLHlndC5zZWxlY3RBbGwoZSl9cmV0dXJuIHlndC5zZWxlY3RBbGwodC5ub2RlcygpKX1yZXR1cm4gdH07dmFyIGJndD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoYmd0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxiZ3QubWFrZUVudW09ZnVuY3Rpb24geGd0KHQpe3JldHVybiB0LnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdFtlXT1lLHR9KSx7fSl9LAovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkobWd0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgd2d0PV9ndCxTZ3Q9e2xpbmVhcjpnZ3QuZWFzZUxpbmVhcixxdWFkOmdndC5lYXNlUXVhZCxxdWFkSW46Z2d0LmVhc2VRdWFkSW4scXVhZE91dDpnZ3QuZWFzZVF1YWRPdXQscXVhZEluT3V0OmdndC5lYXNlUXVhZEluT3V0LGN1YmljOmdndC5lYXNlQ3ViaWMsY3ViaWNJbjpnZ3QuZWFzZUN1YmljSW4sY3ViaWNPdXQ6Z2d0LmVhc2VDdWJpY091dCxjdWJpY0luT3V0OmdndC5lYXNlQ3ViaWNJbk91dCxwb2x5OmdndC5lYXNlUG9seSxwb2x5SW46Z2d0LmVhc2VQb2x5SW4scG9seU91dDpnZ3QuZWFzZVBvbHlPdXQscG9seUluT3V0OmdndC5lYXNlUG9seUluT3V0LHNpbjpnZ3QuZWFzZVNpbixzaW5JbjpnZ3QuZWFzZVNpbkluLHNpbk91dDpnZ3QuZWFzZVNpbk91dCxzaW5Jbk91dDpnZ3QuZWFzZVNpbkluT3V0LGV4cDpnZ3QuZWFzZUV4cCxleHBJbjpnZ3QuZWFzZUV4cEluLGV4cE91dDpnZ3QuZWFzZUV4cE91dCxleHBJbk91dDpnZ3QuZWFzZUV4cEluT3V0LGNpcmNsZTpnZ3QuZWFzZUNpcmNsZSxjaXJjbGVJbjpnZ3QuZWFzZUNpcmNsZUluLGNpcmNsZU91dDpnZ3QuZWFzZUNpcmNsZU91dCxjaXJjbGVJbk91dDpnZ3QuZWFzZUNpcmNsZUluT3V0LGJvdW5jZTpnZ3QuZWFzZUJvdW5jZSxib3VuY2VJbjpnZ3QuZWFzZUJvdW5jZUluLGJvdW5jZU91dDpnZ3QuZWFzZUJvdW5jZU91dCxib3VuY2VJbk91dDpnZ3QuZWFzZUJvdW5jZUluT3V0LGJhY2s6Z2d0LmVhc2VCYWNrLGJhY2tJbjpnZ3QuZWFzZUJhY2tJbixiYWNrT3V0OmdndC5lYXNlQmFja091dCxiYWNrSW5PdXQ6Z2d0LmVhc2VCYWNrSW5PdXQsZWxhc3RpYzpnZ3QuZWFzZUVsYXN0aWMsZWxhc3RpY0luOmdndC5lYXNlRWxhc3RpY0luLGVsYXN0aWNPdXQ6Z2d0LmVhc2VFbGFzdGljT3V0LGVsYXN0aWNJbk91dDpnZ3QuZWFzZUVsYXN0aWNJbk91dH07bWd0LkVhc2VOYW1lPWJndC5tYWtlRW51bShbImxpbmVhciIsInF1YWQiLCJxdWFkSW4iLCJxdWFkT3V0IiwicXVhZEluT3V0IiwiY3ViaWMiLCJjdWJpY0luIiwiY3ViaWNPdXQiLCJjdWJpY0luT3V0IiwicG9seSIsInBvbHlJbiIsInBvbHlPdXQiLCJwb2x5SW5PdXQiLCJzaW4iLCJzaW5JbiIsInNpbk91dCIsInNpbkluT3V0IiwiZXhwIiwiZXhwSW4iLCJleHBPdXQiLCJleHBJbk91dCIsImNpcmNsZSIsImNpcmNsZUluIiwiY2lyY2xlT3V0IiwiY2lyY2xlSW5PdXQiLCJib3VuY2UiLCJib3VuY2VJbiIsImJvdW5jZU91dCIsImJvdW5jZUluT3V0IiwiYmFjayIsImJhY2tJbiIsImJhY2tPdXQiLCJiYWNrSW5PdXQiLCJlbGFzdGljIiwiZWxhc3RpY0luIiwiZWxhc3RpY091dCIsImVsYXN0aWNJbk91dCJdKTt2YXIgTWd0PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLl9zdGFydERlbGF5PXQuX0RFRkFVTFRfU1RBUlRfREVMQVlfTUlMTElTRUNPTkRTLHRoaXMuX3N0ZXBEdXJhdGlvbj10Ll9ERUZBVUxUX1NURVBfRFVSQVRJT05fTUlMTElTRUNPTkRTLHRoaXMuX3N0ZXBEZWxheT10Ll9ERUZBVUxUX0lURVJBVElWRV9ERUxBWV9NSUxMSVNFQ09ORFMsdGhpcy5fbWF4VG90YWxEdXJhdGlvbj10Ll9ERUZBVUxUX01BWF9UT1RBTF9EVVJBVElPTl9NSUxMSVNFQ09ORFMsdGhpcy5fZWFzaW5nTW9kZT10Ll9ERUZBVUxUX0VBU0lOR19NT0RFfXJldHVybiB0LnByb3RvdHlwZS50b3RhbFRpbWU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZ2V0QWRqdXN0ZWRJdGVyYXRpdmVEZWxheSh0KTtyZXR1cm4gdGhpcy5zdGFydERlbGF5KCkrZSpNYXRoLm1heCh0LTEsMCkrdGhpcy5zdGVwRHVyYXRpb24oKX0sdC5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMsaT0odD13Z3QuY29lcmNlRXh0ZXJuYWxEMyh0KSkuc2l6ZSgpLHI9dGhpcy5fZ2V0QWRqdXN0ZWRJdGVyYXRpdmVEZWxheShpKTtyZXR1cm4gdC50cmFuc2l0aW9uKCkuZWFzZSh0aGlzLl9nZXRFYXNlRmFjdG9yeSgpKS5kdXJhdGlvbih0aGlzLnN0ZXBEdXJhdGlvbigpKS5kZWxheSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gbi5zdGFydERlbGF5KCkrciplfSkpLmF0dHJzKGUpfSx0LnByb3RvdHlwZS5zdGFydERlbGF5PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX3N0YXJ0RGVsYXk6KHRoaXMuX3N0YXJ0RGVsYXk9dCx0aGlzKX0sdC5wcm90b3R5cGUuc3RlcER1cmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P01hdGgubWluKHRoaXMuX3N0ZXBEdXJhdGlvbix0aGlzLl9tYXhUb3RhbER1cmF0aW9uKToodGhpcy5fc3RlcER1cmF0aW9uPXQsdGhpcyl9LHQucHJvdG90eXBlLnN0ZXBEZWxheT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9zdGVwRGVsYXk6KHRoaXMuX3N0ZXBEZWxheT10LHRoaXMpfSx0LnByb3RvdHlwZS5tYXhUb3RhbER1cmF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX21heFRvdGFsRHVyYXRpb246KHRoaXMuX21heFRvdGFsRHVyYXRpb249dCx0aGlzKX0sdC5wcm90b3R5cGUuZWFzaW5nTW9kZT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9lYXNpbmdNb2RlOih0aGlzLl9lYXNpbmdNb2RlPXQsdGhpcyl9LHQucHJvdG90eXBlLl9nZXRFYXNlRmFjdG9yeT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZWFzaW5nTW9kZSgpO2lmKCJzdHJpbmciPT10eXBlb2YgdCl7dmFyIGU9U2d0W3RdO3JldHVybiBudWxsPT1lP1NndC5saW5lYXI6ZX1yZXR1cm4gdH0sdC5wcm90b3R5cGUuX2dldEFkanVzdGVkSXRlcmF0aXZlRGVsYXk9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5tYXhUb3RhbER1cmF0aW9uKCktdGhpcy5zdGVwRHVyYXRpb24oKSxuPShlPU1hdGgubWF4KGUsMCkpL01hdGgubWF4KHQtMSwxKTtyZXR1cm4gTWF0aC5taW4odGhpcy5zdGVwRGVsYXkoKSxuKX0sdC5fREVGQVVMVF9TVEFSVF9ERUxBWV9NSUxMSVNFQ09ORFM9MCx0Ll9ERUZBVUxUX1NURVBfRFVSQVRJT05fTUlMTElTRUNPTkRTPTMwMCx0Ll9ERUZBVUxUX0lURVJBVElWRV9ERUxBWV9NSUxMSVNFQ09ORFM9MTUsdC5fREVGQVVMVF9NQVhfVE9UQUxfRFVSQVRJT05fTUlMTElTRUNPTkRTPTEvMCx0Ll9ERUZBVUxUX0VBU0lOR19NT0RFPSJleHBPdXQiLHR9KSgpO21ndC5FYXNpbmc9TWd0O3ZhciBFZ3Q9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KEVndCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIFRndD1fZ3QsQ2d0PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLnRvdGFsVGltZT1mdW5jdGlvbih0KXtyZXR1cm4gMH0sdC5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbih0LGUpe3JldHVybih0PVRndC5jb2VyY2VFeHRlcm5hbEQzKHQpKS5hdHRycyhlKX0sdH0pKCk7RWd0Lk51bGw9Q2d0LChmdW5jdGlvbih0KXsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBlPUJPO2UuX19leHBvcnRTdGFyKG1ndCx0KSxlLl9fZXhwb3J0U3RhcihFZ3QsdCl9KShmZ3QpO3ZhciBBZ3Q9e30sa2d0PXt9LExndD17fSxQZ3Q9e30sTmd0PXt9LElndD17fSxSZ3Q9e30sT2d0PXt9LHpndD17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoemd0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgRGd0PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5jYWNoZT17fSx0aGlzLmNvbXB1dGU9dH1yZXR1cm4gdC5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNhY2hlLmhhc093blByb3BlcnR5KHQpfHwodGhpcy5jYWNoZVt0XT10aGlzLmNvbXB1dGUodCkpLHRoaXMuY2FjaGVbdF19LHQucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2FjaGU9e30sdGhpc30sdH0pKCk7emd0LkNhY2hlPURndDt2YXIgQmd0PXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShCZ3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBIZ3Q9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5hcnJheUVxPWZ1bmN0aW9uKHQsZSl7aWYobnVsbD09dHx8bnVsbD09ZSlyZXR1cm4gdD09PWU7aWYodC5sZW5ndGghPT1lLmxlbmd0aClyZXR1cm4hMTtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKylpZih0W25dIT09ZVtuXSlyZXR1cm4hMTtyZXR1cm4hMH0sdC5vYmpFcT1mdW5jdGlvbihlLG4pe2lmKG51bGw9PWV8fG51bGw9PW4pcmV0dXJuIGU9PT1uO3ZhciBpPU9iamVjdC5rZXlzKGUpLnNvcnQoKSxyPU9iamVjdC5rZXlzKG4pLnNvcnQoKSxvPWkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gZVt0XX0pKSxhPXIubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gblt0XX0pKTtyZXR1cm4gdC5hcnJheUVxKGkscikmJnQuYXJyYXlFcShvLGEpfSx0LnN0cmljdEVxPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQ9PT1lfSx0LmRlZmF1bHRzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyllW24tMV09YXJndW1lbnRzW25dO2lmKG51bGw9PXQpdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Iik7dmFyIGk9T2JqZWN0KHQpO3JldHVybiBlLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lmKG51bGwhPXQpZm9yKHZhciBlIGluIHQpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSkmJihpW2VdPXRbZV0pfSkpLGl9LHR9KSgpO0JndC5NZXRob2RzPUhndDt2YXIgRmd0PXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShGZ3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBWZ3Q9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5jb21iaW5lV2hpdGVzcGFjZT1mdW5jdGlvbih0KXtyZXR1cm4gdC5yZXBsYWNlKC9bIFx0XSsvZywiICIpfSx0LmlzTm90RW1wdHlTdHJpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIHQmJiIiIT09dC50cmltKCl9LHQudHJpbVN0YXJ0PWZ1bmN0aW9uKGUsbil7aWYoIWUpcmV0dXJuIGU7dmFyIGk9ZS5zcGxpdCgiIikscj1uP2Z1bmN0aW9uKGUpe3JldHVybiBlLnNwbGl0KG4pLnNvbWUodC5pc05vdEVtcHR5U3RyaW5nKX06dC5pc05vdEVtcHR5U3RyaW5nO3JldHVybiBpLnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gcih0K2UpP3QrZTp0fSksIiIpfSx0LnRyaW1FbmQ9ZnVuY3Rpb24oZSxuKXtpZighZSlyZXR1cm4gZTt2YXIgaT1lLnNwbGl0KCIiKTtyZXR1cm4gaS5yZXZlcnNlKCksKGk9dC50cmltU3RhcnQoaS5qb2luKCIiKSxuKS5zcGxpdCgiIikpLnJldmVyc2UoKSxpLmpvaW4oIiIpfSx0fSkoKTtGZ3QuU3RyaW5nTWV0aG9kcz1WZ3Q7dmFyIFVndD17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoVWd0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgamd0PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLldvcmREaXZpZGVyUmVnRXhwPW5ldyBSZWdFeHAoIlxcVyIpLHRoaXMuV2hpdGVzcGFjZVJlZ0V4cD1uZXcgUmVnRXhwKCJcXHMiKX1yZXR1cm4gdC5wcm90b3R5cGUudG9rZW5pemU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztyZXR1cm4gdC5zcGxpdCgiIikucmVkdWNlKChmdW5jdGlvbih0LG4pe3JldHVybiB0LnNsaWNlKDAsLTEpLmNvbmNhdChlLnNob3VsZENyZWF0ZU5ld1Rva2VuKHRbdC5sZW5ndGgtMV0sbikpfSksWyIiXSl9LHQucHJvdG90eXBlLnNob3VsZENyZWF0ZU5ld1Rva2VuPWZ1bmN0aW9uKHQsZSl7aWYoIXQpcmV0dXJuW2VdO3ZhciBuPXRbdC5sZW5ndGgtMV07cmV0dXJuIHRoaXMuV2hpdGVzcGFjZVJlZ0V4cC50ZXN0KG4pJiZ0aGlzLldoaXRlc3BhY2VSZWdFeHAudGVzdChlKT9bdCtlXTp0aGlzLldoaXRlc3BhY2VSZWdFeHAudGVzdChuKXx8dGhpcy5XaGl0ZXNwYWNlUmVnRXhwLnRlc3QoZSk/W3QsZV06dGhpcy5Xb3JkRGl2aWRlclJlZ0V4cC50ZXN0KG4pP249PT1lP1t0K2VdOlt0LGVdOlt0K2VdfSx0fSkoKTtVZ3QuVG9rZW5pemVyPWpndCwoZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXtmb3IodmFyIG4gaW4gZSl0Lmhhc093blByb3BlcnR5KG4pfHwodFtuXT1lW25dKX1PYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksZSh6Z3QpLGUoQmd0KSxlKEZndCksZShVZ3QpfSkoT2d0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoUmd0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgR2d0PU9ndCxXZ3Q9e3RleHRSb3RhdGlvbjowLHRleHRTaGVhcjowLHhBbGlnbjoibGVmdCIseUFsaWduOiJ0b3AifSxxZ3Q9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dGhpcy5fbWVhc3VyZXI9dCx0aGlzLl9wZW5GYWN0b3J5PWUsdGhpcy5fd3JhcHBlcj1ufXJldHVybiB0LnByb3RvdHlwZS5tZWFzdXJlcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbWVhc3VyZXI9dCx0aGlzfSx0LnByb3RvdHlwZS53cmFwcGVyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl93cmFwcGVyPXQsdGhpc30sdC5wcm90b3R5cGUucGVuRmFjdG9yeT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGVuRmFjdG9yeT10LHRoaXN9LHQucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKGUsbixpLHIsbyl7aWYodm9pZCAwPT09ciYmKHI9e30pLHI9R2d0Lk1ldGhvZHMuZGVmYXVsdHMoe30sV2d0LHIpLC0xPT09dC5TdXBwb3J0ZWRSb3RhdGlvbi5pbmRleE9mKHIudGV4dFJvdGF0aW9uKSl0aHJvdyBuZXcgRXJyb3IoInVuc3VwcG9ydGVkIHJvdGF0aW9uIC0gIityLnRleHRSb3RhdGlvbisiLiBTdXBwb3J0ZWQgcm90YXRpb25zIGFyZSAiK3QuU3VwcG9ydGVkUm90YXRpb24uam9pbigiLCAiKSk7aWYobnVsbCE9ci50ZXh0U2hlYXImJnIudGV4dFNoZWFyPC04MHx8ci50ZXh0U2hlYXI+ODApdGhyb3cgbmV3IEVycm9yKCJ1bnN1cHBvcnRlZCBzaGVhciBhbmdsZSAtICIrci50ZXh0U2hlYXIrIi4gTXVzdCBiZSBiZXR3ZWVuIC04MCBhbmQgODAiKTt2YXIgYT1NYXRoLmFicyhNYXRoLmFicyhyLnRleHRSb3RhdGlvbiktOTApPjQ1LHM9YT9uOmksbD1hP2k6bixjPXIudGV4dFNoZWFyLHU9YypNYXRoLlBJLzE4MCxoPXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQsZD1oKk1hdGgudGFuKHUpLHA9cy9NYXRoLmNvcyh1KS1NYXRoLmFicyhkKSxmPWwqTWF0aC5jb3ModSksbT1HZ3QuU3RyaW5nTWV0aG9kcy5jb21iaW5lV2hpdGVzcGFjZShlKSxnPSh0aGlzLl93cmFwcGVyP3RoaXMuX3dyYXBwZXIud3JhcChtLHRoaXMuX21lYXN1cmVyLHAsZikud3JhcHBlZFRleHQ6bSkuc3BsaXQoIlxuIiksXz10LlhPZmZzZXRGYWN0b3Jbci54QWxpZ25dKnAqTWF0aC5zaW4odSktdC5ZT2Zmc2V0RmFjdG9yW3IueUFsaWduXSooZi1nLmxlbmd0aCpoKSx5PVswLDBdLHY9ci50ZXh0Um90YXRpb24rYztzd2l0Y2goci50ZXh0Um90YXRpb24pe2Nhc2UgOTA6eT1bbitfLDBdO2JyZWFrO2Nhc2UtOTA6eT1bLV8saV07YnJlYWs7Y2FzZSAxODA6eT1bbixpK19dO2JyZWFrO2RlZmF1bHQ6eT1bMCwtX119dmFyIGI9dGhpcy5fcGVuRmFjdG9yeS5jcmVhdGVQZW4oZSx7dHJhbnNsYXRlOnkscm90YXRlOnZ9LG8pO3RoaXMud3JpdGVMaW5lcyhnLGIscCxoLGQsci54QWxpZ24pLG51bGwhPWIuZGVzdHJveSYmYi5kZXN0cm95KCl9LHQucHJvdG90eXBlLndyaXRlTGluZXM9ZnVuY3Rpb24odCxlLG4saSxyLG8pe3QuZm9yRWFjaCgoZnVuY3Rpb24odCxhKXtlLndyaXRlKHQsbixvLHI+MD8oYSsxKSpyOmEqciwoYSsxKSppKX0pKX0sdH0pKCk7cWd0LlhPZmZzZXRGYWN0b3I9e2NlbnRlcjouNSxsZWZ0OjAscmlnaHQ6MX0scWd0LllPZmZzZXRGYWN0b3I9e2JvdHRvbToxLGNlbnRlcjouNSx0b3A6MH0scWd0LlN1cHBvcnRlZFJvdGF0aW9uPVstOTAsMCwxODAsOTBdLFJndC5Xcml0ZXI9cWd0LChmdW5jdGlvbih0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksKGZ1bmN0aW9uIGUobil7Zm9yKHZhciBpIGluIG4pdC5oYXNPd25Qcm9wZXJ0eShpKXx8KHRbaV09bltpXSl9KShSZ3QpfSkoSWd0KTt2YXIgWWd0PXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShZZ3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBYZ3Q9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe31yZXR1cm4gdC5hcHBlbmQ9ZnVuY3Rpb24oZSxuKXtmb3IodmFyIGk9W10scj0yO3I8YXJndW1lbnRzLmxlbmd0aDtyKyspaVtyLTJdPWFyZ3VtZW50c1tyXTt2YXIgbz10LmNyZWF0ZS5hcHBseSh0LFtuXS5jb25jYXQoaSkpO3JldHVybiBlLmFwcGVuZENoaWxkKG8pLG99LHQuY3JlYXRlPWZ1bmN0aW9uKGUpe2Zvcih2YXIgbj1bXSxpPTE7aTxhcmd1bWVudHMubGVuZ3RoO2krKyluW2ktMV09YXJndW1lbnRzW2ldO3ZhciByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZSk7cmV0dXJuIHQuYWRkQ2xhc3Nlcy5hcHBseSh0LFtyXS5jb25jYXQobikpLHJ9LHQuYWRkQ2xhc3Nlcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9W10sbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspZVtuLTFdPWFyZ3VtZW50c1tuXTtlPWUuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dH0pKSxudWxsIT10LmNsYXNzTGlzdD9lLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuY2xhc3NMaXN0LmFkZChlKX0pKTp0LnNldEF0dHJpYnV0ZSgiY2xhc3MiLGUuam9pbigiICIpKX0sdC5nZXREaW1lbnNpb25zPWZ1bmN0aW9uKHQpe2lmKHQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KXRyeXt2YXIgZT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybnt3aWR0aDplLndpZHRoLGhlaWdodDplLmhlaWdodH19Y2F0Y2godCl7fXJldHVybntoZWlnaHQ6MCx3aWR0aDowfX0sdH0pKCk7WWd0Lkh0bWxVdGlscz1YZ3Q7dmFyICRndD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuKXt2b2lkIDA9PT1uJiYobj0hMSk7dmFyIGk9dGhpczt0aGlzLmVsZW1lbnQ9dCx0aGlzLmNsYXNzTmFtZT1lLHRoaXMuYWRkVGl0bGU9bix0aGlzLmNyZWF0ZVJ1bGVyPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciBlPVhndC5hcHBlbmQoaS5lbGVtZW50LCJzcGFuIiwidGV4dC10bXAiLGkuY2xhc3NOYW1lKTtlLnRleHRDb250ZW50PXQ7dmFyIG49WGd0LmdldERpbWVuc2lvbnMoZSk7cmV0dXJuIGkuZWxlbWVudC5yZW1vdmVDaGlsZChlKSxufX0sdGhpcy5jcmVhdGVQZW49ZnVuY3Rpb24odCxlLG4pe251bGw9PW4mJihuPWkuZWxlbWVudCk7dmFyIHI9WGd0LmFwcGVuZChuLCJkaXYiLCJ0ZXh0LWJsb2NrIixpLmNsYXNzTmFtZSk7cmV0dXJuIHIuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIixyLnN0eWxlLnRyYW5zZm9ybT0idHJhbnNsYXRlKDAsIC0xZW0pIHRyYW5zbGF0ZSgiK2UudHJhbnNsYXRlWzBdKyJweCwgIitlLnRyYW5zbGF0ZVsxXSsicHgpIHJvdGF0ZSgiK2Uucm90YXRlKyJkZWcpIixyLnN0eWxlLnRyYW5zZm9ybU9yaWdpbj0iMCAxLjJlbSIsaS5hZGRUaXRsZSYmci5zZXRBdHRyaWJ1dGUoInRpdGxlIix0KSxpLmNyZWF0ZUh0bWxMaW5lUGVuKHIpfX1yZXR1cm4gdC5wcm90b3R5cGUuc2V0QWRkVGl0bGU9ZnVuY3Rpb24odCl7dGhpcy5hZGRUaXRsZT10fSx0LnByb3RvdHlwZS5jcmVhdGVIdG1sTGluZVBlbj1mdW5jdGlvbih0KXtyZXR1cm57d3JpdGU6ZnVuY3Rpb24oZSxuLGkscixvKXt2YXIgYT1YZ3QuYXBwZW5kKHQsImRpdiIsInRleHQtbGluZSIpO2EudGV4dENvbnRlbnQ9ZSxhLnN0eWxlLndpZHRoPW4rInB4IixhLnN0eWxlLnRleHRBbGlnbj1pLGEuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixhLnN0eWxlLndoaXRlU3BhY2U9Im5vd3JhcCIsYS5zdHlsZS50b3A9bysicHgiLGEuc3R5bGUubGVmdD1yKyJweCJ9fX0sdH0pKCk7WWd0Lkh0bWxDb250ZXh0PSRndCxPYmplY3QuZGVmaW5lUHJvcGVydHkoTmd0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgS2d0PUlndCxaZ3Q9WWd0LEpndD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LmFwcGVuZD1mdW5jdGlvbihlLG4pe2Zvcih2YXIgaT1bXSxyPTI7cjxhcmd1bWVudHMubGVuZ3RoO3IrKylpW3ItMl09YXJndW1lbnRzW3JdO3ZhciBvPXQuY3JlYXRlLmFwcGx5KHQsW25dLmNvbmNhdChpKSk7cmV0dXJuIGUuYXBwZW5kQ2hpbGQobyksb30sdC5jcmVhdGU9ZnVuY3Rpb24oZSl7Zm9yKHZhciBuPVtdLGk9MTtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKW5baS0xXT1hcmd1bWVudHNbaV07dmFyIHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHQuU1ZHX05TLGUpO3JldHVybiBaZ3QuSHRtbFV0aWxzLmFkZENsYXNzZXMuYXBwbHkoWmd0Lkh0bWxVdGlscyxbcl0uY29uY2F0KG4pKSxyfSx0LmdldERpbWVuc2lvbnM9ZnVuY3Rpb24odCl7aWYodC5nZXRCQm94KXRyeXt2YXIgZT10LmdldEJCb3goKTtyZXR1cm57d2lkdGg6ZS53aWR0aCxoZWlnaHQ6ZS5oZWlnaHR9fWNhdGNoKHQpe31yZXR1cm57aGVpZ2h0OjAsd2lkdGg6MH19LHR9KSgpO0pndC5TVkdfTlM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixOZ3QuU3ZnVXRpbHM9Smd0O3ZhciBRZ3Q9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dm9pZCAwPT09biYmKG49ITEpO3ZhciBpPXRoaXM7dGhpcy5lbGVtZW50PXQsdGhpcy5jbGFzc05hbWU9ZSx0aGlzLmFkZFRpdGxlRWxlbWVudD1uLHRoaXMuY3JlYXRlUnVsZXI9ZnVuY3Rpb24oKXt2YXIgdD1pLmdldFRleHRFbGVtZW50cyhpLmVsZW1lbnQpLGU9dC5wYXJlbnRFbGVtZW50LG49dC5jb250YWluZXJFbGVtZW50LHI9dC50ZXh0RWxlbWVudDtyZXR1cm4gZnVuY3Rpb24odCl7ZS5hcHBlbmRDaGlsZChuKSxyLnRleHRDb250ZW50PXQ7dmFyIGk9Smd0LmdldERpbWVuc2lvbnMocik7cmV0dXJuIGUucmVtb3ZlQ2hpbGQobiksaX19LHRoaXMuY3JlYXRlUGVuPWZ1bmN0aW9uKHQsZSxuKXtudWxsPT1uJiYobj1pLmVsZW1lbnQpO3ZhciByPUpndC5hcHBlbmQobiwiZyIsInRleHQtY29udGFpbmVyIixpLmNsYXNzTmFtZSk7aS5hZGRUaXRsZUVsZW1lbnQmJihKZ3QuYXBwZW5kKHIsInRpdGxlIikudGV4dENvbnRlbnQ9dCxyLnNldEF0dHJpYnV0ZSgidGl0bGUiLHQpKTt2YXIgbz1KZ3QuYXBwZW5kKHIsImciLCJ0ZXh0LWFyZWEiKTtyZXR1cm4gby5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK2UudHJhbnNsYXRlWzBdKyIsIitlLnRyYW5zbGF0ZVsxXSsiKXJvdGF0ZSgiK2Uucm90YXRlKyIpIiksaS5jcmVhdGVTdmdMaW5lUGVuKG8pfX1yZXR1cm4gdC5wcm90b3R5cGUuc2V0QWRkVGl0bGVFbGVtZW50PWZ1bmN0aW9uKHQpe3RoaXMuYWRkVGl0bGVFbGVtZW50PXR9LHQucHJvdG90eXBlLmNyZWF0ZVN2Z0xpbmVQZW49ZnVuY3Rpb24oZSl7cmV0dXJue3dyaXRlOmZ1bmN0aW9uKG4saSxyLG8sYSl7bys9aSpLZ3QuV3JpdGVyLlhPZmZzZXRGYWN0b3Jbcl07dmFyIHM9Smd0LmFwcGVuZChlLCJ0ZXh0IiwidGV4dC1saW5lIik7cy50ZXh0Q29udGVudD1uLHMuc2V0QXR0cmlidXRlKCJ0ZXh0LWFuY2hvciIsdC5BbmNob3JNYXBbcl0pLHMuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitvKyIsIithKyIpIikscy5zZXRBdHRyaWJ1dGUoInkiLCItMC4yNWVtIil9fX0sdC5wcm90b3R5cGUuZ2V0VGV4dEVsZW1lbnRzPWZ1bmN0aW9uKHQpe2lmKCJ0ZXh0Ij09PXQudGFnTmFtZSlyZXR1cm4gbnVsbD09KGU9dC5wYXJlbnRFbGVtZW50KSYmKGU9dC5wYXJlbnROb2RlKSxlLnJlbW92ZUNoaWxkKHQpLHtjb250YWluZXJFbGVtZW50OnQscGFyZW50RWxlbWVudDplLHRleHRFbGVtZW50OnR9O3ZhciBlLG49dC5xdWVyeVNlbGVjdG9yKCJ0ZXh0Iik7aWYobnVsbCE9bilyZXR1cm4gbnVsbD09KGU9bi5wYXJlbnRFbGVtZW50KSYmKGU9bi5wYXJlbnROb2RlKSxlLnJlbW92ZUNoaWxkKG4pLHtjb250YWluZXJFbGVtZW50Om4scGFyZW50RWxlbWVudDplLHRleHRFbGVtZW50Om59O3ZhciBpPUpndC5jcmVhdGUoInRleHQiLHRoaXMuY2xhc3NOYW1lKTtyZXR1cm57Y29udGFpbmVyRWxlbWVudDppLHBhcmVudEVsZW1lbnQ6dCx0ZXh0RWxlbWVudDppfX0sdH0pKCk7UWd0LkFuY2hvck1hcD17Y2VudGVyOiJtaWRkbGUiLGxlZnQ6InN0YXJ0IixyaWdodDoiZW5kIn0sTmd0LlN2Z0NvbnRleHQ9UWd0O3ZhciB0X3Q9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KHRfdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGVfdD1JZ3Qsbl90PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlLG4pe3ZvaWQgMD09PWUmJihlPTEwKSx2b2lkIDA9PT1uJiYobj17fSk7dmFyIGk9dGhpczt0aGlzLmN0eD10LHRoaXMubGluZUhlaWdodD1lLHRoaXMuc3R5bGU9bix0aGlzLmNyZWF0ZVJ1bGVyPWZ1bmN0aW9uKCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBpLmN0eC5mb250PWkuc3R5bGUuZm9udCx7d2lkdGg6aS5jdHgubWVhc3VyZVRleHQodCkud2lkdGgsaGVpZ2h0OmkubGluZUhlaWdodH19fSx0aGlzLmNyZWF0ZVBlbj1mdW5jdGlvbih0LGUsbil7cmV0dXJuIG51bGw9PW4mJihuPWkuY3R4KSxuLnNhdmUoKSxuLnRyYW5zbGF0ZShlLnRyYW5zbGF0ZVswXSxlLnRyYW5zbGF0ZVsxXSksbi5yb3RhdGUoZS5yb3RhdGUqTWF0aC5QSS8xODApLGkuY3JlYXRlQ2FudmFzUGVuKG4pfSx2b2lkIDA9PT10aGlzLnN0eWxlLmZpbGwmJih0aGlzLnN0eWxlLmZpbGw9IiM0NDQiKX1yZXR1cm4gdC5wcm90b3R5cGUuY3JlYXRlQ2FudmFzUGVuPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7cmV0dXJue2Rlc3Ryb3k6ZnVuY3Rpb24oKXt0LnJlc3RvcmUoKX0sd3JpdGU6ZnVuY3Rpb24obixpLHIsbyxhKXtvKz1pKmVfdC5Xcml0ZXIuWE9mZnNldEZhY3RvcltyXSx0LnRleHRBbGlnbj1yLG51bGwhPWUuc3R5bGUuZm9udCYmKHQuZm9udD1lLnN0eWxlLmZvbnQpLG51bGwhPWUuc3R5bGUuZmlsbCYmKHQuZmlsbFN0eWxlPWUuc3R5bGUuZmlsbCx0LmZpbGxUZXh0KG4sbyxhKSksbnVsbCE9ZS5zdHlsZS5zdHJva2UmJih0LnN0cm9rZVN0eWxlPWUuc3R5bGUuZmlsbCx0LnN0cm9rZVRleHQobixvLGEpKX19fSx0fSkoKTt0X3QuQ2FudmFzQ29udGV4dD1uX3QsKGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7Zm9yKHZhciBuIGluIGUpdC5oYXNPd25Qcm9wZXJ0eShuKXx8KHRbbl09ZVtuXSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUoTmd0KSxlKHRfdCksZShZZ3QpfSkoUGd0KTt2YXIgaV90PXt9LHJfdD17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkocl90LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgb190PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCl7dGhpcy5ydWxlcj1udWxsIT10LmNyZWF0ZVJ1bGVyP3QuY3JlYXRlUnVsZXIoKTp0fXJldHVybiB0LnByb3RvdHlwZS5tZWFzdXJlPWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lJiYoZT10LkhFSUdIVF9URVhUKSx0aGlzLnJ1bGVyKGUpfSx0fSkoKTtvX3QuSEVJR0hUX1RFWFQ9ImJkcHFsIixyX3QuQWJzdHJhY3RNZWFzdXJlcj1vX3Q7dmFyIGFfdD17fSxzX3Q9e30sbF90PXt9LGNfdD1TZSYmU2UuX19leHRlbmRzfHwoZnVuY3Rpb24oKXt2YXIgdD1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX07cmV0dXJuIGZ1bmN0aW9uKGUsbil7ZnVuY3Rpb24gaSgpe3RoaXMuY29uc3RydWN0b3I9ZX10KGUsbiksZS5wcm90b3R5cGU9bnVsbD09PW4/T2JqZWN0LmNyZWF0ZShuKTooaS5wcm90b3R5cGU9bi5wcm90b3R5cGUsbmV3IGkpfX0pKCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGxfdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHVfdD1yX3QsaF90PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUsbil7dm9pZCAwPT09biYmKG49ITEpO3ZhciBpPXQuY2FsbCh0aGlzLGUpfHx0aGlzO3JldHVybiBpLnVzZUd1YXJkcz1uLGl9cmV0dXJuIGNfdChlLHQpLGUucHJvdG90eXBlLl9hZGRHdWFyZHM9ZnVuY3Rpb24odCl7cmV0dXJuIHVfdC5BYnN0cmFjdE1lYXN1cmVyLkhFSUdIVF9URVhUK3QrdV90LkFic3RyYWN0TWVhc3VyZXIuSEVJR0hUX1RFWFR9LGUucHJvdG90eXBlLl9tZWFzdXJlTGluZT1mdW5jdGlvbihlLG4pe3ZvaWQgMD09PW4mJihuPSExKTt2YXIgaT10aGlzLnVzZUd1YXJkc3x8bnx8L15bXHQgXSQvLnRlc3QoZSkscj1pP3RoaXMuX2FkZEd1YXJkcyhlKTplLG89dC5wcm90b3R5cGUubWVhc3VyZS5jYWxsKHRoaXMscik7cmV0dXJuIG8ud2lkdGgtPWk/Mip0aGlzLmdldEd1YXJkV2lkdGgoKTowLG99LGUucHJvdG90eXBlLm1lYXN1cmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZih2b2lkIDA9PT10JiYodD11X3QuQWJzdHJhY3RNZWFzdXJlci5IRUlHSFRfVEVYVCksIiI9PT10LnRyaW0oKSlyZXR1cm57d2lkdGg6MCxoZWlnaHQ6MH07dmFyIG49dC50cmltKCkuc3BsaXQoIlxuIikubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gZS5fbWVhc3VyZUxpbmUodCl9KSk7cmV0dXJue2hlaWdodDpuLnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCtlLmhlaWdodH0pLDApLHdpZHRoOm4ucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiBNYXRoLm1heCh0LGUud2lkdGgpfSksMCl9fSxlLnByb3RvdHlwZS5nZXRHdWFyZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PXRoaXMuZ3VhcmRXaWR0aCYmKHRoaXMuZ3VhcmRXaWR0aD10LnByb3RvdHlwZS5tZWFzdXJlLmNhbGwodGhpcykud2lkdGgpLHRoaXMuZ3VhcmRXaWR0aH0sZX0pKHVfdC5BYnN0cmFjdE1lYXN1cmVyKTtsX3QuTWVhc3VyZXI9aF90O3ZhciBkX3Q9U2UmJlNlLl9fZXh0ZW5kc3x8KGZ1bmN0aW9uKCl7dmFyIHQ9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9O3JldHVybiBmdW5jdGlvbihlLG4pe2Z1bmN0aW9uIGkoKXt0aGlzLmNvbnN0cnVjdG9yPWV9dChlLG4pLGUucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KGkucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyBpKX19KSgpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShzX3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBwX3Q9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBkX3QoZSx0KSxlLnByb3RvdHlwZS5fbWVhc3VyZUNoYXJhY3Rlcj1mdW5jdGlvbihlKXtyZXR1cm4gdC5wcm90b3R5cGUuX21lYXN1cmVMaW5lLmNhbGwodGhpcyxlKX0sZS5wcm90b3R5cGUuX21lYXN1cmVMaW5lPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10LnNwbGl0KCIiKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9tZWFzdXJlQ2hhcmFjdGVyKHQpfSkpO3JldHVybntoZWlnaHQ6bi5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGgubWF4KHQsZS5oZWlnaHQpfSksMCksd2lkdGg6bi5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrZS53aWR0aH0pLDApfX0sZX0pKGxfdC5NZWFzdXJlcik7c190LkNoYXJhY3Rlck1lYXN1cmVyPXBfdDt2YXIgZl90PVNlJiZTZS5fX2V4dGVuZHN8fChmdW5jdGlvbigpe3ZhciB0PU9iamVjdC5zZXRQcm90b3R5cGVPZnx8e19fcHJvdG9fXzpbXX1pbnN0YW5jZW9mIEFycmF5JiZmdW5jdGlvbih0LGUpe3QuX19wcm90b19fPWV9fHxmdW5jdGlvbih0LGUpe2Zvcih2YXIgbiBpbiBlKWUuaGFzT3duUHJvcGVydHkobikmJih0W25dPWVbbl0pfTtyZXR1cm4gZnVuY3Rpb24oZSxuKXtmdW5jdGlvbiBpKCl7dGhpcy5jb25zdHJ1Y3Rvcj1lfXQoZSxuKSxlLnByb3RvdHlwZT1udWxsPT09bj9PYmplY3QuY3JlYXRlKG4pOihpLnByb3RvdHlwZT1uLnByb3RvdHlwZSxuZXcgaSl9fSkoKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYV90LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbV90PU9ndCxnX3Q9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXt2YXIgaT10LmNhbGwodGhpcyxlLG4pfHx0aGlzO3JldHVybiBpLmNhY2hlPW5ldyBtX3QuQ2FjaGUoKGZ1bmN0aW9uKHQpe3JldHVybiBpLl9tZWFzdXJlQ2hhcmFjdGVyTm90RnJvbUNhY2hlKHQpfSkpLGl9cmV0dXJuIGZfdChlLHQpLGUucHJvdG90eXBlLl9tZWFzdXJlQ2hhcmFjdGVyTm90RnJvbUNhY2hlPWZ1bmN0aW9uKGUpe3JldHVybiB0LnByb3RvdHlwZS5fbWVhc3VyZUNoYXJhY3Rlci5jYWxsKHRoaXMsZSl9LGUucHJvdG90eXBlLl9tZWFzdXJlQ2hhcmFjdGVyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmNhY2hlLmdldCh0KX0sZS5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLmNhY2hlLmNsZWFyKCl9LGV9KShzX3QuQ2hhcmFjdGVyTWVhc3VyZXIpO2FfdC5DYWNoZUNoYXJhY3Rlck1lYXN1cmVyPWdfdDt2YXIgX190PXt9LHlfdD1TZSYmU2UuX19leHRlbmRzfHwoZnVuY3Rpb24oKXt2YXIgdD1PYmplY3Quc2V0UHJvdG90eXBlT2Z8fHtfX3Byb3RvX186W119aW5zdGFuY2VvZiBBcnJheSYmZnVuY3Rpb24odCxlKXt0Ll9fcHJvdG9fXz1lfXx8ZnVuY3Rpb24odCxlKXtmb3IodmFyIG4gaW4gZSllLmhhc093blByb3BlcnR5KG4pJiYodFtuXT1lW25dKX07cmV0dXJuIGZ1bmN0aW9uKGUsbil7ZnVuY3Rpb24gaSgpe3RoaXMuY29uc3RydWN0b3I9ZX10KGUsbiksZS5wcm90b3R5cGU9bnVsbD09PW4/T2JqZWN0LmNyZWF0ZShuKTooaS5wcm90b3R5cGU9bi5wcm90b3R5cGUsbmV3IGkpfX0pKCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KF9fdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHZfdD1PZ3QsYl90PXJfdCx4X3Q9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIG49dC5jYWxsKHRoaXMsZSl8fHRoaXM7cmV0dXJuIG4uZGltQ2FjaGU9bmV3IHZfdC5DYWNoZSgoZnVuY3Rpb24odCl7cmV0dXJuIG4uX21lYXN1cmVOb3RGcm9tQ2FjaGUodCl9KSksbn1yZXR1cm4geV90KGUsdCksZS5wcm90b3R5cGUuX21lYXN1cmVOb3RGcm9tQ2FjaGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHQucHJvdG90eXBlLm1lYXN1cmUuY2FsbCh0aGlzLGUpfSxlLnByb3RvdHlwZS5tZWFzdXJlPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10JiYodD1iX3QuQWJzdHJhY3RNZWFzdXJlci5IRUlHSFRfVEVYVCksdGhpcy5kaW1DYWNoZS5nZXQodCl9LGUucHJvdG90eXBlLnJlc2V0PWZ1bmN0aW9uKCl7dGhpcy5kaW1DYWNoZS5jbGVhcigpLHQucHJvdG90eXBlLnJlc2V0LmNhbGwodGhpcyl9LGV9KShhX3QuQ2FjaGVDaGFyYWN0ZXJNZWFzdXJlcik7X190LkNhY2hlTWVhc3VyZXI9eF90LChmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe2Zvcih2YXIgbiBpbiBlKXQuaGFzT3duUHJvcGVydHkobil8fCh0W25dPWVbbl0pfU9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSxlKHJfdCksZShhX3QpLGUoX190KSxlKHNfdCksZShsX3QpfSkoaV90KTt2YXIgd190PXt9LFNfdD17fSxNX3Q9e30sRV90PXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShFX3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBUX3Q9T2d0LENfdD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5tYXhMaW5lcygxLzApLHRoaXMudGV4dFRyaW1taW5nKCJlbGxpcHNpcyIpLHRoaXMuYWxsb3dCcmVha2luZ1dvcmRzKCExKSx0aGlzLl90b2tlbml6ZXI9bmV3IFRfdC5Ub2tlbml6ZXIsdGhpcy5fYnJlYWtpbmdDaGFyYWN0ZXI9Ii0ifXJldHVybiB0LnByb3RvdHlwZS5tYXhMaW5lcz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9tYXhMaW5lczoodGhpcy5fbWF4TGluZXM9dCx0aGlzKX0sdC5wcm90b3R5cGUudGV4dFRyaW1taW5nPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX3RleHRUcmltbWluZztpZigiZWxsaXBzaXMiIT09dCYmIm5vbmUiIT09dCl0aHJvdyBuZXcgRXJyb3IodCsiIC0gdW5zdXBwb3J0ZWQgdGV4dCB0cmltbWluZyBvcHRpb24uIik7cmV0dXJuIHRoaXMuX3RleHRUcmltbWluZz10LHRoaXN9LHQucHJvdG90eXBlLmFsbG93QnJlYWtpbmdXb3Jkcz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9hbGxvd0JyZWFraW5nV29yZHM6KHRoaXMuX2FsbG93QnJlYWtpbmdXb3Jkcz10LHRoaXMpfSx0LnByb3RvdHlwZS53cmFwPWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPXRoaXM7dm9pZCAwPT09aSYmKGk9MS8wKTt2YXIgbz17bm9Ccm9rZVdvcmRzOjAsbm9MaW5lczowLG9yaWdpbmFsVGV4dDp0LHRydW5jYXRlZFRleHQ6IiIsd3JhcHBlZFRleHQ6IiJ9LGE9e2F2YWlsYWJsZUxpbmVzOk1hdGgubWluKE1hdGguZmxvb3IoaS9lLm1lYXN1cmUoKS5oZWlnaHQpLHRoaXMuX21heExpbmVzKSxhdmFpbGFibGVXaWR0aDpuLGNhbkZpdFRleHQ6ITAsY3VycmVudExpbmU6IiIsd3JhcHBpbmc6b30scz10LnNwbGl0KCJcbiIpO3JldHVybiBzLnJlZHVjZSgoZnVuY3Rpb24odCxuLGkpe3JldHVybiByLmJyZWFrTGluZVRvRml0V2lkdGgodCxuLGkhPT1zLmxlbmd0aC0xLGUpfSksYSkud3JhcHBpbmd9LHQucHJvdG90eXBlLmJyZWFrTGluZVRvRml0V2lkdGg9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9dGhpczt0LmNhbkZpdFRleHR8fCIiPT09dC53cmFwcGluZy50cnVuY2F0ZWRUZXh0fHwodC53cmFwcGluZy50cnVuY2F0ZWRUZXh0Kz0iXG4iKSx0PXRoaXMuX3Rva2VuaXplci50b2tlbml6ZShlKS5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHIud3JhcE5leHRUb2tlbihlLHQsaSl9KSx0KTt2YXIgbz1UX3QuU3RyaW5nTWV0aG9kcy50cmltRW5kKHQuY3VycmVudExpbmUpO3JldHVybiB0LndyYXBwaW5nLm5vTGluZXMrPSsoIiIhPT1vKSx0LndyYXBwaW5nLm5vTGluZXM9PT10LmF2YWlsYWJsZUxpbmVzJiYibm9uZSIhPT10aGlzLl90ZXh0VHJpbW1pbmcmJm4/dC5jYW5GaXRUZXh0PSExOnQud3JhcHBpbmcud3JhcHBlZFRleHQrPW8sdC5jdXJyZW50TGluZT0iXG4iLHR9LHQucHJvdG90eXBlLmNhbkZpdFRva2VuPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLHI9dC5zcGxpdCgiIikubWFwKChmdW5jdGlvbihlLG4pe3JldHVybiBuIT09dC5sZW5ndGgtMT9lK2kuX2JyZWFraW5nQ2hhcmFjdGVyOmV9KSk7cmV0dXJuIG4ubWVhc3VyZSh0KS53aWR0aDw9ZXx8ci5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIG4ubWVhc3VyZSh0KS53aWR0aDw9ZX0pKX0sdC5wcm90b3R5cGUuYWRkRWxsaXBzaXM9ZnVuY3Rpb24odCxlLG4pe2lmKCJub25lIj09PXRoaXMuX3RleHRUcmltbWluZylyZXR1cm57cmVtYWluaW5nVG9rZW46IiIsd3JhcHBlZFRva2VuOnR9O3ZhciBpPXQuc3Vic3RyaW5nKDApLnRyaW0oKSxyPW4ubWVhc3VyZShpKS53aWR0aCxvPW4ubWVhc3VyZSgiLi4uIikud2lkdGgsYT10Lmxlbmd0aD4wJiYiXG4iPT09dFswXT8iXG4iOiIiO2lmKGU8PW8pe3ZhciBzPU1hdGguZmxvb3IoZS8oby8zKSk7cmV0dXJue3JlbWFpbmluZ1Rva2VuOnQsd3JhcHBlZFRva2VuOmErIi4uLiIuc3Vic3RyKDAscyl9fWZvcig7citvPmU7KWk9VF90LlN0cmluZ01ldGhvZHMudHJpbUVuZChpLnN1YnN0cigwLGkubGVuZ3RoLTEpKSxyPW4ubWVhc3VyZShpKS53aWR0aDtyZXR1cm57cmVtYWluaW5nVG9rZW46VF90LlN0cmluZ01ldGhvZHMudHJpbUVuZCh0LnN1YnN0cmluZyhpLmxlbmd0aCksIi0iKS50cmltKCksd3JhcHBlZFRva2VuOmEraSsiLi4uIn19LHQucHJvdG90eXBlLndyYXBOZXh0VG9rZW49ZnVuY3Rpb24odCxlLG4pe2lmKCFlLmNhbkZpdFRleHR8fGUuYXZhaWxhYmxlTGluZXM9PT1lLndyYXBwaW5nLm5vTGluZXN8fCF0aGlzLmNhbkZpdFRva2VuKHQsZS5hdmFpbGFibGVXaWR0aCxuKSlyZXR1cm4gdGhpcy5maW5pc2hXcmFwcGluZyh0LGUsbik7Zm9yKHZhciBpPXQ7aTspe3ZhciByPXRoaXMuYnJlYWtUb2tlblRvRml0SW5XaWR0aChpLGUuY3VycmVudExpbmUsZS5hdmFpbGFibGVXaWR0aCxuKTtpZihlLmN1cnJlbnRMaW5lPXIubGluZSxudWxsIT0oaT1yLnJlbWFpbmluZ1Rva2VuKSl7aWYoZS53cmFwcGluZy5ub0Jyb2tlV29yZHMrPStyLmJyZWFrV29yZCwrK2Uud3JhcHBpbmcubm9MaW5lcyxlLmF2YWlsYWJsZUxpbmVzPT09ZS53cmFwcGluZy5ub0xpbmVzKXt2YXIgbz10aGlzLmFkZEVsbGlwc2lzKGUuY3VycmVudExpbmUsZS5hdmFpbGFibGVXaWR0aCxuKTtyZXR1cm4gZS53cmFwcGluZy53cmFwcGVkVGV4dCs9by53cmFwcGVkVG9rZW4sZS53cmFwcGluZy50cnVuY2F0ZWRUZXh0Kz1vLnJlbWFpbmluZ1Rva2VuK2ksZS5jdXJyZW50TGluZT0iXG4iLGV9ZS53cmFwcGluZy53cmFwcGVkVGV4dCs9VF90LlN0cmluZ01ldGhvZHMudHJpbUVuZChlLmN1cnJlbnRMaW5lKSxlLmN1cnJlbnRMaW5lPSJcbiJ9fXJldHVybiBlfSx0LnByb3RvdHlwZS5maW5pc2hXcmFwcGluZz1mdW5jdGlvbih0LGUsbil7aWYoZS5jYW5GaXRUZXh0JiZlLmF2YWlsYWJsZUxpbmVzIT09ZS53cmFwcGluZy5ub0xpbmVzJiYibm9uZSIhPT10aGlzLl90ZXh0VHJpbW1pbmcpe3ZhciBpPXRoaXMuYWRkRWxsaXBzaXMoZS5jdXJyZW50TGluZSt0LGUuYXZhaWxhYmxlV2lkdGgsbik7ZS53cmFwcGluZy53cmFwcGVkVGV4dCs9aS53cmFwcGVkVG9rZW4sZS53cmFwcGluZy50cnVuY2F0ZWRUZXh0Kz1pLnJlbWFpbmluZ1Rva2VuLGUud3JhcHBpbmcubm9Ccm9rZVdvcmRzKz0rKGkucmVtYWluaW5nVG9rZW4ubGVuZ3RoPHQubGVuZ3RoKSxlLndyYXBwaW5nLm5vTGluZXMrPSsoaS53cmFwcGVkVG9rZW4ubGVuZ3RoPjApLGUuY3VycmVudExpbmU9IiJ9ZWxzZSBlLndyYXBwaW5nLnRydW5jYXRlZFRleHQrPXQ7cmV0dXJuIGUuY2FuRml0VGV4dD0hMSxlfSx0LnByb3RvdHlwZS5icmVha1Rva2VuVG9GaXRJbldpZHRoPWZ1bmN0aW9uKHQsZSxuLGkscil7aWYodm9pZCAwPT09ciYmKHI9dGhpcy5fYnJlYWtpbmdDaGFyYWN0ZXIpLGkubWVhc3VyZShlK3QpLndpZHRoPD1uKXJldHVybnticmVha1dvcmQ6ITEsbGluZTplK3QscmVtYWluaW5nVG9rZW46bnVsbH07aWYoIiI9PT10LnRyaW0oKSlyZXR1cm57YnJlYWtXb3JkOiExLGxpbmU6ZSxyZW1haW5pbmdUb2tlbjoiIn07aWYoIXRoaXMuX2FsbG93QnJlYWtpbmdXb3JkcyYmIiIhPT1lLnRyaW0oKSlyZXR1cm57YnJlYWtXb3JkOiExLGxpbmU6ZSxyZW1haW5pbmdUb2tlbjp0fTtmb3IodmFyIG89MDtvPHQubGVuZ3RoJiZpLm1lYXN1cmUoZSt0LnN1YnN0cmluZygwLG8rMSkrcikud2lkdGg8PW47KSsrbzt2YXIgYT0iIjtyZXR1cm4gbz4wJiYoYT1yKSx7YnJlYWtXb3JkOm8+MCxsaW5lOmUrdC5zdWJzdHJpbmcoMCxvKSthLHJlbWFpbmluZ1Rva2VuOnQuc3Vic3RyaW5nKG8pfX0sdH0pKCk7RV90LldyYXBwZXI9Q190O3ZhciBBX3Q9U2UmJlNlLl9fZXh0ZW5kc3x8KGZ1bmN0aW9uKCl7dmFyIHQ9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHQsZSl7dC5fX3Byb3RvX189ZX18fGZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuIGluIGUpZS5oYXNPd25Qcm9wZXJ0eShuKSYmKHRbbl09ZVtuXSl9O3JldHVybiBmdW5jdGlvbihlLG4pe2Z1bmN0aW9uIGkoKXt0aGlzLmNvbnN0cnVjdG9yPWV9dChlLG4pLGUucHJvdG90eXBlPW51bGw9PT1uP09iamVjdC5jcmVhdGUobik6KGkucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyBpKX19KSgpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShNX3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBrX3Q9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBBX3QoZSx0KSxlLnByb3RvdHlwZS53cmFwPWZ1bmN0aW9uKG4saSxyLG8pe3ZhciBhPXRoaXM7aWYodm9pZCAwPT09byYmKG89MS8wKSxuLnNwbGl0KCJcbiIpLmxlbmd0aD4xKXRocm93IG5ldyBFcnJvcigiU2luZ2xlTGluZVdyYXBwZXIgaXMgZGVzaWduZWQgdG8gd29yayBvbmx5IG9uIHNpbmdsZSBsaW5lIik7dmFyIHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHQucHJvdG90eXBlLndyYXAuY2FsbChhLG4saSxlLG8pfSxsPXMocik7aWYobC5ub0xpbmVzPDIpcmV0dXJuIGw7Zm9yKHZhciBjPTAsdT1yLGg9MDtoPGUuTk9fV1JBUF9JVEVSQVRJT05TJiZ1PmM7KytoKXt2YXIgZD0odStjKS8yLHA9cyhkKTt0aGlzLmFyZVNhbWVSZXN1bHRzKGwscCk/KHU9ZCxsPXApOmM9ZH1yZXR1cm4gbH0sZS5wcm90b3R5cGUuYXJlU2FtZVJlc3VsdHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5ub0xpbmVzPT09ZS5ub0xpbmVzJiZ0LnRydW5jYXRlZFRleHQ9PT1lLnRydW5jYXRlZFRleHR9LGV9KShFX3QuV3JhcHBlcik7a190Lk5PX1dSQVBfSVRFUkFUSU9OUz01LE1fdC5TaW5nbGVMaW5lV3JhcHBlcj1rX3QsKGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7Zm9yKHZhciBuIGluIGUpdC5oYXNPd25Qcm9wZXJ0eShuKXx8KHRbbl09ZVtuXSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUoTV90KSxlKEVfdCl9KShTX3QpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3X3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBMX3Q9UGd0LFBfdD1pX3QsTl90PVNfdCxJX3Q9SWd0LFJfdD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMuY29udGV4dD10LHRoaXMubWVhc3VyZXI9bmV3IFBfdC5DYWNoZU1lYXN1cmVyKHRoaXMuY29udGV4dCksdGhpcy53cmFwcGVyPW5ldyBOX3QuV3JhcHBlcix0aGlzLndyaXRlcj1uZXcgSV90LldyaXRlcih0aGlzLm1lYXN1cmVyLHRoaXMuY29udGV4dCx0aGlzLndyYXBwZXIpfXJldHVybiB0LnN2Zz1mdW5jdGlvbihlLG4saSl7cmV0dXJuIG5ldyB0KG5ldyBMX3QuU3ZnQ29udGV4dChlLG4saSkpfSx0LmNhbnZhcz1mdW5jdGlvbihlLG4saSl7cmV0dXJuIG5ldyB0KG5ldyBMX3QuQ2FudmFzQ29udGV4dChlLG4saSkpfSx0Lmh0bWw9ZnVuY3Rpb24oZSxuLGkpe3JldHVybiBuZXcgdChuZXcgTF90Lkh0bWxDb250ZXh0KGUsbixpKSl9LHQucHJvdG90eXBlLndyaXRlPWZ1bmN0aW9uKHQsZSxuLGkscil7dGhpcy53cml0ZXIud3JpdGUodCxlLG4saSxyKX0sdC5wcm90b3R5cGUuY2xlYXJNZWFzdXJlckNhY2hlPWZ1bmN0aW9uKCl7dGhpcy5tZWFzdXJlci5yZXNldCgpfSx0fSkoKTt3X3QuVHlwZXNldHRlcj1SX3QsKGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7Zm9yKHZhciBuIGluIGUpdC5oYXNPd25Qcm9wZXJ0eShuKXx8KHRbbl09ZVtuXSl9T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLGUoUGd0KSxlKGlfdCksZSh3X3QpLGUoT2d0KSxlKFNfdCksZShJZ3QpfSkoTGd0KTt2YXIgT190PXt9LHpfdD17fSxEX3Q9e30sQl90PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkoQl90LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgSF90PXdwdCxGX3Q9d2luZG93LkFycmF5O0JfdC5hZGQ9ZnVuY3Rpb24gVl90KHQsZSl7aWYodC5sZW5ndGghPT1lLmxlbmd0aCl0aHJvdyBuZXcgRXJyb3IoImF0dGVtcHRlZCB0byBhZGQgYXJyYXlzIG9mIHVuZXF1YWwgbGVuZ3RoIik7cmV0dXJuIHQubWFwKChmdW5jdGlvbihuLGkpe3JldHVybiB0W2ldK2VbaV19KSl9LEJfdC51bmlxPWZ1bmN0aW9uIFVfdCh0KXt2YXIgZT1IX3Quc2V0KCksbj1bXTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXtlLmhhcyhTdHJpbmcodCkpfHwoZS5hZGQoU3RyaW5nKHQpKSxuLnB1c2godCkpfSkpLG59LEJfdC5mbGF0dGVuPWZ1bmN0aW9uIGpfdCh0KXtyZXR1cm4gRl90LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sdCl9LEJfdC5jcmVhdGVGaWxsZWRBcnJheT1mdW5jdGlvbiBHX3QodCxlKXtmb3IodmFyIG49W10saT0wO2k8ZTtpKyspbltpXT0iZnVuY3Rpb24iPT10eXBlb2YgdD90KGkpOnQ7cmV0dXJuIG59O3ZhciBXX3Q9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KFdfdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHFfdD13cHQsWV90PXdpbmRvdy5NYXRoO2Z1bmN0aW9uIFhfdCh0KXt2YXIgZT1xX3QucmdiKHQpLG49ZnVuY3Rpb24odCl7cmV0dXJuKHQvPTI1NSk8PS4wMzkyOD90LzEyLjkyOllfdC5wb3coKHQrLjA1NSkvMS4wNTUsMi40KX07cmV0dXJuLjIxMjYqbihlLnIpKy43MTUyKm4oZS5nKSsuMDcyMipuKGUuYil9V190LmNvbnRyYXN0PWZ1bmN0aW9uICRfdCh0LGUpe3ZhciBuPVhfdCh0KSsuMDUsaT1YX3QoZSkrLjA1O3JldHVybiBuPmk/bi9pOmkvbn0sV190LmxpZ2h0ZW5Db2xvcj1mdW5jdGlvbiBLX3QodCxlKXtyZXR1cm4gcV90LmNvbG9yKHQpLmJyaWdodGVyKGUpLnJnYigpLnRvU3RyaW5nKCl9LFdfdC5jb2xvclRlc3Q9ZnVuY3Rpb24gWl90KHQsZSl7dC5jbGFzc2VkKGUsITApO3ZhciBuPXQuc3R5bGUoImJhY2tncm91bmQtY29sb3IiKTtpZigidHJhbnNwYXJlbnQiPT09bilyZXR1cm4gbnVsbDt2YXIgaT0vXCgoLispXCkvLmV4ZWMobik7aWYoIWkpcmV0dXJuIG51bGw7dmFyIHI9aVsxXS5zcGxpdCgiLCIpLm1hcCgoZnVuY3Rpb24odCl7dmFyIGU9K3Qsbj1lLnRvU3RyaW5nKDE2KTtyZXR1cm4gZTwxNj8iMCIrbjpufSkpO2lmKDQ9PT1yLmxlbmd0aCYmIjAwIj09PXJbM10pcmV0dXJuIG51bGw7dmFyIG89IiMiK3Iuam9pbigiIik7cmV0dXJuIHQuY2xhc3NlZChlLCExKSxvfTt2YXIgSl90PXt9OyEoZnVuY3Rpb24odCl7Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZT13cHQsbj13aW5kb3cuTWF0aDtmdW5jdGlvbiBpKHQpe3ZhciBlO3RyeXtlPXQubm9kZSgpLmdldEJCb3goKX1jYXRjaCh0KXtlPXt4OjAseTowLHdpZHRoOjAsaGVpZ2h0OjB9fXJldHVybiBlfXQuY29udGFpbnM9ZnVuY3Rpb24gcih0LGUpe2Zvcih2YXIgbj1lO251bGwhPW4mJm4hPT10OyluPW4ucGFyZW50Tm9kZTtyZXR1cm4gbj09PXR9LHQuZWxlbWVudEJCb3g9aSx0LmVudGl0eUJvdW5kcz1mdW5jdGlvbiBvKHQpe2lmKHQgaW5zdGFuY2VvZiBTVkdFbGVtZW50KXJldHVybiBpKGUuc2VsZWN0KHQpKTtpZih0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpe3ZhciBuPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJue3g6bi5sZWZ0LHk6bi50b3Asd2lkdGg6bi53aWR0aCxoZWlnaHQ6bi5oZWlnaHR9fXJldHVybnt4OjAseTowLHdpZHRoOjAsaGVpZ2h0OjB9fSx0LlNDUkVFTl9SRUZSRVNIX1JBVEVfTUlMTElTRUNPTkRTPTFlMy82MCx0LnJlcXVlc3RBbmltYXRpb25GcmFtZVBvbHlmaWxsPWZ1bmN0aW9uIGEoZSl7bnVsbCE9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUpOnNldFRpbWVvdXQoZSx0LlNDUkVFTl9SRUZSRVNIX1JBVEVfTUlMTElTRUNPTkRTKX0sdC5lbGVtZW50V2lkdGg9ZnVuY3Rpb24gcyh0KXt2YXIgbj10IGluc3RhbmNlb2YgZS5zZWxlY3Rpb24/dC5ub2RlKCk6dCxpPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG4pO3JldHVybiBtKGksIndpZHRoIikrbShpLCJwYWRkaW5nLWxlZnQiKSttKGksInBhZGRpbmctcmlnaHQiKSttKGksImJvcmRlci1sZWZ0LXdpZHRoIikrbShpLCJib3JkZXItcmlnaHQtd2lkdGgiKX0sdC5lbGVtZW50SGVpZ2h0PWZ1bmN0aW9uIGwodCl7dmFyIG49dCBpbnN0YW5jZW9mIGUuc2VsZWN0aW9uP3Qubm9kZSgpOnQsaT13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShuKTtyZXR1cm4gbShpLCJoZWlnaHQiKSttKGksInBhZGRpbmctdG9wIikrbShpLCJwYWRkaW5nLWJvdHRvbSIpK20oaSwiYm9yZGVyLXRvcC13aWR0aCIpK20oaSwiYm9yZGVyLWJvdHRvbS13aWR0aCIpfTt2YXIgYz0iKD86Wy0rXT9bMC05XSpcXC4/WzAtOV0rKSIsdT0iKD86KD86XFxzKyw/XFxzKil8KD86LFxccyopKSIsaD1uZXcgUmVnRXhwKCJ0cmFuc2xhdGVcXHMqXFwoXFxzKigiK2MrIikoPzoiK3UrIigiK2MrIikpPyIrIlxccypcXCkiKSxkPW5ldyBSZWdFeHAoInJvdGF0ZVxccypcXChcXHMqKCIrYysiKSIrIlxccypcXCkiKSxwPW5ldyBSZWdFeHAoInNjYWxlXFxzKlxcKFxccyooIitjKyIpKD86Iit1KyIoIitjKyIpKT8iKyJcXHMqXFwpIik7ZnVuY3Rpb24gZih0KXtpZigibnVtYmVyIj09dHlwZW9mIHQpe3JldHVybnttaW46dCxtYXg6dH19aWYodCBpbnN0YW5jZW9mIE9iamVjdCYmIm1pbiJpbiB0JiYibWF4ImluIHQpcmV0dXJuIHQ7dGhyb3cgbmV3IEVycm9yKCJpbnB1dCAnIit0KyInIGNhbid0IGJlIHBhcnNlZCBhcyBhbiBSYW5nZSIpfWZ1bmN0aW9uIG0odCxlKXt2YXIgbj10LmdldFByb3BlcnR5VmFsdWUoZSk7cmV0dXJuIHBhcnNlRmxvYXQobil8fDB9dC5nZXRUcmFuc2xhdGVWYWx1ZXM9ZnVuY3Rpb24gZyh0KXt2YXIgZT1oLmV4ZWModC5hdHRyKCJ0cmFuc2Zvcm0iKSk7aWYobnVsbCE9ZSl7dmFyIG49ZVsyXTtyZXR1cm5bK2VbMV0sKyh2b2lkIDA9PT1uPzA6bildfXJldHVyblswLDBdfSx0LmdldFJvdGF0ZT1mdW5jdGlvbiBfKHQpe3ZhciBlPWQuZXhlYyh0LmF0dHIoInRyYW5zZm9ybSIpKTtyZXR1cm4gbnVsbCE9ZT8rZVsxXTowfSx0LmdldFNjYWxlVmFsdWVzPWZ1bmN0aW9uIHkodCl7dmFyIGU9cC5leGVjKHQuYXR0cigidHJhbnNmb3JtIikpO2lmKG51bGwhPWUpe3ZhciBuPWVbMV0saT1lWzJdO3JldHVyblsrbixudWxsPT1pPytuOitpXX1yZXR1cm5bMCwwXX0sdC5jbGllbnRSZWN0c092ZXJsYXA9ZnVuY3Rpb24gdih0LGUpe3JldHVybiEobi5mbG9vcih0LnJpZ2h0KTw9bi5jZWlsKGUubGVmdCkpJiYoIShuLmNlaWwodC5sZWZ0KT49bi5mbG9vcihlLnJpZ2h0KSkmJighKG4uZmxvb3IodC5ib3R0b20pPD1uLmNlaWwoZS50b3ApKSYmIShuLmNlaWwodC50b3ApPj1uLmZsb29yKGUuYm90dG9tKSkpKX0sdC5leHBhbmRSZWN0PWZ1bmN0aW9uIGIodCxlKXtyZXR1cm57bGVmdDp0LmxlZnQtZSx0b3A6dC50b3AtZSxyaWdodDp0LnJpZ2h0K2UsYm90dG9tOnQuYm90dG9tK2Usd2lkdGg6dC53aWR0aCsyKmUsaGVpZ2h0OnQuaGVpZ2h0KzIqZX19LHQuY2xpZW50UmVjdEluc2lkZT1mdW5jdGlvbiB4KHQsZSl7cmV0dXJuIG4uZmxvb3IoZS5sZWZ0KTw9bi5jZWlsKHQubGVmdCkmJm4uZmxvb3IoZS50b3ApPD1uLmNlaWwodC50b3ApJiZuLmZsb29yKHQucmlnaHQpPD1uLmNlaWwoZS5yaWdodCkmJm4uZmxvb3IodC5ib3R0b20pPD1uLmNlaWwoZS5ib3R0b20pfSx0LmludGVyc2VjdHNCQm94PWZ1bmN0aW9uIHcodCxlLG4saSl7dm9pZCAwPT09aSYmKGk9LjUpO3ZhciByPWYodCksbz1mKGUpO3JldHVybiBuLngrbi53aWR0aD49ci5taW4taSYmbi54PD1yLm1heCtpJiZuLnkrbi5oZWlnaHQ+PW8ubWluLWkmJm4ueTw9by5tYXgraX0sdC5nZXRIdG1sRWxlbWVudEFuY2VzdG9ycz1mdW5jdGlvbiBTKHQpe2Zvcih2YXIgZT1bXTt0JiZ0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQ7KWUucHVzaCh0KSx0PXQucGFyZW50RWxlbWVudDtyZXR1cm4gZX0sdC5nZXRFbGVtZW50VHJhbnNmb3JtPWZ1bmN0aW9uIE0odCl7dmFyIGU9d2luZG93LmdldENvbXB1dGVkU3R5bGUodCxudWxsKTtyZXR1cm4oZnVuY3Rpb24gbih0KXtpZihudWxsPT10fHwibm9uZSI9PT10KXJldHVybiBudWxsO3ZhciBlPXQubWF0Y2goRSk7aWYobnVsbD09ZXx8ZS5sZW5ndGg8MilyZXR1cm4gbnVsbDt2YXIgbj1lWzFdLnNwbGl0KFQpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHBhcnNlRmxvYXQodCl9KSk7aWYoNiE9bi5sZW5ndGgpcmV0dXJuIG51bGw7cmV0dXJuIG59KShlLmdldFByb3BlcnR5VmFsdWUoIi13ZWJraXQtdHJhbnNmb3JtIil8fGUuZ2V0UHJvcGVydHlWYWx1ZSgiLW1vei10cmFuc2Zvcm0iKXx8ZS5nZXRQcm9wZXJ0eVZhbHVlKCItbXMtdHJhbnNmb3JtIil8fGUuZ2V0UHJvcGVydHlWYWx1ZSgiLW8tdHJhbnNmb3JtIil8fGUuZ2V0UHJvcGVydHlWYWx1ZSgidHJhbnNmb3JtIikpfTt2YXIgRT0vXm1hdHJpeFwoKFteKV0rKVwpJC8sVD0vWywgXSsvfSkoSl90KTt2YXIgUV90PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShRX3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciB0eXQ9d3B0LGV5dD1KX3Qsbnl0PXdpbmRvdy5NYXRoLGl5dD1bMSwwLDAsMSwwLDBdO2Z1bmN0aW9uIHJ5dCh0LGUpe3JldHVyblt0WzBdKmVbMF0rdFsyXSplWzFdLHRbMV0qZVswXSt0WzNdKmVbMV0sdFswXSplWzJdK3RbMl0qZVszXSx0WzFdKmVbMl0rdFszXSplWzNdLHRbMF0qZVs0XSt0WzJdKmVbNV0rdFs0XSx0WzFdKmVbNF0rdFszXSplWzVdK3RbNV1dfWZ1bmN0aW9uIG95dCh0LGUpe3JldHVyblt0WzBdLHRbMV0sdFsyXSx0WzNdLHRbMF0qZVswXSt0WzJdKmVbMV0rdFs0XSx0WzFdKmVbMF0rdFszXSplWzFdK3RbNV1dfWZ1bmN0aW9uIGF5dCh0KXt2YXIgZT10WzBdKnRbM10tdFsxXSp0WzJdO2lmKDA9PT1lKXRocm93IG5ldyBFcnJvcigic2luZ3VsYXIgbWF0cml4Iik7dmFyIG49MS9lO3JldHVybltuKnRbM10sbiotdFsxXSxuKi10WzJdLG4qdFswXSxuKigtdFszXSp0WzRdK3RbMl0qdFs1XSksbioodFsxXSp0WzRdKy10WzBdKnRbNV0pXX1RX3QuaW5SYW5nZT1mdW5jdGlvbiBzeXQodCxlLG4pe3JldHVybiBueXQubWluKGUsbik8PXQmJnQ8PW55dC5tYXgoZSxuKX0sUV90LmNsYW1wPWZ1bmN0aW9uIGx5dCh0LGUsbil7cmV0dXJuIG55dC5taW4obnl0Lm1heChlLHQpLG4pfSxRX3QubWF4PWZ1bmN0aW9uIGN5dCh0LGUsbil7dmFyIGk9ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZTpudWxsLHI9bnVsbD09aT9lOm4sbz1udWxsPT1pP3R5dC5tYXgodCk6dHl0Lm1heCh0LGkpO3JldHVybiB2b2lkIDAhPT1vP286cn0sUV90Lm1pbj1mdW5jdGlvbiB1eXQodCxlLG4pe3ZhciBpPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6bnVsbCxyPW51bGw9PWk/ZTpuLG89bnVsbD09aT90eXQubWluKHQpOnR5dC5taW4odCxpKTtyZXR1cm4gdm9pZCAwIT09bz9vOnJ9LFFfdC5pc05hTj1mdW5jdGlvbiBoeXQodCl7cmV0dXJuIHQhPXR9LFFfdC5pc1ZhbGlkTnVtYmVyPWZ1bmN0aW9uIGR5dCh0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQmJnQtdDwxfSxRX3QucmFuZ2U9ZnVuY3Rpb24gcHl0KHQsZSxuKXtpZih2b2lkIDA9PT1uJiYobj0xKSwwPT09bil0aHJvdyBuZXcgRXJyb3IoInN0ZXAgY2Fubm90IGJlIDAiKTtmb3IodmFyIGk9bnl0Lm1heChueXQuY2VpbCgoZS10KS9uKSwwKSxyPVtdLG89MDtvPGk7KytvKXJbb109dCtuKm87cmV0dXJuIHJ9LFFfdC5kaXN0YW5jZVNxdWFyZWQ9ZnVuY3Rpb24gZnl0KHQsZSl7cmV0dXJuIG55dC5wb3coZS55LXQueSwyKStueXQucG93KGUueC10LngsMil9LFFfdC5kZWdyZWVzVG9SYWRpYW5zPWZ1bmN0aW9uIG15dCh0KXtyZXR1cm4gdC8zNjAqbnl0LlBJKjJ9LFFfdC53aXRoaW49ZnVuY3Rpb24gZ3l0KHQsZSl7cmV0dXJuIGUudG9wTGVmdC54PD10LngmJmUuYm90dG9tUmlnaHQueD49dC54JiZlLnRvcExlZnQueTw9dC55JiZlLmJvdHRvbVJpZ2h0Lnk+PXQueX0sUV90LmJvdW5kc0ludGVyc2VjdHM9ZnVuY3Rpb24gX3l0KHQsZSxuLGkscixvLGEscyl7cmV0dXJuIHQ8PXIrYSYmcjw9dCtuJiZlPD1vK3MmJm88PWUraX0sUV90LmdldEN1bXVsYXRpdmVUcmFuc2Zvcm09ZnVuY3Rpb24geXl0KHQpe2Zvcih2YXIgZT1leXQuZ2V0SHRtbEVsZW1lbnRBbmNlc3RvcnModCksbj1peXQsaT1udWxsLHI9MCxvPWU7cjxvLmxlbmd0aDtyKyspe3ZhciBhPW9bcl0scz1leXQuZ2V0RWxlbWVudFRyYW5zZm9ybShhKTtpZihudWxsIT1zKXt2YXIgbD1hLmNsaWVudFdpZHRoLzIsYz1hLmNsaWVudEhlaWdodC8yO249b3l0KG4sW2wsY10pLG49b3l0KG49cnl0KG4sYXl0KHMpKSxbLWwsLWNdKX12YXIgdT1hLnNjcm9sbExlZnQsaD1hLnNjcm9sbFRvcDtudWxsIT09aSYmYSE9PWl8fCh1LT1hLm9mZnNldExlZnQrYS5jbGllbnRMZWZ0LGgtPWEub2Zmc2V0VG9wK2EuY2xpZW50VG9wLGk9YS5vZmZzZXRQYXJlbnQpLG49b3l0KG4sW3UsaF0pfXJldHVybiBufSxRX3QubXVsdGlwbHlNYXRyaXg9cnl0LFFfdC5wcmVtdWx0aXBseVRyYW5zbGF0ZT1mdW5jdGlvbiB2eXQodCxlKXtyZXR1cm5bZVswXSxlWzFdLGVbMl0sZVszXSxlWzRdK3RbMF0sZVs1XSt0WzFdXX0sUV90Lm11bHRpcGx5VHJhbnNsYXRlPW95dCxRX3QuaW52ZXJ0TWF0cml4PWF5dCxRX3QuYXBwbHlUcmFuc2Zvcm09ZnVuY3Rpb24gYnl0KHQsZSl7cmV0dXJue3g6dFswXSplLngrdFsyXSplLnkrdFs0XSx5OnRbMV0qZS54K3RbM10qZS55K3RbNV19fTt2YXIgeHl0PXt9LHd5dD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNy1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KHd5dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIFN5dD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5zcGxpdD1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj1NYXRoLmNlaWwodC5sZW5ndGgvMiksaT0wO2k8bjtpKyspZVswXS5pbnNlcnQodFtpXSk7Zm9yKGk9bjtpPHQubGVuZ3RoO2krKyllWzFdLmluc2VydCh0W2ldKX0sdH0pKCk7d3l0LlNwbGl0U3RyYXRlZ3lUcml2aWFsPVN5dDt2YXIgTXl0PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLnNwbGl0PWZ1bmN0aW9uKHQsZSl7Zm9yKHQ9dC5zbGljZSgpLHRoaXMuY2hvb3NlRmlyc3RTcGxpdCh0LGUpO3QubGVuZ3RoPjA7KXRoaXMuYWRkTmV4dCh0LGUpfSx0LnByb3RvdHlwZS5jaG9vc2VGaXJzdFNwbGl0PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTAsaT0wLHI9dC5sZW5ndGgtMSxvPXQubGVuZ3RoLTEsYT0xO2E8dC5sZW5ndGgtMTthKyspe3ZhciBzPXRbYV07cy5ib3VuZHMueGw+dFtyXS5ib3VuZHMueGw/cj1hOnMuYm91bmRzLnhoPHRbbl0uYm91bmRzLnhoJiYobj1hKSxzLmJvdW5kcy55bD50W29dLmJvdW5kcy55bD9vPWE6cy5ib3VuZHMueWg8dFtpXS5ib3VuZHMueWgmJihpPWEpfXZhciBsPU1hdGguYWJzKHRbbl0uYm91bmRzLnhoLXRbcl0uYm91bmRzLnhsKT5NYXRoLmFicyh0W2ldLmJvdW5kcy55aC10W29dLmJvdW5kcy55bCk/W24scl06W2ksb10sYz1sWzBdLHU9bFsxXTtjPT09dSYmKGM9MCx1PXQubGVuZ3RoLTEpLGVbMF0uaW5zZXJ0KHQuc3BsaWNlKE1hdGgubWF4KGMsdSksMSlbMF0pLGVbMV0uaW5zZXJ0KHQuc3BsaWNlKE1hdGgubWluKGMsdSksMSlbMF0pfSx0LnByb3RvdHlwZS5hZGROZXh0PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPW51bGwsaT1udWxsLHI9bnVsbCxvPTA7bzx0Lmxlbmd0aDtvKyspe3ZhciBhPXRbb10scz1lWzBdLnVuaW9uQXJlYURpZmZlcmVuY2UoYS5ib3VuZHMpLGw9ZVsxXS51bmlvbkFyZWFEaWZmZXJlbmNlKGEuYm91bmRzKTsoczxpfHxudWxsPT1uKSYmKG49byxpPXMscj1lWzBdKSxsPGkmJihuPW8saT1sLHI9ZVsxXSl9ci5pbnNlcnQodC5zcGxpY2UobiwxKVswXSl9LHR9KSgpO3d5dC5TcGxpdFN0cmF0ZWd5TGluZWFyPU15dCwoZnVuY3Rpb24odCl7Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTctcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZSxuPW5ldyB3eXQuU3BsaXRTdHJhdGVneUxpbmVhcjtmdW5jdGlvbiBpKHQsbixpKXt2YXIgcj0xLzAsbz0xLzA7cmV0dXJuIGZ1bmN0aW9uKGEpe3ZhciBzPW4oYS5ib3VuZHMsdCksbD1pKGEuYm91bmRzLHQpO3JldHVybiBudWxsIT1hLnZhbHVlP3M8cj8ocj1zLG89bCxlLlBBU1NfQU5EX09WRVJXUklURSk6cz09PXI/ZS5QQVNTOmUuRkFJTDpzPm8/ZS5GQUlMOihvPU1hdGgubWF4KGwsbyksZS5QQVNTKX19ZnVuY3Rpb24gcih0LGUpe3JldHVybiBmdW5jdGlvbihuLGkpe3JldHVybiBlKGkuYm91bmRzLHQpLWUobi5ib3VuZHMsdCl9fSEoZnVuY3Rpb24odCl7dFt0LlBBU1M9MF09IlBBU1MiLHRbdC5GQUlMPTFdPSJGQUlMIix0W3QuUEFTU19BTkRfT1ZFUldSSVRFPTJdPSJQQVNTX0FORF9PVkVSV1JJVEUifSkoZT10LlF1ZXJ5UHJlZGljYXRlUmVzdWx0fHwodC5RdWVyeVByZWRpY2F0ZVJlc3VsdD17fSkpLHQuY3JlYXRlTWluaW1pemluZ05vZGVQcmVkaWNhdGU9aSx0LmNyZWF0ZU5vZGVTb3J0PXI7dmFyIG89KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3ZvaWQgMD09PXQmJih0PTUpLHZvaWQgMD09PWUmJihlPW4pLHRoaXMubWF4Tm9kZUNoaWxkcmVuPXQsdGhpcy5zcGxpdFN0cmF0ZWd5PWUsdGhpcy5yb290PW5ldyBhKCEwKSx0aGlzLnNpemU9MH1yZXR1cm4gdC5wcm90b3R5cGUuZ2V0Um9vdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJvb3R9LHQucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5yb290PW5ldyBhKCEwKSx0aGlzLnNpemU9MH0sdC5wcm90b3R5cGUuaW5zZXJ0PWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPXRoaXMucm9vdDshbi5sZWFmOyluPW4uc3VidHJlZSh0KTt2YXIgaT1hLnZhbHVlTm9kZSh0LGUpO2ZvcihuLmluc2VydChpKSx0aGlzLnNpemUrPTE7bi5vdmVyZmxvdyh0aGlzLm1heE5vZGVDaGlsZHJlbik7KW51bGw9PShuPW4uc3BsaXQodGhpcy5zcGxpdFN0cmF0ZWd5KSkucGFyZW50JiYodGhpcy5yb290PW4pO3JldHVybiBpfSx0LnByb3RvdHlwZS5sb2NhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucXVlcnkoKGZ1bmN0aW9uKGUpe3JldHVybiBlLmNvbnRhaW5zKHQpfSkpfSx0LnByb3RvdHlwZS5sb2NhdGVOZWFyZXN0PWZ1bmN0aW9uKHQpe3ZhciBlPWkodCxzLmRpc3RhbmNlU3F1YXJlZFRvTmVhckVkZ2Uscy5kaXN0YW5jZVNxdWFyZWRUb0ZhckVkZ2UpO3JldHVybiB0aGlzLnF1ZXJ5Tm9kZXMoZSkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC52YWx1ZX0pKX0sdC5wcm90b3R5cGUubG9jYXRlTmVhcmVzdFg9ZnVuY3Rpb24odCl7dmFyIGU9aSh0LHMuYWJzb2x1dGVEaXN0YW5jZVRvTmVhckVkZ2VYLHMuYWJzb2x1dGVEaXN0YW5jZVRvRmFyRWRnZVgpLG49dGhpcy5xdWVyeU5vZGVzKGUpO3JldHVybiBuLnNvcnQocih0LHMuYWJzb2x1dGVEaXN0YW5jZVRvTmVhckVkZ2VZKSksbi5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnZhbHVlfSkpfSx0LnByb3RvdHlwZS5sb2NhdGVOZWFyZXN0WT1mdW5jdGlvbih0KXt2YXIgZT1pKHQscy5hYnNvbHV0ZURpc3RhbmNlVG9OZWFyRWRnZVkscy5hYnNvbHV0ZURpc3RhbmNlVG9GYXJFZGdlWSksbj10aGlzLnF1ZXJ5Tm9kZXMoZSk7cmV0dXJuIG4uc29ydChyKHQscy5hYnNvbHV0ZURpc3RhbmNlVG9OZWFyRWRnZVgpKSxuLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQudmFsdWV9KSl9LHQucHJvdG90eXBlLmludGVyc2VjdD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5xdWVyeSgoZnVuY3Rpb24oZSl7cmV0dXJuIHMuaXNCb3VuZHNPdmVybGFwQm91bmRzKGUsdCl9KSl9LHQucHJvdG90eXBlLmludGVyc2VjdFg9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMucXVlcnkoKGZ1bmN0aW9uKGUpe3JldHVybiBzLmlzQm91bmRzT3ZlcmxhcFgoZSx0KX0pKX0sdC5wcm90b3R5cGUuaW50ZXJzZWN0WT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5xdWVyeSgoZnVuY3Rpb24oZSl7cmV0dXJuIHMuaXNCb3VuZHNPdmVybGFwWShlLHQpfSkpfSx0LnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbih0KXt2YXIgZT1bXTtpZihudWxsIT10aGlzLnJvb3QuYm91bmRzJiYhdCh0aGlzLnJvb3QuYm91bmRzKSlyZXR1cm4gZTtmb3IodmFyIG49W3RoaXMucm9vdF07bi5sZW5ndGg+MDspZm9yKHZhciBpPW4uc2hpZnQoKSxyPTA7cjxpLmVudHJpZXMubGVuZ3RoO3IrKyl7dmFyIG89aS5lbnRyaWVzW3JdO3Qoby5ib3VuZHMpJiYoaS5sZWFmP2UucHVzaChvLnZhbHVlKTpuLnB1c2gobykpfXJldHVybiBlfSx0LnByb3RvdHlwZS5xdWVyeU5vZGVzPWZ1bmN0aW9uKHQpe3ZhciBuPVtdO2lmKG51bGwhPXRoaXMucm9vdC5ib3VuZHMmJnQodGhpcy5yb290KT09PWUuRkFJTClyZXR1cm4gbjtmb3IodmFyIGk9W3RoaXMucm9vdF07aS5sZW5ndGg+MDspZm9yKHZhciByPWkuc2hpZnQoKSxvPTA7bzxyLmVudHJpZXMubGVuZ3RoO28rKyl7dmFyIGE9ci5lbnRyaWVzW29dLHM9dChhKTtzPT09ZS5QQVNTX0FORF9PVkVSV1JJVEUmJihuPVtdKSxzIT09ZS5QQVNTJiZzIT09ZS5QQVNTX0FORF9PVkVSV1JJVEV8fChyLmxlYWY/bi5wdXNoKGEpOmkucHVzaChhKSl9cmV0dXJuIG59LHR9KSgpO3QuUlRyZWU9bzt2YXIgYT0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQpe3RoaXMubGVhZj10LHRoaXMuYm91bmRzPW51bGwsdGhpcy5lbnRyaWVzPVtdLHRoaXMucGFyZW50PW51bGwsdGhpcy52YWx1ZT1udWxsfXJldHVybiB0LnZhbHVlTm9kZT1mdW5jdGlvbihlLG4pe3ZhciBpPW5ldyB0KCEwKTtyZXR1cm4gaS5ib3VuZHM9ZSxpLnZhbHVlPW4saX0sdC5wcm90b3R5cGUub3ZlcmZsb3c9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZW50cmllcy5sZW5ndGg+dH0sdC5wcm90b3R5cGUuaW5zZXJ0PWZ1bmN0aW9uKHQpe3RoaXMuZW50cmllcy5wdXNoKHQpLHQucGFyZW50PXRoaXM7Zm9yKHZhciBlPXRoaXM7bnVsbCE9ZTspZS5ib3VuZHM9cy51bmlvbkFsbChbZS5ib3VuZHMsdC5ib3VuZHNdKSxlPWUucGFyZW50O3JldHVybiB0aGlzfSx0LnByb3RvdHlwZS5yZW1vdmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5lbnRyaWVzLmluZGV4T2YodCk7aWYoZT49MCl7dGhpcy5lbnRyaWVzLnNwbGljZShlLDEpO2Zvcih2YXIgbj10aGlzO251bGwhPW47KW4uYm91bmRzPXMudW5pb25BbGwobi5lbnRyaWVzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuYm91bmRzfSkpKSxuPW4ucGFyZW50fXJldHVybiB0aGlzfSx0LnByb3RvdHlwZS5zdWJ0cmVlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0xLzAsbj1udWxsLGk9MDtpPHRoaXMuZW50cmllcy5sZW5ndGg7aSsrKXt2YXIgcj10aGlzLmVudHJpZXNbaV0sbz1yLnVuaW9uQXJlYURpZmZlcmVuY2UodCk7KG88ZXx8bz09PWUmJm51bGwhPW4mJnIuZW50cmllcy5sZW5ndGg8bi5lbnRyaWVzLmxlbmd0aCkmJihuPXIpfXJldHVybiBufSx0LnByb3RvdHlwZS5zcGxpdD1mdW5jdGlvbihlKXtudWxsIT10aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQucmVtb3ZlKHRoaXMpO3ZhciBuPVtuZXcgdCh0aGlzLmxlYWYpLG5ldyB0KHRoaXMubGVhZildO2Uuc3BsaXQodGhpcy5lbnRyaWVzLG4pO3ZhciBpPW51bGwhPXRoaXMucGFyZW50P3RoaXMucGFyZW50Om5ldyB0KCExKTtyZXR1cm4gaS5pbnNlcnQoblswXSksaS5pbnNlcnQoblsxXSksaS5sZWFmPSExLGl9LHQucHJvdG90eXBlLnVuaW9uQXJlYURpZmZlcmVuY2U9ZnVuY3Rpb24odCl7cmV0dXJuIE1hdGguYWJzKHMudW5pb24odGhpcy5ib3VuZHMsdCkuYXJlYSgpLXRoaXMuYm91bmRzLmFyZWEoKSl9LHQucHJvdG90eXBlLm1heERlcHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubGVhZj8xOjErdGhpcy5lbnRyaWVzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQubWF4RGVwdGgoKX0pKS5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGgubWF4KHQsZSl9KSl9LHR9KSgpO3QuUlRyZWVOb2RlPWE7dmFyIHM9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbixpKXt0aGlzLnhsPXQsdGhpcy55bD1lLHRoaXMueGg9bix0aGlzLnloPWksdGhpcy53aWR0aD10aGlzLnhoLXRoaXMueGwsdGhpcy5oZWlnaHQ9dGhpcy55aC10aGlzLnlsfXJldHVybiB0Lnh5d2g9ZnVuY3Rpb24oZSxuLGkscil7cmV0dXJuIG5ldyB0KGUsbixlK2ksbityKX0sdC5lbnRpdHlCb3VuZHM9ZnVuY3Rpb24oZSl7cmV0dXJuIG5ldyB0KGUueCxlLnksZS54K2Uud2lkdGgsZS55K2UuaGVpZ2h0KX0sdC5ib3VuZHM9ZnVuY3Rpb24oZSl7cmV0dXJuIHQucG9pbnRQYWlyKGUudG9wTGVmdCxlLmJvdHRvbVJpZ2h0KX0sdC5wb2ludFBhaXI9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gbmV3IHQoTWF0aC5taW4oZS54LG4ueCksTWF0aC5taW4oZS55LG4ueSksTWF0aC5tYXgoZS54LG4ueCksTWF0aC5tYXgoZS55LG4ueSkpfSx0LnBvaW50cz1mdW5jdGlvbihlKXtpZihlLmxlbmd0aDwyKXRocm93IG5ldyBFcnJvcigibmVlZCBhdCBsZWFzdCAyIHBvaW50cyB0byBjcmVhdGUgYm91bmRzIik7dmFyIG49ZS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0Lnh9KSksaT1lLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQueX0pKTtyZXR1cm4gbmV3IHQobi5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGgubWluKHQsZSl9KSksaS5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGgubWluKHQsZSl9KSksbi5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGgubWF4KHQsZSl9KSksaS5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGgubWF4KHQsZSl9KSkpfSx0LnVuaW9uPWZ1bmN0aW9uKGUsbil7cmV0dXJuIG5ldyB0KE1hdGgubWluKGUueGwsbi54bCksTWF0aC5taW4oZS55bCxuLnlsKSxNYXRoLm1heChlLnhoLG4ueGgpLE1hdGgubWF4KGUueWgsbi55aCkpfSx0LnVuaW9uQWxsPWZ1bmN0aW9uKGUpe3JldHVybiAwPT09KGU9ZS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10fSkpKS5sZW5ndGg/bnVsbDplLnJlZHVjZSgoZnVuY3Rpb24oZSxuKXtyZXR1cm4gdC51bmlvbihlLG4pfSkpfSx0LmlzQm91bmRzT3ZlcmxhcEJvdW5kcz1mdW5jdGlvbihlLG4pe3JldHVybiB0LmlzQm91bmRzT3ZlcmxhcFgoZSxuKSYmdC5pc0JvdW5kc092ZXJsYXBZKGUsbil9LHQuaXNCb3VuZHNPdmVybGFwWD1mdW5jdGlvbih0LGUpe3JldHVybiEodC54aDxlLnhsfHx0LnhsPmUueGgpfSx0LmlzQm91bmRzT3ZlcmxhcFk9ZnVuY3Rpb24odCxlKXtyZXR1cm4hKHQueWg8ZS55bHx8dC55bD5lLnloKX0sdC5hYnNvbHV0ZURpc3RhbmNlVG9OZWFyRWRnZVg9ZnVuY3Rpb24odCxlKXt2YXIgbj10LndpZHRoLzI7cmV0dXJuIE1hdGgubWF4KE1hdGguYWJzKGUueC0odC54bCtuKSktbiwwKX0sdC5hYnNvbHV0ZURpc3RhbmNlVG9OZWFyRWRnZVk9ZnVuY3Rpb24odCxlKXt2YXIgbj10LmhlaWdodC8yO3JldHVybiBNYXRoLm1heChNYXRoLmFicyhlLnktKHQueWwrbikpLW4sMCl9LHQuYWJzb2x1dGVEaXN0YW5jZVRvRmFyRWRnZVg9ZnVuY3Rpb24oZSxuKXt2YXIgaT10LmFic29sdXRlRGlzdGFuY2VUb05lYXJFZGdlWChlLG4pO3JldHVybiAwPT09aT8wOmkrZS53aWR0aH0sdC5hYnNvbHV0ZURpc3RhbmNlVG9GYXJFZGdlWT1mdW5jdGlvbihlLG4pe3ZhciBpPXQuYWJzb2x1dGVEaXN0YW5jZVRvTmVhckVkZ2VZKGUsbik7cmV0dXJuIDA9PT1pPzA6aStlLmhlaWdodH0sdC5kaXN0YW5jZVNxdWFyZWRUb05lYXJFZGdlPWZ1bmN0aW9uKGUsbil7dmFyIGk9dC5hYnNvbHV0ZURpc3RhbmNlVG9OZWFyRWRnZVgoZSxuKSxyPXQuYWJzb2x1dGVEaXN0YW5jZVRvTmVhckVkZ2VZKGUsbik7cmV0dXJuIGkqaStyKnJ9LHQuZGlzdGFuY2VTcXVhcmVkVG9GYXJFZGdlPWZ1bmN0aW9uKGUsbil7dmFyIGk9dC5hYnNvbHV0ZURpc3RhbmNlVG9GYXJFZGdlWChlLG4pLHI9dC5hYnNvbHV0ZURpc3RhbmNlVG9GYXJFZGdlWShlLG4pO3JldHVybiBpKmkrcipyfSx0LnByb3RvdHlwZS5hcmVhPWZ1bmN0aW9uKCl7cmV0dXJuIG51bGw9PXRoaXMuYXJlYUNhY2hlZCYmKHRoaXMuYXJlYUNhY2hlZD0odGhpcy54aC10aGlzLnhsKSoodGhpcy55aC10aGlzLnlsKSksdGhpcy5hcmVhQ2FjaGVkfSx0LnByb3RvdHlwZS5jb250YWlucz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy54bDw9dC54JiZ0aGlzLnhoPj10LngmJnRoaXMueWw8PXQueSYmdGhpcy55aD49dC55fSx0fSkoKTt0LlJUcmVlQm91bmRzPXN9KSh4eXQpO3ZhciBFeXQ9e307IShmdW5jdGlvbih0KXsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBlPXdwdCxuPUNlLmV4cG9ydHMsaT1EX3Q7dC5JU3RhY2tpbmdPcmRlcj1iZ3QubWFrZUVudW0oWyJ0b3Bkb3duIiwiYm90dG9tdXAiXSk7dmFyIHI9d2luZG93Lk1hdGg7dC5zdGFjaz1mdW5jdGlvbiBvKG4scixhLHMpe3ZvaWQgMD09PXMmJihzPSJib3R0b211cCIpO3ZhciBsPWUubWFwKCksYz1lLm1hcCgpLHU9bmV3IGkuTWFwOyJ0b3Bkb3duIj09PXMmJihuPW4uc2xpY2UoKSkucmV2ZXJzZSgpO2Zvcih2YXIgaD0wLGQ9bjtoPGQubGVuZ3RoO2grKyl7Zm9yKHZhciBwPWRbaF0sZj1uZXcgaS5NYXAsbT1wLmRhdGEoKSxnPW0ubGVuZ3RoLF89MDtfPGc7XysrKXt2YXIgeT1tW19dLHY9cih5LF8scCksYj10Lm5vcm1hbGl6ZUtleSh2KSx4PSthKHksXyxwKSx3PXZvaWQgMCxTPXg+PTA/bDpjO1MuaGFzKGIpPyh3PVMuZ2V0KGIpLFMuc2V0KGIsdyt4KSk6KHc9MCxTLnNldChiLHgpKSxmLnNldChiLHtvZmZzZXQ6dyx2YWx1ZTp4LGF4aXNWYWx1ZTp2LG9yaWdpbmFsRGF0dW06eSxvcmlnaW5hbERhdGFzZXQ6cCxvcmlnaW5hbEluZGV4Ol99KX11LnNldChwLGYpfXJldHVybiB1fSx0LnN0YWNrZWRFeHRlbnRzPWZ1bmN0aW9uIGEodCl7dmFyIGU9bmV3IGkuTWFwLG49bmV3IGkuTWFwO3JldHVybiB0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCxyKXt2YXIgbz10Lm9mZnNldCt0LnZhbHVlLGE9aS5NYXRoLm1heChbbyx0Lm9mZnNldF0sdC5vZmZzZXQpLHM9aS5NYXRoLm1pbihbbyx0Lm9mZnNldF0sdC5vZmZzZXQpLGw9dC5heGlzVmFsdWU7ZS5oYXMocik/ZS5nZXQocikuZXh0ZW50PGEmJmUuc2V0KHIse2V4dGVudDphLGF4aXNWYWx1ZTpsLHN0YWNrZWREYXR1bTp0fSk6ZS5zZXQocix7ZXh0ZW50OmEsYXhpc1ZhbHVlOmwsc3RhY2tlZERhdHVtOnR9KSxuLmhhcyhyKT9uLmdldChyKS5leHRlbnQ+cyYmbi5zZXQocix7ZXh0ZW50OnMsYXhpc1ZhbHVlOmwsc3RhY2tlZERhdHVtOnR9KTpuLnNldChyLHtleHRlbnQ6cyxheGlzVmFsdWU6bCxzdGFja2VkRGF0dW06dH0pfSkpfSkpLHttYXhpbXVtRXh0ZW50czplLG1pbmltdW1FeHRlbnRzOm59fSx0LnN0YWNrZWRFeHRlbnQ9ZnVuY3Rpb24gcyhlLG4sbyl7dmFyIGE9W107ZS5mb3JFYWNoKChmdW5jdGlvbihlLGkpe2Zvcih2YXIgcj1pLmRhdGEoKSxzPXIubGVuZ3RoLGw9MDtsPHM7bCsrKXt2YXIgYz1yW2xdO2lmKG51bGw9PW98fG8oYyxsLGkpKXt2YXIgdT1lLmdldCh0Lm5vcm1hbGl6ZUtleShuKGMsbCxpKSkpO2EucHVzaCh1LnZhbHVlK3Uub2Zmc2V0KX19fSkpO3ZhciBzPWkuTWF0aC5tYXgoYSwwKSxsPWkuTWF0aC5taW4oYSwwKTtyZXR1cm5bci5taW4obCwwKSxyLm1heCgwLHMpXX0sdC5ub3JtYWxpemVLZXk9bi5tZW1vaXplKChmdW5jdGlvbih0KXtyZXR1cm4gU3RyaW5nKHQpfSkpfSkoRXl0KTt2YXIgVHl0PXt9LEN5dD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KEN5dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksQ3l0LlNIT1dfV0FSTklOR1M9ITAsQ3l0LkFERF9USVRMRV9FTEVNRU5UUz0hMCwKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KFR5dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIEF5dD1DeXQ7ZnVuY3Rpb24ga3l0KHQpe0F5dC5TSE9XX1dBUk5JTkdTJiZjb25zb2xlLndhcm4odCl9ZnVuY3Rpb24gTHl0KHQsZSl7Zm9yKHZhciBuPVtdLGk9MjtpPGFyZ3VtZW50cy5sZW5ndGg7aSsrKW5baS0yXT1hcmd1bWVudHNbaV07cmV0dXJuIDA9PT1lPyh0KG4pLC0xKTp3aW5kb3cuc2V0VGltZW91dCh0LGUsbil9VHl0Lndhcm49a3l0LFR5dC5zZXRUaW1lb3V0PUx5dCxUeXQuZGVib3VuY2U9ZnVuY3Rpb24gUHl0KHQsZSxuKXt2YXIgaT1udWxsLHI9W10sbz1mdW5jdGlvbigpe2UuYXBwbHkobixyKX07cmV0dXJuIGZ1bmN0aW9uKCl7cj1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMpLGNsZWFyVGltZW91dChpKSxpPUx5dChvLHQpfX0sVHl0LmRlcHJlY2F0ZWQ9ZnVuY3Rpb24gTnl0KHQsZSxuKXt2b2lkIDA9PT1uJiYobj0iIiksa3l0KCJNZXRob2QgIit0KyIgaGFzIGJlZW4gZGVwcmVjYXRlZCBpbiB2ZXJzaW9uICIrZSsiLiBQbGVhc2UgcmVmZXIgdG8gdGhlIHJlbGVhc2Ugbm90ZXMuICIrbil9O3ZhciBJeXQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTctcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KEl5dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIFJ5dD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuKXt0aGlzLmVudHJ5SW5kZXg9dCx0aGlzLmV4aXRJbmRleD10LHRoaXMubWluSW5kZXg9dCx0aGlzLm1heEluZGV4PXQsdGhpcy5idWNrZXRWYWx1ZT1lLHRoaXMubWluVmFsdWU9bix0aGlzLm1heFZhbHVlPW59cmV0dXJuIHQucHJvdG90eXBlLmlzSW5CdWNrZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHQ9PXRoaXMuYnVja2V0VmFsdWV9LHQucHJvdG90eXBlLmFkZFRvQnVja2V0PWZ1bmN0aW9uKHQsZSl7dDx0aGlzLm1pblZhbHVlJiYodGhpcy5taW5WYWx1ZT10LHRoaXMubWluSW5kZXg9ZSksdD50aGlzLm1heFZhbHVlJiYodGhpcy5tYXhWYWx1ZT10LHRoaXMubWF4SW5kZXg9ZSksdGhpcy5leGl0SW5kZXg9ZX0sdC5wcm90b3R5cGUuZ2V0VW5pcXVlSW5kaWNlcz1mdW5jdGlvbigpe3ZhciB0PVt0aGlzLmVudHJ5SW5kZXgsdGhpcy5tYXhJbmRleCx0aGlzLm1pbkluZGV4LHRoaXMuZXhpdEluZGV4XTtyZXR1cm4gdC5maWx0ZXIoKGZ1bmN0aW9uKGUsbil7cmV0dXJuIDA9PW58fGUhPXRbbi0xXX0pKX0sdH0pKCk7SXl0LkJ1Y2tldD1SeXQ7dmFyIE95dD17fSx6eXQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh6eXQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBEeXQ9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuU2V0P3RoaXMuX2VzNlNldD1uZXcgd2luZG93LlNldDp0aGlzLl92YWx1ZXM9W10sdGhpcy5zaXplPTB9cmV0dXJuIHQucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dGhpcy5fZXM2U2V0Pyh0aGlzLl9lczZTZXQuYWRkKHQpLHRoaXMuc2l6ZT10aGlzLl9lczZTZXQuc2l6ZSx0aGlzKToodGhpcy5oYXModCl8fCh0aGlzLl92YWx1ZXMucHVzaCh0KSx0aGlzLnNpemU9dGhpcy5fdmFsdWVzLmxlbmd0aCksdGhpcyl9LHQucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXtpZihudWxsIT10aGlzLl9lczZTZXQpe3ZhciBlPXRoaXMuX2VzNlNldC5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZT10aGlzLl9lczZTZXQuc2l6ZSxlfXZhciBuPXRoaXMuX3ZhbHVlcy5pbmRleE9mKHQpO3JldHVybi0xIT09biYmKHRoaXMuX3ZhbHVlcy5zcGxpY2UobiwxKSx0aGlzLnNpemU9dGhpcy5fdmFsdWVzLmxlbmd0aCwhMCl9LHQucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dGhpcy5fZXM2U2V0P3RoaXMuX2VzNlNldC5oYXModCk6LTEhPT10aGlzLl92YWx1ZXMuaW5kZXhPZih0KX0sdC5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7aWYobnVsbD09dGhpcy5fZXM2U2V0KXRoaXMuX3ZhbHVlcy5mb3JFYWNoKChmdW5jdGlvbihpKXt0LmNhbGwoZSxpLGksbil9KSk7ZWxzZXt0aGlzLl9lczZTZXQuZm9yRWFjaCgoZnVuY3Rpb24oaSxyKXtyZXR1cm4gdC5jYWxsKGUsaSxyLG4pfSksZSl9fSx0fSkoKTt6eXQuU2V0PUR5dCwKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KE95dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIEJ5dD1CTyxIeXQ9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBCeXQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuY2FsbENhbGxiYWNrcz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLGU9W10sbj0wO248YXJndW1lbnRzLmxlbmd0aDtuKyspZVtuXT1hcmd1bWVudHNbbl07cmV0dXJuIHRoaXMuZm9yRWFjaCgoZnVuY3Rpb24obil7bi5hcHBseSh0LGUpfSkpLHRoaXN9LGV9KSh6eXQuU2V0KTtPeXQuQ2FsbGJhY2tTZXQ9SHl0O3ZhciBGeXQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KEZ5dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIFZ5dD14eXQsVXl0PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLl9lbnRpdGllcz1bXSx0aGlzLl9ydHJlZT1uZXcgVnl0LlJUcmVlfXJldHVybiB0LnByb3RvdHlwZS5hZGRBbGw9ZnVuY3Rpb24odCxlLG4pe2lmKHRoaXMuX2VudGl0aWVzPXRoaXMuX2VudGl0aWVzLmNvbmNhdCh0KSx2b2lkIDAhPT1uKWZvcih2YXIgaT1WeXQuUlRyZWVCb3VuZHMuYm91bmRzKG4pLHI9MDtyPHQubGVuZ3RoO3IrKyl7dmFyIG89Vnl0LlJUcmVlQm91bmRzLmVudGl0eUJvdW5kcyhlKGE9dFtyXSkpO1Z5dC5SVHJlZUJvdW5kcy5pc0JvdW5kc092ZXJsYXBCb3VuZHMoaSxvKSYmdGhpcy5fcnRyZWUuaW5zZXJ0KG8sYSl9ZWxzZSBmb3Iocj0wO3I8dC5sZW5ndGg7cisrKXt2YXIgYTtvPVZ5dC5SVHJlZUJvdW5kcy5lbnRpdHlCb3VuZHMoZShhPXRbcl0pKTt0aGlzLl9ydHJlZS5pbnNlcnQobyxhKX19LHQucHJvdG90eXBlLmVudGl0eU5lYXJlc3Q9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3J0cmVlLmxvY2F0ZU5lYXJlc3QodCkucG9wKCl9LHQucHJvdG90eXBlLmVudGl0eU5lYXJlc3RYPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9ydHJlZS5sb2NhdGVOZWFyZXN0WCh0KS5wb3AoKX0sdC5wcm90b3R5cGUuZW50aXR5TmVhcmVzdFk9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3J0cmVlLmxvY2F0ZU5lYXJlc3RZKHQpLnBvcCgpfSx0LnByb3RvdHlwZS5lbnRpdGllc0luQm91bmRzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9ydHJlZS5pbnRlcnNlY3QoVnl0LlJUcmVlQm91bmRzLmVudGl0eUJvdW5kcyh0KSl9LHQucHJvdG90eXBlLmVudGl0aWVzSW5YQm91bmRzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9ydHJlZS5pbnRlcnNlY3RYKFZ5dC5SVHJlZUJvdW5kcy5lbnRpdHlCb3VuZHModCkpfSx0LnByb3RvdHlwZS5lbnRpdGllc0luWUJvdW5kcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcnRyZWUuaW50ZXJzZWN0WShWeXQuUlRyZWVCb3VuZHMuZW50aXR5Qm91bmRzKHQpKX0sdC5wcm90b3R5cGUuZW50aXRpZXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZW50aXRpZXN9LHR9KSgpO0Z5dC5FbnRpdHlTdG9yZT1VeXQ7dmFyIGp5dD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoanl0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgR3l0PVFfdCxXeXQ9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpeyJmdW5jdGlvbiI9PXR5cGVvZiB3aW5kb3cuTWFwP3RoaXMuX2VzNk1hcD1uZXcgd2luZG93Lk1hcDp0aGlzLl9rZXlWYWx1ZVBhaXJzPVtdfXJldHVybiB0LnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXtpZihHeXQuaXNOYU4odCkpdGhyb3cgbmV3IEVycm9yKCJOYU4gbWF5IG5vdCBiZSB1c2VkIGFzIGEga2V5IHRvIHRoZSBNYXAiKTtpZihudWxsIT10aGlzLl9lczZNYXApcmV0dXJuIHRoaXMuX2VzNk1hcC5zZXQodCxlKSx0aGlzO2Zvcih2YXIgbj0wO248dGhpcy5fa2V5VmFsdWVQYWlycy5sZW5ndGg7bisrKWlmKHRoaXMuX2tleVZhbHVlUGFpcnNbbl0ua2V5PT09dClyZXR1cm4gdGhpcy5fa2V5VmFsdWVQYWlyc1tuXS52YWx1ZT1lLHRoaXM7cmV0dXJuIHRoaXMuX2tleVZhbHVlUGFpcnMucHVzaCh7a2V5OnQsdmFsdWU6ZX0pLHRoaXN9LHQucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXtpZihudWxsIT10aGlzLl9lczZNYXApcmV0dXJuIHRoaXMuX2VzNk1hcC5nZXQodCk7Zm9yKHZhciBlPTA7ZTx0aGlzLl9rZXlWYWx1ZVBhaXJzLmxlbmd0aDtlKyspaWYodGhpcy5fa2V5VmFsdWVQYWlyc1tlXS5rZXk9PT10KXJldHVybiB0aGlzLl9rZXlWYWx1ZVBhaXJzW2VdLnZhbHVlfSx0LnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7aWYobnVsbCE9dGhpcy5fZXM2TWFwKXJldHVybiB0aGlzLl9lczZNYXAuaGFzKHQpO2Zvcih2YXIgZT0wO2U8dGhpcy5fa2V5VmFsdWVQYWlycy5sZW5ndGg7ZSsrKWlmKHRoaXMuX2tleVZhbHVlUGFpcnNbZV0ua2V5PT09dClyZXR1cm4hMDtyZXR1cm4hMX0sdC5wcm90b3R5cGUuZm9yRWFjaD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7aWYobnVsbD09dGhpcy5fZXM2TWFwKXRoaXMuX2tleVZhbHVlUGFpcnMuZm9yRWFjaCgoZnVuY3Rpb24oaSl7dC5jYWxsKGUsaS52YWx1ZSxpLmtleSxuKX0pKTtlbHNle3RoaXMuX2VzNk1hcC5mb3JFYWNoKChmdW5jdGlvbihpLHIpe3JldHVybiB0LmNhbGwoZSxpLHIsbil9KSxlKX19LHQucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXtpZihudWxsIT10aGlzLl9lczZNYXApcmV0dXJuIHRoaXMuX2VzNk1hcC5kZWxldGUodCk7Zm9yKHZhciBlPTA7ZTx0aGlzLl9rZXlWYWx1ZVBhaXJzLmxlbmd0aDtlKyspaWYodGhpcy5fa2V5VmFsdWVQYWlyc1tlXS5rZXk9PT10KXJldHVybiB0aGlzLl9rZXlWYWx1ZVBhaXJzLnNwbGljZShlLDEpLCEwO3JldHVybiExfSx0fSkoKTtqeXQuTWFwPVd5dDt2YXIgcXl0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE3LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShxeXQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHF5dC5hc3NpZ249ZnVuY3Rpb24gWXl0KCl7Zm9yKHZhciB0PVtdLGU9MDtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZV09YXJndW1lbnRzW2VdO2Zvcih2YXIgbj17fSxpPTAscj10O2k8ci5sZW5ndGg7aSsrKWZvcih2YXIgbz1yW2ldLGE9T2JqZWN0LmtleXMobykscz0wLGw9YTtzPGwubGVuZ3RoO3MrKyl7dmFyIGM9bFtzXTtuW2NdPW9bY119cmV0dXJuIG59O3ZhciBYeXQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTctcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KFh5dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyICR5dD1EX3QsS3l0PSJfX1Bsb3R0YWJsZV9DbGllbnRUcmFuc2xhdG9yIjtYeXQuZ2V0VHJhbnNsYXRvcj1mdW5jdGlvbiBaeXQodCl7dmFyIGU9dC5yb290KCkucm9vdEVsZW1lbnQoKS5ub2RlKCksbj1lW0t5dF07cmV0dXJuIG51bGw9PW4mJihuPW5ldyBKeXQoZSksZVtLeXRdPW4pLG59O3ZhciBKeXQ9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0KXt0aGlzLl9yb290RWxlbWVudD10fXJldHVybiB0LnByb3RvdHlwZS5jb21wdXRlUG9zaXRpb249ZnVuY3Rpb24odCxlKXt2YXIgbj17eDp0LHk6ZX0saT0keXQuTWF0aC5nZXRDdW11bGF0aXZlVHJhbnNmb3JtKHRoaXMuX3Jvb3RFbGVtZW50KTtyZXR1cm4gbnVsbD09aT9uOiR5dC5NYXRoLmFwcGx5VHJhbnNmb3JtKGksbil9LHQuaXNFdmVudEluc2lkZT1mdW5jdGlvbih0LGUpe3JldHVybiAkeXQuRE9NLmNvbnRhaW5zKHQucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpLGUudGFyZ2V0KX0sdH0pKCk7WHl0LlRyYW5zbGF0b3I9Snl0LChmdW5jdGlvbih0KXsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBlPUJPO3QuQXJyYXk9Ql90LHQuQ29sb3I9V190LHQuRE9NPUpfdCx0Lk1hdGg9UV90LHQuUlRyZWU9eHl0LHQuU3RhY2tpbmc9RXl0LHQuV2luZG93PVR5dCxlLl9fZXhwb3J0U3RhcihJeXQsdCksZS5fX2V4cG9ydFN0YXIoT3l0LHQpLGUuX19leHBvcnRTdGFyKF9ndCx0KSxlLl9fZXhwb3J0U3RhcihGeXQsdCksZS5fX2V4cG9ydFN0YXIoanl0LHQpLGUuX19leHBvcnRTdGFyKHF5dCx0KSxlLl9fZXhwb3J0U3Rhcih6eXQsdCksZS5fX2V4cG9ydFN0YXIoWHl0LHQpfSkoRF90KTt2YXIgUXl0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShReXQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciB0dnQ9RF90LGV2dD16X3QsbnZ0PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe2V2dC5mbHVzaCgpfSx0fSkoKTtReXQuSW1tZWRpYXRlPW52dDt2YXIgaXZ0PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt9cmV0dXJuIHQucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3R2dC5ET00ucmVxdWVzdEFuaW1hdGlvbkZyYW1lUG9seWZpbGwoZXZ0LmZsdXNoKX0sdH0pKCk7UXl0LkFuaW1hdGlvbkZyYW1lPWl2dDt2YXIgcnZ0PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLl90aW1lb3V0TXNlYz10dnQuRE9NLlNDUkVFTl9SRUZSRVNIX1JBVEVfTUlMTElTRUNPTkRTfXJldHVybiB0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGV2dC5mbHVzaCx0aGlzLl90aW1lb3V0TXNlYyl9LHR9KSgpO1F5dC5UaW1lb3V0PXJ2dCwoZnVuY3Rpb24odCl7Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZT1EX3Qsbj1iZ3QsaT1ReXQscj1uZXcgZS5TZXQsbz1uZXcgZS5TZXQsYT0hMSxzPSExO3QuUG9saWN5PW4ubWFrZUVudW0oWyJpbW1lZGlhdGUiLCJhbmltYXRpb25GcmFtZSIsInRpbWVvdXQiXSk7dmFyIGw9bmV3IGkuQW5pbWF0aW9uRnJhbWU7ZnVuY3Rpb24gYyh0KXtvLmFkZCh0KSxyLmFkZCh0KSx1KCl9ZnVuY3Rpb24gdSgpe2F8fChhPSEwLGwucmVuZGVyKCkpfXQucmVuZGVyUG9saWN5PWZ1bmN0aW9uIGgobil7aWYobnVsbD09bilyZXR1cm4gbDtzd2l0Y2gobil7Y2FzZSB0LlBvbGljeS5pbW1lZGlhdGU6bD1uZXcgaS5JbW1lZGlhdGU7YnJlYWs7Y2FzZSB0LlBvbGljeS5hbmltYXRpb25GcmFtZTpsPW5ldyBpLkFuaW1hdGlvbkZyYW1lO2JyZWFrO2Nhc2UgdC5Qb2xpY3kudGltZW91dDpsPW5ldyBpLlRpbWVvdXQ7YnJlYWs7ZGVmYXVsdDplLldpbmRvdy53YXJuKCJVbnJlY29nbml6ZWQgcmVuZGVyUG9saWN5OiAiK24pfX0sdC5yZWdpc3RlclRvUmVuZGVyPWZ1bmN0aW9uIGQodCl7cyYmZS5XaW5kb3cud2FybigiUmVnaXN0ZXJlZCB0byByZW5kZXIgd2hpbGUgb3RoZXIgY29tcG9uZW50cyBhcmUgZmx1c2hpbmc6IHJlcXVlc3QgbWF5IGJlIGlnbm9yZWQiKSxyLmFkZCh0KSx1KCl9LHQucmVnaXN0ZXJUb0NvbXB1dGVMYXlvdXRBbmRSZW5kZXI9Yyx0LnJlZ2lzdGVyVG9Db21wdXRlTGF5b3V0PWZ1bmN0aW9uIHAodCl7Yyh0KX0sdC5mbHVzaD1mdW5jdGlvbiBmKCl7aWYoYSl7by5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gdC5jb21wdXRlTGF5b3V0KCl9KSksci5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gdC5yZW5kZXIoKX0pKSxzPSEwO3ZhciB0PW5ldyBlLlNldDtyLmZvckVhY2goKGZ1bmN0aW9uKGUpe3RyeXtlLnJlbmRlckltbWVkaWF0ZWx5KCl9Y2F0Y2gobil7d2luZG93LnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7dGhyb3cgbn0pLDApLHQuYWRkKGUpfX0pKSxvPW5ldyBlLlNldCxyPXQsYT0hMSxzPSExfX19KSh6X3QpLAovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkoT190LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgb3Z0PXdwdCxhdnQ9el90LHN2dD1EX3QsbHZ0PUNlLmV4cG9ydHMsY3Z0PV9ndCx1dnQ9Ymd0O09fdC5YQWxpZ25tZW50PXV2dC5tYWtlRW51bShbImxlZnQiLCJjZW50ZXIiLCJyaWdodCJdKSxPX3QuWUFsaWdubWVudD11dnQubWFrZUVudW0oWyJ0b3AiLCJjZW50ZXIiLCJib3R0b20iXSk7dmFyIGh2dD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7dGhpcy5fb3ZlcmZsb3dIaWRkZW49ITEsdGhpcy5fb3JpZ2luPXt4OjAseTowfSx0aGlzLl94QWxpZ25tZW50PSJsZWZ0Iix0aGlzLl95QWxpZ25tZW50PSJ0b3AiLHRoaXMuX2lzU2V0dXA9ITEsdGhpcy5faXNBbmNob3JlZD0hMSx0aGlzLl9jc3NDbGFzc2VzPW5ldyBzdnQuU2V0LHRoaXMuX2Rlc3Ryb3llZD0hMSx0aGlzLl9vbkFuY2hvckNhbGxiYWNrcz1uZXcgc3Z0LkNhbGxiYWNrU2V0LHRoaXMuX29uRGV0YWNoQ2FsbGJhY2tzPW5ldyBzdnQuQ2FsbGJhY2tTZXQsdGhpcy5fY3NzQ2xhc3Nlcy5hZGQoImNvbXBvbmVudCIpfXJldHVybiB0LnByb3RvdHlwZS5hbmNob3I9ZnVuY3Rpb24odCl7aWYodD1jdnQuY29lcmNlRXh0ZXJuYWxEMyh0KSx0aGlzLl9kZXN0cm95ZWQpdGhyb3cgbmV3IEVycm9yKCJDYW4ndCByZXVzZSBkZXN0cm95KCktZWQgQ29tcG9uZW50cyEiKTtyZXR1cm4gdGhpcy5pc1Jvb3QoKSYmKHRoaXMuX3Jvb3RFbGVtZW50PXQsdGhpcy5fcm9vdEVsZW1lbnQuY2xhc3NlZCgicGxvdHRhYmxlIiwhMCkpLG51bGwhPXRoaXMuX2VsZW1lbnQ/dC5ub2RlKCkuYXBwZW5kQ2hpbGQodGhpcy5fZWxlbWVudC5ub2RlKCkpOih0aGlzLl9lbGVtZW50PXQuYXBwZW5kKCJkaXYiKSx0aGlzLl9zZXR1cCgpKSx0aGlzLl9pc0FuY2hvcmVkPSEwLHRoaXMuX29uQW5jaG9yQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcyksdGhpc30sdC5wcm90b3R5cGUub25BbmNob3I9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2lzQW5jaG9yZWQmJnQodGhpcyksdGhpcy5fb25BbmNob3JDYWxsYmFja3MuYWRkKHQpLHRoaXN9LHQucHJvdG90eXBlLm9mZkFuY2hvcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fb25BbmNob3JDYWxsYmFja3MuZGVsZXRlKHQpLHRoaXN9LHQucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5faXNTZXR1cHx8KHRoaXMuX2Nzc0NsYXNzZXMuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dC5fZWxlbWVudC5jbGFzc2VkKGUsITApfSkpLHRoaXMuX2Nzc0NsYXNzZXM9bmV3IHN2dC5TZXQsdGhpcy5fYmFja2dyb3VuZENvbnRhaW5lcj10aGlzLl9lbGVtZW50LmFwcGVuZCgic3ZnIikuY2xhc3NlZCgiYmFja2dyb3VuZC1jb250YWluZXIiLCEwKSx0aGlzLl9jb250ZW50PXRoaXMuX2VsZW1lbnQuYXBwZW5kKCJzdmciKS5jbGFzc2VkKCJjb250ZW50IiwhMCksdGhpcy5fZm9yZWdyb3VuZENvbnRhaW5lcj10aGlzLl9lbGVtZW50LmFwcGVuZCgic3ZnIikuY2xhc3NlZCgiZm9yZWdyb3VuZC1jb250YWluZXIiLCEwKSx0aGlzLl9jb250ZW50LmNsYXNzZWQodGhpcy5fb3ZlcmZsb3dIaWRkZW4/ImNvbXBvbmVudC1vdmVyZmxvdy1oaWRkZW4iOiJjb21wb25lbnQtb3ZlcmZsb3ctdmlzaWJsZSIsITApLHRoaXMuX2lzU2V0dXA9ITApfSx0LnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbih0LGUpe3JldHVybnttaW5XaWR0aDowLG1pbkhlaWdodDowfX0sdC5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihlLG4saSl7aWYobnVsbD09ZXx8bnVsbD09bnx8bnVsbD09aSl7aWYobnVsbD09dGhpcy5fZWxlbWVudCl0aHJvdyBuZXcgRXJyb3IoImFuY2hvcigpIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBjb21wdXRlTGF5b3V0KCkiKTtpZihudWxsPT10aGlzLl9yb290RWxlbWVudCl0aHJvdyBuZXcgRXJyb3IoIm51bGwgYXJndW1lbnRzIGNhbm5vdCBiZSBwYXNzZWQgdG8gY29tcHV0ZUxheW91dCgpIG9uIGEgbm9uLXJvb3QsIHVuYW5jaG9yZWQgbm9kZSIpO2U9e3g6MCx5OjB9O3ZhciByPXRoaXMuX3Jvb3RFbGVtZW50Lm5vZGUoKTtuPXN2dC5ET00uZWxlbWVudFdpZHRoKHIpLGk9c3Z0LkRPTS5lbGVtZW50SGVpZ2h0KHIpfXZhciBvPXRoaXMuX3NpemVGcm9tT2ZmZXIobixpKSxhPW8uaGVpZ2h0LHM9by53aWR0aDtyZXR1cm4gdGhpcy5zZXRCb3VuZHMocyxhLGUueCsobi1zKSp0Ll94QWxpZ25Ub1Byb3BvcnRpb25bdGhpcy5feEFsaWdubWVudF0sZS55KyhpLWEpKnQuX3lBbGlnblRvUHJvcG9ydGlvblt0aGlzLl95QWxpZ25tZW50XSksdGhpc30sdC5wcm90b3R5cGUuc2V0Qm91bmRzPWZ1bmN0aW9uKHQsZSxuLGkpe3JldHVybiB2b2lkIDA9PT1uJiYobj0wKSx2b2lkIDA9PT1pJiYoaT0wKSx0aGlzLl93aWR0aD10LHRoaXMuX2hlaWdodD1lLHRoaXMuX29yaWdpbj17eDpuLHk6aX0sbnVsbCE9dGhpcy5fZWxlbWVudCYmdGhpcy5fZWxlbWVudC5zdHlsZXMoe2xlZnQ6bisicHgiLGhlaWdodDplKyJweCIsdG9wOmkrInB4Iix3aWR0aDp0KyJweCJ9KSxudWxsIT10aGlzLl9yZXNpemVIYW5kbGVyJiZ0aGlzLl9yZXNpemVIYW5kbGVyKHt3aWR0aDp0LGhlaWdodDplfSksdGhpc30sdC5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLnJlcXVlc3RlZFNwYWNlKHQsZSk7cmV0dXJue3dpZHRoOnRoaXMuZml4ZWRXaWR0aCgpP01hdGgubWluKHQsbi5taW5XaWR0aCk6dCxoZWlnaHQ6dGhpcy5maXhlZEhlaWdodCgpP01hdGgubWluKGUsbi5taW5IZWlnaHQpOmV9fSx0LnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNBbmNob3JlZCYmdGhpcy5faXNTZXR1cCYmdGhpcy53aWR0aCgpPj0wJiZ0aGlzLmhlaWdodCgpPj0wJiZhdnQucmVnaXN0ZXJUb1JlbmRlcih0aGlzKSx0aGlzfSx0LnByb3RvdHlwZS5yZW5kZXJMb3dQcmlvcml0eT1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJlbmRlcigpfSx0LnByb3RvdHlwZS5fc2NoZWR1bGVDb21wdXRlTGF5b3V0PWZ1bmN0aW9uKCl7dGhpcy5faXNBbmNob3JlZCYmdGhpcy5faXNTZXR1cCYmYXZ0LnJlZ2lzdGVyVG9Db21wdXRlTGF5b3V0QW5kUmVuZGVyKHRoaXMpfSx0LnByb3RvdHlwZS5vblJlc2l6ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmVzaXplSGFuZGxlcj10LHRoaXN9LHQucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LHQucHJvdG90eXBlLnJlZHJhdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9pc0FuY2hvcmVkJiZ0aGlzLl9pc1NldHVwJiYodGhpcy5pc1Jvb3QoKT90aGlzLl9zY2hlZHVsZUNvbXB1dGVMYXlvdXQoKTp0aGlzLnBhcmVudCgpLnJlZHJhdygpKSx0aGlzfSx0LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXt9LHQucHJvdG90eXBlLnJlbmRlclRvPWZ1bmN0aW9uKHQpe2lmKHRoaXMuZGV0YWNoKCksbnVsbCE9dCl7dmFyIGU9dm9pZCAwO2lmKCEoZT0ic3RyaW5nIj09dHlwZW9mIHR8fGx2dC5pc0VsZW1lbnQodCk/b3Z0LnNlbGVjdCh0KTpjdnQuY29lcmNlRXh0ZXJuYWxEMyh0KSkubm9kZSgpfHxudWxsPT1lLm5vZGUoKS5ub2RlTmFtZSl0aHJvdyBuZXcgRXJyb3IoIlBsb3R0YWJsZSByZXF1aXJlcyBhIHZhbGlkIEVsZW1lbnQgdG8gcmVuZGVyVG8iKTtpZigic3ZnIj09PWUubm9kZSgpLm5vZGVOYW1lKXRocm93IG5ldyBFcnJvcigiUGxvdHRhYmxlIDMueCBhbmQgbGF0ZXIgY2FuIG9ubHkgcmVuZGVyVG8gYW4gSFRNTCBjb21wb25lbnQ7IHBhc3MgYSBkaXYgaW5zdGVhZCEiKTt0aGlzLmFuY2hvcihlKX1pZihudWxsPT10aGlzLl9lbGVtZW50KXRocm93IG5ldyBFcnJvcigiSWYgYSBDb21wb25lbnQgaGFzIG5ldmVyIGJlZW4gcmVuZGVyZWQgYmVmb3JlLCB0aGVuIHJlbmRlclRvIG11c3QgYmUgZ2l2ZW4gYSBub2RlIHRvIHJlbmRlciB0bywgb3IgYSBkMy5TZWxlY3Rpb24sIG9yIGEgc2VsZWN0b3Igc3RyaW5nIik7cmV0dXJuIGF2dC5yZWdpc3RlclRvQ29tcHV0ZUxheW91dEFuZFJlbmRlcih0aGlzKSxhdnQuZmx1c2goKSx0aGlzfSx0LnByb3RvdHlwZS54QWxpZ25tZW50PWZ1bmN0aW9uKGUpe2lmKG51bGw9PWUpcmV0dXJuIHRoaXMuX3hBbGlnbm1lbnQ7aWYoZT1lLnRvTG93ZXJDYXNlKCksbnVsbD09dC5feEFsaWduVG9Qcm9wb3J0aW9uW2VdKXRocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgYWxpZ25tZW50OiAiK2UpO3JldHVybiB0aGlzLl94QWxpZ25tZW50PWUsdGhpcy5yZWRyYXcoKSx0aGlzfSx0LnByb3RvdHlwZS55QWxpZ25tZW50PWZ1bmN0aW9uKGUpe2lmKG51bGw9PWUpcmV0dXJuIHRoaXMuX3lBbGlnbm1lbnQ7aWYoZT1lLnRvTG93ZXJDYXNlKCksbnVsbD09dC5feUFsaWduVG9Qcm9wb3J0aW9uW2VdKXRocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgYWxpZ25tZW50OiAiK2UpO3JldHVybiB0aGlzLl95QWxpZ25tZW50PWUsdGhpcy5yZWRyYXcoKSx0aGlzfSx0LnByb3RvdHlwZS5oYXNDbGFzcz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dCYmKG51bGw9PXRoaXMuX2VsZW1lbnQ/dGhpcy5fY3NzQ2xhc3Nlcy5oYXModCk6dGhpcy5fZWxlbWVudC5jbGFzc2VkKHQpKX0sdC5wcm90b3R5cGUuYWRkQ2xhc3M9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXR8fChudWxsPT10aGlzLl9lbGVtZW50P3RoaXMuX2Nzc0NsYXNzZXMuYWRkKHQpOnRoaXMuX2VsZW1lbnQuY2xhc3NlZCh0LCEwKSksdGhpc30sdC5wcm90b3R5cGUucmVtb3ZlQ2xhc3M9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXR8fChudWxsPT10aGlzLl9lbGVtZW50P3RoaXMuX2Nzc0NsYXNzZXMuZGVsZXRlKHQpOnRoaXMuX2VsZW1lbnQuY2xhc3NlZCh0LCExKSksdGhpc30sdC5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiExfSx0LnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiExfSx0LnByb3RvdHlwZS5kZXRhY2g9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJlbnQobnVsbCksdGhpcy5faXNBbmNob3JlZCYmdGhpcy5fZWxlbWVudC5yZW1vdmUoKSx0aGlzLl9pc0FuY2hvcmVkPSExLHRoaXMuX29uRGV0YWNoQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcyksdGhpc30sdC5wcm90b3R5cGUub25EZXRhY2g9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX29uRGV0YWNoQ2FsbGJhY2tzLmFkZCh0KSx0aGlzfSx0LnByb3RvdHlwZS5vZmZEZXRhY2g9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX29uRGV0YWNoQ2FsbGJhY2tzLmRlbGV0ZSh0KSx0aGlzfSx0LnByb3RvdHlwZS5wYXJlbnQ9ZnVuY3Rpb24odCl7aWYodm9pZCAwPT09dClyZXR1cm4gdGhpcy5fcGFyZW50O2lmKG51bGwhPT10JiYhdC5oYXModGhpcykpdGhyb3cgbmV3IEVycm9yKCJQYXNzZWQgaW52YWxpZCBwYXJlbnQiKTtyZXR1cm4gdGhpcy5fcGFyZW50PXQsdGhpc30sdC5wcm90b3R5cGUuYm91bmRzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5vcmlnaW4oKTtyZXR1cm57dG9wTGVmdDp0LGJvdHRvbVJpZ2h0Ont4OnQueCt0aGlzLndpZHRoKCkseTp0LnkrdGhpcy5oZWlnaHQoKX19fSx0LnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5fZGVzdHJveWVkPSEwLHRoaXMuZGV0YWNoKCl9LHQucHJvdG90eXBlLndpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3dpZHRofSx0LnByb3RvdHlwZS5oZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faGVpZ2h0fSx0LnByb3RvdHlwZS5vcmlnaW49ZnVuY3Rpb24oKXtyZXR1cm57eDp0aGlzLl9vcmlnaW4ueCx5OnRoaXMuX29yaWdpbi55fX0sdC5wcm90b3R5cGUub3JpZ2luVG9Sb290PWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMub3JpZ2luKCksZT10aGlzLnBhcmVudCgpO251bGwhPWU7KXt2YXIgbj1lLm9yaWdpbigpO3QueCs9bi54LHQueSs9bi55LGU9ZS5wYXJlbnQoKX1yZXR1cm4gdH0sdC5wcm90b3R5cGUucm9vdD1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzOyF0LmlzUm9vdCgpOyl0PXQucGFyZW50KCk7cmV0dXJuIHR9LHQucHJvdG90eXBlLmlzUm9vdD1mdW5jdGlvbigpe3JldHVybiBudWxsPT10aGlzLnBhcmVudCgpfSx0LnByb3RvdHlwZS5mb3JlZ3JvdW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZvcmVncm91bmRDb250YWluZXJ9LHQucHJvdG90eXBlLmNvbnRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29udGVudH0sdC5wcm90b3R5cGUuZWxlbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lbGVtZW50fSx0LnByb3RvdHlwZS5yb290RWxlbWVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLnJvb3QoKS5fcm9vdEVsZW1lbnR9LHQucHJvdG90eXBlLmJhY2tncm91bmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFja2dyb3VuZENvbnRhaW5lcn0sdC5feEFsaWduVG9Qcm9wb3J0aW9uPXtsZWZ0OjAsY2VudGVyOi41LHJpZ2h0OjF9LHQuX3lBbGlnblRvUHJvcG9ydGlvbj17dG9wOjAsY2VudGVyOi41LGJvdHRvbToxfSx0fSkoKTtPX3QuQ29tcG9uZW50PWh2dDt2YXIgZHZ0PXt9LHB2dD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KHB2dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGZ2dD13cHQ7ZnVuY3Rpb24gbXZ0KHQpe3JldHVybiB2b2lkIDA9PT10JiYodD0zKSxndnQodCksZnVuY3Rpb24oZSl7cmV0dXJuIGUudG9GaXhlZCh0KX19ZnVuY3Rpb24gZ3Z0KHQpe2lmKHQ8MHx8dD4yMCl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRm9ybWF0dGVyIHByZWNpc2lvbiBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMjAiKTtpZih0IT09TWF0aC5mbG9vcih0KSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRm9ybWF0dGVyIHByZWNpc2lvbiBtdXN0IGJlIGFuIGludGVnZXIiKX0KLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9wdnQuY3VycmVuY3k9ZnVuY3Rpb24gX3Z0KHQsZSxuKXt2b2lkIDA9PT10JiYodD0yKSx2b2lkIDA9PT1lJiYoZT0iJCIpLHZvaWQgMD09PW4mJihuPSEwKTt2YXIgaT1tdnQodCk7cmV0dXJuIGZ1bmN0aW9uKHQpe3ZhciByPWkoTWF0aC5hYnModCkpO3JldHVybiIiIT09ciYmKG4/cj1lK3I6cis9ZSx0PDAmJihyPSItIityKSkscn19LHB2dC5maXhlZD1tdnQscHZ0LmdlbmVyYWw9ZnVuY3Rpb24geXZ0KHQpe3JldHVybiB2b2lkIDA9PT10JiYodD0zKSxndnQodCksZnVuY3Rpb24oZSl7aWYoIm51bWJlciI9PXR5cGVvZiBlKXt2YXIgbj1NYXRoLnBvdygxMCx0KTtyZXR1cm4gU3RyaW5nKE1hdGgucm91bmQoZSpuKS9uKX1yZXR1cm4gU3RyaW5nKGUpfX0scHZ0LmlkZW50aXR5PWZ1bmN0aW9uIHZ2dCgpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gU3RyaW5nKHQpfX0scHZ0LnBlcmNlbnRhZ2U9ZnVuY3Rpb24gYnZ0KHQpe3ZvaWQgMD09PXQmJih0PTApO3ZhciBlPW12dCh0KTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIG49MTAwKnQsaT10LnRvU3RyaW5nKCkscj1NYXRoLnBvdygxMCxpLmxlbmd0aC0oaS5pbmRleE9mKCIuIikrMSkpO3JldHVybiBuPXBhcnNlSW50KChuKnIpLnRvU3RyaW5nKCksMTApL3IsZShuKSsiJSJ9fSxwdnQuc2lTdWZmaXg9ZnVuY3Rpb24geHZ0KHQpe3JldHVybiB2b2lkIDA9PT10JiYodD0zKSxndnQodCksZnVuY3Rpb24oZSl7cmV0dXJuIGZ2dC5mb3JtYXQoIi4iK3QrInMiKShlKX19LHB2dC5zaG9ydFNjYWxlPWZ1bmN0aW9uIHd2dCh0KXt2b2lkIDA9PT10JiYodD0zKSxndnQodCk7dmFyIGU9IktNQlRRIixuPWZ2dC5mb3JtYXQoIi4iK3QrImUiKSxpPWZ2dC5mb3JtYXQoIi4iK3QrImYiKSxyPU1hdGgucG93KDEwLDMqKGUubGVuZ3RoKzEpKSxvPU1hdGgucG93KDEwLC10KTtyZXR1cm4gZnVuY3Rpb24odCl7dmFyIGE9TWF0aC5hYnModCk7aWYoKGE8b3x8YT49cikmJjAhPT1hKXJldHVybiBuKHQpO2Zvcih2YXIgcz0tMTthPj1NYXRoLnBvdygxZTMscysyKSYmczxlLmxlbmd0aC0xOylzKys7dmFyIGw9IiI7cmV0dXJuIGw9LTE9PT1zP2kodCk6aSh0L01hdGgucG93KDFlMyxzKzEpKStlW3NdLCh0PjAmJiIxMDAwIj09PWwuc3Vic3RyKDAsNCl8fHQ8MCYmIi0xMDAwIj09PWwuc3Vic3RyKDAsNSkpJiYoczxlLmxlbmd0aC0xPyhzKyssbD1pKHQvTWF0aC5wb3coMWUzLHMrMSkpK2Vbc10pOmw9bih0KSksbH19LHB2dC5tdWx0aVRpbWU9ZnVuY3Rpb24gU3Z0KCl7dmFyIHQ9W3tzcGVjaWZpZXI6Ii4lTCIscHJlZGljYXRlOmZ1bmN0aW9uKHQpe3JldHVybiAwIT09dC5nZXRNaWxsaXNlY29uZHMoKX19LHtzcGVjaWZpZXI6IjolUyIscHJlZGljYXRlOmZ1bmN0aW9uKHQpe3JldHVybiAwIT09dC5nZXRTZWNvbmRzKCl9fSx7c3BlY2lmaWVyOiIlSTolTSIscHJlZGljYXRlOmZ1bmN0aW9uKHQpe3JldHVybiAwIT09dC5nZXRNaW51dGVzKCl9fSx7c3BlY2lmaWVyOiIlSSAlcCIscHJlZGljYXRlOmZ1bmN0aW9uKHQpe3JldHVybiAwIT09dC5nZXRIb3VycygpfX0se3NwZWNpZmllcjoiJWEgJWQiLHByZWRpY2F0ZTpmdW5jdGlvbih0KXtyZXR1cm4gMCE9PXQuZ2V0RGF5KCkmJjEhPT10LmdldERhdGUoKX19LHtzcGVjaWZpZXI6IiViICVkIixwcmVkaWNhdGU6ZnVuY3Rpb24odCl7cmV0dXJuIDEhPT10LmdldERhdGUoKX19LHtzcGVjaWZpZXI6IiViIixwcmVkaWNhdGU6ZnVuY3Rpb24odCl7cmV0dXJuIDAhPT10LmdldE1vbnRoKCl9fV07cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPXQuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gdC5wcmVkaWNhdGUoZSl9KSk7cmV0dXJuIGZ2dC50aW1lRm9ybWF0KG4ubGVuZ3RoPjA/blswXS5zcGVjaWZpZXI6IiVZIikoZSl9fSxwdnQudGltZT1mdW5jdGlvbiBNdnQodCxlKXtyZXR1cm4gdm9pZCAwPT09ZSYmKGU9ZmFsc2UpLGU/ZnZ0LnV0Y0Zvcm1hdCh0KTpmdnQudGltZUZvcm1hdCh0KX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGR2dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIEV2dD1CTyxUdnQ9d3B0LEN2dD1MZ3QsQXZ0PU9fdCxrdnQ9cHZ0LEx2dD1EX3Q7ZHZ0LkF4aXNPcmllbnRhdGlvbj1iZ3QubWFrZUVudW0oWyJib3R0b20iLCJsZWZ0IiwicmlnaHQiLCJ0b3AiXSk7dmFyIFB2dD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3ZhciBpPXQuY2FsbCh0aGlzKXx8dGhpcztpZihpLl9lbmRUaWNrTGVuZ3RoPTUsaS5faW5uZXJUaWNrTGVuZ3RoPTUsaS5fdGlja0xhYmVsUGFkZGluZz0xMCxpLl9tYXJnaW49MTUsaS5fc2hvd0VuZFRpY2tMYWJlbHM9ITEsaS5fYW5ub3RhdGlvbnNFbmFibGVkPSExLGkuX2Fubm90YXRpb25UaWVyQ291bnQ9MSxudWxsPT1lfHxudWxsPT1uKXRocm93IG5ldyBFcnJvcigiQXhpcyByZXF1aXJlcyBhIHNjYWxlIGFuZCBvcmllbnRhdGlvbiIpO3JldHVybiBpLl9zY2FsZT1lLGkub3JpZW50YXRpb24obiksaS5fc2V0RGVmYXVsdEFsaWdubWVudCgpLGkuYWRkQ2xhc3MoImF4aXMiKSxpLmlzSG9yaXpvbnRhbCgpP2kuYWRkQ2xhc3MoIngtYXhpcyIpOmkuYWRkQ2xhc3MoInktYXhpcyIpLGkuZm9ybWF0dGVyKGt2dC5pZGVudGl0eSgpKSxpLl9yZXNjYWxlQ2FsbGJhY2s9ZnVuY3Rpb24odCl7cmV0dXJuIGkuX3Jlc2NhbGUoKX0saS5fc2NhbGUub25VcGRhdGUoaS5fcmVzY2FsZUNhbGxiYWNrKSxpLl9hbm5vdGF0ZWRUaWNrcz1bXSxpLl9hbm5vdGF0aW9uRm9ybWF0dGVyPWt2dC5pZGVudGl0eSgpLGl9cmV0dXJuIEV2dC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpLHRoaXMuX3NjYWxlLm9mZlVwZGF0ZSh0aGlzLl9yZXNjYWxlQ2FsbGJhY2spfSxlLnByb3RvdHlwZS50aWNrTGFiZWxEYXRhT25FbGVtZW50PWZ1bmN0aW9uKHQpe2lmKG51bGwhPXQpe2Zvcih2YXIgbjtudWxsIT10JiZ0LmNsYXNzTGlzdCYmdm9pZCAwPT09bjspdC5jbGFzc0xpc3QuY29udGFpbnMoZS5USUNLX0xBQkVMX0NMQVNTKT9uPXQ6dD10LnBhcmVudE5vZGU7cmV0dXJuIHZvaWQgMD09PXQ/dm9pZCAwOlR2dC5zZWxlY3QodCkuZGF0dW0oKX19LGUucHJvdG90eXBlLl9jb21wdXRlV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCl9LGUucHJvdG90eXBlLl9jb21wdXRlSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21heExhYmVsVGlja0xlbmd0aCgpfSxlLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbih0LG4pe3ZhciBpPTAscj0wO3RoaXMuaXNIb3Jpem9udGFsKCk/KHI9dGhpcy5fY29tcHV0ZUhlaWdodCgpK3RoaXMuX21hcmdpbix0aGlzLmFubm90YXRpb25zRW5hYmxlZCgpJiYocis9KHRoaXMuX2Fubm90YXRpb25NZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0KzIqZS5fQU5OT1RBVElPTl9MQUJFTF9QQURESU5HKSp0aGlzLmFubm90YXRpb25UaWVyQ291bnQoKSkpOihpPXRoaXMuX2NvbXB1dGVXaWR0aCgpK3RoaXMuX21hcmdpbix0aGlzLmFubm90YXRpb25zRW5hYmxlZCgpJiYoaSs9KHRoaXMuX2Fubm90YXRpb25NZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0KzIqZS5fQU5OT1RBVElPTl9MQUJFTF9QQURESU5HKSp0aGlzLmFubm90YXRpb25UaWVyQ291bnQoKSkpO3JldHVybnttaW5XaWR0aDppLG1pbkhlaWdodDpyfX0sZS5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pc0hvcml6b250YWwoKX0sZS5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiF0aGlzLmlzSG9yaXpvbnRhbCgpfSxlLnByb3RvdHlwZS5fcmVzY2FsZT1mdW5jdGlvbigpe3RoaXMucmVuZGVyKCl9LGUucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24oZSxuLGkpe3JldHVybiB0LnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxlLG4saSksdGhpcy5pc0hvcml6b250YWwoKT90aGlzLl9zY2FsZS5yYW5nZShbMCx0aGlzLndpZHRoKCldKTp0aGlzLl9zY2FsZS5yYW5nZShbdGhpcy5oZWlnaHQoKSwwXSksdGhpc30sZS5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLnJlcXVlc3RlZFNwYWNlKHQsZSk7cmV0dXJuIHRoaXMuaXNIb3Jpem9udGFsKCk/e3dpZHRoOnQsaGVpZ2h0Om4ubWluSGVpZ2h0fTp7aGVpZ2h0OmUsd2lkdGg6bi5taW5XaWR0aH19LGUucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3QucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpLHRoaXMuX3RpY2tNYXJrQ29udGFpbmVyPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoZS5USUNLX01BUktfQ0xBU1MrIi1jb250YWluZXIiLCEwKSx0aGlzLl90aWNrTGFiZWxDb250YWluZXI9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZChlLlRJQ0tfTEFCRUxfQ0xBU1MrIi1jb250YWluZXIiLCEwKSx0aGlzLl9iYXNlbGluZT10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKCJiYXNlbGluZSIsITApLHRoaXMuX2Fubm90YXRpb25Db250YWluZXI9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1jb250YWluZXIiLCEwKSx0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLmFwcGVuZCgiZyIpLmNsYXNzZWQoImFubm90YXRpb24tbGluZS1jb250YWluZXIiLCEwKSx0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLmFwcGVuZCgiZyIpLmNsYXNzZWQoImFubm90YXRpb24tY2lyY2xlLWNvbnRhaW5lciIsITApLHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1yZWN0LWNvbnRhaW5lciIsITApO3ZhciBuPXRoaXMuX2Fubm90YXRpb25Db250YWluZXIuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1sYWJlbC1jb250YWluZXIiLCEwKSxpPW5ldyBDdnQuU3ZnQ29udGV4dChuLm5vZGUoKSk7dGhpcy5fYW5ub3RhdGlvbk1lYXN1cmVyPW5ldyBDdnQuQ2FjaGVNZWFzdXJlcihpKSx0aGlzLl9hbm5vdGF0aW9uV3JpdGVyPW5ldyBDdnQuV3JpdGVyKHRoaXMuX2Fubm90YXRpb25NZWFzdXJlcixpKX0sZS5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXM9ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9nZXRUaWNrVmFsdWVzKCksbj10aGlzLl90aWNrTWFya0NvbnRhaW5lci5zZWxlY3RBbGwoIi4iK2UuVElDS19NQVJLX0NMQVNTKS5kYXRhKHQpLGk9bi5lbnRlcigpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQoZS5USUNLX01BUktfQ0xBU1MsITApLm1lcmdlKG4pO3JldHVybiBpLmF0dHJzKHRoaXMuX2dlbmVyYXRlVGlja01hcmtBdHRySGFzaCgpKSxUdnQuc2VsZWN0KGkubm9kZXMoKVswXSkuY2xhc3NlZChlLkVORF9USUNLX01BUktfQ0xBU1MsITApLmF0dHJzKHRoaXMuX2dlbmVyYXRlVGlja01hcmtBdHRySGFzaCghMCkpLFR2dC5zZWxlY3QoaS5ub2RlcygpW3QubGVuZ3RoLTFdKS5jbGFzc2VkKGUuRU5EX1RJQ0tfTUFSS19DTEFTUywhMCkuYXR0cnModGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKCEwKSksbi5leGl0KCkucmVtb3ZlKCksdGhpcy5fYmFzZWxpbmUuYXR0cnModGhpcy5fZ2VuZXJhdGVCYXNlbGluZUF0dHJIYXNoKCkpLHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCk/dGhpcy5fZHJhd0Fubm90YXRpb25zKCk6dGhpcy5fcmVtb3ZlQW5ub3RhdGlvbnMoKSx0aGlzfSxlLnByb3RvdHlwZS5hbm5vdGF0ZWRUaWNrcz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9hbm5vdGF0ZWRUaWNrczoodGhpcy5fYW5ub3RhdGVkVGlja3M9dCx0aGlzLnJlbmRlcigpLHRoaXMpfSxlLnByb3RvdHlwZS5hbm5vdGF0aW9uRm9ybWF0dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2Fubm90YXRpb25Gb3JtYXR0ZXI6KHRoaXMuX2Fubm90YXRpb25Gb3JtYXR0ZXI9dCx0aGlzLnJlbmRlcigpLHRoaXMpfSxlLnByb3RvdHlwZS5hbm5vdGF0aW9uc0VuYWJsZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fYW5ub3RhdGlvbnNFbmFibGVkOih0aGlzLl9hbm5vdGF0aW9uc0VuYWJsZWQ9dCx0aGlzLnJlZHJhdygpLHRoaXMpfSxlLnByb3RvdHlwZS5hbm5vdGF0aW9uVGllckNvdW50PWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX2Fubm90YXRpb25UaWVyQ291bnQ7aWYodDwwKXRocm93IG5ldyBFcnJvcigiYW5ub3RhdGlvblRpZXJDb3VudCBjYW5ub3QgYmUgbmVnYXRpdmUiKTtyZXR1cm4gdGhpcy5fYW5ub3RhdGlvblRpZXJDb3VudD10LHRoaXMucmVkcmF3KCksdGhpc30sZS5wcm90b3R5cGUuX2RyYXdBbm5vdGF0aW9ucz1mdW5jdGlvbigpe3ZhciB0PXRoaXMsbj1lLl9BTk5PVEFUSU9OX0xBQkVMX1BBRERJTkcsaT1uZXcgTHZ0Lk1hcCxyPXRoaXMuX2Fubm90YXRlZFRpY2tzVG9SZW5kZXIoKTtyLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciByPXQuX2Fubm90YXRpb25NZWFzdXJlci5tZWFzdXJlKHQuYW5ub3RhdGlvbkZvcm1hdHRlcigpKGUpKTtpLnNldChlLHt3aWR0aDpyLndpZHRoKzIqbixoZWlnaHQ6ci5oZWlnaHQrMipufSl9KSk7dmFyIG89dGhpcy5fYW5ub3RhdGlvbk1lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQrMipuLGE9dGhpcy5fYW5ub3RhdGlvblRvVGllcihpKSxzPW5ldyBMdnQuU2V0LGw9dGhpcy5pc0hvcml6b250YWwoKT90aGlzLmhlaWdodCgpOnRoaXMud2lkdGgoKSxjPXRoaXMuX2NvcmVTaXplKCksdT1NYXRoLm1pbih0aGlzLmFubm90YXRpb25UaWVyQ291bnQoKSxNYXRoLmZsb29yKChsLWMpL28pKTthLmZvckVhY2goKGZ1bmN0aW9uKHQsZSl7KC0xPT09dHx8dD49dSkmJnMuYWRkKGUpfSkpO3ZhciBoLGQ9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXQuc2VsZWN0QWxsKCIuIituKS5kYXRhKHIpLG89aS5lbnRlcigpLmFwcGVuZChlKS5jbGFzc2VkKG4sITApLm1lcmdlKGkpO3JldHVybiBpLmV4aXQoKS5yZW1vdmUoKSxvfSxwPWZ1bmN0aW9uKGUpe3N3aXRjaCh0Lm9yaWVudGF0aW9uKCkpe2Nhc2UiYm90dG9tIjpjYXNlInJpZ2h0IjpyZXR1cm4gYS5nZXQoZSkqbytjO2Nhc2UidG9wIjpjYXNlImxlZnQiOnJldHVybiBsLWMtYS5nZXQoZSkqb319LGY9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuX3NjYWxlLnNjYWxlKGUpfSxtPWZ1bmN0aW9uKHQpe3JldHVybiBzLmhhcyh0KT8iaGlkZGVuIjoidmlzaWJsZSJ9O3N3aXRjaCh0aGlzLm9yaWVudGF0aW9uKCkpe2Nhc2UiYm90dG9tIjpjYXNlInJpZ2h0IjpoPTA7YnJlYWs7Y2FzZSJ0b3AiOmg9dGhpcy5oZWlnaHQoKTticmVhaztjYXNlImxlZnQiOmg9dGhpcy53aWR0aCgpfXZhciBnPXRoaXMuaXNIb3Jpem9udGFsKCk7ZCh0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdCgiLmFubm90YXRpb24tbGluZS1jb250YWluZXIiKSwibGluZSIsZS5BTk5PVEFUSU9OX0xJTkVfQ0xBU1MpLmF0dHJzKHt4MTpnP2Y6aCx4MjpnP2Y6cCx5MTpnP2g6Zix5MjpnP3A6Zix2aXNpYmlsaXR5Om19KSxkKHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0KCIuYW5ub3RhdGlvbi1jaXJjbGUtY29udGFpbmVyIiksImNpcmNsZSIsZS5BTk5PVEFUSU9OX0NJUkNMRV9DTEFTUykuYXR0cnMoe2N4Omc/ZjpoLGN5Omc/aDpmLHI6M30pO3ZhciBfPWZ1bmN0aW9uKGUpe3N3aXRjaCh0Lm9yaWVudGF0aW9uKCkpe2Nhc2UiYm90dG9tIjpjYXNlInJpZ2h0IjpyZXR1cm4gcChlKTtjYXNlInRvcCI6Y2FzZSJsZWZ0IjpyZXR1cm4gcChlKS1pLmdldChlKS5oZWlnaHR9fTtkKHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0KCIuYW5ub3RhdGlvbi1yZWN0LWNvbnRhaW5lciIpLCJyZWN0IixlLkFOTk9UQVRJT05fUkVDVF9DTEFTUykuYXR0cnMoe3g6Zz9mOl8seTpnP186Zix3aWR0aDpnP2Z1bmN0aW9uKHQpe3JldHVybiBpLmdldCh0KS53aWR0aH06ZnVuY3Rpb24odCl7cmV0dXJuIGkuZ2V0KHQpLmhlaWdodH0saGVpZ2h0Omc/ZnVuY3Rpb24odCl7cmV0dXJuIGkuZ2V0KHQpLmhlaWdodH06ZnVuY3Rpb24odCl7cmV0dXJuIGkuZ2V0KHQpLndpZHRofSx2aXNpYmlsaXR5Om19KTt2YXIgeT10aGlzLl9hbm5vdGF0aW9uV3JpdGVyLHY9dGhpcy5hbm5vdGF0aW9uRm9ybWF0dGVyKCksYj1kKHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0KCIuYW5ub3RhdGlvbi1sYWJlbC1jb250YWluZXIiKSwiZyIsZS5BTk5PVEFUSU9OX0xBQkVMX0NMQVNTKTtiLnNlbGVjdEFsbCgiLnRleHQtY29udGFpbmVyIikucmVtb3ZlKCksYi5hdHRycyh7dHJhbnNmb3JtOmZ1bmN0aW9uKHQpe3JldHVybiJ0cmFuc2xhdGUoIisoZz9mKHQpOl8odCkpKyIsIisoZz9fKHQpOmYodCkpKyIpIn0sdmlzaWJpbGl0eTptfSkuZWFjaCgoZnVuY3Rpb24odCl7eS53cml0ZSh2KHQpLGc/aS5nZXQodCkud2lkdGg6aS5nZXQodCkuaGVpZ2h0LGc/aS5nZXQodCkuaGVpZ2h0OmkuZ2V0KHQpLndpZHRoLHt4QWxpZ246ImNlbnRlciIseUFsaWduOiJjZW50ZXIiLHRleHRSb3RhdGlvbjpnPzA6OTB9LFR2dC5zZWxlY3QodGhpcykubm9kZSgpKX0pKX0sZS5wcm90b3R5cGUuX2Fubm90YXRlZFRpY2tzVG9SZW5kZXI9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5fc2NhbGUucmFuZ2UoKTtyZXR1cm4gTHZ0LkFycmF5LnVuaXEodGhpcy5hbm5vdGF0ZWRUaWNrcygpLmZpbHRlcigoZnVuY3Rpb24obil7cmV0dXJuIG51bGwhPW4mJkx2dC5NYXRoLmluUmFuZ2UodC5fc2NhbGUuc2NhbGUobiksZVswXSxlWzFdKX0pKSl9LGUucHJvdG90eXBlLl9jb3JlU2l6ZT1mdW5jdGlvbigpe3ZhciB0PXRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy5oZWlnaHQoKTp0aGlzLndpZHRoKCksZT10aGlzLmlzSG9yaXpvbnRhbCgpP3RoaXMuX2NvbXB1dGVIZWlnaHQoKTp0aGlzLl9jb21wdXRlV2lkdGgoKTtyZXR1cm4gTWF0aC5taW4oZSx0KX0sZS5wcm90b3R5cGUuX2Fubm90YXRpb25UaWVySGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Fubm90YXRpb25NZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0KzIqZS5fQU5OT1RBVElPTl9MQUJFTF9QQURESU5HfSxlLnByb3RvdHlwZS5fYW5ub3RhdGlvblRvVGllcj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49W1tdXSxpPW5ldyBMdnQuTWFwLHI9dGhpcy5pc0hvcml6b250YWwoKT90aGlzLndpZHRoKCk6dGhpcy5oZWlnaHQoKTtyZXR1cm4gdGhpcy5fYW5ub3RhdGVkVGlja3NUb1JlbmRlcigpLmZvckVhY2goKGZ1bmN0aW9uKG8pe3ZhciBhPWUuX3NjYWxlLnNjYWxlKG8pLHM9dC5nZXQobykud2lkdGg7aWYoYTwwfHxhK3M+cilpLnNldChvLC0xKTtlbHNle2Zvcih2YXIgbD0wO25bbF0uc29tZSgoZnVuY3Rpb24obil7dmFyIGk9ZS5fc2NhbGUuc2NhbGUobikscj10LmdldChuKS53aWR0aDtyZXR1cm4gYStzPj1pJiZhPD1pK3J9KSk7KWwrKyxuLmxlbmd0aD09PWwmJm4ucHVzaChbXSk7bltsXS5wdXNoKG8pLGkuc2V0KG8sbCl9fSkpLGl9LGUucHJvdG90eXBlLl9yZW1vdmVBbm5vdGF0aW9ucz1mdW5jdGlvbigpe3RoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0QWxsKCIuYW5ub3RhdGlvbi1saW5lIikucmVtb3ZlKCksdGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3RBbGwoIi5hbm5vdGF0aW9uLWNpcmNsZSIpLnJlbW92ZSgpLHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0QWxsKCIuYW5ub3RhdGlvbi1yZWN0IikucmVtb3ZlKCksdGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3RBbGwoIi5hbm5vdGF0aW9uLWxhYmVsIikucmVtb3ZlKCl9LGUucHJvdG90eXBlLl9nZW5lcmF0ZUJhc2VsaW5lQXR0ckhhc2g9ZnVuY3Rpb24oKXt2YXIgdD17eDE6MCx5MTowLHgyOjAseTI6MH07c3dpdGNoKHRoaXMuX29yaWVudGF0aW9uKXtjYXNlImJvdHRvbSI6dC54Mj10aGlzLndpZHRoKCk7YnJlYWs7Y2FzZSJ0b3AiOnQueDI9dGhpcy53aWR0aCgpLHQueTE9dGhpcy5oZWlnaHQoKSx0LnkyPXRoaXMuaGVpZ2h0KCk7YnJlYWs7Y2FzZSJsZWZ0Ijp0LngxPXRoaXMud2lkdGgoKSx0LngyPXRoaXMud2lkdGgoKSx0LnkyPXRoaXMuaGVpZ2h0KCk7YnJlYWs7Y2FzZSJyaWdodCI6dC55Mj10aGlzLmhlaWdodCgpfXJldHVybiB0fSxlLnByb3RvdHlwZS5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dm9pZCAwPT09dCYmKHQ9ITEpO3ZhciBuPXt4MTowLHkxOjAseDI6MCx5MjowfSxpPWZ1bmN0aW9uKHQpe3JldHVybiBlLl9zY2FsZS5zY2FsZSh0KX07dGhpcy5pc0hvcml6b250YWwoKT8obi54MT1pLG4ueDI9aSk6KG4ueTE9aSxuLnkyPWkpO3ZhciByPXQ/dGhpcy5fZW5kVGlja0xlbmd0aDp0aGlzLl9pbm5lclRpY2tMZW5ndGg7c3dpdGNoKHRoaXMuX29yaWVudGF0aW9uKXtjYXNlImJvdHRvbSI6bi55Mj1yO2JyZWFrO2Nhc2UidG9wIjpuLnkxPXRoaXMuaGVpZ2h0KCksbi55Mj10aGlzLmhlaWdodCgpLXI7YnJlYWs7Y2FzZSJsZWZ0IjpuLngxPXRoaXMud2lkdGgoKSxuLngyPXRoaXMud2lkdGgoKS1yO2JyZWFrO2Nhc2UicmlnaHQiOm4ueDI9cn1yZXR1cm4gbn0sZS5wcm90b3R5cGUuX3NldERlZmF1bHRBbGlnbm1lbnQ9ZnVuY3Rpb24oKXtzd2l0Y2godGhpcy5fb3JpZW50YXRpb24pe2Nhc2UiYm90dG9tIjp0aGlzLnlBbGlnbm1lbnQoInRvcCIpO2JyZWFrO2Nhc2UidG9wIjp0aGlzLnlBbGlnbm1lbnQoImJvdHRvbSIpO2JyZWFrO2Nhc2UibGVmdCI6dGhpcy54QWxpZ25tZW50KCJyaWdodCIpO2JyZWFrO2Nhc2UicmlnaHQiOnRoaXMueEFsaWdubWVudCgibGVmdCIpfX0sZS5wcm90b3R5cGUuaXNIb3Jpem9udGFsPWZ1bmN0aW9uKCl7cmV0dXJuInRvcCI9PT10aGlzLl9vcmllbnRhdGlvbnx8ImJvdHRvbSI9PT10aGlzLl9vcmllbnRhdGlvbn0sZS5wcm90b3R5cGUuZ2V0U2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fc2NhbGV9LGUucHJvdG90eXBlLmZvcm1hdHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9mb3JtYXR0ZXI6KHRoaXMuX2Zvcm1hdHRlcj10LHRoaXMucmVkcmF3KCksdGhpcyl9LGUucHJvdG90eXBlLmlubmVyVGlja0xlbmd0aD1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9pbm5lclRpY2tMZW5ndGg7aWYodDwwKXRocm93IG5ldyBFcnJvcigiaW5uZXIgdGljayBsZW5ndGggbXVzdCBiZSBwb3NpdGl2ZSIpO3JldHVybiB0aGlzLl9pbm5lclRpY2tMZW5ndGg9dCx0aGlzLnJlZHJhdygpLHRoaXN9LGUucHJvdG90eXBlLmVuZFRpY2tMZW5ndGg9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fZW5kVGlja0xlbmd0aDtpZih0PDApdGhyb3cgbmV3IEVycm9yKCJlbmQgdGljayBsZW5ndGggbXVzdCBiZSBwb3NpdGl2ZSIpO3JldHVybiB0aGlzLl9lbmRUaWNrTGVuZ3RoPXQsdGhpcy5yZWRyYXcoKSx0aGlzfSxlLnByb3RvdHlwZS5fbWF4TGFiZWxUaWNrTGVuZ3RoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc2hvd0VuZFRpY2tMYWJlbHMoKT9NYXRoLm1heCh0aGlzLmlubmVyVGlja0xlbmd0aCgpLHRoaXMuZW5kVGlja0xlbmd0aCgpKTp0aGlzLmlubmVyVGlja0xlbmd0aCgpfSxlLnByb3RvdHlwZS50aWNrTGFiZWxQYWRkaW5nPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX3RpY2tMYWJlbFBhZGRpbmc7aWYodDwwKXRocm93IG5ldyBFcnJvcigidGljayBsYWJlbCBwYWRkaW5nIG11c3QgYmUgcG9zaXRpdmUiKTtyZXR1cm4gdGhpcy5fdGlja0xhYmVsUGFkZGluZz10LHRoaXMucmVkcmF3KCksdGhpc30sZS5wcm90b3R5cGUubWFyZ2luPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX21hcmdpbjtpZih0PDApdGhyb3cgbmV3IEVycm9yKCJtYXJnaW4gc2l6ZSBtdXN0IGJlIHBvc2l0aXZlIik7cmV0dXJuIHRoaXMuX21hcmdpbj10LHRoaXMucmVkcmF3KCksdGhpc30sZS5wcm90b3R5cGUub3JpZW50YXRpb249ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fb3JpZW50YXRpb247dmFyIGU9dC50b0xvd2VyQ2FzZSgpO2lmKCJ0b3AiIT09ZSYmImJvdHRvbSIhPT1lJiYibGVmdCIhPT1lJiYicmlnaHQiIT09ZSl0aHJvdyBuZXcgRXJyb3IoInVuc3VwcG9ydGVkIG9yaWVudGF0aW9uIik7cmV0dXJuIHRoaXMuX29yaWVudGF0aW9uPWUsdGhpcy5yZWRyYXcoKSx0aGlzfSxlLnByb3RvdHlwZS5zaG93RW5kVGlja0xhYmVscz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9zaG93RW5kVGlja0xhYmVsczoodGhpcy5fc2hvd0VuZFRpY2tMYWJlbHM9dCx0aGlzLnJlbmRlcigpLHRoaXMpfSxlLnByb3RvdHlwZS5fc2hvd0FsbFRpY2tNYXJrcz1mdW5jdGlvbigpe3RoaXMuX3RpY2tNYXJrQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrZS5USUNLX01BUktfQ0xBU1MpLmVhY2goKGZ1bmN0aW9uKCl7VHZ0LnNlbGVjdCh0aGlzKS5zdHlsZSgidmlzaWJpbGl0eSIsImluaGVyaXQiKX0pKX0sZS5wcm90b3R5cGUuX3Nob3dBbGxUaWNrTGFiZWxzPWZ1bmN0aW9uKCl7dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrZS5USUNLX0xBQkVMX0NMQVNTKS5lYWNoKChmdW5jdGlvbigpe1R2dC5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0Iil9KSl9LGUucHJvdG90eXBlLl9oaWRlT3ZlcmZsb3dpbmdUaWNrTGFiZWxzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5lbGVtZW50KCkubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrZS5USUNLX0xBQkVMX0NMQVNTKTtuLmVtcHR5KCl8fG4uZWFjaCgoZnVuY3Rpb24oZSxuKXtMdnQuRE9NLmNsaWVudFJlY3RJbnNpZGUodGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx0KXx8VHZ0LnNlbGVjdCh0aGlzKS5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpfSkpfSxlLnByb3RvdHlwZS5faGlkZVRpY2tNYXJrc1dpdGhvdXRMYWJlbD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3RpY2tNYXJrQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrZS5USUNLX01BUktfQ0xBU1MpLG49dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrZS5USUNLX0xBQkVMX0NMQVNTKS5maWx0ZXIoKGZ1bmN0aW9uKHQsZSl7dmFyIG49VHZ0LnNlbGVjdCh0aGlzKS5zdHlsZSgidmlzaWJpbGl0eSIpO3JldHVybiJpbmhlcml0Ij09PW58fCJ2aXNpYmxlIj09PW59KSkuZGF0YSgpO3QuZWFjaCgoZnVuY3Rpb24odCxlKXstMT09PW4uaW5kZXhPZih0KSYmVHZ0LnNlbGVjdCh0aGlzKS5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpfSkpfSxlLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKSx0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIucmVzZXQoKX0sZS5FTkRfVElDS19NQVJLX0NMQVNTPSJlbmQtdGljay1tYXJrIixlLlRJQ0tfTUFSS19DTEFTUz0idGljay1tYXJrIixlLlRJQ0tfTEFCRUxfQ0xBU1M9InRpY2stbGFiZWwiLGUuQU5OT1RBVElPTl9MSU5FX0NMQVNTPSJhbm5vdGF0aW9uLWxpbmUiLGUuQU5OT1RBVElPTl9SRUNUX0NMQVNTPSJhbm5vdGF0aW9uLXJlY3QiLGUuQU5OT1RBVElPTl9DSVJDTEVfQ0xBU1M9ImFubm90YXRpb24tY2lyY2xlIixlLkFOTk9UQVRJT05fTEFCRUxfQ0xBU1M9ImFubm90YXRpb24tbGFiZWwiLGUuX0FOTk9UQVRJT05fTEFCRUxfUEFERElORz00LGV9KShBdnQuQ29tcG9uZW50KTtkdnQuQXhpcz1QdnQsCi8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShrZ3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBOdnQ9Qk8sSXZ0PXdwdCxSdnQ9TGd0LE92dD1PX3QsenZ0PURfdCxEdnQ9ZHZ0LEJ2dD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3ZvaWQgMD09PW4mJihuPSJib3R0b20iKTt2YXIgaT10LmNhbGwodGhpcyxlLG4pfHx0aGlzO3JldHVybiBpLl90aWNrTGFiZWxBbmdsZT0wLGkuX3RpY2tMYWJlbFNoZWFyQW5nbGU9MCxpLmFkZENsYXNzKCJjYXRlZ29yeS1heGlzIiksaX1yZXR1cm4gTnZ0Ll9fZXh0ZW5kcyhlLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiX3dyYXBwZXIiLHtnZXQ6ZnVuY3Rpb24oKXt2YXIgdD1uZXcgUnZ0LldyYXBwZXI7cmV0dXJuIG51bGwhPXRoaXMuX3RpY2tMYWJlbE1heExpbmVzJiZ0Lm1heExpbmVzKHRoaXMuX3RpY2tMYWJlbE1heExpbmVzKSx0fSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiX3dyaXRlciIse2dldDpmdW5jdGlvbigpe3JldHVybiBuZXcgUnZ0LldyaXRlcih0aGlzLl9tZWFzdXJlcix0aGlzLl90eXBlc2V0dGVyQ29udGV4dCx0aGlzLl93cmFwcGVyKX0sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKSx0aGlzLl90eXBlc2V0dGVyQ29udGV4dD1uZXcgUnZ0LlN2Z0NvbnRleHQodGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLm5vZGUoKSksdGhpcy5fbWVhc3VyZXI9bmV3IFJ2dC5DYWNoZU1lYXN1cmVyKHRoaXMuX3R5cGVzZXR0ZXJDb250ZXh0KX0sZS5wcm90b3R5cGUuX3Jlc2NhbGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5yZWRyYXcoKX0sZS5wcm90b3R5cGUucmVxdWVzdGVkU3BhY2U9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLmlzSG9yaXpvbnRhbCgpPzA6dGhpcy5fdGlja1NwYWNlUmVxdWlyZWQoKSt0aGlzLm1hcmdpbigpLGk9dGhpcy5pc0hvcml6b250YWwoKT90aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpK3RoaXMubWFyZ2luKCk6MDtpZigwPT09dGhpcy5fc2NhbGUuZG9tYWluKCkubGVuZ3RoKXJldHVybnttaW5XaWR0aDowLG1pbkhlaWdodDowfTtpZih0aGlzLmFubm90YXRpb25zRW5hYmxlZCgpKXt2YXIgcj10aGlzLl9hbm5vdGF0aW9uVGllckhlaWdodCgpKnRoaXMuYW5ub3RhdGlvblRpZXJDb3VudCgpO3RoaXMuaXNIb3Jpem9udGFsKCk/aSs9cjpuKz1yfXZhciBvPXRoaXMuX21lYXN1cmVUaWNrTGFiZWxzKHQsZSk7cmV0dXJue21pbldpZHRoOm8udXNlZFdpZHRoK24sbWluSGVpZ2h0Om8udXNlZEhlaWdodCtpfX0sZS5wcm90b3R5cGUuX2NvcmVTaXplPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5pc0hvcml6b250YWwoKT90aGlzLmhlaWdodCgpOnRoaXMud2lkdGgoKSxlPXRoaXMuaXNIb3Jpem9udGFsKCk/dGhpcy5yZXF1ZXN0ZWRTcGFjZSh0aGlzLndpZHRoKCksdGhpcy5oZWlnaHQoKSkubWluSGVpZ2h0OnRoaXMucmVxdWVzdGVkU3BhY2UodGhpcy53aWR0aCgpLHRoaXMuaGVpZ2h0KCkpLm1pbldpZHRoLG49dGhpcy5tYXJnaW4oKSt0aGlzLl9hbm5vdGF0aW9uVGllckhlaWdodCgpO3JldHVybiBNYXRoLm1pbihlLW4sdCl9LGUucHJvdG90eXBlLl9nZXRUaWNrVmFsdWVzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZ2V0RG93bnNhbXBsZUluZm8oKS5kb21haW59LGUucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE92dC5Db21wb25lbnQucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyLmNhbGwodGhpcyx0LGUpfSxlLnByb3RvdHlwZS5nZXREb3duc2FtcGxlSW5mbz1mdW5jdGlvbih0LG4pe3ZvaWQgMD09PXQmJih0PXRoaXMuX3NjYWxlKSx2b2lkIDA9PT1uJiYobj10LmludmVydFJhbmdlKCkpO3ZhciBpPTA9PT10aGlzLl90aWNrTGFiZWxBbmdsZT8xOjEvTWF0aC5jb3ModGhpcy5fdGlja0xhYmVsU2hlYXJBbmdsZS8xODAqTWF0aC5QSSkscj1NYXRoLmNlaWwoZS5fTUlOSU1VTV9XSURUSF9QRVJfTEFCRUxfUFgqaS90LnN0ZXBXaWR0aCgpKTtyZXR1cm57ZG9tYWluOm4uZmlsdGVyKChmdW5jdGlvbih0LGUpe3JldHVybiBlJXI9PTB9KSksc3RlcFdpZHRoOnIqdC5zdGVwV2lkdGgoKX19LGUucHJvdG90eXBlLnRpY2tMYWJlbEFuZ2xlPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX3RpY2tMYWJlbEFuZ2xlO2lmKDAhPT10JiY5MCE9PXQmJi05MCE9PXQpdGhyb3cgbmV3IEVycm9yKCJBbmdsZSAiK3QrIiBub3Qgc3VwcG9ydGVkOyBvbmx5IDAsIDkwLCBhbmQgLTkwIGFyZSB2YWxpZCB2YWx1ZXMiKTtyZXR1cm4gdGhpcy5fdGlja0xhYmVsQW5nbGU9dCx0aGlzLnJlZHJhdygpLHRoaXN9LGUucHJvdG90eXBlLnRpY2tMYWJlbFNoZWFyQW5nbGU9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fdGlja0xhYmVsU2hlYXJBbmdsZTtpZih0PC04MHx8dD44MCl0aHJvdyBuZXcgRXJyb3IoIkFuZ2xlICIrdCsiIG5vdCBzdXBwb3J0ZWQ7IE11c3QgYmUgYmV0d2VlbiBbLTgwLCA4MF0iKTtyZXR1cm4gdGhpcy5fdGlja0xhYmVsU2hlYXJBbmdsZT10LHRoaXMucmVkcmF3KCksdGhpc30sZS5wcm90b3R5cGUudGlja0xhYmVsTWF4V2lkdGg9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMuX3RpY2tMYWJlbE1heFdpZHRoOih0aGlzLl90aWNrTGFiZWxNYXhXaWR0aD10LHRoaXMucmVkcmF3KCksdGhpcyl9LGUucHJvdG90eXBlLnRpY2tMYWJlbE1heExpbmVzPWZ1bmN0aW9uKHQpe3JldHVybiAwPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLl90aWNrTGFiZWxNYXhMaW5lczoodGhpcy5fdGlja0xhYmVsTWF4TGluZXM9dCx0aGlzLnJlZHJhdygpLHRoaXMpfSxlLnByb3RvdHlwZS5fdGlja1NwYWNlUmVxdWlyZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCkrdGhpcy50aWNrTGFiZWxQYWRkaW5nKCl9LGUucHJvdG90eXBlLl9kcmF3VGlja3M9ZnVuY3Rpb24odCxlKXt2YXIgbixpLHI9dGhpcztzd2l0Y2godGhpcy50aWNrTGFiZWxBbmdsZSgpKXtjYXNlIDA6bj17bGVmdDoicmlnaHQiLHJpZ2h0OiJsZWZ0Iix0b3A6ImNlbnRlciIsYm90dG9tOiJjZW50ZXIifSxpPXtsZWZ0OiJjZW50ZXIiLHJpZ2h0OiJjZW50ZXIiLHRvcDoiYm90dG9tIixib3R0b206InRvcCJ9O2JyZWFrO2Nhc2UgOTA6bj17bGVmdDoiY2VudGVyIixyaWdodDoiY2VudGVyIix0b3A6InJpZ2h0Iixib3R0b206ImxlZnQifSxpPXtsZWZ0OiJ0b3AiLHJpZ2h0OiJib3R0b20iLHRvcDoiY2VudGVyIixib3R0b206ImNlbnRlciJ9O2JyZWFrO2Nhc2UtOTA6bj17bGVmdDoiY2VudGVyIixyaWdodDoiY2VudGVyIix0b3A6ImxlZnQiLGJvdHRvbToicmlnaHQifSxpPXtsZWZ0OiJib3R0b20iLHJpZ2h0OiJ0b3AiLHRvcDoiY2VudGVyIixib3R0b206ImNlbnRlciJ9fWUuZWFjaCgoZnVuY3Rpb24oZSl7dmFyIG89SXZ0LnNlbGVjdCh0aGlzKSxhPXIuaXNIb3Jpem9udGFsKCk/dDpyLndpZHRoKCktci5fdGlja1NwYWNlUmVxdWlyZWQoKSxzPXIuaXNIb3Jpem9udGFsKCk/ci5oZWlnaHQoKS1yLl90aWNrU3BhY2VSZXF1aXJlZCgpOnQsbD17eEFsaWduOm5bci5vcmllbnRhdGlvbigpXSx5QWxpZ246aVtyLm9yaWVudGF0aW9uKCldLHRleHRSb3RhdGlvbjpyLnRpY2tMYWJlbEFuZ2xlKCksdGV4dFNoZWFyOnIudGlja0xhYmVsU2hlYXJBbmdsZSgpfTtpZihudWxsIT1yLl90aWNrTGFiZWxNYXhXaWR0aCl7aWYoImxlZnQiPT09ci5vcmllbnRhdGlvbigpJiZhPnIuX3RpY2tMYWJlbE1heFdpZHRoKXt2YXIgYz1hLXIuX3RpY2tMYWJlbE1heFdpZHRoLHU9by5hdHRyKCJ0cmFuc2Zvcm0iKSsiIHRyYW5zbGF0ZSgiK2MrIiwgMCkiO28uYXR0cigidHJhbnNmb3JtIix1KX1hPU1hdGgubWluKGEsci5fdGlja0xhYmVsTWF4V2lkdGgpfXIuX3dyaXRlci53cml0ZShyLmZvcm1hdHRlcigpKGUpLGEscyxsLG8ubm9kZSgpKX0pKX0sZS5wcm90b3R5cGUuX21lYXN1cmVUaWNrTGFiZWxzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcyxpPXRoaXMuX3NjYWxlLmNsb25lV2l0aG91dFByb3ZpZGVycygpLnJhbmdlKFswLHRoaXMuaXNIb3Jpem9udGFsKCk/dDplXSkscj10aGlzLmdldERvd25zYW1wbGVJbmZvKGkpLG89ci5kb21haW4sYT1yLnN0ZXBXaWR0aCxzPXQtdGhpcy5fdGlja1NwYWNlUmVxdWlyZWQoKTt0aGlzLmlzSG9yaXpvbnRhbCgpJiYocz1hLDAhPT10aGlzLl90aWNrTGFiZWxBbmdsZSYmKHM9ZS10aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpKSxzPU1hdGgubWF4KHMsMCkpO3ZhciBsPWE7dGhpcy5pc0hvcml6b250YWwoKSYmKGw9ZS10aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpLDAhPT10aGlzLl90aWNrTGFiZWxBbmdsZSYmKGw9dC10aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpKSxsPU1hdGgubWF4KGwsMCkpLG51bGwhPXRoaXMuX3RpY2tMYWJlbE1heFdpZHRoJiYocz1NYXRoLm1pbihzLHRoaXMuX3RpY2tMYWJlbE1heFdpZHRoKSk7dmFyIGMsdT1vLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIG4uX3dyYXBwZXIud3JhcChuLmZvcm1hdHRlcigpKHQpLG4uX21lYXN1cmVyLHMsbCl9KSksaD10aGlzLmlzSG9yaXpvbnRhbCgpJiYwPT09dGhpcy5fdGlja0xhYmVsQW5nbGU/SXZ0LnN1bTp6dnQuTWF0aC5tYXgsZD10aGlzLmlzSG9yaXpvbnRhbCgpJiYwPT09dGhpcy5fdGlja0xhYmVsQW5nbGU/enZ0Lk1hdGgubWF4Okl2dC5zdW0scD1oKHUsKGZ1bmN0aW9uKHQpe3JldHVybiBuLl9tZWFzdXJlci5tZWFzdXJlKHQud3JhcHBlZFRleHQpLndpZHRofSksMCksZj1kKHUsKGZ1bmN0aW9uKHQpe3JldHVybiBuLl9tZWFzdXJlci5tZWFzdXJlKHQud3JhcHBlZFRleHQpLmhlaWdodH0pLDApO3JldHVybiAwIT09dGhpcy5fdGlja0xhYmVsQW5nbGUmJihwPShjPVtmLHBdKVswXSxmPWNbMV0pLHt1c2VkV2lkdGg6cCx1c2VkSGVpZ2h0OmZ9fSxlLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt2YXIgbj10aGlzLl9zY2FsZSxpPXRoaXMuZ2V0RG93bnNhbXBsZUluZm8obikscj1pLmRvbWFpbixvPWkuc3RlcFdpZHRoLGE9bzt0aGlzLmlzSG9yaXpvbnRhbCgpJiZudWxsIT10aGlzLl90aWNrTGFiZWxNYXhXaWR0aCYmKGE9TWF0aC5taW4oYSx0aGlzLl90aWNrTGFiZWxNYXhXaWR0aCkpO3ZhciBzPXRoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5zZWxlY3RBbGwoIi4iK0R2dC5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpLmRhdGEociksbD1zLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZChEdnQuQXhpcy5USUNLX0xBQkVMX0NMQVNTLCEwKS5tZXJnZShzKTtzLmV4aXQoKS5yZW1vdmUoKSxsLmF0dHIoInRyYW5zZm9ybSIsKGZ1bmN0aW9uKHQsaSl7dmFyIHI9bi5zY2FsZSh0KS1hLzI7cmV0dXJuInRyYW5zbGF0ZSgiKyhlLmlzSG9yaXpvbnRhbCgpP3I6MCkrIiwiKyhlLmlzSG9yaXpvbnRhbCgpPzA6cikrIikifSkpLGwudGV4dCgiIiksdGhpcy5fZHJhd1RpY2tzKG8sbCk7dmFyIGM9InJpZ2h0Ij09PXRoaXMub3JpZW50YXRpb24oKT90aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpOjAsdT0iYm90dG9tIj09PXRoaXMub3JpZW50YXRpb24oKT90aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpOjA7cmV0dXJuIHRoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitjKyIsIit1KyIpIiksdGhpcy5fc2hvd0FsbFRpY2tNYXJrcygpLHRoaXMuX3Nob3dBbGxUaWNrTGFiZWxzKCksdGhpcy5faGlkZVRpY2tNYXJrc1dpdGhvdXRMYWJlbCgpLHRoaXN9LGUucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24oZSxuLGkpe3JldHVybiB0LnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxlLG4saSksdGhpcy5pc0hvcml6b250YWwoKXx8dGhpcy5fc2NhbGUucmFuZ2UoWzAsdGhpcy5oZWlnaHQoKV0pLHRoaXN9LGUucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZT1mdW5jdGlvbigpe3QucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZS5jYWxsKHRoaXMpLHRoaXMuX21lYXN1cmVyLnJlc2V0KCl9LGUuX01JTklNVU1fV0lEVEhfUEVSX0xBQkVMX1BYPTE1LGV9KShEdnQuQXhpcyk7a2d0LkNhdGVnb3J5PUJ2dDt2YXIgSHZ0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShIdnQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBGdnQ9Qk8sVnZ0PXdwdCxVdnQ9TGd0LGp2dD1wdnQsR3Z0PURfdCxXdnQ9ZHZ0LHF2dD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3ZhciBpPXQuY2FsbCh0aGlzLGUsbil8fHRoaXM7cmV0dXJuIGkuX3RpY2tMYWJlbFBvc2l0aW9uaW5nPSJjZW50ZXIiLGkuX3VzZXNUZXh0V2lkdGhBcHByb3hpbWF0aW9uPSExLGkuZm9ybWF0dGVyKGp2dC5nZW5lcmFsKCkpLGl9cmV0dXJuIEZ2dC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTt2YXIgZT1uZXcgVXZ0LlN2Z0NvbnRleHQodGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLm5vZGUoKSxXdnQuQXhpcy5USUNLX0xBQkVMX0NMQVNTKTt0aGlzLl9tZWFzdXJlcj1uZXcgVXZ0LkNhY2hlTWVhc3VyZXIoZSksdGhpcy5fd3JhcHBlcj0obmV3IFV2dC5XcmFwcGVyKS5tYXhMaW5lcygxKX0sZS5wcm90b3R5cGUuX2NvbXB1dGVXaWR0aD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3VzZXNUZXh0V2lkdGhBcHByb3hpbWF0aW9uP3RoaXMuX2NvbXB1dGVBcHByb3hpbWF0ZVRleHRXaWR0aCgpOnRoaXMuX2NvbXB1dGVFeGFjdFRleHRXaWR0aCgpO3JldHVybiJjZW50ZXIiPT09dGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmc/dGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCkrdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkrdDpNYXRoLm1heCh0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSx0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKSt0KX0sZS5wcm90b3R5cGUuX2NvbXB1dGVFeGFjdFRleHRXaWR0aD1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLl9nZXRUaWNrVmFsdWVzKCkubWFwKChmdW5jdGlvbihlKXt2YXIgbj10LmZvcm1hdHRlcigpKGUpO3JldHVybiB0Ll9tZWFzdXJlci5tZWFzdXJlKG4pLndpZHRofSkpO3JldHVybiBHdnQuTWF0aC5tYXgoZSwwKX0sZS5wcm90b3R5cGUuX2NvbXB1dGVBcHByb3hpbWF0ZVRleHRXaWR0aD1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLl9nZXRUaWNrVmFsdWVzKCksbj10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCJNIikud2lkdGgsaT1lLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIHQuZm9ybWF0dGVyKCkoZSkubGVuZ3RoKm59KSk7cmV0dXJuIEd2dC5NYXRoLm1heChpLDApfSxlLnByb3RvdHlwZS5fY29tcHV0ZUhlaWdodD1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQ7cmV0dXJuImNlbnRlciI9PT10aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZz90aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSt0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKSt0Ok1hdGgubWF4KHRoaXMuX21heExhYmVsVGlja0xlbmd0aCgpLHRoaXMudGlja0xhYmVsUGFkZGluZygpK3QpfSxlLnByb3RvdHlwZS5fZ2V0VGlja1ZhbHVlcz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX3NjYWxlLGU9dC5kb21haW4oKSxuPWVbMF08PWVbMV0/ZVswXTplWzFdLGk9ZVswXT49ZVsxXT9lWzBdOmVbMV07cmV0dXJuIHQudGlja3MoKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiB0Pj1uJiZ0PD1pfSkpfSxlLnByb3RvdHlwZS5fcmVzY2FsZT1mdW5jdGlvbigpe2lmKHRoaXMuX2lzU2V0dXApe2lmKCF0aGlzLmlzSG9yaXpvbnRhbCgpKXt2YXIgdD10aGlzLl9jb21wdXRlV2lkdGgoKTtpZih0PnRoaXMud2lkdGgoKXx8dDx0aGlzLndpZHRoKCktdGhpcy5tYXJnaW4oKSlyZXR1cm4gdm9pZCB0aGlzLnJlZHJhdygpfXRoaXMucmVuZGVyKCl9fSxlLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt2YXIgbj17eDowLHk6MCxkeDoiMGVtIixkeToiMC4zZW0ifSxpPXRoaXMuX21heExhYmVsVGlja0xlbmd0aCgpLHI9dGhpcy50aWNrTGFiZWxQYWRkaW5nKCksbz0ibWlkZGxlIixhPTAscz0wLGw9MCxjPTA7aWYodGhpcy5pc0hvcml6b250YWwoKSlzd2l0Y2godGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmcpe2Nhc2UibGVmdCI6bz0iZW5kIixhPS1yLGM9cjticmVhaztjYXNlImNlbnRlciI6Yz1pK3I7YnJlYWs7Y2FzZSJyaWdodCI6bz0ic3RhcnQiLGE9cixjPXJ9ZWxzZSBzd2l0Y2godGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmcpe2Nhc2UidG9wIjpuLmR5PSItMC4zZW0iLGw9cixzPS1yO2JyZWFrO2Nhc2UiY2VudGVyIjpsPWkrcjticmVhaztjYXNlImJvdHRvbSI6bi5keT0iMWVtIixsPXIscz1yfXZhciB1PXRoaXMuX2dlbmVyYXRlVGlja01hcmtBdHRySGFzaCgpO3N3aXRjaCh0aGlzLm9yaWVudGF0aW9uKCkpe2Nhc2UiYm90dG9tIjpuLng9dS54MSxuLmR5PSIwLjk1ZW0iLHM9dS55MStjO2JyZWFrO2Nhc2UidG9wIjpuLng9dS54MSxuLmR5PSItLjI1ZW0iLHM9dS55MS1jO2JyZWFrO2Nhc2UibGVmdCI6bz0iZW5kIixhPXUueDEtbCxuLnk9dS55MTticmVhaztjYXNlInJpZ2h0IjpvPSJzdGFydCIsYT11LngxK2wsbi55PXUueTF9dmFyIGg9dGhpcy5fZ2V0VGlja1ZhbHVlcygpLGQ9dGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrV3Z0LkF4aXMuVElDS19MQUJFTF9DTEFTUykuZGF0YShoKTtyZXR1cm4gZC5leGl0KCkucmVtb3ZlKCksZC5lbnRlcigpLmFwcGVuZCgidGV4dCIpLmNsYXNzZWQoV3Z0LkF4aXMuVElDS19MQUJFTF9DTEFTUywhMCkubWVyZ2UoZCkuc3R5bGUoInRleHQtYW5jaG9yIixvKS5zdHlsZSgidmlzaWJpbGl0eSIsImluaGVyaXQiKS5hdHRycyhuKS50ZXh0KChmdW5jdGlvbih0KXtyZXR1cm4gZS5mb3JtYXR0ZXIoKSh0KX0pKSx0aGlzLl90aWNrTGFiZWxDb250YWluZXIuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrYSsiLCAiK3MrIikiKSx0aGlzLl9zaG93QWxsVGlja01hcmtzKCksdGhpcy5zaG93RW5kVGlja0xhYmVscygpfHx0aGlzLl9oaWRlRW5kVGlja0xhYmVscygpLHRoaXMuX2hpZGVPdmVyZmxvd2luZ1RpY2tMYWJlbHMoKSx0aGlzLl9oaWRlT3ZlcmxhcHBpbmdUaWNrTGFiZWxzKCksImNlbnRlciIhPT10aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZyYmdGhpcy5faGlkZVRpY2tNYXJrc1dpdGhvdXRMYWJlbCgpLHRoaXN9LGUucHJvdG90eXBlLnRpY2tMYWJlbFBvc2l0aW9uPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nO3ZhciBlPXQudG9Mb3dlckNhc2UoKTtpZih0aGlzLmlzSG9yaXpvbnRhbCgpKXtpZigibGVmdCIhPT1lJiYiY2VudGVyIiE9PWUmJiJyaWdodCIhPT1lKXRocm93IG5ldyBFcnJvcihlKyIgaXMgbm90IGEgdmFsaWQgdGljayBsYWJlbCBwb3NpdGlvbiBmb3IgYSBob3Jpem9udGFsIE51bWVyaWNBeGlzIil9ZWxzZSBpZigidG9wIiE9PWUmJiJjZW50ZXIiIT09ZSYmImJvdHRvbSIhPT1lKXRocm93IG5ldyBFcnJvcihlKyIgaXMgbm90IGEgdmFsaWQgdGljayBsYWJlbCBwb3NpdGlvbiBmb3IgYSB2ZXJ0aWNhbCBOdW1lcmljQXhpcyIpO3JldHVybiB0aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZz1lLHRoaXMucmVkcmF3KCksdGhpc30sZS5wcm90b3R5cGUudXNlc1RleHRXaWR0aEFwcHJveGltYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fdXNlc1RleHRXaWR0aEFwcHJveGltYXRpb246KHRoaXMuX3VzZXNUZXh0V2lkdGhBcHByb3hpbWF0aW9uPXQsdGhpcyl9LGUucHJvdG90eXBlLl9oaWRlRW5kVGlja0xhYmVscz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZWxlbWVudCgpLm5vZGUoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxlPXRoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5zZWxlY3RBbGwoIi4iK1d2dC5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpO2lmKDAhPT1lLnNpemUoKSl7dmFyIG49ZS5ub2RlcygpWzBdO0d2dC5ET00uY2xpZW50UmVjdEluc2lkZShuLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHQpfHxWdnQuc2VsZWN0KG4pLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIik7dmFyIGk9ZS5ub2RlcygpW2Uuc2l6ZSgpLTFdO0d2dC5ET00uY2xpZW50UmVjdEluc2lkZShpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHQpfHxWdnQuc2VsZWN0KGkpLnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIil9fSxlLnByb3RvdHlwZS5faGlkZU92ZXJsYXBwaW5nVGlja0xhYmVscz1mdW5jdGlvbigpe2Zvcih2YXIgdD10aGlzLl90aWNrTGFiZWxDb250YWluZXIuc2VsZWN0QWxsKCIuIitXdnQuQXhpcy5USUNLX0xBQkVMX0NMQVNTKS5maWx0ZXIoKGZ1bmN0aW9uKHQsZSl7dmFyIG49VnZ0LnNlbGVjdCh0aGlzKS5zdHlsZSgidmlzaWJpbGl0eSIpO3JldHVybiJpbmhlcml0Ij09PW58fCJ2aXNpYmxlIj09PW59KSksZT10Lm5vZGVzKCkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX0pKSxuPTE7IXRoaXMuX2hhc092ZXJsYXBXaXRoSW50ZXJ2YWwobixlKSYmbjxlLmxlbmd0aDspbis9MTt0LmVhY2goKGZ1bmN0aW9uKHQsZSl7dmFyIGk9VnZ0LnNlbGVjdCh0aGlzKTtlJW4hPTAmJmkuc3R5bGUoInZpc2liaWxpdHkiLCJoaWRkZW4iKX0pKX0sZS5wcm90b3R5cGUuX2hhc092ZXJsYXBXaXRoSW50ZXJ2YWw9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49ImNlbnRlciI9PT10aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZz90aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTozKnRoaXMudGlja0xhYmVsUGFkZGluZygpLGk9ZS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBHdnQuRE9NLmV4cGFuZFJlY3QodCxuKX0pKSxyPTA7cjxpLmxlbmd0aC10O3IrPXQpe2lmKEd2dC5ET00uY2xpZW50UmVjdHNPdmVybGFwKGlbcl0saVtyK3RdKSlyZXR1cm4hMX1yZXR1cm4hMH0sZS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlLmNhbGwodGhpcyksdGhpcy5fbWVhc3VyZXIucmVzZXQoKX0sZX0pKFd2dC5BeGlzKTtIdnQuTnVtZXJpYz1xdnQ7dmFyIFl2dD17fSxYdnQ9e30sJHZ0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkoJHZ0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgS3Z0PURfdDskdnQuaW50ZXJ2YWxUaWNrR2VuZXJhdG9yPWZ1bmN0aW9uIFp2dCh0KXtpZih0PD0wKXRocm93IG5ldyBFcnJvcigiaW50ZXJ2YWwgbXVzdCBiZSBwb3NpdGl2ZSBudW1iZXIiKTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49ZS5kb21haW4oKSxpPU1hdGgubWluKG5bMF0sblsxXSkscj1NYXRoLm1heChuWzBdLG5bMV0pLG89TWF0aC5jZWlsKGkvdCkqdCxhPU1hdGguZmxvb3IoKHItbykvdCkrMSxzPWkldD09MD9bXTpbaV0sbD1LdnQuTWF0aC5yYW5nZSgwLGEpLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIG8rZSp0fSkpLGM9ciV0PT0wP1tdOltyXTtyZXR1cm4gcy5jb25jYXQobCkuY29uY2F0KGMpfX0sJHZ0LmludGVnZXJUaWNrR2VuZXJhdG9yPWZ1bmN0aW9uIEp2dCgpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgZT10LmRlZmF1bHRUaWNrcygpO3JldHVybiBlLmZpbHRlcigoZnVuY3Rpb24odCxuKXtyZXR1cm4gdCUxPT0wfHwwPT09bnx8bj09PWUubGVuZ3RoLTF9KSl9fTt2YXIgUXZ0PXt9LHRidD17fTtmdW5jdGlvbiBlYnQodCxlLG4pe3JldHVybiBuLShuLXQpKmV9ZnVuY3Rpb24gbmJ0KHQsZSxuKXtyZXR1cm4odCplLW4pLyhlLTEpfWZ1bmN0aW9uIGlidCh0LGUsbixpKXt2YXIgcj1lPjEsbz1yP2k6bjtpZihudWxsPT1vKXJldHVybiBlO3ZhciBhPXQuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKSxzPU1hdGguYWJzKGFbMV0tYVswXSk7cmV0dXJuKHI/TWF0aC5taW46TWF0aC5tYXgpKGUsby9zKX1mdW5jdGlvbiByYnQodCxlLG4saSxyKXtpZihlPD0xKXJldHVybntjZW50ZXJQb2ludDpuLHpvb21BbW91bnQ6ZX07aWYobnVsbD09aSYmbnVsbD09cilyZXR1cm57Y2VudGVyUG9pbnQ6bix6b29tQW1vdW50OmV9O3ZhciBvPW9idCh0KSxhPShmdW5jdGlvbiBzKHQpe3ZhciBlPXQuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKTtyZXR1cm4gZVsxXTxlWzBdfSkodCk7aT1udWxsPT1pP2E/MS8wOi0xLzA6aSxyPW51bGw9PXI/YT8tMS8wOjEvMDpyO3ZhciBsPXQuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKSxjPWxbMF0sdT1sWzFdLGg9dC5zY2FsZVRyYW5zZm9ybWF0aW9uKHIpLGQ9dC5zY2FsZVRyYW5zZm9ybWF0aW9uKHUpLHA9ZWJ0KGQsZSxuKSxmPXQuc2NhbGVUcmFuc2Zvcm1hdGlvbihpKSxtPXQuc2NhbGVUcmFuc2Zvcm1hdGlvbihjKSxnPWVidChtLGUsbiksXz1NYXRoLmFicyhoLWYpO2lmKE1hdGguYWJzKHAtZyk+Xyl7dmFyIHk9KGgtZikvKGQtbSk7cmV0dXJuIDEhPT15P3tjZW50ZXJQb2ludDpuYnQoZCx5LGgpLHpvb21BbW91bnQ6eX06e2NlbnRlclBvaW50Om4sem9vbUFtb3VudDp5fX1yZXR1cm4gcD5oIT1vP3tjZW50ZXJQb2ludDpuYnQoZCxlLGgpLHpvb21BbW91bnQ6ZX06ZzxmIT1vP3tjZW50ZXJQb2ludDpuYnQobSxlLGYpLHpvb21BbW91bnQ6ZX06e2NlbnRlclBvaW50Om4sem9vbUFtb3VudDplfX1mdW5jdGlvbiBvYnQodCl7dmFyIGU9dC5yYW5nZSgpO3JldHVybiBlWzFdPGVbMF19Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTctcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YnQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHRidC56b29tT3V0PWVidCx0YnQuY29uc3RyYWluZWRab29tPWZ1bmN0aW9uIGFidCh0LGUsbixpLHIsbyxhKXtyZXR1cm4gcmJ0KHQsZT1pYnQodCxlLGksciksbixvLGEpfSx0YnQuY29uc3RyYWluWm9vbUV4dGVudHM9aWJ0LHRidC5jb25zdHJhaW5ab29tVmFsdWVzPXJidCx0YnQuY29uc3RyYWluZWRUcmFuc2xhdGlvbj1mdW5jdGlvbiBzYnQodCxlLG4saSl7dmFyIHIsbz10LmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCksYT1vWzBdLHM9b1sxXSxsPW9idCh0KTtpZihlPjAhPT1sKXtpZihudWxsIT0ocj1pKSl7dmFyIGM9dC5zY2FsZVRyYW5zZm9ybWF0aW9uKHMpLHU9dC5zY2FsZVRyYW5zZm9ybWF0aW9uKHIpO2U9KGw/TWF0aC5tYXg6TWF0aC5taW4pKGMrZSx1KS1jfX1lbHNlIGlmKG51bGwhPShyPW4pKXt2YXIgaD10LnNjYWxlVHJhbnNmb3JtYXRpb24oYSksZD10LnNjYWxlVHJhbnNmb3JtYXRpb24ocik7ZT0obD9NYXRoLm1pbjpNYXRoLm1heCkoaCtlLGQpLWh9cmV0dXJuIGV9O3ZhciBsYnQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KGxidCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGNidD1EX3QsdWJ0PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLl9hdXRvRG9tYWluQXV0b21hdGljYWxseT0hMCx0aGlzLl9kb21haW5Nb2RpZmljYXRpb25JblByb2dyZXNzPSExLHRoaXMuX3VwZGF0ZUlkPTAsdGhpcy5fY2FsbGJhY2tzPW5ldyBjYnQuQ2FsbGJhY2tTZXQsdGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcnM9bmV3IGNidC5TZXR9cmV0dXJuIHQucHJvdG90eXBlLmV4dGVudE9mVmFsdWVzPWZ1bmN0aW9uKHQpe3JldHVybltdfSx0LnByb3RvdHlwZS5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt2b2lkIDA9PT10JiYodD0hMSk7dmFyIG49W107cmV0dXJuIHRoaXMuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXJzLmZvckVhY2goKGZ1bmN0aW9uKGkpe3ZhciByPWkoZSx0KTtuPW4uY29uY2F0KHIpfSkpLG59LHQucHJvdG90eXBlLl9nZXRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm5bXX0sdC5wcm90b3R5cGUub25VcGRhdGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2NhbGxiYWNrcy5hZGQodCksdGhpc30sdC5wcm90b3R5cGUub2ZmVXBkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jYWxsYmFja3MuZGVsZXRlKHQpLHRoaXN9LHQucHJvdG90eXBlLl9kaXNwYXRjaFVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUlkKyssdGhpcy5fY2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcyl9LHQucHJvdG90eXBlLmF1dG9Eb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYXV0b0RvbWFpbkF1dG9tYXRpY2FsbHk9ITAsdGhpcy5fc2V0RG9tYWluKHRoaXMuX2dldEV4dGVudCgpKSx0aGlzfSx0LnByb3RvdHlwZS5hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlPWZ1bmN0aW9uKCl7dGhpcy5fYXV0b0RvbWFpbkF1dG9tYXRpY2FsbHkmJnRoaXMuYXV0b0RvbWFpbigpfSx0LnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHNjYWxlIil9LHQucHJvdG90eXBlLnRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tYWluKCl9LHQucHJvdG90eXBlLmRvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9nZXREb21haW4oKToodGhpcy5fYXV0b0RvbWFpbkF1dG9tYXRpY2FsbHk9ITEsdGhpcy5fc2V0RG9tYWluKHQpLHRoaXMpfSx0LnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfZ2V0RG9tYWluIil9LHQucHJvdG90eXBlLl9zZXREb21haW49ZnVuY3Rpb24odCl7dGhpcy5fZG9tYWluTW9kaWZpY2F0aW9uSW5Qcm9ncmVzc3x8KHRoaXMuX2RvbWFpbk1vZGlmaWNhdGlvbkluUHJvZ3Jlc3M9ITAsdGhpcy5fYmFja2luZ1NjYWxlRG9tYWluKHQpLHRoaXMuX2Rpc3BhdGNoVXBkYXRlKCksdGhpcy5fZG9tYWluTW9kaWZpY2F0aW9uSW5Qcm9ncmVzcz0hMSl9LHQucHJvdG90eXBlLl9iYWNraW5nU2NhbGVEb21haW49ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfYmFja2luZ0RvbWFpbiIpfSx0LnByb3RvdHlwZS5yYW5nZT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9nZXRSYW5nZSgpOih0aGlzLl9zZXRSYW5nZSh0KSx0aGlzKX0sdC5wcm90b3R5cGUuX2dldFJhbmdlPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfZ2V0UmFuZ2UiKX0sdC5wcm90b3R5cGUuX3NldFJhbmdlPWZ1bmN0aW9uKHQpe3Rocm93IG5ldyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX3NldFJhbmdlIil9LHQucHJvdG90eXBlLmFkZEluY2x1ZGVkVmFsdWVzUHJvdmlkZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXJzLmFkZCh0KSx0aGlzLmF1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKSx0aGlzfSx0LnByb3RvdHlwZS5yZW1vdmVJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVycy5kZWxldGUodCksdGhpcy5hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCksdGhpc30sdC5wcm90b3R5cGUudXBkYXRlSWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdXBkYXRlSWR9LHR9KSgpO2xidC5TY2FsZT11YnQsCi8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShRdnQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBoYnQ9Qk8sZGJ0PXdwdCxwYnQ9dGJ0LGZidD1EX3QsbWJ0PVswLDFdLGdidD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPXQuY2FsbCh0aGlzKXx8dGhpcztuLl9yYW5nZT1bMCwxXSxuLl9kM1NjYWxlPWRidC5zY2FsZUJhbmQoKSxuLl9kM1NjYWxlLnJhbmdlKG1idCksbi5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlPWRidC5zY2FsZUxpbmVhcigpLG4uX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5kb21haW4obWJ0KTtyZXR1cm4gbi5faW5uZXJQYWRkaW5nPWUuX2NvbnZlcnRUb1Bsb3R0YWJsZUlubmVyUGFkZGluZyguMyksbi5fb3V0ZXJQYWRkaW5nPWUuX2NvbnZlcnRUb1Bsb3R0YWJsZU91dGVyUGFkZGluZyguNSwuMyksbn1yZXR1cm4gaGJ0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLmNsb25lV2l0aG91dFByb3ZpZGVycz1mdW5jdGlvbigpe3ZhciB0PShuZXcgZSkuZG9tYWluKHRoaXMuZG9tYWluKCkpLnJhbmdlKHRoaXMucmFuZ2UoKSkuaW5uZXJQYWRkaW5nKHRoaXMuaW5uZXJQYWRkaW5nKCkpLm91dGVyUGFkZGluZyh0aGlzLm91dGVyUGFkZGluZygpKTtyZXR1cm4gdC5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbih0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuZG9tYWluKCkpLHR9LGUucHJvdG90eXBlLmV4dGVudE9mVmFsdWVzPWZ1bmN0aW9uKHQpe3JldHVybiBmYnQuQXJyYXkudW5pcSh0KX0sZS5wcm90b3R5cGUuX2dldEV4dGVudD1mdW5jdGlvbigpe3JldHVybiBmYnQuQXJyYXkudW5pcSh0aGlzLl9nZXRBbGxJbmNsdWRlZFZhbHVlcygpKX0sZS5wcm90b3R5cGUuZG9tYWluPWZ1bmN0aW9uKGUpe3JldHVybiB0LnByb3RvdHlwZS5kb21haW4uY2FsbCh0aGlzLGUpfSxlLnByb3RvdHlwZS5pbnZlcnRSYW5nZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3ZvaWQgMD09PXQmJih0PXRoaXMucmFuZ2UoKSk7dmFyIG49dGhpcy5fZDNTY2FsZS5iYW5kd2lkdGgoKSxpPXRoaXMuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbih0WzBdKSxyPXRoaXMuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbih0WzFdKSxvPXRoaXMuX2QzU2NhbGUuZG9tYWluKCksYT1vLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGUuX2QzU2NhbGUodCkrbi8yfSkpLHM9ZGJ0LmJpc2VjdChhLGkpLGw9ZGJ0LmJpc2VjdChhLHIpO3JldHVybiBvLnNsaWNlKHMsbCl9LGUucHJvdG90eXBlLnJhbmdlPWZ1bmN0aW9uKGUpe3JldHVybiB0LnByb3RvdHlwZS5yYW5nZS5jYWxsKHRoaXMsZSl9LGUuX2NvbnZlcnRUb1Bsb3R0YWJsZUlubmVyUGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gMS8oMS10KS0xfSxlLl9jb252ZXJ0VG9QbG90dGFibGVPdXRlclBhZGRpbmc9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC8oMS1lKX0sZS5wcm90b3R5cGUuX3NldEJhbmRzPWZ1bmN0aW9uKCl7dmFyIHQ9MS0xLygxK3RoaXMuaW5uZXJQYWRkaW5nKCkpLGU9dGhpcy5vdXRlclBhZGRpbmcoKS8oMSt0aGlzLmlubmVyUGFkZGluZygpKTt0aGlzLl9kM1NjYWxlLnBhZGRpbmdJbm5lcih0KSx0aGlzLl9kM1NjYWxlLnBhZGRpbmdPdXRlcihlKX0sZS5wcm90b3R5cGUucmFuZ2VCYW5kPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jlc2NhbGVCYW5kKHRoaXMuX2QzU2NhbGUuYmFuZHdpZHRoKCkpfSxlLnByb3RvdHlwZS5zdGVwV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVzY2FsZUJhbmQodGhpcy5fZDNTY2FsZS5iYW5kd2lkdGgoKSooMSt0aGlzLmlubmVyUGFkZGluZygpKSl9LGUucHJvdG90eXBlLnRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tYWluKCl9LGUucHJvdG90eXBlLmlubmVyUGFkZGluZz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9pbm5lclBhZGRpbmc6KHRoaXMuX2lubmVyUGFkZGluZz10LHRoaXMucmFuZ2UodGhpcy5yYW5nZSgpKSx0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpLHRoaXMpfSxlLnByb3RvdHlwZS5vdXRlclBhZGRpbmc9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fb3V0ZXJQYWRkaW5nOih0aGlzLl9vdXRlclBhZGRpbmc9dCx0aGlzLnJhbmdlKHRoaXMucmFuZ2UoKSksdGhpcy5fZGlzcGF0Y2hVcGRhdGUoKSx0aGlzKX0sZS5wcm90b3R5cGUuc2NhbGU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fZDNTY2FsZSh0KSt0aGlzLl9kM1NjYWxlLmJhbmR3aWR0aCgpLzI7cmV0dXJuIHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZShlKX0sZS5wcm90b3R5cGUuem9vbT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7dGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbih0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUucmFuZ2UoKS5tYXAoKGZ1bmN0aW9uKGkpe3JldHVybiBuLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuaW52ZXJ0KHBidC56b29tT3V0KGksdCxlKSl9KSkpLHRoaXMuX2Rpc3BhdGNoVXBkYXRlKCl9LGUucHJvdG90eXBlLnBhbj1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5kb21haW4odGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLnJhbmdlKCkubWFwKChmdW5jdGlvbihuKXtyZXR1cm4gZS5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmludmVydChuK3QpfSkpKSx0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpfSxlLnByb3RvdHlwZS5zY2FsZVRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUodCl9LGUucHJvdG90eXBlLmludmVydGVkVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5pbnZlcnQodCl9LGUucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIG1idH0sZS5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLmRvbWFpbigpfSxlLnByb3RvdHlwZS5zZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbih0KXt0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuZG9tYWluKHQpLHRoaXMuX2Rpc3BhdGNoVXBkYXRlKCl9LGUucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFja2luZ1NjYWxlRG9tYWluKCl9LGUucHJvdG90eXBlLl9iYWNraW5nU2NhbGVEb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fZDNTY2FsZS5kb21haW4oKToodGhpcy5fZDNTY2FsZS5kb21haW4odCksdGhpcy5fc2V0QmFuZHMoKSx0aGlzKX0sZS5wcm90b3R5cGUuX2dldFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3JhbmdlfSxlLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24odCl7dGhpcy5fcmFuZ2U9dCx0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUucmFuZ2UodCksdGhpcy5fc2V0QmFuZHMoKX0sZS5wcm90b3R5cGUuX3Jlc2NhbGVCYW5kPWZ1bmN0aW9uKHQpe3JldHVybiBNYXRoLmFicyh0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUodCktdGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlKDApKX0sZX0pKGxidC5TY2FsZSk7UXZ0LkNhdGVnb3J5PWdidDt2YXIgX2J0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShfYnQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciB5YnQ9Qk8sdmJ0PXdwdCxiYnQ9RF90LHhidD1sYnQsd2J0PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLmNvdW50PTAsdGhpcy50cmFja2VyPXt9fXJldHVybiB0LnByb3RvdHlwZS5nZXRJbmRleD1mdW5jdGlvbih0KXtpZihudWxsIT10aGlzLnRyYWNrZXJbdF0pcmV0dXJuIHRoaXMudHJhY2tlclt0XTt2YXIgZT10aGlzLmNvdW50O3JldHVybiB0aGlzLnRyYWNrZXJbdF09ZSx0aGlzLmNvdW50Kz0xLGV9LHQucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5jb3VudD0wLHRoaXMudHJhY2tlcj17fX0sdH0pKCksU2J0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3ZhciBpLHI9dC5jYWxsKHRoaXMpfHx0aGlzO3N3aXRjaChyLl9yYW5nZUxlbmd0aD0xLHIuX3RyYWNrZXI9bmV3IHdidCxuKXtjYXNlIG51bGw6Y2FzZSB2b2lkIDA6bnVsbD09ZS5fcGxvdHRhYmxlQ29sb3JDYWNoZSYmKGUuX3Bsb3R0YWJsZUNvbG9yQ2FjaGU9ZS5fZ2V0UGxvdHRhYmxlQ29sb3JzKCkpLGk9dmJ0LnNjYWxlT3JkaW5hbCgpLnJhbmdlKGUuX3Bsb3R0YWJsZUNvbG9yQ2FjaGUpO2JyZWFrO2Nhc2UiQ2F0ZWdvcnkxMCI6Y2FzZSJjYXRlZ29yeTEwIjpjYXNlIjEwIjppPXZidC5zY2FsZU9yZGluYWwodmJ0LnNjaGVtZUNhdGVnb3J5MTApO2JyZWFrO2Nhc2UiQ2F0ZWdvcnkyMCI6Y2FzZSJjYXRlZ29yeTIwIjpjYXNlIjIwIjppPXZidC5zY2FsZU9yZGluYWwodmJ0LnNjaGVtZUNhdGVnb3J5MjApO2JyZWFrO2Nhc2UiQ2F0ZWdvcnkyMGIiOmNhc2UiY2F0ZWdvcnkyMGIiOmNhc2UiMjBiIjppPXZidC5zY2FsZU9yZGluYWwodmJ0LnNjaGVtZUNhdGVnb3J5MjBiKTticmVhaztjYXNlIkNhdGVnb3J5MjBjIjpjYXNlImNhdGVnb3J5MjBjIjpjYXNlIjIwYyI6aT12YnQuc2NhbGVPcmRpbmFsKHZidC5zY2hlbWVDYXRlZ29yeTIwYyk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIENvbG9yU2NhbGUgdHlwZSIpfXJldHVybiByLl9kM1NjYWxlPWksci5fcmFuZ2VMZW5ndGg9ci5fZDNTY2FsZS5yYW5nZSgpLmxlbmd0aCxyfXJldHVybiB5YnQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuZXh0ZW50T2ZWYWx1ZXM9ZnVuY3Rpb24odCl7cmV0dXJuIGJidC5BcnJheS51bmlxKHQpfSxlLnByb3RvdHlwZS5fZ2V0RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIGJidC5BcnJheS51bmlxKHRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKCkpfSxlLmludmFsaWRhdGVDb2xvckNhY2hlPWZ1bmN0aW9uKCl7ZS5fcGxvdHRhYmxlQ29sb3JDYWNoZT1udWxsfSxlLl9nZXRQbG90dGFibGVDb2xvcnM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT12YnQuc2VsZWN0KCJib2R5IikuYXBwZW5kKCJwbG90dGFibGUtY29sb3ItdGVzdGVyIiksbj1iYnQuQ29sb3IuY29sb3JUZXN0KGUsIiIpLGk9MCxyPWJidC5Db2xvci5jb2xvclRlc3QoZSwicGxvdHRhYmxlLWNvbG9ycy0wIik7bnVsbCE9ciYmaTx0aGlzLl9NQVhJTVVNX0NPTE9SU19GUk9NX0NTUyYmKHIhPT1ufHxyIT09dFt0Lmxlbmd0aC0xXSk7KXQucHVzaChyKSxpKysscj1iYnQuQ29sb3IuY29sb3JUZXN0KGUsInBsb3R0YWJsZS1jb2xvcnMtIitpKTtyZXR1cm4gZS5yZW1vdmUoKSx0fSxlLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbih0KXt2YXIgbj10aGlzLl9kM1NjYWxlKHQpLGk9dGhpcy5fdHJhY2tlci5nZXRJbmRleCh0KSxyPU1hdGguZmxvb3IoaS90aGlzLl9yYW5nZUxlbmd0aCk7aWYoMD09PXIpcmV0dXJuIG47dmFyIG89TWF0aC5sb2cociplLl9MT09QX0xJR0hURU5fRkFDVE9SKzEpO3JldHVybiBiYnQuQ29sb3IubGlnaHRlbkNvbG9yKG4sbyl9LGUucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFja2luZ1NjYWxlRG9tYWluKCl9LGUucHJvdG90eXBlLl9iYWNraW5nU2NhbGVEb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fZDNTY2FsZS5kb21haW4oKToodGhpcy5fZDNTY2FsZS5kb21haW4odCksdGhpcy5fdHJhY2tlci5jbGVhcigpLHRoaXMpfSxlLnByb3RvdHlwZS5fZ2V0UmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5yYW5nZSgpfSxlLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24odCl7dGhpcy5fZDNTY2FsZS5yYW5nZSh0KSx0aGlzLl9yYW5nZUxlbmd0aD10Lmxlbmd0aH0sZS5fTE9PUF9MSUdIVEVOX0ZBQ1RPUj0xLjYsZS5fTUFYSU1VTV9DT0xPUlNfRlJPTV9DU1M9MjU2LGV9KSh4YnQuU2NhbGUpO19idC5Db2xvcj1TYnQ7dmFyIE1idD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoTWJ0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgRWJ0PUJPLFRidD13cHQsQ2J0PURfdCxBYnQ9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUobil7dm9pZCAwPT09biYmKG49ImxpbmVhciIpO3ZhciBpPXQuY2FsbCh0aGlzKXx8dGhpcztzd2l0Y2gobil7Y2FzZSJsaW5lYXIiOmkuX2NvbG9yU2NhbGU9VGJ0LnNjYWxlTGluZWFyKCk7YnJlYWs7Y2FzZSJsb2ciOmkuX2NvbG9yU2NhbGU9VGJ0LnNjYWxlTG9nKCk7YnJlYWs7Y2FzZSJzcXJ0IjppLl9jb2xvclNjYWxlPVRidC5zY2FsZVNxcnQoKTticmVhaztjYXNlInBvdyI6aS5fY29sb3JTY2FsZT1UYnQuc2NhbGVQb3coKX1pZihudWxsPT1pLl9jb2xvclNjYWxlKXRocm93IG5ldyBFcnJvcigidW5rbm93biBRdWFudGl0YXRpdmVTY2FsZSBzY2FsZSB0eXBlICIrbik7cmV0dXJuIGkucmFuZ2UoZS5SRURTKSxpfXJldHVybiBFYnQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuZXh0ZW50T2ZWYWx1ZXM9ZnVuY3Rpb24odCl7dmFyIGU9VGJ0LmV4dGVudCh0KTtyZXR1cm4gbnVsbD09ZVswXXx8bnVsbD09ZVsxXT9bXTplfSxlLnByb3RvdHlwZS5fZDNJbnRlcnBvbGF0ZWRTY2FsZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb2xvclNjYWxlLnJhbmdlKFswLDFdKS5pbnRlcnBvbGF0ZSh0aGlzLl9pbnRlcnBvbGF0ZUNvbG9ycygpKX0sZS5wcm90b3R5cGUuX2ludGVycG9sYXRlQ29sb3JzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fY29sb3JSYW5nZTtpZih0Lmxlbmd0aDwyKXRocm93IG5ldyBFcnJvcigiQ29sb3Igc2NhbGUgYXJyYXlzIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gZWxlbWVudHMuIik7cmV0dXJuIGZ1bmN0aW9uKGUsbil7cmV0dXJuIGZ1bmN0aW9uKGUpe3ZhciBuPShlPU1hdGgubWF4KDAsTWF0aC5taW4oMSxlKSkpKih0Lmxlbmd0aC0xKSxpPU1hdGguZmxvb3Iobikscj1NYXRoLmNlaWwobiksbz1uLWk7cmV0dXJuIFRidC5pbnRlcnBvbGF0ZUxhYih0W2ldLHRbcl0pKG8pfX19LGUucHJvdG90eXBlLl9yZXNldFNjYWxlPWZ1bmN0aW9uKCl7dGhpcy5fZDNTY2FsZT10aGlzLl9kM0ludGVycG9sYXRlZFNjYWxlKCksdGhpcy5hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCksdGhpcy5fZGlzcGF0Y2hVcGRhdGUoKX0sZS5wcm90b3R5cGUuYXV0b0RvbWFpbj1mdW5jdGlvbigpe3ZhciB0PXRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKCk7cmV0dXJuIHQubGVuZ3RoPjAmJnRoaXMuX3NldERvbWFpbihbQ2J0Lk1hdGgubWluKHQsMCksQ2J0Lk1hdGgubWF4KHQsMCldKSx0aGlzfSxlLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZDNTY2FsZSh0KX0sZS5wcm90b3R5cGUuX2dldERvbWFpbj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oKX0sZS5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9kM1NjYWxlLmRvbWFpbigpOih0aGlzLl9kM1NjYWxlLmRvbWFpbih0KSx0aGlzKX0sZS5wcm90b3R5cGUuX2dldFJhbmdlPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbG9yUmFuZ2V9LGUucHJvdG90eXBlLl9zZXRSYW5nZT1mdW5jdGlvbih0KXt0aGlzLl9jb2xvclJhbmdlPXQsdGhpcy5fcmVzZXRTY2FsZSgpfSxlLlJFRFM9WyIjRkZGRkZGIiwiI0ZGRjZFMSIsIiNGRUY0QzAiLCIjRkVEOTc2IiwiI0ZFQjI0QyIsIiNGRDhEM0MiLCIjRkM0RTJBIiwiI0UzMUExQyIsIiNCMTAwMjYiXSxlLkJMVUVTPVsiI0ZGRkZGRiIsIiNDQ0ZGRkYiLCIjQTVGRkZEIiwiIzg1RjdGQiIsIiM2RUQzRUYiLCIjNTVBN0UwIiwiIzQxN0ZEMCIsIiMyNTQ1RDMiLCIjMEIwMkUxIl0sZS5QT1NORUc9WyIjMEIwMkUxIiwiIzI1NDVEMyIsIiM0MTdGRDAiLCIjNTVBN0UwIiwiIzZFRDNFRiIsIiM4NUY3RkIiLCIjQTVGRkZEIiwiI0NDRkZGRiIsIiNGRkZGRkYiLCIjRkZGNkUxIiwiI0ZFRjRDMCIsIiNGRUQ5NzYiLCIjRkVCMjRDIiwiI0ZEOEQzQyIsIiNGQzRFMkEiLCIjRTMxQTFDIiwiI0IxMDAyNiJdLGV9KShsYnQuU2NhbGUpO01idC5JbnRlcnBvbGF0ZWRDb2xvcj1BYnQ7dmFyIGtidD17fSxMYnQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShMYnQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBQYnQ9Qk8sTmJ0PXdwdCxJYnQ9dGJ0LFJidD1EX3QsT2J0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBlLl90aWNrR2VuZXJhdG9yPWZ1bmN0aW9uKHQpe3JldHVybiB0LmRlZmF1bHRUaWNrcygpfSxlLl9wYWRQcm9wb3J0aW9uPS4wNSxlLl9zbmFwcGluZ0RvbWFpbkVuYWJsZWQ9ITAsZS5fcGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcnM9bmV3IFJidC5TZXQsZX1yZXR1cm4gUGJ0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLmF1dG9Eb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZG9tYWluTWluPW51bGwsdGhpcy5fZG9tYWluTWF4PW51bGwsdC5wcm90b3R5cGUuYXV0b0RvbWFpbi5jYWxsKHRoaXMpLHRoaXN9LGUucHJvdG90eXBlLmF1dG9Eb21haW5JZkF1dG9tYXRpY01vZGU9ZnVuY3Rpb24oKXtpZihudWxsPT10aGlzLl9kb21haW5NaW58fG51bGw9PXRoaXMuX2RvbWFpbk1heCl7dmFyIGU9dGhpcy5fZ2V0RXh0ZW50KCk7aWYobnVsbCE9dGhpcy5fZG9tYWluTWluKXt2YXIgbj1lWzFdO3JldHVybiB0aGlzLl9kb21haW5NaW4+PW4mJihuPXRoaXMuX2V4cGFuZFNpbmdsZVZhbHVlRG9tYWluKFt0aGlzLl9kb21haW5NaW4sdGhpcy5fZG9tYWluTWluXSlbMV0pLHZvaWQgdGhpcy5fc2V0RG9tYWluKFt0aGlzLl9kb21haW5NaW4sbl0pfWlmKG51bGwhPXRoaXMuX2RvbWFpbk1heCl7dmFyIGk9ZVswXTtyZXR1cm4gdGhpcy5fZG9tYWluTWF4PD1pJiYoaT10aGlzLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbihbdGhpcy5fZG9tYWluTWF4LHRoaXMuX2RvbWFpbk1heF0pWzBdKSx2b2lkIHRoaXMuX3NldERvbWFpbihbaSx0aGlzLl9kb21haW5NYXhdKX10LnByb3RvdHlwZS5hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlLmNhbGwodGhpcyl9ZWxzZSB0aGlzLl9zZXREb21haW4oW3RoaXMuX2RvbWFpbk1pbix0aGlzLl9kb21haW5NYXhdKX0sZS5wcm90b3R5cGUuX2dldFVuYm91bmRlZEV4dGVudD1mdW5jdGlvbih0KXt2b2lkIDA9PT10JiYodD0hMSk7dmFyIGU9dGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXModCksbj10aGlzLl9kZWZhdWx0RXh0ZW50KCk7aWYoMCE9PWUubGVuZ3RoKXt2YXIgaT1bUmJ0Lk1hdGgubWluKGUsblswXSksUmJ0Lk1hdGgubWF4KGUsblsxXSldO249dGhpcy5fcGFkRG9tYWluKGkpfXJldHVybiBufSxlLnByb3RvdHlwZS5fZ2V0RXh0ZW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZ2V0VW5ib3VuZGVkRXh0ZW50KCk7cmV0dXJuIG51bGwhPXRoaXMuX2RvbWFpbk1pbiYmKHRbMF09dGhpcy5fZG9tYWluTWluKSxudWxsIT10aGlzLl9kb21haW5NYXgmJih0WzFdPXRoaXMuX2RvbWFpbk1heCksdH0sZS5wcm90b3R5cGUuYWRkUGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcnMuYWRkKHQpLHRoaXMuYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpLHRoaXN9LGUucHJvdG90eXBlLnJlbW92ZVBhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXI9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXJzLmRlbGV0ZSh0KSx0aGlzLmF1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUoKSx0aGlzfSxlLnByb3RvdHlwZS5wYWRQcm9wb3J0aW9uPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX3BhZFByb3BvcnRpb247aWYodDwwKXRocm93IG5ldyBFcnJvcigicGFkUHJvcG9ydGlvbiBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIpO3JldHVybiB0aGlzLl9wYWRQcm9wb3J0aW9uPXQsdGhpcy5hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCksdGhpc30sZS5wcm90b3R5cGUuX3BhZERvbWFpbj1mdW5jdGlvbih0KXt2YXIgZT10aGlzO2lmKHRbMF0udmFsdWVPZigpPT09dFsxXS52YWx1ZU9mKCkpcmV0dXJuIHRoaXMuX2V4cGFuZFNpbmdsZVZhbHVlRG9tYWluKHQpO2lmKDA9PT10aGlzLl9wYWRQcm9wb3J0aW9uKXJldHVybiB0O3ZhciBuPXRoaXMuX3BhZFByb3BvcnRpb24vMixpPXRbMF0scj10WzFdLG89ITEsYT0hMTt0aGlzLl9wYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVycy5mb3JFYWNoKChmdW5jdGlvbih0KXt0KGUpLmZvckVhY2goKGZ1bmN0aW9uKHQpe3QudmFsdWVPZigpPT09aS52YWx1ZU9mKCkmJihvPSEwKSx0LnZhbHVlT2YoKT09PXIudmFsdWVPZigpJiYoYT0hMCl9KSl9KSk7dmFyIHM9dGhpcy5fYmFja2luZ1NjYWxlRG9tYWluKCk7dGhpcy5fYmFja2luZ1NjYWxlRG9tYWluKHQpO3ZhciBsPW8/aTp0aGlzLmludmVydCh0aGlzLnNjYWxlKGkpLSh0aGlzLnNjYWxlKHIpLXRoaXMuc2NhbGUoaSkpKm4pLGM9YT9yOnRoaXMuaW52ZXJ0KHRoaXMuc2NhbGUocikrKHRoaXMuc2NhbGUociktdGhpcy5zY2FsZShpKSkqbik7cmV0dXJuIHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbihzKSx0aGlzLl9zbmFwcGluZ0RvbWFpbkVuYWJsZWQ/dGhpcy5fbmljZURvbWFpbihbbCxjXSk6W2wsY119LGUucHJvdG90eXBlLnNuYXBwaW5nRG9tYWluRW5hYmxlZD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9zbmFwcGluZ0RvbWFpbkVuYWJsZWQ6KHRoaXMuX3NuYXBwaW5nRG9tYWluRW5hYmxlZD10LHRoaXMuYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpLHRoaXMpfSxlLnByb3RvdHlwZS5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIHR9LGUucHJvdG90eXBlLmludmVydD1mdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGludmVydCIpfSxlLnByb3RvdHlwZS5kb21haW49ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWUmJih0aGlzLl9kb21haW5NaW49ZVswXSx0aGlzLl9kb21haW5NYXg9ZVsxXSksdC5wcm90b3R5cGUuZG9tYWluLmNhbGwodGhpcyxlKX0sZS5wcm90b3R5cGUuZG9tYWluTWluPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuZG9tYWluKClbMF06KHRoaXMuX2RvbWFpbk1pbj10LHRoaXMuYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpLHRoaXMpfSxlLnByb3RvdHlwZS5kb21haW5NYXg9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5kb21haW4oKVsxXToodGhpcy5fZG9tYWluTWF4PXQsdGhpcy5hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCksdGhpcyl9LGUucHJvdG90eXBlLmV4dGVudE9mVmFsdWVzPWZ1bmN0aW9uKHQpe3ZhciBlPU5idC5leHRlbnQodC5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiBSYnQuTWF0aC5pc1ZhbGlkTnVtYmVyKCt0KX0pKSk7cmV0dXJuIG51bGw9PWVbMF18fG51bGw9PWVbMV0/W106ZX0sZS5wcm90b3R5cGUuem9vbT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXM7dGhpcy5kb21haW4odGhpcy5yYW5nZSgpLm1hcCgoZnVuY3Rpb24oaSl7cmV0dXJuIG4uaW52ZXJ0KElidC56b29tT3V0KGksdCxlKSl9KSkpfSxlLnByb3RvdHlwZS5wYW49ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0aGlzLmRvbWFpbih0aGlzLnJhbmdlKCkubWFwKChmdW5jdGlvbihuKXtyZXR1cm4gZS5pbnZlcnQobit0KX0pKSl9LGUucHJvdG90eXBlLnNjYWxlVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBzY2FsZVRyYW5zZm9ybWF0aW9uIil9LGUucHJvdG90eXBlLmludmVydGVkVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBpbnZlcnRlZFRyYW5zZm9ybWF0aW9uIil9LGUucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBnZXRUcmFuc2Zvcm1hdGlvbkV4dGVudCIpfSxlLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4iKX0sZS5wcm90b3R5cGUuc2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBzZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbiIpfSxlLnByb3RvdHlwZS5fc2V0RG9tYWluPWZ1bmN0aW9uKGUpe3ZhciBuPWZ1bmN0aW9uKHQpe3JldHVybiBSYnQuTWF0aC5pc05hTih0KXx8dD09PTEvMHx8dD09PS0xLzB9O24oZVswXSl8fG4oZVsxXSk/UmJ0LldpbmRvdy53YXJuKCJXYXJuaW5nOiBRdWFudGl0YXRpdmVTY2FsZXMgY2Fubm90IHRha2UgTmFOIG9yIEluZmluaXR5IGFzIGEgZG9tYWluIHZhbHVlLiBJZ25vcmluZy4iKTp0LnByb3RvdHlwZS5fc2V0RG9tYWluLmNhbGwodGhpcyxlKX0sZS5wcm90b3R5cGUuZGVmYXVsdFRpY2tzPWZ1bmN0aW9uKCl7dGhyb3cgbmV3IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfZ2V0RGVmYXVsdFRpY2tzIil9LGUucHJvdG90eXBlLnRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3RpY2tHZW5lcmF0b3IodGhpcyl9LGUucHJvdG90eXBlLl9uaWNlRG9tYWluPWZ1bmN0aW9uKHQsZSl7dGhyb3cgbmV3IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfbmljZURvbWFpbiIpfSxlLnByb3RvdHlwZS5fZGVmYXVsdEV4dGVudD1mdW5jdGlvbigpe3Rocm93IG5ldyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX2RlZmF1bHRFeHRlbnQiKX0sZS5wcm90b3R5cGUudGlja0dlbmVyYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl90aWNrR2VuZXJhdG9yOih0aGlzLl90aWNrR2VuZXJhdG9yPXQsdGhpcyl9LGUuX0RFRkFVTFRfTlVNX1RJQ0tTPTEwLGV9KShsYnQuU2NhbGUpO0xidC5RdWFudGl0YXRpdmVTY2FsZT1PYnQsCi8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShrYnQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciB6YnQ9Qk8sRGJ0PXdwdCxCYnQ9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIGUuX2QzU2NhbGU9RGJ0LnNjYWxlTGluZWFyKCksZX1yZXR1cm4gemJ0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLl9kZWZhdWx0RXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuWzAsMV19LGUucHJvdG90eXBlLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gdFswXT09PXRbMV0/W3RbMF0tMSx0WzFdKzFdOnR9LGUucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kM1NjYWxlKHQpfSxlLnByb3RvdHlwZS5zY2FsZVRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLnNjYWxlKHQpfSxlLnByb3RvdHlwZS5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLmludmVydCh0KX0sZS5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25FeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZ2V0VW5ib3VuZGVkRXh0ZW50KCEwKX0sZS5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kb21haW4oKX0sZS5wcm90b3R5cGUuc2V0VHJhbnNmb3JtYXRpb25Eb21haW49ZnVuY3Rpb24odCl7dGhpcy5kb21haW4odCl9LGUucHJvdG90eXBlLl9nZXREb21haW49ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYmFja2luZ1NjYWxlRG9tYWluKCl9LGUucHJvdG90eXBlLl9iYWNraW5nU2NhbGVEb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fZDNTY2FsZS5kb21haW4oKToodGhpcy5fZDNTY2FsZS5kb21haW4odCksdGhpcyl9LGUucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1NjYWxlLnJhbmdlKCl9LGUucHJvdG90eXBlLl9zZXRSYW5nZT1mdW5jdGlvbih0KXt0aGlzLl9kM1NjYWxlLnJhbmdlKHQpfSxlLnByb3RvdHlwZS5pbnZlcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUuaW52ZXJ0KHQpfSxlLnByb3RvdHlwZS5kZWZhdWx0VGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS50aWNrcyhlLl9ERUZBVUxUX05VTV9USUNLUyl9LGUucHJvdG90eXBlLl9uaWNlRG9tYWluPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2QzU2NhbGUuY29weSgpLmRvbWFpbih0KS5uaWNlKGUpLmRvbWFpbigpfSxlfSkoTGJ0LlF1YW50aXRhdGl2ZVNjYWxlKTtrYnQuTGluZWFyPUJidDt2YXIgSGJ0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShIYnQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBGYnQ9Qk8sVmJ0PXdwdCxVYnQ9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dm9pZCAwPT09ZSYmKGU9MTApO3ZhciBuPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gbi5fZDNTY2FsZT1WYnQuc2NhbGVMb2coKS5iYXNlKGUpLG4uX3NldERvbWFpbihuLl9kZWZhdWx0RXh0ZW50KCkpLG59cmV0dXJuIEZidC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5fZGVmYXVsdEV4dGVudD1mdW5jdGlvbigpe3JldHVyblsxLHRoaXMuX2QzU2NhbGUuYmFzZSgpXX0sZS5wcm90b3R5cGUuX2V4cGFuZFNpbmdsZVZhbHVlRG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiB0WzBdPT09dFsxXT9bdFswXS90aGlzLl9kM1NjYWxlLmJhc2UoKSx0WzFdKnRoaXMuX2QzU2NhbGUuYmFzZSgpXTp0fSxlLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZDNTY2FsZSh0KX0sZS5wcm90b3R5cGUuc2NhbGVUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zY2FsZSh0KX0sZS5wcm90b3R5cGUuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pbnZlcnQodCl9LGUucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFVuYm91bmRlZEV4dGVudCghMCl9LGUucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tYWluKCl9LGUucHJvdG90eXBlLnNldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKHQpe3RoaXMuZG9tYWluKHQpfSxlLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpfSxlLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2QzU2NhbGUuZG9tYWluKCk6KHRoaXMuX2QzU2NhbGUuZG9tYWluKHQpLHRoaXMpfSxlLnByb3RvdHlwZS5fZ2V0UmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5yYW5nZSgpfSxlLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24odCl7dGhpcy5fZDNTY2FsZS5yYW5nZSh0KX0sZS5wcm90b3R5cGUuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kM1NjYWxlLmludmVydCh0KX0sZS5wcm90b3R5cGUuZGVmYXVsdFRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUudGlja3MoZS5fREVGQVVMVF9OVU1fVElDS1MpfSxlLnByb3RvdHlwZS5fbmljZURvbWFpbj1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9kM1NjYWxlLmNvcHkoKS5kb21haW4odCkubmljZSgpLmRvbWFpbigpfSxlfSkoTGJ0LlF1YW50aXRhdGl2ZVNjYWxlKTtIYnQuTG9nPVVidDt2YXIgamJ0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShqYnQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBHYnQ9Qk8sV2J0PXdwdCxxYnQ9RF90LFlidD1YdnQsWGJ0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPTEwKTt2YXIgbj10LmNhbGwodGhpcyl8fHRoaXM7aWYobi5fbG9nVGlja0dlbmVyYXRvcj1mdW5jdGlvbih0KXt2YXIgZT1mdW5jdGlvbih0LGUsbil7cmV0dXJuW3QsZSxuXS5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiB0LWV9KSlbMV19LGk9cWJ0Lk1hdGgubWluKG4uX3VudHJhbnNmb3JtZWREb21haW4sMCkscj1xYnQuTWF0aC5tYXgobi5fdW50cmFuc2Zvcm1lZERvbWFpbiwwKSxvPWksYT1lKGksciwtbi5fcGl2b3QpLHM9ZShpLHIsbi5fcGl2b3QpLGw9cixjPW4uX2xvZ1RpY2tzKC1hLC1vKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybi10fSkpLnJldmVyc2UoKSx1PW4uX2xvZ1RpY2tzKHMsbCksaD1NYXRoLm1heChpLC1uLl9waXZvdCksZD1NYXRoLm1pbihyLG4uX3Bpdm90KSxwPVdidC5zY2FsZUxpbmVhcigpLmRvbWFpbihbaCxkXSkudGlja3Mobi5faG93TWFueVRpY2tzKGgsZCkpLGY9Yy5jb25jYXQocCkuY29uY2F0KHUpO3JldHVybiBmLmxlbmd0aDw9MSYmKGY9V2J0LnNjYWxlTGluZWFyKCkuZG9tYWluKFtpLHJdKS50aWNrcyhZYnQuTW9kaWZpZWRMb2cuX0RFRkFVTFRfTlVNX1RJQ0tTKSksZn0sbi5fZDNTY2FsZT1XYnQuc2NhbGVMaW5lYXIoKSxuLl9iYXNlPWUsbi5fcGl2b3Q9bi5fYmFzZSxuLl9zZXREb21haW4obi5fZGVmYXVsdEV4dGVudCgpKSxuLnRpY2tHZW5lcmF0b3Iobi5fbG9nVGlja0dlbmVyYXRvciksZTw9MSl0aHJvdyBuZXcgRXJyb3IoIk1vZGlmaWVkTG9nU2NhbGU6IFRoZSBiYXNlIG11c3QgYmUgPiAxIik7cmV0dXJuIG59cmV0dXJuIEdidC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5fYWRqdXN0ZWRMb2c9ZnVuY3Rpb24odCl7dmFyIGU9dDwwPy0xOjE7cmV0dXJuKHQqPWUpPHRoaXMuX3Bpdm90JiYodCs9KHRoaXMuX3Bpdm90LXQpL3RoaXMuX3Bpdm90KSx0PU1hdGgubG9nKHQpL01hdGgubG9nKHRoaXMuX2Jhc2UpLHQqPWV9LGUucHJvdG90eXBlLl9pbnZlcnRlZEFkanVzdGVkTG9nPWZ1bmN0aW9uKHQpe3ZhciBlPXQ8MD8tMToxO3JldHVybiB0Kj1lLCh0PU1hdGgucG93KHRoaXMuX2Jhc2UsdCkpPHRoaXMuX3Bpdm90JiYodD10aGlzLl9waXZvdCoodC0xKS8odGhpcy5fcGl2b3QtMSkpLHQqPWV9LGUucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kM1NjYWxlKHRoaXMuX2FkanVzdGVkTG9nKHQpKX0sZS5wcm90b3R5cGUuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9pbnZlcnRlZEFkanVzdGVkTG9nKHRoaXMuX2QzU2NhbGUuaW52ZXJ0KHQpKX0sZS5wcm90b3R5cGUuc2NhbGVUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zY2FsZSh0KX0sZS5wcm90b3R5cGUuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5pbnZlcnQodCl9LGUucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2dldFVuYm91bmRlZEV4dGVudCghMCl9LGUucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZG9tYWluKCl9LGUucHJvdG90eXBlLnNldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKHQpe3RoaXMuZG9tYWluKHQpfSxlLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3VudHJhbnNmb3JtZWREb21haW59LGUucHJvdG90eXBlLl9zZXREb21haW49ZnVuY3Rpb24oZSl7dGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbj1lO3ZhciBuPVt0aGlzLl9hZGp1c3RlZExvZyhlWzBdKSx0aGlzLl9hZGp1c3RlZExvZyhlWzFdKV07dC5wcm90b3R5cGUuX3NldERvbWFpbi5jYWxsKHRoaXMsbil9LGUucHJvdG90eXBlLl9iYWNraW5nU2NhbGVEb21haW49ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fZDNTY2FsZS5kb21haW4oKToodGhpcy5fZDNTY2FsZS5kb21haW4odCksdGhpcyl9LGUucHJvdG90eXBlLl9sb2dUaWNrcz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMsaT10aGlzLl9ob3dNYW55VGlja3ModCxlKTtpZigwPT09aSlyZXR1cm5bXTt2YXIgcj1NYXRoLmZsb29yKE1hdGgubG9nKHQpL01hdGgubG9nKHRoaXMuX2Jhc2UpKSxvPU1hdGguY2VpbChNYXRoLmxvZyhlKS9NYXRoLmxvZyh0aGlzLl9iYXNlKSksYT1XYnQucmFuZ2UobyxyLC1NYXRoLmNlaWwoKG8tcikvaSkpLHM9V2J0LnJhbmdlKHRoaXMuX2Jhc2UsMSwtKHRoaXMuX2Jhc2UtMSkpLm1hcChNYXRoLmZsb29yKSxsPXFidC5BcnJheS51bmlxKHMpLGM9YS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBsLm1hcCgoZnVuY3Rpb24oZSl7cmV0dXJuIE1hdGgucG93KG4uX2Jhc2UsdC0xKSplfSkpfSkpO3JldHVybiBxYnQuQXJyYXkuZmxhdHRlbihjKS5maWx0ZXIoKGZ1bmN0aW9uKG4pe3JldHVybiB0PD1uJiZuPD1lfSkpLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQtZX0pKX0sZS5wcm90b3R5cGUuX2hvd01hbnlUaWNrcz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2FkanVzdGVkTG9nKHFidC5NYXRoLm1pbih0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWluLDApKSxpPXRoaXMuX2FkanVzdGVkTG9nKHFidC5NYXRoLm1heCh0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWluLDApKSxyPXRoaXMuX2FkanVzdGVkTG9nKHQpLG89dGhpcy5fYWRqdXN0ZWRMb2coZSk7cmV0dXJuIE1hdGguY2VpbCgoby1yKS8oaS1uKSpZYnQuTW9kaWZpZWRMb2cuX0RFRkFVTFRfTlVNX1RJQ0tTKX0sZS5wcm90b3R5cGUuX25pY2VEb21haW49ZnVuY3Rpb24odCxlKXtyZXR1cm4gdH0sZS5wcm90b3R5cGUuX2RlZmF1bHRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm5bMCx0aGlzLl9iYXNlXX0sZS5wcm90b3R5cGUuX2V4cGFuZFNpbmdsZVZhbHVlRG9tYWluPWZ1bmN0aW9uKHQpe2lmKHRbMF09PT10WzFdKXt2YXIgZT10WzBdO3JldHVybiBlPjA/W2UvdGhpcy5fYmFzZSxlKnRoaXMuX2Jhc2VdOjA9PT1lP1stdGhpcy5fYmFzZSx0aGlzLl9iYXNlXTpbZSp0aGlzLl9iYXNlLGUvdGhpcy5fYmFzZV19cmV0dXJuIHR9LGUucHJvdG90eXBlLl9nZXRSYW5nZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kM1NjYWxlLnJhbmdlKCl9LGUucHJvdG90eXBlLl9zZXRSYW5nZT1mdW5jdGlvbih0KXt0aGlzLl9kM1NjYWxlLnJhbmdlKHQpfSxlLnByb3RvdHlwZS5kZWZhdWx0VGlja3M9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS50aWNrcyhZYnQuTW9kaWZpZWRMb2cuX0RFRkFVTFRfTlVNX1RJQ0tTKX0sZX0pKExidC5RdWFudGl0YXRpdmVTY2FsZSk7amJ0Lk1vZGlmaWVkTG9nPVhidDt2YXIgJGJ0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eSgkYnQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBLYnQ9Qk8sWmJ0PXdwdCxKYnQ9WXZ0LFFidD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gZS5fZDNTY2FsZT1aYnQuc2NhbGVUaW1lKCksZS5hdXRvRG9tYWluKCksZX1yZXR1cm4gS2J0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLnRpY2tJbnRlcnZhbD1mdW5jdGlvbih0LG4saSl7dm9pZCAwPT09biYmKG49MSksdm9pZCAwPT09aSYmKGk9ITEpO3ZhciByPVpidC5zY2FsZVRpbWUoKSxvPWUudGltZUludGVydmFsVG9EM1RpbWUodCxpKS5ldmVyeShuKTtyZXR1cm4gci5kb21haW4odGhpcy5kb21haW4oKSksci5yYW5nZSh0aGlzLnJhbmdlKCkpLHIudGlja3Mobyl9LGUucHJvdG90eXBlLl9zZXREb21haW49ZnVuY3Rpb24oZSl7aWYoZVsxXTxlWzBdKXRocm93IG5ldyBFcnJvcigiU2NhbGUuVGltZSBkb21haW4gdmFsdWVzIG11c3QgYmUgaW4gY2hyb25vbG9naWNhbCBvcmRlciIpO3JldHVybiB0LnByb3RvdHlwZS5fc2V0RG9tYWluLmNhbGwodGhpcyxlKX0sZS5wcm90b3R5cGUuX2RlZmF1bHRFeHRlbnQ9ZnVuY3Rpb24oKXtyZXR1cm5bbmV3IERhdGUoIjE5NzAtMDEtMDEiKSxuZXcgRGF0ZSgiMTk3MC0wMS0wMiIpXX0sZS5wcm90b3R5cGUuX2V4cGFuZFNpbmdsZVZhbHVlRG9tYWluPWZ1bmN0aW9uKHQpe3ZhciBlPXRbMF0uZ2V0VGltZSgpLG49dFsxXS5nZXRUaW1lKCk7aWYoZT09PW4pe3ZhciBpPW5ldyBEYXRlKGUpO2kuc2V0RGF0ZShpLmdldERhdGUoKS0xKTt2YXIgcj1uZXcgRGF0ZShuKTtyZXR1cm4gci5zZXREYXRlKHIuZ2V0RGF0ZSgpKzEpLFtpLHJdfXJldHVybiB0fSxlLnByb3RvdHlwZS5zY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZDNTY2FsZSh0KX0sZS5wcm90b3R5cGUuc2NhbGVUcmFuc2Zvcm1hdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5zY2FsZShuZXcgRGF0ZSh0KSl9LGUucHJvdG90eXBlLmludmVydGVkVHJhbnNmb3JtYXRpb249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuaW52ZXJ0KHQpLmdldFRpbWUoKX0sZS5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25FeHRlbnQ9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLl9nZXRVbmJvdW5kZWRFeHRlbnQoITApO3JldHVyblt0WzBdLnZhbHVlT2YoKSx0WzFdLnZhbHVlT2YoKV19LGUucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5kb21haW4oKTtyZXR1cm5bdFswXS52YWx1ZU9mKCksdFsxXS52YWx1ZU9mKCldfSxlLnByb3RvdHlwZS5zZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbj1mdW5jdGlvbih0KXt2YXIgZT10WzFdO3RoaXMuZG9tYWluKFtuZXcgRGF0ZSh0WzBdKSxuZXcgRGF0ZShlKV0pfSxlLnByb3RvdHlwZS5fZ2V0RG9tYWluPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpfSxlLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2QzU2NhbGUuZG9tYWluKCk6KHRoaXMuX2QzU2NhbGUuZG9tYWluKHQpLHRoaXMpfSxlLnByb3RvdHlwZS5fZ2V0UmFuZ2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5yYW5nZSgpfSxlLnByb3RvdHlwZS5fc2V0UmFuZ2U9ZnVuY3Rpb24odCl7dGhpcy5fZDNTY2FsZS5yYW5nZSh0KX0sZS5wcm90b3R5cGUuaW52ZXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kM1NjYWxlLmludmVydCh0KX0sZS5wcm90b3R5cGUuZGVmYXVsdFRpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2QzU2NhbGUudGlja3MoZS5fREVGQVVMVF9OVU1fVElDS1MpfSxlLnByb3RvdHlwZS5fbmljZURvbWFpbj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZDNTY2FsZS5jb3B5KCkuZG9tYWluKHQpLm5pY2UoKS5kb21haW4oKX0sZS50aW1lSW50ZXJ2YWxUb0QzVGltZT1mdW5jdGlvbih0LGUpe3N3aXRjaCh0KXtjYXNlIEpidC5UaW1lSW50ZXJ2YWwuc2Vjb25kOnJldHVybiBlP1pidC51dGNTZWNvbmQ6WmJ0LnRpbWVTZWNvbmQ7Y2FzZSBKYnQuVGltZUludGVydmFsLm1pbnV0ZTpyZXR1cm4gZT9aYnQudXRjTWludXRlOlpidC50aW1lTWludXRlO2Nhc2UgSmJ0LlRpbWVJbnRlcnZhbC5ob3VyOnJldHVybiBlP1pidC51dGNIb3VyOlpidC50aW1lSG91cjtjYXNlIEpidC5UaW1lSW50ZXJ2YWwuZGF5OnJldHVybiBlP1pidC51dGNEYXk6WmJ0LnRpbWVEYXk7Y2FzZSBKYnQuVGltZUludGVydmFsLndlZWs6cmV0dXJuIGU/WmJ0LnV0Y1dlZWs6WmJ0LnRpbWVXZWVrO2Nhc2UgSmJ0LlRpbWVJbnRlcnZhbC5tb250aDpyZXR1cm4gZT9aYnQudXRjTW9udGg6WmJ0LnRpbWVNb250aDtjYXNlIEpidC5UaW1lSW50ZXJ2YWwueWVhcjpyZXR1cm4gZT9aYnQudXRjWWVhcjpaYnQudGltZVllYXI7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVGltZUludGVydmFsIHNwZWNpZmllZCBkb2VzIG5vdCBleGlzdDogIit0KX19LGV9KShMYnQuUXVhbnRpdGF0aXZlU2NhbGUpOyRidC5UaW1lPVFidCwoZnVuY3Rpb24odCl7Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZT1CTzt0LlRpY2tHZW5lcmF0b3JzPSR2dCxlLl9fZXhwb3J0U3RhcihRdnQsdCksZS5fX2V4cG9ydFN0YXIoX2J0LHQpLGUuX19leHBvcnRTdGFyKE1idCx0KSxlLl9fZXhwb3J0U3RhcihrYnQsdCksZS5fX2V4cG9ydFN0YXIoSGJ0LHQpLGUuX19leHBvcnRTdGFyKGpidCx0KSxlLl9fZXhwb3J0U3RhcigkYnQsdCk7dmFyIG49UXZ0LGk9TGJ0O3QuaXNUcmFuc2Zvcm1hYmxlPWZ1bmN0aW9uIHIodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBpLlF1YW50aXRhdGl2ZVNjYWxlfHx0IGluc3RhbmNlb2Ygbi5DYXRlZ29yeX19KShYdnQpLChmdW5jdGlvbih0KXsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBlPUJPLG49d3B0LGk9TGd0LHI9cHZ0LG89WHZ0LGE9RF90LHM9Ymd0LGw9ZHZ0O3QuVGltZUludGVydmFsPXMubWFrZUVudW0oWyJzZWNvbmQiLCJtaW51dGUiLCJob3VyIiwiZGF5Iiwid2VlayIsIm1vbnRoIiwieWVhciJdKSx0LlRpbWVBeGlzT3JpZW50YXRpb249cy5tYWtlRW51bShbInRvcCIsImJvdHRvbSJdKSx0LlRpZXJMYWJlbFBvc2l0aW9uPXMubWFrZUVudW0oWyJiZXR3ZWVuIiwiY2VudGVyIl0pO3ZhciBjLHU9KGZ1bmN0aW9uKHMpe2Z1bmN0aW9uIHUodCxlLG4pe3ZhciBpPXMuY2FsbCh0aGlzLHQsZSl8fHRoaXM7cmV0dXJuIGkuX21heFRpbWVJbnRlcnZhbFByZWNpc2lvbj1udWxsLGkuX3RpZXJMYWJlbFBvc2l0aW9ucz1bXSxpLl91c2VVVEM9bixpLmFkZENsYXNzKCJ0aW1lLWF4aXMiKSxpLnRpY2tMYWJlbFBhZGRpbmcoNSksaS5heGlzQ29uZmlndXJhdGlvbnModS5fREVGQVVMVF9USU1FX0FYSVNfQ09ORklHVVJBVElPTlMoaS5fdXNlVVRDKSksaS5hbm5vdGF0aW9uRm9ybWF0dGVyKHIudGltZSgiJWEgJWIgJWQsICVZIixpLl91c2VVVEMpKSxpfXJldHVybiBlLl9fZXh0ZW5kcyh1LHMpLHUucHJvdG90eXBlLnRpZXJMYWJlbFBvc2l0aW9ucz1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl90aWVyTGFiZWxQb3NpdGlvbnM7aWYoIXQuZXZlcnkoKGZ1bmN0aW9uKHQpe3JldHVybiJiZXR3ZWVuIj09PXQudG9Mb3dlckNhc2UoKXx8ImNlbnRlciI9PT10LnRvTG93ZXJDYXNlKCl9KSkpdGhyb3cgbmV3IEVycm9yKCJVbnN1cHBvcnRlZCBwb3NpdGlvbiBmb3IgdGllciBsYWJlbHMiKTtyZXR1cm4gdGhpcy5fdGllckxhYmVsUG9zaXRpb25zPXQsdGhpcy5yZWRyYXcoKSx0aGlzfSx1LnByb3RvdHlwZS5tYXhUaW1lSW50ZXJ2YWxQcmVjaXNpb249ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fbWF4VGltZUludGVydmFsUHJlY2lzaW9uOih0aGlzLl9tYXhUaW1lSW50ZXJ2YWxQcmVjaXNpb249dCx0aGlzLnJlZHJhdygpLHRoaXMpfSx1LnByb3RvdHlwZS5jdXJyZW50QXhpc0NvbmZpZ3VyYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zW3RoaXMuX21vc3RQcmVjaXNlQ29uZmlnSW5kZXhdfSx1LnByb3RvdHlwZS5heGlzQ29uZmlndXJhdGlvbnM9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zO3RoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9ucz10LHRoaXMuX251bVRpZXJzPWEuTWF0aC5tYXgodGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQubGVuZ3RofSkpLDApLHRoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX3NldHVwRG9tRWxlbWVudHMoKTtmb3IodmFyIGU9dGhpcy50aWVyTGFiZWxQb3NpdGlvbnMoKSxuPVtdLGk9MDtpPHRoaXMuX251bVRpZXJzO2krKyluLnB1c2goZVtpXXx8ImJldHdlZW4iKTtyZXR1cm4gdGhpcy50aWVyTGFiZWxQb3NpdGlvbnMobiksdGhpcy5yZWRyYXcoKSx0aGlzfSx1LnByb3RvdHlwZS5fZ2V0TW9zdFByZWNpc2VDb25maWd1cmF0aW9uSW5kZXg9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zLmxlbmd0aDtyZXR1cm4gdGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zLmZvckVhY2goKGZ1bmN0aW9uKG4saSl7aTxlJiZuLmV2ZXJ5KChmdW5jdGlvbihlKXtyZXR1cm4gdC5fY2hlY2tUaW1lQXhpc1RpZXJDb25maWd1cmF0aW9uKGUpfSkpJiYoZT1pKX0pKSxlPT09dGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zLmxlbmd0aCYmKGEuV2luZG93Lndhcm4oInpvb21lZCBvdXQgdG9vIGZhcjogY291bGQgbm90IGZpbmQgc3VpdGFibGUgaW50ZXJ2YWwgdG8gZGlzcGxheSBsYWJlbHMiKSwtLWUpLGV9LHUucHJvdG90eXBlLm9yaWVudGF0aW9uPWZ1bmN0aW9uKHQpe2lmKHQmJigicmlnaHQiPT09dC50b0xvd2VyQ2FzZSgpfHwibGVmdCI9PT10LnRvTG93ZXJDYXNlKCkpKXRocm93IG5ldyBFcnJvcih0KyIgaXMgbm90IGEgc3VwcG9ydGVkIG9yaWVudGF0aW9uIGZvciBUaW1lQXhpcyAtIG9ubHkgaG9yaXpvbnRhbCBvcmllbnRhdGlvbnMgYXJlIHN1cHBvcnRlZCIpO3JldHVybiBzLnByb3RvdHlwZS5vcmllbnRhdGlvbi5jYWxsKHRoaXMsdCl9LHUucHJvdG90eXBlLl9jb21wdXRlSGVpZ2h0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodDt0aGlzLl90aWVySGVpZ2h0cz1bXTtmb3IodmFyIGU9MDtlPHRoaXMuX251bVRpZXJzO2UrKyl0aGlzLl90aWVySGVpZ2h0cy5wdXNoKHQrdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkrKCJiZXR3ZWVuIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1tlXT8wOnRoaXMuX21heExhYmVsVGlja0xlbmd0aCgpKSk7cmV0dXJuIG4uc3VtKHRoaXMuX3RpZXJIZWlnaHRzKX0sdS5wcm90b3R5cGUuX2dldEludGVydmFsTGVuZ3RoPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3NjYWxlLmRvbWFpbigpWzBdLG49by5UaW1lLnRpbWVJbnRlcnZhbFRvRDNUaW1lKHQuaW50ZXJ2YWwsdGhpcy5fdXNlVVRDKS5vZmZzZXQoZSx0LnN0ZXApO3JldHVybiBuPnRoaXMuX3NjYWxlLmRvbWFpbigpWzFdP3RoaXMud2lkdGgoKTpNYXRoLmFicyh0aGlzLl9zY2FsZS5zY2FsZShuKS10aGlzLl9zY2FsZS5zY2FsZShlKSl9LHUucHJvdG90eXBlLl9tYXhXaWR0aEZvckludGVydmFsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9tZWFzdXJlci5tZWFzdXJlKHQuZm9ybWF0dGVyKHUuX0xPTkdfREFURSkpLndpZHRofSx1LnByb3RvdHlwZS5fY2hlY2tUaW1lQXhpc1RpZXJDb25maWd1cmF0aW9uPWZ1bmN0aW9uKHQpe2lmKG51bGwhPXRoaXMuX21heFRpbWVJbnRlcnZhbFByZWNpc2lvbil7dmFyIGU9dS5fU09SVEVEX1RJTUVfSU5URVJWQUxfSU5ERVhbdGhpcy5fbWF4VGltZUludGVydmFsUHJlY2lzaW9uXSxuPXUuX1NPUlRFRF9USU1FX0lOVEVSVkFMX0lOREVYW3QuaW50ZXJ2YWxdO2lmKG51bGwhPWUmJm51bGwhPW4mJm48ZSlyZXR1cm4hMX12YXIgaT10aGlzLl9tYXhXaWR0aEZvckludGVydmFsKHQpKzIqdGhpcy50aWNrTGFiZWxQYWRkaW5nKCk7cmV0dXJuIE1hdGgubWluKHRoaXMuX2dldEludGVydmFsTGVuZ3RoKHQpLHRoaXMud2lkdGgoKSk+PWl9LHUucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKHQsZSl7dmFyIG49cy5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXIuY2FsbCh0aGlzLHQsZSksaT10aGlzLl90aWVySGVpZ2h0cy5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSxpLHIpe3JldHVybiB0K2U+bi5oZWlnaHQ/dDp0K2V9KSkscj10aGlzLm1hcmdpbigpKyh0aGlzLmFubm90YXRpb25zRW5hYmxlZCgpP3RoaXMuYW5ub3RhdGlvblRpZXJDb3VudCgpKnRoaXMuX2Fubm90YXRpb25UaWVySGVpZ2h0KCk6MCk7cmV0dXJuIG4uaGVpZ2h0PU1hdGgubWluKG4uaGVpZ2h0LGkrciksbn0sdS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7cy5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyksdGhpcy5fc2V0dXBEb21FbGVtZW50cygpfSx1LnByb3RvdHlwZS5fc2V0dXBEb21FbGVtZW50cz1mdW5jdGlvbigpe3RoaXMuY29udGVudCgpLnNlbGVjdEFsbCgiLiIrdS5USU1FX0FYSVNfVElFUl9DTEFTUykucmVtb3ZlKCksdGhpcy5fdGllckxhYmVsQ29udGFpbmVycz1bXSx0aGlzLl90aWVyTWFya0NvbnRhaW5lcnM9W10sdGhpcy5fdGllckJhc2VsaW5lcz1bXSx0aGlzLl90aWNrTGFiZWxDb250YWluZXIucmVtb3ZlKCksdGhpcy5fYmFzZWxpbmUucmVtb3ZlKCk7Zm9yKHZhciB0PTA7dDx0aGlzLl9udW1UaWVyczsrK3Qpe3ZhciBlPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQodS5USU1FX0FYSVNfVElFUl9DTEFTUywhMCk7dGhpcy5fdGllckxhYmVsQ29udGFpbmVycy5wdXNoKGUuYXBwZW5kKCJnIikuY2xhc3NlZChsLkF4aXMuVElDS19MQUJFTF9DTEFTUysiLWNvbnRhaW5lciIsITApKSx0aGlzLl90aWVyTWFya0NvbnRhaW5lcnMucHVzaChlLmFwcGVuZCgiZyIpLmNsYXNzZWQobC5BeGlzLlRJQ0tfTUFSS19DTEFTUysiLWNvbnRhaW5lciIsITApKSx0aGlzLl90aWVyQmFzZWxpbmVzLnB1c2goZS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKCJiYXNlbGluZSIsITApKX12YXIgbj1uZXcgaS5TdmdDb250ZXh0KHRoaXMuX3RpZXJMYWJlbENvbnRhaW5lcnNbMF0ubm9kZSgpKTt0aGlzLl9tZWFzdXJlcj1uZXcgaS5DYWNoZU1lYXN1cmVyKG4pfSx1LnByb3RvdHlwZS5fZ2V0VGlja0ludGVydmFsVmFsdWVzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9zY2FsZS50aWNrSW50ZXJ2YWwodC5pbnRlcnZhbCx0LnN0ZXAsdGhpcy5fdXNlVVRDKX0sdS5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiB0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnNbdGhpcy5fbW9zdFByZWNpc2VDb25maWdJbmRleF0ucmVkdWNlKChmdW5jdGlvbihlLG4pe3JldHVybiBlLmNvbmNhdCh0Ll9nZXRUaWNrSW50ZXJ2YWxWYWx1ZXMobikpfSksW10pfSx1LnByb3RvdHlwZS5fY2xlYW5UaWVycz1mdW5jdGlvbigpe2Zvcih2YXIgdD0wO3Q8dGhpcy5fdGllckxhYmVsQ29udGFpbmVycy5sZW5ndGg7dCsrKXRoaXMuX3RpZXJMYWJlbENvbnRhaW5lcnNbdF0uc2VsZWN0QWxsKCIuIitsLkF4aXMuVElDS19MQUJFTF9DTEFTUykucmVtb3ZlKCksdGhpcy5fdGllck1hcmtDb250YWluZXJzW3RdLnNlbGVjdEFsbCgiLiIrbC5BeGlzLlRJQ0tfTUFSS19DTEFTUykucmVtb3ZlKCksdGhpcy5fdGllckJhc2VsaW5lc1t0XS5zdHlsZSgidmlzaWJpbGl0eSIsImhpZGRlbiIpfSx1LnByb3RvdHlwZS5fZ2V0VGlja1ZhbHVlc0ZvckNvbmZpZ3VyYXRpb249ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fc2NhbGUudGlja0ludGVydmFsKHQuaW50ZXJ2YWwsdC5zdGVwLHRoaXMuX3VzZVVUQyksbj10aGlzLl9zY2FsZS5kb21haW4oKSxpPWUubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC52YWx1ZU9mKCl9KSk7cmV0dXJuLTE9PT1pLmluZGV4T2YoblswXS52YWx1ZU9mKCkpJiZlLnVuc2hpZnQoblswXSksLTE9PT1pLmluZGV4T2YoblsxXS52YWx1ZU9mKCkpJiZlLnB1c2goblsxXSksZX0sdS5wcm90b3R5cGUuX3JlbmRlclRpZXJMYWJlbHM9ZnVuY3Rpb24odCxlLGkpe3ZhciByPXRoaXMsbz10aGlzLl9nZXRUaWNrVmFsdWVzRm9yQ29uZmlndXJhdGlvbihlKSxhPVtdOyJiZXR3ZWVuIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1tpXSYmMT09PWUuc3RlcD9vLm1hcCgoZnVuY3Rpb24odCxlKXtlKzE+PW8ubGVuZ3RofHxhLnB1c2gobmV3IERhdGUoKG9bZSsxXS52YWx1ZU9mKCktb1tlXS52YWx1ZU9mKCkpLzIrb1tlXS52YWx1ZU9mKCkpKX0pKTphPW87dmFyIHM9dC5zZWxlY3RBbGwoIi4iK2wuQXhpcy5USUNLX0xBQkVMX0NMQVNTKS5kYXRhKGEsKGZ1bmN0aW9uKHQpe3JldHVybiBTdHJpbmcodC52YWx1ZU9mKCkpfSkpLGM9cy5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQobC5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MsITApO2MuYXBwZW5kKCJ0ZXh0Iik7dmFyIHUsaD0iY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1tpXXx8MT09PWUuc3RlcD8wOnRoaXMudGlja0xhYmVsUGFkZGluZygpO3U9ImJvdHRvbSI9PT10aGlzLm9yaWVudGF0aW9uKCk/bi5zdW0odGhpcy5fdGllckhlaWdodHMuc2xpY2UoMCxpKzEpKS10aGlzLnRpY2tMYWJlbFBhZGRpbmcoKToiY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1tpXT90aGlzLmhlaWdodCgpLW4uc3VtKHRoaXMuX3RpZXJIZWlnaHRzLnNsaWNlKDAsaSkpLXRoaXMudGlja0xhYmVsUGFkZGluZygpLXRoaXMuX21heExhYmVsVGlja0xlbmd0aCgpOnRoaXMuaGVpZ2h0KCktbi5zdW0odGhpcy5fdGllckhlaWdodHMuc2xpY2UoMCxpKSktdGhpcy50aWNrTGFiZWxQYWRkaW5nKCk7dmFyIGQ9cy5tZXJnZShjKSxwPWQuc2VsZWN0QWxsKCJ0ZXh0Iik7cC5zaXplKCk+MCYmcC5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitoKyIsIit1KyIpIikscy5leGl0KCkucmVtb3ZlKCksZC5hdHRyKCJ0cmFuc2Zvcm0iLChmdW5jdGlvbih0KXtyZXR1cm4idHJhbnNsYXRlKCIrci5fc2NhbGUuc2NhbGUodCkrIiwwKSJ9KSk7dmFyIGY9ImNlbnRlciI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbaV18fDE9PT1lLnN0ZXA/Im1pZGRsZSI6InN0YXJ0IjtkLnNlbGVjdEFsbCgidGV4dCIpLnRleHQoZS5mb3JtYXR0ZXIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsZil9LHUucHJvdG90eXBlLl9yZW5kZXJUaWNrTWFya3M9ZnVuY3Rpb24odCxlKXt2YXIgaT10aGlzLl90aWVyTWFya0NvbnRhaW5lcnNbZV0uc2VsZWN0QWxsKCIuIitsLkF4aXMuVElDS19NQVJLX0NMQVNTKS5kYXRhKHQpLHI9aS5lbnRlcigpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQobC5BeGlzLlRJQ0tfTUFSS19DTEFTUywhMCkubWVyZ2UoaSksbz10aGlzLl9nZW5lcmF0ZVRpY2tNYXJrQXR0ckhhc2goKSxhPXRoaXMuX3RpZXJIZWlnaHRzLnNsaWNlKDAsZSkucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiB0K2V9KSwwKTsiYm90dG9tIj09PXRoaXMub3JpZW50YXRpb24oKT8oby55MT1hLG8ueTI9YSsoImNlbnRlciI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbZV0/dGhpcy5pbm5lclRpY2tMZW5ndGgoKTp0aGlzLl90aWVySGVpZ2h0c1tlXSkpOihvLnkxPXRoaXMuaGVpZ2h0KCktYSxvLnkyPXRoaXMuaGVpZ2h0KCktKGErKCJjZW50ZXIiPT09dGhpcy5fdGllckxhYmVsUG9zaXRpb25zW2VdP3RoaXMuaW5uZXJUaWNrTGVuZ3RoKCk6dGhpcy5fdGllckhlaWdodHNbZV0pKSksci5hdHRycyhvKSwiYm90dG9tIj09PXRoaXMub3JpZW50YXRpb24oKT8oby55MT1hLG8ueTI9YSsoImNlbnRlciI9PT10aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbZV0/dGhpcy5lbmRUaWNrTGVuZ3RoKCk6dGhpcy5fdGllckhlaWdodHNbZV0pKTooby55MT10aGlzLmhlaWdodCgpLWEsby55Mj10aGlzLmhlaWdodCgpLShhKygiY2VudGVyIj09PXRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1tlXT90aGlzLmVuZFRpY2tMZW5ndGgoKTp0aGlzLl90aWVySGVpZ2h0c1tlXSkpKSxuLnNlbGVjdChyLm5vZGVzKClbMF0pLmF0dHJzKG8pLG4uc2VsZWN0KHIubm9kZXMoKVtyLnNpemUoKS0xXSkuYXR0cnMobyksbi5zZWxlY3Qoci5ub2RlcygpWzBdKS5jbGFzc2VkKGwuQXhpcy5FTkRfVElDS19NQVJLX0NMQVNTLCEwKSxuLnNlbGVjdChyLm5vZGVzKClbci5zaXplKCktMV0pLmNsYXNzZWQobC5BeGlzLkVORF9USUNLX01BUktfQ0xBU1MsITApLGkuZXhpdCgpLnJlbW92ZSgpfSx1LnByb3RvdHlwZS5fcmVuZGVyTGFiZWxsZXNzVGlja01hcmtzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3RpY2tNYXJrQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIrbC5BeGlzLlRJQ0tfTUFSS19DTEFTUykuZGF0YSh0KSxuPWUuZW50ZXIoKS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKGwuQXhpcy5USUNLX01BUktfQ0xBU1MsITApLm1lcmdlKGUpLGk9dGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKCk7aS55Mj0iYm90dG9tIj09PXRoaXMub3JpZW50YXRpb24oKT90aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTp0aGlzLmhlaWdodCgpLXRoaXMudGlja0xhYmVsUGFkZGluZygpLG4uYXR0cnMoaSksZS5leGl0KCkucmVtb3ZlKCl9LHUucHJvdG90eXBlLl9nZW5lcmF0ZUxhYmVsbGVzc1RpY2tzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX21vc3RQcmVjaXNlQ29uZmlnSW5kZXg8MT9bXTp0aGlzLl9nZXRUaWNrSW50ZXJ2YWxWYWx1ZXModGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zW3RoaXMuX21vc3RQcmVjaXNlQ29uZmlnSW5kZXgtMV1bMF0pfSx1LnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fbW9zdFByZWNpc2VDb25maWdJbmRleD10aGlzLl9nZXRNb3N0UHJlY2lzZUNvbmZpZ3VyYXRpb25JbmRleCgpO3ZhciBlPXRoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9uc1t0aGlzLl9tb3N0UHJlY2lzZUNvbmZpZ0luZGV4XTt0aGlzLl9jbGVhblRpZXJzKCksZS5mb3JFYWNoKChmdW5jdGlvbihlLG4pe3JldHVybiB0Ll9yZW5kZXJUaWVyTGFiZWxzKHQuX3RpZXJMYWJlbENvbnRhaW5lcnNbbl0sZSxuKX0pKTtmb3IodmFyIG49ZS5tYXAoKGZ1bmN0aW9uKGUsbil7cmV0dXJuIHQuX2dldFRpY2tWYWx1ZXNGb3JDb25maWd1cmF0aW9uKGUpfSkpLGk9MCxyPTA7cjxNYXRoLm1heChlLmxlbmd0aCwxKTsrK3Ipe3ZhciBvPXRoaXMuX2dlbmVyYXRlQmFzZWxpbmVBdHRySGFzaCgpO28ueTErPSJib3R0b20iPT09dGhpcy5vcmllbnRhdGlvbigpP2k6LWksby55Mj1vLnkxLHRoaXMuX3RpZXJCYXNlbGluZXNbcl0uYXR0cnMobykuc3R5bGUoInZpc2liaWxpdHkiLCJpbmhlcml0IiksaSs9dGhpcy5fdGllckhlaWdodHNbcl19dmFyIGE9W10scz10aGlzLl9zY2FsZS5kb21haW4oKSxsPXRoaXMuX3NjYWxlLnNjYWxlKHNbMV0pLXRoaXMuX3NjYWxlLnNjYWxlKHNbMF0pOzEuNSp0aGlzLl9nZXRJbnRlcnZhbExlbmd0aChlWzBdKT49bCYmKGE9dGhpcy5fZ2VuZXJhdGVMYWJlbGxlc3NUaWNrcygpKSx0aGlzLl9yZW5kZXJMYWJlbGxlc3NUaWNrTWFya3MoYSksdGhpcy5faGlkZU92ZXJmbG93aW5nVGllcnMoKTtmb3Iocj0wO3I8ZS5sZW5ndGg7KytyKXRoaXMuX3JlbmRlclRpY2tNYXJrcyhuW3JdLHIpLHRoaXMuX2hpZGVPdmVybGFwcGluZ0FuZEN1dE9mZkxhYmVscyhyKTtyZXR1cm4gdGhpcy5hbm5vdGF0aW9uc0VuYWJsZWQoKT90aGlzLl9kcmF3QW5ub3RhdGlvbnMoKTp0aGlzLl9yZW1vdmVBbm5vdGF0aW9ucygpLHRoaXN9LHUucHJvdG90eXBlLl9oaWRlT3ZlcmZsb3dpbmdUaWVycz1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLmhlaWdodCgpLG49MDt0aGlzLmNvbnRlbnQoKS5zZWxlY3RBbGwoIi4iK3UuVElNRV9BWElTX1RJRVJfQ0xBU1MpLmF0dHIoInZpc2liaWxpdHkiLChmdW5jdGlvbihpLHIpe3JldHVybihuKz10Ll90aWVySGVpZ2h0c1tyXSk8PWU/ImluaGVyaXQiOiJoaWRkZW4ifSkpfSx1LnByb3RvdHlwZS5faGlkZU92ZXJsYXBwaW5nQW5kQ3V0T2ZmTGFiZWxzPWZ1bmN0aW9uKHQpe3ZhciBlLGk9dGhpcyxyPXRoaXMuZWxlbWVudCgpLm5vZGUoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxvPXRoaXMuX3RpZXJNYXJrQ29udGFpbmVyc1t0XS5zZWxlY3RBbGwoIi4iK2wuQXhpcy5USUNLX01BUktfQ0xBU1MpLmZpbHRlcigoZnVuY3Rpb24odCxlKXt2YXIgaT1uLnNlbGVjdCh0aGlzKS5zdHlsZSgidmlzaWJpbGl0eSIpO3JldHVybiJ2aXNpYmxlIj09PWl8fCJpbmhlcml0Ij09PWl9KSkubm9kZXMoKS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpfSkpO3RoaXMuX3RpZXJMYWJlbENvbnRhaW5lcnNbdF0uc2VsZWN0QWxsKCIuIitsLkF4aXMuVElDS19MQUJFTF9DTEFTUykuZmlsdGVyKChmdW5jdGlvbih0LGUpe3ZhciBpPW4uc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5Iik7cmV0dXJuInZpc2libGUiPT09aXx8ImluaGVyaXQiPT09aX0pKS5lYWNoKChmdW5jdGlvbih0LHMpe3ZhciBsLGM9dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSx1PW4uc2VsZWN0KHRoaXMpLGg9b1tzXSxkPW9bcysxXSxwPW51bGwhPWUmJmEuRE9NLmNsaWVudFJlY3RzT3ZlcmxhcChjLGUpLGY9bnVsbCE9aCYmYS5ET00uY2xpZW50UmVjdHNPdmVybGFwKGMsaCksbT1udWxsIT1kJiZhLkRPTS5jbGllbnRSZWN0c092ZXJsYXAoYyxkKTtsPWMsIShNYXRoLmZsb29yKHIubGVmdCk8PU1hdGguY2VpbChsLmxlZnQpJiZNYXRoLmZsb29yKHIudG9wKTw9TWF0aC5jZWlsKGwudG9wKSYmTWF0aC5mbG9vcihsLnJpZ2h0KTw9TWF0aC5jZWlsKHIubGVmdCtpLndpZHRoKCkpJiZNYXRoLmZsb29yKGwuYm90dG9tKTw9TWF0aC5jZWlsKHIudG9wK2kuaGVpZ2h0KCkpKXx8cHx8Znx8bT91LnN0eWxlKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIik6KGU9Yyx1LnN0eWxlKCJ2aXNpYmlsaXR5IiwiaW5oZXJpdCIpKX0pKX0sdS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlPWZ1bmN0aW9uKCl7cy5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlLmNhbGwodGhpcyksdGhpcy5fbWVhc3VyZXIucmVzZXQoKX0sdS5USU1FX0FYSVNfVElFUl9DTEFTUz0idGltZS1heGlzLXRpZXIiLHUuX1NPUlRFRF9USU1FX0lOVEVSVkFMX0lOREVYPSgoYz17fSlbdC5UaW1lSW50ZXJ2YWwuc2Vjb25kXT0wLGNbdC5UaW1lSW50ZXJ2YWwubWludXRlXT0xLGNbdC5UaW1lSW50ZXJ2YWwuaG91cl09MixjW3QuVGltZUludGVydmFsLmRheV09MyxjW3QuVGltZUludGVydmFsLndlZWtdPTQsY1t0LlRpbWVJbnRlcnZhbC5tb250aF09NSxjW3QuVGltZUludGVydmFsLnllYXJdPTYsYyksdS5fREVGQVVMVF9USU1FX0FYSVNfQ09ORklHVVJBVElPTlM9ZnVuY3Rpb24oZSl7dmFyIG49ZnVuY3Rpb24odCl7cmV0dXJuIHIudGltZSh0LGUpfTtyZXR1cm5bW3tpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5zZWNvbmQsc3RlcDoxLGZvcm1hdHRlcjpuKCIlSTolTTolUyAlcCIpfSx7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6bigiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOnQuVGltZUludGVydmFsLnNlY29uZCxzdGVwOjUsZm9ybWF0dGVyOm4oIiVJOiVNOiVTICVwIil9LHtpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwuc2Vjb25kLHN0ZXA6MTAsZm9ybWF0dGVyOm4oIiVJOiVNOiVTICVwIil9LHtpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwuc2Vjb25kLHN0ZXA6MTUsZm9ybWF0dGVyOm4oIiVJOiVNOiVTICVwIil9LHtpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwuc2Vjb25kLHN0ZXA6MzAsZm9ybWF0dGVyOm4oIiVJOiVNOiVTICVwIil9LHtpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuKCIlQiAlZSwgJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwubWludXRlLHN0ZXA6MSxmb3JtYXR0ZXI6bigiJUk6JU0gJXAiKX0se2ludGVydmFsOnQuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOm4oIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5taW51dGUsc3RlcDo1LGZvcm1hdHRlcjpuKCIlSTolTSAlcCIpfSx7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6bigiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOnQuVGltZUludGVydmFsLm1pbnV0ZSxzdGVwOjEwLGZvcm1hdHRlcjpuKCIlSTolTSAlcCIpfSx7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6bigiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOnQuVGltZUludGVydmFsLm1pbnV0ZSxzdGVwOjE1LGZvcm1hdHRlcjpuKCIlSTolTSAlcCIpfSx7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6bigiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOnQuVGltZUludGVydmFsLm1pbnV0ZSxzdGVwOjMwLGZvcm1hdHRlcjpuKCIlSTolTSAlcCIpfSx7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6bigiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOnQuVGltZUludGVydmFsLmhvdXIsc3RlcDoxLGZvcm1hdHRlcjpuKCIlSSAlcCIpfSx7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6bigiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOnQuVGltZUludGVydmFsLmhvdXIsc3RlcDozLGZvcm1hdHRlcjpuKCIlSSAlcCIpfSx7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6bigiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOnQuVGltZUludGVydmFsLmhvdXIsc3RlcDo2LGZvcm1hdHRlcjpuKCIlSSAlcCIpfSx7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwuZGF5LHN0ZXA6MSxmb3JtYXR0ZXI6bigiJUIgJWUsICVZIil9XSxbe2ludGVydmFsOnQuVGltZUludGVydmFsLmhvdXIsc3RlcDoxMixmb3JtYXR0ZXI6bigiJUkgJXAiKX0se2ludGVydmFsOnQuVGltZUludGVydmFsLmRheSxzdGVwOjEsZm9ybWF0dGVyOm4oIiVCICVlLCAlWSIpfV0sW3tpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuKCIlYSAlZSIpfSx7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwubW9udGgsc3RlcDoxLGZvcm1hdHRlcjpuKCIlQiAlWSIpfV0sW3tpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5kYXksc3RlcDoxLGZvcm1hdHRlcjpuKCIlZSIpfSx7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwubW9udGgsc3RlcDoxLGZvcm1hdHRlcjpuKCIlQiAlWSIpfV0sW3tpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5tb250aCxzdGVwOjEsZm9ybWF0dGVyOm4oIiVCIil9LHtpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MSxmb3JtYXR0ZXI6bigiJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwubW9udGgsc3RlcDoxLGZvcm1hdHRlcjpuKCIlYiIpfSx7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEsZm9ybWF0dGVyOm4oIiVZIil9XSxbe2ludGVydmFsOnQuVGltZUludGVydmFsLm1vbnRoLHN0ZXA6Myxmb3JtYXR0ZXI6bigiJWIiKX0se2ludGVydmFsOnQuVGltZUludGVydmFsLnllYXIsc3RlcDoxLGZvcm1hdHRlcjpuKCIlWSIpfV0sW3tpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC5tb250aCxzdGVwOjYsZm9ybWF0dGVyOm4oIiViIil9LHtpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6MSxmb3JtYXR0ZXI6bigiJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjEsZm9ybWF0dGVyOm4oIiVZIil9XSxbe2ludGVydmFsOnQuVGltZUludGVydmFsLnllYXIsc3RlcDoxLGZvcm1hdHRlcjpuKCIleSIpfV0sW3tpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6NSxmb3JtYXR0ZXI6bigiJVkiKX1dLFt7aW50ZXJ2YWw6dC5UaW1lSW50ZXJ2YWwueWVhcixzdGVwOjI1LGZvcm1hdHRlcjpuKCIlWSIpfV0sW3tpbnRlcnZhbDp0LlRpbWVJbnRlcnZhbC55ZWFyLHN0ZXA6NTAsZm9ybWF0dGVyOm4oIiVZIil9XSxbe2ludGVydmFsOnQuVGltZUludGVydmFsLnllYXIsc3RlcDoxMDAsZm9ybWF0dGVyOm4oIiVZIil9XSxbe2ludGVydmFsOnQuVGltZUludGVydmFsLnllYXIsc3RlcDoyMDAsZm9ybWF0dGVyOm4oIiVZIil9XSxbe2ludGVydmFsOnQuVGltZUludGVydmFsLnllYXIsc3RlcDo1MDAsZm9ybWF0dGVyOm4oIiVZIil9XSxbe2ludGVydmFsOnQuVGltZUludGVydmFsLnllYXIsc3RlcDoxZTMsZm9ybWF0dGVyOm4oIiVZIil9XV19LHUuX0xPTkdfREFURT1uZXcgRGF0ZSg5OTk5LDgsMjksMTIsNTksOTk5OSksdX0pKGwuQXhpcyk7dC5UaW1lPXV9KShZdnQpLChmdW5jdGlvbih0KXsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBlPUJPO2UuX19leHBvcnRTdGFyKGtndCx0KSxlLl9fZXhwb3J0U3RhcihIdnQsdCksZS5fX2V4cG9ydFN0YXIoWXZ0LHQpfSkoQWd0KTt2YXIgdHh0PXt9LGV4dD17fSxueHQ9e30saXh0PXt9LHJ4dD17fSxveHQ9e30sYXh0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkoYXh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgc3h0PURfdCxseHQ9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb249e30sdGhpcy5fZXZlbnRUYXJnZXQ9ZG9jdW1lbnQsdGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldD17fSx0aGlzLl9jb25uZWN0ZWQ9ITF9cmV0dXJuIHQucHJvdG90eXBlLl9oYXNOb0NhbGxiYWNrcz1mdW5jdGlvbigpe2Zvcih2YXIgdD1PYmplY3Qua2V5cyh0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0KSxlPTA7ZTx0Lmxlbmd0aDtlKyspaWYoMCE9PXRoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXRbdFtlXV0uc2l6ZSlyZXR1cm4hMTtyZXR1cm4hMH0sdC5wcm90b3R5cGUuX2Nvbm5lY3Q9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3RoaXMuX2Nvbm5lY3RlZHx8KE9iamVjdC5rZXlzKHRoaXMuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb24pLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QuX2V2ZW50VGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZSx0Ll9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW2VdLCJ3aGVlbCI9PT1lP3twYXNzaXZlOiExfTp2b2lkIDApfSkpLHRoaXMuX2Nvbm5lY3RlZD0hMCl9LHQucHJvdG90eXBlLl9kaXNjb25uZWN0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLl9jb25uZWN0ZWQmJnRoaXMuX2hhc05vQ2FsbGJhY2tzKCkmJihPYmplY3Qua2V5cyh0aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uKS5mb3JFYWNoKChmdW5jdGlvbihlKXt0Ll9ldmVudFRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKGUsdC5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltlXSl9KSksdGhpcy5fY29ubmVjdGVkPSExKX0sdC5wcm90b3R5cGUuX2FkZENhbGxiYWNrRm9yRXZlbnQ9ZnVuY3Rpb24odCxlKXtudWxsPT10aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0W3RdJiYodGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFt0XT1uZXcgc3h0LkNhbGxiYWNrU2V0KSx0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0W3RdLmFkZChlKSx0aGlzLl9jb25uZWN0KCl9LHQucHJvdG90eXBlLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50PWZ1bmN0aW9uKHQsZSl7bnVsbCE9dGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFt0XSYmdGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFt0XS5kZWxldGUoZSksdGhpcy5fZGlzY29ubmVjdCgpfSx0LnByb3RvdHlwZS5fY2FsbENhbGxiYWNrc0ZvckV2ZW50PWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTE7bjxhcmd1bWVudHMubGVuZ3RoO24rKyllW24tMV09YXJndW1lbnRzW25dO3ZhciBpPXRoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXRbdF07bnVsbCE9aSYmaS5jYWxsQ2FsbGJhY2tzLmFwcGx5KGksZSl9LHR9KSgpO2F4dC5EaXNwYXRjaGVyPWx4dCwKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KG94dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGN4dD1CTyx1eHQ9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgbj10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIG4uX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bZS5fS0VZRE9XTl9FVkVOVF9OQU1FXT1mdW5jdGlvbih0KXtyZXR1cm4gbi5fcHJvY2Vzc0tleWRvd24odCl9LG4uX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bZS5fS0VZVVBfRVZFTlRfTkFNRV09ZnVuY3Rpb24odCl7cmV0dXJuIG4uX3Byb2Nlc3NLZXl1cCh0KX0sbn1yZXR1cm4gY3h0Ll9fZXh0ZW5kcyhlLHQpLGUuZ2V0RGlzcGF0Y2hlcj1mdW5jdGlvbigpe3ZhciB0PWRvY3VtZW50W2UuX0RJU1BBVENIRVJfS0VZXTtyZXR1cm4gbnVsbD09dCYmKHQ9bmV3IGUsZG9jdW1lbnRbZS5fRElTUEFUQ0hFUl9LRVldPXQpLHR9LGUucHJvdG90eXBlLl9wcm9jZXNzS2V5ZG93bj1mdW5jdGlvbih0KXt0aGlzLl9jYWxsQ2FsbGJhY2tzRm9yRXZlbnQoZS5fS0VZRE9XTl9FVkVOVF9OQU1FLHQua2V5Q29kZSx0KX0sZS5wcm90b3R5cGUuX3Byb2Nlc3NLZXl1cD1mdW5jdGlvbih0KXt0aGlzLl9jYWxsQ2FsbGJhY2tzRm9yRXZlbnQoZS5fS0VZVVBfRVZFTlRfTkFNRSx0LmtleUNvZGUsdCl9LGUucHJvdG90eXBlLm9uS2V5RG93bj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChlLl9LRVlET1dOX0VWRU5UX05BTUUsdCksdGhpc30sZS5wcm90b3R5cGUub2ZmS2V5RG93bj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChlLl9LRVlET1dOX0VWRU5UX05BTUUsdCksdGhpc30sZS5wcm90b3R5cGUub25LZXlVcD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChlLl9LRVlVUF9FVkVOVF9OQU1FLHQpLHRoaXN9LGUucHJvdG90eXBlLm9mZktleVVwPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KGUuX0tFWVVQX0VWRU5UX05BTUUsdCksdGhpc30sZS5fRElTUEFUQ0hFUl9LRVk9Il9fUGxvdHRhYmxlX0Rpc3BhdGNoZXJfS2V5IixlLl9LRVlET1dOX0VWRU5UX05BTUU9ImtleWRvd24iLGUuX0tFWVVQX0VWRU5UX05BTUU9ImtleXVwIixlfSkoYXh0LkRpc3BhdGNoZXIpO294dC5LZXk9dXh0O3ZhciBoeHQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KGh4dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGR4dD1CTyxweHQ9RF90LGZ4dD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShuKXt2YXIgaT10LmNhbGwodGhpcyl8fHRoaXM7aS5fbGFzdE1vdXNlUG9zaXRpb249e3g6LTEseTotMX0saS5fdHJhbnNsYXRvcj1weHQuZ2V0VHJhbnNsYXRvcihuKTt2YXIgcj1mdW5jdGlvbih0KXtyZXR1cm4gaS5fbWVhc3VyZUFuZERpc3BhdGNoKG4sdCxlLl9NT1VTRU1PVkVfRVZFTlRfTkFNRSwicGFnZSIpfTtyZXR1cm4gaS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltlLl9NT1VTRU9WRVJfRVZFTlRfTkFNRV09cixpLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW2UuX01PVVNFTU9WRV9FVkVOVF9OQU1FXT1yLGkuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bZS5fTU9VU0VPVVRfRVZFTlRfTkFNRV09cixpLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW2UuX01PVVNFRE9XTl9FVkVOVF9OQU1FXT1mdW5jdGlvbih0KXtyZXR1cm4gaS5fbWVhc3VyZUFuZERpc3BhdGNoKG4sdCxlLl9NT1VTRURPV05fRVZFTlRfTkFNRSl9LGkuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bZS5fTU9VU0VVUF9FVkVOVF9OQU1FXT1mdW5jdGlvbih0KXtyZXR1cm4gaS5fbWVhc3VyZUFuZERpc3BhdGNoKG4sdCxlLl9NT1VTRVVQX0VWRU5UX05BTUUsInBhZ2UiKX0saS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltlLl9XSEVFTF9FVkVOVF9OQU1FXT1mdW5jdGlvbih0KXtyZXR1cm4gaS5fbWVhc3VyZUFuZERpc3BhdGNoKG4sdCxlLl9XSEVFTF9FVkVOVF9OQU1FKX0saS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltlLl9EQkxDTElDS19FVkVOVF9OQU1FXT1mdW5jdGlvbih0KXtyZXR1cm4gaS5fbWVhc3VyZUFuZERpc3BhdGNoKG4sdCxlLl9EQkxDTElDS19FVkVOVF9OQU1FKX0saX1yZXR1cm4gZHh0Ll9fZXh0ZW5kcyhlLHQpLGUuZ2V0RGlzcGF0Y2hlcj1mdW5jdGlvbih0KXt2YXIgbj10LnJvb3QoKS5yb290RWxlbWVudCgpLGk9bltlLl9ESVNQQVRDSEVSX0tFWV07cmV0dXJuIG51bGw9PWkmJihpPW5ldyBlKHQpLG5bZS5fRElTUEFUQ0hFUl9LRVldPWkpLGl9LGUucHJvdG90eXBlLm9uTW91c2VNb3ZlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KGUuX01PVVNFTU9WRV9FVkVOVF9OQU1FLHQpLHRoaXN9LGUucHJvdG90eXBlLm9mZk1vdXNlTW92ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChlLl9NT1VTRU1PVkVfRVZFTlRfTkFNRSx0KSx0aGlzfSxlLnByb3RvdHlwZS5vbk1vdXNlRG93bj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChlLl9NT1VTRURPV05fRVZFTlRfTkFNRSx0KSx0aGlzfSxlLnByb3RvdHlwZS5vZmZNb3VzZURvd249ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQoZS5fTU9VU0VET1dOX0VWRU5UX05BTUUsdCksdGhpc30sZS5wcm90b3R5cGUub25Nb3VzZVVwPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KGUuX01PVVNFVVBfRVZFTlRfTkFNRSx0KSx0aGlzfSxlLnByb3RvdHlwZS5vZmZNb3VzZVVwPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KGUuX01PVVNFVVBfRVZFTlRfTkFNRSx0KSx0aGlzfSxlLnByb3RvdHlwZS5vbldoZWVsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KGUuX1dIRUVMX0VWRU5UX05BTUUsdCksdGhpc30sZS5wcm90b3R5cGUub2ZmV2hlZWw9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQoZS5fV0hFRUxfRVZFTlRfTkFNRSx0KSx0aGlzfSxlLnByb3RvdHlwZS5vbkRibENsaWNrPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KGUuX0RCTENMSUNLX0VWRU5UX05BTUUsdCksdGhpc30sZS5wcm90b3R5cGUub2ZmRGJsQ2xpY2s9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQoZS5fREJMQ0xJQ0tfRVZFTlRfTkFNRSx0KSx0aGlzfSxlLnByb3RvdHlwZS5fbWVhc3VyZUFuZERpc3BhdGNoPWZ1bmN0aW9uKHQsZSxuLGkpe2lmKHZvaWQgMD09PWkmJihpPSJlbGVtZW50IiksInBhZ2UiIT09aSYmImVsZW1lbnQiIT09aSl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc2NvcGUgJyIraSsiJywgbXVzdCBiZSAnZWxlbWVudCcgb3IgJ3BhZ2UnIik7aWYoInBhZ2UiPT09aXx8dGhpcy5ldmVudEluc2lkZSh0LGUpKXt2YXIgcj10aGlzLl90cmFuc2xhdG9yLmNvbXB1dGVQb3NpdGlvbihlLmNsaWVudFgsZS5jbGllbnRZKTt0aGlzLl9sYXN0TW91c2VQb3NpdGlvbj1yLHRoaXMuX2NhbGxDYWxsYmFja3NGb3JFdmVudChuLHRoaXMubGFzdE1vdXNlUG9zaXRpb24oKSxlKX19LGUucHJvdG90eXBlLmV2ZW50SW5zaWRlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHB4dC5UcmFuc2xhdG9yLmlzRXZlbnRJbnNpZGUodCxlKX0sZS5wcm90b3R5cGUubGFzdE1vdXNlUG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fbGFzdE1vdXNlUG9zaXRpb259LGUuX0RJU1BBVENIRVJfS0VZPSJfX1Bsb3R0YWJsZV9EaXNwYXRjaGVyX01vdXNlIixlLl9NT1VTRU9WRVJfRVZFTlRfTkFNRT0ibW91c2VvdmVyIixlLl9NT1VTRU1PVkVfRVZFTlRfTkFNRT0ibW91c2Vtb3ZlIixlLl9NT1VTRU9VVF9FVkVOVF9OQU1FPSJtb3VzZW91dCIsZS5fTU9VU0VET1dOX0VWRU5UX05BTUU9Im1vdXNlZG93biIsZS5fTU9VU0VVUF9FVkVOVF9OQU1FPSJtb3VzZXVwIixlLl9XSEVFTF9FVkVOVF9OQU1FPSJ3aGVlbCIsZS5fREJMQ0xJQ0tfRVZFTlRfTkFNRT0iZGJsY2xpY2siLGV9KShheHQuRGlzcGF0Y2hlcik7aHh0Lk1vdXNlPWZ4dDt2YXIgbXh0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShteHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBneHQ9Qk8sX3h0PURfdCx5eHQ9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUobil7dmFyIGk9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBpLl90cmFuc2xhdG9yPV94dC5nZXRUcmFuc2xhdG9yKG4pLGkuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bZS5fVE9VQ0hTVEFSVF9FVkVOVF9OQU1FXT1mdW5jdGlvbih0KXtyZXR1cm4gaS5fbWVhc3VyZUFuZERpc3BhdGNoKG4sdCxlLl9UT1VDSFNUQVJUX0VWRU5UX05BTUUsInBhZ2UiKX0saS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltlLl9UT1VDSE1PVkVfRVZFTlRfTkFNRV09ZnVuY3Rpb24odCl7cmV0dXJuIGkuX21lYXN1cmVBbmREaXNwYXRjaChuLHQsZS5fVE9VQ0hNT1ZFX0VWRU5UX05BTUUsInBhZ2UiKX0saS5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltlLl9UT1VDSEVORF9FVkVOVF9OQU1FXT1mdW5jdGlvbih0KXtyZXR1cm4gaS5fbWVhc3VyZUFuZERpc3BhdGNoKG4sdCxlLl9UT1VDSEVORF9FVkVOVF9OQU1FLCJwYWdlIil9LGkuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bZS5fVE9VQ0hDQU5DRUxfRVZFTlRfTkFNRV09ZnVuY3Rpb24odCl7cmV0dXJuIGkuX21lYXN1cmVBbmREaXNwYXRjaChuLHQsZS5fVE9VQ0hDQU5DRUxfRVZFTlRfTkFNRSwicGFnZSIpfSxpfXJldHVybiBneHQuX19leHRlbmRzKGUsdCksZS5nZXREaXNwYXRjaGVyPWZ1bmN0aW9uKHQpe3ZhciBuPXQucm9vdCgpLnJvb3RFbGVtZW50KCksaT1uW2UuX0RJU1BBVENIRVJfS0VZXTtyZXR1cm4gbnVsbD09aSYmKGk9bmV3IGUodCksbltlLl9ESVNQQVRDSEVSX0tFWV09aSksaX0sZS5wcm90b3R5cGUub25Ub3VjaFN0YXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KGUuX1RPVUNIU1RBUlRfRVZFTlRfTkFNRSx0KSx0aGlzfSxlLnByb3RvdHlwZS5vZmZUb3VjaFN0YXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KGUuX1RPVUNIU1RBUlRfRVZFTlRfTkFNRSx0KSx0aGlzfSxlLnByb3RvdHlwZS5vblRvdWNoTW92ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChlLl9UT1VDSE1PVkVfRVZFTlRfTkFNRSx0KSx0aGlzfSxlLnByb3RvdHlwZS5vZmZUb3VjaE1vdmU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQoZS5fVE9VQ0hNT1ZFX0VWRU5UX05BTUUsdCksdGhpc30sZS5wcm90b3R5cGUub25Ub3VjaEVuZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChlLl9UT1VDSEVORF9FVkVOVF9OQU1FLHQpLHRoaXN9LGUucHJvdG90eXBlLm9mZlRvdWNoRW5kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KGUuX1RPVUNIRU5EX0VWRU5UX05BTUUsdCksdGhpc30sZS5wcm90b3R5cGUub25Ub3VjaENhbmNlbD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChlLl9UT1VDSENBTkNFTF9FVkVOVF9OQU1FLHQpLHRoaXN9LGUucHJvdG90eXBlLm9mZlRvdWNoQ2FuY2VsPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KGUuX1RPVUNIQ0FOQ0VMX0VWRU5UX05BTUUsdCksdGhpc30sZS5wcm90b3R5cGUuX21lYXN1cmVBbmREaXNwYXRjaD1mdW5jdGlvbih0LGUsbixpKXtpZih2b2lkIDA9PT1pJiYoaT0iZWxlbWVudCIpLCJwYWdlIiE9PWkmJiJlbGVtZW50IiE9PWkpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHNjb3BlICciK2krIicsIG11c3QgYmUgJ2VsZW1lbnQnIG9yICdwYWdlJyIpO2lmKCJlbGVtZW50IiE9PWl8fHRoaXMuZXZlbnRJbnNpZGUodCxlKSl7Zm9yKHZhciByPWUuY2hhbmdlZFRvdWNoZXMsbz17fSxhPVtdLHM9MDtzPHIubGVuZ3RoO3MrKyl7dmFyIGw9cltzXSxjPWwuaWRlbnRpZmllcix1PXRoaXMuX3RyYW5zbGF0b3IuY29tcHV0ZVBvc2l0aW9uKGwuY2xpZW50WCxsLmNsaWVudFkpO251bGwhPXUmJihvW2NdPXUsYS5wdXNoKGMpKX1hLmxlbmd0aD4wJiZ0aGlzLl9jYWxsQ2FsbGJhY2tzRm9yRXZlbnQobixhLG8sZSl9fSxlLnByb3RvdHlwZS5ldmVudEluc2lkZT1mdW5jdGlvbih0LGUpe3JldHVybiBfeHQuVHJhbnNsYXRvci5pc0V2ZW50SW5zaWRlKHQsZSl9LGUuX0RJU1BBVENIRVJfS0VZPSJfX1Bsb3R0YWJsZV9EaXNwYXRjaGVyX1RvdWNoIixlLl9UT1VDSFNUQVJUX0VWRU5UX05BTUU9InRvdWNoc3RhcnQiLGUuX1RPVUNITU9WRV9FVkVOVF9OQU1FPSJ0b3VjaG1vdmUiLGUuX1RPVUNIRU5EX0VWRU5UX05BTUU9InRvdWNoZW5kIixlLl9UT1VDSENBTkNFTF9FVkVOVF9OQU1FPSJ0b3VjaGNhbmNlbCIsZX0pKGF4dC5EaXNwYXRjaGVyKTtteHQuVG91Y2g9eXh0LChmdW5jdGlvbih0KXsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBlPUJPO2UuX19leHBvcnRTdGFyKG94dCx0KSxlLl9fZXhwb3J0U3RhcihoeHQsdCksZS5fX2V4cG9ydFN0YXIobXh0LHQpfSkocnh0KTt2YXIgdnh0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eSh2eHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBieHQ9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3ZhciB0PXRoaXM7dGhpcy5fYW5jaG9yQ2FsbGJhY2s9ZnVuY3Rpb24oZSl7cmV0dXJuIHQuX2FuY2hvcihlKX0sdGhpcy5fZW5hYmxlZD0hMH1yZXR1cm4gdC5wcm90b3R5cGUuYXR0YWNoVG89ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2Rpc2Nvbm5lY3QoKSx0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvPXQsdGhpcy5fY29ubmVjdCgpLHRoaXN9LHQucHJvdG90eXBlLmRldGFjaEZyb209ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuZGV0YWNoKCl9LHQucHJvdG90eXBlLmRldGFjaD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kaXNjb25uZWN0KCksdGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbz1udWxsLHRoaXN9LHQucHJvdG90eXBlLmVuYWJsZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fZW5hYmxlZDoodGhpcy5fZW5hYmxlZD10LHRoaXMuX2VuYWJsZWQ/dGhpcy5fY29ubmVjdCgpOnRoaXMuX2Rpc2Nvbm5lY3QoKSx0aGlzKX0sdC5wcm90b3R5cGUuX2FuY2hvcj1mdW5jdGlvbih0KXt0aGlzLl9pc0FuY2hvcmVkPSEwfSx0LnByb3RvdHlwZS5fdW5hbmNob3I9ZnVuY3Rpb24oKXt0aGlzLl9pc0FuY2hvcmVkPSExfSx0LnByb3RvdHlwZS5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLm9yaWdpblRvUm9vdCgpO3JldHVybnt4OnQueC1lLngseTp0LnktZS55fX0sdC5wcm90b3R5cGUuX2lzSW5zaWRlQ29tcG9uZW50PWZ1bmN0aW9uKHQpe3JldHVybiAwPD10LngmJjA8PXQueSYmdC54PD10aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLndpZHRoKCkmJnQueTw9dGhpcy5fY29tcG9uZW50QXR0YWNoZWRUby5oZWlnaHQoKX0sdC5wcm90b3R5cGUuX2Nvbm5lY3Q9ZnVuY3Rpb24oKXt0aGlzLmVuYWJsZWQoKSYmbnVsbCE9dGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyYmIXRoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8ub25BbmNob3IodGhpcy5fYW5jaG9yQ2FsbGJhY2spfSx0LnByb3RvdHlwZS5fZGlzY29ubmVjdD1mdW5jdGlvbigpe3RoaXMuX2lzQW5jaG9yZWQmJnRoaXMuX3VuYW5jaG9yKCksbnVsbCE9dGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyYmdGhpcy5fY29tcG9uZW50QXR0YWNoZWRUby5vZmZBbmNob3IodGhpcy5fYW5jaG9yQ2FsbGJhY2spfSx0fSkoKTt2eHQuSW50ZXJhY3Rpb249Ynh0LAovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkoaXh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgeHh0PUJPLHd4dD1yeHQsU3h0PURfdCxNeHQ9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT1udWxsIT09dCYmdC5hcHBseSh0aGlzLGFyZ3VtZW50cyl8fHRoaXM7cmV0dXJuIGUuX2NsaWNrZWREb3duPSExLGUuX2RvdWJsZUNsaWNraW5nPSExLGUuX29uQ2xpY2tDYWxsYmFja3M9bmV3IFN4dC5DYWxsYmFja1NldCxlLl9vbkRvdWJsZUNsaWNrQ2FsbGJhY2tzPW5ldyBTeHQuQ2FsbGJhY2tTZXQsZS5fbW91c2VEb3duQ2FsbGJhY2s9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5faGFuZGxlQ2xpY2tEb3duKHQsbil9LGUuX21vdXNlVXBDYWxsYmFjaz1mdW5jdGlvbih0LG4pe3JldHVybiBlLl9oYW5kbGVDbGlja1VwKHQsbil9LGUuX2RibENsaWNrQ2FsbGJhY2s9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5faGFuZGxlRGJsQ2xpY2sodCxuKX0sZS5fdG91Y2hTdGFydENhbGxiYWNrPWZ1bmN0aW9uKHQsbixpKXtyZXR1cm4gZS5faGFuZGxlQ2xpY2tEb3duKG5bdFswXV0saSl9LGUuX3RvdWNoRW5kQ2FsbGJhY2s9ZnVuY3Rpb24odCxuLGkpe3JldHVybiBlLl9oYW5kbGVDbGlja1VwKG5bdFswXV0saSl9LGUuX3RvdWNoQ2FuY2VsQ2FsbGJhY2s9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5fY2xpY2tlZERvd249ITF9LGV9cmV0dXJuIHh4dC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5fYW5jaG9yPWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLl9hbmNob3IuY2FsbCh0aGlzLGUpLHRoaXMuX21vdXNlRGlzcGF0Y2hlcj13eHQuTW91c2UuZ2V0RGlzcGF0Y2hlcihlKSx0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZURvd24odGhpcy5fbW91c2VEb3duQ2FsbGJhY2spLHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vbk1vdXNlVXAodGhpcy5fbW91c2VVcENhbGxiYWNrKSx0aGlzLl9tb3VzZURpc3BhdGNoZXIub25EYmxDbGljayh0aGlzLl9kYmxDbGlja0NhbGxiYWNrKSx0aGlzLl90b3VjaERpc3BhdGNoZXI9d3h0LlRvdWNoLmdldERpc3BhdGNoZXIoZSksdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hTdGFydCh0aGlzLl90b3VjaFN0YXJ0Q2FsbGJhY2spLHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoRW5kKHRoaXMuX3RvdWNoRW5kQ2FsbGJhY2spLHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoQ2FuY2VsKHRoaXMuX3RvdWNoQ2FuY2VsQ2FsbGJhY2spfSxlLnByb3RvdHlwZS5fdW5hbmNob3I9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5fdW5hbmNob3IuY2FsbCh0aGlzKSx0aGlzLl9tb3VzZURpc3BhdGNoZXIub2ZmTW91c2VEb3duKHRoaXMuX21vdXNlRG93bkNhbGxiYWNrKSx0aGlzLl9tb3VzZURpc3BhdGNoZXIub2ZmTW91c2VVcCh0aGlzLl9tb3VzZVVwQ2FsbGJhY2spLHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZEYmxDbGljayh0aGlzLl9kYmxDbGlja0NhbGxiYWNrKSx0aGlzLl9tb3VzZURpc3BhdGNoZXI9bnVsbCx0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hTdGFydCh0aGlzLl90b3VjaFN0YXJ0Q2FsbGJhY2spLHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaEVuZCh0aGlzLl90b3VjaEVuZENhbGxiYWNrKSx0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hDYW5jZWwodGhpcy5fdG91Y2hDYW5jZWxDYWxsYmFjayksdGhpcy5fdG91Y2hEaXNwYXRjaGVyPW51bGx9LGUucHJvdG90eXBlLl9oYW5kbGVDbGlja0Rvd249ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHQpO3RoaXMuX2lzSW5zaWRlQ29tcG9uZW50KG4pJiYodGhpcy5fY2xpY2tlZERvd249ITAsdGhpcy5fY2xpY2tlZFBvaW50PW4pfSxlLnByb3RvdHlwZS5faGFuZGxlQ2xpY2tVcD1mdW5jdGlvbih0LG4pe3ZhciBpPXRoaXMscj10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHQpO3RoaXMuX2NsaWNrZWREb3duJiZlLl9wb2ludHNFcXVhbChyLHRoaXMuX2NsaWNrZWRQb2ludCkmJnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7aS5fZG91YmxlQ2xpY2tpbmd8fGkuX29uQ2xpY2tDYWxsYmFja3MuY2FsbENhbGxiYWNrcyhyLG4pfSksMCksdGhpcy5fY2xpY2tlZERvd249ITF9LGUucHJvdG90eXBlLl9oYW5kbGVEYmxDbGljaz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMsaT10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHQpO3RoaXMuX2RvdWJsZUNsaWNraW5nPSEwLHRoaXMuX29uRG91YmxlQ2xpY2tDYWxsYmFja3MuY2FsbENhbGxiYWNrcyhpLGUpLHNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7cmV0dXJuIG4uX2RvdWJsZUNsaWNraW5nPSExfSksMCl9LGUuX3BvaW50c0VxdWFsPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQueD09PWUueCYmdC55PT09ZS55fSxlLnByb3RvdHlwZS5vbkNsaWNrPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9vbkNsaWNrQ2FsbGJhY2tzLmFkZCh0KSx0aGlzfSxlLnByb3RvdHlwZS5vZmZDbGljaz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fb25DbGlja0NhbGxiYWNrcy5kZWxldGUodCksdGhpc30sZS5wcm90b3R5cGUub25Eb3VibGVDbGljaz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fb25Eb3VibGVDbGlja0NhbGxiYWNrcy5hZGQodCksdGhpc30sZS5wcm90b3R5cGUub2ZmRG91YmxlQ2xpY2s9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX29uRG91YmxlQ2xpY2tDYWxsYmFja3MuZGVsZXRlKHQpLHRoaXN9LGV9KSh2eHQuSW50ZXJhY3Rpb24pO2l4dC5DbGljaz1NeHQ7dmFyIEV4dD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoRXh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgVHh0PUJPLEN4dD1yeHQsQXh0PURfdCxreHQ9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUobil7dmFyIGk9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBpLl9kcmFnZ2luZz0hMSxpLl9jb25zdHJhaW5lZFRvQ29tcG9uZW50PSEwLGkuX21vdXNlRmlsdGVyPWUuX0RFRkFVTFRfTU9VU0VfRklMVEVSLGkuX2RyYWdTdGFydENhbGxiYWNrcz1uZXcgQXh0LkNhbGxiYWNrU2V0LGkuX2RyYWdDYWxsYmFja3M9bmV3IEF4dC5DYWxsYmFja1NldCxpLl9kcmFnRW5kQ2FsbGJhY2tzPW5ldyBBeHQuQ2FsbGJhY2tTZXQsaS5fbW91c2VEb3duQ2FsbGJhY2s9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaS5fc3RhcnREcmFnKHQsZSl9LGkuX21vdXNlTW92ZUNhbGxiYWNrPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGkuX2RvRHJhZyh0LGUpfSxpLl9tb3VzZVVwQ2FsbGJhY2s9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaS5fZW5kRHJhZyh0LGUpfSxpLl90b3VjaFN0YXJ0Q2FsbGJhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBpLl9zdGFydERyYWcoZVt0WzBdXSxuKX0saS5fdG91Y2hNb3ZlQ2FsbGJhY2s9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBpLl9kb0RyYWcoZVt0WzBdXSxuKX0saS5fdG91Y2hFbmRDYWxsYmFjaz1mdW5jdGlvbih0LGUsbil7cmV0dXJuIGkuX2VuZERyYWcoZVt0WzBdXSxuKX0saS5fbW91c2VCdXR0b249dm9pZCAwIT09bj9uOjAsaX1yZXR1cm4gVHh0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLl9hbmNob3I9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUuX2FuY2hvci5jYWxsKHRoaXMsZSksdGhpcy5fbW91c2VEaXNwYXRjaGVyPUN4dC5Nb3VzZS5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pLHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vbk1vdXNlRG93bih0aGlzLl9tb3VzZURvd25DYWxsYmFjayksdGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VNb3ZlKHRoaXMuX21vdXNlTW92ZUNhbGxiYWNrKSx0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZVVwKHRoaXMuX21vdXNlVXBDYWxsYmFjayksdGhpcy5fdG91Y2hEaXNwYXRjaGVyPUN4dC5Ub3VjaC5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pLHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKSx0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaE1vdmUodGhpcy5fdG91Y2hNb3ZlQ2FsbGJhY2spLHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoRW5kKHRoaXMuX3RvdWNoRW5kQ2FsbGJhY2spfSxlLnByb3RvdHlwZS5fdW5hbmNob3I9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5fdW5hbmNob3IuY2FsbCh0aGlzKSx0aGlzLl9tb3VzZURpc3BhdGNoZXIub2ZmTW91c2VEb3duKHRoaXMuX21vdXNlRG93bkNhbGxiYWNrKSx0aGlzLl9tb3VzZURpc3BhdGNoZXIub2ZmTW91c2VNb3ZlKHRoaXMuX21vdXNlTW92ZUNhbGxiYWNrKSx0aGlzLl9tb3VzZURpc3BhdGNoZXIub2ZmTW91c2VVcCh0aGlzLl9tb3VzZVVwQ2FsbGJhY2spLHRoaXMuX21vdXNlRGlzcGF0Y2hlcj1udWxsLHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayksdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoTW92ZSh0aGlzLl90b3VjaE1vdmVDYWxsYmFjayksdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoRW5kKHRoaXMuX3RvdWNoRW5kQ2FsbGJhY2spLHRoaXMuX3RvdWNoRGlzcGF0Y2hlcj1udWxsfSxlLnByb3RvdHlwZS5fdHJhbnNsYXRlQW5kQ29uc3RyYWluPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UodCk7cmV0dXJuIHRoaXMuX2NvbnN0cmFpbmVkVG9Db21wb25lbnQ/e3g6QXh0Lk1hdGguY2xhbXAoZS54LDAsdGhpcy5fY29tcG9uZW50QXR0YWNoZWRUby53aWR0aCgpKSx5OkF4dC5NYXRoLmNsYW1wKGUueSwwLHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8uaGVpZ2h0KCkpfTplfSxlLnByb3RvdHlwZS5fc3RhcnREcmFnPWZ1bmN0aW9uKHQsZSl7aWYoIShlIGluc3RhbmNlb2YgTW91c2VFdmVudCl8fHRoaXMuX21vdXNlRmlsdGVyKGUpKXt2YXIgbj10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHQpO3RoaXMuX2lzSW5zaWRlQ29tcG9uZW50KG4pJiYoZS5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2RyYWdnaW5nPSEwLHRoaXMuX2RyYWdPcmlnaW49bix0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzLl9kcmFnT3JpZ2luKSl9fSxlLnByb3RvdHlwZS5fZG9EcmFnPWZ1bmN0aW9uKHQsZSl7dGhpcy5fZHJhZ2dpbmcmJnRoaXMuX2RyYWdDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzLl9kcmFnT3JpZ2luLHRoaXMuX3RyYW5zbGF0ZUFuZENvbnN0cmFpbih0KSl9LGUucHJvdG90eXBlLl9lbmREcmFnPWZ1bmN0aW9uKHQsZSl7ZSBpbnN0YW5jZW9mIE1vdXNlRXZlbnQmJmUuYnV0dG9uIT09dGhpcy5fbW91c2VCdXR0b258fHRoaXMuX2RyYWdnaW5nJiYodGhpcy5fZHJhZ2dpbmc9ITEsdGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHRoaXMuX2RyYWdPcmlnaW4sdGhpcy5fdHJhbnNsYXRlQW5kQ29uc3RyYWluKHQpKSl9LGUucHJvdG90eXBlLmNvbnN0cmFpbmVkVG9Db21wb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fY29uc3RyYWluZWRUb0NvbXBvbmVudDoodGhpcy5fY29uc3RyYWluZWRUb0NvbXBvbmVudD10LHRoaXMpfSxlLnByb3RvdHlwZS5tb3VzZUZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gMD09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5fbW91c2VGaWx0ZXI6KHRoaXMuX21vdXNlRmlsdGVyPXQsdGhpcyl9LGUucHJvdG90eXBlLm9uRHJhZ1N0YXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuYWRkKHQpLHRoaXN9LGUucHJvdG90eXBlLm9mZkRyYWdTdGFydD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmRlbGV0ZSh0KSx0aGlzfSxlLnByb3RvdHlwZS5vbkRyYWc9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2RyYWdDYWxsYmFja3MuYWRkKHQpLHRoaXN9LGUucHJvdG90eXBlLm9mZkRyYWc9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2RyYWdDYWxsYmFja3MuZGVsZXRlKHQpLHRoaXN9LGUucHJvdG90eXBlLm9uRHJhZ0VuZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5hZGQodCksdGhpc30sZS5wcm90b3R5cGUub2ZmRHJhZ0VuZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5kZWxldGUodCksdGhpc30sZS5fREVGQVVMVF9NT1VTRV9GSUxURVI9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10LmJ1dHRvbn0sZX0pKHZ4dC5JbnRlcmFjdGlvbik7RXh0LkRyYWc9a3h0O3ZhciBMeHQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KEx4dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIFB4dD1CTyxOeHQ9cnh0LEl4dD1EX3QsUnh0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9bnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzO3JldHVybiBlLl9rZXlQcmVzc0NhbGxiYWNrcz17fSxlLl9rZXlSZWxlYXNlQ2FsbGJhY2tzPXt9LGUuX21vdXNlTW92ZUNhbGxiYWNrPWZ1bmN0aW9uKHQpe3JldHVybiExfSxlLl9kb3duZWRLZXlzPW5ldyBJeHQuU2V0LGUuX2tleURvd25DYWxsYmFjaz1mdW5jdGlvbih0LG4pe3JldHVybiBlLl9oYW5kbGVLZXlEb3duRXZlbnQodCxuKX0sZS5fa2V5VXBDYWxsYmFjaz1mdW5jdGlvbih0KXtyZXR1cm4gZS5faGFuZGxlS2V5VXBFdmVudCh0KX0sZX1yZXR1cm4gUHh0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLl9hbmNob3I9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUuX2FuY2hvci5jYWxsKHRoaXMsZSksdGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyPU54dC5Nb3VzZS5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pLHRoaXMuX3Bvc2l0aW9uRGlzcGF0Y2hlci5vbk1vdXNlTW92ZSh0aGlzLl9tb3VzZU1vdmVDYWxsYmFjayksdGhpcy5fa2V5RGlzcGF0Y2hlcj1OeHQuS2V5LmdldERpc3BhdGNoZXIoKSx0aGlzLl9rZXlEaXNwYXRjaGVyLm9uS2V5RG93bih0aGlzLl9rZXlEb3duQ2FsbGJhY2spLHRoaXMuX2tleURpc3BhdGNoZXIub25LZXlVcCh0aGlzLl9rZXlVcENhbGxiYWNrKX0sZS5wcm90b3R5cGUuX3VuYW5jaG9yPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuX3VuYW5jaG9yLmNhbGwodGhpcyksdGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyLm9mZk1vdXNlTW92ZSh0aGlzLl9tb3VzZU1vdmVDYWxsYmFjayksdGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyPW51bGwsdGhpcy5fa2V5RGlzcGF0Y2hlci5vZmZLZXlEb3duKHRoaXMuX2tleURvd25DYWxsYmFjayksdGhpcy5fa2V5RGlzcGF0Y2hlci5vZmZLZXlVcCh0aGlzLl9rZXlVcENhbGxiYWNrKSx0aGlzLl9rZXlEaXNwYXRjaGVyPW51bGx9LGUucHJvdG90eXBlLl9oYW5kbGVLZXlEb3duRXZlbnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHRoaXMuX3Bvc2l0aW9uRGlzcGF0Y2hlci5sYXN0TW91c2VQb3NpdGlvbigpKTt0aGlzLl9pc0luc2lkZUNvbXBvbmVudChuKSYmIWUucmVwZWF0JiYodGhpcy5fa2V5UHJlc3NDYWxsYmFja3NbdF0mJnRoaXMuX2tleVByZXNzQ2FsbGJhY2tzW3RdLmNhbGxDYWxsYmFja3ModCksdGhpcy5fZG93bmVkS2V5cy5hZGQodCkpfSxlLnByb3RvdHlwZS5faGFuZGxlS2V5VXBFdmVudD1mdW5jdGlvbih0KXt0aGlzLl9kb3duZWRLZXlzLmhhcyh0KSYmdGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1t0XSYmdGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1t0XS5jYWxsQ2FsbGJhY2tzKHQpLHRoaXMuX2Rvd25lZEtleXMuZGVsZXRlKHQpfSxlLnByb3RvdHlwZS5vbktleVByZXNzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2tleVByZXNzQ2FsbGJhY2tzW3RdfHwodGhpcy5fa2V5UHJlc3NDYWxsYmFja3NbdF09bmV3IEl4dC5DYWxsYmFja1NldCksdGhpcy5fa2V5UHJlc3NDYWxsYmFja3NbdF0uYWRkKGUpLHRoaXN9LGUucHJvdG90eXBlLm9mZktleVByZXNzPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2tleVByZXNzQ2FsbGJhY2tzW3RdLmRlbGV0ZShlKSwwPT09dGhpcy5fa2V5UHJlc3NDYWxsYmFja3NbdF0uc2l6ZSYmZGVsZXRlIHRoaXMuX2tleVByZXNzQ2FsbGJhY2tzW3RdLHRoaXN9LGUucHJvdG90eXBlLm9uS2V5UmVsZWFzZT1mdW5jdGlvbih0LGUpe3JldHVybiB0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW3RdfHwodGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1t0XT1uZXcgSXh0LkNhbGxiYWNrU2V0KSx0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW3RdLmFkZChlKSx0aGlzfSxlLnByb3RvdHlwZS5vZmZLZXlSZWxlYXNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2tleVJlbGVhc2VDYWxsYmFja3NbdF0uZGVsZXRlKGUpLDA9PT10aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW3RdLnNpemUmJmRlbGV0ZSB0aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzW3RdLHRoaXN9LGV9KSh2eHQuSW50ZXJhY3Rpb24pO0x4dC5LZXk9Unh0O3ZhciBPeHQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KE94dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHp4dD1CTyxEeHQ9d3B0LEJ4dD1yeHQsSHh0PVh2dCxGeHQ9RF90LFZ4dD1ueHQsVXh0PXRidCxqeHQ9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXt2YXIgaT10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIGkuX3doZWVsRmlsdGVyPWZ1bmN0aW9uKHQpe3JldHVybiEwfSxpLl93aGVlbENhbGxiYWNrPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGkuX2hhbmRsZVdoZWVsRXZlbnQodCxlKX0saS5fdG91Y2hTdGFydENhbGxiYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaS5faGFuZGxlVG91Y2hTdGFydCh0LGUsbil9LGkuX3RvdWNoTW92ZUNhbGxiYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaS5faGFuZGxlUGluY2godCxlLG4pfSxpLl90b3VjaEVuZENhbGxiYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaS5faGFuZGxlVG91Y2hFbmQodCxlLG4pfSxpLl90b3VjaENhbmNlbENhbGxiYWNrPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gaS5faGFuZGxlVG91Y2hFbmQodCxlLG4pfSxpLl9wYW5FbmRDYWxsYmFja3M9bmV3IEZ4dC5DYWxsYmFja1NldCxpLl96b29tRW5kQ2FsbGJhY2tzPW5ldyBGeHQuQ2FsbGJhY2tTZXQsaS5fcGFuWm9vbVVwZGF0ZUNhbGxiYWNrcz1uZXcgRnh0LkNhbGxiYWNrU2V0LGkuX3hTY2FsZXM9bmV3IEZ4dC5TZXQsaS5feVNjYWxlcz1uZXcgRnh0LlNldCxpLl9kcmFnSW50ZXJhY3Rpb249bmV3IFZ4dC5EcmFnLGkuX3NldHVwRHJhZ0ludGVyYWN0aW9uKCksaS5fdG91Y2hJZHM9RHh0Lm1hcCgpLGkuX21pbkRvbWFpbkV4dGVudHM9bmV3IEZ4dC5NYXAsaS5fbWF4RG9tYWluRXh0ZW50cz1uZXcgRnh0Lk1hcCxpLl9taW5Eb21haW5WYWx1ZXM9bmV3IEZ4dC5NYXAsaS5fbWF4RG9tYWluVmFsdWVzPW5ldyBGeHQuTWFwLG51bGwhPWUmJmkuYWRkWFNjYWxlKGUpLG51bGwhPW4mJmkuYWRkWVNjYWxlKG4pLGl9cmV0dXJuIHp4dC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5kcmFnSW50ZXJhY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZHJhZ0ludGVyYWN0aW9ufSxlLnByb3RvdHlwZS53aGVlbEZpbHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gMD09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5fd2hlZWxGaWx0ZXI6KHRoaXMuX3doZWVsRmlsdGVyPXQsdGhpcyl9LGUucHJvdG90eXBlLnBhbj1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMueFNjYWxlcygpLmZvckVhY2goKGZ1bmN0aW9uKG4pe24ucGFuKGUuX2NvbnN0cmFpbmVkVHJhbnNsYXRpb24obix0LngpKX0pKSx0aGlzLnlTY2FsZXMoKS5mb3JFYWNoKChmdW5jdGlvbihuKXtuLnBhbihlLl9jb25zdHJhaW5lZFRyYW5zbGF0aW9uKG4sdC55KSl9KSksdGhpcy5fcGFuWm9vbVVwZGF0ZUNhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKCl9LGUucHJvdG90eXBlLnpvb209ZnVuY3Rpb24odCxlLG4pe3ZhciBpLHIsbz10aGlzO3JldHVybiB2b2lkIDA9PT1uJiYobj0hMCksbnVsbCE9ZSYmKGk9ZS54LHI9ZS55LG4mJih0aGlzLnhTY2FsZXMoKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1vLl9jb25zdHJhaW5lZFpvb20oZSx0LGkpO2k9bi5jZW50ZXJQb2ludCx0PW4uem9vbUFtb3VudH0pKSx0aGlzLnlTY2FsZXMoKS5mb3JFYWNoKChmdW5jdGlvbihlKXt2YXIgbj1vLl9jb25zdHJhaW5lZFpvb20oZSx0LHIpO3I9bi5jZW50ZXJQb2ludCx0PW4uem9vbUFtb3VudH0pKSkpLHRoaXMueFNjYWxlcygpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3ZhciBuPWUucmFuZ2UoKTtlLnpvb20odCxudWxsPT1pPyhuWzFdK25bMF0pLzI6aSl9KSksdGhpcy55U2NhbGVzKCkuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dmFyIG49ZS5yYW5nZSgpO2Uuem9vbSh0LG51bGw9PXI/KG5bMV0rblswXSkvMjpyKX0pKSx0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoKSx7em9vbUFtb3VudDp0LGNlbnRlclZhbHVlOntjZW50ZXJYOmksY2VudGVyWTpyfX19LGUucHJvdG90eXBlLl9hbmNob3I9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUuX2FuY2hvci5jYWxsKHRoaXMsZSksdGhpcy5fZHJhZ0ludGVyYWN0aW9uLmF0dGFjaFRvKGUpLHRoaXMuX21vdXNlRGlzcGF0Y2hlcj1CeHQuTW91c2UuZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKSx0aGlzLl9tb3VzZURpc3BhdGNoZXIub25XaGVlbCh0aGlzLl93aGVlbENhbGxiYWNrKSx0aGlzLl90b3VjaERpc3BhdGNoZXI9Qnh0LlRvdWNoLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyksdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hTdGFydCh0aGlzLl90b3VjaFN0YXJ0Q2FsbGJhY2spLHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoTW92ZSh0aGlzLl90b3VjaE1vdmVDYWxsYmFjayksdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayksdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hDYW5jZWwodGhpcy5fdG91Y2hDYW5jZWxDYWxsYmFjayl9LGUucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpLHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZXaGVlbCh0aGlzLl93aGVlbENhbGxiYWNrKSx0aGlzLl9tb3VzZURpc3BhdGNoZXI9bnVsbCx0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hTdGFydCh0aGlzLl90b3VjaFN0YXJ0Q2FsbGJhY2spLHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaE1vdmUodGhpcy5fdG91Y2hNb3ZlQ2FsbGJhY2spLHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaEVuZCh0aGlzLl90b3VjaEVuZENhbGxiYWNrKSx0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hDYW5jZWwodGhpcy5fdG91Y2hDYW5jZWxDYWxsYmFjayksdGhpcy5fdG91Y2hEaXNwYXRjaGVyPW51bGwsdGhpcy5fZHJhZ0ludGVyYWN0aW9uLmRldGFjaCgpfSxlLnByb3RvdHlwZS5faGFuZGxlVG91Y2hTdGFydD1mdW5jdGlvbih0LGUsbil7Zm9yKHZhciBpPTA7aTx0Lmxlbmd0aCYmdGhpcy5fdG91Y2hJZHMuc2l6ZSgpPDI7aSsrKXt2YXIgcj10W2ldO3RoaXMuX3RvdWNoSWRzLnNldChyLnRvU3RyaW5nKCksdGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShlW3JdKSl9fSxlLnByb3RvdHlwZS5faGFuZGxlUGluY2g9ZnVuY3Rpb24odCxuLGkpe3ZhciByPXRoaXM7aWYoISh0aGlzLl90b3VjaElkcy5zaXplKCk8Mikpe3ZhciBvPXRoaXMuX3RvdWNoSWRzLnZhbHVlcygpO2lmKHRoaXMuX2lzSW5zaWRlQ29tcG9uZW50KHRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2Uob1swXSkpJiZ0aGlzLl9pc0luc2lkZUNvbXBvbmVudCh0aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKG9bMV0pKSl7dmFyIGE9ZS5fcG9pbnREaXN0YW5jZShvWzBdLG9bMV0pO2lmKDAhPT1hKXt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3IuX3RvdWNoSWRzLmhhcyh0LnRvU3RyaW5nKCkpJiZyLl90b3VjaElkcy5zZXQodC50b1N0cmluZygpLHIuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2Uoblt0XSkpfSkpO3ZhciBzPXRoaXMuX3RvdWNoSWRzLnZhbHVlcygpLGw9ZS5fcG9pbnREaXN0YW5jZShzWzBdLHNbMV0pO2lmKDAhPT1sKXt2YXIgYz1hL2wsdT1zLm1hcCgoZnVuY3Rpb24odCxlKXtyZXR1cm57eDoodC54LW9bZV0ueCkvYyx5Oih0Lnktb1tlXS55KS9jfX0pKSxoPWUuY2VudGVyUG9pbnQob1swXSxvWzFdKSxkPXRoaXMuem9vbShjLGgpLHA9ZC5jZW50ZXJWYWx1ZSxmPWQuem9vbUFtb3VudCxtPXAuY2VudGVyWCxnPXAuY2VudGVyWSxfPW8ubWFwKChmdW5jdGlvbih0LGUpe3JldHVybnt4OnVbZV0ueCpmK3QueCx5OnVbZV0ueSpmK3QueX19KSk7dGhpcy5wYW4oe3g6bS0oX1swXS54K19bMV0ueCkvMix5OmctKF9bMF0ueStfWzFdLnkpLzJ9KX19fX19LGUuY2VudGVyUG9pbnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1NYXRoLm1pbih0LngsZS54KSxpPU1hdGgubWF4KHQueCxlLngpLHI9TWF0aC5taW4odC55LGUueSk7cmV0dXJue3g6KG4raSkvMix5OihNYXRoLm1heCh0LnksZS55KStyKS8yfX0sZS5fcG9pbnREaXN0YW5jZT1mdW5jdGlvbih0LGUpe3ZhciBuPU1hdGgubWluKHQueCxlLngpLGk9TWF0aC5tYXgodC54LGUueCkscj1NYXRoLm1pbih0LnksZS55KSxvPU1hdGgubWF4KHQueSxlLnkpO3JldHVybiBNYXRoLnNxcnQoTWF0aC5wb3coaS1uLDIpK01hdGgucG93KG8tciwyKSl9LGUucHJvdG90eXBlLl9oYW5kbGVUb3VjaEVuZD1mdW5jdGlvbih0LGUsbil7dmFyIGk9dGhpczt0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2kuX3RvdWNoSWRzLnJlbW92ZSh0LnRvU3RyaW5nKCkpfSkpLHRoaXMuX3RvdWNoSWRzLnNpemUoKT4wJiZ0aGlzLl96b29tRW5kQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoKX0sZS5wcm90b3R5cGUuX2hhbmRsZVdoZWVsRXZlbnQ9ZnVuY3Rpb24odCxuKXtpZih0aGlzLl93aGVlbEZpbHRlcihuKSl7dmFyIGk9dGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZSh0KTtpZih0aGlzLl9pc0luc2lkZUNvbXBvbmVudChpKSl7bi5wcmV2ZW50RGVmYXVsdCgpO3ZhciByPU1hdGgucG93KDIsLjAwMiooKDAhPT1uLmRlbHRhWT9uLmRlbHRhWTpuLmRlbHRhWCkqKG4uZGVsdGFNb2RlP2UuX1BJWEVMU19QRVJfTElORToxKSkpO3RoaXMuem9vbShyLGkpLHRoaXMuX3pvb21FbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcygpfX19LGUucHJvdG90eXBlLl9jb25zdHJhaW5lZFpvb209ZnVuY3Rpb24odCxlLG4pe3JldHVybiBVeHQuY29uc3RyYWluZWRab29tKHQsZSxuLHRoaXMubWluRG9tYWluRXh0ZW50KHQpLHRoaXMubWF4RG9tYWluRXh0ZW50KHQpLHRoaXMubWluRG9tYWluVmFsdWUodCksdGhpcy5tYXhEb21haW5WYWx1ZSh0KSl9LGUucHJvdG90eXBlLl9jb25zdHJhaW5lZFRyYW5zbGF0aW9uPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIFV4dC5jb25zdHJhaW5lZFRyYW5zbGF0aW9uKHQsZSx0aGlzLm1pbkRvbWFpblZhbHVlKHQpLHRoaXMubWF4RG9tYWluVmFsdWUodCkpfSxlLnByb3RvdHlwZS5fc2V0dXBEcmFnSW50ZXJhY3Rpb249ZnVuY3Rpb24oKXt2YXIgdCxlPXRoaXM7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLmNvbnN0cmFpbmVkVG9Db21wb25lbnQoITEpLHRoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWdTdGFydCgoZnVuY3Rpb24oKXtyZXR1cm4gdD1udWxsfSkpLHRoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWcoKGZ1bmN0aW9uKG4saSl7ZS5fdG91Y2hJZHMuc2l6ZSgpPj0yfHwoZS5wYW4oe3g6KG51bGw9PXQ/bi54OnQueCktaS54LHk6KG51bGw9PXQ/bi55OnQueSktaS55fSksdD1pKX0pKSx0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnRW5kKChmdW5jdGlvbigpe3JldHVybiBlLl9wYW5FbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcygpfSkpfSxlLnByb3RvdHlwZS5fbm9uTGluZWFyU2NhbGVXaXRoRXh0ZW50cz1mdW5jdGlvbih0KXtyZXR1cm4hKG51bGw9PXRoaXMubWluRG9tYWluRXh0ZW50KHQpfHxudWxsPT10aGlzLm1heERvbWFpbkV4dGVudCh0KXx8dCBpbnN0YW5jZW9mIEh4dC5MaW5lYXJ8fHQgaW5zdGFuY2VvZiBIeHQuVGltZSl9LGUucHJvdG90eXBlLnhTY2FsZXM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZihudWxsPT10KXt2YXIgbj1bXTtyZXR1cm4gdGhpcy5feFNjYWxlcy5mb3JFYWNoKChmdW5jdGlvbih0KXtuLnB1c2godCl9KSksbn1yZXR1cm4gdGhpcy5feFNjYWxlcz1uZXcgRnh0LlNldCx0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2UuYWRkWFNjYWxlKHQpfSkpLHRoaXN9LGUucHJvdG90eXBlLnlTY2FsZXM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZihudWxsPT10KXt2YXIgbj1bXTtyZXR1cm4gdGhpcy5feVNjYWxlcy5mb3JFYWNoKChmdW5jdGlvbih0KXtuLnB1c2godCl9KSksbn1yZXR1cm4gdGhpcy5feVNjYWxlcz1uZXcgRnh0LlNldCx0LmZvckVhY2goKGZ1bmN0aW9uKHQpe2UuYWRkWVNjYWxlKHQpfSkpLHRoaXN9LGUucHJvdG90eXBlLmFkZFhTY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5feFNjYWxlcy5hZGQodCksdGhpc30sZS5wcm90b3R5cGUucmVtb3ZlWFNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl94U2NhbGVzLmRlbGV0ZSh0KSx0aGlzLl9taW5Eb21haW5FeHRlbnRzLmRlbGV0ZSh0KSx0aGlzLl9tYXhEb21haW5FeHRlbnRzLmRlbGV0ZSh0KSx0aGlzLl9taW5Eb21haW5WYWx1ZXMuZGVsZXRlKHQpLHRoaXMuX21heERvbWFpblZhbHVlcy5kZWxldGUodCksdGhpc30sZS5wcm90b3R5cGUuYWRkWVNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl95U2NhbGVzLmFkZCh0KSx0aGlzfSxlLnByb3RvdHlwZS5yZW1vdmVZU2NhbGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3lTY2FsZXMuZGVsZXRlKHQpLHRoaXMuX21pbkRvbWFpbkV4dGVudHMuZGVsZXRlKHQpLHRoaXMuX21heERvbWFpbkV4dGVudHMuZGVsZXRlKHQpLHRoaXMuX21pbkRvbWFpblZhbHVlcy5kZWxldGUodCksdGhpcy5fbWF4RG9tYWluVmFsdWVzLmRlbGV0ZSh0KSx0aGlzfSxlLnByb3RvdHlwZS5taW5Eb21haW5FeHRlbnQ9ZnVuY3Rpb24odCxlKXtpZihudWxsPT1lKXJldHVybiB0aGlzLl9taW5Eb21haW5FeHRlbnRzLmdldCh0KTtpZihlLnZhbHVlT2YoKTwwKXRocm93IG5ldyBFcnJvcigiZXh0ZW50IG11c3QgYmUgbm9uLW5lZ2F0aXZlIik7dmFyIG49dGhpcy5tYXhEb21haW5FeHRlbnQodCk7aWYobnVsbCE9biYmbi52YWx1ZU9mKCk8ZS52YWx1ZU9mKCkpdGhyb3cgbmV3IEVycm9yKCJtaW5Eb21haW5FeHRlbnQgbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4RG9tYWluRXh0ZW50IGZvciB0aGUgc2FtZSBTY2FsZSIpO3JldHVybiB0aGlzLl9ub25MaW5lYXJTY2FsZVdpdGhFeHRlbnRzKHQpJiZGeHQuV2luZG93Lndhcm4oIlBhbm5pbmcgYW5kIHpvb21pbmcgd2l0aCBleHRlbnRzIG9uIGEgbm9ubGluZWFyIHNjYWxlIG1heSBoYXZlIHVuaW50ZW5kZWQgYmVoYXZpb3IuIiksdGhpcy5fbWluRG9tYWluRXh0ZW50cy5zZXQodCxlKSx0aGlzfSxlLnByb3RvdHlwZS5tYXhEb21haW5FeHRlbnQ9ZnVuY3Rpb24odCxlKXtpZihudWxsPT1lKXJldHVybiB0aGlzLl9tYXhEb21haW5FeHRlbnRzLmdldCh0KTtpZihlLnZhbHVlT2YoKTw9MCl0aHJvdyBuZXcgRXJyb3IoImV4dGVudCBtdXN0IGJlIHBvc2l0aXZlIik7dmFyIG49dGhpcy5taW5Eb21haW5FeHRlbnQodCk7aWYobnVsbCE9biYmZS52YWx1ZU9mKCk8bi52YWx1ZU9mKCkpdGhyb3cgbmV3IEVycm9yKCJtYXhEb21haW5FeHRlbnQgbXVzdCBiZSBsYXJnZXIgdGhhbiBtaW5Eb21haW5FeHRlbnQgZm9yIHRoZSBzYW1lIFNjYWxlIik7cmV0dXJuIHRoaXMuX25vbkxpbmVhclNjYWxlV2l0aEV4dGVudHModCkmJkZ4dC5XaW5kb3cud2FybigiUGFubmluZyBhbmQgem9vbWluZyB3aXRoIGV4dGVudHMgb24gYSBub25saW5lYXIgc2NhbGUgbWF5IGhhdmUgdW5pbnRlbmRlZCBiZWhhdmlvci4iKSx0aGlzLl9tYXhEb21haW5FeHRlbnRzLnNldCh0LGUpLHRoaXN9LGUucHJvdG90eXBlLm1pbkRvbWFpblZhbHVlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PWU/dGhpcy5fbWluRG9tYWluVmFsdWVzLmdldCh0KToodGhpcy5fbWluRG9tYWluVmFsdWVzLnNldCh0LGUpLHRoaXMpfSxlLnByb3RvdHlwZS5tYXhEb21haW5WYWx1ZT1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT1lP3RoaXMuX21heERvbWFpblZhbHVlcy5nZXQodCk6KHRoaXMuX21heERvbWFpblZhbHVlcy5zZXQodCxlKSx0aGlzKX0sZS5wcm90b3R5cGUuc2V0TWluTWF4RG9tYWluVmFsdWVzVG89ZnVuY3Rpb24odCl7dGhpcy5fbWluRG9tYWluVmFsdWVzLmRlbGV0ZSh0KSx0aGlzLl9tYXhEb21haW5WYWx1ZXMuZGVsZXRlKHQpO3ZhciBlPXQuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKSxuPWVbMV07cmV0dXJuIHRoaXMubWluRG9tYWluVmFsdWUodCxlWzBdKSx0aGlzLm1heERvbWFpblZhbHVlKHQsbiksdGhpc30sZS5wcm90b3R5cGUub25QYW5FbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BhbkVuZENhbGxiYWNrcy5hZGQodCksdGhpc30sZS5wcm90b3R5cGUub2ZmUGFuRW5kPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYW5FbmRDYWxsYmFja3MuZGVsZXRlKHQpLHRoaXN9LGUucHJvdG90eXBlLm9uWm9vbUVuZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fem9vbUVuZENhbGxiYWNrcy5hZGQodCksdGhpc30sZS5wcm90b3R5cGUub2ZmWm9vbUVuZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fem9vbUVuZENhbGxiYWNrcy5kZWxldGUodCksdGhpc30sZS5wcm90b3R5cGUub25QYW5ab29tVXBkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmFkZCh0KSx0aGlzfSxlLnByb3RvdHlwZS5vZmZQYW5ab29tVXBkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmRlbGV0ZSh0KSx0aGlzfSxlLl9QSVhFTFNfUEVSX0xJTkU9MTIwLGV9KSh2eHQuSW50ZXJhY3Rpb24pO094dC5QYW5ab29tPWp4dDt2YXIgR3h0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShHeHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBXeHQ9Qk8scXh0PXJ4dCxZeHQ9RF90LFh4dD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5fb3ZlckNvbXBvbmVudD0hMSxlLl9wb2ludGVyRW50ZXJDYWxsYmFja3M9bmV3IFl4dC5DYWxsYmFja1NldCxlLl9wb2ludGVyTW92ZUNhbGxiYWNrcz1uZXcgWXh0LkNhbGxiYWNrU2V0LGUuX3BvaW50ZXJFeGl0Q2FsbGJhY2tzPW5ldyBZeHQuQ2FsbGJhY2tTZXQsZS5fbW91c2VNb3ZlQ2FsbGJhY2s9ZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5faGFuZGxlTW91c2VFdmVudCh0LG4pfSxlLl90b3VjaFN0YXJ0Q2FsbGJhY2s9ZnVuY3Rpb24odCxuLGkpe3JldHVybiBlLl9oYW5kbGVUb3VjaEV2ZW50KG5bdFswXV0saSl9LGV9cmV0dXJuIFd4dC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5fYW5jaG9yPWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLl9hbmNob3IuY2FsbCh0aGlzLGUpLHRoaXMuX21vdXNlRGlzcGF0Y2hlcj1xeHQuTW91c2UuZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKSx0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spLHRoaXMuX3RvdWNoRGlzcGF0Y2hlcj1xeHQuVG91Y2guZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKSx0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayl9LGUucHJvdG90eXBlLl91bmFuY2hvcj1mdW5jdGlvbigpe3QucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpLHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZU1vdmUodGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2spLHRoaXMuX21vdXNlRGlzcGF0Y2hlcj1udWxsLHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayksdGhpcy5fdG91Y2hEaXNwYXRjaGVyPW51bGx9LGUucHJvdG90eXBlLl9oYW5kbGVNb3VzZUV2ZW50PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fbW91c2VEaXNwYXRjaGVyLmV2ZW50SW5zaWRlKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8sZSk7dGhpcy5faGFuZGxlUG9pbnRlckV2ZW50KHQsbil9LGUucHJvdG90eXBlLl9oYW5kbGVUb3VjaEV2ZW50PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fdG91Y2hEaXNwYXRjaGVyLmV2ZW50SW5zaWRlKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8sZSk7dGhpcy5faGFuZGxlUG9pbnRlckV2ZW50KHQsbil9LGUucHJvdG90eXBlLl9oYW5kbGVQb2ludGVyRXZlbnQ9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHQpLGk9dGhpcy5faXNJbnNpZGVDb21wb25lbnQobik7aSYmZT8odGhpcy5fb3ZlckNvbXBvbmVudHx8dGhpcy5fcG9pbnRlckVudGVyQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MobiksdGhpcy5fcG9pbnRlck1vdmVDYWxsYmFja3MuY2FsbENhbGxiYWNrcyhuKSk6dGhpcy5fb3ZlckNvbXBvbmVudCYmdGhpcy5fcG9pbnRlckV4aXRDYWxsYmFja3MuY2FsbENhbGxiYWNrcyhuKSx0aGlzLl9vdmVyQ29tcG9uZW50PWkmJmV9LGUucHJvdG90eXBlLm9uUG9pbnRlckVudGVyPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wb2ludGVyRW50ZXJDYWxsYmFja3MuYWRkKHQpLHRoaXN9LGUucHJvdG90eXBlLm9mZlBvaW50ZXJFbnRlcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcG9pbnRlckVudGVyQ2FsbGJhY2tzLmRlbGV0ZSh0KSx0aGlzfSxlLnByb3RvdHlwZS5vblBvaW50ZXJNb3ZlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wb2ludGVyTW92ZUNhbGxiYWNrcy5hZGQodCksdGhpc30sZS5wcm90b3R5cGUub2ZmUG9pbnRlck1vdmU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BvaW50ZXJNb3ZlQ2FsbGJhY2tzLmRlbGV0ZSh0KSx0aGlzfSxlLnByb3RvdHlwZS5vblBvaW50ZXJFeGl0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9wb2ludGVyRXhpdENhbGxiYWNrcy5hZGQodCksdGhpc30sZS5wcm90b3R5cGUub2ZmUG9pbnRlckV4aXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX3BvaW50ZXJFeGl0Q2FsbGJhY2tzLmRlbGV0ZSh0KSx0aGlzfSxlfSkodnh0LkludGVyYWN0aW9uKTtHeHQuUG9pbnRlcj1YeHQsKGZ1bmN0aW9uKHQpewovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGU9Qk87ZS5fX2V4cG9ydFN0YXIoaXh0LHQpLGUuX19leHBvcnRTdGFyKEV4dCx0KSxlLl9fZXhwb3J0U3RhcihMeHQsdCksZS5fX2V4cG9ydFN0YXIoT3h0LHQpLGUuX19leHBvcnRTdGFyKEd4dCx0KSx0Lnpvb21PdXQ9dGJ0Lnpvb21PdXR9KShueHQpO3ZhciAkeHQ9e307IShmdW5jdGlvbih0KXsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBlLG49Qk8saT1EX3Qscj1PX3Q7IShmdW5jdGlvbih0KXt0W3QuVkFMVUU9MF09IlZBTFVFIix0W3QuUElYRUw9MV09IlBJWEVMIn0pKGU9dC5Qcm9wZXJ0eU1vZGV8fCh0LlByb3BlcnR5TW9kZT17fSkpO3ZhciBvPShmdW5jdGlvbih0KXtmdW5jdGlvbiByKCl7dmFyIG49dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBuLl9ib3hWaXNpYmxlPSExLG4uX2JveEJvdW5kcz17dG9wTGVmdDp7eDowLHk6MH0sYm90dG9tUmlnaHQ6e3g6MCx5OjB9fSxuLl94Qm91bmRzTW9kZT1lLlBJWEVMLG4uX3lCb3VuZHNNb2RlPWUuUElYRUwsbi5hZGRDbGFzcygic2VsZWN0aW9uLWJveC1sYXllciIpLG4uX2FkanVzdEJvdW5kc0NhbGxiYWNrPWZ1bmN0aW9uKCl7bi5yZW5kZXIoKX0sbi5fb3ZlcmZsb3dIaWRkZW49ITAsbi5feEV4dGVudD1bdm9pZCAwLHZvaWQgMF0sbi5feUV4dGVudD1bdm9pZCAwLHZvaWQgMF0sbn1yZXR1cm4gbi5fX2V4dGVuZHMocix0KSxyLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKSx0aGlzLl9ib3g9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCgic2VsZWN0aW9uLWJveCIsITApLnJlbW92ZSgpLHRoaXMuX2JveEFyZWE9dGhpcy5fYm94LmFwcGVuZCgicmVjdCIpLmNsYXNzZWQoInNlbGVjdGlvbi1hcmVhIiwhMCl9LHIucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJue3dpZHRoOnQsaGVpZ2h0OmV9fSxyLnByb3RvdHlwZS5ib3VuZHM9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fZ2V0Qm91bmRzKCk6KHRoaXMuX3NldEJvdW5kcyh0KSx0aGlzLl94Qm91bmRzTW9kZT1lLlBJWEVMLHRoaXMuX3lCb3VuZHNNb2RlPWUuUElYRUwsdGhpcy5yZW5kZXIoKSx0aGlzKX0sci5wcm90b3R5cGUuX3NldEJvdW5kcz1mdW5jdGlvbih0KXt2YXIgZT17eDpNYXRoLm1pbih0LnRvcExlZnQueCx0LmJvdHRvbVJpZ2h0LngpLHk6TWF0aC5taW4odC50b3BMZWZ0LnksdC5ib3R0b21SaWdodC55KX0sbj17eDpNYXRoLm1heCh0LnRvcExlZnQueCx0LmJvdHRvbVJpZ2h0LngpLHk6TWF0aC5tYXgodC50b3BMZWZ0LnksdC5ib3R0b21SaWdodC55KX07dGhpcy5fYm94Qm91bmRzPXt0b3BMZWZ0OmUsYm90dG9tUmlnaHQ6bn19LHIucHJvdG90eXBlLl9nZXRCb3VuZHM9ZnVuY3Rpb24oKXtyZXR1cm57dG9wTGVmdDp7eDp0aGlzLl94Qm91bmRzTW9kZT09PWUuUElYRUw/dGhpcy5fYm94Qm91bmRzLnRvcExlZnQueDpudWxsPT10aGlzLl94U2NhbGU/MDpNYXRoLm1pbih0aGlzLnhTY2FsZSgpLnNjYWxlKHRoaXMueEV4dGVudCgpWzBdKSx0aGlzLnhTY2FsZSgpLnNjYWxlKHRoaXMueEV4dGVudCgpWzFdKSkseTp0aGlzLl95Qm91bmRzTW9kZT09PWUuUElYRUw/dGhpcy5fYm94Qm91bmRzLnRvcExlZnQueTpudWxsPT10aGlzLl95U2NhbGU/MDpNYXRoLm1pbih0aGlzLnlTY2FsZSgpLnNjYWxlKHRoaXMueUV4dGVudCgpWzBdKSx0aGlzLnlTY2FsZSgpLnNjYWxlKHRoaXMueUV4dGVudCgpWzFdKSl9LGJvdHRvbVJpZ2h0Ont4OnRoaXMuX3hCb3VuZHNNb2RlPT09ZS5QSVhFTD90aGlzLl9ib3hCb3VuZHMuYm90dG9tUmlnaHQueDpudWxsPT10aGlzLl94U2NhbGU/MDpNYXRoLm1heCh0aGlzLnhTY2FsZSgpLnNjYWxlKHRoaXMueEV4dGVudCgpWzBdKSx0aGlzLnhTY2FsZSgpLnNjYWxlKHRoaXMueEV4dGVudCgpWzFdKSkseTp0aGlzLl95Qm91bmRzTW9kZT09PWUuUElYRUw/dGhpcy5fYm94Qm91bmRzLmJvdHRvbVJpZ2h0Lnk6bnVsbD09dGhpcy5feVNjYWxlPzA6TWF0aC5tYXgodGhpcy55U2NhbGUoKS5zY2FsZSh0aGlzLnlFeHRlbnQoKVswXSksdGhpcy55U2NhbGUoKS5zY2FsZSh0aGlzLnlFeHRlbnQoKVsxXSkpfX19LHIucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7aWYodC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKSx0aGlzLl9ib3hWaXNpYmxlKXt2YXIgZT10aGlzLmJvdW5kcygpLG49ZS50b3BMZWZ0Lnkscj1lLmJvdHRvbVJpZ2h0Lnksbz1lLnRvcExlZnQueCxhPWUuYm90dG9tUmlnaHQueDtpZighKGkuTWF0aC5pc1ZhbGlkTnVtYmVyKG4pJiZpLk1hdGguaXNWYWxpZE51bWJlcihyKSYmaS5NYXRoLmlzVmFsaWROdW1iZXIobykmJmkuTWF0aC5pc1ZhbGlkTnVtYmVyKGEpKSl0aHJvdyBuZXcgRXJyb3IoImJvdW5kcyBoYXZlIG5vdCBiZWVuIHByb3Blcmx5IHNldCIpO3RoaXMuX2JveEFyZWEuYXR0cnMoe3g6byx5Om4sd2lkdGg6YS1vLGhlaWdodDpyLW59KSx0aGlzLmNvbnRlbnQoKS5ub2RlKCkuYXBwZW5kQ2hpbGQodGhpcy5fYm94Lm5vZGUoKSl9ZWxzZSB0aGlzLl9ib3gucmVtb3ZlKCk7cmV0dXJuIHRoaXN9LHIucHJvdG90eXBlLmJveFZpc2libGU9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fYm94VmlzaWJsZToodGhpcy5fYm94VmlzaWJsZT10LHRoaXMucmVuZGVyKCksdGhpcyl9LHIucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sci5wcm90b3R5cGUuZml4ZWRIZWlnaHQ9ZnVuY3Rpb24oKXtyZXR1cm4hMH0sci5wcm90b3R5cGUueFNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX3hTY2FsZToobnVsbCE9dGhpcy5feFNjYWxlJiZ0aGlzLl94U2NhbGUub2ZmVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKSx0aGlzLl94U2NhbGU9dCx0aGlzLl94Qm91bmRzTW9kZT1lLlZBTFVFLHRoaXMuX3hTY2FsZS5vblVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayksdGhpcy5yZW5kZXIoKSx0aGlzKX0sci5wcm90b3R5cGUueVNjYWxlPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX3lTY2FsZToobnVsbCE9dGhpcy5feVNjYWxlJiZ0aGlzLl95U2NhbGUub2ZmVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKSx0aGlzLl95U2NhbGU9dCx0aGlzLl95Qm91bmRzTW9kZT1lLlZBTFVFLHRoaXMuX3lTY2FsZS5vblVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayksdGhpcy5yZW5kZXIoKSx0aGlzKX0sci5wcm90b3R5cGUueEV4dGVudD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9nZXRYRXh0ZW50KCk6KHRoaXMuX3NldFhFeHRlbnQodCksdGhpcy5feEJvdW5kc01vZGU9ZS5WQUxVRSx0aGlzLnJlbmRlcigpLHRoaXMpfSxyLnByb3RvdHlwZS5fZ2V0WEV4dGVudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl94Qm91bmRzTW9kZT09PWUuVkFMVUU/dGhpcy5feEV4dGVudDpudWxsPT10aGlzLl94U2NhbGU/W3ZvaWQgMCx2b2lkIDBdOlt0aGlzLl94U2NhbGUuaW52ZXJ0KHRoaXMuX2JveEJvdW5kcy50b3BMZWZ0LngpLHRoaXMuX3hTY2FsZS5pbnZlcnQodGhpcy5fYm94Qm91bmRzLmJvdHRvbVJpZ2h0LngpXX0sci5wcm90b3R5cGUuX3NldFhFeHRlbnQ9ZnVuY3Rpb24odCl7dGhpcy5feEV4dGVudD10fSxyLnByb3RvdHlwZS55RXh0ZW50PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2dldFlFeHRlbnQoKToodGhpcy5fc2V0WUV4dGVudCh0KSx0aGlzLl95Qm91bmRzTW9kZT1lLlZBTFVFLHRoaXMucmVuZGVyKCksdGhpcyl9LHIucHJvdG90eXBlLl9nZXRZRXh0ZW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3lCb3VuZHNNb2RlPT09ZS5WQUxVRT90aGlzLl95RXh0ZW50Om51bGw9PXRoaXMuX3lTY2FsZT9bdm9pZCAwLHZvaWQgMF06W3RoaXMuX3lTY2FsZS5pbnZlcnQodGhpcy5fYm94Qm91bmRzLnRvcExlZnQueSksdGhpcy5feVNjYWxlLmludmVydCh0aGlzLl9ib3hCb3VuZHMuYm90dG9tUmlnaHQueSldfSxyLnByb3RvdHlwZS5fc2V0WUV4dGVudD1mdW5jdGlvbih0KXt0aGlzLl95RXh0ZW50PXR9LHIucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyksbnVsbCE9dGhpcy5feFNjYWxlJiZ0aGlzLnhTY2FsZSgpLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayksbnVsbCE9dGhpcy5feVNjYWxlJiZ0aGlzLnlTY2FsZSgpLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayl9LHJ9KShyLkNvbXBvbmVudCk7dC5TZWxlY3Rpb25Cb3hMYXllcj1vfSkoJHh0KSwKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIEt4dD1CTyxaeHQ9bnh0LEp4dD1EX3QsUXh0PV9ndCx0d3Q9dHh0LGV3dD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gZS5fZGV0ZWN0aW9uUmFkaXVzPTMsZS5fcmVzaXphYmxlPSExLGUuX21vdmFibGU9ITEsZS5faGFzQ29ybmVycz0hMCxlLmFkZENsYXNzKCJkcmFnLWJveC1sYXllciIpLGUuX2RyYWdJbnRlcmFjdGlvbj1uZXcgWnh0LkRyYWcsZS5fc2V0VXBDYWxsYmFja3MoKSxlLl9kcmFnSW50ZXJhY3Rpb24uYXR0YWNoVG8oZSksZS5fZHJhZ1N0YXJ0Q2FsbGJhY2tzPW5ldyBKeHQuQ2FsbGJhY2tTZXQsZS5fZHJhZ0NhbGxiYWNrcz1uZXcgSnh0LkNhbGxiYWNrU2V0LGUuX2RyYWdFbmRDYWxsYmFja3M9bmV3IEp4dC5DYWxsYmFja1NldCxlfXJldHVybiBLeHQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuX3NldFVwQ2FsbGJhY2tzPWZ1bmN0aW9uKCl7dmFyIHQsZSxuLGkscj10aGlzLG89MCxhPTEscz0yLGw9byxjPWZ1bmN0aW9uKGMpe3Q9ci5fZ2V0UmVzaXppbmdFZGdlcyhjKTt2YXIgdT1yLmJvdW5kcygpLGg9dS50b3BMZWZ0Lng8PWMueCYmYy54PD11LmJvdHRvbVJpZ2h0LngmJnUudG9wTGVmdC55PD1jLnkmJmMueTw9dS5ib3R0b21SaWdodC55O3IuYm94VmlzaWJsZSgpJiYodC50b3B8fHQuYm90dG9tfHx0LmxlZnR8fHQucmlnaHQpP2w9YTpyLmJveFZpc2libGUoKSYmci5tb3ZhYmxlKCkmJmg/bD1zOihsPW8sci5fc2V0Qm91bmRzKHt0b3BMZWZ0OmMsYm90dG9tUmlnaHQ6Y30pLHIuX3hCb3VuZHNNb2RlPT09dHd0LlByb3BlcnR5TW9kZS5WQUxVRSYmbnVsbCE9ci54U2NhbGUoKSYmci5fc2V0WEV4dGVudChbci54U2NhbGUoKS5pbnZlcnQoYy54KSxyLnhTY2FsZSgpLmludmVydChjLngpXSksci5feUJvdW5kc01vZGU9PT10d3QuUHJvcGVydHlNb2RlLlZBTFVFJiZudWxsIT1yLnlTY2FsZSgpJiZyLl9zZXRZRXh0ZW50KFtyLnlTY2FsZSgpLmludmVydChjLnkpLHIueVNjYWxlKCkuaW52ZXJ0KGMueSldKSxyLnJlbmRlcigpKSxyLmJveFZpc2libGUoITApLHU9ci5ib3VuZHMoKSxlPXt4OnUudG9wTGVmdC54LHk6dS50b3BMZWZ0Lnl9LG49e3g6dS5ib3R0b21SaWdodC54LHk6dS5ib3R0b21SaWdodC55fSxpPWMsci5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModSl9LHU9ZnVuY3Rpb24oYyx1KXtzd2l0Y2gobCl7Y2FzZSBvOm4ueD11Lngsbi55PXUueTticmVhaztjYXNlIGE6dC5ib3R0b20/bi55PXUueTp0LnRvcCYmKGUueT11LnkpLHQucmlnaHQ/bi54PXUueDp0LmxlZnQmJihlLng9dS54KTticmVhaztjYXNlIHM6dmFyIGg9dS54LWkueCxkPXUueS1pLnk7ZS54Kz1oLGUueSs9ZCxuLngrPWgsbi55Kz1kLGk9dX1yLl9zZXRCb3VuZHMoe3RvcExlZnQ6ZSxib3R0b21SaWdodDpufSksci5feEJvdW5kc01vZGU9PT10d3QuUHJvcGVydHlNb2RlLlZBTFVFJiZudWxsIT1yLnhTY2FsZSgpJiZyLl9zZXRYRXh0ZW50KFtyLnhTY2FsZSgpLmludmVydChlLngpLHIueFNjYWxlKCkuaW52ZXJ0KG4ueCldKSxyLl95Qm91bmRzTW9kZT09PXR3dC5Qcm9wZXJ0eU1vZGUuVkFMVUUmJm51bGwhPXIueVNjYWxlKCkmJnIuX3NldFlFeHRlbnQoW3IueVNjYWxlKCkuaW52ZXJ0KGUueSksci55U2NhbGUoKS5pbnZlcnQobi55KV0pLHIucmVuZGVyKCksci5fZHJhZ0NhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHIuYm91bmRzKCkpfSxoPWZ1bmN0aW9uKHQsZSl7bD09PW8mJnQueD09PWUueCYmdC55PT09ZS55JiZyLmJveFZpc2libGUoITEpLHIuX2RyYWdFbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcyhyLmJvdW5kcygpKX07dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ1N0YXJ0KGMpLHRoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWcodSksdGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ0VuZChoKSx0aGlzLl9kaXNjb25uZWN0SW50ZXJhY3Rpb249ZnVuY3Rpb24oKXtyLl9kcmFnSW50ZXJhY3Rpb24ub2ZmRHJhZ1N0YXJ0KGMpLHIuX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnKHUpLHIuX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnRW5kKGgpLHIuX2RyYWdJbnRlcmFjdGlvbi5kZXRhY2goKX19LGUucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7dmFyIG49ZnVuY3Rpb24oKXtyZXR1cm4gZS5fYm94LmFwcGVuZCgibGluZSIpLnN0eWxlcyh7b3BhY2l0eTowLHN0cm9rZToicGluayIsInBvaW50ZXItZXZlbnRzIjoidmlzaWJsZVN0cm9rZSJ9KX07aWYodGhpcy5fZGV0ZWN0aW9uRWRnZVQ9bigpLmNsYXNzZWQoImRyYWctZWRnZS10YiIsITApLHRoaXMuX2RldGVjdGlvbkVkZ2VCPW4oKS5jbGFzc2VkKCJkcmFnLWVkZ2UtdGIiLCEwKSx0aGlzLl9kZXRlY3Rpb25FZGdlTD1uKCkuY2xhc3NlZCgiZHJhZy1lZGdlLWxyIiwhMCksdGhpcy5fZGV0ZWN0aW9uRWRnZVI9bigpLmNsYXNzZWQoImRyYWctZWRnZS1sciIsITApLHRoaXMuX2hhc0Nvcm5lcnMpe3ZhciBpPWZ1bmN0aW9uKCl7cmV0dXJuIGUuX2JveC5hcHBlbmQoImNpcmNsZSIpLnN0eWxlcyh7b3BhY2l0eTowLGZpbGw6InBpbmsiLCJwb2ludGVyLWV2ZW50cyI6InZpc2libGVGaWxsIn0pfTt0aGlzLl9kZXRlY3Rpb25Db3JuZXJUTD1pKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItdGwiLCEwKSx0aGlzLl9kZXRlY3Rpb25Db3JuZXJUUj1pKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItdHIiLCEwKSx0aGlzLl9kZXRlY3Rpb25Db3JuZXJCTD1pKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItYmwiLCEwKSx0aGlzLl9kZXRlY3Rpb25Db3JuZXJCUj1pKCkuY2xhc3NlZCgiZHJhZy1jb3JuZXItYnIiLCEwKX19LGUucHJvdG90eXBlLl9nZXRSZXNpemluZ0VkZ2VzPWZ1bmN0aW9uKHQpe3ZhciBlPXt0b3A6ITEsYm90dG9tOiExLGxlZnQ6ITEscmlnaHQ6ITF9O2lmKCF0aGlzLnJlc2l6YWJsZSgpKXJldHVybiBlO3ZhciBuPXRoaXMuYm91bmRzKCksaT1uLnRvcExlZnQueSxyPW4uYm90dG9tUmlnaHQueSxvPW4udG9wTGVmdC54LGE9bi5ib3R0b21SaWdodC54LHM9dGhpcy5fZGV0ZWN0aW9uUmFkaXVzO3JldHVybiBvLXM8PXQueCYmdC54PD1hK3MmJihlLnRvcD1pLXM8PXQueSYmdC55PD1pK3MsZS5ib3R0b209ci1zPD10LnkmJnQueTw9citzKSxpLXM8PXQueSYmdC55PD1yK3MmJihlLmxlZnQ9by1zPD10LngmJnQueDw9bytzLGUucmlnaHQ9YS1zPD10LngmJnQueDw9YStzKSxlfSxlLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe2lmKHQucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyksdGhpcy5ib3hWaXNpYmxlKCkpe3ZhciBlPXRoaXMuYm91bmRzKCksbj1lLnRvcExlZnQueSxpPWUuYm90dG9tUmlnaHQueSxyPWUudG9wTGVmdC54LG89ZS5ib3R0b21SaWdodC54O3RoaXMuX2RldGVjdGlvbkVkZ2VULmF0dHJzKHt4MTpyLHkxOm4seDI6byx5MjpuLCJzdHJva2Utd2lkdGgiOjIqdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSksdGhpcy5fZGV0ZWN0aW9uRWRnZUIuYXR0cnMoe3gxOnIseTE6aSx4MjpvLHkyOmksInN0cm9rZS13aWR0aCI6Mip0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KSx0aGlzLl9kZXRlY3Rpb25FZGdlTC5hdHRycyh7eDE6cix5MTpuLHgyOnIseTI6aSwic3Ryb2tlLXdpZHRoIjoyKnRoaXMuX2RldGVjdGlvblJhZGl1c30pLHRoaXMuX2RldGVjdGlvbkVkZ2VSLmF0dHJzKHt4MTpvLHkxOm4seDI6byx5MjppLCJzdHJva2Utd2lkdGgiOjIqdGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSksdGhpcy5faGFzQ29ybmVycyYmKHRoaXMuX2RldGVjdGlvbkNvcm5lclRMLmF0dHJzKHtjeDpyLGN5Om4scjp0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KSx0aGlzLl9kZXRlY3Rpb25Db3JuZXJUUi5hdHRycyh7Y3g6byxjeTpuLHI6dGhpcy5fZGV0ZWN0aW9uUmFkaXVzfSksdGhpcy5fZGV0ZWN0aW9uQ29ybmVyQkwuYXR0cnMoe2N4OnIsY3k6aSxyOnRoaXMuX2RldGVjdGlvblJhZGl1c30pLHRoaXMuX2RldGVjdGlvbkNvcm5lckJSLmF0dHJzKHtjeDpvLGN5Omkscjp0aGlzLl9kZXRlY3Rpb25SYWRpdXN9KSl9cmV0dXJuIHRoaXN9LGUucHJvdG90eXBlLmRldGVjdGlvblJhZGl1cz1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9kZXRlY3Rpb25SYWRpdXM7aWYodDwwKXRocm93IG5ldyBFcnJvcigiZGV0ZWN0aW9uIHJhZGl1cyBjYW5ub3QgYmUgbmVnYXRpdmUuIik7cmV0dXJuIHRoaXMuX2RldGVjdGlvblJhZGl1cz10LHRoaXMucmVuZGVyKCksdGhpc30sZS5wcm90b3R5cGUucmVzaXphYmxlPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX3Jlc2l6YWJsZToodGhpcy5fcmVzaXphYmxlPXQsdGhpcy5fc2V0UmVzaXphYmxlQ2xhc3Nlcyh0KSx0aGlzKX0sZS5wcm90b3R5cGUuX3NldFJlc2l6YWJsZUNsYXNzZXM9ZnVuY3Rpb24odCl7dCYmdGhpcy5lbmFibGVkKCk/KHRoaXMuYWRkQ2xhc3MoIngtcmVzaXphYmxlIiksdGhpcy5hZGRDbGFzcygieS1yZXNpemFibGUiKSk6KHRoaXMucmVtb3ZlQ2xhc3MoIngtcmVzaXphYmxlIiksdGhpcy5yZW1vdmVDbGFzcygieS1yZXNpemFibGUiKSl9LGUucHJvdG90eXBlLm1vdmFibGU9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fbW92YWJsZToodGhpcy5fbW92YWJsZT10LHRoaXMuX3NldE1vdmFibGVDbGFzcygpLHRoaXMpfSxlLnByb3RvdHlwZS5fc2V0TW92YWJsZUNsYXNzPWZ1bmN0aW9uKCl7dGhpcy5tb3ZhYmxlKCkmJnRoaXMuZW5hYmxlZCgpP3RoaXMuYWRkQ2xhc3MoIm1vdmFibGUiKTp0aGlzLnJlbW92ZUNsYXNzKCJtb3ZhYmxlIil9LGUucHJvdG90eXBlLm9uRHJhZ1N0YXJ0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuYWRkKHQpLHRoaXN9LGUucHJvdG90eXBlLm9mZkRyYWdTdGFydD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmRlbGV0ZSh0KSx0aGlzfSxlLnByb3RvdHlwZS5vbkRyYWc9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2RyYWdDYWxsYmFja3MuYWRkKHQpLHRoaXN9LGUucHJvdG90eXBlLm9mZkRyYWc9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2RyYWdDYWxsYmFja3MuZGVsZXRlKHQpLHRoaXN9LGUucHJvdG90eXBlLm9uRHJhZ0VuZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5hZGQodCksdGhpc30sZS5wcm90b3R5cGUub2ZmRHJhZ0VuZD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5kZWxldGUodCksdGhpc30sZS5wcm90b3R5cGUuZHJhZ0ludGVyYWN0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2RyYWdJbnRlcmFjdGlvbn0sZS5wcm90b3R5cGUuZW5hYmxlZD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9kcmFnSW50ZXJhY3Rpb24uZW5hYmxlZCgpOih0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZW5hYmxlZCh0KSx0aGlzLl9zZXRSZXNpemFibGVDbGFzc2VzKHRoaXMucmVzaXphYmxlKCkpLHRoaXMuX3NldE1vdmFibGVDbGFzcygpLHRoaXMpfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyksdGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZSh0KX0pKSx0aGlzLl9kcmFnQ2FsbGJhY2tzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZSh0KX0pKSx0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9kcmFnRW5kQ2FsbGJhY2tzLmRlbGV0ZSh0KX0pKSx0aGlzLl9kaXNjb25uZWN0SW50ZXJhY3Rpb24oKX0sZS5wcm90b3R5cGUuZGV0YWNoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX3Jlc2V0U3RhdGUoKSx0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoKCksdC5wcm90b3R5cGUuZGV0YWNoLmNhbGwodGhpcyksdGhpc30sZS5wcm90b3R5cGUuYW5jaG9yPWZ1bmN0aW9uKGUpe3JldHVybiBlPVF4dC5jb2VyY2VFeHRlcm5hbEQzKGUpLHRoaXMuX2RyYWdJbnRlcmFjdGlvbi5hdHRhY2hUbyh0aGlzKSx0LnByb3RvdHlwZS5hbmNob3IuY2FsbCh0aGlzLGUpLHRoaXN9LGUucHJvdG90eXBlLl9yZXNldFN0YXRlPWZ1bmN0aW9uKCl7dGhpcy5ib3VuZHMoe3RvcExlZnQ6e3g6MCx5OjB9LGJvdHRvbVJpZ2h0Ont4OjAseTowfX0pfSxlfSkoJHh0LlNlbGVjdGlvbkJveExheWVyKTtleHQuRHJhZ0JveExheWVyPWV3dDt2YXIgbnd0PXt9LGl3dD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KGl3dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHJ3dCxvd3Q9Qk8sYXd0PURfdCxzd3Q9T190OyEoZnVuY3Rpb24odCl7dFt0LlZBTFVFPTBdPSJWQUxVRSIsdFt0LlBJWEVMPTFdPSJQSVhFTCJ9KShyd3R8fChyd3Q9e30pKTt2YXIgbHd0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKG4pe3ZhciBpPXQuY2FsbCh0aGlzKXx8dGhpcztpZihpLl9tb2RlPXJ3dC5WQUxVRSxuIT09ZS5PUklFTlRBVElPTl9WRVJUSUNBTCYmbiE9PWUuT1JJRU5UQVRJT05fSE9SSVpPTlRBTCl0aHJvdyBuZXcgRXJyb3IobisiIGlzIG5vdCBhIHZhbGlkIG9yaWVudGF0aW9uIGZvciBHdWlkZUxpbmVMYXllciIpO3JldHVybiBpLl9vcmllbnRhdGlvbj1uLGkuX292ZXJmbG93SGlkZGVuPSEwLGkuYWRkQ2xhc3MoImd1aWRlLWxpbmUtbGF5ZXIiKSxpLl9pc1ZlcnRpY2FsKCk/aS5hZGRDbGFzcygidmVydGljYWwiKTppLmFkZENsYXNzKCJob3Jpem9udGFsIiksaS5fc2NhbGVVcGRhdGVDYWxsYmFjaz1mdW5jdGlvbigpe2kuX3N5bmNQaXhlbFBvc2l0aW9uQW5kVmFsdWUoKSxpLnJlbmRlcigpfSxpfXJldHVybiBvd3QuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyksdGhpcy5fZ3VpZGVMaW5lPXRoaXMuY29udGVudCgpLmFwcGVuZCgibGluZSIpLmNsYXNzZWQoImd1aWRlLWxpbmUiLCEwKX0sZS5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm57d2lkdGg6dCxoZWlnaHQ6ZX19LGUucHJvdG90eXBlLl9pc1ZlcnRpY2FsPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX29yaWVudGF0aW9uPT09ZS5PUklFTlRBVElPTl9WRVJUSUNBTH0sZS5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiEwfSxlLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiEwfSxlLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKGUsbixpKXtyZXR1cm4gdC5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsZSxuLGkpLG51bGwhPXRoaXMuc2NhbGUoKSYmKHRoaXMuX2lzVmVydGljYWwoKT90aGlzLnNjYWxlKCkucmFuZ2UoWzAsdGhpcy53aWR0aCgpXSk6dGhpcy5zY2FsZSgpLnJhbmdlKFt0aGlzLmhlaWdodCgpLDBdKSksdGhpc30sZS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtyZXR1cm4gdC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKSx0aGlzLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlKCksdGhpcy5fZ3VpZGVMaW5lLmF0dHJzKHt4MTp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5waXhlbFBvc2l0aW9uKCk6MCx5MTp0aGlzLl9pc1ZlcnRpY2FsKCk/MDp0aGlzLnBpeGVsUG9zaXRpb24oKSx4Mjp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5waXhlbFBvc2l0aW9uKCk6dGhpcy53aWR0aCgpLHkyOnRoaXMuX2lzVmVydGljYWwoKT90aGlzLmhlaWdodCgpOnRoaXMucGl4ZWxQb3NpdGlvbigpfSksdGhpc30sZS5wcm90b3R5cGUuX3N5bmNQaXhlbFBvc2l0aW9uQW5kVmFsdWU9ZnVuY3Rpb24oKXtudWxsIT10aGlzLnNjYWxlKCkmJih0aGlzLl9tb2RlPT09cnd0LlZBTFVFJiZudWxsIT10aGlzLnZhbHVlKCk/dGhpcy5fcGl4ZWxQb3NpdGlvbj10aGlzLnNjYWxlKCkuc2NhbGUodGhpcy52YWx1ZSgpKTp0aGlzLl9tb2RlPT09cnd0LlBJWEVMJiZudWxsIT10aGlzLnBpeGVsUG9zaXRpb24oKSYmKHRoaXMuX3ZhbHVlPXRoaXMuc2NhbGUoKS5pbnZlcnQodGhpcy5waXhlbFBvc2l0aW9uKCkpKSl9LGUucHJvdG90eXBlLl9zZXRQaXhlbFBvc2l0aW9uV2l0aG91dENoYW5naW5nTW9kZT1mdW5jdGlvbih0KXt0aGlzLl9waXhlbFBvc2l0aW9uPXQsbnVsbCE9dGhpcy5zY2FsZSgpJiYodGhpcy5fdmFsdWU9dGhpcy5zY2FsZSgpLmludmVydCh0aGlzLnBpeGVsUG9zaXRpb24oKSkpLHRoaXMucmVuZGVyKCl9LGUucHJvdG90eXBlLnNjYWxlPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX3NjYWxlO3ZhciBlPXRoaXMuX3NjYWxlO3JldHVybiBudWxsIT1lJiZlLm9mZlVwZGF0ZSh0aGlzLl9zY2FsZVVwZGF0ZUNhbGxiYWNrKSx0aGlzLl9zY2FsZT10LHRoaXMuX3NjYWxlLm9uVXBkYXRlKHRoaXMuX3NjYWxlVXBkYXRlQ2FsbGJhY2spLHRoaXMuX3N5bmNQaXhlbFBvc2l0aW9uQW5kVmFsdWUoKSx0aGlzLnJlZHJhdygpLHRoaXN9LGUucHJvdG90eXBlLnZhbHVlPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX3ZhbHVlOih0aGlzLl92YWx1ZT10LHRoaXMuX21vZGU9cnd0LlZBTFVFLHRoaXMuX3N5bmNQaXhlbFBvc2l0aW9uQW5kVmFsdWUoKSx0aGlzLnJlbmRlcigpLHRoaXMpfSxlLnByb3RvdHlwZS5waXhlbFBvc2l0aW9uPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX3BpeGVsUG9zaXRpb247aWYoIWF3dC5NYXRoLmlzVmFsaWROdW1iZXIodCkpdGhyb3cgbmV3IEVycm9yKCJwaXhlbFBvc2l0aW9uIG11c3QgYmUgYSBmaW5pdGUgbnVtYmVyIik7cmV0dXJuIHRoaXMuX3BpeGVsUG9zaXRpb249dCx0aGlzLl9tb2RlPXJ3dC5QSVhFTCx0aGlzLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlKCksdGhpcy5yZW5kZXIoKSx0aGlzfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpLG51bGwhPXRoaXMuc2NhbGUoKSYmdGhpcy5zY2FsZSgpLm9mZlVwZGF0ZSh0aGlzLl9zY2FsZVVwZGF0ZUNhbGxiYWNrKX0sZS5PUklFTlRBVElPTl9WRVJUSUNBTD0idmVydGljYWwiLGUuT1JJRU5UQVRJT05fSE9SSVpPTlRBTD0iaG9yaXpvbnRhbCIsZX0pKHN3dC5Db21wb25lbnQpO2l3dC5HdWlkZUxpbmVMYXllcj1sd3QsCi8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShud3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBjd3Q9Qk8sdXd0PW54dCxod3Q9RF90LGR3dD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgbj10LmNhbGwodGhpcyxlKXx8dGhpcztuLl9kZXRlY3Rpb25SYWRpdXM9MyxuLl9lbmFibGVkPSEwLG4uYWRkQ2xhc3MoImRyYWctbGluZS1sYXllciIpLG4uYWRkQ2xhc3MoImVuYWJsZWQiKSxuLl9kcmFnSW50ZXJhY3Rpb249bmV3IHV3dC5EcmFnLG4uX2RyYWdJbnRlcmFjdGlvbi5hdHRhY2hUbyhuKTt2YXIgaT0hMSxyPWZ1bmN0aW9uKHQpeyhmdW5jdGlvbih0KXtyZXR1cm4gbi5faXNWZXJ0aWNhbCgpJiZuLnBpeGVsUG9zaXRpb24oKS1uLmRldGVjdGlvblJhZGl1cygpPD10LngmJnQueDw9bi5waXhlbFBvc2l0aW9uKCkrbi5kZXRlY3Rpb25SYWRpdXMoKXx8IW4uX2lzVmVydGljYWwoKSYmbi5waXhlbFBvc2l0aW9uKCktbi5kZXRlY3Rpb25SYWRpdXMoKTw9dC55JiZ0Lnk8PW4ucGl4ZWxQb3NpdGlvbigpK24uZGV0ZWN0aW9uUmFkaXVzKCl9KSh0KSYmKGk9ITAsbi5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmNhbGxDYWxsYmFja3MobikpfTtuLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnU3RhcnQocik7dmFyIG89ZnVuY3Rpb24odCxlKXtpJiYobi5fc2V0UGl4ZWxQb3NpdGlvbldpdGhvdXRDaGFuZ2luZ01vZGUobi5faXNWZXJ0aWNhbCgpP2UueDplLnkpLG4uX2RyYWdDYWxsYmFja3MuY2FsbENhbGxiYWNrcyhuKSl9O24uX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWcobyk7dmFyIGE9ZnVuY3Rpb24odCxlKXtpJiYoaT0hMSxuLl9kcmFnRW5kQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MobikpfTtyZXR1cm4gbi5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ0VuZChhKSxuLl9kaXNjb25uZWN0SW50ZXJhY3Rpb249ZnVuY3Rpb24oKXtuLl9kcmFnSW50ZXJhY3Rpb24ub2ZmRHJhZ1N0YXJ0KHIpLG4uX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnKG8pLG4uX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnRW5kKGEpLG4uX2RyYWdJbnRlcmFjdGlvbi5kZXRhY2goKX0sbi5fZHJhZ1N0YXJ0Q2FsbGJhY2tzPW5ldyBod3QuQ2FsbGJhY2tTZXQsbi5fZHJhZ0NhbGxiYWNrcz1uZXcgaHd0LkNhbGxiYWNrU2V0LG4uX2RyYWdFbmRDYWxsYmFja3M9bmV3IGh3dC5DYWxsYmFja1NldCxufXJldHVybiBjd3QuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7dC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyksdGhpcy5fZGV0ZWN0aW9uRWRnZT10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImxpbmUiKS5zdHlsZXMoe29wYWNpdHk6MCxzdHJva2U6InBpbmsiLCJwb2ludGVyLWV2ZW50cyI6InZpc2libGVTdHJva2UifSkuY2xhc3NlZCgiZHJhZy1lZGdlIiwhMCl9LGUucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5PWZ1bmN0aW9uKCl7cmV0dXJuIHQucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyksdGhpcy5fZGV0ZWN0aW9uRWRnZS5hdHRycyh7eDE6dGhpcy5faXNWZXJ0aWNhbCgpP3RoaXMucGl4ZWxQb3NpdGlvbigpOjAseTE6dGhpcy5faXNWZXJ0aWNhbCgpPzA6dGhpcy5waXhlbFBvc2l0aW9uKCkseDI6dGhpcy5faXNWZXJ0aWNhbCgpP3RoaXMucGl4ZWxQb3NpdGlvbigpOnRoaXMud2lkdGgoKSx5Mjp0aGlzLl9pc1ZlcnRpY2FsKCk/dGhpcy5oZWlnaHQoKTp0aGlzLnBpeGVsUG9zaXRpb24oKSwic3Ryb2tlLXdpZHRoIjoyKnRoaXMuX2RldGVjdGlvblJhZGl1c30pLHRoaXN9LGUucHJvdG90eXBlLmRldGVjdGlvblJhZGl1cz1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9kZXRlY3Rpb25SYWRpdXM7aWYodDwwKXRocm93IG5ldyBFcnJvcigiZGV0ZWN0aW9uIHJhZGl1cyBjYW5ub3QgYmUgbmVnYXRpdmUuIik7cmV0dXJuIHRoaXMuX2RldGVjdGlvblJhZGl1cz10LHRoaXMucmVuZGVyKCksdGhpc30sZS5wcm90b3R5cGUuZW5hYmxlZD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9lbmFibGVkOih0aGlzLl9lbmFibGVkPXQsdD90aGlzLmFkZENsYXNzKCJlbmFibGVkIik6dGhpcy5yZW1vdmVDbGFzcygiZW5hYmxlZCIpLHRoaXMuX2RyYWdJbnRlcmFjdGlvbi5lbmFibGVkKHQpLHRoaXMpfSxlLnByb3RvdHlwZS5vbkRyYWdTdGFydD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmFkZCh0KSx0aGlzfSxlLnByb3RvdHlwZS5vZmZEcmFnU3RhcnQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5kZWxldGUodCksdGhpc30sZS5wcm90b3R5cGUub25EcmFnPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kcmFnQ2FsbGJhY2tzLmFkZCh0KSx0aGlzfSxlLnByb3RvdHlwZS5vZmZEcmFnPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZSh0KSx0aGlzfSxlLnByb3RvdHlwZS5vbkRyYWdFbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2RyYWdFbmRDYWxsYmFja3MuYWRkKHQpLHRoaXN9LGUucHJvdG90eXBlLm9mZkRyYWdFbmQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX2RyYWdFbmRDYWxsYmFja3MuZGVsZXRlKHQpLHRoaXN9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3QucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKSx0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIGUuX2RyYWdTdGFydENhbGxiYWNrcy5kZWxldGUodCl9KSksdGhpcy5fZHJhZ0NhbGxiYWNrcy5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gZS5fZHJhZ0NhbGxiYWNrcy5kZWxldGUodCl9KSksdGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gZS5fZHJhZ0VuZENhbGxiYWNrcy5kZWxldGUodCl9KSksdGhpcy5fZGlzY29ubmVjdEludGVyYWN0aW9uKCl9LGV9KShpd3QuR3VpZGVMaW5lTGF5ZXIpO253dC5EcmFnTGluZUxheWVyPWR3dDt2YXIgcHd0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShwd3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBmd3Q9Qk87ZnVuY3Rpb24gbXd0KHQsZSxuKXt2YXIgaT17fTtpZih2b2lkIDAhPT1uKWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKXtpW25bcl1dPW5bci0xXX1yZXR1cm4gZnVuY3Rpb24obil7dmFyIHIsbz10LnNjYWxlKG4pO2lmKCFlKXJldHVybiBvO3ZhciBhPXZvaWQgMD09PWlbbl0/dm9pZCAwOnQuc2NhbGUoaVtuXSk7cmV0dXJuIHZvaWQgMCE9PWEmJihyPWErKG8tYSkvMikscn19dmFyIGd3dD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlLG4pe3ZhciBpPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gaS5hZGRDbGFzcygiZ3JpZGxpbmVzIiksaS5feFNjYWxlPWUsaS5feVNjYWxlPW4saS5fcmVuZGVyQ2FsbGJhY2s9ZnVuY3Rpb24odCl7cmV0dXJuIGkucmVuZGVyKCl9LGkuX3hTY2FsZSYmaS5feFNjYWxlLm9uVXBkYXRlKGkuX3JlbmRlckNhbGxiYWNrKSxpLl95U2NhbGUmJmkuX3lTY2FsZS5vblVwZGF0ZShpLl9yZW5kZXJDYWxsYmFjayksaX1yZXR1cm4gZnd0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLmJldHdlZW5YPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10P3RoaXMuX2JldHdlZW5YOih0IT09dGhpcy5fYmV0d2VlblgmJih0aGlzLl9iZXR3ZWVuWD10LHRoaXMucmVuZGVyKCkpLHRoaXMpfSxlLnByb3RvdHlwZS5iZXR3ZWVuWT1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dD90aGlzLl9iZXR3ZWVuWToodCE9PXRoaXMuX2JldHdlZW5ZJiYodGhpcy5fYmV0d2Vlblk9dCx0aGlzLnJlbmRlcigpKSx0aGlzKX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3JldHVybiB0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyksdGhpcy5feFNjYWxlJiZ0aGlzLl94U2NhbGUub2ZmVXBkYXRlKHRoaXMuX3JlbmRlckNhbGxiYWNrKSx0aGlzLl95U2NhbGUmJnRoaXMuX3lTY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVuZGVyQ2FsbGJhY2spLHRoaXN9LGUucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3QucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpLHRoaXMuX3hMaW5lc0NvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJ4LWdyaWRsaW5lcyIsITApLHRoaXMuX3lMaW5lc0NvbnRhaW5lcj10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJ5LWdyaWRsaW5lcyIsITApfSxlLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3JldHVybiB0LnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpLHRoaXMuX3JlZHJhd1hMaW5lcygpLHRoaXMuX3JlZHJhd1lMaW5lcygpLHRoaXN9LGUucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24oZSxuLGkpe3JldHVybiB0LnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxlLG4saSksbnVsbCE9dGhpcy5feFNjYWxlJiZ0aGlzLl94U2NhbGUucmFuZ2UoWzAsdGhpcy53aWR0aCgpXSksbnVsbCE9dGhpcy5feVNjYWxlJiZ0aGlzLl95U2NhbGUucmFuZ2UoW3RoaXMuaGVpZ2h0KCksMF0pLHRoaXN9LGUucHJvdG90eXBlLl9yZWRyYXdYTGluZXM9ZnVuY3Rpb24oKXtpZih0aGlzLl94U2NhbGUpe3ZhciB0PXRoaXMuYmV0d2VlblgoKSxlPXRoaXMuX3hTY2FsZS50aWNrcygpLnNsaWNlKHQ/MTowKSxuPXRoaXMuX3hMaW5lc0NvbnRhaW5lci5zZWxlY3RBbGwoImxpbmUiKS5kYXRhKGUpO24uZW50ZXIoKS5hcHBlbmQoImxpbmUiKS5tZXJnZShuKS5hdHRyKCJ4MSIsbXd0KHRoaXMuX3hTY2FsZSx0LHRoaXMuX3hTY2FsZS50aWNrcygpKSkuYXR0cigieTEiLDApLmF0dHIoIngyIixtd3QodGhpcy5feFNjYWxlLHQsdGhpcy5feFNjYWxlLnRpY2tzKCkpKS5hdHRyKCJ5MiIsdGhpcy5oZWlnaHQoKSkuY2xhc3NlZCgiYmV0d2VlbmxpbmUiLHQpLmNsYXNzZWQoInplcm9saW5lIiwoZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10fSkpLG4uZXhpdCgpLnJlbW92ZSgpfX0sZS5wcm90b3R5cGUuX3JlZHJhd1lMaW5lcz1mdW5jdGlvbigpe2lmKHRoaXMuX3lTY2FsZSl7dmFyIHQ9dGhpcy5iZXR3ZWVuWSgpLGU9dGhpcy5feVNjYWxlLnRpY2tzKCkuc2xpY2UodD8xOjApLG49dGhpcy5feUxpbmVzQ29udGFpbmVyLnNlbGVjdEFsbCgibGluZSIpLmRhdGEoZSk7bi5lbnRlcigpLmFwcGVuZCgibGluZSIpLm1lcmdlKG4pLmF0dHIoIngxIiwwKS5hdHRyKCJ5MSIsbXd0KHRoaXMuX3lTY2FsZSx0LHRoaXMuX3lTY2FsZS50aWNrcygpKSkuYXR0cigieDIiLHRoaXMud2lkdGgoKSkuYXR0cigieTIiLG13dCh0aGlzLl95U2NhbGUsdCx0aGlzLl95U2NhbGUudGlja3MoKSkpLmNsYXNzZWQoImJldHdlZW5saW5lIix0KS5jbGFzc2VkKCJ6ZXJvbGluZSIsKGZ1bmN0aW9uKHQpe3JldHVybiAwPT09dH0pKSxuLmV4aXQoKS5yZW1vdmUoKX19LGV9KShPX3QuQ29tcG9uZW50KTtwd3QuR3JpZGxpbmVzPWd3dDt2YXIgX3d0PXt9LHl3dD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KHl3dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHZ3dD1CTyxid3Q9X2d0LHh3dD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gZS5fZGV0YWNoQ2FsbGJhY2s9ZnVuY3Rpb24odCl7cmV0dXJuIGUucmVtb3ZlKHQpfSxlfXJldHVybiB2d3QuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuYW5jaG9yPWZ1bmN0aW9uKGUpe3ZhciBuPXRoaXM7cmV0dXJuIGU9Ynd0LmNvZXJjZUV4dGVybmFsRDMoZSksdC5wcm90b3R5cGUuYW5jaG9yLmNhbGwodGhpcyxlKSx0aGlzLl9mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gdC5hbmNob3Iobi5lbGVtZW50KCkpfSkpLHRoaXN9LGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gdC5yZW5kZXIoKX0pKSx0aGlzfSxlLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJoYXMoKSBpcyBub3QgaW1wbGVtZW50ZWQgb24gQ29tcG9uZW50Q29udGFpbmVyIil9LGUucHJvdG90eXBlLl9hZG9wdEFuZEFuY2hvcj1mdW5jdGlvbih0KXt0LnBhcmVudCh0aGlzKSx0Lm9uRGV0YWNoKHRoaXMuX2RldGFjaENhbGxiYWNrKSx0aGlzLl9pc0FuY2hvcmVkJiZ0LmFuY2hvcih0aGlzLmVsZW1lbnQoKSl9LGUucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5oYXModCkmJih0Lm9mZkRldGFjaCh0aGlzLl9kZXRhY2hDYWxsYmFjayksdGhpcy5fcmVtb3ZlKHQpLHQuZGV0YWNoKCksdGhpcy5yZWRyYXcoKSksdGhpc30sZS5wcm90b3R5cGUuX3JlbW92ZT1mdW5jdGlvbih0KXtyZXR1cm4hMX0sZS5wcm90b3R5cGUuX2ZvckVhY2g9ZnVuY3Rpb24odCl7dGhyb3cgbmV3IEVycm9yKCJfZm9yRWFjaCgpIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiBDb21wb25lbnRDb250YWluZXIiKX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3QucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKSx0aGlzLl9mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gdC5kZXN0cm95KCl9KSl9LGUucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZT1mdW5jdGlvbigpe3RoaXMuX2ZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiB0LmludmFsaWRhdGVDYWNoZSgpfSkpfSxlfSkoT190LkNvbXBvbmVudCk7eXd0LkNvbXBvbmVudENvbnRhaW5lcj14d3QsCi8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShfd3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciB3d3Q9Qk8sU3d0PURfdCxNd3Q9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dm9pZCAwPT09ZSYmKGU9W10pO3ZhciBuPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gbi5fY29tcG9uZW50cz1bXSxuLmFkZENsYXNzKCJjb21wb25lbnQtZ3JvdXAiKSxlLmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBuLmFwcGVuZCh0KX0pKSxufXJldHVybiB3d3QuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuX2ZvckVhY2g9ZnVuY3Rpb24odCl7dGhpcy5jb21wb25lbnRzKCkuZm9yRWFjaCh0KX0sZS5wcm90b3R5cGUuaGFzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jb21wb25lbnRzLmluZGV4T2YodCk+PTB9LGUucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fY29tcG9uZW50cy5tYXAoKGZ1bmN0aW9uKG4pe3JldHVybiBuLnJlcXVlc3RlZFNwYWNlKHQsZSl9KSk7cmV0dXJue21pbldpZHRoOlN3dC5NYXRoLm1heChuLChmdW5jdGlvbih0KXtyZXR1cm4gdC5taW5XaWR0aH0pLDApLG1pbkhlaWdodDpTd3QuTWF0aC5tYXgobiwoZnVuY3Rpb24odCl7cmV0dXJuIHQubWluSGVpZ2h0fSksMCl9fSxlLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKGUsbixpKXt2YXIgcj10aGlzO3JldHVybiB0LnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxlLG4saSksdGhpcy5fZm9yRWFjaCgoZnVuY3Rpb24odCl7dC5jb21wdXRlTGF5b3V0KHt4OjAseTowfSxyLndpZHRoKCksci5oZWlnaHQoKSl9KSksdGhpc30sZS5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm57d2lkdGg6dCxoZWlnaHQ6ZX19LGUucHJvdG90eXBlLmZpeGVkV2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY29tcG9uZW50cy5ldmVyeSgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZml4ZWRXaWR0aCgpfSkpfSxlLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jb21wb25lbnRzLmV2ZXJ5KChmdW5jdGlvbih0KXtyZXR1cm4gdC5maXhlZEhlaWdodCgpfSkpfSxlLnByb3RvdHlwZS5jb21wb25lbnRzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2NvbXBvbmVudHMuc2xpY2UoKX0sZS5wcm90b3R5cGUuYXBwZW5kPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10fHx0aGlzLmhhcyh0KXx8KHQuZGV0YWNoKCksdGhpcy5fY29tcG9uZW50cy5wdXNoKHQpLHRoaXMuX2Fkb3B0QW5kQW5jaG9yKHQpLHRoaXMucmVkcmF3KCkpLHRoaXN9LGUucHJvdG90eXBlLl9yZW1vdmU9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fY29tcG9uZW50cy5pbmRleE9mKHQpO3JldHVybiBlPj0wJiYodGhpcy5fY29tcG9uZW50cy5zcGxpY2UoZSwxKSwhMCl9LGV9KSh5d3QuQ29tcG9uZW50Q29udGFpbmVyKTtfd3QuR3JvdXA9TXd0O3ZhciBFd3Q9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KEV3dCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIFR3dD1CTyxDd3Q9TGd0LEF3dD1DeXQsa3d0PXB2dCxMd3Q9RF90LFB3dD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgbj10LmNhbGwodGhpcyl8fHRoaXM7aWYobi5fdGV4dFBhZGRpbmc9NSxudWxsPT1lKXRocm93IG5ldyBFcnJvcigiSW50ZXJwb2xhdGVkQ29sb3JMZWdlbmQgcmVxdWlyZXMgYSBpbnRlcnBvbGF0ZWRDb2xvclNjYWxlIik7cmV0dXJuIG4uX3NjYWxlPWUsbi5fcmVkcmF3Q2FsbGJhY2s9ZnVuY3Rpb24odCl7cmV0dXJuIG4ucmVkcmF3KCl9LG4uX3NjYWxlLm9uVXBkYXRlKG4uX3JlZHJhd0NhbGxiYWNrKSxuLl9mb3JtYXR0ZXI9a3d0LmdlbmVyYWwoKSxuLl9vcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIsbi5fZXhwYW5kcz0hMSxuLmFkZENsYXNzKCJsZWdlbmQiKSxuLmFkZENsYXNzKCJpbnRlcnBvbGF0ZWQtY29sb3ItbGVnZW5kIiksbn1yZXR1cm4gVHd0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyksdGhpcy5fc2NhbGUub2ZmVXBkYXRlKHRoaXMuX3JlZHJhd0NhbGxiYWNrKX0sZS5wcm90b3R5cGUuZm9ybWF0dGVyPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10P3RoaXMuX2Zvcm1hdHRlcjoodGhpcy5fZm9ybWF0dGVyPXQsdGhpcy5yZWRyYXcoKSx0aGlzKX0sZS5wcm90b3R5cGUuZXhwYW5kcz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9leHBhbmRzOih0aGlzLl9leHBhbmRzPXQsdGhpcy5yZWRyYXcoKSx0aGlzKX0sZS5fZW5zdXJlT3JpZW50YXRpb249ZnVuY3Rpb24odCl7aWYoImhvcml6b250YWwiPT09KHQ9dC50b0xvd2VyQ2FzZSgpKXx8ImxlZnQiPT09dHx8InJpZ2h0Ij09PXQpcmV0dXJuIHQ7dGhyb3cgbmV3IEVycm9yKCciJyt0KyciIGlzIG5vdCBhIHZhbGlkIG9yaWVudGF0aW9uIGZvciBJbnRlcnBvbGF0ZWRDb2xvckxlZ2VuZCcpfSxlLnByb3RvdHlwZS5vcmllbnRhdGlvbj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9vcmllbnRhdGlvbjoodGhpcy5fb3JpZW50YXRpb249ZS5fZW5zdXJlT3JpZW50YXRpb24odCksdGhpcy5yZWRyYXcoKSx0aGlzKX0sZS5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiF0aGlzLmV4cGFuZHMoKXx8dGhpcy5faXNWZXJ0aWNhbCgpfSxlLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiF0aGlzLmV4cGFuZHMoKXx8IXRoaXMuX2lzVmVydGljYWwoKX0sZS5wcm90b3R5cGUuX2dlbmVyYXRlVGlja3M9ZnVuY3Rpb24odCl7dm9pZCAwPT09dCYmKHQ9ZS5fREVGQVVMVF9OVU1fU1dBVENIRVMpO3ZhciBuPXRoaXMuX3NjYWxlLmRvbWFpbigpO2lmKDE9PT10KXJldHVybltuWzBdXTtmb3IodmFyIGk9KG5bMV0tblswXSkvKHQtMSkscj1bXSxvPTA7bzx0O28rKylyLnB1c2goblswXStpKm8pO3JldHVybiByfSxlLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKSx0aGlzLl9zd2F0Y2hDb250YWluZXI9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCgic3dhdGNoLWNvbnRhaW5lciIsITApLHRoaXMuX3N3YXRjaEJvdW5kaW5nQm94PXRoaXMuY29udGVudCgpLmFwcGVuZCgicmVjdCIpLmNsYXNzZWQoInN3YXRjaC1ib3VuZGluZy1ib3giLCEwKSx0aGlzLl9sb3dlckxhYmVsPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoZS5MRUdFTkRfTEFCRUxfQ0xBU1MsITApLHRoaXMuX3VwcGVyTGFiZWw9dGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZChlLkxFR0VORF9MQUJFTF9DTEFTUywhMCk7dmFyIG49bmV3IEN3dC5TdmdDb250ZXh0KHRoaXMuY29udGVudCgpLm5vZGUoKSk7dGhpcy5fbWVhc3VyZXI9bmV3IEN3dC5NZWFzdXJlcihuKSx0aGlzLl93cmFwcGVyPW5ldyBDd3QuV3JhcHBlcix0aGlzLl93cml0ZXI9bmV3IEN3dC5Xcml0ZXIodGhpcy5fbWVhc3VyZXIsbix0aGlzLl93cmFwcGVyKX0sZS5wcm90b3R5cGUucmVxdWVzdGVkU3BhY2U9ZnVuY3Rpb24odCxuKXt2YXIgaSxyLG89dGhpcyxhPXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQscz1hLGw9dGhpcy5fc2NhbGUuZG9tYWluKCkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gby5fbWVhc3VyZXIubWVhc3VyZShvLl9mb3JtYXR0ZXIodCkpLndpZHRofSkpLGM9ZS5fREVGQVVMVF9OVU1fU1dBVENIRVM7aWYodGhpcy5faXNWZXJ0aWNhbCgpKXt2YXIgdT1Md3QuTWF0aC5tYXgobCwwKTtyPXMrYSt0aGlzLl90ZXh0UGFkZGluZyt1K3RoaXMuX3RleHRQYWRkaW5nLGk9YyphfWVsc2UgaT1zK2ErcyxyPXRoaXMuX3RleHRQYWRkaW5nK2xbMF0rYyphK2xbMV0rdGhpcy5fdGV4dFBhZGRpbmc7cmV0dXJue21pbldpZHRoOnIsbWluSGVpZ2h0Oml9fSxlLnByb3RvdHlwZS5faXNWZXJ0aWNhbD1mdW5jdGlvbigpe3JldHVybiJob3Jpem9udGFsIiE9PXRoaXMuX29yaWVudGF0aW9ufSxlLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTt2YXIgbixpLHIsbyxhLHMsbD10aGlzLl9zY2FsZS5kb21haW4oKSxjPXRoaXMuX2Zvcm1hdHRlcihsWzBdKSx1PXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoYykud2lkdGgsaD10aGlzLl9mb3JtYXR0ZXIobFsxXSksZD10aGlzLl9tZWFzdXJlci5tZWFzdXJlKGgpLndpZHRoLHA9dGhpcy5fbWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodCxmPXRoaXMuX3RleHRQYWRkaW5nLG09e3g6MCx5OjB9LGc9e3g6MCx5OjB9LF89e3hBbGlnbjoiY2VudGVyIix5QWxpZ246ImNlbnRlciIsdGV4dFJvdGF0aW9uOjB9LHk9e3hBbGlnbjoiY2VudGVyIix5QWxpZ246ImNlbnRlciIsdGV4dFJvdGF0aW9uOjB9LHY9e3g6MCx5OjAsd2lkdGg6MCxoZWlnaHQ6MH07aWYodGhpcy5faXNWZXJ0aWNhbCgpKXtzPU1hdGguZmxvb3IodGhpcy5oZWlnaHQoKSk7dmFyIGI9TWF0aC5tYXgodSxkKTthPSh0aGlzLndpZHRoKCktYi0yKnRoaXMuX3RleHRQYWRkaW5nKS8yLG49TWF0aC5tYXgodGhpcy53aWR0aCgpLWEtMipmLWIsMCksaT0xLG89ZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5oZWlnaHQoKS0obisxKX0seS55QWxpZ249InRvcCIsbS55PTAsXy55QWxpZ249ImJvdHRvbSIsZy55PTAsImxlZnQiPT09dGhpcy5fb3JpZW50YXRpb24/KHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZitiK2Z9LHkueEFsaWduPSJyaWdodCIsbS54PS0oYStuK2YpLF8ueEFsaWduPSJyaWdodCIsZy54PS0oYStuK2YpKToocj1mdW5jdGlvbih0LGUpe3JldHVybiBhfSx5LnhBbGlnbj0ibGVmdCIsbS54PWErbitmLF8ueEFsaWduPSJsZWZ0IixnLng9YStuK2YpLHYud2lkdGg9bix2LmhlaWdodD1zKml9ZWxzZSBhPU1hdGgubWF4KGYsKHRoaXMuaGVpZ2h0KCktcCkvMikscz1NYXRoLm1heChNYXRoLmZsb29yKHRoaXMud2lkdGgoKS00KmYtdS1kKSwwKSxuPTEsaT1NYXRoLm1heCh0aGlzLmhlaWdodCgpLTIqYSwwKSxyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGguZmxvb3IodSsyKmYpK2V9LG89ZnVuY3Rpb24odCxlKXtyZXR1cm4gYX0seS54QWxpZ249InJpZ2h0IixtLng9LWYsXy54QWxpZ249ImxlZnQiLGcueD1mLHYueT1hLHYud2lkdGg9cypuLHYuaGVpZ2h0PWk7di54PXIobnVsbCwwKSx0aGlzLl91cHBlckxhYmVsLnRleHQoIiIpLHRoaXMuX3dyaXRlci53cml0ZShoLHRoaXMud2lkdGgoKSx0aGlzLmhlaWdodCgpLHksdGhpcy5fdXBwZXJMYWJlbC5ub2RlKCkpLHRoaXMuX3VwcGVyTGFiZWwuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrbS54KyIsICIrbS55KyIpIiksdGhpcy5fbG93ZXJMYWJlbC50ZXh0KCIiKSx0aGlzLl93cml0ZXIud3JpdGUoYyx0aGlzLndpZHRoKCksdGhpcy5oZWlnaHQoKSxfLHRoaXMuX2xvd2VyTGFiZWwubm9kZSgpKSx0aGlzLl9sb3dlckxhYmVsLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK2cueCsiLCAiK2cueSsiKSIpLHRoaXMuX3N3YXRjaEJvdW5kaW5nQm94LmF0dHJzKHYpO3ZhciB4PXRoaXMuX2dlbmVyYXRlVGlja3Mocyksdz10aGlzLl9zd2F0Y2hDb250YWluZXIuc2VsZWN0QWxsKCJyZWN0LnN3YXRjaCIpLmRhdGEoeCksUz13LmVudGVyKCkuYXBwZW5kKCJyZWN0IikuY2xhc3NlZCgic3dhdGNoIiwhMCksTT13Lm1lcmdlKFMpO3JldHVybiB3LmV4aXQoKS5yZW1vdmUoKSxNLmF0dHJzKHtmaWxsOmZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuX3NjYWxlLnNjYWxlKHQpfSx3aWR0aDpuLGhlaWdodDppLHg6cix5Om8sInNoYXBlLXJlbmRlcmluZyI6ImNyaXNwRWRnZXMifSksQXd0LkFERF9USVRMRV9FTEVNRU5UUyYmUy5hcHBlbmQoInRpdGxlIikudGV4dCgoZnVuY3Rpb24odCl7cmV0dXJuIGUuX2Zvcm1hdHRlcih0KX0pKSx0aGlzfSxlLl9ERUZBVUxUX05VTV9TV0FUQ0hFUz0xMSxlLkxFR0VORF9MQUJFTF9DTEFTUz0ibGVnZW5kLWxhYmVsIixlfSkoT190LkNvbXBvbmVudCk7RXd0LkludGVycG9sYXRlZENvbG9yTGVnZW5kPVB3dDt2YXIgTnd0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShOd3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBJd3Q9Qk8sUnd0PUxndCxPd3Q9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSxuKXt2b2lkIDA9PT1lJiYoZT0iIiksdm9pZCAwPT09biYmKG49MCk7dmFyIGk9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBpLmFkZENsYXNzKCJsYWJlbCIpLGkudGV4dChlKSxpLmFuZ2xlKG4pLGkueEFsaWdubWVudCgiY2VudGVyIikueUFsaWdubWVudCgiY2VudGVyIiksaS5fcGFkZGluZz0wLGl9cmV0dXJuIEl3dC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX21lYXN1cmVyLm1lYXN1cmUodGhpcy5fdGV4dCk7cmV0dXJue21pbldpZHRoOigwPT09dGhpcy5hbmdsZSgpP24ud2lkdGg6bi5oZWlnaHQpKzIqdGhpcy5wYWRkaW5nKCksbWluSGVpZ2h0OigwPT09dGhpcy5hbmdsZSgpP24uaGVpZ2h0Om4ud2lkdGgpKzIqdGhpcy5wYWRkaW5nKCl9fSxlLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKSx0aGlzLl90ZXh0Q29udGFpbmVyPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpO3ZhciBlPW5ldyBSd3QuU3ZnQ29udGV4dCh0aGlzLl90ZXh0Q29udGFpbmVyLm5vZGUoKSk7dGhpcy5fbWVhc3VyZXI9bmV3IFJ3dC5DYWNoZU1lYXN1cmVyKGUpLHRoaXMuX3dyYXBwZXI9bmV3IFJ3dC5XcmFwcGVyLHRoaXMuX3dyaXRlcj1uZXcgUnd0LldyaXRlcih0aGlzLl9tZWFzdXJlcixlLHRoaXMuX3dyYXBwZXIpLHRoaXMudGV4dCh0aGlzLl90ZXh0KX0sZS5wcm90b3R5cGUudGV4dD1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl90ZXh0O2lmKCJzdHJpbmciIT10eXBlb2YgdCl0aHJvdyBuZXcgRXJyb3IoIkxhYmVsLnRleHQoKSBvbmx5IHRha2VzIHN0cmluZ3MgYXMgaW5wdXQiKTtyZXR1cm4gdGhpcy5fdGV4dD10LHRoaXMucmVkcmF3KCksdGhpc30sZS5wcm90b3R5cGUuYW5nbGU9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fYW5nbGU7aWYoKHQlPTM2MCk+MTgwP3QtPTM2MDp0PC0xODAmJih0Kz0zNjApLC05MCE9PXQmJjAhPT10JiY5MCE9PXQpdGhyb3cgbmV3IEVycm9yKHQrIiBpcyBub3QgYSB2YWxpZCBhbmdsZSBmb3IgTGFiZWwiKTtyZXR1cm4gdGhpcy5fYW5nbGU9dCx0aGlzLnJlZHJhdygpLHRoaXN9LGUucHJvdG90eXBlLnBhZGRpbmc9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fcGFkZGluZztpZigodD0rdCk8MCl0aHJvdyBuZXcgRXJyb3IodCsiIGlzIG5vdCBhIHZhbGlkIHBhZGRpbmcgdmFsdWUuIENhbm5vdCBiZSBsZXNzIHRoYW4gMC4iKTtyZXR1cm4gdGhpcy5fcGFkZGluZz10LHRoaXMucmVkcmF3KCksdGhpc30sZS5wcm90b3R5cGUuZml4ZWRXaWR0aD1mdW5jdGlvbigpe3JldHVybiEwfSxlLnByb3RvdHlwZS5maXhlZEhlaWdodD1mdW5jdGlvbigpe3JldHVybiEwfSxlLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3QucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyksdGhpcy5fdGV4dENvbnRhaW5lci5zZWxlY3RBbGwoImciKS5yZW1vdmUoKTt2YXIgZT10aGlzLl9tZWFzdXJlci5tZWFzdXJlKHRoaXMuX3RleHQpLG49TWF0aC5tYXgoTWF0aC5taW4oKHRoaXMuaGVpZ2h0KCktZS5oZWlnaHQpLzIsdGhpcy5wYWRkaW5nKCkpLDApLGk9TWF0aC5tYXgoTWF0aC5taW4oKHRoaXMud2lkdGgoKS1lLndpZHRoKS8yLHRoaXMucGFkZGluZygpKSwwKTt0aGlzLl90ZXh0Q29udGFpbmVyLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK2krIiwiK24rIikiKTt2YXIgcj10aGlzLndpZHRoKCktMippLG89dGhpcy5oZWlnaHQoKS0yKm4sYT17eEFsaWduOnRoaXMueEFsaWdubWVudCgpLHlBbGlnbjp0aGlzLnlBbGlnbm1lbnQoKSx0ZXh0Um90YXRpb246dGhpcy5hbmdsZSgpfTtyZXR1cm4gdGhpcy5fd3JpdGVyLndyaXRlKHRoaXMuX3RleHQscixvLGEpLHRoaXN9LGUucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZT1mdW5jdGlvbigpe3QucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZS5jYWxsKHRoaXMpLHRoaXMuX21lYXN1cmVyLnJlc2V0KCl9LGV9KShPX3QuQ29tcG9uZW50KTtOd3QuTGFiZWw9T3d0O3ZhciB6d3Q9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUobixpKXt2YXIgcj10LmNhbGwodGhpcyxuLGkpfHx0aGlzO3JldHVybiByLmFkZENsYXNzKGUuVElUTEVfTEFCRUxfQ0xBU1MpLHJ9cmV0dXJuIEl3dC5fX2V4dGVuZHMoZSx0KSxlLlRJVExFX0xBQkVMX0NMQVNTPSJ0aXRsZS1sYWJlbCIsZX0pKE93dCk7Tnd0LlRpdGxlTGFiZWw9end0O3ZhciBEd3Q9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUobixpKXt2YXIgcj10LmNhbGwodGhpcyxuLGkpfHx0aGlzO3JldHVybiByLmFkZENsYXNzKGUuQVhJU19MQUJFTF9DTEFTUykscn1yZXR1cm4gSXd0Ll9fZXh0ZW5kcyhlLHQpLGUuQVhJU19MQUJFTF9DTEFTUz0iYXhpcy1sYWJlbCIsZX0pKE93dCk7Tnd0LkF4aXNMYWJlbD1Ed3Q7dmFyIEJ3dD17fSxId3Q9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShId3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBGd3Q9d3B0O0h3dC5jaXJjbGU9ZnVuY3Rpb24gVnd0KCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBGd3Quc3ltYm9sKCkudHlwZShGd3Quc3ltYm9sQ2lyY2xlKS5zaXplKE1hdGguUEkqTWF0aC5wb3codC8yLDIpKX19LEh3dC5zcXVhcmU9ZnVuY3Rpb24gVXd0KCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBGd3Quc3ltYm9sKCkudHlwZShGd3Quc3ltYm9sU3F1YXJlKS5zaXplKE1hdGgucG93KHQsMikpfX0sSHd0LmNyb3NzPWZ1bmN0aW9uIGp3dCgpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gRnd0LnN5bWJvbCgpLnR5cGUoRnd0LnN5bWJvbENyb3NzKS5zaXplKDUvOSpNYXRoLnBvdyh0LDIpKX19LEh3dC5kaWFtb25kPWZ1bmN0aW9uIEd3dCgpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gRnd0LnN5bWJvbCgpLnR5cGUoRnd0LnN5bWJvbERpYW1vbmQpLnNpemUoTWF0aC50YW4oTWF0aC5QSS82KSpNYXRoLnBvdyh0LDIpLzIpfX0sSHd0LnRyaWFuZ2xlPWZ1bmN0aW9uIFd3dCgpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gRnd0LnN5bWJvbCgpLnR5cGUoRnd0LnN5bWJvbFRyaWFuZ2xlKS5zaXplKE1hdGguc3FydCgzKSpNYXRoLnBvdyh0LzIsMikpfX07SHd0LnN0YXI9ZnVuY3Rpb24gcXd0KCl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiBGd3Quc3ltYm9sKCkudHlwZShGd3Quc3ltYm9sU3Rhcikuc2l6ZSguODkwODEzMDkxNTI5Mjg1MipNYXRoLnBvdyh0LzIsMikpfX07dmFyIFl3dD0zKigxL01hdGguc3FydCgxMikvMisxKTtId3Qud3llPWZ1bmN0aW9uIFh3dCgpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4gRnd0LnN5bWJvbCgpLnR5cGUoRnd0LnN5bWJvbFd5ZSkuc2l6ZShZd3QqTWF0aC5wb3codC8yLjQsMikpfX0sCi8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShCd3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciAkd3Q9Qk8sS3d0PXdwdCxad3Q9TGd0LEp3dD1DeXQsUXd0PXB2dCx0U3Q9SHd0LGVTdD1EX3QsblN0PU9fdCxpU3Q9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUsbil7dm9pZCAwPT09dCYmKHQ9W10pLHZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PW4mJihuPTEvMCksdGhpcy5jb2x1bW5zPXQsdGhpcy5ib3R0b21QYWRkaW5nPWUsdGhpcy5tYXhXaWR0aD1ufXJldHVybiB0LnByb3RvdHlwZS5hZGRDb2x1bW49ZnVuY3Rpb24odCl7dmFyIGU9dC53aWR0aCxuPXRoaXMuZ2V0V2lkdGhBdmFpbGFibGUoKTt0LndpZHRoPU1hdGgubWluKG4sZSksdGhpcy5jb2x1bW5zLnB1c2godCl9LHQucHJvdG90eXBlLmdldEJvdW5kcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9dGhpcy5jb2x1bW5zW3RdLG49MCxpPTA7aTx0O2krKyluKz10aGlzLmNvbHVtbnNbaV0ud2lkdGg7cmV0dXJue3RvcExlZnQ6e3g6bix5OjB9LGJvdHRvbVJpZ2h0Ont4Om4rZS53aWR0aCx5OmUuaGVpZ2h0fX19LHQucHJvdG90eXBlLmdldEhlaWdodD1mdW5jdGlvbigpe3JldHVybiBlU3QuTWF0aC5tYXgodGhpcy5jb2x1bW5zLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuaGVpZ2h0fSkpLDApK3RoaXMuYm90dG9tUGFkZGluZ30sdC5wcm90b3R5cGUuZ2V0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4odGhpcy5jb2x1bW5zLnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCtlLndpZHRofSksMCksdGhpcy5tYXhXaWR0aCl9LHQucHJvdG90eXBlLmdldFdpZHRoQXZhaWxhYmxlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRXaWR0aCgpO3JldHVybiBNYXRoLm1heCh0aGlzLm1heFdpZHRoLXQsMCl9LHR9KSgpLHJTdD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KHQsZSxuLGkpe3ZvaWQgMD09PXQmJih0PTEvMCksdm9pZCAwPT09ZSYmKGU9MS8wKSx2b2lkIDA9PT1uJiYobj0wKSx2b2lkIDA9PT1pJiYoaT1bXSksdGhpcy5tYXhXaWR0aD10LHRoaXMubWF4SGVpZ2h0PWUsdGhpcy5wYWRkaW5nPW4sdGhpcy5yb3dzPWl9cmV0dXJuIHQucHJvdG90eXBlLmFkZFJvdz1mdW5jdGlvbih0KXt0Lm1heFdpZHRoPXRoaXMubWF4V2lkdGgtMip0aGlzLnBhZGRpbmcsdGhpcy5yb3dzLnB1c2godCl9LHQucHJvdG90eXBlLmdldENvbHVtbkJvdW5kcz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuZ2V0Um93Qm91bmRzKHQpLGk9dGhpcy5yb3dzW3RdLmdldEJvdW5kcyhlKTtyZXR1cm4gaS50b3BMZWZ0LngrPW4udG9wTGVmdC54LGkuYm90dG9tUmlnaHQueCs9bi50b3BMZWZ0LngsaS50b3BMZWZ0LnkrPW4udG9wTGVmdC55LGkuYm90dG9tUmlnaHQueSs9bi50b3BMZWZ0LnksaX0sdC5wcm90b3R5cGUuZ2V0Um93Qm91bmRzPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT10aGlzLnBhZGRpbmcsbj10aGlzLnBhZGRpbmcsaT0wO2k8dDtpKyspbis9dGhpcy5yb3dzW2ldLmdldEhlaWdodCgpO3JldHVybnt0b3BMZWZ0Ont4OmUseTpufSxib3R0b21SaWdodDp7eDplK3RoaXMucm93c1t0XS5nZXRXaWR0aCgpLHk6bit0aGlzLnJvd3NbdF0uZ2V0SGVpZ2h0KCl9fX0sdC5wcm90b3R5cGUuZ2V0SGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIE1hdGgubWluKHRoaXMucm93cy5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrZS5nZXRIZWlnaHQoKX0pLDApKzIqdGhpcy5wYWRkaW5nLHRoaXMubWF4SGVpZ2h0KX0sdC5wcm90b3R5cGUuZ2V0V2lkdGg9ZnVuY3Rpb24oKXtyZXR1cm4gTWF0aC5taW4oZVN0Lk1hdGgubWF4KHRoaXMucm93cy5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LmdldFdpZHRoKCl9KSksMCkrMip0aGlzLnBhZGRpbmcsdGhpcy5tYXhXaWR0aCl9LHR9KSgpLG9TdD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgbj10LmNhbGwodGhpcyl8fHRoaXM7aWYobi5fcGFkZGluZz01LG4uX3Jvd0JvdHRvbVBhZGRpbmc9MyxuLmFkZENsYXNzKCJsZWdlbmQiKSxuLm1heEVudHJpZXNQZXJSb3coMSksbnVsbD09ZSl0aHJvdyBuZXcgRXJyb3IoIkxlZ2VuZCByZXF1aXJlcyBhIGNvbG9yU2NhbGUiKTtyZXR1cm4gbi5fY29sb3JTY2FsZT1lLG4uX3JlZHJhd0NhbGxiYWNrPWZ1bmN0aW9uKHQpe3JldHVybiBuLnJlZHJhdygpfSxuLl9jb2xvclNjYWxlLm9uVXBkYXRlKG4uX3JlZHJhd0NhbGxiYWNrKSxuLl9mb3JtYXR0ZXI9UXd0LmlkZW50aXR5KCksbi5tYXhMaW5lc1BlckVudHJ5KDEpLG4ueEFsaWdubWVudCgicmlnaHQiKS55QWxpZ25tZW50KCJ0b3AiKSxuLmNvbXBhcmF0b3IoKGZ1bmN0aW9uKHQsZSl7dmFyIGk9bi5fY29sb3JTY2FsZS5kb21haW4oKS5zbGljZSgpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIG4uX2Zvcm1hdHRlcih0KX0pKTtyZXR1cm4gaS5pbmRleE9mKHQpLWkuaW5kZXhPZihlKX0pKSxuLl9zeW1ib2xGYWN0b3J5QWNjZXNzb3I9ZnVuY3Rpb24oKXtyZXR1cm4gdFN0LmNpcmNsZSgpfSxuLl9zeW1ib2xPcGFjaXR5QWNjZXNzb3I9ZnVuY3Rpb24oKXtyZXR1cm4gMX0sbn1yZXR1cm4gJHd0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3QucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpO3ZhciBuPXRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoZS5MRUdFTkRfUk9XX0NMQVNTLCEwKTtuLmFwcGVuZCgiZyIpLmNsYXNzZWQoZS5MRUdFTkRfRU5UUllfQ0xBU1MsITApLmFwcGVuZCgidGV4dCIpO3ZhciBpPW5ldyBad3QuU3ZnQ29udGV4dChuLm5vZGUoKSxudWxsLEp3dC5BRERfVElUTEVfRUxFTUVOVFMpO3RoaXMuX21lYXN1cmVyPW5ldyBad3QuQ2FjaGVNZWFzdXJlcihpKSx0aGlzLl93cmFwcGVyPShuZXcgWnd0LldyYXBwZXIpLm1heExpbmVzKHRoaXMubWF4TGluZXNQZXJFbnRyeSgpKSx0aGlzLl93cml0ZXI9bmV3IFp3dC5Xcml0ZXIodGhpcy5fbWVhc3VyZXIsaSx0aGlzLl93cmFwcGVyKX0sZS5wcm90b3R5cGUuZm9ybWF0dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2Zvcm1hdHRlcjoodGhpcy5fZm9ybWF0dGVyPXQsdGhpcy5yZWRyYXcoKSx0aGlzKX0sZS5wcm90b3R5cGUubWF4RW50cmllc1BlclJvdz1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9tYXhFbnRyaWVzUGVyUm93Oih0aGlzLl9tYXhFbnRyaWVzUGVyUm93PXQsdGhpcy5yZWRyYXcoKSx0aGlzKX0sZS5wcm90b3R5cGUubWF4TGluZXNQZXJFbnRyeT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9tYXhMaW5lc1BlckVudHJ5Oih0aGlzLl9tYXhMaW5lc1BlckVudHJ5PXQsdGhpcy5yZWRyYXcoKSx0aGlzKX0sZS5wcm90b3R5cGUubWF4V2lkdGg9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fbWF4V2lkdGg6KHRoaXMuX21heFdpZHRoPXQsdGhpcy5yZWRyYXcoKSx0aGlzKX0sZS5wcm90b3R5cGUuY29tcGFyYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9jb21wYXJhdG9yOih0aGlzLl9jb21wYXJhdG9yPXQsdGhpcy5yZWRyYXcoKSx0aGlzKX0sZS5wcm90b3R5cGUuY29sb3JTY2FsZT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dD8odGhpcy5fY29sb3JTY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVkcmF3Q2FsbGJhY2spLHRoaXMuX2NvbG9yU2NhbGU9dCx0aGlzLl9jb2xvclNjYWxlLm9uVXBkYXRlKHRoaXMuX3JlZHJhd0NhbGxiYWNrKSx0aGlzLnJlZHJhdygpLHRoaXMpOnRoaXMuX2NvbG9yU2NhbGV9LGUucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyksdGhpcy5fY29sb3JTY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVkcmF3Q2FsbGJhY2spfSxlLnByb3RvdHlwZS5fYnVpbGRMZWdlbmRUYWJsZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMsaT10aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0LHI9bmV3IHJTdCh0LGUsdGhpcy5fcGFkZGluZyksbz10aGlzLl9jb2xvclNjYWxlLmRvbWFpbigpLnNsaWNlKCkuc29ydCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gbi5fY29tcGFyYXRvcihuLl9mb3JtYXR0ZXIodCksbi5fZm9ybWF0dGVyKGUpKX0pKSxhPW5ldyBpU3Q7cmV0dXJuIHIuYWRkUm93KGEpLGEuYm90dG9tUGFkZGluZz10aGlzLl9yb3dCb3R0b21QYWRkaW5nLG8uZm9yRWFjaCgoZnVuY3Rpb24odCxlKXthLmNvbHVtbnMubGVuZ3RoLzI9PT1uLm1heEVudHJpZXNQZXJSb3coKSYmKChhPW5ldyBpU3QpLmJvdHRvbVBhZGRpbmc9bi5fcm93Qm90dG9tUGFkZGluZyxyLmFkZFJvdyhhKSk7dmFyIG89YS5nZXRXaWR0aEF2YWlsYWJsZSgpLHM9bi5fZm9ybWF0dGVyKHQpLGw9bi5fbWVhc3VyZXIubWVhc3VyZShzKS53aWR0aDtvLWktbDwwJiZhLmNvbHVtbnMubGVuZ3RoPjEmJigoYT1uZXcgaVN0KS5ib3R0b21QYWRkaW5nPW4uX3Jvd0JvdHRvbVBhZGRpbmcsci5hZGRSb3coYSkpLGEuYWRkQ29sdW1uKHt3aWR0aDppLGhlaWdodDppLGRhdGE6e25hbWU6dCx0eXBlOiJzeW1ib2wifX0pLG89YS5nZXRXaWR0aEF2YWlsYWJsZSgpO3ZhciBjPU1hdGgubWluKG8sbCk7bi5fd3JhcHBlci5tYXhMaW5lcyhuLm1heExpbmVzUGVyRW50cnkoKSk7dmFyIHU9bi5fd3JhcHBlci53cmFwKHMsbi5fbWVhc3VyZXIsYykubm9MaW5lczthLmFkZENvbHVtbih7d2lkdGg6YyxoZWlnaHQ6dSppLGRhdGE6e25hbWU6dCx0eXBlOiJ0ZXh0In19KX0pKSxyfSxlLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZT1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2J1aWxkTGVnZW5kVGFibGUoZVN0Lk1hdGgubWluKFt0aGlzLm1heFdpZHRoKCksdF0sdCksZSk7cmV0dXJue21pbkhlaWdodDpuLmdldEhlaWdodCgpLG1pbldpZHRoOm4uZ2V0V2lkdGgoKX19LGUucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24odCl7dmFyIG49dGhpcztpZighdGhpcy5faXNTZXR1cClyZXR1cm5bXTt2YXIgaT10aGlzLl9idWlsZExlZ2VuZFRhYmxlKHRoaXMud2lkdGgoKSx0aGlzLmhlaWdodCgpKTtyZXR1cm4gaS5yb3dzLnJlZHVjZSgoZnVuY3Rpb24ocixvLGEpe2lmKDAhPT1yLmxlbmd0aClyZXR1cm4gcjt2YXIgcz1pLmdldFJvd0JvdW5kcyhhKTtyZXR1cm4gZVN0Lk1hdGgud2l0aGluKHQscyk/by5jb2x1bW5zLnJlZHVjZSgoZnVuY3Rpb24ocixvLHMpe3ZhciBsPWkuZ2V0Q29sdW1uQm91bmRzKGEscyk7aWYoZVN0Lk1hdGgud2l0aGluKHQsbCkpe3ZhciBjPW4uY29udGVudCgpLnNlbGVjdEFsbCgiLiIrZS5MRUdFTkRfUk9XX0NMQVNTKS5ub2RlcygpW2FdLHU9S3d0LnNlbGVjdChjKS5zZWxlY3RBbGwoIi4iK2UuTEVHRU5EX0VOVFJZX0NMQVNTKS5ub2RlcygpW01hdGguZmxvb3Iocy8yKV0saD1Ld3Quc2VsZWN0KHUpLnNlbGVjdCgiLiIrZS5MRUdFTkRfU1lNQk9MX0NMQVNTKSxkPWVTdC5ET00uZ2V0VHJhbnNsYXRlVmFsdWVzKEt3dC5zZWxlY3QoYykpLHA9ZVN0LkRPTS5nZXRUcmFuc2xhdGVWYWx1ZXMoaCk7cmV0dXJuW3tib3VuZHM6ZVN0LkRPTS5lbGVtZW50QkJveChLd3Quc2VsZWN0KGMpKSxkYXR1bTpvLmRhdGEubmFtZSxwb3NpdGlvbjp7eDpkWzBdK3BbMF0seTpkWzFdK3BbMV19LHNlbGVjdGlvbjpLd3Quc2VsZWN0KHUpLGNvbXBvbmVudDpufV19cmV0dXJuIHJ9KSxyKTpyfSksW10pfSxlLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseT1mdW5jdGlvbigpe3QucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7dmFyIG49dGhpcy5fYnVpbGRMZWdlbmRUYWJsZSh0aGlzLndpZHRoKCksdGhpcy5oZWlnaHQoKSk7dGhpcy5jb250ZW50KCkuc2VsZWN0QWxsKCIqIikucmVtb3ZlKCk7dmFyIGk9dGhpcy5jb250ZW50KCkuc2VsZWN0QWxsKCJnLiIrZS5MRUdFTkRfUk9XX0NMQVNTKS5kYXRhKG4ucm93cykscj1pLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZChlLkxFR0VORF9ST1dfQ0xBU1MsITApLm1lcmdlKGkpO2kuZXhpdCgpLnJlbW92ZSgpLHIuYXR0cigidHJhbnNmb3JtIiwoZnVuY3Rpb24odCxlKXt2YXIgaT1uLmdldFJvd0JvdW5kcyhlKTtyZXR1cm4idHJhbnNsYXRlKCIraS50b3BMZWZ0LngrIiwgIitpLnRvcExlZnQueSsiKSJ9KSk7dmFyIG89dGhpcztyZXR1cm4gci5lYWNoKChmdW5jdGlvbih0LGkpe2Zvcih2YXIgcj1bXSxhPTA7YTx0LmNvbHVtbnMubGVuZ3RoO2ErPTIpci5wdXNoKFt0LmNvbHVtbnNbYV0sdC5jb2x1bW5zW2ErMV1dKTt2YXIgcz1Ld3Quc2VsZWN0KHRoaXMpLnNlbGVjdEFsbCgiZy4iK2UuTEVHRU5EX0VOVFJZX0NMQVNTKS5kYXRhKHIpLGw9cy5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoZS5MRUdFTkRfRU5UUllfQ0xBU1MsITApLm1lcmdlKHMpO2wuYXBwZW5kKCJwYXRoIikuYXR0cigiZCIsKGZ1bmN0aW9uKHQsZSl7dmFyIG49dFswXTtyZXR1cm4gby5zeW1ib2woKShuLmRhdGEubmFtZSxpKSguNipuLmhlaWdodCkobnVsbCl9KSkuYXR0cigidHJhbnNmb3JtIiwoZnVuY3Rpb24odCxlKXt2YXIgcj10WzBdLG89bi5yb3dzW2ldLmNvbHVtbnMuaW5kZXhPZihyKTtyZXR1cm4idHJhbnNsYXRlKCIrKG4uZ2V0Q29sdW1uQm91bmRzKGksbykudG9wTGVmdC54K3Iud2lkdGgvMikrIiwgIityLmhlaWdodC8yKyIpIn0pKS5hdHRyKCJmaWxsIiwoZnVuY3Rpb24odCl7cmV0dXJuIG8uX2NvbG9yU2NhbGUuc2NhbGUodFswXS5kYXRhLm5hbWUpfSkpLmF0dHIoIm9wYWNpdHkiLChmdW5jdGlvbih0LGUpe3JldHVybiBvLnN5bWJvbE9wYWNpdHkoKSh0WzBdLmRhdGEubmFtZSxpKX0pKS5jbGFzc2VkKGUuTEVHRU5EX1NZTUJPTF9DTEFTUywhMCksbC5hcHBlbmQoImciKS5jbGFzc2VkKCJ0ZXh0LWNvbnRhaW5lciIsITApLmF0dHIoInRyYW5zZm9ybSIsKGZ1bmN0aW9uKHQsZSl7dmFyIHI9bi5yb3dzW2ldLmNvbHVtbnMuaW5kZXhPZih0WzFdKTtyZXR1cm4idHJhbnNsYXRlKCIrbi5nZXRDb2x1bW5Cb3VuZHMoaSxyKS50b3BMZWZ0LngrIiwgMCkifSkpLmVhY2goKGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1Ld3Quc2VsZWN0KHRoaXMpLHI9dFsxXTtvLl93cml0ZXIud3JpdGUoby5fZm9ybWF0dGVyKHIuZGF0YS5uYW1lKSxyLndpZHRoLG8uaGVpZ2h0KCkse3hBbGlnbjoibGVmdCIseUFsaWduOiJ0b3AiLHRleHRSb3RhdGlvbjowfSxpLm5vZGUoKSl9KSkscy5leGl0KCkucmVtb3ZlKCl9KSksdGhpc30sZS5wcm90b3R5cGUuc3ltYm9sPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX3N5bWJvbEZhY3RvcnlBY2Nlc3NvcjoodGhpcy5fc3ltYm9sRmFjdG9yeUFjY2Vzc29yPXQsdGhpcy5yZW5kZXIoKSx0aGlzKX0sZS5wcm90b3R5cGUuc3ltYm9sT3BhY2l0eT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9zeW1ib2xPcGFjaXR5QWNjZXNzb3I6KHRoaXMuX3N5bWJvbE9wYWNpdHlBY2Nlc3Nvcj0ibnVtYmVyIj09dHlwZW9mIHQ/ZnVuY3Rpb24oKXtyZXR1cm4gdH06dCx0aGlzLnJlbmRlcigpLHRoaXMpfSxlLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7cmV0dXJuITB9LGUucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuITB9LGUucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZT1mdW5jdGlvbigpe3QucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZS5jYWxsKHRoaXMpLHRoaXMuX21lYXN1cmVyLnJlc2V0KCl9LGUuTEVHRU5EX1JPV19DTEFTUz0ibGVnZW5kLXJvdyIsZS5MRUdFTkRfRU5UUllfQ0xBU1M9ImxlZ2VuZC1lbnRyeSIsZS5MRUdFTkRfU1lNQk9MX0NMQVNTPSJsZWdlbmQtc3ltYm9sIixlfSkoblN0LkNvbXBvbmVudCk7Qnd0LkxlZ2VuZD1vU3Q7dmFyIGFTdD17fSxzU3Q9e30sbFN0PXt9OyEoZnVuY3Rpb24odCl7dmFyIGU7Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSwoZT10LkFuaW1hdG9yfHwodC5BbmltYXRvcj17fSkpLk1BSU49Im1haW4iLGUuUkVTRVQ9InJlc2V0In0pKGxTdCk7dmFyIGNTdD17fSx1U3Q9e30saFN0PXt9LGRTdD1mdW5jdGlvbiB0KGUpe3JldHVybiBudWxsIT1lJiYib2JqZWN0Ij09dHlwZW9mIGUmJiExPT09QXJyYXkuaXNBcnJheShlKX07ZnVuY3Rpb24gcFN0KHQpe3JldHVybiEwPT09ZFN0KHQpJiYiW29iamVjdCBPYmplY3RdIj09PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh0KX12YXIgZlN0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkoZlN0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgbVN0PURfdCxnU3Q9MCxfU3Q9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3ZvaWQgMD09PXQmJih0PVtdKSx2b2lkIDA9PT1lJiYoZT17fSksdGhpcy5fdXBkYXRlSWQ9Z1N0KyssdGhpcy5fZGF0YT10LHRoaXMuX21ldGFkYXRhPWUsdGhpcy5fY2FsbGJhY2tzPW5ldyBtU3QuQ2FsbGJhY2tTZXR9cmV0dXJuIHQucHJvdG90eXBlLm9uVXBkYXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9jYWxsYmFja3MuYWRkKHQpLHRoaXN9LHQucHJvdG90eXBlLm9mZlVwZGF0ZT1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY2FsbGJhY2tzLmRlbGV0ZSh0KSx0aGlzfSx0LnByb3RvdHlwZS5kYXRhPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2RhdGE6KHRoaXMuX2RhdGE9dCx0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpLHRoaXMpfSx0LnByb3RvdHlwZS5tZXRhZGF0YT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9tZXRhZGF0YToodGhpcy5fbWV0YWRhdGE9dCx0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpLHRoaXMpfSx0LnByb3RvdHlwZS51cGRhdGVJZD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl91cGRhdGVJZH0sdC5wcm90b3R5cGUuX2Rpc3BhdGNoVXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlSWQ9Z1N0KyssdGhpcy5fY2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcyl9LHR9KSgpO2ZTdC5EYXRhc2V0PV9TdCwKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKiBAZmlsZW92ZXJ2aWV3IEltcGxlbWVudHMgdGhlIFNpZ25hdHVyZSBBUEkgdG8gaGVscCBpbiBjb21wYXJpbmcgd2hlbiB0d28KICAgICAqIFBsb3R0YWJsZSBvYmplY3RzIGhhdmUgImNoYW5nZWQiLgogICAgICoKICAgICAqIE1lbW9pemF0aW9uIGluIFBsb3R0YWJsZSBpcyBjb21wbGljYXRlZCBieSBtdXRhYmxlIHNjYWxlcyBhbmQgZGF0YXNldHMuIFdlIGNhbm5vdCBzaW1wbHkKICAgICAqIHJlZmVyZW5jZSBjb21wYXJlIHR3byBlLmcuIHNjYWxlcyBzaW5jZSBpdCBtYXkgaGF2ZSBpbnRlcm5hbGx5IG11dGF0ZWQuIFRvIHJlc29sdmUgdGhpcywKICAgICAqIHdlIHdyaXRlIGEgcmVjdXJzaXZlIFNpZ25hdHVyZSBpbnRlcmZhY2UgdGhhdCBob2xkcyBhbiBpbW11dGFibGUgc25hcHNob3Qgb2Ygd2hhdGV2ZXIKICAgICAqIHN0YXRlIHRoZSBzY2FsZS9kYXRhIHdhcyBpbiBhdCB0aGUgdGltZS4gVGhlbiBvbiBtZW1vaXplZCBmdW5jdGlvbiBpbnZvY2F0aW9uIHdlIHNpZ24gdGhlCiAgICAgKiBuZXcgaW5wdXRzIGFuZCBjb21wYXJlIHRoZSBzaWduYXR1cmVzIHRvIGRlY2lkZSBpZiB3ZSBzaG91bGQgcmVjb21wdXRlLgogICAgICoKICAgICAqIFdlIG11c3QgaGFuZC13cml0ZSBhIHNpZ25hdHVyZSBmb3IgZWFjaCBjdXN0b20gY2xhc3Mgd2Ugd2lzaCB0byBzdXBwb3J0LgogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShoU3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciB5U3Q9Qk8sdlN0PWZ1bmN0aW9uIHQoZSl7dmFyIG4saTtyZXR1cm4hMSE9PXBTdChlKSYmKCJmdW5jdGlvbiI9PXR5cGVvZihuPWUuY29uc3RydWN0b3IpJiYoITEhPT1wU3QoaT1uLnByb3RvdHlwZSkmJiExIT09aS5oYXNPd25Qcm9wZXJ0eSgiaXNQcm90b3R5cGVPZiIpKSl9LGJTdD1mU3QseFN0PWxidDtmdW5jdGlvbiB3U3QodCl7cmV0dXJuIHQgaW5zdGFuY2VvZiBBU3Q/dDp0IGluc3RhbmNlb2YgRGF0ZT9FU3QodC52YWx1ZU9mKCkpOnQgaW5zdGFuY2VvZiB4U3QuU2NhbGU/U1N0KHQpOnQgaW5zdGFuY2VvZiBiU3QuRGF0YXNldD9NU3QodCk6dlN0KHQpP0NTdCh0KTpBcnJheS5pc0FycmF5KHQpP1RTdCh0KTpFU3QodCl9ZnVuY3Rpb24gU1N0KHQpe3JldHVybiBDU3Qoe2RvbWFpbjp0LmRvbWFpbigpLHJhbmdlOnQucmFuZ2UoKSx1cGRhdGVJZDp0LnVwZGF0ZUlkKCkscmVmOkVTdCh0KX0pfWZ1bmN0aW9uIE1TdCh0KXtyZXR1cm4gQ1N0KHtyZWY6RVN0KHQpLHVwZGF0ZUlkOnQudXBkYXRlSWQoKX0pfWZ1bmN0aW9uIEVTdCh0KXtyZXR1cm4gbmV3IExTdCh0KX1mdW5jdGlvbiBUU3QodCl7cmV0dXJuIG5ldyBrU3QodC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB3U3QodCl9KSkpfWZ1bmN0aW9uIENTdCh0KXt2YXIgZT17fTtmb3IodmFyIG4gaW4gdCl0Lmhhc093blByb3BlcnR5KG4pJiYoZVtuXT13U3QodFtuXSkpO3JldHVybiBuZXcgUFN0KGUpfWhTdC5zaWduPXdTdCxoU3Quc2lnblNjYWxlPVNTdCxoU3Quc2lnbkRhdGFzZXQ9TVN0LGhTdC5zaWduUmVmPUVTdCxoU3Quc2lnbkFycmF5PVRTdCxoU3Quc2lnbk9iaj1DU3Q7dmFyIEFTdD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiB0LnByb3RvdHlwZS5pc0RpZmZlcmVudD1mdW5jdGlvbih0KXtyZXR1cm4hKHQgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yKXx8dGhpcy5pc1NpZ25hdHVyZURpZmZlcmVudCh0KX0sdH0pKCk7aFN0LlNpZ25hdHVyZT1BU3Q7dmFyIGtTdD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgbj10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIG4uYXJyYXk9ZSxufXJldHVybiB5U3QuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuaXNTaWduYXR1cmVEaWZmZXJlbnQ9ZnVuY3Rpb24odCl7aWYodC5hcnJheS5sZW5ndGghPT10aGlzLmFycmF5Lmxlbmd0aClyZXR1cm4hMDtmb3IodmFyIGU9MDtlPHRoaXMuYXJyYXkubGVuZ3RoO2UrKylpZih0aGlzLmFycmF5W2VdLmlzRGlmZmVyZW50KHQuYXJyYXlbZV0pKXJldHVybiEwO3JldHVybiExfSxlfSkoQVN0KTtoU3QuQXJyYXlTaWduYXR1cmU9a1N0O3ZhciBMU3Q9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dmFyIG49dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBuLnJlZj1lLG59cmV0dXJuIHlTdC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5pc1NpZ25hdHVyZURpZmZlcmVudD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5yZWYhPT10LnJlZn0sZX0pKEFTdCk7aFN0LlJlZmVyZW5jZVNpZ25hdHVyZT1MU3Q7dmFyIFBTdD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZShlKXt2YXIgbj10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIG4ub2JqPWUsbn1yZXR1cm4geVN0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLmlzU2lnbmF0dXJlRGlmZmVyZW50PWZ1bmN0aW9uKHQpe3ZhciBlPU9iamVjdC5rZXlzKHRoaXMub2JqKSxuPU9iamVjdC5rZXlzKHQub2JqKTtpZihlLmxlbmd0aCE9PW4ubGVuZ3RoKXJldHVybiEwO2Zvcih2YXIgaT0wLHI9ZTtpPHIubGVuZ3RoO2krKyl7dmFyIG89cltpXTtpZighdC5vYmouaGFzT3duUHJvcGVydHkobykpcmV0dXJuITA7aWYodGhpcy5vYmpbb10uaXNEaWZmZXJlbnQodC5vYmpbb10pKXJldHVybiEwfXJldHVybiExfSxlfSkoQVN0KTtoU3QuT2JqZWN0U2lnbmF0dXJlPVBTdCwKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKiBAZmlsZW92ZXJ2aWV3IEltcGxlbWVudHMgYSBmdW5jdGlvbiBtZW1vaXplciB1c2luZyB0aGUgU2lnbmF0dXJlIEFQSS4KICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkodVN0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgTlN0PWhTdDt1U3QubWVtb2l6ZT1mdW5jdGlvbiBJU3QodCl7dmFyIGUsbj12b2lkIDAsaT0hMSxyPSExLG89ZnVuY3Rpb24oKXtmb3IodmFyIG89W10sYT0wO2E8YXJndW1lbnRzLmxlbmd0aDthKyspb1thXT1hcmd1bWVudHNbYV07aWYoaSlyZXR1cm4gZTt2YXIgcz1OU3Quc2lnbkFycmF5KG8pO3JldHVybiB2b2lkIDA9PT1ufHxuLmlzRGlmZmVyZW50KHMpPyhyJiZjb25zb2xlLndhcm4oImNhY2hlIG1pc3MhIGNvbXB1dGluZyIpLG49cyxlPXQuYXBwbHkodGhpcyxvKSk6ciYmY29uc29sZS53YXJuKCJjYWNoZSBoaXQhIiksZX07cmV0dXJuIG8uZG9Mb2NrZWQ9ZnVuY3Rpb24odCl7aWYoaSl0aHJvdyBuZXcgRXJyb3IoIkxvY2tpbmcgYW4gYWxyZWFkeSBsb2NrZWQgbWVtb2l6ZSBmdW5jdGlvbiEiKTtpPSEwO3ZhciBlPXQuYXBwbHkodGhpcyk7cmV0dXJuIGk9ITEsZX0sby5sb2dQZXJmb3JtYW5jZT1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwPT09dCYmKHQ9ITApLHI9dCx0aGlzfSxvfTt2YXIgUlN0PXt9O09iamVjdC5kZWZpbmVQcm9wZXJ0eShSU3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBPU3Q9Q2UuZXhwb3J0cyx6U3Q9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCgpe3RoaXMubWFwPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5leGlzdHM9T2JqZWN0LmNyZWF0ZShudWxsKX1yZXR1cm4gdC5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3JldHVybiBkZWxldGUgdGhpcy5tYXBbdF0sZGVsZXRlIHRoaXMuZXhpc3RzW3RdLCEwfSx0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubWFwW3RdfSx0LnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuISF0aGlzLmV4aXN0c1t0XX0sdC5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMubWFwW3RdPWUsdGhpcy5leGlzdHNbdF09ITAsdGhpc30sdH0pKCksRFN0PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt0aGlzLm1hcD1uZXcgelN0fXJldHVybiB0LnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMubWFwLmdldCh0WzBdKS5nZXQodFsxXSl9LHQucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5tYXAuaGFzKHRbMF0pJiZ0aGlzLm1hcC5nZXQodFswXSkuaGFzKHRbMV0pfSx0LnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdGhpcy5tYXAuaGFzKHRbMF0pfHx0aGlzLm1hcC5zZXQodFswXSxuZXcgelN0KSx0aGlzLm1hcC5nZXQodFswXSkuc2V0KHRbMV0sZSksdGhpc30sdC5wcm90b3R5cGUuZGVsZXRlPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLm1hcC5oYXModFswXSkmJnRoaXMubWFwLmdldCh0WzBdKS5kZWxldGUodFsxXSksITB9LHQucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5tYXA9bmV3IHpTdH0sdC5yZXNvbHZlcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuW24udXBkYXRlSWQoKSxlXX0sdH0pKCk7ZnVuY3Rpb24gQlN0KHQpe3ZhciBlPU9TdC5tZW1vaXplKHQsRFN0LnJlc29sdmVyKTtyZXR1cm4gZS5jYWNoZT1uZXcgRFN0LGV9UlN0Lm1lbW9pemVQcm9qZWN0b3I9QlN0LFJTdC5tZW1vaXplUHJvamVjdG9ycz1mdW5jdGlvbiBIU3QodCl7cmV0dXJuIE9iamVjdC5rZXlzKHQpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3RbZV09QlN0KHRbZV0pfSkpLHR9O3ZhciBGU3Q9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICogQGZpbGVvdmVydmlldyBJbXBsZW1lbnRzIGEgY29udmVuaWVudCB0aHVuayBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIGNvbW1vbiBjYXNlCiAgICAgKiBvZiBjcmVhdGluZyBhIG1lbW9pemVkIGZ1bmN0aW9uIHRoYXQgdGFrZXMgaXRzIGlucHV0cyBmcm9tIG11dGFibGUgY2xhc3MgcHJvcGVydGllcy4KICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShGU3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBWU3Q9Y1N0O0ZTdC5tZW1UaHVuaz1mdW5jdGlvbiBVU3QoKXtmb3IodmFyIHQ9W10sZT0wO2U8YXJndW1lbnRzLmxlbmd0aDtlKyspdFtlXT1hcmd1bWVudHNbZV07dmFyIG49dC5zbGljZSgwLC0xKSxpPXRbdC5sZW5ndGgtMV0scj1WU3QubWVtb2l6ZShpKSxvPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPW4ubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gZS5hcHBseSh0KX0pKTtyZXR1cm4gci5hcHBseSh2b2lkIDAsZSl9O3JldHVybiBvfSwoZnVuY3Rpb24odCl7Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZT1CTztlLl9fZXhwb3J0U3Rhcih1U3QsdCksZS5fX2V4cG9ydFN0YXIoUlN0LHQpLGUuX19leHBvcnRTdGFyKEZTdCx0KSx0LnNpZ249aFN0LnNpZ259KShjU3QpO3ZhciBqU3Q9e307IShmdW5jdGlvbih0KXsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBlPXdwdCxuPShmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt0aGlzLl9jb250ZXh0PXQsdGhpcy5fZHJhd1N0ZXA9ZX1yZXR1cm4gdC5wcm90b3R5cGUuZ2V0RHJhd1N0ZXA9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZHJhd1N0ZXB9LHQucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24odCxlKXt2YXIgbj1lW2UubGVuZ3RoLTFdLmF0dHJUb0FwcGxpZWRQcm9qZWN0b3I7dGhpcy5fY29udGV4dC5zYXZlKCksdGhpcy5fZHJhd1N0ZXAodGhpcy5fY29udGV4dCx0LG4pLHRoaXMuX2NvbnRleHQucmVzdG9yZSgpfSx0LnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVzPWZ1bmN0aW9uKCl7cmV0dXJuW119LHQucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXg9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGx9LHQucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe30sdH0pKCk7ZnVuY3Rpb24gaSh0LGUsbixpKXtmb3IodmFyIHI9e30sbz0wLGE9ZTtvPGEubGVuZ3RoO28rKyl7dmFyIHM9YVtvXTt0Lmhhc093blByb3BlcnR5KHMpJiYocltzXT10W3NdKG4saSkpfXJldHVybiByfWZ1bmN0aW9uIHIodCl7cmV0dXJuIG51bGwhPXRbInN0cm9rZS13aWR0aCJdP3BhcnNlRmxvYXQodFsic3Ryb2tlLXdpZHRoIl0pOjF9ZnVuY3Rpb24gbyh0KXt2YXIgZT10WyJzdHJva2UtZGFzaGFycmF5Il07aWYobnVsbCE9ZSl0cnl7cmV0dXJuIGUuc3BsaXQoL1sgLF0rLykubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gcGFyc2VJbnQodCwxMCl9KSl9Y2F0Y2godCl7cmV0dXJuIGNvbnNvbGUuZXJyb3IoImdldFN0cm9rZURhc2hBcnJheSBmYWlsZWQgd2l0aDogIit0KSxbXX1yZXR1cm5bXX1mdW5jdGlvbiBhKHQsbil7aWYobi5zdHJva2Upe3QubGluZVdpZHRoPXIobik7dmFyIGk9ZS5jb2xvcihuLnN0cm9rZSksYT1vKG4pO3Quc2V0TGluZURhc2goYSksaS5vcGFjaXR5Kj0oZnVuY3Rpb24gcyh0KXt2YXIgZT1udWxsIT10Lm9wYWNpdHk/cGFyc2VGbG9hdCh0Lm9wYWNpdHkpOjE7cmV0dXJuKG51bGwhPXRbInN0cm9rZS1vcGFjaXR5Il0/cGFyc2VGbG9hdCh0WyJzdHJva2Utb3BhY2l0eSJdKToxKSplfSkobiksdC5zdHJva2VTdHlsZT1pLnRvU3RyaW5nKCksdC5zdHJva2UoKX1pZihuLmZpbGwpe3ZhciBsPWUuY29sb3Iobi5maWxsKTtsLm9wYWNpdHkqPShmdW5jdGlvbiBjKHQpe3ZhciBlPW51bGwhPXQub3BhY2l0eT9wYXJzZUZsb2F0KHQub3BhY2l0eSk6MTtyZXR1cm4obnVsbCE9dFsiZmlsbC1vcGFjaXR5Il0/cGFyc2VGbG9hdCh0WyJmaWxsLW9wYWNpdHkiXSk6MSkqZX0pKG4pLHQuZmlsbFN0eWxlPWwudG9TdHJpbmcoKSx0LmZpbGwoKX19dC5DYW52YXNEcmF3ZXI9bix0LkNvbnRleHRTdHlsZUF0dHJzPVsiZmlsbC1vcGFjaXR5IiwiZmlsbCIsIm9wYWNpdHkiLCJzdHJva2Utb3BhY2l0eSIsInN0cm9rZS13aWR0aCIsInN0cm9rZSIsInN0cm9rZS1kYXNoYXJyYXkiXSx0LnJlc29sdmVBdHRyaWJ1dGVzU3Vic2V0V2l0aFN0eWxlcz1mdW5jdGlvbiBzKGUsbixyLG8pe3JldHVybiBpKGUsdC5Db250ZXh0U3R5bGVBdHRycy5jb25jYXQobikscixvKX0sdC5yZXNvbHZlQXR0cmlidXRlcz1pLHQuZ2V0U3Ryb2tlV2lkdGg9cix0LmdldFN0cm9rZURhc2hBcnJheT1vLHQucmVuZGVyQXJlYT1mdW5jdGlvbiBsKHQsZSxuLGkpe3Quc2F2ZSgpLHQuYmVnaW5QYXRoKCksZS5jb250ZXh0KHQpLGUobiksdC5saW5lSm9pbj0icm91bmQiLGEodCxpKSx0LnJlc3RvcmUoKX0sdC5yZW5kZXJMaW5lPWZ1bmN0aW9uIGModCxlLG4saSl7dC5zYXZlKCksdC5iZWdpblBhdGgoKSxlLmNvbnRleHQodCksZShuKSx0LmxpbmVKb2luPSJyb3VuZCIsYSh0LGkpLHQucmVzdG9yZSgpfSx0LnJlbmRlclBhdGhXaXRoU3R5bGU9YX0pKGpTdCk7dmFyIEdTdD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoR1N0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgV1N0PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQodCxlKXt0aGlzLl9zdmdEcmF3ZXJGYWN0b3J5PXQsdGhpcy5fY2FudmFzRHJhd2VyRmFjdG9yeT1lfXJldHVybiB0LnByb3RvdHlwZS51c2VTVkc9ZnVuY3Rpb24odCl7bnVsbCE9dGhpcy5fY3VycmVudERyYXdlciYmdGhpcy5fY3VycmVudERyYXdlci5yZW1vdmUoKTt2YXIgZT10aGlzLl9zdmdEcmF3ZXJGYWN0b3J5KCk7ZS5hdHRhY2hUbyh0KSx0aGlzLl9jdXJyZW50RHJhd2VyPWV9LHQucHJvdG90eXBlLnVzZUNhbnZhcz1mdW5jdGlvbih0KXtudWxsIT10aGlzLl9jdXJyZW50RHJhd2VyJiZ0aGlzLl9jdXJyZW50RHJhd2VyLnJlbW92ZSgpLHRoaXMuX2N1cnJlbnREcmF3ZXI9dGhpcy5fY2FudmFzRHJhd2VyRmFjdG9yeSh0Lm5vZGUoKS5nZXRDb250ZXh0KCIyZCIpKX0sdC5wcm90b3R5cGUuZ2V0RHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2N1cnJlbnREcmF3ZXJ9LHQucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe251bGwhPXRoaXMuX2N1cnJlbnREcmF3ZXImJnRoaXMuX2N1cnJlbnREcmF3ZXIucmVtb3ZlKCl9LHQucHJvdG90eXBlLmRyYXc9ZnVuY3Rpb24odCxlKXt0aGlzLl9jdXJyZW50RHJhd2VyLmRyYXcodCxlKX0sdC5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlcz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9jdXJyZW50RHJhd2VyLmdldFZpc3VhbFByaW1pdGl2ZXMoKX0sdC5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fY3VycmVudERyYXdlci5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4KHQpfSx0fSkoKTtHU3QuUHJveHlEcmF3ZXI9V1N0O3ZhciBxU3Q9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KHFTdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIFlTdD13cHQsWFN0PURfdCwkU3Q9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdCh0LGUpe3RoaXMuX3Jvb3Q9WVN0LnNlbGVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwiZyIpKSx0aGlzLl9jbGFzc05hbWU9ZSx0aGlzLl9zdmdFbGVtZW50TmFtZT10fXJldHVybiB0LnByb3RvdHlwZS5kcmF3PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpczt0aGlzLl9jcmVhdGVBbmREZXN0cm95RE9NRWxlbWVudHModCk7Zm9yKHZhciBpPTAscj1lLmxlbmd0aCxvPWZ1bmN0aW9uKHIpe3ZhciBvPWVbcl07WFN0LldpbmRvdy5zZXRUaW1lb3V0KChmdW5jdGlvbigpe3JldHVybiBuLl9kcmF3U3RlcChvKX0pLGkpLGkrPW8uYW5pbWF0b3IudG90YWxUaW1lKHQubGVuZ3RoKX0sYT0wO2E8cjthKyspbyhhKX0sdC5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlcz1mdW5jdGlvbigpe3JldHVybiBudWxsPT10aGlzLl9jYWNoZWRWaXN1YWxQcmltaXRpdmVzTm9kZXMmJih0aGlzLl9jYWNoZWRWaXN1YWxQcmltaXRpdmVzTm9kZXM9dGhpcy5fc2VsZWN0aW9uLm5vZGVzKCkpLHRoaXMuX2NhY2hlZFZpc3VhbFByaW1pdGl2ZXNOb2Rlc30sdC5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVNYXA/bnVsbDp0aGlzLl9jYWNoZWRWaXN1YWxQcmltaXRpdmVzTm9kZU1hcC5nZXQodCl9LHQucHJvdG90eXBlLnJlbW92ZT1mdW5jdGlvbigpe3RoaXMuX3Jvb3QucmVtb3ZlKCl9LHQucHJvdG90eXBlLmF0dGFjaFRvPWZ1bmN0aW9uKHQpe3Qubm9kZSgpLmFwcGVuZENoaWxkKHRoaXMuX3Jvb3Qubm9kZSgpKX0sdC5wcm90b3R5cGUuZ2V0Um9vdD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb290fSx0LnByb3RvdHlwZS5zZWxlY3Rvcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9zdmdFbGVtZW50TmFtZX0sdC5wcm90b3R5cGUuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXM9ZnVuY3Rpb24odCl7fSx0LnByb3RvdHlwZS5fY3JlYXRlQW5kRGVzdHJveURPTUVsZW1lbnRzPWZ1bmN0aW9uKHQpe3ZhciBlPXQubWFwKChmdW5jdGlvbih0LGUpe3JldHVybiBudWxsIT10P3tkOnQsaTplfTpudWxsfSkpLmZpbHRlcigoZnVuY3Rpb24odCl7cmV0dXJuIG51bGwhPXR9KSksbj10aGlzLl9yb290LnNlbGVjdEFsbCh0aGlzLnNlbGVjdG9yKCkpLmRhdGEoZSk7dGhpcy5fc2VsZWN0aW9uPW4uZW50ZXIoKS5hcHBlbmQodGhpcy5fc3ZnRWxlbWVudE5hbWUpLm1lcmdlKG4pLG4uZXhpdCgpLnJlbW92ZSgpO3ZhciBpPW5ldyBYU3QuTWFwO3RoaXMuX3NlbGVjdGlvbi5lYWNoKChmdW5jdGlvbih0KXtpLnNldCh0LmksdGhpcyl9KSksdGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVNYXA9aSx0aGlzLl9jYWNoZWRWaXN1YWxQcmltaXRpdmVzTm9kZXM9bnVsbCx0aGlzLl9zZWxlY3Rpb24uZGF0YSh0aGlzLl9zZWxlY3Rpb24uZGF0YSgpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZH0pKSksbnVsbCE9dGhpcy5fY2xhc3NOYW1lJiZ0aGlzLl9zZWxlY3Rpb24uY2xhc3NlZCh0aGlzLl9jbGFzc05hbWUsITApLHRoaXMuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXModGhpcy5fc2VsZWN0aW9uKX0sdC5wcm90b3R5cGUuX2RyYXdTdGVwPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7WyJmaWxsIiwic3Ryb2tlIl0uZm9yRWFjaCgoZnVuY3Rpb24obil7bnVsbCE9dC5hdHRyVG9BcHBsaWVkUHJvamVjdG9yW25dJiZlLl9zZWxlY3Rpb24uYXR0cihuLHQuYXR0clRvQXBwbGllZFByb2plY3RvcltuXSl9KSksdC5hbmltYXRvci5hbmltYXRlKHRoaXMuX3NlbGVjdGlvbix0LmF0dHJUb0FwcGxpZWRQcm9qZWN0b3IpLG51bGwhPXRoaXMuX2NsYXNzTmFtZSYmdGhpcy5fc2VsZWN0aW9uLmNsYXNzZWQodGhpcy5fY2xhc3NOYW1lLCEwKX0sdH0pKCk7cVN0LlNWR0RyYXdlcj0kU3Q7dmFyIEtTdD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNy1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoS1N0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgWlN0PShmdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXt2YXIgdD10aGlzO3RoaXMuc2NhbGU9MCx0aGlzLnRyYW5zbGF0ZT0wLHRoaXMuY2FjaGVkRG9tYWluPVtudWxsLG51bGxdLHRoaXMubGFzdFNlZW5Eb21haW49W251bGwsbnVsbF0sdGhpcy51cGRhdGVEb21haW49ZnVuY3Rpb24oZSl7dC5sYXN0U2VlbkRvbWFpbj1lLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCk7dmFyIG49ZS5zY2FsZVRyYW5zZm9ybWF0aW9uKHQuY2FjaGVkRG9tYWluWzFdKS1lLnNjYWxlVHJhbnNmb3JtYXRpb24odC5jYWNoZWREb21haW5bMF0pLGk9ZS5zY2FsZVRyYW5zZm9ybWF0aW9uKHQubGFzdFNlZW5Eb21haW5bMV0pLWUuc2NhbGVUcmFuc2Zvcm1hdGlvbih0Lmxhc3RTZWVuRG9tYWluWzBdKTt0LnNjYWxlPW4vaXx8MSx0LnRyYW5zbGF0ZT1lLnNjYWxlVHJhbnNmb3JtYXRpb24odC5jYWNoZWREb21haW5bMF0pLWUuc2NhbGVUcmFuc2Zvcm1hdGlvbih0Lmxhc3RTZWVuRG9tYWluWzBdKSp0LnNjYWxlfHwwfX1yZXR1cm4gdC5wcm90b3R5cGUucmVzZXQ9ZnVuY3Rpb24oKXt0aGlzLnNjYWxlPTEsdGhpcy50cmFuc2xhdGU9MCx0aGlzLmNhY2hlZERvbWFpbj10aGlzLmxhc3RTZWVuRG9tYWlufSx0LnByb3RvdHlwZS5zZXREb21haW49ZnVuY3Rpb24odCl7dGhpcy5jYWNoZWREb21haW49dC5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbigpfSx0fSkoKSxKU3Q9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLG4pe3ZhciBpPXRoaXM7dGhpcy5yZW5kZXJDYWxsYmFjaz1lLHRoaXMuYXBwbHlUcmFuc2Zvcm1DYWxsYmFjaz1uLHRoaXMuZG9tYWluVHJhbnNmb3JtWD1uZXcgWlN0LHRoaXMuZG9tYWluVHJhbnNmb3JtWT1uZXcgWlN0LHRoaXMucmVuZGVyRGVmZXJyZWQ9ZnVuY3Rpb24oKXtpLmFwcGx5VHJhbnNmb3JtKCksY2xlYXJUaW1lb3V0KGkudGltZW91dFRva2VuKSxpLnRpbWVvdXRUb2tlbj1zZXRUaW1lb3V0KChmdW5jdGlvbigpe2kucmVuZGVyQ2FsbGJhY2soKX0pLHQuREVGRVJSRURfUkVOREVSSU5HX0RFTEFZKX19cmV0dXJuIHQucHJvdG90eXBlLnNldERvbWFpbnM9ZnVuY3Rpb24odCxlKXt0JiZ0aGlzLmRvbWFpblRyYW5zZm9ybVguc2V0RG9tYWluKHQpLGUmJnRoaXMuZG9tYWluVHJhbnNmb3JtWS5zZXREb21haW4oZSksdGhpcy5yZW5kZXJEZWZlcnJlZCgpfSx0LnByb3RvdHlwZS51cGRhdGVEb21haW5zPWZ1bmN0aW9uKHQsZSl7dCYmdGhpcy5kb21haW5UcmFuc2Zvcm1YLnVwZGF0ZURvbWFpbih0KSxlJiZ0aGlzLmRvbWFpblRyYW5zZm9ybVkudXBkYXRlRG9tYWluKGUpLHRoaXMucmVuZGVyRGVmZXJyZWQoKX0sdC5wcm90b3R5cGUucmVzZXRUcmFuc2Zvcm1zPWZ1bmN0aW9uKCl7dGhpcy5kb21haW5UcmFuc2Zvcm1YLnJlc2V0KCksdGhpcy5kb21haW5UcmFuc2Zvcm1ZLnJlc2V0KCksdGhpcy5hcHBseVRyYW5zZm9ybSgpfSx0LnByb3RvdHlwZS5hcHBseVRyYW5zZm9ybT1mdW5jdGlvbigpe3RoaXMuYXBwbHlUcmFuc2Zvcm1DYWxsYmFjayh0aGlzLmRvbWFpblRyYW5zZm9ybVgudHJhbnNsYXRlLHRoaXMuZG9tYWluVHJhbnNmb3JtWS50cmFuc2xhdGUsdGhpcy5kb21haW5UcmFuc2Zvcm1YLnNjYWxlLHRoaXMuZG9tYWluVHJhbnNmb3JtWS5zY2FsZSl9LHQuREVGRVJSRURfUkVOREVSSU5HX0RFTEFZPTIwMCx0fSkoKTtLU3QuRGVmZXJyZWRSZW5kZXJlcj1KU3QsCi8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShzU3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBRU3Q9Qk8sdE10PXdwdCxlTXQ9Zmd0LG5NdD1EX3QsaU10PWxTdCxyTXQ9Y1N0LG9NdD1PX3QsYU10PWpTdCxzTXQ9R1N0LGxNdD1xU3QsY010PV9ndCx1TXQ9S1N0O3NTdC5SZW5kZXJlcj1iZ3QubWFrZUVudW0oWyJzdmciLCJjYW52YXMiXSk7dmFyIGhNdD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBuPXQuY2FsbCh0aGlzKXx8dGhpcztuLl9kYXRhQ2hhbmdlZD0hMSxuLl9hdHRyRXh0ZW50cz17fSxuLl9hbmltYXRlPSExLG4uX2FuaW1hdG9ycz17fSxuLl9wcm9wZXJ0eUV4dGVudHM9e30sbi5fcmVzZXRFbnRpdHlTdG9yZT1mdW5jdGlvbigpe24uX2NhY2hlZEVudGl0eVN0b3JlPXZvaWQgMH0sbi5fb3ZlcmZsb3dIaWRkZW49ITAsbi5hZGRDbGFzcygicGxvdCIpLG4uX2RhdGFzZXRUb0RyYXdlcj1uZXcgbk10Lk1hcCxuLl9hdHRyQmluZGluZ3M9dE10Lm1hcCgpLG4uX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbi5faW5jbHVkZWRWYWx1ZXNGb3JTY2FsZSh0LGUpfSxuLl9yZW5kZXJDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiBuLnJlbmRlcigpfSxuLl9vbkRhdGFzZXRVcGRhdGVDYWxsYmFjaz1mdW5jdGlvbigpe3JldHVybiBuLl9vbkRhdGFzZXRVcGRhdGUoKX0sbi5fcHJvcGVydHlCaW5kaW5ncz10TXQubWFwKCk7dmFyIGk9KG5ldyBlTXQuRWFzaW5nKS5tYXhUb3RhbER1cmF0aW9uKGUuX0FOSU1BVElPTl9NQVhfRFVSQVRJT04pO3JldHVybiBuLmFuaW1hdG9yKGlNdC5BbmltYXRvci5NQUlOLGkpLG4uYW5pbWF0b3IoaU10LkFuaW1hdG9yLlJFU0VULG5ldyBlTXQuTnVsbCksbi5fZGVmZXJyZWRSZXNldEVudGl0eVN0b3JlPW5NdC5XaW5kb3cuZGVib3VuY2UodU10LkRlZmVycmVkUmVuZGVyZXIuREVGRVJSRURfUkVOREVSSU5HX0RFTEFZLG4uX3Jlc2V0RW50aXR5U3RvcmUpLG59cmV0dXJuIFFTdC5fX2V4dGVuZHMoZSx0KSxlLmdldFRvdGFsRHJhd1RpbWU9ZnVuY3Rpb24odCxlKXtyZXR1cm4gZS5yZWR1Y2UoKGZ1bmN0aW9uKGUsbil7cmV0dXJuIGUrbi5hbmltYXRvci50b3RhbFRpbWUodC5sZW5ndGgpfSksMCl9LGUuYXBwbHlEcmF3U3RlcHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdC5tYXAoKGZ1bmN0aW9uKHQpe3ZhciBuPXQuYXR0clRvUHJvamVjdG9yLGk9e307cmV0dXJuIE9iamVjdC5rZXlzKG4pLmZvckVhY2goKGZ1bmN0aW9uKHQpe2lbdF09ZnVuY3Rpb24oaSxyKXtyZXR1cm4gblt0XShpLHIsZSl9fSkpLHthdHRyVG9BcHBsaWVkUHJvamVjdG9yOmksYW5pbWF0b3I6dC5hbmltYXRvcn19KSl9LGUucHJvdG90eXBlLmFuY2hvcj1mdW5jdGlvbihlKXtyZXR1cm4gZT1jTXQuY29lcmNlRXh0ZXJuYWxEMyhlKSx0LnByb3RvdHlwZS5hbmNob3IuY2FsbCh0aGlzLGUpLHRoaXMuX2RhdGFDaGFuZ2VkPSEwLHRoaXMuX3Jlc2V0RW50aXR5U3RvcmUoKSx0aGlzLl91cGRhdGVFeHRlbnRzKCksdGhpc30sZS5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLl9pc1NldHVwfHwodC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyksbnVsbCE9dGhpcy5fY2FudmFzJiZ0aGlzLl9hcHBlbmRDYW52YXNOb2RlKCksdGhpcy5fcmVuZGVyQXJlYT10aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJyZW5kZXItYXJlYSIsITApLHRoaXMuZGF0YXNldHMoKS5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0KHQpfSkpKX0sZS5wcm90b3R5cGUuX2FwcGVuZENhbnZhc05vZGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmVsZW1lbnQoKS5zZWxlY3QoIi5wbG90LWNhbnZhcy1jb250YWluZXIiKTt0LmVtcHR5KCkmJih0PXRoaXMuZWxlbWVudCgpLmFwcGVuZCgiZGl2IikuY2xhc3NlZCgicGxvdC1jYW52YXMtY29udGFpbmVyIiwhMCkpLm5vZGUoKS5hcHBlbmRDaGlsZCh0aGlzLl9jYW52YXMubm9kZSgpKX0sZS5wcm90b3R5cGUuc2V0Qm91bmRzPWZ1bmN0aW9uKGUsbixpLHIpe2lmKHQucHJvdG90eXBlLnNldEJvdW5kcy5jYWxsKHRoaXMsZSxuLGksciksdGhpcy5fdXBkYXRlRXh0ZW50cygpLG51bGwhPXRoaXMuX2NhbnZhcyl7aWYodGhpcy5fYnVmZmVyQ2FudmFzJiYhdGhpcy5fYnVmZmVyQ2FudmFzVmFsaWQpe3RoaXMuX2J1ZmZlckNhbnZhcy5hdHRyKCJ3aWR0aCIsdGhpcy5fY2FudmFzLmF0dHIoIndpZHRoIikpLHRoaXMuX2J1ZmZlckNhbnZhcy5hdHRyKCJoZWlnaHQiLHRoaXMuX2NhbnZhcy5hdHRyKCJoZWlnaHQiKSk7dmFyIG89dGhpcy5fYnVmZmVyQ2FudmFzLm5vZGUoKS5nZXRDb250ZXh0KCIyZCIpO2lmKG8pe3ZhciBhPXRoaXMuX2NhbnZhcy5ub2RlKCk7YS53aWR0aD4wJiZhLmhlaWdodD4wP28uY2FudmFzLndpZHRoPjAmJm8uY2FudmFzLmhlaWdodD4wJiZvLmRyYXdJbWFnZShhLDAsMCk6Y29uc29sZS53YXJuKCJGYWlsZWQgdG8gZmlsbCBidWZmZXIgY2FudmFzIHdpdGggd2l0aCAweDAgY2FudmFzIil9dGhpcy5fYnVmZmVyQ2FudmFzVmFsaWQ9ITB9dmFyIHM9bnVsbCE9d2luZG93LmRldmljZVBpeGVsUmF0aW8/d2luZG93LmRldmljZVBpeGVsUmF0aW86MTt0aGlzLl9jYW52YXMuYXR0cigid2lkdGgiLGUqcyksdGhpcy5fY2FudmFzLmF0dHIoImhlaWdodCIsbipzKTt2YXIgbD10aGlzLl9jYW52YXMubm9kZSgpLmdldENvbnRleHQoIjJkIik7aWYobCYmKGwuc2V0VHJhbnNmb3JtKHMsMCwwLHMsMCwwKSx0aGlzLl9idWZmZXJDYW52YXMpKXt2YXIgYz10aGlzLl9idWZmZXJDYW52YXMubm9kZSgpO2Mud2lkdGg+MCYmYy5oZWlnaHQ+MD9sLmNhbnZhcy53aWR0aD4wJiZsLmNhbnZhcy5oZWlnaHQ+MCYmbC5kcmF3SW1hZ2UoYywwLDAsZSxuKTpjb25zb2xlLndhcm4oIkZhaWxlZCB0byBmaWxsIGNhbnZhcyB3aXRoIDB4MCBidWZmZXIgY2FudmFzIil9fXJldHVybiB0aGlzfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyksdGhpcy5fc2NhbGVzKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIHQub2ZmVXBkYXRlKGUuX3JlbmRlckNhbGxiYWNrKX0pKSx0aGlzLmRhdGFzZXRzKFtdKX0sZS5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9kYXRhc2V0VG9EcmF3ZXIuZ2V0KHQpO3JldHVybiJzdmciPT09dGhpcy5yZW5kZXJlcigpP2UudXNlU1ZHKHRoaXMuX3JlbmRlckFyZWEpOmUudXNlQ2FudmFzKHRoaXMuX2NhbnZhcyksZX0sZS5wcm90b3R5cGUuX2NyZWF0ZURyYXdlcj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IHNNdC5Qcm94eURyYXdlcigoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGxNdC5TVkdEcmF3ZXIoInBhdGgiLCIiKX0pLChmdW5jdGlvbih0KXtyZXR1cm4gbmV3IGFNdC5DYW52YXNEcmF3ZXIodCwoZnVuY3Rpb24oKXt9KSl9KSl9LGUucHJvdG90eXBlLl9nZXRBbmltYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYW5pbWF0ZU9uTmV4dFJlbmRlcigpJiZ0aGlzLl9hbmltYXRvcnNbdF18fG5ldyBlTXQuTnVsbH0sZS5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZT1mdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUV4dGVudHMoKSx0aGlzLl9kYXRhQ2hhbmdlZD0hMCx0aGlzLl9yZXNldEVudGl0eVN0b3JlKCksdGhpcy5yZW5kZXJMb3dQcmlvcml0eSgpfSxlLnByb3RvdHlwZS5hdHRyPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gbnVsbD09ZT90aGlzLl9hdHRyQmluZGluZ3MuZ2V0KHQpOih0aGlzLl9iaW5kQXR0cih0LGUsbiksdGhpcy5yZW5kZXIoKSx0aGlzKX0sZS5wcm90b3R5cGUuX2JpbmRQcm9wZXJ0eT1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj10aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldCh0KSxvPW51bGwhPXI/ci5zY2FsZTpudWxsO3RoaXMuX3Byb3BlcnR5QmluZGluZ3Muc2V0KHQse2FjY2Vzc29yOiJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6ZnVuY3Rpb24oKXtyZXR1cm4gZX0sc2NhbGU6bixwb3N0U2NhbGU6aX0pLG51bGwhPW8mJnRoaXMuX3VuaW5zdGFsbFNjYWxlRm9yS2V5KG8sdCksbnVsbCE9biYmdGhpcy5faW5zdGFsbFNjYWxlRm9yS2V5KG4sdCksdGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpfSxlLnByb3RvdHlwZS5fYmluZEF0dHI9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXMuX2F0dHJCaW5kaW5ncy5nZXQodCkscj1udWxsIT1pP2kuc2NhbGU6bnVsbDt0aGlzLl9hdHRyQmluZGluZ3Muc2V0KHQse2FjY2Vzc29yOiJmdW5jdGlvbiI9PXR5cGVvZiBlP2U6ZnVuY3Rpb24oKXtyZXR1cm4gZX0sc2NhbGU6bn0pLG51bGwhPXImJnRoaXMuX3VuaW5zdGFsbFNjYWxlRm9yS2V5KHIsdCksbnVsbCE9biYmdGhpcy5faW5zdGFsbFNjYWxlRm9yS2V5KG4sdCksdGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpfSxlLnByb3RvdHlwZS5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZT1mdW5jdGlvbigpe2RlbGV0ZSB0aGlzLl9jYWNoZWRBdHRyVG9Qcm9qZWN0b3J9LGUucHJvdG90eXBlLl9nZXRBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXtpZihudWxsPT10aGlzLl9jYWNoZWRBdHRyVG9Qcm9qZWN0b3Ipe3ZhciB0PXRoaXMuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yKCk7ZS5PUFRJTUlaRV9NRU1PSVpFX1BST0pFQ1RPUlMmJih0PXJNdC5tZW1vaXplUHJvamVjdG9ycyh0KSksdGhpcy5fY2FjaGVkQXR0clRvUHJvamVjdG9yPXR9cmV0dXJuIG5NdC5hc3NpZ24oe30sdGhpcy5fY2FjaGVkQXR0clRvUHJvamVjdG9yKX0sZS5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yPWZ1bmN0aW9uKCl7dmFyIHQ9e307dGhpcy5fYXR0ckJpbmRpbmdzLmVhY2goKGZ1bmN0aW9uKG4saSl7dFtpXT1lLl9zY2FsZWRBY2Nlc3NvcihuKX0pKTt2YXIgbj10aGlzLl9wcm9wZXJ0eVByb2plY3RvcnMoKTtyZXR1cm4gT2JqZWN0LmtleXMobikuZm9yRWFjaCgoZnVuY3Rpb24oZSl7bnVsbD09dFtlXSYmKHRbZV09bltlXSl9KSksdH0sZS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXtyZXR1cm4gdC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKSx0aGlzLl9pc0FuY2hvcmVkJiYodGhpcy5fcGFpbnQoKSx0aGlzLl9kYXRhQ2hhbmdlZD0hMSksdGhpc30sZS5wcm90b3R5cGUucmVuZGVyTG93UHJpb3JpdHk9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcmVuZGVyQ2FsbGJhY2soKSx0aGlzfSxlLnByb3RvdHlwZS5hbmltYXRlZD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9hbmltYXRlOih0aGlzLl9hbmltYXRlPXQsdGhpcyl9LGUucHJvdG90eXBlLmRldGFjaD1mdW5jdGlvbigpe3JldHVybiB0LnByb3RvdHlwZS5kZXRhY2guY2FsbCh0aGlzKSx0aGlzLl91cGRhdGVFeHRlbnRzKCksdGhpc30sZS5wcm90b3R5cGUuX3NjYWxlcz1mdW5jdGlvbigpe3ZhciB0PVtdO3JldHVybiB0aGlzLl9hdHRyQmluZGluZ3MuZWFjaCgoZnVuY3Rpb24oZSxuKXt2YXIgaT1lLnNjYWxlO251bGwhPWkmJi0xPT09dC5pbmRleE9mKGkpJiZ0LnB1c2goaSl9KSksdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5lYWNoKChmdW5jdGlvbihlLG4pe3ZhciBpPWUuc2NhbGU7bnVsbCE9aSYmLTE9PT10LmluZGV4T2YoaSkmJnQucHVzaChpKX0pKSx0fSxlLnByb3RvdHlwZS5fdXBkYXRlRXh0ZW50cz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5fcmVzZXRFbnRpdHlTdG9yZSgpLHRoaXMuX3NjYWxlcygpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3JldHVybiBlLmFkZEluY2x1ZGVkVmFsdWVzUHJvdmlkZXIodC5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcil9KSl9LGUucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbH0sZS5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvckF0dHI9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztpZihudWxsPT10aGlzLl9hdHRyRXh0ZW50c1t0XSl7dmFyIG49ck10Lm1lbVRodW5rKChmdW5jdGlvbigpe3JldHVybiBlLmRhdGFzZXRzKCl9KSwoZnVuY3Rpb24oKXtyZXR1cm4gZS5fYXR0ckJpbmRpbmdzLmdldCh0KX0pLChmdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT1lfHxudWxsPT1lLmFjY2Vzc29yP251bGw6dC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBkTXQodCxlLG51bGwpfSkpfSkpO3RoaXMuX2F0dHJFeHRlbnRzW3RdPW59cmV0dXJuIHRoaXMuX2F0dHJFeHRlbnRzW3RdKCl9LGUucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbih0KXt2YXIgZT10aGlzO2lmKG51bGw9PXRoaXMuX3Byb3BlcnR5RXh0ZW50c1t0XSl7dmFyIG49ck10Lm1lbVRodW5rKChmdW5jdGlvbigpe3JldHVybiBlLmRhdGFzZXRzKCl9KSwoZnVuY3Rpb24oKXtyZXR1cm4gZS5fcHJvcGVydHlCaW5kaW5ncy5nZXQodCl9KSwoZnVuY3Rpb24oKXtyZXR1cm4gZS5fZmlsdGVyRm9yUHJvcGVydHkodCl9KSwoZnVuY3Rpb24odCxlLG4pe3JldHVybiBudWxsPT1lfHxudWxsPT1lLmFjY2Vzc29yP251bGw6dC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBkTXQodCxlLG4pfSkpfSkpO3RoaXMuX3Byb3BlcnR5RXh0ZW50c1t0XT1ufXJldHVybiB0aGlzLl9wcm9wZXJ0eUV4dGVudHNbdF0oKX0sZS5wcm90b3R5cGUuX2luY2x1ZGVkVmFsdWVzRm9yU2NhbGU9ZnVuY3Rpb24odCxlKXt2YXIgbj10aGlzO2lmKCF0aGlzLl9pc0FuY2hvcmVkJiYhZSlyZXR1cm5bXTt2YXIgaT1bXTtyZXR1cm4gdGhpcy5fYXR0ckJpbmRpbmdzLmVhY2goKGZ1bmN0aW9uKGUscil7aWYoZS5zY2FsZT09PXQpe3ZhciBvPW4uZ2V0RXh0ZW50c0ZvckF0dHIocik7bnVsbCE9byYmKGk9aS5jb25jYXQodE10Lm1lcmdlKG8pKSl9fSkpLHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZWFjaCgoZnVuY3Rpb24oZSxyKXtpZihlLnNjYWxlPT09dCl7dmFyIG89bi5nZXRFeHRlbnRzRm9yUHJvcGVydHkocik7bnVsbCE9byYmKGk9aS5jb25jYXQodE10Lm1lcmdlKG8pKSl9fSkpLGl9LGUucHJvdG90eXBlLmFuaW1hdG9yPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHZvaWQgMD09PWU/dGhpcy5fYW5pbWF0b3JzW3RdOih0aGlzLl9hbmltYXRvcnNbdF09ZSx0aGlzKX0sZS5wcm90b3R5cGUucmVuZGVyZXI9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztyZXR1cm4gdm9pZCAwPT09dD9udWxsPT10aGlzLl9jYW52YXM/InN2ZyI6ImNhbnZhcyI6KG51bGw9PXRoaXMuX2NhbnZhcyYmImNhbnZhcyI9PT10Pyh0aGlzLl9jYW52YXM9dE10LnNlbGVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSkuY2xhc3NlZCgicGxvdC1jYW52YXMiLCEwKSx0aGlzLl9idWZmZXJDYW52YXM9dE10LnNlbGVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSksbnVsbCE9dGhpcy5lbGVtZW50KCkmJnRoaXMuX2FwcGVuZENhbnZhc05vZGUoKSx0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuZm9yRWFjaCgoZnVuY3Rpb24odCl7dC51c2VDYW52YXMoZS5fY2FudmFzKX0pKSx0aGlzLnJlbmRlcigpKTpudWxsIT10aGlzLl9jYW52YXMmJiJzdmciPT10JiYodGhpcy5fY2FudmFzLnJlbW92ZSgpLHRoaXMuX2NhbnZhcz1udWxsLHRoaXMuX2J1ZmZlckNhbnZhcz1udWxsLHRoaXMuX2RhdGFzZXRUb0RyYXdlci5mb3JFYWNoKChmdW5jdGlvbih0KXt0LnVzZVNWRyhlLl9yZW5kZXJBcmVhKX0pKSx0aGlzLnJlbmRlcigpKSx0aGlzKX0sZS5wcm90b3R5cGUuYWRkRGF0YXNldD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fYWRkRGF0YXNldCh0KSx0aGlzLl9vbkRhdGFzZXRVcGRhdGUoKSx0aGlzfSxlLnByb3RvdHlwZS5fYWRkRGF0YXNldD1mdW5jdGlvbih0KXt0aGlzLl9yZW1vdmVEYXRhc2V0KHQpO3ZhciBlPXRoaXMuX2NyZWF0ZURyYXdlcih0KTtyZXR1cm4gdGhpcy5fZGF0YXNldFRvRHJhd2VyLnNldCh0LGUpLHRoaXMuX2lzU2V0dXAmJnRoaXMuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldCh0KSx0Lm9uVXBkYXRlKHRoaXMuX29uRGF0YXNldFVwZGF0ZUNhbGxiYWNrKSx0aGlzfSxlLnByb3RvdHlwZS5yZW1vdmVEYXRhc2V0PWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9yZW1vdmVEYXRhc2V0KHQpLHRoaXMuX29uRGF0YXNldFVwZGF0ZSgpLHRoaXN9LGUucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0PWZ1bmN0aW9uKHQpe3JldHVybi0xPT09dGhpcy5kYXRhc2V0cygpLmluZGV4T2YodCl8fCh0aGlzLl9yZW1vdmVEYXRhc2V0Tm9kZXModCksdC5vZmZVcGRhdGUodGhpcy5fb25EYXRhc2V0VXBkYXRlQ2FsbGJhY2spLHRoaXMuX2RhdGFzZXRUb0RyYXdlci5kZWxldGUodCkpLHRoaXN9LGUucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXM9ZnVuY3Rpb24odCl7dGhpcy5fZGF0YXNldFRvRHJhd2VyLmdldCh0KS5yZW1vdmUoKX0sZS5wcm90b3R5cGUuZGF0YXNldHM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPVtdO3JldHVybiB0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gbi5wdXNoKGUpfSkpLG51bGw9PXQ/bjoobi5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gZS5fcmVtb3ZlRGF0YXNldCh0KX0pKSx0LmZvckVhY2goKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9hZGREYXRhc2V0KHQpfSkpLHRoaXMuX29uRGF0YXNldFVwZGF0ZSgpLHRoaXMpfSxlLnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9ZnVuY3Rpb24oKXtyZXR1cm5be2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjpuZXcgZU10Lk51bGx9XX0sZS5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD1mdW5jdGlvbih0KXt9LGUucHJvdG90eXBlLl9idWlsZExpZ2h0d2VpZ2h0UGxvdEVudGl0aWVzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj1bXTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0LGkpe2Zvcih2YXIgcj1lLl9kYXRhc2V0VG9EcmF3ZXIuZ2V0KHQpLG89MCxhPXQuZGF0YSgpLHM9YS5sZW5ndGgsbD1mdW5jdGlvbihzKXt2YXIgbD1hW3NdLGM9ZS5fcGl4ZWxQb2ludChsLHMsdCk7aWYobk10Lk1hdGguaXNOYU4oYy54KXx8bk10Lk1hdGguaXNOYU4oYy55KSlyZXR1cm4iY29udGludWUiO3ZhciB1PWU7bi5wdXNoKHtkYXR1bTpsLGdldCBwb3NpdGlvbigpe3JldHVybiB1Ll9waXhlbFBvaW50LmNhbGwodSxsLHMsdCl9LGluZGV4OnMsZGF0YXNldDp0LGRhdGFzZXRJbmRleDppLGNvbXBvbmVudDplLGRyYXdlcjpyLHZhbGlkRGF0dW1JbmRleDpvfSksbysrfSxjPTA7YzxzO2MrKylsKGMpfSkpLG59LGUucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3PWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IG5NdC5NYXA7cmV0dXJuIHRoaXMuZGF0YXNldHMoKS5mb3JFYWNoKChmdW5jdGlvbihlKXtyZXR1cm4gdC5zZXQoZSxlLmRhdGEoKSl9KSksdH0sZS5wcm90b3R5cGUuX3BhaW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztkZWxldGUgdGhpcy5fY2FjaGVkQXR0clRvUHJvamVjdG9yO3ZhciBuPXRoaXMuX2dlbmVyYXRlRHJhd1N0ZXBzKCksaT10aGlzLl9nZXREYXRhVG9EcmF3KCkscj10aGlzLmRhdGFzZXRzKCkubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gdC5fZGF0YXNldFRvRHJhd2VyLmdldChlKX0pKTtpZigiY2FudmFzIj09PXRoaXMucmVuZGVyZXIoKSl7dmFyIG89dGhpcy5fY2FudmFzLm5vZGUoKTtvLmdldENvbnRleHQoIjJkIikuY2xlYXJSZWN0KDAsMCxvLmNsaWVudFdpZHRoLG8uY2xpZW50SGVpZ2h0KSx0aGlzLl9idWZmZXJDYW52YXNWYWxpZD0hMX10aGlzLmRhdGFzZXRzKCkuZm9yRWFjaCgoZnVuY3Rpb24odCxvKXt2YXIgYT1lLmFwcGx5RHJhd1N0ZXBzKG4sdCk7cltvXS5kcmF3KGkuZ2V0KHQpLGEpfSkpO3ZhciBhPXRoaXMuZGF0YXNldHMoKS5tYXAoKGZ1bmN0aW9uKHQscil7cmV0dXJuIGUuZ2V0VG90YWxEcmF3VGltZShpLmdldCh0KSxuKX0pKSxzPW5NdC5NYXRoLm1heChhLDApO3RoaXMuX2FkZGl0aW9uYWxQYWludChzKX0sZS5wcm90b3R5cGUuc2VsZWN0aW9ucz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO2lmKHZvaWQgMD09PXQmJih0PXRoaXMuZGF0YXNldHMoKSksImNhbnZhcyI9PT10aGlzLnJlbmRlcmVyKCkpcmV0dXJuIHRNdC5zZWxlY3RBbGwoKTt2YXIgbj1bXTtyZXR1cm4gdC5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgaT1lLl9kYXRhc2V0VG9EcmF3ZXIuZ2V0KHQpO2lmKG51bGwhPWkpe3ZhciByPWkuZ2V0VmlzdWFsUHJpbWl0aXZlcygpO24ucHVzaC5hcHBseShuLHIpfX0pKSx0TXQuc2VsZWN0QWxsKG4pfSxlLnByb3RvdHlwZS5lbnRpdGllcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybiB0aGlzLl9nZXRFbnRpdHlTdG9yZSh0KS5lbnRpdGllcygpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGUuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eSh0KX0pKX0sZS5wcm90b3R5cGUuZmlsdGVyRW50aXRpZXM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcztyZXR1cm4gdGhpcy5fZ2V0RW50aXR5U3RvcmUoKS5lbnRpdGllcygpLmZpbHRlcih0KS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkodCl9KSl9LGUucHJvdG90eXBlLl9nZXRFbnRpdHlTdG9yZT1mdW5jdGlvbih0KXt2YXIgZSxuPXRoaXMsaT1mdW5jdGlvbih0KXtyZXR1cm4gbi5fZW50aXR5Qm91bmRzKHQpfTtyZXR1cm4gdm9pZCAwIT09dD8oKGU9bmV3IG5NdC5FbnRpdHlTdG9yZSkuYWRkQWxsKHRoaXMuX2J1aWxkTGlnaHR3ZWlnaHRQbG90RW50aXRpZXModCksaSx0aGlzLl9sb2NhbE9yaWdpbkJvdW5kcygpKSxlKToodm9pZCAwPT09dGhpcy5fY2FjaGVkRW50aXR5U3RvcmUmJigoZT1uZXcgbk10LkVudGl0eVN0b3JlKS5hZGRBbGwodGhpcy5fYnVpbGRMaWdodHdlaWdodFBsb3RFbnRpdGllcyh0aGlzLmRhdGFzZXRzKCkpLGksdGhpcy5fbG9jYWxPcmlnaW5Cb3VuZHMoKSksdGhpcy5fY2FjaGVkRW50aXR5U3RvcmU9ZSksdGhpcy5fY2FjaGVkRW50aXR5U3RvcmUpfSxlLnByb3RvdHlwZS5fbG9jYWxPcmlnaW5Cb3VuZHM9ZnVuY3Rpb24oKXtyZXR1cm57dG9wTGVmdDp7eDowLHk6MH0sYm90dG9tUmlnaHQ6e3g6dGhpcy53aWR0aCgpLHk6dGhpcy5oZWlnaHQoKX19fSxlLnByb3RvdHlwZS5fZW50aXR5Qm91bmRzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3BpeGVsUG9pbnQodC5kYXR1bSx0LmluZGV4LHQuZGF0YXNldCk7cmV0dXJue3g6ZS54LHk6ZS55LHdpZHRoOjAsaGVpZ2h0OjB9fSxlLnByb3RvdHlwZS5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5PWZ1bmN0aW9uKHQpe3JldHVybntib3VuZHM6dGhpcy5fZW50aXR5Qm91bmRzKHQpLGNvbXBvbmVudDp0LmNvbXBvbmVudCxkYXRhc2V0OnQuZGF0YXNldCxkYXRhc2V0SW5kZXg6dC5kYXRhc2V0SW5kZXgsZGF0dW06dC5kYXR1bSxpbmRleDp0LmluZGV4LHBvc2l0aW9uOnQucG9zaXRpb24sc2VsZWN0aW9uOnRNdC5zZWxlY3QodC5kcmF3ZXIuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleCh0LnZhbGlkRGF0dW1JbmRleCkpfX0sZS5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbih0KXt0aHJvdyBuZXcgRXJyb3IoInBsb3RzIG11c3QgaW1wbGVtZW50IGVudGl0aWVzQXQiKX0sZS5wcm90b3R5cGUuZW50aXR5TmVhcmVzdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0eU5lYXJlc3QodCk7cmV0dXJuIHZvaWQgMD09PWU/dm9pZCAwOnRoaXMuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShlKX0sZS5wcm90b3R5cGUuZW50aXRpZXNJbj1mdW5jdGlvbih0LGUpe3ZhciBuO2lmKG51bGw9PWUpe249e3g6dC50b3BMZWZ0LngseTp0LnRvcExlZnQueSx3aWR0aDp0LmJvdHRvbVJpZ2h0LngtdC50b3BMZWZ0LngsaGVpZ2h0OnQuYm90dG9tUmlnaHQueS10LnRvcExlZnQueX19ZWxzZXtuPXt4OnQubWluLHk6ZS5taW4sd2lkdGg6dC5tYXgtdC5taW4saGVpZ2h0OmUubWF4LWUubWlufX1yZXR1cm4gdGhpcy5lbnRpdGllc0luQm91bmRzKG4pfSxlLnByb3RvdHlwZS5lbnRpdGllc0luQm91bmRzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10aGlzLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0aWVzSW5Cb3VuZHModCk7aWYobilyZXR1cm4gbi5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBlLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkodCl9KSl9LGUucHJvdG90eXBlLmVudGl0aWVzSW5YQm91bmRzPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMsbj10aGlzLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0aWVzSW5YQm91bmRzKHQpO2lmKG4pcmV0dXJuIG4ubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gZS5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5KHQpfSkpfSxlLnByb3RvdHlwZS5lbnRpdGllc0luWUJvdW5kcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49dGhpcy5fZ2V0RW50aXR5U3RvcmUoKS5lbnRpdGllc0luWUJvdW5kcyh0KTtpZihuKXJldHVybiBuLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGUuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eSh0KX0pKX0sZS5wcm90b3R5cGUuX3VuaW5zdGFsbFNjYWxlRm9yS2V5PWZ1bmN0aW9uKHQsZSl7dC5vZmZVcGRhdGUodGhpcy5fcmVuZGVyQ2FsbGJhY2spLHQub2ZmVXBkYXRlKHRoaXMuX2RlZmVycmVkUmVzZXRFbnRpdHlTdG9yZSksdC5yZW1vdmVJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKHRoaXMuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXIpfSxlLnByb3RvdHlwZS5faW5zdGFsbFNjYWxlRm9yS2V5PWZ1bmN0aW9uKHQsZSl7dC5vblVwZGF0ZSh0aGlzLl9yZW5kZXJDYWxsYmFjayksdC5vblVwZGF0ZSh0aGlzLl9kZWZlcnJlZFJlc2V0RW50aXR5U3RvcmUpLHQuYWRkSW5jbHVkZWRWYWx1ZXNQcm92aWRlcih0aGlzLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKX0sZS5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycz1mdW5jdGlvbigpe3JldHVybnt9fSxlLl9zY2FsZWRBY2Nlc3Nvcj1mdW5jdGlvbih0KXt2YXIgZT10LnNjYWxlLG49dC5hY2Nlc3NvcixpPXQucG9zdFNjYWxlLHI9bnVsbD09ZT9uOmZ1bmN0aW9uKHQsaSxyKXtyZXR1cm4gZS5zY2FsZShuKHQsaSxyKSl9O3JldHVybiBudWxsPT1pP3I6ZnVuY3Rpb24odCxlLG4pe3JldHVybiBpKHIodCxlLG4pLHQsZSxuKX19LGUucHJvdG90eXBlLl9waXhlbFBvaW50PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm57eDowLHk6MH19LGUucHJvdG90eXBlLl9hbmltYXRlT25OZXh0UmVuZGVyPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGUmJnRoaXMuX2RhdGFDaGFuZ2VkfSxlLk9QVElNSVpFX01FTU9JWkVfUFJPSkVDVE9SUz0hMSxlLl9BTklNQVRJT05fTUFYX0RVUkFUSU9OPTYwMCxlfSkob010LkNvbXBvbmVudCk7ZnVuY3Rpb24gZE10KHQsZSxuKXt2YXIgaT1lLmFjY2Vzc29yLHI9ZS5zY2FsZTtpZihudWxsPT1yKXJldHVybltdO3ZhciBvPXQuZGF0YSgpO251bGwhPW4mJihvPW8uZmlsdGVyKChmdW5jdGlvbihlLGkpe3JldHVybiBuKGUsaSx0KX0pKSk7dmFyIGE9by5tYXAoKGZ1bmN0aW9uKGUsbil7cmV0dXJuIGkoZSxuLHQpfSkpO3JldHVybiByLmV4dGVudE9mVmFsdWVzKGEpfQovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL3NTdC5QbG90PWhNdCxPYmplY3QuZGVmaW5lUHJvcGVydHkoYVN0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcE10PUJPLGZNdD1zU3QsbU10PURfdCxnTXQ9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gbnVsbCE9PXQmJnQuYXBwbHkodGhpcyxhcmd1bWVudHMpfHx0aGlzfXJldHVybiBwTXQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuZW50aXR5TmVhcmVzdD1mdW5jdGlvbih0KXt2YXIgZSxuPTEvMDtyZXR1cm4gdGhpcy5jb21wb25lbnRzKCkuZm9yRWFjaCgoZnVuY3Rpb24oaSl7dmFyIHI9aS5lbnRpdHlOZWFyZXN0KHQpO2lmKG51bGwhPXIpe3ZhciBvPW1NdC5NYXRoLmRpc3RhbmNlU3F1YXJlZChyLnBvc2l0aW9uLHQpO288PW4mJihuPW8sZT1yKX19KSksZX0sZS5wcm90b3R5cGUuYXBwZW5kPWZ1bmN0aW9uKGUpe2lmKG51bGwhPWUmJiEoZSBpbnN0YW5jZW9mIGZNdC5QbG90KSl0aHJvdyBuZXcgRXJyb3IoIlBsb3QgR3JvdXAgb25seSBhY2NlcHRzIHBsb3RzIik7cmV0dXJuIHQucHJvdG90eXBlLmFwcGVuZC5jYWxsKHRoaXMsZSksdGhpc30sZX0pKF93dC5Hcm91cCk7YVN0LlBsb3RHcm91cD1nTXQ7dmFyIF9NdD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoX010LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgeU10PUJPLHZNdD13cHQsYk10PURfdCx4TXQ9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dm9pZCAwPT09ZSYmKGU9W10pO3ZhciBuPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gbi5fcm93UGFkZGluZz0wLG4uX2NvbHVtblBhZGRpbmc9MCxuLl9yb3dzPVtdLG4uX3Jvd1dlaWdodHM9W10sbi5fY29sdW1uV2VpZ2h0cz1bXSxuLl9uUm93cz0wLG4uX25Db2xzPTAsbi5fY2FsY3VsYXRlZExheW91dD1udWxsLG4uYWRkQ2xhc3MoInRhYmxlIiksZS5mb3JFYWNoKChmdW5jdGlvbih0LGUpe3QuZm9yRWFjaCgoZnVuY3Rpb24odCxpKXtudWxsIT10JiZuLmFkZCh0LGUsaSl9KSl9KSksbn1yZXR1cm4geU10Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLl9mb3JFYWNoPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZT0wO2U8dGhpcy5fblJvd3M7ZSsrKWZvcih2YXIgbj0wO248dGhpcy5fbkNvbHM7bisrKW51bGwhPXRoaXMuX3Jvd3NbZV1bbl0mJnQodGhpcy5fcm93c1tlXVtuXSl9LGUucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMuX25Sb3dzO2UrKylmb3IodmFyIG49MDtuPHRoaXMuX25Db2xzO24rKylpZih0aGlzLl9yb3dzW2VdW25dPT09dClyZXR1cm4hMDtyZXR1cm4hMX0sZS5wcm90b3R5cGUuY29tcG9uZW50QXQ9ZnVuY3Rpb24odCxlKXtyZXR1cm4gdDwwfHx0Pj10aGlzLl9uUm93c3x8ZTwwfHxlPj10aGlzLl9uQ29scz9udWxsOnRoaXMuX3Jvd3NbdF1bZV19LGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0LGUsbil7aWYobnVsbD09dCl0aHJvdyBFcnJvcigiQ2Fubm90IGFkZCBudWxsIHRvIGEgdGFibGUgY2VsbCIpO2lmKCF0aGlzLmhhcyh0KSl7aWYobnVsbCE9KHRoaXMuX3Jvd3NbZV0mJnRoaXMuX3Jvd3NbZV1bbl0pKXRocm93IG5ldyBFcnJvcigiY2VsbCBpcyBvY2N1cGllZCIpO3QuZGV0YWNoKCksdGhpcy5fblJvd3M9TWF0aC5tYXgoZSsxLHRoaXMuX25Sb3dzKSx0aGlzLl9uQ29scz1NYXRoLm1heChuKzEsdGhpcy5fbkNvbHMpLHRoaXMuX3BhZFRhYmxlVG9TaXplKHRoaXMuX25Sb3dzLHRoaXMuX25Db2xzKSx0aGlzLl9yb3dzW2VdW25dPXQsdGhpcy5fYWRvcHRBbmRBbmNob3IodCksdGhpcy5yZWRyYXcoKX1yZXR1cm4gdGhpc30sZS5wcm90b3R5cGUuX3JlbW92ZT1mdW5jdGlvbih0KXtmb3IodmFyIGU9MDtlPHRoaXMuX25Sb3dzO2UrKylmb3IodmFyIG49MDtuPHRoaXMuX25Db2xzO24rKylpZih0aGlzLl9yb3dzW2VdW25dPT09dClyZXR1cm4gdGhpcy5fcm93c1tlXVtuXT1udWxsLCEwO3JldHVybiExfSxlLnByb3RvdHlwZS5faXRlcmF0ZUxheW91dD1mdW5jdGlvbih0LG4saSl7dm9pZCAwPT09aSYmKGk9ITEpO2Zvcih2YXIgcixvLGEscyxsLGM9dGhpcy5fcm93cyx1PXZNdC50cmFuc3Bvc2UodGhpcy5fcm93cyksaD10LXRoaXMuX2NvbHVtblBhZGRpbmcqKHRoaXMuX25Db2xzLTEpLGQ9bi10aGlzLl9yb3dQYWRkaW5nKih0aGlzLl9uUm93cy0xKSxwPWUuX2NhbGNDb21wb25lbnRXZWlnaHRzKHRoaXMuX3Jvd1dlaWdodHMsYywoZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXR8fHQuZml4ZWRIZWlnaHQoKX0pKSxmPWUuX2NhbGNDb21wb25lbnRXZWlnaHRzKHRoaXMuX2NvbHVtbldlaWdodHMsdSwoZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXR8fHQuZml4ZWRXaWR0aCgpfSkpLG09Zi5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiAwPT09dD8uNTp0fSkpLGc9cC5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiAwPT09dD8uNTp0fSkpLF89ZS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKG0saCkseT1lLl9jYWxjUHJvcG9ydGlvbmFsU3BhY2UoZyxkKSx2PWJNdC5BcnJheS5jcmVhdGVGaWxsZWRBcnJheSgwLHRoaXMuX25Db2xzKSxiPWJNdC5BcnJheS5jcmVhdGVGaWxsZWRBcnJheSgwLHRoaXMuX25Sb3dzKSx4PTA7Oyl7dmFyIHc9Yk10LkFycmF5LmFkZChiLHkpLFM9Yk10LkFycmF5LmFkZCh2LF8pO3Y9KGE9dGhpcy5fZGV0ZXJtaW5lR3VhcmFudGVlcyhTLHcsaSkpLmd1YXJhbnRlZWRXaWR0aHMsYj1hLmd1YXJhbnRlZWRIZWlnaHRzLHM9YS53YW50c1dpZHRoQXJyLnNvbWUoKGZ1bmN0aW9uKHQpe3JldHVybiB0fSkpLGw9YS53YW50c0hlaWdodEFyci5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gdH0pKTt2YXIgTT1yLEU9bztyPWgtdk10LnN1bShhLmd1YXJhbnRlZWRXaWR0aHMpLG89ZC12TXQuc3VtKGEuZ3VhcmFudGVlZEhlaWdodHMpO3ZhciBUPXZvaWQgMDtzPyhUPWEud2FudHNXaWR0aEFyci5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0Py4xOjB9KSksVD1iTXQuQXJyYXkuYWRkKFQsZikpOlQ9Zjt2YXIgQz12b2lkIDA7aWYobD8oQz1hLndhbnRzSGVpZ2h0QXJyLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQ/LjE6MH0pKSxDPWJNdC5BcnJheS5hZGQoQyxwKSk6Qz1wLF89ZS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKFQscikseT1lLl9jYWxjUHJvcG9ydGlvbmFsU3BhY2UoQyxvKSx4KyssIShyPjAmJnIhPT1NKSYmIShvPjAmJm8hPT1FKSlicmVhaztpZih4PjUpYnJlYWt9cmV0dXJuIHI9aC12TXQuc3VtKGEuZ3VhcmFudGVlZFdpZHRocyksbz1kLXZNdC5zdW0oYS5ndWFyYW50ZWVkSGVpZ2h0cykse2NvbFByb3BvcnRpb25hbFNwYWNlOl89ZS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKGYscikscm93UHJvcG9ydGlvbmFsU3BhY2U6eT1lLl9jYWxjUHJvcG9ydGlvbmFsU3BhY2UocCxvKSxndWFyYW50ZWVkV2lkdGhzOmEuZ3VhcmFudGVlZFdpZHRocyxndWFyYW50ZWVkSGVpZ2h0czphLmd1YXJhbnRlZWRIZWlnaHRzLHdhbnRzV2lkdGg6cyx3YW50c0hlaWdodDpsfX0sZS5wcm90b3R5cGUuX2RldGVybWluZUd1YXJhbnRlZXM9ZnVuY3Rpb24odCxlLG4pe3ZvaWQgMD09PW4mJihuPSExKTt2YXIgaT1iTXQuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCx0aGlzLl9uQ29scykscj1iTXQuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCx0aGlzLl9uUm93cyksbz1iTXQuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoITEsdGhpcy5fbkNvbHMpLGE9Yk10LkFycmF5LmNyZWF0ZUZpbGxlZEFycmF5KCExLHRoaXMuX25Sb3dzKTtyZXR1cm4gdGhpcy5fcm93cy5mb3JFYWNoKChmdW5jdGlvbihzLGwpe3MuZm9yRWFjaCgoZnVuY3Rpb24ocyxjKXt2YXIgdTt1PW51bGwhPXM/cy5yZXF1ZXN0ZWRTcGFjZSh0W2NdLGVbbF0pOnttaW5XaWR0aDowLG1pbkhlaWdodDowfTt2YXIgaD1uP01hdGgubWluKHUubWluV2lkdGgsdFtjXSk6dS5taW5XaWR0aDtpW2NdPU1hdGgubWF4KGlbY10saCk7dmFyIGQ9bj9NYXRoLm1pbih1Lm1pbkhlaWdodCxlW2xdKTp1Lm1pbkhlaWdodDtyW2xdPU1hdGgubWF4KHJbbF0sZCksb1tjXT1vW2NdfHx1Lm1pbldpZHRoPnRbY10sYVtsXT1hW2xdfHx1Lm1pbkhlaWdodD5lW2xdfSkpfSkpLHtndWFyYW50ZWVkV2lkdGhzOmksZ3VhcmFudGVlZEhlaWdodHM6cix3YW50c1dpZHRoQXJyOm8sd2FudHNIZWlnaHRBcnI6YX19LGUucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRoaXMuX2NhbGN1bGF0ZWRMYXlvdXQ9dGhpcy5faXRlcmF0ZUxheW91dCh0LGUpLHttaW5XaWR0aDp2TXQuc3VtKHRoaXMuX2NhbGN1bGF0ZWRMYXlvdXQuZ3VhcmFudGVlZFdpZHRocyksbWluSGVpZ2h0OnZNdC5zdW0odGhpcy5fY2FsY3VsYXRlZExheW91dC5ndWFyYW50ZWVkSGVpZ2h0cyl9fSxlLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKGUsbixpKXt2YXIgcj10aGlzO3QucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLGUsbixpKTt2YXIgbz12TXQuc3VtKHRoaXMuX2NhbGN1bGF0ZWRMYXlvdXQuZ3VhcmFudGVlZFdpZHRocyksYT12TXQuc3VtKHRoaXMuX2NhbGN1bGF0ZWRMYXlvdXQuZ3VhcmFudGVlZEhlaWdodHMpLHM9dGhpcy5fY2FsY3VsYXRlZExheW91dDsobz50aGlzLndpZHRoKCl8fGE+dGhpcy5oZWlnaHQoKSkmJihzPXRoaXMuX2l0ZXJhdGVMYXlvdXQodGhpcy53aWR0aCgpLHRoaXMuaGVpZ2h0KCksITApKTt2YXIgbD0wLGM9Yk10LkFycmF5LmFkZChzLnJvd1Byb3BvcnRpb25hbFNwYWNlLHMuZ3VhcmFudGVlZEhlaWdodHMpLHU9Yk10LkFycmF5LmFkZChzLmNvbFByb3BvcnRpb25hbFNwYWNlLHMuZ3VhcmFudGVlZFdpZHRocyk7cmV0dXJuIHRoaXMuX3Jvd3MuZm9yRWFjaCgoZnVuY3Rpb24odCxlKXt2YXIgbj0wO3QuZm9yRWFjaCgoZnVuY3Rpb24odCxpKXtudWxsIT10JiZ0LmNvbXB1dGVMYXlvdXQoe3g6bix5Omx9LHVbaV0sY1tlXSksbis9dVtpXStyLl9jb2x1bW5QYWRkaW5nfSkpLGwrPWNbZV0rci5fcm93UGFkZGluZ30pKSx0aGlzfSxlLnByb3RvdHlwZS5yb3dQYWRkaW5nPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX3Jvd1BhZGRpbmc7aWYoIWJNdC5NYXRoLmlzVmFsaWROdW1iZXIodCl8fHQ8MCl0aHJvdyBFcnJvcigicm93UGFkZGluZyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSB2YWx1ZSIpO3JldHVybiB0aGlzLl9yb3dQYWRkaW5nPXQsdGhpcy5yZWRyYXcoKSx0aGlzfSxlLnByb3RvdHlwZS5jb2x1bW5QYWRkaW5nPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX2NvbHVtblBhZGRpbmc7aWYoIWJNdC5NYXRoLmlzVmFsaWROdW1iZXIodCl8fHQ8MCl0aHJvdyBFcnJvcigiY29sdW1uUGFkZGluZyBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSB2YWx1ZSIpO3JldHVybiB0aGlzLl9jb2x1bW5QYWRkaW5nPXQsdGhpcy5yZWRyYXcoKSx0aGlzfSxlLnByb3RvdHlwZS5yb3dXZWlnaHQ9ZnVuY3Rpb24odCxlKXtpZihudWxsPT1lKXJldHVybiB0aGlzLl9yb3dXZWlnaHRzW3RdO2lmKCFiTXQuTWF0aC5pc1ZhbGlkTnVtYmVyKGUpfHxlPDApdGhyb3cgRXJyb3IoInJvd1dlaWdodCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSB2YWx1ZSIpO3JldHVybiB0aGlzLl9yb3dXZWlnaHRzW3RdPWUsdGhpcy5yZWRyYXcoKSx0aGlzfSxlLnByb3RvdHlwZS5jb2x1bW5XZWlnaHQ9ZnVuY3Rpb24odCxlKXtpZihudWxsPT1lKXJldHVybiB0aGlzLl9jb2x1bW5XZWlnaHRzW3RdO2lmKCFiTXQuTWF0aC5pc1ZhbGlkTnVtYmVyKGUpfHxlPDApdGhyb3cgRXJyb3IoImNvbHVtbldlaWdodCBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGZpbml0ZSB2YWx1ZSIpO3JldHVybiB0aGlzLl9jb2x1bW5XZWlnaHRzW3RdPWUsdGhpcy5yZWRyYXcoKSx0aGlzfSxlLnByb3RvdHlwZS5maXhlZFdpZHRoPWZ1bmN0aW9uKCl7dmFyIHQ9dk10LnRyYW5zcG9zZSh0aGlzLl9yb3dzKTtyZXR1cm4gZS5fZml4ZWRTcGFjZSh0LChmdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dHx8dC5maXhlZFdpZHRoKCl9KSl9LGUucHJvdG90eXBlLmZpeGVkSGVpZ2h0PWZ1bmN0aW9uKCl7cmV0dXJuIGUuX2ZpeGVkU3BhY2UodGhpcy5fcm93cywoZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXR8fHQuZml4ZWRIZWlnaHQoKX0pKX0sZS5wcm90b3R5cGUuX3BhZFRhYmxlVG9TaXplPWZ1bmN0aW9uKHQsZSl7Zm9yKHZhciBuPTA7bjx0O24rKyl7dm9pZCAwPT09dGhpcy5fcm93c1tuXSYmKHRoaXMuX3Jvd3Nbbl09W10sdGhpcy5fcm93V2VpZ2h0c1tuXT1udWxsKTtmb3IodmFyIGk9MDtpPGU7aSsrKXZvaWQgMD09PXRoaXMuX3Jvd3Nbbl1baV0mJih0aGlzLl9yb3dzW25dW2ldPW51bGwpfWZvcihpPTA7aTxlO2krKyl2b2lkIDA9PT10aGlzLl9jb2x1bW5XZWlnaHRzW2ldJiYodGhpcy5fY29sdW1uV2VpZ2h0c1tpXT1udWxsKX0sZS5fY2FsY0NvbXBvbmVudFdlaWdodHM9ZnVuY3Rpb24odCxlLG4pe3JldHVybiB0Lm1hcCgoZnVuY3Rpb24odCxpKXtyZXR1cm4gbnVsbCE9dD90OmVbaV0ubWFwKG4pLnJlZHVjZSgoZnVuY3Rpb24odCxlKXtyZXR1cm4gdCYmZX0pLCEwKT8wOjF9KSl9LGUuX2NhbGNQcm9wb3J0aW9uYWxTcGFjZT1mdW5jdGlvbih0LGUpe3ZhciBuPXZNdC5zdW0odCk7cmV0dXJuIDA9PT1uP2JNdC5BcnJheS5jcmVhdGVGaWxsZWRBcnJheSgwLHQubGVuZ3RoKTp0Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGUqdC9ufSkpfSxlLl9maXhlZFNwYWNlPWZ1bmN0aW9uKHQsZSl7dmFyIG49ZnVuY3Rpb24odCl7cmV0dXJuIHQucmVkdWNlKChmdW5jdGlvbih0LGUpe3JldHVybiB0JiZlfSksITApfTtyZXR1cm4gbih0Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIG4odC5tYXAoZSkpfSkpKX0sZX0pKHl3dC5Db21wb25lbnRDb250YWluZXIpO19NdC5UYWJsZT14TXQ7dmFyIHdNdD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkod010LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgU010PUJPLE1NdD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPW51bGwhPT10JiZ0LmFwcGx5KHRoaXMsYXJndW1lbnRzKXx8dGhpcztyZXR1cm4gZS5fbWF4TGluZXM9MixlfXJldHVybiBTTXQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUucmVxdWVzdGVkU3BhY2U9ZnVuY3Rpb24odCxlKXt0aGlzLl93cmFwcGVyLm1heExpbmVzKHRoaXMuX21heExpbmVzKTt2YXIgbj0wPT09dGhpcy5hbmdsZSgpP3Q6ZTswPT09biYmKG49MS8wKTt2YXIgaT10aGlzLl93cmFwcGVyLndyYXAodGhpcy5fdGV4dCx0aGlzLl9tZWFzdXJlcixuKSxyPXRoaXMuX21lYXN1cmVyLm1lYXN1cmUoaS53cmFwcGVkVGV4dCk7cmV0dXJue21pbldpZHRoOigwPT09dGhpcy5hbmdsZSgpP3Iud2lkdGg6ci5oZWlnaHQpKzIqdGhpcy5wYWRkaW5nKCksbWluSGVpZ2h0OigwPT09dGhpcy5hbmdsZSgpP3IuaGVpZ2h0OnIud2lkdGgpKzIqdGhpcy5wYWRkaW5nKCl9fSxlLnByb3RvdHlwZS5tYXhMaW5lcz1mdW5jdGlvbih0KXtyZXR1cm4gMD09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5fbWF4TGluZXM6KHRoaXMuX21heExpbmVzPXQsdGhpcy5yZWRyYXcoKSx0aGlzKX0sZX0pKE53dC5MYWJlbCk7d010LldyYXBwZWRMYWJlbD1NTXQ7dmFyIEVNdD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoRU10LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgVE10PUJPLENNdD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gZS5hZGRDbGFzcygieC1kcmFnLWJveC1sYXllciIpLGUuX2hhc0Nvcm5lcnM9ITEsZX1yZXR1cm4gVE10Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQ9ZnVuY3Rpb24oZSxuLGkpe3JldHVybiB0LnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxlLG4saSksdGhpcy5fc2V0Qm91bmRzKHRoaXMuYm91bmRzKCkpLHRoaXN9LGUucHJvdG90eXBlLl9zZXRCb3VuZHM9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUuX3NldEJvdW5kcy5jYWxsKHRoaXMse3RvcExlZnQ6e3g6ZS50b3BMZWZ0LngseTowfSxib3R0b21SaWdodDp7eDplLmJvdHRvbVJpZ2h0LngseTp0aGlzLmhlaWdodCgpfX0pfSxlLnByb3RvdHlwZS5fc2V0UmVzaXphYmxlQ2xhc3Nlcz1mdW5jdGlvbih0KXt0JiZ0aGlzLmVuYWJsZWQoKT90aGlzLmFkZENsYXNzKCJ4LXJlc2l6YWJsZSIpOnRoaXMucmVtb3ZlQ2xhc3MoIngtcmVzaXphYmxlIil9LGUucHJvdG90eXBlLnlTY2FsZT1mdW5jdGlvbihlKXtpZihudWxsPT1lKXJldHVybiB0LnByb3RvdHlwZS55U2NhbGUuY2FsbCh0aGlzKTt0aHJvdyBuZXcgRXJyb3IoInlTY2FsZXMgY2Fubm90IGJlIHNldCBvbiBhbiBYRHJhZ0JveExheWVyIil9LGUucHJvdG90eXBlLnlFeHRlbnQ9ZnVuY3Rpb24oZSl7aWYobnVsbD09ZSlyZXR1cm4gdC5wcm90b3R5cGUueUV4dGVudC5jYWxsKHRoaXMpO3Rocm93IG5ldyBFcnJvcigiWERyYWdCb3hMYXllciBoYXMgbm8geUV4dGVudCIpfSxlfSkoZXh0LkRyYWdCb3hMYXllcik7RU10LlhEcmFnQm94TGF5ZXI9Q010O3ZhciBBTXQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KEFNdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGtNdD1CTyxMTXQ9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIGUuYWRkQ2xhc3MoInktZHJhZy1ib3gtbGF5ZXIiKSxlLl9oYXNDb3JuZXJzPSExLGV9cmV0dXJuIGtNdC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKGUsbixpKXtyZXR1cm4gdC5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsZSxuLGkpLHRoaXMuX3NldEJvdW5kcyh0aGlzLmJvdW5kcygpKSx0aGlzfSxlLnByb3RvdHlwZS5fc2V0Qm91bmRzPWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLl9zZXRCb3VuZHMuY2FsbCh0aGlzLHt0b3BMZWZ0Ont4OjAseTplLnRvcExlZnQueX0sYm90dG9tUmlnaHQ6e3g6dGhpcy53aWR0aCgpLHk6ZS5ib3R0b21SaWdodC55fX0pfSxlLnByb3RvdHlwZS5fc2V0UmVzaXphYmxlQ2xhc3Nlcz1mdW5jdGlvbih0KXt0JiZ0aGlzLmVuYWJsZWQoKT90aGlzLmFkZENsYXNzKCJ5LXJlc2l6YWJsZSIpOnRoaXMucmVtb3ZlQ2xhc3MoInktcmVzaXphYmxlIil9LGUucHJvdG90eXBlLnhTY2FsZT1mdW5jdGlvbihlKXtpZihudWxsPT1lKXJldHVybiB0LnByb3RvdHlwZS54U2NhbGUuY2FsbCh0aGlzKTt0aHJvdyBuZXcgRXJyb3IoInhTY2FsZXMgY2Fubm90IGJlIHNldCBvbiBhbiBZRHJhZ0JveExheWVyIil9LGUucHJvdG90eXBlLnhFeHRlbnQ9ZnVuY3Rpb24oZSl7aWYobnVsbD09ZSlyZXR1cm4gdC5wcm90b3R5cGUueEV4dGVudC5jYWxsKHRoaXMpO3Rocm93IG5ldyBFcnJvcigiWURyYWdCb3hMYXllciBoYXMgbm8geEV4dGVudCIpfSxlfSkoZXh0LkRyYWdCb3hMYXllcik7QU10LllEcmFnQm94TGF5ZXI9TE10LChmdW5jdGlvbih0KXsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBlPUJPO2UuX19leHBvcnRTdGFyKGV4dCx0KSxlLl9fZXhwb3J0U3Rhcihud3QsdCksZS5fX2V4cG9ydFN0YXIocHd0LHQpLGUuX19leHBvcnRTdGFyKF93dCx0KSxlLl9fZXhwb3J0U3Rhcihpd3QsdCksZS5fX2V4cG9ydFN0YXIoRXd0LHQpLGUuX19leHBvcnRTdGFyKE53dCx0KSxlLl9fZXhwb3J0U3RhcihCd3QsdCksZS5fX2V4cG9ydFN0YXIoYVN0LHQpLGUuX19leHBvcnRTdGFyKCR4dCx0KSxlLl9fZXhwb3J0U3RhcihfTXQsdCksZS5fX2V4cG9ydFN0YXIod010LHQpLGUuX19leHBvcnRTdGFyKEVNdCx0KSxlLl9fZXhwb3J0U3RhcihBTXQsdCl9KSh0eHQpO3ZhciBQTXQ9e30sTk10PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkoTk10LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgSU10PUJPLFJNdD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3JldHVybiB0LmNhbGwodGhpcywicGF0aCIsImFyYyBmaWxsIil8fHRoaXN9cmV0dXJuIElNdC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5fYXBwbHlEZWZhdWx0QXR0cmlidXRlcz1mdW5jdGlvbih0KXt0LnN0eWxlKCJzdHJva2UiLCJub25lIil9LGV9KShxU3QuU1ZHRHJhd2VyKTtOTXQuQXJjU1ZHRHJhd2VyPVJNdDt2YXIgT010PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShPTXQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciB6TXQ9Qk8sRE10PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIHQuY2FsbCh0aGlzLCJwYXRoIiwiYXJjIG91dGxpbmUiKXx8dGhpc31yZXR1cm4gek10Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzPWZ1bmN0aW9uKHQpe3Quc3R5bGUoImZpbGwiLCJub25lIil9LGV9KShxU3QuU1ZHRHJhd2VyKTtPTXQuQXJjT3V0bGluZVNWR0RyYXdlcj1ETXQ7dmFyIEJNdD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoQk10LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgSE10PUJPLEZNdD1qU3QsVk10PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7cmV0dXJuIHQuY2FsbCh0aGlzLCJwYXRoIiwiYXJlYSIpfHx0aGlzfXJldHVybiBITXQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXM9ZnVuY3Rpb24odCl7dC5zdHlsZSgic3Ryb2tlIiwibm9uZSIpfSxlLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4PWZ1bmN0aW9uKGUpe3JldHVybiB0LnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4LmNhbGwodGhpcywwKX0sZX0pKHFTdC5TVkdEcmF3ZXIpO0JNdC5BcmVhU1ZHRHJhd2VyPVZNdDt2YXIgVU10PVsib3BhY2l0eSIsImZpbGwiLCJmaWxsLW9wYWNpdHkiXSxqTXQ9WyJvcGFjaXR5Iiwic3Ryb2tlIiwic3Ryb2tlLXdpZHRoIl07Qk10Lm1ha2VBcmVhQ2FudmFzRHJhd1N0ZXA9ZnVuY3Rpb24gR010KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4saSxyKXt2YXIgbz1GTXQucmVzb2x2ZUF0dHJpYnV0ZXMocixVTXQsaVswXSwwKTtGTXQucmVuZGVyQXJlYShuLHQoKSxpWzBdLG8pO3ZhciBhPUZNdC5yZXNvbHZlQXR0cmlidXRlcyhyLGpNdCxpWzBdLDApO0ZNdC5yZW5kZXJMaW5lKG4sZSgpLGlbMF0sYSl9fTt2YXIgV010PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShXTXQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBxTXQ9Qk8sWU10PWpTdCxYTXQ9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gdC5jYWxsKHRoaXMsInBhdGgiLCJsaW5lIil8fHRoaXN9cmV0dXJuIHFNdC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5fYXBwbHlEZWZhdWx0QXR0cmlidXRlcz1mdW5jdGlvbih0KXt0LnN0eWxlKCJmaWxsIiwibm9uZSIpfSxlLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4PWZ1bmN0aW9uKGUpe3JldHVybiB0LnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4LmNhbGwodGhpcywwKX0sZX0pKHFTdC5TVkdEcmF3ZXIpO1dNdC5MaW5lU1ZHRHJhd2VyPVhNdDt2YXIgJE10PVsib3BhY2l0eSIsInN0cm9rZS1vcGFjaXR5Iiwic3Ryb2tlLXdpZHRoIiwic3Ryb2tlIiwic3Ryb2tlLWRhc2hhcnJheSJdO1dNdC5tYWtlTGluZUNhbnZhc0RyYXdTdGVwPWZ1bmN0aW9uIEtNdCh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLGkpe3ZhciByPVlNdC5yZXNvbHZlQXR0cmlidXRlcyhpLCRNdCxuWzBdLDApO1lNdC5yZW5kZXJMaW5lKGUsdCgpLG5bMF0scil9fTt2YXIgWk10PXt9OyEoZnVuY3Rpb24odCl7Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZT1CTyxuPWpTdCxpPShmdW5jdGlvbih0KXtmdW5jdGlvbiBuKGUpe3ZvaWQgMD09PWUmJihlPSIiKTt2YXIgbj10LmNhbGwodGhpcywicmVjdCIsIiIpfHx0aGlzO3JldHVybiBuLl9yb290Q2xhc3NOYW1lPWUsbi5fcm9vdC5jbGFzc2VkKG4uX3Jvb3RDbGFzc05hbWUsITApLG59cmV0dXJuIGUuX19leHRlbmRzKG4sdCksbn0pKHFTdC5TVkdEcmF3ZXIpO3QuUmVjdGFuZ2xlU1ZHRHJhd2VyPWk7dmFyIHI9bi5Db250ZXh0U3R5bGVBdHRycy5jb25jYXQoWyJ4IiwieSIsIndpZHRoIiwiaGVpZ2h0Il0pO3QuUmVjdGFuZ2xlQ2FudmFzRHJhd1N0ZXA9ZnVuY3Rpb24odCxlLGkpe3Quc2F2ZSgpO2Zvcih2YXIgbz1lLmxlbmd0aCxhPTA7YTxvO2ErKyl7dmFyIHM9ZVthXTtpZihudWxsIT1zKXt2YXIgbD1uLnJlc29sdmVBdHRyaWJ1dGVzKGkscixzLGEpO3QuYmVnaW5QYXRoKCksdC5yZWN0KGwueCxsLnksbC53aWR0aCxsLmhlaWdodCksbi5yZW5kZXJQYXRoV2l0aFN0eWxlKHQsbCl9fXQucmVzdG9yZSgpfTt2YXIgbz0oZnVuY3Rpb24obil7ZnVuY3Rpb24gaShlKXtyZXR1cm4gbi5jYWxsKHRoaXMsZSx0LlJlY3RhbmdsZUNhbnZhc0RyYXdTdGVwKXx8dGhpc31yZXR1cm4gZS5fX2V4dGVuZHMoaSxuKSxpfSkobi5DYW52YXNEcmF3ZXIpO3QuUmVjdGFuZ2xlQ2FudmFzRHJhd2VyPW99KShaTXQpO3ZhciBKTXQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KEpNdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIFFNdD1CTyx0RXQ9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gdC5jYWxsKHRoaXMsImxpbmUiLCIiKXx8dGhpc31yZXR1cm4gUU10Ll9fZXh0ZW5kcyhlLHQpLGV9KShxU3QuU1ZHRHJhd2VyKTtKTXQuU2VnbWVudFNWR0RyYXdlcj10RXQ7dmFyIGVFdD17fSxuRXQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTctcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCk9iamVjdC5kZWZpbmVQcm9wZXJ0eShuRXQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBpRXQ9KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gdChlLG4saSl7dm9pZCAwPT09aSYmKGk9d2luZG93LmRldmljZVBpeGVsUmF0aW8pLHRoaXMuc2NyZWVuV2lkdGg9ZSx0aGlzLnNjcmVlbkhlaWdodD1uLHRoaXMuZGV2aWNlUGl4ZWxSYXRpbz1pLHRoaXMucGl4ZWxXaWR0aD1lKmksdGhpcy5waXhlbEhlaWdodD1uKmksdGhpcy5jYW52YXM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiY2FudmFzIiksdGhpcy5jdHg9dGhpcy5jYW52YXMuZ2V0Q29udGV4dCgiMmQiKSx0LnNpemVQaXhlbHModGhpcy5jdHgsZSxuLGkpfXJldHVybiB0LnNpemVQaXhlbHM9ZnVuY3Rpb24odCxlLG4saSl7dmFyIHI9dC5jYW52YXM7ci53aWR0aD1lKmksci5oZWlnaHQ9bippLHIuc3R5bGUud2lkdGg9ZSsicHgiLHIuc3R5bGUuaGVpZ2h0PW4rInB4Iix0LnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCksdC5zY2FsZShpLGkpfSx0LnByb3RvdHlwZS5ibGl0PWZ1bmN0aW9uKHQsZSxuKXt2b2lkIDA9PT1lJiYoZT0wKSx2b2lkIDA9PT1uJiYobj0wKSx0LmRyYXdJbWFnZSh0aGlzLmNhbnZhcyxlLG4sdGhpcy5zY3JlZW5XaWR0aCx0aGlzLnNjcmVlbkhlaWdodCl9LHQucHJvdG90eXBlLmJsaXRDZW50ZXI9ZnVuY3Rpb24odCxlLG4pe3ZvaWQgMD09PWUmJihlPTApLHZvaWQgMD09PW4mJihuPTApLHRoaXMuYmxpdCh0LE1hdGguZmxvb3IoZS10aGlzLnNjcmVlbldpZHRoLzIpLE1hdGguZmxvb3Iobi10aGlzLnNjcmVlbkhlaWdodC8yKSl9LHQucHJvdG90eXBlLnJlc2l6ZT1mdW5jdGlvbihlLG4saSl7dm9pZCAwPT09aSYmKGk9ITEpO3ZhciByPXRoaXMuZGV2aWNlUGl4ZWxSYXRpbztyZXR1cm4gdGhpcy5zY3JlZW5XaWR0aD1lLHRoaXMuc2NyZWVuSGVpZ2h0PW4sdGhpcy5waXhlbFdpZHRoPWUqcix0aGlzLnBpeGVsSGVpZ2h0PW4qcix0LnNpemVQaXhlbHModGhpcy5jdHgsZSxuLHIpLGkmJnRoaXMuY3R4LnRyYW5zbGF0ZShlLzIsZS8yKSx0aGlzfSx0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49ZS5waXhlbFdpZHRoLGk9ZS5waXhlbEhlaWdodCxyPWUuY3R4O3JldHVybiByLnNhdmUoKSxyLnNldFRyYW5zZm9ybSgxLDAsMCwxLDAsMCksbnVsbD09dD9yLmNsZWFyUmVjdCgwLDAsbixpKTooci5maWxsU3R5bGU9dCxyLmZpbGxSZWN0KDAsMCxuLGkpKSxyLnJlc3RvcmUoKSx0aGlzfSx0LnByb3RvdHlwZS5nZXRJbWFnZURhdGE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jdHguZ2V0SW1hZ2VEYXRhKDAsMCx0aGlzLnBpeGVsV2lkdGgsdGhpcy5waXhlbEhlaWdodCl9LHR9KSgpO25FdC5DYW52YXNCdWZmZXI9aUV0LAovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkoZUV0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgckV0PUJPLG9FdD1qU3QsYUV0PW5FdCxzRXQ9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXtyZXR1cm4gdC5jYWxsKHRoaXMsInBhdGgiLCJzeW1ib2wiKXx8dGhpc31yZXR1cm4gckV0Ll9fZXh0ZW5kcyhlLHQpLGV9KShxU3QuU1ZHRHJhd2VyKTtlRXQuU3ltYm9sU1ZHRHJhd2VyPXNFdDt2YXIgbEV0PW9FdC5Db250ZXh0U3R5bGVBdHRycy5jb25jYXQoWyJ4IiwieSJdKTtmdW5jdGlvbiBjRXQodCxlLG4saSxyKXtyZXR1cm4gbityPj0wJiZuLXI8PXQmJmkrcj49MCYmaS1yPD1lfWZ1bmN0aW9uIHVFdCh0LGUsbil7aWYobnVsbD09dClyZXR1cm4hMTtmb3IodmFyIGk9MDtpPG4ubGVuZ3RoO2krKyl7dmFyIHI9bltpXTtpZih0W3JdIT1lW3JdKXJldHVybiExfXJldHVybiEwfWVFdC5tYWtlU3ltYm9sQ2FudmFzRHJhd1N0ZXA9ZnVuY3Rpb24gaEV0KHQsZSxuLGkpe3ZhciByPXRoaXM7cmV0dXJuIGZ1bmN0aW9uKG8sYSxzKXtmb3IodmFyIGw9by5jYW52YXMsYz1sLmNsaWVudFdpZHRoLHU9bC5jbGllbnRIZWlnaHQsaD12b2lkIDA9PT1pP25ldyBhRXQuQ2FudmFzQnVmZmVyKDAsMCk6aSxkPWUoKSxwPW4oKSxmPW51bGwsbT1udWxsLGc9bnVsbCxfPTA7XzxhLmxlbmd0aDtfKyspe3ZhciB5PWFbX107aWYobnVsbCE9eSl7dmFyIHY9b0V0LnJlc29sdmVBdHRyaWJ1dGVzKHMsbEV0LHksXyksYj1wKHksXyx0KTtpZihjRXQoYyx1LHYueCx2LnksYikpe3ZhciB4PXVFdChmLHYsb0V0LkNvbnRleHRTdHlsZUF0dHJzKSx3PWQoeSxfLHIuX2RhdGFzZXQpO2lmKHgmJmc9PWImJm09PXcpO2Vsc2V7dmFyIFM9YitvRXQuZ2V0U3Ryb2tlV2lkdGgodikrMTsoUz5oLnNjcmVlbldpZHRofHxTPmguc2NyZWVuSGVpZ2h0KSYmaC5yZXNpemUoUyxTLCEwKSxoLmNsZWFyKCk7dmFyIE09aC5jdHg7TS5iZWdpblBhdGgoKSx3KGIpLmNvbnRleHQoTSkobnVsbCksTS5jbG9zZVBhdGgoKSxvRXQucmVuZGVyUGF0aFdpdGhTdHlsZShNLHYpLG09dyxnPWIsZj12fWguYmxpdENlbnRlcihvLHYueCx2LnkpfX19fX0sKGZ1bmN0aW9uKHQpewovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGU9Qk87ZS5fX2V4cG9ydFN0YXIoTk10LHQpLGUuX19leHBvcnRTdGFyKE9NdCx0KSxlLl9fZXhwb3J0U3RhcihCTXQsdCksZS5fX2V4cG9ydFN0YXIoalN0LHQpLGUuX19leHBvcnRTdGFyKEdTdCx0KSxlLl9fZXhwb3J0U3RhcihXTXQsdCksZS5fX2V4cG9ydFN0YXIoWk10LHQpLGUuX19leHBvcnRTdGFyKEpNdCx0KSxlLl9fZXhwb3J0U3RhcihxU3QsdCksZS5fX2V4cG9ydFN0YXIoZUV0LHQpfSkoUE10KTt2YXIgZEV0PXt9LHBFdD17fSxmRXQ9e30sbUV0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkobUV0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZ0V0PUJPLF9FdD1YdnQseUV0PURfdCx2RXQ9S1N0LGJFdD1zU3QseEV0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBlLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluPSExLGUuX2F1dG9BZGp1c3RZU2NhbGVEb21haW49ITEsZS5fZGVmZXJyZWRSZW5kZXJpbmc9ITEsZS5fYXBwbHlEZWZlcnJlZFJlbmRlcmluZ1RyYW5zZm9ybT1mdW5jdGlvbih0LG4saSxyKXtlLl9pc0FuY2hvcmVkJiYobnVsbCE9ZS5fcmVuZGVyQXJlYSYmZS5fcmVuZGVyQXJlYS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIit0KyIsICIrbisiKSBzY2FsZSgiK2krIiwgIityKyIpIiksbnVsbCE9ZS5fY2FudmFzJiZlLl9jYW52YXMuc3R5bGUoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK3QrInB4LCAiK24rInB4KSBzY2FsZSgiK2krIiwgIityKyIpIikpfSxlLmFkZENsYXNzKCJ4eS1wbG90IiksZS5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVhDYWxsYmFjaz1mdW5jdGlvbih0KXtyZXR1cm4gZS5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVgoKX0sZS5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVlDYWxsYmFjaz1mdW5jdGlvbih0KXtyZXR1cm4gZS5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVkoKX0sZS5fcmVuZGVyQ2FsbGJhY2s9ZnVuY3Rpb24oKXtpZihlLmRlZmVycmVkUmVuZGVyaW5nKCkpe3ZhciB0PWUueCgpJiZlLngoKS5zY2FsZSxuPWUueSgpJiZlLnkoKS5zY2FsZTtlLl9kZWZlcnJlZFJlbmRlcmVyLnVwZGF0ZURvbWFpbnModCxuKX1lbHNlIGUucmVuZGVyKCl9LGUuX2RlZmVycmVkUmVuZGVyZXI9bmV3IHZFdC5EZWZlcnJlZFJlbmRlcmVyKChmdW5jdGlvbigpe3JldHVybiBlLnJlbmRlcigpfSksZS5fYXBwbHlEZWZlcnJlZFJlbmRlcmluZ1RyYW5zZm9ybSksZX1yZXR1cm4gZ0V0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3JldHVybiB0aGlzLmRlZmVycmVkUmVuZGVyaW5nKCkmJnRoaXMuX2RlZmVycmVkUmVuZGVyZXIucmVzZXRUcmFuc2Zvcm1zKCksdC5wcm90b3R5cGUucmVuZGVyLmNhbGwodGhpcyl9LGUucHJvdG90eXBlLmRlZmVycmVkUmVuZGVyaW5nPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX2RlZmVycmVkUmVuZGVyaW5nO2lmKHQpe3ZhciBlPXRoaXMueCgpJiZ0aGlzLngoKS5zY2FsZSxuPXRoaXMueSgpJiZ0aGlzLnkoKS5zY2FsZTt0aGlzLl9kZWZlcnJlZFJlbmRlcmVyLnNldERvbWFpbnMoZSxuKX1yZXR1cm4gdGhpcy5fZGVmZXJyZWRSZW5kZXJpbmc9dCx0aGlzfSxlLnByb3RvdHlwZS54PWZ1bmN0aW9uKHQsbixpKXtpZihudWxsPT10KXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChlLl9YX0tFWSk7dGhpcy5fYmluZFByb3BlcnR5KGUuX1hfS0VZLHQsbixpKTt2YXIgcj10aGlzLndpZHRoKCk7cmV0dXJuIG51bGwhPW4mJm51bGwhPXImJm4ucmFuZ2UoWzAscl0pLHRoaXMuX2F1dG9BZGp1c3RZU2NhbGVEb21haW4mJnRoaXMuX3VwZGF0ZVlFeHRlbnRzQW5kQXV0b2RvbWFpbigpLHRoaXMucmVuZGVyKCksdGhpc30sZS5wcm90b3R5cGUueT1mdW5jdGlvbih0LG4saSl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoZS5fWV9LRVkpO3RoaXMuX2JpbmRQcm9wZXJ0eShlLl9ZX0tFWSx0LG4saSk7dmFyIHI9dGhpcy5oZWlnaHQoKTtyZXR1cm4gbnVsbCE9biYmbnVsbCE9ciYmbi5yYW5nZShuIGluc3RhbmNlb2YgX0V0LkNhdGVnb3J5P1swLHJdOltyLDBdKSx0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluJiZ0aGlzLl91cGRhdGVYRXh0ZW50c0FuZEF1dG9kb21haW4oKSx0aGlzLnJlbmRlcigpLHRoaXN9LGUucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eT1mdW5jdGlvbih0KXtyZXR1cm4ieCI9PT10JiZ0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluP3RoaXMuX21ha2VGaWx0ZXJCeVByb3BlcnR5KCJ5Iik6InkiIT09dCYmInkwIiE9PXR8fCF0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluP251bGw6dGhpcy5fbWFrZUZpbHRlckJ5UHJvcGVydHkoIngiKX0sZS5wcm90b3R5cGUuX21ha2VGaWx0ZXJCeVByb3BlcnR5PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHQpO2lmKG51bGwhPWUpe3ZhciBuPWUuYWNjZXNzb3IsaT1lLnNjYWxlO2lmKG51bGwhPWkpcmV0dXJuIGZ1bmN0aW9uKHQsZSxyKXt2YXIgbz1pLnJhbmdlKCk7cmV0dXJuIHlFdC5NYXRoLmluUmFuZ2UoaS5zY2FsZShuKHQsZSxyKSksb1swXSxvWzFdKX19cmV0dXJuIG51bGx9LGUucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleT1mdW5jdGlvbihuLGkpe3QucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleS5jYWxsKHRoaXMsbixpKSxuLm9mZlVwZGF0ZShpPT09ZS5fWF9LRVk/dGhpcy5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVhDYWxsYmFjazp0aGlzLl9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWUNhbGxiYWNrKX0sZS5wcm90b3R5cGUuX2luc3RhbGxTY2FsZUZvcktleT1mdW5jdGlvbihuLGkpe3QucHJvdG90eXBlLl9pbnN0YWxsU2NhbGVGb3JLZXkuY2FsbCh0aGlzLG4saSksbi5vblVwZGF0ZShpPT09ZS5fWF9LRVk/dGhpcy5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVhDYWxsYmFjazp0aGlzLl9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWUNhbGxiYWNrKX0sZS5wcm90b3R5cGUuZGVzdHJveT1mdW5jdGlvbigpe3JldHVybiB0LnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyksdGhpcy54KCkuc2NhbGUmJnRoaXMueCgpLnNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWENhbGxiYWNrKSx0aGlzLnkoKS5zY2FsZSYmdGhpcy55KCkuc2NhbGUub2ZmVXBkYXRlKHRoaXMuX2FkanVzdFhEb21haW5PbkNoYW5nZUZyb21ZQ2FsbGJhY2spLHRoaXN9LGUucHJvdG90eXBlLmF1dG9yYW5nZU1vZGU9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fYXV0b0FkanVzdFhTY2FsZURvbWFpbj8ieCI6dGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbj8ieSI6Im5vbmUiO3N3aXRjaCh0KXtjYXNlIngiOnRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW49ITAsdGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbj0hMSx0aGlzLl9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWSgpO2JyZWFrO2Nhc2UieSI6dGhpcy5fYXV0b0FkanVzdFhTY2FsZURvbWFpbj0hMSx0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluPSEwLHRoaXMuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YKCk7YnJlYWs7Y2FzZSJub25lIjp0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluPSExLHRoaXMuX2F1dG9BZGp1c3RZU2NhbGVEb21haW49ITE7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc2NhbGUgbmFtZSAnIit0KyInLCBtdXN0IGJlICd4JywgJ3knIG9yICdub25lJyIpfXJldHVybiB0aGlzfSxlLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKGUsbixpKXt0LnByb3RvdHlwZS5jb21wdXRlTGF5b3V0LmNhbGwodGhpcyxlLG4saSk7dmFyIHI9dGhpcy54KCksbz1yJiZyLnNjYWxlO251bGwhPW8mJm8ucmFuZ2UoWzAsdGhpcy53aWR0aCgpXSk7dmFyIGE9dGhpcy55KCkscz1hJiZhLnNjYWxlO3JldHVybiBudWxsIT1zJiZzLnJhbmdlKHMgaW5zdGFuY2VvZiBfRXQuQ2F0ZWdvcnk/WzAsdGhpcy5oZWlnaHQoKV06W3RoaXMuaGVpZ2h0KCksMF0pLHRoaXN9LGUucHJvdG90eXBlLl91cGRhdGVYRXh0ZW50c0FuZEF1dG9kb21haW49ZnVuY3Rpb24oKXt2YXIgdD10aGlzLngoKS5zY2FsZTtudWxsIT10JiZ0LmF1dG9Eb21haW4oKX0sZS5wcm90b3R5cGUuX3VwZGF0ZVlFeHRlbnRzQW5kQXV0b2RvbWFpbj1mdW5jdGlvbigpe3ZhciB0PXRoaXMueSgpLnNjYWxlO251bGwhPXQmJnQuYXV0b0RvbWFpbigpfSxlLnByb3RvdHlwZS5zaG93QWxsRGF0YT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl91cGRhdGVYRXh0ZW50c0FuZEF1dG9kb21haW4oKSx0aGlzLl91cGRhdGVZRXh0ZW50c0FuZEF1dG9kb21haW4oKSx0aGlzfSxlLnByb3RvdHlwZS5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVg9ZnVuY3Rpb24oKXt0aGlzLl9wcm9qZWN0b3JzUmVhZHkoKSYmdGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbiYmdGhpcy5fdXBkYXRlWUV4dGVudHNBbmRBdXRvZG9tYWluKCl9LGUucHJvdG90eXBlLl9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWT1mdW5jdGlvbigpe3RoaXMuX3Byb2plY3RvcnNSZWFkeSgpJiZ0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluJiZ0aGlzLl91cGRhdGVYRXh0ZW50c0FuZEF1dG9kb21haW4oKX0sZS5wcm90b3R5cGUuX3Byb2plY3RvcnNSZWFkeT1mdW5jdGlvbigpe3ZhciB0PXRoaXMueCgpLGU9dGhpcy55KCk7cmV0dXJuIG51bGwhPXQmJm51bGwhPXQuYWNjZXNzb3ImJm51bGwhPWUmJm51bGwhPWUuYWNjZXNzb3J9LGUucHJvdG90eXBlLl9waXhlbFBvaW50PWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1iRXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHI9YkV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKTtyZXR1cm57eDppKHQsZSxuKSx5OnIodCxlLG4pfX0sZS5wcm90b3R5cGUuX2dldERhdGFUb0RyYXc9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49dC5wcm90b3R5cGUuX2dldERhdGFUb0RyYXcuY2FsbCh0aGlzKSxpPXRoaXMuYXR0cigiZGVmaW5lZCIpO3JldHVybiB0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7bi5zZXQodCxuLmdldCh0KS5maWx0ZXIoKGZ1bmN0aW9uKG4scil7cmV0dXJuKGZ1bmN0aW9uKHQsbixyKXt2YXIgbz1iRXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IoZS54KCkpKHQsbixyKSxhPWJFdC5QbG90Ll9zY2FsZWRBY2Nlc3NvcihlLnkoKSkodCxuLHIpO3JldHVybighaXx8ITEhPT1pLmFjY2Vzc29yKHQsbixyKSkmJnlFdC5NYXRoLmlzVmFsaWROdW1iZXIobykmJnlFdC5NYXRoLmlzVmFsaWROdW1iZXIoYSl9KShuLHIsdCl9KSkpfSkpLG59LGUuX1hfS0VZPSJ4IixlLl9ZX0tFWT0ieSIsZX0pKGJFdC5QbG90KTttRXQuWFlQbG90PXhFdCwKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KGZFdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHdFdD1CTyxTRXQ9d3B0LE1FdD1mZ3QsRUV0PVBNdCxURXQ9R1N0LENFdD1XTXQsQUV0PVh2dCxrRXQ9TGJ0LExFdD1EX3QsUEV0PWRFdCxORXQ9c1N0LElFdD1tRXQsUkV0PXtsaW5lYXI6U0V0LmN1cnZlTGluZWFyLGxpbmVhckNsb3NlZDpTRXQuY3VydmVMaW5lYXJDbG9zZWQsc3RlcDpTRXQuY3VydmVTdGVwLHN0ZXBCZWZvcmU6U0V0LmN1cnZlU3RlcEJlZm9yZSxzdGVwQWZ0ZXI6U0V0LmN1cnZlU3RlcEFmdGVyLGJhc2lzOlNFdC5jdXJ2ZUJhc2lzLGJhc2lzT3BlbjpTRXQuY3VydmVCYXNpc09wZW4sYmFzaXNDbG9zZWQ6U0V0LmN1cnZlQmFzaXNDbG9zZWQsYnVuZGxlOlNFdC5jdXJ2ZUJ1bmRsZSxjYXJkaW5hbDpTRXQuY3VydmVDYXJkaW5hbCxjYXJkaW5hbE9wZW46U0V0LmN1cnZlQ2FyZGluYWxPcGVuLGNhcmRpbmFsQ2xvc2VkOlNFdC5jdXJ2ZUNhcmRpbmFsQ2xvc2VkLG1vbm90b25lOlNFdC5jdXJ2ZU1vbm90b25lWH07ZkV0LkN1cnZlTmFtZT1iZ3QubWFrZUVudW0oWyJsaW5lYXIiLCJsaW5lYXJDbG9zZWQiLCJzdGVwIiwic3RlcEJlZm9yZSIsInN0ZXBBZnRlciIsImJhc2lzIiwiYmFzaXNPcGVuIiwiYmFzaXNDbG9zZWQiLCJidW5kbGUiLCJjYXJkaW5hbCIsImNhcmRpbmFsT3BlbiIsImNhcmRpbmFsQ2xvc2VkIiwibW9ub3RvbmUiXSk7dmFyIE9FdD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPXQuY2FsbCh0aGlzKXx8dGhpcztlLl9jdXJ2ZT0ibGluZWFyIixlLl9hdXRvcmFuZ2VTbW9vdGg9ITEsZS5fY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWQ9ITAsZS5fY29sbGFwc2VEZW5zZVZlcnRpY2FsTGluZXNFbmFibGVkPSExLGUuX2Rvd25zYW1wbGluZ0VuYWJsZWQ9ITEsZS5hZGRDbGFzcygibGluZS1wbG90Iik7dmFyIG49bmV3IE1FdC5FYXNpbmc7cmV0dXJuIG4uc3RlcER1cmF0aW9uKE5FdC5QbG90Ll9BTklNQVRJT05fTUFYX0RVUkFUSU9OKSxuLmVhc2luZ01vZGUoImV4cEluT3V0Iiksbi5tYXhUb3RhbER1cmF0aW9uKE5FdC5QbG90Ll9BTklNQVRJT05fTUFYX0RVUkFUSU9OKSxlLmFuaW1hdG9yKFBFdC5BbmltYXRvci5NQUlOLG4pLGUuYXR0cigic3Ryb2tlIiwobmV3IEFFdC5Db2xvcikucmFuZ2UoKVswXSksZS5hdHRyKCJzdHJva2Utd2lkdGgiLCIycHgiKSxlfXJldHVybiB3RXQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUueD1mdW5jdGlvbihlLG4saSl7cmV0dXJuIG51bGw9PWU/dC5wcm90b3R5cGUueC5jYWxsKHRoaXMpOih0LnByb3RvdHlwZS54LmNhbGwodGhpcyxlLG4saSksdGhpcy5fc2V0U2NhbGVTbmFwcGluZygpLHRoaXMpfSxlLnByb3RvdHlwZS55PWZ1bmN0aW9uKGUsbixpKXtyZXR1cm4gbnVsbD09ZT90LnByb3RvdHlwZS55LmNhbGwodGhpcyk6KHQucHJvdG90eXBlLnkuY2FsbCh0aGlzLGUsbixpKSx0aGlzLl9zZXRTY2FsZVNuYXBwaW5nKCksdGhpcyl9LGUucHJvdG90eXBlLmF1dG9yYW5nZU1vZGU9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/dC5wcm90b3R5cGUuYXV0b3JhbmdlTW9kZS5jYWxsKHRoaXMpOih0LnByb3RvdHlwZS5hdXRvcmFuZ2VNb2RlLmNhbGwodGhpcyxlKSx0aGlzLl9zZXRTY2FsZVNuYXBwaW5nKCksdGhpcyl9LGUucHJvdG90eXBlLmF1dG9yYW5nZVNtb290aD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9hdXRvcmFuZ2VTbW9vdGg6KHRoaXMuX2F1dG9yYW5nZVNtb290aD10LHRoaXMuX3NldFNjYWxlU25hcHBpbmcoKSx0aGlzKX0sZS5wcm90b3R5cGUuX3NldFNjYWxlU25hcHBpbmc9ZnVuY3Rpb24oKXsieCI9PT10aGlzLmF1dG9yYW5nZU1vZGUoKSYmdGhpcy54KCkmJnRoaXMueCgpLnNjYWxlJiZ0aGlzLngoKS5zY2FsZSBpbnN0YW5jZW9mIGtFdC5RdWFudGl0YXRpdmVTY2FsZSYmdGhpcy54KCkuc2NhbGUuc25hcHBpbmdEb21haW5FbmFibGVkKCF0aGlzLmF1dG9yYW5nZVNtb290aCgpKSwieSI9PT10aGlzLmF1dG9yYW5nZU1vZGUoKSYmdGhpcy55KCkmJnRoaXMueSgpLnNjYWxlJiZ0aGlzLnkoKS5zY2FsZSBpbnN0YW5jZW9mIGtFdC5RdWFudGl0YXRpdmVTY2FsZSYmdGhpcy55KCkuc2NhbGUuc25hcHBpbmdEb21haW5FbmFibGVkKCF0aGlzLmF1dG9yYW5nZVNtb290aCgpKX0sZS5wcm90b3R5cGUuY3VydmU9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fY3VydmU6KHRoaXMuX2N1cnZlPXQsdGhpcy5yZW5kZXIoKSx0aGlzKX0sZS5wcm90b3R5cGUuZG93bnNhbXBsaW5nRW5hYmxlZD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9kb3duc2FtcGxpbmdFbmFibGVkOih0aGlzLl9kb3duc2FtcGxpbmdFbmFibGVkPXQsdGhpcyl9LGUucHJvdG90eXBlLmNyb3BwZWRSZW5kZXJpbmdFbmFibGVkPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2Nyb3BwZWRSZW5kZXJpbmdFbmFibGVkOih0aGlzLl9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZD10LHRoaXMucmVuZGVyKCksdGhpcyl9LGUucHJvdG90eXBlLmNvbGxhcHNlRGVuc2VMaW5lc0VuYWJsZWQ9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fY29sbGFwc2VEZW5zZVZlcnRpY2FsTGluZXNFbmFibGVkOih0aGlzLl9jb2xsYXBzZURlbnNlVmVydGljYWxMaW5lc0VuYWJsZWQ9dCx0aGlzLnJlbmRlcigpLHRoaXMpfSxlLnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7cmV0dXJuIG5ldyBURXQuUHJveHlEcmF3ZXIoKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBDRXQuTGluZVNWR0RyYXdlcn0pLChmdW5jdGlvbihuKXtyZXR1cm4gbmV3IEVFdC5DYW52YXNEcmF3ZXIobixDRXQubWFrZUxpbmVDYW52YXNEcmF3U3RlcCgoZnVuY3Rpb24oKXtyZXR1cm4gZS5fZDNMaW5lRmFjdG9yeSh0KX0pKSl9KSl9LGUucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbihlKXt2YXIgbj10LnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHkuY2FsbCh0aGlzLGUpO2lmKCF0aGlzLl9hdXRvcmFuZ2VTbW9vdGgpcmV0dXJuIG47aWYodGhpcy5hdXRvcmFuZ2VNb2RlKCkhPT1lKXJldHVybiBuO2lmKCJ4IiE9PXRoaXMuYXV0b3JhbmdlTW9kZSgpJiYieSIhPT10aGlzLmF1dG9yYW5nZU1vZGUoKSlyZXR1cm4gbjt2YXIgaSxyPXRoaXMuX2dldEVkZ2VJbnRlcnNlY3Rpb25Qb2ludHMoKTtyZXR1cm4gaT0ieSI9PT10aGlzLmF1dG9yYW5nZU1vZGUoKT9yLmxlZnQuY29uY2F0KHIucmlnaHQpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQueX0pKTpyLnRvcC5jb25jYXQoci5ib3R0b20pLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQueH0pKSxuLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIFNFdC5leHRlbnQoU0V0Lm1lcmdlKFt0LGldKSl9KSl9LGUucHJvdG90eXBlLl9nZXRFZGdlSW50ZXJzZWN0aW9uUG9pbnRzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztpZighKHRoaXMueSgpLnNjYWxlIGluc3RhbmNlb2Yga0V0LlF1YW50aXRhdGl2ZVNjYWxlJiZ0aGlzLngoKS5zY2FsZSBpbnN0YW5jZW9mIGtFdC5RdWFudGl0YXRpdmVTY2FsZSkpcmV0dXJue2xlZnQ6W10scmlnaHQ6W10sdG9wOltdLGJvdHRvbTpbXX07dmFyIGU9dGhpcy55KCkuc2NhbGUsbj10aGlzLngoKS5zY2FsZSxpPXtsZWZ0OltdLHJpZ2h0OltdLHRvcDpbXSxib3R0b206W119LHI9bi5zY2FsZShuLmRvbWFpbigpWzBdKSxvPW4uc2NhbGUobi5kb21haW4oKVsxXSksYT1lLnNjYWxlKGUuZG9tYWluKClbMF0pLHM9ZS5zY2FsZShlLmRvbWFpbigpWzFdKTtyZXR1cm4gdGhpcy5kYXRhc2V0cygpLmZvckVhY2goKGZ1bmN0aW9uKGwpe2Zvcih2YXIgYyx1LGgsZCxwPWwuZGF0YSgpLGY9MTtmPHAubGVuZ3RoO2YrKyljPWh8fG4uc2NhbGUodC54KCkuYWNjZXNzb3IocFtmLTFdLGYtMSxsKSksdT1kfHxlLnNjYWxlKHQueSgpLmFjY2Vzc29yKHBbZi0xXSxmLTEsbCkpLGg9bi5zY2FsZSh0LngoKS5hY2Nlc3NvcihwW2ZdLGYsbCkpLGQ9ZS5zY2FsZSh0LnkoKS5hY2Nlc3NvcihwW2ZdLGYsbCkpLGM8cj09cjw9aCYmaS5sZWZ0LnB1c2goe3g6cix5OmUuaW52ZXJ0KHUrKHItYykqKGQtdSkvKGgtYykpfSksYzxvPT1vPD1oJiZpLnJpZ2h0LnB1c2goe3g6byx5OmUuaW52ZXJ0KHUrKG8tYykqKGQtdSkvKGgtYykpfSksdTxzPT1zPD1kJiZpLnRvcC5wdXNoKHt4Om4uaW52ZXJ0KGMrKHMtdSkqKGgtYykvKGQtdSkpLHk6c30pLHU8YT09YTw9ZCYmaS5ib3R0b20ucHVzaCh7eDpuLmludmVydChjKyhhLXUpKihoLWMpLyhkLXUpKSx5OmF9KX0pKSxpfSxlLnByb3RvdHlwZS5fZ2V0UmVzZXRZRnVuY3Rpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnkoKS5zY2FsZS5kb21haW4oKSxlPU1hdGgubWF4KHRbMF0sdFsxXSksbj1NYXRoLm1pbih0WzBdLHRbMV0pLGk9ZTwwJiZlfHxuPjAmJm58fDAscj10aGlzLnkoKS5zY2FsZS5zY2FsZShpKTtyZXR1cm4gZnVuY3Rpb24odCxlLG4pe3JldHVybiByfX0sZS5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7dmFyIHQ9W107aWYodGhpcy5fYW5pbWF0ZU9uTmV4dFJlbmRlcigpKXt2YXIgZT10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTtlLmQ9dGhpcy5fY29uc3RydWN0TGluZVByb2plY3RvcihORXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHRoaXMuX2dldFJlc2V0WUZ1bmN0aW9uKCkpLHQucHVzaCh7YXR0clRvUHJvamVjdG9yOmUsYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoUEV0LkFuaW1hdG9yLlJFU0VUKX0pfXJldHVybiB0LnB1c2goe2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcihQRXQuQW5pbWF0b3IuTUFJTil9KSx0fSxlLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgZT10LnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3IuY2FsbCh0aGlzKTtyZXR1cm4gT2JqZWN0LmtleXMoZSkuZm9yRWFjaCgoZnVuY3Rpb24odCl7aWYoImQiIT09dCl7dmFyIG49ZVt0XTtlW3RdPWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gdC5sZW5ndGg+MD9uKHRbMF0sZSxpKTpudWxsfX19KSksZX0sZS5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLmVudGl0eU5lYXJlc3RCeVhUaGVuWSh0KTtyZXR1cm4gbnVsbCE9ZT9bZV06W119LGUucHJvdG90eXBlLmVudGl0eU5lYXJlc3RCeVhUaGVuWT1mdW5jdGlvbih0KXtmb3IodmFyIGUsbj0xLzAsaT0xLzAscj10aGlzLmJvdW5kcygpLG89dGhpcy5lbnRpdGllcygpLGE9by5sZW5ndGgscz0wO3M8YTtzKyspe3ZhciBsPW9bc107aWYoTEV0Lk1hdGgud2l0aGluKGwucG9zaXRpb24scikpe3ZhciBjPU1hdGguYWJzKHQueC1sLnBvc2l0aW9uLngpLHU9TWF0aC5hYnModC55LWwucG9zaXRpb24ueSk7KGM8bnx8Yz09PW4mJnU8aSkmJihlPWwsbj1jLGk9dSl9fXJldHVybiBlfSxlLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7dmFyIGU9dC5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpO3JldHVybiBlLmQ9dGhpcy5fY29uc3RydWN0TGluZVByb2plY3RvcihORXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLE5FdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSkpLGV9LGUucHJvdG90eXBlLl9jb25zdHJ1Y3RMaW5lUHJvamVjdG9yPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcztyZXR1cm4gZnVuY3Rpb24oaSxyLG8pe3JldHVybiBuLl9kM0xpbmVGYWN0b3J5KG8sdCxlKShpKX19LGUucHJvdG90eXBlLl9kM0xpbmVGYWN0b3J5PWZ1bmN0aW9uKHQsZSxuKXt2b2lkIDA9PT1lJiYoZT1ORXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpKSx2b2lkIDA9PT1uJiYobj1ORXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpKTtyZXR1cm4gU0V0LmxpbmUoKS54KChmdW5jdGlvbihuLGkpe3JldHVybiBlKG4saSx0KX0pKS55KChmdW5jdGlvbihlLGkpe3JldHVybiBuKGUsaSx0KX0pKS5jdXJ2ZSh0aGlzLl9nZXRDdXJ2ZUZhY3RvcnkoKSkuZGVmaW5lZCgoZnVuY3Rpb24oaSxyKXtyZXR1cm4oZnVuY3Rpb24odCxpLHIpe3ZhciBvPWUodCxpLHIpLGE9bih0LGkscik7cmV0dXJuIExFdC5NYXRoLmlzVmFsaWROdW1iZXIobykmJkxFdC5NYXRoLmlzVmFsaWROdW1iZXIoYSl9KShpLHIsdCl9KSl9LGUucHJvdG90eXBlLl9nZXRDdXJ2ZUZhY3Rvcnk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmN1cnZlKCk7aWYoInN0cmluZyI9PXR5cGVvZiB0KXt2YXIgZT1SRXRbdF07cmV0dXJuIG51bGw9PWU/UkV0LmxpbmVhcjplfXJldHVybiB0fSxlLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT1uZXcgTEV0Lk1hcDtyZXR1cm4gdGhpcy5kYXRhc2V0cygpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciBpPW4uZGF0YSgpO2lmKHQuX2Nyb3BwZWRSZW5kZXJpbmdFbmFibGVkfHx0Ll9kb3duc2FtcGxpbmdFbmFibGVkKXtmb3IodmFyIHI9W10sbz1pLmxlbmd0aCxhPTA7YTxvO2ErKylyW2FdPWE7dC5fY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWQmJihyPXQuX2ZpbHRlckNyb3BwZWRSZW5kZXJpbmcobixyKSksdC5fZG93bnNhbXBsaW5nRW5hYmxlZCYmKHI9dC5fZmlsdGVyRG93bnNhbXBsaW5nKG4scikpLHQuX2NvbGxhcHNlRGVuc2VWZXJ0aWNhbExpbmVzRW5hYmxlZCYmKHI9dC5fZmlsdGVyRGVuc2VMaW5lcyhuLHIpKTt2YXIgcz1bXSxsPXIubGVuZ3RoO2ZvcihhPTA7YTxsO2ErKyl7c1thXT1pW3JbYV1dfWUuc2V0KG4sW3NdKX1lbHNlIGUuc2V0KG4sW2ldKX0pKSxlfSxlLnByb3RvdHlwZS5fZmlsdGVyQ3JvcHBlZFJlbmRlcmluZz1mdW5jdGlvbih0LGUpe2Zvcih2YXIgbj10aGlzLGk9TkV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxyPU5FdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSksbz10LmRhdGEoKSxhPVtdLHM9ZnVuY3Rpb24odCxlKXtyZXR1cm4gTEV0Lk1hdGguaW5SYW5nZSh0LDAsbi53aWR0aCgpKSYmTEV0Lk1hdGguaW5SYW5nZShlLDAsbi5oZWlnaHQoKSl9LGw9MDtsPGUubGVuZ3RoO2wrKyl7dmFyIGM9cyhpKG9bZVtsXV0sZVtsXSx0KSxyKG9bZVtsXV0sZVtsXSx0KSk7aWYoIWMmJm51bGwhPWVbbC0xXSYmbnVsbCE9b1tlW2wtMV1dKXt2YXIgdT1pKG9bZVtsLTFdXSxlW2wtMV0sdCksaD1yKG9bZVtsLTFdXSxlW2wtMV0sdCk7Yz1jfHxzKHUsaCl9aWYoIWMmJm51bGwhPWVbbCsxXSYmbnVsbCE9b1tlW2wrMV1dKXt2YXIgZD1pKG9bZVtsKzFdXSxlW2wrMV0sdCkscD1yKG9bZVtsKzFdXSxlW2wrMV0sdCk7Yz1jfHxzKGQscCl9YyYmYS5wdXNoKGVbbF0pfXJldHVybiBhfSxlLnByb3RvdHlwZS5fZmlsdGVyRG93bnNhbXBsaW5nPWZ1bmN0aW9uKHQsZSl7aWYoMD09PWUubGVuZ3RoKXJldHVybltdO2Zvcih2YXIgbj10LmRhdGEoKSxpPU5FdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSkscj1ORXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpLG89W2VbMF1dLGE9ZnVuY3Rpb24obyxhKXt2YXIgcz1pKG5bZVtvXV0sZVtvXSx0KSxsPXIobltlW29dXSxlW29dLHQpLGM9aShuW2VbbysxXV0sZVtvKzFdLHQpLHU9cihuW2VbbysxXV0sZVtvKzFdLHQpO2lmKGE9PT0xLzApcmV0dXJuIE1hdGguZmxvb3Iocyk9PT1NYXRoLmZsb29yKGMpO3ZhciBoPWwrKGMtcykqYTtyZXR1cm4gTWF0aC5mbG9vcih1KT09PU1hdGguZmxvb3IoaCl9LHM9MDtzPGUubGVuZ3RoLTE7KXtmb3IodmFyIGw9ZVtzXSxjPWkobltlW3NdXSxlW3NdLHQpLHU9cihuW2Vbc11dLGVbc10sdCksaD1pKG5bZVtzKzFdXSxlW3MrMV0sdCksZD1yKG5bZVtzKzFdXSxlW3MrMV0sdCkscD1NYXRoLmZsb29yKGMpPT09TWF0aC5mbG9vcihoKT8xLzA6KGQtdSkvKGgtYyksZj1lW3NdLG09cD09PTEvMD91OmMsZz1mLF89bSx5PSEwO3M8ZS5sZW5ndGgtMSYmKHl8fGEocyxwKSk7KXtzKysseT0hMTt2YXIgdj1wPT09MS8wP3IobltlW3NdXSxlW3NdLHQpOmkobltlW3NdXSxlW3NdLHQpO3Y+XyYmKF89dixnPWVbc10pLHY8bSYmKG09dixmPWVbc10pfXZhciBiPWVbc107ZiE9PWwmJm8ucHVzaChmKSxnIT09ZiYmZyE9PWwmJm8ucHVzaChnKSxiIT09bCYmYiE9PWYmJmIhPT1nJiZvLnB1c2goYil9cmV0dXJuIG99LGUucHJvdG90eXBlLl9maWx0ZXJEZW5zZUxpbmVzPWZ1bmN0aW9uKHQsZSl7aWYoMD09PWUubGVuZ3RoKXJldHVybltdO3ZhciBuPXQuZGF0YSgpLGk9TkV0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxyPU5FdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk7cmV0dXJuIHRoaXMuX2J1Y2tldEJ5WCh0LGUsKGZ1bmN0aW9uKGUpe3JldHVybiBpKG5bZV0sZSx0KX0pLChmdW5jdGlvbihlKXtyZXR1cm4gcihuW2VdLGUsdCl9KSl9LGUucHJvdG90eXBlLl9idWNrZXRCeVg9ZnVuY3Rpb24odCxlLG4saSl7Zm9yKHZhciByPVtdLG89dC5kYXRhKCksYT1udWxsLHM9ZS5sZW5ndGgsbD0wO2w8PXM7KytsKXt2YXIgYz1lW2xdO2lmKG51bGwhPW9bY10pe3ZhciB1PU1hdGguZmxvb3IobihjKSksaD1pKGMpO251bGw9PWE/YT1uZXcgTEV0LkJ1Y2tldChjLHUsaCk6YS5pc0luQnVja2V0KHUpP2EuYWRkVG9CdWNrZXQoaCxjKTooci5wdXNoLmFwcGx5KHIsYS5nZXRVbmlxdWVJbmRpY2VzKCkpLGE9bmV3IExFdC5CdWNrZXQoYyx1LGgpKX19cmV0dXJuIG51bGwhPWEmJnIucHVzaC5hcHBseShyLGEuZ2V0VW5pcXVlSW5kaWNlcygpKSxyfSxlfSkoSUV0LlhZUGxvdCk7ZkV0LkxpbmU9T0V0LAovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkocEV0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgekV0PUJPLERFdD13cHQsQkV0PVh2dCxIRXQ9RF90LEZFdD1QTXQsVkV0PUJNdCxVRXQ9R1N0LGpFdD1XTXQsR0V0PWRFdCxXRXQ9c1N0LHFFdD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gZS5hZGRDbGFzcygiYXJlYS1wbG90IiksZS55MCgwKSxlLmF0dHIoImZpbGwtb3BhY2l0eSIsLjI1KSxlLmF0dHIoImZpbGwiLChuZXcgQkV0LkNvbG9yKS5yYW5nZSgpWzBdKSxlLl9saW5lRHJhd2Vycz1uZXcgSEV0Lk1hcCxlfXJldHVybiB6RXQuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUueT1mdW5jdGlvbihuLGkpe2lmKG51bGw9PW4pcmV0dXJuIHQucHJvdG90eXBlLnkuY2FsbCh0aGlzKTtpZihudWxsPT1pP3QucHJvdG90eXBlLnkuY2FsbCh0aGlzLG4pOnQucHJvdG90eXBlLnkuY2FsbCh0aGlzLG4saSksbnVsbCE9aSl7dmFyIHI9dGhpcy55MCgpLmFjY2Vzc29yO251bGwhPXImJnRoaXMuX2JpbmRQcm9wZXJ0eShlLl9ZMF9LRVkscixpKSx0aGlzLl91cGRhdGVZU2NhbGUoKX1yZXR1cm4gdGhpc30sZS5wcm90b3R5cGUueTA9ZnVuY3Rpb24odCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoZS5fWTBfS0VZKTt2YXIgbj10aGlzLnkoKTtyZXR1cm4gdGhpcy5fYmluZFByb3BlcnR5KGUuX1kwX0tFWSx0LG4mJm4uc2NhbGUpLHRoaXMuX3VwZGF0ZVlTY2FsZSgpLHRoaXMucmVuZGVyKCksdGhpc30sZS5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZT1mdW5jdGlvbigpe3QucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGUuY2FsbCh0aGlzKSx0aGlzLl91cGRhdGVZU2NhbGUoKX0sZS5wcm90b3R5cGUuX2FkZERhdGFzZXQ9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcztyZXR1cm4gdGhpcy5fbGluZURyYXdlcnMuc2V0KGUsbmV3IEZFdC5Qcm94eURyYXdlcigoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IGpFdC5MaW5lU1ZHRHJhd2VyfSksKGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgRkV0LkNhbnZhc0RyYXdlcih0LGpFdC5tYWtlTGluZUNhbnZhc0RyYXdTdGVwKChmdW5jdGlvbigpe3ZhciB0PVdFdC5QbG90Ll9zY2FsZWRBY2Nlc3NvcihuLngoKSksaT1XRXQuUGxvdC5fc2NhbGVkQWNjZXNzb3Iobi55KCkpO3JldHVybiBuLl9kM0xpbmVGYWN0b3J5KGUsdCxpKX0pKSl9KSkpLHQucHJvdG90eXBlLl9hZGREYXRhc2V0LmNhbGwodGhpcyxlKSx0aGlzfSxlLnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0PWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQuY2FsbCh0aGlzLGUpO3ZhciBuPXRoaXMuX2xpbmVEcmF3ZXJzLmdldChlKTtyZXR1cm4ic3ZnIj09PXRoaXMucmVuZGVyZXIoKT9uLnVzZVNWRyh0aGlzLl9yZW5kZXJBcmVhKTpuLnVzZUNhbnZhcyh0aGlzLl9jYW52YXMpLG59LGUucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXM9ZnVuY3Rpb24oZSl7dC5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcy5jYWxsKHRoaXMsZSksdGhpcy5fbGluZURyYXdlcnMuZ2V0KGUpLnJlbW92ZSgpfSxlLnByb3RvdHlwZS5fYWRkaXRpb25hbFBhaW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMuX2dlbmVyYXRlTGluZURyYXdTdGVwcygpLG49dGhpcy5fZ2V0RGF0YVRvRHJhdygpO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKChmdW5jdGlvbihpKXt2YXIgcj1XRXQuUGxvdC5hcHBseURyYXdTdGVwcyhlLGkpO3QuX2xpbmVEcmF3ZXJzLmdldChpKS5kcmF3KG4uZ2V0KGkpLHIpfSkpfSxlLnByb3RvdHlwZS5fZ2VuZXJhdGVMaW5lRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7dmFyIHQ9W107aWYodGhpcy5fYW5pbWF0ZU9uTmV4dFJlbmRlcigpKXt2YXIgZT10aGlzLl9nZW5lcmF0ZUxpbmVBdHRyVG9Qcm9qZWN0b3IoKTtlLmQ9dGhpcy5fY29uc3RydWN0TGluZVByb2plY3RvcihXRXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHRoaXMuX2dldFJlc2V0WUZ1bmN0aW9uKCkpLHQucHVzaCh7YXR0clRvUHJvamVjdG9yOmUsYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoR0V0LkFuaW1hdG9yLlJFU0VUKX0pfXJldHVybiB0LnB1c2goe2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZW5lcmF0ZUxpbmVBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcihHRXQuQW5pbWF0b3IuTUFJTil9KSx0fSxlLnByb3RvdHlwZS5fZ2VuZXJhdGVMaW5lQXR0clRvUHJvamVjdG9yPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7cmV0dXJuIHQuZD10aGlzLl9jb25zdHJ1Y3RMaW5lUHJvamVjdG9yKFdFdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksV0V0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSksdH0sZS5wcm90b3R5cGUuX2NyZWF0ZURyYXdlcj1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybiBuZXcgVUV0LlByb3h5RHJhd2VyKChmdW5jdGlvbigpe3JldHVybiBuZXcgVkV0LkFyZWFTVkdEcmF3ZXJ9KSwoZnVuY3Rpb24obil7cmV0dXJuIG5ldyBGRXQuQ2FudmFzRHJhd2VyKG4sVkV0Lm1ha2VBcmVhQ2FudmFzRHJhd1N0ZXAoKGZ1bmN0aW9uKCl7dmFyIG49ZS5fY29vcmRpbmF0ZVByb2plY3RvcnMoKSxpPW5bMF0scj1uWzFdLG89blsyXSxhPWUuX2NyZWF0ZURlZmluZWRQcm9qZWN0b3IoaSxyKTtyZXR1cm4gZS5fY3JlYXRlQXJlYUdlbmVyYXRvcihpLHIsbyxhLHQpfSksKGZ1bmN0aW9uKCl7dmFyIG49ZS5fY29vcmRpbmF0ZVByb2plY3RvcnMoKSxpPW5bMF0scj1uWzFdLG89ZS5fY3JlYXRlRGVmaW5lZFByb2plY3RvcihpLHIpO3JldHVybiBlLl9jcmVhdGVUb3BMaW5lR2VuZXJhdG9yKGkscixvLHQpfSkpKX0pKX0sZS5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7dmFyIHQ9W107aWYodGhpcy5fYW5pbWF0ZU9uTmV4dFJlbmRlcigpKXt2YXIgZT10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTtlLmQ9dGhpcy5fY29uc3RydWN0QXJlYVByb2plY3RvcihXRXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLHRoaXMuX2dldFJlc2V0WUZ1bmN0aW9uKCksV0V0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueTAoKSkpLHQucHVzaCh7YXR0clRvUHJvamVjdG9yOmUsYW5pbWF0b3I6dGhpcy5fZ2V0QW5pbWF0b3IoR0V0LkFuaW1hdG9yLlJFU0VUKX0pfXJldHVybiB0LnB1c2goe2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcihHRXQuQW5pbWF0b3IuTUFJTil9KSx0fSxlLnByb3RvdHlwZS5fdXBkYXRlWVNjYWxlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5nZXRFeHRlbnRzRm9yUHJvcGVydHkoInkwIiksZT1IRXQuQXJyYXkuZmxhdHRlbih0KSxuPUhFdC5BcnJheS51bmlxKGUpLGk9MT09PW4ubGVuZ3RoP25bMF06bnVsbCxyPXRoaXMueSgpLG89ciYmci5zY2FsZTtudWxsIT1vJiYobnVsbCE9dGhpcy5fY29uc3RhbnRCYXNlbGluZVZhbHVlUHJvdmlkZXImJihvLnJlbW92ZVBhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXIodGhpcy5fY29uc3RhbnRCYXNlbGluZVZhbHVlUHJvdmlkZXIpLHRoaXMuX2NvbnN0YW50QmFzZWxpbmVWYWx1ZVByb3ZpZGVyPW51bGwpLG51bGwhPWkmJih0aGlzLl9jb25zdGFudEJhc2VsaW5lVmFsdWVQcm92aWRlcj1mdW5jdGlvbigpe3JldHVybltpXX0sby5hZGRQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyKHRoaXMuX2NvbnN0YW50QmFzZWxpbmVWYWx1ZVByb3ZpZGVyKSkpfSxlLnByb3RvdHlwZS5fZ2V0UmVzZXRZRnVuY3Rpb249ZnVuY3Rpb24oKXtyZXR1cm4gV0V0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueTAoKSl9LGUucHJvdG90eXBlLl9jb29yZGluYXRlUHJvamVjdG9ycz1mdW5jdGlvbigpe3JldHVybltXRXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLFdFdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSksV0V0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueTAoKSldfSxlLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7dmFyIGU9dC5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpLG49dGhpcy5fY29vcmRpbmF0ZVByb2plY3RvcnMoKTtyZXR1cm4gZS5kPXRoaXMuX2NvbnN0cnVjdEFyZWFQcm9qZWN0b3IoblswXSxuWzFdLG5bMl0pLGV9LGUucHJvdG90eXBlLnNlbGVjdGlvbnM9ZnVuY3Rpb24oZSl7dmFyIG49dGhpcztpZih2b2lkIDA9PT1lJiYoZT10aGlzLmRhdGFzZXRzKCkpLCJjYW52YXMiPT09dGhpcy5yZW5kZXJlcigpKXJldHVybiBERXQuc2VsZWN0QWxsKCk7dmFyIGk9dC5wcm90b3R5cGUuc2VsZWN0aW9ucy5jYWxsKHRoaXMsZSkubm9kZXMoKTtyZXR1cm4gZS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiBuLl9saW5lRHJhd2Vycy5nZXQodCl9KSkuZmlsdGVyKChmdW5jdGlvbih0KXtyZXR1cm4gbnVsbCE9dH0pKS5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gaS5wdXNoLmFwcGx5KGksdC5nZXRWaXN1YWxQcmltaXRpdmVzKCkpfSkpLERFdC5zZWxlY3RBbGwoaSl9LGUucHJvdG90eXBlLl9jb25zdHJ1Y3RBcmVhUHJvamVjdG9yPWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLHI9dGhpcy5fY3JlYXRlRGVmaW5lZFByb2plY3RvcihXRXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLFdFdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSkpO3JldHVybiBmdW5jdGlvbihvLGEscyl7cmV0dXJuIGkuX2NyZWF0ZUFyZWFHZW5lcmF0b3IodCxlLG4scixzKShvKX19LGUucHJvdG90eXBlLl9jcmVhdGVEZWZpbmVkUHJvamVjdG9yPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGZ1bmN0aW9uKG4saSxyKXt2YXIgbz10KG4saSxyKSxhPWUobixpLHIpO3JldHVybiBIRXQuTWF0aC5pc1ZhbGlkTnVtYmVyKG8pJiZIRXQuTWF0aC5pc1ZhbGlkTnVtYmVyKGEpfX0sZS5wcm90b3R5cGUuX2NyZWF0ZUFyZWFHZW5lcmF0b3I9ZnVuY3Rpb24odCxlLG4saSxyKXt2YXIgbz10aGlzLl9nZXRDdXJ2ZUZhY3RvcnkoKTtyZXR1cm4gREV0LmFyZWEoKS54KChmdW5jdGlvbihlLG4pe3JldHVybiB0KGUsbixyKX0pKS55MSgoZnVuY3Rpb24odCxuKXtyZXR1cm4gZSh0LG4scil9KSkueTAoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4odCxlLHIpfSkpLmN1cnZlKG8pLmRlZmluZWQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGkodCxlLHIpfSkpfSxlLnByb3RvdHlwZS5fY3JlYXRlVG9wTGluZUdlbmVyYXRvcj1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj10aGlzLl9nZXRDdXJ2ZUZhY3RvcnkoKTtyZXR1cm4gREV0LmxpbmUoKS54KChmdW5jdGlvbihlLG4pe3JldHVybiB0KGUsbixpKX0pKS55KChmdW5jdGlvbih0LG4pe3JldHVybiBlKHQsbixpKX0pKS5jdXJ2ZShyKS5kZWZpbmVkKChmdW5jdGlvbih0LGUpe3JldHVybiBuKHQsZSxpKX0pKX0sZS5fWTBfS0VZPSJ5MCIsZX0pKGZFdC5MaW5lKTtwRXQuQXJlYT1xRXQ7dmFyIFlFdD17fTshKGZ1bmN0aW9uKHQpewovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwpPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGU9Qk8sbj13cHQsaT1MZ3Qscj1mZ3Qsbz1wdnQsYT1QTXQscz1HU3QsbD1aTXQsYz1jU3QsdT1YdnQsaD1MYnQsZD1EX3QscD1iZ3QsZj1kRXQsbT1zU3QsZz1tRXQ7dC5CYXJPcmllbnRhdGlvbj1wLm1ha2VFbnVtKFsidmVydGljYWwiLCJob3Jpem9udGFsIl0pLHQuTGFiZWxzUG9zaXRpb249cC5tYWtlRW51bShbInN0YXJ0IiwibWlkZGxlIiwiZW5kIiwib3V0c2lkZSJdKSx0LkJhckFsaWdubWVudD1wLm1ha2VFbnVtKFsic3RhcnQiLCJtaWRkbGUiLCJlbmQiXSk7dmFyIF89KGZ1bmN0aW9uKHApe2Z1bmN0aW9uIGcoZSl7dm9pZCAwPT09ZSYmKGU9InZlcnRpY2FsIik7dmFyIG49cC5jYWxsKHRoaXMpfHx0aGlzO2lmKG4uX2xhYmVsRm9ybWF0dGVyPW8uaWRlbnRpdHkoKSxuLl9sYWJlbHNFbmFibGVkPSExLG4uX2xhYmVsc1Bvc2l0aW9uPXQuTGFiZWxzUG9zaXRpb24uZW5kLG4uX2hpZGVCYXJzSWZBbnlBcmVUb29XaWRlPSEwLG4uX2JhckFsaWdubWVudD0ibWlkZGxlIixuLl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3M9Yy5tZW1vaXplKHkpLG4uX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3M9ITAsbi5hZGRDbGFzcygiYmFyLXBsb3QiKSwidmVydGljYWwiIT09ZSYmImhvcml6b250YWwiIT09ZSl0aHJvdyBuZXcgRXJyb3IoZSsiIGlzIG5vdCBhIHZhbGlkIG9yaWVudGF0aW9uIGZvciBQbG90cy5CYXIiKTtyZXR1cm4gbi5faXNWZXJ0aWNhbD0idmVydGljYWwiPT09ZSxuLmFuaW1hdG9yKCJiYXNlbGluZSIsbmV3IHIuTnVsbCksbi5hdHRyKCJmaWxsIiwobmV3IHUuQ29sb3IpLnJhbmdlKClbMF0pLG4uYXR0cihnLl9CQVJfVEhJQ0tORVNTX0tFWSwoZnVuY3Rpb24oKXtyZXR1cm4gbi5fYmFyUGl4ZWxUaGlja25lc3MoKX0pKSxuLl9sYWJlbENvbmZpZz1uZXcgZC5NYXAsbi5fYmFzZWxpbmVWYWx1ZVByb3ZpZGVyPWZ1bmN0aW9uKCl7cmV0dXJuW24uYmFzZWxpbmVWYWx1ZSgpXX0sbn1yZXR1cm4gZS5fX2V4dGVuZHMoZyxwKSxnLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gcC5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsdCxlLG4pLHRoaXMuX3VwZGF0ZUV4dGVudHMoKSx0aGlzfSxnLnByb3RvdHlwZS54PWZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/cC5wcm90b3R5cGUueC5jYWxsKHRoaXMpOihudWxsPT1lP3AucHJvdG90eXBlLnguY2FsbCh0aGlzLHQpOnAucHJvdG90eXBlLnguY2FsbCh0aGlzLHQsZSksdGhpcy5fdXBkYXRlVGhpY2tuZXNzQXR0cigpLHRoaXMuX3VwZGF0ZUxlbmd0aFNjYWxlKCksdGhpcyl9LGcucHJvdG90eXBlLnk9ZnVuY3Rpb24odCxlKXtyZXR1cm4gbnVsbD09dD9wLnByb3RvdHlwZS55LmNhbGwodGhpcyk6KG51bGw9PWU/cC5wcm90b3R5cGUueS5jYWxsKHRoaXMsdCk6cC5wcm90b3R5cGUueS5jYWxsKHRoaXMsdCxlKSx0aGlzLl91cGRhdGVMZW5ndGhTY2FsZSgpLHRoaXMpfSxnLnByb3RvdHlwZS5sZW5ndGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNWZXJ0aWNhbD90aGlzLnkoKTp0aGlzLngoKX0sZy5wcm90b3R5cGUucG9zaXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNWZXJ0aWNhbD90aGlzLngoKTp0aGlzLnkoKX0sZy5wcm90b3R5cGUuYmFyRW5kPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KGcuX0JBUl9FTkRfS0VZKTt2YXIgZT10aGlzLnBvc2l0aW9uKCk7cmV0dXJuIHRoaXMuX2JpbmRQcm9wZXJ0eShnLl9CQVJfRU5EX0tFWSx0LGUmJmUuc2NhbGUpLHRoaXMuX3VwZGF0ZVRoaWNrbmVzc0F0dHIoKSx0aGlzLl91cGRhdGVMZW5ndGhTY2FsZSgpLHRoaXMucmVuZGVyKCksdGhpc30sZy5wcm90b3R5cGUuYmFyQWxpZ25tZW50PWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2JhckFsaWdubWVudDoodGhpcy5fYmFyQWxpZ25tZW50PXQsdGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpLHRoaXMucmVuZGVyKCksdGhpcyl9LGcucHJvdG90eXBlLm9yaWVudGF0aW9uPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2lzVmVydGljYWw/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCJ9LGcucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHMuUHJveHlEcmF3ZXIoKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBsLlJlY3RhbmdsZVNWR0RyYXdlcihnLl9CQVJfQVJFQV9DTEFTUyl9KSwoZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBhLlJlY3RhbmdsZUNhbnZhc0RyYXdlcih0KX0pKX0sZy5wcm90b3R5cGUuX3NldHVwPWZ1bmN0aW9uKCl7cC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyksdGhpcy5fYmFzZWxpbmU9dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKCJiYXNlbGluZSIsITApfSxnLnByb3RvdHlwZS5iYXNlbGluZVZhbHVlPWZ1bmN0aW9uKHQpe2lmKG51bGw9PXQpe2lmKG51bGwhPXRoaXMuX2Jhc2VsaW5lVmFsdWUpcmV0dXJuIHRoaXMuX2Jhc2VsaW5lVmFsdWU7aWYoIXRoaXMuX3Byb2plY3RvcnNSZWFkeSgpKXJldHVybiAwO3ZhciBlPXRoaXMubGVuZ3RoKCkuc2NhbGU7cmV0dXJuIGUmJmUgaW5zdGFuY2VvZiB1LlRpbWU/bmV3IERhdGUoMCk6MH1yZXR1cm4gdGhpcy5fYmFzZWxpbmVWYWx1ZT10LHRoaXMuX3VwZGF0ZUxlbmd0aFNjYWxlKCksdGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpLHRoaXMucmVuZGVyKCksdGhpc30sZy5wcm90b3R5cGUuYWRkRGF0YXNldD1mdW5jdGlvbih0KXtyZXR1cm4gcC5wcm90b3R5cGUuYWRkRGF0YXNldC5jYWxsKHRoaXMsdCksdGhpc30sZy5wcm90b3R5cGUuX2FkZERhdGFzZXQ9ZnVuY3Rpb24odCl7cmV0dXJuIHAucHJvdG90eXBlLl9hZGREYXRhc2V0LmNhbGwodGhpcyx0KSx0aGlzfSxnLnByb3RvdHlwZS5yZW1vdmVEYXRhc2V0PWZ1bmN0aW9uKHQpe3JldHVybiBwLnByb3RvdHlwZS5yZW1vdmVEYXRhc2V0LmNhbGwodGhpcyx0KSx0aGlzfSxnLnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldD1mdW5jdGlvbih0KXtyZXR1cm4gcC5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXQuY2FsbCh0aGlzLHQpLHRoaXN9LGcucHJvdG90eXBlLmRhdGFzZXRzPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3AucHJvdG90eXBlLmRhdGFzZXRzLmNhbGwodGhpcyk6KHAucHJvdG90eXBlLmRhdGFzZXRzLmNhbGwodGhpcyx0KSx0aGlzKX0sZy5wcm90b3R5cGUubGFiZWxzRW5hYmxlZD1mdW5jdGlvbih0LGUpe3JldHVybiBudWxsPT10P3RoaXMuX2xhYmVsc0VuYWJsZWQ6KHRoaXMuX2xhYmVsc0VuYWJsZWQ9dCxudWxsIT1lJiYodGhpcy5fbGFiZWxzUG9zaXRpb249ZSksdGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpLHRoaXMucmVuZGVyKCksdGhpcyl9LGcucHJvdG90eXBlLmxhYmVsRm9ybWF0dGVyPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2xhYmVsRm9ybWF0dGVyOih0aGlzLl9sYWJlbEZvcm1hdHRlcj10LHRoaXMuX2NsZWFyQXR0clRvUHJvamVjdG9yQ2FjaGUoKSx0aGlzLnJlbmRlcigpLHRoaXMpfSxnLnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0PWZ1bmN0aW9uKHQpe3ZhciBlPXAucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQuY2FsbCh0aGlzLHQpLG49dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImciKS5jbGFzc2VkKGcuX0xBQkVMX0FSRUFfQ0xBU1MsITApLHI9bmV3IGkuU3ZnQ29udGV4dChuLm5vZGUoKSksbz1uZXcgaS5DYWNoZU1lYXN1cmVyKHIpLGE9bmV3IGkuV3JpdGVyKG8scik7cmV0dXJuIHRoaXMuX2xhYmVsQ29uZmlnLnNldCh0LHtsYWJlbEFyZWE6bixtZWFzdXJlcjpvLHdyaXRlcjphfSksZX0sZy5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcz1mdW5jdGlvbih0KXtwLnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzLmNhbGwodGhpcyx0KTt2YXIgZT10aGlzLl9sYWJlbENvbmZpZy5nZXQodCk7bnVsbCE9ZSYmKGUubGFiZWxBcmVhLnJlbW92ZSgpLHRoaXMuX2xhYmVsQ29uZmlnLmRlbGV0ZSh0KSl9LGcucHJvdG90eXBlLmVudGl0eU5lYXJlc3Q9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWZ1bmN0aW9uKCl7dmFyIG49ZS5faXNWZXJ0aWNhbD9lLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0eU5lYXJlc3RYKHQpOmUuX2dldEVudGl0eVN0b3JlKCkuZW50aXR5TmVhcmVzdFkodCk7cmV0dXJuIHZvaWQgMD09PW4/dm9pZCAwOmUuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShuKX07cmV0dXJuIHRoaXMuX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3M/dGhpcy5fY29tcHV0ZUJhclBpeGVsVGhpY2tuZXNzLmRvTG9ja2VkKG4pOm4oKX0sZy5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49ZnVuY3Rpb24oKXtyZXR1cm4gZS5fZW50aXRpZXNJbnRlcnNlY3RpbmcodC54LHQueSl9O3JldHVybiB0aGlzLl9maXhlZEJhclBpeGVsVGhpY2tuZXNzP3RoaXMuX2NvbXB1dGVCYXJQaXhlbFRoaWNrbmVzcy5kb0xvY2tlZChuKTpuKCl9LGcucHJvdG90eXBlLmVudGl0aWVzSW5Cb3VuZHM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcyxuPWZ1bmN0aW9uKCl7cmV0dXJuIHAucHJvdG90eXBlLmVudGl0aWVzSW5Cb3VuZHMuY2FsbChlLHQpfTtyZXR1cm4gdGhpcy5fZml4ZWRCYXJQaXhlbFRoaWNrbmVzcz90aGlzLl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3MuZG9Mb2NrZWQobik6bigpfSxnLnByb3RvdHlwZS5lbnRpdGllc0luWEJvdW5kcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49ZnVuY3Rpb24oKXtyZXR1cm4gcC5wcm90b3R5cGUuZW50aXRpZXNJblhCb3VuZHMuY2FsbChlLHQpfTtyZXR1cm4gdGhpcy5fZml4ZWRCYXJQaXhlbFRoaWNrbmVzcz90aGlzLl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3MuZG9Mb2NrZWQobik6bigpfSxnLnByb3RvdHlwZS5lbnRpdGllc0luWUJvdW5kcz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49ZnVuY3Rpb24oKXtyZXR1cm4gcC5wcm90b3R5cGUuZW50aXRpZXNJbllCb3VuZHMuY2FsbChlLHQpfTtyZXR1cm4gdGhpcy5fZml4ZWRCYXJQaXhlbFRoaWNrbmVzcz90aGlzLl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3MuZG9Mb2NrZWQobik6bigpfSxnLnByb3RvdHlwZS5fZW50aXRpZXNJbnRlcnNlY3Rpbmc9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W10saT10aGlzLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0aWVzKCkscj1pLmxlbmd0aCxvPTA7bzxyO28rKyl7dmFyIGE9aVtvXTtkLkRPTS5pbnRlcnNlY3RzQkJveCh0LGUsdGhpcy5fZW50aXR5Qm91bmRzKGEpKSYmbi5wdXNoKHRoaXMuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShhKSl9cmV0dXJuIG59LGcucHJvdG90eXBlLl91cGRhdGVMZW5ndGhTY2FsZT1mdW5jdGlvbigpe2lmKHRoaXMuX3Byb2plY3RvcnNSZWFkeSgpKXt2YXIgdD10aGlzLmxlbmd0aCgpLnNjYWxlO3QgaW5zdGFuY2VvZiBoLlF1YW50aXRhdGl2ZVNjYWxlJiYodC5hZGRQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyKHRoaXMuX2Jhc2VsaW5lVmFsdWVQcm92aWRlciksdC5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKHRoaXMuX2Jhc2VsaW5lVmFsdWVQcm92aWRlcikpfX0sZy5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHk9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3JldHVybiB0aGlzLl9iYXJQaXhlbFRoaWNrbmVzcygpLHRoaXMuX2NvbXB1dGVCYXJQaXhlbFRoaWNrbmVzcy5kb0xvY2tlZCgoZnVuY3Rpb24oKXtyZXR1cm4gcC5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0KX0pKX0sZy5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLG49dGhpcy5sZW5ndGgoKS5zY2FsZS5zY2FsZSh0aGlzLmJhc2VsaW5lVmFsdWUoKSksaT17eDE6dGhpcy5faXNWZXJ0aWNhbD8wOm4seTE6dGhpcy5faXNWZXJ0aWNhbD9uOjAseDI6dGhpcy5faXNWZXJ0aWNhbD90aGlzLndpZHRoKCk6bix5Mjp0aGlzLl9pc1ZlcnRpY2FsP246dGhpcy5oZWlnaHQoKX07dGhpcy5fZ2V0QW5pbWF0b3IoImJhc2VsaW5lIikuYW5pbWF0ZSh0aGlzLl9iYXNlbGluZSxpKSx0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7cmV0dXJuIGUuX2xhYmVsQ29uZmlnLmdldCh0KS5sYWJlbEFyZWEuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCl9KSksdGhpcy5fbGFiZWxzRW5hYmxlZCYmZC5XaW5kb3cuc2V0VGltZW91dCgoZnVuY3Rpb24oKXtyZXR1cm4gZS5fZHJhd0xhYmVscygpfSksdCl9LGcucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbih0KXt2YXIgZSxpPXRoaXMscj1wLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHkuY2FsbCh0aGlzLHQpO2lmKCJ4Ij09PXQmJnRoaXMuX2lzVmVydGljYWwpZT10aGlzLngoKTtlbHNle2lmKCJ5IiE9PXR8fHRoaXMuX2lzVmVydGljYWwpcmV0dXJuIHI7ZT10aGlzLnkoKX1pZighKGUmJmUuc2NhbGUmJmUuc2NhbGUgaW5zdGFuY2VvZiBoLlF1YW50aXRhdGl2ZVNjYWxlKSlyZXR1cm4gcjt2YXIgbz1lLnNjYWxlLGE9dGhpcy5fYmFyUGl4ZWxUaGlja25lc3MoKTtyZXR1cm4gcj1yLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIG4uZXh0ZW50KFtvLmludmVydChpLl9nZXRQb3NpdGlvbkF0dHIoby5zY2FsZSh0WzBdKSxhKSksby5pbnZlcnQoaS5fZ2V0UG9zaXRpb25BdHRyKG8uc2NhbGUodFswXSksYSkrYSksby5pbnZlcnQoaS5fZ2V0UG9zaXRpb25BdHRyKG8uc2NhbGUodFsxXSksYSkpLG8uaW52ZXJ0KGkuX2dldFBvc2l0aW9uQXR0cihvLnNjYWxlKHRbMV0pLGEpK2EpXSl9KSl9LGcucHJvdG90eXBlLl9nZXRQb3NpdGlvbkF0dHI9ZnVuY3Rpb24odCxlKXtzd2l0Y2godGhpcy5faXNWZXJ0aWNhbHx8KHQtPWUsZSo9LTEpLHRoaXMuX2JhckFsaWdubWVudCl7Y2FzZSJzdGFydCI6cmV0dXJuIHQ7Y2FzZSJlbmQiOnJldHVybiB0LWU7Y2FzZSJtaWRkbGUiOmRlZmF1bHQ6cmV0dXJuIHQtZS8yfX0sZy5wcm90b3R5cGUuX2RyYXdMYWJlbHM9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5fZ2V0RGF0YVRvRHJhdygpLG49dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksaT10aGlzLmRhdGFzZXRzKCkuc29tZSgoZnVuY3Rpb24oaSl7cmV0dXJuIGUuZ2V0KGkpLnNvbWUoKGZ1bmN0aW9uKGUscil7cmV0dXJuIG51bGwhPWUmJnQuX2RyYXdMYWJlbChlLHIsaSxuKX0pKX0pKTt0aGlzLl9oaWRlQmFyc0lmQW55QXJlVG9vV2lkZSYmaSYmdGhpcy5kYXRhc2V0cygpLmZvckVhY2goKGZ1bmN0aW9uKGUpe3JldHVybiB0Ll9sYWJlbENvbmZpZy5nZXQoZSkubGFiZWxBcmVhLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpfSkpfSxnLnByb3RvdHlwZS5fZHJhd0xhYmVsPWZ1bmN0aW9uKHQsZSxuLGkpe3ZhciByPXRoaXMuX2xhYmVsQ29uZmlnLmdldChuKSxvPXIubGFiZWxBcmVhLGE9ci5tZWFzdXJlcixzPXIud3JpdGVyLGw9KDAsdGhpcy5sZW5ndGgoKS5hY2Nlc3NvcikodCxlLG4pLGM9dGhpcy5sZW5ndGgoKS5zY2FsZSx1PW51bGwhPWM/Yy5zY2FsZShsKTpsLGg9bnVsbCE9Yz9jLnNjYWxlKHRoaXMuYmFzZWxpbmVWYWx1ZSgpKTp0aGlzLmJhc2VsaW5lVmFsdWUoKSxkPXt4OmkueCh0LGUsbikseTppLnkodCxlLG4pfSxwPXt3aWR0aDppLndpZHRoKHQsZSxuKSxoZWlnaHQ6aS5oZWlnaHQodCxlLG4pfSxmPXRoaXMuX2xhYmVsRm9ybWF0dGVyKGwsdCxlLG4pLG09YS5tZWFzdXJlKGYpLGc9dGhpcy5fc2hvdWxkU2hvd0xhYmVsT25CYXIoZCxwLG0pLF89dGhpcy5fY2FsY3VsYXRlTGFiZWxQcm9wZXJ0aWVzKGQscCxtLGcsdGhpcy5faXNWZXJ0aWNhbD91PD1oOnU8aCkseT1fLmNvbnRhaW5lckRpbWVuc2lvbnMsdj1fLmxhYmVsQ29udGFpbmVyT3JpZ2luLGI9Xy5sYWJlbE9yaWdpbix4PV8uYWxpZ25tZW50LHc9aS5maWxsKHQsZSxuKSxTPXRoaXMuX2NyZWF0ZUxhYmVsQ29udGFpbmVyKG8sdixiLG0sZyx3KTtyZXR1cm4gcy53cml0ZShmLHkud2lkdGgseS5oZWlnaHQse3hBbGlnbjp4LngseUFsaWduOngueX0sUy5ub2RlKCkpLHRoaXMuX2lzVmVydGljYWw/cC53aWR0aDxtLndpZHRoOnAuaGVpZ2h0PG0uaGVpZ2h0fSxnLnByb3RvdHlwZS5fc2hvdWxkU2hvd0xhYmVsT25CYXI9ZnVuY3Rpb24oZSxuLGkpe2lmKHRoaXMuX2xhYmVsc1Bvc2l0aW9uPT09dC5MYWJlbHNQb3NpdGlvbi5vdXRzaWRlKXJldHVybiExO3ZhciByPXRoaXMuX2lzVmVydGljYWw/ZS55OmUueCxvPXRoaXMuX2lzVmVydGljYWw/bi5oZWlnaHQ6bi53aWR0aCxhPXRoaXMuX2lzVmVydGljYWw/dGhpcy5oZWlnaHQoKTp0aGlzLndpZHRoKCkscz1yK28sbD1vO3JldHVybiBzPmE/bD1hLXI6cjwwJiYobD1zKSwodGhpcy5faXNWZXJ0aWNhbD9pLmhlaWdodDppLndpZHRoKStnLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUjw9bH0sZy5wcm90b3R5cGUuX2NhbGN1bGF0ZUxhYmVsUHJvcGVydGllcz1mdW5jdGlvbihlLG4saSxyLG8pe3ZhciBhPXRoaXMscz10aGlzLl9pc1ZlcnRpY2FsP2UueTplLngsbD10aGlzLl9pc1ZlcnRpY2FsP24uaGVpZ2h0Om4ud2lkdGgsYz10aGlzLl9pc1ZlcnRpY2FsP2kuaGVpZ2h0Omkud2lkdGgsdT0iY2VudGVyIixoPWwsZD1zLHA9cyxmPWZ1bmN0aW9uKHQpe3N3aXRjaCh0KXtjYXNlInRvcExlZnQiOnJldHVybiB1PWEuX2lzVmVydGljYWw/InRvcCI6ImxlZnQiLGQrPWcuX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSLHZvaWQocCs9Zy5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVIpO2Nhc2UiY2VudGVyIjpyZXR1cm4gdm9pZChwKz0obCtjKS8yKTtjYXNlImJvdHRvbVJpZ2h0IjpyZXR1cm4gdT1hLl9pc1ZlcnRpY2FsPyJib3R0b20iOiJyaWdodCIsZC09Zy5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVIsdm9pZChwKz1oLWcuX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSLWMpfX07aWYocilzd2l0Y2godGhpcy5fbGFiZWxzUG9zaXRpb24pe2Nhc2UgdC5MYWJlbHNQb3NpdGlvbi5zdGFydDpmKG8/ImJvdHRvbVJpZ2h0IjoidG9wTGVmdCIpO2JyZWFrO2Nhc2UgdC5MYWJlbHNQb3NpdGlvbi5taWRkbGU6ZigiY2VudGVyIik7YnJlYWs7Y2FzZSB0LkxhYmVsc1Bvc2l0aW9uLmVuZDpmKG8/InRvcExlZnQiOiJib3R0b21SaWdodCIpfWVsc2Ugbz8odT10aGlzLl9pc1ZlcnRpY2FsPyJ0b3AiOiJsZWZ0IixoPWwrZy5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVIrYyxkLT1nLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUitjLHAtPWcuX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSK2MpOih1PXRoaXMuX2lzVmVydGljYWw/ImJvdHRvbSI6InJpZ2h0IixoPWwrZy5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVIrYyxwKz1sK2cuX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSKTtyZXR1cm57Y29udGFpbmVyRGltZW5zaW9uczp7d2lkdGg6dGhpcy5faXNWZXJ0aWNhbD9uLndpZHRoOmgsaGVpZ2h0OnRoaXMuX2lzVmVydGljYWw/aDpuLmhlaWdodH0sbGFiZWxDb250YWluZXJPcmlnaW46e3g6dGhpcy5faXNWZXJ0aWNhbD9lLng6ZCx5OnRoaXMuX2lzVmVydGljYWw/ZDplLnl9LGxhYmVsT3JpZ2luOnt4OnRoaXMuX2lzVmVydGljYWw/ZS54K24ud2lkdGgvMi1pLndpZHRoLzI6cCx5OnRoaXMuX2lzVmVydGljYWw/cDplLnkrbi5oZWlnaHQvMi1pLmhlaWdodC8yfSxhbGlnbm1lbnQ6e3g6dGhpcy5faXNWZXJ0aWNhbD8iY2VudGVyIjp1LHk6dGhpcy5faXNWZXJ0aWNhbD91OiJjZW50ZXIifX19LGcucHJvdG90eXBlLl9jcmVhdGVMYWJlbENvbnRhaW5lcj1mdW5jdGlvbih0LGUsbixpLHIsbyl7dmFyIGE9dC5hcHBlbmQoImciKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoIitlLngrIiwgIitlLnkrIikiKTtpZihyKXthLmNsYXNzZWQoIm9uLWJhci1sYWJlbCIsITApO3ZhciBzPTEuNipkLkNvbG9yLmNvbnRyYXN0KCJ3aGl0ZSIsbyk8ZC5Db2xvci5jb250cmFzdCgiYmxhY2siLG8pO2EuY2xhc3NlZChzPyJkYXJrLWxhYmVsIjoibGlnaHQtbGFiZWwiLCEwKX1lbHNlIGEuY2xhc3NlZCgib2ZmLWJhci1sYWJlbCIsITApO3JldHVybiBhfSxnLnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHM9ZnVuY3Rpb24oKXt2YXIgdD1bXTtpZih0aGlzLl9hbmltYXRlT25OZXh0UmVuZGVyKCkpe3ZhciBlPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLG49dGhpcy5sZW5ndGgoKS5zY2FsZS5zY2FsZSh0aGlzLmJhc2VsaW5lVmFsdWUoKSksaT10aGlzLl9pc1ZlcnRpY2FsPyJoZWlnaHQiOiJ3aWR0aCI7ZVt0aGlzLl9pc1ZlcnRpY2FsPyJ5IjoieCJdPWZ1bmN0aW9uKCl7cmV0dXJuIG59LGVbaV09ZnVuY3Rpb24oKXtyZXR1cm4gMH0sdC5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6ZSxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcihmLkFuaW1hdG9yLlJFU0VUKX0pfXJldHVybiB0LnB1c2goe2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcihmLkFuaW1hdG9yLk1BSU4pfSksdH0sZy5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXAucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvci5jYWxsKHRoaXMpLG49dGhpcy5sZW5ndGgoKS5zY2FsZS5zY2FsZSh0aGlzLmJhc2VsaW5lVmFsdWUoKSksaT10aGlzLl9pc1ZlcnRpY2FsPyJ5IjoieCIscj10aGlzLl9pc1ZlcnRpY2FsPyJ4IjoieSIsbz1tLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMucG9zaXRpb24oKSksYT1tLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMubGVuZ3RoKCkpLHM9ZnVuY3Rpb24odCxlLGkpe3JldHVybiBNYXRoLmFicyhuLWEodCxlLGkpKX0sbD1lW2cuX0JBUl9USElDS05FU1NfS0VZXSxjPWUuZ2FwLHU9bnVsbD09Yz9sOmZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1sKHQsZSxuKTtyZXR1cm4gaTxnLl9CQVJfR0FQTEVTU19USFJFU0hPTERfUFg/aTppLWModCxlLG4pfTtyZXR1cm4gZS53aWR0aD10aGlzLl9pc1ZlcnRpY2FsP3U6cyxlLmhlaWdodD10aGlzLl9pc1ZlcnRpY2FsP3M6dSxlW2ldPWZ1bmN0aW9uKHQsZSxpKXt2YXIgcj1hKHQsZSxpKTtyZXR1cm4gcj5uP246cn0sZVtyXT1mdW5jdGlvbihlLG4saSl7cmV0dXJuIHQuX2dldFBvc2l0aW9uQXR0cihvKGUsbixpKSxsKGUsbixpKSl9LGV9LGcucHJvdG90eXBlLl91cGRhdGVUaGlja25lc3NBdHRyPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPXRoaXMucG9zaXRpb24oKSxuPXRoaXMuYmFyRW5kKCk7bnVsbCE9ZSYmbnVsbCE9bj8odGhpcy5fZml4ZWRCYXJQaXhlbFRoaWNrbmVzcz0hMSx0aGlzLmF0dHIoZy5fQkFSX1RISUNLTkVTU19LRVksKGZ1bmN0aW9uKHQsaSxyKXt2YXIgbz1lLmFjY2Vzc29yKHQsaSxyKSxhPW4uYWNjZXNzb3IodCxpLHIpO3JldHVybiBvPWUuc2NhbGU/ZS5zY2FsZS5zY2FsZShvKTpvLGE9bi5zY2FsZT9uLnNjYWxlLnNjYWxlKGEpOmEsTWF0aC5hYnMoYS1vKX0pKSk6KHRoaXMuX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3M9ITAsdGhpcy5hdHRyKGcuX0JBUl9USElDS05FU1NfS0VZLChmdW5jdGlvbigpe3JldHVybiB0Ll9iYXJQaXhlbFRoaWNrbmVzcygpfSkpKX0sZy5wcm90b3R5cGUuX2JhclBpeGVsVGhpY2tuZXNzPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3MmJnRoaXMuX3Byb2plY3RvcnNSZWFkeSgpP3RoaXMuX2NvbXB1dGVCYXJQaXhlbFRoaWNrbmVzcyh0aGlzLnBvc2l0aW9uKCksdGhpcy5kYXRhc2V0cygpLHRoaXMuX2lzVmVydGljYWw/dGhpcy53aWR0aCgpOnRoaXMuaGVpZ2h0KCkpOjB9LGcucHJvdG90eXBlLmVudGl0aWVzPWZ1bmN0aW9uKHQpe3JldHVybiB2b2lkIDA9PT10JiYodD10aGlzLmRhdGFzZXRzKCkpLHRoaXMuX3Byb2plY3RvcnNSZWFkeSgpP3AucHJvdG90eXBlLmVudGl0aWVzLmNhbGwodGhpcyx0KTpbXX0sZy5wcm90b3R5cGUuX2VudGl0eUJvdW5kcz1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fcGl4ZWxCb3VuZHModC5kYXR1bSx0LmluZGV4LHQuZGF0YXNldCl9LGcucHJvdG90eXBlLl9waXhlbEJvdW5kcz1mdW5jdGlvbih0LGUsbil7dmFyIGk9dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7cmV0dXJue3g6aS54KHQsZSxuKSx5OmkueSh0LGUsbiksd2lkdGg6aS53aWR0aCh0LGUsbiksaGVpZ2h0OmkuaGVpZ2h0KHQsZSxuKX19LGcucHJvdG90eXBlLl9waXhlbFBvaW50PWZ1bmN0aW9uKHQsZSxuKXt2YXIgaT10aGlzLl9waXhlbEJvdW5kcyh0LGUsbikscj1tLlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuX2lzVmVydGljYWw/dGhpcy55KCk6dGhpcy54KCkpKHQsZSxuKSxvPSh0aGlzLl9pc1ZlcnRpY2FsP3RoaXMueSgpLnNjYWxlOnRoaXMueCgpLnNjYWxlKS5zY2FsZSh0aGlzLmJhc2VsaW5lVmFsdWUoKSk7cmV0dXJuIHRoaXMuX3BpeGVsUG9pbnRCYXIocixvLGkpfSxnLnByb3RvdHlwZS5fcGl4ZWxQb2ludEJhcj1mdW5jdGlvbih0LGUsbil7dmFyIGkscjtyZXR1cm4gdGhpcy5faXNWZXJ0aWNhbD8oaT1uLngrbi53aWR0aC8yLHI9dDw9ZT9uLnk6bi55K24uaGVpZ2h0KTooaT10Pj1lP24ueCtuLndpZHRoOm4ueCxyPW4ueStuLmhlaWdodC8yKSx7eDppLHk6cn19LGcucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleT1mdW5jdGlvbih0LGUpe3AucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleS5jYWxsKHRoaXMsdCxlKX0sZy5wcm90b3R5cGUuX2dldERhdGFUb0RyYXc9ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9bmV3IGQuTWFwLG49dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksaT10aGlzLndpZHRoKCkscj10aGlzLmhlaWdodCgpO3JldHVybiB0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaCgoZnVuY3Rpb24obyl7dmFyIGE9by5kYXRhKCkubWFwKChmdW5jdGlvbihlLGEpe3JldHVybiB0Ll9pc0RhdHVtT25TY3JlZW4obixpLHIsZSxhLG8pP2U6bnVsbH0pKTtlLnNldChvLGEpfSkpLGV9LGcucHJvdG90eXBlLl9pc0RhdHVtT25TY3JlZW49ZnVuY3Rpb24odCxlLG4saSxyLG8pe3ZhciBhPXQueChpLHIsbykscz10LnkoaSxyLG8pLGw9dC53aWR0aChpLHIsbyksYz10LmhlaWdodChpLHIsbyk7cmV0dXJuISEoZC5NYXRoLmlzVmFsaWROdW1iZXIoYSkmJmQuTWF0aC5pc1ZhbGlkTnVtYmVyKHMpJiZkLk1hdGguaXNWYWxpZE51bWJlcihsKSYmZC5NYXRoLmlzVmFsaWROdW1iZXIoYykpJiZkLk1hdGguYm91bmRzSW50ZXJzZWN0cyhhLHMsbCxjLDAsMCxlLG4pfSxnLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXt2YXIgdD10aGlzO3AucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZS5jYWxsKHRoaXMpLHRoaXMuZGF0YXNldHMoKS5mb3JFYWNoKChmdW5jdGlvbihlKXtyZXR1cm4gdC5fbGFiZWxDb25maWcuZ2V0KGUpLm1lYXN1cmVyLnJlc2V0KCl9KSl9LGcuX0JBUl9USElDS05FU1NfUkFUSU89Ljk1LGcuX0JBUl9HQVBMRVNTX1RIUkVTSE9MRF9QWD0zLGcuX1NJTkdMRV9CQVJfRElNRU5TSU9OX1JBVElPPS40LGcuX0JBUl9BUkVBX0NMQVNTPSJiYXItYXJlYSIsZy5fQkFSX0VORF9LRVk9ImJhckVuZCIsZy5fQkFSX1RISUNLTkVTU19LRVk9IndpZHRoIixnLl9MQUJFTF9BUkVBX0NMQVNTPSJiYXItbGFiZWwtdGV4dC1hcmVhIixnLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUj0xMCxnfSkoZy5YWVBsb3QpO2Z1bmN0aW9uIHkodCxlLGkpe3ZhciByLG89dC5zY2FsZTtpZihvIGluc3RhbmNlb2YgdS5DYXRlZ29yeSlyPW8ucmFuZ2VCYW5kKCk7ZWxzZXt2YXIgYT10LmFjY2Vzc29yLHM9bi5zZXQoZC5BcnJheS5mbGF0dGVuKGUubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5kYXRhKCkubWFwKChmdW5jdGlvbihlLG4pe3JldHVybiBhKGUsbix0KX0pKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiBudWxsIT10fSkpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQudmFsdWVPZigpfSkpfSkpKSkudmFsdWVzKCkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4rdH0pKTtzLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQtZX0pKTt2YXIgbD1zLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIG8uc2NhbGUodCl9KSksYz1uLnBhaXJzKGwpO3I9ZC5NYXRoLm1pbihjLChmdW5jdGlvbih0LGUpe3JldHVybiBNYXRoLmFicyh0WzFdLXRbMF0pfSksaSpfLl9TSU5HTEVfQkFSX0RJTUVOU0lPTl9SQVRJTykscio9Xy5fQkFSX1RISUNLTkVTU19SQVRJT31yZXR1cm4gcn10LkJhcj1ffSkoWUV0KTt2YXIgWEV0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShYRXQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciAkRXQ9Qk8sS0V0PVh2dCxaRXQ9RF90LEpFdD1ZRXQsUUV0PXNTdCx0VHQ9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoZSl7dm9pZCAwPT09ZSYmKGU9InZlcnRpY2FsIik7dmFyIG49dC5jYWxsKHRoaXMsZSl8fHRoaXM7cmV0dXJuIG4uX2NsdXN0ZXJPZmZzZXRzPW5ldyBaRXQuTWFwLG59cmV0dXJuICRFdC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49dC5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcyksaT10aGlzLl9tYWtlSW5uZXJTY2FsZSgpLHI9ZnVuY3Rpb24odCxlKXtyZXR1cm4gaS5yYW5nZUJhbmQoKX07bi53aWR0aD10aGlzLl9pc1ZlcnRpY2FsP3I6bi53aWR0aCxuLmhlaWdodD10aGlzLl9pc1ZlcnRpY2FsP24uaGVpZ2h0OnI7dmFyIG89bi54LGE9bi55O3JldHVybiBuLng9dGhpcy5faXNWZXJ0aWNhbD9mdW5jdGlvbih0LG4saSl7cmV0dXJuIG8odCxuLGkpK2UuX2NsdXN0ZXJPZmZzZXRzLmdldChpKX06ZnVuY3Rpb24odCxlLG4pe3JldHVybiBvKHQsZSxuKX0sbi55PXRoaXMuX2lzVmVydGljYWw/ZnVuY3Rpb24odCxlLG4pe3JldHVybiBhKHQsZSxuKX06ZnVuY3Rpb24odCxuLGkpe3JldHVybiBhKHQsbixpKStlLl9jbHVzdGVyT2Zmc2V0cy5nZXQoaSl9LG59LGUucHJvdG90eXBlLl91cGRhdGVDbHVzdGVyUG9zaXRpb249ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5fbWFrZUlubmVyU2NhbGUoKTt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaCgoZnVuY3Rpb24obixpKXtyZXR1cm4gdC5fY2x1c3Rlck9mZnNldHMuc2V0KG4sZS5zY2FsZShTdHJpbmcoaSkpLWUucmFuZ2VCYW5kKCkvMil9KSl9LGUucHJvdG90eXBlLl9tYWtlSW5uZXJTY2FsZT1mdW5jdGlvbigpe3ZhciB0PW5ldyBLRXQuQ2F0ZWdvcnk7dC5kb21haW4odGhpcy5kYXRhc2V0cygpLm1hcCgoZnVuY3Rpb24odCxlKXtyZXR1cm4gU3RyaW5nKGUpfSkpKTt2YXIgZT1RRXQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5hdHRyKEpFdC5CYXIuX0JBUl9USElDS05FU1NfS0VZKSk7cmV0dXJuIHQucmFuZ2UoWzAsZShudWxsLDAsbnVsbCldKSx0fSxlLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdz1mdW5jdGlvbigpe3JldHVybiB0aGlzLl91cGRhdGVDbHVzdGVyUG9zaXRpb24oKSx0LnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdy5jYWxsKHRoaXMpfSxlfSkoSkV0LkJhcik7WEV0LkNsdXN0ZXJlZEJhcj10VHQ7dmFyIGVUdD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkoZVR0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgblR0PUJPLGlUdD13cHQsclR0PUxndCxvVHQ9Zmd0LGFUdD1wdnQsc1R0PVh2dCxsVHQ9RF90LGNUdD1OTXQsdVR0PU9NdCxoVHQ9R1N0LGRUdD1UeXQscFR0PXNTdCxmVHQ9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIGUuX3N0YXJ0QW5nbGU9MCxlLl9lbmRBbmdsZT0yKk1hdGguUEksZS5fbGFiZWxGb3JtYXR0ZXI9YVR0LmlkZW50aXR5KCksZS5fbGFiZWxzRW5hYmxlZD0hMSxlLmlubmVyUmFkaXVzKDApLGUub3V0ZXJSYWRpdXMoKGZ1bmN0aW9uKCl7dmFyIHQ9ZS5fcGllQ2VudGVyKCk7cmV0dXJuIE1hdGgubWluKE1hdGgubWF4KGUud2lkdGgoKS10LngsdC54KSxNYXRoLm1heChlLmhlaWdodCgpLXQueSx0LnkpKX0pKSxlLmFkZENsYXNzKCJwaWUtcGxvdCIpLGUuYXR0cigiZmlsbCIsKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIFN0cmluZyhlKX0pLG5ldyBzVHQuQ29sb3IpLGUuX3N0cm9rZURyYXdlcnM9bmV3IGxUdC5NYXAsZX1yZXR1cm4gblR0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLl9zZXR1cD1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dC5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyksdGhpcy5fc3Ryb2tlRHJhd2Vycy5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gdC5hdHRhY2hUbyhlLl9yZW5kZXJBcmVhKX0pKX0sZS5wcm90b3R5cGUuY29tcHV0ZUxheW91dD1mdW5jdGlvbihlLG4saSl7dC5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsZSxuLGkpO3ZhciByPXRoaXMuX3BpZUNlbnRlcigpO3RoaXMuX3JlbmRlckFyZWEuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrci54KyIsIityLnkrIikiKTt2YXIgbz1NYXRoLm1pbihNYXRoLm1heCh0aGlzLndpZHRoKCktci54LHIueCksTWF0aC5tYXgodGhpcy5oZWlnaHQoKS1yLnksci55KSk7cmV0dXJuIG51bGwhPXRoaXMuaW5uZXJSYWRpdXMoKS5zY2FsZSYmdGhpcy5pbm5lclJhZGl1cygpLnNjYWxlLnJhbmdlKFswLG9dKSxudWxsIT10aGlzLm91dGVyUmFkaXVzKCkuc2NhbGUmJnRoaXMub3V0ZXJSYWRpdXMoKS5zY2FsZS5yYW5nZShbMCxvXSksdGhpc30sZS5wcm90b3R5cGUuYWRkRGF0YXNldD1mdW5jdGlvbihlKXtyZXR1cm4gdC5wcm90b3R5cGUuYWRkRGF0YXNldC5jYWxsKHRoaXMsZSksdGhpc30sZS5wcm90b3R5cGUuX2FkZERhdGFzZXQ9ZnVuY3Rpb24oZSl7aWYoMT09PXRoaXMuZGF0YXNldHMoKS5sZW5ndGgpcmV0dXJuIGxUdC5XaW5kb3cud2FybigiT25seSBvbmUgZGF0YXNldCBpcyBzdXBwb3J0ZWQgaW4gUGllIHBsb3RzIiksdGhpczt0aGlzLl91cGRhdGVQaWVBbmdsZXMoKSx0LnByb3RvdHlwZS5fYWRkRGF0YXNldC5jYWxsKHRoaXMsZSk7dmFyIG49bmV3IHVUdC5BcmNPdXRsaW5lU1ZHRHJhd2VyO3JldHVybiB0aGlzLl9pc1NldHVwJiZuLmF0dGFjaFRvKHRoaXMuX3JlbmRlckFyZWEpLHRoaXMuX3N0cm9rZURyYXdlcnMuc2V0KGUsbiksdGhpc30sZS5wcm90b3R5cGUucmVtb3ZlRGF0YXNldD1mdW5jdGlvbihlKXtyZXR1cm4gdC5wcm90b3R5cGUucmVtb3ZlRGF0YXNldC5jYWxsKHRoaXMsZSksdGhpc30sZS5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcz1mdW5jdGlvbihlKXt0LnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzLmNhbGwodGhpcyxlKSx0aGlzLl9zdHJva2VEcmF3ZXJzLmdldChlKS5yZW1vdmUoKX0sZS5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIHQucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0LmNhbGwodGhpcyxlKSx0aGlzLl9zdHJva2VEcmF3ZXJzLmRlbGV0ZShlKSx0aGlzLl9zdGFydEFuZ2xlcz1bXSx0aGlzLl9lbmRBbmdsZXM9W10sdGhpc30sZS5wcm90b3R5cGUuc2VsZWN0aW9ucz1mdW5jdGlvbihlKXt2YXIgbj10aGlzO3ZvaWQgMD09PWUmJihlPXRoaXMuZGF0YXNldHMoKSk7dmFyIGk9dC5wcm90b3R5cGUuc2VsZWN0aW9ucy5jYWxsKHRoaXMsZSkubm9kZXMoKTtyZXR1cm4gZS5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT1uLl9zdHJva2VEcmF3ZXJzLmdldCh0KTtudWxsIT1lJiZpLnB1c2guYXBwbHkoaSxlLmdldFZpc3VhbFByaW1pdGl2ZXMoKSl9KSksaVR0LnNlbGVjdEFsbChpKX0sZS5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZT1mdW5jdGlvbigpe3QucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGUuY2FsbCh0aGlzKSx0aGlzLl91cGRhdGVQaWVBbmdsZXMoKSx0aGlzLnJlbmRlcigpfSxlLnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyPWZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBoVHQuUHJveHlEcmF3ZXIoKGZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBjVHQuQXJjU1ZHRHJhd2VyfSksKGZ1bmN0aW9uKCl7cmV0dXJuIGRUdC53YXJuKCJjYW52YXMgcmVuZGVyZXIgaXMgbm90IHN1cHBvcnRlZCBvbiBQaWUgUGxvdCEiKSxudWxsfSkpfSxlLnByb3RvdHlwZS5lbnRpdGllcz1mdW5jdGlvbihlKXt2YXIgbj10aGlzO3JldHVybiB2b2lkIDA9PT1lJiYoZT10aGlzLmRhdGFzZXRzKCkpLHQucHJvdG90eXBlLmVudGl0aWVzLmNhbGwodGhpcyxlKS5tYXAoKGZ1bmN0aW9uKHQpe3QucG9zaXRpb24ueCs9bi53aWR0aCgpLzIsdC5wb3NpdGlvbi55Kz1uLmhlaWdodCgpLzI7dmFyIGU9aVR0LnNlbGVjdChuLl9zdHJva2VEcmF3ZXJzLmdldCh0LmRhdGFzZXQpLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXgodC5pbmRleCkpLGk9dDtyZXR1cm4gaS5zdHJva2VTZWxlY3Rpb249ZSxpfSkpfSxlLnByb3RvdHlwZS5zZWN0b3JWYWx1ZT1mdW5jdGlvbih0LG4pe3JldHVybiBudWxsPT10P3RoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KGUuX1NFQ1RPUl9WQUxVRV9LRVkpOih0aGlzLl9iaW5kUHJvcGVydHkoZS5fU0VDVE9SX1ZBTFVFX0tFWSx0LG4pLHRoaXMuX3VwZGF0ZVBpZUFuZ2xlcygpLHRoaXMucmVuZGVyKCksdGhpcyl9LGUucHJvdG90eXBlLmlubmVyUmFkaXVzPWZ1bmN0aW9uKHQsbil7cmV0dXJuIG51bGw9PXQ/dGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoZS5fSU5ORVJfUkFESVVTX0tFWSk6KHRoaXMuX2JpbmRQcm9wZXJ0eShlLl9JTk5FUl9SQURJVVNfS0VZLHQsbiksdGhpcy5yZW5kZXIoKSx0aGlzKX0sZS5wcm90b3R5cGUub3V0ZXJSYWRpdXM9ZnVuY3Rpb24odCxuKXtyZXR1cm4gbnVsbD09dD90aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChlLl9PVVRFUl9SQURJVVNfS0VZKToodGhpcy5fYmluZFByb3BlcnR5KGUuX09VVEVSX1JBRElVU19LRVksdCxuKSx0aGlzLnJlbmRlcigpLHRoaXMpfSxlLnByb3RvdHlwZS5zdGFydEFuZ2xlPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX3N0YXJ0QW5nbGU6KHRoaXMuX3N0YXJ0QW5nbGU9dCx0aGlzLl91cGRhdGVQaWVBbmdsZXMoKSx0aGlzLnJlbmRlcigpLHRoaXMpfSxlLnByb3RvdHlwZS5lbmRBbmdsZT1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9lbmRBbmdsZToodGhpcy5fZW5kQW5nbGU9dCx0aGlzLl91cGRhdGVQaWVBbmdsZXMoKSx0aGlzLnJlbmRlcigpLHRoaXMpfSxlLnByb3RvdHlwZS5sYWJlbHNFbmFibGVkPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2xhYmVsc0VuYWJsZWQ6KHRoaXMuX2xhYmVsc0VuYWJsZWQ9dCx0aGlzLnJlbmRlcigpLHRoaXMpfSxlLnByb3RvdHlwZS5sYWJlbEZvcm1hdHRlcj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9sYWJlbEZvcm1hdHRlcjoodGhpcy5fbGFiZWxGb3JtYXR0ZXI9dCx0aGlzLnJlbmRlcigpLHRoaXMpfSxlLnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMud2lkdGgoKS8yLG49dGhpcy5oZWlnaHQoKS8yLGk9dGhpcy5fc2xpY2VJbmRleEZvclBvaW50KHt4OnQueC1lLHk6dC55LW59KTtyZXR1cm4gbnVsbD09aT9bXTpbdGhpcy5lbnRpdGllcygpW2ldXX0sZS5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycz1mdW5jdGlvbigpe3ZhciBlPXRoaXMsbj10LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyksaT1wVHQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5pbm5lclJhZGl1cygpKSxyPXBUdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLm91dGVyUmFkaXVzKCkpO3JldHVybiBuLmQ9ZnVuY3Rpb24odCxuLG8pe3JldHVybiBpVHQuYXJjKCkuaW5uZXJSYWRpdXMoaSh0LG4sbykpLm91dGVyUmFkaXVzKHIodCxuLG8pKS5zdGFydEFuZ2xlKGUuX3N0YXJ0QW5nbGVzW25dKS5lbmRBbmdsZShlLl9lbmRBbmdsZXNbbl0pKHQsbil9LG59LGUucHJvdG90eXBlLl91cGRhdGVQaWVBbmdsZXM9ZnVuY3Rpb24oKXtpZihudWxsIT10aGlzLnNlY3RvclZhbHVlKCkmJjAhPT10aGlzLmRhdGFzZXRzKCkubGVuZ3RoKXt2YXIgdD1wVHQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zZWN0b3JWYWx1ZSgpKSxlPXRoaXMuZGF0YXNldHMoKVswXSxuPXRoaXMuX2dldERhdGFUb0RyYXcoKS5nZXQoZSksaT1pVHQucGllKCkuc29ydChudWxsKS5zdGFydEFuZ2xlKHRoaXMuX3N0YXJ0QW5nbGUpLmVuZEFuZ2xlKHRoaXMuX2VuZEFuZ2xlKS52YWx1ZSgoZnVuY3Rpb24obixpKXtyZXR1cm4gdChuLGksZSl9KSkobik7dGhpcy5fc3RhcnRBbmdsZXM9aS5tYXAoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnN0YXJ0QW5nbGV9KSksdGhpcy5fZW5kQW5nbGVzPWkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4gdC5lbmRBbmdsZX0pKX19LGUucHJvdG90eXBlLl9waWVDZW50ZXI9ZnVuY3Rpb24oKXt2YXIgdCxlLG4saSxyPXRoaXMuX3N0YXJ0QW5nbGU8dGhpcy5fZW5kQW5nbGU/dGhpcy5fc3RhcnRBbmdsZTp0aGlzLl9lbmRBbmdsZSxvPXRoaXMuX3N0YXJ0QW5nbGU8dGhpcy5fZW5kQW5nbGU/dGhpcy5fZW5kQW5nbGU6dGhpcy5fc3RhcnRBbmdsZSxhPU1hdGguc2luKHIpLHM9TWF0aC5jb3MociksbD1NYXRoLnNpbihvKSxjPU1hdGguY29zKG8pO3JldHVybiBhPj0wJiZsPj0wP3M+PTAmJmM+PTA/KHQ9cyxlPTAsaT0wLG49bCk6czwwJiZjPDA/KHQ9MCxlPS1jLGk9MCxuPWEpOnM+PTAmJmM8MD8odD1zLGU9LWMsaT0wLG49YSk6czwwJiZjPj0wJiYodD0xLGU9MSxpPTEsbj1NYXRoLm1heChhLGwpKTphPj0wJiZsPDA/cz49MCYmYz49MD8odD1NYXRoLm1heChzLGMpLGU9MSxpPTEsbj0xKTpzPDAmJmM8MD8odD0wLGU9MSxpPS1sLG49YSk6cz49MCYmYzwwPyh0PXMsZT0xLGk9LWwsbj0xKTpzPDAmJmM+PTAmJih0PWMsZT0xLGk9MSxuPWEpOmE8MCYmbD49MD9zPj0wJiZjPj0wPyh0PTEsZT0wLGk9LWEsbj1sKTpzPDAmJmM8MD8odD0xLGU9TWF0aC5tYXgoLXMsLWMpLGk9MSxuPTEpOnM+PTAmJmM8MD8odD0xLGU9LWMsaT0tYSxuPTEpOnM8MCYmYz49MCYmKHQ9MSxlPS1zLGk9MSxuPWwpOmE8MCYmbDwwJiYocz49MCYmYz49MD8odD1jLGU9MCxpPS1hLG49MCk6czwwJiZjPDA/KHQ9MCxlPS1zLGk9LWwsbj0wKTpzPj0wJiZjPDA/KHQ9MSxlPTEsaT1NYXRoLm1heChzLC1jKSxuPTEpOnM8MCYmYz49MCYmKHQ9YyxlPS1zLGk9MSxuPTApKSx7eDppK249PTA/MDppLyhpK24pKnRoaXMud2lkdGgoKSx5OnQrZT09MD8wOnQvKHQrZSkqdGhpcy5oZWlnaHQoKX19LGUucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3PWZ1bmN0aW9uKCl7dmFyIG49dC5wcm90b3R5cGUuX2dldERhdGFUb0RyYXcuY2FsbCh0aGlzKTtpZigwPT09dGhpcy5kYXRhc2V0cygpLmxlbmd0aClyZXR1cm4gbjt2YXIgaT1wVHQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zZWN0b3JWYWx1ZSgpKSxyPXRoaXMuZGF0YXNldHMoKVswXSxvPW4uZ2V0KHIpLmZpbHRlcigoZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5faXNWYWxpZERhdGEoaSh0LG4scikpfSkpO3JldHVybiBuLnNldChyLG8pLG59LGUuX2lzVmFsaWREYXRhPWZ1bmN0aW9uKHQpe3JldHVybiBsVHQuTWF0aC5pc1ZhbGlkTnVtYmVyKHQpJiZ0Pj0wfSxlLnByb3RvdHlwZS5fcGl4ZWxQb2ludD1mdW5jdGlvbih0LG4saSl7dmFyIHI9cFR0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2VjdG9yVmFsdWUoKSk7aWYoIWUuX2lzVmFsaWREYXRhKHIodCxuLGkpKSlyZXR1cm57eDpOYU4seTpOYU59O3ZhciBvPShwVHQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5pbm5lclJhZGl1cygpKSh0LG4saSkrcFR0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMub3V0ZXJSYWRpdXMoKSkodCxuLGkpKS8yLGE9aVR0LnBpZSgpLnNvcnQobnVsbCkudmFsdWUoKGZ1bmN0aW9uKHQsbil7dmFyIG89cih0LG4saSk7cmV0dXJuIGUuX2lzVmFsaWREYXRhKG8pP286MH0pKS5zdGFydEFuZ2xlKHRoaXMuX3N0YXJ0QW5nbGUpLmVuZEFuZ2xlKHRoaXMuX2VuZEFuZ2xlKShpLmRhdGEoKSkscz0oYVtuXS5zdGFydEFuZ2xlK2Fbbl0uZW5kQW5nbGUpLzI7cmV0dXJue3g6bypNYXRoLnNpbihzKSx5Oi1vKk1hdGguY29zKHMpfX0sZS5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMuX3JlbmRlckFyZWEuc2VsZWN0KCIubGFiZWwtYXJlYSIpLnJlbW92ZSgpLHRoaXMuX2xhYmVsc0VuYWJsZWQmJmxUdC5XaW5kb3cuc2V0VGltZW91dCgoZnVuY3Rpb24oKXtyZXR1cm4gZS5fZHJhd0xhYmVscygpfSksdCk7dmFyIG49dGhpcy5fZ2VuZXJhdGVTdHJva2VEcmF3U3RlcHMoKSxpPXRoaXMuX2dldERhdGFUb0RyYXcoKTt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIHI9cFR0LlBsb3QuYXBwbHlEcmF3U3RlcHMobix0KTtlLl9zdHJva2VEcmF3ZXJzLmdldCh0KS5kcmF3KGkuZ2V0KHQpLHIpfSkpfSxlLnByb3RvdHlwZS5fZ2VuZXJhdGVTdHJva2VEcmF3U3RlcHM9ZnVuY3Rpb24oKXtyZXR1cm5be2F0dHJUb1Byb2plY3Rvcjp0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhbmltYXRvcjpuZXcgb1R0Lk51bGx9XX0sZS5wcm90b3R5cGUuX3NsaWNlSW5kZXhGb3JQb2ludD1mdW5jdGlvbih0KXt2YXIgZSxuPU1hdGguc3FydChNYXRoLnBvdyh0LngsMikrTWF0aC5wb3codC55LDIpKSxpPU1hdGguYWNvcygtdC55L24pO3QueDwwJiYoaT0yKk1hdGguUEktaSk7Zm9yKHZhciByPTA7cjx0aGlzLl9zdGFydEFuZ2xlcy5sZW5ndGg7cisrKWlmKHRoaXMuX3N0YXJ0QW5nbGVzW3JdPGkmJnRoaXMuX2VuZEFuZ2xlc1tyXT5pKXtlPXI7YnJlYWt9aWYodm9pZCAwIT09ZSl7dmFyIG89dGhpcy5kYXRhc2V0cygpWzBdLGE9by5kYXRhKClbZV0scz10aGlzLmlubmVyUmFkaXVzKCkuYWNjZXNzb3IoYSxlLG8pLGw9dGhpcy5vdXRlclJhZGl1cygpLmFjY2Vzc29yKGEsZSxvKTtpZihuPnMmJm48bClyZXR1cm4gZX1yZXR1cm4gbnVsbH0sZS5wcm90b3R5cGUuX2RyYXdMYWJlbHM9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9dGhpcyxlPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLG49dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImciKS5jbGFzc2VkKCJsYWJlbC1hcmVhIiwhMCksaT1uZXcgclR0LlN2Z0NvbnRleHQobi5ub2RlKCkpLHI9bmV3IHJUdC5DYWNoZU1lYXN1cmVyKGkpLG89bmV3IHJUdC5Xcml0ZXIocixpKSxhPXRoaXMuZGF0YXNldHMoKVswXSxzPXRoaXMuX2dldERhdGFUb0RyYXcoKS5nZXQoYSksbD1zLmxlbmd0aCxjPWZ1bmN0aW9uKGkpe3ZhciBsPXNbaV0sYz11LnNlY3RvclZhbHVlKCkuYWNjZXNzb3IobCxpLGEpO2lmKCFsVHQuTWF0aC5pc1ZhbGlkTnVtYmVyKGMpKXJldHVybiJjb250aW51ZSI7Yz11Ll9sYWJlbEZvcm1hdHRlcihjLGwsaSxhKTt2YXIgaD1yLm1lYXN1cmUoYyksZD0odS5fZW5kQW5nbGVzW2ldK3UuX3N0YXJ0QW5nbGVzW2ldKS8yLHA9dS5vdXRlclJhZGl1cygpLmFjY2Vzc29yKGwsaSxhKTt1Lm91dGVyUmFkaXVzKCkuc2NhbGUmJihwPXUub3V0ZXJSYWRpdXMoKS5zY2FsZS5zY2FsZShwKSk7dmFyIGY9dS5pbm5lclJhZGl1cygpLmFjY2Vzc29yKGwsaSxhKTt1LmlubmVyUmFkaXVzKCkuc2NhbGUmJihmPXUuaW5uZXJSYWRpdXMoKS5zY2FsZS5zY2FsZShmKSk7dmFyIG09KHArZikvMixnPU1hdGguc2luKGQpKm0taC53aWR0aC8yLF89LU1hdGguY29zKGQpKm0taC5oZWlnaHQvMix5PVt7eDpnLHk6X30se3g6Zyx5Ol8raC5oZWlnaHR9LHt4OmcraC53aWR0aCx5Ol99LHt4OmcraC53aWR0aCx5Ol8raC5oZWlnaHR9XSx2PXkuZXZlcnkoKGZ1bmN0aW9uKGUpe3JldHVybiBNYXRoLmFicyhlLngpPD10LndpZHRoKCkvMiYmTWF0aC5hYnMoZS55KTw9dC5oZWlnaHQoKS8yfSkpO3YmJih2PXkubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gdC5fc2xpY2VJbmRleEZvclBvaW50KGUpfSkpLmV2ZXJ5KChmdW5jdGlvbih0KXtyZXR1cm4gdD09PWl9KSkpO3ZhciBiPWUuZmlsbChsLGksYSkseD0xLjYqbFR0LkNvbG9yLmNvbnRyYXN0KCJ3aGl0ZSIsYik8bFR0LkNvbG9yLmNvbnRyYXN0KCJibGFjayIsYiksdz1uLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK2crIiwiK18rIikiKTt3LmNsYXNzZWQoeD8iZGFyay1sYWJlbCI6ImxpZ2h0LWxhYmVsIiwhMCksdy5zdHlsZSgidmlzaWJpbGl0eSIsdj8iaW5oZXJpdCI6ImhpZGRlbiIpLG8ud3JpdGUoYyxoLndpZHRoLGguaGVpZ2h0LHt4QWxpZ246ImNlbnRlciIseUFsaWduOiJjZW50ZXIifSx3Lm5vZGUoKSl9LHU9dGhpcyxoPTA7aDxsO2grKyljKGgpfSxlLl9JTk5FUl9SQURJVVNfS0VZPSJpbm5lci1yYWRpdXMiLGUuX09VVEVSX1JBRElVU19LRVk9Im91dGVyLXJhZGl1cyIsZS5fU0VDVE9SX1ZBTFVFX0tFWT0ic2VjdG9yLXZhbHVlIixlfSkocFR0LlBsb3QpO2VUdC5QaWU9ZlR0O3ZhciBtVHQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KG1UdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGdUdD1CTyxfVHQ9d3B0LHlUdD1MZ3QsdlR0PWZndCxiVHQ9UE10LHhUdD1HU3Qsd1R0PVpNdCxTVHQ9WHZ0LE1UdD1EX3QsRVR0PXNTdCxUVHQ9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIGUuX2xhYmVsc0VuYWJsZWQ9ITEsZS5fbGFiZWw9bnVsbCxlLmFuaW1hdG9yKCJyZWN0YW5nbGVzIixuZXcgdlR0Lk51bGwpLGUuYWRkQ2xhc3MoInJlY3RhbmdsZS1wbG90IiksZS5hdHRyKCJmaWxsIiwobmV3IFNUdC5Db2xvcikucmFuZ2UoKVswXSksZX1yZXR1cm4gZ1R0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHhUdC5Qcm94eURyYXdlcigoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHdUdC5SZWN0YW5nbGVTVkdEcmF3ZXJ9KSwoZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBiVHQuUmVjdGFuZ2xlQ2FudmFzRHJhd2VyKHQpfSkpfSxlLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgbj10aGlzLGk9dC5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcykscj1FVHQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLG89aVtlLl9YMl9LRVldLGE9RVR0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSxzPWlbZS5fWTJfS0VZXSxsPXRoaXMueCgpLnNjYWxlLGM9dGhpcy55KCkuc2NhbGU7cmV0dXJuIG51bGwhPW8/KGkud2lkdGg9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBNYXRoLmFicyhvKHQsZSxuKS1yKHQsZSxuKSl9LGkueD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIE1hdGgubWluKG8odCxlLG4pLHIodCxlLG4pKX0pOihpLndpZHRoPWZ1bmN0aW9uKHQsZSxpKXtyZXR1cm4gbi5fcmVjdGFuZ2xlV2lkdGgobCl9LGkueD1mdW5jdGlvbih0LGUsbil7cmV0dXJuIHIodCxlLG4pLS41Kmkud2lkdGgodCxlLG4pfSksbnVsbCE9cz8oaS5oZWlnaHQ9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBNYXRoLmFicyhzKHQsZSxuKS1hKHQsZSxuKSl9LGkueT1mdW5jdGlvbih0LGUsbil7cmV0dXJuIE1hdGgubWF4KHModCxlLG4pLGEodCxlLG4pKS1pLmhlaWdodCh0LGUsbil9KTooaS5oZWlnaHQ9ZnVuY3Rpb24odCxlLGkpe3JldHVybiBuLl9yZWN0YW5nbGVXaWR0aChjKX0saS55PWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gYSh0LGUsbiktLjUqaS5oZWlnaHQodCxlLG4pfSksZGVsZXRlIGlbZS5fWDJfS0VZXSxkZWxldGUgaVtlLl9ZMl9LRVldLGl9LGUucHJvdG90eXBlLl9nZW5lcmF0ZURyYXdTdGVwcz1mdW5jdGlvbigpe3JldHVyblt7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLGFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKCJyZWN0YW5nbGVzIil9XX0sZS5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5PWZ1bmN0aW9uKGUpe3JldHVybiB0LnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHkuY2FsbCh0aGlzLCJ4MiI9PT1lPyJ4IjoieTIiPT09ZT8ieSI6ZSl9LGUucHJvdG90eXBlLng9ZnVuY3Rpb24obixpLHIpe2lmKG51bGw9PW4pcmV0dXJuIHQucHJvdG90eXBlLnguY2FsbCh0aGlzKTtpZihudWxsPT1pP3QucHJvdG90eXBlLnguY2FsbCh0aGlzLG4pOnQucHJvdG90eXBlLnguY2FsbCh0aGlzLG4saSxyKSxudWxsIT1pKXt2YXIgbz10aGlzLngyKCksYT1vJiZvLmFjY2Vzc29yO251bGwhPWEmJnRoaXMuX2JpbmRQcm9wZXJ0eShlLl9YMl9LRVksYSxpLG8ucG9zdFNjYWxlKX1yZXR1cm4gaSBpbnN0YW5jZW9mIFNUdC5DYXRlZ29yeSYmaS5pbm5lclBhZGRpbmcoMCkub3V0ZXJQYWRkaW5nKDApLHRoaXN9LGUucHJvdG90eXBlLngyPWZ1bmN0aW9uKHQsbil7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoZS5fWDJfS0VZKTt2YXIgaT10aGlzLngoKTtyZXR1cm4gdGhpcy5fYmluZFByb3BlcnR5KGUuX1gyX0tFWSx0LGkmJmkuc2NhbGUsbiksdGhpcy5yZW5kZXIoKSx0aGlzfSxlLnByb3RvdHlwZS55PWZ1bmN0aW9uKG4saSxyKXtpZihudWxsPT1uKXJldHVybiB0LnByb3RvdHlwZS55LmNhbGwodGhpcyk7aWYobnVsbD09aT90LnByb3RvdHlwZS55LmNhbGwodGhpcyxuKTp0LnByb3RvdHlwZS55LmNhbGwodGhpcyxuLGksciksbnVsbCE9aSl7dmFyIG89dGhpcy55MigpLGE9byYmby5hY2Nlc3NvcjtudWxsIT1hJiZ0aGlzLl9iaW5kUHJvcGVydHkoZS5fWTJfS0VZLGEsaSxvLnBvc3RTY2FsZSl9cmV0dXJuIGkgaW5zdGFuY2VvZiBTVHQuQ2F0ZWdvcnkmJmkuaW5uZXJQYWRkaW5nKDApLm91dGVyUGFkZGluZygwKSx0aGlzfSxlLnByb3RvdHlwZS55Mj1mdW5jdGlvbih0LG4pe2lmKG51bGw9PXQpcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KGUuX1kyX0tFWSk7dmFyIGk9dGhpcy55KCk7cmV0dXJuIHRoaXMuX2JpbmRQcm9wZXJ0eShlLl9ZMl9LRVksdCxpJiZpLnNjYWxlLG4pLHRoaXMucmVuZGVyKCksdGhpc30sZS5wcm90b3R5cGUuZW50aXRpZXNBdD1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTtyZXR1cm4gdGhpcy5lbnRpdGllcygpLmZpbHRlcigoZnVuY3Rpb24obil7dmFyIGk9bi5kYXR1bSxyPW4uaW5kZXgsbz1uLmRhdGFzZXQsYT1lLngoaSxyLG8pLHM9ZS55KGkscixvKSxsPWUud2lkdGgoaSxyLG8pLGM9ZS5oZWlnaHQoaSxyLG8pO3JldHVybiBhPD10LngmJnQueDw9YStsJiZzPD10LnkmJnQueTw9cytjfSkpfSxlLnByb3RvdHlwZS5fZW50aXR5Qm91bmRzPWZ1bmN0aW9uKHQpe3JldHVybiB0aGlzLl9lbnRpdHlCQm94KHQuZGF0dW0sdC5pbmRleCx0LmRhdGFzZXQsdGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCkpfSxlLnByb3RvdHlwZS5fZW50aXR5QkJveD1mdW5jdGlvbih0LGUsbixpKXtyZXR1cm57eDppLngodCxlLG4pLHk6aS55KHQsZSxuKSx3aWR0aDppLndpZHRoKHQsZSxuKSxoZWlnaHQ6aS5oZWlnaHQodCxlLG4pfX0sZS5wcm90b3R5cGUubGFiZWw9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fbGFiZWw6KHRoaXMuX2xhYmVsPXQsdGhpcy5yZW5kZXIoKSx0aGlzKX0sZS5wcm90b3R5cGUubGFiZWxzRW5hYmxlZD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9sYWJlbHNFbmFibGVkOih0aGlzLl9sYWJlbHNFbmFibGVkPXQsdGhpcy5yZW5kZXIoKSx0aGlzKX0sZS5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycz1mdW5jdGlvbigpe3ZhciBlPXQucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnMuY2FsbCh0aGlzKTtyZXR1cm4gbnVsbCE9dGhpcy54MigpJiYoZS54Mj1FVHQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54MigpKSksbnVsbCE9dGhpcy55MigpJiYoZS55Mj1FVHQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55MigpKSksZX0sZS5wcm90b3R5cGUuX3BpeGVsUG9pbnQ9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLHI9aS54KHQsZSxuKSxvPWkueSh0LGUsbik7cmV0dXJue3g6citpLndpZHRoKHQsZSxuKS8yLHk6bytpLmhlaWdodCh0LGUsbikvMn19LGUucHJvdG90eXBlLl9yZWN0YW5nbGVXaWR0aD1mdW5jdGlvbih0KXtpZih0IGluc3RhbmNlb2YgU1R0LkNhdGVnb3J5KXJldHVybiB0LnJhbmdlQmFuZCgpO3ZhciBlPXQ9PT10aGlzLngoKS5zY2FsZT90aGlzLngoKS5hY2Nlc3Nvcjp0aGlzLnkoKS5hY2Nlc3NvcixuPV9UdC5zZXQoTVR0LkFycmF5LmZsYXR0ZW4odGhpcy5kYXRhc2V0cygpLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQuZGF0YSgpLm1hcCgoZnVuY3Rpb24obixpKXtyZXR1cm4gZShuLGksdCkudmFsdWVPZigpfSkpfSkpKSkudmFsdWVzKCkubWFwKChmdW5jdGlvbih0KXtyZXR1cm4rdH0pKSxpPU1UdC5NYXRoLm1pbihuLDApLHI9TVR0Lk1hdGgubWF4KG4sMCksbz10LnNjYWxlKGkpO3JldHVybih0LnNjYWxlKHIpLW8pL01hdGguYWJzKHItaSl9LGUucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3PWZ1bmN0aW9uKCl7dmFyIHQ9bmV3IE1UdC5NYXAsZT10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTtyZXR1cm4gdGhpcy5kYXRhc2V0cygpLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciBpPW4uZGF0YSgpLm1hcCgoZnVuY3Rpb24odCxpKXtyZXR1cm4gTVR0Lk1hdGguaXNWYWxpZE51bWJlcihlLngodCxpLG4pKSYmTVR0Lk1hdGguaXNWYWxpZE51bWJlcihlLnkodCxpLG4pKSYmTVR0Lk1hdGguaXNWYWxpZE51bWJlcihlLndpZHRoKHQsaSxuKSkmJk1UdC5NYXRoLmlzVmFsaWROdW1iZXIoZS5oZWlnaHQodCxpLG4pKT90Om51bGx9KSk7dC5zZXQobixpKX0pKSx0fSxlLnByb3RvdHlwZS5fYWRkaXRpb25hbFBhaW50PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXM7dGhpcy5fcmVuZGVyQXJlYS5zZWxlY3RBbGwoIi5sYWJlbC1hcmVhIikucmVtb3ZlKCksdGhpcy5fbGFiZWxzRW5hYmxlZCYmbnVsbCE9dGhpcy5sYWJlbCgpJiZNVHQuV2luZG93LnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7cmV0dXJuIGUuX2RyYXdMYWJlbHMoKX0pLHQpfSxlLnByb3RvdHlwZS5fZHJhd0xhYmVscz1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLl9nZXREYXRhVG9EcmF3KCk7dGhpcy5kYXRhc2V0cygpLmZvckVhY2goKGZ1bmN0aW9uKG4saSl7cmV0dXJuIHQuX2RyYXdMYWJlbChlLG4saSl9KSl9LGUucHJvdG90eXBlLl9kcmF3TGFiZWw9ZnVuY3Rpb24odCxlLG4pe2Zvcih2YXIgaT10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxyPXRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZCgibGFiZWwtYXJlYSIsITApLG89bmV3IHlUdC5TdmdDb250ZXh0KHIubm9kZSgpKSxhPW5ldyB5VHQuQ2FjaGVNZWFzdXJlcihvKSxzPW5ldyB5VHQuV3JpdGVyKGEsbyksbD10aGlzLngoKS5zY2FsZS5yYW5nZSgpLGM9dGhpcy55KCkuc2NhbGUucmFuZ2UoKSx1PU1hdGgubWluLmFwcGx5KG51bGwsbCksaD1NYXRoLm1heC5hcHBseShudWxsLGwpLGQ9TWF0aC5taW4uYXBwbHkobnVsbCxjKSxwPU1hdGgubWF4LmFwcGx5KG51bGwsYyksZj10LmdldChlKSxtPWYubGVuZ3RoLGc9MDtnPG07ZysrKXt2YXIgXz1mW2ddO2lmKG51bGwhPV8pe3ZhciB5PSIiK3RoaXMubGFiZWwoKShfLGcsZSksdj1hLm1lYXN1cmUoeSksYj1pLngoXyxnLGUpLHg9aS55KF8sZyxlKSx3PWkud2lkdGgoXyxnLGUpLFM9aS5oZWlnaHQoXyxnLGUpO2lmKHYuaGVpZ2h0PD1TJiZ2LndpZHRoPD13KXt2YXIgTT17bWluOmIrPSh3LXYud2lkdGgpLzIsbWF4OmIrdi53aWR0aH0sRT17bWluOngrPShTLXYuaGVpZ2h0KS8yLG1heDp4K3YuaGVpZ2h0fTtpZihNLm1pbjx1fHxNLm1heD5ofHxFLm1pbjxkfHxFLm1heD5wKWNvbnRpbnVlO2lmKHRoaXMuX292ZXJsYXlMYWJlbChNLEUsZyxuLHQpKWNvbnRpbnVlO3ZhciBUPWkuZmlsbChfLGcsZSksQz0xLjYqTVR0LkNvbG9yLmNvbnRyYXN0KCJ3aGl0ZSIsVCk8TVR0LkNvbG9yLmNvbnRyYXN0KCJibGFjayIsVCksQT1yLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK2IrIiwiK3grIikiKTtBLmNsYXNzZWQoQz8iZGFyay1sYWJlbCI6ImxpZ2h0LWxhYmVsIiwhMCkscy53cml0ZSh5LHYud2lkdGgsdi5oZWlnaHQse3hBbGlnbjoiY2VudGVyIix5QWxpZ246ImNlbnRlciJ9LEEubm9kZSgpKX19fX0sZS5wcm90b3R5cGUuX292ZXJsYXlMYWJlbD1mdW5jdGlvbih0LGUsbixpLHIpe2Zvcih2YXIgbz10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxhPXRoaXMuZGF0YXNldHMoKSxzPWk7czxhLmxlbmd0aDtzKyspZm9yKHZhciBsPWFbc10sYz1yLmdldChsKSx1PWMubGVuZ3RoLGg9cz09PWk/bisxOjA7aDx1O2grKylpZihNVHQuRE9NLmludGVyc2VjdHNCQm94KHQsZSx0aGlzLl9lbnRpdHlCQm94KGNbaF0saCxsLG8pKSlyZXR1cm4hMDtyZXR1cm4hMX0sZS5fWDJfS0VZPSJ4MiIsZS5fWTJfS0VZPSJ5MiIsZX0pKG1FdC5YWVBsb3QpO21UdC5SZWN0YW5nbGU9VFR0O3ZhciBDVHQ9e307Ci8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovT2JqZWN0LmRlZmluZVByb3BlcnR5KENUdCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIEFUdD1CTyxrVHQ9TGd0LExUdD1wdnQsUFR0PUh3dCxOVHQ9R1N0LElUdD1lRXQsUlR0PWZndCxPVHQ9UE10LHpUdD1YdnQsRFR0PURfdCxCVHQ9ZEV0LEhUdD1zU3QsRlR0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9dC5jYWxsKHRoaXMpfHx0aGlzO2UuX2xhYmVsRm9ybWF0dGVyPUxUdC5pZGVudGl0eSgpLGUuX2xhYmVsc0VuYWJsZWQ9ITEsZS5hZGRDbGFzcygic2NhdHRlci1wbG90Iik7dmFyIG49bmV3IFJUdC5FYXNpbmc7bi5zdGFydERlbGF5KDUpLG4uc3RlcER1cmF0aW9uKDI1MCksbi5tYXhUb3RhbER1cmF0aW9uKEhUdC5QbG90Ll9BTklNQVRJT05fTUFYX0RVUkFUSU9OKSxlLmFuaW1hdG9yKEJUdC5BbmltYXRvci5NQUlOLG4pLGUuYXR0cigib3BhY2l0eSIsLjYpLGUuYXR0cigiZmlsbCIsKG5ldyB6VHQuQ29sb3IpLnJhbmdlKClbMF0pLGUuc2l6ZSg2KTt2YXIgaT1QVHQuY2lyY2xlKCk7cmV0dXJuIGUuc3ltYm9sKChmdW5jdGlvbigpe3JldHVybiBpfSkpLGUuX2xhYmVsQ29uZmlnPW5ldyBEVHQuTWFwLGV9cmV0dXJuIEFUdC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5fYnVpbGRMaWdodHdlaWdodFBsb3RFbnRpdGllcz1mdW5jdGlvbihlKXt2YXIgbj10aGlzO3JldHVybiB0LnByb3RvdHlwZS5fYnVpbGRMaWdodHdlaWdodFBsb3RFbnRpdGllcy5jYWxsKHRoaXMsZSkubWFwKChmdW5jdGlvbih0KXt2YXIgZT1IVHQuUGxvdC5fc2NhbGVkQWNjZXNzb3Iobi5zaXplKCkpKHQuZGF0dW0sdC5pbmRleCx0LmRhdGFzZXQpO3JldHVybiB0LmRpYW1ldGVyPWUsdH0pKX0sZS5wcm90b3R5cGUuX2NyZWF0ZURyYXdlcj1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3JldHVybiBuZXcgTlR0LlByb3h5RHJhd2VyKChmdW5jdGlvbigpe3JldHVybiBuZXcgSVR0LlN5bWJvbFNWR0RyYXdlcn0pLChmdW5jdGlvbihuKXtyZXR1cm4gbmV3IE9UdC5DYW52YXNEcmF3ZXIobixJVHQubWFrZVN5bWJvbENhbnZhc0RyYXdTdGVwKHQsKGZ1bmN0aW9uKCl7cmV0dXJuIEhUdC5QbG90Ll9zY2FsZWRBY2Nlc3NvcihlLnN5bWJvbCgpKX0pLChmdW5jdGlvbigpe3JldHVybiBIVHQuUGxvdC5fc2NhbGVkQWNjZXNzb3IoZS5zaXplKCkpfSkpKX0pKX0sZS5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbih0LG4pe3JldHVybiBudWxsPT10P3RoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KGUuX1NJWkVfS0VZKToodGhpcy5fYmluZFByb3BlcnR5KGUuX1NJWkVfS0VZLHQsbiksdGhpcy5yZW5kZXIoKSx0aGlzKX0sZS5wcm90b3R5cGUuc3ltYm9sPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KGUuX1NZTUJPTF9LRVkpOih0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLnNldChlLl9TWU1CT0xfS0VZLHthY2Nlc3Nvcjp0fSksdGhpcy5yZW5kZXIoKSx0aGlzKX0sZS5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7dmFyIHQ9W107aWYodGhpcy5fYW5pbWF0ZU9uTmV4dFJlbmRlcigpKXt2YXIgZT10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxuPUhUdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnN5bWJvbCgpKTtlLmQ9ZnVuY3Rpb24odCxlLGkpe3JldHVybiBuKHQsZSxpKSgwKShudWxsKX0sdC5wdXNoKHthdHRyVG9Qcm9qZWN0b3I6ZSxhbmltYXRvcjp0aGlzLl9nZXRBbmltYXRvcihCVHQuQW5pbWF0b3IuUkVTRVQpfSl9cmV0dXJuIHQucHVzaCh7YXR0clRvUHJvamVjdG9yOnRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLGFuaW1hdG9yOnRoaXMuX2dldEFuaW1hdG9yKEJUdC5BbmltYXRvci5NQUlOKX0pLHR9LGUucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnM9ZnVuY3Rpb24oKXt2YXIgZT10LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzLmNhbGwodGhpcyksbj1IVHQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLGk9SFR0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKTtyZXR1cm4gZS54PW4sZS55PWksZS50cmFuc2Zvcm09ZnVuY3Rpb24odCxlLHIpe3JldHVybiJ0cmFuc2xhdGUoIituKHQsZSxyKSsiLCIraSh0LGUscikrIikifSxlLmQ9dGhpcy5fY29uc3RydWN0U3ltYm9sR2VuZXJhdG9yKCksZX0sZS5wcm90b3R5cGUuX2NvbnN0cnVjdFN5bWJvbEdlbmVyYXRvcj1mdW5jdGlvbigpe3ZhciB0PUhUdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnN5bWJvbCgpKSxlPUhUdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnNpemUoKSk7cmV0dXJuIGZ1bmN0aW9uKG4saSxyKXtyZXR1cm4gdChuLGkscikoZShuLGkscikpKG51bGwpfX0sZS5wcm90b3R5cGUuX2VudGl0eUJvdW5kcz1mdW5jdGlvbih0KXtyZXR1cm57eDp0LnBvc2l0aW9uLngtdC5kaWFtZXRlci8yLHk6dC5wb3NpdGlvbi55LXQuZGlhbWV0ZXIvMix3aWR0aDp0LmRpYW1ldGVyLGhlaWdodDp0LmRpYW1ldGVyfX0sZS5wcm90b3R5cGUuX2VudGl0eVZpc2libGVPblBsb3Q9ZnVuY3Rpb24odCxlKXt2YXIgbj17bWluOmUudG9wTGVmdC54LG1heDplLmJvdHRvbVJpZ2h0Lnh9LGk9e21pbjplLnRvcExlZnQueSxtYXg6ZS5ib3R0b21SaWdodC55fSxyPXRoaXMuX2VudGl0eUJvdW5kcyh0KTtyZXR1cm4gRFR0LkRPTS5pbnRlcnNlY3RzQkJveChuLGkscil9LGUucHJvdG90eXBlLmVudGl0aWVzQXQ9ZnVuY3Rpb24odCl7dmFyIGU9SFR0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSxuPUhUdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSksaT1IVHQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zaXplKCkpO3JldHVybiB0aGlzLmVudGl0aWVzKCkuZmlsdGVyKChmdW5jdGlvbihyKXt2YXIgbz1yLmRhdHVtLGE9ci5pbmRleCxzPXIuZGF0YXNldCxsPWUobyxhLHMpLGM9bihvLGEscyksdT1pKG8sYSxzKTtyZXR1cm4gbC11LzI8PXQueCYmdC54PD1sK3UvMiYmYy11LzI8PXQueSYmdC55PD1jK3UvMn0pKX0sZS5wcm90b3R5cGUubGFiZWxzRW5hYmxlZD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9sYWJlbHNFbmFibGVkOih0aGlzLl9sYWJlbHNFbmFibGVkPXQsdGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpLHRoaXMucmVuZGVyKCksdGhpcyl9LGUucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQ9ZnVuY3Rpb24obil7dmFyIGk9dC5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldC5jYWxsKHRoaXMsbikscj10aGlzLl9yZW5kZXJBcmVhLmFwcGVuZCgiZyIpLmNsYXNzZWQoZS5fTEFCRUxfQVJFQV9DTEFTUywhMCksbz1uZXcga1R0LlN2Z0NvbnRleHQoci5ub2RlKCkpLGE9bmV3IGtUdC5DYWNoZU1lYXN1cmVyKG8pLHM9bmV3IGtUdC5Xcml0ZXIoYSxvKTtyZXR1cm4gdGhpcy5fbGFiZWxDb25maWcuc2V0KG4se2xhYmVsQXJlYTpyLG1lYXN1cmVyOmEsd3JpdGVyOnN9KSxpfSxlLnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldE5vZGVzPWZ1bmN0aW9uKGUpe3QucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXMuY2FsbCh0aGlzLGUpO3ZhciBuPXRoaXMuX2xhYmVsQ29uZmlnLmdldChlKTtudWxsIT1uJiYobi5sYWJlbEFyZWEucmVtb3ZlKCksdGhpcy5fbGFiZWxDb25maWcuZGVsZXRlKGUpKX0sZS5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludD1mdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMuZGF0YXNldHMoKS5mb3JFYWNoKChmdW5jdGlvbih0KXtyZXR1cm4gZS5fbGFiZWxDb25maWcuZ2V0KHQpLmxhYmVsQXJlYS5zZWxlY3RBbGwoImciKS5yZW1vdmUoKX0pKSx0aGlzLl9sYWJlbHNFbmFibGVkJiZEVHQuV2luZG93LnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7cmV0dXJuIGUuX2RyYXdMYWJlbHMoKX0pLHQpfSxlLnByb3RvdHlwZS5fZHJhd0xhYmVscz1mdW5jdGlvbigpe3ZhciB0PXRoaXMsZT10aGlzLl9nZXREYXRhVG9EcmF3KCksbj10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTt0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaCgoZnVuY3Rpb24oaSl7Zm9yKHZhciByPWUuZ2V0KGkpLG89ci5sZW5ndGgsYT0wO2E8bzthKyspe3ZhciBzPXJbYV07bnVsbCE9cyYmdC5fZHJhd0xhYmVsKHMsYSxpLG4pfX0pKX0sZS5wcm90b3R5cGUuX2RyYXdMYWJlbD1mdW5jdGlvbih0LGUsbixpKXtpZihudWxsIT10LmxhYmVsKXt2YXIgcj10aGlzLl9sYWJlbENvbmZpZy5nZXQobiksbz1yLmxhYmVsQXJlYSxhPXIubWVhc3VyZXIscz1yLndyaXRlcixsPXt4OmkueCh0LGUsbikseTppLnkodCxlLG4pfSxjPUhUdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnNpemUoKSkodCxlLG4pLHU9dGhpcy5fbGFiZWxGb3JtYXR0ZXIodC5sYWJlbCx0LGUsbiksaD1hLm1lYXN1cmUodSksZD10aGlzLl9jYWxjdWxhdGVMYWJlbFByb3BlcnRpZXMobCxjLGgpLHA9ZC5jb250YWluZXJEaW1lbnNpb25zLGY9ZC5hbGlnbm1lbnQsbT10aGlzLl9jcmVhdGVMYWJlbENvbnRhaW5lcihvLGQubGFiZWxDb250YWluZXJPcmlnaW4sZC5sYWJlbE9yaWdpbixoKTtzLndyaXRlKHUscC53aWR0aCxwLmhlaWdodCx7eEFsaWduOmYueCx5QWxpZ246Zi55fSxtLm5vZGUoKSl9fSxlLnByb3RvdHlwZS5fY2FsY3VsYXRlTGFiZWxQcm9wZXJ0aWVzPWZ1bmN0aW9uKHQsbixpKXtyZXR1cm57Y29udGFpbmVyRGltZW5zaW9uczp7d2lkdGg6aS53aWR0aCxoZWlnaHQ6aS5oZWlnaHR9LGxhYmVsQ29udGFpbmVyT3JpZ2luOnt4OnQueC1pLndpZHRoLzIseTp0LnktaS5oZWlnaHQvMisobjxpLmhlaWdodD9uLzIrZS5fTEFCRUxfTUFSR0lOX0ZST01fQlVCQkxFOjApfSxsYWJlbE9yaWdpbjp7eDp0LngseTp0Lnl9LGFsaWdubWVudDp7eDoiY2VudGVyIix5OiJjZW50ZXIifX19LGUucHJvdG90eXBlLl9jcmVhdGVMYWJlbENvbnRhaW5lcj1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj10LmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK2UueCsiLCAiK2UueSsiKSIpO3JldHVybiByLmNsYXNzZWQoIm9uLWJhci1sYWJlbCIsITApLHJ9LGUuX1NJWkVfS0VZPSJzaXplIixlLl9TWU1CT0xfS0VZPSJzeW1ib2wiLGUuX0xBQkVMX0FSRUFfQ0xBU1M9InNjYXR0ZXItbGFiZWwtdGV4dC1hcmVhIixlLl9MQUJFTF9NQVJHSU5fRlJPTV9CVUJCTEU9MTUsZX0pKG1FdC5YWVBsb3QpO0NUdC5TY2F0dGVyPUZUdDt2YXIgVlR0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShWVHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBVVHQ9Qk8salR0PWZndCxHVHQ9R1N0LFdUdD1KTXQscVR0PVh2dCxZVHQ9VHl0LFhUdD1zU3QsJFR0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKCl7dmFyIGU9dC5jYWxsKHRoaXMpfHx0aGlzO3JldHVybiBlLmFkZENsYXNzKCJzZWdtZW50LXBsb3QiKSxlLmF0dHIoInN0cm9rZSIsKG5ldyBxVHQuQ29sb3IpLnJhbmdlKClbMF0pLGUuYXR0cigic3Ryb2tlLXdpZHRoIiwiMnB4IiksZX1yZXR1cm4gVVR0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXI9ZnVuY3Rpb24oKXtyZXR1cm4gbmV3IEdUdC5Qcm94eURyYXdlcigoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IFdUdC5TZWdtZW50U1ZHRHJhd2VyfSksKGZ1bmN0aW9uKCl7cmV0dXJuIFlUdC53YXJuKCJjYW52YXMgcmVuZGVyZXIgaXMgbm90IHN1cHBvcnRlZCBvbiBTZWdtZW50IFBsb3QhIiksbnVsbH0pKX0sZS5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzPWZ1bmN0aW9uKCl7cmV0dXJuW3thdHRyVG9Qcm9qZWN0b3I6dGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksYW5pbWF0b3I6bmV3IGpUdC5OdWxsfV19LGUucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eT1mdW5jdGlvbihlKXtyZXR1cm4gdC5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcywieDIiPT09ZT8ieCI6InkyIj09PWU/InkiOmUpfSxlLnByb3RvdHlwZS54PWZ1bmN0aW9uKG4saSl7aWYobnVsbD09bilyZXR1cm4gdC5wcm90b3R5cGUueC5jYWxsKHRoaXMpO2lmKG51bGw9PWkpdC5wcm90b3R5cGUueC5jYWxsKHRoaXMsbik7ZWxzZXt0LnByb3RvdHlwZS54LmNhbGwodGhpcyxuLGkpO3ZhciByPXRoaXMueDIoKSxvPXImJnIuYWNjZXNzb3I7bnVsbCE9byYmdGhpcy5fYmluZFByb3BlcnR5KGUuX1gyX0tFWSxvLGkpfXJldHVybiB0aGlzfSxlLnByb3RvdHlwZS54Mj1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChlLl9YMl9LRVkpO3ZhciBuPXRoaXMueCgpO3JldHVybiB0aGlzLl9iaW5kUHJvcGVydHkoZS5fWDJfS0VZLHQsbiYmbi5zY2FsZSksdGhpcy5yZW5kZXIoKSx0aGlzfSxlLnByb3RvdHlwZS55PWZ1bmN0aW9uKG4saSl7aWYobnVsbD09bilyZXR1cm4gdC5wcm90b3R5cGUueS5jYWxsKHRoaXMpO2lmKG51bGw9PWkpdC5wcm90b3R5cGUueS5jYWxsKHRoaXMsbik7ZWxzZXt0LnByb3RvdHlwZS55LmNhbGwodGhpcyxuLGkpO3ZhciByPXRoaXMueTIoKSxvPXImJnIuYWNjZXNzb3I7bnVsbCE9byYmdGhpcy5fYmluZFByb3BlcnR5KGUuX1kyX0tFWSxvLGkpfXJldHVybiB0aGlzfSxlLnByb3RvdHlwZS55Mj1mdW5jdGlvbih0KXtpZihudWxsPT10KXJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChlLl9ZMl9LRVkpO3ZhciBuPXRoaXMueSgpO3JldHVybiB0aGlzLl9iaW5kUHJvcGVydHkoZS5fWTJfS0VZLHQsbiYmbi5zY2FsZSksdGhpcy5yZW5kZXIoKSx0aGlzfSxlLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7dmFyIGU9dC5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpO3JldHVybiBlLngxPVhUdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksZS54Mj1udWxsPT10aGlzLngyKCk/WFR0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKTpYVHQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54MigpKSxlLnkxPVhUdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSksZS55Mj1udWxsPT10aGlzLnkyKCk/WFR0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKTpYVHQuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55MigpKSxlfSxlLnByb3RvdHlwZS5lbnRpdGllc0F0PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuZW50aXR5TmVhcmVzdCh0KTtyZXR1cm4gbnVsbCE9ZT9bZV06W119LGUucHJvdG90eXBlLmVudGl0aWVzSW49ZnVuY3Rpb24odCxlKXt2YXIgbixpO2lmKG51bGw9PWUpe249e21pbjp0LnRvcExlZnQueCxtYXg6dC5ib3R0b21SaWdodC54fSxpPXttaW46dC50b3BMZWZ0LnksbWF4OnQuYm90dG9tUmlnaHQueX19ZWxzZSBuPXQsaT1lO3JldHVybiB0aGlzLl9lbnRpdGllc0ludGVyc2VjdGluZyhuLGkpfSxlLnByb3RvdHlwZS5fZW50aXRpZXNJbnRlcnNlY3Rpbmc9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49W10saT10aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSxyPXRoaXMuZW50aXRpZXMoKSxvPXIubGVuZ3RoLGE9MDthPG87YSsrKXt2YXIgcz1yW2FdO3RoaXMuX2xpbmVJbnRlcnNlY3RzQm94KHMsdCxlLGkpJiZuLnB1c2gocyl9cmV0dXJuIG59LGUucHJvdG90eXBlLl9saW5lSW50ZXJzZWN0c0JveD1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj10aGlzLG89aS54MSh0LmRhdHVtLHQuaW5kZXgsdC5kYXRhc2V0KSxhPWkueDIodC5kYXR1bSx0LmluZGV4LHQuZGF0YXNldCkscz1pLnkxKHQuZGF0dW0sdC5pbmRleCx0LmRhdGFzZXQpLGw9aS55Mih0LmRhdHVtLHQuaW5kZXgsdC5kYXRhc2V0KTtpZihlLm1pbjw9byYmbzw9ZS5tYXgmJm4ubWluPD1zJiZzPD1uLm1heHx8ZS5taW48PWEmJmE8PWUubWF4JiZuLm1pbjw9bCYmbDw9bi5tYXgpcmV0dXJuITA7dmFyIGM9e3g6byx5OnN9LHU9e3g6YSx5Omx9LGg9W3t4OmUubWluLHk6bi5taW59LHt4OmUubWluLHk6bi5tYXh9LHt4OmUubWF4LHk6bi5tYXh9LHt4OmUubWF4LHk6bi5taW59XTtyZXR1cm4gaC5maWx0ZXIoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIDAhPT1lJiYoci5fbGluZUludGVyc2VjdHNTZWdtZW50KGMsdSx0LGhbZS0xXSkmJnIuX2xpbmVJbnRlcnNlY3RzU2VnbWVudCh0LGhbZS0xXSxjLHUpKX0pKS5sZW5ndGg+MH0sZS5wcm90b3R5cGUuX2xpbmVJbnRlcnNlY3RzU2VnbWVudD1mdW5jdGlvbih0LGUsbixpKXt2YXIgcj1mdW5jdGlvbih0LGUsbil7cmV0dXJuKGUueC10LngpKihuLnktZS55KS0oZS55LXQueSkqKG4ueC1lLngpfTtyZXR1cm4gcih0LGUsbikqcih0LGUsaSk8MH0sZS5fWDJfS0VZPSJ4MiIsZS5fWTJfS0VZPSJ5MiIsZX0pKG1FdC5YWVBsb3QpO1ZUdC5TZWdtZW50PSRUdDt2YXIgS1R0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShLVHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBaVHQ9Qk8sSlR0PXdwdCxRVHQ9Zmd0LHRDdD1jU3QsZUN0PURfdCxuQ3Q9c1N0LGlDdD0oZnVuY3Rpb24odCl7ZnVuY3Rpb24gZSgpe3ZhciBlPXQuY2FsbCh0aGlzKXx8dGhpcztyZXR1cm4gZS5fc3RhY2tpbmdSZXN1bHQ9dEN0Lm1lbVRodW5rKChmdW5jdGlvbigpe3JldHVybiBlLmRhdGFzZXRzKCl9KSwoZnVuY3Rpb24oKXtyZXR1cm4gZS54KCkuYWNjZXNzb3J9KSwoZnVuY3Rpb24oKXtyZXR1cm4gZS55KCkuYWNjZXNzb3J9KSwoZnVuY3Rpb24oKXtyZXR1cm4gZS5fc3RhY2tpbmdPcmRlcn0pLChmdW5jdGlvbih0LGUsbixpKXtyZXR1cm4gZUN0LlN0YWNraW5nLnN0YWNrKHQsZSxuLGkpfSkpLGUuX3N0YWNrZWRFeHRlbnQ9dEN0Lm1lbVRodW5rKGUuX3N0YWNraW5nUmVzdWx0LChmdW5jdGlvbigpe3JldHVybiBlLngoKS5hY2Nlc3Nvcn0pLChmdW5jdGlvbigpe3JldHVybiBlLl9maWx0ZXJGb3JQcm9wZXJ0eSgieSIpfSksKGZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gZUN0LlN0YWNraW5nLnN0YWNrZWRFeHRlbnQodCxlLG4pfSkpLGUuX2Jhc2VsaW5lVmFsdWU9MCxlLl9zdGFja2luZ09yZGVyPSJib3R0b211cCIsZS5hZGRDbGFzcygic3RhY2tlZC1hcmVhLXBsb3QiKSxlLl9iYXNlbGluZVZhbHVlUHJvdmlkZXI9ZnVuY3Rpb24oKXtyZXR1cm5bZS5fYmFzZWxpbmVWYWx1ZV19LGUuY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWQoITEpLGV9cmV0dXJuIFpUdC5fX2V4dGVuZHMoZSx0KSxlLnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZD1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT90LnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZC5jYWxsKHRoaXMpOmU/KGVDdC5XaW5kb3cud2FybigiV2FybmluZzogU3RhY2tlZCBBcmVhIFBsb3QgZG9lcyBub3Qgc3VwcG9ydCBjcm9wcGVkIHJlbmRlcmluZy4iKSx0aGlzKTp0LnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZC5jYWxsKHRoaXMsZSl9LGUucHJvdG90eXBlLl9nZXRBbmltYXRvcj1mdW5jdGlvbih0KXtyZXR1cm4gbmV3IFFUdC5OdWxsfSxlLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKSx0aGlzLl9iYXNlbGluZT10aGlzLl9yZW5kZXJBcmVhLmFwcGVuZCgibGluZSIpLmNsYXNzZWQoImJhc2VsaW5lIiwhMCl9LGUucHJvdG90eXBlLng9ZnVuY3Rpb24oZSxuKXtyZXR1cm4gbnVsbD09ZT90LnByb3RvdHlwZS54LmNhbGwodGhpcyk6KG51bGw9PW4/dC5wcm90b3R5cGUueC5jYWxsKHRoaXMsZSk6dC5wcm90b3R5cGUueC5jYWxsKHRoaXMsZSxuKSx0aGlzLl9jaGVja1NhbWVEb21haW4oKSx0aGlzKX0sZS5wcm90b3R5cGUueT1mdW5jdGlvbihlLG4pe3JldHVybiBudWxsPT1lP3QucHJvdG90eXBlLnkuY2FsbCh0aGlzKToobnVsbD09bj90LnByb3RvdHlwZS55LmNhbGwodGhpcyxlKTp0LnByb3RvdHlwZS55LmNhbGwodGhpcyxlLG4pLHRoaXMuX2NoZWNrU2FtZURvbWFpbigpLHRoaXMpfSxlLnByb3RvdHlwZS55T2Zmc2V0PWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fc3RhY2tpbmdSZXN1bHQoKTtpZihudWxsIT1uKXt2YXIgaT1uLmdldCh0KTtpZihudWxsIT1pKXt2YXIgcj1pLmdldChTdHJpbmcoZSkpO2lmKG51bGwhPXIpcmV0dXJuIHIub2Zmc2V0fX19LGUucHJvdG90eXBlLnN0YWNraW5nT3JkZXI9ZnVuY3Rpb24odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fc3RhY2tpbmdPcmRlcjoodGhpcy5fc3RhY2tpbmdPcmRlcj10LHRoaXMuX29uRGF0YXNldFVwZGF0ZSgpLHRoaXMpfSxlLnByb3RvdHlwZS5kb3duc2FtcGxpbmdFbmFibGVkPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP3QucHJvdG90eXBlLmRvd25zYW1wbGluZ0VuYWJsZWQuY2FsbCh0aGlzKTooZUN0LldpbmRvdy53YXJuKCJXYXJuaW5nOiBTdGFja2VkIEFyZWEgUGxvdCBkb2VzIG5vdCBzdXBwb3J0IGRvd25zYW1wbGluZyIpLHRoaXMpfSxlLnByb3RvdHlwZS5fYWRkaXRpb25hbFBhaW50PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy55KCkuc2NhbGUuc2NhbGUodGhpcy5fYmFzZWxpbmVWYWx1ZSksZT17eDE6MCx5MTp0LHgyOnRoaXMud2lkdGgoKSx5Mjp0fTt0aGlzLl9nZXRBbmltYXRvcigiYmFzZWxpbmUiKS5hbmltYXRlKHRoaXMuX2Jhc2VsaW5lLGUpfSxlLnByb3RvdHlwZS5fdXBkYXRlWVNjYWxlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy55KCksZT10JiZ0LnNjYWxlO251bGwhPWUmJihlLmFkZFBhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXIodGhpcy5fYmFzZWxpbmVWYWx1ZVByb3ZpZGVyKSxlLmFkZEluY2x1ZGVkVmFsdWVzUHJvdmlkZXIodGhpcy5fYmFzZWxpbmVWYWx1ZVByb3ZpZGVyKSl9LGUucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fY2hlY2tTYW1lRG9tYWluKCksdC5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZS5jYWxsKHRoaXMpLHRoaXN9LGUucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbihlKXtyZXR1cm4ieSI9PT1lP1t0aGlzLl9zdGFja2VkRXh0ZW50KCldOnQucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsZSl9LGUucHJvdG90eXBlLl9jaGVja1NhbWVEb21haW49ZnVuY3Rpb24oKXtpZih0aGlzLl9wcm9qZWN0b3JzUmVhZHkoKSl7dmFyIHQ9dGhpcy5kYXRhc2V0cygpLG49dGhpcy54KCkuYWNjZXNzb3IsaT10Lm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIEpUdC5zZXQodC5kYXRhKCkubWFwKChmdW5jdGlvbihlLGkpe3JldHVybiBlQ3QuU3RhY2tpbmcubm9ybWFsaXplS2V5KG4oZSxpLHQpKX0pKSkudmFsdWVzKCl9KSkscj1lLl9kb21haW5LZXlzKHQsbik7aS5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gdC5sZW5ndGghPT1yLmxlbmd0aH0pKSYmZUN0LldpbmRvdy53YXJuKCJ0aGUgZG9tYWlucyBhY3Jvc3MgdGhlIGRhdGFzZXRzIGFyZSBub3QgdGhlIHNhbWUuIFBsb3QgbWF5IHByb2R1Y2UgdW5pbnRlbmRlZCBiZWhhdmlvci4iKX19LGUuX2RvbWFpbktleXM9ZnVuY3Rpb24odCxlKXt2YXIgbj1KVHQuc2V0KCk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7Zm9yKHZhciBpPXQuZGF0YSgpLHI9aS5sZW5ndGgsbz0wO288cjtvKyspe24uYWRkKGUoaVtvXSxvLHQpKX19KSksbi52YWx1ZXMoKX0sZS5wcm90b3R5cGUuX2Nvb3JkaW5hdGVQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcyxlPW5DdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksbj10aGlzLnkoKS5hY2Nlc3NvcixpPXRoaXMueCgpLmFjY2Vzc29yLHI9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBlQ3QuU3RhY2tpbmcubm9ybWFsaXplS2V5KGkodCxlLG4pKX0sbz10aGlzLl9zdGFja2luZ1Jlc3VsdCgpO3JldHVybltlLGZ1bmN0aW9uKGUsaSxhKXt2YXIgcz0rbihlLGksYSksbD1vLmdldChhKS5nZXQocihlLGksYSkpLm9mZnNldDtyZXR1cm4gdC55KCkuc2NhbGUuc2NhbGUocytsKX0sZnVuY3Rpb24oZSxuLGkpe3ZhciBhPW8uZ2V0KGkpLmdldChyKGUsbixpKSkub2Zmc2V0O3JldHVybiB0LnkoKS5zY2FsZS5zY2FsZShhKX1dfSxlLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzPWZ1bmN0aW9uKCl7dmFyIGU9dC5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpLG49dGhpcy5fY29vcmRpbmF0ZVByb2plY3RvcnMoKTtyZXR1cm4gZS5kPXRoaXMuX2NvbnN0cnVjdEFyZWFQcm9qZWN0b3IoblswXSxuWzFdLG5bMl0pLGV9LGUucHJvdG90eXBlLl9waXhlbFBvaW50PWZ1bmN0aW9uKGUsbixpKXt2YXIgcj10LnByb3RvdHlwZS5fcGl4ZWxQb2ludC5jYWxsKHRoaXMsZSxuLGkpLG89dGhpcy54KCkuYWNjZXNzb3IoZSxuLGkpLGE9dGhpcy55KCkuYWNjZXNzb3IoZSxuLGkpLHM9dGhpcy55KCkuc2NhbGUuc2NhbGUoK2ErdGhpcy5fc3RhY2tpbmdSZXN1bHQoKS5nZXQoaSkuZ2V0KGVDdC5TdGFja2luZy5ub3JtYWxpemVLZXkobykpLm9mZnNldCk7cmV0dXJue3g6ci54LHk6c319LGV9KShwRXQuQXJlYSk7S1R0LlN0YWNrZWRBcmVhPWlDdDt2YXIgckN0PXt9OwovKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqL09iamVjdC5kZWZpbmVQcm9wZXJ0eShyQ3QsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBvQ3Q9Qk8sYUN0PUxndCxzQ3Q9cHZ0LGxDdD1jU3QsY0N0PURfdCx1Q3Q9WUV0LGhDdD1zU3QsZEN0PShmdW5jdGlvbih0KXtmdW5jdGlvbiBlKGUpe3ZvaWQgMD09PWUmJihlPSJ2ZXJ0aWNhbCIpO3ZhciBuPXQuY2FsbCh0aGlzLGUpfHx0aGlzO3JldHVybiBuLl9leHRyZW1hRm9ybWF0dGVyPXNDdC5pZGVudGl0eSgpLG4uX3N0YWNraW5nUmVzdWx0PWxDdC5tZW1UaHVuaygoZnVuY3Rpb24oKXtyZXR1cm4gbi5kYXRhc2V0cygpfSksKGZ1bmN0aW9uKCl7cmV0dXJuIG4ucG9zaXRpb24oKS5hY2Nlc3Nvcn0pLChmdW5jdGlvbigpe3JldHVybiBuLmxlbmd0aCgpLmFjY2Vzc29yfSksKGZ1bmN0aW9uKCl7cmV0dXJuIG4uX3N0YWNraW5nT3JkZXJ9KSwoZnVuY3Rpb24odCxlLG4saSl7cmV0dXJuIGNDdC5TdGFja2luZy5zdGFjayh0LGUsbixpKX0pKSxuLl9zdGFja2VkRXh0ZW50PWxDdC5tZW1UaHVuayhuLl9zdGFja2luZ1Jlc3VsdCwoZnVuY3Rpb24oKXtyZXR1cm4gbi5wb3NpdGlvbigpLmFjY2Vzc29yfSksKGZ1bmN0aW9uKCl7cmV0dXJuIG4uX2ZpbHRlckZvclByb3BlcnR5KG4uX2lzVmVydGljYWw/InkiOiJ4Iil9KSwoZnVuY3Rpb24odCxlLG4pe3JldHVybiBjQ3QuU3RhY2tpbmcuc3RhY2tlZEV4dGVudCh0LGUsbil9KSksbi5hZGRDbGFzcygic3RhY2tlZC1iYXItcGxvdCIpLG4uX3N0YWNraW5nT3JkZXI9ImJvdHRvbXVwIixufXJldHVybiBvQ3QuX19leHRlbmRzKGUsdCksZS5wcm90b3R5cGUuc3RhY2tpbmdPcmRlcj1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9zdGFja2luZ09yZGVyOih0aGlzLl9zdGFja2luZ09yZGVyPXQsdGhpcy5fb25EYXRhc2V0VXBkYXRlKCksdGhpcyl9LGUucHJvdG90eXBlLmV4dHJlbWFGb3JtYXR0ZXI9ZnVuY3Rpb24odCl7cmV0dXJuIDA9PT1hcmd1bWVudHMubGVuZ3RoP3RoaXMuX2V4dHJlbWFGb3JtYXR0ZXI6KHRoaXMuX2V4dHJlbWFGb3JtYXR0ZXI9dCx0aGlzLnJlbmRlcigpLHRoaXMpfSxlLnByb3RvdHlwZS5fc2V0dXA9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKSx0aGlzLl9sYWJlbEFyZWE9dGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImciKS5jbGFzc2VkKHVDdC5CYXIuX0xBQkVMX0FSRUFfQ0xBU1MsITApO3ZhciBlPW5ldyBhQ3QuU3ZnQ29udGV4dCh0aGlzLl9sYWJlbEFyZWEubm9kZSgpKTt0aGlzLl9tZWFzdXJlcj1uZXcgYUN0LkNhY2hlTWVhc3VyZXIoZSksdGhpcy5fd3JpdGVyPW5ldyBhQ3QuV3JpdGVyKHRoaXMuX21lYXN1cmVyLGUpfSxlLnByb3RvdHlwZS5fZHJhd0xhYmVscz1mdW5jdGlvbigpe3ZhciBuPXRoaXM7dC5wcm90b3R5cGUuX2RyYXdMYWJlbHMuY2FsbCh0aGlzKSx0aGlzLl9sYWJlbEFyZWEuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCk7dmFyIGk9K3RoaXMuYmFzZWxpbmVWYWx1ZSgpLHI9dGhpcy5wb3NpdGlvbigpLnNjYWxlLG89dGhpcy5sZW5ndGgoKS5zY2FsZSxhPWNDdC5TdGFja2luZy5zdGFja2VkRXh0ZW50cyh0aGlzLl9zdGFja2luZ1Jlc3VsdCgpKSxzPWEubWluaW11bUV4dGVudHMsbD1bXSxjPWZ1bmN0aW9uKHQsZSl7dmFyIGE9bi5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3IoKSxzPW4ud2lkdGgoKSxjPW4uaGVpZ2h0KCk7dC5mb3JFYWNoKChmdW5jdGlvbih0KXtpZih0LmV4dGVudCE9PWkpe3ZhciB1PW4uZXh0cmVtYUZvcm1hdHRlcigpKHQuZXh0ZW50KSxoPW4uX21lYXN1cmVyLm1lYXN1cmUodSksZD10LnN0YWNrZWREYXR1bSxwPWQub3JpZ2luYWxEYXR1bSxmPWQub3JpZ2luYWxJbmRleCxtPWQub3JpZ2luYWxEYXRhc2V0O2lmKCFuLl9pc0RhdHVtT25TY3JlZW4oYSxzLGMscCxmLG0pKXJldHVybjt2YXIgZz1oQ3QuUGxvdC5fc2NhbGVkQWNjZXNzb3Iobi5hdHRyKHVDdC5CYXIuX0JBUl9USElDS05FU1NfS0VZKSkocCxmLG0pLF89by5zY2FsZSh0LmV4dGVudCkseT1uLl9nZXRQb3NpdGlvbkF0dHIoci5zY2FsZSh0LmF4aXNWYWx1ZSksZykrZy8yLHY9ZShuLl9pc1ZlcnRpY2FsP3t4OnkseTpffTp7eDpfLHk6eX0saCxnKSxiPShmdW5jdGlvbih0LGUsaSl7dmFyIHI9ZS50b3BMZWZ0LG89ci54LGE9ci55LHM9ZS5ib3R0b21SaWdodC54LWUudG9wTGVmdC54LGw9ZS5ib3R0b21SaWdodC55LWUudG9wTGVmdC55LGM9bi5faXNWZXJ0aWNhbD9zPmk6bD5pO2lmKCFjKXt2YXIgdT1uLl9sYWJlbEFyZWEuYXBwZW5kKCJnIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrbysiLCAiK2ErIikiKTt1LmNsYXNzZWQoInN0YWNrZWQtYmFyLWxhYmVsIiwhMCksbi5fd3JpdGVyLndyaXRlKHQscyxsLHt4QWxpZ246ImNlbnRlciIseUFsaWduOiJjZW50ZXIifSx1Lm5vZGUoKSl9cmV0dXJuIGN9KSh1LHt0b3BMZWZ0OnYsYm90dG9tUmlnaHQ6e3g6di54K2gud2lkdGgseTp2LnkraC5oZWlnaHR9fSxnKTtsLnB1c2goYil9fSkpfTtjKGEubWF4aW11bUV4dGVudHMsKGZ1bmN0aW9uKHQsaSxyKXt2YXIgbz1uLl9pc1ZlcnRpY2FsP2kud2lkdGg6aS5oZWlnaHQ7cmV0dXJue3g6bi5faXNWZXJ0aWNhbD90Lngtby8yOnQueCtlLl9FWFRSRU1BX0xBQkVMX01BUkdJTl9GUk9NX0JBUix5Om4uX2lzVmVydGljYWw/dC55LShuLl9pc1ZlcnRpY2FsP2kuaGVpZ2h0Omkud2lkdGgpOnQueS1vLzJ9fSkpLGMocywoZnVuY3Rpb24odCxpLHIpe3ZhciBvPW4uX2lzVmVydGljYWw/aS53aWR0aDppLmhlaWdodDtyZXR1cm57eDpuLl9pc1ZlcnRpY2FsP3QueC1vLzI6dC54LShuLl9pc1ZlcnRpY2FsP2kuaGVpZ2h0Omkud2lkdGgpLHk6bi5faXNWZXJ0aWNhbD90LnkrZS5fRVhUUkVNQV9MQUJFTF9NQVJHSU5fRlJPTV9CQVI6dC55LW8vMn19KSksbC5zb21lKChmdW5jdGlvbih0KXtyZXR1cm4gdH0pKSYmdGhpcy5fbGFiZWxBcmVhLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpfSxlLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3I9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLG49dC5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcyksaT10aGlzLl9pc1ZlcnRpY2FsPyJ5IjoieCIscj10aGlzLmxlbmd0aCgpLnNjYWxlLG89dGhpcy5sZW5ndGgoKS5hY2Nlc3NvcixhPXRoaXMucG9zaXRpb24oKS5hY2Nlc3NvcixzPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gY0N0LlN0YWNraW5nLm5vcm1hbGl6ZUtleShhKHQsZSxuKSl9LGw9dGhpcy5fc3RhY2tpbmdSZXN1bHQoKSxjPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4gci5zY2FsZShsLmdldChuKS5nZXQocyh0LGUsbikpLm9mZnNldCl9LHU9ZnVuY3Rpb24odCxlLG4pe3JldHVybiByLnNjYWxlKCtvKHQsZSxuKStsLmdldChuKS5nZXQocyh0LGUsbikpLm9mZnNldCl9LGg9ZnVuY3Rpb24odCxlLG4pe3JldHVybiBNYXRoLmFicyh1KHQsZSxuKS1jKHQsZSxuKSl9O25bdGhpcy5faXNWZXJ0aWNhbD8iaGVpZ2h0Ijoid2lkdGgiXT1oO3ZhciBkPWZ1bmN0aW9uKHQsZSxuKXtyZXR1cm4rbyh0LGUsbik8MD9jKHQsZSxuKTp1KHQsZSxuKX07cmV0dXJuIG5baV09ZnVuY3Rpb24odCxuLGkpe3JldHVybiBlLl9pc1ZlcnRpY2FsP2QodCxuLGkpOmQodCxuLGkpLWgodCxuLGkpfSxufSxlLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHk9ZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT0odGhpcy5faXNWZXJ0aWNhbD8ieSI6IngiKT9bdGhpcy5fc3RhY2tlZEV4dGVudCgpXTp0LnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHkuY2FsbCh0aGlzLGUpfSxlLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGU9ZnVuY3Rpb24oKXt0LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKSx0aGlzLl9tZWFzdXJlci5yZXNldCgpfSxlLl9FWFRSRU1BX0xBQkVMX01BUkdJTl9GUk9NX0JBUj01LGV9KSh1Q3QuQmFyKTtyQ3QuU3RhY2tlZEJhcj1kQ3Q7dmFyIHBDdD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9PYmplY3QuZGVmaW5lUHJvcGVydHkocEN0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgZkN0PUJPLG1DdD1EX3QsZ0N0PXNTdCxfQ3Q9KGZ1bmN0aW9uKHQpe2Z1bmN0aW9uIGUoKXt2YXIgZT10LmNhbGwodGhpcyl8fHRoaXM7cmV0dXJuIGUuX2Nvbm5lY3RvcnNFbmFibGVkPSExLGUuYWRkQ2xhc3MoIndhdGVyZmFsbC1wbG90IiksZX1yZXR1cm4gZkN0Ll9fZXh0ZW5kcyhlLHQpLGUucHJvdG90eXBlLmNvbm5lY3RvcnNFbmFibGVkPWZ1bmN0aW9uKHQpe3JldHVybiBudWxsPT10P3RoaXMuX2Nvbm5lY3RvcnNFbmFibGVkOih0aGlzLl9jb25uZWN0b3JzRW5hYmxlZD10LHRoaXMpfSxlLnByb3RvdHlwZS50b3RhbD1mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD90aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChlLl9UT1RBTF9LRVkpOih0aGlzLl9iaW5kUHJvcGVydHkoZS5fVE9UQUxfS0VZLHQsbnVsbCksdGhpcyl9LGUucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQ9ZnVuY3Rpb24odCl7dmFyIGU9dGhpczt0aGlzLl9jb25uZWN0b3JBcmVhLnNlbGVjdEFsbCgibGluZSIpLnJlbW92ZSgpLHRoaXMuX2Nvbm5lY3RvcnNFbmFibGVkJiZtQ3QuV2luZG93LnNldFRpbWVvdXQoKGZ1bmN0aW9uKCl7cmV0dXJuIGUuX2RyYXdDb25uZWN0b3JzKCl9KSx0KX0sZS5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldD1mdW5jdGlvbihuKXt2YXIgaT10LnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0LmNhbGwodGhpcyxuKTtyZXR1cm4gdGhpcy5fY29ubmVjdG9yQXJlYT10aGlzLl9yZW5kZXJBcmVhLmFwcGVuZCgiZyIpLmNsYXNzZWQoZS5fQ09OTkVDVE9SX0FSRUFfQ0xBU1MsITApLGl9LGUucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eT1mdW5jdGlvbihlKXtyZXR1cm4ieSI9PT1lP1t0aGlzLl9leHRlbnRdOnQucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsZSl9LGUucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvcj1mdW5jdGlvbigpe3ZhciBuPXRoaXMsaT10LnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3IuY2FsbCh0aGlzKSxyPXRoaXMueSgpLnNjYWxlLG89Z0N0LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMudG90YWwoKSk7cmV0dXJuIG51bGw9PXRoaXMuYXR0cigieSIpJiYoaS55PWZ1bmN0aW9uKHQsZSxpKXt2YXIgYT1uLnkoKS5hY2Nlc3Nvcih0LGUsaSk7aWYobyh0LGUsaSkpcmV0dXJuIE1hdGgubWluKHIuc2NhbGUoYSksci5zY2FsZSgwKSk7dmFyIHM9bi5fc3VidG90YWxzW2VdO2lmKDA9PT1lKXJldHVybiByLnNjYWxlKGE8MD9zLWE6cyk7dmFyIGw9bi5fc3VidG90YWxzW2UtMV07cmV0dXJuIHIuc2NhbGUocz5sP3M6bCl9KSxudWxsPT10aGlzLmF0dHIoImhlaWdodCIpJiYoaS5oZWlnaHQ9ZnVuY3Rpb24odCxlLGkpe3ZhciBhPW8odCxlLGkpLHM9bi55KCkuYWNjZXNzb3IodCxlLGkpO2lmKGEpcmV0dXJuIE1hdGguYWJzKHIuc2NhbGUocyktci5zY2FsZSgwKSk7dmFyIGw9bi5fc3VidG90YWxzW2VdO2lmKDA9PT1lKXJldHVybiBNYXRoLmFicyhyLnNjYWxlKGwpLXIuc2NhbGUobC1zKSk7dmFyIGM9bi5fc3VidG90YWxzW2UtMV07cmV0dXJuIE1hdGguYWJzKHIuc2NhbGUobCktci5zY2FsZShjKSl9KSxpLmNsYXNzPWZ1bmN0aW9uKHQsaSxyKXt2YXIgYT0iIjtyZXR1cm4gbnVsbCE9bi5hdHRyKCJjbGFzcyIpJiYoYT1uLmF0dHIoImNsYXNzIikuYWNjZXNzb3IodCxpLHIpKyIgIiksbyh0LGkscik/YStlLl9CQVJfVE9UQUxfQ0xBU1M6YSsobi55KCkuYWNjZXNzb3IodCxpLHIpPjA/ZS5fQkFSX0dST1dUSF9DTEFTUzplLl9CQVJfREVDTElORV9DTEFTUyl9LGl9LGUucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGU9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fdXBkYXRlU3VidG90YWxzKCksdC5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZS5jYWxsKHRoaXMpLHRoaXN9LGUucHJvdG90eXBlLl9jYWxjdWxhdGVTdWJ0b3RhbHNBbmRFeHRlbnQ9ZnVuY3Rpb24odCl7Zm9yKHZhciBlPU51bWJlci5NQVhfVkFMVUUsbj1OdW1iZXIuTUlOX1ZBTFVFLGk9MCxyPSExLG89dC5kYXRhKCksYT1vLmxlbmd0aCxzPTA7czxhO3MrKyl7dmFyIGw9b1tzXSxjPXRoaXMueSgpLmFjY2Vzc29yKGwscyx0KSx1PXRoaXMudG90YWwoKS5hY2Nlc3NvcihsLHMsdCk7aWYodSYmMCE9PXN8fChpKz1jKSx0aGlzLl9zdWJ0b3RhbHMucHVzaChpKSxpPGUmJihlPWkpLGk+biYmKG49aSksdSYmKGM8ZSYmKGU9YyksYz5uJiYobj1jKSksIXImJnUpe2Zvcih2YXIgaD1jLWksZD0wO2Q8dGhpcy5fc3VidG90YWxzLmxlbmd0aDtkKyspdGhpcy5fc3VidG90YWxzW2RdKz1oO3I9ITAsaSs9aCxlKz1oLG4rPWh9fXRoaXMuX2V4dGVudD1bZSxuXX0sZS5wcm90b3R5cGUuX2RyYXdDb25uZWN0b3JzPWZ1bmN0aW9uKCl7Zm9yKHZhciB0PXRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLG49dGhpcy5kYXRhc2V0cygpWzBdLGk9MTtpPG4uZGF0YSgpLmxlbmd0aDtpKyspe3ZhciByPWktMSxvPW4uZGF0YSgpW2ldLGE9bi5kYXRhKClbcl0scz10LngoYSxyLG4pLGw9dC54KG8saSxuKSt0LndpZHRoKG8saSxuKSxjPXQueShvLGksbik7KHRoaXMuX3N1YnRvdGFsc1tpXT4wJiZ0aGlzLl9zdWJ0b3RhbHNbaV0+dGhpcy5fc3VidG90YWxzW3JdfHx0aGlzLl9zdWJ0b3RhbHNbaV08MCYmdGhpcy5fc3VidG90YWxzW2ldPj10aGlzLl9zdWJ0b3RhbHNbcl0pJiYoYz10LnkobyxpLG4pK3QuaGVpZ2h0KG8saSxuKSksdGhpcy5fY29ubmVjdG9yQXJlYS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKGUuX0NPTk5FQ1RPUl9DTEFTUywhMCkuYXR0cigieDEiLHMpLmF0dHIoIngyIixsKS5hdHRyKCJ5MSIsYykuYXR0cigieTIiLGMpfX0sZS5wcm90b3R5cGUuX3VwZGF0ZVN1YnRvdGFscz1mdW5jdGlvbigpe3ZhciB0PXRoaXMuZGF0YXNldHMoKTtpZih0Lmxlbmd0aD4wKXt2YXIgZT10W3QubGVuZ3RoLTFdO3RoaXMuX3N1YnRvdGFscz1uZXcgQXJyYXksdGhpcy5fY2FsY3VsYXRlU3VidG90YWxzQW5kRXh0ZW50KGUpfX0sZS5fQkFSX0RFQ0xJTkVfQ0xBU1M9IndhdGVyZmFsbC1kZWNsaW5lIixlLl9CQVJfR1JPV1RIX0NMQVNTPSJ3YXRlcmZhbGwtZ3Jvd3RoIixlLl9CQVJfVE9UQUxfQ0xBU1M9IndhdGVyZmFsbC10b3RhbCIsZS5fQ09OTkVDVE9SX0NMQVNTPSJjb25uZWN0b3IiLGUuX0NPTk5FQ1RPUl9BUkVBX0NMQVNTPSJjb25uZWN0b3ItYXJlYSIsZS5fVE9UQUxfS0VZPSJ0b3RhbCIsZX0pKFlFdC5CYXIpO3BDdC5XYXRlcmZhbGw9X0N0LChmdW5jdGlvbih0KXsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KT2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciBlPUJPO2UuX19leHBvcnRTdGFyKHBFdCx0KSxlLl9fZXhwb3J0U3RhcihZRXQsdCksZS5fX2V4cG9ydFN0YXIobFN0LHQpLGUuX19leHBvcnRTdGFyKFhFdCx0KSxlLl9fZXhwb3J0U3RhcihmRXQsdCksZS5fX2V4cG9ydFN0YXIoZVR0LHQpLGUuX19leHBvcnRTdGFyKG1UdCx0KSxlLl9fZXhwb3J0U3RhcihDVHQsdCksZS5fX2V4cG9ydFN0YXIoVlR0LHQpLGUuX19leHBvcnRTdGFyKEtUdCx0KSxlLl9fZXhwb3J0U3RhcihyQ3QsdCksZS5fX2V4cG9ydFN0YXIocEN0LHQpfSkoZEV0KTt2YXIgeUN0LHZDdD17fTsKLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi9mdW5jdGlvbiBiQ3QodCl7cmV0dXJuIGNsYXNzIGV4dGVuZHMgdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5sb2FkS2V5PSIiLHRoaXMuZGF0YVRvTG9hZD1bXSx0aGlzLmdldERhdGFMb2FkTmFtZT10PT5TdHJpbmcodCksdGhpcy5kYXRhTG9hZGluZz0hMSx0aGlzLmRhdGFMb2FkZWRBdExlYXN0T25jZT0hMSx0aGlzLl9pc0Nvbm5lY3RlZD0hMSx0aGlzLl9kYXRhTG9hZFN0YXRlPW5ldyBNYXAsdGhpcy5fY2FuY2VsbGVyPW5ldyB4Tyx0aGlzLl9sb2FkRGF0YUFzeW5jPW51bGwsdGhpcy5fbG9hZERhdGE9Q2UuZXhwb3J0cy50aHJvdHRsZSh0aGlzLl9sb2FkRGF0YUltcGwsMTAwLHtsZWFkaW5nOiEwLHRyYWlsaW5nOiEwfSl9Y29ubmVjdGVkQ2FsbGJhY2soKXtzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpLHRoaXMuX2lzQ29ubmVjdGVkPSEwfWRpc2Nvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKSx0aGlzLl9pc0Nvbm5lY3RlZD0hMX1zdGF0aWMgZ2V0IHByb3BlcnRpZXMoKXtyZXR1cm57YWN0aXZlOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9sb2FkRGF0YUlmQWN0aXZlIn0sX2lzQ29ubmVjdGVkOnt0eXBlOkJvb2xlYW59LGxvYWRLZXk6e3R5cGU6U3RyaW5nfSxkYXRhVG9Mb2FkOnt0eXBlOkFycmF5fSxnZXREYXRhTG9hZE5hbWU6e3R5cGU6T2JqZWN0fSxsb2FkRGF0YUNhbGxiYWNrOnt0eXBlOk9iamVjdH0scmVxdWVzdERhdGE6e3R5cGU6T2JqZWN0fX19c3RhdGljIGdldCBvYnNlcnZlcnMoKXtyZXR1cm5bIl9kYXRhVG9Mb2FkQ2hhbmdlZChfaXNDb25uZWN0ZWQsIGRhdGFUb0xvYWQuKikiXX1vbkxvYWRGaW5pc2goKXt9cmVsb2FkKCl7dGhpcy5fZGF0YUxvYWRTdGF0ZS5jbGVhcigpLHRoaXMuX2xvYWREYXRhKCl9cmVzZXQoKXtudWxsIT10aGlzLl9sb2FkRGF0YUFzeW5jJiYoY2xlYXJUaW1lb3V0KHRoaXMuX2xvYWREYXRhQXN5bmMpLHRoaXMuX2xvYWREYXRhQXN5bmM9bnVsbCksdGhpcy5fY2FuY2VsbGVyJiZ0aGlzLl9jYW5jZWxsZXIuY2FuY2VsQWxsKCksdGhpcy5fZGF0YUxvYWRTdGF0ZSYmdGhpcy5fZGF0YUxvYWRTdGF0ZS5jbGVhcigpLHRoaXMuX2lzQ29ubmVjdGVkJiZ0aGlzLl9sb2FkRGF0YSgpfV9kYXRhVG9Mb2FkQ2hhbmdlZCgpe3RoaXMuX2lzQ29ubmVjdGVkJiZ0aGlzLl9sb2FkRGF0YSgpfWRldGFjaGVkKCl7bnVsbCE9dGhpcy5fbG9hZERhdGFBc3luYyYmKGNsZWFyVGltZW91dCh0aGlzLl9sb2FkRGF0YUFzeW5jKSx0aGlzLl9sb2FkRGF0YUFzeW5jPW51bGwpfV9sb2FkRGF0YUlmQWN0aXZlKCl7dGhpcy5hY3RpdmUmJnRoaXMuX2xvYWREYXRhKCl9X2xvYWREYXRhSW1wbCgpe3RoaXMuYWN0aXZlJiYobnVsbCE9PXRoaXMuX2xvYWREYXRhQXN5bmMmJmNsZWFyVGltZW91dCh0aGlzLl9sb2FkRGF0YUFzeW5jKSx0aGlzLl9sb2FkRGF0YUFzeW5jPXNldFRpbWVvdXQodGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKCh0PT57aWYodC5jYW5jZWxsZWQpcmV0dXJuO3RoaXMuZGF0YUxvYWRpbmc9ITA7Y29uc3QgZT10aGlzLmRhdGFUb0xvYWQuZmlsdGVyKCh0PT57Y29uc3QgZT10aGlzLmdldERhdGFMb2FkTmFtZSh0KTtyZXR1cm4hdGhpcy5fZGF0YUxvYWRTdGF0ZS5oYXMoZSl9KSk7Zm9yKGNvbnN0IHQgb2YgZSl7Y29uc3QgZT10aGlzLmdldERhdGFMb2FkTmFtZSh0KTt0aGlzLl9kYXRhTG9hZFN0YXRlLnNldChlLHlDdC5MT0FESU5HKX1jb25zdCBuPXRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZSgodD0+e2lmKHQuY2FuY2VsbGVkKXJldHVybjtjb25zdHtpdGVtOmUsZGF0YTpufT10LnZhbHVlLGk9dGhpcy5nZXREYXRhTG9hZE5hbWUoZSk7dGhpcy5fZGF0YUxvYWRTdGF0ZS5zZXQoaSx5Q3QuTE9BREVEKSx0aGlzLmxvYWREYXRhQ2FsbGJhY2sodGhpcyxlLG4pfSkpLGk9dGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKCh0PT57aWYoIXQuY2FuY2VsbGVkKXtjb25zdCB0PW5ldyBTZXQoZS5tYXAoKHQ9PnRoaXMuZ2V0RGF0YUxvYWROYW1lKHQpKSkpO3RoaXMuZGF0YVRvTG9hZC5zb21lKChlPT50Lmhhcyh0aGlzLmdldERhdGFMb2FkTmFtZShlKSkpKSYmdGhpcy5vbkxvYWRGaW5pc2goKSx0aGlzLl9sb2FkRGF0YUFzeW5jPW51bGwsdGhpcy5kYXRhTG9hZGVkQXRMZWFzdE9uY2U9ITB9QXJyYXkuZnJvbSh0aGlzLl9kYXRhTG9hZFN0YXRlLnZhbHVlcygpKS5pbmNsdWRlcyh5Q3QuTE9BRElORyl8fCh0aGlzLmRhdGFMb2FkaW5nPSExKX0pKTt0aGlzLnJlcXVlc3REYXRhKGUsbiwoKCk9Pmkodm9pZCAwKSkpfSkpKSl9fX1PYmplY3QuZGVmaW5lUHJvcGVydHkodkN0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx2Q3QudmVyc2lvbj0iMy45LjAiLChmdW5jdGlvbih0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIGU9Qk87dC5BbmltYXRvcnM9Zmd0LHQuQXhlcz1BZ3QsdC5Db21wb25lbnRzPXR4dCx0LkNvbmZpZ3M9Q3l0LHQuRm9ybWF0dGVycz1wdnQsdC5SZW5kZXJDb250cm9sbGVyPXpfdCx0LlJlbmRlclBvbGljaWVzPVF5dCx0LlN5bWJvbEZhY3Rvcmllcz1Id3QsdC5EaXNwYXRjaGVycz1yeHQsdC5EcmF3ZXJzPVBNdCx0LkludGVyYWN0aW9ucz1ueHQsdC5QbG90cz1kRXQsdC5TY2FsZXM9WHZ0LHQuVXRpbHM9RF90LGUuX19leHBvcnRTdGFyKGR2dCx0KSx0LlRpbWVJbnRlcnZhbD1ZdnQuVGltZUludGVydmFsLGUuX19leHBvcnRTdGFyKE9fdCx0KSxlLl9fZXhwb3J0U3Rhcih5d3QsdCksZS5fX2V4cG9ydFN0YXIoZlN0LHQpLHQudmVyc2lvbj12Q3QudmVyc2lvbixlLl9fZXhwb3J0U3RhcihheHQsdCksZS5fX2V4cG9ydFN0YXIoR1N0LHQpLGUuX19leHBvcnRTdGFyKHZ4dCx0KSxlLl9fZXhwb3J0U3RhcihMeHQsdCksZS5fX2V4cG9ydFN0YXIobUV0LHQpLGUuX19leHBvcnRTdGFyKHNTdCx0KSxlLl9fZXhwb3J0U3RhcihMYnQsdCksZS5fX2V4cG9ydFN0YXIobGJ0LHQpfSkoTk8pLChmdW5jdGlvbih0KXt0W3QuTE9BRElORz0wXT0iTE9BRElORyIsdFt0LkxPQURFRD0xXT0iTE9BREVEIn0pKHlDdHx8KHlDdD17fSkpO2NvbnN0IHhDdD1be2NoYXJhY3Rlcjoi4pe8IixtZXRob2Q6Tk8uU3ltYm9sRmFjdG9yaWVzLnNxdWFyZX0se2NoYXJhY3Rlcjoi4peGIixtZXRob2Q6Tk8uU3ltYm9sRmFjdG9yaWVzLmRpYW1vbmR9LHtjaGFyYWN0ZXI6IuKWsiIsbWV0aG9kOk5PLlN5bWJvbEZhY3Rvcmllcy50cmlhbmdsZX0se2NoYXJhY3Rlcjoi4piFIixtZXRob2Q6Tk8uU3ltYm9sRmFjdG9yaWVzLnN0YXJ9LHtjaGFyYWN0ZXI6IuKcmiIsbWV0aG9kOk5PLlN5bWJvbEZhY3Rvcmllcy5jcm9zc31dO3ZhciB3Q3Q7IShmdW5jdGlvbih0KXt0LlNURVA9InN0ZXAiLHQuUkVMQVRJVkU9InJlbGF0aXZlIix0LldBTExfVElNRT0id2FsbF90aW1lIn0pKHdDdHx8KHdDdD17fSkpO2Z1bmN0aW9uIFNDdCh0KXtyZXR1cm4gZT0+e2xldCBuLGk9TWF0aC5hYnMoZSk7cmV0dXJuIGk8MWUtMTUmJihpPTApLG49RHkoaT49MWU0fHxpPjAmJmk8LjAxPyIuIit0KyJ+ZSI6Ii4iK3QrIn5nIiksbihlKX19Y29uc3QgTUN0PUR5KCIuNH5zIik7ZnVuY3Rpb24gRUN0KCl7bGV0IHQ9bmV3IE5PLlNjYWxlcy5MaW5lYXI7dC50aWNrR2VuZXJhdG9yKE5PLlNjYWxlcy5UaWNrR2VuZXJhdG9ycy5pbnRlZ2VyVGlja0dlbmVyYXRvcigpKTtsZXQgZT1uZXcgTk8uQXhlcy5OdW1lcmljKHQsImJvdHRvbSIpO3JldHVybiBlLmZvcm1hdHRlcihNQ3QpLHtzY2FsZTp0LGF4aXM6ZSxhY2Nlc3Nvcjp0PT50LnN0ZXB9fWxldCBUQ3Q9Tk8uRm9ybWF0dGVycy50aW1lKCIlYSAlYiAlZSwgJUg6JU06JVMiKTtsZXQgQ0N0PSh0LGUsbik9PntpZihudWxsIT10LnJlbGF0aXZlKXJldHVybiB0LnJlbGF0aXZlO2xldCBpPW4uZGF0YSgpO3JldHVybigrdC53YWxsX3RpbWUtKGkubGVuZ3RoPjA/K2lbMF0ud2FsbF90aW1lOjApKS8zNmU1fSxBQ3Q9dD0+e2xldCBlPSIiLG49TWF0aC5mbG9vcih0LzI0KTt0LT0yNCpuLG4mJihlKz1uKyJkICIpO2xldCBpPU1hdGguZmxvb3IodCk7dC09aSx0Kj02MCwoaXx8bikmJihlKz1pKyJoICIpO2xldCByPU1hdGguZmxvb3IodCk7cmV0dXJuIHQtPXIsdCo9NjAsKHJ8fGl8fG4pJiYoZSs9cisibSAiKSxlK01hdGguZmxvb3IodCkrInMifTtmdW5jdGlvbiBrQ3QodCl7c3dpdGNoKHQpe2Nhc2Ugd0N0LlNURVA6cmV0dXJuIEVDdCgpO2Nhc2Ugd0N0LldBTExfVElNRTpyZXR1cm4oZnVuY3Rpb24gZSgpe2xldCB0PW5ldyBOTy5TY2FsZXMuVGltZTtyZXR1cm57c2NhbGU6dCxheGlzOm5ldyBOTy5BeGVzLlRpbWUodCwiYm90dG9tIiksYWNjZXNzb3I6dD0+dC53YWxsX3RpbWV9fSkoKTtjYXNlIHdDdC5SRUxBVElWRTpyZXR1cm4oZnVuY3Rpb24gbigpe2xldCB0PW5ldyBOTy5TY2FsZXMuTGluZWFyO3JldHVybntzY2FsZTp0LGF4aXM6bmV3IE5PLkF4ZXMuTnVtZXJpYyh0LCJib3R0b20iKSxhY2Nlc3NvcjpDQ3R9fSkoKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW52YWxpZCB4VHlwZTogIit0KX19Y29uc3QgTEN0PVsxLDAsMCwxLDAsMF07ZnVuY3Rpb24gUEN0KHQpe2NvbnN0IGU9KGZ1bmN0aW9uIG4odCl7Y29uc3QgZT1bXTtmb3IoO3QmJnQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudDspaWYoZS5wdXNoKHQpLHQuYXNzaWduZWRTbG90KXQ9dC5hc3NpZ25lZFNsb3Q7ZWxzZSBpZih0LnBhcmVudEVsZW1lbnQpdD10LnBhcmVudEVsZW1lbnQ7ZWxzZXtjb25zdCBlPXQucGFyZW50Tm9kZTt0PWUgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50P2UuaG9zdDplIT09dD9lOm51bGx9cmV0dXJuIGV9KSh0KTtsZXQgaT1MQ3Qscj1udWxsO2Zvcihjb25zdCB0IG9mIGUpe2NvbnN0IGU9Tk8uVXRpbHMuRE9NLmdldEVsZW1lbnRUcmFuc2Zvcm0odCk7aWYobnVsbCE9ZSl7Y29uc3Qgbj10LmNsaWVudFdpZHRoLzIscj10LmNsaWVudEhlaWdodC8yO2k9Tk8uVXRpbHMuTWF0aC5tdWx0aXBseVRyYW5zbGF0ZShpLFtuLHJdKSxpPU5PLlV0aWxzLk1hdGgubXVsdGlwbHlNYXRyaXgoaSxOTy5VdGlscy5NYXRoLmludmVydE1hdHJpeChlKSksaT1OTy5VdGlscy5NYXRoLm11bHRpcGx5VHJhbnNsYXRlKGksWy1uLC1yXSl9bGV0IG49dC5zY3JvbGxMZWZ0LG89dC5zY3JvbGxUb3A7bnVsbCE9PXImJnQhPT1yfHwobi09dC5vZmZzZXRMZWZ0K3QuY2xpZW50TGVmdCxvLT10Lm9mZnNldFRvcCt0LmNsaWVudFRvcCxyPXQub2Zmc2V0UGFyZW50KSxpPU5PLlV0aWxzLk1hdGgubXVsdGlwbHlUcmFuc2xhdGUoaSxbbixvXSl9cmV0dXJuIGl9Y2xhc3MgTkN0IGV4dGVuZHMgTk8uVXRpbHMuVHJhbnNsYXRvcntjb21wdXRlUG9zaXRpb24odCxlKXtjb25zdCBuPXt4OnQseTplfSxpPVBDdCh0aGlzLl9yb290RWxlbWVudCk7aWYobnVsbD09aSlyZXR1cm4gbjtyZXR1cm4gTk8uVXRpbHMuTWF0aC5hcHBseVRyYW5zZm9ybShpLG4pfX1jbGFzcyBJQ3QgZXh0ZW5kcyBOTy5EaXNwYXRjaGVycy5Nb3VzZXtjb25zdHJ1Y3Rvcih0KXtzdXBlcih0KSx0aGlzLl9ldmVudFRhcmdldD10LnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKSx0aGlzLl90cmFuc2xhdG9yPW5ldyBOQ3QodC5yb290KCkucm9vdEVsZW1lbnQoKS5ub2RlKCkpfXN0YXRpYyBnZXREaXNwYXRjaGVyKHQpe2NvbnN0IGU9dC5yb290KCkucm9vdEVsZW1lbnQoKTtsZXQgbj1lW0lDdC5fRElTUEFUQ0hFUl9LRVldO3JldHVybiBufHwobj1uZXcgSUN0KHQpLGVbSUN0Ll9ESVNQQVRDSEVSX0tFWV09biksbn19Y2xhc3MgUkN0IGV4dGVuZHMgTk8uRGlzcGF0Y2hlcnMuVG91Y2h7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5fZXZlbnRUYXJnZXQ9dC5yb290KCkucm9vdEVsZW1lbnQoKS5ub2RlKCksdGhpcy5fdHJhbnNsYXRvcj1uZXcgTkN0KHQucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpKX1zdGF0aWMgZ2V0RGlzcGF0Y2hlcih0KXtjb25zdCBlPXQucm9vdCgpLnJvb3RFbGVtZW50KCk7bGV0IG49ZVtSQ3QuX0RJU1BBVENIRVJfS0VZXTtyZXR1cm4gbnx8KG49bmV3IFJDdCh0KSxlW1JDdC5fRElTUEFUQ0hFUl9LRVldPW4pLG59fU5PLkludGVyYWN0aW9uLnByb3RvdHlwZS5faXNJbnNpZGVDb21wb25lbnQ9ZnVuY3Rpb24odCl7cmV0dXJuIDA8PXQueCYmMDw9dC55JiZ0Lng8dGhpcy5fY29tcG9uZW50QXR0YWNoZWRUby53aWR0aCgpJiZ0Lnk8dGhpcy5fY29tcG9uZW50QXR0YWNoZWRUby5oZWlnaHQoKX07Y2xhc3MgT0N0IGV4dGVuZHMgTk8uSW50ZXJhY3Rpb25zLlBvaW50ZXJ7X2FuY2hvcih0KXtjb25zdCBlPXRoaXM7ZS5faXNBbmNob3JlZD0hMCxlLl9tb3VzZURpc3BhdGNoZXI9SUN0LmdldERpc3BhdGNoZXIoZS5fY29tcG9uZW50QXR0YWNoZWRUbyksZS5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VNb3ZlKGUuX21vdXNlTW92ZUNhbGxiYWNrKSxlLl90b3VjaERpc3BhdGNoZXI9UkN0LmdldERpc3BhdGNoZXIoZS5fY29tcG9uZW50QXR0YWNoZWRUbyksZS5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hTdGFydChlLl90b3VjaFN0YXJ0Q2FsbGJhY2spfX12YXIgekN0OyEoZnVuY3Rpb24odCl7dC5BVVRPPSJhdXRvIix0LkJPVFRPTT0iYm90dG9tIix0LlJJR0hUPSJyaWdodCJ9KSh6Q3R8fCh6Q3Q9e30pKTtjb25zdCBEQ3Q9e2JveFNoYWRvdzoiMCAxcHggNHB4IHJnYmEoMCwgMCwgMCwgLjMpIixvcGFjaXR5OjAscG9zaXRpb246ImZpeGVkIix3aWxsQ2hhbmdlOiJ0cmFuc2Zvcm0iLHpJbmRleDo1fTtsZXQgQkN0PWNsYXNzIGV4dGVuZHMoY3Iod2UpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5wb3NpdGlvbj16Q3QuQVVUTyx0aGlzLm1pbkRpc3RGcm9tRWRnZT0xNSx0aGlzLl9zdHlsZUNhY2hlPW51bGwsdGhpcy5fcmFmPW51bGwsdGhpcy5fdHVubmVsPW51bGx9cmVhZHkoKXt0aGlzLl9zdHlsZUNhY2hlPW51bGwsdGhpcy5fcmFmPW51bGwsdGhpcy5fdHVubmVsPW51bGx9YXR0YWNoZWQoKXt0aGlzLl90dW5uZWw9dGhpcy5fY3JlYXRlVHVubmVsKCksdGhpcy5faGlkZU9uQmx1cj0oKT0+e2RvY3VtZW50LmhpZGRlbiYmdGhpcy5oaWRlKCl9LHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0aGlzLl9oaWRlT25CbHVyKX1kZXRhY2hlZCgpe3RoaXMuaGlkZSgpLHRoaXMuX3JlbW92ZVR1bm5lbCh0aGlzLl90dW5uZWwpLHRoaXMuX3R1bm5lbD1udWxsLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCJ2aXNpYmlsaXR5Y2hhbmdlIix0aGlzLl9oaWRlT25CbHVyKX1jb250ZW50KCl7cmV0dXJuIHRoaXMuX3R1bm5lbC5zaGFkb3dSb290fWhpZGUoKXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmFmKSx0aGlzLl9zdHlsZUNhY2hlPW51bGwsdGhpcy5fdHVubmVsLnN0eWxlLm9wYWNpdHk9MH11cGRhdGVBbmRQb3NpdGlvbih0KXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmFmKSx0aGlzLl9yYWY9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKCk9Pnt0aGlzLmlzQXR0YWNoZWQmJnRoaXMuX3JlcG9zaXRpb25JbXBsKHQpfSkpfV9yZXBvc2l0aW9uSW1wbCh0KXtjb25zdCBlPXRoaXMuX3R1bm5lbCxuPXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksaT1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLHI9d2luZG93LmlubmVySGVpZ2h0LG89ZG9jdW1lbnQuYm9keS5jbGllbnRXaWR0aCxhPW4udG9wLHM9YStuLmhlaWdodCxsPWkuaGVpZ2h0KzIwO2xldCBjPW51bGwsdT1NYXRoLm1heCh0aGlzLm1pbkRpc3RGcm9tRWRnZSxuLmxlZnQpLGg9bnVsbCxkPWE7dGhpcy5wb3NpdGlvbj09ekN0LlJJR0hUP3U9bi5yaWdodDooZD1zKzIwLG88dStpLndpZHRoK3RoaXMubWluRGlzdEZyb21FZGdlJiYodT1udWxsLGg9dGhpcy5taW5EaXN0RnJvbUVkZ2UpKSx0aGlzLnBvc2l0aW9uPT16Q3QuQVVUTyYmbi50b3AtbD4wJiZyPG4udG9wK24uaGVpZ2h0K2wmJihkPW51bGwsYz1yLWErMjApO2NvbnN0IHA9e2NvbnRhaW46ImNvbnRlbnQiLG9wYWNpdHk6MSxsZWZ0OnU/YCR7dX1weGA6bnVsbCxyaWdodDpoP2Ake2h9cHhgOm51bGwsdG9wOmQ/YCR7ZH1weGA6bnVsbCxib3R0b206Yz9gJHtjfXB4YDpudWxsfTtDZS5leHBvcnRzLmlzRXF1YWwodGhpcy5fc3R5bGVDYWNoZSxwKXx8KE9iamVjdC5hc3NpZ24oZS5zdHlsZSxwKSx0aGlzLl9zdHlsZUNhY2hlPXApfV9jcmVhdGVUdW5uZWwoKXtpZighdGhpcy5jb250ZW50Q29tcG9uZW50TmFtZSl0aHJvdyBuZXcgUmFuZ2VFcnJvcigiUmVxdWlyZSBgY29udGVudENvbXBvbmVudE5hbWVgIHRvIGJlIGEgbmFtZSBvZiBhIFBvbHltZXIgY29tcG9uZW50Iik7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KHRoaXMuY29udGVudENvbXBvbmVudE5hbWUpO3JldHVybiBPYmplY3QuYXNzaWduKHQuc3R5bGUsREN0KSxkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHQpLHR9X3JlbW92ZVR1bm5lbCh0KXtkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHQpfX07dChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sQkN0LnByb3RvdHlwZSwiY29udGVudENvbXBvbmVudE5hbWUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sQkN0LnByb3RvdHlwZSwicG9zaXRpb24iLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sQkN0LnByb3RvdHlwZSwibWluRGlzdEZyb21FZGdlIix2b2lkIDApLEJDdD10KFtpKCJ2ei1jaGFydC10b29sdGlwIildLEJDdCk7Y29uc3QgSEN0PUR5KCIuMn5lIiksRkN0PUR5KCIuNH5yIiksVkN0PUR5KCIsfiIpO2Z1bmN0aW9uIFVDdCh0KXtpZigwPT09dClyZXR1cm4iMCI7Y29uc3QgZT1NYXRoLmFicyh0KTtyZXR1cm4gZT49MWU0fHxlPC4wMDE/SEN0KHQpOkZDdCh0KX1jb25zdCBqQ3Q9e2Zvcm1hdFRpY2s6VUN0LGZvcm1hdFNob3J0OlVDdCxmb3JtYXRSZWFkYWJsZSh0KXtjb25zdCBlPU1hdGguYWJzKHQpO3JldHVybiBlPj0xZTR8fGU8LjAwMT9IQ3QodCk6VkN0KHQpfSxmb3JtYXRMb25nOlZDdH07RHkoIjAuM35zIiksRHkoIiwuM35mIiksRHkoIi40fiIpO2NvbnN0IEdDdD16QSgpLnRpY2tGb3JtYXQoKTtsZXQgV0N0O2NvbnN0IHFDdD17Zm9ybWF0VGljazp0PT5HQ3QobmV3IERhdGUodCkpLGZvcm1hdFNob3J0OnQ9Pm5ldyBEYXRlKHQpLnRvTG9jYWxlU3RyaW5nKFdDdCx7eWVhcjoibnVtZXJpYyIsbW9udGg6InNob3J0IixkYXk6Im51bWVyaWMiLGhvdXI6Im51bWVyaWMiLG1pbnV0ZToibnVtZXJpYyIsc2Vjb25kOiJudW1lcmljIn0pLGZvcm1hdFJlYWRhYmxlOnQ9Pm5ldyBEYXRlKHQpLnRvTG9jYWxlU3RyaW5nKFdDdCx7eWVhcjoibnVtZXJpYyIsbW9udGg6InNob3J0IixkYXk6Im51bWVyaWMiLGhvdXI6Im51bWVyaWMiLG1pbnV0ZToibnVtZXJpYyIsc2Vjb25kOiJudW1lcmljIix0aW1lWm9uZU5hbWU6InNob3J0In0pLGZvcm1hdExvbmc6dD0+bmV3IERhdGUodCkudG9Mb2NhbGVTdHJpbmcoV0N0LHt5ZWFyOiJudW1lcmljIixtb250aDoibG9uZyIsZGF5OiJudW1lcmljIixob3VyOiJudW1lcmljIixtaW51dGU6Im51bWVyaWMiLHNlY29uZDoibnVtZXJpYyIsdGltZVpvbmVOYW1lOiJzaG9ydCIsZnJhY3Rpb25hbFNlY29uZERpZ2l0czozfSl9O3ZhciBZQ3Q7IShmdW5jdGlvbih0KXt0W3QuTElORUFSPTBdPSJMSU5FQVIiLHRbdC5MT0cxMD0xXT0iTE9HMTAiLHRbdC5USU1FPTJdPSJUSU1FIn0pKFlDdHx8KFlDdD17fSkpO2NsYXNzIFhDdHtjb25zdHJ1Y3Rvcigpe3RoaXMuZGVmYXVsdEZvcm1hdHRlcj1qQ3R9dHJhbnNmb3JtKHQsZSxuKXtjb25zdFtpLHJdPXQsbz1yLWksW2Esc109ZTtyZXR1cm4gMD09PW8/YToocy1hKS9vKihuLWkpK2F9Zm9yd2FyZCh0LGUsbil7cmV0dXJuIHRoaXMudHJhbnNmb3JtKHQsZSxuKX1yZXZlcnNlKHQsZSxuKXtyZXR1cm4gdGhpcy50cmFuc2Zvcm0oZSx0LG4pfW5pY2VEb21haW4odCl7bGV0W2Usbl09dDtpZihuPGUpdGhyb3cgbmV3IEVycm9yKCJVbmV4cGVjdGVkIGlucHV0OiBtaW4gaXMgbGFyZ2VyIHRoYW4gbWF4Iik7aWYobj09PWUpcmV0dXJuIDA9PT1lP1stMSwxXTplPDA/WzIqZSwwXTpbMCwyKmVdO2NvbnN0IGk9Y0UoKSxyPS4wNSoobi1lK051bWJlci5FUFNJTE9OKSxbbyxhXT1pLmRvbWFpbihbZS1yLG4rcl0pLm5pY2UoKS5kb21haW4oKTtyZXR1cm5bbyxhXX10aWNrcyh0LGUpe3JldHVybiBjRSgpLmRvbWFpbih0KS50aWNrcyhlKX1pc1NhZmVOdW1iZXIodCl7cmV0dXJuIE51bWJlci5pc0Zpbml0ZSh0KX19Y2xhc3MgJEN0e2NvbnN0cnVjdG9yKCl7dGhpcy5kZWZhdWx0Rm9ybWF0dGVyPWpDdH10cmFuc2Zvcm0odCl7cmV0dXJuIE1hdGgubG9nMTAodD4wP3Q6TnVtYmVyLk1JTl9WQUxVRSl9dW50cmFuc2Zvcm0odCl7cmV0dXJuIE1hdGguZXhwKHQvTWF0aC5MT0cxMEUpfWZvcndhcmQodCxlLG4pe2lmKG48PTApcmV0dXJuIGVbMF07Y29uc3RbaSxyXT10LFtvLGFdPWUscz10aGlzLnRyYW5zZm9ybShpKSxsPXRoaXMudHJhbnNmb3JtKHIpLXMsYz1hLW87cmV0dXJuIG49dGhpcy50cmFuc2Zvcm0obiksYy8obCtOdW1iZXIuRVBTSUxPTikqKG4tcykrb31yZXZlcnNlKHQsZSxuKXtjb25zdFtpLHJdPXQsW28sYV09ZSxzPXRoaXMudHJhbnNmb3JtKGkpLGw9dGhpcy50cmFuc2Zvcm0ocik7cmV0dXJuIHRoaXMudW50cmFuc2Zvcm0oKGwtcykvKGEtbytOdW1iZXIuRVBTSUxPTikqKG4tbykrcyl9bmljZURvbWFpbih0KXtjb25zdFtlLG5dPXQ7aWYoZT5uKXRocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCBpbnB1dDogbWluIGlzIGxhcmdlciB0aGFuIG1heCIpO2NvbnN0IGk9TWF0aC5tYXgoZSxOdW1iZXIuTUlOX1ZBTFVFKSxyPU1hdGgubWF4KG4sTnVtYmVyLk1JTl9WQUxVRSk7cmV0dXJuIG48PTA/W051bWJlci5NSU5fVkFMVUUsMV06W01hdGgubWF4KE51bWJlci5NSU5fVkFMVUUsLjUqaSksMipyXX10aWNrcyh0LGUpe2NvbnN0IG49dFswXTw9MD9OdW1iZXIuTUlOX1ZBTFVFOnRbMF0saT10WzFdPD0wP051bWJlci5NSU5fVkFMVUU6dFsxXSxyPXlFKCkuZG9tYWluKFtuLGldKS50aWNrcyhlKTtyZXR1cm4gci5sZW5ndGg/cjp0fWlzU2FmZU51bWJlcih0KXtyZXR1cm4gTnVtYmVyLmlzRmluaXRlKHQpJiZ0PjB9fWNsYXNzIEtDdHtjb25zdHJ1Y3Rvcigpe3RoaXMuc2NhbGU9ekEoKSx0aGlzLmRlZmF1bHRGb3JtYXR0ZXI9cUN0fWZvcndhcmQodCxlLG4pe3JldHVybiB0aGlzLnNjYWxlLmRvbWFpbih0KS5yYW5nZShlKShuKX1yZXZlcnNlKHQsZSxuKXtyZXR1cm4gdGhpcy5zY2FsZS5kb21haW4odCkucmFuZ2UoZSkuaW52ZXJ0KG4pLmdldFRpbWUoKX1uaWNlRG9tYWluKHQpe2NvbnN0W2Usbl09dGhpcy5zY2FsZS5kb21haW4odCkubmljZSgpLmRvbWFpbigpO3JldHVybltlLmdldFRpbWUoKSxuLmdldFRpbWUoKV19dGlja3ModCxlKXtyZXR1cm4gdGhpcy5zY2FsZS5kb21haW4odCkudGlja3MoZSkubWFwKCh0PT50LmdldFRpbWUoKSkpfWlzU2FmZU51bWJlcih0KXtyZXR1cm4gTnVtYmVyLmlzRmluaXRlKHQpfX1jbGFzcyBaQ3QgZXh0ZW5kcyBOTy5TY2FsZXMuTGluZWFye2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLl9pZ25vcmVPdXRsaWVyPSExLHRoaXMucGFkUHJvcG9ydGlvbiguMil9c2V0VmFsdWVQcm92aWRlckZvckRvbWFpbih0KXtyZXR1cm4gdGhpcy5fdmFsdWVQcm92aWRlckZvckRvbWFpbj10LHRoaXN9X25pY2VEb21haW4odCxlKXtjb25zdFtuLGldPXQ7cmV0dXJuKGZ1bmN0aW9uIHIodCl7c3dpdGNoKHQpe2Nhc2UgWUN0LkxJTkVBUjpyZXR1cm4gbmV3IFhDdDtjYXNlIFlDdC5MT0cxMDpyZXR1cm4gbmV3ICRDdDtjYXNlIFlDdC5USU1FOnJldHVybiBuZXcgS0N0O2RlZmF1bHQ6dGhyb3cgbmV3IFJhbmdlRXJyb3IoYFNjYWxlVHlwZSAke3R9IG5vdCBzdXBwb3J0ZWQuYCl9fSkoWUN0LkxJTkVBUikubmljZURvbWFpbihbbixpXSl9X2dldFVuYm91bmRlZEV4dGVudCh0KXtjb25zdCBlPXRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKHQpO2xldCBuPXRoaXMuX2RlZmF1bHRFeHRlbnQoKTtpZigwIT09ZS5sZW5ndGgpe2NvbnN0IHQ9W05PLlV0aWxzLk1hdGgubWluKGUsblswXSksTk8uVXRpbHMuTWF0aC5tYXgoZSxuWzFdKV07bj10aGlzLl9uaWNlRG9tYWluKHQpfXJldHVybiBufV9nZXRBbGxJbmNsdWRlZFZhbHVlcyh0PSExKXtjb25zdCBlPXRoaXMuX3ZhbHVlUHJvdmlkZXJGb3JEb21haW4/dGhpcy5fdmFsdWVQcm92aWRlckZvckRvbWFpbigpOltdO3JldHVybiB0aGlzLmV4dGVudE9mVmFsdWVzKGUpfWV4dGVudE9mVmFsdWVzKHQpe2NvbnN0IGU9dC5maWx0ZXIoKHQ9Pk5PLlV0aWxzLk1hdGguaXNWYWxpZE51bWJlcih0KSkpO2xldCBuPWU7aWYodGhpcy5pZ25vcmVPdXRsaWVyKCkpe2NvbnN0IHQ9ZS5zb3J0KCgodCxlKT0+dC1lKSksaT1yYyh0LC4wNSkscj1yYyh0LC45NSk7bj1lLmZpbHRlcigodD0+dD49aSYmdDw9cikpfWNvbnN0IGk9R2wobik7cmV0dXJuIG51bGw9PWlbMF18fG51bGw9PWlbMV0/W106aX1pZ25vcmVPdXRsaWVyKHQpe3JldHVybiJib29sZWFuIj09dHlwZW9mIHQ/KHRoaXMuX2lnbm9yZU91dGxpZXI9dCx0aGlzKTp0aGlzLl9pZ25vcmVPdXRsaWVyfX1jbGFzcyBKQ3QgZXh0ZW5kcyBOTy5RdWFudGl0YXRpdmVTY2FsZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5faWdub3JlT3V0bGllcj0hMX1zZXRWYWx1ZVByb3ZpZGVyRm9yRG9tYWluKHQpe3JldHVybiB0aGlzLl92YWx1ZVByb3ZpZGVyRm9yRG9tYWluPXQsdGhpc31pZ25vcmVPdXRsaWVyKHQpe3JldHVybiJib29sZWFuIj09dHlwZW9mIHQ/KHRoaXMuX2lnbm9yZU91dGxpZXI9dCx0aGlzKTp0aGlzLl9pZ25vcmVPdXRsaWVyfV9nZXRBbGxJbmNsdWRlZFZhbHVlcyh0PSExKXtjb25zdCBlPXRoaXMuX3ZhbHVlUHJvdmlkZXJGb3JEb21haW4/dGhpcy5fdmFsdWVQcm92aWRlckZvckRvbWFpbigpOltdO3JldHVybiB0aGlzLmV4dGVudE9mVmFsdWVzKGUpfX1jb25zdCBRQ3Q9TWF0aC5wb3coMiwtMTA3NCk7ZnVuY3Rpb24gdEF0KHQpe3JldHVybiBNYXRoLmxvZzEwKHQpfWZ1bmN0aW9uIGVBdCh0KXtyZXR1cm4gTWF0aC5wb3coMTAsdCl9Y2xhc3MgbkF0IGV4dGVuZHMgSkN0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLl9kM0xvZ1NjYWxlPXlFKCksdGhpcy5wYWRQcm9wb3J0aW9uKC4yKX1zY2FsZSh0KXtyZXR1cm4gdDw9MD9OYU46dGhpcy5fZDNMb2dTY2FsZSh0KX1pbnZlcnQodCl7cmV0dXJuIHRoaXMuX2QzTG9nU2NhbGUuaW52ZXJ0KHQpfXNjYWxlVHJhbnNmb3JtYXRpb24odCl7cmV0dXJuIHRoaXMuc2NhbGUodCl9aW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbih0KXtyZXR1cm4gdGhpcy5pbnZlcnQodCl9Z2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKXtyZXR1cm4gdGhpcy5kb21haW4oKX1zZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbih0KXt0aGlzLmRvbWFpbih0KX1nZXRUcmFuc2Zvcm1hdGlvbkV4dGVudCgpe3JldHVybiB0aGlzLl9nZXRVbmJvdW5kZWRFeHRlbnQoITApfV9nZXREb21haW4oKXtyZXR1cm4gdGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbn1fc2V0RG9tYWluKHQpe3RoaXMuX3VudHJhbnNmb3JtZWREb21haW49dDtjb25zdFtlLG5dPXQ7c3VwZXIuX3NldERvbWFpbihbTWF0aC5tYXgoUUN0LGUpLG5dKX1fbmljZURvbWFpbih0LGUpe2NvbnN0W24saV09dCxyPU1hdGgubWF4KHRBdChRQ3QpLHRBdChuKSksbz10QXQoaSksYT1vLXIscz1hP2EqdGhpcy5wYWRQcm9wb3J0aW9uKCk6MTtyZXR1cm5bZUF0KE1hdGgubWF4KHRBdChRQ3QpLHItcykpLGVBdChvK3MpXX1fZ2V0VW5ib3VuZGVkRXh0ZW50KHQpe2NvbnN0IGU9dGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXModCk7bGV0IG49dGhpcy5fZGVmYXVsdEV4dGVudCgpO2lmKDAhPT1lLmxlbmd0aCl7Y29uc3QgdD1bTk8uVXRpbHMuTWF0aC5taW4oZSxuWzBdKSxOTy5VdGlscy5NYXRoLm1heChlLG5bMV0pXTtuPXRoaXMuX25pY2VEb21haW4odCl9cmV0dXJuIG59X2dldEFsbEluY2x1ZGVkVmFsdWVzKHQ9ITEpe3JldHVybiBzdXBlci5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoKS5tYXAoKHQ9PnQ+MD90OlFDdCkpfV9kZWZhdWx0RXh0ZW50KCl7cmV0dXJuWzEsMTBdfV9iYWNraW5nU2NhbGVEb21haW4odCl7cmV0dXJuIG51bGw9PXQ/dGhpcy5fZDNMb2dTY2FsZS5kb21haW4oKToodGhpcy5fZDNMb2dTY2FsZS5kb21haW4odCksdGhpcyl9X2dldFJhbmdlKCl7cmV0dXJuIHRoaXMuX2QzTG9nU2NhbGUucmFuZ2UoKX1fc2V0UmFuZ2UodCl7dGhpcy5fZDNMb2dTY2FsZS5yYW5nZSh0KX1kZWZhdWx0VGlja3MoKXtyZXR1cm4gdGhpcy5fZDNMb2dTY2FsZS50aWNrcygxKX10aWNrcygpe3JldHVybiB0aGlzLl9kM0xvZ1NjYWxlLnRpY2tzKCl9ZXh0ZW50T2ZWYWx1ZXModCl7Y29uc3QgZT10LmZpbHRlcigodD0+Tk8uVXRpbHMuTWF0aC5pc1ZhbGlkTnVtYmVyKHQpJiZ0PjApKTtsZXQgbj1lO2lmKHRoaXMuaWdub3JlT3V0bGllcigpKXtjb25zdCB0PWUubWFwKHRBdCkuc29ydCgoKHQsZSk9PnQtZSkpLGk9cmModCwuMDUpLHI9cmModCwuOTUpO249dC5maWx0ZXIoKHQ9PnQ+PWkmJnQ8PXIpKS5tYXAoZUF0KX1jb25zdCBpPUdsKG4pO3JldHVybiBudWxsPT1pWzBdfHxudWxsPT1pWzFdP1tdOml9fWNsYXNzIGlBdCBleHRlbmRzIE5PLkNvbXBvbmVudHMuU2VsZWN0aW9uQm94TGF5ZXJ7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKCksdGhpcy5lYXNlRm49cWYsdGhpcy5fYW5pbWF0aW9uVGltZT03NTAsdGhpcy54U2NhbGUodCksdGhpcy55U2NhbGUoZSksdGhpcy5fZHJhZ0ludGVyYWN0aW9uPW5ldyBOTy5JbnRlcmFjdGlvbnMuRHJhZyx0aGlzLl9kb3VibGVDbGlja0ludGVyYWN0aW9uPW5ldyBOTy5JbnRlcmFjdGlvbnMuQ2xpY2ssdGhpcy5zZXR1cENhbGxiYWNrcygpLHRoaXMudW56b29tTWV0aG9kPW4sdGhpcy5vbkRldGFjaCgoKCk9Pnt0aGlzLl9kb3VibGVDbGlja0ludGVyYWN0aW9uLmRldGFjaEZyb20odGhpcyksdGhpcy5fZHJhZ0ludGVyYWN0aW9uLmRldGFjaEZyb20odGhpcyl9KSksdGhpcy5vbkFuY2hvcigoKCk9Pnt0aGlzLl9kb3VibGVDbGlja0ludGVyYWN0aW9uLmF0dGFjaFRvKHRoaXMpLHRoaXMuX2RyYWdJbnRlcmFjdGlvbi5hdHRhY2hUbyh0aGlzKX0pKX1pbnRlcmFjdGlvblN0YXJ0KHQpe3RoaXMub25TdGFydD10fWludGVyYWN0aW9uRW5kKHQpe3RoaXMub25FbmQ9dH1kcmFnSW50ZXJhY3Rpb24oKXtyZXR1cm4gdGhpcy5fZHJhZ0ludGVyYWN0aW9ufXNldHVwQ2FsbGJhY2tzKCl7bGV0IHQ9ITE7dGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ1N0YXJ0KCh0PT57dGhpcy5ib3VuZHMoe3RvcExlZnQ6dCxib3R0b21SaWdodDp0fSksdGhpcy5vblN0YXJ0KCl9KSksdGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZygoKGUsbik9Pnt0aGlzLmJvdW5kcyh7dG9wTGVmdDplLGJvdHRvbVJpZ2h0Om59KSx0aGlzLmJveFZpc2libGUoITApLHQ9ITB9KSksdGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ0VuZCgoKGUsbik9Pnt0aGlzLmJveFZpc2libGUoITEpLHRoaXMuYm91bmRzKHt0b3BMZWZ0OmUsYm90dG9tUmlnaHQ6bn0pLHQ/dGhpcy56b29tKCk6dGhpcy5vbkVuZCgpLHQ9ITF9KSksdGhpcy5fZG91YmxlQ2xpY2tJbnRlcmFjdGlvbi5vbkRvdWJsZUNsaWNrKHRoaXMudW56b29tLmJpbmQodGhpcykpfWFuaW1hdGlvblRpbWUodCl7aWYobnVsbD09dClyZXR1cm4gdGhpcy5fYW5pbWF0aW9uVGltZTtpZih0PDApdGhyb3cgbmV3IEVycm9yKCJhbmltYXRpb25UaW1lIGNhbm5vdCBiZSBuZWdhdGl2ZSIpO3JldHVybiB0aGlzLl9hbmltYXRpb25UaW1lPXQsdGhpc31lYXNlKHQpe2lmKCJmdW5jdGlvbiIhPXR5cGVvZiB0KXRocm93IG5ldyBFcnJvcigiZWFzZSBmdW5jdGlvbiBtdXN0IGJlIGEgZnVuY3Rpb24iKTtyZXR1cm4gMD09PXQoMCkmJjE9PT10KDEpfHxOTy5VdGlscy5XaW5kb3cud2FybigiRWFzaW5nIGZ1bmN0aW9uIGRvZXMgbm90IG1haW50YWluIGludmFyaWFudCBmKDApPT0wICYmIGYoMSk9PTEuIEJhZCBiZWhhdmlvciBtYXkgcmVzdWx0LiIpLHRoaXMuZWFzZUZuPXQsdGhpc316b29tKCl7bGV0IHQ9dGhpcy54RXh0ZW50KClbMF0udmFsdWVPZigpLGU9dGhpcy54RXh0ZW50KClbMV0udmFsdWVPZigpLG49dGhpcy55RXh0ZW50KClbMV0udmFsdWVPZigpLGk9dGhpcy55RXh0ZW50KClbMF0udmFsdWVPZigpO3QhPT1lJiZuIT09aSYmdGhpcy5pbnRlcnBvbGF0ZVpvb20odCxlLG4saSl9dW56b29tKCl7bGV0IHQ9dGhpcy54U2NhbGUoKTt0Ll9kb21haW5NaW49bnVsbCx0Ll9kb21haW5NYXg9bnVsbDtsZXQgZT10Ll9nZXRFeHRlbnQoKTt0aGlzLnhTY2FsZSgpLmRvbWFpbihlKSx0aGlzLnVuem9vbU1ldGhvZCgpfWlzWm9vbWluZyh0KXt0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZW5hYmxlZCghdCksdGhpcy5fZG91YmxlQ2xpY2tJbnRlcmFjdGlvbi5lbmFibGVkKCF0KX1pbnRlcnBvbGF0ZVpvb20odCxlLG4saSl7bGV0IHI9dGhpcy54U2NhbGUoKS5kb21haW4oKVswXS52YWx1ZU9mKCksbz10aGlzLnhTY2FsZSgpLmRvbWFpbigpWzFdLnZhbHVlT2YoKSxhPXRoaXMueVNjYWxlKCkuZG9tYWluKClbMF0udmFsdWVPZigpLHM9dGhpcy55U2NhbGUoKS5kb21haW4oKVsxXS52YWx1ZU9mKCksbD10aGlzLmVhc2VGbixjPSh0LGUsbik9PnJwKHQsZSkobChuKSk7dGhpcy5pc1pvb21pbmcoITApO2xldCB1PURhdGUubm93KCksaD0oKT0+e2xldCBsPURhdGUubm93KCksZD0wPT09dGhpcy5fYW5pbWF0aW9uVGltZT8xOk1hdGgubWluKDEsKGwtdSkvdGhpcy5fYW5pbWF0aW9uVGltZSkscD1jKHIsdCxkKSxmPWMobyxlLGQpLG09YyhhLG4sZCksZz1jKHMsaSxkKTt0aGlzLnhTY2FsZSgpLmRvbWFpbihbcCxmXSksdGhpcy55U2NhbGUoKS5kb21haW4oW20sZ10pLGQ8MT9OTy5VdGlscy5ET00ucmVxdWVzdEFuaW1hdGlvbkZyYW1lUG9seWZpbGwoaCk6KHRoaXMub25FbmQoKSx0aGlzLmlzWm9vbWluZyghMSkpfTtoKCl9fXZhciByQXQsb0F0LGFBdDshKGZ1bmN0aW9uKHQpe3RbdC5OT05FPTBdPSJOT05FIix0W3QuRFJBR19aT09NSU5HPTFdPSJEUkFHX1pPT01JTkciLHRbdC5QQU5OSU5HPTJdPSJQQU5OSU5HIn0pKHJBdHx8KHJBdD17fSkpO2NsYXNzIHNBdCBleHRlbmRzIE5PLkNvbXBvbmVudHMuR3JvdXB7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKCksdGhpcy5zdGF0ZT1yQXQuTk9ORSx0aGlzLnBhblN0YXJ0Q2FsbGJhY2s9bmV3IE5PLlV0aWxzLkNhbGxiYWNrU2V0LHRoaXMucGFuRW5kQ2FsbGJhY2s9bmV3IE5PLlV0aWxzLkNhbGxiYWNrU2V0LHRoaXMucGFuWm9vbT1uZXcgTk8uSW50ZXJhY3Rpb25zLlBhblpvb20odCxlKSx0aGlzLnBhblpvb20uZHJhZ0ludGVyYWN0aW9uKCkubW91c2VGaWx0ZXIoKHQ9PnNBdC5pc1BhbktleSh0KSYmMD09PXQuYnV0dG9uKSksdGhpcy5wYW5ab29tLndoZWVsRmlsdGVyKHRoaXMuY2FuU2Nyb2xsWm9vbSksdGhpcy5kcmFnWm9vbUxheWVyPW5ldyBpQXQodCxlLG4pLHRoaXMuZHJhZ1pvb21MYXllci5kcmFnSW50ZXJhY3Rpb24oKS5tb3VzZUZpbHRlcigodD0+IXNBdC5pc1BhbktleSh0KSYmMD09PXQuYnV0dG9uKSksdGhpcy5hcHBlbmQodGhpcy5kcmFnWm9vbUxheWVyKTtjb25zdCBpPXRoaXMub25XaGVlbC5iaW5kKHRoaXMpO3RoaXMub25BbmNob3IoKCgpPT57dGhpcy5fbW91c2VEaXNwYXRjaGVyPU5PLkRpc3BhdGNoZXJzLk1vdXNlLmdldERpc3BhdGNoZXIodGhpcyksdGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uV2hlZWwoaSksdGhpcy5wYW5ab29tLmF0dGFjaFRvKHRoaXMpfSkpLHRoaXMub25EZXRhY2goKCgpPT57dGhpcy5wYW5ab29tLmRldGFjaEZyb20odGhpcyksdGhpcy5fbW91c2VEaXNwYXRjaGVyJiYodGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZldoZWVsKGkpLHRoaXMuX21vdXNlRGlzcGF0Y2hlcj1udWxsKX0pKSx0aGlzLnBhblpvb20uZHJhZ0ludGVyYWN0aW9uKCkub25EcmFnU3RhcnQoKCgpPT57dGhpcy5zdGF0ZT09ckF0Lk5PTkUmJnRoaXMuc2V0U3RhdGUockF0LlBBTk5JTkcpfSkpLHRoaXMucGFuWm9vbS5kcmFnSW50ZXJhY3Rpb24oKS5vbkRyYWdFbmQoKCgpPT57dGhpcy5zdGF0ZT09ckF0LlBBTk5JTkcmJnRoaXMuc2V0U3RhdGUockF0Lk5PTkUpfSkpLHRoaXMuZHJhZ1pvb21MYXllci5kcmFnSW50ZXJhY3Rpb24oKS5vbkRyYWdTdGFydCgoKCk9Pnt0aGlzLnN0YXRlPT1yQXQuTk9ORSYmdGhpcy5zZXRTdGF0ZShyQXQuRFJBR19aT09NSU5HKX0pKSx0aGlzLmRyYWdab29tTGF5ZXIuZHJhZ0ludGVyYWN0aW9uKCkub25EcmFnRW5kKCgoKT0+e3RoaXMuc3RhdGU9PXJBdC5EUkFHX1pPT01JTkcmJnRoaXMuc2V0U3RhdGUockF0Lk5PTkUpfSkpfW9uV2hlZWwodCxlKXtpZih0aGlzLmNhblNjcm9sbFpvb20oZSkpcmV0dXJuO2NvbnN0IG49dGhpcy5lbGVtZW50KCk7aWYoIW4uc2VsZWN0KCIuaGVscCIpLmVtcHR5KCkpcmV0dXJuO2NvbnN0IGk9bi5hcHBlbmQoImRpdiIpLmNsYXNzZWQoImhlbHAiLCEwKTtpLmFwcGVuZCgic3BhbiIpLnRleHQoIkFsdCArIFNjcm9sbCB0byBab29tIiksaS5vbigiYW5pbWF0aW9uZW5kIiwoKCk9PntpLnJlbW92ZSgpfSkpfXN0YXRpYyBpc1BhbktleSh0KXtyZXR1cm4gQm9vbGVhbih0LmFsdEtleSl8fEJvb2xlYW4odC5zaGlmdEtleSl9Y2FuU2Nyb2xsWm9vbSh0KXtyZXR1cm4gdC5hbHRLZXl9c2V0U3RhdGUodCl7aWYodGhpcy5zdGF0ZT09dClyZXR1cm47Y29uc3QgZT10aGlzLnN0YXRlO3RoaXMuc3RhdGU9dCx0aGlzLnJvb3QoKS5yZW1vdmVDbGFzcyh0aGlzLnN0YXRlQ2xhc3NOYW1lKGUpKSx0aGlzLnJvb3QoKS5hZGRDbGFzcyh0aGlzLnN0YXRlQ2xhc3NOYW1lKHQpKSxlPT1yQXQuUEFOTklORyYmdGhpcy5wYW5FbmRDYWxsYmFjay5jYWxsQ2FsbGJhY2tzKCksdD09ckF0LlBBTk5JTkcmJnRoaXMucGFuU3RhcnRDYWxsYmFjay5jYWxsQ2FsbGJhY2tzKCl9c3RhdGVDbGFzc05hbWUodCl7c3dpdGNoKHQpe2Nhc2UgckF0LlBBTk5JTkc6cmV0dXJuInBhbm5pbmciO2Nhc2UgckF0LkRSQUdfWk9PTUlORzpyZXR1cm4iZHJhZy16b29taW5nIjtjYXNlIHJBdC5OT05FOmRlZmF1bHQ6cmV0dXJuIiJ9fW9uUGFuU3RhcnQodCl7dGhpcy5wYW5TdGFydENhbGxiYWNrLmFkZCh0KX1vblBhbkVuZCh0KXt0aGlzLnBhbkVuZENhbGxiYWNrLmFkZCh0KX1vblNjcm9sbFpvb20odCl7dGhpcy5wYW5ab29tLm9uWm9vbUVuZCh0KX1vbkRyYWdab29tU3RhcnQodCl7dGhpcy5kcmFnWm9vbUxheWVyLmludGVyYWN0aW9uU3RhcnQodCl9b25EcmFnWm9vbUVuZCh0KXt0aGlzLmRyYWdab29tTGF5ZXIuaW50ZXJhY3Rpb25FbmQodCl9fSEoZnVuY3Rpb24odCl7dFt0LlRFWFQ9MF09IlRFWFQiLHRbdC5ET009MV09IkRPTSJ9KShvQXR8fChvQXQ9e30pKSwoZnVuY3Rpb24odCl7dC5MT0c9ImxvZyIsdC5MSU5FQVI9ImxpbmVhciJ9KShhQXR8fChhQXQ9e30pKTtjbGFzcyBsQXR7Y29uc3RydWN0b3IodCxlLG4saSxyLG8sYSxzLGwsYyx1KXt0aGlzLmRpcnR5RGF0YXNldHM9bmV3IFNldCx0aGlzLnNlcmllc05hbWVzPVtdLHRoaXMubmFtZTJkYXRhc2V0cz17fSx0aGlzLmNvbG9yU2NhbGU9aSx0aGlzLnRvb2x0aXA9cix0aGlzLmRhdGFzZXRzPVtdLHRoaXMuX2lnbm9yZVlPdXRsaWVycz0hMSx0aGlzLmxhc3RQb2ludHNEYXRhc2V0PW5ldyBOTy5EYXRhc2V0LHRoaXMubmFuRGF0YXNldD1uZXcgTk8uRGF0YXNldCx0aGlzLnlWYWx1ZUFjY2Vzc29yPWUsdGhpcy5zeW1ib2xGdW5jdGlvbj1jLHRoaXMuX2RlZmF1bHRYUmFuZ2U9cyx0aGlzLl9kZWZhdWx0WVJhbmdlPWwsdGhpcy50b29sdGlwQ29sdW1ucz1vLHRoaXMuYnVpbGRDaGFydCh0LGUsbixhLHUpfWJ1aWxkQ2hhcnQodCxlLG4saSxyKXt0aGlzLmRlc3Ryb3koKTtjb25zdCBvPXQoKTt0aGlzLnhBY2Nlc3Nvcj1vLmFjY2Vzc29yLHRoaXMueFNjYWxlPW8uc2NhbGUsdGhpcy54QXhpcz1vLmF4aXMsdGhpcy54QXhpcy5tYXJnaW4oMSkudGlja0xhYmVsUGFkZGluZygzKSxyJiZ0aGlzLnhBeGlzLmZvcm1hdHRlcihyKSx0aGlzLnlTY2FsZT1sQXQuZ2V0WVNjYWxlRnJvbVR5cGUobiksdGhpcy55U2NhbGUuc2V0VmFsdWVQcm92aWRlckZvckRvbWFpbigoKCk9PnRoaXMuZ2V0VmFsdWVzRm9yWUF4aXNEb21haW5Db21wdXRlKCkpKSx0aGlzLnlBeGlzPW5ldyBOTy5BeGVzLk51bWVyaWModGhpcy55U2NhbGUsImxlZnQiKTtsZXQgYT1TQ3QoMyk7dGhpcy55QXhpcy5tYXJnaW4oMCkudGlja0xhYmVsUGFkZGluZyg1KS5mb3JtYXR0ZXIoYSksdGhpcy55QXhpcy51c2VzVGV4dFdpZHRoQXBwcm94aW1hdGlvbighMCksdGhpcy5maWxsQXJlYT1pO2NvbnN0IHM9bmV3IHNBdCh0aGlzLnhTY2FsZSx0aGlzLnlTY2FsZSwoKCk9PnRoaXMucmVzZXREb21haW4oKSkpO3RoaXMudG9vbHRpcEludGVyYWN0aW9uPXRoaXMuY3JlYXRlVG9vbHRpcEludGVyYWN0aW9uKHMpLHRoaXMudG9vbHRpcFBvaW50c0NvbXBvbmVudD1uZXcgTk8uQ29tcG9uZW50O2NvbnN0IGw9dGhpcy5idWlsZFBsb3QodGhpcy54U2NhbGUsdGhpcy55U2NhbGUsaSk7dGhpcy5ncmlkbGluZXM9bmV3IE5PLkNvbXBvbmVudHMuR3JpZGxpbmVzKHRoaXMueFNjYWxlLHRoaXMueVNjYWxlKTtsZXQgYz1udWxsO24hPT1hQXQuTE9HJiYoYz1uZXcgTk8uQ29tcG9uZW50cy5HdWlkZUxpbmVMYXllcigiaG9yaXpvbnRhbCIpLGMuc2NhbGUodGhpcy55U2NhbGUpLnZhbHVlKDApKTtsZXQgdT1uZXcgTk8uQ29tcG9uZW50cy5HdWlkZUxpbmVMYXllcigidmVydGljYWwiKTt1LnNjYWxlKHRoaXMueFNjYWxlKS52YWx1ZSgwKSx0aGlzLmNlbnRlcj1uZXcgTk8uQ29tcG9uZW50cy5Hcm91cChbdGhpcy5ncmlkbGluZXMsYyx1LGwsdGhpcy50b29sdGlwUG9pbnRzQ29tcG9uZW50LHNdKSx0aGlzLmNlbnRlci5hZGRDbGFzcygibWFpbiIpLHRoaXMub3V0ZXI9bmV3IE5PLkNvbXBvbmVudHMuVGFibGUoW1t0aGlzLnlBeGlzLHRoaXMuY2VudGVyXSxbbnVsbCx0aGlzLnhBeGlzXV0pfWJ1aWxkUGxvdCh0LGUsbil7biYmKHRoaXMubWFyZ2luQXJlYVBsb3Q9bmV3IE5PLlBsb3RzLkFyZWEsdGhpcy5tYXJnaW5BcmVhUGxvdC54KHRoaXMueEFjY2Vzc29yLHQpLHRoaXMubWFyZ2luQXJlYVBsb3QueShuLmhpZ2hlckFjY2Vzc29yLGUpLHRoaXMubWFyZ2luQXJlYVBsb3QueTAobi5sb3dlckFjY2Vzc29yKSx0aGlzLm1hcmdpbkFyZWFQbG90LmF0dHIoImZpbGwiLCgodCxlLG4pPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUobi5tZXRhZGF0YSgpLm5hbWUpKSksdGhpcy5tYXJnaW5BcmVhUGxvdC5hdHRyKCJmaWxsLW9wYWNpdHkiLC4zKSx0aGlzLm1hcmdpbkFyZWFQbG90LmF0dHIoInN0cm9rZS13aWR0aCIsMCkpLHRoaXMuc21vb3RoZWRBY2Nlc3Nvcj10PT50LnNtb290aGVkO2xldCBpPW5ldyBOTy5QbG90cy5MaW5lO2kueCh0aGlzLnhBY2Nlc3Nvcix0KSxpLnkodGhpcy55VmFsdWVBY2Nlc3NvcixlKSxpLmF0dHIoInN0cm9rZSIsKCh0LGUsbik9PnRoaXMuY29sb3JTY2FsZS5zY2FsZShuLm1ldGFkYXRhKCkubmFtZSkpKSx0aGlzLmxpbmVQbG90PWksdGhpcy5zZXR1cFRvb2x0aXBzKGkpO2xldCByPW5ldyBOTy5QbG90cy5MaW5lO2lmKHIueCh0aGlzLnhBY2Nlc3Nvcix0KSxyLnkodGhpcy5zbW9vdGhlZEFjY2Vzc29yLGUpLHIuYXR0cigic3Ryb2tlIiwoKHQsZSxuKT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKG4ubWV0YWRhdGEoKS5uYW1lKSkpLHRoaXMuc21vb3RoTGluZVBsb3Q9cix0aGlzLnN5bWJvbEZ1bmN0aW9uKXtjb25zdCBuPW5ldyBOTy5QbG90cy5TY2F0dGVyO24ueCh0aGlzLnhBY2Nlc3Nvcix0KSxuLnkodGhpcy55VmFsdWVBY2Nlc3NvcixlKSxuLmF0dHIoImZpbGwiLCgodCxlLG4pPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUobi5tZXRhZGF0YSgpLm5hbWUpKSksbi5hdHRyKCJvcGFjaXR5IiwxKSxuLnNpemUoOCksbi5zeW1ib2woKCh0LGUsbik9PnRoaXMuc3ltYm9sRnVuY3Rpb24obi5tZXRhZGF0YSgpLm5hbWUpKSksdGhpcy5tYXJrZXJzU2NhdHRlclBsb3Q9bn1sZXQgbz1uZXcgTk8uUGxvdHMuU2NhdHRlcjtvLngodGhpcy54QWNjZXNzb3IsdCksby55KHRoaXMueVZhbHVlQWNjZXNzb3IsZSksby5hdHRyKCJmaWxsIiwodD0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKHQubmFtZSkpKSxvLmF0dHIoIm9wYWNpdHkiLDEpLG8uc2l6ZSg4KSxvLmRhdGFzZXRzKFt0aGlzLmxhc3RQb2ludHNEYXRhc2V0XSksdGhpcy5zY2F0dGVyUGxvdD1vO2xldCBhPW5ldyBOTy5QbG90cy5TY2F0dGVyO2EueCh0aGlzLnhBY2Nlc3Nvcix0KSxhLnkoKHQ9PnQuZGlzcGxheVkpLGUpLGEuYXR0cigiZmlsbCIsKHQ9PnRoaXMuY29sb3JTY2FsZS5zY2FsZSh0Lm5hbWUpKSksYS5hdHRyKCJvcGFjaXR5IiwxKSxhLnNpemUoMTIpLGEuZGF0YXNldHMoW3RoaXMubmFuRGF0YXNldF0pLGEuc3ltYm9sKE5PLlN5bWJvbEZhY3Rvcmllcy50cmlhbmdsZSksdGhpcy5uYW5EaXNwbGF5PWE7Y29uc3Qgcz1bYSxvLHIsaV07cmV0dXJuIHRoaXMubWFyZ2luQXJlYVBsb3QmJnMucHVzaCh0aGlzLm1hcmdpbkFyZWFQbG90KSx0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdCYmcy5wdXNoKHRoaXMubWFya2Vyc1NjYXR0ZXJQbG90KSxuZXcgTk8uQ29tcG9uZW50cy5Hcm91cChzKX1pZ25vcmVZT3V0bGllcnModCl7dCE9PXRoaXMuX2lnbm9yZVlPdXRsaWVycyYmKHRoaXMuX2lnbm9yZVlPdXRsaWVycz10LHRoaXMudXBkYXRlU3BlY2lhbERhdGFzZXRzKCksdGhpcy55U2NhbGUuaWdub3JlT3V0bGllcih0KSx0aGlzLnJlc2V0WURvbWFpbigpKX1nZXRWYWx1ZXNGb3JZQXhpc0RvbWFpbkNvbXB1dGUoKXtjb25zdCB0PXRoaXMuZ2V0QWNjZXNzb3JzRm9yQ29tcHV0aW5nWVJhbmdlKCk7cmV0dXJuIENlLmV4cG9ydHMuZmxhdHRlbkRlZXAodGhpcy5kYXRhc2V0cy5tYXAoKGU9PnQubWFwKCh0PT5lLmRhdGEoKS5tYXAoKG49PnQobiwtMSxlKSkpKSkpKSkuZmlsdGVyKGlzRmluaXRlKX11cGRhdGVTcGVjaWFsRGF0YXNldHMoKXtjb25zdCB0PXRoaXMuZ2V0WUF4aXNBY2Nlc3NvcigpO2xldCBlPXRoaXMuZGF0YXNldHMubWFwKChlPT57bGV0IG49bnVsbCxpPWUuZGF0YSgpLmZpbHRlcigobj0+IWlzTmFOKHQobiwtMSxlKSkpKTtpZihpLmxlbmd0aD4wKXtuPWlbaS5sZW5ndGgtMV0sbi5uYW1lPWUubWV0YWRhdGEoKS5uYW1lLG4ucmVsYXRpdmU9Q0N0KG4sMCxlKX1yZXR1cm4gbn0pKS5maWx0ZXIoKHQ9Pm51bGwhPXQpKTt0aGlzLmxhc3RQb2ludHNEYXRhc2V0LmRhdGEoZSksdGhpcy5tYXJrZXJzU2NhdHRlclBsb3QmJnRoaXMubWFya2Vyc1NjYXR0ZXJQbG90LmRhdGFzZXRzKHRoaXMuZGF0YXNldHMubWFwKHRoaXMuY3JlYXRlU2FtcGxlZERhdGFzZXRGb3JNYXJrZXJzKSk7bGV0IG49Q2UuZXhwb3J0cy5mbGF0dGVuKHRoaXMuZGF0YXNldHMubWFwKChlPT57bGV0IG49bnVsbCxpPWUuZGF0YSgpLHI9MDtmb3IoO3I8aS5sZW5ndGgmJm51bGw9PW47KWlzTmFOKHQoaVtyXSwtMSxlKSl8fChuPXQoaVtyXSwtMSxlKSkscisrO251bGw9PW4mJihuPTApO2xldCBvPVtdO2ZvcihyPTA7cjxpLmxlbmd0aDtyKyspaXNOYU4odChpW3JdLC0xLGUpKT8oaVtyXS5uYW1lPWUubWV0YWRhdGEoKS5uYW1lLGlbcl0uZGlzcGxheVk9bixpW3JdLnJlbGF0aXZlPUNDdChpW3JdLDAsZSksby5wdXNoKGlbcl0pKTpuPXQoaVtyXSwtMSxlKTtyZXR1cm4gb30pKSk7dGhpcy5uYW5EYXRhc2V0LmRhdGEobil9cmVzZXREb21haW4oKXt0aGlzLnJlc2V0WERvbWFpbigpLHRoaXMucmVzZXRZRG9tYWluKCl9cmVzZXRYRG9tYWluKCl7bGV0IHQ7aWYobnVsbCE9dGhpcy5fZGVmYXVsdFhSYW5nZSl0PXRoaXMuX2RlZmF1bHRYUmFuZ2U7ZWxzZXtjb25zdCBlPXRoaXMueFNjYWxlO2UuX2RvbWFpbk1pbj1udWxsLGUuX2RvbWFpbk1heD1udWxsLHQ9ZS5fZ2V0RXh0ZW50KCl9dGhpcy54U2NhbGUuZG9tYWluKHQpfXJlc2V0WURvbWFpbigpe251bGwhPXRoaXMuX2RlZmF1bHRZUmFuZ2U/dGhpcy55U2NhbGUuZG9tYWluKHRoaXMuX2RlZmF1bHRZUmFuZ2UpOih0aGlzLnlTY2FsZS5hdXRvRG9tYWluKCksdGhpcy55U2NhbGUuZG9tYWluKHRoaXMueVNjYWxlLmRvbWFpbigpKSl9Z2V0QWNjZXNzb3JzRm9yQ29tcHV0aW5nWVJhbmdlKCl7Y29uc3QgdD1bdGhpcy5nZXRZQXhpc0FjY2Vzc29yKCldO3JldHVybiB0aGlzLmZpbGxBcmVhJiZ0LnB1c2godGhpcy5maWxsQXJlYS5sb3dlckFjY2Vzc29yLHRoaXMuZmlsbEFyZWEuaGlnaGVyQWNjZXNzb3IpLHR9Z2V0WUF4aXNBY2Nlc3Nvcigpe3JldHVybiB0aGlzLnNtb290aGluZ0VuYWJsZWQ/dGhpcy5zbW9vdGhlZEFjY2Vzc29yOnRoaXMueVZhbHVlQWNjZXNzb3J9Y3JlYXRlVG9vbHRpcEludGVyYWN0aW9uKHQpe2NvbnN0IGU9bmV3IE9DdCxuPSgpPT57ZS5lbmFibGVkKCExKSx0aGlzLmhpZGVUb29sdGlwcygpfSxpPSgpPT5lLmVuYWJsZWQoITApO3JldHVybiB0Lm9uUGFuU3RhcnQobiksdC5vbkRyYWdab29tU3RhcnQobiksdC5vblBhbkVuZChpKSx0Lm9uRHJhZ1pvb21FbmQoaSksdC5vblNjcm9sbFpvb20oKCgpPT50aGlzLnVwZGF0ZVRvb2x0aXBDb250ZW50KHRoaXMuX2xhc3RNb3VzZVBvc2l0aW9uKSkpLGUub25Qb2ludGVyTW92ZSgodD0+e3RoaXMuX2xhc3RNb3VzZVBvc2l0aW9uPXQsdGhpcy51cGRhdGVUb29sdGlwQ29udGVudCh0KX0pKSxlLm9uUG9pbnRlckV4aXQoKCgpPT50aGlzLmhpZGVUb29sdGlwcygpKSksZX11cGRhdGVUb29sdGlwQ29udGVudCh0KXt0aGlzLmxpbmVQbG90JiYod2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3Rvb2x0aXBVcGRhdGVBbmltYXRpb25GcmFtZSksdGhpcy5fdG9vbHRpcFVwZGF0ZUFuaW1hdGlvbkZyYW1lPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT57bGV0IGU9e3g6dC54LHk6dC55LGRhdHVtOm51bGwsZGF0YXNldDpudWxsfSxuPXRoaXMuZ3JpZGxpbmVzLmNvbnRlbnQoKS5ub2RlKCkuZ2V0QkJveCgpLGk9dGhpcy5saW5lUGxvdC5kYXRhc2V0cygpLm1hcCgodD0+dGhpcy5maW5kQ2xvc2VzdFBvaW50KGUsdCkpKS5maWx0ZXIoQm9vbGVhbikscj1OTy5VdGlscy5ET00uaW50ZXJzZWN0c0JCb3gsbz1pLmZpbHRlcigodD0+cih0LngsdC55LG4pfHxpc05hTih0aGlzLnlWYWx1ZUFjY2Vzc29yKHQuZGF0dW0sMCx0LmRhdGFzZXQpKSkpLGE9by5maWx0ZXIoKHQ9PiFpc05hTih0aGlzLnlWYWx1ZUFjY2Vzc29yKHQuZGF0dW0sMCx0LmRhdGFzZXQpKSkpO2lmKDAhPT1pLmxlbmd0aCl7dGhpcy5zY2F0dGVyUGxvdC5hdHRyKCJkaXNwbGF5Iiwibm9uZSIpO2NvbnN0IHQ9dGhpcy50b29sdGlwUG9pbnRzQ29tcG9uZW50LmNvbnRlbnQoKS5zZWxlY3RBbGwoIi5wb2ludCIpLmRhdGEoYSwodD0+dC5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZSkpO3QuZW50ZXIoKS5hcHBlbmQoImNpcmNsZSIpLmNsYXNzZWQoInBvaW50IiwhMCksdC5hdHRyKCJyIiw0KS5hdHRyKCJjeCIsKHQ9PnQueCkpLmF0dHIoImN5IiwodD0+dC55KSkuc3R5bGUoInN0cm9rZSIsIm5vbmUiKS5hdHRyKCJmaWxsIiwodD0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKHQuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWUpKSksdC5leGl0KCkucmVtb3ZlKCksdGhpcy5kcmF3VG9vbHRpcHMobyxlLHRoaXMudG9vbHRpcENvbHVtbnMpfWVsc2UgdGhpcy5oaWRlVG9vbHRpcHMoKX0pKSl9aGlkZVRvb2x0aXBzKCl7d2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3Rvb2x0aXBVcGRhdGVBbmltYXRpb25GcmFtZSksdGhpcy50b29sdGlwLmhpZGUoKSx0aGlzLnNjYXR0ZXJQbG90LmF0dHIoImRpc3BsYXkiLCJibG9jayIpLHRoaXMudG9vbHRpcFBvaW50c0NvbXBvbmVudC5jb250ZW50KCkuc2VsZWN0QWxsKCIucG9pbnQiKS5yZW1vdmUoKX1zZXR1cFRvb2x0aXBzKHQpe3Qub25EZXRhY2goKCgpPT57dGhpcy50b29sdGlwSW50ZXJhY3Rpb24uZGV0YWNoRnJvbSh0KSx0aGlzLnRvb2x0aXBJbnRlcmFjdGlvbi5lbmFibGVkKCExKX0pKSx0Lm9uQW5jaG9yKCgoKT0+e3RoaXMudG9vbHRpcEludGVyYWN0aW9uLmF0dGFjaFRvKHQpLHRoaXMudG9vbHRpcEludGVyYWN0aW9uLmVuYWJsZWQoITApfSkpfWRyYXdUb29sdGlwcyh0LGUsbil7aWYoIXQubGVuZ3RoKXJldHVybiB2b2lkIHRoaXMudG9vbHRpcC5oaWRlKCk7Y29uc3R7Y29sb3JTY2FsZTppfT10aGlzO249W3t0aXRsZToiIixzdGF0aWM6ITEsZXZhbFR5cGU6b0F0LkRPTSxldmFsdWF0ZSh0KXtyZXR1cm4gRHUodGhpcykuc2VsZWN0KCJzcGFuIikuc3R5bGUoImJhY2tncm91bmQtY29sb3IiLCgoKT0+aS5zY2FsZSh0LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKSkpLCIifSxlbnRlcih0KXtEdSh0aGlzKS5hcHBlbmQoInNwYW4iKS5jbGFzc2VkKCJzd2F0Y2giLCEwKS5zdHlsZSgiYmFja2dyb3VuZC1jb2xvciIsKCgpPT5pLnNjYWxlKHQuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWUpKSl9fSwuLi5uXTtjb25zdCByPXQ9Pk1hdGgucG93KHQueC1lLngsMikrTWF0aC5wb3codC55LWUueSwyKSxvPUNlLmV4cG9ydHMubWluKHQubWFwKHIpKSxhPXRoaXMuc21vb3RoaW5nRW5hYmxlZD90aGlzLnNtb290aGVkQWNjZXNzb3I6dGhpcy55VmFsdWVBY2Nlc3Nvcjt0PSJhc2NlbmRpbmciPT09dGhpcy50b29sdGlwU29ydGluZ01ldGhvZD9DZS5leHBvcnRzLnNvcnRCeSh0LCh0PT5hKHQuZGF0dW0sLTEsdC5kYXRhc2V0KSkpOiJkZXNjZW5kaW5nIj09PXRoaXMudG9vbHRpcFNvcnRpbmdNZXRob2Q/Q2UuZXhwb3J0cy5zb3J0QnkodCwodD0+YSh0LmRhdHVtLC0xLHQuZGF0YXNldCkpKS5yZXZlcnNlKCk6Im5lYXJlc3QiPT09dGhpcy50b29sdGlwU29ydGluZ01ldGhvZD9DZS5leHBvcnRzLnNvcnRCeSh0LHIpOnQuc2xpY2UoMCkucmV2ZXJzZSgpO2NvbnN0IHM9dGhpcyxsPUR1KHRoaXMudG9vbHRpcC5jb250ZW50KCkpLnNlbGVjdCgidGFibGUiKSxjPWwuc2VsZWN0KCJ0aGVhZCIpLnNlbGVjdEFsbCgidGgiKS5kYXRhKG4sKCh0LGUsbik9PnQudGl0bGUpKTtjLmVudGVyKCkuYXBwZW5kKCJ0aCIpLnRleHQoKHQ9PnQudGl0bGUpKS5ub2RlcygpLGMuZXhpdCgpLnJlbW92ZSgpO2NvbnN0IHU9bC5zZWxlY3QoInRib2R5Iikuc2VsZWN0QWxsKCJ0ciIpLmRhdGEodCwoKHQsZSxuKT0+dC5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZSkpO3UuY2xhc3NlZCgiZGlzdGFudCIsKHQ9PntsZXQgbj10LmRhdGFzZXQuZGF0YSgpWzBdLGk9Q2UuZXhwb3J0cy5sYXN0KHQuZGF0YXNldC5kYXRhKCkpLHI9dGhpcy54U2NhbGUuc2NhbGUodGhpcy54QWNjZXNzb3IobiwwLHQuZGF0YXNldCkpLG89dGhpcy54U2NhbGUuc2NhbGUodGhpcy54QWNjZXNzb3IoaSwwLHQuZGF0YXNldCkpLGE9dGhpcy5zbW9vdGhpbmdFbmFibGVkP3QuZGF0dW0uc21vb3RoZWQ6dGhpcy55VmFsdWVBY2Nlc3Nvcih0LmRhdHVtLDAsdC5kYXRhc2V0KTtyZXR1cm4gZS54PHJ8fGUueD5vfHxpc05hTihhKX0pKS5jbGFzc2VkKCJjbG9zZXN0IiwodD0+cih0KT09PW8pKS5lYWNoKChmdW5jdGlvbih0KXtzLmRyYXdUb29sdGlwUm93KHRoaXMsbix0KX0pKS5vcmRlcigpLHUuZXhpdCgpLnJlbW92ZSgpLHUuZW50ZXIoKS5hcHBlbmQoInRyIikuZWFjaCgoZnVuY3Rpb24odCl7cy5kcmF3VG9vbHRpcFJvdyh0aGlzLG4sdCl9KSkubm9kZXMoKSx0aGlzLnRvb2x0aXAudXBkYXRlQW5kUG9zaXRpb24odGhpcy50YXJnZXRTVkcubm9kZSgpKX1kcmF3VG9vbHRpcFJvdyh0LGUsbil7Y29uc3QgaT10aGlzLHI9RHUodCkuc2VsZWN0QWxsKCJ0ZCIpLmRhdGEoZSk7ci5lYWNoKChmdW5jdGlvbih0KXt0LnN0YXRpY3x8aS5kcmF3VG9vbHRpcENvbHVtbi5jYWxsKGksdGhpcyx0LG4pfSkpLHIuZXhpdCgpLnJlbW92ZSgpLHIuZW50ZXIoKS5hcHBlbmQoInRkIikuZWFjaCgoZnVuY3Rpb24odCl7aWYoImVudGVyImluIHQmJnQuZW50ZXIpe3QuZW50ZXIuY2FsbCh0aGlzLG4pfWkuZHJhd1Rvb2x0aXBDb2x1bW4uY2FsbChpLHRoaXMsdCxuKX0pKX1kcmF3VG9vbHRpcENvbHVtbih0LGUsbil7Y29uc3R7c21vb3RoaW5nRW5hYmxlZDppfT10aGlzOyJldmFsVHlwZSJpbiBlJiZlLmV2YWxUeXBlPT1vQXQuRE9NP2UuZXZhbHVhdGUuY2FsbCh0LG4se3Ntb290aGluZ0VuYWJsZWQ6aX0pOkR1KHQpLnRleHQoZS5ldmFsdWF0ZS5jYWxsKHQsbix7c21vb3RoaW5nRW5hYmxlZDppfSkpfWZpbmRDbG9zZXN0UG9pbnQodCxlKXtjb25zdCBuPWUuZGF0YSgpLm1hcCgoKHQsbik9PnRoaXMueFNjYWxlLnNjYWxlKHRoaXMueEFjY2Vzc29yKHQsbixlKSkpKTtsZXQgaT1DZS5leHBvcnRzLnNvcnRlZEluZGV4KG4sdC54KTtpZigwPT1uLmxlbmd0aClyZXR1cm4gbnVsbDtpZihpPT09bi5sZW5ndGgpaS09MTtlbHNlIGlmKDAhPT1pKXtpPU1hdGguYWJzKG5baS0xXS10LngpPE1hdGguYWJzKG5baV0tdC54KT9pLTE6aX1jb25zdCByPWUuZGF0YSgpW2ldLG89dGhpcy5zbW9vdGhpbmdFbmFibGVkP3RoaXMuc21vb3RoZWRBY2Nlc3NvcihyLGksZSk6dGhpcy55VmFsdWVBY2Nlc3NvcihyLGksZSk7cmV0dXJue3g6bltpXSx5OnRoaXMueVNjYWxlLnNjYWxlKG8pLGRhdHVtOnIsZGF0YXNldDplfX1yZXNtb290aERhdGFzZXQodCl7bGV0IGU9dC5kYXRhKCk7Y29uc3Qgbj10aGlzLnNtb290aGluZ1dlaWdodDtsZXQgaT1lLmxlbmd0aD4wPzA6TmFOLHI9MDtjb25zdCBvPWUubWFwKCgoZSxuKT0+dGhpcy55VmFsdWVBY2Nlc3NvcihlLG4sdCkpKSxhPW8uZXZlcnkoKHQ9PnQ9PW9bMF0pKTtlLmZvckVhY2goKCh0LGUpPT57Y29uc3Qgcz1vW2VdO2lmKGF8fCFOdW1iZXIuaXNGaW5pdGUocykpdC5zbW9vdGhlZD1zO2Vsc2V7aT1pKm4rKDEtbikqcyxyKys7bGV0IGU9MTsxIT09biYmKGU9MS1NYXRoLnBvdyhuLHIpKSx0LnNtb290aGVkPWkvZX19KSl9Z2V0RGF0YXNldCh0KXtyZXR1cm4gdm9pZCAwPT09dGhpcy5uYW1lMmRhdGFzZXRzW3RdJiYodGhpcy5uYW1lMmRhdGFzZXRzW3RdPW5ldyBOTy5EYXRhc2V0KFtdLHtuYW1lOnQsbWV0YTpudWxsfSkpLHRoaXMubmFtZTJkYXRhc2V0c1t0XX1zdGF0aWMgZ2V0WVNjYWxlRnJvbVR5cGUodCl7aWYodD09PWFBdC5MT0cpcmV0dXJuIG5ldyBuQXQ7aWYodD09PWFBdC5MSU5FQVIpcmV0dXJuIG5ldyBaQ3Q7dGhyb3cgbmV3IEVycm9yKCJVbnJlY29nbml6ZWQgeVNjYWxlIHR5cGUgIit0KX1zZXRWaXNpYmxlU2VyaWVzKHQpe3RoaXMuZGlzYWJsZUNoYW5nZXMoKSwodD10LnNvcnQoKSkucmV2ZXJzZSgpLHRoaXMuc2VyaWVzTmFtZXM9dH1kaXNhYmxlQ2hhbmdlcygpe3RoaXMuZGlydHlEYXRhc2V0cy5zaXplfHwodGhpcy5saW5lUGxvdC5kYXRhc2V0cyhbXSksdGhpcy5zbW9vdGhMaW5lUGxvdCYmdGhpcy5zbW9vdGhMaW5lUGxvdC5kYXRhc2V0cyhbXSksdGhpcy5tYXJnaW5BcmVhUGxvdCYmdGhpcy5tYXJnaW5BcmVhUGxvdC5kYXRhc2V0cyhbXSkpfWNvbW1pdENoYW5nZXMoKXt0aGlzLmRhdGFzZXRzPXRoaXMuc2VyaWVzTmFtZXMubWFwKCh0PT50aGlzLmdldERhdGFzZXQodCkpKSxbLi4udGhpcy5kaXJ0eURhdGFzZXRzXS5mb3JFYWNoKCh0PT57dGhpcy5zbW9vdGhpbmdFbmFibGVkJiZ0aGlzLnJlc21vb3RoRGF0YXNldCh0aGlzLmdldERhdGFzZXQodCkpfSkpLHRoaXMudXBkYXRlU3BlY2lhbERhdGFzZXRzKCksdGhpcy5saW5lUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzKSx0aGlzLnNtb290aGluZ0VuYWJsZWQmJnRoaXMuc21vb3RoTGluZVBsb3QuZGF0YXNldHModGhpcy5kYXRhc2V0cyksdGhpcy5tYXJnaW5BcmVhUGxvdCYmdGhpcy5tYXJnaW5BcmVhUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzKSx0aGlzLm1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0SW5SYWYoKSx0aGlzLmRpcnR5RGF0YXNldHMuY2xlYXIoKX1jcmVhdGVTYW1wbGVkRGF0YXNldEZvck1hcmtlcnModCl7Y29uc3QgZT10LmRhdGEoKTtpZihlLmxlbmd0aDw9MjApcmV0dXJuIHQ7Y29uc3Qgbj1NYXRoLmNlaWwoZS5sZW5ndGgvMjApLGk9bmV3IEFycmF5KE1hdGguZmxvb3IoZS5sZW5ndGgvbikpO2ZvcihsZXQgdD0wLHI9MDt0PGkubGVuZ3RoO3QrKyxyKz1uKWlbdF09ZVtyXTtyZXR1cm4gbmV3IE5PLkRhdGFzZXQoaSx0Lm1ldGFkYXRhKCkpfXNldFNlcmllc0RhdGEodCxlKXt0aGlzLmRpc2FibGVDaGFuZ2VzKCksdGhpcy5nZXREYXRhc2V0KHQpLmRhdGEoZSksdGhpcy5kaXJ0eURhdGFzZXRzLmFkZCh0KX1zZXRTZXJpZXNNZXRhZGF0YSh0LGUpe3RoaXMuZGlzYWJsZUNoYW5nZXMoKSx0aGlzLmdldERhdGFzZXQodCkubWV0YWRhdGEoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LHRoaXMuZ2V0RGF0YXNldCh0KS5tZXRhZGF0YSgpKSx7bWV0YTplfSkpLHRoaXMuZGlydHlEYXRhc2V0cy5hZGQodCl9c21vb3RoaW5nVXBkYXRlKHQpe3RoaXMuc21vb3RoaW5nV2VpZ2h0PXQsdGhpcy5kYXRhc2V0cy5mb3JFYWNoKCh0PT50aGlzLnJlc21vb3RoRGF0YXNldCh0KSkpLHRoaXMuc21vb3RoaW5nRW5hYmxlZHx8KHRoaXMubGluZVBsb3QuYWRkQ2xhc3MoImdob3N0IiksdGhpcy5zY2F0dGVyUGxvdC55KHRoaXMuc21vb3RoZWRBY2Nlc3Nvcix0aGlzLnlTY2FsZSksdGhpcy5zbW9vdGhpbmdFbmFibGVkPSEwLHRoaXMuc21vb3RoTGluZVBsb3QuZGF0YXNldHModGhpcy5kYXRhc2V0cykpLHRoaXMubWFya2Vyc1NjYXR0ZXJQbG90JiZ0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdC55KHRoaXMuZ2V0WUF4aXNBY2Nlc3NvcigpLHRoaXMueVNjYWxlKSx0aGlzLnVwZGF0ZVNwZWNpYWxEYXRhc2V0cygpfXNtb290aGluZ0Rpc2FibGUoKXt0aGlzLnNtb290aGluZ0VuYWJsZWQmJih0aGlzLmxpbmVQbG90LnJlbW92ZUNsYXNzKCJnaG9zdCIpLHRoaXMuc2NhdHRlclBsb3QueSh0aGlzLnlWYWx1ZUFjY2Vzc29yLHRoaXMueVNjYWxlKSx0aGlzLnNtb290aExpbmVQbG90LmRhdGFzZXRzKFtdKSx0aGlzLnNtb290aGluZ0VuYWJsZWQ9ITEsdGhpcy51cGRhdGVTcGVjaWFsRGF0YXNldHMoKSksdGhpcy5tYXJrZXJzU2NhdHRlclBsb3QmJnRoaXMubWFya2Vyc1NjYXR0ZXJQbG90LnkodGhpcy5nZXRZQXhpc0FjY2Vzc29yKCksdGhpcy55U2NhbGUpfXNldENvbG9yU2NhbGUodCl7dGhpcy5jb2xvclNjYWxlPXR9c2V0VG9vbHRpcENvbHVtbnModCl7dGhpcy50b29sdGlwQ29sdW1ucz10fXNldFRvb2x0aXBTb3J0aW5nTWV0aG9kKHQpe3RoaXMudG9vbHRpcFNvcnRpbmdNZXRob2Q9dH1yZW5kZXJUbyh0KXt0aGlzLnRhcmdldFNWRz10LHRoaXMub3V0ZXIucmVuZGVyVG8odCksbnVsbCE9dGhpcy5fZGVmYXVsdFhSYW5nZSYmdGhpcy5yZXNldFhEb21haW4oKSxudWxsIT10aGlzLl9kZWZhdWx0WVJhbmdlJiZ0aGlzLnJlc2V0WURvbWFpbigpLHRoaXMubWVhc3VyZUJCb3hBbmRNYXliZUludmFsaWRhdGVMYXlvdXRJblJhZigpfXJlZHJhdygpe3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yZWRyYXdSYWYpLHRoaXMuX3JlZHJhd1JhZj13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+e3RoaXMubWVhc3VyZUJCb3hBbmRNYXliZUludmFsaWRhdGVMYXlvdXQoKSx0aGlzLm91dGVyLnJlZHJhdygpfSkpfW1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0SW5SYWYoKXt3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5faW52YWxpZGF0ZUxheW91dFJhZiksdGhpcy5faW52YWxpZGF0ZUxheW91dFJhZj13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+e3RoaXMubWVhc3VyZUJCb3hBbmRNYXliZUludmFsaWRhdGVMYXlvdXQoKX0pKX1tZWFzdXJlQkJveEFuZE1heWJlSW52YWxpZGF0ZUxheW91dCgpe2lmKHRoaXMuX2xhc3REcmF3QkJveCl7Y29uc3R7d2lkdGg6dH09dGhpcy5fbGFzdERyYXdCQm94LHt3aWR0aDplfT10aGlzLnRhcmdldFNWRy5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7MD09dCYmdDxlJiZ0aGlzLm91dGVyLmludmFsaWRhdGVDYWNoZSgpfXRoaXMuX2xhc3REcmF3QkJveD10aGlzLnRhcmdldFNWRy5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9ZGVzdHJveSgpe3dpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yZWRyYXdSYWYpLHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9pbnZhbGlkYXRlTGF5b3V0UmFmKSx0aGlzLm91dGVyJiZ0aGlzLm91dGVyLmRlc3Ryb3koKX1vbkFuY2hvcih0KXt0aGlzLm91dGVyJiZ0aGlzLm91dGVyLm9uQW5jaG9yKHQpfWlzRGF0YUZpdFRvRG9tYWluKCl7cmV0dXJuIHQodGhpcy54QXhpcy5nZXRTY2FsZSgpKSYmdCh0aGlzLnlBeGlzLmdldFNjYWxlKCkpO2Z1bmN0aW9uIHQodCl7Y29uc3QgZT10LmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCksbj10LmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50KCk7cmV0dXJuIG5bMF09PT1lWzBdJiZuWzFdPT09ZVsxXX19fXZhciBjQXQ7bWwoe21vZHVsZU5hbWU6InBsb3R0YWJsZS1zdHlsZSIsc3R5bGVDb250ZW50OiJcbiAgICBcbi5wbG90dGFibGUtY29sb3JzLTAge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTI3OWM3OyAvKiBJTkRJR08gKi9cbn1cblxuLnBsb3R0YWJsZS1jb2xvcnMtMSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNmZDM3M2U7IC8qIENPUkFMX1JFRCAqL1xufVxuXG4ucGxvdHRhYmxlLWNvbG9ycy0yIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzYzYzI2MTsgLyogRkVSTiAqL1xufVxuXG4ucGxvdHRhYmxlLWNvbG9ycy0zIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZDQxOTsgLyogQlJJR0hUX1NVTiAqL1xufVxuXG4ucGxvdHRhYmxlLWNvbG9ycy00IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogIzJjMmI2ZjsgLyogSkFDQVJUQSAqL1xufVxuXG4ucGxvdHRhYmxlLWNvbG9ycy01IHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmNzkzOTsgLyogQlVSTklOR19PUkFOR0UgKi9cbn1cblxuLnBsb3R0YWJsZS1jb2xvcnMtNiB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNkYjJlNjU7IC8qIENFUklTRV9SRUQgKi9cbn1cblxuLnBsb3R0YWJsZS1jb2xvcnMtNyB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM5OWNlNTA7IC8qIENPTklGRVIgKi9cbn1cblxuLnBsb3R0YWJsZS1jb2xvcnMtOCB7XG4gIGJhY2tncm91bmQtY29sb3I6ICM5NjI1NjU7IC8qIFJPWUFMX0hFQVRIICovXG59XG5cbi5wbG90dGFibGUtY29sb3JzLTkge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDZjY2NjOyAvKiBST0JJTlNfRUdHX0JMVUUgKi9cbn1cblxuLyoqXG4gKiBVc2VyLXN1cHBsaWVkIHJlbmRlclRvIGVsZW1lbnQuXG4gKi9cbi5wbG90dGFibGUge1xuICBkaXNwbGF5OiBibG9jazsgLyogbXVzdCBiZSBibG9jayBlbGVtZW50cyBmb3Igd2lkdGgvaGVpZ2h0IGNhbGN1bGF0aW9ucyB0byB3b3JrIGluIEZpcmVmb3guICovXG4gIHBvaW50ZXItZXZlbnRzOiB2aXNpYmxlRmlsbDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAvKipcbiAgICogUHJlIDMuMCwgdXNlcnMgY291bGQgc2V0IHRoZSBkaW1lbnNpb24gb2YgdGhlIHJvb3QgZWxlbWVudCBpbiB0d28gd2F5czogZWl0aGVyIHVzaW5nIENTU1xuICAgKiAoaW5saW5lIG9yIHRocm91Z2ggYSBzdHlsZXNoZWV0KSwgb3IgdXNpbmcgdGhlIFNWRyB3aWR0aC9oZWlnaHQgYXR0cmlidXRlcy4gQnkgZGVmYXVsdCwgd2VcbiAgICogc2V0IHRoZSBTVkcgd2lkdGgvaGVpZ2h0IGF0dHJpYnV0ZXMgdG8gMTAwJS5cbiAgICpcbiAgICogUG9zdCAzLjAgdGhlIHJvb3QgZWxlbWVudCBpcyBhbHdheXMgYSBub3JtYWwgZGl2IGFuZCB0aGUgb25seSB3YXkgdG8gc2V0IHRoZSBkaW1lbnNpb25zIGlzXG4gICAqIHRvIHVzZSBDU1MuIFRvIHJlcGxpY2F0ZSB0aGUgXCIxMDAlLWJ5LWRlZmF1bHRcIiBiZWhhdmlvciwgd2UgYXBwbHkgd2lkdGgvaGVpZ2h0IDEwMCUuXG4gICAqL1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuXG4vKipcbiAqIFRoZSBfZWxlbWVudCB0aGF0IHJvb3RzIGVhY2ggQ29tcG9uZW50J3MgRE9NLlxuICovXG4ucGxvdHRhYmxlIC5jb21wb25lbnQge1xuICAvKiBBbGxvdyBjb21wb25lbnRzIHRvIGJlIHBvc2l0aW9uZWQgd2l0aCBleHBsaWNpdCBsZWZ0L3RvcC93aWR0aC9oZWlnaHQgc3R5bGVzICovXG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbn1cblxuLnBsb3R0YWJsZSAuYmFja2dyb3VuZC1jb250YWluZXIsXG4ucGxvdHRhYmxlIC5jb250ZW50LFxuLnBsb3R0YWJsZSAuZm9yZWdyb3VuZC1jb250YWluZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG59XG5cbi8qKlxuICogRG9uJ3QgYWxsb3cgc3ZnIGVsZW1lbnRzIGFib3ZlIHRoZSBjb250ZW50IHRvIHN0ZWFsIGV2ZW50c1xuICovXG4ucGxvdHRhYmxlIC5mb3JlZ3JvdW5kLWNvbnRhaW5lciB7XG4gIHBvaW50ZXItZXZlbnRzOiBub25lO1xufVxuXG4ucGxvdHRhYmxlIC5jb21wb25lbnQtb3ZlcmZsb3ctaGlkZGVuIHtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnBsb3R0YWJsZSAuY29tcG9uZW50LW92ZXJmbG93LXZpc2libGUge1xuICBvdmVyZmxvdzogdmlzaWJsZTtcbn1cblxuLnBsb3R0YWJsZSAucGxvdC1jYW52YXMtY29udGFpbmVyIHtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbn1cblxuLnBsb3R0YWJsZSAucGxvdC1jYW52YXMge1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICAvKipcbiAgICogUGxheSB3ZWxsIHdpdGggZGVmZXJyZWQgcmVuZGVyaW5nLlxuICAgKi9cbiAgdHJhbnNmb3JtLW9yaWdpbjogMHB4IDBweCAwcHg7XG59XG5cbi5wbG90dGFibGUgdGV4dCB7XG4gIHRleHQtcmVuZGVyaW5nOiBnZW9tZXRyaWNQcmVjaXNpb247XG59XG5cbi5wbG90dGFibGUgLmxhYmVsIHRleHQge1xuICBmaWxsOiAjMzIzMTNGO1xufVxuXG4ucGxvdHRhYmxlIC5iYXItbGFiZWwtdGV4dC1hcmVhIHRleHQsXG4ucGxvdHRhYmxlIC5zY2F0dGVyLWxhYmVsLXRleHQtYXJlYSB0ZXh0IHtcbiAgZm9udC1zaXplOiAxMnB4O1xufVxuXG4ucGxvdHRhYmxlIC5sYWJlbC1hcmVhIHRleHQge1xuICBmaWxsOiAjMzIzMTNGO1xuICBmb250LXNpemU6IDE0cHg7XG59XG5cbi5wbG90dGFibGUgLmxpZ2h0LWxhYmVsIHRleHQge1xuICBmaWxsOiB3aGl0ZTtcbn1cblxuLnBsb3R0YWJsZSAuZGFyay1sYWJlbCB0ZXh0IHtcbiAgZmlsbDogIzMyMzEzRjtcbn1cblxuLnBsb3R0YWJsZSAub2ZmLWJhci1sYWJlbCB0ZXh0IHtcbiAgZmlsbDogIzMyMzEzRjtcbn1cblxuLnBsb3R0YWJsZSAuc3RhY2tlZC1iYXItbGFiZWwgdGV4dCB7XG4gIGZpbGw6ICMzMjMxM0Y7XG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcbn1cblxuLnBsb3R0YWJsZSAuc3RhY2tlZC1iYXItcGxvdCAub2ZmLWJhci1sYWJlbCB7XG4gIC8qIEhBQ0tIQUNLICMyNzk1OiBjb3JyZWN0IG9mZi1iYXIgbGFiZWwgbG9naWMgdG8gYmUgaW1wbGVtZW50ZWQgb24gU3RhY2tlZEJhciAqL1xuICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDtcbn1cblxuLnBsb3R0YWJsZSAuYXhpcy1sYWJlbCB0ZXh0IHtcbiAgZm9udC1zaXplOiAxMHB4O1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgbGV0dGVyLXNwYWNpbmc6IDFweDtcbiAgbGluZS1oZWlnaHQ6IG5vcm1hbDtcbiAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTtcbn1cblxuLnBsb3R0YWJsZSAudGl0bGUtbGFiZWwgdGV4dCB7XG4gIGZvbnQtc2l6ZTogMjBweDtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbi5wbG90dGFibGUgLmF4aXMgbGluZS5iYXNlbGluZSB7XG4gIHN0cm9rZTogI0NDQztcbiAgc3Ryb2tlLXdpZHRoOiAxcHg7XG59XG5cbi5wbG90dGFibGUgLmF4aXMgbGluZS50aWNrLW1hcmsge1xuICBzdHJva2U6ICNDQ0M7XG4gIHN0cm9rZS13aWR0aDogMXB4O1xufVxuXG4ucGxvdHRhYmxlIC5heGlzIHRleHQge1xuICBmaWxsOiAjMzIzMTNGO1xuICBmb250LXNpemU6IDEycHg7XG4gIGZvbnQtd2VpZ2h0OiAyMDA7XG4gIGxpbmUtaGVpZ2h0OiBub3JtYWw7XG59XG5cbi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tY2lyY2xlIHtcbiAgZmlsbDogd2hpdGU7XG4gIHN0cm9rZS13aWR0aDogMXB4O1xuICBzdHJva2U6ICNDQ0M7XG59XG5cbi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tbGluZSB7XG4gIHN0cm9rZTogI0NDQztcbiAgc3Ryb2tlLXdpZHRoOiAxcHg7XG59XG5cbi5wbG90dGFibGUgLmF4aXMgLmFubm90YXRpb24tcmVjdCB7XG4gIHN0cm9rZTogI0NDQztcbiAgc3Ryb2tlLXdpZHRoOiAxcHg7XG4gIGZpbGw6IHdoaXRlO1xufVxuXG4ucGxvdHRhYmxlIC5iYXItcGxvdCAuYmFzZWxpbmUge1xuICBzdHJva2U6ICM5OTk7XG59XG5cbi5wbG90dGFibGUgLmdyaWRsaW5lcyBsaW5lIHtcbiAgc3Ryb2tlOiAjM0MzQzNDOyAvKiBoYWNraGFjazogZ3JpZGxpbmVzIHNob3VsZCBiZSBzb2xpZDsgc2VlICM4MjAgKi9cbiAgb3BhY2l0eTogMC4yNTtcbiAgc3Ryb2tlLXdpZHRoOiAxcHg7XG59XG5cbi5wbG90dGFibGUgLnNlbGVjdGlvbi1ib3gtbGF5ZXIgLnNlbGVjdGlvbi1hcmVhIHtcbiAgZmlsbDogYmxhY2s7XG4gIGZpbGwtb3BhY2l0eTogMC4wMztcbiAgc3Ryb2tlOiAjQ0NDO1xufVxuLyogRHJhZ0JveExheWVyICovXG4ucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZSAuZHJhZy1lZGdlLWxyIHtcbiAgY3Vyc29yOiBldy1yZXNpemU7XG59XG4ucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci55LXJlc2l6YWJsZSAuZHJhZy1lZGdlLXRiIHtcbiAgY3Vyc29yOiBucy1yZXNpemU7XG59XG5cbi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlLnktcmVzaXphYmxlIC5kcmFnLWNvcm5lci10bCB7XG4gIGN1cnNvcjogbndzZS1yZXNpemU7XG59XG4ucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItdHIge1xuICBjdXJzb3I6IG5lc3ctcmVzaXplO1xufVxuLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLWJsIHtcbiAgY3Vyc29yOiBuZXN3LXJlc2l6ZTtcbn1cbi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlLnktcmVzaXphYmxlIC5kcmFnLWNvcm5lci1iciB7XG4gIGN1cnNvcjogbndzZS1yZXNpemU7XG59XG5cbi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLm1vdmFibGUgLnNlbGVjdGlvbi1hcmVhIHtcbiAgY3Vyc29yOiBtb3ZlOyAvKiBJRSBmYWxsYmFjayAqL1xuICBjdXJzb3I6IC1tb3otZ3JhYjtcbiAgY3Vyc29yOiAtd2Via2l0LWdyYWI7XG4gIGN1cnNvcjogZ3JhYjtcbn1cblxuLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIubW92YWJsZSAuc2VsZWN0aW9uLWFyZWE6YWN0aXZlIHtcbiAgY3Vyc29yOiAtbW96LWdyYWJiaW5nO1xuICBjdXJzb3I6IC13ZWJraXQtZ3JhYmJpbmc7XG4gIGN1cnNvcjogZ3JhYmJpbmc7XG59XG4vKiAvRHJhZ0JveExheWVyICovXG5cbi5wbG90dGFibGUgLmd1aWRlLWxpbmUtbGF5ZXIgbGluZS5ndWlkZS1saW5lIHtcbiAgc3Ryb2tlOiAjQ0NDO1xuICBzdHJva2Utd2lkdGg6IDFweDtcbn1cblxuLnBsb3R0YWJsZSAuZHJhZy1saW5lLWxheWVyLmVuYWJsZWQudmVydGljYWwgbGluZS5kcmFnLWVkZ2Uge1xuICBjdXJzb3I6IGV3LXJlc2l6ZTtcbn1cblxuLnBsb3R0YWJsZSAuZHJhZy1saW5lLWxheWVyLmVuYWJsZWQuaG9yaXpvbnRhbCBsaW5lLmRyYWctZWRnZSB7XG4gIGN1cnNvcjogbnMtcmVzaXplO1xufVxuXG4ucGxvdHRhYmxlIC5sZWdlbmQgdGV4dCB7XG4gIGZpbGw6ICMzMjMxM0Y7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGxpbmUtaGVpZ2h0OiBub3JtYWw7XG59XG5cbi5wbG90dGFibGUgLmludGVycG9sYXRlZC1jb2xvci1sZWdlbmQgcmVjdC5zd2F0Y2gtYm91bmRpbmctYm94IHtcbiAgZmlsbDogbm9uZTtcbiAgc3Ryb2tlOiAjQ0NDO1xuICBzdHJva2Utd2lkdGg6IDFweDtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5wbG90dGFibGUgLndhdGVyZmFsbC1wbG90IGxpbmUuY29ubmVjdG9yIHtcbiAgc3Ryb2tlOiAjQ0NDO1xuICBzdHJva2Utd2lkdGg6IDFweDtcbn1cblxuLnBsb3R0YWJsZSAucGllLXBsb3QgLmFyYy5vdXRsaW5lIHtcbiAgc3Ryb2tlLWxpbmVqb2luOiByb3VuZDtcbn1cblxuIn0pLChmdW5jdGlvbih0KXt0LkdST1VQPSJHIix0LkRJVj0iRElWIix0LlNWRz0iU1ZHIix0LlRFWFQ9IlRFWFQifSkoY0F0fHwoY0F0PXt9KSk7Y2xhc3MgdUF0IGV4dGVuZHMgY2xhc3N7Y29uc3RydWN0b3IodCl7dGhpcy51bmlxdWVJZD0wLHRoaXMucm9vdD10fWV4cG9ydEFzU3RyaW5nKCl7Y29uc3QgdD10aGlzLmNvbnZlcnQodGhpcy5yb290KTtpZighdClyZXR1cm4iIjtjb25zdCBlPXRoaXMuY3JlYXRlUm9vdFN2ZygpO3JldHVybiBlLmFwcGVuZENoaWxkKHQpLGUub3V0ZXJIVE1MfWNyZWF0ZVVuaXF1ZUlkKHQpe3JldHVybmAke3R9XyR7dGhpcy51bmlxdWVJZCsrfWB9Z2V0U2l6ZSgpe3JldHVybiB0aGlzLnJvb3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9Y3JlYXRlUm9vdFN2Zygpe2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3ZnIiksZT10aGlzLmdldFNpemUoKTtyZXR1cm4gdC5zZXRBdHRyaWJ1dGVOUygic3ZnIiwidmlld0JveCIsYDAgMCAke2Uud2lkdGh9ICR7ZS5oZWlnaHR9YCksdC5zZXRBdHRyaWJ1dGUoInhtbG5zIiwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciKSx0fWNvbnZlcnQodCl7bGV0IGU9bnVsbDtjb25zdCBuPXQubm9kZU5hbWUudG9VcHBlckNhc2UoKTtpZih0Lm5vZGVUeXBlIT1Ob2RlLkVMRU1FTlRfTk9ERXx8biE9Y0F0LkRJViYmbiE9Y0F0LlNWRyllPXQuY2xvbmVOb2RlKCk7ZWxzZXtlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoY0F0LkdST1VQKTtjb25zdCBuPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLGk9cGFyc2VJbnQobi5sZWZ0LDEwKSxyPXBhcnNlSW50KG4udG9wLDEwKTtpZihpfHxyKXtjb25zdCB0PXRoaXMuY3JlYXRlVW5pcXVlSWQoImNsaXAiKTtlLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIixgdHJhbnNsYXRlKCR7aX0sICR7cn0pYCksZS5zZXRBdHRyaWJ1dGUoImNsaXAtcGF0aCIsYHVybCgjJHt0fSlgKTtjb25zdCBvPXBhcnNlSW50KG4ud2lkdGgsMTApLGE9cGFyc2VJbnQobi5oZWlnaHQsMTApLHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicmVjdCIpO3Muc2V0QXR0cmlidXRlKCJ3aWR0aCIsU3RyaW5nKG8pKSxzLnNldEF0dHJpYnV0ZSgiaGVpZ2h0IixTdHJpbmcoYSkpO2NvbnN0IGw9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJzdmciLCJjbGlwUGF0aCIpO2wuaWQ9dCxsLmFwcGVuZENoaWxkKHMpLGUuYXBwZW5kQ2hpbGQobCl9fUFycmF5LmZyb20odC5jaGlsZE5vZGVzKS5tYXAoKHQ9PnRoaXMuY29udmVydCh0KSkpLmZpbHRlcihCb29sZWFuKS5mb3JFYWNoKCh0PT5lLmFwcGVuZENoaWxkKHQpKSk7cmV0dXJuIGUubm9kZU5hbWUudG9VcHBlckNhc2UoKT09Y0F0LkdST1VQJiYhZS5oYXNDaGlsZE5vZGVzKCl8fHRoaXMuc2hvdWxkT21pdE5vZGUodCk/bnVsbDp0aGlzLnN0cmlwQ2xhc3ModGhpcy50cmFuc2ZlclN0eWxlKHQsZSkpfXN0cmlwQ2xhc3ModCl7cmV0dXJuIHQubm9kZVR5cGU9PU5vZGUuRUxFTUVOVF9OT0RFJiZ0LnJlbW92ZUF0dHJpYnV0ZSgiY2xhc3MiKSx0fXRyYW5zZmVyU3R5bGUodCxlKXtpZihlLm5vZGVUeXBlIT1Ob2RlLkVMRU1FTlRfTk9ERSlyZXR1cm4gZTtjb25zdCBuPWUsaT1lLm5vZGVOYW1lLnRvVXBwZXJDYXNlKCkscj13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0KTtyZXR1cm4gaT09Y0F0LlRFWFQmJk9iamVjdC5hc3NpZ24obi5zdHlsZSx7Zm9udEZhbWlseTpyLmZvbnRGYW1pbHksZm9udFNpemU6ci5mb250U2l6ZSxmb250V2VpZ2h0OnIuZm9udFdlaWdodH0pLGkhPWNBdC5HUk9VUCYmKG4uc2V0QXR0cmlidXRlKCJmaWxsIixyLmZpbGwpLG4uc2V0QXR0cmlidXRlKCJzdHJva2UiLHIuc3Ryb2tlKSxuLnNldEF0dHJpYnV0ZSgic3Ryb2tlLXdpZHRoIixyLnN0cm9rZVdpZHRoKSksIjEiIT1yLm9wYWNpdHkmJm4uc2V0QXR0cmlidXRlKCJvcGFjaXR5IixyLm9wYWNpdHkpLGV9c2hvdWxkT21pdE5vZGUodCl7cmV0dXJuITF9fXtzaG91bGRPbWl0Tm9kZSh0KXtyZXR1cm4gdC5ub2RlVHlwZT09Tm9kZS5FTEVNRU5UX05PREUmJnQuY2xhc3NMaXN0LmNvbnRhaW5zKCJzY2F0dGVyLXBsb3QiKX19bWwoe21vZHVsZU5hbWU6InZ6LXBhbi16b29tLXN0eWxlIixzdHlsZUNvbnRlbnQ6IlxuICAgIC5oZWxwIHtcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gICAgICBhbmltYXRpb24tZGVsYXk6IDFzO1xuICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAxcztcbiAgICAgIGFuaW1hdGlvbi1uYW1lOiBmYWRlLW91dDtcbiAgICAgIGJhY2tncm91bmQ6IHJnYmEoMzAsIDMwLCAzMCwgMC42KTtcbiAgICAgIGJvdHRvbTogMDtcbiAgICAgIGNvbG9yOiAjZmZmO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICAgICAgbGVmdDogMDtcbiAgICAgIG9wYWNpdHk6IDE7XG4gICAgICBwYWRkaW5nOiAyMHB4O1xuICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gICAgICByaWdodDogMDtcbiAgICAgIHRvcDogMDtcbiAgICB9XG5cbiAgICAuaGVscCA+IHNwYW4ge1xuICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDtcbiAgICB9XG5cbiAgICBAa2V5ZnJhbWVzIGZhZGUtb3V0IHtcbiAgICAgIDAlIHtcbiAgICAgICAgb3BhY2l0eTogMTtcbiAgICAgIH1cblxuICAgICAgMTAwJSB7XG4gICAgICAgIG9wYWNpdHk6IDA7XG4gICAgICB9XG4gICAgfVxuICAifSk7Y29uc3QgaEF0PVNDdCg0KSxkQXQ9dD0+aXNOYU4odCk/Ik5hTiI6aEF0KHQpLHBBdD1be3RpdGxlOiJOYW1lIixldmFsdWF0ZTp0PT50LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lfSx7dGl0bGU6IlNtb290aGVkIixldmFsdWF0ZSh0LGUpe2NvbnN0e3Ntb290aGluZ0VuYWJsZWQ6bn09ZTtyZXR1cm4gZEF0KG4/dC5kYXR1bS5zbW9vdGhlZDp0LmRhdHVtLnNjYWxhcil9fSx7dGl0bGU6IlZhbHVlIixldmFsdWF0ZTp0PT5kQXQodC5kYXR1bS5zY2FsYXIpfSx7dGl0bGU6IlN0ZXAiLGV2YWx1YXRlOnQ9Pk1DdCh0LmRhdHVtLnN0ZXApfSx7dGl0bGU6IlRpbWUiLGV2YWx1YXRlOnQ9PlRDdCh0LmRhdHVtLndhbGxfdGltZSl9LHt0aXRsZToiUmVsYXRpdmUiLGV2YWx1YXRlOnQ9PkFDdChDQ3QodC5kYXR1bSwwLHQuZGF0YXNldCkpfV07bGV0IGZBdD1jbGFzcyBleHRlbmRzKGNyKHdlKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29sb3JTY2FsZT0obmV3IE5PLlNjYWxlcy5Db2xvcikucmFuZ2UoakEuc2xpY2UoMCkpLHRoaXMuc21vb3RoaW5nRW5hYmxlZD0hMSx0aGlzLnNtb290aGluZ1dlaWdodD0uNix0aGlzLnhUeXBlPW51bGwsdGhpcy54Q29tcG9uZW50c0NyZWF0aW9uTWV0aG9kPW51bGwsdGhpcy55VmFsdWVBY2Nlc3Nvcj10PT50LnNjYWxhcix0aGlzLnRvb2x0aXBDb2x1bW5zPXBBdCx0aGlzLnlTY2FsZVR5cGU9YUF0LkxJTkVBUix0aGlzLmlnbm9yZVlPdXRsaWVycz0hMSx0aGlzLnRvb2x0aXBTb3J0aW5nTWV0aG9kPSJkZWZhdWx0Iix0aGlzLnRvb2x0aXBQb3NpdGlvbj16Q3QuQk9UVE9NLHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZT1bXSx0aGlzLl9zZXJpZXNEYXRhQ2FjaGU9e30sdGhpcy5fc2VyaWVzTWV0YWRhdGFDYWNoZT17fSx0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQ9bnVsbH1yZWFkeSgpe3N1cGVyLnJlYWR5KCksdGhpcy5zY29wZVN1YnRyZWUodGhpcy4kLmNoYXJ0ZGl2LCEwKX1hdHRhY2hlZCgpe2NvbnN0IHQ9e2NhcHR1cmU6ITAscGFzc2l2ZTohMH07dGhpcy5fbGlzdGVuKHRoaXMsIm1vdXNlZG93biIsdGhpcy5fb25Nb3VzZURvd24uYmluZCh0aGlzKSx0KSx0aGlzLl9saXN0ZW4odGhpcywibW91c2V1cCIsdGhpcy5fb25Nb3VzZVVwLmJpbmQodGhpcyksdCksdGhpcy5fbGlzdGVuKHdpbmRvdywia2V5ZG93biIsdGhpcy5fb25LZXlEb3duLmJpbmQodGhpcyksdCksdGhpcy5fbGlzdGVuKHdpbmRvdywia2V5dXAiLHRoaXMuX29uS2V5VXAuYmluZCh0aGlzKSx0KX1kZXRhY2hlZCgpe3RoaXMuY2FuY2VsQXN5bmModGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkKSx0aGlzLl9jaGFydCYmKHRoaXMuX2NoYXJ0LmRlc3Ryb3koKSx0aGlzLl9jaGFydD12b2lkIDApLHRoaXMuX2xpc3RlbmVycyYmKHRoaXMuX2xpc3RlbmVycy5mb3JFYWNoKCgoe25vZGU6dCxldmVudE5hbWU6ZSxmdW5jOm4sb3B0aW9uOml9KT0+e3QucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLG4saSl9KSksdGhpcy5fbGlzdGVuZXJzLmNsZWFyKCkpfV9saXN0ZW4odCxlLG4saT17fSl7dGhpcy5fbGlzdGVuZXJzfHwodGhpcy5fbGlzdGVuZXJzPW5ldyBTZXQpLHRoaXMuX2xpc3RlbmVycy5hZGQoe25vZGU6dCxldmVudE5hbWU6ZSxmdW5jOm4sb3B0aW9uOml9KSx0LmFkZEV2ZW50TGlzdGVuZXIoZSxuLGkpfV9vbktleURvd24odCl7dGhpcy50b2dnbGVDbGFzcygicGFua2V5IixzQXQuaXNQYW5LZXkodCkpfV9vbktleVVwKHQpe3RoaXMudG9nZ2xlQ2xhc3MoInBhbmtleSIsc0F0LmlzUGFuS2V5KHQpKX1fb25Nb3VzZURvd24odCl7dGhpcy50b2dnbGVDbGFzcygibW91c2Vkb3duIiwhMCl9X29uTW91c2VVcCh0KXt0aGlzLnRvZ2dsZUNsYXNzKCJtb3VzZWRvd24iLCExKX1pc0RhdGFGaXRUb0RvbWFpbigpe3JldHVybiF0aGlzLl9jaGFydHx8dGhpcy5fY2hhcnQuaXNEYXRhRml0VG9Eb21haW4oKX1zZXRWaXNpYmxlU2VyaWVzKHQpe0NlLmV4cG9ydHMuaXNFcXVhbCh0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGUsdCl8fCh0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGU9dCl9c2V0U2VyaWVzRGF0YSh0LGUpe3RoaXMuX3Nlcmllc0RhdGFDYWNoZVt0XT1lLHRoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5zZXRTZXJpZXNEYXRhKHQsZSl9c2V0U2VyaWVzTWV0YWRhdGEodCxlKXt0aGlzLl9zZXJpZXNNZXRhZGF0YUNhY2hlW3RdPWUsdGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LnNldFNlcmllc01ldGFkYXRhKHQsZSl9Y29tbWl0Q2hhbmdlcygpe3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5jb21taXRDaGFuZ2VzKCl9cmVzZXREb21haW4oKXt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQucmVzZXREb21haW4oKX1yZWRyYXcoKXt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQucmVkcmF3KCl9X21ha2VDaGFydCgpe251bGwhPT10aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQmJih0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZCksdGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkPW51bGwpLHRoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZD10aGlzLmFzeW5jKChmdW5jdGlvbigpe3RoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZD1udWxsO2xldCB0PXRoaXMueENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZDtpZih0aGlzLnhUeXBlfHx0P3RoaXMueFR5cGUmJih0PSgpPT5rQ3QodGhpcy54VHlwZSkpOnQ9RUN0LHQmJnRoaXMueVZhbHVlQWNjZXNzb3ImJnRoaXMudG9vbHRpcENvbHVtbnMpe3ZhciBlPW5ldyBsQXQodCx0aGlzLnlWYWx1ZUFjY2Vzc29yLHRoaXMueVNjYWxlVHlwZSx0aGlzLmNvbG9yU2NhbGUsdGhpcy4kLnRvb2x0aXAsdGhpcy50b29sdGlwQ29sdW1ucyx0aGlzLmZpbGxBcmVhLHRoaXMuZGVmYXVsdFhSYW5nZSx0aGlzLmRlZmF1bHRZUmFuZ2UsdGhpcy5zeW1ib2xGdW5jdGlvbix0aGlzLnhBeGlzRm9ybWF0dGVyKSxuPUR1KHRoaXMuJC5jaGFydGRpdik7ZS5yZW5kZXJUbyhuKSx0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuZGVzdHJveSgpLHRoaXMuX2NoYXJ0PWUsdGhpcy5fY2hhcnQub25BbmNob3IoKCgpPT50aGlzLmZpcmUoImNoYXJ0LWF0dGFjaGVkIikpKX19KSwzNTApfV9yZWxvYWRGcm9tQ2FjaGUoKXt0aGlzLl9jaGFydCYmKHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZS5mb3JFYWNoKCh0PT57dGhpcy5fY2hhcnQuc2V0U2VyaWVzRGF0YSh0LHRoaXMuX3Nlcmllc0RhdGFDYWNoZVt0XXx8W10pfSkpLHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZS5maWx0ZXIoKHQ9PnRoaXMuX3Nlcmllc01ldGFkYXRhQ2FjaGVbdF0pKS5mb3JFYWNoKCh0PT57dGhpcy5fY2hhcnQuc2V0U2VyaWVzTWV0YWRhdGEodCx0aGlzLl9zZXJpZXNNZXRhZGF0YUNhY2hlW3RdKX0pKSx0aGlzLl9jaGFydC5zZXRWaXNpYmxlU2VyaWVzKHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZSksdGhpcy5fY2hhcnQuY29tbWl0Q2hhbmdlcygpKX1fc21vb3RoaW5nQ2hhbmdlZCgpe3RoaXMuX2NoYXJ0JiYodGhpcy5zbW9vdGhpbmdFbmFibGVkP3RoaXMuX2NoYXJ0LnNtb290aGluZ1VwZGF0ZSh0aGlzLnNtb290aGluZ1dlaWdodCk6dGhpcy5fY2hhcnQuc21vb3RoaW5nRGlzYWJsZSgpKX1fb3V0bGllcnNDaGFuZ2VkKCl7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0Lmlnbm9yZVlPdXRsaWVycyh0aGlzLmlnbm9yZVlPdXRsaWVycyl9X2NvbG9yU2NhbGVDaGFuZ2VkKCl7dGhpcy5fY2hhcnQmJih0aGlzLl9jaGFydC5zZXRDb2xvclNjYWxlKHRoaXMuY29sb3JTY2FsZSksdGhpcy5fY2hhcnQucmVkcmF3KCkpfV90b29sdGlwQ29sdW1uc0NoYW5nZWQoKXt0aGlzLl9jaGFydCYmdGhpcy5fY2hhcnQuc2V0VG9vbHRpcENvbHVtbnModGhpcy50b29sdGlwQ29sdW1ucyl9X3Rvb2x0aXBTb3J0aW5nTWV0aG9kQ2hhbmdlZCgpe3RoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5zZXRUb29sdGlwU29ydGluZ01ldGhvZCh0aGlzLnRvb2x0aXBTb3J0aW5nTWV0aG9kKX1nZXRFeHBvcnRlcigpe3JldHVybiBuZXcgdUF0KHRoaXMuJC5jaGFydGRpdil9fTtmQXQudGVtcGxhdGU9eGVgCiAgICA8ZGl2IGlkPSJjaGFydGRpdiI+PC9kaXY+CiAgICA8dnotY2hhcnQtdG9vbHRpcAogICAgICBpZD0idG9vbHRpcCIKICAgICAgcG9zaXRpb249IltbdG9vbHRpcFBvc2l0aW9uXV0iCiAgICAgIGNvbnRlbnQtY29tcG9uZW50LW5hbWU9InZ6LWxpbmUtY2hhcnQtdG9vbHRpcCIKICAgID48L3Z6LWNoYXJ0LXRvb2x0aXA+CiAgICA8c3R5bGUgaW5jbHVkZT0icGxvdHRhYmxlLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZ6LXBhbi16b29tLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQogICAgICBkaXYgewogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgIH0KCiAgICAgICNjaGFydGRpdiAubWFpbiB7CiAgICAgICAgY29udGFpbjogc3RyaWN0OwogICAgICAgIGN1cnNvcjogY3Jvc3NoYWlyOwogICAgICB9CgogICAgICA6aG9zdCgucGFua2V5KSAjY2hhcnRkaXYgOm5vdCguZHJhZy16b29taW5nKSAubWFpbiB7CiAgICAgICAgY3Vyc29yOiAtd2Via2l0LWdyYWI7CiAgICAgICAgY3Vyc29yOiBncmFiOwogICAgICB9CgogICAgICA6aG9zdCgubW91c2Vkb3duKSAjY2hhcnRkaXYgLnBhbm5pbmcgLm1haW4gewogICAgICAgIGN1cnNvcjogLXdlYmtpdC1ncmFiYmluZzsKICAgICAgICBjdXJzb3I6IGdyYWJiaW5nOwogICAgICB9CgogICAgICAjY2hhcnRkaXYgewogICAgICAgIGNvbnRhaW46IHN0cmljdDsKICAgICAgfQoKICAgICAgI2NoYXJ0ZGl2IGxpbmUuZ3VpZGUtbGluZSB7CiAgICAgICAgc3Ryb2tlOiAjOTk5OwogICAgICAgIHN0cm9rZS13aWR0aDogMS41cHg7CiAgICAgIH0KICAgICAgI2NoYXJ0ZGl2OmhvdmVyIC5tYWluIHsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICAuZ2hvc3QgewogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweDsKICAgICAgfQoKICAgICAgLnBsb3R0YWJsZSAuYXhpcyB0ZXh0IHsKICAgICAgICBmaWxsOiBjdXJyZW50Q29sb3I7CiAgICAgIH0KCiAgICAgIC5wbG90dGFibGUgLmdyaWRsaW5lcyBsaW5lIHsKICAgICAgICBzdHJva2U6IHZhcigtLXRiLXNlY29uZGFyeS10ZXh0LWNvbG9yKTsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE5PLlNjYWxlcy5Db2xvcildLGZBdC5wcm90b3R5cGUsImNvbG9yU2NhbGUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pXSxmQXQucHJvdG90eXBlLCJzeW1ib2xGdW5jdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxmQXQucHJvdG90eXBlLCJzbW9vdGhpbmdFbmFibGVkIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLGZBdC5wcm90b3R5cGUsInNtb290aGluZ1dlaWdodCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxmQXQucHJvdG90eXBlLCJ4VHlwZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbildLGZBdC5wcm90b3R5cGUsInhDb21wb25lbnRzQ3JlYXRpb25NZXRob2QiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pXSxmQXQucHJvdG90eXBlLCJ4QXhpc0Zvcm1hdHRlciIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbildLGZBdC5wcm90b3R5cGUsInlWYWx1ZUFjY2Vzc29yIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxmQXQucHJvdG90eXBlLCJ0b29sdGlwQ29sdW1ucyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxmQXQucHJvdG90eXBlLCJmaWxsQXJlYSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sZkF0LnByb3RvdHlwZSwiZGVmYXVsdFhSYW5nZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sZkF0LnByb3RvdHlwZSwiZGVmYXVsdFlSYW5nZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxmQXQucHJvdG90eXBlLCJ5U2NhbGVUeXBlIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sZkF0LnByb3RvdHlwZSwiaWdub3JlWU91dGxpZXJzIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLGZBdC5wcm90b3R5cGUsInRvb2x0aXBTb3J0aW5nTWV0aG9kIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLGZBdC5wcm90b3R5cGUsInRvb2x0aXBQb3NpdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxmQXQucHJvdG90eXBlLCJfY2hhcnQiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLGZBdC5wcm90b3R5cGUsIl92aXNpYmxlU2VyaWVzQ2FjaGUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sZkF0LnByb3RvdHlwZSwiX3Nlcmllc0RhdGFDYWNoZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxmQXQucHJvdG90eXBlLCJfc2VyaWVzTWV0YWRhdGFDYWNoZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxmQXQucHJvdG90eXBlLCJfbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkIix2b2lkIDApLHQoW2EoInhDb21wb25lbnRzQ3JlYXRpb25NZXRob2QiLCJ4VHlwZSIsInlWYWx1ZUFjY2Vzc29yIiwieVNjYWxlVHlwZSIsImlzQXR0YWNoZWQiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGZBdC5wcm90b3R5cGUsIl9tYWtlQ2hhcnQiLG51bGwpLHQoW2EoIl9jaGFydCIsIl92aXNpYmxlU2VyaWVzQ2FjaGUiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGZBdC5wcm90b3R5cGUsIl9yZWxvYWRGcm9tQ2FjaGUiLG51bGwpLHQoW2EoInNtb290aGluZ0VuYWJsZWQiLCJzbW9vdGhpbmdXZWlnaHQiLCJfY2hhcnQiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGZBdC5wcm90b3R5cGUsIl9zbW9vdGhpbmdDaGFuZ2VkIixudWxsKSx0KFthKCJpZ25vcmVZT3V0bGllcnMiLCJfY2hhcnQiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGZBdC5wcm90b3R5cGUsIl9vdXRsaWVyc0NoYW5nZWQiLG51bGwpLHQoW2EoImNvbG9yU2NhbGUiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGZBdC5wcm90b3R5cGUsIl9jb2xvclNjYWxlQ2hhbmdlZCIsbnVsbCksdChbYSgidG9vbHRpcENvbHVtbnMiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGZBdC5wcm90b3R5cGUsIl90b29sdGlwQ29sdW1uc0NoYW5nZWQiLG51bGwpLHQoW2EoInRvb2x0aXBTb3J0aW5nTWV0aG9kIiwiX2NoYXJ0IiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxmQXQucHJvdG90eXBlLCJfdG9vbHRpcFNvcnRpbmdNZXRob2RDaGFuZ2VkIixudWxsKSxmQXQ9dChbaSgidnotbGluZS1jaGFydDIiKV0sZkF0KTtsZXQgbUF0PWNsYXNzIGV4dGVuZHMgd2V7fTttQXQudGVtcGxhdGU9eGVgCiAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KICAgICAgPHRhYmxlPgogICAgICAgIDx0aGVhZD48L3RoZWFkPgogICAgICAgIDx0Ym9keT48L3Rib2R5PgogICAgICA8L3RhYmxlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLmNvbnRlbnQgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC44KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgdGFibGUgewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBsaW5lLWhlaWdodDogMS40ZW07CiAgICAgICAgbWFyZ2luLXRvcDogMTBweDsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgIH0KCiAgICAgIHRoZWFkIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KCiAgICAgIHRib2R5IHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDIxcHg7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgdGQgewogICAgICAgIHBhZGRpbmc6IDAgNXB4OwogICAgICB9CgogICAgICAuc3dhdGNoIHsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxOHB4OwogICAgICAgIHdpZHRoOiAxOHB4OwogICAgICB9CgogICAgICAuY2xvc2VzdCAuc3dhdGNoIHsKICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAycHggI2ZmZjsKICAgICAgfQoKICAgICAgdGggewogICAgICAgIHBhZGRpbmc6IDAgNXB4OwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KCiAgICAgIC5kaXN0YW50IHRkOm5vdCguc3dhdGNoKSB7CiAgICAgICAgb3BhY2l0eTogMC44OwogICAgICB9CgogICAgICAuZ2hvc3QgewogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLG1BdD10KFtpKCJ2ei1saW5lLWNoYXJ0LXRvb2x0aXAiKV0sbUF0KTtjb25zdCBnQXQ9W107Y29uc3QgX0F0PUNlLmV4cG9ydHMudGhyb3R0bGUoKGZ1bmN0aW9uIHQoKXtpZigwPT1nQXQubGVuZ3RoKXJldHVybjtjb25zdCBlPWdBdC5zaGlmdCgpO2UmJmUuYWN0aXZlJiYoZS5yZWRyYXcoKSxlLl9tYXliZVJlbmRlcmVkSW5CYWRTdGF0ZT0hMSksd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKDApLHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodCl9KSwxMDApO2xldCB5QXQ9Y2xhc3MgZXh0ZW5kcyhiQ3QoY3Iod2UpKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX3JlZHJhd1JhZj1udWxsLHRoaXMuYWN0aXZlPSExLHRoaXMubG9nU2NhbGVBY3RpdmU9ITEsdGhpcy5jb2xvclNjYWxlPXtzY2FsZTpfT30sdGhpcy5fcmVzZXREb21haW5Pbk5leHRMb2FkPSEwLHRoaXMuX21heWJlUmVuZGVyZWRJbkJhZFN0YXRlPSExfW9uTG9hZEZpbmlzaCgpe3RoaXMuY29tbWl0Q2hhbmdlcygpLHRoaXMuZGF0YVRvTG9hZC5sZW5ndGg+MCYmdGhpcy5fcmVzZXREb21haW5Pbk5leHRMb2FkJiYodGhpcy5fcmVzZXREb21haW5Pbk5leHRMb2FkPSExLHRoaXMuZ2V0Q2hhcnQoKS5yZXNldERvbWFpbigpKSx0aGlzLnJlZHJhdygpfWRpc2Nvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKSxudWxsIT09dGhpcy5fcmVkcmF3UmFmJiZjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yZWRyYXdSYWYpfWV4cG9ydEFzU3ZnU3RyaW5nKCl7cmV0dXJuIHRoaXMuZ2V0Q2hhcnQoKS5nZXRFeHBvcnRlcigpLmV4cG9ydEFzU3RyaW5nKCl9Z2V0Q2hhcnQoKXtyZXR1cm4gdGhpcy4kLmNoYXJ0fXJlc2V0RG9tYWluKCl7dGhpcy5nZXRDaGFydCgpLnJlc2V0RG9tYWluKCl9c2V0U2VyaWVzRGF0YSh0LGUpe3RoaXMuZ2V0Q2hhcnQoKS5zZXRTZXJpZXNEYXRhKHQsZSl9c2V0U2VyaWVzTWV0YWRhdGEodCxlKXt0aGlzLmdldENoYXJ0KCkuc2V0U2VyaWVzTWV0YWRhdGEodCxlKX1jb21taXRDaGFuZ2VzKCl7dGhpcy5nZXRDaGFydCgpLmNvbW1pdENoYW5nZXMoKX1yZWRyYXcoKXtudWxsIT09dGhpcy5fcmVkcmF3UmFmJiZjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yZWRyYXdSYWYpLHRoaXMuX3JlZHJhd1JhZj13aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+e3RoaXMuYWN0aXZlP3RoaXMuZ2V0Q2hhcnQoKS5yZWRyYXcoKTp0aGlzLl9tYXliZVJlbmRlcmVkSW5CYWRTdGF0ZT0hMH0pKX1fbG9hZEtleUNoYW5nZWQoKXt0aGlzLnJlc2V0KCksdGhpcy5fcmVzZXREb21haW5Pbk5leHRMb2FkPSEwfV9kYXRhU2VyaWVzQ2hhbmdlZCgpe3RoaXMuZ2V0Q2hhcnQoKS5zZXRWaXNpYmxlU2VyaWVzKHRoaXMuZGF0YVNlcmllcyl9X2xvZ1NjYWxlQ2hhbmdlZCh0KXt0aGlzLmdldENoYXJ0KCkueVNjYWxlVHlwZT10P2FBdC5MT0c6YUF0LkxJTkVBUix0aGlzLnJlZHJhdygpfV9maXhCYWRTdGF0ZVdoZW5BY3RpdmUoKXt0aGlzLmFjdGl2ZSYmdGhpcy5fbWF5YmVSZW5kZXJlZEluQmFkU3RhdGUmJihnQXQucHVzaCh0aGlzKSxfQXQoKSl9X29uQ2hhcnRBdHRhY2hlZCgpe3RoaXMuYWN0aXZlfHwodGhpcy5fbWF5YmVSZW5kZXJlZEluQmFkU3RhdGU9ITApfX07eUF0LnRlbXBsYXRlPXhlYAogICAgPGRpdiBpZD0iY2hhcnQtYW5kLXNwaW5uZXItY29udGFpbmVyIj4KICAgICAgPHZ6LWxpbmUtY2hhcnQyCiAgICAgICAgaWQ9ImNoYXJ0IgogICAgICAgIGRhdGEtbG9hZGluZyQ9IltbZGF0YUxvYWRpbmddXSIKICAgICAgICBkYXRhLWxvYWRlZC1vbmNlJD0iW1tkYXRhTG9hZGVkQXRMZWFzdE9uY2VdXSIKICAgICAgICBjb2xvci1zY2FsZT0iW1tjb2xvclNjYWxlXV0iCiAgICAgICAgZGVmYXVsdC14LXJhbmdlPSJbW2RlZmF1bHRYUmFuZ2VdXSIKICAgICAgICBkZWZhdWx0LXktcmFuZ2U9IltbZGVmYXVsdFlSYW5nZV1dIgogICAgICAgIGZpbGwtYXJlYT0iW1tmaWxsQXJlYV1dIgogICAgICAgIGlnbm9yZS15LW91dGxpZXJzPSJbW2lnbm9yZVlPdXRsaWVyc11dIgogICAgICAgIG9uLWNoYXJ0LWF0dGFjaGVkPSJfb25DaGFydEF0dGFjaGVkIgogICAgICAgIHNtb290aGluZy1lbmFibGVkPSJbW3Ntb290aGluZ0VuYWJsZWRdXSIKICAgICAgICBzbW9vdGhpbmctd2VpZ2h0PSJbW3Ntb290aGluZ1dlaWdodF1dIgogICAgICAgIHN5bWJvbC1mdW5jdGlvbj0iW1tzeW1ib2xGdW5jdGlvbl1dIgogICAgICAgIHRvb2x0aXAtY29sdW1ucz0iW1t0b29sdGlwQ29sdW1uc11dIgogICAgICAgIHRvb2x0aXAtcG9zaXRpb249IltbdG9vbHRpcFBvc2l0aW9uXV0iCiAgICAgICAgdG9vbHRpcC1zb3J0aW5nLW1ldGhvZD0iW1t0b29sdGlwU29ydGluZ01ldGhvZF1dIgogICAgICAgIHgtY29tcG9uZW50cy1jcmVhdGlvbi1tZXRob2Q9IltbeENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZF1dIgogICAgICAgIHgtdHlwZT0iW1t4VHlwZV1dIgogICAgICAgIHktdmFsdWUtYWNjZXNzb3I9IltbeVZhbHVlQWNjZXNzb3JdXSIKICAgICAgPjwvdnotbGluZS1jaGFydDI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tkYXRhTG9hZGluZ11dIj4KICAgICAgICA8ZGl2IGlkPSJsb2FkaW5nLXNwaW5uZXItY29udGFpbmVyIj4KICAgICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgYWN0aXZlPSIiPjwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICA6aG9zdChbX21heWJlLXJlbmRlcmVkLWluLWJhZC1zdGF0ZV0pIHZ6LWxpbmUtY2hhcnQgewogICAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgfQoKICAgICAgI2NoYXJ0LWFuZC1zcGlubmVyLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAjbG9hZGluZy1zcGlubmVyLWNvbnRhaW5lciB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHRvcDogMDsKICAgICAgfQoKICAgICAgdnotbGluZS1jaGFydDIgewogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgdnotbGluZS1jaGFydDJbZGF0YS1sb2FkaW5nXSB7CiAgICAgICAgb3BhY2l0eTogMC4zOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfZml4QmFkU3RhdGVXaGVuQWN0aXZlIn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0seUF0LnByb3RvdHlwZSwiYWN0aXZlIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSx5QXQucHJvdG90eXBlLCJkYXRhU2VyaWVzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLGJyKV0seUF0LnByb3RvdHlwZSwicmVxdWVzdE1hbmFnZXIiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFuLG9ic2VydmVyOiJfbG9nU2NhbGVDaGFuZ2VkIn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0seUF0LnByb3RvdHlwZSwibG9nU2NhbGVBY3RpdmUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0seUF0LnByb3RvdHlwZSwieENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSx5QXQucHJvdG90eXBlLCJ4VHlwZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbildLHlBdC5wcm90b3R5cGUsInlWYWx1ZUFjY2Vzc29yIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHlBdC5wcm90b3R5cGUsImZpbGxBcmVhIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0seUF0LnByb3RvdHlwZSwic21vb3RoaW5nRW5hYmxlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSx5QXQucHJvdG90eXBlLCJzbW9vdGhpbmdXZWlnaHQiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLHlBdC5wcm90b3R5cGUsInRvb2x0aXBDb2x1bW5zIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHlBdC5wcm90b3R5cGUsInRvb2x0aXBTb3J0aW5nTWV0aG9kIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLHlBdC5wcm90b3R5cGUsInRvb2x0aXBQb3NpdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLHlBdC5wcm90b3R5cGUsImlnbm9yZVlPdXRsaWVycyIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0seUF0LnByb3RvdHlwZSwiZGVmYXVsdFhSYW5nZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0seUF0LnByb3RvdHlwZSwiZGVmYXVsdFlSYW5nZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbildLHlBdC5wcm90b3R5cGUsInN5bWJvbEZ1bmN0aW9uIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHlBdC5wcm90b3R5cGUsImNvbG9yU2NhbGUiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSx5QXQucHJvdG90eXBlLCJfcmVzZXREb21haW5Pbk5leHRMb2FkIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLHlBdC5wcm90b3R5cGUsIl9tYXliZVJlbmRlcmVkSW5CYWRTdGF0ZSIsdm9pZCAwKSx0KFthKCJsb2FkS2V5IiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSx5QXQucHJvdG90eXBlLCJfbG9hZEtleUNoYW5nZWQiLG51bGwpLHQoW2EoImRhdGFTZXJpZXMuKiIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0seUF0LnByb3RvdHlwZSwiX2RhdGFTZXJpZXNDaGFuZ2VkIixudWxsKSx5QXQ9dChbaSgidGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciIpXSx5QXQpLG1sKHttb2R1bGVOYW1lOiJ0Zi1jdXN0b20tc2NhbGFyLWNhcmQtc3R5bGUiLHN0eWxlQ29udGVudDoiXG4gICAgOmhvc3Qge1xuICAgICAgbWFyZ2luOiA1cHggMTBweDtcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgICAgIHdpZHRoOiAzMzBweDtcbiAgICAgIHZlcnRpY2FsLWFsaWduOiB0ZXh0LXRvcDtcbiAgICB9XG5cbiAgICA6aG9zdChbX2V4cGFuZGVkXSkge1xuICAgICAgd2lkdGg6IDEwMCU7XG4gICAgfVxuXG4gICAgOmhvc3QoW19leHBhbmRlZF0pICN0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciB7XG4gICAgICBoZWlnaHQ6IDQwMHB4O1xuICAgIH1cblxuICAgIGgxIHtcbiAgICAgIGZvbnQtc2l6ZTogMTlweDtcbiAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gICAgfVxuXG4gICAgI3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXItY29udGFpbmVyIHtcbiAgICAgIGhlaWdodDogMjAwcHg7XG4gICAgICB3aWR0aDogMTAwJTtcbiAgICB9XG5cbiAgICAjYnV0dG9ucyB7XG4gICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICB9XG5cbiAgICBwYXBlci1pY29uLWJ1dHRvbiB7XG4gICAgICBjb2xvcjogIzIxOTZmMztcbiAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7XG4gICAgICB3aWR0aDogMzJweDtcbiAgICAgIGhlaWdodDogMzJweDtcbiAgICAgIHBhZGRpbmc6IDRweDtcbiAgICB9XG5cbiAgICBwYXBlci1pY29uLWJ1dHRvbltzZWxlY3RlZF0ge1xuICAgICAgYmFja2dyb3VuZDogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTtcbiAgICB9XG5cbiAgICAuZG93bmxvYWQtbGlua3Mge1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIGhlaWdodDogMzJweDtcbiAgICB9XG5cbiAgICAuZG93bmxvYWQtbGlua3MgYSB7XG4gICAgICBmb250LXNpemU6IDEwcHg7XG4gICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7XG4gICAgICBtYXJnaW46IDJweDtcbiAgICB9XG5cbiAgICAuZG93bmxvYWQtbGlua3MgcGFwZXItZHJvcGRvd24tbWVudSB7XG4gICAgICB3aWR0aDogMTAwcHg7XG4gICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDoge1xuICAgICAgICBmb250LXNpemU6IDEwcHg7XG4gICAgICB9XG4gICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDoge1xuICAgICAgICBmb250LXNpemU6IDEwcHg7XG4gICAgICB9XG4gICAgfVxuICAifSk7Y2xhc3MgdkF0e2NvbnN0cnVjdG9yKHQsZSxuLGkscil7dGhpcy5ydW49dCx0aGlzLnRhZz1lLHRoaXMubmFtZT1uLHRoaXMuc2NhbGFyRGF0YT1pLHRoaXMuc3ltYm9sPXJ9Z2V0TmFtZSgpe3JldHVybiB0aGlzLm5hbWV9c2V0RGF0YSh0KXt0aGlzLnNjYWxhckRhdGE9dH1nZXREYXRhKCl7cmV0dXJuIHRoaXMuc2NhbGFyRGF0YX1nZXRSdW4oKXtyZXR1cm4gdGhpcy5ydW59Z2V0VGFnKCl7cmV0dXJuIHRoaXMudGFnfWdldFN5bWJvbCgpe3JldHVybiB0aGlzLnN5bWJvbH19ZnVuY3Rpb24gYkF0KHQsZSl7cmV0dXJuYCR7ZX0gKCR7dH0pYH1jbGFzcyB4QXR7Y29uc3RydWN0b3IodCl7dGhpcy5ydW5CYXNlZENvbG9yU2NhbGU9dH1zY2FsZSh0KXtyZXR1cm4gdGhpcy5ydW5CYXNlZENvbG9yU2NhbGUuc2NhbGUodGhpcy5wYXJzZVJ1bk5hbWUodCkpfXBhcnNlUnVuTmFtZSh0KXtjb25zdCBlPXQubWF0Y2goL1woKC4qKVwpJC8pO3JldHVybiBlP2VbMV06IiJ9fWxldCB3QXQ9Y2xhc3MgZXh0ZW5kcyhjcih3ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmFjdGl2ZT0hMCx0aGlzLl9jb2xvclNjYWxlPW5ldyB4QXQoe3NjYWxlOl9PfSksdGhpcy5fbmFtZVRvRGF0YVNlcmllcz17fSx0aGlzLl9leHBhbmRlZD0hMSx0aGlzLl9yZXF1ZXN0RGF0YT0odCxlLG4pPT57Y29uc3QgaT1FcigpLnBsdWdpblJvdXRlKCJjdXN0b21fc2NhbGFycyIsIi9zY2FsYXJzIik7UHJvbWlzZS5hbGwodC5tYXAoKHQ9Pntjb25zdCBuPVBPKGkse3RhZzp0aGlzLl90YWdGaWx0ZXIscnVuOnR9KTtyZXR1cm4gdGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KG4pLnRoZW4oKG49PntlKHtpdGVtOnQsZGF0YTpufSl9KSl9KSkpLmZpbmFsbHkoKCgpPT57bigpfSkpfSx0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleD17fSx0aGlzLl9tYXRjaGVzTGlzdE9wZW5lZD0hMSx0aGlzLl9maWxsQXJlYT17bG93ZXJBY2Nlc3Nvcjp0PT50Lmxvd2VyLGhpZ2hlckFjY2Vzc29yOnQ9PnQudXBwZXJ9LHRoaXMuX3Rvb2x0aXBDb2x1bW5zPSgoKT0+e2NvbnN0IHQ9U0N0KDQpLGU9ZT0+aXNOYU4oZSk/Ik5hTiI6dChlKTtyZXR1cm5be3RpdGxlOiJOYW1lIixldmFsdWF0ZTp0PT50LmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lfSx7dGl0bGU6IlZhbHVlIixldmFsdWF0ZTp0PT5lKHQuZGF0dW0uc2NhbGFyKX0se3RpdGxlOiJMb3dlciBNYXJnaW4iLGV2YWx1YXRlOnQ9PmUodC5kYXR1bS5sb3dlcil9LHt0aXRsZToiVXBwZXIgTWFyZ2luIixldmFsdWF0ZTp0PT5lKHQuZGF0dW0udXBwZXIpfSx7dGl0bGU6IlN0ZXAiLGV2YWx1YXRlOnQ9Pk1DdCh0LmRhdHVtLnN0ZXApfSx7dGl0bGU6IlRpbWUiLGV2YWx1YXRlOnQ9PlRDdCh0LmRhdHVtLndhbGxfdGltZSl9LHt0aXRsZToiUmVsYXRpdmUiLGV2YWx1YXRlOnQ9PkFDdChDQ3QodC5kYXR1bSwwLHQuZGF0YXNldCkpfV19KSgpLHRoaXMuX21pc3NpbmdUYWdzPVtdLHRoaXMuX21pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuZWQ9ITF9cmVsb2FkKCl7dGhpcy4kLmxvYWRlci5yZWxvYWQoKX1yZWRyYXcoKXt0aGlzLiQubG9hZGVyLnJlZHJhdygpfV90b2dnbGVFeHBhbmRlZCh0KXt0aGlzLnNldCgiX2V4cGFuZGVkIiwhdGhpcy5fZXhwYW5kZWQpLHRoaXMucmVkcmF3KCl9X3RvZ2dsZUxvZ1NjYWxlKCl7dGhpcy5zZXQoIl9sb2dTY2FsZUFjdGl2ZSIsIXRoaXMuX2xvZ1NjYWxlQWN0aXZlKX1fcmVzZXREb21haW4oKXtjb25zdCB0PXRoaXMuJC5sb2FkZXI7dCYmdC5yZXNldERvbWFpbigpfV9jc3ZVcmwodCxlKXtpZighZSlyZXR1cm4iIjtyZXR1cm4gUE8odGhpcy5fZG93bmxvYWREYXRhVXJsKHQsZSkse2Zvcm1hdDoiY3N2In0pfV9qc29uVXJsKHQsZSl7aWYoIWUpcmV0dXJuIiI7cmV0dXJuIFBPKHRoaXMuX2Rvd25sb2FkRGF0YVVybCh0LGUpLHtmb3JtYXQ6Impzb24ifSl9X2Rvd25sb2FkRGF0YVVybCh0LGUpe2NvbnN0IG49dFtlXSxpPXt0YWc6bi5nZXRUYWcoKSxydW46bi5nZXRSdW4oKX07cmV0dXJuIFBPKEVyKCkucGx1Z2luUm91dGUoImN1c3RvbV9zY2FsYXJzIiwiL2Rvd25sb2FkX2RhdGEiKSxpKX1fY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbih0KXtyZXR1cm4oZSxuLGkpPT57aWYoIWkucmVnZXhfdmFsaWQpcmV0dXJuIHZvaWQgdGhpcy5zZXQoIl90YWdGaWx0ZXJJbnZhbGlkIiwhMCk7Y29uc3Qgcj1DZS5leHBvcnRzLmNsb25lKHRoaXMuX25hbWVUb0RhdGFTZXJpZXMpLG89W107Q2UuZXhwb3J0cy5mb3JFYWNoKHQsKHQ9PntsZXQgZT0hMTtjb25zdCBhPWkudGFnX3RvX2V2ZW50c1t0LnZhbHVlXSxzPWkudGFnX3RvX2V2ZW50c1t0Lmxvd2VyXSxsPWkudGFnX3RvX2V2ZW50c1t0LnVwcGVyXTtpZihDZS5leHBvcnRzLmlzVW5kZWZpbmVkKGEpJiYoby5wdXNoKHQudmFsdWUpLGU9ITApLENlLmV4cG9ydHMuaXNVbmRlZmluZWQocykmJihvLnB1c2godC5sb3dlciksZT0hMCksQ2UuZXhwb3J0cy5pc1VuZGVmaW5lZChsKSYmKG8ucHVzaCh0LnVwcGVyKSxlPSEwKSxlKXJldHVybjtjb25zdCBjPXQ9PnRbMV0sdT10aGlzLl9maW5kU3RlcE1pc21hdGNoKHQsYS5tYXAoYykscy5tYXAoYyksbC5tYXAoYykpO2lmKHUpcmV0dXJuIHZvaWQgdGhpcy5zZXQoIl9zdGVwc01pc21hdGNoIix1KTtjb25zdCBoPXQ9PnRbMl0sZD1hLm1hcCgoKHQsZSk9Pih7d2FsbF90aW1lOm5ldyBEYXRlKDFlMyp0WzBdKSxzdGVwOmModCksc2NhbGFyOmgodCksbG93ZXI6aChzW2VdKSx1cHBlcjpoKGxbZV0pfSkpKSxwPWJBdChuLHQudmFsdWUpLGY9cltwXTtpZihmKWYuc2V0RGF0YShkKTtlbHNle2NvbnN0IGU9dGhpcy5fY3JlYXRlTmV3RGF0YVNlcmllcyhuLHQudmFsdWUscCxkKTtyW3BdPWV9fSkpLHRoaXMuc2V0KCJfbmFtZVRvRGF0YVNlcmllcyIscik7Y29uc3QgYT1DZS5leHBvcnRzLmZpbmRJbmRleCh0aGlzLl9taXNzaW5nVGFncywodD0+dC5ydW49PT1uKSk7aWYoby5sZW5ndGgmJjMhPW8ubGVuZ3RoKXtjb25zdCB0PXtydW46bix0YWdzOm99O2E+PTA/dGhpcy5zcGxpY2UoIl9taXNzaW5nVGFncyIsYSwxLHQpOnRoaXMucHVzaCgiX21pc3NpbmdUYWdzIix0KX1lbHNlIGE+PTAmJnRoaXMuc3BsaWNlKCJfbWlzc2luZ1RhZ3MiLGEsMSl9fV9maW5kU3RlcE1pc21hdGNoKHQsZSxuLGkpe3JldHVybiBDZS5leHBvcnRzLmlzRXF1YWwobixlKSYmQ2UuZXhwb3J0cy5pc0VxdWFsKGksZSk/bnVsbDp7c2VyaWVzT2JqZWN0OnQsdmFsdWVTdGVwczplLGxvd2VyU3RlcHM6bix1cHBlclN0ZXBzOml9fV9jcmVhdGVOZXdEYXRhU2VyaWVzKHQsZSxuLGkpe3RoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W3RdfD0wO2NvbnN0IHI9bmV3IHZBdCh0LGUsbixpLHhDdFt0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFt0XV0pO3JldHVybiB0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFt0XT0odGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbdF0rMSkleEN0Lmxlbmd0aCxyfV91cGRhdGVDaGFydCgpe0NlLmV4cG9ydHMuZm9yT3duKHRoaXMuX25hbWVUb0RhdGFTZXJpZXMsKHQ9Pnt0aGlzLiQubG9hZGVyLnNldFNlcmllc0RhdGEodC5nZXROYW1lKCksdC5nZXREYXRhKCkpfSkpLHRoaXMuJC5sb2FkZXIuY29tbWl0Q2hhbmdlcygpfWdldCBfc2VyaWVzTmFtZXMoKXtjb25zdCB0PW5ldyBTZXQodGhpcy5ydW5zKTtyZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy5fbmFtZVRvRGF0YVNlcmllcykuZmlsdGVyKCgoW2Usbl0pPT50LmhhcyhuLnJ1bikpKS5tYXAoKChbdF0pPT50KSl9X2RldGVybWluZUNvbG9yKHQsZSl7cmV0dXJuIHQuc2NhbGUoZSl9X3JlZnJlc2hEYXRhU2VyaWVzKCl7dGhpcy5zZXQoIl9uYW1lVG9EYXRhU2VyaWVzIix7fSl9X2NyZWF0ZVN5bWJvbEZ1bmN0aW9uKCl7cmV0dXJuIHQ9PnRoaXMuX25hbWVUb0RhdGFTZXJpZXNbdF0uZ2V0U3ltYm9sKCkubWV0aG9kKCl9X2RldGVybWluZVN5bWJvbCh0LGUpe3JldHVybiB0W2VdLmdldFN5bWJvbCgpLmNoYXJhY3Rlcn1nZXQgX3RhZ0ZpbHRlcigpe3JldHVybiBDZS5leHBvcnRzLmZsYXR0ZW4odGhpcy5tYXJnaW5DaGFydFNlcmllcy5tYXAoKHQ9Plt0LnZhbHVlLHQubG93ZXIsdC51cHBlcl0pKSkubWFwKCh0PT4iKCIrdGhpcy5fZXNjYXBlUmVnZXhDaGFyYWN0ZXJzKHQpKyIpIikpLmpvaW4oInwiKX1fZXNjYXBlUmVnZXhDaGFyYWN0ZXJzKHQpe3JldHVybiB0LnJlcGxhY2UoL1suKis/XiR7fSgpfFtcXVxcXS9nLCJcXCQmIil9X2dldFRvZ2dsZUNvbGxhcHNpYmxlSWNvbih0KXtyZXR1cm4gdD8iZXhwYW5kLWxlc3MiOiJleHBhbmQtbW9yZSJ9X3RvZ2dsZU1hdGNoZXNPcGVuKCl7dGhpcy5zZXQoIl9tYXRjaGVzTGlzdE9wZW5lZCIsIXRoaXMuX21hdGNoZXNMaXN0T3BlbmVkKX1nZXQgX3RpdGxlRGlzcGxheVN0cmluZygpe3JldHVybiB0aGlzLnRpdGxlfHwidW50aXRsZWQifV9zZXBhcmF0ZVdpdGhDb21tYXModCl7cmV0dXJuIHQuam9pbigiLCAiKX1fdG9nZ2xlTWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW4oKXt0aGlzLnNldCgiX21pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuZWQiLCF0aGlzLl9taXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbmVkKX1fbWF0Y2hMaXN0RW50cnlDb2xvclVwZGF0ZWQoKXtjb25zdCB0PXRoaXMuJCQoIiNtYXRjaC1saXN0LXJlcGVhdCIpO3QmJnRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIubWF0Y2gtbGlzdC1lbnRyeSIpLmZvckVhY2goKGU9Pntjb25zdCBuPXQuaXRlbUZvckVsZW1lbnQoZSk7ZS5zdHlsZS5jb2xvcj10aGlzLl9kZXRlcm1pbmVDb2xvcih0aGlzLl9jb2xvclNjYWxlLG4pfSkpfX07d0F0LnRlbXBsYXRlPXhlYAogICAgPHRmLWNhcmQtaGVhZGluZyBkaXNwbGF5LW5hbWU9IltbX3RpdGxlRGlzcGxheVN0cmluZ11dIj48L3RmLWNhcmQtaGVhZGluZz4KICAgIDxkaXYgaWQ9InRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXItY29udGFpbmVyIj4KICAgICAgPHRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIKICAgICAgICBpZD0ibG9hZGVyIgogICAgICAgIGFjdGl2ZT0iW1thY3RpdmVdXSIKICAgICAgICBjb2xvci1zY2FsZT0iW1tfY29sb3JTY2FsZV1dIgogICAgICAgIGRhdGEtc2VyaWVzPSJbW19zZXJpZXNOYW1lc11dIgogICAgICAgIGZpbGwtYXJlYT0iW1tfZmlsbEFyZWFdXSIKICAgICAgICBpZ25vcmUteS1vdXRsaWVycz0iW1tpZ25vcmVZT3V0bGllcnNdXSIKICAgICAgICBsb2FkLWtleT0iW1tfdGFnRmlsdGVyXV0iCiAgICAgICAgZGF0YS10by1sb2FkPSJbW3J1bnNdXSIKICAgICAgICByZXF1ZXN0LWRhdGE9IltbX3JlcXVlc3REYXRhXV0iCiAgICAgICAgbG9nLXNjYWxlLWFjdGl2ZT0iW1tfbG9nU2NhbGVBY3RpdmVdXSIKICAgICAgICBsb2FkLWRhdGEtY2FsbGJhY2s9IltbX2NyZWF0ZVByb2Nlc3NEYXRhRnVuY3Rpb24obWFyZ2luQ2hhcnRTZXJpZXMpXV0iCiAgICAgICAgcmVxdWVzdC1tYW5hZ2VyPSJbW3JlcXVlc3RNYW5hZ2VyXV0iCiAgICAgICAgc3ltYm9sLWZ1bmN0aW9uPSJbW19jcmVhdGVTeW1ib2xGdW5jdGlvbigpXV0iCiAgICAgICAgdG9vbHRpcC1jb2x1bW5zPSJbW190b29sdGlwQ29sdW1uc11dIgogICAgICAgIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIKICAgICAgICB4LXR5cGU9IltbeFR5cGVdXSIKICAgICAgPgogICAgICA8L3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXI+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImJ1dHRvbnMiPgogICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICBzZWxlY3RlZCQ9IltbX2V4cGFuZGVkXV0iCiAgICAgICAgaWNvbj0iZnVsbHNjcmVlbiIKICAgICAgICBvbi10YXA9Il90b2dnbGVFeHBhbmRlZCIKICAgICAgPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbgogICAgICAgIHNlbGVjdGVkJD0iW1tfbG9nU2NhbGVBY3RpdmVdXSIKICAgICAgICBpY29uPSJsaW5lLXdlaWdodCIKICAgICAgICBvbi10YXA9Il90b2dnbGVMb2dTY2FsZSIKICAgICAgICB0aXRsZT0iVG9nZ2xlIHktYXhpcyBsb2cgc2NhbGUiCiAgICAgID48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICBpY29uPSJzZXR0aW5ncy1vdmVyc2NhbiIKICAgICAgICBvbi10YXA9Il9yZXNldERvbWFpbiIKICAgICAgICB0aXRsZT0iRml0IGRvbWFpbiB0byBkYXRhIgogICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHNwYW4gc3R5bGU9ImZsZXgtZ3JvdzogMSI+PC9zcGFuPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvd0Rvd25sb2FkTGlua3NdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iZG93bmxvYWQtbGlua3MiPgogICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUKICAgICAgICAgICAgbm8tbGFiZWwtZmxvYXQ9InRydWUiCiAgICAgICAgICAgIGxhYmVsPSJzZXJpZXMgdG8gZG93bmxvYWQiCiAgICAgICAgICAgIHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZH19IgogICAgICAgICAgPgogICAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlCiAgICAgICAgICAgICAgICBpcz0iZG9tLXJlcGVhdCIKICAgICAgICAgICAgICAgIGl0ZW1zPSJbW19zZXJpZXNOYW1lc11dIgogICAgICAgICAgICAgICAgYXM9ImRhdGFTZXJpZXNOYW1lIgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIgogICAgICAgICAgICAgICAgICA+W1tkYXRhU2VyaWVzTmFtZV1dPC9wYXBlci1pdGVtCiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgPGEKICAgICAgICAgICAgZG93bmxvYWQ9IltbX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZF1dLmNzdiIKICAgICAgICAgICAgaHJlZj0iW1tfY3N2VXJsKF9uYW1lVG9EYXRhU2VyaWVzLCBfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkKV1dIgogICAgICAgICAgICA+Q1NWPC9hCiAgICAgICAgICA+CiAgICAgICAgICA8YQogICAgICAgICAgICBkb3dubG9hZD0iW1tfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkXV0uanNvbiIKICAgICAgICAgICAgaHJlZj0iW1tfanNvblVybChfbmFtZVRvRGF0YVNlcmllcywgX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZCldXSIKICAgICAgICAgICAgPkpTT048L2EKICAgICAgICAgID4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgoKICAgIDwhLS0gaGVyZSAtLT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfbWlzc2luZ1RhZ3MubGVuZ3RoXV0iPgogICAgICA8ZGl2IGNsYXNzPSJjb2xsYXBzaWJsZS1saXN0LXRpdGxlIj4KICAgICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICAgIGljb249IltbX2dldFRvZ2dsZUNvbGxhcHNpYmxlSWNvbihfbWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW5lZCldXSIKICAgICAgICAgIG9uLWNsaWNrPSJfdG9nZ2xlTWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW4iCiAgICAgICAgICBjbGFzcz0idG9nZ2xlLWNvbGxhcHNpYmxlLWJ1dHRvbiIKICAgICAgICA+CiAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICA8c3BhbiBjbGFzcz0iY29sbGFwc2libGUtdGl0bGUtdGV4dCI+CiAgICAgICAgICA8aXJvbi1pY29uIGljb249Imljb25zOmVycm9yIj48L2lyb24taWNvbj4gTWlzc2luZyBUYWdzCiAgICAgICAgPC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJbW19taXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbmVkXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImVycm9yLWNvbnRlbnQiPgogICAgICAgICAgPGlyb24taWNvbiBjbGFzcz0iZXJyb3ItaWNvbiIgaWNvbj0iaWNvbnM6ZXJyb3IiPjwvaXJvbi1pY29uPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfbWlzc2luZ1RhZ3NdXSIgYXM9Im1pc3NpbmdFbnRyeSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1pc3NpbmctdGFncy1mb3ItcnVuLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgUnVuICJbW21pc3NpbmdFbnRyeS5ydW5dXSIgbGFja3MgZGF0YSBmb3IgdGFncwogICAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZQogICAgICAgICAgICAgICAgICBpcz0iZG9tLXJlcGVhdCIKICAgICAgICAgICAgICAgICAgaXRlbXM9IltbbWlzc2luZ0VudHJ5LnRhZ3NdXSIKICAgICAgICAgICAgICAgICAgYXM9InRhZyIKICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgPGxpPltbdGFnXV08L2xpPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgIDwvdGVtcGxhdGU+CgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW190YWdGaWx0ZXJJbnZhbGlkXV0iPgogICAgICA8ZGl2IGNsYXNzPSJlcnJvci1jb250ZW50Ij4KICAgICAgICA8aXJvbi1pY29uIGNsYXNzPSJlcnJvci1pY29uIiBpY29uPSJpY29uczplcnJvciI+PC9pcm9uLWljb24+CiAgICAgICAgVGhpcyByZWd1bGFyIGV4cHJlc2lvbiBpcyBpbnZhbGlkOjxiciAvPgogICAgICAgIDxzcGFuIGNsYXNzPSJpbnZhbGlkLXJlZ2V4Ij5bW190YWdGaWx0ZXJdXTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgoKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc3RlcHNNaXNtYXRjaF1dIj4KICAgICAgPGRpdiBjbGFzcz0iZXJyb3ItY29udGVudCI+CiAgICAgICAgPGlyb24taWNvbiBjbGFzcz0iZXJyb3ItaWNvbiIgaWNvbj0iaWNvbnM6ZXJyb3IiPjwvaXJvbi1pY29uPgogICAgICAgIFRoZSBzdGVwcyBmb3IgdmFsdWUsIGxvd2VyLCBhbmQgdXBwZXIgdGFncyBkbyBub3QgbWF0Y2g6CiAgICAgICAgPHVsPgogICAgICAgICAgPGxpPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0idGFnLW5hbWUiPltbX3N0ZXBzTWlzbWF0Y2guc2VyaWVzT2JqZWN0LnZhbHVlXV08L3NwYW4+OgogICAgICAgICAgICBbW19zZXBhcmF0ZVdpdGhDb21tYXMoX3N0ZXBzTWlzbWF0Y2gudmFsdWVTdGVwcyldXQogICAgICAgICAgPC9saT4KICAgICAgICAgIDxsaT4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRhZy1uYW1lIj5bW19zdGVwc01pc21hdGNoLnNlcmllc09iamVjdC5sb3dlcl1dPC9zcGFuPjoKICAgICAgICAgICAgW1tfc2VwYXJhdGVXaXRoQ29tbWFzKF9zdGVwc01pc21hdGNoLmxvd2VyU3RlcHMpXV0KICAgICAgICAgIDwvbGk+CiAgICAgICAgICA8bGk+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0YWctbmFtZSI+W1tfc3RlcHNNaXNtYXRjaC5zZXJpZXNPYmplY3QudXBwZXJdXTwvc3Bhbj46CiAgICAgICAgICAgIFtbX3NlcGFyYXRlV2l0aENvbW1hcyhfc3RlcHNNaXNtYXRjaC51cHBlclN0ZXBzKV1dCiAgICAgICAgICA8L2xpPgogICAgICAgIDwvdWw+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KCiAgICA8ZGl2IGlkPSJtYXRjaGVzLWNvbnRhaW5lciI+CiAgICAgIDxkaXYgY2xhc3M9ImNvbGxhcHNpYmxlLWxpc3QtdGl0bGUiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0iPgogICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgICAgIGljb249IltbX2dldFRvZ2dsZUNvbGxhcHNpYmxlSWNvbihfbWF0Y2hlc0xpc3RPcGVuZWQpXV0iCiAgICAgICAgICAgIG9uLWNsaWNrPSJfdG9nZ2xlTWF0Y2hlc09wZW4iCiAgICAgICAgICAgIGNsYXNzPSJ0b2dnbGUtbWF0Y2hlcy1idXR0b24iCiAgICAgICAgICA+CiAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgIDxzcGFuIGNsYXNzPSJjb2xsYXBzaWJsZS10aXRsZS10ZXh0Ij4KICAgICAgICAgIE1hdGNoZXMgKFtbX3Nlcmllc05hbWVzLmxlbmd0aF1dKQogICAgICAgIDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0iPgogICAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0iW1tfbWF0Y2hlc0xpc3RPcGVuZWRdXSI+CiAgICAgICAgICA8ZGl2IGlkPSJtYXRjaGVzLWxpc3QiPgogICAgICAgICAgICA8dGVtcGxhdGUKICAgICAgICAgICAgICBpcz0iZG9tLXJlcGVhdCIKICAgICAgICAgICAgICBpdGVtcz0iW1tfc2VyaWVzTmFtZXNdXSIKICAgICAgICAgICAgICBhcz0ic2VyaWVzTmFtZSIKICAgICAgICAgICAgICBpZD0ibWF0Y2gtbGlzdC1yZXBlYXQiCiAgICAgICAgICAgICAgb24tZG9tLWNoYW5nZT0iX21hdGNoTGlzdEVudHJ5Q29sb3JVcGRhdGVkIgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWF0Y2gtbGlzdC1lbnRyeSI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibWF0Y2gtZW50cnktc3ltYm9sIj4KICAgICAgICAgICAgICAgICAgW1tfZGV0ZXJtaW5lU3ltYm9sKF9uYW1lVG9EYXRhU2VyaWVzLCBzZXJpZXNOYW1lKV1dCiAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICBbW3Nlcmllc05hbWVdXQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CgogICAgPHN0eWxlIGluY2x1ZGU9InRmLWN1c3RvbS1zY2FsYXItY2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLmVycm9yLWNvbnRlbnQgewogICAgICAgIGJhY2tncm91bmQ6ICNmMDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIG1hcmdpbjogMTBweCAwIDAgMDsKICAgICAgICBwYWRkaW5nOiAxMHB4OwogICAgICB9CgogICAgICAuZXJyb3ItaWNvbiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgICBtYXJnaW46IDAgYXV0byA1cHggYXV0bzsKICAgICAgfQoKICAgICAgLmludmFsaWQtcmVnZXggewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CgogICAgICAuZXJyb3ItY29udGVudCB1bCB7CiAgICAgICAgbWFyZ2luOiAxcHggMCAwIDA7CiAgICAgICAgcGFkZGluZzogMCAwIDAgMTlweDsKICAgICAgfQoKICAgICAgLnRhZy1uYW1lIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQoKICAgICAgLmNvbGxhcHNpYmxlLWxpc3QtdGl0bGUgewogICAgICAgIG1hcmdpbjogMTBweCAwIDVweCAwOwogICAgICB9CgogICAgICAuY29sbGFwc2libGUtdGl0bGUtdGV4dCB7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQoKICAgICAgI21hdGNoZXMtbGlzdCB7CiAgICAgICAgbWF4LWhlaWdodDogMjAwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQoKICAgICAgLm1hdGNoLWxpc3QtZW50cnkgewogICAgICAgIG1hcmdpbjogMCAwIDVweCAwOwogICAgICB9CgogICAgICAubWF0Y2gtZW50cnktc3ltYm9sIHsKICAgICAgICBmb250LWZhbWlseTogYXJpYWwsIHNhbnMtc2VyaWY7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICB9CgogICAgICAubWlzc2luZy10YWdzLWZvci1ydW4tY29udGFpbmVyIHsKICAgICAgICBtYXJnaW46IDhweCAwIDAgMDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSx3QXQucHJvdG90eXBlLCJydW5zIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLHdBdC5wcm90b3R5cGUsInhUeXBlIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sd0F0LnByb3RvdHlwZSwiYWN0aXZlIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLHdBdC5wcm90b3R5cGUsInRpdGxlIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSx3QXQucHJvdG90eXBlLCJtYXJnaW5DaGFydFNlcmllcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLHdBdC5wcm90b3R5cGUsImlnbm9yZVlPdXRsaWVycyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixicildLHdBdC5wcm90b3R5cGUsInJlcXVlc3RNYW5hZ2VyIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sd0F0LnByb3RvdHlwZSwic2hvd0Rvd25sb2FkTGlua3MiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sd0F0LnByb3RvdHlwZSwidGFnTWV0YWRhdGEiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sd0F0LnByb3RvdHlwZSwidG9vbHRpcFNvcnRpbmdNZXRob2QiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sd0F0LnByb3RvdHlwZSwiX2NvbG9yU2NhbGUiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSx3QXQucHJvdG90eXBlLCJfdGFnRmlsdGVySW52YWxpZCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSx3QXQucHJvdG90eXBlLCJfbmFtZVRvRGF0YVNlcmllcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwfSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSx3QXQucHJvdG90eXBlLCJfZXhwYW5kZWQiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSx3QXQucHJvdG90eXBlLCJfbG9nU2NhbGVBY3RpdmUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pXSx3QXQucHJvdG90eXBlLCJfcmVxdWVzdERhdGEiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sd0F0LnByb3RvdHlwZSwiX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4Iix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sd0F0LnByb3RvdHlwZSwiX21hdGNoZXNMaXN0T3BlbmVkIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHdBdC5wcm90b3R5cGUsIl9maWxsQXJlYSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sd0F0LnByb3RvdHlwZSwiX3Rvb2x0aXBDb2x1bW5zIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSx3QXQucHJvdG90eXBlLCJfbWlzc2luZ1RhZ3MiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSx3QXQucHJvdG90eXBlLCJfbWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW5lZCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSx3QXQucHJvdG90eXBlLCJfc3RlcHNNaXNtYXRjaCIsdm9pZCAwKSx0KFthKCJfbmFtZVRvRGF0YVNlcmllcyIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sd0F0LnByb3RvdHlwZSwiX3VwZGF0ZUNoYXJ0IixudWxsKSx0KFtzKCJfbmFtZVRvRGF0YVNlcmllcyIsInJ1bnMiKSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSx3QXQucHJvdG90eXBlLCJfc2VyaWVzTmFtZXMiLG51bGwpLHQoW2EoIl90YWdGaWx0ZXIiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLHdBdC5wcm90b3R5cGUsIl9yZWZyZXNoRGF0YVNlcmllcyIsbnVsbCksdChbcygibWFyZ2luQ2hhcnRTZXJpZXMiKSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSx3QXQucHJvdG90eXBlLCJfdGFnRmlsdGVyIixudWxsKSx0KFtzKCJ0aXRsZSIpLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLHdBdC5wcm90b3R5cGUsIl90aXRsZURpc3BsYXlTdHJpbmciLG51bGwpLHdBdD10KFtpKCJ0Zi1jdXN0b20tc2NhbGFyLW1hcmdpbi1jaGFydC1jYXJkIildLHdBdCk7dmFyIFNBdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxUWVBFUzpbXSxnZXRSdW5zTmFtZWQ6ZnVuY3Rpb24gTUF0KHQpe3JldHVybiBDZS5leHBvcnRzLmtleXModCkuc29ydCh1cil9LGdldFRhZ3M6ZnIsZmlsdGVyVGFnczpmdW5jdGlvbiBFQXQodCxlKXtsZXQgbj1bXTtyZXR1cm4gZS5mb3JFYWNoKChlPT5uPW4uY29uY2F0KHRbZV0pKSksQ2UuZXhwb3J0cy51bmlxKG4pLnNvcnQodXIpfSxMaXN0ZW5LZXk6QWwsQmFzZVN0b3JlOmtsLENhbmNlbGxlcjp4TyxFbnZpcm9ubWVudFN0b3JlOkxsLGVudmlyb25tZW50U3RvcmU6UGwsRXhwZXJpbWVudHNTdG9yZTpkTyxleHBlcmltZW50c1N0b3JlOnBPLFJlcXVlc3RDYW5jZWxsYXRpb25FcnJvcjptcixJbnZhbGlkUmVxdWVzdE9wdGlvbnNFcnJvcjpncixSZXF1ZXN0TmV0d29ya0Vycm9yOl9yLGdldCBIdHRwTWV0aG9kVHlwZSgpe3JldHVybiB5cn0sUmVxdWVzdE9wdGlvbnM6dnIsUmVxdWVzdE1hbmFnZXI6YnIsY3JlYXRlUm91dGVyOk1yLGdldFJvdXRlcjpFcixzZXRSb3V0ZXI6ZnVuY3Rpb24gVEF0KHQpe2lmKG51bGw9PXQpdGhyb3cgbmV3IEVycm9yKCJSb3V0ZXIgcmVxdWlyZWQsIGJ1dCBnb3Q6ICIrdCk7U3I9dH0sY3JlYXRlU2VhcmNoUGFyYW06Q3IsUnVuc1N0b3JlOk5sLHJ1bnNTdG9yZTpJbCxhZGRQYXJhbXM6UE99KTtsZXQgQ0F0PWNsYXNzIGV4dGVuZHMoY3Iod2UpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5hY3RpdmU9ITAsdGhpcy5fY29sb3JTY2FsZT1uZXcgeEF0KHtzY2FsZTpfT30pLHRoaXMuX25hbWVUb0RhdGFTZXJpZXM9e30sdGhpcy5fZXhwYW5kZWQ9ITEsdGhpcy5fcmVxdWVzdERhdGE9KHQsZSxuKT0+e2NvbnN0IGk9RXIoKS5wbHVnaW5Sb3V0ZSgiY3VzdG9tX3NjYWxhcnMiLCIvc2NhbGFycyIpO1Byb21pc2UuYWxsKHQubWFwKCh0PT57Y29uc3Qgbj1QTyhpLHt0YWc6dGhpcy5fdGFnRmlsdGVyLHJ1bjp0fSk7cmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChuKS50aGVuKChuPT57ZSh7aXRlbTp0LGRhdGE6bn0pfSkpfSkpKS5maW5hbGx5KCgoKT0+e24oKX0pKX0sdGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXg9e30sdGhpcy5fbWF0Y2hlc0xpc3RPcGVuZWQ9ITF9cmVsb2FkKCl7dGhpcy4kLmxvYWRlci5yZWxvYWQoKX1yZWRyYXcoKXt0aGlzLiQubG9hZGVyLnJlZHJhdygpfV90b2dnbGVFeHBhbmRlZCh0KXt0aGlzLnNldCgiX2V4cGFuZGVkIiwhdGhpcy5fZXhwYW5kZWQpLHRoaXMucmVkcmF3KCl9X3RvZ2dsZUxvZ1NjYWxlKCl7dGhpcy5zZXQoIl9sb2dTY2FsZUFjdGl2ZSIsIXRoaXMuX2xvZ1NjYWxlQWN0aXZlKX1fcmVzZXREb21haW4oKXtjb25zdCB0PXRoaXMuJC5sb2FkZXI7dCYmdC5yZXNldERvbWFpbigpfV9jc3ZVcmwodCxlKXtpZighZSlyZXR1cm4iIjtyZXR1cm4gUE8odGhpcy5fZG93bmxvYWREYXRhVXJsKHQsZSkse2Zvcm1hdDoiY3N2In0pfV9qc29uVXJsKHQsZSl7aWYoIWUpcmV0dXJuIiI7cmV0dXJuIFBPKHRoaXMuX2Rvd25sb2FkRGF0YVVybCh0LGUpLHtmb3JtYXQ6Impzb24ifSl9X2Rvd25sb2FkRGF0YVVybCh0LGUpe2NvbnN0IG49dFtlXSxpPXt0YWc6bi5nZXRUYWcoKSxydW46bi5nZXRSdW4oKX07cmV0dXJuIFBPKEVyKCkucGx1Z2luUm91dGUoImN1c3RvbV9zY2FsYXJzIiwiL2Rvd25sb2FkX2RhdGEiKSxpKX1fY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbigpe3JldHVybih0LGUsbik9PntpZihuLnJlZ2V4X3ZhbGlkKXtjb25zdCB0PUNlLmV4cG9ydHMuY2xvbmUodGhpcy5fbmFtZVRvRGF0YVNlcmllcyk7Q2UuZXhwb3J0cy5mb3JPd24obi50YWdfdG9fZXZlbnRzLCgobixpKT0+e2NvbnN0IHI9bi5tYXAoKHQ9Pih7d2FsbF90aW1lOm5ldyBEYXRlKDFlMyp0WzBdKSxzdGVwOnRbMV0sc2NhbGFyOnRbMl19KSkpLG89YkF0KGUsaSksYT10W29dO2lmKGEpYS5zZXREYXRhKHIpO2Vsc2V7Q2UuZXhwb3J0cy5pc1VuZGVmaW5lZCh0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtlXSkmJih0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtlXT0wKTtjb25zdCBuPW5ldyB2QXQoZSxpLG8scix4Q3RbdGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbZV1dKTt0W29dPW47dGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbZV09KHRoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W2VdKzEpJXhDdC5sZW5ndGh9fSkpLHRoaXMuc2V0KCJfbmFtZVRvRGF0YVNlcmllcyIsdCl9fX1fdXBkYXRlQ2hhcnQoKXtPYmplY3QuZW50cmllcyh0aGlzLl9uYW1lVG9EYXRhU2VyaWVzKS5mb3JFYWNoKCgoW3QsZV0pPT57dGhpcy4kLmxvYWRlci5zZXRTZXJpZXNEYXRhKHQsZS5nZXREYXRhKCkpfSkpLHRoaXMuJC5sb2FkZXIuY29tbWl0Q2hhbmdlcygpfV9jb21wdXRlU2VsZWN0ZWRSdW5zU2V0KHQpe2NvbnN0IGU9e307cmV0dXJuIENlLmV4cG9ydHMuZm9yRWFjaCh0LCh0PT57ZVt0XT0xfSkpLGV9Z2V0IF9zZXJpZXNOYW1lcygpe2NvbnN0IHQ9bmV3IFNldCh0aGlzLnJ1bnMpO3JldHVybiBPYmplY3QuZW50cmllcyh0aGlzLl9uYW1lVG9EYXRhU2VyaWVzKS5maWx0ZXIoKChbZSxuXSk9PnQuaGFzKG4ucnVuKSkpLm1hcCgoKFt0XSk9PnQpKX1fZGV0ZXJtaW5lQ29sb3IodCxlKXtyZXR1cm4gdC5zY2FsZShlKX1fcmVmcmVzaERhdGFTZXJpZXMoKXt0aGlzLnNldCgiX25hbWVUb0RhdGFTZXJpZXMiLHt9KX1fY3JlYXRlU3ltYm9sRnVuY3Rpb24oKXtyZXR1cm4gdD0+dGhpcy5fbmFtZVRvRGF0YVNlcmllc1t0XS5nZXRTeW1ib2woKS5tZXRob2QoKX1fZGV0ZXJtaW5lU3ltYm9sKHQsZSl7cmV0dXJuIHRbZV0uZ2V0U3ltYm9sKCkuY2hhcmFjdGVyfWdldCBfdGFnRmlsdGVyKCl7dmFyIHQ9dGhpcy50YWdSZWdleGVzO3JldHVybiAxPT09dC5sZW5ndGg/dFswXTp0Lm1hcCgodD0+IigiK3QrIikiKSkuam9pbigifCIpfV9nZXRUb2dnbGVNYXRjaGVzSWNvbih0KXtyZXR1cm4gdD8iZXhwYW5kLWxlc3MiOiJleHBhbmQtbW9yZSJ9X3RvZ2dsZU1hdGNoZXNPcGVuKCl7dGhpcy5zZXQoIl9tYXRjaGVzTGlzdE9wZW5lZCIsIXRoaXMuX21hdGNoZXNMaXN0T3BlbmVkKX1nZXQgX3RpdGxlRGlzcGxheVN0cmluZygpe3JldHVybiB0aGlzLnRpdGxlfHwidW50aXRsZWQifV9tYXRjaExpc3RFbnRyeUNvbG9yVXBkYXRlZCh0KXtjb25zdCBlPXRoaXMuJCQoIiNtYXRjaC1saXN0LXJlcGVhdCIpO2UmJnRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCIubWF0Y2gtbGlzdC1lbnRyeSIpLmZvckVhY2goKHQ9Pntjb25zdCBuPWUuaXRlbUZvckVsZW1lbnQodCk7dC5zdHlsZS5jb2xvcj10aGlzLl9kZXRlcm1pbmVDb2xvcih0aGlzLl9jb2xvclNjYWxlLG4pfSkpfX07Q0F0LnRlbXBsYXRlPXhlYAogICAgPHRmLWNhcmQtaGVhZGluZyBkaXNwbGF5LW5hbWU9IltbX3RpdGxlRGlzcGxheVN0cmluZ11dIj48L3RmLWNhcmQtaGVhZGluZz4KICAgIDxkaXYgaWQ9InRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXItY29udGFpbmVyIj4KICAgICAgPHRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIKICAgICAgICBpZD0ibG9hZGVyIgogICAgICAgIGFjdGl2ZT0iW1thY3RpdmVdXSIKICAgICAgICBjb2xvci1zY2FsZT0iW1tfY29sb3JTY2FsZV1dIgogICAgICAgIGRhdGEtc2VyaWVzPSJbW19zZXJpZXNOYW1lc11dIgogICAgICAgIGlnbm9yZS15LW91dGxpZXJzPSJbW2lnbm9yZVlPdXRsaWVyc11dIgogICAgICAgIGxvYWQta2V5PSJbW190YWdGaWx0ZXJdXSIKICAgICAgICBkYXRhLXRvLWxvYWQ9IltbcnVuc11dIgogICAgICAgIHJlcXVlc3QtZGF0YT0iW1tfcmVxdWVzdERhdGFdXSIKICAgICAgICBsb2ctc2NhbGUtYWN0aXZlPSJbW19sb2dTY2FsZUFjdGl2ZV1dIgogICAgICAgIGxvYWQtZGF0YS1jYWxsYmFjaz0iW1tfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbigpXV0iCiAgICAgICAgcmVxdWVzdC1tYW5hZ2VyPSJbW3JlcXVlc3RNYW5hZ2VyXV0iCiAgICAgICAgc21vb3RoaW5nLWVuYWJsZWQ9Iltbc21vb3RoaW5nRW5hYmxlZF1dIgogICAgICAgIHNtb290aGluZy13ZWlnaHQ9Iltbc21vb3RoaW5nV2VpZ2h0XV0iCiAgICAgICAgc3ltYm9sLWZ1bmN0aW9uPSJbW19jcmVhdGVTeW1ib2xGdW5jdGlvbigpXV0iCiAgICAgICAgdG9vbHRpcC1zb3J0aW5nLW1ldGhvZD0iW1t0b29sdGlwU29ydGluZ01ldGhvZF1dIgogICAgICAgIHgtdHlwZT0iW1t4VHlwZV1dIgogICAgICA+CiAgICAgIDwvdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlcj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD0iYnV0dG9ucyI+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbgogICAgICAgIHNlbGVjdGVkJD0iW1tfZXhwYW5kZWRdXSIKICAgICAgICBpY29uPSJmdWxsc2NyZWVuIgogICAgICAgIG9uLXRhcD0iX3RvZ2dsZUV4cGFuZGVkIgogICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgc2VsZWN0ZWQkPSJbW19sb2dTY2FsZUFjdGl2ZV1dIgogICAgICAgIGljb249ImxpbmUtd2VpZ2h0IgogICAgICAgIG9uLXRhcD0iX3RvZ2dsZUxvZ1NjYWxlIgogICAgICAgIHRpdGxlPSJUb2dnbGUgeS1heGlzIGxvZyBzY2FsZSIKICAgICAgPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbgogICAgICAgIGljb249InNldHRpbmdzLW92ZXJzY2FuIgogICAgICAgIG9uLXRhcD0iX3Jlc2V0RG9tYWluIgogICAgICAgIHRpdGxlPSJGaXQgZG9tYWluIHRvIGRhdGEiCiAgICAgID48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8c3BhbiBzdHlsZT0iZmxleC1ncm93OiAxIj48L3NwYW4+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG93RG93bmxvYWRMaW5rc11dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJkb3dubG9hZC1saW5rcyI+CiAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudQogICAgICAgICAgICBuby1sYWJlbC1mbG9hdD0idHJ1ZSIKICAgICAgICAgICAgbGFiZWw9InNlcmllcyB0byBkb3dubG9hZCIKICAgICAgICAgICAgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkfX0iCiAgICAgICAgICA+CiAgICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgICA8dGVtcGxhdGUKICAgICAgICAgICAgICAgIGlzPSJkb20tcmVwZWF0IgogICAgICAgICAgICAgICAgaXRlbXM9IltbX3Nlcmllc05hbWVzXV0iCiAgICAgICAgICAgICAgICBhcz0iZGF0YVNlcmllc05hbWUiCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0gbm8tbGFiZWwtZmxvYXQ9InRydWUiCiAgICAgICAgICAgICAgICAgID5bW2RhdGFTZXJpZXNOYW1lXV08L3BhcGVyLWl0ZW0KICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgICA8YQogICAgICAgICAgICBkb3dubG9hZD0iW1tfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkXV0uY3N2IgogICAgICAgICAgICBocmVmPSJbW19jc3ZVcmwoX25hbWVUb0RhdGFTZXJpZXMsIF9kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWQpXV0iCiAgICAgICAgICAgID5DU1Y8L2EKICAgICAgICAgID4KICAgICAgICAgIDxhCiAgICAgICAgICAgIGRvd25sb2FkPSJbW19kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWRdXS5qc29uIgogICAgICAgICAgICBocmVmPSJbW19qc29uVXJsKF9uYW1lVG9EYXRhU2VyaWVzLCBfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkKV1dIgogICAgICAgICAgICA+SlNPTjwvYQogICAgICAgICAgPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJtYXRjaGVzLWNvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9Im1hdGNoZXMtbGlzdC10aXRsZSI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zZXJpZXNOYW1lcy5sZW5ndGhdXSI+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICAgICAgaWNvbj0iW1tfZ2V0VG9nZ2xlTWF0Y2hlc0ljb24oX21hdGNoZXNMaXN0T3BlbmVkKV1dIgogICAgICAgICAgICBvbi1jbGljaz0iX3RvZ2dsZU1hdGNoZXNPcGVuIgogICAgICAgICAgICBjbGFzcz0idG9nZ2xlLW1hdGNoZXMtYnV0dG9uIgogICAgICAgICAgPgogICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICA8c3BhbiBjbGFzcz0ibWF0Y2hlcy10ZXh0Ij4gTWF0Y2hlcyAoW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0pIDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0iPgogICAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0iW1tfbWF0Y2hlc0xpc3RPcGVuZWRdXSI+CiAgICAgICAgICA8ZGl2IGlkPSJtYXRjaGVzLWxpc3QiPgogICAgICAgICAgICA8dGVtcGxhdGUKICAgICAgICAgICAgICBpcz0iZG9tLXJlcGVhdCIKICAgICAgICAgICAgICBpdGVtcz0iW1tfc2VyaWVzTmFtZXNdXSIKICAgICAgICAgICAgICBhcz0ic2VyaWVzTmFtZSIKICAgICAgICAgICAgICBpZD0ibWF0Y2gtbGlzdC1yZXBlYXQiCiAgICAgICAgICAgICAgb24tZG9tLWNoYW5nZT0iX21hdGNoTGlzdEVudHJ5Q29sb3JVcGRhdGVkIgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWF0Y2gtbGlzdC1lbnRyeSI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibWF0Y2gtZW50cnktc3ltYm9sIj4KICAgICAgICAgICAgICAgICAgW1tfZGV0ZXJtaW5lU3ltYm9sKF9uYW1lVG9EYXRhU2VyaWVzLCBzZXJpZXNOYW1lKV1dCiAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICBbW3Nlcmllc05hbWVdXQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CgogICAgPHN0eWxlIGluY2x1ZGU9InRmLWN1c3RvbS1zY2FsYXItY2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgI21hdGNoZXMtbGlzdC10aXRsZSB7CiAgICAgICAgbWFyZ2luOiAxMHB4IDAgNXB4IDA7CiAgICAgIH0KCiAgICAgICNtYXRjaGVzLWxpc3QgewogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIC5tYXRjaC1saXN0LWVudHJ5IHsKICAgICAgICBtYXJnaW46IDAgMCA1cHggMDsKICAgICAgfQoKICAgICAgLm1hdGNoLWVudHJ5LXN5bWJvbCB7CiAgICAgICAgZm9udC1mYW1pbHk6IGFyaWFsLCBzYW5zLXNlcmlmOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgfQoKICAgICAgLm1hdGNoZXMtdGV4dCB7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxDQXQucHJvdG90eXBlLCJydW5zIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLENBdC5wcm90b3R5cGUsInhUeXBlIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sQ0F0LnByb3RvdHlwZSwiYWN0aXZlIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLENBdC5wcm90b3R5cGUsInRpdGxlIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxDQXQucHJvdG90eXBlLCJ0YWdSZWdleGVzIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sQ0F0LnByb3RvdHlwZSwiaWdub3JlWU91dGxpZXJzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLGJyKV0sQ0F0LnByb3RvdHlwZSwicmVxdWVzdE1hbmFnZXIiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxDQXQucHJvdG90eXBlLCJzaG93RG93bmxvYWRMaW5rcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLENBdC5wcm90b3R5cGUsInNtb290aGluZ0VuYWJsZWQiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sQ0F0LnByb3RvdHlwZSwic21vb3RoaW5nV2VpZ2h0Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLENBdC5wcm90b3R5cGUsInRhZ01ldGFkYXRhIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLENBdC5wcm90b3R5cGUsInRvb2x0aXBTb3J0aW5nTWV0aG9kIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLHhBdCldLENBdC5wcm90b3R5cGUsIl9jb2xvclNjYWxlIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLENBdC5wcm90b3R5cGUsIl9uYW1lVG9EYXRhU2VyaWVzIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLENBdC5wcm90b3R5cGUsIl9leHBhbmRlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLENBdC5wcm90b3R5cGUsIl9sb2dTY2FsZUFjdGl2ZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbildLENBdC5wcm90b3R5cGUsIl9yZXF1ZXN0RGF0YSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxDQXQucHJvdG90eXBlLCJfcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXgiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxDQXQucHJvdG90eXBlLCJfbWF0Y2hlc0xpc3RPcGVuZWQiLHZvaWQgMCksdChbYSgiX25hbWVUb0RhdGFTZXJpZXMiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLENBdC5wcm90b3R5cGUsIl91cGRhdGVDaGFydCIsbnVsbCksdChbcygiX25hbWVUb0RhdGFTZXJpZXMiLCJydW5zIiksZSgiZGVzaWduOnR5cGUiLE9iamVjdCksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sQ0F0LnByb3RvdHlwZSwiX3Nlcmllc05hbWVzIixudWxsKSx0KFthKCJfdGFnRmlsdGVyIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxDQXQucHJvdG90eXBlLCJfcmVmcmVzaERhdGFTZXJpZXMiLG51bGwpLHQoW3MoInRhZ1JlZ2V4ZXMiKSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxDQXQucHJvdG90eXBlLCJfdGFnRmlsdGVyIixudWxsKSx0KFtzKCJ0aXRsZSIpLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLENBdC5wcm90b3R5cGUsIl90aXRsZURpc3BsYXlTdHJpbmciLG51bGwpLENBdD10KFtpKCJ0Zi1jdXN0b20tc2NhbGFyLW11bHRpLWxpbmUtY2hhcnQtY2FyZCIpXSxDQXQpO2xldCBBQXQ9Y2xhc3MgZXh0ZW5kcyB3ZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5fcmVxdWVzdE1hbmFnZXI9bmV3IGJyKDUwKSx0aGlzLl9jYW5jZWxsZXI9bmV3IHhPLHRoaXMuX3Nob3dEb3dubG9hZExpbmtzPVFzKCJfc2hvd0Rvd25sb2FkTGlua3MiLHtkZWZhdWx0VmFsdWU6ITEsdXNlTG9jYWxTdG9yYWdlOiEwfSkuY2FsbCh0aGlzKSx0aGlzLl9zbW9vdGhpbmdXZWlnaHQ9cmwoIl9zbW9vdGhpbmdXZWlnaHQiLHtkZWZhdWx0VmFsdWU6LjZ9KS5jYWxsKHRoaXMpLHRoaXMuX2lnbm9yZVlPdXRsaWVycz1RcygiX2lnbm9yZVlPdXRsaWVycyIse2RlZmF1bHRWYWx1ZTohMCx1c2VMb2NhbFN0b3JhZ2U6ITB9KS5jYWxsKHRoaXMpLHRoaXMuX3hUeXBlPSJzdGVwIix0aGlzLl9hY3RpdmU9ITAsdGhpcy5yZWxvYWRPblJlYWR5PSEwLHRoaXMuX3Nob3dEb3dubG9hZExpbmtzT2JzZXJ2ZXI9dGwoIl9zaG93RG93bmxvYWRMaW5rcyIse2RlZmF1bHRWYWx1ZTohMSx1c2VMb2NhbFN0b3JhZ2U6ITB9KSx0aGlzLl9zbW9vdGhpbmdXZWlnaHRPYnNlcnZlcj1vbCgiX3Ntb290aGluZ1dlaWdodCIse2RlZmF1bHRWYWx1ZTouNn0pLHRoaXMuX2lnbm9yZVlPdXRsaWVyc09ic2VydmVyPXRsKCJfaWdub3JlWU91dGxpZXJzIix7ZGVmYXVsdFZhbHVlOiEwLHVzZUxvY2FsU3RvcmFnZTohMH0pfXJlYWR5KCl7c3VwZXIucmVhZHkoKSx0aGlzLnJlbG9hZE9uUmVhZHkmJnRoaXMucmVsb2FkKCl9cmVsb2FkKCl7Y29uc3QgdD1FcigpLnBsdWdpbnNMaXN0aW5nKCksZT10aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoKHQ9Pnt0LmNhbmNlbGxlZHx8KHRoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwhdC52YWx1ZS5jdXN0b21fc2NhbGFycyksdGhpcy5fZGF0YU5vdEZvdW5kfHx0aGlzLl9yZXRyaWV2ZUxheW91dEFuZERhdGEoKSl9KSk7dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh0KS50aGVuKGUpfV9yZWxvYWRDaGFydHMoKXt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtY3VzdG9tLXNjYWxhci1tYXJnaW4tY2hhcnQtY2FyZCwgdGYtY3VzdG9tLXNjYWxhci1tdWx0aS1saW5lLWNoYXJ0LWNhcmQiKS5mb3JFYWNoKCh0PT57dC5yZWxvYWQoKX0pKX1fcmV0cmlldmVMYXlvdXRBbmREYXRhKCl7Y29uc3QgdD1FcigpLnBsdWdpblJvdXRlKCJjdXN0b21fc2NhbGFycyIsIi9sYXlvdXQiKSxlPXRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZSgodD0+e3QuY2FuY2VsbGVkfHwodGhpcy5zZXQoIl9sYXlvdXQiLHQudmFsdWUpLHRoaXMuX2RhdGFOb3RGb3VuZHx8dGhpcy5fcmVsb2FkQ2hhcnRzKCkpfSkpO3RoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QodCkudGhlbihlKX1nZXQgX3Ntb290aGluZ0VuYWJsZWQoKXtyZXR1cm4gdGhpcy5fc21vb3RoaW5nV2VpZ2h0PjB9Z2V0IF9jYXRlZ29yaWVzKCl7dmFyIHQ9dGhpcy5fbGF5b3V0O2lmKCF0LmNhdGVnb3J5KXJldHVybltdO2xldCBlPSExO3RoaXMuX29wZW5lZENhdGVnb3JpZXN8fChlPSEwLHRoaXMuX29wZW5lZENhdGVnb3JpZXM9e30pO3JldHVybiB0LmNhdGVnb3J5Lm1hcCgodD0+KGUmJiF0LmNsb3NlZCYmKHRoaXMuX29wZW5lZENhdGVnb3JpZXNbdC50aXRsZV09ITApLHtuYW1lOnQudGl0bGUsaXRlbXM6dC5jaGFydCxtZXRhZGF0YTp7dHlwZTpBci5QUkVGSVhfR1JPVVAsb3BlbmVkOiEhdGhpcy5fb3BlbmVkQ2F0ZWdvcmllc1t0LnRpdGxlXX19KSkpfV9jYXRlZ29yeU9wZW5lZFRvZ2dsZWQodCl7Y29uc3QgZT10LnRhcmdldDtlLm9wZW5lZD90aGlzLl9vcGVuZWRDYXRlZ29yaWVzW2UuY2F0ZWdvcnkubmFtZV09ITA6ZGVsZXRlIHRoaXMuX29wZW5lZENhdGVnb3JpZXNbZS5jYXRlZ29yeS5uYW1lXX19O0FBdC50ZW1wbGF0ZT14ZWAKICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZXR0aW5ncyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsaW5lLWl0ZW0iPgogICAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjaGVja2VkPSJ7e19zaG93RG93bmxvYWRMaW5rc319IgogICAgICAgICAgICAgICAgPlNob3cgZGF0YSBkb3dubG9hZCBsaW5rczwvcGFwZXItY2hlY2tib3gKICAgICAgICAgICAgICA+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsaW5lLWl0ZW0iPgogICAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjaGVja2VkPSJ7e19pZ25vcmVZT3V0bGllcnN9fSIKICAgICAgICAgICAgICAgID5JZ25vcmUgb3V0bGllcnMgaW4gY2hhcnQgc2NhbGluZzwvcGFwZXItY2hlY2tib3gKICAgICAgICAgICAgICA+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGlkPSJ0b29sdGlwLXNvcnRpbmciPgogICAgICAgICAgICAgIDxkaXYgaWQ9InRvb2x0aXAtc29ydGluZy1sYWJlbCI+VG9vbHRpcCBzb3J0aW5nIG1ldGhvZDo8L2Rpdj4KICAgICAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudQogICAgICAgICAgICAgICAgbm8tbGFiZWwtZmxvYXQ9IiIKICAgICAgICAgICAgICAgIHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X3Rvb2x0aXBTb3J0aW5nTWV0aG9kfX0iCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3gKICAgICAgICAgICAgICAgICAgY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiCiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkPSIwIgogICAgICAgICAgICAgICAgICBzbG90PSJkcm9wZG93bi1jb250ZW50IgogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5kZWZhdWx0PC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5kZXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5hc2NlbmRpbmc8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtPm5lYXJlc3Q8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgICAgPHRmLXNtb290aGluZy1pbnB1dAogICAgICAgICAgICAgIHdlaWdodD0ie3tfc21vb3RoaW5nV2VpZ2h0fX0iCiAgICAgICAgICAgICAgc3RlcD0iMC4wMDEiCiAgICAgICAgICAgICAgbWluPSIwIgogICAgICAgICAgICAgIG1heD0iMSIKICAgICAgICAgICAgPjwvdGYtc21vb3RoaW5nLWlucHV0PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yCiAgICAgICAgICAgICAgaWQ9IngtdHlwZS1zZWxlY3RvciIKICAgICAgICAgICAgICBuYW1lPSJIb3Jpem9udGFsIEF4aXMiCiAgICAgICAgICAgICAgc2VsZWN0ZWQtaWQ9Int7X3hUeXBlfX0iCiAgICAgICAgICAgID4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJzdGVwIj5zdGVwPC9wYXBlci1idXR0b24KICAgICAgICAgICAgICA+PCEtLQogICAgICAgICAgICAtLT48cGFwZXItYnV0dG9uIGlkPSJyZWxhdGl2ZSI+cmVsYXRpdmU8L3BhcGVyLWJ1dHRvbgogICAgICAgICAgICAgID48IS0tCiAgICAgICAgICAgIC0tPjxwYXBlci1idXR0b24gaWQ9IndhbGxfdGltZSI+d2FsbDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiBydW5zLXNlbGVjdG9yIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij4KICAgICAgICAgIDwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIiBpZD0iY2F0ZWdvcmllcy1jb250YWluZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPlRoZSBjdXN0b20gc2NhbGFycyBkYXNoYm9hcmQgaXMgaW5hY3RpdmUuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOjwvcD4KICAgICAgICAgICAgPG9sPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW4ndCBsYWlkIG91dCB0aGUgZGFzaGJvYXJkLjwvbGk+CiAgICAgICAgICAgICAgPGxpPllvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgc2NhbGFyIGRhdGEgdG8geW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L29sPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgVG8gbGF5IG91dCB0aGUgZGFzaGJvYXJkLCBwYXNzIGEgPGNvZGU+TGF5b3V0PC9jb2RlPiBwcm90b2J1ZmZlcgogICAgICAgICAgICAgIHRvIHRoZSA8Y29kZT5zZXRfbGF5b3V0PC9jb2RlPiBtZXRob2QuIEZvciBleGFtcGxlLAogICAgICAgICAgICA8L3A+CiAgICAgICAgICAgIDxwcmU+CmZyb20gdGVuc29yYm9hcmQgaW1wb3J0IHN1bW1hcnkKZnJvbSB0ZW5zb3Jib2FyZC5wbHVnaW5zLmN1c3RvbV9zY2FsYXIgaW1wb3J0IGxheW91dF9wYjIKLi4uCiMgVGhpcyBhY3Rpb24gZG9lcyBub3QgaGF2ZSB0byBiZSBwZXJmb3JtZWQgYXQgZXZlcnkgc3RlcCwgc28gdGhlIGFjdGlvbiBpcyBub3QKIyB0YWtlbiBjYXJlIG9mIGJ5IGFuIG9wIGluIHRoZSBncmFwaC4gV2Ugb25seSBuZWVkIHRvIHNwZWNpZnkgdGhlIGxheW91dCBvbmNlCiMgKGluc3RlYWQgb2YgcGVyIHN0ZXApLgpsYXlvdXRfc3VtbWFyeSA9IHN1bW1hcnlfbGliLmN1c3RvbV9zY2FsYXJfcGIobGF5b3V0X3BiMi5MYXlvdXQoCiAgY2F0ZWdvcnk9WwogICAgbGF5b3V0X3BiMi5DYXRlZ29yeSgKICAgICAgdGl0bGU9J2xvc3NlcycsCiAgICAgIGNoYXJ0PVsKICAgICAgICAgIGxheW91dF9wYjIuQ2hhcnQoCiAgICAgICAgICAgICAgdGl0bGU9J2xvc3NlcycsCiAgICAgICAgICAgICAgbXVsdGlsaW5lPWxheW91dF9wYjIuTXVsdGlsaW5lQ2hhcnRDb250ZW50KAogICAgICAgICAgICAgICAgdGFnPVtyJ2xvc3MuKiddLAogICAgICAgICAgICAgICkpLAogICAgICAgICAgbGF5b3V0X3BiMi5DaGFydCgKICAgICAgICAgICAgICB0aXRsZT0nYmF6JywKICAgICAgICAgICAgICBtYXJnaW49bGF5b3V0X3BiMi5NYXJnaW5DaGFydENvbnRlbnQoCiAgICAgICAgICAgICAgICBzZXJpZXM9WwogICAgICAgICAgICAgICAgICBsYXlvdXRfcGIyLk1hcmdpbkNoYXJ0Q29udGVudC5TZXJpZXMoCiAgICAgICAgICAgICAgICAgICAgdmFsdWU9J2xvc3MvYmF6L3NjYWxhcl9zdW1tYXJ5JywKICAgICAgICAgICAgICAgICAgICBsb3dlcj0nYmF6X2xvd2VyL2Jhei9zY2FsYXJfc3VtbWFyeScsCiAgICAgICAgICAgICAgICAgICAgdXBwZXI9J2Jhel91cHBlci9iYXovc2NhbGFyX3N1bW1hcnknKSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgKSksCiAgICAgIF0pLAogICAgbGF5b3V0X3BiMi5DYXRlZ29yeSgKICAgICAgdGl0bGU9J3RyaWcgZnVuY3Rpb25zJywKICAgICAgY2hhcnQ9WwogICAgICAgICAgbGF5b3V0X3BiMi5DaGFydCgKICAgICAgICAgICAgICB0aXRsZT0nd2F2ZSB0cmlnIGZ1bmN0aW9ucycsCiAgICAgICAgICAgICAgbXVsdGlsaW5lPWxheW91dF9wYjIuTXVsdGlsaW5lQ2hhcnRDb250ZW50KAogICAgICAgICAgICAgICAgdGFnPVtyJ3RyaWdGdW5jdGlvbnMvY29zaW5lJywgcid0cmlnRnVuY3Rpb25zL3NpbmUnXSwKICAgICAgICAgICAgICApKSwKICAgICAgICAgICMgVGhlIHJhbmdlIG9mIHRhbmdlbnQgaXMgZGlmZmVyZW50LiBMZXQncyBnaXZlIGl0IGl0cyBvd24gY2hhcnQuCiAgICAgICAgICBsYXlvdXRfcGIyLkNoYXJ0KAogICAgICAgICAgICAgIHRpdGxlPSd0YW4nLAogICAgICAgICAgICAgIG11bHRpbGluZT1sYXlvdXRfcGIyLk11bHRpbGluZUNoYXJ0Q29udGVudCgKICAgICAgICAgICAgICAgIHRhZz1bcid0cmlnRnVuY3Rpb25zL3RhbmdlbnQnXSwKICAgICAgICAgICAgICApKSwKICAgICAgXSwKICAgICAgIyBUaGlzIGNhdGVnb3J5IHdlIGNhcmUgbGVzcyBhYm91dC4gTGV0J3MgbWFrZSBpdCBpbml0aWFsbHkgY2xvc2VkLgogICAgICBjbG9zZWQ9VHJ1ZSksCiAgXSkpCndyaXRlci5hZGRfc3VtbWFyeShsYXlvdXRfc3VtbWFyeSkKPC9wcmUKICAgICAgICAgICAgPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiCiAgICAgICAgICAgICAgICA+UkVBRE1FPC9hCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIgogICAgICAgICAgICAgICAgPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hCiAgICAgICAgICAgICAgPi4KICAgICAgICAgICAgPC9wPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jYXRlZ29yaWVzXV0iIGFzPSJjYXRlZ29yeSI+CiAgICAgICAgICAgIDx0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldwogICAgICAgICAgICAgIGFzPSJjaGFydCIKICAgICAgICAgICAgICBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIgogICAgICAgICAgICAgIGRpc2FibGUtcGFnaW5hdGlvbgogICAgICAgICAgICAgIGluaXRpYWwtb3BlbmVkPSJbW2NhdGVnb3J5Lm1ldGFkYXRhLm9wZW5lZF1dIgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2NoYXJ0Lm11bHRpbGluZV1dIj4KICAgICAgICAgICAgICAgICAgPHRmLWN1c3RvbS1zY2FsYXItbXVsdGktbGluZS1jaGFydC1jYXJkCiAgICAgICAgICAgICAgICAgICAgYWN0aXZlPSJbW2FjdGl2ZV1dIgogICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIKICAgICAgICAgICAgICAgICAgICBydW5zPSJbW19zZWxlY3RlZFJ1bnNdXSIKICAgICAgICAgICAgICAgICAgICB0aXRsZT0iW1tjaGFydC50aXRsZV1dIgogICAgICAgICAgICAgICAgICAgIHgtdHlwZT0iW1tfeFR5cGVdXSIKICAgICAgICAgICAgICAgICAgICBzbW9vdGhpbmctZW5hYmxlZD0iW1tfc21vb3RoaW5nRW5hYmxlZF1dIgogICAgICAgICAgICAgICAgICAgIHNtb290aGluZy13ZWlnaHQ9IltbX3Ntb290aGluZ1dlaWdodF1dIgogICAgICAgICAgICAgICAgICAgIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIKICAgICAgICAgICAgICAgICAgICBpZ25vcmUteS1vdXRsaWVycz0iW1tfaWdub3JlWU91dGxpZXJzXV0iCiAgICAgICAgICAgICAgICAgICAgc2hvdy1kb3dubG9hZC1saW5rcz0iW1tfc2hvd0Rvd25sb2FkTGlua3NdXSIKICAgICAgICAgICAgICAgICAgICB0YWctcmVnZXhlcz0iW1tjaGFydC5tdWx0aWxpbmUudGFnXV0iCiAgICAgICAgICAgICAgICAgID48L3RmLWN1c3RvbS1zY2FsYXItbXVsdGktbGluZS1jaGFydC1jYXJkPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tjaGFydC5tYXJnaW5dXSI+CiAgICAgICAgICAgICAgICAgIDx0Zi1jdXN0b20tc2NhbGFyLW1hcmdpbi1jaGFydC1jYXJkCiAgICAgICAgICAgICAgICAgICAgYWN0aXZlPSJbW2FjdGl2ZV1dIgogICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIKICAgICAgICAgICAgICAgICAgICBydW5zPSJbW19zZWxlY3RlZFJ1bnNdXSIKICAgICAgICAgICAgICAgICAgICB0aXRsZT0iW1tjaGFydC50aXRsZV1dIgogICAgICAgICAgICAgICAgICAgIHgtdHlwZT0iW1tfeFR5cGVdXSIKICAgICAgICAgICAgICAgICAgICB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iCiAgICAgICAgICAgICAgICAgICAgaWdub3JlLXktb3V0bGllcnM9IltbX2lnbm9yZVlPdXRsaWVyc11dIgogICAgICAgICAgICAgICAgICAgIHNob3ctZG93bmxvYWQtbGlua3M9IltbX3Nob3dEb3dubG9hZExpbmtzXV0iCiAgICAgICAgICAgICAgICAgICAgbWFyZ2luLWNoYXJ0LXNlcmllcz0iW1tjaGFydC5tYXJnaW4uc2VyaWVzXV0iCiAgICAgICAgICAgICAgICAgID48L3RmLWN1c3RvbS1zY2FsYXItbWFyZ2luLWNoYXJ0LWNhcmQ+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgICN0b29sdGlwLXNvcnRpbmcgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLXRvcDogMTVweDsKICAgICAgfQogICAgICAjdG9vbHRpcC1zb3J0aW5nIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICB3aWR0aDogMTA1cHg7CiAgICAgIH0KICAgICAgLmxpbmUtaXRlbSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZy10b3A6IDVweDsKICAgICAgfQogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLGJyKV0sQUF0LnByb3RvdHlwZSwiX3JlcXVlc3RNYW5hZ2VyIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLHhPKV0sQUF0LnByb3RvdHlwZSwiX2NhbmNlbGxlciIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sQUF0LnByb3RvdHlwZSwiX3NlbGVjdGVkUnVucyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwLG9ic2VydmVyOiJfc2hvd0Rvd25sb2FkTGlua3NPYnNlcnZlciJ9KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLEFBdC5wcm90b3R5cGUsIl9zaG93RG93bmxvYWRMaW5rcyIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcixub3RpZnk6ITAsb2JzZXJ2ZXI6Il9zbW9vdGhpbmdXZWlnaHRPYnNlcnZlciJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sQUF0LnByb3RvdHlwZSwiX3Ntb290aGluZ1dlaWdodCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9pZ25vcmVZT3V0bGllcnNPYnNlcnZlciJ9KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLEFBdC5wcm90b3R5cGUsIl9pZ25vcmVZT3V0bGllcnMiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sQUF0LnByb3RvdHlwZSwiX3hUeXBlIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEFBdC5wcm90b3R5cGUsIl9sYXlvdXQiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxBQXQucHJvdG90eXBlLCJfZGF0YU5vdEZvdW5kIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEFBdC5wcm90b3R5cGUsIl9vcGVuZWRDYXRlZ29yaWVzIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sQUF0LnByb3RvdHlwZSwiX2FjdGl2ZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLEFBdC5wcm90b3R5cGUsInJlbG9hZE9uUmVhZHkiLHZvaWQgMCksdChbcygiX3Ntb290aGluZ1dlaWdodCIpLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxBQXQucHJvdG90eXBlLCJfc21vb3RoaW5nRW5hYmxlZCIsbnVsbCksdChbcygiX2xheW91dCIpLGUoImRlc2lnbjp0eXBlIixBcnJheSksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sQUF0LnByb3RvdHlwZSwiX2NhdGVnb3JpZXMiLG51bGwpLEFBdD10KFtpKCJ0Zi1jdXN0b20tc2NhbGFyLWRhc2hib2FyZCIpXSxBQXQpO2NsYXNzIGtBdHtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMucnVuMmRhdGFzZXRzPXt9LHRoaXMuY29sb3JTY2FsZT1lLHRoaXMuYnVpbGRDaGFydCh0KX1nZXREYXRhc2V0KHQpe3JldHVybiB2b2lkIDA9PT10aGlzLnJ1bjJkYXRhc2V0c1t0XSYmKHRoaXMucnVuMmRhdGFzZXRzW3RdPW5ldyBOTy5EYXRhc2V0KFtdLHtydW46dH0pKSx0aGlzLnJ1bjJkYXRhc2V0c1t0XX1idWlsZENoYXJ0KHQpe3RoaXMub3V0ZXImJnRoaXMub3V0ZXIuZGVzdHJveSgpO2xldCBlPWtDdCh0KTt0aGlzLnhBY2Nlc3Nvcj1lLmFjY2Vzc29yLHRoaXMueFNjYWxlPWUuc2NhbGUsdGhpcy54QXhpcz1lLmF4aXMsdGhpcy54QXhpcy5tYXJnaW4oMCksdGhpcy54QXhpcy50aWNrTGFiZWxQYWRkaW5nKDMpLHRoaXMueVNjYWxlPW5ldyBOTy5TY2FsZXMuTGluZWFyLHRoaXMueUF4aXM9bmV3IE5PLkF4ZXMuTnVtZXJpYyh0aGlzLnlTY2FsZSwibGVmdCIpO2xldCBuPVNDdCgzKTt0aGlzLnlBeGlzLm1hcmdpbigwKS50aWNrTGFiZWxQYWRkaW5nKDUpLmZvcm1hdHRlcihuKSx0aGlzLnlBeGlzLnVzZXNUZXh0V2lkdGhBcHByb3hpbWF0aW9uKCEwKTtsZXQgaT10aGlzLmJ1aWxkUGxvdCh0aGlzLnhBY2Nlc3Nvcix0aGlzLnhTY2FsZSx0aGlzLnlTY2FsZSk7dGhpcy5ncmlkbGluZXM9bmV3IE5PLkNvbXBvbmVudHMuR3JpZGxpbmVzKHRoaXMueFNjYWxlLHRoaXMueVNjYWxlKSx0aGlzLmNlbnRlcj1uZXcgTk8uQ29tcG9uZW50cy5Hcm91cChbdGhpcy5ncmlkbGluZXMsaV0pLHRoaXMub3V0ZXI9bmV3IE5PLkNvbXBvbmVudHMuVGFibGUoW1t0aGlzLnlBeGlzLHRoaXMuY2VudGVyXSxbbnVsbCx0aGlzLnhBeGlzXV0pfWJ1aWxkUGxvdCh0LGUsbil7bGV0IGk9WzAsMjI4LDE1ODcsMzA4NSw1ZTMsNjkxNSw4NDEzLDk3NzIsMWU0XSxyPUNlLmV4cG9ydHMucmFuZ2UoaS5sZW5ndGgtMSkubWFwKCh0PT4oaVt0KzFdLWlbdF0pLzI1MDApKSxvPWkubWFwKCgodCxlKT0+dD0+dFtlXVsxXSkpLGE9b1s0XSxzPUNlLmV4cG9ydHMucmFuZ2Uoby5sZW5ndGgtMSkubWFwKChpPT57bGV0IGE9bmV3IE5PLlBsb3RzLkFyZWE7YS54KHQsZSk7bGV0IHM9aT40P29baV06b1tpKzFdO3JldHVybiBhLnkoaT40P29baSsxXTpvW2ldLG4pLGEueTAocyksYS5hdHRyKCJmaWxsIiwoKHQsZSxuKT0+dGhpcy5jb2xvclNjYWxlLnNjYWxlKG4ubWV0YWRhdGEoKS5ydW4pKSksYS5hdHRyKCJzdHJva2UiLCgodCxlLG4pPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUobi5tZXRhZGF0YSgpLnJ1bikpKSxhLmF0dHIoInN0cm9rZS13ZWlnaHQiLCgodCxlLG4pPT4iMC41cHgiKSksYS5hdHRyKCJzdHJva2Utb3BhY2l0eSIsKCgpPT5yW2ldKSksYS5hdHRyKCJmaWxsLW9wYWNpdHkiLCgoKT0+cltpXSkpLGF9KSksbD1uZXcgTk8uUGxvdHMuTGluZTtyZXR1cm4gbC54KHQsZSksbC55KGEsbiksbC5hdHRyKCJzdHJva2UiLCgodCxlLG4pPT50aGlzLmNvbG9yU2NhbGUuc2NhbGUobi5ydW4pKSksdGhpcy5wbG90cz1zLG5ldyBOTy5Db21wb25lbnRzLkdyb3VwKHMpfXNldFZpc2libGVTZXJpZXModCl7dGhpcy5ydW5zPXQ7bGV0IGU9dC5tYXAoKHQ9PnRoaXMuZ2V0RGF0YXNldCh0KSkpO3RoaXMucGxvdHMuZm9yRWFjaCgodD0+dC5kYXRhc2V0cyhlKSkpfXNldFNlcmllc0RhdGEodCxlKXt0aGlzLmdldERhdGFzZXQodCkuZGF0YShlKX1yZW5kZXJUbyh0KXt0aGlzLnRhcmdldFNWRz10LHRoaXMub3V0ZXIucmVuZGVyVG8odCl9cmVkcmF3KCl7dGhpcy5vdXRlci5yZWRyYXcoKX1kZXN0cm95KCl7dGhpcy5vdXRlci5kZXN0cm95KCl9fWxldCBMQXQ9Y2xhc3MgZXh0ZW5kcyhjcih3ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvbG9yU2NhbGU9KG5ldyBOTy5TY2FsZXMuQ29sb3IpLnJhbmdlKGpBLnNsaWNlKCkpLHRoaXMueFR5cGU9InN0ZXAiLHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZT1bXSx0aGlzLl9zZXJpZXNEYXRhQ2FjaGU9e30sdGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkPW51bGx9c2V0VmlzaWJsZVNlcmllcyh0KXt0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGU9dCx0aGlzLl9jaGFydCYmKHRoaXMuX2NoYXJ0LnNldFZpc2libGVTZXJpZXModCksdGhpcy5yZWRyYXcoKSl9c2V0U2VyaWVzRGF0YSh0LGUpe3RoaXMuX3Nlcmllc0RhdGFDYWNoZVt0XT1lLHRoaXMuX2NoYXJ0JiZ0aGlzLl9jaGFydC5zZXRTZXJpZXNEYXRhKHQsZSl9cmVkcmF3KCl7dGhpcy5fY2hhcnQucmVkcmF3KCl9X21ha2VDaGFydCgpe3ZhciB0PXRoaXMueFR5cGUsZT10aGlzLmNvbG9yU2NhbGUsbj10aGlzLl9hdHRhY2hlZDtudWxsPT09dGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkJiZ0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZCksdGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkPXRoaXMuYXN5bmMoKGZ1bmN0aW9uKCl7aWYodGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkPW51bGwsbil7dGhpcy5fY2hhcnQmJnRoaXMuX2NoYXJ0LmRlc3Ryb3koKTt2YXIgaT1uZXcga0F0KHQsZSkscj1EdSh0aGlzLiQuY2hhcnRkaXYpO2kucmVuZGVyVG8ociksdGhpcy5fY2hhcnQ9aX19KSwzNTApfV9yZWxvYWRGcm9tQ2FjaGUoKXt0aGlzLl9jaGFydCYmKHRoaXMuX2NoYXJ0LnNldFZpc2libGVTZXJpZXModGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlKSx0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGUuZm9yRWFjaChmdW5jdGlvbih0KXt0aGlzLl9jaGFydC5zZXRTZXJpZXNEYXRhKHQsdGhpcy5fc2VyaWVzRGF0YUNhY2hlW3RdfHxbXSl9LmJpbmQodGhpcykpKX1hdHRhY2hlZCgpe3RoaXMuX2F0dGFjaGVkPSEwfWRldGFjaGVkKCl7dGhpcy5fYXR0YWNoZWQ9ITF9fTtMQXQudGVtcGxhdGU9eGVgCiAgICA8c3R5bGUgaW5jbHVkZT0icGxvdHRhYmxlLXN0eWxlIj48L3N0eWxlPgogICAgPGRpdiBpZD0iY2hhcnRkaXYiPjwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgICNjaGFydGRpdiB7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgfQogICAgICAucGxvdHRhYmxlIC5heGlzIHRleHQgewogICAgICAgIGZpbGw6IGN1cnJlbnRDb2xvcjsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE5PLlNjYWxlcy5Db2xvcildLExBdC5wcm90b3R5cGUsImNvbG9yU2NhbGUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sTEF0LnByb3RvdHlwZSwieFR5cGUiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxMQXQucHJvdG90eXBlLCJfYXR0YWNoZWQiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsa0F0KV0sTEF0LnByb3RvdHlwZSwiX2NoYXJ0Iix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxMQXQucHJvdG90eXBlLCJfdmlzaWJsZVNlcmllc0NhY2hlIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLExBdC5wcm90b3R5cGUsIl9zZXJpZXNEYXRhQ2FjaGUiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sTEF0LnByb3RvdHlwZSwiX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZCIsdm9pZCAwKSx0KFthKCJ4VHlwZSIsImNvbG9yU2NhbGUiLCJfYXR0YWNoZWQiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLExBdC5wcm90b3R5cGUsIl9tYWtlQ2hhcnQiLG51bGwpLHQoW2EoIl9jaGFydCIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sTEF0LnByb3RvdHlwZSwiX3JlbG9hZEZyb21DYWNoZSIsbnVsbCksTEF0PXQoW2koInZ6LWRpc3RyaWJ1dGlvbi1jaGFydCIpXSxMQXQpO2xldCBQQXQ9Y2xhc3MgZXh0ZW5kcyhiQ3QoY3Iod2UpKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuZ2V0RGF0YUxvYWROYW1lPSh7cnVuOnR9KT0+dCx0aGlzLnJlcXVlc3REYXRhPSh0LGUsbik9Pntjb25zdCBpPUVyKCkucGx1Z2luUm91dGUoImRpc3RyaWJ1dGlvbnMiLCIvZGlzdHJpYnV0aW9ucyIpO1Byb21pc2UuYWxsKHQubWFwKCh0PT57Y29uc3Qgbj1QTyhpLHt0YWc6dC50YWcscnVuOnQucnVufSk7cmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdChuKS50aGVuKChuPT57ZSh7aXRlbTp0LGRhdGE6bn0pfSkpfSkpKS5maW5hbGx5KCgoKT0+e24oKX0pKX0sdGhpcy5sb2FkRGF0YUNhbGxiYWNrPSh0LGUsbik9Pntjb25zdCBpPW4ubWFwKCh0PT57Y29uc3RbZSxuLGldPXQ7cmV0dXJuIGkud2FsbF90aW1lPW5ldyBEYXRlKDFlMyplKSxpLnN0ZXA9bixpfSkpLHI9dGhpcy5nZXREYXRhTG9hZE5hbWUoZSk7dGhpcy4kLmNoYXJ0LnNldFNlcmllc0RhdGEocixpKSx0aGlzLiQuY2hhcnQuc2V0VmlzaWJsZVNlcmllcyhbcl0pfSx0aGlzLl9jb2xvclNjYWxlPXtzY2FsZTpfT30sdGhpcy5fZXhwYW5kZWQ9ITEsdGhpcy5fY2FuY2VsbGVyPW5ldyB4T31fcmVsb2FkT25SdW5UYWdDaGFuZ2UoKXt0aGlzLnJlbG9hZCgpfV91cGRhdGVEYXRhVG9Mb2FkKCl7dGhpcy5kYXRhVG9Mb2FkPVt7cnVuOnRoaXMucnVuLHRhZzp0aGlzLnRhZ31dfWdldCBfcnVuQ29sb3IoKXtyZXR1cm4gdGhpcy5fY29sb3JTY2FsZS5zY2FsZSh0aGlzLnJ1bil9cmVkcmF3KCl7dGhpcy4kLmNoYXJ0LnJlZHJhdygpfV90b2dnbGVFeHBhbmRlZCh0KXt0aGlzLnNldCgiX2V4cGFuZGVkIiwhdGhpcy5fZXhwYW5kZWQpLHRoaXMucmVkcmF3KCl9fTtQQXQudGVtcGxhdGU9eGVgCiAgICA8dGYtY2FyZC1oZWFkaW5nCiAgICAgIHRhZz0iW1t0YWddXSIKICAgICAgcnVuPSJbW3J1bl1dIgogICAgICBkaXNwbGF5LW5hbWU9IltbdGFnTWV0YWRhdGEuZGlzcGxheU5hbWVdXSIKICAgICAgZGVzY3JpcHRpb249IltbdGFnTWV0YWRhdGEuZGVzY3JpcHRpb25dXSIKICAgICAgY29sb3I9IltbX3J1bkNvbG9yXV0iCiAgICA+PC90Zi1jYXJkLWhlYWRpbmc+CiAgICA8IS0tCiAgICAgIFRoZSBtYWluIGRpc3RyaWJ1dGlvbiB0aGF0IHdlIHJlbmRlci4gRGF0YSBpcyBzZXQgZGlyZWN0bHkgd2l0aAogICAgICBcYHNldFNlcmllc0RhdGFcYCwgbm90IHdpdGggYSBib3VuZCBwcm9wZXJ0eS4KICAgIC0tPgogICAgPHZ6LWRpc3RyaWJ1dGlvbi1jaGFydAogICAgICBpZD0iY2hhcnQiCiAgICAgIHgtdHlwZT0iW1t4VHlwZV1dIgogICAgICBjb2xvci1zY2FsZT0iW1tfY29sb3JTY2FsZV1dIgogICAgPjwvdnotZGlzdHJpYnV0aW9uLWNoYXJ0PgogICAgPGRpdiBzdHlsZT0iZGlzcGxheTogZmxleDsgZmxleC1kaXJlY3Rpb246IHJvdzsiPgogICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICBzZWxlY3RlZCQ9IltbX2V4cGFuZGVkXV0iCiAgICAgICAgaWNvbj0iZnVsbHNjcmVlbiIKICAgICAgICBvbi10YXA9Il90b2dnbGVFeHBhbmRlZCIKICAgICAgPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICB3aWR0aDogMzMwcHg7CiAgICAgICAgaGVpZ2h0OiAyMzVweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDEwcHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTVweDsKICAgICAgfQogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgewogICAgICAgIHdpZHRoOiA3MDBweDsKICAgICAgICBoZWlnaHQ6IDUwMHB4OwogICAgICB9CgogICAgICB2ei1oaXN0b2dyYW0tdGltZXNlcmllcyB7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbiB7CiAgICAgICAgY29sb3I6ICMyMTk2ZjM7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTAwJTsKICAgICAgICB3aWR0aDogMzJweDsKICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgICAgcGFkZGluZzogNHB4OwogICAgICB9CiAgICAgIHBhcGVyLWljb24tYnV0dG9uW3NlbGVjdGVkXSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgfQoKICAgICAgdGYtY2FyZC1oZWFkaW5nIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sUEF0LnByb3RvdHlwZSwicnVuIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFBBdC5wcm90b3R5cGUsInRhZyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxQQXQucHJvdG90eXBlLCJ0YWdNZXRhZGF0YSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxQQXQucHJvdG90eXBlLCJ4VHlwZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxQQXQucHJvdG90eXBlLCJnZXREYXRhTG9hZE5hbWUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sUEF0LnByb3RvdHlwZSwibG9hZERhdGFDYWxsYmFjayIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxQQXQucHJvdG90eXBlLCJfY29sb3JTY2FsZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwfSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxQQXQucHJvdG90eXBlLCJfZXhwYW5kZWQiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsYnIpXSxQQXQucHJvdG90eXBlLCJyZXF1ZXN0TWFuYWdlciIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIix4TyldLFBBdC5wcm90b3R5cGUsIl9jYW5jZWxsZXIiLHZvaWQgMCksdChbYSgicnVuIiwidGFnIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxQQXQucHJvdG90eXBlLCJfcmVsb2FkT25SdW5UYWdDaGFuZ2UiLG51bGwpLHQoW2EoInJ1biIsInRhZyIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sUEF0LnByb3RvdHlwZSwiX3VwZGF0ZURhdGFUb0xvYWQiLG51bGwpLHQoW3MoInJ1biIpLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLFBBdC5wcm90b3R5cGUsIl9ydW5Db2xvciIsbnVsbCksUEF0PXQoW2koInRmLWRpc3RyaWJ1dGlvbi1sb2FkZXIiKV0sUEF0KTtsZXQgTkF0PWNsYXNzIGV4dGVuZHMoY3Iod2UpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5yZWxvYWRPblJlYWR5PSEwLHRoaXMuX3hUeXBlPSJzdGVwIix0aGlzLl9yZXF1ZXN0TWFuYWdlcj1uZXcgYnJ9cmVhZHkoKXtzdXBlci5yZWFkeSgpLHRoaXMucmVsb2FkT25SZWFkeSYmdGhpcy5yZWxvYWQoKX1yZWxvYWQoKXt0aGlzLl9mZXRjaFRhZ3MoKS50aGVuKCgoKT0+e3RoaXMuX3JlbG9hZERpc3RyaWJ1dGlvbnMoKX0pKX1fZmV0Y2hUYWdzKCl7Y29uc3QgdD1FcigpLnBsdWdpblJvdXRlKCJkaXN0cmlidXRpb25zIiwiL3RhZ3MiKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh0KS50aGVuKCh0PT57aWYoQ2UuZXhwb3J0cy5pc0VxdWFsKHQsdGhpcy5fcnVuVG9UYWdJbmZvKSlyZXR1cm47Y29uc3QgZT1DZS5leHBvcnRzLm1hcFZhbHVlcyh0LCh0PT5PYmplY3Qua2V5cyh0KSkpLG49ZnIoZSk7dGhpcy5zZXQoIl9kYXRhTm90Rm91bmQiLDA9PT1uLmxlbmd0aCksdGhpcy5zZXQoIl9ydW5Ub1RhZyIsZSksdGhpcy5zZXQoIl9ydW5Ub1RhZ0luZm8iLHQpLHRoaXMuYXN5bmMoKCgpPT57dGhpcy5zZXQoIl9jYXRlZ29yaWVzRG9tUmVhZHkiLCEwKX0pKX0pKX1fcmVsb2FkRGlzdHJpYnV0aW9ucygpe3RoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1kaXN0cmlidXRpb24tbG9hZGVyIikuZm9yRWFjaCgodD0+e3QucmVsb2FkKCl9KSl9X3Nob3VsZE9wZW4odCl7cmV0dXJuIHQ8PTJ9Z2V0IF9jYXRlZ29yaWVzKCl7cmV0dXJuIElyKHRoaXMuX3J1blRvVGFnLHRoaXMuX3NlbGVjdGVkUnVucyx0aGlzLl90YWdGaWx0ZXIpfV90YWdNZXRhZGF0YSh0LGUsbil7cmV0dXJuIHRbZV1bbl19fTtOQXQudGVtcGxhdGU9eGVgCiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2V0dGluZ3MiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgICAgPHRmLW9wdGlvbi1zZWxlY3RvcgogICAgICAgICAgICAgIGlkPSJ4VHlwZVNlbGVjdG9yIgogICAgICAgICAgICAgIG5hbWU9Ikhvcml6b250YWwgYXhpcyIKICAgICAgICAgICAgICBzZWxlY3RlZC1pZD0ie3tfeFR5cGV9fSIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InN0ZXAiPnN0ZXA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJyZWxhdGl2ZSI+cmVsYXRpdmU8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJ3YWxsX3RpbWUiPndhbGw8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPC90Zi1vcHRpb24tc2VsZWN0b3I+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24gcnVucy1zZWxlY3RvciI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+CiAgICAgICAgICA8L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIGRpc3RyaWJ1dGlvbiBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6PC9wPgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgWW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBoaXN0b2dyYW0gZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLgogICAgICAgICAgICAgICAgKEhpc3RvZ3JhbXMgYW5kIGRpc3RyaWJ1dGlvbnMgYm90aCB1c2UgdGhlIGhpc3RvZ3JhbSBzdW1tYXJ5CiAgICAgICAgICAgICAgICBvcGVyYXRpb24uKQogICAgICAgICAgICAgIDwvbGk+CgogICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIgogICAgICAgICAgICAgICAgPlJFQURNRTwvYQogICAgICAgICAgICAgID4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCIKICAgICAgICAgICAgICAgID5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYQogICAgICAgICAgICAgID4uCiAgICAgICAgICAgIDwvcD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciCiAgICAgICAgICAgICAgICA+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYQogICAgICAgICAgICAgID4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgPC9wPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3CiAgICAgICAgICAgICAgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIKICAgICAgICAgICAgICBpbml0aWFsLW9wZW5lZD0iW1tfc2hvdWxkT3BlbihpbmRleCldXSIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1kaXN0cmlidXRpb24tbG9hZGVyCiAgICAgICAgICAgICAgICAgIGFjdGl2ZT0iW1thY3RpdmVdXSIKICAgICAgICAgICAgICAgICAgcnVuPSJbW2l0ZW0ucnVuXV0iCiAgICAgICAgICAgICAgICAgIHRhZz0iW1tpdGVtLnRhZ11dIgogICAgICAgICAgICAgICAgICB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKF9ydW5Ub1RhZ0luZm8sIGl0ZW0ucnVuLCBpdGVtLnRhZyldXSIKICAgICAgICAgICAgICAgICAgeC10eXBlPSJbW194VHlwZV1dIgogICAgICAgICAgICAgICAgICByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iCiAgICAgICAgICAgICAgICA+PC90Zi1kaXN0cmlidXRpb24tbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxOQXQucHJvdG90eXBlLCJyZWxvYWRPblJlYWR5Iix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLE5BdC5wcm90b3R5cGUsIl94VHlwZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sTkF0LnByb3RvdHlwZSwiX3NlbGVjdGVkUnVucyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxOQXQucHJvdG90eXBlLCJfcnVuVG9UYWciLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sTkF0LnByb3RvdHlwZSwiX3J1blRvVGFnSW5mbyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLE5BdC5wcm90b3R5cGUsIl9kYXRhTm90Rm91bmQiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sTkF0LnByb3RvdHlwZSwiX3RhZ0ZpbHRlciIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLE5BdC5wcm90b3R5cGUsIl9jYXRlZ29yaWVzRG9tUmVhZHkiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsYnIpXSxOQXQucHJvdG90eXBlLCJfcmVxdWVzdE1hbmFnZXIiLHZvaWQgMCksdChbcygiX3J1blRvVGFnIiwiX3NlbGVjdGVkUnVucyIsIl90YWdGaWx0ZXIiLCJfY2F0ZWdvcmllc0RvbVJlYWR5IiksZSgiZGVzaWduOnR5cGUiLEFycmF5KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxOQXQucHJvdG90eXBlLCJfY2F0ZWdvcmllcyIsbnVsbCksTkF0PXQoW2koInRmLWRpc3RyaWJ1dGlvbi1kYXNoYm9hcmQiKV0sTkF0KTt2YXIgSUF0PU9iamVjdC5mcmVlemUoe19fcHJvdG9fXzpudWxsLExpc3RlbktleTpNcyxhZGRIYXNoTGlzdGVuZXI6Q3MsYWRkU3RvcmFnZUxpc3RlbmVyOkFzLGZpcmVTdG9yYWdlQ2hhbmdlZDprcyxyZW1vdmVIYXNoTGlzdGVuZXJCeUtleTpMcyxyZW1vdmVTdG9yYWdlTGlzdGVuZXJCeUtleTpQcyxnZXRVcmxIYXNoRGljdDpmdW5jdGlvbiBSQXQoKXtyZXR1cm4gRnN9LERJU0FNQklHVUFUT1I6V3MsZ2V0U3RyaW5nOnFzLHNldFN0cmluZzpZcyxnZXRTdHJpbmdJbml0aWFsaXplcjpYcyxnZXRTdHJpbmdPYnNlcnZlcjokcyxkaXNwb3NlU3RyaW5nQmluZGluZzpLcyxnZXRCb29sZWFuOlpzLHNldEJvb2xlYW46SnMsZ2V0Qm9vbGVhbkluaXRpYWxpemVyOlFzLGdldEJvb2xlYW5PYnNlcnZlcjp0bCxkaXNwb3NlQm9vbGVhbkJpbmRpbmc6ZWwsZ2V0TnVtYmVyOm5sLHNldE51bWJlcjppbCxnZXROdW1iZXJJbml0aWFsaXplcjpybCxnZXROdW1iZXJPYnNlcnZlcjpvbCxkaXNwb3NlTnVtYmVyQmluZGluZzphbCxnZXRPYmplY3Q6c2wsc2V0T2JqZWN0OmxsLGdldE9iamVjdEluaXRpYWxpemVyOmNsLGdldE9iamVjdE9ic2VydmVyOnVsLGRpc3Bvc2VPYmplY3RCaW5kaW5nOmhsLG1ha2VCaW5kaW5nczpkbCxtaWdyYXRlTGVnYWN5VVJMU2NoZW1lOmZ1bmN0aW9uIE9BdCgpe2NvbnN0IHQ9bmV3IFNldChbImV4YW1wbGVzUGF0aCIsImhpZGVNb2RlbFBhbmUyIiwibW9kZWxOYW1lMSIsIm1vZGVsTmFtZTIiLCJpbmZlcmVuY2VBZGRyZXNzMSIsImluZmVyZW5jZUFkZHJlc3MyIiwibW9kZWxUeXBlIiwibW9kZWxWZXJzaW9uMSIsIm1vZGVsVmVyc2lvbjIiLCJtb2RlbFNpZ25hdHVyZTEiLCJtb2RlbFNpZ25hdHVyZTIiLCJtYXhFeGFtcGxlcyIsImxhYmVsVm9jYWJQYXRoIiwibXVsdGlDbGFzcyIsInNlcXVlbmNlRXhhbXBsZXMiLCJtYXhDbGFzc2VzVG9EaXNwbGF5Iiwic2FtcGxpbmdPZGRzIiwidXNlUHJlZGljdEFwaSIsInByZWRpY3RJbnB1dFRlbnNvciIsInByZWRpY3RPdXRwdXRUZW5zb3IiXSksZT1VcyhWcygpKTtpZigid2hhdGlmIj09PWUuX190YWJfXylmb3IobGV0IG4gb2YgdClpZihuIGluIGUpe2VbYHAud2hhdGlmLiR7bn1gXT1lW25dfWpzKEdzKGUpKSwoZnVuY3Rpb24gbih0KXtGcz10fSkoZSl9fSk7dmFyIHpBdCxEQXQ7IShmdW5jdGlvbih0KXt0LkZFVENIX1BCVFhUX0JZVEVTPSJGRVRDSF9QQlRYVF9CWVRFUyIsdC5GRVRDSF9QQlRYVF9CWVRFU19GUk9NX0ZJTEVTWVNURU09IkZFVENIX1BCVFhUX0JZVEVTX0ZST01fRklMRVNZU1RFTSIsdC5GRVRDSF9QQlRYVF9CWVRFU19GUk9NX1NFUlZFUj0iRkVUQ0hfUEJUWFRfQllURVNfRlJPTV9TRVJWRVIiLHQuUEFSU0VfUEJUWFRfSU5UT19PQkpFQ1Q9IlBBUlNFX1BCVFhUX0lOVE9fT0JKRUNUIix0LkZFVENIX01FVEFEQVRBX1BCVFhUX0JZVEVTPSJGRVRDSF9NRVRBREFUQV9QQlRYVF9CWVRFUyIsdC5QQVJTRV9NRVRBREFUQV9QQlRYVF9JTlRPX09CSkVDVD0iUEFSU0VfTUVUQURBVEFfUEJUWFRfSU5UT19PQkpFQ1QiLHQuTk9STUFMSVpJTkdfTkFNRVM9Ik5PUk1BTElaSU5HX05BTUVTIix0LkJVSUxEX1NMSU1fR1JBUEg9IkJVSUxEX1NMSU1fR1JBUEgiLHQuSElFUkFSQ0hZX0FERF9OT0RFUz0iSElFUkFSQ0hZX0FERF9OT0RFUyIsdC5ISUVSQVJDSFlfREVURUNUX1NFUklFUz0iSElFUkFSQ0hZX0RFVEVDVF9TRVJJRVMiLHQuSElFUkFSQ0hZX0FERF9FREdFUz0iSElFUkFSQ0hZX0FERF9FREdFUyIsdC5ISUVSQVJDSFlfRklORF9TSU1JTEFSX1NVQkdSQVBIUz0iSElFUkFSQ0hZX0ZJTkRfU0lNSUxBUl9TVUJHUkFQSFMiLHQuUkVOREVSX0JVSUxEX0hJRVJBUkNIWT0iUkVOREVSX0JVSUxEX0hJRVJBUkNIWSIsdC5SRU5ERVJfU0NFTkVfTEFZT1VUPSJSRU5ERVJfU0NFTkVfTEFZT1VUIix0LlJFTkRFUl9TQ0VORV9CVUlMRF9TQ0VORT0iUkVOREVSX1NDRU5FX0JVSUxEX1NDRU5FIix0LkdSQVBIX0xPQURfU1VDQ0VFREVEPSJHUkFQSF9MT0FEX1NVQ0NFRURFRCIsdC5HUkFQSF9MT0FEX0ZBSUxFRD0iR1JBUEhfTE9BRF9GQUlMRUQifSkoekF0fHwoekF0PXt9KSksKGZ1bmN0aW9uKHQpe3QuTk9ERV9FWFBBTlNJT05fVE9HR0xFRD0iTk9ERV9FWFBBTlNJT05fVE9HR0xFRCIsdC5OT0RFX1NFQVJDSF9SRVNVTFRfRk9DVVNFRD0iTk9ERV9TRUFSQ0hfUkVTVUxUX0ZPQ1VTRUQiLHQuTk9ERV9BVVhJTElBUllfRVhUUkFDVElPTl9DSEFOR0VEPSJOT0RFX0FVWElMSUFSWV9FWFRSQUNUSU9OX0NIQU5HRUQiLHQuR1JBUEhfVFlQRV9DSEFOR0VEPSJHUkFQSF9UWVBFX0NIQU5HRUQiLHQuVFJBQ0VfSU5QVVRfTU9ERV9UT0dHTEVEPSJUUkFDRV9JTlBVVF9NT0RFX1RPR0dMRUQiLHQuTk9ERV9DT0xPUl9NT0RFX0NIQU5HRUQ9Ik5PREVfQ09MT1JfTU9ERV9DSEFOR0VEIix0LlVQTE9BREVEX0dSQVBIX0ZST01fRklMRVNZU1RFTT0iVVBMT0FERURfR1JBUEhfRlJPTV9GSUxFU1lTVEVNIn0pKERBdHx8KERBdD17fSkpO2NvbnN0IEJBdD1PYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sekF0KSxEQXQpO3ZhciBIQXQ9ZnVuY3Rpb24gRkF0KHQsZSl7cmV0dXJuIHQ9PT1lfHx0IT10JiZlIT1lfSxWQXQ9SEF0O3ZhciBVQXQ9ZnVuY3Rpb24gakF0KHQsZSl7Zm9yKHZhciBuPXQubGVuZ3RoO24tLTspaWYoVkF0KHRbbl1bMF0sZSkpcmV0dXJuIG47cmV0dXJuLTF9LEdBdD1VQXQsV0F0PUFycmF5LnByb3RvdHlwZS5zcGxpY2U7dmFyIHFBdD1VQXQ7dmFyIFlBdD1VQXQ7dmFyIFhBdD1VQXQ7dmFyICRBdD1mdW5jdGlvbiBLQXQodCl7dmFyIGU9dGhpcy5fX2RhdGFfXyxuPUdBdChlLHQpO3JldHVybiEobjwwKSYmKG49PWUubGVuZ3RoLTE/ZS5wb3AoKTpXQXQuY2FsbChlLG4sMSksLS10aGlzLnNpemUsITApfSxaQXQ9ZnVuY3Rpb24gSkF0KHQpe3ZhciBlPXRoaXMuX19kYXRhX18sbj1xQXQoZSx0KTtyZXR1cm4gbjwwP3ZvaWQgMDplW25dWzFdfSxRQXQ9ZnVuY3Rpb24gdGt0KHQpe3JldHVybiBZQXQodGhpcy5fX2RhdGFfXyx0KT4tMX0sZWt0PWZ1bmN0aW9uIG5rdCh0LGUpe3ZhciBuPXRoaXMuX19kYXRhX18saT1YQXQobix0KTtyZXR1cm4gaTwwPygrK3RoaXMuc2l6ZSxuLnB1c2goW3QsZV0pKTpuW2ldWzFdPWUsdGhpc307ZnVuY3Rpb24gaWt0KHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgaT10W2VdO3RoaXMuc2V0KGlbMF0saVsxXSl9fWlrdC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24gcmt0KCl7dGhpcy5fX2RhdGFfXz1bXSx0aGlzLnNpemU9MH0saWt0LnByb3RvdHlwZS5kZWxldGU9JEF0LGlrdC5wcm90b3R5cGUuZ2V0PVpBdCxpa3QucHJvdG90eXBlLmhhcz1RQXQsaWt0LnByb3RvdHlwZS5zZXQ9ZWt0O3ZhciBva3Q9aWt0LGFrdD1va3Q7dmFyIHNrdD1mdW5jdGlvbiBsa3QoKXt0aGlzLl9fZGF0YV9fPW5ldyBha3QsdGhpcy5zaXplPTB9O3ZhciBja3Q9ZnVuY3Rpb24gdWt0KHQpe3ZhciBlPXRoaXMuX19kYXRhX18sbj1lLmRlbGV0ZSh0KTtyZXR1cm4gdGhpcy5zaXplPWUuc2l6ZSxufTt2YXIgaGt0PWZ1bmN0aW9uIGRrdCh0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5nZXQodCl9O3ZhciBwa3Q9ZnVuY3Rpb24gZmt0KHQpe3JldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh0KX0sbWt0PSJvYmplY3QiPT10eXBlb2YgU2UmJlNlJiZTZS5PYmplY3Q9PT1PYmplY3QmJlNlLGdrdD0ib2JqZWN0Ij09dHlwZW9mIHNlbGYmJnNlbGYmJnNlbGYuT2JqZWN0PT09T2JqZWN0JiZzZWxmLF9rdD1ta3R8fGdrdHx8RnVuY3Rpb24oInJldHVybiB0aGlzIikoKSx5a3Q9X2t0LlN5bWJvbCx2a3Q9T2JqZWN0LnByb3RvdHlwZSxia3Q9dmt0Lmhhc093blByb3BlcnR5LHhrdD12a3QudG9TdHJpbmcsd2t0PXlrdD95a3QudG9TdHJpbmdUYWc6dm9pZCAwO3ZhciBTa3Q9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzt2YXIgTWt0PWZ1bmN0aW9uIEVrdCh0KXt2YXIgZT1ia3QuY2FsbCh0LHdrdCksbj10W3drdF07dHJ5e3Rbd2t0XT12b2lkIDA7dmFyIGk9ITB9Y2F0Y2godCl7fXZhciByPXhrdC5jYWxsKHQpO3JldHVybiBpJiYoZT90W3drdF09bjpkZWxldGUgdFt3a3RdKSxyfSxUa3Q9ZnVuY3Rpb24gQ2t0KHQpe3JldHVybiBTa3QuY2FsbCh0KX0sQWt0PXlrdD95a3QudG9TdHJpbmdUYWc6dm9pZCAwO3ZhciBra3Q9ZnVuY3Rpb24gTGt0KHQpe3JldHVybiBudWxsPT10P3ZvaWQgMD09PXQ/IltvYmplY3QgVW5kZWZpbmVkXSI6IltvYmplY3QgTnVsbF0iOkFrdCYmQWt0IGluIE9iamVjdCh0KT9Na3QodCk6VGt0KHQpfTt2YXIgUGt0PWZ1bmN0aW9uIE5rdCh0KXt2YXIgZT10eXBlb2YgdDtyZXR1cm4gbnVsbCE9dCYmKCJvYmplY3QiPT1lfHwiZnVuY3Rpb24iPT1lKX0sSWt0PWtrdCxSa3Q9UGt0O3ZhciBPa3Qsemt0PWZ1bmN0aW9uIERrdCh0KXtpZighUmt0KHQpKXJldHVybiExO3ZhciBlPUlrdCh0KTtyZXR1cm4iW29iamVjdCBGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iPT1lfHwiW29iamVjdCBBc3luY0Z1bmN0aW9uXSI9PWV8fCJbb2JqZWN0IFByb3h5XSI9PWV9LEJrdD1fa3RbIl9fY29yZS1qc19zaGFyZWRfXyJdLEhrdD0oT2t0PS9bXi5dKyQvLmV4ZWMoQmt0JiZCa3Qua2V5cyYmQmt0LmtleXMuSUVfUFJPVE98fCIiKSk/IlN5bWJvbChzcmMpXzEuIitPa3Q6IiI7dmFyIEZrdD1GdW5jdGlvbi5wcm90b3R5cGUudG9TdHJpbmc7dmFyIFZrdD1mdW5jdGlvbiBVa3QodCl7aWYobnVsbCE9dCl7dHJ5e3JldHVybiBGa3QuY2FsbCh0KX1jYXRjaCh0KXt9dHJ5e3JldHVybiB0KyIifWNhdGNoKHQpe319cmV0dXJuIiJ9LGprdD16a3QsR2t0PWZ1bmN0aW9uIFdrdCh0KXtyZXR1cm4hIUhrdCYmSGt0IGluIHR9LHFrdD1Qa3QsWWt0PVZrdCxYa3Q9L15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC8sJGt0PVJlZ0V4cCgiXiIrRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSkucmVwbGFjZSgvW1xcXiQuKis/KClbXF17fXxdL2csIlxcJCYiKS5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCIkMS4qPyIpKyIkIik7dmFyIEtrdD1mdW5jdGlvbiBaa3QodCl7cmV0dXJuISghcWt0KHQpfHxHa3QodCkpJiYoamt0KHQpPyRrdDpYa3QpLnRlc3QoWWt0KHQpKX0sSmt0PWZ1bmN0aW9uIFFrdCh0LGUpe3JldHVybiBudWxsPT10P3ZvaWQgMDp0W2VdfTt2YXIgdEx0PWZ1bmN0aW9uIGVMdCh0LGUpe3ZhciBuPUprdCh0LGUpO3JldHVybiBLa3Qobik/bjp2b2lkIDB9LG5MdD10THQoX2t0LCJNYXAiKSxpTHQ9dEx0KE9iamVjdCwiY3JlYXRlIiksckx0PWlMdDt2YXIgb0x0PWlMdCxhTHQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgc0x0PWlMdCxsTHQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgY0x0PWlMdDt2YXIgdUx0PWZ1bmN0aW9uIGhMdCh0KXt2YXIgZT10aGlzLmhhcyh0KSYmZGVsZXRlIHRoaXMuX19kYXRhX19bdF07cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX0sZEx0PWZ1bmN0aW9uIHBMdCh0KXt2YXIgZT10aGlzLl9fZGF0YV9fO2lmKG9MdCl7dmFyIG49ZVt0XTtyZXR1cm4iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI9PT1uP3ZvaWQgMDpufXJldHVybiBhTHQuY2FsbChlLHQpP2VbdF06dm9pZCAwfSxmTHQ9ZnVuY3Rpb24gbUx0KHQpe3ZhciBlPXRoaXMuX19kYXRhX187cmV0dXJuIHNMdD92b2lkIDAhPT1lW3RdOmxMdC5jYWxsKGUsdCl9LGdMdD1mdW5jdGlvbiBfTHQodCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fO3JldHVybiB0aGlzLnNpemUrPXRoaXMuaGFzKHQpPzA6MSxuW3RdPWNMdCYmdm9pZCAwPT09ZT8iX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyI6ZSx0aGlzfTtmdW5jdGlvbiB5THQodCl7dmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuY2xlYXIoKTsrK2U8bjspe3ZhciBpPXRbZV07dGhpcy5zZXQoaVswXSxpWzFdKX19eUx0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbiB2THQoKXt0aGlzLl9fZGF0YV9fPXJMdD9yTHQobnVsbCk6e30sdGhpcy5zaXplPTB9LHlMdC5wcm90b3R5cGUuZGVsZXRlPXVMdCx5THQucHJvdG90eXBlLmdldD1kTHQseUx0LnByb3RvdHlwZS5oYXM9Zkx0LHlMdC5wcm90b3R5cGUuc2V0PWdMdDt2YXIgYkx0PXlMdCx4THQ9b2t0LHdMdD1uTHQ7dmFyIFNMdD1mdW5jdGlvbiBNTHQodCl7dmFyIGU9dHlwZW9mIHQ7cmV0dXJuInN0cmluZyI9PWV8fCJudW1iZXIiPT1lfHwic3ltYm9sIj09ZXx8ImJvb2xlYW4iPT1lPyJfX3Byb3RvX18iIT09dDpudWxsPT09dH07dmFyIEVMdD1mdW5jdGlvbiBUTHQodCxlKXt2YXIgbj10Ll9fZGF0YV9fO3JldHVybiBTTHQoZSk/blsic3RyaW5nIj09dHlwZW9mIGU/InN0cmluZyI6Imhhc2giXTpuLm1hcH0sQ0x0PUVMdDt2YXIgQUx0PUVMdDt2YXIga0x0PUVMdDt2YXIgTEx0PUVMdDt2YXIgUEx0PWZ1bmN0aW9uIE5MdCh0KXt2YXIgZT1DTHQodGhpcyx0KS5kZWxldGUodCk7cmV0dXJuIHRoaXMuc2l6ZS09ZT8xOjAsZX0sSUx0PWZ1bmN0aW9uIFJMdCh0KXtyZXR1cm4gQUx0KHRoaXMsdCkuZ2V0KHQpfSxPTHQ9ZnVuY3Rpb24gekx0KHQpe3JldHVybiBrTHQodGhpcyx0KS5oYXModCl9LERMdD1mdW5jdGlvbiBCTHQodCxlKXt2YXIgbj1MTHQodGhpcyx0KSxpPW4uc2l6ZTtyZXR1cm4gbi5zZXQodCxlKSx0aGlzLnNpemUrPW4uc2l6ZT09aT8wOjEsdGhpc307ZnVuY3Rpb24gSEx0KHQpe3ZhciBlPS0xLG49bnVsbD09dD8wOnQubGVuZ3RoO2Zvcih0aGlzLmNsZWFyKCk7KytlPG47KXt2YXIgaT10W2VdO3RoaXMuc2V0KGlbMF0saVsxXSl9fUhMdC5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24gRkx0KCl7dGhpcy5zaXplPTAsdGhpcy5fX2RhdGFfXz17aGFzaDpuZXcgYkx0LG1hcDpuZXcod0x0fHx4THQpLHN0cmluZzpuZXcgYkx0fX0sSEx0LnByb3RvdHlwZS5kZWxldGU9UEx0LEhMdC5wcm90b3R5cGUuZ2V0PUlMdCxITHQucHJvdG90eXBlLmhhcz1PTHQsSEx0LnByb3RvdHlwZS5zZXQ9REx0O3ZhciBWTHQ9SEx0LFVMdD1va3Qsakx0PW5MdCxHTHQ9Vkx0O3ZhciBXTHQ9b2t0LHFMdD1ja3QsWUx0PWhrdCxYTHQ9cGt0LCRMdD1mdW5jdGlvbiBLTHQodCxlKXt2YXIgbj10aGlzLl9fZGF0YV9fO2lmKG4gaW5zdGFuY2VvZiBVTHQpe3ZhciBpPW4uX19kYXRhX187aWYoIWpMdHx8aS5sZW5ndGg8MTk5KXJldHVybiBpLnB1c2goW3QsZV0pLHRoaXMuc2l6ZT0rK24uc2l6ZSx0aGlzO249dGhpcy5fX2RhdGFfXz1uZXcgR0x0KGkpfXJldHVybiBuLnNldCh0LGUpLHRoaXMuc2l6ZT1uLnNpemUsdGhpc307ZnVuY3Rpb24gWkx0KHQpe3ZhciBlPXRoaXMuX19kYXRhX189bmV3IFdMdCh0KTt0aGlzLnNpemU9ZS5zaXplfVpMdC5wcm90b3R5cGUuY2xlYXI9c2t0LFpMdC5wcm90b3R5cGUuZGVsZXRlPXFMdCxaTHQucHJvdG90eXBlLmdldD1ZTHQsWkx0LnByb3RvdHlwZS5oYXM9WEx0LFpMdC5wcm90b3R5cGUuc2V0PSRMdDt2YXIgSkx0PVpMdDt2YXIgUUx0PWZ1bmN0aW9uIHRQdCh0LGUpe2Zvcih2YXIgbj0tMSxpPW51bGw9PXQ/MDp0Lmxlbmd0aDsrK248aSYmITEhPT1lKHRbbl0sbix0KTspO3JldHVybiB0fSxlUHQ9dEx0LG5QdD0oZnVuY3Rpb24oKXt0cnl7dmFyIHQ9ZVB0KE9iamVjdCwiZGVmaW5lUHJvcGVydHkiKTtyZXR1cm4gdCh7fSwiIix7fSksdH1jYXRjaCh0KXt9fSkoKSxpUHQ9blB0O3ZhciByUHQ9ZnVuY3Rpb24gb1B0KHQsZSxuKXsiX19wcm90b19fIj09ZSYmaVB0P2lQdCh0LGUse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOm4sd3JpdGFibGU6ITB9KTp0W2VdPW59LGFQdD1yUHQsc1B0PUhBdCxsUHQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgY1B0PWZ1bmN0aW9uIHVQdCh0LGUsbil7dmFyIGk9dFtlXTtsUHQuY2FsbCh0LGUpJiZzUHQoaSxuKSYmKHZvaWQgMCE9PW58fGUgaW4gdCl8fGFQdCh0LGUsbil9LGhQdD1jUHQsZFB0PXJQdDt2YXIgcFB0PWZ1bmN0aW9uIGZQdCh0LGUsbixpKXt2YXIgcj0hbjtufHwobj17fSk7Zm9yKHZhciBvPS0xLGE9ZS5sZW5ndGg7KytvPGE7KXt2YXIgcz1lW29dLGw9aT9pKG5bc10sdFtzXSxzLG4sdCk6dm9pZCAwO3ZvaWQgMD09PWwmJihsPXRbc10pLHI/ZFB0KG4scyxsKTpoUHQobixzLGwpfXJldHVybiBufTt2YXIgbVB0PWZ1bmN0aW9uIGdQdCh0LGUpe2Zvcih2YXIgbj0tMSxpPUFycmF5KHQpOysrbjx0OylpW25dPWUobik7cmV0dXJuIGl9O3ZhciBfUHQ9ZnVuY3Rpb24geVB0KHQpe3JldHVybiBudWxsIT10JiYib2JqZWN0Ij09dHlwZW9mIHR9LHZQdD1ra3QsYlB0PV9QdDt2YXIgeFB0PWZ1bmN0aW9uIHdQdCh0KXtyZXR1cm4gYlB0KHQpJiYiW29iamVjdCBBcmd1bWVudHNdIj09dlB0KHQpfSxTUHQ9X1B0LE1QdD1PYmplY3QucHJvdG90eXBlLEVQdD1NUHQuaGFzT3duUHJvcGVydHksVFB0PU1QdC5wcm9wZXJ0eUlzRW51bWVyYWJsZSxDUHQ9eFB0KChmdW5jdGlvbigpe3JldHVybiBhcmd1bWVudHN9KSgpKT94UHQ6ZnVuY3Rpb24odCl7cmV0dXJuIFNQdCh0KSYmRVB0LmNhbGwodCwiY2FsbGVlIikmJiFUUHQuY2FsbCh0LCJjYWxsZWUiKX0sQVB0PUFycmF5LmlzQXJyYXksa1B0PXtleHBvcnRzOnt9fTt2YXIgTFB0PWZ1bmN0aW9uIFBQdCgpe3JldHVybiExfTshKGZ1bmN0aW9uKHQsZSl7dmFyIG49ZSYmIWUubm9kZVR5cGUmJmUsaT1uJiZ0JiYhdC5ub2RlVHlwZSYmdCxyPWkmJmkuZXhwb3J0cz09PW4/X2t0LkJ1ZmZlcjp2b2lkIDA7dC5leHBvcnRzPShyP3IuaXNCdWZmZXI6dm9pZCAwKXx8TFB0fSkoa1B0LGtQdC5leHBvcnRzKTt2YXIgTlB0PS9eKD86MHxbMS05XVxkKikkLzt2YXIgSVB0PWZ1bmN0aW9uIFJQdCh0LGUpe3ZhciBuPXR5cGVvZiB0O3JldHVybiEhKGU9bnVsbD09ZT85MDA3MTk5MjU0NzQwOTkxOmUpJiYoIm51bWJlciI9PW58fCJzeW1ib2wiIT1uJiZOUHQudGVzdCh0KSkmJnQ+LTEmJnQlMT09MCYmdDxlfTt2YXIgT1B0PWZ1bmN0aW9uIHpQdCh0KXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIHQmJnQ+LTEmJnQlMT09MCYmdDw9OTAwNzE5OTI1NDc0MDk5MX0sRFB0PWtrdCxCUHQ9T1B0LEhQdD1fUHQsRlB0PXt9O0ZQdFsiW29iamVjdCBGbG9hdDMyQXJyYXldIl09RlB0WyJbb2JqZWN0IEZsb2F0NjRBcnJheV0iXT1GUHRbIltvYmplY3QgSW50OEFycmF5XSJdPUZQdFsiW29iamVjdCBJbnQxNkFycmF5XSJdPUZQdFsiW29iamVjdCBJbnQzMkFycmF5XSJdPUZQdFsiW29iamVjdCBVaW50OEFycmF5XSJdPUZQdFsiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iXT1GUHRbIltvYmplY3QgVWludDE2QXJyYXldIl09RlB0WyJbb2JqZWN0IFVpbnQzMkFycmF5XSJdPSEwLEZQdFsiW29iamVjdCBBcmd1bWVudHNdIl09RlB0WyJbb2JqZWN0IEFycmF5XSJdPUZQdFsiW29iamVjdCBBcnJheUJ1ZmZlcl0iXT1GUHRbIltvYmplY3QgQm9vbGVhbl0iXT1GUHRbIltvYmplY3QgRGF0YVZpZXddIl09RlB0WyJbb2JqZWN0IERhdGVdIl09RlB0WyJbb2JqZWN0IEVycm9yXSJdPUZQdFsiW29iamVjdCBGdW5jdGlvbl0iXT1GUHRbIltvYmplY3QgTWFwXSJdPUZQdFsiW29iamVjdCBOdW1iZXJdIl09RlB0WyJbb2JqZWN0IE9iamVjdF0iXT1GUHRbIltvYmplY3QgUmVnRXhwXSJdPUZQdFsiW29iamVjdCBTZXRdIl09RlB0WyJbb2JqZWN0IFN0cmluZ10iXT1GUHRbIltvYmplY3QgV2Vha01hcF0iXT0hMTt2YXIgVlB0PWZ1bmN0aW9uIFVQdCh0KXtyZXR1cm4gSFB0KHQpJiZCUHQodC5sZW5ndGgpJiYhIUZQdFtEUHQodCldfTt2YXIgalB0PWZ1bmN0aW9uIEdQdCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQoZSl9fSxXUHQ9e2V4cG9ydHM6e319OyEoZnVuY3Rpb24odCxlKXt2YXIgbj1lJiYhZS5ub2RlVHlwZSYmZSxpPW4mJnQmJiF0Lm5vZGVUeXBlJiZ0LHI9aSYmaS5leHBvcnRzPT09biYmbWt0LnByb2Nlc3Msbz0oZnVuY3Rpb24oKXt0cnl7dmFyIHQ9aSYmaS5yZXF1aXJlJiZpLnJlcXVpcmUoInV0aWwiKS50eXBlcztyZXR1cm4gdHx8ciYmci5iaW5kaW5nJiZyLmJpbmRpbmcoInV0aWwiKX1jYXRjaCh0KXt9fSkoKTt0LmV4cG9ydHM9b30pKFdQdCxXUHQuZXhwb3J0cyk7dmFyIHFQdD1WUHQsWVB0PVdQdC5leHBvcnRzLFhQdD1ZUHQmJllQdC5pc1R5cGVkQXJyYXksJFB0PVhQdD9qUHQoWFB0KTpxUHQsS1B0PW1QdCxaUHQ9Q1B0LEpQdD1BUHQsUVB0PWtQdC5leHBvcnRzLHROdD1JUHQsZU50PSRQdCxuTnQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgaU50PWZ1bmN0aW9uIHJOdCh0LGUpe3ZhciBuPUpQdCh0KSxpPSFuJiZaUHQodCkscj0hbiYmIWkmJlFQdCh0KSxvPSFuJiYhaSYmIXImJmVOdCh0KSxhPW58fGl8fHJ8fG8scz1hP0tQdCh0Lmxlbmd0aCxTdHJpbmcpOltdLGw9cy5sZW5ndGg7Zm9yKHZhciBjIGluIHQpIWUmJiFuTnQuY2FsbCh0LGMpfHxhJiYoImxlbmd0aCI9PWN8fHImJigib2Zmc2V0Ij09Y3x8InBhcmVudCI9PWMpfHxvJiYoImJ1ZmZlciI9PWN8fCJieXRlTGVuZ3RoIj09Y3x8ImJ5dGVPZmZzZXQiPT1jKXx8dE50KGMsbCkpfHxzLnB1c2goYyk7cmV0dXJuIHN9LG9OdD1PYmplY3QucHJvdG90eXBlO3ZhciBhTnQ9ZnVuY3Rpb24gc050KHQpe3ZhciBlPXQmJnQuY29uc3RydWN0b3I7cmV0dXJuIHQ9PT0oImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUucHJvdG90eXBlfHxvTnQpfTt2YXIgbE50PWZ1bmN0aW9uIGNOdCh0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdChlKG4pKX19LHVOdD1sTnQoT2JqZWN0LmtleXMsT2JqZWN0KSxoTnQ9YU50LGROdD11TnQscE50PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIGZOdD1mdW5jdGlvbiBtTnQodCl7aWYoIWhOdCh0KSlyZXR1cm4gZE50KHQpO3ZhciBlPVtdO2Zvcih2YXIgbiBpbiBPYmplY3QodCkpcE50LmNhbGwodCxuKSYmImNvbnN0cnVjdG9yIiE9biYmZS5wdXNoKG4pO3JldHVybiBlfSxnTnQ9emt0LF9OdD1PUHQ7dmFyIHlOdD1mdW5jdGlvbiB2TnQodCl7cmV0dXJuIG51bGwhPXQmJl9OdCh0Lmxlbmd0aCkmJiFnTnQodCl9LGJOdD1pTnQseE50PWZOdCx3TnQ9eU50O3ZhciBTTnQ9ZnVuY3Rpb24gTU50KHQpe3JldHVybiB3TnQodCk/Yk50KHQpOnhOdCh0KX0sRU50PXBQdCxUTnQ9U050O3ZhciBDTnQ9ZnVuY3Rpb24gQU50KHQsZSl7cmV0dXJuIHQmJkVOdChlLFROdChlKSx0KX07dmFyIGtOdD1Qa3QsTE50PWFOdCxQTnQ9ZnVuY3Rpb24gTk50KHQpe3ZhciBlPVtdO2lmKG51bGwhPXQpZm9yKHZhciBuIGluIE9iamVjdCh0KSllLnB1c2gobik7cmV0dXJuIGV9LElOdD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBSTnQ9aU50LE9OdD1mdW5jdGlvbiB6TnQodCl7aWYoIWtOdCh0KSlyZXR1cm4gUE50KHQpO3ZhciBlPUxOdCh0KSxuPVtdO2Zvcih2YXIgaSBpbiB0KSgiY29uc3RydWN0b3IiIT1pfHwhZSYmSU50LmNhbGwodCxpKSkmJm4ucHVzaChpKTtyZXR1cm4gbn0sRE50PXlOdDt2YXIgQk50PWZ1bmN0aW9uIEhOdCh0KXtyZXR1cm4gRE50KHQpP1JOdCh0LCEwKTpPTnQodCl9LEZOdD1wUHQsVk50PUJOdDt2YXIgVU50PWZ1bmN0aW9uIGpOdCh0LGUpe3JldHVybiB0JiZGTnQoZSxWTnQoZSksdCl9LEdOdD17ZXhwb3J0czp7fX07IShmdW5jdGlvbih0LGUpe3ZhciBuPWUmJiFlLm5vZGVUeXBlJiZlLGk9biYmdCYmIXQubm9kZVR5cGUmJnQscj1pJiZpLmV4cG9ydHM9PT1uP19rdC5CdWZmZXI6dm9pZCAwLG89cj9yLmFsbG9jVW5zYWZlOnZvaWQgMDt0LmV4cG9ydHM9ZnVuY3Rpb24gYSh0LGUpe2lmKGUpcmV0dXJuIHQuc2xpY2UoKTt2YXIgbj10Lmxlbmd0aCxpPW8/byhuKTpuZXcgdC5jb25zdHJ1Y3RvcihuKTtyZXR1cm4gdC5jb3B5KGkpLGl9fSkoR050LEdOdC5leHBvcnRzKTt2YXIgV050PWZ1bmN0aW9uIHFOdCh0LGUpe3ZhciBuPS0xLGk9dC5sZW5ndGg7Zm9yKGV8fChlPUFycmF5KGkpKTsrK248aTspZVtuXT10W25dO3JldHVybiBlfTt2YXIgWU50PWZ1bmN0aW9uIFhOdCh0LGUpe2Zvcih2YXIgbj0tMSxpPW51bGw9PXQ/MDp0Lmxlbmd0aCxyPTAsbz1bXTsrK248aTspe3ZhciBhPXRbbl07ZShhLG4sdCkmJihvW3IrK109YSl9cmV0dXJuIG99O3ZhciAkTnQ9ZnVuY3Rpb24gS050KCl7cmV0dXJuW119LFpOdD1ZTnQsSk50PU9iamVjdC5wcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUsUU50PU9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMsdEl0PVFOdD9mdW5jdGlvbih0KXtyZXR1cm4gbnVsbD09dD9bXToodD1PYmplY3QodCksWk50KFFOdCh0KSwoZnVuY3Rpb24oZSl7cmV0dXJuIEpOdC5jYWxsKHQsZSl9KSkpfTokTnQsZUl0PXBQdCxuSXQ9dEl0O3ZhciBpSXQ9ZnVuY3Rpb24gckl0KHQsZSl7cmV0dXJuIGVJdCh0LG5JdCh0KSxlKX07dmFyIG9JdD1mdW5jdGlvbiBhSXQodCxlKXtmb3IodmFyIG49LTEsaT1lLmxlbmd0aCxyPXQubGVuZ3RoOysrbjxpOyl0W3Irbl09ZVtuXTtyZXR1cm4gdH0sc0l0PWxOdChPYmplY3QuZ2V0UHJvdG90eXBlT2YsT2JqZWN0KSxsSXQ9b0l0LGNJdD1zSXQsdUl0PXRJdCxoSXQ9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scz9mdW5jdGlvbih0KXtmb3IodmFyIGU9W107dDspbEl0KGUsdUl0KHQpKSx0PWNJdCh0KTtyZXR1cm4gZX06JE50LGRJdD1wUHQscEl0PWhJdDt2YXIgZkl0PWZ1bmN0aW9uIG1JdCh0LGUpe3JldHVybiBkSXQodCxwSXQodCksZSl9LGdJdD1vSXQsX0l0PUFQdDt2YXIgeUl0PWZ1bmN0aW9uIHZJdCh0LGUsbil7dmFyIGk9ZSh0KTtyZXR1cm4gX0l0KHQpP2k6Z0l0KGksbih0KSl9LGJJdD15SXQseEl0PXRJdCx3SXQ9U050O3ZhciBTSXQ9ZnVuY3Rpb24gTUl0KHQpe3JldHVybiBiSXQodCx3SXQseEl0KX0sRUl0PXlJdCxUSXQ9aEl0LENJdD1CTnQ7dmFyIEFJdD1mdW5jdGlvbiBrSXQodCl7cmV0dXJuIEVJdCh0LENJdCxUSXQpfSxMSXQ9dEx0KF9rdCwiRGF0YVZpZXciKSxQSXQ9dEx0KF9rdCwiUHJvbWlzZSIpLE5JdD10THQoX2t0LCJTZXQiKSxJSXQ9TEl0LFJJdD1uTHQsT0l0PVBJdCx6SXQ9Tkl0LERJdD10THQoX2t0LCJXZWFrTWFwIiksQkl0PWtrdCxISXQ9Vmt0LEZJdD0iW29iamVjdCBNYXBdIixWSXQ9IltvYmplY3QgUHJvbWlzZV0iLFVJdD0iW29iamVjdCBTZXRdIixqSXQ9IltvYmplY3QgV2Vha01hcF0iLEdJdD0iW29iamVjdCBEYXRhVmlld10iLFdJdD1ISXQoSUl0KSxxSXQ9SEl0KFJJdCksWUl0PUhJdChPSXQpLFhJdD1ISXQoekl0KSwkSXQ9SEl0KERJdCksS0l0PUJJdDsoSUl0JiZLSXQobmV3IElJdChuZXcgQXJyYXlCdWZmZXIoMSkpKSE9R0l0fHxSSXQmJktJdChuZXcgUkl0KSE9Rkl0fHxPSXQmJktJdChPSXQucmVzb2x2ZSgpKSE9Vkl0fHx6SXQmJktJdChuZXcgekl0KSE9VUl0fHxESXQmJktJdChuZXcgREl0KSE9akl0KSYmKEtJdD1mdW5jdGlvbih0KXt2YXIgZT1CSXQodCksbj0iW29iamVjdCBPYmplY3RdIj09ZT90LmNvbnN0cnVjdG9yOnZvaWQgMCxpPW4/SEl0KG4pOiIiO2lmKGkpc3dpdGNoKGkpe2Nhc2UgV0l0OnJldHVybiBHSXQ7Y2FzZSBxSXQ6cmV0dXJuIEZJdDtjYXNlIFlJdDpyZXR1cm4gVkl0O2Nhc2UgWEl0OnJldHVybiBVSXQ7Y2FzZSAkSXQ6cmV0dXJuIGpJdH1yZXR1cm4gZX0pO3ZhciBaSXQ9S0l0LEpJdD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBRSXQ9ZnVuY3Rpb24gdFJ0KHQpe3ZhciBlPXQubGVuZ3RoLG49bmV3IHQuY29uc3RydWN0b3IoZSk7cmV0dXJuIGUmJiJzdHJpbmciPT10eXBlb2YgdFswXSYmSkl0LmNhbGwodCwiaW5kZXgiKSYmKG4uaW5kZXg9dC5pbmRleCxuLmlucHV0PXQuaW5wdXQpLG59LGVSdD1fa3QuVWludDhBcnJheSxuUnQ9ZVJ0O3ZhciBpUnQ9ZnVuY3Rpb24gclJ0KHQpe3ZhciBlPW5ldyB0LmNvbnN0cnVjdG9yKHQuYnl0ZUxlbmd0aCk7cmV0dXJuIG5ldyBuUnQoZSkuc2V0KG5ldyBuUnQodCkpLGV9LG9SdD1pUnQ7dmFyIGFSdD0vXHcqJC87dmFyIHNSdD15a3Q/eWt0LnByb3RvdHlwZTp2b2lkIDAsbFJ0PXNSdD9zUnQudmFsdWVPZjp2b2lkIDA7dmFyIGNSdD1pUnQ7dmFyIHVSdD1mdW5jdGlvbiBoUnQodCxlKXt2YXIgbj1lP2NSdCh0LmJ1ZmZlcik6dC5idWZmZXI7cmV0dXJuIG5ldyB0LmNvbnN0cnVjdG9yKG4sdC5ieXRlT2Zmc2V0LHQubGVuZ3RoKX0sZFJ0PWlSdCxwUnQ9ZnVuY3Rpb24gZlJ0KHQsZSl7dmFyIG49ZT9vUnQodC5idWZmZXIpOnQuYnVmZmVyO3JldHVybiBuZXcgdC5jb25zdHJ1Y3RvcihuLHQuYnl0ZU9mZnNldCx0LmJ5dGVMZW5ndGgpfSxtUnQ9ZnVuY3Rpb24gZ1J0KHQpe3ZhciBlPW5ldyB0LmNvbnN0cnVjdG9yKHQuc291cmNlLGFSdC5leGVjKHQpKTtyZXR1cm4gZS5sYXN0SW5kZXg9dC5sYXN0SW5kZXgsZX0sX1J0PWZ1bmN0aW9uIHlSdCh0KXtyZXR1cm4gbFJ0P09iamVjdChsUnQuY2FsbCh0KSk6e319LHZSdD11UnQ7dmFyIGJSdD1mdW5jdGlvbiB4UnQodCxlLG4pe3ZhciBpPXQuY29uc3RydWN0b3I7c3dpdGNoKGUpe2Nhc2UiW29iamVjdCBBcnJheUJ1ZmZlcl0iOnJldHVybiBkUnQodCk7Y2FzZSJbb2JqZWN0IEJvb2xlYW5dIjpjYXNlIltvYmplY3QgRGF0ZV0iOnJldHVybiBuZXcgaSgrdCk7Y2FzZSJbb2JqZWN0IERhdGFWaWV3XSI6cmV0dXJuIHBSdCh0LG4pO2Nhc2UiW29iamVjdCBGbG9hdDMyQXJyYXldIjpjYXNlIltvYmplY3QgRmxvYXQ2NEFycmF5XSI6Y2FzZSJbb2JqZWN0IEludDhBcnJheV0iOmNhc2UiW29iamVjdCBJbnQxNkFycmF5XSI6Y2FzZSJbb2JqZWN0IEludDMyQXJyYXldIjpjYXNlIltvYmplY3QgVWludDhBcnJheV0iOmNhc2UiW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0iOmNhc2UiW29iamVjdCBVaW50MTZBcnJheV0iOmNhc2UiW29iamVjdCBVaW50MzJBcnJheV0iOnJldHVybiB2UnQodCxuKTtjYXNlIltvYmplY3QgTWFwXSI6cmV0dXJuIG5ldyBpO2Nhc2UiW29iamVjdCBOdW1iZXJdIjpjYXNlIltvYmplY3QgU3RyaW5nXSI6cmV0dXJuIG5ldyBpKHQpO2Nhc2UiW29iamVjdCBSZWdFeHBdIjpyZXR1cm4gbVJ0KHQpO2Nhc2UiW29iamVjdCBTZXRdIjpyZXR1cm4gbmV3IGk7Y2FzZSJbb2JqZWN0IFN5bWJvbF0iOnJldHVybiBfUnQodCl9fSx3UnQ9UGt0LFNSdD1PYmplY3QuY3JlYXRlLE1SdD0oZnVuY3Rpb24oKXtmdW5jdGlvbiB0KCl7fXJldHVybiBmdW5jdGlvbihlKXtpZighd1J0KGUpKXJldHVybnt9O2lmKFNSdClyZXR1cm4gU1J0KGUpO3QucHJvdG90eXBlPWU7dmFyIG49bmV3IHQ7cmV0dXJuIHQucHJvdG90eXBlPXZvaWQgMCxufX0pKCksRVJ0PU1SdCxUUnQ9c0l0LENSdD1hTnQ7dmFyIEFSdD1mdW5jdGlvbiBrUnQodCl7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIHQuY29uc3RydWN0b3J8fENSdCh0KT97fTpFUnQoVFJ0KHQpKX0sTFJ0PVpJdCxQUnQ9X1B0O3ZhciBOUnQ9ZnVuY3Rpb24gSVJ0KHQpe3JldHVybiBQUnQodCkmJiJbb2JqZWN0IE1hcF0iPT1MUnQodCl9LFJSdD1XUHQuZXhwb3J0cyxPUnQ9UlJ0JiZSUnQuaXNNYXAselJ0PU9SdD9qUHQoT1J0KTpOUnQsRFJ0PVpJdCxCUnQ9X1B0O3ZhciBIUnQ9ZnVuY3Rpb24gRlJ0KHQpe3JldHVybiBCUnQodCkmJiJbb2JqZWN0IFNldF0iPT1EUnQodCl9LFZSdD1XUHQuZXhwb3J0cyxVUnQ9VlJ0JiZWUnQuaXNTZXQsalJ0PVVSdD9qUHQoVVJ0KTpIUnQsR1J0PUpMdCxXUnQ9UUx0LHFSdD1jUHQsWVJ0PUNOdCxYUnQ9VU50LCRSdD1HTnQuZXhwb3J0cyxLUnQ9V050LFpSdD1pSXQsSlJ0PWZJdCxRUnQ9U0l0LHRPdD1BSXQsZU90PVpJdCxuT3Q9UUl0LGlPdD1iUnQsck90PUFSdCxvT3Q9QVB0LGFPdD1rUHQuZXhwb3J0cyxzT3Q9elJ0LGxPdD1Qa3QsY090PWpSdCx1T3Q9U050LGhPdD1CTnQsZE90PSJbb2JqZWN0IEFyZ3VtZW50c10iLHBPdD0iW29iamVjdCBGdW5jdGlvbl0iLGZPdD0iW29iamVjdCBPYmplY3RdIixtT3Q9e307bU90W2RPdF09bU90WyJbb2JqZWN0IEFycmF5XSJdPW1PdFsiW29iamVjdCBBcnJheUJ1ZmZlcl0iXT1tT3RbIltvYmplY3QgRGF0YVZpZXddIl09bU90WyJbb2JqZWN0IEJvb2xlYW5dIl09bU90WyJbb2JqZWN0IERhdGVdIl09bU90WyJbb2JqZWN0IEZsb2F0MzJBcnJheV0iXT1tT3RbIltvYmplY3QgRmxvYXQ2NEFycmF5XSJdPW1PdFsiW29iamVjdCBJbnQ4QXJyYXldIl09bU90WyJbb2JqZWN0IEludDE2QXJyYXldIl09bU90WyJbb2JqZWN0IEludDMyQXJyYXldIl09bU90WyJbb2JqZWN0IE1hcF0iXT1tT3RbIltvYmplY3QgTnVtYmVyXSJdPW1PdFtmT3RdPW1PdFsiW29iamVjdCBSZWdFeHBdIl09bU90WyJbb2JqZWN0IFNldF0iXT1tT3RbIltvYmplY3QgU3RyaW5nXSJdPW1PdFsiW29iamVjdCBTeW1ib2xdIl09bU90WyJbb2JqZWN0IFVpbnQ4QXJyYXldIl09bU90WyJbb2JqZWN0IFVpbnQ4Q2xhbXBlZEFycmF5XSJdPW1PdFsiW29iamVjdCBVaW50MTZBcnJheV0iXT1tT3RbIltvYmplY3QgVWludDMyQXJyYXldIl09ITAsbU90WyJbb2JqZWN0IEVycm9yXSJdPW1PdFtwT3RdPW1PdFsiW29iamVjdCBXZWFrTWFwXSJdPSExO3ZhciBnT3Q9ZnVuY3Rpb24gdChlLG4saSxyLG8sYSl7dmFyIHMsbD0xJm4sYz0yJm4sdT00Jm47aWYoaSYmKHM9bz9pKGUscixvLGEpOmkoZSkpLHZvaWQgMCE9PXMpcmV0dXJuIHM7aWYoIWxPdChlKSlyZXR1cm4gZTt2YXIgaD1vT3QoZSk7aWYoaCl7aWYocz1uT3QoZSksIWwpcmV0dXJuIEtSdChlLHMpfWVsc2V7dmFyIGQ9ZU90KGUpLHA9ZD09cE90fHwiW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0iPT1kO2lmKGFPdChlKSlyZXR1cm4gJFJ0KGUsbCk7aWYoZD09Zk90fHxkPT1kT3R8fHAmJiFvKXtpZihzPWN8fHA/e306ck90KGUpLCFsKXJldHVybiBjP0pSdChlLFhSdChzLGUpKTpaUnQoZSxZUnQocyxlKSl9ZWxzZXtpZighbU90W2RdKXJldHVybiBvP2U6e307cz1pT3QoZSxkLGwpfX1hfHwoYT1uZXcgR1J0KTt2YXIgZj1hLmdldChlKTtpZihmKXJldHVybiBmO2Euc2V0KGUscyksY090KGUpP2UuZm9yRWFjaCgoZnVuY3Rpb24ocil7cy5hZGQodChyLG4saSxyLGUsYSkpfSkpOnNPdChlKSYmZS5mb3JFYWNoKChmdW5jdGlvbihyLG8pe3Muc2V0KG8sdChyLG4saSxvLGUsYSkpfSkpO3ZhciBtPWg/dm9pZCAwOih1P2M/dE90OlFSdDpjP2hPdDp1T3QpKGUpO3JldHVybiBXUnQobXx8ZSwoZnVuY3Rpb24ocixvKXttJiYocj1lW289cl0pLHFSdChzLG8sdChyLG4saSxvLGUsYSkpfSkpLHN9LF9PdD1nT3Q7dmFyIHlPdD1mdW5jdGlvbiB2T3QodCl7cmV0dXJuIF9PdCh0LDQpfTt2YXIgYk90PWZ1bmN0aW9uIHhPdCh0KXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gdH19O3ZhciB3T3Q9KGZ1bmN0aW9uIFNPdCh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLGkpe2Zvcih2YXIgcj0tMSxvPU9iamVjdChlKSxhPWkoZSkscz1hLmxlbmd0aDtzLS07KXt2YXIgbD1hW3Q/czorK3JdO2lmKCExPT09bihvW2xdLGwsbykpYnJlYWt9cmV0dXJuIGV9fSkoKSxNT3Q9d090LEVPdD1TTnQ7dmFyIFRPdD1mdW5jdGlvbiBDT3QodCxlKXtyZXR1cm4gdCYmTU90KHQsZSxFT3QpfSxBT3Q9eU50O3ZhciBrT3Q9KGZ1bmN0aW9uIExPdCh0LGUpe3JldHVybiBmdW5jdGlvbihuLGkpe2lmKG51bGw9PW4pcmV0dXJuIG47aWYoIUFPdChuKSlyZXR1cm4gdChuLGkpO2Zvcih2YXIgcj1uLmxlbmd0aCxvPWU/cjotMSxhPU9iamVjdChuKTsoZT9vLS06KytvPHIpJiYhMSE9PWkoYVtvXSxvLGEpOyk7cmV0dXJuIG59fSkoVE90KTt2YXIgUE90PWZ1bmN0aW9uIE5PdCh0KXtyZXR1cm4gdH0sSU90PVBPdDt2YXIgUk90PWZ1bmN0aW9uIE9PdCh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90OklPdH0sek90PVFMdCxET3Q9a090LEJPdD1ST3QsSE90PUFQdDt2YXIgRk90PWZ1bmN0aW9uIFZPdCh0LGUpe3JldHVybihIT3QodCk/ek90OkRPdCkodCxCT3QoZSkpfSxVT3Q9Rk90LGpPdD1rT3Q7dmFyIEdPdD1mdW5jdGlvbiBXT3QodCxlKXt2YXIgbj1bXTtyZXR1cm4gak90KHQsKGZ1bmN0aW9uKHQsaSxyKXtlKHQsaSxyKSYmbi5wdXNoKHQpfSkpLG59O3ZhciBxT3Q9Vkx0LFlPdD1mdW5jdGlvbiBYT3QodCl7cmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHQpfTtmdW5jdGlvbiAkT3QodCl7dmFyIGU9LTEsbj1udWxsPT10PzA6dC5sZW5ndGg7Zm9yKHRoaXMuX19kYXRhX189bmV3IHFPdDsrK2U8bjspdGhpcy5hZGQodFtlXSl9JE90LnByb3RvdHlwZS5hZGQ9JE90LnByb3RvdHlwZS5wdXNoPWZ1bmN0aW9uIEtPdCh0KXtyZXR1cm4gdGhpcy5fX2RhdGFfXy5zZXQodCwiX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyIpLHRoaXN9LCRPdC5wcm90b3R5cGUuaGFzPVlPdDt2YXIgWk90PSRPdDt2YXIgSk90PWZ1bmN0aW9uIFFPdCh0LGUpe3JldHVybiB0LmhhcyhlKX0sdHp0PVpPdCxlenQ9ZnVuY3Rpb24gbnp0KHQsZSl7Zm9yKHZhciBuPS0xLGk9bnVsbD09dD8wOnQubGVuZ3RoOysrbjxpOylpZihlKHRbbl0sbix0KSlyZXR1cm4hMDtyZXR1cm4hMX0saXp0PUpPdDt2YXIgcnp0PWZ1bmN0aW9uIG96dCh0LGUsbixpLHIsbyl7dmFyIGE9MSZuLHM9dC5sZW5ndGgsbD1lLmxlbmd0aDtpZihzIT1sJiYhKGEmJmw+cykpcmV0dXJuITE7dmFyIGM9by5nZXQodCksdT1vLmdldChlKTtpZihjJiZ1KXJldHVybiBjPT1lJiZ1PT10O3ZhciBoPS0xLGQ9ITAscD0yJm4/bmV3IHR6dDp2b2lkIDA7Zm9yKG8uc2V0KHQsZSksby5zZXQoZSx0KTsrK2g8czspe3ZhciBmPXRbaF0sbT1lW2hdO2lmKGkpdmFyIGc9YT9pKG0sZixoLGUsdCxvKTppKGYsbSxoLHQsZSxvKTtpZih2b2lkIDAhPT1nKXtpZihnKWNvbnRpbnVlO2Q9ITE7YnJlYWt9aWYocCl7aWYoIWV6dChlLChmdW5jdGlvbih0LGUpe2lmKCFpenQocCxlKSYmKGY9PT10fHxyKGYsdCxuLGksbykpKXJldHVybiBwLnB1c2goZSl9KSkpe2Q9ITE7YnJlYWt9fWVsc2UgaWYoZiE9PW0mJiFyKGYsbSxuLGksbykpe2Q9ITE7YnJlYWt9fXJldHVybiBvLmRlbGV0ZSh0KSxvLmRlbGV0ZShlKSxkfTt2YXIgYXp0PWZ1bmN0aW9uIHN6dCh0KXt2YXIgZT0tMSxuPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCl7blsrK2VdPXR9KSksbn0sbHp0PWVSdCxjenQ9SEF0LHV6dD1yenQsaHp0PWZ1bmN0aW9uIGR6dCh0KXt2YXIgZT0tMSxuPUFycmF5KHQuc2l6ZSk7cmV0dXJuIHQuZm9yRWFjaCgoZnVuY3Rpb24odCxpKXtuWysrZV09W2ksdF19KSksbn0scHp0PWF6dCxmenQ9eWt0P3lrdC5wcm90b3R5cGU6dm9pZCAwLG16dD1menQ/Znp0LnZhbHVlT2Y6dm9pZCAwO3ZhciBnenQ9U0l0LF96dD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciB5enQ9Skx0LHZ6dD1yenQsYnp0PWZ1bmN0aW9uIHh6dCh0LGUsbixpLHIsbyxhKXtzd2l0Y2gobil7Y2FzZSJbb2JqZWN0IERhdGFWaWV3XSI6aWYodC5ieXRlTGVuZ3RoIT1lLmJ5dGVMZW5ndGh8fHQuYnl0ZU9mZnNldCE9ZS5ieXRlT2Zmc2V0KXJldHVybiExO3Q9dC5idWZmZXIsZT1lLmJ1ZmZlcjtjYXNlIltvYmplY3QgQXJyYXlCdWZmZXJdIjpyZXR1cm4hKHQuYnl0ZUxlbmd0aCE9ZS5ieXRlTGVuZ3RofHwhbyhuZXcgbHp0KHQpLG5ldyBsenQoZSkpKTtjYXNlIltvYmplY3QgQm9vbGVhbl0iOmNhc2UiW29iamVjdCBEYXRlXSI6Y2FzZSJbb2JqZWN0IE51bWJlcl0iOnJldHVybiBjenQoK3QsK2UpO2Nhc2UiW29iamVjdCBFcnJvcl0iOnJldHVybiB0Lm5hbWU9PWUubmFtZSYmdC5tZXNzYWdlPT1lLm1lc3NhZ2U7Y2FzZSJbb2JqZWN0IFJlZ0V4cF0iOmNhc2UiW29iamVjdCBTdHJpbmddIjpyZXR1cm4gdD09ZSsiIjtjYXNlIltvYmplY3QgTWFwXSI6dmFyIHM9aHp0O2Nhc2UiW29iamVjdCBTZXRdIjppZihzfHwocz1wenQpLHQuc2l6ZSE9ZS5zaXplJiYhKDEmaSkpcmV0dXJuITE7dmFyIGw9YS5nZXQodCk7aWYobClyZXR1cm4gbD09ZTtpfD0yLGEuc2V0KHQsZSk7dmFyIGM9dXp0KHModCkscyhlKSxpLHIsbyxhKTtyZXR1cm4gYS5kZWxldGUodCksYztjYXNlIltvYmplY3QgU3ltYm9sXSI6aWYobXp0KXJldHVybiBtenQuY2FsbCh0KT09bXp0LmNhbGwoZSl9cmV0dXJuITF9LHd6dD1mdW5jdGlvbiBTenQodCxlLG4saSxyLG8pe3ZhciBhPTEmbixzPWd6dCh0KSxsPXMubGVuZ3RoO2lmKGwhPWd6dChlKS5sZW5ndGgmJiFhKXJldHVybiExO2Zvcih2YXIgYz1sO2MtLTspe3ZhciB1PXNbY107aWYoIShhP3UgaW4gZTpfenQuY2FsbChlLHUpKSlyZXR1cm4hMX12YXIgaD1vLmdldCh0KSxkPW8uZ2V0KGUpO2lmKGgmJmQpcmV0dXJuIGg9PWUmJmQ9PXQ7dmFyIHA9ITA7by5zZXQodCxlKSxvLnNldChlLHQpO2Zvcih2YXIgZj1hOysrYzxsOyl7dmFyIG09dFt1PXNbY11dLGc9ZVt1XTtpZihpKXZhciBfPWE/aShnLG0sdSxlLHQsbyk6aShtLGcsdSx0LGUsbyk7aWYoISh2b2lkIDA9PT1fP209PT1nfHxyKG0sZyxuLGksbyk6Xykpe3A9ITE7YnJlYWt9Znx8KGY9ImNvbnN0cnVjdG9yIj09dSl9aWYocCYmIWYpe3ZhciB5PXQuY29uc3RydWN0b3Isdj1lLmNvbnN0cnVjdG9yO3k9PXZ8fCEoImNvbnN0cnVjdG9yImluIHQpfHwhKCJjb25zdHJ1Y3RvciJpbiBlKXx8ImZ1bmN0aW9uIj09dHlwZW9mIHkmJnkgaW5zdGFuY2VvZiB5JiYiZnVuY3Rpb24iPT10eXBlb2YgdiYmdiBpbnN0YW5jZW9mIHZ8fChwPSExKX1yZXR1cm4gby5kZWxldGUodCksby5kZWxldGUoZSkscH0sTXp0PVpJdCxFenQ9QVB0LFR6dD1rUHQuZXhwb3J0cyxDenQ9JFB0LEF6dD0iW29iamVjdCBBcmd1bWVudHNdIixrenQ9IltvYmplY3QgQXJyYXldIixMenQ9IltvYmplY3QgT2JqZWN0XSIsUHp0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIE56dD1mdW5jdGlvbiBJenQodCxlLG4saSxyLG8pe3ZhciBhPUV6dCh0KSxzPUV6dChlKSxsPWE/a3p0Ok16dCh0KSxjPXM/a3p0Ok16dChlKSx1PShsPWw9PUF6dD9MenQ6bCk9PUx6dCxoPShjPWM9PUF6dD9MenQ6Yyk9PUx6dCxkPWw9PWM7aWYoZCYmVHp0KHQpKXtpZighVHp0KGUpKXJldHVybiExO2E9ITAsdT0hMX1pZihkJiYhdSlyZXR1cm4gb3x8KG89bmV3IHl6dCksYXx8Q3p0KHQpP3Z6dCh0LGUsbixpLHIsbyk6Ynp0KHQsZSxsLG4saSxyLG8pO2lmKCEoMSZuKSl7dmFyIHA9dSYmUHp0LmNhbGwodCwiX193cmFwcGVkX18iKSxmPWgmJlB6dC5jYWxsKGUsIl9fd3JhcHBlZF9fIik7aWYocHx8Zil7dmFyIG09cD90LnZhbHVlKCk6dCxnPWY/ZS52YWx1ZSgpOmU7cmV0dXJuIG98fChvPW5ldyB5enQpLHIobSxnLG4saSxvKX19cmV0dXJuISFkJiYob3x8KG89bmV3IHl6dCksd3p0KHQsZSxuLGkscixvKSl9LFJ6dD1fUHQ7dmFyIE96dD1mdW5jdGlvbiB0KGUsbixpLHIsbyl7cmV0dXJuIGU9PT1ufHwobnVsbD09ZXx8bnVsbD09bnx8IVJ6dChlKSYmIVJ6dChuKT9lIT1lJiZuIT1uOk56dChlLG4saSxyLHQsbykpfSx6enQ9Skx0LER6dD1PenQ7dmFyIEJ6dD1Qa3Q7dmFyIEh6dD1mdW5jdGlvbiBGenQodCl7cmV0dXJuIHQ9PXQmJiFCenQodCl9LFZ6dD1IenQsVXp0PVNOdDt2YXIganp0PWZ1bmN0aW9uIEd6dCh0LGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gbnVsbCE9biYmKG5bdF09PT1lJiYodm9pZCAwIT09ZXx8dCBpbiBPYmplY3QobikpKX19LFd6dD1mdW5jdGlvbiBxenQodCxlLG4saSl7dmFyIHI9bi5sZW5ndGgsbz1yLGE9IWk7aWYobnVsbD09dClyZXR1cm4hbztmb3IodD1PYmplY3QodCk7ci0tOyl7dmFyIHM9bltyXTtpZihhJiZzWzJdP3NbMV0hPT10W3NbMF1dOiEoc1swXWluIHQpKXJldHVybiExfWZvcig7KytyPG87KXt2YXIgbD0ocz1uW3JdKVswXSxjPXRbbF0sdT1zWzFdO2lmKGEmJnNbMl0pe2lmKHZvaWQgMD09PWMmJiEobCBpbiB0KSlyZXR1cm4hMX1lbHNle3ZhciBoPW5ldyB6enQ7aWYoaSl2YXIgZD1pKGMsdSxsLHQsZSxoKTtpZighKHZvaWQgMD09PWQ/RHp0KHUsYywzLGksaCk6ZCkpcmV0dXJuITF9fXJldHVybiEwfSxZenQ9ZnVuY3Rpb24gWHp0KHQpe2Zvcih2YXIgZT1VenQodCksbj1lLmxlbmd0aDtuLS07KXt2YXIgaT1lW25dLHI9dFtpXTtlW25dPVtpLHIsVnp0KHIpXX1yZXR1cm4gZX0sJHp0PWp6dDt2YXIgS3p0PWZ1bmN0aW9uIFp6dCh0KXt2YXIgZT1ZenQodCk7cmV0dXJuIDE9PWUubGVuZ3RoJiZlWzBdWzJdPyR6dChlWzBdWzBdLGVbMF1bMV0pOmZ1bmN0aW9uKG4pe3JldHVybiBuPT09dHx8V3p0KG4sdCxlKX19LEp6dD1ra3QsUXp0PV9QdDt2YXIgdER0PWZ1bmN0aW9uIGVEdCh0KXtyZXR1cm4ic3ltYm9sIj09dHlwZW9mIHR8fFF6dCh0KSYmIltvYmplY3QgU3ltYm9sXSI9PUp6dCh0KX0sbkR0PUFQdCxpRHQ9dER0LHJEdD0vXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLyxvRHQ9L15cdyokLzt2YXIgYUR0PWZ1bmN0aW9uIHNEdCh0LGUpe2lmKG5EdCh0KSlyZXR1cm4hMTt2YXIgbj10eXBlb2YgdDtyZXR1cm4hKCJudW1iZXIiIT1uJiYic3ltYm9sIiE9biYmImJvb2xlYW4iIT1uJiZudWxsIT10JiYhaUR0KHQpKXx8KG9EdC50ZXN0KHQpfHwhckR0LnRlc3QodCl8fG51bGwhPWUmJnQgaW4gT2JqZWN0KGUpKX0sbER0PVZMdDtmdW5jdGlvbiBjRHQodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdHx8bnVsbCE9ZSYmImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgYSBmdW5jdGlvbiIpO3ZhciBuPWZ1bmN0aW9uKCl7dmFyIGk9YXJndW1lbnRzLHI9ZT9lLmFwcGx5KHRoaXMsaSk6aVswXSxvPW4uY2FjaGU7aWYoby5oYXMocikpcmV0dXJuIG8uZ2V0KHIpO3ZhciBhPXQuYXBwbHkodGhpcyxpKTtyZXR1cm4gbi5jYWNoZT1vLnNldChyLGEpfHxvLGF9O3JldHVybiBuLmNhY2hlPW5ldyhjRHQuQ2FjaGV8fGxEdCksbn1jRHQuQ2FjaGU9bER0O3ZhciB1RHQ9Y0R0O3ZhciBoRHQ9L1teLltcXV0rfFxbKD86KC0/XGQrKD86XC5cZCspPyl8KFsiJ10pKCg/Oig/IVwyKVteXFxdfFxcLikqPylcMilcXXwoPz0oPzpcLnxcW1xdKSg/OlwufFxbXF18JCkpL2csZER0PS9cXChcXCk/L2cscER0PShmdW5jdGlvbiBmRHQodCl7dmFyIGU9dUR0KHQsKGZ1bmN0aW9uKHQpe3JldHVybiA1MDA9PT1uLnNpemUmJm4uY2xlYXIoKSx0fSkpLG49ZS5jYWNoZTtyZXR1cm4gZX0pKChmdW5jdGlvbih0KXt2YXIgZT1bXTtyZXR1cm4gNDY9PT10LmNoYXJDb2RlQXQoMCkmJmUucHVzaCgiIiksdC5yZXBsYWNlKGhEdCwoZnVuY3Rpb24odCxuLGkscil7ZS5wdXNoKGk/ci5yZXBsYWNlKGREdCwiJDEiKTpufHx0KX0pKSxlfSkpO3ZhciBtRHQ9ZnVuY3Rpb24gZ0R0KHQsZSl7Zm9yKHZhciBuPS0xLGk9bnVsbD09dD8wOnQubGVuZ3RoLHI9QXJyYXkoaSk7KytuPGk7KXJbbl09ZSh0W25dLG4sdCk7cmV0dXJuIHJ9LF9EdD1tRHQseUR0PUFQdCx2RHQ9dER0LGJEdD15a3Q/eWt0LnByb3RvdHlwZTp2b2lkIDAseER0PWJEdD9iRHQudG9TdHJpbmc6dm9pZCAwO3ZhciB3RHQ9ZnVuY3Rpb24gdChlKXtpZigic3RyaW5nIj09dHlwZW9mIGUpcmV0dXJuIGU7aWYoeUR0KGUpKXJldHVybiBfRHQoZSx0KSsiIjtpZih2RHQoZSkpcmV0dXJuIHhEdD94RHQuY2FsbChlKToiIjt2YXIgbj1lKyIiO3JldHVybiIwIj09biYmMS9lPT0tSW5maW5pdHk/Ii0wIjpufTt2YXIgU0R0PWZ1bmN0aW9uIE1EdCh0KXtyZXR1cm4gbnVsbD09dD8iIjp3RHQodCl9LEVEdD1BUHQsVER0PWFEdCxDRHQ9cER0LEFEdD1TRHQ7dmFyIGtEdD1mdW5jdGlvbiBMRHQodCxlKXtyZXR1cm4gRUR0KHQpP3Q6VER0KHQsZSk/W3RdOkNEdChBRHQodCkpfSxQRHQ9dER0O3ZhciBORHQ9ZnVuY3Rpb24gSUR0KHQpe2lmKCJzdHJpbmciPT10eXBlb2YgdHx8UER0KHQpKXJldHVybiB0O3ZhciBlPXQrIiI7cmV0dXJuIjAiPT1lJiYxL3Q9PS1JbmZpbml0eT8iLTAiOmV9LFJEdD1rRHQsT0R0PU5EdDt2YXIgekR0PWZ1bmN0aW9uIEREdCh0LGUpe2Zvcih2YXIgbj0wLGk9KGU9UkR0KGUsdCkpLmxlbmd0aDtudWxsIT10JiZuPGk7KXQ9dFtPRHQoZVtuKytdKV07cmV0dXJuIG4mJm49PWk/dDp2b2lkIDB9LEJEdD16RHQ7dmFyIEhEdD1rRHQsRkR0PUNQdCxWRHQ9QVB0LFVEdD1JUHQsakR0PU9QdCxHRHQ9TkR0O3ZhciBXRHQ9ZnVuY3Rpb24gcUR0KHQsZSxuKXtmb3IodmFyIGk9LTEscj0oZT1IRHQoZSx0KSkubGVuZ3RoLG89ITE7KytpPHI7KXt2YXIgYT1HRHQoZVtpXSk7aWYoIShvPW51bGwhPXQmJm4odCxhKSkpYnJlYWs7dD10W2FdfXJldHVybiBvfHwrK2khPXI/bzohIShyPW51bGw9PXQ/MDp0Lmxlbmd0aCkmJmpEdChyKSYmVUR0KGEscikmJihWRHQodCl8fEZEdCh0KSl9LFlEdD1mdW5jdGlvbiBYRHQodCxlKXtyZXR1cm4gbnVsbCE9dCYmZSBpbiBPYmplY3QodCl9LCREdD1XRHQ7dmFyIEtEdD1mdW5jdGlvbiBaRHQodCxlKXtyZXR1cm4gbnVsbCE9dCYmJER0KHQsZSxZRHQpfSxKRHQ9T3p0LFFEdD1mdW5jdGlvbiB0QnQodCxlLG4pe3ZhciBpPW51bGw9PXQ/dm9pZCAwOkJEdCh0LGUpO3JldHVybiB2b2lkIDA9PT1pP246aX0sZUJ0PUtEdCxuQnQ9YUR0LGlCdD1IenQsckJ0PWp6dCxvQnQ9TkR0O3ZhciBhQnQ9ZnVuY3Rpb24gc0J0KHQpe3JldHVybiBmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT92b2lkIDA6ZVt0XX19LGxCdD16RHQ7dmFyIGNCdD1hQnQsdUJ0PWZ1bmN0aW9uIGhCdCh0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGxCdChlLHQpfX0sZEJ0PWFEdCxwQnQ9TkR0O3ZhciBmQnQ9S3p0LG1CdD1mdW5jdGlvbiBnQnQodCxlKXtyZXR1cm4gbkJ0KHQpJiZpQnQoZSk/ckJ0KG9CdCh0KSxlKTpmdW5jdGlvbihuKXt2YXIgaT1RRHQobix0KTtyZXR1cm4gdm9pZCAwPT09aSYmaT09PWU/ZUJ0KG4sdCk6SkR0KGUsaSwzKX19LF9CdD1QT3QseUJ0PUFQdCx2QnQ9ZnVuY3Rpb24gYkJ0KHQpe3JldHVybiBkQnQodCk/Y0J0KHBCdCh0KSk6dUJ0KHQpfTt2YXIgeEJ0PWZ1bmN0aW9uIHdCdCh0KXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgdD90Om51bGw9PXQ/X0J0OiJvYmplY3QiPT10eXBlb2YgdD95QnQodCk/bUJ0KHRbMF0sdFsxXSk6ZkJ0KHQpOnZCdCh0KX0sU0J0PVlOdCxNQnQ9R090LEVCdD14QnQsVEJ0PUFQdDt2YXIgQ0J0PWZ1bmN0aW9uIEFCdCh0LGUpe3JldHVybihUQnQodCk/U0J0Ok1CdCkodCxFQnQoZSkpfSxrQnQ9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTt2YXIgTEJ0PWZ1bmN0aW9uIFBCdCh0LGUpe3JldHVybiBudWxsIT10JiZrQnQuY2FsbCh0LGUpfSxOQnQ9V0R0O3ZhciBJQnQ9ZnVuY3Rpb24gUkJ0KHQsZSl7cmV0dXJuIG51bGwhPXQmJk5CdCh0LGUsTEJ0KX0sT0J0PWZOdCx6QnQ9Wkl0LERCdD1DUHQsQkJ0PUFQdCxIQnQ9eU50LEZCdD1rUHQuZXhwb3J0cyxWQnQ9YU50LFVCdD0kUHQsakJ0PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7dmFyIEdCdD1mdW5jdGlvbiBXQnQodCl7aWYobnVsbD09dClyZXR1cm4hMDtpZihIQnQodCkmJihCQnQodCl8fCJzdHJpbmciPT10eXBlb2YgdHx8ImZ1bmN0aW9uIj09dHlwZW9mIHQuc3BsaWNlfHxGQnQodCl8fFVCdCh0KXx8REJ0KHQpKSlyZXR1cm4hdC5sZW5ndGg7dmFyIGU9ekJ0KHQpO2lmKCJbb2JqZWN0IE1hcF0iPT1lfHwiW29iamVjdCBTZXRdIj09ZSlyZXR1cm4hdC5zaXplO2lmKFZCdCh0KSlyZXR1cm4hT0J0KHQpLmxlbmd0aDtmb3IodmFyIG4gaW4gdClpZihqQnQuY2FsbCh0LG4pKXJldHVybiExO3JldHVybiEwfTt2YXIgcUJ0PWZ1bmN0aW9uIFlCdCh0KXtyZXR1cm4gdm9pZCAwPT09dH0sWEJ0PWtPdCwkQnQ9eU50O3ZhciBLQnQ9ZnVuY3Rpb24gWkJ0KHQsZSl7dmFyIG49LTEsaT0kQnQodCk/QXJyYXkodC5sZW5ndGgpOltdO3JldHVybiBYQnQodCwoZnVuY3Rpb24odCxyLG8pe2lbKytuXT1lKHQscixvKX0pKSxpfSxKQnQ9bUR0LFFCdD14QnQsdEh0PUtCdCxlSHQ9QVB0O3ZhciBuSHQ9ZnVuY3Rpb24gaUh0KHQsZSl7cmV0dXJuKGVIdCh0KT9KQnQ6dEh0KSh0LFFCdChlKSl9O3ZhciBySHQ9ZnVuY3Rpb24gb0h0KHQsZSxuLGkpe3ZhciByPS0xLG89bnVsbD09dD8wOnQubGVuZ3RoO2ZvcihpJiZvJiYobj10Wysrcl0pOysrcjxvOyluPWUobix0W3JdLHIsdCk7cmV0dXJuIG59LGFIdD1rT3Qsc0h0PXhCdCxsSHQ9ZnVuY3Rpb24gY0h0KHQsZSxuLGkscil7cmV0dXJuIHIodCwoZnVuY3Rpb24odCxyLG8pe249aT8oaT0hMSx0KTplKG4sdCxyLG8pfSkpLG59LHVIdD1BUHQ7dmFyIGhIdD1mdW5jdGlvbiBkSHQodCxlLG4pe3ZhciBpPXVIdCh0KT9ySHQ6bEh0LHI9YXJndW1lbnRzLmxlbmd0aDwzO3JldHVybiBpKHQsc0h0KGUpLG4scixhSHQpfSxwSHQ9a2t0LGZIdD1BUHQsbUh0PV9QdDt2YXIgZ0h0PWZ1bmN0aW9uIF9IdCh0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIHR8fCFmSHQodCkmJm1IdCh0KSYmIltvYmplY3QgU3RyaW5nXSI9PXBIdCh0KX0seUh0PWFCdCgibGVuZ3RoIiksdkh0PVJlZ0V4cCgiW1xcdTIwMGRcXHVkODAwLVxcdWRmZmZcXHUwMzAwLVxcdTAzNmZcXHVmZTIwLVxcdWZlMmZcXHUyMGQwLVxcdTIwZmZcXHVmZTBlXFx1ZmUwZl0iKTt2YXIgYkh0PWZ1bmN0aW9uIHhIdCh0KXtyZXR1cm4gdkh0LnRlc3QodCl9LHdIdD0iW1xcdWQ4MDAtXFx1ZGZmZl0iLFNIdD0iW1xcdTAzMDAtXFx1MDM2ZlxcdWZlMjAtXFx1ZmUyZlxcdTIwZDAtXFx1MjBmZl0iLE1IdD0iXFx1ZDgzY1tcXHVkZmZiLVxcdWRmZmZdIixFSHQ9IlteXFx1ZDgwMC1cXHVkZmZmXSIsVEh0PSIoPzpcXHVkODNjW1xcdWRkZTYtXFx1ZGRmZl0pezJ9IixDSHQ9IltcXHVkODAwLVxcdWRiZmZdW1xcdWRjMDAtXFx1ZGZmZl0iLEFIdD0iKD86IitTSHQrInwiK01IdCsiKSIrIj8iLGtIdD0iW1xcdWZlMGVcXHVmZTBmXT8iLExIdD1rSHQrQUh0KygiKD86XFx1MjAwZCg/OiIrW0VIdCxUSHQsQ0h0XS5qb2luKCJ8IikrIikiK2tIdCtBSHQrIikqIiksUEh0PSIoPzoiK1tFSHQrU0h0KyI/IixTSHQsVEh0LENIdCx3SHRdLmpvaW4oInwiKSsiKSIsTkh0PVJlZ0V4cChNSHQrIig/PSIrTUh0KyIpfCIrUEh0K0xIdCwiZyIpO3ZhciBJSHQ9eUh0LFJIdD1iSHQsT0h0PWZ1bmN0aW9uIHpIdCh0KXtmb3IodmFyIGU9Tkh0Lmxhc3RJbmRleD0wO05IdC50ZXN0KHQpOykrK2U7cmV0dXJuIGV9O3ZhciBESHQ9Zk50LEJIdD1aSXQsSEh0PXlOdCxGSHQ9Z0h0LFZIdD1mdW5jdGlvbiBVSHQodCl7cmV0dXJuIFJIdCh0KT9PSHQodCk6SUh0KHQpfTt2YXIgakh0PWZ1bmN0aW9uIEdIdCh0KXtpZihudWxsPT10KXJldHVybiAwO2lmKEhIdCh0KSlyZXR1cm4gRkh0KHQpP1ZIdCh0KTp0Lmxlbmd0aDt2YXIgZT1CSHQodCk7cmV0dXJuIltvYmplY3QgTWFwXSI9PWV8fCJbb2JqZWN0IFNldF0iPT1lP3Quc2l6ZTpESHQodCkubGVuZ3RofSxXSHQ9UUx0LHFIdD1NUnQsWUh0PVRPdCxYSHQ9eEJ0LCRIdD1zSXQsS0h0PUFQdCxaSHQ9a1B0LmV4cG9ydHMsSkh0PXprdCxRSHQ9UGt0LHRGdD0kUHQ7dmFyIGVGdD1mdW5jdGlvbiBuRnQodCxlLG4pe3ZhciBpPUtIdCh0KSxyPWl8fFpIdCh0KXx8dEZ0KHQpO2lmKGU9WEh0KGUpLG51bGw9PW4pe3ZhciBvPXQmJnQuY29uc3RydWN0b3I7bj1yP2k/bmV3IG86W106UUh0KHQpJiZKSHQobyk/cUh0KCRIdCh0KSk6e319cmV0dXJuKHI/V0h0OllIdCkodCwoZnVuY3Rpb24odCxpLHIpe3JldHVybiBlKG4sdCxpLHIpfSkpLG59LGlGdD1DUHQsckZ0PUFQdCxvRnQ9eWt0P3lrdC5pc0NvbmNhdFNwcmVhZGFibGU6dm9pZCAwO3ZhciBhRnQ9b0l0LHNGdD1mdW5jdGlvbiBsRnQodCl7cmV0dXJuIHJGdCh0KXx8aUZ0KHQpfHwhIShvRnQmJnQmJnRbb0Z0XSl9O3ZhciBjRnQ9ZnVuY3Rpb24gdChlLG4saSxyLG8pe3ZhciBhPS0xLHM9ZS5sZW5ndGg7Zm9yKGl8fChpPXNGdCksb3x8KG89W10pOysrYTxzOyl7dmFyIGw9ZVthXTtuPjAmJmkobCk/bj4xP3QobCxuLTEsaSxyLG8pOmFGdChvLGwpOnJ8fChvW28ubGVuZ3RoXT1sKX1yZXR1cm4gb307dmFyIHVGdD1mdW5jdGlvbiBoRnQodCxlLG4pe3N3aXRjaChuLmxlbmd0aCl7Y2FzZSAwOnJldHVybiB0LmNhbGwoZSk7Y2FzZSAxOnJldHVybiB0LmNhbGwoZSxuWzBdKTtjYXNlIDI6cmV0dXJuIHQuY2FsbChlLG5bMF0sblsxXSk7Y2FzZSAzOnJldHVybiB0LmNhbGwoZSxuWzBdLG5bMV0sblsyXSl9cmV0dXJuIHQuYXBwbHkoZSxuKX0sZEZ0PU1hdGgubWF4O3ZhciBwRnQ9ZnVuY3Rpb24gZkZ0KHQsZSxuKXtyZXR1cm4gZT1kRnQodm9pZCAwPT09ZT90Lmxlbmd0aC0xOmUsMCksZnVuY3Rpb24oKXtmb3IodmFyIGk9YXJndW1lbnRzLHI9LTEsbz1kRnQoaS5sZW5ndGgtZSwwKSxhPUFycmF5KG8pOysrcjxvOylhW3JdPWlbZStyXTtyPS0xO2Zvcih2YXIgcz1BcnJheShlKzEpOysrcjxlOylzW3JdPWlbcl07cmV0dXJuIHNbZV09bihhKSx1RnQodCx0aGlzLHMpfX0sbUZ0PWJPdCxnRnQ9blB0LF9GdD1EYXRlLm5vdzt2YXIgeUZ0PShmdW5jdGlvbiB2RnQodCl7dmFyIGU9MCxuPTA7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGk9X0Z0KCkscj0xNi0oaS1uKTtpZihuPWkscj4wKXtpZigrK2U+PTgwMClyZXR1cm4gYXJndW1lbnRzWzBdfWVsc2UgZT0wO3JldHVybiB0LmFwcGx5KHZvaWQgMCxhcmd1bWVudHMpfX0pKGdGdD9mdW5jdGlvbih0LGUpe3JldHVybiBnRnQodCwidG9TdHJpbmciLHtjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMSx2YWx1ZTptRnQoZSksd3JpdGFibGU6ITB9KX06UE90KSxiRnQ9UE90LHhGdD1wRnQsd0Z0PXlGdDt2YXIgU0Z0PWZ1bmN0aW9uIE1GdCh0LGUpe3JldHVybiB3RnQoeEZ0KHQsZSxiRnQpLHQrIiIpfTt2YXIgRUZ0PWZ1bmN0aW9uIFRGdCh0LGUsbixpKXtmb3IodmFyIHI9dC5sZW5ndGgsbz1uKyhpPzE6LTEpO2k/by0tOisrbzxyOylpZihlKHRbb10sbyx0KSlyZXR1cm4gbztyZXR1cm4tMX07dmFyIENGdD1FRnQsQUZ0PWZ1bmN0aW9uIGtGdCh0KXtyZXR1cm4gdCE9dH0sTEZ0PWZ1bmN0aW9uIFBGdCh0LGUsbil7Zm9yKHZhciBpPW4tMSxyPXQubGVuZ3RoOysraTxyOylpZih0W2ldPT09ZSlyZXR1cm4gaTtyZXR1cm4tMX07dmFyIE5GdD1mdW5jdGlvbiBJRnQodCxlLG4pe3JldHVybiBlPT1lP0xGdCh0LGUsbik6Q0Z0KHQsQUZ0LG4pfTt2YXIgUkZ0PWZ1bmN0aW9uIE9GdCh0LGUpe3JldHVybiEhKG51bGw9PXQ/MDp0Lmxlbmd0aCkmJk5GdCh0LGUsMCk+LTF9O3ZhciB6RnQ9ZnVuY3Rpb24gREZ0KHQsZSxuKXtmb3IodmFyIGk9LTEscj1udWxsPT10PzA6dC5sZW5ndGg7KytpPHI7KWlmKG4oZSx0W2ldKSlyZXR1cm4hMDtyZXR1cm4hMX07dmFyIEJGdD1OSXQsSEZ0PWZ1bmN0aW9uIEZGdCgpe30sVkZ0PUJGdCYmMS9henQobmV3IEJGdChbLC0wXSkpWzFdPT0xLzA/ZnVuY3Rpb24odCl7cmV0dXJuIG5ldyBCRnQodCl9OkhGdCxVRnQ9Wk90LGpGdD1SRnQsR0Z0PXpGdCxXRnQ9Sk90LHFGdD1WRnQsWUZ0PWF6dDt2YXIgWEZ0PXlOdCwkRnQ9X1B0O3ZhciBLRnQ9ZnVuY3Rpb24gWkZ0KHQpe3JldHVybiAkRnQodCkmJlhGdCh0KX0sSkZ0PWNGdCxRRnQ9ZnVuY3Rpb24gdFZ0KHQsZSxuKXt2YXIgaT0tMSxyPWpGdCxvPXQubGVuZ3RoLGE9ITAscz1bXSxsPXM7aWYobilhPSExLHI9R0Z0O2Vsc2UgaWYobz49MjAwKXt2YXIgYz1lP251bGw6cUZ0KHQpO2lmKGMpcmV0dXJuIFlGdChjKTthPSExLHI9V0Z0LGw9bmV3IFVGdH1lbHNlIGw9ZT9bXTpzO3Q6Zm9yKDsrK2k8bzspe3ZhciB1PXRbaV0saD1lP2UodSk6dTtpZih1PW58fDAhPT11P3U6MCxhJiZoPT1oKXtmb3IodmFyIGQ9bC5sZW5ndGg7ZC0tOylpZihsW2RdPT09aCljb250aW51ZSB0O2UmJmwucHVzaChoKSxzLnB1c2godSl9ZWxzZSByKGwsaCxuKXx8KGwhPT1zJiZsLnB1c2goaCkscy5wdXNoKHUpKX1yZXR1cm4gc30sZVZ0PUtGdCxuVnQ9U0Z0KChmdW5jdGlvbih0KXtyZXR1cm4gUUZ0KEpGdCh0LDEsZVZ0LCEwKSl9KSksaVZ0PW1EdDt2YXIgclZ0PWZ1bmN0aW9uIG9WdCh0LGUpe3JldHVybiBpVnQoZSwoZnVuY3Rpb24oZSl7cmV0dXJuIHRbZV19KSl9LGFWdD1TTnQ7dmFyIHNWdCxsVnQ9ZnVuY3Rpb24gY1Z0KHQpe3JldHVybiBudWxsPT10P1tdOnJWdCh0LGFWdCh0KSl9O3RyeXtzVnQ9e2Nsb25lOnlPdCxjb25zdGFudDpiT3QsZWFjaDpVT3QsZmlsdGVyOkNCdCxoYXM6SUJ0LGlzQXJyYXk6QVB0LGlzRW1wdHk6R0J0LGlzRnVuY3Rpb246emt0LGlzVW5kZWZpbmVkOnFCdCxrZXlzOlNOdCxtYXA6bkh0LHJlZHVjZTpoSHQsc2l6ZTpqSHQsdHJhbnNmb3JtOmVGdCx1bmlvbjpuVnQsdmFsdWVzOmxWdH19Y2F0Y2godCl7fXNWdHx8KHNWdD13aW5kb3cuXyk7dmFyIHVWdD1zVnQsaFZ0PXVWdCxkVnQ9ZlZ0LHBWdD0iXDAiO2Z1bmN0aW9uIGZWdCh0KXt0aGlzLl9pc0RpcmVjdGVkPSFoVnQuaGFzKHQsImRpcmVjdGVkIil8fHQuZGlyZWN0ZWQsdGhpcy5faXNNdWx0aWdyYXBoPSEhaFZ0Lmhhcyh0LCJtdWx0aWdyYXBoIikmJnQubXVsdGlncmFwaCx0aGlzLl9pc0NvbXBvdW5kPSEhaFZ0Lmhhcyh0LCJjb21wb3VuZCIpJiZ0LmNvbXBvdW5kLHRoaXMuX2xhYmVsPXZvaWQgMCx0aGlzLl9kZWZhdWx0Tm9kZUxhYmVsRm49aFZ0LmNvbnN0YW50KHZvaWQgMCksdGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuPWhWdC5jb25zdGFudCh2b2lkIDApLHRoaXMuX25vZGVzPXt9LHRoaXMuX2lzQ29tcG91bmQmJih0aGlzLl9wYXJlbnQ9e30sdGhpcy5fY2hpbGRyZW49e30sdGhpcy5fY2hpbGRyZW5bIlwwIl09e30pLHRoaXMuX2luPXt9LHRoaXMuX3ByZWRzPXt9LHRoaXMuX291dD17fSx0aGlzLl9zdWNzPXt9LHRoaXMuX2VkZ2VPYmpzPXt9LHRoaXMuX2VkZ2VMYWJlbHM9e319ZnVuY3Rpb24gbVZ0KHQsZSl7dFtlXT90W2VdKys6dFtlXT0xfWZ1bmN0aW9uIGdWdCh0LGUpey0tdFtlXXx8ZGVsZXRlIHRbZV19ZnVuY3Rpb24gX1Z0KHQsZSxuLGkpe3ZhciByPSIiK2Usbz0iIituO2lmKCF0JiZyPm8pe3ZhciBhPXI7cj1vLG89YX1yZXR1cm4gcisiASIrbysiASIrKGhWdC5pc1VuZGVmaW5lZChpKT8iXDAiOmkpfWZ1bmN0aW9uIHlWdCh0LGUsbixpKXt2YXIgcj0iIitlLG89IiIrbjtpZighdCYmcj5vKXt2YXIgYT1yO3I9byxvPWF9dmFyIHM9e3Y6cix3Om99O3JldHVybiBpJiYocy5uYW1lPWkpLHN9ZnVuY3Rpb24gdlZ0KHQsZSl7cmV0dXJuIF9WdCh0LGUudixlLncsZS5uYW1lKX1mVnQucHJvdG90eXBlLl9ub2RlQ291bnQ9MCxmVnQucHJvdG90eXBlLl9lZGdlQ291bnQ9MCxmVnQucHJvdG90eXBlLmlzRGlyZWN0ZWQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNEaXJlY3RlZH0sZlZ0LnByb3RvdHlwZS5pc011bHRpZ3JhcGg9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNNdWx0aWdyYXBofSxmVnQucHJvdG90eXBlLmlzQ29tcG91bmQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5faXNDb21wb3VuZH0sZlZ0LnByb3RvdHlwZS5zZXRHcmFwaD1mdW5jdGlvbih0KXtyZXR1cm4gdGhpcy5fbGFiZWw9dCx0aGlzfSxmVnQucHJvdG90eXBlLmdyYXBoPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2xhYmVsfSxmVnQucHJvdG90eXBlLnNldERlZmF1bHROb2RlTGFiZWw9ZnVuY3Rpb24odCl7cmV0dXJuIGhWdC5pc0Z1bmN0aW9uKHQpfHwodD1oVnQuY29uc3RhbnQodCkpLHRoaXMuX2RlZmF1bHROb2RlTGFiZWxGbj10LHRoaXN9LGZWdC5wcm90b3R5cGUubm9kZUNvdW50PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX25vZGVDb3VudH0sZlZ0LnByb3RvdHlwZS5ub2Rlcz1mdW5jdGlvbigpe3JldHVybiBoVnQua2V5cyh0aGlzLl9ub2Rlcyl9LGZWdC5wcm90b3R5cGUuc291cmNlcz1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIGhWdC5maWx0ZXIodGhpcy5ub2RlcygpLChmdW5jdGlvbihlKXtyZXR1cm4gaFZ0LmlzRW1wdHkodC5faW5bZV0pfSkpfSxmVnQucHJvdG90eXBlLnNpbmtzPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcztyZXR1cm4gaFZ0LmZpbHRlcih0aGlzLm5vZGVzKCksKGZ1bmN0aW9uKGUpe3JldHVybiBoVnQuaXNFbXB0eSh0Ll9vdXRbZV0pfSkpfSxmVnQucHJvdG90eXBlLnNldE5vZGVzPWZ1bmN0aW9uKHQsZSl7dmFyIG49YXJndW1lbnRzLGk9dGhpcztyZXR1cm4gaFZ0LmVhY2godCwoZnVuY3Rpb24odCl7bi5sZW5ndGg+MT9pLnNldE5vZGUodCxlKTppLnNldE5vZGUodCl9KSksdGhpc30sZlZ0LnByb3RvdHlwZS5zZXROb2RlPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGhWdC5oYXModGhpcy5fbm9kZXMsdCk/KGFyZ3VtZW50cy5sZW5ndGg+MSYmKHRoaXMuX25vZGVzW3RdPWUpLHRoaXMpOih0aGlzLl9ub2Rlc1t0XT1hcmd1bWVudHMubGVuZ3RoPjE/ZTp0aGlzLl9kZWZhdWx0Tm9kZUxhYmVsRm4odCksdGhpcy5faXNDb21wb3VuZCYmKHRoaXMuX3BhcmVudFt0XT1wVnQsdGhpcy5fY2hpbGRyZW5bdF09e30sdGhpcy5fY2hpbGRyZW5bIlwwIl1bdF09ITApLHRoaXMuX2luW3RdPXt9LHRoaXMuX3ByZWRzW3RdPXt9LHRoaXMuX291dFt0XT17fSx0aGlzLl9zdWNzW3RdPXt9LCsrdGhpcy5fbm9kZUNvdW50LHRoaXMpfSxmVnQucHJvdG90eXBlLm5vZGU9ZnVuY3Rpb24odCl7cmV0dXJuIHRoaXMuX25vZGVzW3RdfSxmVnQucHJvdG90eXBlLmhhc05vZGU9ZnVuY3Rpb24odCl7cmV0dXJuIGhWdC5oYXModGhpcy5fbm9kZXMsdCl9LGZWdC5wcm90b3R5cGUucmVtb3ZlTm9kZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzO2lmKGhWdC5oYXModGhpcy5fbm9kZXMsdCkpe3ZhciBuPWZ1bmN0aW9uKHQpe2UucmVtb3ZlRWRnZShlLl9lZGdlT2Jqc1t0XSl9O2RlbGV0ZSB0aGlzLl9ub2Rlc1t0XSx0aGlzLl9pc0NvbXBvdW5kJiYodGhpcy5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3QodCksZGVsZXRlIHRoaXMuX3BhcmVudFt0XSxoVnQuZWFjaCh0aGlzLmNoaWxkcmVuKHQpLChmdW5jdGlvbih0KXtlLnNldFBhcmVudCh0KX0pKSxkZWxldGUgdGhpcy5fY2hpbGRyZW5bdF0pLGhWdC5lYWNoKGhWdC5rZXlzKHRoaXMuX2luW3RdKSxuKSxkZWxldGUgdGhpcy5faW5bdF0sZGVsZXRlIHRoaXMuX3ByZWRzW3RdLGhWdC5lYWNoKGhWdC5rZXlzKHRoaXMuX291dFt0XSksbiksZGVsZXRlIHRoaXMuX291dFt0XSxkZWxldGUgdGhpcy5fc3Vjc1t0XSwtLXRoaXMuX25vZGVDb3VudH1yZXR1cm4gdGhpc30sZlZ0LnByb3RvdHlwZS5zZXRQYXJlbnQ9ZnVuY3Rpb24odCxlKXtpZighdGhpcy5faXNDb21wb3VuZCl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCBzZXQgcGFyZW50IGluIGEgbm9uLWNvbXBvdW5kIGdyYXBoIik7aWYoaFZ0LmlzVW5kZWZpbmVkKGUpKWU9cFZ0O2Vsc2V7Zm9yKHZhciBuPWUrPSIiOyFoVnQuaXNVbmRlZmluZWQobik7bj10aGlzLnBhcmVudChuKSlpZihuPT09dCl0aHJvdyBuZXcgRXJyb3IoIlNldHRpbmcgIitlKyIgYXMgcGFyZW50IG9mICIrdCsiIHdvdWxkIGNyZWF0ZSBhIGN5Y2xlIik7dGhpcy5zZXROb2RlKGUpfXJldHVybiB0aGlzLnNldE5vZGUodCksdGhpcy5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3QodCksdGhpcy5fcGFyZW50W3RdPWUsdGhpcy5fY2hpbGRyZW5bZV1bdF09ITAsdGhpc30sZlZ0LnByb3RvdHlwZS5fcmVtb3ZlRnJvbVBhcmVudHNDaGlsZExpc3Q9ZnVuY3Rpb24odCl7ZGVsZXRlIHRoaXMuX2NoaWxkcmVuW3RoaXMuX3BhcmVudFt0XV1bdF19LGZWdC5wcm90b3R5cGUucGFyZW50PWZ1bmN0aW9uKHQpe2lmKHRoaXMuX2lzQ29tcG91bmQpe3ZhciBlPXRoaXMuX3BhcmVudFt0XTtpZihlIT09cFZ0KXJldHVybiBlfX0sZlZ0LnByb3RvdHlwZS5jaGlsZHJlbj1mdW5jdGlvbih0KXtpZihoVnQuaXNVbmRlZmluZWQodCkmJih0PXBWdCksdGhpcy5faXNDb21wb3VuZCl7dmFyIGU9dGhpcy5fY2hpbGRyZW5bdF07aWYoZSlyZXR1cm4gaFZ0LmtleXMoZSl9ZWxzZXtpZih0PT09cFZ0KXJldHVybiB0aGlzLm5vZGVzKCk7aWYodGhpcy5oYXNOb2RlKHQpKXJldHVybltdfX0sZlZ0LnByb3RvdHlwZS5wcmVkZWNlc3NvcnM9ZnVuY3Rpb24odCl7dmFyIGU9dGhpcy5fcHJlZHNbdF07aWYoZSlyZXR1cm4gaFZ0LmtleXMoZSl9LGZWdC5wcm90b3R5cGUuc3VjY2Vzc29ycz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9zdWNzW3RdO2lmKGUpcmV0dXJuIGhWdC5rZXlzKGUpfSxmVnQucHJvdG90eXBlLm5laWdoYm9ycz1mdW5jdGlvbih0KXt2YXIgZT10aGlzLnByZWRlY2Vzc29ycyh0KTtpZihlKXJldHVybiBoVnQudW5pb24oZSx0aGlzLnN1Y2Nlc3NvcnModCkpfSxmVnQucHJvdG90eXBlLmlzTGVhZj1mdW5jdGlvbih0KXtyZXR1cm4gMD09PSh0aGlzLmlzRGlyZWN0ZWQoKT90aGlzLnN1Y2Nlc3NvcnModCk6dGhpcy5uZWlnaGJvcnModCkpLmxlbmd0aH0sZlZ0LnByb3RvdHlwZS5maWx0ZXJOb2Rlcz1mdW5jdGlvbih0KXt2YXIgZT1uZXcgdGhpcy5jb25zdHJ1Y3Rvcih7ZGlyZWN0ZWQ6dGhpcy5faXNEaXJlY3RlZCxtdWx0aWdyYXBoOnRoaXMuX2lzTXVsdGlncmFwaCxjb21wb3VuZDp0aGlzLl9pc0NvbXBvdW5kfSk7ZS5zZXRHcmFwaCh0aGlzLmdyYXBoKCkpO3ZhciBuPXRoaXM7aFZ0LmVhY2godGhpcy5fbm9kZXMsKGZ1bmN0aW9uKG4saSl7dChpKSYmZS5zZXROb2RlKGksbil9KSksaFZ0LmVhY2godGhpcy5fZWRnZU9ianMsKGZ1bmN0aW9uKHQpe2UuaGFzTm9kZSh0LnYpJiZlLmhhc05vZGUodC53KSYmZS5zZXRFZGdlKHQsbi5lZGdlKHQpKX0pKTt2YXIgaT17fTtmdW5jdGlvbiByKHQpe3ZhciBvPW4ucGFyZW50KHQpO3JldHVybiB2b2lkIDA9PT1vfHxlLmhhc05vZGUobyk/KGlbdF09byxvKTpvIGluIGk/aVtvXTpyKG8pfXJldHVybiB0aGlzLl9pc0NvbXBvdW5kJiZoVnQuZWFjaChlLm5vZGVzKCksKGZ1bmN0aW9uKHQpe2Uuc2V0UGFyZW50KHQscih0KSl9KSksZX0sZlZ0LnByb3RvdHlwZS5zZXREZWZhdWx0RWRnZUxhYmVsPWZ1bmN0aW9uKHQpe3JldHVybiBoVnQuaXNGdW5jdGlvbih0KXx8KHQ9aFZ0LmNvbnN0YW50KHQpKSx0aGlzLl9kZWZhdWx0RWRnZUxhYmVsRm49dCx0aGlzfSxmVnQucHJvdG90eXBlLmVkZ2VDb3VudD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9lZGdlQ291bnR9LGZWdC5wcm90b3R5cGUuZWRnZXM9ZnVuY3Rpb24oKXtyZXR1cm4gaFZ0LnZhbHVlcyh0aGlzLl9lZGdlT2Jqcyl9LGZWdC5wcm90b3R5cGUuc2V0UGF0aD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMsaT1hcmd1bWVudHM7cmV0dXJuIGhWdC5yZWR1Y2UodCwoZnVuY3Rpb24odCxyKXtyZXR1cm4gaS5sZW5ndGg+MT9uLnNldEVkZ2UodCxyLGUpOm4uc2V0RWRnZSh0LHIpLHJ9KSksdGhpc30sZlZ0LnByb3RvdHlwZS5zZXRFZGdlPWZ1bmN0aW9uKCl7dmFyIHQsZSxuLGkscj0hMSxvPWFyZ3VtZW50c1swXTsib2JqZWN0Ij09dHlwZW9mIG8mJm51bGwhPT1vJiYidiJpbiBvPyh0PW8udixlPW8udyxuPW8ubmFtZSwyPT09YXJndW1lbnRzLmxlbmd0aCYmKGk9YXJndW1lbnRzWzFdLHI9ITApKToodD1vLGU9YXJndW1lbnRzWzFdLG49YXJndW1lbnRzWzNdLGFyZ3VtZW50cy5sZW5ndGg+MiYmKGk9YXJndW1lbnRzWzJdLHI9ITApKSx0PSIiK3QsZT0iIitlLGhWdC5pc1VuZGVmaW5lZChuKXx8KG49IiIrbik7dmFyIGE9X1Z0KHRoaXMuX2lzRGlyZWN0ZWQsdCxlLG4pO2lmKGhWdC5oYXModGhpcy5fZWRnZUxhYmVscyxhKSlyZXR1cm4gciYmKHRoaXMuX2VkZ2VMYWJlbHNbYV09aSksdGhpcztpZighaFZ0LmlzVW5kZWZpbmVkKG4pJiYhdGhpcy5faXNNdWx0aWdyYXBoKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHNldCBhIG5hbWVkIGVkZ2Ugd2hlbiBpc011bHRpZ3JhcGggPSBmYWxzZSIpO3RoaXMuc2V0Tm9kZSh0KSx0aGlzLnNldE5vZGUoZSksdGhpcy5fZWRnZUxhYmVsc1thXT1yP2k6dGhpcy5fZGVmYXVsdEVkZ2VMYWJlbEZuKHQsZSxuKTt2YXIgcz15VnQodGhpcy5faXNEaXJlY3RlZCx0LGUsbik7cmV0dXJuIHQ9cy52LGU9cy53LE9iamVjdC5mcmVlemUocyksdGhpcy5fZWRnZU9ianNbYV09cyxtVnQodGhpcy5fcHJlZHNbZV0sdCksbVZ0KHRoaXMuX3N1Y3NbdF0sZSksdGhpcy5faW5bZV1bYV09cyx0aGlzLl9vdXRbdF1bYV09cyx0aGlzLl9lZGdlQ291bnQrKyx0aGlzfSxmVnQucHJvdG90eXBlLmVkZ2U9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPTE9PT1hcmd1bWVudHMubGVuZ3RoP3ZWdCh0aGlzLl9pc0RpcmVjdGVkLGFyZ3VtZW50c1swXSk6X1Z0KHRoaXMuX2lzRGlyZWN0ZWQsdCxlLG4pO3JldHVybiB0aGlzLl9lZGdlTGFiZWxzW2ldfSxmVnQucHJvdG90eXBlLmhhc0VkZ2U9ZnVuY3Rpb24odCxlLG4pe3ZhciBpPTE9PT1hcmd1bWVudHMubGVuZ3RoP3ZWdCh0aGlzLl9pc0RpcmVjdGVkLGFyZ3VtZW50c1swXSk6X1Z0KHRoaXMuX2lzRGlyZWN0ZWQsdCxlLG4pO3JldHVybiBoVnQuaGFzKHRoaXMuX2VkZ2VMYWJlbHMsaSl9LGZWdC5wcm90b3R5cGUucmVtb3ZlRWRnZT1mdW5jdGlvbih0LGUsbil7dmFyIGk9MT09PWFyZ3VtZW50cy5sZW5ndGg/dlZ0KHRoaXMuX2lzRGlyZWN0ZWQsYXJndW1lbnRzWzBdKTpfVnQodGhpcy5faXNEaXJlY3RlZCx0LGUsbikscj10aGlzLl9lZGdlT2Jqc1tpXTtyZXR1cm4gciYmKHQ9ci52LGU9ci53LGRlbGV0ZSB0aGlzLl9lZGdlTGFiZWxzW2ldLGRlbGV0ZSB0aGlzLl9lZGdlT2Jqc1tpXSxnVnQodGhpcy5fcHJlZHNbZV0sdCksZ1Z0KHRoaXMuX3N1Y3NbdF0sZSksZGVsZXRlIHRoaXMuX2luW2VdW2ldLGRlbGV0ZSB0aGlzLl9vdXRbdF1baV0sdGhpcy5fZWRnZUNvdW50LS0pLHRoaXN9LGZWdC5wcm90b3R5cGUuaW5FZGdlcz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2luW3RdO2lmKG4pe3ZhciBpPWhWdC52YWx1ZXMobik7cmV0dXJuIGU/aFZ0LmZpbHRlcihpLChmdW5jdGlvbih0KXtyZXR1cm4gdC52PT09ZX0pKTppfX0sZlZ0LnByb3RvdHlwZS5vdXRFZGdlcz1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX291dFt0XTtpZihuKXt2YXIgaT1oVnQudmFsdWVzKG4pO3JldHVybiBlP2hWdC5maWx0ZXIoaSwoZnVuY3Rpb24odCl7cmV0dXJuIHQudz09PWV9KSk6aX19LGZWdC5wcm90b3R5cGUubm9kZUVkZ2VzPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5pbkVkZ2VzKHQsZSk7aWYobilyZXR1cm4gbi5jb25jYXQodGhpcy5vdXRFZGdlcyh0LGUpKX07dmFyIGJWdD17R3JhcGg6ZFZ0LHZlcnNpb246IjIuMS44In0seFZ0PXVWdCx3VnQ9ZFZ0LFNWdD17d3JpdGU6ZnVuY3Rpb24gTVZ0KHQpe3ZhciBlPXtvcHRpb25zOntkaXJlY3RlZDp0LmlzRGlyZWN0ZWQoKSxtdWx0aWdyYXBoOnQuaXNNdWx0aWdyYXBoKCksY29tcG91bmQ6dC5pc0NvbXBvdW5kKCl9LG5vZGVzOlRWdCh0KSxlZGdlczpDVnQodCl9O3hWdC5pc1VuZGVmaW5lZCh0LmdyYXBoKCkpfHwoZS52YWx1ZT14VnQuY2xvbmUodC5ncmFwaCgpKSk7cmV0dXJuIGV9LHJlYWQ6ZnVuY3Rpb24gRVZ0KHQpe3ZhciBlPW5ldyB3VnQodC5vcHRpb25zKS5zZXRHcmFwaCh0LnZhbHVlKTtyZXR1cm4geFZ0LmVhY2godC5ub2RlcywoZnVuY3Rpb24odCl7ZS5zZXROb2RlKHQudix0LnZhbHVlKSx0LnBhcmVudCYmZS5zZXRQYXJlbnQodC52LHQucGFyZW50KX0pKSx4VnQuZWFjaCh0LmVkZ2VzLChmdW5jdGlvbih0KXtlLnNldEVkZ2Uoe3Y6dC52LHc6dC53LG5hbWU6dC5uYW1lfSx0LnZhbHVlKX0pKSxlfX07ZnVuY3Rpb24gVFZ0KHQpe3JldHVybiB4VnQubWFwKHQubm9kZXMoKSwoZnVuY3Rpb24oZSl7dmFyIG49dC5ub2RlKGUpLGk9dC5wYXJlbnQoZSkscj17djplfTtyZXR1cm4geFZ0LmlzVW5kZWZpbmVkKG4pfHwoci52YWx1ZT1uKSx4VnQuaXNVbmRlZmluZWQoaSl8fChyLnBhcmVudD1pKSxyfSkpfWZ1bmN0aW9uIENWdCh0KXtyZXR1cm4geFZ0Lm1hcCh0LmVkZ2VzKCksKGZ1bmN0aW9uKGUpe3ZhciBuPXQuZWRnZShlKSxpPXt2OmUudix3OmUud307cmV0dXJuIHhWdC5pc1VuZGVmaW5lZChlLm5hbWUpfHwoaS5uYW1lPWUubmFtZSkseFZ0LmlzVW5kZWZpbmVkKG4pfHwoaS52YWx1ZT1uKSxpfSkpfXZhciBBVnQ9dVZ0LGtWdD1mdW5jdGlvbiBMVnQodCl7dmFyIGUsbj17fSxpPVtdO2Z1bmN0aW9uIHIoaSl7QVZ0LmhhcyhuLGkpfHwobltpXT0hMCxlLnB1c2goaSksQVZ0LmVhY2godC5zdWNjZXNzb3JzKGkpLHIpLEFWdC5lYWNoKHQucHJlZGVjZXNzb3JzKGkpLHIpKX1yZXR1cm4gQVZ0LmVhY2godC5ub2RlcygpLChmdW5jdGlvbih0KXtlPVtdLHIodCksZS5sZW5ndGgmJmkucHVzaChlKX0pKSxpfTt2YXIgUFZ0PXVWdCxOVnQ9SVZ0O2Z1bmN0aW9uIElWdCgpe3RoaXMuX2Fycj1bXSx0aGlzLl9rZXlJbmRpY2VzPXt9fUlWdC5wcm90b3R5cGUuc2l6ZT1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9hcnIubGVuZ3RofSxJVnQucHJvdG90eXBlLmtleXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fYXJyLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHQua2V5fSkpfSxJVnQucHJvdG90eXBlLmhhcz1mdW5jdGlvbih0KXtyZXR1cm4gUFZ0Lmhhcyh0aGlzLl9rZXlJbmRpY2VzLHQpfSxJVnQucHJvdG90eXBlLnByaW9yaXR5PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2tleUluZGljZXNbdF07aWYodm9pZCAwIT09ZSlyZXR1cm4gdGhpcy5fYXJyW2VdLnByaW9yaXR5fSxJVnQucHJvdG90eXBlLm1pbj1mdW5jdGlvbigpe2lmKDA9PT10aGlzLnNpemUoKSl0aHJvdyBuZXcgRXJyb3IoIlF1ZXVlIHVuZGVyZmxvdyIpO3JldHVybiB0aGlzLl9hcnJbMF0ua2V5fSxJVnQucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0LGUpe3ZhciBuPXRoaXMuX2tleUluZGljZXM7aWYodD1TdHJpbmcodCksIVBWdC5oYXMobix0KSl7dmFyIGk9dGhpcy5fYXJyLHI9aS5sZW5ndGg7cmV0dXJuIG5bdF09cixpLnB1c2goe2tleTp0LHByaW9yaXR5OmV9KSx0aGlzLl9kZWNyZWFzZShyKSwhMH1yZXR1cm4hMX0sSVZ0LnByb3RvdHlwZS5yZW1vdmVNaW49ZnVuY3Rpb24oKXt0aGlzLl9zd2FwKDAsdGhpcy5fYXJyLmxlbmd0aC0xKTt2YXIgdD10aGlzLl9hcnIucG9wKCk7cmV0dXJuIGRlbGV0ZSB0aGlzLl9rZXlJbmRpY2VzW3Qua2V5XSx0aGlzLl9oZWFwaWZ5KDApLHQua2V5fSxJVnQucHJvdG90eXBlLmRlY3JlYXNlPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fa2V5SW5kaWNlc1t0XTtpZihlPnRoaXMuX2FycltuXS5wcmlvcml0eSl0aHJvdyBuZXcgRXJyb3IoIk5ldyBwcmlvcml0eSBpcyBncmVhdGVyIHRoYW4gY3VycmVudCBwcmlvcml0eS4gS2V5OiAiK3QrIiBPbGQ6ICIrdGhpcy5fYXJyW25dLnByaW9yaXR5KyIgTmV3OiAiK2UpO3RoaXMuX2FycltuXS5wcmlvcml0eT1lLHRoaXMuX2RlY3JlYXNlKG4pfSxJVnQucHJvdG90eXBlLl9oZWFwaWZ5PWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX2FycixuPTIqdCxpPW4rMSxyPXQ7bjxlLmxlbmd0aCYmKHI9ZVtuXS5wcmlvcml0eTxlW3JdLnByaW9yaXR5P246cixpPGUubGVuZ3RoJiYocj1lW2ldLnByaW9yaXR5PGVbcl0ucHJpb3JpdHk/aTpyKSxyIT09dCYmKHRoaXMuX3N3YXAodCxyKSx0aGlzLl9oZWFwaWZ5KHIpKSl9LElWdC5wcm90b3R5cGUuX2RlY3JlYXNlPWZ1bmN0aW9uKHQpe2Zvcih2YXIgZSxuPXRoaXMuX2FycixpPW5bdF0ucHJpb3JpdHk7MCE9PXQmJiEobltlPXQ+PjFdLnByaW9yaXR5PGkpOyl0aGlzLl9zd2FwKHQsZSksdD1lfSxJVnQucHJvdG90eXBlLl9zd2FwPWZ1bmN0aW9uKHQsZSl7dmFyIG49dGhpcy5fYXJyLGk9dGhpcy5fa2V5SW5kaWNlcyxyPW5bdF0sbz1uW2VdO25bdF09byxuW2VdPXIsaVtvLmtleV09dCxpW3Iua2V5XT1lfTt2YXIgUlZ0PU5WdCxPVnQ9ZnVuY3Rpb24gelZ0KHQsZSxuLGkpe3JldHVybihmdW5jdGlvbiByKHQsZSxuLGkpe3ZhciByLG8sYT17fSxzPW5ldyBSVnQsbD1mdW5jdGlvbih0KXt2YXIgZT10LnYhPT1yP3Qudjp0LncsaT1hW2VdLGw9bih0KSxjPW8uZGlzdGFuY2UrbDtpZihsPDApdGhyb3cgbmV3IEVycm9yKCJkaWprc3RyYSBkb2VzIG5vdCBhbGxvdyBuZWdhdGl2ZSBlZGdlIHdlaWdodHMuIEJhZCBlZGdlOiAiK3QrIiBXZWlnaHQ6ICIrbCk7YzxpLmRpc3RhbmNlJiYoaS5kaXN0YW5jZT1jLGkucHJlZGVjZXNzb3I9cixzLmRlY3JlYXNlKGUsYykpfTt0Lm5vZGVzKCkuZm9yRWFjaCgoZnVuY3Rpb24odCl7dmFyIG49dD09PWU/MDpOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7YVt0XT17ZGlzdGFuY2U6bn0scy5hZGQodCxuKX0pKTtmb3IoO3Muc2l6ZSgpPjAmJihyPXMucmVtb3ZlTWluKCksKG89YVtyXSkuZGlzdGFuY2UhPT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpOylpKHIpLmZvckVhY2gobCk7cmV0dXJuIGF9KSh0LFN0cmluZyhlKSxufHxEVnQsaXx8ZnVuY3Rpb24oZSl7cmV0dXJuIHQub3V0RWRnZXMoZSl9KX0sRFZ0PXVWdC5jb25zdGFudCgxKTt2YXIgQlZ0PU9WdCxIVnQ9dVZ0LEZWdD1mdW5jdGlvbiBWVnQodCxlLG4pe3JldHVybiBIVnQudHJhbnNmb3JtKHQubm9kZXMoKSwoZnVuY3Rpb24oaSxyKXtpW3JdPUJWdCh0LHIsZSxuKX0pLHt9KX07dmFyIFVWdD11VnQsalZ0PWZ1bmN0aW9uIEdWdCh0KXt2YXIgZT0wLG49W10saT17fSxyPVtdO2Z1bmN0aW9uIG8oYSl7dmFyIHM9aVthXT17b25TdGFjazohMCxsb3dsaW5rOmUsaW5kZXg6ZSsrfTtpZihuLnB1c2goYSksdC5zdWNjZXNzb3JzKGEpLmZvckVhY2goKGZ1bmN0aW9uKHQpe1VWdC5oYXMoaSx0KT9pW3RdLm9uU3RhY2smJihzLmxvd2xpbms9TWF0aC5taW4ocy5sb3dsaW5rLGlbdF0uaW5kZXgpKToobyh0KSxzLmxvd2xpbms9TWF0aC5taW4ocy5sb3dsaW5rLGlbdF0ubG93bGluaykpfSkpLHMubG93bGluaz09PXMuaW5kZXgpe3ZhciBsLGM9W107ZG97bD1uLnBvcCgpLGlbbF0ub25TdGFjaz0hMSxjLnB1c2gobCl9d2hpbGUoYSE9PWwpO3IucHVzaChjKX19cmV0dXJuIHQubm9kZXMoKS5mb3JFYWNoKChmdW5jdGlvbih0KXtVVnQuaGFzKGksdCl8fG8odCl9KSkscn07dmFyIFdWdD11VnQscVZ0PWpWdCxZVnQ9ZnVuY3Rpb24gWFZ0KHQpe3JldHVybiBXVnQuZmlsdGVyKHFWdCh0KSwoZnVuY3Rpb24oZSl7cmV0dXJuIGUubGVuZ3RoPjF8fDE9PT1lLmxlbmd0aCYmdC5oYXNFZGdlKGVbMF0sZVswXSl9KSl9O3ZhciAkVnQ9ZnVuY3Rpb24gS1Z0KHQsZSxuKXtyZXR1cm4oZnVuY3Rpb24gaSh0LGUsbil7dmFyIGk9e30scj10Lm5vZGVzKCk7cmV0dXJuIHIuZm9yRWFjaCgoZnVuY3Rpb24odCl7aVt0XT17fSxpW3RdW3RdPXtkaXN0YW5jZTowfSxyLmZvckVhY2goKGZ1bmN0aW9uKGUpe3QhPT1lJiYoaVt0XVtlXT17ZGlzdGFuY2U6TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZfSl9KSksbih0KS5mb3JFYWNoKChmdW5jdGlvbihuKXt2YXIgcj1uLnY9PT10P24udzpuLnYsbz1lKG4pO2lbdF1bcl09e2Rpc3RhbmNlOm8scHJlZGVjZXNzb3I6dH19KSl9KSksci5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT1pW3RdO3IuZm9yRWFjaCgoZnVuY3Rpb24obil7dmFyIG89aVtuXTtyLmZvckVhY2goKGZ1bmN0aW9uKG4pe3ZhciBpPWVbbl0scj1vW25dLGE9b1t0XS5kaXN0YW5jZStpLmRpc3RhbmNlO2E8ci5kaXN0YW5jZSYmKHIuZGlzdGFuY2U9YSxyLnByZWRlY2Vzc29yPWkucHJlZGVjZXNzb3IpfSkpfSkpfSkpLGl9KSh0LGV8fFpWdCxufHxmdW5jdGlvbihlKXtyZXR1cm4gdC5vdXRFZGdlcyhlKX0pfSxaVnQ9dVZ0LmNvbnN0YW50KDEpO3ZhciBKVnQ9dVZ0LFFWdD10VXQ7ZnVuY3Rpb24gdFV0KHQpe3ZhciBlPXt9LG49e30saT1bXTtpZihKVnQuZWFjaCh0LnNpbmtzKCksKGZ1bmN0aW9uIHIobyl7aWYoSlZ0LmhhcyhuLG8pKXRocm93IG5ldyBlVXQ7SlZ0LmhhcyhlLG8pfHwobltvXT0hMCxlW29dPSEwLEpWdC5lYWNoKHQucHJlZGVjZXNzb3JzKG8pLHIpLGRlbGV0ZSBuW29dLGkucHVzaChvKSl9KSksSlZ0LnNpemUoZSkhPT10Lm5vZGVDb3VudCgpKXRocm93IG5ldyBlVXQ7cmV0dXJuIGl9ZnVuY3Rpb24gZVV0KCl7fXRVdC5DeWNsZUV4Y2VwdGlvbj1lVXQsZVV0LnByb3RvdHlwZT1uZXcgRXJyb3I7dmFyIG5VdD1RVnQ7dmFyIGlVdD11VnQsclV0PWZ1bmN0aW9uIG9VdCh0LGUsbil7aVV0LmlzQXJyYXkoZSl8fChlPVtlXSk7dmFyIGk9KHQuaXNEaXJlY3RlZCgpP3Quc3VjY2Vzc29yczp0Lm5laWdoYm9ycykuYmluZCh0KSxyPVtdLG89e307cmV0dXJuIGlVdC5lYWNoKGUsKGZ1bmN0aW9uKGUpe2lmKCF0Lmhhc05vZGUoZSkpdGhyb3cgbmV3IEVycm9yKCJHcmFwaCBkb2VzIG5vdCBoYXZlIG5vZGU6ICIrZSk7YVV0KHQsZSwicG9zdCI9PT1uLG8saSxyKX0pKSxyfTtmdW5jdGlvbiBhVXQodCxlLG4saSxyLG8pe2lVdC5oYXMoaSxlKXx8KGlbZV09ITAsbnx8by5wdXNoKGUpLGlVdC5lYWNoKHIoZSksKGZ1bmN0aW9uKGUpe2FVdCh0LGUsbixpLHIsbyl9KSksbiYmby5wdXNoKGUpKX12YXIgc1V0PXJVdDt2YXIgbFV0PXJVdDt2YXIgY1V0PXVWdCx1VXQ9ZFZ0LGhVdD1OVnQ7dmFyIGRVdCxwVXQ9e0dyYXBoOmJWdC5HcmFwaCxqc29uOlNWdCxhbGc6e2NvbXBvbmVudHM6a1Z0LGRpamtzdHJhOk9WdCxkaWprc3RyYUFsbDpGVnQsZmluZEN5Y2xlczpZVnQsZmxveWRXYXJzaGFsbDokVnQsaXNBY3ljbGljOmZ1bmN0aW9uIGZVdCh0KXt0cnl7blV0KHQpfWNhdGNoKHQpe2lmKHQgaW5zdGFuY2VvZiBuVXQuQ3ljbGVFeGNlcHRpb24pcmV0dXJuITE7dGhyb3cgdH1yZXR1cm4hMH0scG9zdG9yZGVyOmZ1bmN0aW9uIG1VdCh0LGUpe3JldHVybiBzVXQodCxlLCJwb3N0Iil9LHByZW9yZGVyOmZ1bmN0aW9uIGdVdCh0LGUpe3JldHVybiBsVXQodCxlLCJwcmUiKX0scHJpbTpmdW5jdGlvbiBfVXQodCxlKXt2YXIgbixpPW5ldyB1VXQscj17fSxvPW5ldyBoVXQ7ZnVuY3Rpb24gYSh0KXt2YXIgaT10LnY9PT1uP3Qudzp0LnYsYT1vLnByaW9yaXR5KGkpO2lmKHZvaWQgMCE9PWEpe3ZhciBzPWUodCk7czxhJiYocltpXT1uLG8uZGVjcmVhc2UoaSxzKSl9fWlmKDA9PT10Lm5vZGVDb3VudCgpKXJldHVybiBpO2NVdC5lYWNoKHQubm9kZXMoKSwoZnVuY3Rpb24odCl7by5hZGQodCxOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpLGkuc2V0Tm9kZSh0KX0pKSxvLmRlY3JlYXNlKHQubm9kZXMoKVswXSwwKTt2YXIgcz0hMTtmb3IoO28uc2l6ZSgpPjA7KXtpZihuPW8ucmVtb3ZlTWluKCksY1V0LmhhcyhyLG4pKWkuc2V0RWRnZShuLHJbbl0pO2Vsc2V7aWYocyl0aHJvdyBuZXcgRXJyb3IoIklucHV0IGdyYXBoIGlzIG5vdCBjb25uZWN0ZWQ6ICIrdCk7cz0hMH10Lm5vZGVFZGdlcyhuKS5mb3JFYWNoKGEpfXJldHVybiBpfSx0YXJqYW46alZ0LHRvcHNvcnQ6UVZ0fSx2ZXJzaW9uOmJWdC52ZXJzaW9ufTt0cnl7ZFV0PXBVdH1jYXRjaCh0KXt9ZFV0fHwoZFV0PXdpbmRvdy5ncmFwaGxpYik7dmFyIHlVdD1kVXQsdlV0PWdPdDt2YXIgYlV0PWZ1bmN0aW9uIHhVdCh0KXtyZXR1cm4gdlV0KHQsNSl9LHdVdD1IQXQsU1V0PXlOdCxNVXQ9SVB0LEVVdD1Qa3Q7dmFyIFRVdD1mdW5jdGlvbiBDVXQodCxlLG4pe2lmKCFFVXQobikpcmV0dXJuITE7dmFyIGk9dHlwZW9mIGU7cmV0dXJuISEoIm51bWJlciI9PWk/U1V0KG4pJiZNVXQoZSxuLmxlbmd0aCk6InN0cmluZyI9PWkmJmUgaW4gbikmJndVdChuW2VdLHQpfSxBVXQ9SEF0LGtVdD1UVXQsTFV0PUJOdCxQVXQ9T2JqZWN0LnByb3RvdHlwZSxOVXQ9UFV0Lmhhc093blByb3BlcnR5LElVdD1TRnQoKGZ1bmN0aW9uKHQsZSl7dD1PYmplY3QodCk7dmFyIG49LTEsaT1lLmxlbmd0aCxyPWk+Mj9lWzJdOnZvaWQgMDtmb3IociYma1V0KGVbMF0sZVsxXSxyKSYmKGk9MSk7KytuPGk7KWZvcih2YXIgbz1lW25dLGE9TFV0KG8pLHM9LTEsbD1hLmxlbmd0aDsrK3M8bDspe3ZhciBjPWFbc10sdT10W2NdOyh2b2lkIDA9PT11fHxBVXQodSxQVXRbY10pJiYhTlV0LmNhbGwodCxjKSkmJih0W2NdPW9bY10pfXJldHVybiB0fSkpLFJVdD14QnQsT1V0PXlOdCx6VXQ9U050O3ZhciBEVXQ9L1xzLzt2YXIgQlV0PWZ1bmN0aW9uIEhVdCh0KXtmb3IodmFyIGU9dC5sZW5ndGg7ZS0tJiZEVXQudGVzdCh0LmNoYXJBdChlKSk7KTtyZXR1cm4gZX0sRlV0PS9eXHMrLzt2YXIgVlV0PWZ1bmN0aW9uIFVVdCh0KXtyZXR1cm4gdD90LnNsaWNlKDAsQlV0KHQpKzEpLnJlcGxhY2UoRlV0LCIiKTp0fSxqVXQ9UGt0LEdVdD10RHQsV1V0PS9eWy0rXTB4WzAtOWEtZl0rJC9pLHFVdD0vXjBiWzAxXSskL2ksWVV0PS9eMG9bMC03XSskL2ksWFV0PXBhcnNlSW50O3ZhciAkVXQ9ZnVuY3Rpb24gS1V0KHQpe2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdDtpZihHVXQodCkpcmV0dXJuIE5hTjtpZihqVXQodCkpe3ZhciBlPSJmdW5jdGlvbiI9PXR5cGVvZiB0LnZhbHVlT2Y/dC52YWx1ZU9mKCk6dDt0PWpVdChlKT9lKyIiOmV9aWYoInN0cmluZyIhPXR5cGVvZiB0KXJldHVybiAwPT09dD90Oit0O3Q9VlV0KHQpO3ZhciBuPXFVdC50ZXN0KHQpO3JldHVybiBufHxZVXQudGVzdCh0KT9YVXQodC5zbGljZSgyKSxuPzI6OCk6V1V0LnRlc3QodCk/TmFOOit0fSxaVXQ9MS8wO3ZhciBKVXQ9ZnVuY3Rpb24gUVV0KHQpe3JldHVybiB0Pyh0PSRVdCh0KSk9PT1aVXR8fHQ9PT0tMS8wPzE3OTc2OTMxMzQ4NjIzMTU3ZTI5MioodDwwPy0xOjEpOnQ9PXQ/dDowOjA9PT10P3Q6MH0sdGp0PUpVdDt2YXIgZWp0PUVGdCxuanQ9eEJ0LGlqdD1mdW5jdGlvbiByanQodCl7dmFyIGU9dGp0KHQpLG49ZSUxO3JldHVybiBlPT1lP24/ZS1uOmU6MH0sb2p0PU1hdGgubWF4O3ZhciBhanQ9KGZ1bmN0aW9uIGxqdCh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLGkpe3ZhciByPU9iamVjdChlKTtpZighT1V0KGUpKXt2YXIgbz1SVXQobik7ZT16VXQoZSksbj1mdW5jdGlvbih0KXtyZXR1cm4gbyhyW3RdLHQscil9fXZhciBhPXQoZSxuLGkpO3JldHVybiBhPi0xP3Jbbz9lW2FdOmFdOnZvaWQgMH19KSgoZnVuY3Rpb24gc2p0KHQsZSxuKXt2YXIgaT1udWxsPT10PzA6dC5sZW5ndGg7aWYoIWkpcmV0dXJuLTE7dmFyIHI9bnVsbD09bj8wOmlqdChuKTtyZXR1cm4gcjwwJiYocj1vanQoaStyLDApKSxlanQodCxuanQoZSkscil9KSksY2p0PWNGdDt2YXIgdWp0PWZ1bmN0aW9uIGhqdCh0KXtyZXR1cm4obnVsbD09dD8wOnQubGVuZ3RoKT9janQodCwxKTpbXX0sZGp0PXdPdCxwanQ9Uk90LGZqdD1CTnQ7dmFyIG1qdD1mdW5jdGlvbiBnanQodCxlKXtyZXR1cm4gbnVsbD09dD90OmRqdCh0LHBqdChlKSxmanQpfTt2YXIgX2p0PWZ1bmN0aW9uIHlqdCh0KXt2YXIgZT1udWxsPT10PzA6dC5sZW5ndGg7cmV0dXJuIGU/dFtlLTFdOnZvaWQgMH0sdmp0PXJQdCxianQ9VE90LHhqdD14QnQ7dmFyIHdqdD1mdW5jdGlvbiBTanQodCxlKXt2YXIgbj17fTtyZXR1cm4gZT14anQoZSksYmp0KHQsKGZ1bmN0aW9uKHQsaSxyKXt2anQobixpLGUodCxpLHIpKX0pKSxufSxNanQ9dER0O3ZhciBFanQ9ZnVuY3Rpb24gVGp0KHQsZSxuKXtmb3IodmFyIGk9LTEscj10Lmxlbmd0aDsrK2k8cjspe3ZhciBvPXRbaV0sYT1lKG8pO2lmKG51bGwhPWEmJih2b2lkIDA9PT1zP2E9PWEmJiFNanQoYSk6bihhLHMpKSl2YXIgcz1hLGw9b31yZXR1cm4gbH07dmFyIENqdD1FanQsQWp0PWZ1bmN0aW9uIGtqdCh0LGUpe3JldHVybiB0PmV9LExqdD1QT3Q7dmFyIFBqdD1mdW5jdGlvbiBOanQodCl7cmV0dXJuIHQmJnQubGVuZ3RoP0NqdCh0LExqdCxBanQpOnZvaWQgMH0sSWp0PXJQdCxSanQ9SEF0O3ZhciBPanQ9ZnVuY3Rpb24gemp0KHQsZSxuKXsodm9pZCAwIT09biYmIVJqdCh0W2VdLG4pfHx2b2lkIDA9PT1uJiYhKGUgaW4gdCkpJiZJanQodCxlLG4pfSxEanQ9a2t0LEJqdD1zSXQsSGp0PV9QdCxGanQ9RnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nLFZqdD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LFVqdD1GanQuY2FsbChPYmplY3QpO3ZhciBqanQ9ZnVuY3Rpb24gR2p0KHQsZSl7aWYoKCJjb25zdHJ1Y3RvciIhPT1lfHwiZnVuY3Rpb24iIT10eXBlb2YgdFtlXSkmJiJfX3Byb3RvX18iIT1lKXJldHVybiB0W2VdfSxXanQ9cFB0LHFqdD1CTnQ7dmFyIFlqdD1PanQsWGp0PUdOdC5leHBvcnRzLCRqdD11UnQsS2p0PVdOdCxaanQ9QVJ0LEpqdD1DUHQsUWp0PUFQdCx0R3Q9S0Z0LGVHdD1rUHQuZXhwb3J0cyxuR3Q9emt0LGlHdD1Qa3Qsckd0PWZ1bmN0aW9uIG9HdCh0KXtpZighSGp0KHQpfHwiW29iamVjdCBPYmplY3RdIiE9RGp0KHQpKXJldHVybiExO3ZhciBlPUJqdCh0KTtpZihudWxsPT09ZSlyZXR1cm4hMDt2YXIgbj1WanQuY2FsbChlLCJjb25zdHJ1Y3RvciIpJiZlLmNvbnN0cnVjdG9yO3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBuJiZuIGluc3RhbmNlb2YgbiYmRmp0LmNhbGwobik9PVVqdH0sYUd0PSRQdCxzR3Q9amp0LGxHdD1mdW5jdGlvbiBjR3QodCl7cmV0dXJuIFdqdCh0LHFqdCh0KSl9O3ZhciB1R3Q9Skx0LGhHdD1PanQsZEd0PXdPdCxwR3Q9ZnVuY3Rpb24gZkd0KHQsZSxuLGkscixvLGEpe3ZhciBzPXNHdCh0LG4pLGw9c0d0KGUsbiksYz1hLmdldChsKTtpZihjKVlqdCh0LG4sYyk7ZWxzZXt2YXIgdT1vP28ocyxsLG4rIiIsdCxlLGEpOnZvaWQgMCxoPXZvaWQgMD09PXU7aWYoaCl7dmFyIGQ9UWp0KGwpLHA9IWQmJmVHdChsKSxmPSFkJiYhcCYmYUd0KGwpO3U9bCxkfHxwfHxmP1FqdChzKT91PXM6dEd0KHMpP3U9S2p0KHMpOnA/KGg9ITEsdT1YanQobCwhMCkpOmY/KGg9ITEsdT0kanQobCwhMCkpOnU9W106ckd0KGwpfHxKanQobCk/KHU9cyxKanQocyk/dT1sR3Qocyk6aUd0KHMpJiYhbkd0KHMpfHwodT1aanQobCkpKTpoPSExfWgmJihhLnNldChsLHUpLHIodSxsLGksbyxhKSxhLmRlbGV0ZShsKSksWWp0KHQsbix1KX19LG1HdD1Qa3QsZ0d0PUJOdCxfR3Q9amp0O3ZhciB5R3Q9U0Z0LHZHdD1UVXQ7dmFyIGJHdD1mdW5jdGlvbiB0KGUsbixpLHIsbyl7ZSE9PW4mJmRHdChuLChmdW5jdGlvbihhLHMpe2lmKG98fChvPW5ldyB1R3QpLG1HdChhKSlwR3QoZSxuLHMsaSx0LHIsbyk7ZWxzZXt2YXIgbD1yP3IoX0d0KGUscyksYSxzKyIiLGUsbixvKTp2b2lkIDA7dm9pZCAwPT09bCYmKGw9YSksaEd0KGUscyxsKX19KSxnR3QpfSx4R3Q9KGZ1bmN0aW9uIHdHdCh0KXtyZXR1cm4geUd0KChmdW5jdGlvbihlLG4pe3ZhciBpPS0xLHI9bi5sZW5ndGgsbz1yPjE/bltyLTFdOnZvaWQgMCxhPXI+Mj9uWzJdOnZvaWQgMDtmb3Iobz10Lmxlbmd0aD4zJiYiZnVuY3Rpb24iPT10eXBlb2Ygbz8oci0tLG8pOnZvaWQgMCxhJiZ2R3QoblswXSxuWzFdLGEpJiYobz1yPDM/dm9pZCAwOm8scj0xKSxlPU9iamVjdChlKTsrK2k8cjspe3ZhciBzPW5baV07cyYmdChlLHMsaSxvKX1yZXR1cm4gZX0pKX0pKChmdW5jdGlvbih0LGUsbil7Ykd0KHQsZSxuKX0pKTt2YXIgU0d0PWZ1bmN0aW9uIE1HdCh0LGUpe3JldHVybiB0PGV9LEVHdD1FanQsVEd0PVNHdCxDR3Q9UE90O3ZhciBBR3Q9ZnVuY3Rpb24ga0d0KHQpe3JldHVybiB0JiZ0Lmxlbmd0aD9FR3QodCxDR3QsVEd0KTp2b2lkIDB9LExHdD1FanQsUEd0PXhCdCxOR3Q9U0d0O3ZhciBJR3Q9ZnVuY3Rpb24gUkd0KHQsZSl7cmV0dXJuIHQmJnQubGVuZ3RoP0xHdCh0LFBHdChlKSxOR3QpOnZvaWQgMH0sT0d0PV9rdCx6R3Q9ZnVuY3Rpb24oKXtyZXR1cm4gT0d0LkRhdGUubm93KCl9LERHdD1jUHQsQkd0PWtEdCxIR3Q9SVB0LEZHdD1Qa3QsVkd0PU5EdDt2YXIgVUd0PXpEdCxqR3Q9ZnVuY3Rpb24gR0d0KHQsZSxuLGkpe2lmKCFGR3QodCkpcmV0dXJuIHQ7Zm9yKHZhciByPS0xLG89KGU9Qkd0KGUsdCkpLmxlbmd0aCxhPW8tMSxzPXQ7bnVsbCE9cyYmKytyPG87KXt2YXIgbD1WR3QoZVtyXSksYz1uO2lmKCJfX3Byb3RvX18iPT09bHx8ImNvbnN0cnVjdG9yIj09PWx8fCJwcm90b3R5cGUiPT09bClyZXR1cm4gdDtpZihyIT1hKXt2YXIgdT1zW2xdO3ZvaWQgMD09PShjPWk/aSh1LGwscyk6dm9pZCAwKSYmKGM9Rkd0KHUpP3U6SEd0KGVbcisxXSk/W106e30pfURHdChzLGwsYykscz1zW2xdfXJldHVybiB0fSxXR3Q9a0R0O3ZhciBxR3Q9ZnVuY3Rpb24gWUd0KHQsZSxuKXtmb3IodmFyIGk9LTEscj1lLmxlbmd0aCxvPXt9OysraTxyOyl7dmFyIGE9ZVtpXSxzPVVHdCh0LGEpO24ocyxhKSYmakd0KG8sV0d0KGEsdCkscyl9cmV0dXJuIG99LFhHdD1LRHQ7dmFyICRHdD11anQsS0d0PXBGdCxaR3Q9eUZ0O3ZhciBKR3Q9ZnVuY3Rpb24gUUd0KHQsZSl7cmV0dXJuIHFHdCh0LGUsKGZ1bmN0aW9uKGUsbil7cmV0dXJuIFhHdCh0LG4pfSkpfSx0V3Q9KGZ1bmN0aW9uIGVXdCh0KXtyZXR1cm4gWkd0KEtHdCh0LHZvaWQgMCwkR3QpLHQrIiIpfSkoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG51bGw9PXQ/e306Skd0KHQsZSl9KSksbld0PU1hdGguY2VpbCxpV3Q9TWF0aC5tYXg7dmFyIHJXdD1mdW5jdGlvbiBvV3QodCxlLG4saSl7Zm9yKHZhciByPS0xLG89aVd0KG5XdCgoZS10KS8obnx8MSkpLDApLGE9QXJyYXkobyk7by0tOylhW2k/bzorK3JdPXQsdCs9bjtyZXR1cm4gYX0sYVd0PVRVdCxzV3Q9SlV0O3ZhciBsV3Q9KGZ1bmN0aW9uIGNXdCh0KXtyZXR1cm4gZnVuY3Rpb24oZSxuLGkpe3JldHVybiBpJiYibnVtYmVyIiE9dHlwZW9mIGkmJmFXdChlLG4saSkmJihuPWk9dm9pZCAwKSxlPXNXdChlKSx2b2lkIDA9PT1uPyhuPWUsZT0wKTpuPXNXdChuKSxpPXZvaWQgMD09PWk/ZTxuPzE6LTE6c1d0KGkpLHJXdChlLG4saSx0KX19KSgpO3ZhciB1V3Q9dER0O3ZhciBoV3Q9ZnVuY3Rpb24gZFd0KHQsZSl7aWYodCE9PWUpe3ZhciBuPXZvaWQgMCE9PXQsaT1udWxsPT09dCxyPXQ9PXQsbz11V3QodCksYT12b2lkIDAhPT1lLHM9bnVsbD09PWUsbD1lPT1lLGM9dVd0KGUpO2lmKCFzJiYhYyYmIW8mJnQ+ZXx8byYmYSYmbCYmIXMmJiFjfHxpJiZhJiZsfHwhbiYmbHx8IXIpcmV0dXJuIDE7aWYoIWkmJiFvJiYhYyYmdDxlfHxjJiZuJiZyJiYhaSYmIW98fHMmJm4mJnJ8fCFhJiZyfHwhbClyZXR1cm4tMX1yZXR1cm4gMH07dmFyIHBXdD1tRHQsZld0PXpEdCxtV3Q9eEJ0LGdXdD1LQnQsX1d0PWZ1bmN0aW9uIHlXdCh0LGUpe3ZhciBuPXQubGVuZ3RoO2Zvcih0LnNvcnQoZSk7bi0tOyl0W25dPXRbbl0udmFsdWU7cmV0dXJuIHR9LHZXdD1qUHQsYld0PWZ1bmN0aW9uIHhXdCh0LGUsbil7Zm9yKHZhciBpPS0xLHI9dC5jcml0ZXJpYSxvPWUuY3JpdGVyaWEsYT1yLmxlbmd0aCxzPW4ubGVuZ3RoOysraTxhOyl7dmFyIGw9aFd0KHJbaV0sb1tpXSk7aWYobClyZXR1cm4gaT49cz9sOmwqKCJkZXNjIj09bltpXT8tMToxKX1yZXR1cm4gdC5pbmRleC1lLmluZGV4fSx3V3Q9UE90LFNXdD1BUHQ7dmFyIE1XdD1jRnQsRVd0PWZ1bmN0aW9uIFRXdCh0LGUsbil7ZT1lLmxlbmd0aD9wV3QoZSwoZnVuY3Rpb24odCl7cmV0dXJuIFNXdCh0KT9mdW5jdGlvbihlKXtyZXR1cm4gZld0KGUsMT09PXQubGVuZ3RoP3RbMF06dCl9OnR9KSk6W3dXdF07dmFyIGk9LTE7ZT1wV3QoZSx2V3QobVd0KSk7dmFyIHI9Z1d0KHQsKGZ1bmN0aW9uKHQsbixyKXtyZXR1cm57Y3JpdGVyaWE6cFd0KGUsKGZ1bmN0aW9uKGUpe3JldHVybiBlKHQpfSkpLGluZGV4OisraSx2YWx1ZTp0fX0pKTtyZXR1cm4gX1d0KHIsKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGJXdCh0LGUsbil9KSl9LENXdD1UVXQsQVd0PVNGdCgoZnVuY3Rpb24odCxlKXtpZihudWxsPT10KXJldHVybltdO3ZhciBuPWUubGVuZ3RoO3JldHVybiBuPjEmJkNXdCh0LGVbMF0sZVsxXSk/ZT1bXTpuPjImJkNXdChlWzBdLGVbMV0sZVsyXSkmJihlPVtlWzBdXSksRVd0KHQsTVd0KGUsMSksW10pfSkpLGtXdD1TRHQsTFd0PTA7dmFyIFBXdD1mdW5jdGlvbiBOV3QodCl7dmFyIGU9KytMV3Q7cmV0dXJuIGtXdCh0KStlfTt2YXIgSVd0PWNQdCxSV3Q9ZnVuY3Rpb24gT1d0KHQsZSxuKXtmb3IodmFyIGk9LTEscj10Lmxlbmd0aCxvPWUubGVuZ3RoLGE9e307KytpPHI7KXtuKGEsdFtpXSxpPG8/ZVtpXTp2b2lkIDApfXJldHVybiBhfTt2YXIgeld0LERXdD1mdW5jdGlvbiBCV3QodCxlKXtyZXR1cm4gUld0KHR8fFtdLGV8fFtdLElXdCl9O3RyeXt6V3Q9e2Nsb25lRGVlcDpiVXQsY29uc3RhbnQ6Yk90LGRlZmF1bHRzOklVdCxlYWNoOlVPdCxmaWx0ZXI6Q0J0LGZpbmQ6YWp0LGZsYXR0ZW46dWp0LGZvckVhY2g6Rk90LGZvckluOm1qdCxoYXM6SUJ0LGlzVW5kZWZpbmVkOnFCdCxsYXN0Ol9qdCxtYXA6bkh0LG1hcFZhbHVlczp3anQsbWF4OlBqdCxtZXJnZTp4R3QsbWluOkFHdCxtaW5CeTpJR3Qsbm93OnpHdCxwaWNrOnRXdCxyYW5nZTpsV3QscmVkdWNlOmhIdCxzb3J0Qnk6QVd0LHVuaXF1ZUlkOlBXdCx2YWx1ZXM6bFZ0LHppcE9iamVjdDpEV3R9fWNhdGNoKHQpe316V3R8fCh6V3Q9d2luZG93Ll8pO3ZhciBIV3Q9eld0LEZXdD1WV3Q7ZnVuY3Rpb24gVld0KCl7dmFyIHQ9e307dC5fbmV4dD10Ll9wcmV2PXQsdGhpcy5fc2VudGluZWw9dH1mdW5jdGlvbiBVV3QodCl7dC5fcHJldi5fbmV4dD10Ll9uZXh0LHQuX25leHQuX3ByZXY9dC5fcHJldixkZWxldGUgdC5fbmV4dCxkZWxldGUgdC5fcHJldn1mdW5jdGlvbiBqV3QodCxlKXtpZigiX25leHQiIT09dCYmIl9wcmV2IiE9PXQpcmV0dXJuIGV9Vld0LnByb3RvdHlwZS5kZXF1ZXVlPWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fc2VudGluZWwsZT10Ll9wcmV2O2lmKGUhPT10KXJldHVybiBVV3QoZSksZX0sVld0LnByb3RvdHlwZS5lbnF1ZXVlPWZ1bmN0aW9uKHQpe3ZhciBlPXRoaXMuX3NlbnRpbmVsO3QuX3ByZXYmJnQuX25leHQmJlVXdCh0KSx0Ll9uZXh0PWUuX25leHQsZS5fbmV4dC5fcHJldj10LGUuX25leHQ9dCx0Ll9wcmV2PWV9LFZXdC5wcm90b3R5cGUudG9TdHJpbmc9ZnVuY3Rpb24oKXtmb3IodmFyIHQ9W10sZT10aGlzLl9zZW50aW5lbCxuPWUuX3ByZXY7biE9PWU7KXQucHVzaChKU09OLnN0cmluZ2lmeShuLGpXdCkpLG49bi5fcHJldjtyZXR1cm4iWyIrdC5qb2luKCIsICIpKyJdIn07dmFyIEdXdD1IV3QsV1d0PXlVdC5HcmFwaCxxV3Q9Rld0LFlXdD1mdW5jdGlvbiBYV3QodCxlKXtpZih0Lm5vZGVDb3VudCgpPD0xKXJldHVybltdO3ZhciBuPShmdW5jdGlvbiBpKHQsZSl7dmFyIG49bmV3IFdXdCxpPTAscj0wO0dXdC5mb3JFYWNoKHQubm9kZXMoKSwoZnVuY3Rpb24odCl7bi5zZXROb2RlKHQse3Y6dCxpbjowLG91dDowfSl9KSksR1d0LmZvckVhY2godC5lZGdlcygpLChmdW5jdGlvbih0KXt2YXIgbz1uLmVkZ2UodC52LHQudyl8fDAsYT1lKHQpO24uc2V0RWRnZSh0LnYsdC53LG8rYSkscj1NYXRoLm1heChyLG4ubm9kZSh0LnYpLm91dCs9YSksaT1NYXRoLm1heChpLG4ubm9kZSh0LncpLmluKz1hKX0pKTt2YXIgbz1HV3QucmFuZ2UocitpKzMpLm1hcCgoZnVuY3Rpb24oKXtyZXR1cm4gbmV3IHFXdH0pKSxhPWkrMTtyZXR1cm4gR1d0LmZvckVhY2gobi5ub2RlcygpLChmdW5jdGlvbih0KXtaV3QobyxhLG4ubm9kZSh0KSl9KSkse2dyYXBoOm4sYnVja2V0czpvLHplcm9JZHg6YX19KSh0LGV8fCRXdCkscj0oZnVuY3Rpb24gbyh0LGUsbil7dmFyIGkscj1bXSxvPWVbZS5sZW5ndGgtMV0sYT1lWzBdO2Zvcig7dC5ub2RlQ291bnQoKTspe2Zvcig7aT1hLmRlcXVldWUoKTspS1d0KHQsZSxuLGkpO2Zvcig7aT1vLmRlcXVldWUoKTspS1d0KHQsZSxuLGkpO2lmKHQubm9kZUNvdW50KCkpZm9yKHZhciBzPWUubGVuZ3RoLTI7cz4wOy0tcylpZihpPWVbc10uZGVxdWV1ZSgpKXtyPXIuY29uY2F0KEtXdCh0LGUsbixpLCEwKSk7YnJlYWt9fXJldHVybiByfSkobi5ncmFwaCxuLmJ1Y2tldHMsbi56ZXJvSWR4KTtyZXR1cm4gR1d0LmZsYXR0ZW4oR1d0Lm1hcChyLChmdW5jdGlvbihlKXtyZXR1cm4gdC5vdXRFZGdlcyhlLnYsZS53KX0pKSwhMCl9LCRXdD1HV3QuY29uc3RhbnQoMSk7ZnVuY3Rpb24gS1d0KHQsZSxuLGkscil7dmFyIG89cj9bXTp2b2lkIDA7cmV0dXJuIEdXdC5mb3JFYWNoKHQuaW5FZGdlcyhpLnYpLChmdW5jdGlvbihpKXt2YXIgYT10LmVkZ2UoaSkscz10Lm5vZGUoaS52KTtyJiZvLnB1c2goe3Y6aS52LHc6aS53fSkscy5vdXQtPWEsWld0KGUsbixzKX0pKSxHV3QuZm9yRWFjaCh0Lm91dEVkZ2VzKGkudiksKGZ1bmN0aW9uKGkpe3ZhciByPXQuZWRnZShpKSxvPXQubm9kZShpLncpO28uaW4tPXIsWld0KGUsbixvKX0pKSx0LnJlbW92ZU5vZGUoaS52KSxvfWZ1bmN0aW9uIFpXdCh0LGUsbil7bi5vdXQ/bi5pbj90W24ub3V0LW4uaW4rZV0uZW5xdWV1ZShuKTp0W3QubGVuZ3RoLTFdLmVucXVldWUobik6dFswXS5lbnF1ZXVlKG4pfXZhciBKV3Q9SFd0LFFXdD1ZV3QsdHF0PXtydW46ZnVuY3Rpb24gZXF0KHQpe3ZhciBlPSJncmVlZHkiPT09dC5ncmFwaCgpLmFjeWNsaWNlcj9RV3QodCwoZnVuY3Rpb24gbih0KXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIHQuZWRnZShlKS53ZWlnaHR9fSkodCkpOihmdW5jdGlvbiBpKHQpe3ZhciBlPVtdLG49e30saT17fTtmdW5jdGlvbiByKG8pe0pXdC5oYXMoaSxvKXx8KGlbb109ITAsbltvXT0hMCxKV3QuZm9yRWFjaCh0Lm91dEVkZ2VzKG8pLChmdW5jdGlvbih0KXtKV3QuaGFzKG4sdC53KT9lLnB1c2godCk6cih0LncpfSkpLGRlbGV0ZSBuW29dKX1yZXR1cm4gSld0LmZvckVhY2godC5ub2RlcygpLHIpLGV9KSh0KTtKV3QuZm9yRWFjaChlLChmdW5jdGlvbihlKXt2YXIgbj10LmVkZ2UoZSk7dC5yZW1vdmVFZGdlKGUpLG4uZm9yd2FyZE5hbWU9ZS5uYW1lLG4ucmV2ZXJzZWQ9ITAsdC5zZXRFZGdlKGUudyxlLnYsbixKV3QudW5pcXVlSWQoInJldiIpKX0pKX0sdW5kbzpmdW5jdGlvbiBucXQodCl7Sld0LmZvckVhY2godC5lZGdlcygpLChmdW5jdGlvbihlKXt2YXIgbj10LmVkZ2UoZSk7aWYobi5yZXZlcnNlZCl7dC5yZW1vdmVFZGdlKGUpO3ZhciBpPW4uZm9yd2FyZE5hbWU7ZGVsZXRlIG4ucmV2ZXJzZWQsZGVsZXRlIG4uZm9yd2FyZE5hbWUsdC5zZXRFZGdlKGUudyxlLnYsbixpKX19KSl9fTt2YXIgaXF0PUhXdCxycXQ9eVV0LkdyYXBoLG9xdD17YWRkRHVtbXlOb2RlOnlxdCxzaW1wbGlmeTpmdW5jdGlvbiBhcXQodCl7dmFyIGU9KG5ldyBycXQpLnNldEdyYXBoKHQuZ3JhcGgoKSk7cmV0dXJuIGlxdC5mb3JFYWNoKHQubm9kZXMoKSwoZnVuY3Rpb24obil7ZS5zZXROb2RlKG4sdC5ub2RlKG4pKX0pKSxpcXQuZm9yRWFjaCh0LmVkZ2VzKCksKGZ1bmN0aW9uKG4pe3ZhciBpPWUuZWRnZShuLnYsbi53KXx8e3dlaWdodDowLG1pbmxlbjoxfSxyPXQuZWRnZShuKTtlLnNldEVkZ2Uobi52LG4udyx7d2VpZ2h0Omkud2VpZ2h0K3Iud2VpZ2h0LG1pbmxlbjpNYXRoLm1heChpLm1pbmxlbixyLm1pbmxlbil9KX0pKSxlfSxhc05vbkNvbXBvdW5kR3JhcGg6ZnVuY3Rpb24gc3F0KHQpe3ZhciBlPW5ldyBycXQoe211bHRpZ3JhcGg6dC5pc011bHRpZ3JhcGgoKX0pLnNldEdyYXBoKHQuZ3JhcGgoKSk7cmV0dXJuIGlxdC5mb3JFYWNoKHQubm9kZXMoKSwoZnVuY3Rpb24obil7dC5jaGlsZHJlbihuKS5sZW5ndGh8fGUuc2V0Tm9kZShuLHQubm9kZShuKSl9KSksaXF0LmZvckVhY2godC5lZGdlcygpLChmdW5jdGlvbihuKXtlLnNldEVkZ2Uobix0LmVkZ2UobikpfSkpLGV9LHN1Y2Nlc3NvcldlaWdodHM6ZnVuY3Rpb24gbHF0KHQpe3ZhciBlPWlxdC5tYXAodC5ub2RlcygpLChmdW5jdGlvbihlKXt2YXIgbj17fTtyZXR1cm4gaXF0LmZvckVhY2godC5vdXRFZGdlcyhlKSwoZnVuY3Rpb24oZSl7bltlLnddPShuW2Uud118fDApK3QuZWRnZShlKS53ZWlnaHR9KSksbn0pKTtyZXR1cm4gaXF0LnppcE9iamVjdCh0Lm5vZGVzKCksZSl9LHByZWRlY2Vzc29yV2VpZ2h0czpmdW5jdGlvbiBjcXQodCl7dmFyIGU9aXF0Lm1hcCh0Lm5vZGVzKCksKGZ1bmN0aW9uKGUpe3ZhciBuPXt9O3JldHVybiBpcXQuZm9yRWFjaCh0LmluRWRnZXMoZSksKGZ1bmN0aW9uKGUpe25bZS52XT0obltlLnZdfHwwKSt0LmVkZ2UoZSkud2VpZ2h0fSkpLG59KSk7cmV0dXJuIGlxdC56aXBPYmplY3QodC5ub2RlcygpLGUpfSxpbnRlcnNlY3RSZWN0OmZ1bmN0aW9uIHVxdCh0LGUpe3ZhciBuLGkscj10Lngsbz10LnksYT1lLngtcixzPWUueS1vLGw9dC53aWR0aC8yLGM9dC5oZWlnaHQvMjtpZighYSYmIXMpdGhyb3cgbmV3IEVycm9yKCJOb3QgcG9zc2libGUgdG8gZmluZCBpbnRlcnNlY3Rpb24gaW5zaWRlIG9mIHRoZSByZWN0YW5nbGUiKTtNYXRoLmFicyhzKSpsPk1hdGguYWJzKGEpKmM/KHM8MCYmKGM9LWMpLG49YyphL3MsaT1jKTooYTwwJiYobD0tbCksbj1sLGk9bCpzL2EpO3JldHVybnt4OnIrbix5Om8raX19LGJ1aWxkTGF5ZXJNYXRyaXg6ZnVuY3Rpb24gaHF0KHQpe3ZhciBlPWlxdC5tYXAoaXF0LnJhbmdlKHZxdCh0KSsxKSwoZnVuY3Rpb24oKXtyZXR1cm5bXX0pKTtyZXR1cm4gaXF0LmZvckVhY2godC5ub2RlcygpLChmdW5jdGlvbihuKXt2YXIgaT10Lm5vZGUobikscj1pLnJhbms7aXF0LmlzVW5kZWZpbmVkKHIpfHwoZVtyXVtpLm9yZGVyXT1uKX0pKSxlfSxub3JtYWxpemVSYW5rczpmdW5jdGlvbiBkcXQodCl7dmFyIGU9aXF0Lm1pbihpcXQubWFwKHQubm9kZXMoKSwoZnVuY3Rpb24oZSl7cmV0dXJuIHQubm9kZShlKS5yYW5rfSkpKTtpcXQuZm9yRWFjaCh0Lm5vZGVzKCksKGZ1bmN0aW9uKG4pe3ZhciBpPXQubm9kZShuKTtpcXQuaGFzKGksInJhbmsiKSYmKGkucmFuay09ZSl9KSl9LHJlbW92ZUVtcHR5UmFua3M6ZnVuY3Rpb24gcHF0KHQpe3ZhciBlPWlxdC5taW4oaXF0Lm1hcCh0Lm5vZGVzKCksKGZ1bmN0aW9uKGUpe3JldHVybiB0Lm5vZGUoZSkucmFua30pKSksbj1bXTtpcXQuZm9yRWFjaCh0Lm5vZGVzKCksKGZ1bmN0aW9uKGkpe3ZhciByPXQubm9kZShpKS5yYW5rLWU7bltyXXx8KG5bcl09W10pLG5bcl0ucHVzaChpKX0pKTt2YXIgaT0wLHI9dC5ncmFwaCgpLm5vZGVSYW5rRmFjdG9yO2lxdC5mb3JFYWNoKG4sKGZ1bmN0aW9uKGUsbil7aXF0LmlzVW5kZWZpbmVkKGUpJiZuJXIhPTA/LS1pOmkmJmlxdC5mb3JFYWNoKGUsKGZ1bmN0aW9uKGUpe3Qubm9kZShlKS5yYW5rKz1pfSkpfSkpfSxhZGRCb3JkZXJOb2RlOmZ1bmN0aW9uIGZxdCh0LGUsbixpKXt2YXIgcj17d2lkdGg6MCxoZWlnaHQ6MH07YXJndW1lbnRzLmxlbmd0aD49NCYmKHIucmFuaz1uLHIub3JkZXI9aSk7cmV0dXJuIHlxdCh0LCJib3JkZXIiLHIsZSl9LG1heFJhbms6dnF0LHBhcnRpdGlvbjpmdW5jdGlvbiBtcXQodCxlKXt2YXIgbj17bGhzOltdLHJoczpbXX07cmV0dXJuIGlxdC5mb3JFYWNoKHQsKGZ1bmN0aW9uKHQpe2UodCk/bi5saHMucHVzaCh0KTpuLnJocy5wdXNoKHQpfSkpLG59LHRpbWU6ZnVuY3Rpb24gZ3F0KHQsZSl7dmFyIG49aXF0Lm5vdygpO3RyeXtyZXR1cm4gZSgpfWZpbmFsbHl7Y29uc29sZS5sb2codCsiIHRpbWU6ICIrKGlxdC5ub3coKS1uKSsibXMiKX19LG5vdGltZTpmdW5jdGlvbiBfcXQodCxlKXtyZXR1cm4gZSgpfX07ZnVuY3Rpb24geXF0KHQsZSxuLGkpe3ZhciByO2Rve3I9aXF0LnVuaXF1ZUlkKGkpfXdoaWxlKHQuaGFzTm9kZShyKSk7cmV0dXJuIG4uZHVtbXk9ZSx0LnNldE5vZGUocixuKSxyfWZ1bmN0aW9uIHZxdCh0KXtyZXR1cm4gaXF0Lm1heChpcXQubWFwKHQubm9kZXMoKSwoZnVuY3Rpb24oZSl7dmFyIG49dC5ub2RlKGUpLnJhbms7aWYoIWlxdC5pc1VuZGVmaW5lZChuKSlyZXR1cm4gbn0pKSl9dmFyIGJxdD1IV3QseHF0PW9xdCx3cXQ9e3J1bjpmdW5jdGlvbiBTcXQodCl7dC5ncmFwaCgpLmR1bW15Q2hhaW5zPVtdLGJxdC5mb3JFYWNoKHQuZWRnZXMoKSwoZnVuY3Rpb24oZSl7IShmdW5jdGlvbiBuKHQsZSl7dmFyIG4saSxyLG89ZS52LGE9dC5ub2RlKG8pLnJhbmsscz1lLncsbD10Lm5vZGUocykucmFuayxjPWUubmFtZSx1PXQuZWRnZShlKSxoPXUubGFiZWxSYW5rO2lmKGw9PT1hKzEpcmV0dXJuO2Zvcih0LnJlbW92ZUVkZ2UoZSkscj0wLCsrYTthPGw7KytyLCsrYSl1LnBvaW50cz1bXSxuPXhxdC5hZGREdW1teU5vZGUodCwiZWRnZSIsaT17d2lkdGg6MCxoZWlnaHQ6MCxlZGdlTGFiZWw6dSxlZGdlT2JqOmUscmFuazphfSwiX2QiKSxhPT09aCYmKGkud2lkdGg9dS53aWR0aCxpLmhlaWdodD11LmhlaWdodCxpLmR1bW15PSJlZGdlLWxhYmVsIixpLmxhYmVscG9zPXUubGFiZWxwb3MpLHQuc2V0RWRnZShvLG4se3dlaWdodDp1LndlaWdodH0sYyksMD09PXImJnQuZ3JhcGgoKS5kdW1teUNoYWlucy5wdXNoKG4pLG89bjt0LnNldEVkZ2UobyxzLHt3ZWlnaHQ6dS53ZWlnaHR9LGMpfSkodCxlKX0pKX0sdW5kbzpmdW5jdGlvbiBNcXQodCl7YnF0LmZvckVhY2godC5ncmFwaCgpLmR1bW15Q2hhaW5zLChmdW5jdGlvbihlKXt2YXIgbixpPXQubm9kZShlKSxyPWkuZWRnZUxhYmVsO2Zvcih0LnNldEVkZ2UoaS5lZGdlT2JqLHIpO2kuZHVtbXk7KW49dC5zdWNjZXNzb3JzKGUpWzBdLHQucmVtb3ZlTm9kZShlKSxyLnBvaW50cy5wdXNoKHt4OmkueCx5OmkueX0pLCJlZGdlLWxhYmVsIj09PWkuZHVtbXkmJihyLng9aS54LHIueT1pLnksci53aWR0aD1pLndpZHRoLHIuaGVpZ2h0PWkuaGVpZ2h0KSxpPXQubm9kZShlPW4pfSkpfX07dmFyIEVxdD1IV3QsVHF0PXtsb25nZXN0UGF0aDpmdW5jdGlvbiBDcXQodCl7dmFyIGU9e307RXF0LmZvckVhY2godC5zb3VyY2VzKCksKGZ1bmN0aW9uIG4oaSl7dmFyIHI9dC5ub2RlKGkpO2lmKEVxdC5oYXMoZSxpKSlyZXR1cm4gci5yYW5rO2VbaV09ITA7dmFyIG89RXF0Lm1pbihFcXQubWFwKHQub3V0RWRnZXMoaSksKGZ1bmN0aW9uKGUpe3JldHVybiBuKGUudyktdC5lZGdlKGUpLm1pbmxlbn0pKSk7cmV0dXJuIG8hPT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkmJm51bGwhPW98fChvPTApLHIucmFuaz1vfSkpfSxzbGFjazpmdW5jdGlvbiBBcXQodCxlKXtyZXR1cm4gdC5ub2RlKGUudykucmFuay10Lm5vZGUoZS52KS5yYW5rLXQuZWRnZShlKS5taW5sZW59fTt2YXIga3F0PUhXdCxMcXQ9eVV0LkdyYXBoLFBxdD1UcXQuc2xhY2ssTnF0PWZ1bmN0aW9uIElxdCh0KXt2YXIgZSxuLGk9bmV3IExxdCh7ZGlyZWN0ZWQ6ITF9KSxyPXQubm9kZXMoKVswXSxvPXQubm9kZUNvdW50KCk7aS5zZXROb2RlKHIse30pO2Zvcig7UnF0KGksdCk8bzspZT1PcXQoaSx0KSxuPWkuaGFzTm9kZShlLnYpP1BxdCh0LGUpOi1QcXQodCxlKSx6cXQoaSx0LG4pO3JldHVybiBpfTtmdW5jdGlvbiBScXQodCxlKXtyZXR1cm4ga3F0LmZvckVhY2godC5ub2RlcygpLChmdW5jdGlvbiBuKGkpe2txdC5mb3JFYWNoKGUubm9kZUVkZ2VzKGkpLChmdW5jdGlvbihyKXt2YXIgbz1yLnYsYT1pPT09bz9yLnc6bzt0Lmhhc05vZGUoYSl8fFBxdChlLHIpfHwodC5zZXROb2RlKGEse30pLHQuc2V0RWRnZShpLGEse30pLG4oYSkpfSkpfSkpLHQubm9kZUNvdW50KCl9ZnVuY3Rpb24gT3F0KHQsZSl7cmV0dXJuIGtxdC5taW5CeShlLmVkZ2VzKCksKGZ1bmN0aW9uKG4pe2lmKHQuaGFzTm9kZShuLnYpIT09dC5oYXNOb2RlKG4udykpcmV0dXJuIFBxdChlLG4pfSkpfWZ1bmN0aW9uIHpxdCh0LGUsbil7a3F0LmZvckVhY2godC5ub2RlcygpLChmdW5jdGlvbih0KXtlLm5vZGUodCkucmFuays9bn0pKX12YXIgRHF0PUhXdCxCcXQ9TnF0LEhxdD1UcXQuc2xhY2ssRnF0PVRxdC5sb25nZXN0UGF0aCxWcXQ9eVV0LmFsZy5wcmVvcmRlcixVcXQ9eVV0LmFsZy5wb3N0b3JkZXIsanF0PW9xdC5zaW1wbGlmeSxHcXQ9V3F0O2Z1bmN0aW9uIFdxdCh0KXt0PWpxdCh0KSxGcXQodCk7dmFyIGUsbj1CcXQodCk7Zm9yKFhxdChuKSxxcXQobix0KTtlPUtxdChuKTspSnF0KG4sdCxlLFpxdChuLHQsZSkpfWZ1bmN0aW9uIHFxdCh0LGUpe3ZhciBuPVVxdCh0LHQubm9kZXMoKSk7bj1uLnNsaWNlKDAsbi5sZW5ndGgtMSksRHF0LmZvckVhY2gobiwoZnVuY3Rpb24obil7IShmdW5jdGlvbiBpKHQsZSxuKXt2YXIgaT10Lm5vZGUobik7dC5lZGdlKG4saS5wYXJlbnQpLmN1dHZhbHVlPVlxdCh0LGUsbil9KSh0LGUsbil9KSl9ZnVuY3Rpb24gWXF0KHQsZSxuKXt2YXIgaT10Lm5vZGUobikucGFyZW50LHI9ITAsbz1lLmVkZ2UobixpKSxhPTA7cmV0dXJuIG98fChyPSExLG89ZS5lZGdlKGksbikpLGE9by53ZWlnaHQsRHF0LmZvckVhY2goZS5ub2RlRWRnZXMobiksKGZ1bmN0aW9uKG8pe3ZhciBzPW8udj09PW4sbD1zP28udzpvLnY7aWYobCE9PWkpe3ZhciBjPXM9PT1yLHU9ZS5lZGdlKG8pLndlaWdodDtpZihhKz1jP3U6LXUsKGZ1bmN0aW9uIGgodCxlLG4pe3JldHVybiB0Lmhhc0VkZ2UoZSxuKX0pKHQsbixsKSl7dmFyIGQ9dC5lZGdlKG4sbCkuY3V0dmFsdWU7YSs9Yz8tZDpkfX19KSksYX1mdW5jdGlvbiBYcXQodCxlKXthcmd1bWVudHMubGVuZ3RoPDImJihlPXQubm9kZXMoKVswXSksJHF0KHQse30sMSxlKX1mdW5jdGlvbiAkcXQodCxlLG4saSxyKXt2YXIgbz1uLGE9dC5ub2RlKGkpO3JldHVybiBlW2ldPSEwLERxdC5mb3JFYWNoKHQubmVpZ2hib3JzKGkpLChmdW5jdGlvbihyKXtEcXQuaGFzKGUscil8fChuPSRxdCh0LGUsbixyLGkpKX0pKSxhLmxvdz1vLGEubGltPW4rKyxyP2EucGFyZW50PXI6ZGVsZXRlIGEucGFyZW50LG59ZnVuY3Rpb24gS3F0KHQpe3JldHVybiBEcXQuZmluZCh0LmVkZ2VzKCksKGZ1bmN0aW9uKGUpe3JldHVybiB0LmVkZ2UoZSkuY3V0dmFsdWU8MH0pKX1mdW5jdGlvbiBacXQodCxlLG4pe3ZhciBpPW4udixyPW4udztlLmhhc0VkZ2UoaSxyKXx8KGk9bi53LHI9bi52KTt2YXIgbz10Lm5vZGUoaSksYT10Lm5vZGUocikscz1vLGw9ITE7by5saW0+YS5saW0mJihzPWEsbD0hMCk7dmFyIGM9RHF0LmZpbHRlcihlLmVkZ2VzKCksKGZ1bmN0aW9uKGUpe3JldHVybiBsPT09UXF0KHQsdC5ub2RlKGUudikscykmJmwhPT1RcXQodCx0Lm5vZGUoZS53KSxzKX0pKTtyZXR1cm4gRHF0Lm1pbkJ5KGMsKGZ1bmN0aW9uKHQpe3JldHVybiBIcXQoZSx0KX0pKX1mdW5jdGlvbiBKcXQodCxlLG4saSl7dC5yZW1vdmVFZGdlKG4udixuLncpLHQuc2V0RWRnZShpLnYsaS53LHt9KSxYcXQodCkscXF0KHQsZSksKGZ1bmN0aW9uIHIodCxlKXt2YXIgbj1EcXQuZmluZCh0Lm5vZGVzKCksKGZ1bmN0aW9uKHQpe3JldHVybiFlLm5vZGUodCkucGFyZW50fSkpLGk9VnF0KHQsbik7aT1pLnNsaWNlKDEpLERxdC5mb3JFYWNoKGksKGZ1bmN0aW9uKG4pe3ZhciBpPXQubm9kZShuKS5wYXJlbnQscj1lLmVkZ2UobixpKSxvPSExO3J8fChyPWUuZWRnZShpLG4pLG89ITApLGUubm9kZShuKS5yYW5rPWUubm9kZShpKS5yYW5rKyhvP3IubWlubGVuOi1yLm1pbmxlbil9KSl9KSh0LGUpfWZ1bmN0aW9uIFFxdCh0LGUsbil7cmV0dXJuIG4ubG93PD1lLmxpbSYmZS5saW08PW4ubGltfVdxdC5pbml0TG93TGltVmFsdWVzPVhxdCxXcXQuaW5pdEN1dFZhbHVlcz1xcXQsV3F0LmNhbGNDdXRWYWx1ZT1ZcXQsV3F0LmxlYXZlRWRnZT1LcXQsV3F0LmVudGVyRWRnZT1acXQsV3F0LmV4Y2hhbmdlRWRnZXM9SnF0O3ZhciB0WXQ9VHF0Lmxvbmdlc3RQYXRoLGVZdD1OcXQsbll0PUdxdCxpWXQ9ZnVuY3Rpb24gcll0KHQpe3N3aXRjaCh0LmdyYXBoKCkucmFua2VyKXtjYXNlIm5ldHdvcmstc2ltcGxleCI6YVl0KHQpO2JyZWFrO2Nhc2UidGlnaHQtdHJlZSI6IShmdW5jdGlvbiBlKHQpe3RZdCh0KSxlWXQodCl9KSh0KTticmVhaztjYXNlImxvbmdlc3QtcGF0aCI6b1l0KHQpO2JyZWFrO2RlZmF1bHQ6YVl0KHQpfX07dmFyIG9ZdD10WXQ7ZnVuY3Rpb24gYVl0KHQpe25ZdCh0KX12YXIgc1l0PUhXdDt2YXIgbFl0PUhXdCxjWXQ9b3F0O2Z1bmN0aW9uIHVZdCh0LGUsbixpLHIsbyxhKXt2YXIgcz10LmNoaWxkcmVuKGEpO2lmKHMubGVuZ3RoKXt2YXIgbD1jWXQuYWRkQm9yZGVyTm9kZSh0LCJfYnQiKSxjPWNZdC5hZGRCb3JkZXJOb2RlKHQsIl9iYiIpLHU9dC5ub2RlKGEpO3Quc2V0UGFyZW50KGwsYSksdS5ib3JkZXJUb3A9bCx0LnNldFBhcmVudChjLGEpLHUuYm9yZGVyQm90dG9tPWMsbFl0LmZvckVhY2gocywoZnVuY3Rpb24ocyl7dVl0KHQsZSxuLGkscixvLHMpO3ZhciB1PXQubm9kZShzKSxoPXUuYm9yZGVyVG9wP3UuYm9yZGVyVG9wOnMsZD11LmJvcmRlckJvdHRvbT91LmJvcmRlckJvdHRvbTpzLHA9dS5ib3JkZXJUb3A/aToyKmksZj1oIT09ZD8xOnItb1thXSsxO3Quc2V0RWRnZShsLGgse3dlaWdodDpwLG1pbmxlbjpmLG5lc3RpbmdFZGdlOiEwfSksdC5zZXRFZGdlKGQsYyx7d2VpZ2h0OnAsbWlubGVuOmYsbmVzdGluZ0VkZ2U6ITB9KX0pKSx0LnBhcmVudChhKXx8dC5zZXRFZGdlKGUsbCx7d2VpZ2h0OjAsbWlubGVuOnIrb1thXX0pfWVsc2UgYSE9PWUmJnQuc2V0RWRnZShlLGEse3dlaWdodDowLG1pbmxlbjpufSl9dmFyIGhZdD1IV3QsZFl0PW9xdCxwWXQ9ZnVuY3Rpb24gZll0KHQpe2hZdC5mb3JFYWNoKHQuY2hpbGRyZW4oKSwoZnVuY3Rpb24gZShuKXt2YXIgaT10LmNoaWxkcmVuKG4pLHI9dC5ub2RlKG4pO2lmKGkubGVuZ3RoJiZoWXQuZm9yRWFjaChpLGUpLGhZdC5oYXMociwibWluUmFuayIpKXtyLmJvcmRlckxlZnQ9W10sci5ib3JkZXJSaWdodD1bXTtmb3IodmFyIG89ci5taW5SYW5rLGE9ci5tYXhSYW5rKzE7bzxhOysrbyltWXQodCwiYm9yZGVyTGVmdCIsIl9ibCIsbixyLG8pLG1ZdCh0LCJib3JkZXJSaWdodCIsIl9iciIsbixyLG8pfX0pKX07ZnVuY3Rpb24gbVl0KHQsZSxuLGkscixvKXt2YXIgYT1yW2VdW28tMV0scz1kWXQuYWRkRHVtbXlOb2RlKHQsImJvcmRlciIse3dpZHRoOjAsaGVpZ2h0OjAscmFuazpvLGJvcmRlclR5cGU6ZX0sbik7cltlXVtvXT1zLHQuc2V0UGFyZW50KHMsaSksYSYmdC5zZXRFZGdlKGEscyx7d2VpZ2h0OjF9KX12YXIgZ1l0PUhXdDtmdW5jdGlvbiBfWXQodCl7Z1l0LmZvckVhY2godC5ub2RlcygpLChmdW5jdGlvbihlKXt5WXQodC5ub2RlKGUpKX0pKSxnWXQuZm9yRWFjaCh0LmVkZ2VzKCksKGZ1bmN0aW9uKGUpe3lZdCh0LmVkZ2UoZSkpfSkpfWZ1bmN0aW9uIHlZdCh0KXt2YXIgZT10LndpZHRoO3Qud2lkdGg9dC5oZWlnaHQsdC5oZWlnaHQ9ZX1mdW5jdGlvbiB2WXQodCl7dC55PS10Lnl9ZnVuY3Rpb24gYll0KHQpe3ZhciBlPXQueDt0Lng9dC55LHQueT1lfXZhciB4WXQ9SFd0O3ZhciB3WXQ9SFd0O2Z1bmN0aW9uIFNZdCh0LGUsbil7Zm9yKHZhciBpPXdZdC56aXBPYmplY3Qobix3WXQubWFwKG4sKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGV9KSkpLHI9d1l0LmZsYXR0ZW4od1l0Lm1hcChlLChmdW5jdGlvbihlKXtyZXR1cm4gd1l0LnNvcnRCeSh3WXQubWFwKHQub3V0RWRnZXMoZSksKGZ1bmN0aW9uKGUpe3JldHVybntwb3M6aVtlLnddLHdlaWdodDp0LmVkZ2UoZSkud2VpZ2h0fX0pKSwicG9zIil9KSksITApLG89MTtvPG4ubGVuZ3RoOylvPDw9MTt2YXIgYT0yKm8tMTtvLT0xO3ZhciBzPXdZdC5tYXAobmV3IEFycmF5KGEpLChmdW5jdGlvbigpe3JldHVybiAwfSkpLGw9MDtyZXR1cm4gd1l0LmZvckVhY2goci5mb3JFYWNoKChmdW5jdGlvbih0KXt2YXIgZT10LnBvcytvO3NbZV0rPXQud2VpZ2h0O2Zvcih2YXIgbj0wO2U+MDspZSUyJiYobis9c1tlKzFdKSxzW2U9ZS0xPj4xXSs9dC53ZWlnaHQ7bCs9dC53ZWlnaHQqbn0pKSksbH12YXIgTVl0PUhXdDt2YXIgRVl0PUhXdDt2YXIgVFl0PUhXdCxDWXQ9b3F0O2Z1bmN0aW9uIEFZdCh0LGUsbil7Zm9yKHZhciBpO2UubGVuZ3RoJiYoaT1UWXQubGFzdChlKSkuaTw9bjspZS5wb3AoKSx0LnB1c2goaS52cyksbisrO3JldHVybiBufXZhciBrWXQ9SFd0LExZdD1mdW5jdGlvbiBQWXQodCxlKXtyZXR1cm4gTVl0Lm1hcChlLChmdW5jdGlvbihlKXt2YXIgbj10LmluRWRnZXMoZSk7aWYobi5sZW5ndGgpe3ZhciBpPU1ZdC5yZWR1Y2UobiwoZnVuY3Rpb24oZSxuKXt2YXIgaT10LmVkZ2Uobikscj10Lm5vZGUobi52KTtyZXR1cm57c3VtOmUuc3VtK2kud2VpZ2h0KnIub3JkZXIsd2VpZ2h0OmUud2VpZ2h0K2kud2VpZ2h0fX0pLHtzdW06MCx3ZWlnaHQ6MH0pO3JldHVybnt2OmUsYmFyeWNlbnRlcjppLnN1bS9pLndlaWdodCx3ZWlnaHQ6aS53ZWlnaHR9fXJldHVybnt2OmV9fSkpfSxOWXQ9ZnVuY3Rpb24gSVl0KHQsZSl7dmFyIG49e307cmV0dXJuIEVZdC5mb3JFYWNoKHQsKGZ1bmN0aW9uKHQsZSl7dmFyIGk9blt0LnZdPXtpbmRlZ3JlZTowLGluOltdLG91dDpbXSx2czpbdC52XSxpOmV9O0VZdC5pc1VuZGVmaW5lZCh0LmJhcnljZW50ZXIpfHwoaS5iYXJ5Y2VudGVyPXQuYmFyeWNlbnRlcixpLndlaWdodD10LndlaWdodCl9KSksRVl0LmZvckVhY2goZS5lZGdlcygpLChmdW5jdGlvbih0KXt2YXIgZT1uW3Qudl0saT1uW3Qud107RVl0LmlzVW5kZWZpbmVkKGUpfHxFWXQuaXNVbmRlZmluZWQoaSl8fChpLmluZGVncmVlKyssZS5vdXQucHVzaChuW3Qud10pKX0pKSwoZnVuY3Rpb24gaSh0KXt2YXIgZT1bXTtmdW5jdGlvbiBuKHQpe3JldHVybiBmdW5jdGlvbihlKXtlLm1lcmdlZHx8KEVZdC5pc1VuZGVmaW5lZChlLmJhcnljZW50ZXIpfHxFWXQuaXNVbmRlZmluZWQodC5iYXJ5Y2VudGVyKXx8ZS5iYXJ5Y2VudGVyPj10LmJhcnljZW50ZXIpJiYoZnVuY3Rpb24gbih0LGUpe3ZhciBuPTAsaT0wO3Qud2VpZ2h0JiYobis9dC5iYXJ5Y2VudGVyKnQud2VpZ2h0LGkrPXQud2VpZ2h0KTtlLndlaWdodCYmKG4rPWUuYmFyeWNlbnRlciplLndlaWdodCxpKz1lLndlaWdodCk7dC52cz1lLnZzLmNvbmNhdCh0LnZzKSx0LmJhcnljZW50ZXI9bi9pLHQud2VpZ2h0PWksdC5pPU1hdGgubWluKGUuaSx0LmkpLGUubWVyZ2VkPSEwfSkodCxlKX19ZnVuY3Rpb24gaShlKXtyZXR1cm4gZnVuY3Rpb24obil7bi5pbi5wdXNoKGUpLDA9PS0tbi5pbmRlZ3JlZSYmdC5wdXNoKG4pfX1mb3IoO3QubGVuZ3RoOyl7dmFyIHI9dC5wb3AoKTtlLnB1c2gociksRVl0LmZvckVhY2goci5pbi5yZXZlcnNlKCksbihyKSksRVl0LmZvckVhY2goci5vdXQsaShyKSl9cmV0dXJuIEVZdC5tYXAoRVl0LmZpbHRlcihlLChmdW5jdGlvbih0KXtyZXR1cm4hdC5tZXJnZWR9KSksKGZ1bmN0aW9uKHQpe3JldHVybiBFWXQucGljayh0LFsidnMiLCJpIiwiYmFyeWNlbnRlciIsIndlaWdodCJdKX0pKX0pKEVZdC5maWx0ZXIobiwoZnVuY3Rpb24odCl7cmV0dXJuIXQuaW5kZWdyZWV9KSkpfSxSWXQ9ZnVuY3Rpb24gT1l0KHQsZSl7dmFyIG49Q1l0LnBhcnRpdGlvbih0LChmdW5jdGlvbih0KXtyZXR1cm4gVFl0Lmhhcyh0LCJiYXJ5Y2VudGVyIil9KSksaT1uLmxocyxyPVRZdC5zb3J0Qnkobi5yaHMsKGZ1bmN0aW9uKHQpe3JldHVybi10Lml9KSksbz1bXSxhPTAscz0wLGw9MDtpLnNvcnQoKGZ1bmN0aW9uIGModCl7cmV0dXJuIGZ1bmN0aW9uKGUsbil7cmV0dXJuIGUuYmFyeWNlbnRlcjxuLmJhcnljZW50ZXI/LTE6ZS5iYXJ5Y2VudGVyPm4uYmFyeWNlbnRlcj8xOnQ/bi5pLWUuaTplLmktbi5pfX0pKCEhZSkpLGw9QVl0KG8scixsKSxUWXQuZm9yRWFjaChpLChmdW5jdGlvbih0KXtsKz10LnZzLmxlbmd0aCxvLnB1c2godC52cyksYSs9dC5iYXJ5Y2VudGVyKnQud2VpZ2h0LHMrPXQud2VpZ2h0LGw9QVl0KG8scixsKX0pKTt2YXIgdT17dnM6VFl0LmZsYXR0ZW4obywhMCl9O3MmJih1LmJhcnljZW50ZXI9YS9zLHUud2VpZ2h0PXMpO3JldHVybiB1fTt2YXIgell0PUhXdCxEWXQ9eVV0LkdyYXBoO3ZhciBCWXQ9SFd0O3ZhciBIWXQ9SFd0LEZZdD1mdW5jdGlvbiBWWXQodCl7dmFyIGU9e30sbj14WXQuZmlsdGVyKHQubm9kZXMoKSwoZnVuY3Rpb24oZSl7cmV0dXJuIXQuY2hpbGRyZW4oZSkubGVuZ3RofSkpLGk9eFl0Lm1heCh4WXQubWFwKG4sKGZ1bmN0aW9uKGUpe3JldHVybiB0Lm5vZGUoZSkucmFua30pKSkscj14WXQubWFwKHhZdC5yYW5nZShpKzEpLChmdW5jdGlvbigpe3JldHVybltdfSkpO2Z1bmN0aW9uIG8obil7aWYoIXhZdC5oYXMoZSxuKSl7ZVtuXT0hMDt2YXIgaT10Lm5vZGUobik7cltpLnJhbmtdLnB1c2gobikseFl0LmZvckVhY2godC5zdWNjZXNzb3JzKG4pLG8pfX12YXIgYT14WXQuc29ydEJ5KG4sKGZ1bmN0aW9uKGUpe3JldHVybiB0Lm5vZGUoZSkucmFua30pKTtyZXR1cm4geFl0LmZvckVhY2goYSxvKSxyfSxVWXQ9ZnVuY3Rpb24gall0KHQsZSl7Zm9yKHZhciBuPTAsaT0xO2k8ZS5sZW5ndGg7KytpKW4rPVNZdCh0LGVbaS0xXSxlW2ldKTtyZXR1cm4gbn0sR1l0PWZ1bmN0aW9uIHQoZSxuLGkscil7dmFyIG89ZS5jaGlsZHJlbihuKSxhPWUubm9kZShuKSxzPWE/YS5ib3JkZXJMZWZ0OnZvaWQgMCxsPWE/YS5ib3JkZXJSaWdodDp2b2lkIDAsYz17fTtzJiYobz1rWXQuZmlsdGVyKG8sKGZ1bmN0aW9uKHQpe3JldHVybiB0IT09cyYmdCE9PWx9KSkpO3ZhciB1PUxZdChlLG8pO2tZdC5mb3JFYWNoKHUsKGZ1bmN0aW9uKG4pe2lmKGUuY2hpbGRyZW4obi52KS5sZW5ndGgpe3ZhciBvPXQoZSxuLnYsaSxyKTtjW24udl09byxrWXQuaGFzKG8sImJhcnljZW50ZXIiKSYmKGZ1bmN0aW9uIGEodCxlKXtrWXQuaXNVbmRlZmluZWQodC5iYXJ5Y2VudGVyKT8odC5iYXJ5Y2VudGVyPWUuYmFyeWNlbnRlcix0LndlaWdodD1lLndlaWdodCk6KHQuYmFyeWNlbnRlcj0odC5iYXJ5Y2VudGVyKnQud2VpZ2h0K2UuYmFyeWNlbnRlciplLndlaWdodCkvKHQud2VpZ2h0K2Uud2VpZ2h0KSx0LndlaWdodCs9ZS53ZWlnaHQpfSkobixvKX19KSk7dmFyIGg9Tll0KHUsaSk7IShmdW5jdGlvbiBkKHQsZSl7a1l0LmZvckVhY2godCwoZnVuY3Rpb24odCl7dC52cz1rWXQuZmxhdHRlbih0LnZzLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIGVbdF0/ZVt0XS52czp0fSkpLCEwKX0pKX0pKGgsYyk7dmFyIHA9Ull0KGgscik7aWYocyYmKHAudnM9a1l0LmZsYXR0ZW4oW3MscC52cyxsXSwhMCksZS5wcmVkZWNlc3NvcnMocykubGVuZ3RoKSl7dmFyIGY9ZS5ub2RlKGUucHJlZGVjZXNzb3JzKHMpWzBdKSxtPWUubm9kZShlLnByZWRlY2Vzc29ycyhsKVswXSk7a1l0LmhhcyhwLCJiYXJ5Y2VudGVyIil8fChwLmJhcnljZW50ZXI9MCxwLndlaWdodD0wKSxwLmJhcnljZW50ZXI9KHAuYmFyeWNlbnRlcipwLndlaWdodCtmLm9yZGVyK20ub3JkZXIpLyhwLndlaWdodCsyKSxwLndlaWdodCs9Mn1yZXR1cm4gcH0sV1l0PWZ1bmN0aW9uIHFZdCh0LGUsbil7dmFyIGk9KGZ1bmN0aW9uIHIodCl7dmFyIGU7Zm9yKDt0Lmhhc05vZGUoZT16WXQudW5pcXVlSWQoIl9yb290IikpOyk7cmV0dXJuIGV9KSh0KSxvPW5ldyBEWXQoe2NvbXBvdW5kOiEwfSkuc2V0R3JhcGgoe3Jvb3Q6aX0pLnNldERlZmF1bHROb2RlTGFiZWwoKGZ1bmN0aW9uKGUpe3JldHVybiB0Lm5vZGUoZSl9KSk7cmV0dXJuIHpZdC5mb3JFYWNoKHQubm9kZXMoKSwoZnVuY3Rpb24ocil7dmFyIGE9dC5ub2RlKHIpLHM9dC5wYXJlbnQocik7KGEucmFuaz09PWV8fGEubWluUmFuazw9ZSYmZTw9YS5tYXhSYW5rKSYmKG8uc2V0Tm9kZShyKSxvLnNldFBhcmVudChyLHN8fGkpLHpZdC5mb3JFYWNoKHRbbl0ociksKGZ1bmN0aW9uKGUpe3ZhciBuPWUudj09PXI/ZS53OmUudixpPW8uZWRnZShuLHIpLGE9ell0LmlzVW5kZWZpbmVkKGkpPzA6aS53ZWlnaHQ7by5zZXRFZGdlKG4scix7d2VpZ2h0OnQuZWRnZShlKS53ZWlnaHQrYX0pfSkpLHpZdC5oYXMoYSwibWluUmFuayIpJiZvLnNldE5vZGUocix7Ym9yZGVyTGVmdDphLmJvcmRlckxlZnRbZV0sYm9yZGVyUmlnaHQ6YS5ib3JkZXJSaWdodFtlXX0pKX0pKSxvfSxZWXQ9ZnVuY3Rpb24gWFl0KHQsZSxuKXt2YXIgaSxyPXt9O0JZdC5mb3JFYWNoKG4sKGZ1bmN0aW9uKG4pe2Zvcih2YXIgbyxhLHM9dC5wYXJlbnQobik7czspe2lmKChvPXQucGFyZW50KHMpKT8oYT1yW29dLHJbb109cyk6KGE9aSxpPXMpLGEmJmEhPT1zKXJldHVybiB2b2lkIGUuc2V0RWRnZShhLHMpO3M9b319KSl9LCRZdD15VXQuR3JhcGgsS1l0PW9xdDtmdW5jdGlvbiBaWXQodCxlLG4pe3JldHVybiBIWXQubWFwKGUsKGZ1bmN0aW9uKGUpe3JldHVybiBXWXQodCxlLG4pfSkpfWZ1bmN0aW9uIEpZdCh0LGUpe3ZhciBuPW5ldyAkWXQ7SFl0LmZvckVhY2godCwoZnVuY3Rpb24odCl7dmFyIGk9dC5ncmFwaCgpLnJvb3Qscj1HWXQodCxpLG4sZSk7SFl0LmZvckVhY2goci52cywoZnVuY3Rpb24oZSxuKXt0Lm5vZGUoZSkub3JkZXI9bn0pKSxZWXQodCxuLHIudnMpfSkpfWZ1bmN0aW9uIFFZdCh0LGUpe0hZdC5mb3JFYWNoKGUsKGZ1bmN0aW9uKGUpe0hZdC5mb3JFYWNoKGUsKGZ1bmN0aW9uKGUsbil7dC5ub2RlKGUpLm9yZGVyPW59KSl9KSl9dmFyIHRYdD1IV3QsZVh0PXlVdC5HcmFwaCxuWHQ9b3F0LGlYdD1mdW5jdGlvbiByWHQodCl7dmFyIGUsbj1uWHQuYnVpbGRMYXllck1hdHJpeCh0KSxpPXRYdC5tZXJnZShvWHQodCxuKSxhWHQodCxuKSkscj17fTt0WHQuZm9yRWFjaChbInUiLCJkIl0sKGZ1bmN0aW9uKG8pe2U9InUiPT09bz9uOnRYdC52YWx1ZXMobikucmV2ZXJzZSgpLHRYdC5mb3JFYWNoKFsibCIsInIiXSwoZnVuY3Rpb24obil7InIiPT09biYmKGU9dFh0Lm1hcChlLChmdW5jdGlvbih0KXtyZXR1cm4gdFh0LnZhbHVlcyh0KS5yZXZlcnNlKCl9KSkpO3ZhciBhPSgidSI9PT1vP3QucHJlZGVjZXNzb3JzOnQuc3VjY2Vzc29ycykuYmluZCh0KSxzPWNYdCh0LGUsaSxhKSxsPXVYdCh0LGUscy5yb290LHMuYWxpZ24sInIiPT09bik7InIiPT09biYmKGw9dFh0Lm1hcFZhbHVlcyhsLChmdW5jdGlvbih0KXtyZXR1cm4tdH0pKSkscltvK25dPWx9KSl9KSk7dmFyIG89aFh0KHQscik7cmV0dXJuIGRYdChyLG8pLHBYdChyLHQuZ3JhcGgoKS5hbGlnbil9O2Z1bmN0aW9uIG9YdCh0LGUpe3ZhciBuPXt9O3JldHVybiB0WHQucmVkdWNlKGUsKGZ1bmN0aW9uIGkoZSxyKXt2YXIgbz0wLGE9MCxzPWUubGVuZ3RoLGw9dFh0Lmxhc3Qocik7cmV0dXJuIHRYdC5mb3JFYWNoKHIsKGZ1bmN0aW9uKGUsaSl7dmFyIGM9KGZ1bmN0aW9uIHUodCxlKXtpZih0Lm5vZGUoZSkuZHVtbXkpcmV0dXJuIHRYdC5maW5kKHQucHJlZGVjZXNzb3JzKGUpLChmdW5jdGlvbihlKXtyZXR1cm4gdC5ub2RlKGUpLmR1bW15fSkpfSkodCxlKSxoPWM/dC5ub2RlKGMpLm9yZGVyOnM7KGN8fGU9PT1sKSYmKHRYdC5mb3JFYWNoKHIuc2xpY2UoYSxpKzEpLChmdW5jdGlvbihlKXt0WHQuZm9yRWFjaCh0LnByZWRlY2Vzc29ycyhlKSwoZnVuY3Rpb24oaSl7dmFyIHI9dC5ub2RlKGkpLGE9ci5vcmRlcjshKGE8b3x8aDxhKXx8ci5kdW1teSYmdC5ub2RlKGUpLmR1bW15fHxzWHQobixpLGUpfSkpfSkpLGE9aSsxLG89aCl9KSkscn0pKSxufWZ1bmN0aW9uIGFYdCh0LGUpe3ZhciBuPXt9O2Z1bmN0aW9uIGkoZSxpLHIsbyxhKXt2YXIgczt0WHQuZm9yRWFjaCh0WHQucmFuZ2UoaSxyKSwoZnVuY3Rpb24oaSl7dC5ub2RlKHM9ZVtpXSkuZHVtbXkmJnRYdC5mb3JFYWNoKHQucHJlZGVjZXNzb3JzKHMpLChmdW5jdGlvbihlKXt2YXIgaT10Lm5vZGUoZSk7aS5kdW1teSYmKGkub3JkZXI8b3x8aS5vcmRlcj5hKSYmc1h0KG4sZSxzKX0pKX0pKX1yZXR1cm4gdFh0LnJlZHVjZShlLChmdW5jdGlvbiByKGUsbil7dmFyIHIsbz0tMSxhPTA7cmV0dXJuIHRYdC5mb3JFYWNoKG4sKGZ1bmN0aW9uKHMsbCl7aWYoImJvcmRlciI9PT10Lm5vZGUocykuZHVtbXkpe3ZhciBjPXQucHJlZGVjZXNzb3JzKHMpO2MubGVuZ3RoJiYocj10Lm5vZGUoY1swXSkub3JkZXIsaShuLGEsbCxvLHIpLGE9bCxvPXIpfWkobixhLG4ubGVuZ3RoLHIsZS5sZW5ndGgpfSkpLG59KSksbn1mdW5jdGlvbiBzWHQodCxlLG4pe2lmKGU+bil7dmFyIGk9ZTtlPW4sbj1pfXZhciByPXRbZV07cnx8KHRbZV09cj17fSkscltuXT0hMH1mdW5jdGlvbiBsWHQodCxlLG4pe2lmKGU+bil7dmFyIGk9ZTtlPW4sbj1pfXJldHVybiB0WHQuaGFzKHRbZV0sbil9ZnVuY3Rpb24gY1h0KHQsZSxuLGkpe3ZhciByPXt9LG89e30sYT17fTtyZXR1cm4gdFh0LmZvckVhY2goZSwoZnVuY3Rpb24odCl7dFh0LmZvckVhY2godCwoZnVuY3Rpb24odCxlKXtyW3RdPXQsb1t0XT10LGFbdF09ZX0pKX0pKSx0WHQuZm9yRWFjaChlLChmdW5jdGlvbih0KXt2YXIgZT0tMTt0WHQuZm9yRWFjaCh0LChmdW5jdGlvbih0KXt2YXIgcz1pKHQpO2lmKHMubGVuZ3RoKWZvcih2YXIgbD0oKHM9dFh0LnNvcnRCeShzLChmdW5jdGlvbih0KXtyZXR1cm4gYVt0XX0pKSkubGVuZ3RoLTEpLzIsYz1NYXRoLmZsb29yKGwpLHU9TWF0aC5jZWlsKGwpO2M8PXU7KytjKXt2YXIgaD1zW2NdO29bdF09PT10JiZlPGFbaF0mJiFsWHQobix0LGgpJiYob1toXT10LG9bdF09clt0XT1yW2hdLGU9YVtoXSl9fSkpfSkpLHtyb290OnIsYWxpZ246b319ZnVuY3Rpb24gdVh0KHQsZSxuLGkscil7dmFyIG89e30sYT0oZnVuY3Rpb24gcyh0LGUsbixpKXt2YXIgcj1uZXcgZVh0LG89dC5ncmFwaCgpLGE9KGZ1bmN0aW9uIHModCxlLG4pe3JldHVybiBmdW5jdGlvbihpLHIsbyl7dmFyIGEscz1pLm5vZGUociksbD1pLm5vZGUobyksYz0wO2lmKGMrPXMud2lkdGgvMix0WHQuaGFzKHMsImxhYmVscG9zIikpc3dpdGNoKHMubGFiZWxwb3MudG9Mb3dlckNhc2UoKSl7Y2FzZSJsIjphPS1zLndpZHRoLzI7YnJlYWs7Y2FzZSJyIjphPXMud2lkdGgvMn1pZihhJiYoYys9bj9hOi1hKSxhPTAsYys9KHMuZHVtbXk/ZTp0KS8yLGMrPShsLmR1bW15P2U6dCkvMixjKz1sLndpZHRoLzIsdFh0LmhhcyhsLCJsYWJlbHBvcyIpKXN3aXRjaChsLmxhYmVscG9zLnRvTG93ZXJDYXNlKCkpe2Nhc2UibCI6YT1sLndpZHRoLzI7YnJlYWs7Y2FzZSJyIjphPS1sLndpZHRoLzJ9cmV0dXJuIGEmJihjKz1uP2E6LWEpLGE9MCxjfX0pKG8ubm9kZXNlcCxvLmVkZ2VzZXAsaSk7cmV0dXJuIHRYdC5mb3JFYWNoKGUsKGZ1bmN0aW9uKGUpe3ZhciBpO3RYdC5mb3JFYWNoKGUsKGZ1bmN0aW9uKGUpe3ZhciBvPW5bZV07aWYoci5zZXROb2RlKG8pLGkpe3ZhciBzPW5baV0sbD1yLmVkZ2UocyxvKTtyLnNldEVkZ2UocyxvLE1hdGgubWF4KGEodCxlLGkpLGx8fDApKX1pPWV9KSl9KSkscn0pKHQsZSxuLHIpLGw9cj8iYm9yZGVyTGVmdCI6ImJvcmRlclJpZ2h0IjtmdW5jdGlvbiBjKHQsZSl7Zm9yKHZhciBuPWEubm9kZXMoKSxpPW4ucG9wKCkscj17fTtpOylyW2ldP3QoaSk6KHJbaV09ITAsbi5wdXNoKGkpLG49bi5jb25jYXQoZShpKSkpLGk9bi5wb3AoKX1yZXR1cm4gYygoZnVuY3Rpb24gdSh0KXtvW3RdPWEuaW5FZGdlcyh0KS5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGgubWF4KHQsb1tlLnZdK2EuZWRnZShlKSl9KSwwKX0pLGEucHJlZGVjZXNzb3JzLmJpbmQoYSkpLGMoKGZ1bmN0aW9uIGgoZSl7dmFyIG49YS5vdXRFZGdlcyhlKS5yZWR1Y2UoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIE1hdGgubWluKHQsb1tlLnddLWEuZWRnZShlKSl9KSxOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpLGk9dC5ub2RlKGUpO24hPT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkmJmkuYm9yZGVyVHlwZSE9PWwmJihvW2VdPU1hdGgubWF4KG9bZV0sbikpfSksYS5zdWNjZXNzb3JzLmJpbmQoYSkpLHRYdC5mb3JFYWNoKGksKGZ1bmN0aW9uKHQpe29bdF09b1tuW3RdXX0pKSxvfWZ1bmN0aW9uIGhYdCh0LGUpe3JldHVybiB0WHQubWluQnkodFh0LnZhbHVlcyhlKSwoZnVuY3Rpb24oZSl7dmFyIG49TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLGk9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO3JldHVybiB0WHQuZm9ySW4oZSwoZnVuY3Rpb24oZSxyKXt2YXIgbz0oZnVuY3Rpb24gYSh0LGUpe3JldHVybiB0Lm5vZGUoZSkud2lkdGh9KSh0LHIpLzI7bj1NYXRoLm1heChlK28sbiksaT1NYXRoLm1pbihlLW8saSl9KSksbi1pfSkpfWZ1bmN0aW9uIGRYdCh0LGUpe3ZhciBuPXRYdC52YWx1ZXMoZSksaT10WHQubWluKG4pLHI9dFh0Lm1heChuKTt0WHQuZm9yRWFjaChbInUiLCJkIl0sKGZ1bmN0aW9uKG4pe3RYdC5mb3JFYWNoKFsibCIsInIiXSwoZnVuY3Rpb24obyl7dmFyIGEscz1uK28sbD10W3NdO2lmKGwhPT1lKXt2YXIgYz10WHQudmFsdWVzKGwpOyhhPSJsIj09PW8/aS10WHQubWluKGMpOnItdFh0Lm1heChjKSkmJih0W3NdPXRYdC5tYXBWYWx1ZXMobCwoZnVuY3Rpb24odCl7cmV0dXJuIHQrYX0pKSl9fSkpfSkpfWZ1bmN0aW9uIHBYdCh0LGUpe3JldHVybiB0WHQubWFwVmFsdWVzKHQudWwsKGZ1bmN0aW9uKG4saSl7aWYoZSlyZXR1cm4gdFtlLnRvTG93ZXJDYXNlKCldW2ldO3ZhciByPXRYdC5zb3J0QnkodFh0Lm1hcCh0LGkpKTtyZXR1cm4oclsxXStyWzJdKS8yfSkpfXZhciBmWHQ9SFd0LG1YdD1vcXQsZ1h0PWlYdDt2YXIgX1h0PUhXdCx5WHQ9dHF0LHZYdD13cXQsYlh0PWlZdCx4WHQ9b3F0Lm5vcm1hbGl6ZVJhbmtzLHdYdD1mdW5jdGlvbiBTWHQodCl7dmFyIGU9KGZ1bmN0aW9uIG4odCl7dmFyIGU9e30sbj0wO2Z1bmN0aW9uIGkocil7dmFyIG89bjtzWXQuZm9yRWFjaCh0LmNoaWxkcmVuKHIpLGkpLGVbcl09e2xvdzpvLGxpbTpuKyt9fXJldHVybiBzWXQuZm9yRWFjaCh0LmNoaWxkcmVuKCksaSksZX0pKHQpO3NZdC5mb3JFYWNoKHQuZ3JhcGgoKS5kdW1teUNoYWlucywoZnVuY3Rpb24obil7Zm9yKHZhciBpPXQubm9kZShuKSxyPWkuZWRnZU9iaixvPShmdW5jdGlvbiBhKHQsZSxuLGkpe3ZhciByLG8sYT1bXSxzPVtdLGw9TWF0aC5taW4oZVtuXS5sb3csZVtpXS5sb3cpLGM9TWF0aC5tYXgoZVtuXS5saW0sZVtpXS5saW0pO3I9bjtkb3tyPXQucGFyZW50KHIpLGEucHVzaChyKX13aGlsZShyJiYoZVtyXS5sb3c+bHx8Yz5lW3JdLmxpbSkpO289cixyPWk7Zm9yKDsocj10LnBhcmVudChyKSkhPT1vOylzLnB1c2gocik7cmV0dXJue3BhdGg6YS5jb25jYXQocy5yZXZlcnNlKCkpLGxjYTpvfX0pKHQsZSxyLnYsci53KSxzPW8ucGF0aCxsPW8ubGNhLGM9MCx1PXNbY10saD0hMDtuIT09ci53Oyl7aWYoaT10Lm5vZGUobiksaCl7Zm9yKDsodT1zW2NdKSE9PWwmJnQubm9kZSh1KS5tYXhSYW5rPGkucmFuazspYysrO3U9PT1sJiYoaD0hMSl9aWYoIWgpe2Zvcig7YzxzLmxlbmd0aC0xJiZ0Lm5vZGUodT1zW2MrMV0pLm1pblJhbms8PWkucmFuazspYysrO3U9c1tjXX10LnNldFBhcmVudChuLHUpLG49dC5zdWNjZXNzb3JzKG4pWzBdfX0pKX0sTVh0PW9xdC5yZW1vdmVFbXB0eVJhbmtzLEVYdD17cnVuOmZ1bmN0aW9uIFRYdCh0KXt2YXIgZT1jWXQuYWRkRHVtbXlOb2RlKHQsInJvb3QiLHt9LCJfcm9vdCIpLG49KGZ1bmN0aW9uIGkodCl7dmFyIGU9e307ZnVuY3Rpb24gbihpLHIpe3ZhciBvPXQuY2hpbGRyZW4oaSk7byYmby5sZW5ndGgmJmxZdC5mb3JFYWNoKG8sKGZ1bmN0aW9uKHQpe24odCxyKzEpfSkpLGVbaV09cn1yZXR1cm4gbFl0LmZvckVhY2godC5jaGlsZHJlbigpLChmdW5jdGlvbih0KXtuKHQsMSl9KSksZX0pKHQpLHI9bFl0Lm1heChsWXQudmFsdWVzKG4pKS0xLG89MipyKzE7dC5ncmFwaCgpLm5lc3RpbmdSb290PWUsbFl0LmZvckVhY2godC5lZGdlcygpLChmdW5jdGlvbihlKXt0LmVkZ2UoZSkubWlubGVuKj1vfSkpO3ZhciBhPShmdW5jdGlvbiBzKHQpe3JldHVybiBsWXQucmVkdWNlKHQuZWRnZXMoKSwoZnVuY3Rpb24oZSxuKXtyZXR1cm4gZSt0LmVkZ2Uobikud2VpZ2h0fSksMCl9KSh0KSsxO2xZdC5mb3JFYWNoKHQuY2hpbGRyZW4oKSwoZnVuY3Rpb24oaSl7dVl0KHQsZSxvLGEscixuLGkpfSkpLHQuZ3JhcGgoKS5ub2RlUmFua0ZhY3Rvcj1vfSxjbGVhbnVwOmZ1bmN0aW9uIENYdCh0KXt2YXIgZT10LmdyYXBoKCk7dC5yZW1vdmVOb2RlKGUubmVzdGluZ1Jvb3QpLGRlbGV0ZSBlLm5lc3RpbmdSb290LGxZdC5mb3JFYWNoKHQuZWRnZXMoKSwoZnVuY3Rpb24oZSl7dC5lZGdlKGUpLm5lc3RpbmdFZGdlJiZ0LnJlbW92ZUVkZ2UoZSl9KSl9fSxBWHQ9cFl0LGtYdD17YWRqdXN0OmZ1bmN0aW9uIExYdCh0KXt2YXIgZT10LmdyYXBoKCkucmFua2Rpci50b0xvd2VyQ2FzZSgpOyJsciIhPT1lJiYicmwiIT09ZXx8X1l0KHQpfSx1bmRvOmZ1bmN0aW9uIFBYdCh0KXt2YXIgZT10LmdyYXBoKCkucmFua2Rpci50b0xvd2VyQ2FzZSgpOyJidCIhPT1lJiYicmwiIT09ZXx8KGZ1bmN0aW9uIG4odCl7Z1l0LmZvckVhY2godC5ub2RlcygpLChmdW5jdGlvbihlKXt2WXQodC5ub2RlKGUpKX0pKSxnWXQuZm9yRWFjaCh0LmVkZ2VzKCksKGZ1bmN0aW9uKGUpe3ZhciBuPXQuZWRnZShlKTtnWXQuZm9yRWFjaChuLnBvaW50cyx2WXQpLGdZdC5oYXMobiwieSIpJiZ2WXQobil9KSl9KSh0KTsibHIiIT09ZSYmInJsIiE9PWV8fCghKGZ1bmN0aW9uIGkodCl7Z1l0LmZvckVhY2godC5ub2RlcygpLChmdW5jdGlvbihlKXtiWXQodC5ub2RlKGUpKX0pKSxnWXQuZm9yRWFjaCh0LmVkZ2VzKCksKGZ1bmN0aW9uKGUpe3ZhciBuPXQuZWRnZShlKTtnWXQuZm9yRWFjaChuLnBvaW50cyxiWXQpLGdZdC5oYXMobiwieCIpJiZiWXQobil9KSl9KSh0KSxfWXQodCkpfX0sTlh0PWZ1bmN0aW9uIElYdCh0KXt2YXIgZT1LWXQubWF4UmFuayh0KSxuPVpZdCh0LEhZdC5yYW5nZSgxLGUrMSksImluRWRnZXMiKSxpPVpZdCh0LEhZdC5yYW5nZShlLTEsLTEsLTEpLCJvdXRFZGdlcyIpLHI9Rll0KHQpO1FZdCh0LHIpO2Zvcih2YXIgbyxhPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxzPTAsbD0wO2w8NDsrK3MsKytsKXtKWXQocyUyP246aSxzJTQ+PTIpLHI9S1l0LmJ1aWxkTGF5ZXJNYXRyaXgodCk7dmFyIGM9VVl0KHQscik7YzxhJiYobD0wLG89SFl0LmNsb25lRGVlcChyKSxhPWMpfVFZdCh0LG8pfSxSWHQ9ZnVuY3Rpb24gT1h0KHQpeyhmdW5jdGlvbiBlKHQpe3ZhciBlPW1YdC5idWlsZExheWVyTWF0cml4KHQpLG49dC5ncmFwaCgpLnJhbmtzZXAsaT0wO2ZYdC5mb3JFYWNoKGUsKGZ1bmN0aW9uKGUpe3ZhciByPWZYdC5tYXgoZlh0Lm1hcChlLChmdW5jdGlvbihlKXtyZXR1cm4gdC5ub2RlKGUpLmhlaWdodH0pKSk7Zlh0LmZvckVhY2goZSwoZnVuY3Rpb24oZSl7dC5ub2RlKGUpLnk9aStyLzJ9KSksaSs9citufSkpfSkodD1tWHQuYXNOb25Db21wb3VuZEdyYXBoKHQpKSxmWHQuZm9yRWFjaChnWHQodCksKGZ1bmN0aW9uKGUsbil7dC5ub2RlKG4pLng9ZX0pKX0selh0PW9xdCxEWHQ9eVV0LkdyYXBoLEJYdD1mdW5jdGlvbiBIWHQodCxlKXt2YXIgbj1lJiZlLmRlYnVnVGltaW5nP3pYdC50aW1lOnpYdC5ub3RpbWU7bigibGF5b3V0IiwoZnVuY3Rpb24oKXt2YXIgZT1uKCIgIGJ1aWxkTGF5b3V0R3JhcGgiLChmdW5jdGlvbigpe3JldHVybihmdW5jdGlvbiBlKHQpe3ZhciBlPW5ldyBEWHQoe211bHRpZ3JhcGg6ITAsY29tcG91bmQ6ITB9KSxuPSRYdCh0LmdyYXBoKCkpO3JldHVybiBlLnNldEdyYXBoKF9YdC5tZXJnZSh7fSxWWHQsWFh0KG4sRlh0KSxfWHQucGljayhuLFVYdCkpKSxfWHQuZm9yRWFjaCh0Lm5vZGVzKCksKGZ1bmN0aW9uKG4pe3ZhciBpPSRYdCh0Lm5vZGUobikpO2Uuc2V0Tm9kZShuLF9YdC5kZWZhdWx0cyhYWHQoaSxqWHQpLEdYdCkpLGUuc2V0UGFyZW50KG4sdC5wYXJlbnQobikpfSkpLF9YdC5mb3JFYWNoKHQuZWRnZXMoKSwoZnVuY3Rpb24obil7dmFyIGk9JFh0KHQuZWRnZShuKSk7ZS5zZXRFZGdlKG4sX1h0Lm1lcmdlKHt9LHFYdCxYWHQoaSxXWHQpLF9YdC5waWNrKGksWVh0KSkpfSkpLGV9KSh0KX0pKTtuKCIgIHJ1bkxheW91dCIsKGZ1bmN0aW9uKCl7IShmdW5jdGlvbiB0KGUsbil7bigiICAgIG1ha2VTcGFjZUZvckVkZ2VMYWJlbHMiLChmdW5jdGlvbigpeyEoZnVuY3Rpb24gdChlKXt2YXIgbj1lLmdyYXBoKCk7bi5yYW5rc2VwLz0yLF9YdC5mb3JFYWNoKGUuZWRnZXMoKSwoZnVuY3Rpb24odCl7dmFyIGk9ZS5lZGdlKHQpO2kubWlubGVuKj0yLCJjIiE9PWkubGFiZWxwb3MudG9Mb3dlckNhc2UoKSYmKCJUQiI9PT1uLnJhbmtkaXJ8fCJCVCI9PT1uLnJhbmtkaXI/aS53aWR0aCs9aS5sYWJlbG9mZnNldDppLmhlaWdodCs9aS5sYWJlbG9mZnNldCl9KSl9KShlKX0pKSxuKCIgICAgcmVtb3ZlU2VsZkVkZ2VzIiwoZnVuY3Rpb24oKXshKGZ1bmN0aW9uIHQoZSl7X1h0LmZvckVhY2goZS5lZGdlcygpLChmdW5jdGlvbih0KXtpZih0LnY9PT10Lncpe3ZhciBuPWUubm9kZSh0LnYpO24uc2VsZkVkZ2VzfHwobi5zZWxmRWRnZXM9W10pLG4uc2VsZkVkZ2VzLnB1c2goe2U6dCxsYWJlbDplLmVkZ2UodCl9KSxlLnJlbW92ZUVkZ2UodCl9fSkpfSkoZSl9KSksbigiICAgIGFjeWNsaWMiLChmdW5jdGlvbigpe3lYdC5ydW4oZSl9KSksbigiICAgIG5lc3RpbmdHcmFwaC5ydW4iLChmdW5jdGlvbigpe0VYdC5ydW4oZSl9KSksbigiICAgIHJhbmsiLChmdW5jdGlvbigpe2JYdCh6WHQuYXNOb25Db21wb3VuZEdyYXBoKGUpKX0pKSxuKCIgICAgaW5qZWN0RWRnZUxhYmVsUHJveGllcyIsKGZ1bmN0aW9uKCl7IShmdW5jdGlvbiB0KGUpe19YdC5mb3JFYWNoKGUuZWRnZXMoKSwoZnVuY3Rpb24odCl7dmFyIG49ZS5lZGdlKHQpO2lmKG4ud2lkdGgmJm4uaGVpZ2h0KXt2YXIgaT1lLm5vZGUodC52KSxyPWUubm9kZSh0LncpO3pYdC5hZGREdW1teU5vZGUoZSwiZWRnZS1wcm94eSIse3Jhbms6KHIucmFuay1pLnJhbmspLzIraS5yYW5rLGU6dH0sIl9lcCIpfX0pKX0pKGUpfSkpLG4oIiAgICByZW1vdmVFbXB0eVJhbmtzIiwoZnVuY3Rpb24oKXtNWHQoZSl9KSksbigiICAgIG5lc3RpbmdHcmFwaC5jbGVhbnVwIiwoZnVuY3Rpb24oKXtFWHQuY2xlYW51cChlKX0pKSxuKCIgICAgbm9ybWFsaXplUmFua3MiLChmdW5jdGlvbigpe3hYdChlKX0pKSxuKCIgICAgYXNzaWduUmFua01pbk1heCIsKGZ1bmN0aW9uKCl7IShmdW5jdGlvbiB0KGUpe3ZhciBuPTA7X1h0LmZvckVhY2goZS5ub2RlcygpLChmdW5jdGlvbih0KXt2YXIgaT1lLm5vZGUodCk7aS5ib3JkZXJUb3AmJihpLm1pblJhbms9ZS5ub2RlKGkuYm9yZGVyVG9wKS5yYW5rLGkubWF4UmFuaz1lLm5vZGUoaS5ib3JkZXJCb3R0b20pLnJhbmssbj1fWHQubWF4KG4saS5tYXhSYW5rKSl9KSksZS5ncmFwaCgpLm1heFJhbms9bn0pKGUpfSkpLG4oIiAgICByZW1vdmVFZGdlTGFiZWxQcm94aWVzIiwoZnVuY3Rpb24oKXshKGZ1bmN0aW9uIHQoZSl7X1h0LmZvckVhY2goZS5ub2RlcygpLChmdW5jdGlvbih0KXt2YXIgbj1lLm5vZGUodCk7ImVkZ2UtcHJveHkiPT09bi5kdW1teSYmKGUuZWRnZShuLmUpLmxhYmVsUmFuaz1uLnJhbmssZS5yZW1vdmVOb2RlKHQpKX0pKX0pKGUpfSkpLG4oIiAgICBub3JtYWxpemUucnVuIiwoZnVuY3Rpb24oKXt2WHQucnVuKGUpfSkpLG4oIiAgICBwYXJlbnREdW1teUNoYWlucyIsKGZ1bmN0aW9uKCl7d1h0KGUpfSkpLG4oIiAgICBhZGRCb3JkZXJTZWdtZW50cyIsKGZ1bmN0aW9uKCl7QVh0KGUpfSkpLG4oIiAgICBvcmRlciIsKGZ1bmN0aW9uKCl7Tlh0KGUpfSkpLG4oIiAgICBpbnNlcnRTZWxmRWRnZXMiLChmdW5jdGlvbigpeyEoZnVuY3Rpb24gdChlKXt2YXIgbj16WHQuYnVpbGRMYXllck1hdHJpeChlKTtfWHQuZm9yRWFjaChuLChmdW5jdGlvbih0KXt2YXIgbj0wO19YdC5mb3JFYWNoKHQsKGZ1bmN0aW9uKHQsaSl7dmFyIHI9ZS5ub2RlKHQpO3Iub3JkZXI9aStuLF9YdC5mb3JFYWNoKHIuc2VsZkVkZ2VzLChmdW5jdGlvbih0KXt6WHQuYWRkRHVtbXlOb2RlKGUsInNlbGZlZGdlIix7d2lkdGg6dC5sYWJlbC53aWR0aCxoZWlnaHQ6dC5sYWJlbC5oZWlnaHQscmFuazpyLnJhbmssb3JkZXI6aSsgKytuLGU6dC5lLGxhYmVsOnQubGFiZWx9LCJfc2UiKX0pKSxkZWxldGUgci5zZWxmRWRnZXN9KSl9KSl9KShlKX0pKSxuKCIgICAgYWRqdXN0Q29vcmRpbmF0ZVN5c3RlbSIsKGZ1bmN0aW9uKCl7a1h0LmFkanVzdChlKX0pKSxuKCIgICAgcG9zaXRpb24iLChmdW5jdGlvbigpe1JYdChlKX0pKSxuKCIgICAgcG9zaXRpb25TZWxmRWRnZXMiLChmdW5jdGlvbigpeyEoZnVuY3Rpb24gdChlKXtfWHQuZm9yRWFjaChlLm5vZGVzKCksKGZ1bmN0aW9uKHQpe3ZhciBuPWUubm9kZSh0KTtpZigic2VsZmVkZ2UiPT09bi5kdW1teSl7dmFyIGk9ZS5ub2RlKG4uZS52KSxyPWkueCtpLndpZHRoLzIsbz1pLnksYT1uLngtcixzPWkuaGVpZ2h0LzI7ZS5zZXRFZGdlKG4uZSxuLmxhYmVsKSxlLnJlbW92ZU5vZGUodCksbi5sYWJlbC5wb2ludHM9W3t4OnIrMiphLzMseTpvLXN9LHt4OnIrNSphLzYseTpvLXN9LHt4OnIrYSx5Om99LHt4OnIrNSphLzYseTpvK3N9LHt4OnIrMiphLzMseTpvK3N9XSxuLmxhYmVsLng9bi54LG4ubGFiZWwueT1uLnl9fSkpfSkoZSl9KSksbigiICAgIHJlbW92ZUJvcmRlck5vZGVzIiwoZnVuY3Rpb24oKXshKGZ1bmN0aW9uIHQoZSl7X1h0LmZvckVhY2goZS5ub2RlcygpLChmdW5jdGlvbih0KXtpZihlLmNoaWxkcmVuKHQpLmxlbmd0aCl7dmFyIG49ZS5ub2RlKHQpLGk9ZS5ub2RlKG4uYm9yZGVyVG9wKSxyPWUubm9kZShuLmJvcmRlckJvdHRvbSksbz1lLm5vZGUoX1h0Lmxhc3Qobi5ib3JkZXJMZWZ0KSksYT1lLm5vZGUoX1h0Lmxhc3Qobi5ib3JkZXJSaWdodCkpO24ud2lkdGg9TWF0aC5hYnMoYS54LW8ueCksbi5oZWlnaHQ9TWF0aC5hYnMoci55LWkueSksbi54PW8ueCtuLndpZHRoLzIsbi55PWkueStuLmhlaWdodC8yfX0pKSxfWHQuZm9yRWFjaChlLm5vZGVzKCksKGZ1bmN0aW9uKHQpeyJib3JkZXIiPT09ZS5ub2RlKHQpLmR1bW15JiZlLnJlbW92ZU5vZGUodCl9KSl9KShlKX0pKSxuKCIgICAgbm9ybWFsaXplLnVuZG8iLChmdW5jdGlvbigpe3ZYdC51bmRvKGUpfSkpLG4oIiAgICBmaXh1cEVkZ2VMYWJlbENvb3JkcyIsKGZ1bmN0aW9uKCl7IShmdW5jdGlvbiB0KGUpe19YdC5mb3JFYWNoKGUuZWRnZXMoKSwoZnVuY3Rpb24odCl7dmFyIG49ZS5lZGdlKHQpO2lmKF9YdC5oYXMobiwieCIpKXN3aXRjaCgibCIhPT1uLmxhYmVscG9zJiYiciIhPT1uLmxhYmVscG9zfHwobi53aWR0aC09bi5sYWJlbG9mZnNldCksbi5sYWJlbHBvcyl7Y2FzZSJsIjpuLngtPW4ud2lkdGgvMituLmxhYmVsb2Zmc2V0O2JyZWFrO2Nhc2UiciI6bi54Kz1uLndpZHRoLzIrbi5sYWJlbG9mZnNldH19KSl9KShlKX0pKSxuKCIgICAgdW5kb0Nvb3JkaW5hdGVTeXN0ZW0iLChmdW5jdGlvbigpe2tYdC51bmRvKGUpfSkpLG4oIiAgICB0cmFuc2xhdGVHcmFwaCIsKGZ1bmN0aW9uKCl7IShmdW5jdGlvbiB0KGUpe3ZhciBuPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSxpPTAscj1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksbz0wLGE9ZS5ncmFwaCgpLHM9YS5tYXJnaW54fHwwLGw9YS5tYXJnaW55fHwwO2Z1bmN0aW9uIGModCl7dmFyIGU9dC54LGE9dC55LHM9dC53aWR0aCxsPXQuaGVpZ2h0O249TWF0aC5taW4obixlLXMvMiksaT1NYXRoLm1heChpLGUrcy8yKSxyPU1hdGgubWluKHIsYS1sLzIpLG89TWF0aC5tYXgobyxhK2wvMil9X1h0LmZvckVhY2goZS5ub2RlcygpLChmdW5jdGlvbih0KXtjKGUubm9kZSh0KSl9KSksX1h0LmZvckVhY2goZS5lZGdlcygpLChmdW5jdGlvbih0KXt2YXIgbj1lLmVkZ2UodCk7X1h0LmhhcyhuLCJ4IikmJmMobil9KSksbi09cyxyLT1sLF9YdC5mb3JFYWNoKGUubm9kZXMoKSwoZnVuY3Rpb24odCl7dmFyIGk9ZS5ub2RlKHQpO2kueC09bixpLnktPXJ9KSksX1h0LmZvckVhY2goZS5lZGdlcygpLChmdW5jdGlvbih0KXt2YXIgaT1lLmVkZ2UodCk7X1h0LmZvckVhY2goaS5wb2ludHMsKGZ1bmN0aW9uKHQpe3QueC09bix0LnktPXJ9KSksX1h0LmhhcyhpLCJ4IikmJihpLngtPW4pLF9YdC5oYXMoaSwieSIpJiYoaS55LT1yKX0pKSxhLndpZHRoPWktbitzLGEuaGVpZ2h0PW8tcitsfSkoZSl9KSksbigiICAgIGFzc2lnbk5vZGVJbnRlcnNlY3RzIiwoZnVuY3Rpb24oKXshKGZ1bmN0aW9uIHQoZSl7X1h0LmZvckVhY2goZS5lZGdlcygpLChmdW5jdGlvbih0KXt2YXIgbixpLHI9ZS5lZGdlKHQpLG89ZS5ub2RlKHQudiksYT1lLm5vZGUodC53KTtyLnBvaW50cz8obj1yLnBvaW50c1swXSxpPXIucG9pbnRzW3IucG9pbnRzLmxlbmd0aC0xXSk6KHIucG9pbnRzPVtdLG49YSxpPW8pLHIucG9pbnRzLnVuc2hpZnQoelh0LmludGVyc2VjdFJlY3QobyxuKSksci5wb2ludHMucHVzaCh6WHQuaW50ZXJzZWN0UmVjdChhLGkpKX0pKX0pKGUpfSkpLG4oIiAgICByZXZlcnNlUG9pbnRzIiwoZnVuY3Rpb24oKXshKGZ1bmN0aW9uIHQoZSl7X1h0LmZvckVhY2goZS5lZGdlcygpLChmdW5jdGlvbih0KXt2YXIgbj1lLmVkZ2UodCk7bi5yZXZlcnNlZCYmbi5wb2ludHMucmV2ZXJzZSgpfSkpfSkoZSl9KSksbigiICAgIGFjeWNsaWMudW5kbyIsKGZ1bmN0aW9uKCl7eVh0LnVuZG8oZSl9KSl9KShlLG4pfSkpLG4oIiAgdXBkYXRlSW5wdXRHcmFwaCIsKGZ1bmN0aW9uKCl7IShmdW5jdGlvbiBuKHQsZSl7X1h0LmZvckVhY2godC5ub2RlcygpLChmdW5jdGlvbihuKXt2YXIgaT10Lm5vZGUobikscj1lLm5vZGUobik7aSYmKGkueD1yLngsaS55PXIueSxlLmNoaWxkcmVuKG4pLmxlbmd0aCYmKGkud2lkdGg9ci53aWR0aCxpLmhlaWdodD1yLmhlaWdodCkpfSkpLF9YdC5mb3JFYWNoKHQuZWRnZXMoKSwoZnVuY3Rpb24obil7dmFyIGk9dC5lZGdlKG4pLHI9ZS5lZGdlKG4pO2kucG9pbnRzPXIucG9pbnRzLF9YdC5oYXMociwieCIpJiYoaS54PXIueCxpLnk9ci55KX0pKSx0LmdyYXBoKCkud2lkdGg9ZS5ncmFwaCgpLndpZHRoLHQuZ3JhcGgoKS5oZWlnaHQ9ZS5ncmFwaCgpLmhlaWdodH0pKHQsZSl9KSl9KSl9O3ZhciBGWHQ9WyJub2Rlc2VwIiwiZWRnZXNlcCIsInJhbmtzZXAiLCJtYXJnaW54IiwibWFyZ2lueSJdLFZYdD17cmFua3NlcDo1MCxlZGdlc2VwOjIwLG5vZGVzZXA6NTAscmFua2RpcjoidGIifSxVWHQ9WyJhY3ljbGljZXIiLCJyYW5rZXIiLCJyYW5rZGlyIiwiYWxpZ24iXSxqWHQ9WyJ3aWR0aCIsImhlaWdodCJdLEdYdD17d2lkdGg6MCxoZWlnaHQ6MH0sV1h0PVsibWlubGVuIiwid2VpZ2h0Iiwid2lkdGgiLCJoZWlnaHQiLCJsYWJlbG9mZnNldCJdLHFYdD17bWlubGVuOjEsd2VpZ2h0OjEsd2lkdGg6MCxoZWlnaHQ6MCxsYWJlbG9mZnNldDoxMCxsYWJlbHBvczoiciJ9LFlYdD1bImxhYmVscG9zIl07ZnVuY3Rpb24gWFh0KHQsZSl7cmV0dXJuIF9YdC5tYXBWYWx1ZXMoX1h0LnBpY2sodCxlKSxOdW1iZXIpfWZ1bmN0aW9uICRYdCh0KXt2YXIgZT17fTtyZXR1cm4gX1h0LmZvckVhY2godCwoZnVuY3Rpb24odCxuKXtlW24udG9Mb3dlckNhc2UoKV09dH0pKSxlfXZhciBLWHQ9SFd0LFpYdD1vcXQsSlh0PXlVdC5HcmFwaDt2YXIgUVh0LHQkdD17Z3JhcGhsaWI6eVV0LGxheW91dDpCWHQsZGVidWc6e2RlYnVnT3JkZXJpbmc6ZnVuY3Rpb24gZSR0KHQpe3ZhciBlPVpYdC5idWlsZExheWVyTWF0cml4KHQpLG49bmV3IEpYdCh7Y29tcG91bmQ6ITAsbXVsdGlncmFwaDohMH0pLnNldEdyYXBoKHt9KTtyZXR1cm4gS1h0LmZvckVhY2godC5ub2RlcygpLChmdW5jdGlvbihlKXtuLnNldE5vZGUoZSx7bGFiZWw6ZX0pLG4uc2V0UGFyZW50KGUsImxheWVyIit0Lm5vZGUoZSkucmFuayl9KSksS1h0LmZvckVhY2godC5lZGdlcygpLChmdW5jdGlvbih0KXtuLnNldEVkZ2UodC52LHQudyx7fSx0Lm5hbWUpfSkpLEtYdC5mb3JFYWNoKGUsKGZ1bmN0aW9uKHQsZSl7bi5zZXROb2RlKCJsYXllciIrZSx7cmFuazoic2FtZSJ9KSxLWHQucmVkdWNlKHQsKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG4uc2V0RWRnZSh0LGUse3N0eWxlOiJpbnZpcyJ9KSxlfSkpfSkpLG59fSx1dGlsOnt0aW1lOm9xdC50aW1lLG5vdGltZTpvcXQubm90aW1lfSx2ZXJzaW9uOiIwLjguNSJ9OyEoZnVuY3Rpb24odCl7dC5PUF9HUkFQSD0ib3BfZ3JhcGgiLHQuQ09OQ0VQVFVBTF9HUkFQSD0iY29uY2VwdHVhbF9ncmFwaCIsdC5QUk9GSUxFPSJwcm9maWxlIn0pKFFYdHx8KFFYdD17fSkpO2xldCBuJHQ9e05vZGU6e0NPTlRBSU5FUjoibm9kZXMiLEdST1VQOiJub2RlIixTSEFQRToibm9kZXNoYXBlIixDT0xPUl9UQVJHRVQ6Im5vZGVjb2xvcnRhcmdldCIsTEFCRUw6Im5vZGVsYWJlbCIsQlVUVE9OX0NPTlRBSU5FUjoiYnV0dG9uY29udGFpbmVyIixCVVRUT05fQ0lSQ0xFOiJidXR0b25jaXJjbGUiLEVYUEFORF9CVVRUT046ImV4cGFuZGJ1dHRvbiIsQ09MTEFQU0VfQlVUVE9OOiJjb2xsYXBzZWJ1dHRvbiJ9LEVkZ2U6e0NPTlRBSU5FUjoiZWRnZXMiLEdST1VQOiJlZGdlIixMSU5FOiJlZGdlbGluZSIsUkVGRVJFTkNFX0VER0U6InJlZmVyZW5jZWVkZ2UiLFJFRl9MSU5FOiJyZWZsaW5lIixTRUxFQ1RBQkxFOiJzZWxlY3RhYmxlZWRnZSIsU0VMRUNURUQ6InNlbGVjdGVkZWRnZSIsU1RSVUNUVVJBTDoic3RydWN0dXJhbCJ9LEFubm90YXRpb246e09VVEJPWDoib3V0LWFubm90YXRpb25zIixJTkJPWDoiaW4tYW5ub3RhdGlvbnMiLEdST1VQOiJhbm5vdGF0aW9uIixOT0RFOiJhbm5vdGF0aW9uLW5vZGUiLEVER0U6ImFubm90YXRpb24tZWRnZSIsQ09OVFJPTF9FREdFOiJhbm5vdGF0aW9uLWNvbnRyb2wtZWRnZSIsTEFCRUw6ImFubm90YXRpb24tbGFiZWwiLEVMTElQU0lTOiJhbm5vdGF0aW9uLWVsbGlwc2lzIn0sU2NlbmU6e0dST1VQOiJzY2VuZSIsQ09SRToiY29yZSIsRlVOQ1RJT05fTElCUkFSWToiZnVuY3Rpb24tbGlicmFyeSIsSU5FWFRSQUNUOiJpbi1leHRyYWN0IixPVVRFWFRSQUNUOiJvdXQtZXh0cmFjdCJ9LFN1YnNjZW5lOntHUk9VUDoic3Vic2NlbmUifSxPUE5PREU6Im9wIixNRVRBTk9ERToibWV0YSIsU0VSSUVTTk9ERToic2VyaWVzIixCUklER0VOT0RFOiJicmlkZ2UiLEVMTElQU0lTTk9ERToiZWxsaXBzaXMifTtjb25zdCBpJHQ9e0xBQkVMOjV9LHIkdD17RVhQQU5ERURfTEFCRUw6OSxTRVJJRVNfTEFCRUw6OCxPUF9MQUJFTDo2LEhFQUxUSF9QSUxMX1NUQVRfTEFCRUw6NH0sbyR0PSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7ZnVuY3Rpb24gYSR0KHQsZSxuKXtsZXQgaT10Lm5vZGUoKS5jaGlsZE5vZGVzO2ZvcihsZXQgdD0wO3Q8aS5sZW5ndGg7dCsrKXtsZXQgcj1pW3RdO2lmKHIudGFnTmFtZT09PWUpaWYobiBpbnN0YW5jZW9mIEFycmF5KXtsZXQgdD0hMDtmb3IobGV0IGU9MDtlPG4ubGVuZ3RoO2UrKyl0PXQmJnIuY2xhc3NMaXN0LmNvbnRhaW5zKG5bZV0pO2lmKHQpcmV0dXJuIER1KHIpfWVsc2UgaWYoIW58fHIuY2xhc3NMaXN0LmNvbnRhaW5zKG4pKXJldHVybiBEdShyKX1yZXR1cm4gRHUobnVsbCl9ZnVuY3Rpb24gcyR0KHQsZSxuLGkpe2xldCByPWEkdCh0LGUsbik7aWYoIXIuZW1wdHkoKSlyZXR1cm4gcjtsZXQgbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixlKTtpZihuIGluc3RhbmNlb2YgQXJyYXkpZm9yKGxldCB0PTA7dDxuLmxlbmd0aDt0Kyspby5jbGFzc0xpc3QuYWRkKG5bdF0pO2Vsc2Ugby5jbGFzc0xpc3QuYWRkKG4pO3JldHVybiBpP3Qubm9kZSgpLmluc2VydEJlZm9yZShvLGkpOnQubm9kZSgpLmFwcGVuZENoaWxkKG8pLER1KG8pLmRhdHVtKHQuZGF0dW0oKSl9Y2xhc3MgbCR0e2NvbnN0cnVjdG9yKHQpe3RoaXMudG90YWxCeXRlcz0wLHRoaXMub3V0cHV0U2l6ZT10fWFkZEV4ZWN1dGlvblRpbWUodCxlKXt0aGlzLnN0YXJ0VGltZT1udWxsIT10aGlzLnN0YXJ0VGltZT9NYXRoLm1pbih0aGlzLnN0YXJ0VGltZSx0KTp0LHRoaXMuZW5kVGltZT1udWxsIT10aGlzLmVuZFRpbWU/TWF0aC5tYXgodGhpcy5lbmRUaW1lLGUpOmV9YWRkQnl0ZXNBbGxvY2F0aW9uKHQpe3RoaXMudG90YWxCeXRlcz1udWxsIT10aGlzLnRvdGFsQnl0ZXM/TWF0aC5tYXgodGhpcy50b3RhbEJ5dGVzLHQpOnR9Y29tYmluZSh0KXtudWxsIT10LnRvdGFsQnl0ZXMmJih0aGlzLnRvdGFsQnl0ZXMrPXQudG90YWxCeXRlcyksbnVsbCE9dC5nZXRUb3RhbE1pY3JvcygpJiZ0aGlzLmFkZEV4ZWN1dGlvblRpbWUodC5zdGFydFRpbWUsdC5lbmRUaW1lKX1nZXRUb3RhbE1pY3Jvcygpe3JldHVybiBudWxsPT10aGlzLnN0YXJ0VGltZXx8bnVsbD09dGhpcy5lbmRUaW1lP251bGw6dGhpcy5lbmRUaW1lLXRoaXMuc3RhcnRUaW1lfX1jb25zdCBjJHQ9Ljc1LHUkdD1URSgpLmV4cG9uZW50KC4zKS5kb21haW4oWzEsNWU2XSkucmFuZ2UoW2MkdCwxMl0pLmNsYW1wKCEwKTtmdW5jdGlvbiBoJHQodCl7IShmdW5jdGlvbiBlKHQpe3JldHVybiB0Lmhhc093blByb3BlcnR5KCJ0aW1pbmdJZCIpfSkodCl9ZnVuY3Rpb24gZCR0KHQsZSxuKXtsZXQgaT1EYXRlLm5vdygpLHI9ZSgpO2NvbnN0IG89RGF0ZS5ub3coKS1pO3JldHVybiBjb25zb2xlLmxvZyh0LCI6IixvLCJtcyIpLG4mJmgkdCh7dGltaW5nSWQ6bixldmVudFZhbHVlOm99KSxyfWZ1bmN0aW9uIHAkdCh0KXtyZXR1cm57c2V0TWVzc2FnZTpmdW5jdGlvbihlKXt0LnNldCgicHJvZ3Jlc3MiLHt2YWx1ZTp0LnByb2dyZXNzLnZhbHVlLG1zZzplfSl9LHVwZGF0ZVByb2dyZXNzOmZ1bmN0aW9uKGUpe3Quc2V0KCJwcm9ncmVzcyIse3ZhbHVlOnQucHJvZ3Jlc3MudmFsdWUrZSxtc2c6dC5wcm9ncmVzcy5tc2d9KX0scmVwb3J0RXJyb3I6ZnVuY3Rpb24oZSxuKXtjb25zb2xlLmVycm9yKG4uc3RhY2spLHQuc2V0KCJwcm9ncmVzcyIse3ZhbHVlOnQucHJvZ3Jlc3MudmFsdWUsbXNnOmUsZXJyb3I6ITB9KX19fWZ1bmN0aW9uIGYkdCh0LGUsbil7cmV0dXJue3NldE1lc3NhZ2U6ZnVuY3Rpb24oZSl7dC5zZXRNZXNzYWdlKG4rIjogIitlKX0sdXBkYXRlUHJvZ3Jlc3M6ZnVuY3Rpb24obil7dC51cGRhdGVQcm9ncmVzcyhuKmUvMTAwKX0scmVwb3J0RXJyb3I6ZnVuY3Rpb24oZSxpKXt0LnJlcG9ydEVycm9yKG4rIjogIitlLGkpfX19ZnVuY3Rpb24gbSR0KHQsZSxuLGkscil7cmV0dXJuIG5ldyBQcm9taXNlKCgobyxhKT0+e2kuc2V0TWVzc2FnZSh0KSxzZXRUaW1lb3V0KChmdW5jdGlvbigpe3RyeXtsZXQgYT1kJHQodCxuLHIpO2kudXBkYXRlUHJvZ3Jlc3MoZSksbyhhKX1jYXRjaChlKXtpLnJlcG9ydEVycm9yKCJGYWlsZWQgIit0LGUpfX0pLDIwKX0pKX1mdW5jdGlvbiBnJHQodCxlLG4saSxyKXtyZXR1cm4gbmV3IFByb21pc2UoKChvLGEpPT57bGV0IHM9ZnVuY3Rpb24oZSl7aS5yZXBvcnRFcnJvcigiRmFpbGVkICIrdCxlKSxhKGUpfTtpLnNldE1lc3NhZ2UodCksc2V0VGltZW91dCgoZnVuY3Rpb24oKXt0cnl7bGV0IGE9RGF0ZS5ub3coKTtuKCkudGhlbigoZnVuY3Rpb24obil7Y29uc3Qgcz1EYXRlLm5vdygpLWE7Y29uc29sZS5sb2codCwiOiIscywibXMiKSxpLnVwZGF0ZVByb2dyZXNzKGUpLGgkdCh7dGltaW5nSWQ6cixldmVudFZhbHVlOnN9KSxvKG4pfSkpLmNhdGNoKHMpfWNhdGNoKHQpe3ModCl9fSksMjApfSkpfWNvbnN0IF8kdD1be3N5bWJvbDoiQiJ9LHtzeW1ib2w6IktCIixudW1Vbml0czoxMDI0fSx7c3ltYm9sOiJNQiIsbnVtVW5pdHM6MTAyNH0se3N5bWJvbDoiR0IiLG51bVVuaXRzOjEwMjR9LHtzeW1ib2w6IlRCIixudW1Vbml0czoxMDI0fSx7c3ltYm9sOiJQQiIsbnVtVW5pdHM6MTAyNH1dLHkkdD1be3N5bWJvbDoiwrVzIn0se3N5bWJvbDoibXMiLG51bVVuaXRzOjFlM30se3N5bWJvbDoicyIsbnVtVW5pdHM6MWUzfSx7c3ltYm9sOiJtaW4iLG51bVVuaXRzOjYwfSx7c3ltYm9sOiJociIsbnVtVW5pdHM6NjB9LHtzeW1ib2w6ImRheXMiLG51bVVuaXRzOjI0fV07ZnVuY3Rpb24gdiR0KHQsZSxuPTApe3JldHVybiBuKzE8ZS5sZW5ndGgmJnQ+PWVbbisxXS5udW1Vbml0cz92JHQodC9lW24rMV0ubnVtVW5pdHMsZSxuKzEpOk51bWJlcih0LnRvUHJlY2lzaW9uKDMpKSsiICIrZVtuXS5zeW1ib2x9ZnVuY3Rpb24gYiR0KHQpe3JldHVybiEoIXR8fCEodC50b3RhbEJ5dGVzPjB8fHQuZ2V0VG90YWxNaWNyb3MoKT4wfHx0Lm91dHB1dFNpemUpKX1mdW5jdGlvbiB4JHQodCl7aWYodC5sZW5ndGg8MilyZXR1cm4gdDtsZXQgZT0wLG49MCxpPUNlLmV4cG9ydHMubWluKENlLmV4cG9ydHMubWFwKHQsKHQ9PnQubGVuZ3RoKSkpO2Zvcig7Oyl7ZSsrO2xldCByPUNlLmV4cG9ydHMubWFwKHQsKHQ9PnQuc3Vic3RyaW5nKDAsZSkpKTtpZighci5ldmVyeSgoKHQsZSk9PjA9PT1lfHx0PT09cltlLTFdKSkpYnJlYWs7aWYoZT49aSlyZXR1cm4gdDtuPWV9cmV0dXJuIENlLmV4cG9ydHMubWFwKHQsKHQ9PnQuc3Vic3RyaW5nKG4pKSl9Y29uc3QgdyR0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpLmdldENvbnRleHQoIjJkIik7ZnVuY3Rpb24gUyR0KHQsZSl7cmV0dXJuIHckdC5mb250PWAke2V9cHggUm9ib3RvLCBzYW5zLXNlcmlmYCx3JHQubWVhc3VyZVRleHQodCkud2lkdGh9Y29uc3QgTSR0PSIvIixFJHQ9Il9fcm9vdF9fIixUJHQ9Il9fZnVuY3Rpb25fbGlicmFyeV9fIjt2YXIgQyR0LEEkdCxrJHQsTCR0OyEoZnVuY3Rpb24odCl7dFt0LkZVTEw9MF09IkZVTEwiLHRbdC5FTUJFRERFRD0xXT0iRU1CRURERUQiLHRbdC5NRVRBPTJdPSJNRVRBIix0W3QuU0VSSUVTPTNdPSJTRVJJRVMiLHRbdC5DT1JFPTRdPSJDT1JFIix0W3QuU0hBRE9XPTVdPSJTSEFET1ciLHRbdC5CUklER0U9Nl09IkJSSURHRSIsdFt0LkVER0U9N109IkVER0UifSkoQyR0fHwoQyR0PXt9KSksKGZ1bmN0aW9uKHQpe3RbdC5NRVRBPTBdPSJNRVRBIix0W3QuT1A9MV09Ik9QIix0W3QuU0VSSUVTPTJdPSJTRVJJRVMiLHRbdC5CUklER0U9M109IkJSSURHRSIsdFt0LkVMTElQU0lTPTRdPSJFTExJUFNJUyJ9KShBJHR8fChBJHQ9e30pKSwoZnVuY3Rpb24odCl7dFt0LklOQ0xVREU9MF09IklOQ0xVREUiLHRbdC5FWENMVURFPTFdPSJFWENMVURFIix0W3QuVU5TUEVDSUZJRUQ9Ml09IlVOU1BFQ0lGSUVEIn0pKGskdHx8KGskdD17fSkpLChmdW5jdGlvbih0KXt0W3QuR1JPVVA9MF09IkdST1VQIix0W3QuVU5HUk9VUD0xXT0iVU5HUk9VUCJ9KShMJHR8fChMJHQ9e30pKTtjb25zdCBQJHQ9Il9vdXRwdXRfc2hhcGVzIixOJHQ9Il9YbGFDbHVzdGVyIjtjbGFzcyBJJHR7Y29uc3RydWN0b3IoKXt0aGlzLm5vZGVzPXt9LHRoaXMuZWRnZXM9W119fWNsYXNzIFIkdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnR5cGU9QSR0LkVMTElQU0lTLHRoaXMuaXNHcm91cE5vZGU9ITEsdGhpcy5jYXJkaW5hbGl0eT0xLHRoaXMucGFyZW50Tm9kZT1udWxsLHRoaXMuc3RhdHM9bnVsbCx0aGlzLnNldE51bU1vcmVOb2Rlcyh0KSx0aGlzLmluY2x1ZGU9ayR0LlVOU1BFQ0lGSUVEfXNldE51bU1vcmVOb2Rlcyh0KXt0aGlzLm51bU1vcmVOb2Rlcz10LHRoaXMubmFtZT0iLi4uICIrdCsiIG1vcmUifX1jbGFzcyBPJHR7Y29uc3RydWN0b3IodCl7dGhpcy5vcD10Lm9wLHRoaXMubmFtZT10Lm5hbWUsdGhpcy5kZXZpY2U9dC5kZXZpY2UsdGhpcy5hdHRyPXQuYXR0cix0aGlzLmlucHV0cz0oZnVuY3Rpb24gZSh0KXtjb25zdCBlPVtdO2xldCBuPW51bGw7Zm9yKGxldCBpIG9mIHR8fFtdKXtjb25zdCB0PWkuc3RhcnRzV2l0aCgiXiIpO3QmJihpPWkuc3Vic3RyaW5nKDEpKTtsZXQgcj1pLG89IjAiO2NvbnN0IGE9aS5pbmNsdWRlcygiOiIpJiZpLm1hdGNoKGokdCk7YSYmKHI9YVsxXSxvPWFbMl0pLG4hPT1yJiYobj1yLGUucHVzaCh7bmFtZTpyLG91dHB1dFRlbnNvcktleTpvLGlzQ29udHJvbERlcGVuZGVuY3k6dH0pKX1yZXR1cm4gZX0pKHQuaW5wdXQpLHRoaXMub3V0cHV0U2hhcGVzPShmdW5jdGlvbiBuKHQpe2lmKCF0KXJldHVybiBudWxsO2ZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKXtsZXR7a2V5Om4sdmFsdWU6aX09dFtlXTtpZihuPT09UCR0KXtpZighaS5saXN0fHwhaS5saXN0LnNoYXBlKXJldHVybiBudWxsO2xldCBuPWkubGlzdC5zaGFwZS5tYXAoKHQ9PnQudW5rbm93bl9yYW5rP251bGw6bnVsbD09dC5kaW18fDE9PT10LmRpbS5sZW5ndGgmJm51bGw9PXQuZGltWzBdLnNpemU/W106dC5kaW0ubWFwKCh0PT50LnNpemUpKSkpO3JldHVybiB0LnNwbGljZShlLDEpLG59fXJldHVybiBudWxsfSkodC5hdHRyKSx0aGlzLnhsYUNsdXN0ZXI9KGZ1bmN0aW9uIGkodCl7aWYoIXQpcmV0dXJuIG51bGw7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspaWYodFtlXS5rZXk9PT1OJHQpcmV0dXJuIHRbZV0udmFsdWUuc3x8bnVsbDtyZXR1cm4gbnVsbH0pKHQuYXR0ciksdGhpcy5jb21wYXRpYmxlPSExLHRoaXMudHlwZT1BJHQuT1AsdGhpcy5pc0dyb3VwTm9kZT0hMSx0aGlzLmNhcmRpbmFsaXR5PTEsdGhpcy5pbkVtYmVkZGluZ3M9W10sdGhpcy5vdXRFbWJlZGRpbmdzPVtdLHRoaXMucGFyZW50Tm9kZT1udWxsLHRoaXMuaW5jbHVkZT1rJHQuVU5TUEVDSUZJRUQsdGhpcy5vd25pbmdTZXJpZXM9bnVsbH19ZnVuY3Rpb24geiR0KHQsZT17fSl7cmV0dXJuIG5ldyBEJHQodCxlKX1jbGFzcyBEJHR7Y29uc3RydWN0b3IodCxlPXt9KXt0aGlzLm5hbWU9dCx0aGlzLnR5cGU9QSR0Lk1FVEEsdGhpcy5kZXB0aD0xLHRoaXMuaXNHcm91cE5vZGU9ITAsdGhpcy5jYXJkaW5hbGl0eT0wLHRoaXMubWV0YWdyYXBoPVkkdCh0LEMkdC5NRVRBLGUpLHRoaXMuYnJpZGdlZ3JhcGg9bnVsbCx0aGlzLm9wSGlzdG9ncmFtPXt9LHRoaXMuZGV2aWNlSGlzdG9ncmFtPXt9LHRoaXMueGxhQ2x1c3Rlckhpc3RvZ3JhbT17fSx0aGlzLmNvbXBhdGliaWxpdHlIaXN0b2dyYW09e2NvbXBhdGlibGU6MCxpbmNvbXBhdGlibGU6MH0sdGhpcy50ZW1wbGF0ZUlkPW51bGwsdGhpcy5wYXJlbnROb2RlPW51bGwsdGhpcy5oYXNOb25Db250cm9sRWRnZXM9ITEsdGhpcy5pbmNsdWRlPWskdC5VTlNQRUNJRklFRCx0aGlzLmFzc29jaWF0ZWRGdW5jdGlvbj0iIn1nZXRGaXJzdENoaWxkKCl7cmV0dXJuIHRoaXMubWV0YWdyYXBoLm5vZGUodGhpcy5tZXRhZ3JhcGgubm9kZXMoKVswXSl9Z2V0Um9vdE9wKCl7bGV0IHQ9dGhpcy5uYW1lLnNwbGl0KCIvIik7cmV0dXJuIHRoaXMubWV0YWdyYXBoLm5vZGUodGhpcy5uYW1lKyIvKCIrdFt0Lmxlbmd0aC0xXSsiKSIpfWxlYXZlcygpe2xldCB0LGU9W10sbj1bdGhpc107Zm9yKDtuLmxlbmd0aDspe2xldCBpPW4uc2hpZnQoKTtpLmlzR3JvdXBOb2RlPyh0PWkubWV0YWdyYXBoLENlLmV4cG9ydHMuZWFjaCh0Lm5vZGVzKCksKGU9Pm4ucHVzaCh0Lm5vZGUoZSkpKSkpOmUucHVzaChpLm5hbWUpfXJldHVybiBlfX1mdW5jdGlvbiBCJHQodCxlKXtyZXR1cm4gbmV3IEgkdCh0LGUpfWNsYXNzIEgkdHtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMudj10LHRoaXMudz1lLHRoaXMuYmFzZUVkZ2VMaXN0PVtdLHRoaXMuaW5ib3VuZD1udWxsLHRoaXMubnVtUmVndWxhckVkZ2VzPTAsdGhpcy5udW1Db250cm9sRWRnZXM9MCx0aGlzLm51bVJlZkVkZ2VzPTAsdGhpcy50b3RhbFNpemU9MH1hZGRCYXNlRWRnZSh0LGUpe3RoaXMuYmFzZUVkZ2VMaXN0LnB1c2godCksdC5pc0NvbnRyb2xEZXBlbmRlbmN5P3RoaXMubnVtQ29udHJvbEVkZ2VzKz0xOnRoaXMubnVtUmVndWxhckVkZ2VzKz0xLHQuaXNSZWZlcmVuY2VFZGdlJiYodGhpcy5udW1SZWZFZGdlcys9MSksdGhpcy50b3RhbFNpemUrPUgkdC5jb21wdXRlU2l6ZU9mRWRnZSh0LGUpLGUubWF4TWV0YUVkZ2VTaXplPU1hdGgubWF4KGUubWF4TWV0YUVkZ2VTaXplLHRoaXMudG90YWxTaXplKX1zdGF0aWMgY29tcHV0ZVNpemVPZkVkZ2UodCxlKXtsZXQgbj1lLm5vZGUodC52KTtpZighbi5vdXRwdXRTaGFwZXMpcmV0dXJuIDE7ZS5oYXNTaGFwZUluZm89ITA7Y29uc3QgaT1PYmplY3Qua2V5cyhuLm91dHB1dFNoYXBlcykubWFwKCh0PT5uLm91dHB1dFNoYXBlc1t0XSkpLm1hcCgodD0+bnVsbD09dD8xOnQucmVkdWNlKCgodCxlKT0+KC0xPT09ZSYmKGU9MSksdCplKSksMSkpKTtyZXR1cm4gQ2UuZXhwb3J0cy5zdW0oaSl9fWZ1bmN0aW9uIEYkdCh0LGUsbixpLHIsbyl7cmV0dXJuIG5ldyBVJHQodCxlLG4saSxyLG8pfWZ1bmN0aW9uIFYkdCh0LGUsbixpLHIpe3JldHVybihuP24rIi8iOiIiKSsodCsodm9pZCAwIT09aSYmdm9pZCAwIT09cj8iWyIraSsiLSIrcisiXSI6IiMiKStlKX1jbGFzcyBVJHR7Y29uc3RydWN0b3IodCxlLG4saSxyLG8pe3RoaXMubmFtZT1yfHxWJHQodCxlLG4pLHRoaXMudHlwZT1BJHQuU0VSSUVTLHRoaXMuaGFzTG9vcD0hMSx0aGlzLnByZWZpeD10LHRoaXMuc3VmZml4PWUsdGhpcy5jbHVzdGVySWQ9aSx0aGlzLmlkcz1bXSx0aGlzLnBhcmVudD1uLHRoaXMuaXNHcm91cE5vZGU9ITAsdGhpcy5jYXJkaW5hbGl0eT0wLHRoaXMubWV0YWdyYXBoPVkkdChyLEMkdC5TRVJJRVMsbyksdGhpcy5icmlkZ2VncmFwaD1udWxsLHRoaXMucGFyZW50Tm9kZT1udWxsLHRoaXMuZGV2aWNlSGlzdG9ncmFtPXt9LHRoaXMueGxhQ2x1c3Rlckhpc3RvZ3JhbT17fSx0aGlzLmNvbXBhdGliaWxpdHlIaXN0b2dyYW09e2NvbXBhdGlibGU6MCxpbmNvbXBhdGlibGU6MH0sdGhpcy5oYXNOb25Db250cm9sRWRnZXM9ITEsdGhpcy5pbmNsdWRlPWskdC5VTlNQRUNJRklFRH19Y29uc3QgaiR0PS9eKFteOl0rKTooKFx3Kzp8KVxkKykkLztmdW5jdGlvbiBHJHQodCxlLG4saSxyLG8pe2lmKGU9PT1uLm5hbWUpcmV0dXJuO3QuZWRnZXMucHVzaCh7djplLHc6bi5uYW1lLG91dHB1dFRlbnNvcktleTppLm91dHB1dFRlbnNvcktleSxpc0NvbnRyb2xEZXBlbmRlbmN5OmkuaXNDb250cm9sRGVwZW5kZW5jeSxpc1JlZmVyZW5jZUVkZ2U6ITA9PT1yLnJlZkVkZ2VzW24ub3ArIiAiK29dfSl9Y29uc3QgVyR0PXtlbmFibGVFbWJlZGRpbmc6ITAsaW5FbWJlZGRpbmdUeXBlczpbIkNvbnN0Il0sb3V0RW1iZWRkaW5nVHlwZXM6WyJeW2EtekEtWl0rU3VtbWFyeSQiXSxyZWZFZGdlczp7IkFzc2lnbiAwIjohMCwiQXNzaWduQWRkIDAiOiEwLCJBc3NpZ25TdWIgMCI6ITAsImFzc2lnbiAwIjohMCwiYXNzaWduX2FkZCAwIjohMCwiYXNzaWduX3N1YiAwIjohMCwiY291bnRfdXBfdG8gMCI6ITAsIlNjYXR0ZXJBZGQgMCI6ITAsIlNjYXR0ZXJTdWIgMCI6ITAsIlNjYXR0ZXJVcGRhdGUgMCI6ITAsInNjYXR0ZXJfYWRkIDAiOiEwLCJzY2F0dGVyX3N1YiAwIjohMCwic2NhdHRlcl91cGRhdGUgMCI6ITB9fTtmdW5jdGlvbiBxJHQodCxlLG4pe2xldCBpPXt9LHI9e30sbz17fSxhPVgkdChlLmluRW1iZWRkaW5nVHlwZXMpLHM9WCR0KGUub3V0RW1iZWRkaW5nVHlwZXMpLGw9W10sYz10Lm5vZGUsdT1uZXcgQXJyYXkoYy5sZW5ndGgpO3JldHVybiBtJHQoIk5vcm1hbGl6aW5nIG5hbWVzIiwzMCwoKCk9PntsZXQgZT1uZXcgQXJyYXkoYy5sZW5ndGgpLG49MDtjb25zdCBoPXQ9PntsZXQgYz1uZXcgTyR0KHQpO3JldHVybiBhKGMpPyhsLnB1c2goYy5uYW1lKSxpW2MubmFtZV09YyxjKTpzKGMpPyhsLnB1c2goYy5uYW1lKSxyW2MubmFtZV09YyxDZS5leHBvcnRzLmVhY2goYy5pbnB1dHMsKHQ9PntsZXQgZT10Lm5hbWU7b1tlXT1vW2VdfHxbXSxvW2VdLnB1c2goYyl9KSksYyk6KGVbbl09Yyx1W25dPWMubmFtZSxuKyssYyl9O0NlLmV4cG9ydHMuZWFjaChjLGgpO2NvbnN0IGQ9dD0+e2NvbnN0IGU9VCR0K3Quc2lnbmF0dXJlLm5hbWU7aWYoaCh7bmFtZTplLGlucHV0OltdLGRldmljZToiIixvcDoiIixhdHRyOltdfSksdC5zaWduYXR1cmUuaW5wdXRfYXJnKXtsZXQgbj0wO2NvbnN0IGk9dD0+e2goe25hbWU6ZStNJHQrdC5uYW1lLGlucHV0OltdLGRldmljZToiIixvcDoiaW5wdXRfYXJnIixhdHRyOlt7a2V5OiJUIix2YWx1ZTp7dHlwZTp0LnR5cGV9fV19KS5mdW5jdGlvbklucHV0SW5kZXg9bixuKyt9O3Quc2lnbmF0dXJlLmlucHV0X2FyZy5uYW1lP2kodC5zaWduYXR1cmUuaW5wdXRfYXJnKTpDZS5leHBvcnRzLmVhY2godC5zaWduYXR1cmUuaW5wdXRfYXJnLGkpfWxldCBuPTA7Y29uc3QgaT17fTtpZih0LnNpZ25hdHVyZS5vdXRwdXRfYXJnKXtjb25zdCByPXQ9PntpW2UrTSR0K3QubmFtZV09bixuKyt9O3Quc2lnbmF0dXJlLm91dHB1dF9hcmcubmFtZT9yKHQuc2lnbmF0dXJlLm91dHB1dF9hcmcpOkNlLmV4cG9ydHMuZWFjaCh0LnNpZ25hdHVyZS5vdXRwdXRfYXJnLHIpfUNlLmV4cG9ydHMuZWFjaCh0Lm5vZGVfZGVmLCh0PT57dC5uYW1lPWUrIi8iK3QubmFtZSwic3RyaW5nIj09dHlwZW9mIHQuaW5wdXQmJih0LmlucHV0PVt0LmlucHV0XSk7Y29uc3Qgbj1oKHQpO0NlLmV4cG9ydHMuaXNOdW1iZXIoaVt0Lm5hbWVdKSYmKG4uZnVuY3Rpb25PdXRwdXRJbmRleD1pW3QubmFtZV0pLENlLmV4cG9ydHMuZWFjaChuLmlucHV0cywodD0+e3QubmFtZT1lK00kdCt0Lm5hbWV9KSl9KSl9O3JldHVybiB0LmxpYnJhcnkmJnQubGlicmFyeS5mdW5jdGlvbiYmQ2UuZXhwb3J0cy5lYWNoKHQubGlicmFyeS5mdW5jdGlvbixkKSxlLnNwbGljZShuKSx1LnNwbGljZShuKSxlfSksbixCQXQuTk9STUFMSVpJTkdfTkFNRVMpLnRoZW4oKHQ9Pm0kdCgiQnVpbGRpbmcgdGhlIGRhdGEgc3RydWN0dXJlIiw3MCwoKCk9PntsZXQgbj0oZnVuY3Rpb24gYSh0LGUpe2xldCBuPXt9LGk9e307dC5zb3J0KCk7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aC0xOysrZSl7bGV0IHI9dFtlXTtDZS5leHBvcnRzLmVhY2goWiR0KHIpLnNsaWNlKDAsLTEpLCh0PT57aVt0XT0hMH0pKTtmb3IobGV0IGk9ZSsxO2k8dC5sZW5ndGg7KytpKXtsZXQgZT10W2ldO2lmKCFDZS5leHBvcnRzLnN0YXJ0c1dpdGgoZSxyKSlicmVhaztpZihlLmxlbmd0aD5yLmxlbmd0aCYmZS5jaGFyQXQoci5sZW5ndGgpPT09TSR0KXtuW3JdPSQkdChyKTticmVha319fXJldHVybiBDZS5leHBvcnRzLmVhY2goZSwodD0+e3QgaW4gaSYmKG5bdF09JCR0KHQpKX0pKSxufSkodSxsKSxzPW5ldyBJJHQ7cmV0dXJuIENlLmV4cG9ydHMuZWFjaCh0LCh0PT57bGV0IGU9blt0Lm5hbWVdfHx0Lm5hbWU7cy5ub2Rlc1tlXT10LHQubmFtZSBpbiBvJiYodC5vdXRFbWJlZGRpbmdzPW9bdC5uYW1lXSxDZS5leHBvcnRzLmVhY2godC5vdXRFbWJlZGRpbmdzLCh0PT57dC5uYW1lPW5bdC5uYW1lXXx8dC5uYW1lfSkpKSx0Lm5hbWU9ZX0pKSxDZS5leHBvcnRzLmVhY2godCwodD0+e0NlLmV4cG9ydHMuZWFjaCh0LmlucHV0cywoKG8sYSk9PntsZXQgbD1vLm5hbWU7aWYobCBpbiBpKXtsZXQgcj1pW2xdO3QuaW5FbWJlZGRpbmdzLnB1c2gocik7Zm9yKGxldCBpIG9mIHIuaW5wdXRzKUckdChzLG5baS5uYW1lXXx8aS5uYW1lLHQsaSxlLGEpfWVsc2UgaWYobCBpbiByKXtsZXQgaT1yW2xdO2ZvcihsZXQgciBvZiBpLmlucHV0cylHJHQocyxuW3IubmFtZV18fHIubmFtZSx0LG8sZSxhKX1lbHNlIEckdChzLG5bbF18fGwsdCxvLGUsYSl9KSl9KSksQ2UuZXhwb3J0cy5lYWNoKGksKCh0LGUpPT57dC5uYW1lPW5bdC5uYW1lXXx8dC5uYW1lfSkpLHN9KSxuLEJBdC5CVUlMRF9TTElNX0dSQVBIKSkpfWZ1bmN0aW9uIFkkdCh0LGUsbj17fSl7Y29uc3QgaT1uZXcgdCR0LmdyYXBobGliLkdyYXBoKG4pO3JldHVybiBpLnNldEdyYXBoKHtuYW1lOnQscmFua2RpcjpuLnJhbmtkaXJ8fCJCVCIsdHlwZTplfSksaX1mdW5jdGlvbiBYJHQodCl7cmV0dXJuIGZ1bmN0aW9uKGUpe2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtsZXQgaT1uZXcgUmVnRXhwKHRbbl0pO2lmKCJzdHJpbmciPT10eXBlb2YgZS5vcCYmZS5vcC5tYXRjaChpKSlyZXR1cm4hMH1yZXR1cm4hMX19ZnVuY3Rpb24gJCR0KHQpe2xldCBlPXQuc3BsaXQoTSR0KTtyZXR1cm4gdCtNJHQrIigiK2VbZS5sZW5ndGgtMV0rIikifWZ1bmN0aW9uIEskdCh0KXtsZXQgZT10Lm5vZGVzKCkubWFwKChmdW5jdGlvbihlKXtyZXR1cm4gdC5uZWlnaGJvcnMoZSkubGVuZ3RofSkpO3JldHVybiBlLnNvcnQoKSxlfWZ1bmN0aW9uIFokdCh0LGUpe2xldCBuPVtdLGk9dC5pbmRleE9mKE0kdCk7Zm9yKDtpPj0wOyluLnB1c2godC5zdWJzdHJpbmcoMCxpKSksaT10LmluZGV4T2YoTSR0LGkrMSk7aWYoZSl7bGV0IGk9ZVt0XTtpJiZuLnB1c2goaSl9cmV0dXJuIG4ucHVzaCh0KSxufWZ1bmN0aW9uIEokdCh0KXtyZXR1cm4gdD09PWskdC5FWENMVURFPyJBZGQgdG8gbWFpbiBncmFwaCI6IlJlbW92ZSBmcm9tIG1haW4gZ3JhcGgifWZ1bmN0aW9uIFEkdCh0LGUpe2xldCBuPShmdW5jdGlvbiByKHQsZSl7cmV0dXJuIENlLmV4cG9ydHMucmVkdWNlKHQsKGZ1bmN0aW9uKHQsbil7bGV0IGk9blswXSxyPVtdO3JldHVybiBuWzFdLm5vZGVzLmZvckVhY2goKGZ1bmN0aW9uKHQpe2ZvcihsZXQgbj0wO248ci5sZW5ndGg7bisrKXtpZighZXx8ZUt0KHJbbl0ubWV0YW5vZGUubWV0YWdyYXBoLHQubWV0YWdyYXBoKSlyZXR1cm4gdC50ZW1wbGF0ZUlkPXJbbl0ubWV0YW5vZGUudGVtcGxhdGVJZCx2b2lkIHJbbl0ubWVtYmVycy5wdXNoKHQubmFtZSl9dC50ZW1wbGF0ZUlkPWkrIlsiK3IubGVuZ3RoKyJdIixyLnB1c2goe21ldGFub2RlOnQsbWVtYmVyczpbdC5uYW1lXX0pfSkpLHIuZm9yRWFjaCgoZnVuY3Rpb24oZSl7dFtlLm1ldGFub2RlLnRlbXBsYXRlSWRdPXtsZXZlbDpuWzFdLmxldmVsLG5vZGVzOmUubWVtYmVyc319KSksdH0pLHt9KX0pKChmdW5jdGlvbiBpKHQpe2NvbnN0IGU9dC5nZXROb2RlTWFwKCk7bGV0IG49T2JqZWN0LmtleXMoZSkucmVkdWNlKCgodCxuKT0+e2NvbnN0IGk9ZVtuXTtpZihpLnR5cGUhPT1BJHQuTUVUQSlyZXR1cm4gdDtsZXQgcj1uLnNwbGl0KCIvIikubGVuZ3RoLTEsbz0oZnVuY3Rpb24gYSh0KXtsZXQgZT1DZS5leHBvcnRzLm1hcCh7ZGVwdGg6dC5kZXB0aCwifFZ8Ijp0Lm1ldGFncmFwaC5ub2RlcygpLmxlbmd0aCwifEV8Ijp0Lm1ldGFncmFwaC5lZGdlcygpLmxlbmd0aH0sKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIGUrIj0iK3R9KSkuam9pbigiICIpLG49Q2UuZXhwb3J0cy5tYXAodC5vcEhpc3RvZ3JhbSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gZSsiPSIrdH0pKS5qb2luKCIsIik7cmV0dXJuIGUrIiBbb3BzXSAiK259KShpKSxzPXRbb118fHtub2RlczpbXSxsZXZlbDpyfTtyZXR1cm4gdFtvXT1zLHMubm9kZXMucHVzaChpKSxzLmxldmVsPnImJihzLmxldmVsPXIpLHR9KSx7fSk7cmV0dXJuIE9iamVjdC5rZXlzKG4pLm1hcCgodD0+W3Qsblt0XV0pKS5maWx0ZXIoKChbdCxlXSk9Pntjb25zdHtub2RlczpufT1lO2lmKG4ubGVuZ3RoPjEpcmV0dXJuITA7Y29uc3QgaT1uWzBdO3JldHVybiBpLnR5cGU9PT1BJHQuTUVUQSYmaS5hc3NvY2lhdGVkRnVuY3Rpb259KSkuc29ydCgoKFt0LGVdKT0+ZS5ub2Rlc1swXS5kZXB0aCkpfSkodCksZSk7cmV0dXJuIE9iamVjdC5rZXlzKG4pLnNvcnQoKHQ9Pm5bdF0ubGV2ZWwpKS5yZWR1Y2UoKCh0LGUpPT4odFtlXT1uW2VdLHQpKSx7fSl9ZnVuY3Rpb24gdEt0KHQsZSxuKXtyZXR1cm4gQ2UuZXhwb3J0cy5zb3J0QnkodCxbdD0+ZS5ub2RlKHQpLm9wLHQ9PmUubm9kZSh0KS50ZW1wbGF0ZUlkLHQ9PmUubmVpZ2hib3JzKHQpLmxlbmd0aCx0PT5lLnByZWRlY2Vzc29ycyh0KS5sZW5ndGgsdD0+ZS5zdWNjZXNzb3JzKHQpLmxlbmd0aCx0PT50LnN1YnN0cihuLmxlbmd0aCldKX1mdW5jdGlvbiBlS3QodCxlKXtpZighKGZ1bmN0aW9uIG4odCxlKXtsZXQgbj1LJHQodCksaT1LJHQoZSk7Zm9yKGxldCB0PTA7dDxuLmxlbmd0aDt0KyspaWYoblt0XSE9PWlbdF0pcmV0dXJuITE7cmV0dXJuITB9KSh0LGUpKXJldHVybiExO2xldCBpPXQuZ3JhcGgoKS5uYW1lLHI9ZS5ncmFwaCgpLm5hbWUsbz17fSxhPXt9LHM9W107ZnVuY3Rpb24gbCh0LGUpe2xldCBuPXQuc3Vic3RyKGkubGVuZ3RoKSxsPWUuc3Vic3RyKHIubGVuZ3RoKTtyZXR1cm4gb1tuXV5hW2xdPyhjb25zb2xlLndhcm4oImRpZmZlcmVudCB2aXNpdCBwYXR0ZXJuIiwiWyIraSsiXSIsbiwiWyIrcisiXSIsbCksITApOihvW25dfHwob1tuXT1hW2xdPSEwLHMucHVzaCh7bjE6dCxuMjplfSkpLCExKX1sZXQgYz10LnNvdXJjZXMoKSx1PWUuc291cmNlcygpO2lmKGMubGVuZ3RoIT09dS5sZW5ndGgpcmV0dXJuIGNvbnNvbGUubG9nKCJkaWZmZXJlbnQgc291cmNlIGxlbmd0aCIpLCExO2M9dEt0KGMsdCxpKSx1PXRLdCh1LGUscik7Zm9yKGxldCB0PTA7dDxjLmxlbmd0aDt0Kyspe2lmKGwoY1t0XSx1W3RdKSlyZXR1cm4hMX1mb3IoO3MubGVuZ3RoPjA7KXtsZXQgbj1zLnBvcCgpO2lmKCFuS3QodC5ub2RlKG4ubjEpLGUubm9kZShuLm4yKSkpcmV0dXJuITE7bGV0IG89dC5zdWNjZXNzb3JzKG4ubjEpLGE9ZS5zdWNjZXNzb3JzKG4ubjIpO2lmKG8ubGVuZ3RoIT09YS5sZW5ndGgpcmV0dXJuIGNvbnNvbGUubG9nKCIjIG9mIHN1Y2Nlc3NvcnMgbWlzbWF0Y2giLG8sYSksITE7bz10S3Qobyx0LGkpLGE9dEt0KGEsZSxyKTtmb3IobGV0IHQ9MDt0PG8ubGVuZ3RoO3QrKyl7aWYobChvW3RdLGFbdF0pKXJldHVybiExfX1yZXR1cm4hMH1mdW5jdGlvbiBuS3QodCxlKXtpZih0LnR5cGU9PT1BJHQuTUVUQSl7bGV0IG49dCxpPWU7cmV0dXJuIG4udGVtcGxhdGVJZCYmaS50ZW1wbGF0ZUlkJiZuLnRlbXBsYXRlSWQ9PT1pLnRlbXBsYXRlSWR9aWYodC50eXBlPT09QSR0Lk9QJiZlLnR5cGU9PT1BJHQuT1ApcmV0dXJuIHQub3A9PT1lLm9wO2lmKHQudHlwZT09PUEkdC5TRVJJRVMmJmUudHlwZT09PUEkdC5TRVJJRVMpe2xldCBuPXQsaT1lLHI9bi5tZXRhZ3JhcGgubm9kZUNvdW50KCk7cmV0dXJuIHI9PT1pLm1ldGFncmFwaC5ub2RlQ291bnQoKSYmKDA9PT1yfHxuLm1ldGFncmFwaC5ub2RlKG4ubWV0YWdyYXBoLm5vZGVzKClbMF0pLm9wPT09aS5tZXRhZ3JhcGgubm9kZShpLm1ldGFncmFwaC5ub2RlcygpWzBdKS5vcCl9cmV0dXJuITF9dmFyIGlLdDshKGZ1bmN0aW9uKHQpe3RbdC5URU1QTEFURVNfVVBEQVRFRD0wXT0iVEVNUExBVEVTX1VQREFURUQifSkoaUt0fHwoaUt0PXt9KSk7Y2xhc3Mgckt0IGV4dGVuZHMgY2xhc3N7Y29uc3RydWN0b3IoKXt0aGlzLmV2ZW50VHlwZVRvTGlzdGVuZXJzPW5ldyBNYXB9Z2V0TGlzdGVuZXJzKHQpe3JldHVybiB0aGlzLmV2ZW50VHlwZVRvTGlzdGVuZXJzLmhhcyh0KXx8dGhpcy5ldmVudFR5cGVUb0xpc3RlbmVycy5zZXQodCxbXSksdGhpcy5ldmVudFR5cGVUb0xpc3RlbmVycy5nZXQodCl9YWRkTGlzdGVuZXIodCxlKXt0aGlzLmdldExpc3RlbmVycyh0KS5wdXNoKGUpfXJlbW92ZUxpc3RlbmVyKHQsZSl7Y29uc3Qgbj10aGlzLmdldExpc3RlbmVycyh0KS5maWx0ZXIoKHQ9PnQhPT1lKSk7dGhpcy5ldmVudFR5cGVUb0xpc3RlbmVycy5zZXQodCxuKX1kaXNwYXRjaEV2ZW50KHQsZSl7Zm9yKGNvbnN0IG4gb2YgdGhpcy5nZXRMaXN0ZW5lcnModCkpbihlKX19e2NvbnN0cnVjdG9yKHQpe3N1cGVyKCksdGhpcy5oYXNTaGFwZUluZm89ITEsdGhpcy5tYXhNZXRhRWRnZVNpemU9MSx0aGlzLmdyYXBoT3B0aW9ucz17fSx0aGlzLnRlbXBsYXRlcz1udWxsLHRoaXMuZ3JhcGhPcHRpb25zLmNvbXBvdW5kPSEwLHRoaXMuZ3JhcGhPcHRpb25zLnJhbmtkaXI9dC5yYW5rRGlyZWN0aW9uLHRoaXMucm9vdD16JHQoRSR0LHRoaXMuZ3JhcGhPcHRpb25zKSx0aGlzLmxpYnJhcnlGdW5jdGlvbnM9e30sdGhpcy5zZXJpZXNHcm91cE1hcD1uZXcgTWFwKHQuc2VyaWVzTWFwKSx0aGlzLmRldmljZXM9bnVsbCx0aGlzLnhsYUNsdXN0ZXJzPW51bGwsdGhpcy52ZXJpZnlUZW1wbGF0ZT10LnZlcmlmeVRlbXBsYXRlLHRoaXMuaW5kZXg9e30sdGhpcy5pbmRleC5fX3Jvb3RfXz10aGlzLnJvb3QsdGhpcy5vcmRlcmluZ3M9e319Z2V0U2VyaWVzR3JvdXBUeXBlKHQpe3ZhciBlO3JldHVybiBudWxsIT09KGU9dGhpcy5zZXJpZXNHcm91cE1hcC5nZXQodCkpJiZ2b2lkIDAhPT1lP2U6TCR0LkdST1VQfXNldFNlcmllc0dyb3VwVHlwZSh0LGUpe3JldHVybiB0aGlzLnNlcmllc0dyb3VwTWFwLnNldCh0LGUpfWJ1aWxkU2VyaWVzR3JvdXBNYXBUb2dnbGVkKHQpe2NvbnN0IGU9dGhpcy5nZXRTZXJpZXNHcm91cFR5cGUodCk9PT1MJHQuR1JPVVA/TCR0LlVOR1JPVVA6TCR0LkdST1VQO3JldHVybiBuZXcgTWFwKFsuLi50aGlzLnNlcmllc0dyb3VwTWFwLFt0LGVdXSl9Z2V0Tm9kZU1hcCgpe3JldHVybiB0aGlzLmluZGV4fW5vZGUodCl7cmV0dXJuIHRoaXMuaW5kZXhbdF19c2V0Tm9kZSh0LGUpe3RoaXMuaW5kZXhbdF09ZX1nZXRCcmlkZ2VncmFwaCh0KXtsZXQgZT10aGlzLmluZGV4W3RdO2lmKCFlKXRocm93IEVycm9yKCJDb3VsZCBub3QgZmluZCBub2RlIGluIGhpZXJhcmNoeTogIit0KTtpZighKCJtZXRhZ3JhcGgiaW4gZSkpcmV0dXJuIG51bGw7aWYoZS5icmlkZ2VncmFwaClyZXR1cm4gZS5icmlkZ2VncmFwaDtsZXQgbj1lLmJyaWRnZWdyYXBoPVkkdCgiQlJJREdFR1JBUEgiLEMkdC5CUklER0UsdGhpcy5ncmFwaE9wdGlvbnMpO2lmKCFlLnBhcmVudE5vZGV8fCEoIm1ldGFncmFwaCJpbiBlLnBhcmVudE5vZGUpKXJldHVybiBuO2xldCBpPWUucGFyZW50Tm9kZSxyPWkubWV0YWdyYXBoLG89dGhpcy5nZXRCcmlkZ2VncmFwaChpLm5hbWUpO3JldHVybiBDZS5leHBvcnRzLmVhY2goW3Isb10sKGU9PntlLmVkZ2VzKCkuZmlsdGVyKChlPT5lLnY9PT10fHxlLnc9PT10KSkuZm9yRWFjaCgoaT0+e2xldCByPWkudz09PXQsbz1lLmVkZ2UoaSk7Q2UuZXhwb3J0cy5lYWNoKG8uYmFzZUVkZ2VMaXN0LChlPT57bGV0W28sYV09cj9bZS53LGkudl06W2UudixpLnddLHM9dGhpcy5nZXRDaGlsZE5hbWUodCxvKSxsPXt2OnI/YTpzLHc6cj9zOmF9LGM9bi5lZGdlKGwpO2N8fChjPUIkdChsLnYsbC53KSxjLmluYm91bmQ9cixuLnNldEVkZ2UobC52LGwudyxjKSksYy5hZGRCYXNlRWRnZShlLHRoaXMpfSkpfSkpfSkpLG59Z2V0Q2hpbGROYW1lKHQsZSl7bGV0IG49dGhpcy5pbmRleFtlXTtmb3IoO247KXtpZihuLnBhcmVudE5vZGUmJm4ucGFyZW50Tm9kZS5uYW1lPT09dClyZXR1cm4gbi5uYW1lO249bi5wYXJlbnROb2RlfXRocm93IEVycm9yKCJDb3VsZCBub3QgZmluZCBpbW1lZGlhdGUgY2hpbGQgZm9yIGRlc2NlbmRhbnQ6ICIrZSl9Z2V0UHJlZGVjZXNzb3JzKHQpe2xldCBlPXRoaXMuaW5kZXhbdF07aWYoIWUpdGhyb3cgRXJyb3IoIkNvdWxkIG5vdCBmaW5kIG5vZGUgd2l0aCBuYW1lOiAiK3QpO2xldCBuPXRoaXMuZ2V0T25lV2F5RWRnZXMoZSwhMCk7cmV0dXJuIGUuaXNHcm91cE5vZGV8fENlLmV4cG9ydHMuZWFjaChlLmluRW1iZWRkaW5ncywoaT0+e0NlLmV4cG9ydHMuZWFjaChlLmlucHV0cywoZT0+e2lmKGUubmFtZT09PWkubmFtZSl7bGV0IHI9bmV3IEgkdChpLm5hbWUsdCk7ci5hZGRCYXNlRWRnZSh7aXNDb250cm9sRGVwZW5kZW5jeTplLmlzQ29udHJvbERlcGVuZGVuY3ksb3V0cHV0VGVuc29yS2V5OmUub3V0cHV0VGVuc29yS2V5LGlzUmVmZXJlbmNlRWRnZTohMSx2OmkubmFtZSx3OnR9LHRoaXMpLG4ucmVndWxhci5wdXNoKHIpfX0pKX0pKSxufWdldFN1Y2Nlc3NvcnModCl7bGV0IGU9dGhpcy5pbmRleFt0XTtpZighZSl0aHJvdyBFcnJvcigiQ291bGQgbm90IGZpbmQgbm9kZSB3aXRoIG5hbWU6ICIrdCk7bGV0IG49dGhpcy5nZXRPbmVXYXlFZGdlcyhlLCExKTtyZXR1cm4gZS5pc0dyb3VwTm9kZXx8Q2UuZXhwb3J0cy5lYWNoKGUub3V0RW1iZWRkaW5ncywoZT0+e0NlLmV4cG9ydHMuZWFjaChlLmlucHV0cywoaT0+e2lmKGkubmFtZT09PXQpe2xldCByPW5ldyBIJHQodCxlLm5hbWUpO3IuYWRkQmFzZUVkZ2Uoe2lzQ29udHJvbERlcGVuZGVuY3k6aS5pc0NvbnRyb2xEZXBlbmRlbmN5LG91dHB1dFRlbnNvcktleTppLm91dHB1dFRlbnNvcktleSxpc1JlZmVyZW5jZUVkZ2U6ITEsdjp0LHc6ZS5uYW1lfSx0aGlzKSxuLnJlZ3VsYXIucHVzaChyKX19KSl9KSksbn1nZXRPbmVXYXlFZGdlcyh0LGUpe2xldCBuPXtjb250cm9sOltdLHJlZ3VsYXI6W119O2lmKCF0LnBhcmVudE5vZGV8fCF0LnBhcmVudE5vZGUuaXNHcm91cE5vZGUpcmV0dXJuIG47bGV0IGk9dC5wYXJlbnROb2RlLHI9aS5tZXRhZ3JhcGgsbz10aGlzLmdldEJyaWRnZWdyYXBoKGkubmFtZSk7cmV0dXJuIG9LdChyLHQsZSxuKSxvS3Qobyx0LGUsbiksbn1nZXRUb3BvbG9naWNhbE9yZGVyaW5nKHQpe2xldCBlPXRoaXMuaW5kZXhbdF07aWYoIWUpdGhyb3cgRXJyb3IoIkNvdWxkIG5vdCBmaW5kIG5vZGUgd2l0aCBuYW1lOiAiK3QpO2lmKCFlLmlzR3JvdXBOb2RlKXJldHVybiBudWxsO2lmKHQgaW4gdGhpcy5vcmRlcmluZ3MpcmV0dXJuIHRoaXMub3JkZXJpbmdzW3RdO2xldCBuPXt9LGk9e30scj1lLm1ldGFncmFwaDtDZS5leHBvcnRzLmVhY2goci5lZGdlcygpLCh0PT57ci5lZGdlKHQpLm51bVJlZ3VsYXJFZGdlcyYmKHQudiBpbiBufHwoblt0LnZdPVtdKSxuW3Qudl0ucHVzaCh0LncpLGlbdC53XT0hMCl9KSk7bGV0IG89Q2UuZXhwb3J0cy5kaWZmZXJlbmNlKENlLmV4cG9ydHMua2V5cyhuKSxDZS5leHBvcnRzLmtleXMoaSkpLGE9dGhpcy5vcmRlcmluZ3NbdF09e30scz0wO2Zvcig7by5sZW5ndGg7KXtsZXQgdD1vLnNoaWZ0KCk7YVt0XT1zKyssQ2UuZXhwb3J0cy5lYWNoKG5bdF0sKHQ9Pm8ucHVzaCh0KSkpLGRlbGV0ZSBuW3RdfXJldHVybiBhfWdldFRlbXBsYXRlSW5kZXgoKXtpZighdGhpcy50ZW1wbGF0ZXMpcmV0dXJuIG51bGw7bGV0IHQ9WmcodGhpcy50ZW1wbGF0ZXMpO2lmKCF0Lmxlbmd0aClyZXR1cm4gbnVsbDtsZXQgZT1ZTSgpLmRvbWFpbih0KS5yYW5nZShLbCgwLHQubGVuZ3RoKSk7cmV0dXJuIHQ9PmUodCl9dXBkYXRlVGVtcGxhdGVzKCl7ZCR0KCJGaW5kaW5nIHNpbWlsYXIgc3ViZ3JhcGhzIiwoKCk9Pnt0aGlzLnRlbXBsYXRlcz1RJHQodGhpcyx0aGlzLnZlcmlmeVRlbXBsYXRlKSx0aGlzLmRpc3BhdGNoRXZlbnQoaUt0LlRFTVBMQVRFU19VUERBVEVEKX0pLEJBdC5ISUVSQVJDSFlfRklORF9TSU1JTEFSX1NVQkdSQVBIUyl9fWZ1bmN0aW9uIG9LdCh0LGUsbixpKXtsZXQgcj1uP3QuaW5FZGdlcyhlLm5hbWUpOnQub3V0RWRnZXMoZS5uYW1lKTtDZS5leHBvcnRzLmVhY2gociwoZT0+e2xldCBuPXQuZWRnZShlKTsobi5udW1SZWd1bGFyRWRnZXM/aS5yZWd1bGFyOmkuY29udHJvbCkucHVzaChuKX0pKX1jb25zdCBhS3Q9e3ZlcmlmeVRlbXBsYXRlOiEwLHNlcmllc05vZGVNaW5TaXplOjUsc2VyaWVzTWFwOm5ldyBNYXAscmFua0RpcmVjdGlvbjoiQlQiLHVzZUdlbmVyYWxpemVkU2VyaWVzUGF0dGVybnM6ITF9O2Z1bmN0aW9uIHNLdCh0LGUsbil7Y29uc3QgaT1uZXcgckt0KGUpLHI9e307cmV0dXJuIG0kdCgiQWRkaW5nIG5vZGVzIiwzMCwoKCk9PntsZXQgZT17fSxuPXt9O0NlLmV4cG9ydHMuZWFjaCh0Lm5vZGVzLCgodCxpKT0+e3QuZGV2aWNlJiYoZVt0LmRldmljZV09ITApLHQueGxhQ2x1c3RlciYmKG5bdC54bGFDbHVzdGVyXT0hMCl9KSksaS5kZXZpY2VzPUNlLmV4cG9ydHMua2V5cyhlKSxpLnhsYUNsdXN0ZXJzPUNlLmV4cG9ydHMua2V5cyhuKSwoZnVuY3Rpb24gcih0LGUpe2NvbnN0IG49e307Q2UuZXhwb3J0cy5lYWNoKGUubm9kZXMsKChlLGkpPT57bGV0IHI9WiR0KGUubmFtZSksbz10LnJvb3Q7by5kZXB0aD1NYXRoLm1heChyLmxlbmd0aCxvLmRlcHRoKSxuW2Uub3BdfHwobltlLm9wXT1bXSksbltlLm9wXS5wdXNoKGUpO2ZvcihsZXQgaT0wO2k8ci5sZW5ndGgmJihvLmRlcHRoPU1hdGgubWF4KG8uZGVwdGgsci5sZW5ndGgtaSksby5jYXJkaW5hbGl0eSs9ZS5jYXJkaW5hbGl0eSxvLm9wSGlzdG9ncmFtW2Uub3BdPShvLm9wSGlzdG9ncmFtW2Uub3BdfHwwKSsxLG51bGwhPWUuZGV2aWNlJiYoby5kZXZpY2VIaXN0b2dyYW1bZS5kZXZpY2VdPShvLmRldmljZUhpc3RvZ3JhbVtlLmRldmljZV18fDApKzEpLG51bGwhPWUueGxhQ2x1c3RlciYmKG8ueGxhQ2x1c3Rlckhpc3RvZ3JhbVtlLnhsYUNsdXN0ZXJdPShvLnhsYUNsdXN0ZXJIaXN0b2dyYW1bZS54bGFDbHVzdGVyXXx8MCkrMSksZS5jb21wYXRpYmxlP28uY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlPShvLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZXx8MCkrMTpvLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlPShvLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlfHwwKSsxLENlLmV4cG9ydHMuZWFjaChlLmluRW1iZWRkaW5ncywodD0+e3QuY29tcGF0aWJsZT9vLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZT0oby5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGV8fDApKzE6by5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZT0oby5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZXx8MCkrMX0pKSxDZS5leHBvcnRzLmVhY2goZS5vdXRFbWJlZGRpbmdzLCh0PT57dC5jb21wYXRpYmxlP28uY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlPShvLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZXx8MCkrMTpvLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlPShvLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlfHwwKSsxfSkpLGkhPT1yLmxlbmd0aC0xKTtpKyspe2xldCBlPXJbaV0sYT10Lm5vZGUoZSk7aWYoIWEmJihhPXokdChlLHQuZ3JhcGhPcHRpb25zKSxhLnBhcmVudE5vZGU9byx0LnNldE5vZGUoZSxhKSxvLm1ldGFncmFwaC5zZXROb2RlKGUsYSksMD09PWUuaW5kZXhPZihUJHQpJiZvLm5hbWU9PT1FJHQpKXtjb25zdCBpPWUuc3Vic3RyaW5nKFQkdC5sZW5ndGgpO25baV18fChuW2ldPVtdKSx0LmxpYnJhcnlGdW5jdGlvbnNbaV09e25vZGU6YSx1c2FnZXM6bltpXX0sYS5hc3NvY2lhdGVkRnVuY3Rpb249aX1vPWF9dC5zZXROb2RlKGUubmFtZSxlKSxlLnBhcmVudE5vZGU9byxvLm1ldGFncmFwaC5zZXROb2RlKGUubmFtZSxlKSxDZS5leHBvcnRzLmVhY2goZS5pbkVtYmVkZGluZ3MsKGZ1bmN0aW9uKG4pe3Quc2V0Tm9kZShuLm5hbWUsbiksbi5wYXJlbnROb2RlPWV9KSksQ2UuZXhwb3J0cy5lYWNoKGUub3V0RW1iZWRkaW5ncywoZnVuY3Rpb24obil7dC5zZXROb2RlKG4ubmFtZSxuKSxuLnBhcmVudE5vZGU9ZX0pKX0pKX0pKGksdCl9KSxuLEJBdC5ISUVSQVJDSFlfQUREX05PREVTKS50aGVuKCgoKT0+bSR0KCJEZXRlY3Qgc2VyaWVzIiwzMCwoKCk9PntlLnNlcmllc05vZGVNaW5TaXplPjAmJmxLdChpLnJvb3QsaSxyLGUuc2VyaWVzTm9kZU1pblNpemUsZS5zZXJpZXNNYXAsZS51c2VHZW5lcmFsaXplZFNlcmllc1BhdHRlcm5zKX0pLG4sQkF0LkhJRVJBUkNIWV9ERVRFQ1RfU0VSSUVTKSkpLnRoZW4oKCgpPT5tJHQoIkFkZGluZyBlZGdlcyIsNDAsKCgpPT57IShmdW5jdGlvbiBlKHQsbixpKXtsZXQgcj10LmdldE5vZGVNYXAoKSxvPVtdLGE9W10scz0odCxlKT0+e2xldCBuPTA7Zm9yKDt0OyllW24rK109dC5uYW1lLHQ9dC5wYXJlbnROb2RlO3JldHVybiBuLTF9O0NlLmV4cG9ydHMuZWFjaChuLmVkZ2VzLChlPT57bGV0IGk9cyhuLm5vZGVzW2Uudl0sbyksbD1zKG4ubm9kZXNbZS53XSxhKTtpZigtMT09PWl8fC0xPT09bClyZXR1cm47Zm9yKDtvW2ldPT09YVtsXTspaWYoaS0tLGwtLSxpPDB8fGw8MCl0aHJvdyBFcnJvcigiTm8gZGlmZmVyZW5jZSBmb3VuZCBiZXR3ZWVuIGFuY2VzdG9yIHBhdGhzLiIpO2xldCBjPXJbb1tpKzFdXSx1PW9baV0saD1hW2xdLGQ9Yy5tZXRhZ3JhcGguZWRnZSh1LGgpO2R8fChkPUIkdCh1LGgpLGMubWV0YWdyYXBoLnNldEVkZ2UodSxoLGQpKSxjLmhhc05vbkNvbnRyb2xFZGdlc3x8ZS5pc0NvbnRyb2xEZXBlbmRlbmN5fHwoYy5oYXNOb25Db250cm9sRWRnZXM9ITApLGQuYWRkQmFzZUVkZ2UoZSx0KX0pKX0pKGksdCl9KSxuLEJBdC5ISUVSQVJDSFlfQUREX0VER0VTKSkpLnRoZW4oKCgpPT5pKSl9ZnVuY3Rpb24gbEt0KHQsZSxuLGkscixvKXtsZXQgYT10Lm1ldGFncmFwaDtDZS5leHBvcnRzLmVhY2goYS5ub2RlcygpLCh0PT57bGV0IHM9YS5ub2RlKHQpO3MudHlwZT09PUEkdC5NRVRBJiZsS3QocyxlLG4saSxyLG8pfSkpO2xldCBzPShmdW5jdGlvbiBsKHQpe2xldCBlPXt9O3JldHVybiBDZS5leHBvcnRzLnJlZHVjZSh0Lm5vZGVzKCksKChlLG4pPT57bGV0IGk9dC5ub2RlKG4pO2lmKGkudHlwZT09PUEkdC5NRVRBKXJldHVybiBlO2xldCByPWkub3A7cmV0dXJuIHImJihlW3JdPWVbcl18fFtdLGVbcl0ucHVzaChpLm5hbWUpKSxlfSksZSl9KShhKTtsZXQgYz0obz91S3Q6Y0t0KShzLGEsZS5ncmFwaE9wdGlvbnMpO0NlLmV4cG9ydHMuZWFjaChjLChmdW5jdGlvbih0LHIpe2xldCBvPXQubWV0YWdyYXBoLm5vZGVzKCk7Q2UuZXhwb3J0cy5lYWNoKG8sKHQ9PntsZXQgZT1hLm5vZGUodCk7ZS5vd25pbmdTZXJpZXN8fChlLm93bmluZ1Nlcmllcz1yKX0pKSxvLmxlbmd0aDxpJiZlLmdldFNlcmllc0dyb3VwVHlwZSh0Lm5hbWUpPT09TCR0LkdST1VQJiZlLnNldFNlcmllc0dyb3VwVHlwZSh0Lm5hbWUsTCR0LlVOR1JPVVApLGUuZ2V0U2VyaWVzR3JvdXBUeXBlKHQubmFtZSkhPT1MJHQuVU5HUk9VUCYmKGUuc2V0Tm9kZShyLHQpLGEuc2V0Tm9kZShyLHQpLENlLmV4cG9ydHMuZWFjaChvLChlPT57bGV0IGk9YS5ub2RlKGUpO3QubWV0YWdyYXBoLnNldE5vZGUoZSxpKSx0LnBhcmVudE5vZGU9aS5wYXJlbnROb2RlLHQuY2FyZGluYWxpdHkrKyxudWxsIT1pLmRldmljZSYmKHQuZGV2aWNlSGlzdG9ncmFtW2kuZGV2aWNlXT0odC5kZXZpY2VIaXN0b2dyYW1baS5kZXZpY2VdfHwwKSsxKSxudWxsIT1pLnhsYUNsdXN0ZXImJih0LnhsYUNsdXN0ZXJIaXN0b2dyYW1baS54bGFDbHVzdGVyXT0odC54bGFDbHVzdGVySGlzdG9ncmFtW2kueGxhQ2x1c3Rlcl18fDApKzEpLGkuY29tcGF0aWJsZT90LmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZT0odC5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGV8fDApKzE6dC5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZT0odC5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZXx8MCkrMSxDZS5leHBvcnRzLmVhY2goaS5pbkVtYmVkZGluZ3MsKGU9PntlLmNvbXBhdGlibGU/dC5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU9KHQuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlfHwwKSsxOnQuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU9KHQuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGV8fDApKzF9KSksQ2UuZXhwb3J0cy5lYWNoKGkub3V0RW1iZWRkaW5ncywoZT0+e2UuY29tcGF0aWJsZT90LmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZT0odC5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGV8fDApKzE6dC5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZT0odC5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZXx8MCkrMX0pKSxpLnBhcmVudE5vZGU9dCxuW2VdPXIsYS5yZW1vdmVOb2RlKGUpfSkpKX0pKX1mdW5jdGlvbiBjS3QodCxlLG4pe2xldCBpPXt9O3JldHVybiBDZS5leHBvcnRzLmVhY2godCwoZnVuY3Rpb24odCxyKXtpZih0Lmxlbmd0aDw9MSlyZXR1cm47bGV0IG89e307Q2UuZXhwb3J0cy5lYWNoKHQsKGZ1bmN0aW9uKHQpe2NvbnN0IGU9IioiPT09dC5jaGFyQXQodC5sZW5ndGgtMSksaT10LnNwbGl0KCIvIikscj1pW2kubGVuZ3RoLTFdLGE9aS5zbGljZSgwLGkubGVuZ3RoLTEpLmpvaW4oIi8iKSxzPXIubWF0Y2goL14oXEQqKShcZCspJC8pO2xldCBsLGMsdT0iIjtzPyhsPXNbMV0sYz1zWzJdKToobD1lP3Iuc3Vic3RyKDAsci5sZW5ndGgtMSk6cixjPTAsdT1lPyIqIjoiIik7Y29uc3QgaD1WJHQobCx1LGEpO29baF09b1toXXx8W107Y29uc3QgZD1GJHQobCx1LGEsK2MsdCxuKTtvW2hdLnB1c2goZCl9KSksQ2UuZXhwb3J0cy5lYWNoKG8sKGZ1bmN0aW9uKHQsbyl7aWYodC5sZW5ndGg8MilyZXR1cm47dC5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybit0LmNsdXN0ZXJJZC0rZS5jbHVzdGVySWR9KSk7bGV0IGE9W3RbMF1dO2ZvcihsZXQgbz0xO288dC5sZW5ndGg7bysrKXtsZXQgcz10W29dO3MuY2x1c3RlcklkIT09YVthLmxlbmd0aC0xXS5jbHVzdGVySWQrMT8oaEt0KGEsaSwrcixlLG4pLGE9W3NdKTphLnB1c2gocyl9aEt0KGEsaSwrcixlLG4pfSkpfSkpLGl9ZnVuY3Rpb24gdUt0KHQsZSxuKXtsZXQgaT17fTtyZXR1cm4gQ2UuZXhwb3J0cy5lYWNoKHQsKGZ1bmN0aW9uKHQscil7aWYodC5sZW5ndGg8PTEpcmV0dXJuO2xldCBvPXt9LGE9e307Q2UuZXhwb3J0cy5lYWNoKHQsKGZ1bmN0aW9uKHQpe2xldCBlPSIqIj09PXQuY2hhckF0KHQubGVuZ3RoLTEpLGk9dC5zcGxpdCgiLyIpLHI9aVtpLmxlbmd0aC0xXSxzPWkuc2xpY2UoMCxpLmxlbmd0aC0xKS5qb2luKCIvIik7Y29uc3QgbD0vKFxkKykvZztsZXQgYyx1LGgsZCxwLGY9MDtmb3IoO2M9bC5leGVjKHIpOykrK2YsdT1yLnNsaWNlKDAsYy5pbmRleCksaD1jWzBdLGQ9ci5zbGljZShjLmluZGV4K2NbMF0ubGVuZ3RoKSxwPVYkdCh1LGQscyksb1twXT1vW3BdLG9bcF18fChvW3BdPUYkdCh1LGQscywraCx0LG4pKSxvW3BdLmlkcy5wdXNoKGgpLGFbdF09YVt0XXx8W10sYVt0XS5wdXNoKFtwLGhdKTtmPDEmJih1PWU/ci5zdWJzdHIoMCxyLmxlbmd0aC0xKTpyLGg9MCxkPWU/IioiOiIiLHA9ViR0KHUsZCxzKSxvW3BdPW9bcF0sb1twXXx8KG9bcF09RiR0KHUsZCxzLCtoLHQsbikpLG9bcF0uaWRzLnB1c2goaCksYVt0XT1hW3RdfHxbXSxhW3RdLnB1c2goW3AsaF0pKX0pKTt2YXIgcz17fTtDZS5leHBvcnRzLmVhY2goYSwoZnVuY3Rpb24odCxlKXt0LnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIG9bZVswXV0uaWRzLmxlbmd0aC1vW3RbMF1dLmlkcy5sZW5ndGh9KSk7dmFyIGk9dFswXVswXSxyPXRbMF1bMV07c1tpXT1zW2ldfHxbXTtjb25zdCBhPWUuc3BsaXQoIi8iKSxsPWEuc2xpY2UoMCxhLmxlbmd0aC0xKS5qb2luKCIvIik7dmFyIGM9RiR0KG9baV0ucHJlZml4LG9baV0uc3VmZml4LGwsK3IsZSxuKTtzW2ldLnB1c2goYyl9KSksQ2UuZXhwb3J0cy5lYWNoKHMsKGZ1bmN0aW9uKHQsbyl7aWYodC5sZW5ndGg8MilyZXR1cm47dC5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybit0LmNsdXN0ZXJJZC0rZS5jbHVzdGVySWR9KSk7bGV0IGE9W3RbMF1dO2ZvcihsZXQgbz0xO288dC5sZW5ndGg7bysrKXtsZXQgcz10W29dO3MuY2x1c3RlcklkIT09YVthLmxlbmd0aC0xXS5jbHVzdGVySWQrMT8oaEt0KGEsaSwrcixlLG4pLGE9W3NdKTphLnB1c2gocyl9aEt0KGEsaSwrcixlLG4pfSkpfSkpLGl9ZnVuY3Rpb24gaEt0KHQsZSxuLGkscil7aWYodC5sZW5ndGg+MSl7bGV0IG89ViR0KHRbMF0ucHJlZml4LHRbMF0uc3VmZml4LHRbMF0ucGFyZW50LHRbMF0uY2x1c3RlcklkLHRbdC5sZW5ndGgtMV0uY2x1c3RlcklkKSxhPUYkdCh0WzBdLnByZWZpeCx0WzBdLnN1ZmZpeCx0WzBdLnBhcmVudCxuLG8scik7Q2UuZXhwb3J0cy5lYWNoKHQsKGZ1bmN0aW9uKHQpe2EuaWRzLnB1c2godC5jbHVzdGVySWQpLGEubWV0YWdyYXBoLnNldE5vZGUodC5uYW1lLGkubm9kZSh0Lm5hbWUpKX0pKSxlW29dPWF9fWxldCBkS3Q9IiNmZmZmZmYiLHBLdD0iI2IyYjJiMiIsZkt0PSIjMGY5ZDU4IixtS3Q9IiNkYjQ0MzciLGdLdD17REVGQVVMVF9GSUxMOiIjZDlkOWQ5IixERUZBVUxUX1NUUk9LRToiI2E2YTZhNiIsU0FUVVJBVElPTjouNixMSUdIVE5FU1M6Ljg1LEVYUEFOREVEX0NPTE9SOiIjZjBmMGYwIixIVUVTOlsyMjAsMTAwLDE4MCw0MCwyMCwzNDAsMjYwLDMwMCwxNDAsNjBdLFNUUlVDVFVSRV9QQUxFVFRFKHQsZSl7bGV0IG49Z0t0LkhVRVMsaT1uW3Qlbi5sZW5ndGhdLHI9TWF0aC5zaW4oaSpNYXRoLlBJLzM2MCk7cmV0dXJuIGNkKGksLjAxKihlPzMwOjkwLTYwKnIpLC4wMSooZT85NTo4MCkpLnRvU3RyaW5nKCl9LERFVklDRV9QQUxFVFRFOnQ9PmdLdC5TVFJVQ1RVUkVfUEFMRVRURSh0KSxYTEFfQ0xVU1RFUl9QQUxFVFRFOnQ9PmdLdC5TVFJVQ1RVUkVfUEFMRVRURSh0KSxVTktOT1dOOiIjZWVlIixHUkFESUVOVF9PVVRMSU5FOiIjODg4In0sX0t0PSJ3aGl0ZSIseUt0PSIjYjJiMmIyIjtjb25zdCB2S3Q9MTUsYkt0PTUseEt0PTQsd0t0PTQsU0t0PVsiTm9PcCJdLE1LdD1bXSxFS3Q9WyIjZmZmNWYwIiwiI2ZiNmE0YSJdLFRLdD01LENLdD1uZXcgUmVnRXhwKCJeKD86X19mdW5jdGlvbl9saWJyYXJ5X18pPyhcXHcrKV9bYS16MC05XXs4fSg/Ol9cXGQrKT8kIik7Y2xhc3MgQUt0e2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLmhpZXJhcmNoeT10LHRoaXMuZGlzcGxheWluZ1N0YXRzPWUsdGhpcy5hdXRvRXh0cmFjdE5vZGVzPW4sdGhpcy5pbmRleD17fSx0aGlzLnJlbmRlcmVkT3BOYW1lcz1bXSx0aGlzLmNvbXB1dGVTY2FsZXMoKSx0aGlzLmhhc1N1YmhpZXJhcmNoeT17fSx0aGlzLnJvb3Q9bmV3IHpLdCh0LnJvb3QsdC5ncmFwaE9wdGlvbnMpLHRoaXMuaW5kZXhbdC5yb290Lm5hbWVdPXRoaXMucm9vdCx0aGlzLnJlbmRlcmVkT3BOYW1lcy5wdXNoKHQucm9vdC5uYW1lKSx0aGlzLmJ1aWxkU3ViaGllcmFyY2h5KHQucm9vdC5uYW1lKSx0aGlzLnJvb3QuZXhwYW5kZWQ9ITAsdGhpcy50cmFjZUlucHV0cz0hMX1jb21wdXRlU2NhbGVzKCl7dGhpcy5kZXZpY2VDb2xvck1hcD1ZTSgpLmRvbWFpbih0aGlzLmhpZXJhcmNoeS5kZXZpY2VzKS5yYW5nZShDZS5leHBvcnRzLm1hcChLbCh0aGlzLmhpZXJhcmNoeS5kZXZpY2VzLmxlbmd0aCksZ0t0LkRFVklDRV9QQUxFVFRFKSksdGhpcy54bGFDbHVzdGVyQ29sb3JNYXA9WU0oKS5kb21haW4odGhpcy5oaWVyYXJjaHkueGxhQ2x1c3RlcnMpLnJhbmdlKENlLmV4cG9ydHMubWFwKEtsKHRoaXMuaGllcmFyY2h5LnhsYUNsdXN0ZXJzLmxlbmd0aCksZ0t0LlhMQV9DTFVTVEVSX1BBTEVUVEUpKTtsZXQgdD10aGlzLmhpZXJhcmNoeS5yb290Lm1ldGFncmFwaCxlPW9jKHQubm9kZXMoKSwoKGUsbik9PntsZXQgaT10Lm5vZGUoZSk7aWYobnVsbCE9aS5zdGF0cylyZXR1cm4gaS5zdGF0cy50b3RhbEJ5dGVzfSkpO3RoaXMubWVtb3J5VXNhZ2VTY2FsZT1jRSgpLmRvbWFpbihbMCxlXSkucmFuZ2UoRUt0KTtsZXQgbj1vYyh0Lm5vZGVzKCksKChlLG4pPT57bGV0IGk9dC5ub2RlKGUpO2lmKG51bGwhPWkuc3RhdHMpcmV0dXJuIGkuc3RhdHMuZ2V0VG90YWxNaWNyb3MoKX0pKTt0aGlzLmNvbXB1dGVUaW1lU2NhbGU9Y0UoKS5kb21haW4oWzAsbl0pLnJhbmdlKEVLdCksdGhpcy5lZGdlV2lkdGhTaXplZEJhc2VkU2NhbGU9dGhpcy5oaWVyYXJjaHkuaGFzU2hhcGVJbmZvP3UkdDpjRSgpLmRvbWFpbihbMSx0aGlzLmhpZXJhcmNoeS5tYXhNZXRhRWRnZVNpemVdKS5yYW5nZShbYyR0LDEyXSl9Z2V0UmVuZGVyTm9kZUJ5TmFtZSh0KXtyZXR1cm4gdGhpcy5pbmRleFt0XX1nZXROb2RlQnlOYW1lKHQpe3JldHVybiB0aGlzLmhpZXJhcmNoeS5ub2RlKHQpfWNvbG9ySGlzdG9ncmFtKHQsZSl7aWYoT2JqZWN0LmtleXModCkubGVuZ3RoPjApe2NvbnN0IG49Q2UuZXhwb3J0cy5zdW0oT2JqZWN0LmtleXModCkubWFwKChlPT50W2VdKSkpO3JldHVybiBPYmplY3Qua2V5cyh0KS5tYXAoKGk9Pih7Y29sb3I6ZShpKSxwcm9wb3J0aW9uOnRbaV0vbn0pKSl9cmV0dXJuIG51bGx9Z2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKHQpe2lmKCF0KXJldHVybiBudWxsO2lmKHQgaW4gdGhpcy5pbmRleClyZXR1cm4gdGhpcy5pbmRleFt0XTtsZXQgZT10aGlzLmhpZXJhcmNoeS5ub2RlKHQpO2lmKCFlKXJldHVybiBudWxsO2xldCBuPWUuaXNHcm91cE5vZGU/bmV3IHpLdChlLHRoaXMuaGllcmFyY2h5LmdyYXBoT3B0aW9ucyk6bmV3IE5LdChlKTt0aGlzLmluZGV4W3RdPW4sdGhpcy5yZW5kZXJlZE9wTmFtZXMucHVzaCh0KSxlLnN0YXRzJiYobi5tZW1vcnlDb2xvcj10aGlzLm1lbW9yeVVzYWdlU2NhbGUoZS5zdGF0cy50b3RhbEJ5dGVzKSxuLmNvbXB1dGVUaW1lQ29sb3I9dGhpcy5jb21wdXRlVGltZVNjYWxlKGUuc3RhdHMuZ2V0VG90YWxNaWNyb3MoKSkpLG4uaXNGYWRlZE91dD10aGlzLmRpc3BsYXlpbmdTdGF0cyYmIWIkdChlLnN0YXRzKTt2YXIgaT1udWxsLHI9bnVsbCxvPW51bGw7aWYoZS5pc0dyb3VwTm9kZSl7aT1lLmRldmljZUhpc3RvZ3JhbSxyPWUueGxhQ2x1c3Rlckhpc3RvZ3JhbTtsZXQgdD1lLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZSxuPWUuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU7MD09dCYmMD09bnx8KG89dC8odCtuKSl9ZWxzZXtsZXQgdD1uLm5vZGUuZGV2aWNlO3QmJihpPXtbdF06MX0pO2xldCBlPW4ubm9kZS54bGFDbHVzdGVyO2UmJihyPXtbZV06MX0pLG4ubm9kZS50eXBlPT09QSR0Lk9QJiYobz1uLm5vZGUuY29tcGF0aWJsZT8xOjApfXJldHVybiBpJiYobi5kZXZpY2VDb2xvcnM9dGhpcy5jb2xvckhpc3RvZ3JhbShpLHRoaXMuZGV2aWNlQ29sb3JNYXApKSxyJiYobi54bGFDbHVzdGVyQ29sb3JzPXRoaXMuY29sb3JIaXN0b2dyYW0ocix0aGlzLnhsYUNsdXN0ZXJDb2xvck1hcCkpLG51bGwhPW8mJihuLmNvbXBhdGliaWxpdHlDb2xvcnM9W3tjb2xvcjpmS3QscHJvcG9ydGlvbjpvfSx7Y29sb3I6bUt0LHByb3BvcnRpb246MS1vfV0pLHRoaXMuaW5kZXhbdF19Z2V0TmVhcmVzdFZpc2libGVBbmNlc3Rvcih0KXtsZXQgZT1aJHQodCksbj0wLGk9bnVsbCxyPXQ7Zm9yKDtuPGUubGVuZ3RoJiYocj1lW25dLGk9dGhpcy5nZXRSZW5kZXJOb2RlQnlOYW1lKHIpLGkuZXhwYW5kZWQpO24rKyk7aWYobj09ZS5sZW5ndGgtMil7bGV0IHQ9ZVtuKzFdO2lmKGkuaW5Bbm5vdGF0aW9ucy5ub2RlTmFtZXNbdF0pcmV0dXJuIHQ7aWYoaS5vdXRBbm5vdGF0aW9ucy5ub2RlTmFtZXNbdF0pcmV0dXJuIHR9cmV0dXJuIHJ9c2V0RGVwdGgodCl7REt0KHRoaXMucm9vdCwrdCl9aXNOb2RlQXV4aWxpYXJ5KHQpe2xldCBlPXRoaXMuZ2V0UmVuZGVyTm9kZUJ5TmFtZSh0Lm5vZGUucGFyZW50Tm9kZS5uYW1lKSxuPUNlLmV4cG9ydHMuZmluZChlLmlzb2xhdGVkSW5FeHRyYWN0LChlPT5lLm5vZGUubmFtZT09PXQubm9kZS5uYW1lKSk7cmV0dXJuISFufHwobj1DZS5leHBvcnRzLmZpbmQoZS5pc29sYXRlZE91dEV4dHJhY3QsKGU9PmUubm9kZS5uYW1lPT09dC5ub2RlLm5hbWUpKSwhIW4pfWdldE5hbWVzT2ZSZW5kZXJlZE9wcygpe3JldHVybiB0aGlzLnJlbmRlcmVkT3BOYW1lc31jbG9uZUFuZEFkZEZ1bmN0aW9uT3BOb2RlKHQsZSxuLGkpe2NvbnN0IHI9bi5uYW1lLnJlcGxhY2UoZSxpKTtsZXQgbz10Lm1ldGFncmFwaC5ub2RlKHIpO2lmKG8pcmV0dXJuIG87bz1uZXcgTyR0KHtuYW1lOnIsaW5wdXQ6W10sZGV2aWNlOm4uZGV2aWNlLG9wOm4ub3AsYXR0cjpDZS5leHBvcnRzLmNsb25lRGVlcChuLmF0dHIpfSksby5jYXJkaW5hbGl0eT1uLmNhcmRpbmFsaXR5LG8uaW5jbHVkZT1uLmluY2x1ZGUsby5vdXRwdXRTaGFwZXM9Q2UuZXhwb3J0cy5jbG9uZURlZXAobi5vdXRwdXRTaGFwZXMpLG8ueGxhQ2x1c3Rlcj1uLnhsYUNsdXN0ZXIsby5mdW5jdGlvbklucHV0SW5kZXg9bi5mdW5jdGlvbklucHV0SW5kZXgsby5mdW5jdGlvbk91dHB1dEluZGV4PW4uZnVuY3Rpb25PdXRwdXRJbmRleCxvLmlucHV0cz1uLmlucHV0cy5tYXAoKHQ9Pntjb25zdCBuPUNlLmV4cG9ydHMuY2xvbmUodCk7cmV0dXJuIG4ubmFtZT10Lm5hbWUucmVwbGFjZShlLGkpLG59KSksby5wYXJlbnROb2RlPXQsdC5tZXRhZ3JhcGguc2V0Tm9kZShvLm5hbWUsbyksdGhpcy5oaWVyYXJjaHkuc2V0Tm9kZShvLm5hbWUsbyk7Y29uc3QgYT1uPT50aGlzLmNsb25lQW5kQWRkRnVuY3Rpb25PcE5vZGUodCxlLG4saSk7cmV0dXJuIG8uaW5FbWJlZGRpbmdzPW4uaW5FbWJlZGRpbmdzLm1hcChhKSxvLm91dEVtYmVkZGluZ3M9bi5vdXRFbWJlZGRpbmdzLm1hcChhKSxvfWNsb25lRnVuY3Rpb25MaWJyYXJ5TWV0YW5vZGUodCxlLG4saSxyKXtjb25zdCBvPXt9LGE9dGhpcy5jbG9uZUZ1bmN0aW9uTGlicmFyeU1ldGFub2RlSGVscGVyKHQsZSxuLGkscixvKTtyZXR1cm4gQ2UuZXhwb3J0cy5pc0VtcHR5KG8pfHx0aGlzLnBhdGNoRWRnZXNGcm9tRnVuY3Rpb25PdXRwdXRzKGUsbyksYX1jbG9uZUZ1bmN0aW9uTGlicmFyeU1ldGFub2RlSGVscGVyKHQsZSxuLGkscixvKXtjb25zdCBhPXokdChuLm5hbWUucmVwbGFjZShpLHIpKTtyZXR1cm4gYS5kZXB0aD1uLmRlcHRoLGEuY2FyZGluYWxpdHk9bi5jYXJkaW5hbGl0eSxhLnRlbXBsYXRlSWQ9bi50ZW1wbGF0ZUlkLGEub3BIaXN0b2dyYW09Q2UuZXhwb3J0cy5jbG9uZShuLm9wSGlzdG9ncmFtKSxhLmRldmljZUhpc3RvZ3JhbT1DZS5leHBvcnRzLmNsb25lKG4uZGV2aWNlSGlzdG9ncmFtKSxhLnhsYUNsdXN0ZXJIaXN0b2dyYW09Q2UuZXhwb3J0cy5jbG9uZShuLnhsYUNsdXN0ZXJIaXN0b2dyYW0pLGEuaGFzTm9uQ29udHJvbEVkZ2VzPW4uaGFzTm9uQ29udHJvbEVkZ2VzLGEuaW5jbHVkZT1uLmluY2x1ZGUsYS5ub2RlQXR0cmlidXRlcz1DZS5leHBvcnRzLmNsb25lKG4ubm9kZUF0dHJpYnV0ZXMpLGEuYXNzb2NpYXRlZEZ1bmN0aW9uPW4uYXNzb2NpYXRlZEZ1bmN0aW9uLENlLmV4cG9ydHMuZWFjaChuLm1ldGFncmFwaC5ub2RlcygpLChzPT57Y29uc3QgbD1uLm1ldGFncmFwaC5ub2RlKHMpO3N3aXRjaChsLnR5cGUpe2Nhc2UgQSR0Lk1FVEE6Y29uc3Qgbj10aGlzLmNsb25lRnVuY3Rpb25MaWJyYXJ5TWV0YW5vZGVIZWxwZXIodCxlLGwsaSxyLG8pO24ucGFyZW50Tm9kZT1hLGEubWV0YWdyYXBoLnNldE5vZGUobi5uYW1lLG4pLHRoaXMuaGllcmFyY2h5LnNldE5vZGUobi5uYW1lLG4pO2JyZWFrO2Nhc2UgQSR0Lk9QOmNvbnN0IHM9dGhpcy5jbG9uZUFuZEFkZEZ1bmN0aW9uT3BOb2RlKGEsaSxsLHIpO0NlLmV4cG9ydHMuaXNOdW1iZXIocy5mdW5jdGlvbklucHV0SW5kZXgpJiZ0aGlzLnBhdGNoRWRnZXNJbnRvRnVuY3Rpb25JbnB1dHMoZSxzKSxDZS5leHBvcnRzLmlzTnVtYmVyKHMuZnVuY3Rpb25PdXRwdXRJbmRleCkmJihvW3MuZnVuY3Rpb25PdXRwdXRJbmRleF09cyk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4obC5uYW1lKyIgaXMgb2RkbHkgbmVpdGhlciBhIG1ldGFub2RlIG5vciBhbiBvcG5vZGUuIil9fSkpLHRoaXMuY2xvbmVMaWJyYXJ5TWV0YW5vZGVFZGdlcyhuLGEsaSxyKSxhfWNsb25lTGlicmFyeU1ldGFub2RlRWRnZXModCxlLG4saSl7Q2UuZXhwb3J0cy5lYWNoKHQubWV0YWdyYXBoLmVkZ2VzKCksKHI9Pntjb25zdCBvPXQubWV0YWdyYXBoLmVkZ2UociksYT1vLnYucmVwbGFjZShuLGkpLHM9by53LnJlcGxhY2UobixpKSxsPW5ldyBIJHQoYSxzKTtsLmluYm91bmQ9by5pbmJvdW5kLGwubnVtUmVndWxhckVkZ2VzPW8ubnVtUmVndWxhckVkZ2VzLGwubnVtQ29udHJvbEVkZ2VzPW8ubnVtQ29udHJvbEVkZ2VzLGwubnVtUmVmRWRnZXM9by5udW1SZWZFZGdlcyxsLnRvdGFsU2l6ZT1vLnRvdGFsU2l6ZSxvLmJhc2VFZGdlTGlzdCYmKGwuYmFzZUVkZ2VMaXN0PW8uYmFzZUVkZ2VMaXN0Lm1hcCgodD0+e2NvbnN0IGU9Q2UuZXhwb3J0cy5jbG9uZSh0KTtyZXR1cm4gZS52PXQudi5yZXBsYWNlKG4saSksZS53PXQudy5yZXBsYWNlKG4saSksZX0pKSksZS5tZXRhZ3JhcGgubm9kZShzKT9lLm1ldGFncmFwaC5zZXRFZGdlKGEscyxsKTplLm1ldGFncmFwaC5zZXRFZGdlKHMsYSxsKX0pKX1wYXRjaEVkZ2VzSW50b0Z1bmN0aW9uSW5wdXRzKHQsZSl7bGV0IG49TWF0aC5taW4oZS5mdW5jdGlvbklucHV0SW5kZXgsdC5pbnB1dHMubGVuZ3RoLTEpLGk9Q2UuZXhwb3J0cy5jbG9uZSh0LmlucHV0c1tuXSk7Zm9yKDtpLmlzQ29udHJvbERlcGVuZGVuY3k7KW4rKyxpPXQuaW5wdXRzW25dO2UuaW5wdXRzLnB1c2goaSk7Y29uc3Qgcj10aGlzLmhpZXJhcmNoeS5nZXRQcmVkZWNlc3NvcnModC5uYW1lKTtsZXQgbyxhPTA7Q2UuZXhwb3J0cy5lYWNoKHIucmVndWxhciwodD0+e2lmKGErPXQubnVtUmVndWxhckVkZ2VzLGE+bilyZXR1cm4gbz10LCExfSkpLENlLmV4cG9ydHMuZWFjaChvLmJhc2VFZGdlTGlzdCwobj0+e24udz09PXQubmFtZSYmKG4udz1lLm5hbWUpLG4udj09PXQubmFtZSYmKG4udj1lLm5hbWUpfSkpfXBhdGNoRWRnZXNGcm9tRnVuY3Rpb25PdXRwdXRzKHQsZSl7Y29uc3Qgbj10aGlzLmhpZXJhcmNoeS5nZXRTdWNjZXNzb3JzKHQubmFtZSk7Q2UuZXhwb3J0cy5lYWNoKG4ucmVndWxhciwobj0+e0NlLmV4cG9ydHMuZWFjaChuLmJhc2VFZGdlTGlzdCwobj0+e2NvbnN0IGk9dGhpcy5oaWVyYXJjaHkubm9kZShuLncpO0NlLmV4cG9ydHMuZWFjaChpLmlucHV0cywoaT0+e2lmKGkubmFtZT09PXQubmFtZSl7aS5uYW1lPWVbaS5vdXRwdXRUZW5zb3JLZXldLm5hbWUsaS5vdXRwdXRUZW5zb3JLZXk9bi5vdXRwdXRUZW5zb3JLZXl9fSkpfSkpLENlLmV4cG9ydHMuZWFjaChuLmJhc2VFZGdlTGlzdCwodD0+e3Qudj1lW3Qub3V0cHV0VGVuc29yS2V5XS5uYW1lLHQub3V0cHV0VGVuc29yS2V5PSIwIn0pKX0pKX1idWlsZFN1YmhpZXJhcmNoeSh0KXtpZih0IGluIHRoaXMuaGFzU3ViaGllcmFyY2h5KXJldHVybjt0aGlzLmhhc1N1YmhpZXJhcmNoeVt0XT0hMDtsZXQgZT10aGlzLmluZGV4W3RdO2lmKGUubm9kZS50eXBlIT09QSR0Lk1FVEEmJmUubm9kZS50eXBlIT09QSR0LlNFUklFUylyZXR1cm47bGV0IG49ZSxpPW4ubm9kZS5tZXRhZ3JhcGgscj1uLmNvcmVHcmFwaDtjb25zdCBvPVtdLGE9W107Q2UuZXhwb3J0cy5pc0VtcHR5KHRoaXMuaGllcmFyY2h5LmxpYnJhcnlGdW5jdGlvbnMpfHwoQ2UuZXhwb3J0cy5lYWNoKGkubm9kZXMoKSwodD0+e2NvbnN0IGU9aS5ub2RlKHQpLG49dGhpcy5oaWVyYXJjaHkubGlicmFyeUZ1bmN0aW9uc1tlLm9wXTtpZighbilyZXR1cm47aWYoMD09PXQuaW5kZXhPZihUJHQpKXJldHVybjtjb25zdCByPXRoaXMuY2xvbmVGdW5jdGlvbkxpYnJhcnlNZXRhbm9kZShpLGUsbi5ub2RlLG4ubm9kZS5uYW1lLGUubmFtZSk7by5wdXNoKGUpLGEucHVzaChyKX0pKSxDZS5leHBvcnRzLmVhY2goYSwoKHQsZSk9Pntjb25zdCBuPW9bZV07dC5wYXJlbnROb2RlPW4ucGFyZW50Tm9kZSxpLnNldE5vZGUobi5uYW1lLHQpLHRoaXMuaGllcmFyY2h5LnNldE5vZGUobi5uYW1lLHQpfSkpKSxDZS5leHBvcnRzLmVhY2goaS5ub2RlcygpLCh0PT57bGV0IGU9dGhpcy5nZXRPckNyZWF0ZVJlbmRlck5vZGVCeU5hbWUodCksbj1lLm5vZGU7ci5zZXROb2RlKHQsZSksbi5pc0dyb3VwTm9kZXx8KENlLmV4cG9ydHMuZWFjaChuLmluRW1iZWRkaW5ncywodD0+e2xldCBuPW5ldyBJS3QobnVsbCksaT1uZXcgTkt0KHQpO1JLdChlLHQsaSxuLExLdC5DT05TVEFOVCksdGhpcy5pbmRleFt0Lm5hbWVdPWl9KSksQ2UuZXhwb3J0cy5lYWNoKG4ub3V0RW1iZWRkaW5ncywodD0+e2xldCBuPW5ldyBJS3QobnVsbCksaT1uZXcgTkt0KHQpO09LdChlLHQsaSxuLExLdC5TVU1NQVJZKSx0aGlzLmluZGV4W3QubmFtZV09aX0pKSl9KSksQ2UuZXhwb3J0cy5lYWNoKGkuZWRnZXMoKSwodD0+e2xldCBlPWkuZWRnZSh0KSxuPW5ldyBJS3QoZSk7bi5pc0ZhZGVkT3V0PXRoaXMuaW5kZXhbdC52XS5pc0ZhZGVkT3V0fHx0aGlzLmluZGV4W3Qud10uaXNGYWRlZE91dCxyLnNldEVkZ2UodC52LHQudyxuKX0pKSxuLm5vZGUudHlwZT09PUEkdC5NRVRBJiYoZnVuY3Rpb24gcyh0LGUpeyhmdW5jdGlvbiBuKHQpe2xldCBlPXQuY29yZUdyYXBoO0NlLmV4cG9ydHMuZWFjaChlLm5vZGVzKCksKG49PntlLm5vZGUobikubm9kZS5pbmNsdWRlIT09ayR0LkVYQ0xVREV8fG4uc3RhcnRzV2l0aChUJHQpfHwodC5jb3JlR3JhcGgub3V0RWRnZXMobikubGVuZ3RoPnQuY29yZUdyYXBoLmluRWRnZXMobikubGVuZ3RoP0hLdCh0LG4pOkZLdCh0LG4pKX0pKX0pKHQpLFNLdC5sZW5ndGgmJihmdW5jdGlvbiBpKHQpe2xldCBlPXQuY29yZUdyYXBoO0NlLmV4cG9ydHMuZWFjaChlLm5vZGVzKCksKG49PntsZXQgaT1lLm5vZGUobik7aS5ub2RlLmluY2x1ZGU9PT1rJHQuVU5TUEVDSUZJRUQmJlZLdChpLm5vZGUsU0t0KSYmSEt0KHQsbil9KSl9KSh0KTtNS3QubGVuZ3RoJiYoZnVuY3Rpb24gcih0KXtsZXQgZT10LmNvcmVHcmFwaDtDZS5leHBvcnRzLmVhY2goZS5ub2RlcygpLChuPT57bGV0IGk9ZS5ub2RlKG4pO2kubm9kZS5pbmNsdWRlPT09ayR0LlVOU1BFQ0lGSUVEJiZWS3QoaS5ub2RlLE1LdCkmJkZLdCh0LG4pfSkpfSkodCk7ZSYmKGZ1bmN0aW9uIG8odCl7bGV0IGU9dC5jb3JlR3JhcGgsbj17fSxpPXt9LHI9MDtpZihDZS5leHBvcnRzLmVhY2goZS5ub2RlcygpLCh0PT57aWYoZS5ub2RlKHQpLm5vZGUuaW5jbHVkZSE9PWskdC5VTlNQRUNJRklFRClyZXR1cm47bGV0IG89Q2UuZXhwb3J0cy5yZWR1Y2UoZS5wcmVkZWNlc3NvcnModCksKChuLGkpPT5uKyhlLmVkZ2UoaSx0KS5tZXRhZWRnZS5udW1SZWd1bGFyRWRnZXM/MTowKSksMCk7MD09PW8mJmUucHJlZGVjZXNzb3JzKHQpLmxlbmd0aD4wJiYobz1lLnByZWRlY2Vzc29ycyh0KS5sZW5ndGgpO2xldCBhPUNlLmV4cG9ydHMucmVkdWNlKGUuc3VjY2Vzc29ycyh0KSwoKG4saSk9Pm4rKGUuZWRnZSh0LGkpLm1ldGFlZGdlLm51bVJlZ3VsYXJFZGdlcz8xOjApKSwwKTswPT09YSYmZS5zdWNjZXNzb3JzKHQpLmxlbmd0aD4wJiYoYT1lLnN1Y2Nlc3NvcnModCkubGVuZ3RoKSxuW3RdPW8saVt0XT1hLHIrK30pKSxyPHZLdClyZXR1cm47bGV0IG89Ykt0LTEsYT1NYXRoLnJvdW5kKC43NSpyKSxzPU1hdGgucm91bmQoLjI1KnIpLGw9T2JqZWN0LmtleXMobikuc29ydCgoKHQsZSk9Pm5bdF0tbltlXSkpLGM9bltsW2FdXSx1PWMrYy1uW2xbc11dO3U9TWF0aC5tYXgodSxvKTtmb3IobGV0IGU9ci0xO25bbFtlXV0+dTtlLS0pRkt0KHQsbFtlXSk7bGV0IGg9T2JqZWN0LmtleXMoaSkuc29ydCgoKHQsZSk9PmlbdF0taVtlXSkpLGQ9aVtoW2FdXSxwPWQrNCooZC1pW2hbc11dKTtwPU1hdGgubWF4KHAsbyk7Zm9yKGxldCBuPXItMTtpW2hbbl1dPnA7bi0tKXtsZXQgaT1lLm5vZGUoaFtuXSk7aSYmIWkuaXNJbkV4dHJhY3QmJkhLdCh0LGhbbl0pfX0pKHQpOyEoZnVuY3Rpb24gYSh0KXtsZXQgZT10LmNvcmVHcmFwaCxuPXt9O0NlLmV4cG9ydHMuZWFjaChlLmVkZ2VzKCksKHQ9PntlLmVkZ2UodCkubWV0YWVkZ2UubnVtUmVndWxhckVkZ2VzfHwoKG5bdC52XT1uW3Qudl18fFtdKS5wdXNoKHQpLChuW3Qud109blt0LnddfHxbXSkucHVzaCh0KSl9KSksQ2UuZXhwb3J0cy5lYWNoKG4sKCh0LG4pPT57dC5sZW5ndGg+eEt0JiZDZS5leHBvcnRzLmVhY2godCwodD0+Qkt0KGUsdC52LHQudykpKX0pKX0pKHQpO2xldCBzPXQuY29yZUdyYXBoO0NlLmV4cG9ydHMuZWFjaChzLm5vZGVzKCksKGU9PntsZXQgbj1zLm5vZGUoZSksaT1zLm5laWdoYm9ycyhlKS5sZW5ndGg7aWYobi5ub2RlLmluY2x1ZGU9PT1rJHQuVU5TUEVDSUZJRUQmJjA9PT1pKXtsZXQgaT1uLm91dEFubm90YXRpb25zLmxpc3QubGVuZ3RoPjAscj1uLmluQW5ub3RhdGlvbnMubGlzdC5sZW5ndGg+MDtuLmlzSW5FeHRyYWN0Pyh0Lmlzb2xhdGVkSW5FeHRyYWN0LnB1c2gobiksbi5ub2RlLmluY2x1ZGU9ayR0LkVYQ0xVREUscy5yZW1vdmVOb2RlKGUpKTpuLmlzT3V0RXh0cmFjdD8odC5pc29sYXRlZE91dEV4dHJhY3QucHVzaChuKSxuLm5vZGUuaW5jbHVkZT1rJHQuRVhDTFVERSxzLnJlbW92ZU5vZGUoZSkpOmkmJiFyPyhuLmlzSW5FeHRyYWN0PSEwLHQuaXNvbGF0ZWRJbkV4dHJhY3QucHVzaChuKSxuLm5vZGUuaW5jbHVkZT1rJHQuRVhDTFVERSxzLnJlbW92ZU5vZGUoZSkpOnImJiFpJiYobi5pc091dEV4dHJhY3Q9ITAsdC5pc29sYXRlZE91dEV4dHJhY3QucHVzaChuKSxuLm5vZGUuaW5jbHVkZT1rJHQuRVhDTFVERSxzLnJlbW92ZU5vZGUoZSkpfX0pKX0pKG4sdGhpcy5hdXRvRXh0cmFjdE5vZGVzKSxDZS5leHBvcnRzLmlzRW1wdHkodGhpcy5oaWVyYXJjaHkubGlicmFyeUZ1bmN0aW9ucyl8fHRoaXMuYnVpbGRTdWJoaWVyYXJjaGllc0Zvck5lZWRlZEZ1bmN0aW9ucyhpKSx0PT09RSR0JiZDZS5leHBvcnRzLmZvck93bih0aGlzLmhpZXJhcmNoeS5saWJyYXJ5RnVuY3Rpb25zLCgodCxlKT0+e2NvbnN0IGk9dC5ub2RlLG89dGhpcy5nZXRPckNyZWF0ZVJlbmRlck5vZGVCeU5hbWUoaS5uYW1lKTtuLmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0LnB1c2gobyksby5ub2RlLmluY2x1ZGU9ayR0LkVYQ0xVREUsci5yZW1vdmVOb2RlKGkubmFtZSl9KSk7bGV0IGw9bi5ub2RlLnBhcmVudE5vZGU7aWYoIWwpcmV0dXJuO2xldCBjPXRoaXMuaW5kZXhbbC5uYW1lXSx1PSh0LC4uLmUpPT5lLmNvbmNhdChbdD8iSU4iOiJPVVQiXSkuam9pbigifn4iKSxoPXRoaXMuaGllcmFyY2h5LmdldEJyaWRnZWdyYXBoKHQpLGQ9e2luOnt9LG91dDp7fSxjb250cm9sOnt9fTtDZS5leHBvcnRzLmVhY2goaC5lZGdlcygpLCh0PT57bGV0IGU9ISFpLm5vZGUodC53KSxuPWU/dC52OnQudztoLmVkZ2UodCkubnVtUmVndWxhckVkZ2VzP2U/ZC5vdXRbbl09KGQub3V0W25dfHwwKSsxOmQuaW5bbl09KGQuaW5bbl18fDApKzE6ZC5jb250cm9sW25dPShkLmNvbnRyb2xbbl18fDApKzF9KSk7bGV0IHA9dGhpcy5oaWVyYXJjaHkuZ2V0Tm9kZU1hcCgpO0NlLmV4cG9ydHMuZWFjaChoLmVkZ2VzKCksKG49PntsZXQgbz1oLmVkZ2UobiksYT0hIWkubm9kZShuLncpLFtzLGZdPWE/W24udyxuLnZdOltuLnYsbi53XSxtPXRoaXMuaW5kZXhbc10sZz10aGlzLmluZGV4W2ZdLF89Zz9nLm5vZGU6cFtmXSx5PSFvLm51bVJlZ3VsYXJFZGdlcyYmZC5jb250cm9sW2ZdPnhLdCxbLHZdPWE/W2UuaW5Bbm5vdGF0aW9ucyxtLmluQW5ub3RhdGlvbnNdOltlLm91dEFubm90YXRpb25zLG0ub3V0QW5ub3RhdGlvbnNdLGI9bnVsbCx4PSExO2lmKCEoKGE/ZC5vdXQ6ZC5pbilbZl0+d0t0KSYmIXkmJm0uaXNJbkNvcmUoKSl7bGV0IGU9ZT0+Yy5jb3JlR3JhcGguZWRnZShhP3t2OmUsdzp0fTp7djp0LHc6ZX0pO2I9ZShmKSxifHwoYj1lKHUoYSxmLGwubmFtZSkpKSx4PSEhYn1sZXQgdz0hMTtpZihiJiYhby5udW1SZWd1bGFyRWRnZXMpe2xldCB0PWIsZT1jLm5vZGU7Zm9yKDt0LmFkam9pbmluZ01ldGFlZGdlOyl0PXQuYWRqb2luaW5nTWV0YWVkZ2UsZT1lLnBhcmVudE5vZGU7bGV0IG49dGhpcy5oaWVyYXJjaHkuZ2V0VG9wb2xvZ2ljYWxPcmRlcmluZyhlLm5hbWUpLGk9dC5tZXRhZWRnZTt3PW5baS52XT5uW2kud119aWYoeD14JiYhdywheClyZXR1cm4gdm9pZCB2LnB1c2gobmV3IGtLdChfLGcsbmV3IElLdChvKSxMS3QuU0hPUlRDVVQsYSkpO2xldCBTPXUoYSx0KSxNPXUoYSxmLHQpLEU9ci5ub2RlKE0pO2lmKCFFKXtsZXQgdD1yLm5vZGUoUyk7aWYoIXQpe3Q9bmV3IE5LdCh7bmFtZTpTLHR5cGU6QSR0LkJSSURHRSxpc0dyb3VwTm9kZTohMSxjYXJkaW5hbGl0eTowLHBhcmVudE5vZGU6bnVsbCxzdGF0czpudWxsLGluY2x1ZGU6ayR0LlVOU1BFQ0lGSUVELGluYm91bmQ6YSxub2RlQXR0cmlidXRlczp7fX0pLHRoaXMuaW5kZXhbU109dCxyLnNldE5vZGUoUyx0KX1FPW5ldyBOS3Qoe25hbWU6TSx0eXBlOkEkdC5CUklER0UsaXNHcm91cE5vZGU6ITEsY2FyZGluYWxpdHk6MSxwYXJlbnROb2RlOm51bGwsc3RhdHM6bnVsbCxpbmNsdWRlOmskdC5VTlNQRUNJRklFRCxpbmJvdW5kOmEsbm9kZUF0dHJpYnV0ZXM6e319KSx0aGlzLmluZGV4W01dPUUsci5zZXROb2RlKE0sRSksci5zZXRQYXJlbnQoTSxTKSx0Lm5vZGUuY2FyZGluYWxpdHkrK31sZXQgVD1uZXcgSUt0KG8pO1QuYWRqb2luaW5nTWV0YWVkZ2U9YixhP3Iuc2V0RWRnZShNLHMsVCk6ci5zZXRFZGdlKHMsTSxUKX0pKSxDZS5leHBvcnRzLmVhY2goWyEwLCExXSwoZT0+e2xldCBuPXUoZSx0KSxpPXIubm9kZShuKTtpJiZDZS5leHBvcnRzLmVhY2goci5ub2RlcygpLChvPT57aWYoci5ub2RlKG8pLm5vZGUudHlwZT09PUEkdC5CUklER0UpcmV0dXJuO2lmKCEoZT8hci5wcmVkZWNlc3NvcnMobykubGVuZ3RoOiFyLnN1Y2Nlc3NvcnMobykubGVuZ3RoKSlyZXR1cm47bGV0IGE9dShlLHQsIlNUUlVDVFVSQUxfVEFSR0VUIikscz1yLm5vZGUoYSk7aWYoIXMpe3M9bmV3IE5LdCh7bmFtZTphLHR5cGU6QSR0LkJSSURHRSxpc0dyb3VwTm9kZTohMSxjYXJkaW5hbGl0eToxLHBhcmVudE5vZGU6bnVsbCxzdGF0czpudWxsLGluY2x1ZGU6ayR0LlVOU1BFQ0lGSUVELGluYm91bmQ6ZSxub2RlQXR0cmlidXRlczp7fX0pLHMuc3RydWN0dXJhbD0hMCx0aGlzLmluZGV4W2FdPXMsci5zZXROb2RlKGEscyksaS5ub2RlLmNhcmRpbmFsaXR5Kyssci5zZXRQYXJlbnQoYSxuKX1sZXQgbD1uZXcgSUt0KG51bGwpO2wuc3RydWN0dXJhbD0hMCxsLndlaWdodC0tLGU/ci5zZXRFZGdlKGEsbyxsKTpyLnNldEVkZ2UobyxhLGwpfSkpfSkpfWJ1aWxkU3ViaGllcmFyY2hpZXNGb3JOZWVkZWRGdW5jdGlvbnModCl7Q2UuZXhwb3J0cy5lYWNoKHQuZWRnZXMoKSwoZT0+e2xldCBuPXQuZWRnZShlKSxpPW5ldyBJS3Qobik7Q2UuZXhwb3J0cy5mb3JFYWNoKGkubWV0YWVkZ2UuYmFzZUVkZ2VMaXN0LCh0PT57Y29uc3QgZT10LnYuc3BsaXQoTSR0KTtmb3IobGV0IHQ9ZS5sZW5ndGg7dD49MDt0LS0pe2NvbnN0IG49ZS5zbGljZSgwLHQpLGk9dGhpcy5oaWVyYXJjaHkubm9kZShuLmpvaW4oTSR0KSk7aWYoaSl7aWYoaS50eXBlPT09QSR0Lk9QJiZ0aGlzLmhpZXJhcmNoeS5saWJyYXJ5RnVuY3Rpb25zW2kub3BdKWZvcihsZXQgdD0xO3Q8bi5sZW5ndGg7dCsrKXtjb25zdCBlPW4uc2xpY2UoMCx0KS5qb2luKE0kdCk7ZSYmdGhpcy5idWlsZFN1YmhpZXJhcmNoeShlKX1icmVha319fSkpfSkpfX1jbGFzcyBrS3R7Y29uc3RydWN0b3IodCxlLG4saSxyKXt0aGlzLm5vZGU9dCx0aGlzLnJlbmRlck5vZGVJbmZvPWUsdGhpcy5yZW5kZXJNZXRhZWRnZUluZm89bix0aGlzLmFubm90YXRpb25UeXBlPWksdGhpcy5keD0wLHRoaXMuZHk9MCx0aGlzLndpZHRoPTAsdGhpcy5oZWlnaHQ9MCxuJiZuLm1ldGFlZGdlJiYodGhpcy52PW4ubWV0YWVkZ2Uudix0aGlzLnc9bi5tZXRhZWRnZS53KSx0aGlzLmlzSW49cix0aGlzLnBvaW50cz1bXX19dmFyIExLdDshKGZ1bmN0aW9uKHQpe3RbdC5TSE9SVENVVD0wXT0iU0hPUlRDVVQiLHRbdC5DT05TVEFOVD0xXT0iQ09OU1RBTlQiLHRbdC5TVU1NQVJZPTJdPSJTVU1NQVJZIix0W3QuRUxMSVBTSVM9M109IkVMTElQU0lTIn0pKExLdHx8KExLdD17fSkpO2NsYXNzIFBLdHtjb25zdHJ1Y3Rvcigpe3RoaXMubGlzdD1bXSx0aGlzLm5vZGVOYW1lcz17fX1wdXNoKHQpe2lmKHQubm9kZS5uYW1lIGluIHRoaXMubm9kZU5hbWVzKXJldHVybjtpZih0aGlzLm5vZGVOYW1lc1t0Lm5vZGUubmFtZV09ITAsdGhpcy5saXN0Lmxlbmd0aDxUS3QpcmV0dXJuIHZvaWQgdGhpcy5saXN0LnB1c2godCk7bGV0IGU9dGhpcy5saXN0W3RoaXMubGlzdC5sZW5ndGgtMV07aWYoZS5hbm5vdGF0aW9uVHlwZT09PUxLdC5FTExJUFNJUyl7bGV0IHQ9ZS5ub2RlO3JldHVybiB2b2lkIHQuc2V0TnVtTW9yZU5vZGVzKCsrdC5udW1Nb3JlTm9kZXMpfWxldCBuPW5ldyBSJHQoMSk7dGhpcy5saXN0LnB1c2gobmV3IGtLdChuLG5ldyBOS3QobiksbnVsbCxMS3QuRUxMSVBTSVMsdC5pc0luKSl9fWNsYXNzIE5LdHtjb25zdHJ1Y3Rvcih0KXtpZih0aGlzLm5vZGU9dCx0aGlzLmV4cGFuZGVkPSExLHRoaXMuaW5Bbm5vdGF0aW9ucz1uZXcgUEt0LHRoaXMub3V0QW5ub3RhdGlvbnM9bmV3IFBLdCx0aGlzLng9MCx0aGlzLnk9MCx0aGlzLndpZHRoPTAsdGhpcy5oZWlnaHQ9MCx0aGlzLmluYm94V2lkdGg9MCx0aGlzLm91dGJveFdpZHRoPTAsdGhpcy5leGNsdWRlZD0hMSx0aGlzLnN0cnVjdHVyYWw9ITEsdGhpcy5sYWJlbE9mZnNldD0wLHRoaXMucmFkaXVzPTAsdGhpcy5sYWJlbEhlaWdodD0wLHRoaXMucGFkZGluZ1RvcD0wLHRoaXMucGFkZGluZ0xlZnQ9MCx0aGlzLnBhZGRpbmdSaWdodD0wLHRoaXMucGFkZGluZ0JvdHRvbT0wLHRoaXMuaXNJbkV4dHJhY3Q9ITEsdGhpcy5pc091dEV4dHJhY3Q9ITEsdGhpcy5jb3JlQm94PXt3aWR0aDowLGhlaWdodDowfSx0aGlzLmlzRmFkZWRPdXQ9ITEsdGhpcy5kaXNwbGF5TmFtZT10Lm5hbWUuc3Vic3RyaW5nKHQubmFtZS5sYXN0SW5kZXhPZihNJHQpKzEpLHQudHlwZT09PUEkdC5NRVRBJiZ0LmFzc29jaWF0ZWRGdW5jdGlvbil7Y29uc3QgdD10aGlzLmRpc3BsYXlOYW1lLm1hdGNoKENLdCk7dD90aGlzLmRpc3BsYXlOYW1lPXRbMV06Q2UuZXhwb3J0cy5zdGFydHNXaXRoKHRoaXMuZGlzcGxheU5hbWUsVCR0KSYmKHRoaXMuZGlzcGxheU5hbWU9dGhpcy5kaXNwbGF5TmFtZS5zdWJzdHJpbmcoVCR0Lmxlbmd0aCkpfX1pc0luQ29yZSgpe3JldHVybiF0aGlzLmlzSW5FeHRyYWN0JiYhdGhpcy5pc091dEV4dHJhY3QmJiF0aGlzLmlzTGlicmFyeUZ1bmN0aW9ufX1jbGFzcyBJS3R7Y29uc3RydWN0b3IodCl7dGhpcy5tZXRhZWRnZT10LHRoaXMuYWRqb2luaW5nTWV0YWVkZ2U9bnVsbCx0aGlzLnN0cnVjdHVyYWw9ITEsdGhpcy53ZWlnaHQ9MSx0aGlzLmlzRmFkZWRPdXQ9ITF9fWZ1bmN0aW9uIFJLdCh0LGUsbixpLHIpe2xldCBvPW5ldyBrS3QoZSxuLGksciwhMCk7dC5pbkFubm90YXRpb25zLnB1c2gobyl9ZnVuY3Rpb24gT0t0KHQsZSxuLGkscil7bGV0IG89bmV3IGtLdChlLG4saSxyLCExKTt0Lm91dEFubm90YXRpb25zLnB1c2gobyl9Y2xhc3Mgekt0IGV4dGVuZHMgTkt0e2NvbnN0cnVjdG9yKHQsZSl7c3VwZXIodCk7bGV0IG49dC5tZXRhZ3JhcGguZ3JhcGgoKTt0aGlzLmNvcmVHcmFwaD1ZJHQobi5uYW1lLEMkdC5DT1JFLGUpLHRoaXMuaW5FeHRyYWN0Qm94PXt3aWR0aDowLGhlaWdodDowfSx0aGlzLm91dEV4dHJhY3RCb3g9e3dpZHRoOjAsaGVpZ2h0OjB9LHRoaXMubGlicmFyeUZ1bmN0aW9uc0JveD17d2lkdGg6MCxoZWlnaHQ6MH0sdGhpcy5pc29sYXRlZEluRXh0cmFjdD1bXSx0aGlzLmlzb2xhdGVkT3V0RXh0cmFjdD1bXSx0aGlzLmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0PVtdfX1mdW5jdGlvbiBES3QodCxlKXt0LmNvcmVHcmFwaCYmKGZ1bmN0aW9uIG4odCxlKXtDZS5leHBvcnRzLmVhY2godC5ub2RlcygpLChuPT57bGV0IGk9dC5ub2RlKG4pO2lmKGkuZXhwYW5kZWQ9ZT4xLGU+MClzd2l0Y2goaS5ub2RlLnR5cGUpe2Nhc2UgQSR0Lk1FVEE6Y2FzZSBBJHQuU0VSSUVTOkRLdChpLGUtMSl9fSkpfSkodC5jb3JlR3JhcGgsZSl9ZnVuY3Rpb24gQkt0KHQsZSxuKXtsZXQgaT10Lm5vZGUoZSkscj10Lm5vZGUobiksbz10LmVkZ2UoZSxuKTsoaS5ub2RlLmluY2x1ZGUhPT1rJHQuSU5DTFVERSYmci5ub2RlLmluY2x1ZGUhPT1rJHQuSU5DTFVERXx8aS5ub2RlLmluY2x1ZGU9PT1rJHQuRVhDTFVERXx8ci5ub2RlLmluY2x1ZGU9PT1rJHQuRVhDTFVERSkmJihPS3QoaSxyLm5vZGUscixvLExLdC5TSE9SVENVVCksUkt0KHIsaS5ub2RlLGksbyxMS3QuU0hPUlRDVVQpLHQucmVtb3ZlRWRnZShlLG4pKX1mdW5jdGlvbiBIS3QodCxlLG4pe2xldCBpPXQuY29yZUdyYXBoLHI9aS5ub2RlKGUpO3IuaXNPdXRFeHRyYWN0PSEwLENlLmV4cG9ydHMuZWFjaChpLnByZWRlY2Vzc29ycyhlKSwoKHQsbik9PntCS3QoaSx0LGUpfSkpLENlLmV4cG9ydHMuZWFjaChpLnN1Y2Nlc3NvcnMoZSksKCh0LG4pPT57Qkt0KGksZSx0KX0pKSwwPT09aS5uZWlnaGJvcnMoZSkubGVuZ3RoJiYoci5ub2RlLmluY2x1ZGU9ayR0LkVYQ0xVREUsdC5pc29sYXRlZE91dEV4dHJhY3QucHVzaChyKSxpLnJlbW92ZU5vZGUoZSkpfWZ1bmN0aW9uIEZLdCh0LGUsbil7bGV0IGk9dC5jb3JlR3JhcGgscj1pLm5vZGUoZSk7ci5pc0luRXh0cmFjdD0hMCxDZS5leHBvcnRzLmVhY2goaS5zdWNjZXNzb3JzKGUpLCgodCxuKT0+e0JLdChpLGUsdCl9KSksQ2UuZXhwb3J0cy5lYWNoKGkucHJlZGVjZXNzb3JzKGUpLCgodCxuKT0+e0JLdChpLHQsZSl9KSksMD09PWkubmVpZ2hib3JzKGUpLmxlbmd0aCYmKHIubm9kZS5pbmNsdWRlPWskdC5FWENMVURFLHQuaXNvbGF0ZWRJbkV4dHJhY3QucHVzaChyKSxpLnJlbW92ZU5vZGUoZSkpfWZ1bmN0aW9uIFZLdCh0LGUpe2lmKHQudHlwZT09PUEkdC5PUCl7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspaWYodC5vcD09PWVbbl0pcmV0dXJuITB9ZWxzZSBpZih0LnR5cGU9PT1BJHQuTUVUQSl7bGV0IG49dC5nZXRSb290T3AoKTtpZihuKWZvcihsZXQgdD0wO3Q8ZS5sZW5ndGg7dCsrKWlmKG4ub3A9PT1lW3RdKXJldHVybiEwfXJldHVybiExfWNvbnN0IFVLdD17YW5pbWF0aW9uOntkdXJhdGlvbjoyNTB9LGdyYXBoOnttZXRhOntub2RlU2VwOjUscmFua1NlcDoyNSxlZGdlU2VwOjV9LHNlcmllczp7bm9kZVNlcDo1LHJhbmtTZXA6MjUsZWRnZVNlcDo1fSxwYWRkaW5nOntwYWRkaW5nVG9wOjQwLHBhZGRpbmdMZWZ0OjIwfX0sc3Vic2NlbmU6e21ldGE6e3BhZGRpbmdUb3A6MTAscGFkZGluZ0JvdHRvbToxMCxwYWRkaW5nTGVmdDoxMCxwYWRkaW5nUmlnaHQ6MTAsbGFiZWxIZWlnaHQ6MjAsZXh0cmFjdFhPZmZzZXQ6MTUsZXh0cmFjdFlPZmZzZXQ6MjB9LHNlcmllczp7cGFkZGluZ1RvcDoxMCxwYWRkaW5nQm90dG9tOjEwLHBhZGRpbmdMZWZ0OjEwLHBhZGRpbmdSaWdodDoxMCxsYWJlbEhlaWdodDoxMH19LG5vZGVTaXplOnttZXRhOntyYWRpdXM6NSx3aWR0aDo2MCxtYXhMYWJlbFdpZHRoOjUyLGhlaWdodDpjRSgpLmRvbWFpbihbMSwyMDBdKS5yYW5nZShbMTUsNjBdKS5jbGFtcCghMCksZXhwYW5kQnV0dG9uUmFkaXVzOjN9LG9wOnt3aWR0aDoxNSxoZWlnaHQ6NixyYWRpdXM6MyxsYWJlbE9mZnNldDotOCxtYXhMYWJlbFdpZHRoOjMwfSxzZXJpZXM6e2V4cGFuZGVkOntyYWRpdXM6MTAsbGFiZWxPZmZzZXQ6MH0sdmVydGljYWw6e3dpZHRoOjE2LGhlaWdodDoxMyxsYWJlbE9mZnNldDotMTN9LGhvcml6b250YWw6e3dpZHRoOjI0LGhlaWdodDo4LHJhZGl1czoxMCxsYWJlbE9mZnNldDotMTB9fSxicmlkZ2U6e3dpZHRoOjIwLGhlaWdodDoyMCxyYWRpdXM6MixsYWJlbE9mZnNldDowfX0sc2hvcnRjdXRTaXplOntvcDp7d2lkdGg6MTAsaGVpZ2h0OjR9LG1ldGE6e3dpZHRoOjEyLGhlaWdodDo0LHJhZGl1czoxfSxzZXJpZXM6e3dpZHRoOjE0LGhlaWdodDo0fX0sYW5ub3RhdGlvbnM6e2luYm94V2lkdGg6NTAsb3V0Ym94V2lkdGg6NTAseE9mZnNldDoxMCx5T2Zmc2V0OjMsbGFiZWxPZmZzZXQ6MixtYXhMYWJlbFdpZHRoOjQwfSxjb25zdGFudDp7c2l6ZTp7d2lkdGg6NCxoZWlnaHQ6NH19LHNlcmllczp7bWF4U3RhY2tDb3VudDozLHBhcmFsbGVsU3RhY2tPZmZzZXRSYXRpbzouMix0b3dlclN0YWNrT2Zmc2V0UmF0aW86LjV9LG1pbmltYXA6e3NpemU6MTUwfX0sakt0PTE0MDtmdW5jdGlvbiBHS3QodCl7dC5ub2RlLmlzR3JvdXBOb2RlJiYoZnVuY3Rpb24gZSh0KXtsZXQgZT10LmNvcmVHcmFwaC5ub2RlcygpLm1hcCgoZT0+dC5jb3JlR3JhcGgubm9kZShlKSkpLmNvbmNhdCh0Lmlzb2xhdGVkSW5FeHRyYWN0LHQuaXNvbGF0ZWRPdXRFeHRyYWN0LHQubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QpO0NlLmV4cG9ydHMuZWFjaChlLCh0PT57c3dpdGNoKHQubm9kZS50eXBlKXtjYXNlIEEkdC5PUDpDZS5leHBvcnRzLmV4dGVuZCh0LFVLdC5ub2RlU2l6ZS5vcCk7YnJlYWs7Y2FzZSBBJHQuQlJJREdFOkNlLmV4cG9ydHMuZXh0ZW5kKHQsVUt0Lm5vZGVTaXplLmJyaWRnZSk7YnJlYWs7Y2FzZSBBJHQuTUVUQTppZih0LmV4cGFuZGVkKXtHS3QodCl9ZWxzZSBDZS5leHBvcnRzLmV4dGVuZCh0LFVLdC5ub2RlU2l6ZS5tZXRhKSx0LmhlaWdodD1VS3Qubm9kZVNpemUubWV0YS5oZWlnaHQodC5ub2RlLmNhcmRpbmFsaXR5KTticmVhaztjYXNlIEEkdC5TRVJJRVM6aWYodC5leHBhbmRlZCl7Q2UuZXhwb3J0cy5leHRlbmQodCxVS3Qubm9kZVNpemUuc2VyaWVzLmV4cGFuZGVkKSxHS3QodCl9ZWxzZXtDZS5leHBvcnRzLmV4dGVuZCh0LHQubm9kZS5oYXNOb25Db250cm9sRWRnZXM/VUt0Lm5vZGVTaXplLnNlcmllcy52ZXJ0aWNhbDpVS3Qubm9kZVNpemUuc2VyaWVzLmhvcml6b250YWwpfWJyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoIlVucmVjb2duaXplZCBub2RlIHR5cGU6ICIrdC5ub2RlLnR5cGUpfXQuZXhwYW5kZWR8fChmdW5jdGlvbiBlKHQpe3QuaW5ib3hXaWR0aD10LmluQW5ub3RhdGlvbnMubGlzdC5sZW5ndGg+MD9VS3QuYW5ub3RhdGlvbnMuaW5ib3hXaWR0aDowLHQub3V0Ym94V2lkdGg9dC5vdXRBbm5vdGF0aW9ucy5saXN0Lmxlbmd0aD4wP1VLdC5hbm5vdGF0aW9ucy5vdXRib3hXaWR0aDowLHQuY29yZUJveC53aWR0aD10LndpZHRoLHQuY29yZUJveC5oZWlnaHQ9dC5oZWlnaHQsdC53aWR0aD1NYXRoLm1heCh0LmNvcmVCb3gud2lkdGgrdC5pbmJveFdpZHRoK3Qub3V0Ym94V2lkdGgsMyp0LmRpc3BsYXlOYW1lLmxlbmd0aCl9KSh0KSwoZnVuY3Rpb24gbih0KXtpZih0LmV4cGFuZGVkKXJldHVybjtsZXQgZT10LmluQW5ub3RhdGlvbnMubGlzdCxuPXQub3V0QW5ub3RhdGlvbnMubGlzdDtDZS5leHBvcnRzLmVhY2goZSwodD0+cUt0KHQpKSksQ2UuZXhwb3J0cy5lYWNoKG4sKHQ9PnFLdCh0KSkpO2xldCBpPVVLdC5hbm5vdGF0aW9ucyxyPUNlLmV4cG9ydHMucmVkdWNlKGUsKChlLG4scik9PntsZXQgbz1yPjA/aS55T2Zmc2V0OjA7cmV0dXJuIG4uZHg9LSh0LmNvcmVCb3gud2lkdGgrbi53aWR0aCkvMi1pLnhPZmZzZXQsbi5keT1lK28rbi5oZWlnaHQvMixlK28rbi5oZWlnaHR9KSwwKTtDZS5leHBvcnRzLmVhY2goZSwodD0+e3QuZHktPXIvMix0LmxhYmVsT2Zmc2V0PWkubGFiZWxPZmZzZXR9KSk7bGV0IG89Q2UuZXhwb3J0cy5yZWR1Y2UobiwoKGUsbixyKT0+e2xldCBvPXI+MD9pLnlPZmZzZXQ6MDtyZXR1cm4gbi5keD0odC5jb3JlQm94LndpZHRoK24ud2lkdGgpLzIraS54T2Zmc2V0LG4uZHk9ZStvK24uaGVpZ2h0LzIsZStvK24uaGVpZ2h0fSksMCk7Q2UuZXhwb3J0cy5lYWNoKG4sKHQ9Pnt0LmR5LT1vLzIsdC5sYWJlbE9mZnNldD1pLmxhYmVsT2Zmc2V0fSkpO2xldCBhPU1hdGgubWluKHQuaGVpZ2h0LzItdC5yYWRpdXMsci8yKTthPWE8MD8wOmE7bGV0IHM9Y0UoKS5kb21haW4oWzAsZS5sZW5ndGgtMV0pLnJhbmdlKFstYSxhXSk7Q2UuZXhwb3J0cy5lYWNoKGUsKChuLGkpPT57bi5wb2ludHM9W3tkeDpuLmR4K24ud2lkdGgvMixkeTpuLmR5fSx7ZHg6LXQuY29yZUJveC53aWR0aC8yLGR5OmUubGVuZ3RoPjE/cyhpKTowfV19KSk7bGV0IGw9TWF0aC5taW4odC5oZWlnaHQvMi10LnJhZGl1cyxvLzIpO2w9bDwwPzA6bDtsZXQgYz1jRSgpLmRvbWFpbihbMCxuLmxlbmd0aC0xXSkucmFuZ2UoWy1sLGxdKTtDZS5leHBvcnRzLmVhY2gobiwoKGUsaSk9PntlLnBvaW50cz1be2R4OnQuY29yZUJveC53aWR0aC8yLGR5Om4ubGVuZ3RoPjE/YyhpKTowfSx7ZHg6ZS5keC1lLndpZHRoLzIsZHk6ZS5keX1dfSkpLHQuaGVpZ2h0PU1hdGgubWF4KHQuaGVpZ2h0LHIsbyl9KSh0KX0pKX0pKHQpLHQubm9kZS50eXBlPT09QSR0Lk1FVEE/KGZ1bmN0aW9uIG4odCl7bGV0IGU9VUt0LnN1YnNjZW5lLm1ldGE7Q2UuZXhwb3J0cy5leHRlbmQodCxlKSxDZS5leHBvcnRzLmV4dGVuZCh0LmNvcmVCb3gsV0t0KHQuY29yZUdyYXBoLFVLdC5ncmFwaC5tZXRhKSk7bGV0IG49dC5pc29sYXRlZEluRXh0cmFjdC5sZW5ndGg/Q2UuZXhwb3J0cy5tYXhCeSh0Lmlzb2xhdGVkSW5FeHRyYWN0LCh0PT50LndpZHRoKSkud2lkdGg6bnVsbDt0LmluRXh0cmFjdEJveC53aWR0aD1udWxsIT1uP246MCx0LmluRXh0cmFjdEJveC5oZWlnaHQ9Q2UuZXhwb3J0cy5yZWR1Y2UodC5pc29sYXRlZEluRXh0cmFjdCwoKHQsbixpKT0+e2xldCByPWk+MD9lLmV4dHJhY3RZT2Zmc2V0OjA7cmV0dXJuIG4ueD0wLG4ueT10K3Irbi5oZWlnaHQvMix0K3Irbi5oZWlnaHR9KSwwKTtsZXQgaT10Lmlzb2xhdGVkT3V0RXh0cmFjdC5sZW5ndGg/Q2UuZXhwb3J0cy5tYXhCeSh0Lmlzb2xhdGVkT3V0RXh0cmFjdCwodD0+dC53aWR0aCkpLndpZHRoOm51bGw7dC5vdXRFeHRyYWN0Qm94LndpZHRoPW51bGwhPWk/aTowLHQub3V0RXh0cmFjdEJveC5oZWlnaHQ9Q2UuZXhwb3J0cy5yZWR1Y2UodC5pc29sYXRlZE91dEV4dHJhY3QsKCh0LG4saSk9PntsZXQgcj1pPjA/ZS5leHRyYWN0WU9mZnNldDowO3JldHVybiBuLng9MCxuLnk9dCtyK24uaGVpZ2h0LzIsdCtyK24uaGVpZ2h0fSksMCk7bGV0IHI9dC5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5sZW5ndGg/Q2UuZXhwb3J0cy5tYXhCeSh0LmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0LCh0PT50LndpZHRoKSkud2lkdGg6bnVsbDt0LmxpYnJhcnlGdW5jdGlvbnNCb3gud2lkdGg9bnVsbCE9cj9yOjAsdC5saWJyYXJ5RnVuY3Rpb25zQm94LmhlaWdodD1DZS5leHBvcnRzLnJlZHVjZSh0LmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0LCgodCxuLGkpPT57bGV0IHI9aT4wP2UuZXh0cmFjdFlPZmZzZXQ6MDtyZXR1cm4gbi54PTAsbi55PXQrcituLmhlaWdodC8yLHQrcituLmhlaWdodH0pLDApO2xldCBvPTA7dC5pc29sYXRlZEluRXh0cmFjdC5sZW5ndGg+MCYmbysrO3QuaXNvbGF0ZWRPdXRFeHRyYWN0Lmxlbmd0aD4wJiZvKys7dC5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5sZW5ndGg+MCYmbysrO3QuY29yZUdyYXBoLm5vZGVDb3VudCgpPjAmJm8rKztsZXQgYT1VS3Quc3Vic2NlbmUubWV0YS5leHRyYWN0WE9mZnNldCxzPW88PTE/MDpvKmE7Y29uc3QgbD1NYXRoLm1heChqS3QsdC5pbkV4dHJhY3RCb3gud2lkdGgrdC5vdXRFeHRyYWN0Qm94LndpZHRoKTt0LmNvcmVCb3gud2lkdGgrPWwrcyt0LmxpYnJhcnlGdW5jdGlvbnNCb3gud2lkdGgrcyx0LmNvcmVCb3guaGVpZ2h0PWUubGFiZWxIZWlnaHQrTWF0aC5tYXgodC5pbkV4dHJhY3RCb3guaGVpZ2h0LHQuY29yZUJveC5oZWlnaHQsdC5saWJyYXJ5RnVuY3Rpb25zQm94LmhlaWdodCx0Lm91dEV4dHJhY3RCb3guaGVpZ2h0KSx0LndpZHRoPXQuY29yZUJveC53aWR0aCtlLnBhZGRpbmdMZWZ0K2UucGFkZGluZ1JpZ2h0LHQuaGVpZ2h0PXQucGFkZGluZ1RvcCt0LmNvcmVCb3guaGVpZ2h0K3QucGFkZGluZ0JvdHRvbX0pKHQpOnQubm9kZS50eXBlPT09QSR0LlNFUklFUyYmKGZ1bmN0aW9uIGkodCl7bGV0IGU9dC5jb3JlR3JhcGgsbj1VS3Quc3Vic2NlbmUuc2VyaWVzO0NlLmV4cG9ydHMuZXh0ZW5kKHQsbiksQ2UuZXhwb3J0cy5leHRlbmQodC5jb3JlQm94LFdLdCh0LmNvcmVHcmFwaCxVS3QuZ3JhcGguc2VyaWVzKSksQ2UuZXhwb3J0cy5lYWNoKGUubm9kZXMoKSwodD0+e2Uubm9kZSh0KS5leGNsdWRlZD0hMX0pKSx0LndpZHRoPXQuY29yZUJveC53aWR0aCtuLnBhZGRpbmdMZWZ0K24ucGFkZGluZ1JpZ2h0LHQuaGVpZ2h0PXQuY29yZUJveC5oZWlnaHQrbi5wYWRkaW5nVG9wK24ucGFkZGluZ0JvdHRvbX0pKHQpfWZ1bmN0aW9uIFdLdCh0LGUpe0NlLmV4cG9ydHMuZXh0ZW5kKHQuZ3JhcGgoKSx7bm9kZXNlcDplLm5vZGVTZXAscmFua3NlcDplLnJhbmtTZXAsZWRnZXNlcDplLmVkZ2VTZXB9KTtsZXQgbj1bXTtpZihDZS5leHBvcnRzLmVhY2godC5ub2RlcygpLChlPT57dC5ub2RlKGUpLm5vZGUudHlwZT09PUEkdC5CUklER0V8fG4ucHVzaChlKX0pKSwhbi5sZW5ndGgpcmV0dXJue3dpZHRoOjAsaGVpZ2h0OjB9O3QkdC5sYXlvdXQodCk7bGV0IGk9MS8wLHI9MS8wLG89LTEvMCxhPS0xLzA7cmV0dXJuIENlLmV4cG9ydHMuZWFjaChuLChlPT57bGV0IG49dC5ub2RlKGUpLHM9LjUqbi53aWR0aCxsPW4ueC1zLGM9bi54K3M7aT1sPGk/bDppLG89Yz5vP2M6bztsZXQgdT0uNSpuLmhlaWdodCxoPW4ueS11LGQ9bi55K3U7cj1oPHI/aDpyLGE9ZD5hP2Q6YX0pKSxDZS5leHBvcnRzLmVhY2godC5lZGdlcygpLChlPT57bGV0IG49dC5lZGdlKGUpO2lmKG4uc3RydWN0dXJhbClyZXR1cm47bGV0IHM9dC5ub2RlKG4ubWV0YWVkZ2UudiksbD10Lm5vZGUobi5tZXRhZWRnZS53KTtpZigzPT09bi5wb2ludHMubGVuZ3RoJiYoZnVuY3Rpb24gYyh0KXtsZXQgZT1YS3QodFswXSx0WzFdKTtmb3IobGV0IG49MTtuPHQubGVuZ3RoLTE7bisrKXtsZXQgaT1YS3QodFtuXSx0W24rMV0pO2lmKE1hdGguYWJzKGktZSk+MSlyZXR1cm4hMTtlPWl9cmV0dXJuITB9KShuLnBvaW50cykpe2lmKG51bGwhPXMpe2xldCB0PXMuZXhwYW5kZWQ/cy54OllLdChzKTtuLnBvaW50c1swXS54PXR9aWYobnVsbCE9bCl7bGV0IHQ9bC5leHBhbmRlZD9sLng6WUt0KGwpO24ucG9pbnRzWzJdLng9dH1uLnBvaW50cz1bbi5wb2ludHNbMF0sbi5wb2ludHNbMV1dfW51bGwhPWwmJihuLnBvaW50c1tuLnBvaW50cy5sZW5ndGgtMV09JEt0KG4ucG9pbnRzW24ucG9pbnRzLmxlbmd0aC0yXSxsKSksbnVsbCE9cyYmKG4ucG9pbnRzWzBdPSRLdChuLnBvaW50c1sxXSxzKSksQ2UuZXhwb3J0cy5lYWNoKG4ucG9pbnRzLCh0PT57aT10Lng8aT90Lng6aSxvPXQueD5vP3QueDpvLHI9dC55PHI/dC55OnIsYT10Lnk+YT90Lnk6YX0pKX0pKSxDZS5leHBvcnRzLmVhY2godC5ub2RlcygpLChlPT57bGV0IG49dC5ub2RlKGUpO24ueC09aSxuLnktPXJ9KSksQ2UuZXhwb3J0cy5lYWNoKHQuZWRnZXMoKSwoZT0+e0NlLmV4cG9ydHMuZWFjaCh0LmVkZ2UoZSkucG9pbnRzLCh0PT57dC54LT1pLHQueS09cn0pKX0pKSx7d2lkdGg6by1pLGhlaWdodDphLXJ9fWZ1bmN0aW9uIHFLdCh0KXtzd2l0Y2godC5hbm5vdGF0aW9uVHlwZSl7Y2FzZSBMS3QuQ09OU1RBTlQ6Q2UuZXhwb3J0cy5leHRlbmQodCxVS3QuY29uc3RhbnQuc2l6ZSk7YnJlYWs7Y2FzZSBMS3QuU0hPUlRDVVQ6aWYodC5ub2RlLnR5cGU9PT1BJHQuT1ApQ2UuZXhwb3J0cy5leHRlbmQodCxVS3Quc2hvcnRjdXRTaXplLm9wKTtlbHNlIGlmKHQubm9kZS50eXBlPT09QSR0Lk1FVEEpQ2UuZXhwb3J0cy5leHRlbmQodCxVS3Quc2hvcnRjdXRTaXplLm1ldGEpO2Vsc2V7aWYodC5ub2RlLnR5cGUhPT1BJHQuU0VSSUVTKXRocm93IEVycm9yKCJJbnZhbGlkIG5vZGUgdHlwZTogIit0Lm5vZGUudHlwZSk7Q2UuZXhwb3J0cy5leHRlbmQodCxVS3Quc2hvcnRjdXRTaXplLnNlcmllcyl9YnJlYWs7Y2FzZSBMS3QuU1VNTUFSWTpDZS5leHBvcnRzLmV4dGVuZCh0LFVLdC5jb25zdGFudC5zaXplKX19ZnVuY3Rpb24gWUt0KHQpe2lmKHQuZXhwYW5kZWQpcmV0dXJuIHQueDtyZXR1cm4gdC54LXQud2lkdGgvMisodC5pbkFubm90YXRpb25zLmxpc3QubGVuZ3RoP3QuaW5ib3hXaWR0aDowKSt0LmNvcmVCb3gud2lkdGgvMn1mdW5jdGlvbiBYS3QodCxlKXtyZXR1cm4gMTgwKk1hdGguYXRhbigoZS55LXQueSkvKGUueC10LngpKS9NYXRoLlBJfWZ1bmN0aW9uICRLdCh0LGUpe2xldCBuLGkscj1lLmV4cGFuZGVkP2UueDpZS3QoZSksbz1lLnksYT10LngtcixzPXQueS1vLGw9ZS5leHBhbmRlZD9lLndpZHRoOmUuY29yZUJveC53aWR0aCxjPWUuZXhwYW5kZWQ/ZS5oZWlnaHQ6ZS5jb3JlQm94LmhlaWdodDtyZXR1cm4gTWF0aC5hYnMocykqbC8yPk1hdGguYWJzKGEpKmMvMj8oczwwJiYoYz0tYyksbj0wPT09cz8wOmMvMiphL3MsaT1jLzIpOihhPDAmJihsPS1sKSxuPWwvMixpPTA9PT1hPzA6bC8yKnMvYSkse3g6cituLHk6bytpfX1jb25zdCBLS3Q9YSR0LFpLdD1uJHQ7bGV0IEpLdD1be2JhY2tncm91bmRfY29sb3I6IiNDQzJGMkMiLGxhYmVsOiJOYU4ifSx7YmFja2dyb3VuZF9jb2xvcjoiI0ZGOEQwMCIsbGFiZWw6Ii3iiJ4ifSx7YmFja2dyb3VuZF9jb2xvcjoiI0VBRUFFQSIsbGFiZWw6Ii0ifSx7YmFja2dyb3VuZF9jb2xvcjoiI0E1QTVBNSIsbGFiZWw6IjAifSx7YmFja2dyb3VuZF9jb2xvcjoiIzI2MjYyNiIsbGFiZWw6IisifSx7YmFja2dyb3VuZF9jb2xvcjoiIzAwM0VENCIsbGFiZWw6IiviiJ4ifV07ZnVuY3Rpb24gUUt0KHQsZSxuKXtudWxsIT10LmF0dHIoInRyYW5zZm9ybSIpJiYodD10LnRyYW5zaXRpb24oInBvc2l0aW9uIikpLHQuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrZSsiLCIrbisiKSIpfWZ1bmN0aW9uIHRadCh0LGUsbixpLHIpe3QudHJhbnNpdGlvbigpLmF0dHIoIngiLGUtaS8yKS5hdHRyKCJ5IixuLXIvMikuYXR0cigid2lkdGgiLGkpLmF0dHIoImhlaWdodCIscil9ZnVuY3Rpb24gZVp0KHQsZSxuLGkscil7dC50cmFuc2l0aW9uKCkuYXR0cigiY3giLGUpLmF0dHIoImN5IixuKS5hdHRyKCJyeCIsaS8yKS5hdHRyKCJyeSIsci8yKX1mdW5jdGlvbiBuWnQodCxlKXtyZXR1cm4gZT90LnRvRml4ZWQoMCk6TWF0aC5hYnModCk+PTE/dC50b0ZpeGVkKDEpOnQudG9FeHBvbmVudGlhbCgxKX1mdW5jdGlvbiBpWnQodCxlLG4saSxyPTYwLG89MTAsYT0wLHMpe2lmKER1KHQucGFyZW50Tm9kZSkuc2VsZWN0QWxsKCIuaGVhbHRoLXBpbGwiKS5yZW1vdmUoKSwhZSlyZXR1cm47Y29uc3QgbD1lLnZhbHVlLGM9bC5zbGljZSgyLDgpLHU9Y1swXSxoPWNbMV0sZD1jWzVdO2xldCBwPWxbMV07Y29uc3QgZj17bWluOmxbOF0sbWF4OmxbOV0sbWVhbjpsWzEwXSxzdGRkZXY6TWF0aC5zcXJ0KGxbMTFdKX07bnVsbD09ciYmKHI9NjApLG51bGw9PW8mJihvPTEwKSxudWxsPT1hJiYoYT0wKSxudWxsIT1uJiZuLm5vZGUudHlwZT09PUEkdC5PUCYmKHIvPTIsby89Mik7bGV0IG09ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG8kdCwiZyIpO20uY2xhc3NMaXN0LmFkZCgiaGVhbHRoLXBpbGwiKTtsZXQgZz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobyR0LCJkZWZzIik7bS5hcHBlbmRDaGlsZChnKTtsZXQgXz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobyR0LCJsaW5lYXJHcmFkaWVudCIpO2NvbnN0IHk9ImhlYWx0aC1waWxsLWdyYWRpZW50LSIraTtfLnNldEF0dHJpYnV0ZSgiaWQiLHkpO2xldCB2PTAsYj0iMCUiO2ZvcihsZXQgdD0wO3Q8Yy5sZW5ndGg7dCsrKXtpZighY1t0XSljb250aW51ZTt2Kz1jW3RdO2xldCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhvJHQsInN0b3AiKTtlLnNldEF0dHJpYnV0ZSgib2Zmc2V0IixiKSxlLnNldEF0dHJpYnV0ZSgic3RvcC1jb2xvciIsSkt0W3RdLmJhY2tncm91bmRfY29sb3IpLF8uYXBwZW5kQ2hpbGQoZSk7bGV0IG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG8kdCwic3RvcCIpLGk9MTAwKnYvcCsiJSI7bi5zZXRBdHRyaWJ1dGUoIm9mZnNldCIsaSksbi5zZXRBdHRyaWJ1dGUoInN0b3AtY29sb3IiLEpLdFt0XS5iYWNrZ3JvdW5kX2NvbG9yKSxfLmFwcGVuZENoaWxkKG4pLGI9aX1nLmFwcGVuZENoaWxkKF8pO2xldCB4PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhvJHQsInJlY3QiKTt4LnNldEF0dHJpYnV0ZSgiZmlsbCIsInVybCgjIit5KyIpIikseC5zZXRBdHRyaWJ1dGUoIndpZHRoIixTdHJpbmcocikpLHguc2V0QXR0cmlidXRlKCJoZWlnaHQiLFN0cmluZyhvKSkseC5zZXRBdHRyaWJ1dGUoInkiLFN0cmluZyhhKSksbS5hcHBlbmRDaGlsZCh4KTtsZXQgdz1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMobyR0LCJ0aXRsZSIpO3cudGV4dENvbnRlbnQ9KGZ1bmN0aW9uIFModCxlLG4saSl7bGV0IHI9IkRldmljZTogIit0LmRldmljZV9uYW1lKyJcbiI7cis9ImR0eXBlOiAiK3QuZHR5cGUrIlxuIjtsZXQgbz0iKHNjYWxhcikiO3Quc2hhcGUubGVuZ3RoPjAmJihvPSIoIit0LnNoYXBlLmpvaW4oIiwiKSsiKSIpLHIrPSJcbnNoYXBlOiAiK28rIlxuXG4iLHIrPSIjKGVsZW1lbnRzKTogIitlKyJcbiI7Y29uc3QgYT1bXTtmb3IobGV0IHQ9MDt0PG4ubGVuZ3RoO3QrKyluW3RdPjAmJmEucHVzaCgiIygiK0pLdFt0XS5sYWJlbCsiKTogIituW3RdKTtyZXR1cm4gcis9YS5qb2luKCIsICIpKyJcblxuIixpLm1heD49aS5taW4mJihyKz0ibWluOiAiK2kubWluKyIsIG1heDogIitpLm1heCsiXG4iLHIrPSJtZWFuOiAiK2kubWVhbisiLCBzdGRkZXY6ICIraS5zdGRkZXYpLHJ9KShlLHAsYyxmKSxtLmFwcGVuZENoaWxkKHcpO2xldCBNPSExO2lmKG51bGwhPW4pe2xldCB0PW4ueS1vLW4uaGVpZ2h0LzItMjtpZihuLmxhYmVsT2Zmc2V0PDAmJih0Kz1uLmxhYmVsT2Zmc2V0KSxtLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrKG4ueC1yLzIpKyIsICIrdCsiKSIpLGNbMl18fGNbM118fGNbNF0pe2xldCB0PW4ubm9kZS5hdHRyO2lmKHQmJnQubGVuZ3RoKWZvcihsZXQgZT0wO2U8dC5sZW5ndGg7ZSsrKWlmKCJUIj09PXRbZV0ua2V5KXtsZXQgbj10W2VdLnZhbHVlLnR5cGU7TT1uJiYvXkRUXyhCT09MfElOVHxVSU5UKS8udGVzdChuKTticmVha319fWxldCBFPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhvJHQsInRleHQiKTtpZihOdW1iZXIuaXNGaW5pdGUoZi5taW4pJiZOdW1iZXIuaXNGaW5pdGUoZi5tYXgpKXtjb25zdCB0PW5adChmLm1pbixNKSxlPW5adChmLm1heCxNKTtpZihFLnRleHRDb250ZW50PXA+MT90KyIgfiAiK2U6dCx1PjB8fGg+MHx8ZD4wKXtFLnRleHRDb250ZW50Kz0iICgiO2NvbnN0IHQ9W107dT4wJiZ0LnB1c2goYE5hTsOXJHt1fWApLGg+MCYmdC5wdXNoKGAt4oiew5cke2h9YCksZD4wJiZ0LnB1c2goYCviiJ7DlyR7ZH1gKSxFLnRleHRDb250ZW50Kz10LmpvaW4oIjsgIikrIikifX1lbHNlIEUudGV4dENvbnRlbnQ9IihObyBmaW5pdGUgZWxlbWVudHMpIjtFLmNsYXNzTGlzdC5hZGQoImhlYWx0aC1waWxsLXN0YXRzIiksbnVsbD09cyYmKHM9ci8yKSxFLnNldEF0dHJpYnV0ZSgieCIsU3RyaW5nKHMpKSxFLnNldEF0dHJpYnV0ZSgieSIsU3RyaW5nKGEtMikpLG0uYXBwZW5kQ2hpbGQoRSksZXIodC5wYXJlbnROb2RlKS5hcHBlbmRDaGlsZChtKX12YXIgclp0O2Z1bmN0aW9uIG9adCh0LGUpe2NvbnN0IG49dC5nZXRDb250ZXh0TWVudSgpLGk9RHUodC5nZXRDb250ZXh0TWVudSgpKTtyZXR1cm4gZnVuY3Rpb24ocixvKXtsZXQgYT1NdTtjb25zdCBzPShmdW5jdGlvbiBsKHQpe2xldCBlPTAsbj0wLGk9dDtmb3IoO2kmJmkub2Zmc2V0TGVmdD49MCYmaS5vZmZzZXRUb3A+PTA7KWUrPWkub2Zmc2V0TGVmdC1pLnNjcm9sbExlZnQsbis9aS5vZmZzZXRUb3AtaS5zY3JvbGxUb3AsaT1pLm9mZnNldFBhcmVudDtyZXR1cm57bGVmdDplLHRvcDpufX0pKHQpO2Z1bmN0aW9uIGModCl7dCYmdC5jb21wb3NlZFBhdGgoKS5pbmNsdWRlcyhuKXx8KGkuc3R5bGUoImRpc3BsYXkiLCJub25lIiksZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZWRvd24iLGMse2NhcHR1cmU6ITB9KSl9aS5zdHlsZSgiZGlzcGxheSIsImJsb2NrIikuc3R5bGUoImxlZnQiLGEuY2xpZW50WC1zLmxlZnQrMSsicHgiKS5zdHlsZSgidG9wIixhLmNsaWVudFktcy50b3ArMSsicHgiKSxhLnByZXZlbnREZWZhdWx0KCksYS5zdG9wUHJvcGFnYXRpb24oKSxkb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsYyx7Y2FwdHVyZTohMH0pLGkuaHRtbCgiIiksaS5hcHBlbmQoInVsIikuc2VsZWN0QWxsKCJsaSIpLmRhdGEoZSkuZW50ZXIoKS5hcHBlbmQoImxpIikub24oImNsaWNrIiwoKHQsZSk9Pnt0LmFjdGlvbih0aGlzLHIsbyksYygpfSkpLmh0bWwoKGZ1bmN0aW9uKHQpe3JldHVybiB0LnRpdGxlKHIpfSkpfX0hKGZ1bmN0aW9uKHQpe3QuTk9ORT0ibm9uZSIsdC5DT01QVVRFX1RJTUU9ImNvbXB1dGVfdGltZSIsdC5ERVZJQ0U9ImRldmljZSIsdC5NRU1PUlk9Im1lbW9yeSIsdC5PUF9DT01QQVRJQklMSVRZPSJvcF9jb21wYXRpYmlsaXR5Iix0LlNUUlVDVFVSRT0ic3RydWN0dXJlIix0LlhMQV9DTFVTVEVSPSJ4bGFfY2x1c3RlciJ9KShyWnR8fChyWnQ9e30pKTtsZXQgYVp0PUFFKCkuZG9tYWluKFtjJHQsMTJdKS5yYW5nZShbInNtYWxsIiwibWVkaXVtIiwibGFyZ2UiLCJ4bGFyZ2UiXSk7ZnVuY3Rpb24gc1p0KHQpe3JldHVybiB0LnYrIi0tIit0Lnd9ZnVuY3Rpb24gbFp0KHQsZSxuKXtjb25zdCBpPW47bGV0IHI9W107cj1DZS5leHBvcnRzLnJlZHVjZShlLmVkZ2VzKCksKCh0LG4pPT57bGV0IGk9ZS5lZGdlKG4pO3JldHVybiB0LnB1c2goe3Y6bi52LHc6bi53LGxhYmVsOml9KSx0fSkscik7bGV0IG89cyR0KHQsImciLG4kdC5FZGdlLkNPTlRBSU5FUikuc2VsZWN0QWxsKChmdW5jdGlvbigpe3JldHVybiB0aGlzLmNoaWxkTm9kZXN9KSkuZGF0YShyLHNadCk7cmV0dXJuIG8uZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsbiR0LkVkZ2UuR1JPVVApLmF0dHIoImRhdGEtZWRnZSIsc1p0KS5lYWNoKChmdW5jdGlvbih0KXtsZXQgZT1EdSh0aGlzKTt0LmxhYmVsLmVkZ2VHcm91cD1lLGkuX2VkZ2VHcm91cEluZGV4W3NadCh0KV09ZSxpLmhhbmRsZUVkZ2VTZWxlY3RlZCYmZS5vbigiY2xpY2siLCh0PT57TXUuc3RvcFByb3BhZ2F0aW9uKCksaS5maXJlKCJlZGdlLXNlbGVjdCIse2VkZ2VEYXRhOnQsZWRnZUdyb3VwOmV9KX0pKSxwWnQoZSx0LGkpfSkpLm1lcmdlKG8pLmVhY2goKGZ1bmN0aW9uKCl7IShmdW5jdGlvbiB0KGUsbil7RHUobikuc2VsZWN0KCJwYXRoLiIrbiR0LkVkZ2UuTElORSkudHJhbnNpdGlvbigpLmF0dHJUd2VlbigiZCIsKGZ1bmN0aW9uKHQsbixpKXtyZXR1cm4oZnVuY3Rpb24gcih0LGUsbixpLG8pe2xldCBhPW4ubGFiZWwscz1hLmFkam9pbmluZ01ldGFlZGdlLGw9YS5wb2ludHM7Y29uc3R7c2hhZG93Um9vdDpjfT10O24ubGFiZWwuc3RhcnRNYXJrZXJJZCYmKGw9ZFp0KGwsRHUoYy5xdWVyeVNlbGVjdG9yKCIjIituLmxhYmVsLnN0YXJ0TWFya2VySWQpKSwhMCkpO24ubGFiZWwuZW5kTWFya2VySWQmJihsPWRadChsLER1KGMucXVlcnlTZWxlY3RvcigiIyIrbi5sYWJlbC5lbmRNYXJrZXJJZCkpLCExKSk7aWYoIXMpcmV0dXJuIGNwKG8sZlp0KGwpKTtsZXQgdT1zLmVkZ2VHcm91cC5ub2RlKCkuZmlyc3RDaGlsZCxoPWEubWV0YWVkZ2UuaW5ib3VuZDtyZXR1cm4gZnVuY3Rpb24odCl7bGV0IG49dS5nZXRQb2ludEF0TGVuZ3RoKGg/dS5nZXRUb3RhbExlbmd0aCgpOjApLm1hdHJpeFRyYW5zZm9ybSh1LmdldENUTSgpKS5tYXRyaXhUcmFuc2Zvcm0oZS5nZXRDVE0oKS5pbnZlcnNlKCkpLGk9aD8wOmwubGVuZ3RoLTE7cmV0dXJuIGxbaV0ueD1uLngsbFtpXS55PW4ueSxmWnQobCl9fSkoZSx0aGlzLHQsMCxpKX0pKX0pKG4sdGhpcyl9KSkuZWFjaCgoZnVuY3Rpb24odCl7IShmdW5jdGlvbiBlKHQsbixpKXt0LmNsYXNzZWQoImZhZGVkIixuLmxhYmVsLmlzRmFkZWRPdXQpO2xldCByPW4ubGFiZWwubWV0YWVkZ2U7dC5zZWxlY3QoInBhdGguIituJHQuRWRnZS5MSU5FKS5jbGFzc2VkKCJjb250cm9sLWRlcCIsciYmIXIubnVtUmVndWxhckVkZ2VzKX0pKER1KHRoaXMpLHQpfSkpLG8uZXhpdCgpLmVhY2goKHQ9PntkZWxldGUgaS5fZWRnZUdyb3VwSW5kZXhbc1p0KHQpXX0pKS5yZW1vdmUoKSxvfWZ1bmN0aW9uIGNadCh0LGUpe2xldCBuPWUuZ2V0Tm9kZUJ5TmFtZSh0LnYpO2lmKG51bGw9PW4ub3V0cHV0U2hhcGVzfHxDZS5leHBvcnRzLmlzRW1wdHkobi5vdXRwdXRTaGFwZXMpKXJldHVybiBudWxsO2xldCBpPW4ub3V0cHV0U2hhcGVzW3Qub3V0cHV0VGVuc29yS2V5XTtyZXR1cm4gbnVsbD09aT9udWxsOjA9PT1pLmxlbmd0aD8ic2NhbGFyIjppLm1hcCgodD0+LTE9PT10PyI/Ijp0KSkuam9pbigiw5ciKX1mdW5jdGlvbiB1WnQodCxlKXtpZihlLmVkZ2VMYWJlbEZ1bmN0aW9uKXJldHVybiBlLmVkZ2VMYWJlbEZ1bmN0aW9uKHQsZSk7cmV0dXJuIHQuYmFzZUVkZ2VMaXN0Lmxlbmd0aD4xP3QuYmFzZUVkZ2VMaXN0Lmxlbmd0aCsiIHRlbnNvcnMiOmNadCh0LmJhc2VFZGdlTGlzdFswXSxlKX1mdW5jdGlvbiBoWnQodCxlLG4pe2NvbnN0IGk9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKG8kdCwicGF0aCIpO2ZvcihsZXQgcj0xO3I8dC5sZW5ndGg7cisrKWlmKGkuc2V0QXR0cmlidXRlKCJkIixuKHQuc2xpY2UoMCxyKSkpLGkuZ2V0VG90YWxMZW5ndGgoKT5lKXJldHVybiByLTE7cmV0dXJuIHQubGVuZ3RoLTF9ZnVuY3Rpb24gZFp0KHQsZSxuKXtsZXQgaT1ETCgpLngoKHQ9PnQueCkpLnkoKHQ9PnQueSkpLHI9RHUoZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsInBhdGgiKSkuYXR0cigiZCIsaSh0KSksbz0rZS5hdHRyKCJtYXJrZXJXaWR0aCIpLGE9ZS5hdHRyKCJ2aWV3Qm94Iikuc3BsaXQoIiAiKS5tYXAoTnVtYmVyKSxzPWFbMl0tYVswXSxsPStlLmF0dHIoInJlZlgiKSxjPXIubm9kZSgpO2lmKG4pe2NvbnN0IGU9byooMS1sL3MpLG49Yy5nZXRQb2ludEF0TGVuZ3RoKGUpLHI9aFp0KHQsZSxpKTtyZXR1cm4gdFtyLTFdPXt4Om4ueCx5Om4ueX0sdC5zbGljZShyLTEpfXtjb25zdCBlPTEtbC9zLG49Yy5nZXRUb3RhbExlbmd0aCgpLW8qZSxyPWMuZ2V0UG9pbnRBdExlbmd0aChuKSxhPWhadCh0LG4saSk7cmV0dXJuIHRbYV09e3g6ci54LHk6ci55fSx0LnNsaWNlKDAsYSsxKX19ZnVuY3Rpb24gcFp0KHQsZSxuLGkpe2k9aXx8biR0LkVkZ2UuTElORSxlLmxhYmVsJiZlLmxhYmVsLnN0cnVjdHVyYWwmJihpKz0iICIrbiR0LkVkZ2UuU1RSVUNUVVJBTCksZS5sYWJlbCYmZS5sYWJlbC5tZXRhZWRnZSYmZS5sYWJlbC5tZXRhZWRnZS5udW1SZWZFZGdlcyYmKGkrPSIgIituJHQuRWRnZS5SRUZFUkVOQ0VfRURHRSksbi5oYW5kbGVFZGdlU2VsZWN0ZWQmJihpKz0iICIrbiR0LkVkZ2UuU0VMRUNUQUJMRSk7bGV0IHIsbz0icGF0aF8iK3NadChlKTtpZihuLnJlbmRlckhpZXJhcmNoeS5lZGdlV2lkdGhGdW5jdGlvbilyPW4ucmVuZGVySGllcmFyY2h5LmVkZ2VXaWR0aEZ1bmN0aW9uKGUsaSk7ZWxzZXtsZXQgdD0xO251bGwhPWUubGFiZWwmJm51bGwhPWUubGFiZWwubWV0YWVkZ2UmJih0PWUubGFiZWwubWV0YWVkZ2UudG90YWxTaXplKSxyPW4ucmVuZGVySGllcmFyY2h5LmVkZ2VXaWR0aFNpemVkQmFzZWRTY2FsZSh0KX1sZXQgYT10LmFwcGVuZCgicGF0aCIpLmF0dHIoImlkIixvKS5hdHRyKCJjbGFzcyIsaSkuc3R5bGUoInN0cm9rZS13aWR0aCIscisicHgiKTtpZihlLmxhYmVsJiZlLmxhYmVsLm1ldGFlZGdlKWlmKGUubGFiZWwubWV0YWVkZ2UubnVtUmVmRWRnZXMpe2NvbnN0IHQ9YHJlZmVyZW5jZS1hcnJvd2hlYWQtJHthWnQocil9YDthLnN0eWxlKCJtYXJrZXItc3RhcnQiLGB1cmwoIyR7dH0pYCksZS5sYWJlbC5zdGFydE1hcmtlcklkPXR9ZWxzZXtjb25zdCB0PWBkYXRhZmxvdy1hcnJvd2hlYWQtJHthWnQocil9YDthLnN0eWxlKCJtYXJrZXItZW5kIixgdXJsKCMke3R9KWApLGUubGFiZWwuZW5kTWFya2VySWQ9dH1pZihudWxsPT1lLmxhYmVsfHxudWxsPT1lLmxhYmVsLm1ldGFlZGdlKXJldHVybjtsZXQgcz11WnQoZS5sYWJlbC5tZXRhZWRnZSxuLnJlbmRlckhpZXJhcmNoeSk7bnVsbCE9cyYmdC5hcHBlbmQoInRleHQiKS5hcHBlbmQoInRleHRQYXRoIikuYXR0cigieGxpbms6aHJlZiIsIiMiK28pLmF0dHIoInN0YXJ0T2Zmc2V0IiwiNTAlIikuYXR0cigidGV4dC1hbmNob3IiLCJtaWRkbGUiKS5hdHRyKCJkb21pbmFudC1iYXNlbGluZSIsImNlbnRyYWwiKS50ZXh0KHMpfWxldCBmWnQ9REwoKS5jdXJ2ZSh3UCkueCgodD0+dC54KSkueSgodD0+dC55KSk7ZnVuY3Rpb24gbVp0KHQsZSxuKXtsZXQgaT1zJHQodCwiZyIsbiR0Lk5vZGUuQ09OVEFJTkVSKS5zZWxlY3RBbGwoKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGROb2Rlc30pKS5kYXRhKGUsKHQ9PnQubm9kZS5uYW1lKyI6Iit0Lm5vZGUudHlwZSkpO3JldHVybiBpLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiZGF0YS1uYW1lIiwodD0+dC5ub2RlLm5hbWUpKS5lYWNoKChmdW5jdGlvbih0KXtsZXQgZT1EdSh0aGlzKTtuLmFkZE5vZGVHcm91cCh0Lm5vZGUubmFtZSxlKX0pKS5tZXJnZShpKS5hdHRyKCJjbGFzcyIsKHQ9Pm4kdC5Ob2RlLkdST1VQKyIgIitUWnQodCkpKS5lYWNoKChmdW5jdGlvbih0KXtsZXQgZT1EdSh0aGlzKTt6WnQocyR0KGUsImciLG4kdC5Bbm5vdGF0aW9uLklOQk9YKSx0LmluQW5ub3RhdGlvbnMsdCxuKSx6WnQocyR0KGUsImciLG4kdC5Bbm5vdGF0aW9uLk9VVEJPWCksdC5vdXRBbm5vdGF0aW9ucyx0LG4pO2xldCBpPUVadChlLHQsbiR0Lk5vZGUuU0hBUEUpO3Qubm9kZS5pc0dyb3VwTm9kZSYmKGZ1bmN0aW9uIHIodCxlLG4pe2xldCBpPXMkdCh0LCJnIixuJHQuTm9kZS5CVVRUT05fQ09OVEFJTkVSKTtzJHQoaSwiY2lyY2xlIixuJHQuTm9kZS5CVVRUT05fQ0lSQ0xFKSxzJHQoaSwicGF0aCIsbiR0Lk5vZGUuRVhQQU5EX0JVVFRPTikuYXR0cigiZCIsIk0wLC0yLjIgVjIuMiBNLTIuMiwwIEgyLjIiKSxzJHQoaSwicGF0aCIsbiR0Lk5vZGUuQ09MTEFQU0VfQlVUVE9OKS5hdHRyKCJkIiwiTS0yLjIsMCBIMi4yIiksaS5vbigiY2xpY2siLCh0PT57TXUuc3RvcFByb3BhZ2F0aW9uKCksbi5maXJlKCJub2RlLXRvZ2dsZS1leHBhbmQiLHtuYW1lOnQubm9kZS5uYW1lfSl9KSksKGZ1bmN0aW9uIHIodCxlKXtsZXQgbj1ZS3QoZSkrKGUuZXhwYW5kZWQ/ZS53aWR0aDplLmNvcmVCb3gud2lkdGgpLzItNixpPWUueS0oZS5leHBhbmRlZD9lLmhlaWdodDplLmNvcmVCb3guaGVpZ2h0KS8yKzY7ZS5ub2RlLnR5cGUhPT1BJHQuU0VSSUVTfHxlLmV4cGFuZGVkfHwobis9MTAsaS09Mik7bGV0IHI9InRyYW5zbGF0ZSgiK24rIiwiK2krIikiO3Quc2VsZWN0QWxsKCJwYXRoIikudHJhbnNpdGlvbigpLmF0dHIoInRyYW5zZm9ybSIsciksdC5zZWxlY3QoImNpcmNsZSIpLnRyYW5zaXRpb24oKS5hdHRyKHtjeDpuLGN5OmkscjpVS3Qubm9kZVNpemUubWV0YS5leHBhbmRCdXR0b25SYWRpdXN9KX0pKGksZSl9KShpLHQsbiksX1p0KGksdCxuKSwoZnVuY3Rpb24gbyh0LGUsbil7aWYoZS5ub2RlLmlzR3JvdXBOb2RlKXtpZihlLmV4cGFuZGVkKXJldHVybiBCWnQodCxlLG4sbiR0LlN1YnNjZW5lLkdST1VQKTtLS3QodCwiZyIsbiR0LlN1YnNjZW5lLkdST1VQKS5yZW1vdmUoKX1yZXR1cm4gbnVsbH0pKGUsdCxuKSxfWnQoKGZ1bmN0aW9uIGEodCxlLG4pe2xldCBpPWUuZGlzcGxheU5hbWUscj1lLm5vZGUudHlwZT09PUEkdC5NRVRBJiYhZS5leHBhbmRlZCxvPXMkdCh0LCJ0ZXh0IixuJHQuTm9kZS5MQUJFTCksYT1vLm5vZGUoKTthLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQoYSksby5hdHRyKCJkeSIsIi4zNWVtIikuYXR0cigidGV4dC1hbmNob3IiLCJtaWRkbGUiKTtsZXQgcz04O3N3aXRjaChlLm5vZGUudHlwZSl7Y2FzZSBBJHQuTUVUQTpzPWUuZXhwYW5kZWQ/ciR0LkVYUEFOREVEX0xBQkVMOnIkdC5TRVJJRVNfTEFCRUw7YnJlYWs7Y2FzZSBBJHQuT1A6cz1yJHQuT1BfTEFCRUx9aWYocil7aS5sZW5ndGg+bi5tYXhNZXRhbm9kZUxhYmVsTGVuZ3RoJiYoaT1pLnN1YnN0cigwLG4ubWF4TWV0YW5vZGVMYWJlbExlbmd0aC0yKSsi4oCmIik7bGV0IHQ9KGZ1bmN0aW9uIGwodCl7U1p0fHwoU1p0PWNFKCkuZG9tYWluKFt0Lm1heE1ldGFub2RlTGFiZWxMZW5ndGhMYXJnZUZvbnQsdC5tYXhNZXRhbm9kZUxhYmVsTGVuZ3RoXSkucmFuZ2UoW3QubWF4TWV0YW5vZGVMYWJlbExlbmd0aEZvbnRTaXplLHQubWluTWV0YW5vZGVMYWJlbExlbmd0aEZvbnRTaXplXSkuY2xhbXAoITApKTtyZXR1cm4gU1p0fSkobik7by5hdHRyKCJmb250LXNpemUiLHQoaS5sZW5ndGgpKyJweCIpLHM9dChpLmxlbmd0aCl9cmV0dXJuIHdadChvLnRleHQoaSksZS5ub2RlLnR5cGUscyxlKSxvfSkoZSx0LG4pLHQsbix0Lm5vZGUudHlwZT09PUEkdC5NRVRBKSxMWnQoZSx0LG4pLChmdW5jdGlvbiBzKHQsZSl7bGV0IG49S0t0KHQsImciLG4kdC5Ob2RlLlNIQVBFKSxpPVlLdChlKTtzd2l0Y2goZS5ub2RlLnR5cGUpe2Nhc2UgQSR0Lk9QOntjb25zdCByPWUubm9kZTtpZihDZS5leHBvcnRzLmlzTnVtYmVyKHIuZnVuY3Rpb25JbnB1dEluZGV4KXx8Q2UuZXhwb3J0cy5pc051bWJlcihyLmZ1bmN0aW9uT3V0cHV0SW5kZXgpKXshKGZ1bmN0aW9uIHIodCxlLG4saSxvKXtjb25zdCBhPW8vMixzPWkvMixsPVtbZSxuLWFdLFtlK3MsbithXSxbZS1zLG4rYV1dO3QudHJhbnNpdGlvbigpLmF0dHIoInBvaW50cyIsbC5tYXAoKHQ9PnQuam9pbigiLCIpKSkuam9pbigiICIpKX0pKEtLdChuLCJwb2x5Z29uIiksZS54LGUueSxlLmNvcmVCb3gud2lkdGgsZS5jb3JlQm94LmhlaWdodCl9ZWxzZXtlWnQoS0t0KG4sImVsbGlwc2UiKSxpLGUueSxlLmNvcmVCb3gud2lkdGgsZS5jb3JlQm94LmhlaWdodCl9TVp0KHQsaSxlLnksZS5sYWJlbE9mZnNldCk7YnJlYWt9Y2FzZSBBJHQuTUVUQTp7bGV0IHI9bi5zZWxlY3RBbGwoInJlY3QiKTtlLmV4cGFuZGVkPyh0WnQocixlLngsZS55LGUud2lkdGgsZS5oZWlnaHQpLGdadCh0LGUpLE1adCh0LGksZS55LC1lLmhlaWdodC8yK2UubGFiZWxIZWlnaHQvMikpOih0WnQocixpLGUueSxlLmNvcmVCb3gud2lkdGgsZS5jb3JlQm94LmhlaWdodCksTVp0KHQsaSxlLnksMCkpO2JyZWFrfWNhc2UgQSR0LlNFUklFUzp7bGV0IHI9S0t0KG4sInVzZSIpO2UuZXhwYW5kZWQ/KHRadChyLGUueCxlLnksZS53aWR0aCxlLmhlaWdodCksZ1p0KHQsZSksTVp0KHQsaSxlLnksLWUuaGVpZ2h0LzIrZS5sYWJlbEhlaWdodC8yKSk6KHRadChyLGksZS55LGUuY29yZUJveC53aWR0aCxlLmNvcmVCb3guaGVpZ2h0KSxNWnQodCxpLGUueSxlLmxhYmVsT2Zmc2V0KSk7YnJlYWt9Y2FzZSBBJHQuQlJJREdFOnRadChLS3QobiwicmVjdCIpLGUueCxlLnksZS53aWR0aCxlLmhlaWdodCk7YnJlYWs7ZGVmYXVsdDp0aHJvdyBFcnJvcigiVW5yZWNvZ25pemVkIG5vZGUgdHlwZTogIitlLm5vZGUudHlwZSl9fSkoZSx0KX0pKSxpLmV4aXQoKS5lYWNoKChmdW5jdGlvbih0KXtuLnJlbW92ZU5vZGVHcm91cCh0Lm5vZGUubmFtZSk7bGV0IGU9RHUodGhpcyk7dC5pbkFubm90YXRpb25zLmxpc3QubGVuZ3RoPjAmJmUuc2VsZWN0KCIuIituJHQuQW5ub3RhdGlvbi5JTkJPWCkuc2VsZWN0QWxsKCIuIituJHQuQW5ub3RhdGlvbi5HUk9VUCkuZWFjaCgoZT0+e24ucmVtb3ZlQW5ub3RhdGlvbkdyb3VwKGUsdCl9KSksdC5vdXRBbm5vdGF0aW9ucy5saXN0Lmxlbmd0aD4wJiZlLnNlbGVjdCgiLiIrbiR0LkFubm90YXRpb24uT1VUQk9YKS5zZWxlY3RBbGwoIi4iK24kdC5Bbm5vdGF0aW9uLkdST1VQKS5lYWNoKChlPT57bi5yZW1vdmVBbm5vdGF0aW9uR3JvdXAoZSx0KX0pKX0pKS5yZW1vdmUoKSxpfWZ1bmN0aW9uIGdadCh0LGUpe2xldCBuPWUueC1lLndpZHRoLzIrZS5wYWRkaW5nTGVmdCxpPWUueS1lLmhlaWdodC8yK2UucGFkZGluZ1RvcDtRS3QoS0t0KHQsImciLG4kdC5TdWJzY2VuZS5HUk9VUCksbixpKX1mdW5jdGlvbiBfWnQodCxlLG4saSl7aWYoaSlyZXR1cm4gdm9pZCB0LmF0dHIoInBvaW50ZXItZXZlbnRzIiwibm9uZSIpO2xldCByPW9adChuLHladChlLm5vZGUsbikpO3Qub24oImRibGNsaWNrIiwodD0+e24uZmlyZSgibm9kZS10b2dnbGUtZXhwYW5kIix7bmFtZTp0Lm5vZGUubmFtZX0pfSkpLm9uKCJtb3VzZW92ZXIiLCh0PT57bi5pc05vZGVFeHBhbmRlZCh0KXx8bi5maXJlKCJub2RlLWhpZ2hsaWdodCIse25hbWU6dC5ub2RlLm5hbWV9KX0pKS5vbigibW91c2VvdXQiLCh0PT57bi5pc05vZGVFeHBhbmRlZCh0KXx8bi5maXJlKCJub2RlLXVuaGlnaGxpZ2h0Iix7bmFtZTp0Lm5vZGUubmFtZX0pfSkpLm9uKCJjbGljayIsKHQ9PntNdS5zdG9wUHJvcGFnYXRpb24oKSxuLmZpcmUoIm5vZGUtc2VsZWN0Iix7bmFtZTp0Lm5vZGUubmFtZX0pfSkpLm9uKCJjb250ZXh0bWVudSIsKCh0LGUpPT57bi5maXJlKCJub2RlLXNlbGVjdCIse25hbWU6dC5ub2RlLm5hbWV9KSxyLmNhbGwodCxlKX0pKX1mdW5jdGlvbiB5WnQodCxlKXtsZXQgbj1be3RpdGxlOmU9PkokdCh0LmluY2x1ZGUpLGFjdGlvbjoobixpLHIpPT57ZS5maXJlKCJub2RlLXRvZ2dsZS1leHRyYWN0Iix7bmFtZTp0Lm5hbWV9KX19XTtyZXR1cm4gZS5ub2RlQ29udGV4dE1lbnVJdGVtcyYmKG49bi5jb25jYXQoZS5ub2RlQ29udGV4dE1lbnVJdGVtcykpLHZadCh0KSYmbi5wdXNoKHt0aXRsZTplPT54WnQodCksYWN0aW9uOihuLGkscik9PntlLmZpcmUoIm5vZGUtdG9nZ2xlLXNlcmllc2dyb3VwIix7bmFtZTpiWnQodCl9KX19KSxufWZ1bmN0aW9uIHZadCh0KXtyZXR1cm4gbnVsbCE9PWJadCh0KX1mdW5jdGlvbiBiWnQodCl7aWYoIXQpcmV0dXJuIG51bGw7aWYodC50eXBlPT09QSR0LlNFUklFUylyZXR1cm4gdC5uYW1lO2lmKHQudHlwZT09PUEkdC5PUCl7cmV0dXJuIHQub3duaW5nU2VyaWVzfXJldHVybiBudWxsfWZ1bmN0aW9uIHhadCh0KXtyZXR1cm4oZnVuY3Rpb24gbih0KXtyZXR1cm4gdD09PUwkdC5HUk9VUD8iVW5ncm91cCB0aGlzIHNlcmllcyBvZiBub2RlcyI6Ikdyb3VwIHRoaXMgc2VyaWVzIG9mIG5vZGVzIn0pKG51bGwhPT0oZnVuY3Rpb24gZSh0KXtsZXQgZT1udWxsO3JldHVybiB0Pyh0LnR5cGU9PT1BJHQuU0VSSUVTP2U9dDp0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS50eXBlPT09QSR0LlNFUklFUyYmKGU9dC5wYXJlbnROb2RlKSxlKTpudWxsfSkodCk/TCR0LkdST1VQOkwkdC5VTkdST1VQKX1mdW5jdGlvbiB3WnQodCxlLG4saSl7bGV0IHI9dC5ub2RlKCksbz1yLnRleHRDb250ZW50LGE9bnVsbDtzd2l0Y2goZSl7Y2FzZSBBJHQuTUVUQTppJiYhaS5leHBhbmRlZCYmKGE9VUt0Lm5vZGVTaXplLm1ldGEubWF4TGFiZWxXaWR0aCk7YnJlYWs7Y2FzZSBBJHQuT1A6YT1VS3Qubm9kZVNpemUub3AubWF4TGFiZWxXaWR0aDticmVhaztjYXNlLTE6YT1VS3QuYW5ub3RhdGlvbnMubWF4TGFiZWxXaWR0aH1pZihudWxsIT09YSlyZXR1cm4gci50ZXh0Q29udGVudD0oZnVuY3Rpb24gcyh0LGUsbil7aWYoIXQpcmV0dXJuIiI7aWYoUyR0KHQsZSk8PW4pcmV0dXJuIHQ7bGV0IGk9MCxyPXQubGVuZ3RoO2Zvcig7aTxyOyl7Y29uc3Qgbz1pK01hdGgucm91bmQoKHItaSkvMik7UyR0KHQuc2xpY2UoMCxvKSsi4oCmIixlKTw9bj9pPW86cj1vLTF9cmV0dXJuIDA9PT1pP3RbMF06dC5zbGljZSgwLGkpKyLigKYifSkoci50ZXh0Q29udGVudCxuLGEpLHQuYXBwZW5kKCJ0aXRsZSIpLnRleHQobyl9bGV0IFNadD1udWxsO2Z1bmN0aW9uIE1adCh0LGUsbixpKXtLS3QodCwidGV4dCIsbiR0Lk5vZGUuTEFCRUwpLnRyYW5zaXRpb24oKS5hdHRyKCJ4IixlKS5hdHRyKCJ5IixuK2kpfWZ1bmN0aW9uIEVadCh0LGUsbil7bGV0IGk9cyR0KHQsImciLG4pO3N3aXRjaChlLm5vZGUudHlwZSl7Y2FzZSBBJHQuT1A6Y29uc3QgdD1lLm5vZGU7aWYoQ2UuZXhwb3J0cy5pc051bWJlcih0LmZ1bmN0aW9uSW5wdXRJbmRleCl8fENlLmV4cG9ydHMuaXNOdW1iZXIodC5mdW5jdGlvbk91dHB1dEluZGV4KSl7cyR0KGksInBvbHlnb24iLG4kdC5Ob2RlLkNPTE9SX1RBUkdFVCk7YnJlYWt9cyR0KGksImVsbGlwc2UiLG4kdC5Ob2RlLkNPTE9SX1RBUkdFVCk7YnJlYWs7Y2FzZSBBJHQuU0VSSUVTOmxldCBuPSJhbm5vdGF0aW9uIixyPWU7ci5jb3JlR3JhcGgmJihuPXIubm9kZS5oYXNOb25Db250cm9sRWRnZXM/InZlcnRpY2FsIjoiaG9yaXpvbnRhbCIpO2xldCBvPVtuJHQuTm9kZS5DT0xPUl9UQVJHRVRdO3IuaXNGYWRlZE91dCYmby5wdXNoKCJmYWRlZC1lbGxpcHNlIikscyR0KGksInVzZSIsbykuYXR0cigieGxpbms6aHJlZiIsIiNvcC1zZXJpZXMtIituKyItc3RhbXAiKSxzJHQoaSwicmVjdCIsbiR0Lk5vZGUuQ09MT1JfVEFSR0VUKS5hdHRyKCJyeCIsZS5yYWRpdXMpLmF0dHIoInJ5IixlLnJhZGl1cyk7YnJlYWs7Y2FzZSBBJHQuQlJJREdFOmNhc2UgQSR0Lk1FVEE6cyR0KGksInJlY3QiLG4kdC5Ob2RlLkNPTE9SX1RBUkdFVCkuYXR0cigicngiLGUucmFkaXVzKS5hdHRyKCJyeSIsZS5yYWRpdXMpO2JyZWFrO2RlZmF1bHQ6dGhyb3cgRXJyb3IoIlVucmVjb2duaXplZCBub2RlIHR5cGU6ICIrZS5ub2RlLnR5cGUpfXJldHVybiBpfWZ1bmN0aW9uIFRadCh0KXtzd2l0Y2godC5ub2RlLnR5cGUpe2Nhc2UgQSR0Lk9QOnJldHVybiBuJHQuT1BOT0RFO2Nhc2UgQSR0Lk1FVEE6cmV0dXJuIG4kdC5NRVRBTk9ERTtjYXNlIEEkdC5TRVJJRVM6cmV0dXJuIG4kdC5TRVJJRVNOT0RFO2Nhc2UgQSR0LkJSSURHRTpyZXR1cm4gbiR0LkJSSURHRU5PREU7Y2FzZSBBJHQuRUxMSVBTSVM6cmV0dXJuIG4kdC5FTExJUFNJU05PREV9dGhyb3cgRXJyb3IoIlVucmVjb2duaXplZCBub2RlIHR5cGU6ICIrdC5ub2RlLnR5cGUpfWZ1bmN0aW9uIENadCh0LGUsbil7bGV0IGk9KGZ1bmN0aW9uIHIodCl7cmV0dXJuIHQucmVwbGFjZSgvKFs6LlxbXF0sL1xcXChcKV0pL2csIlxcJDEiKX0pKHQpO2lmKCFuKXJldHVybmB1cmwoIyR7aX0pYDtsZXQgbz1EdShuKSxhPW8uc2VsZWN0KCJkZWZzI19ncmFwaC1ncmFkaWVudHMiKTthLmVtcHR5KCkmJihhPW8uYXBwZW5kKCJkZWZzIikuYXR0cigiaWQiLCJfZ3JhcGgtZ3JhZGllbnRzIikpO2xldCBzPWEuc2VsZWN0KCJsaW5lYXJHcmFkaWVudCMiK2kpO2lmKHMuZW1wdHkoKSl7cz1hLmFwcGVuZCgibGluZWFyR3JhZGllbnQiKS5hdHRyKCJpZCIsdCkscy5zZWxlY3RBbGwoIioiKS5yZW1vdmUoKTtsZXQgbj0wO0NlLmV4cG9ydHMuZWFjaChlLCh0PT57bGV0IGU9dC5jb2xvcjtzLmFwcGVuZCgic3RvcCIpLmF0dHIoIm9mZnNldCIsbikuYXR0cigic3RvcC1jb2xvciIsZSkscy5hcHBlbmQoInN0b3AiKS5hdHRyKCJvZmZzZXQiLG4rdC5wcm9wb3J0aW9uKS5hdHRyKCJzdG9wLWNvbG9yIixlKSxuKz10LnByb3BvcnRpb259KSl9cmV0dXJuYHVybCgjJHtpfSlgfWZ1bmN0aW9uIEFadCh0KXtEdSh0KS5zZWxlY3QoImRlZnMjX2dyYXBoLWdyYWRpZW50cyIpLnJlbW92ZSgpfWZ1bmN0aW9uIGtadCh0LGUsbixpLHIpe2xldCBvPWdLdDtzd2l0Y2godD10fHwoKCk9PjApLGUpe2Nhc2Ugclp0Lk5PTkU6Y2FzZSByWnQuU1RSVUNUVVJFOmlmKG4ubm9kZS50eXBlPT09QSR0Lk1FVEEpe2xldCByPW4ubm9kZS50ZW1wbGF0ZUlkO3JldHVybiBlPT09clp0LlNUUlVDVFVSRSYmbnVsbCE9PXI/by5TVFJVQ1RVUkVfUEFMRVRURSh0KHIpLGkpOm8uVU5LTk9XTn1yZXR1cm4gbi5ub2RlLnR5cGU9PT1BJHQuU0VSSUVTP2k/by5FWFBBTkRFRF9DT0xPUjoid2hpdGUiOm4ubm9kZS50eXBlPT09QSR0LkJSSURHRT9uLnN0cnVjdHVyYWw/IiNmMGUiOm4ubm9kZS5pbmJvdW5kPyIjMGVmIjoiI2ZlMCI6Q2UuZXhwb3J0cy5pc051bWJlcihuLm5vZGUuZnVuY3Rpb25JbnB1dEluZGV4KT8iIzc5NTU0OCI6Q2UuZXhwb3J0cy5pc051bWJlcihuLm5vZGUuZnVuY3Rpb25PdXRwdXRJbmRleCk/IiMwMDk2ODgiOiJ3aGl0ZSI7Y2FzZSByWnQuREVWSUNFOnJldHVybiBudWxsPT1uLmRldmljZUNvbG9ycz9vLlVOS05PV046aT9vLkVYUEFOREVEX0NPTE9SOkNadCgiZGV2aWNlLSIrbi5ub2RlLm5hbWUsbi5kZXZpY2VDb2xvcnMscik7Y2FzZSByWnQuWExBX0NMVVNURVI6cmV0dXJuIG51bGw9PW4ueGxhQ2x1c3RlckNvbG9ycz9vLlVOS05PV046aT9vLkVYUEFOREVEX0NPTE9SOkNadCgieGxhLSIrbi5ub2RlLm5hbWUsbi54bGFDbHVzdGVyQ29sb3JzLHIpO2Nhc2Ugclp0LkNPTVBVVEVfVElNRTpyZXR1cm4gaT9vLkVYUEFOREVEX0NPTE9SOm4uY29tcHV0ZVRpbWVDb2xvcnx8by5VTktOT1dOO2Nhc2Ugclp0Lk1FTU9SWTpyZXR1cm4gaT9vLkVYUEFOREVEX0NPTE9SOm4ubWVtb3J5Q29sb3J8fG8uVU5LTk9XTjtjYXNlIHJadC5PUF9DT01QQVRJQklMSVRZOnJldHVybiBudWxsPT1uLmNvbXBhdGliaWxpdHlDb2xvcnM/by5VTktOT1dOOmk/by5FWFBBTkRFRF9DT0xPUjpDWnQoIm9wLWNvbXBhdC0iK24ubm9kZS5uYW1lLG4uY29tcGF0aWJpbGl0eUNvbG9ycyxyKTtkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiVW5rbm93biBjYXNlIHRvIGNvbG9yIG5vZGVzIGJ5Iil9fWZ1bmN0aW9uIExadCh0LGUsbixpKXtpPWl8fG4kdC5Ob2RlLlNIQVBFO2NvbnN0IHI9bi5pc05vZGVIaWdobGlnaHRlZChlLm5vZGUubmFtZSksbz1uLmlzTm9kZVNlbGVjdGVkKGUubm9kZS5uYW1lKSxhPWUuaXNJbkV4dHJhY3R8fGUuaXNPdXRFeHRyYWN0fHxlLmlzTGlicmFyeUZ1bmN0aW9uLHM9ZS5leHBhbmRlZCYmaSE9PW4kdC5Bbm5vdGF0aW9uLk5PREUsbD1lLmlzRmFkZWRPdXQ7dC5jbGFzc2VkKCJoaWdobGlnaHRlZCIsciksdC5jbGFzc2VkKCJzZWxlY3RlZCIsbyksdC5jbGFzc2VkKCJleHRyYWN0IixhKSx0LmNsYXNzZWQoImV4cGFuZGVkIixzKSx0LmNsYXNzZWQoImZhZGVkIixsKTtjb25zdCBjPXQuc2VsZWN0KCIuIitpKyIgLiIrbiR0Lk5vZGUuQ09MT1JfVEFSR0VUKSx1PWtadChuLnRlbXBsYXRlSW5kZXgsbi5jb2xvckJ5LGUscyxuLmdldEdyYXBoU3ZnUm9vdCgpKTtjLnN0eWxlKCJmaWxsIix1KSxjLnN0eWxlKCJzdHJva2UiLG8/bnVsbDpQWnQodSkpfWZ1bmN0aW9uIFBadCh0KXtyZXR1cm4idXJsIj09PXQuc3Vic3RyaW5nKDAsMyk/Z0t0LkdSQURJRU5UX09VVExJTkU6bmQodCkuZGFya2VyKCkudG9TdHJpbmcoKX1mdW5jdGlvbiBOWnQodCxlLG4saSl7Y29uc3Qgcj1EdSh0KTtpZihyLnNlbGVjdEFsbCgiLmlucHV0LWhpZ2hsaWdodCIpLmNsYXNzZWQoImlucHV0LWhpZ2hsaWdodCIsITEpLHIuc2VsZWN0QWxsKCIubm9uLWlucHV0IikuY2xhc3NlZCgibm9uLWlucHV0IiwhMSksci5zZWxlY3RBbGwoIi5pbnB1dC1wYXJlbnQiKS5jbGFzc2VkKCJpbnB1dC1wYXJlbnQiLCExKSxyLnNlbGVjdEFsbCgiLmlucHV0LWNoaWxkIikuY2xhc3NlZCgiaW5wdXQtY2hpbGQiLCExKSxyLnNlbGVjdEFsbCgiLmlucHV0LWVkZ2UtaGlnaGxpZ2h0IikuY2xhc3NlZCgiaW5wdXQtZWRnZS1oaWdobGlnaHQiLCExKSxyLnNlbGVjdEFsbCgiLm5vbi1pbnB1dC1lZGdlLWhpZ2hsaWdodCIpLmNsYXNzZWQoIm5vbi1pbnB1dC1lZGdlLWhpZ2hsaWdodCIsITEpLHIuc2VsZWN0QWxsKCIuaW5wdXQtaGlnaGxpZ2h0LXNlbGVjdGVkIikuY2xhc3NlZCgiaW5wdXQtaGlnaGxpZ2h0LXNlbGVjdGVkIiwhMSksIWV8fCFpfHwhbilyZXR1cm47bGV0IG89SVp0KG4sZSksYT17fTtDZS5leHBvcnRzLmVhY2gobywoZnVuY3Rpb24obil7YT1SWnQodCxlLG4sYSl9KSk7bGV0IHM9T2JqZWN0LmtleXMoYSksbD0oZnVuY3Rpb24gYyh0LGUpe2xldCBuPXt9O3JldHVybiBDZS5leHBvcnRzLmVhY2goZSwoZnVuY3Rpb24oZSl7bGV0IGk9dC5nZXROb2RlQnlOYW1lKGUpLHI9T1p0KHQsaSk7bltyLm5hbWVdPXJ9KSksbn0pKGUscyk7IShmdW5jdGlvbiB1KHQsZSl7Q2UuZXhwb3J0cy5mb3JPd24oZSwoZnVuY3Rpb24oZSl7bGV0IG49ZTtmb3IoO24ubmFtZSE9PUUkdDspe2NvbnN0IGU9RHUodCkuc2VsZWN0KGAubm9kZVtkYXRhLW5hbWU9IiR7bi5uYW1lfSJdYCk7IWUubm9kZXMoKS5sZW5ndGh8fGUuY2xhc3NlZCgiaW5wdXQtaGlnaGxpZ2h0Iil8fGUuY2xhc3NlZCgic2VsZWN0ZWQiKXx8ZS5jbGFzc2VkKCJvcCIpfHxlLmNsYXNzZWQoImlucHV0LXBhcmVudCIsITApLG49bi5wYXJlbnROb2RlfX0pKX0pKHQsbCksci5zZWxlY3RBbGwoImcubm9kZTpub3QoLnNlbGVjdGVkKTpub3QoLmlucHV0LWhpZ2hsaWdodCk6bm90KC5pbnB1dC1wYXJlbnQpOm5vdCguaW5wdXQtY2hpbGRyZW4pIikuY2xhc3NlZCgibm9uLWlucHV0IiwhMCkuZWFjaCgoZnVuY3Rpb24odCl7ci5zZWxlY3RBbGwoYFtkYXRhLW5hbWU9IiR7dC5ub2RlLm5hbWV9Il1gKS5jbGFzc2VkKCJub24taW5wdXQiLCEwKX0pKSxyLnNlbGVjdEFsbCgiZy5lZGdlOm5vdCguaW5wdXQtZWRnZS1oaWdobGlnaHQpIikuY2xhc3NlZCgibm9uLWlucHV0LWVkZ2UtaGlnaGxpZ2h0IiwhMCl9ZnVuY3Rpb24gSVp0KHQsZSl7bGV0IG49W10saT1lLmdldE5vZGVCeU5hbWUodCk7aWYoaSBpbnN0YW5jZW9mIE8kdClyZXR1cm5baV0uY29uY2F0KGkuaW5FbWJlZGRpbmdzKTtsZXQgcj1pLm1ldGFncmFwaC5ub2RlcygpO3JldHVybiBDZS5leHBvcnRzLmVhY2gociwoZnVuY3Rpb24odCl7bj1uLmNvbmNhdChJWnQodCxlKSl9KSksbn1mdW5jdGlvbiBSWnQodCxlLG4saSl7aWYoaVtuLm5hbWVdKXJldHVybiBpO2lbbi5uYW1lXT0hMDtsZXQgcj1uLmlucHV0cyxvPU9adChlLG4pO0R1KHQpLnNlbGVjdChgLm5vZGVbZGF0YS1uYW1lPSIke28ubmFtZX0iXWApLmNsYXNzZWQoImlucHV0LWhpZ2hsaWdodCIsITApO2xldCBhPXt9O0NlLmV4cG9ydHMuZWFjaChyLChmdW5jdGlvbih0KXtsZXQgbj1lLmdldE5vZGVCeU5hbWUodC5uYW1lKTtpZih2b2lkIDA9PT1uKXJldHVybjtpZihuIGluc3RhbmNlb2YgRCR0KXtsZXQgdD0kJHQobi5uYW1lKTtuPWUuZ2V0Tm9kZUJ5TmFtZSh0KX1sZXQgaT1PWnQoZSxuKSxyPWFbaS5uYW1lXTtyP3Iub3BOb2Rlcy5wdXNoKG4pOmFbaS5uYW1lXT17dmlzaWJsZVBhcmVudDppLG9wTm9kZXM6W25dfX0pKTtsZXQgcz17fSxsPVtvXTtzW28ubmFtZV09e3RyYWNlZDohMSxpbmRleDowLGNvbm5lY3Rpb25FbmRwb2ludHM6W119O2xldCBjPW87Zm9yKGxldCB0PTE7Yy5uYW1lIT09RSR0O3QrKyljPWMucGFyZW50Tm9kZSxzW2MubmFtZV09e3RyYWNlZDohMSxpbmRleDp0LGNvbm5lY3Rpb25FbmRwb2ludHM6W119LGxbdF09YztyZXR1cm4gQ2UuZXhwb3J0cy5mb3JPd24oYSwoZnVuY3Rpb24obixyKXtsZXQgYT1uLnZpc2libGVQYXJlbnQ7Q2UuZXhwb3J0cy5lYWNoKG4ub3BOb2RlcywoZnVuY3Rpb24obil7aT1SWnQodCxlLG4saSl9KSksYS5uYW1lIT09by5uYW1lJiYoZnVuY3Rpb24gYyh0LGUsbixpKXtsZXQgcj1lLG89ZSxhPVtdO2Zvcig7IW5bci5uYW1lXTspby5uYW1lIT09ci5uYW1lJiZhLnB1c2goW28scl0pLG89cixyPXIucGFyZW50Tm9kZTtsZXQgcz1uW3IubmFtZV0uaW5kZXgsbD1pW01hdGgubWF4KHMtMSwwKV0ubmFtZSxjPWwsdT1vLm5hbWUsaD1vLm5hbWU7Y29uc3QgZD1EdSh0KTtkLnNlbGVjdEFsbChgW2RhdGEtZWRnZT0iJHtofS0tJHtsfSJdYCkuY2xhc3NlZCgiaW5wdXQtZWRnZS1oaWdobGlnaHQiLCEwKSxDZS5leHBvcnRzLmVhY2goYSwoZnVuY3Rpb24odCl7ZC5zZWxlY3RBbGwoYFtkYXRhLWVkZ2U9IiR7dFswXS5uYW1lfS0tJHtjfX5+JHt0WzFdLm5hbWV9fn5PVVQiXWApLmNsYXNzZWQoImlucHV0LWVkZ2UtaGlnaGxpZ2h0IiwhMCl9KSk7Zm9yKGxldCB0PTE7dDxzO3QrKyl7ZC5zZWxlY3RBbGwoYFtkYXRhLWVkZ2U9IiR7dX1+fiR7aVt0XS5uYW1lfX5+SU4tLSR7aVt0LTFdLm5hbWV9Il1gKS5jbGFzc2VkKCJpbnB1dC1lZGdlLWhpZ2hsaWdodCIsITApfX0pKHQsYSxzLGwpfSkpLGl9ZnVuY3Rpb24gT1p0KHQsZSl7bGV0IG49ITEsaT1lO2Zvcig7IW47KWlmKGk9KGU9aSkucGFyZW50Tm9kZSx2b2lkIDA9PT1pKW49ITA7ZWxzZXtsZXQgZT10LmdldFJlbmRlck5vZGVCeU5hbWUoaS5uYW1lKTtlJiYoZS5leHBhbmRlZHx8aSBpbnN0YW5jZW9mIE8kdCkmJihuPSEwKX1yZXR1cm4gZX1mdW5jdGlvbiB6WnQodCxlLG4saSl7bGV0IHI9dC5zZWxlY3RBbGwoKGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY2hpbGROb2Rlc30pKS5kYXRhKGUubGlzdCwodD0+dC5ub2RlLm5hbWUpKTtyZXR1cm4gci5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImRhdGEtbmFtZSIsKHQ9PnQubm9kZS5uYW1lKSkuZWFjaCgoZnVuY3Rpb24odCl7bGV0IGU9RHUodGhpcyk7aS5hZGRBbm5vdGF0aW9uR3JvdXAodCxuLGUpO2xldCByPW4kdC5Bbm5vdGF0aW9uLkVER0Usbz10LnJlbmRlck1ldGFlZGdlSW5mbyYmdC5yZW5kZXJNZXRhZWRnZUluZm8ubWV0YWVkZ2U7byYmIW8ubnVtUmVndWxhckVkZ2VzJiYocis9IiAiK24kdC5Bbm5vdGF0aW9uLkNPTlRST0xfRURHRSksbyYmby5udW1SZWZFZGdlcyYmKHIrPSIgIituJHQuRWRnZS5SRUZfTElORSkscFp0KGUsdCxpLHIpLHQuYW5ub3RhdGlvblR5cGUhPT1MS3QuRUxMSVBTSVM/KCEoZnVuY3Rpb24gYSh0LGUpe2xldCBuPWUubm9kZS5uYW1lLnNwbGl0KCIvIik7cmV0dXJuIERadCh0LG5bbi5sZW5ndGgtMV0sZSxudWxsKX0pKGUsdCksKGZ1bmN0aW9uIHModCxlKXtpZihlLmFubm90YXRpb25UeXBlPT09TEt0LlNVTU1BUlkpe3MkdCh0LCJ1c2UiKS5hdHRyKCJjbGFzcyIsInN1bW1hcnkiKS5hdHRyKCJ4bGluazpocmVmIiwiI3N1bW1hcnktaWNvbiIpLmF0dHIoImN1cnNvciIsInBvaW50ZXIiKX1lbHNle3MkdChFWnQodCxlLG4kdC5Bbm5vdGF0aW9uLk5PREUpLCJ0aXRsZSIpLnRleHQoZS5ub2RlLm5hbWUpfX0pKGUsdCkpOkRadChlLHQubm9kZS5uYW1lLHQsbiR0LkFubm90YXRpb24uRUxMSVBTSVMpfSkpLm1lcmdlKHIpLmF0dHIoImNsYXNzIiwodD0+biR0LkFubm90YXRpb24uR1JPVVArIiAiKyhmdW5jdGlvbiBlKHQpe3JldHVybihMS3RbdF18fCIiKS50b0xvd2VyQ2FzZSgpfHxudWxsfSkodC5hbm5vdGF0aW9uVHlwZSkrIiAiK1RadCh0KSkpLmVhY2goKGZ1bmN0aW9uKHQpe2xldCBlPUR1KHRoaXMpOyEoZnVuY3Rpb24gcih0LGUsbixpKXtsZXQgcj1ZS3QoZSk7bi5yZW5kZXJOb2RlSW5mbyYmbi5hbm5vdGF0aW9uVHlwZSE9PUxLdC5FTExJUFNJUyYmTFp0KHQsbi5yZW5kZXJOb2RlSW5mbyxpLG4kdC5Bbm5vdGF0aW9uLk5PREUpO24uYW5ub3RhdGlvblR5cGU9PT1MS3QuU1VNTUFSWSYmKG4ud2lkdGgrPTEwKTt0LnNlbGVjdCgidGV4dC4iK24kdC5Bbm5vdGF0aW9uLkxBQkVMKS50cmFuc2l0aW9uKCkuYXR0cigieCIscituLmR4KyhuLmlzSW4/LTE6MSkqKG4ud2lkdGgvMituLmxhYmVsT2Zmc2V0KSkuYXR0cigieSIsZS55K24uZHkpLHQuc2VsZWN0KCJ1c2Uuc3VtbWFyeSIpLnRyYW5zaXRpb24oKS5hdHRyKCJ4IixyK24uZHgtMykuYXR0cigieSIsZS55K24uZHktNiksZVp0KHQuc2VsZWN0KCIuIituJHQuQW5ub3RhdGlvbi5OT0RFKyIgZWxsaXBzZSIpLHIrbi5keCxlLnkrbi5keSxuLndpZHRoLG4uaGVpZ2h0KSx0WnQodC5zZWxlY3QoIi4iK24kdC5Bbm5vdGF0aW9uLk5PREUrIiByZWN0IikscituLmR4LGUueStuLmR5LG4ud2lkdGgsbi5oZWlnaHQpLHRadCh0LnNlbGVjdCgiLiIrbiR0LkFubm90YXRpb24uTk9ERSsiIHVzZSIpLHIrbi5keCxlLnkrbi5keSxuLndpZHRoLG4uaGVpZ2h0KSx0LnNlbGVjdCgicGF0aC4iK24kdC5Bbm5vdGF0aW9uLkVER0UpLnRyYW5zaXRpb24oKS5hdHRyKCJkIiwodD0+e2xldCBuPXQucG9pbnRzLm1hcCgodD0+KHt4OnQuZHgrcix5OnQuZHkrZS55fSkpKTtyZXR1cm4gZlp0KG4pfSkpfSkoZSxuLHQsaSksdC5hbm5vdGF0aW9uVHlwZSE9PUxLdC5FTExJUFNJUyYmKGZ1bmN0aW9uIG8odCxlLG4saSl7dC5vbigibW91c2VvdmVyIiwodD0+e2kuZmlyZSgiYW5ub3RhdGlvbi1oaWdobGlnaHQiLHtuYW1lOnQubm9kZS5uYW1lLGhvc3ROYW1lOmUubm9kZS5uYW1lfSl9KSkub24oIm1vdXNlb3V0IiwodD0+e2kuZmlyZSgiYW5ub3RhdGlvbi11bmhpZ2hsaWdodCIse25hbWU6dC5ub2RlLm5hbWUsaG9zdE5hbWU6ZS5ub2RlLm5hbWV9KX0pKS5vbigiY2xpY2siLCh0PT57TXUuc3RvcFByb3BhZ2F0aW9uKCksaS5maXJlKCJhbm5vdGF0aW9uLXNlbGVjdCIse25hbWU6dC5ub2RlLm5hbWUsaG9zdE5hbWU6ZS5ub2RlLm5hbWV9KX0pKSxuLmFubm90YXRpb25UeXBlIT09TEt0LlNVTU1BUlkmJm4uYW5ub3RhdGlvblR5cGUhPT1MS3QuQ09OU1RBTlQmJnQub24oImNvbnRleHRtZW51IixvWnQoaSx5WnQobi5ub2RlLGkpKSl9KShlLG4sdCxpKX0pKSxyLmV4aXQoKS5lYWNoKChmdW5jdGlvbih0KXtpLnJlbW92ZUFubm90YXRpb25Hcm91cCh0LG4pfSkpLnJlbW92ZSgpLHJ9ZnVuY3Rpb24gRFp0KHQsZSxuLGkpe2xldCByPW4kdC5Bbm5vdGF0aW9uLkxBQkVMO3JldHVybiBpJiYocis9IiAiK2kpLHdadCh0LmFwcGVuZCgidGV4dCIpLmF0dHIoImNsYXNzIixyKS5hdHRyKCJkeSIsIi4zNWVtIikuYXR0cigidGV4dC1hbmNob3IiLG4uaXNJbj8iZW5kIjoic3RhcnQiKS50ZXh0KGUpLC0xLGkkdC5MQUJFTCl9ZnVuY3Rpb24gQlp0KHQsZSxuLGkpe2xldCByPWEkdCh0LCJnIixpPWl8fG4kdC5TY2VuZS5HUk9VUCkuZW1wdHkoKSxvPXMkdCh0LCJnIixpKSxhPXMkdChvLCJnIixuJHQuU2NlbmUuQ09SRSkscz1DZS5leHBvcnRzLnJlZHVjZShlLmNvcmVHcmFwaC5ub2RlcygpLCgodCxuKT0+e2xldCBpPWUuY29yZUdyYXBoLm5vZGUobik7cmV0dXJuIGkuZXhjbHVkZWR8fHQucHVzaChpKSx0fSksW10pO2lmKGUubm9kZS50eXBlPT09QSR0LlNFUklFUyYmcy5yZXZlcnNlKCksbFp0KGEsZS5jb3JlR3JhcGgsbiksbVp0KGEscyxuKSxlLmlzb2xhdGVkSW5FeHRyYWN0Lmxlbmd0aD4wKXttWnQocyR0KG8sImciLG4kdC5TY2VuZS5JTkVYVFJBQ1QpLGUuaXNvbGF0ZWRJbkV4dHJhY3Qsbil9ZWxzZSBhJHQobywiZyIsbiR0LlNjZW5lLklORVhUUkFDVCkucmVtb3ZlKCk7aWYoZS5pc29sYXRlZE91dEV4dHJhY3QubGVuZ3RoPjApe21adChzJHQobywiZyIsbiR0LlNjZW5lLk9VVEVYVFJBQ1QpLGUuaXNvbGF0ZWRPdXRFeHRyYWN0LG4pfWVsc2UgYSR0KG8sImciLG4kdC5TY2VuZS5PVVRFWFRSQUNUKS5yZW1vdmUoKTtpZihlLmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0Lmxlbmd0aD4wKXttWnQocyR0KG8sImciLG4kdC5TY2VuZS5GVU5DVElPTl9MSUJSQVJZKSxlLmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0LG4pfWVsc2UgYSR0KG8sImciLG4kdC5TY2VuZS5GVU5DVElPTl9MSUJSQVJZKS5yZW1vdmUoKTtyZXR1cm4oZnVuY3Rpb24gbCh0LGUpe2xldCBuPWUubm9kZS50eXBlPT09QSR0LlNFUklFUz8wOlVLdC5zdWJzY2VuZS5tZXRhLmxhYmVsSGVpZ2h0O1FLdChLS3QodCwiZyIsWkt0LlNjZW5lLkNPUkUpLDAsbik7bGV0IGk9ZS5pc29sYXRlZEluRXh0cmFjdC5sZW5ndGg+MCxyPWUuaXNvbGF0ZWRPdXRFeHRyYWN0Lmxlbmd0aD4wLG89ZS5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5sZW5ndGg+MCxhPVVLdC5zdWJzY2VuZS5tZXRhLmV4dHJhY3RYT2Zmc2V0LHM9MDtpZihpJiYocys9ZS5vdXRFeHRyYWN0Qm94LndpZHRoKSxyJiYocys9ZS5vdXRFeHRyYWN0Qm94LndpZHRoKSxpKXtsZXQgaT1lLmNvcmVCb3gud2lkdGg7aT1zPGpLdD9pLWpLdCtlLmluRXh0cmFjdEJveC53aWR0aC8yOmktZS5pbkV4dHJhY3RCb3gud2lkdGgvMi1lLm91dEV4dHJhY3RCb3gud2lkdGgtKHI/YTowKSxpPWktZS5saWJyYXJ5RnVuY3Rpb25zQm94LndpZHRoLShvP2E6MCksUUt0KEtLdCh0LCJnIixaS3QuU2NlbmUuSU5FWFRSQUNUKSxpLG4pfWlmKHIpe2xldCBpPWUuY29yZUJveC53aWR0aDtzPGpLdD9pPWktakt0K2Uub3V0RXh0cmFjdEJveC53aWR0aC8yOmktPWUub3V0RXh0cmFjdEJveC53aWR0aC8yLGk9aS1lLmxpYnJhcnlGdW5jdGlvbnNCb3gud2lkdGgtKG8/YTowKSxRS3QoS0t0KHQsImciLFpLdC5TY2VuZS5PVVRFWFRSQUNUKSxpLG4pfWlmKG8pe2xldCBpPWUuY29yZUJveC53aWR0aC1lLmxpYnJhcnlGdW5jdGlvbnNCb3gud2lkdGgvMjtRS3QoS0t0KHQsImciLFpLdC5TY2VuZS5GVU5DVElPTl9MSUJSQVJZKSxpLG4pfX0pKG8sZSksciYmby5hdHRyKCJvcGFjaXR5IiwwKS50cmFuc2l0aW9uKCkuYXR0cigib3BhY2l0eSIsMSksb31jbGFzcyBIWnR7Y29uc3RydWN0b3IodCxlLG4saSxyLG8pe3RoaXMuc3ZnPXQsdGhpcy5sYWJlbFBhZGRpbmc9byx0aGlzLnpvb21HPWUsdGhpcy5tYWluWm9vbT1uLHRoaXMubWF4V2FuZEg9cjtsZXQgYT1EdShpLnNoYWRvd1Jvb3QpLHM9YS5zZWxlY3QoInN2ZyIpLGw9cy5zZWxlY3QoInJlY3QiKTt0aGlzLnZpZXdwb2ludENvb3JkPXt4OjAseTowfTtsZXQgYz1JaCgpLnN1YmplY3QoT2JqZWN0KS5vbigiZHJhZyIsKHQ9Pnt0aGlzLnZpZXdwb2ludENvb3JkLng9TXUueCx0aGlzLnZpZXdwb2ludENvb3JkLnk9TXUueSx0aGlzLnVwZGF0ZVZpZXdwb2ludCgpfSkpO2wuZGF0dW0odGhpcy52aWV3cG9pbnRDb29yZCkuY2FsbChjKSxzLm9uKCJjbGljayIsKCgpPT57aWYoTXUuZGVmYXVsdFByZXZlbnRlZClyZXR1cm47bGV0IHQ9TnVtYmVyKGwuYXR0cigid2lkdGgiKSksZT1OdW1iZXIobC5hdHRyKCJoZWlnaHQiKSksbj1iaChzLm5vZGUoKSk7dGhpcy52aWV3cG9pbnRDb29yZC54PW5bMF0tdC8yLHRoaXMudmlld3BvaW50Q29vcmQueT1uWzFdLWUvMix0aGlzLnVwZGF0ZVZpZXdwb2ludCgpfSkpLHRoaXMudmlld3BvaW50PWwubm9kZSgpLHRoaXMubWluaW1hcFN2Zz1zLm5vZGUoKSx0aGlzLm1pbmltYXA9aSx0aGlzLmNhbnZhcz1hLnNlbGVjdCgiY2FudmFzLmZpcnN0Iikubm9kZSgpLHRoaXMuY2FudmFzQnVmZmVyPWEuc2VsZWN0KCJjYW52YXMuc2Vjb25kIikubm9kZSgpLHRoaXMuZG93bmxvYWRDYW52YXM9YS5zZWxlY3QoImNhbnZhcy5kb3dubG9hZCIpLm5vZGUoKSxEdSh0aGlzLmRvd25sb2FkQ2FudmFzKS5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKSx0aGlzLnVwZGF0ZSgpfXVwZGF0ZVZpZXdwb2ludCgpe0R1KHRoaXMudmlld3BvaW50KS5hdHRyKCJ4Iix0aGlzLnZpZXdwb2ludENvb3JkLngpLmF0dHIoInkiLHRoaXMudmlld3BvaW50Q29vcmQueSk7bGV0IHQ9LXRoaXMudmlld3BvaW50Q29vcmQueCp0aGlzLnNjYWxlTWFpbi90aGlzLnNjYWxlTWluaW1hcCxlPS10aGlzLnZpZXdwb2ludENvb3JkLnkqdGhpcy5zY2FsZU1haW4vdGhpcy5zY2FsZU1pbmltYXA7RHUodGhpcy5zdmcpLmNhbGwodGhpcy5tYWluWm9vbS50cmFuc2Zvcm0scU4udHJhbnNsYXRlKHQsZSkuc2NhbGUodGhpcy5zY2FsZU1haW4pKX1nZXRJbWFnZUJsb2IoKXtyZXR1cm4gbmV3IFByb21pc2UoKHQ9Pnt0aGlzLmRvd25sb2FkQ2FudmFzLnRvQmxvYigoZT0+e3QoZSl9KSwiaW1hZ2UvcG5nIil9KSl9dXBkYXRlKCl7bGV0IHQ9bnVsbDt0cnl7aWYodD10aGlzLnpvb21HLmdldEJCb3goKSwwPT09dC53aWR0aClyZXR1cm59Y2F0Y2godCl7cmV0dXJufWxldCBlPUR1KHRoaXMuc3ZnKSxuPSIiO2NvbnN0IGk9dGhpcy5zdmcscj0oaS5nZXRSb290Tm9kZT9pLmdldFJvb3ROb2RlKCk6dGhpcy5zdmcucGFyZW50Tm9kZSkuc3R5bGVTaGVldHM7Zm9yKGxldCB0PTA7dDxyLmxlbmd0aDt0KyspdHJ5e2xldCBlPXJbdF0uY3NzUnVsZXN8fHJbdF0ucnVsZXM7aWYobnVsbD09ZSljb250aW51ZTtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoO3QrKyluKz1lW3RdLmNzc1RleHQucmVwbGFjZSgvID90Zi1bXHctXSsgPy9nLCIiKSsiXG4ifWNhdGNoKHQpe2lmKCJTZWN1cml0eUVycm9yIiE9PXQubmFtZSl0aHJvdyB0fWxldCBvPWUuYXBwZW5kKCJzdHlsZSIpO28udGV4dChuKTtsZXQgYT1EdSh0aGlzLnpvb21HKSxzPWEuYXR0cigidHJhbnNmb3JtIik7YS5hdHRyKCJ0cmFuc2Zvcm0iLG51bGwpLHQuaGVpZ2h0Kz10LnksdC53aWR0aCs9dC54LHQuaGVpZ2h0Kz0yKnRoaXMubGFiZWxQYWRkaW5nLHQud2lkdGgrPTIqdGhpcy5sYWJlbFBhZGRpbmcsZS5hdHRyKCJ3aWR0aCIsdC53aWR0aCkuYXR0cigiaGVpZ2h0Iix0LmhlaWdodCksdGhpcy5zY2FsZU1pbmltYXA9dGhpcy5tYXhXYW5kSC9NYXRoLm1heCh0LndpZHRoLHQuaGVpZ2h0KSx0aGlzLm1pbmltYXBTaXplPXt3aWR0aDp0LndpZHRoKnRoaXMuc2NhbGVNaW5pbWFwLGhlaWdodDp0LmhlaWdodCp0aGlzLnNjYWxlTWluaW1hcH0sRHUodGhpcy5taW5pbWFwU3ZnKS5hdHRyKHRoaXMubWluaW1hcFNpemUpLER1KHRoaXMuY2FudmFzQnVmZmVyKS5hdHRyKHRoaXMubWluaW1hcFNpemUpO2NvbnN0IGw9RHUodGhpcy5kb3dubG9hZENhbnZhcyk7bC5zdHlsZSgid2lkdGgiLHQud2lkdGgpLGwuc3R5bGUoImhlaWdodCIsdC5oZWlnaHQpLGwuYXR0cigid2lkdGgiLDMqdC53aWR0aCksbC5hdHRyKCJoZWlnaHQiLDMqdC5oZWlnaHQpLG51bGwhPXRoaXMudHJhbnNsYXRlJiZudWxsIT10aGlzLnpvb20mJnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKCk9PnRoaXMuem9vbSgpKSk7bGV0IGM9KG5ldyBYTUxTZXJpYWxpemVyKS5zZXJpYWxpemVUb1N0cmluZyh0aGlzLnN2Zyk7by5yZW1vdmUoKSxlLmF0dHIoIndpZHRoIixudWxsKS5hdHRyKCJoZWlnaHQiLG51bGwpLGEuYXR0cigidHJhbnNmb3JtIixzKTtsZXQgdT1uZXcgSW1hZ2U7dS5vbmxvYWQ9KCk9PntsZXQgdD10aGlzLmNhbnZhc0J1ZmZlci5nZXRDb250ZXh0KCIyZCIpO3QuY2xlYXJSZWN0KDAsMCx0aGlzLmNhbnZhc0J1ZmZlci53aWR0aCx0aGlzLmNhbnZhc0J1ZmZlci5oZWlnaHQpLHQuZHJhd0ltYWdlKHUsMCwwLHRoaXMubWluaW1hcFNpemUud2lkdGgsdGhpcy5taW5pbWFwU2l6ZS5oZWlnaHQpLHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKCk9PntEdSh0aGlzLmNhbnZhc0J1ZmZlcikuc3R5bGUoImRpc3BsYXkiLG51bGwpLER1KHRoaXMuY2FudmFzKS5zdHlsZSgiZGlzcGxheSIsIm5vbmUiKSxbdGhpcy5jYW52YXMsdGhpcy5jYW52YXNCdWZmZXJdPVt0aGlzLmNhbnZhc0J1ZmZlcix0aGlzLmNhbnZhc119KSk7bGV0IGU9dGhpcy5kb3dubG9hZENhbnZhcy5nZXRDb250ZXh0KCIyZCIpO2UuY2xlYXJSZWN0KDAsMCx0aGlzLmRvd25sb2FkQ2FudmFzLndpZHRoLHRoaXMuZG93bmxvYWRDYW52YXMuaGVpZ2h0KSxlLmRyYXdJbWFnZSh1LDAsMCx0aGlzLmRvd25sb2FkQ2FudmFzLndpZHRoLHRoaXMuZG93bmxvYWRDYW52YXMuaGVpZ2h0KX0sdS5vbmVycm9yPSgpPT57bGV0IHQ9bmV3IEJsb2IoW2NdLHt0eXBlOiJpbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgifSk7dS5zcmM9VVJMLmNyZWF0ZU9iamVjdFVSTCh0KX0sdS5zcmM9ImRhdGE6aW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04LCIrZW5jb2RlVVJJQ29tcG9uZW50KGMpfXpvb20odCl7aWYobnVsbD09dGhpcy5zY2FsZU1pbmltYXApcmV0dXJuO3QmJih0aGlzLnRyYW5zbGF0ZT1bdC54LHQueV0sdGhpcy5zY2FsZU1haW49dC5rKTtsZXQgZT10aGlzLnN2Zy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxuPUR1KHRoaXMudmlld3BvaW50KTt0aGlzLnZpZXdwb2ludENvb3JkLng9LXRoaXMudHJhbnNsYXRlWzBdKnRoaXMuc2NhbGVNaW5pbWFwL3RoaXMuc2NhbGVNYWluLHRoaXMudmlld3BvaW50Q29vcmQueT0tdGhpcy50cmFuc2xhdGVbMV0qdGhpcy5zY2FsZU1pbmltYXAvdGhpcy5zY2FsZU1haW47bGV0IGk9ZS53aWR0aCp0aGlzLnNjYWxlTWluaW1hcC90aGlzLnNjYWxlTWFpbixyPWUuaGVpZ2h0KnRoaXMuc2NhbGVNaW5pbWFwL3RoaXMuc2NhbGVNYWluO24uYXR0cigieCIsdGhpcy52aWV3cG9pbnRDb29yZC54KS5hdHRyKCJ5Iix0aGlzLnZpZXdwb2ludENvb3JkLnkpLmF0dHIoIndpZHRoIixpKS5hdHRyKCJoZWlnaHQiLHIpO2xldCBvPXRoaXMubWluaW1hcFNpemUud2lkdGgsYT10aGlzLm1pbmltYXBTaXplLmhlaWdodCxzPXRoaXMudmlld3BvaW50Q29vcmQueCxsPXRoaXMudmlld3BvaW50Q29vcmQueTsoTWF0aC5taW4oTWF0aC5tYXgoMCxzK2kpLG8pLU1hdGgubWluKE1hdGgubWF4KDAscyksbykpKihNYXRoLm1pbihNYXRoLm1heCgwLGwrciksYSktTWF0aC5taW4oTWF0aC5tYXgoMCxsKSxhKSkvKG8qYSk8Ljg/dGhpcy5taW5pbWFwLmNsYXNzTGlzdC5yZW1vdmUoImhpZGRlbiIpOnRoaXMubWluaW1hcC5jbGFzc0xpc3QuYWRkKCJoaWRkZW4iKX19bGV0IEZadD1jbGFzcyBleHRlbmRzIHdle2luaXQodCxlLG4saSxyKXtyZXR1cm4gbmV3IEhadCh0LGUsbix0aGlzLGkscil9fTtGWnQudGVtcGxhdGU9eGVgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MgbGluZWFyOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdCguaGlkZGVuKSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgY2FudmFzIHsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OwogICAgICB9CgogICAgICByZWN0IHsKICAgICAgICBmaWxsOiB3aGl0ZTsKICAgICAgICBzdHJva2U6ICMxMTExMTE7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAxcHg7CiAgICAgICAgZmlsbC1vcGFjaXR5OiAwOwogICAgICAgIGZpbHRlcjogdXJsKCNtaW5pbWFwRHJvcFNoYWRvdyk7CiAgICAgICAgY3Vyc29yOiBtb3ZlOwogICAgICB9CgogICAgICBzdmcgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzdmc+CiAgICAgIDxkZWZzPgogICAgICAgIDxmaWx0ZXIKICAgICAgICAgIGlkPSJtaW5pbWFwRHJvcFNoYWRvdyIKICAgICAgICAgIHg9Ii0yMCUiCiAgICAgICAgICB5PSItMjAlIgogICAgICAgICAgd2lkdGg9IjE1MCUiCiAgICAgICAgICBoZWlnaHQ9IjE1MCUiCiAgICAgICAgPgogICAgICAgICAgPGZlT2Zmc2V0IHJlc3VsdD0ib2ZmT3V0IiBpbj0iU291cmNlR3JhcGhpYyIgZHg9IjEiIGR5PSIxIj48L2ZlT2Zmc2V0PgogICAgICAgICAgPGZlQ29sb3JNYXRyaXgKICAgICAgICAgICAgcmVzdWx0PSJtYXRyaXhPdXQiCiAgICAgICAgICAgIGluPSJvZmZPdXQiCiAgICAgICAgICAgIHR5cGU9Im1hdHJpeCIKICAgICAgICAgICAgdmFsdWVzPSIwLjEgMCAwIDAgMCAwIDAuMSAwIDAgMCAwIDAgMC4xIDAgMCAwIDAgMCAwLjUgMCIKICAgICAgICAgID48L2ZlQ29sb3JNYXRyaXg+CiAgICAgICAgICA8ZmVHYXVzc2lhbkJsdXIKICAgICAgICAgICAgcmVzdWx0PSJibHVyT3V0IgogICAgICAgICAgICBpbj0ibWF0cml4T3V0IgogICAgICAgICAgICBzdGREZXZpYXRpb249IjIiCiAgICAgICAgICA+PC9mZUdhdXNzaWFuQmx1cj4KICAgICAgICAgIDxmZUJsZW5kIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImJsdXJPdXQiIG1vZGU9Im5vcm1hbCI+PC9mZUJsZW5kPgogICAgICAgIDwvZmlsdGVyPgogICAgICA8L2RlZnM+CiAgICAgIDxyZWN0PjwvcmVjdD4KICAgIDwvc3ZnPgogICAgPGNhbnZhcyBjbGFzcz0iZmlyc3QiPjwvY2FudmFzPgogICAgPCEtLSBBZGRpdGlvbmFsIGNhbnZhcyB0byB1c2UgYXMgYnVmZmVyIHRvIGF2b2lkIGZsaWNrZXJpbmcgYmV0d2VlbiB1cGRhdGVzIC0tPgogICAgPGNhbnZhcyBjbGFzcz0ic2Vjb25kIj48L2NhbnZhcz4KICAgIDxjYW52YXMgY2xhc3M9ImRvd25sb2FkIj48L2NhbnZhcz4KICBgLEZadD10KFtpKCJ0Zi1ncmFwaC1taW5pbWFwIildLEZadCk7Y29uc3QgVlp0PXhlYAogIDxzdHlsZT4KICAgIDpob3N0KC5kYXJrLW1vZGUpIHsKICAgICAgZmlsdGVyOiBpbnZlcnQoMSk7CiAgICB9CgogICAgOmhvc3QgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBmb250LXNpemU6IDIwcHg7CiAgICAgIGhlaWdodDogMTAwJTsKICAgICAgd2lkdGg6IDEwMCU7CiAgICB9CgogICAgI3N2ZyB7CiAgICAgIGZsZXg6IDE7CiAgICAgIGZvbnQtZmFtaWx5OiBSb2JvdG8sIHNhbnMtc2VyaWY7CiAgICAgIGhlaWdodDogMTAwJTsKICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgd2lkdGg6IDEwMCU7CiAgICB9CgogICAgI2hpZGRlbiB7CiAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgdG9wOiAwcHg7CiAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgIH0KCiAgICB0ZXh0IHsKICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICB9CgogICAgLyogLS0tIE5vZGUgYW5kIGFubm90YXRpb24tbm9kZSBmb3IgTWV0YW5vZGUgLS0tICovCgogICAgLm1ldGEgPiAubm9kZXNoYXBlID4gcmVjdCwKICAgIC5tZXRhID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIGZpbGw6IGhzbCgwLCAwJSwgNzAlKTsKICAgIH0KICAgIC5ub2RlLm1ldGEuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCwKICAgIC5ub2RlLm1ldGEuaGlnaGxpZ2h0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgIHN0cm9rZS13aWR0aDogMjsKICAgIH0KICAgIC5hbm5vdGF0aW9uLm1ldGEuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCwKICAgIC5hbm5vdGF0aW9uLm1ldGEuaGlnaGxpZ2h0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgIHN0cm9rZS13aWR0aDogMTsKICAgIH0KICAgIC5tZXRhLnNlbGVjdGVkID4gLm5vZGVzaGFwZSA+IHJlY3QsCiAgICAubWV0YS5zZWxlY3RlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgIHN0cm9rZS13aWR0aDogMjsKICAgIH0KICAgIC5ub2RlLm1ldGEuc2VsZWN0ZWQuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gcmVjdCwKICAgIC5ub2RlLm1ldGEuc2VsZWN0ZWQuZXhwYW5kZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgIHN0cm9rZTogcmVkOwogICAgICBzdHJva2Utd2lkdGg6IDM7CiAgICB9CiAgICAuYW5ub3RhdGlvbi5tZXRhLnNlbGVjdGVkID4gLm5vZGVzaGFwZSA+IHJlY3QsCiAgICAuYW5ub3RhdGlvbi5tZXRhLnNlbGVjdGVkID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICBzdHJva2U6IHJlZDsKICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgfQogICAgLm5vZGUubWV0YS5zZWxlY3RlZC5leHBhbmRlZC5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgLm5vZGUubWV0YS5zZWxlY3RlZC5leHBhbmRlZC5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgIHN0cm9rZS13aWR0aDogNDsKICAgIH0KCiAgICAuZmFkZWQsCiAgICAuZmFkZWQgcmVjdCwKICAgIC5mYWRlZCBlbGxpcHNlLAogICAgLmZhZGVkIHBhdGgsCiAgICAuZmFkZWQgdXNlLAogICAgI3JlY3RIYXRjaCBsaW5lLAogICAgI2VsbGlwc2VIYXRjaCBsaW5lIHsKICAgICAgY29sb3I6ICNlMGQ0YjMgIWltcG9ydGFudDsKICAgICAgZmlsbDogd2hpdGU7CiAgICAgIHN0cm9rZTogI2UwZDRiMyAhaW1wb3J0YW50OwogICAgfQoKICAgIC5mYWRlZCBwYXRoIHsKICAgICAgc3Ryb2tlLXdpZHRoOiAxcHggIWltcG9ydGFudDsKICAgIH0KCiAgICAuZmFkZWQgcmVjdCB7CiAgICAgIGZpbGw6IHVybCgjcmVjdEhhdGNoKSAhaW1wb3J0YW50OwogICAgfQoKICAgIC5mYWRlZCBlbGxpcHNlLAogICAgLmZhZGVkIHVzZSB7CiAgICAgIGZpbGw6IHVybCgjZWxsaXBzZUhhdGNoKSAhaW1wb3J0YW50OwogICAgfQoKICAgIC5mYWRlZCB0ZXh0IHsKICAgICAgb3BhY2l0eTogMDsKICAgIH0KCiAgICAvKiBSdWxlcyB1c2VkIGZvciBpbnB1dC10cmFjaW5nLiAqLwogICAgLmlucHV0LWhpZ2hsaWdodCA+ICogPiByZWN0LAogICAgLmlucHV0LWhpZ2hsaWdodCA+ICogPiBlbGxpcHNlLAogICAgLmlucHV0LWhpZ2hsaWdodCA+ICogPiB1c2UgewogICAgICBmaWxsOiB3aGl0ZTsKICAgICAgc3Ryb2tlOiAjZmY5ODAwICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLyogIC0gRmFkZWQgbm9uLWlucHV0IHN0eWxpbmcgKi8KICAgIC5ub24taW5wdXQgPiAqID4gcmVjdCwKLm5vbi1pbnB1dCA+ICogPiBlbGxpcHNlLAoubm9uLWlucHV0ID4gKiA+IHVzZSwKLyogRm9yIENvbnN0IG5vZGVzLiAqLwoubm9uLWlucHV0ID4gKiA+IC5jb25zdGFudDpub3QoW2NsYXNzKj0iaW5wdXQtaGlnaGxpZ2h0Il0pID4KICAuYW5ub3RhdGlvbi1ub2RlID4gZWxsaXBzZSwKLyogRm9yIHN0eWxpbmcgb2YgYW5ub3RhdGlvbiBub2RlcyBvZiBub24taW5wdXQgbm9kZXMuICovCi5ub24taW5wdXQgPiBnID4gLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgIHN0cm9rZTogI2UwZDRiMyAhaW1wb3J0YW50OwogICAgICBzdHJva2Utd2lkdGg6IGluaGVyaXQ7CiAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IGluaGVyaXQ7CiAgICB9CgogICAgLm5vbi1pbnB1dCBwYXRoIHsKICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgfQoKICAgIC5ub24taW5wdXQgPiAubm9kZXNoYXBlID4gcmVjdCwKLm5vbi1pbnB1dCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0LAovKiBGb3Igc3R5bGluZyBvZiBhbm5vdGF0aW9uIG5vZGVzIG9mIG5vbi1pbnB1dCBub2Rlcy4gKi8KLm5vbi1pbnB1dCA+IGcgPiAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgZmlsbDogdXJsKCNyZWN0SGF0Y2gpICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLm5vbi1pbnB1dCBlbGxpcHNlLAogICAgLm5vbi1pbnB1dCB1c2UgewogICAgICBmaWxsOiB1cmwoI2VsbGlwc2VIYXRjaCkgIWltcG9ydGFudDsKICAgIH0KCiAgICAubm9uLWlucHV0ID4gdGV4dCB7CiAgICAgIG9wYWNpdHk6IDA7CiAgICB9CgogICAgLm5vbi1pbnB1dCAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWVkZ2UgewogICAgICBtYXJrZXItZW5kOiB1cmwoI2Fubm90YXRpb24tYXJyb3doZWFkLWZhZGVkKTsKICAgIH0KCiAgICAubm9uLWlucHV0IC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZS5yZWZsaW5lIHsKICAgICAgbWFya2VyLXN0YXJ0OiB1cmwoI3JlZi1hbm5vdGF0aW9uLWFycm93aGVhZC1mYWRlZCk7CiAgICB9CgogICAgLyogSW5wdXQgZWRnZXMuICovCiAgICAuaW5wdXQtZWRnZS1oaWdobGlnaHQgPiB0ZXh0IHsKICAgICAgZmlsbDogYmxhY2sgIWltcG9ydGFudDsKICAgIH0KICAgIC5pbnB1dC1oaWdobGlnaHQgPiAuaW4tYW5ub3RhdGlvbnMgPiAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWVkZ2UsCiAgICAuaW5wdXQtaGlnaGxpZ2h0LXNlbGVjdGVkCiAgICAgID4gLmluLWFubm90YXRpb25zCiAgICAgID4gLmFubm90YXRpb24KICAgICAgPiAuYW5ub3RhdGlvbi1lZGdlIHsKICAgICAgc3Ryb2tlOiAjOTk5ICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLyogTm9uLWlucHV0IGVkZ2VzLiAqLwogICAgLm5vbi1pbnB1dC1lZGdlLWhpZ2hsaWdodCwKLm5vbi1pbnB1dCA+IGcgPiAuYW5ub3RhdGlvbiA+IHBhdGgsCi8qIEFubm90YXRpb24gc3R5bGVzIChsYWJlbCBhbmQgZWRnZXMgcmVzcGVjdGl2ZWx5KS4gKi8KLm5vbi1pbnB1dCA+IGcgPgouYW5ub3RhdGlvbjpub3QoLmlucHV0LWhpZ2hsaWdodCk6bm90KC5pbnB1dC1oaWdobGlnaHQtc2VsZWN0ZWQpID4KLmFubm90YXRpb24tbGFiZWwKLyouYW5ub3RhdGlvbi1lZGdlKi8gewogICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICB9CgogICAgLyogLS0tIE9wIE5vZGUgLS0tICovCgogICAgLm9wID4gLm5vZGVzaGFwZSA+IC5ub2RlY29sb3J0YXJnZXQsCiAgICAub3AgPiAuYW5ub3RhdGlvbi1ub2RlID4gLm5vZGVjb2xvcnRhcmdldCB7CiAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgZmlsbDogI2ZmZjsKICAgICAgc3Ryb2tlOiAjY2NjOwogICAgfQoKICAgIC5vcC5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiAubm9kZWNvbG9ydGFyZ2V0LAogICAgLm9wLnNlbGVjdGVkID4gLmFubm90YXRpb24tbm9kZSA+IC5ub2RlY29sb3J0YXJnZXQgewogICAgICBzdHJva2U6IHJlZDsKICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgfQoKICAgIC5vcC5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiAubm9kZWNvbG9ydGFyZ2V0LAogICAgLm9wLmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IC5ub2RlY29sb3J0YXJnZXQgewogICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICB9CgogICAgLyogLS0tIFNlcmllcyBOb2RlIC0tLSAqLwoKICAgIC8qIEJ5IGRlZmF1bHQsIGRvbid0IHNob3cgdGhlIHNlcmllcyBiYWNrZ3JvdW5kIDxyZWN0Pi4gKi8KICAgIC5zZXJpZXMgPiAubm9kZXNoYXBlID4gcmVjdCB7CiAgICAgIGZpbGw6IGhzbCgwLCAwJSwgNzAlKTsKICAgICAgZmlsbC1vcGFjaXR5OiAwOwogICAgICBzdHJva2UtZGFzaGFycmF5OiA1LCA1OwogICAgICBzdHJva2Utb3BhY2l0eTogMDsKICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgfQoKICAgIC8qIE9uY2UgZXhwYW5kZWQsIHNob3cgdGhlIHNlcmllcyBiYWNrZ3JvdW5kIDxyZWN0PiBhbmQgaGlkZSB0aGUgPHVzZT4uICovCiAgICAuc2VyaWVzLmV4cGFuZGVkID4gLm5vZGVzaGFwZSA+IHJlY3QgewogICAgICBmaWxsLW9wYWNpdHk6IDAuMTU7CiAgICAgIHN0cm9rZTogaHNsKDAsIDAlLCA3MCUpOwogICAgICBzdHJva2Utb3BhY2l0eTogMTsKICAgIH0KICAgIC5zZXJpZXMuZXhwYW5kZWQgPiAubm9kZXNoYXBlID4gdXNlIHsKICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgfQoKICAgIC8qKgogKiBUT0RPOiBTaW1wbGlmeSB0aGlzIGJ5IGFwcGx5aW5nIGEgc3RhYmxlIGNsYXNzIG5hbWUgdG8gYWxsIDxnPgogKiBlbGVtZW50cyB0aGF0IGN1cnJlbnRseSBoYXZlIGVpdGhlciB0aGUgbm9kZXNoYXBlIG9yIGFubm90YXRpb24tbm9kZSBjbGFzc2VzLgogKi8KICAgIC5zZXJpZXMgPiAubm9kZXNoYXBlID4gdXNlLAogICAgLnNlcmllcyA+IC5hbm5vdGF0aW9uLW5vZGUgPiB1c2UgewogICAgICBzdHJva2U6ICNjY2M7CiAgICB9CiAgICAuc2VyaWVzLmhpZ2hsaWdodGVkID4gLm5vZGVzaGFwZSA+IHVzZSwKICAgIC5zZXJpZXMuaGlnaGxpZ2h0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgfQogICAgLnNlcmllcy5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAuc2VyaWVzLnNlbGVjdGVkID4gLmFubm90YXRpb24tbm9kZSA+IHVzZSB7CiAgICAgIHN0cm9rZTogcmVkOwogICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICB9CgogICAgLnNlcmllcy5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiByZWN0IHsKICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgIHN0cm9rZS13aWR0aDogMjsKICAgIH0KCiAgICAuYW5ub3RhdGlvbi5zZXJpZXMuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgIHN0cm9rZS13aWR0aDogMjsKICAgIH0KCiAgICAvKiAtLS0gQnJpZGdlIE5vZGUgLS0tICovCiAgICAuYnJpZGdlID4gLm5vZGVzaGFwZSA+IHJlY3QgewogICAgICBzdHJva2U6ICNmMGY7CiAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgZGlzcGxheTogbm9uZTsKICAgIH0KCiAgICAvKiAtLS0gU3RydWN0dXJhbCBFbGVtZW50cyAtLS0gKi8KICAgIC5lZGdlID4gcGF0aC5lZGdlbGluZS5zdHJ1Y3R1cmFsIHsKICAgICAgc3Ryb2tlOiAjZjBmOwogICAgICBvcGFjaXR5OiAwLjI7CiAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICB9CgogICAgLyogUmVmZXJlbmNlIEVkZ2UgKi8KICAgIC5lZGdlID4gcGF0aC5lZGdlbGluZS5yZWZlcmVuY2VlZGdlIHsKICAgICAgc3Ryb2tlOiAjZmZiNzRkOwogICAgICBvcGFjaXR5OiAxOwogICAgfQoKICAgIC8qIC0tLSBTZXJpZXMgTm9kZXMgLS0tICovCgogICAgLyogSGlkZSB0aGUgcmVjdCBmb3IgYSBzZXJpZXMnIGFubm90YXRpb24uICovCiAgICAuc2VyaWVzID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICBkaXNwbGF5OiBub25lOwogICAgfQoKICAgIC8qIC0tLSBOb2RlIGxhYmVsIC0tLSAqLwoKICAgIC5ub2RlIHsKICAgICAgLyogUHJvdmlkZSBhIGhpbnQgdG8gYnJvd3NlcnMgdG8gYXZvaWQgdXNpbmcgdGhlaXIgc3RhdGljIHJhc3Rlcml6YXRpb24KICAgICAgYXQgaW5pdGlhbCBzY2FsZSwgd2hpY2ggbG9va3MgdmVyeSBwaXhlbGF0ZWQgb24gQ2hyb21pdW0gd2hlbiB6b29tZWQgaW4uCiAgICAgIE5vdGUgdGhhdCB3ZSBpbnRlbnRpb25hbGx5IGRvICpub3QqIHVzZSAnd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybScgYW5kCiAgICAgICd0cmFuc2xhdGVaKDApIGhlcmUsIHdoaWNoIGludHJvZHVjZSBibHVycmluZXNzIG9uIEZpcmVmb3guCiAgICAgIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9pc3N1ZXMvNDc0NCAqLwogICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVooMXB4KTsKICAgIH0KCiAgICAubm9kZSA+IHRleHQubm9kZWxhYmVsIHsKICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICBmaWxsOiAjNDQ0OwogICAgfQoKICAgIC5tZXRhLmV4cGFuZGVkID4gdGV4dC5ub2RlbGFiZWwgewogICAgICBmb250LXNpemU6IDlweDsKICAgIH0KCiAgICAuc2VyaWVzID4gdGV4dC5ub2RlbGFiZWwgewogICAgICBmb250LXNpemU6IDhweDsKICAgIH0KCiAgICAub3AgPiB0ZXh0Lm5vZGVsYWJlbCB7CiAgICAgIGZvbnQtc2l6ZTogNnB4OwogICAgfQoKICAgIC5icmlkZ2UgPiB0ZXh0Lm5vZGVsYWJlbCB7CiAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICB9CgogICAgLm5vZGUubWV0YS5leHBhbmRlZCA+IHRleHQubm9kZWxhYmVsIHsKICAgICAgY3Vyc29yOiBub3JtYWw7CiAgICB9CgogICAgLmFubm90YXRpb24ubWV0YS5oaWdobGlnaHRlZCA+IHRleHQuYW5ub3RhdGlvbi1sYWJlbCB7CiAgICAgIGZpbGw6ICM1MGEzZjc7CiAgICB9CgogICAgLmFubm90YXRpb24ubWV0YS5zZWxlY3RlZCA+IHRleHQuYW5ub3RhdGlvbi1sYWJlbCB7CiAgICAgIGZpbGw6ICM0Mjg1ZjQ7CiAgICB9CgogICAgLyogLS0tIEFubm90YXRpb24gLS0tICovCgogICAgLyogb25seSBhcHBsaWVkIGZvciBhbm5vdGF0aW9ucyB0aGF0IGFyZSBub3Qgc3VtbWFyeSBvciBjb25zdGFudC4KKC5zdW1tYXJ5LCAuY29uc3RhbnQgZ2V0cyBvdmVycmlkZGVuIGJlbG93KSAqLwogICAgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1ub2RlID4gKiB7CiAgICAgIHN0cm9rZS13aWR0aDogMC41OwogICAgICBzdHJva2UtZGFzaGFycmF5OiAxLCAxOwogICAgfQoKICAgIC5hbm5vdGF0aW9uLnN1bW1hcnkgPiAuYW5ub3RhdGlvbi1ub2RlID4gKiwKICAgIC5hbm5vdGF0aW9uLmNvbnN0YW50ID4gLmFubm90YXRpb24tbm9kZSA+ICogewogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IG5vbmU7CiAgICB9CgogICAgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlIHsKICAgICAgZmlsbDogbm9uZTsKICAgICAgc3Ryb2tlOiAjYWFhOwogICAgICBzdHJva2Utd2lkdGg6IDAuNTsKICAgICAgbWFya2VyLWVuZDogdXJsKCNhbm5vdGF0aW9uLWFycm93aGVhZCk7CiAgICB9CgogICAgLmZhZGVkIC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZSB7CiAgICAgIG1hcmtlci1lbmQ6IHVybCgjYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQpOwogICAgfQoKICAgIC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZS5yZWZsaW5lIHsKICAgICAgbWFya2VyLXN0YXJ0OiB1cmwoI3JlZi1hbm5vdGF0aW9uLWFycm93aGVhZCk7CiAgICB9CgogICAgLmZhZGVkIC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZS5yZWZsaW5lIHsKICAgICAgbWFya2VyLXN0YXJ0OiB1cmwoI3JlZi1hbm5vdGF0aW9uLWFycm93aGVhZC1mYWRlZCk7CiAgICB9CgogICAgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1jb250cm9sLWVkZ2UgewogICAgICBzdHJva2UtZGFzaGFycmF5OiAxLCAxOwogICAgfQoKICAgICNhbm5vdGF0aW9uLWFycm93aGVhZCB7CiAgICAgIGZpbGw6ICNhYWE7CiAgICB9CgogICAgI2Fubm90YXRpb24tYXJyb3doZWFkLWZhZGVkIHsKICAgICAgZmlsbDogI2UwZDRiMzsKICAgIH0KCiAgICAjcmVmLWFubm90YXRpb24tYXJyb3doZWFkIHsKICAgICAgZmlsbDogI2FhYTsKICAgIH0KCiAgICAjcmVmLWFubm90YXRpb24tYXJyb3doZWFkLWZhZGVkIHsKICAgICAgZmlsbDogI2UwZDRiMzsKICAgIH0KCiAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWxhYmVsIHsKICAgICAgZm9udC1zaXplOiA1cHg7CiAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIH0KICAgIC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tbGFiZWwuYW5ub3RhdGlvbi1lbGxpcHNpcyB7CiAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgIH0KCiAgICAvKiBIaWRlIGFubm90YXRpb25zIG9uIGV4cGFuZGVkIG1ldGEgbm9kZXMgc2luY2UgdGhleSdyZSByZWR1bmRhbnQuICovCiAgICAuZXhwYW5kZWQgPiAuaW4tYW5ub3RhdGlvbnMsCiAgICAuZXhwYW5kZWQgPiAub3V0LWFubm90YXRpb25zIHsKICAgICAgZGlzcGxheTogbm9uZTsKICAgIH0KCiAgICAvKiAtLS0gQW5ub3RhdGlvbjogQ29uc3RhbnQgLS0tICovCgogICAgLmNvbnN0YW50ID4gLmFubm90YXRpb24tbm9kZSA+IGVsbGlwc2UgewogICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIGZpbGw6IHdoaXRlOwogICAgICBzdHJva2U6ICM4NDg0ODQ7CiAgICB9CgogICAgLmNvbnN0YW50LnNlbGVjdGVkID4gLmFubm90YXRpb24tbm9kZSA+IGVsbGlwc2UgewogICAgICBmaWxsOiB3aGl0ZTsKICAgICAgc3Ryb2tlOiByZWQ7CiAgICB9CgogICAgLmNvbnN0YW50LmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IGVsbGlwc2UgewogICAgICBzdHJva2Utd2lkdGg6IDEuNTsKICAgIH0KCiAgICAvKiAtLS0gQW5ub3RhdGlvbjogU3VtbWFyeSAtLS0gKi8KCiAgICAuc3VtbWFyeSA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICBmaWxsOiAjZGI0NDM3OwogICAgICBzdHJva2U6ICNkYjQ0Mzc7CiAgICB9CgogICAgLnN1bW1hcnkuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gZWxsaXBzZSB7CiAgICAgIGZpbGw6ICNhNTI3MTQ7CiAgICAgIHN0cm9rZTogI2E1MjcxNDsKICAgIH0KCiAgICAuc3VtbWFyeS5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgc3Ryb2tlLXdpZHRoOiAxLjU7CiAgICB9CgogICAgLyogLS0tIEVkZ2UgLS0tICovCgogICAgLmVkZ2UgPiBwYXRoLmVkZ2VsaW5lIHsKICAgICAgZmlsbDogbm9uZTsKICAgICAgc3Ryb2tlOiAjYmJiOwogICAgICBzdHJva2UtbGluZWNhcDogcm91bmQ7CiAgICAgIHN0cm9rZS13aWR0aDogMC43NTsKICAgIH0KCiAgICAuZWRnZSAuc2VsZWN0YWJsZWVkZ2UgewogICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB9CgogICAgLnNlbGVjdGVkZWRnZSA+IHBhdGguZWRnZWxpbmUgewogICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgIHN0cm9rZTogI2YwMDsKICAgIH0KCiAgICAuZWRnZS5zZWxlY3RlZGVkZ2UgdGV4dCB7CiAgICAgIGZpbGw6ICMwMDA7CiAgICB9CgogICAgLyogTGFiZWxzIHNob3dpbmcgdGVuc29yIHNoYXBlcyBvbiBlZGdlcyAqLwogICAgLmVkZ2UgPiB0ZXh0IHsKICAgICAgZm9udC1zaXplOiAzLjVweDsKICAgICAgZmlsbDogIzY2NjsKICAgIH0KCiAgICAuZGF0YWZsb3ctYXJyb3doZWFkIHsKICAgICAgZmlsbDogI2JiYjsKICAgIH0KCiAgICAucmVmZXJlbmNlLWFycm93aGVhZCB7CiAgICAgIGZpbGw6ICNmZmI3NGQ7CiAgICB9CgogICAgLnNlbGVjdGVkLWFycm93aGVhZCB7CiAgICAgIGZpbGw6ICNmMDA7CiAgICB9CgogICAgLmVkZ2UgLmNvbnRyb2wtZGVwIHsKICAgICAgc3Ryb2tlLWRhc2hhcnJheTogMiwgMjsKICAgIH0KCiAgICAvKiAtLS0gR3JvdXAgbm9kZSBleHBhbmQvY29sbGFwc2UgYnV0dG9uIC0tLSAqLwoKICAgIC8qIEhpZGVzIGV4cGFuZC9jb2xsYXBzZSBidXR0b25zIHdoZW4gYSBub2RlIGlzbid0IGV4cGFuZGVkIG9yIGhpZ2hsaWdodGVkLiBVc2luZwogICBpbmNyZWRpYmx5IHNtYWxsIG9wYWNpdHkgc28gdGhhdCB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSA8Zz4gcGFyZW50IHN0aWxsIHRha2VzCiAgIHRoaXMgY29udGFpbmVyIGludG8gYWNjb3VudCBldmVuIHdoZW4gaXQgaXNuJ3QgdmlzaWJsZSAqLwogICAgLm5vZGU6bm90KC5oaWdobGlnaHRlZCk6bm90KC5leHBhbmRlZCkgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciB7CiAgICAgIG9wYWNpdHk6IDAuMDE7CiAgICB9CiAgICAubm9kZS5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiAuYnV0dG9uY29udGFpbmVyIHsKICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgfQogICAgLmJ1dHRvbmNpcmNsZSB7CiAgICAgIGZpbGw6ICNlNzgxMWQ7CiAgICB9CiAgICAuYnV0dG9uY2lyY2xlOmhvdmVyIHsKICAgICAgZmlsbDogI2I5NjcxNzsKICAgIH0KICAgIC5leHBhbmRidXR0b24sCiAgICAuY29sbGFwc2VidXR0b24gewogICAgICBzdHJva2U6IHdoaXRlOwogICAgfQogICAgLyogRG8gbm90IGxldCB0aGUgcGF0aCBlbGVtZW50cyBpbiB0aGUgYnV0dG9uIHRha2UgcG9pbnRlciBmb2N1cyAqLwogICAgLm5vZGUgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciA+IC5leHBhbmRidXR0b24sCiAgICAubm9kZSA+IC5ub2Rlc2hhcGUgPiAuYnV0dG9uY29udGFpbmVyID4gLmNvbGxhcHNlYnV0dG9uIHsKICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB9CiAgICAvKiBPbmx5IHNob3cgdGhlIGV4cGFuZCBidXR0b24gd2hlbiBhIG5vZGUgaXMgY29sbGFwc2VkIGFuZCBvbmx5IHNob3cgdGhlCiAgIGNvbGxhcHNlIGJ1dHRvbiB3aGVuIGEgbm9kZSBpcyBleHBhbmRlZC4gKi8KICAgIC5ub2RlLmV4cGFuZGVkID4gLm5vZGVzaGFwZSA+IC5idXR0b25jb250YWluZXIgPiAuZXhwYW5kYnV0dG9uIHsKICAgICAgZGlzcGxheTogbm9uZTsKICAgIH0KICAgIC5ub2RlOm5vdCguZXhwYW5kZWQpID4gLm5vZGVzaGFwZSA+IC5idXR0b25jb250YWluZXIgPiAuY29sbGFwc2VidXR0b24gewogICAgICBkaXNwbGF5OiBub25lOwogICAgfQoKICAgIC5oZWFsdGgtcGlsbC1zdGF0cyB7CiAgICAgIGZvbnQtc2l6ZTogNHB4OwogICAgICB0ZXh0LWFuY2hvcjogbWlkZGxlOwogICAgfQoKICAgIC5oZWFsdGgtcGlsbCByZWN0IHsKICAgICAgZmlsdGVyOiB1cmwoI2hlYWx0aC1waWxsLXNoYWRvdyk7CiAgICAgIHJ4OiAzOwogICAgICByeTogMzsKICAgIH0KCiAgICAudGl0bGVDb250YWluZXIgewogICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIHRvcDogMjBweDsKICAgIH0KCiAgICAudGl0bGUsCiAgICAuYXV4VGl0bGUsCiAgICAuZnVuY3Rpb25MaWJyYXJ5VGl0bGUgewogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB9CgogICAgI21pbmltYXAgewogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIHJpZ2h0OiAyMHB4OwogICAgICBib3R0b206IDIwcHg7CiAgICB9CgogICAgLmNvbnRleHQtbWVudSB7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2UyZTJlMjsKICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkNGQ0ZDQ7CiAgICB9CgogICAgLmNvbnRleHQtbWVudSB1bCB7CiAgICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKICAgICAgbWFyZ2luOiAwOwogICAgICBwYWRkaW5nOiAwOwogICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICB9CgogICAgLmNvbnRleHQtbWVudSB1bCBsaSB7CiAgICAgIHBhZGRpbmc6IDRweCAxNnB4OwogICAgfQoKICAgIC5jb250ZXh0LW1lbnUgdWwgbGk6aG92ZXIgewogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjM5MTNlOwogICAgICBjb2xvcjogd2hpdGU7CiAgICB9CiAgPC9zdHlsZT4KICA8ZGl2IGNsYXNzPSJ0aXRsZUNvbnRhaW5lciI+CiAgICA8ZGl2IGlkPSJ0aXRsZSIgY2xhc3M9InRpdGxlIj5NYWluIEdyYXBoPC9kaXY+CiAgICA8ZGl2IGlkPSJhdXhUaXRsZSIgY2xhc3M9ImF1eFRpdGxlIj5BdXhpbGlhcnkgTm9kZXM8L2Rpdj4KICAgIDxkaXYgaWQ9ImZ1bmN0aW9uTGlicmFyeVRpdGxlIiBjbGFzcz0iZnVuY3Rpb25MaWJyYXJ5VGl0bGUiPkZ1bmN0aW9uczwvZGl2PgogIDwvZGl2PgogIDxzdmcgaWQ9InN2ZyI+CiAgICA8ZGVmcz4KICAgICAgPCEtLSBBcnJvdyBoZWFkcyBmb3IgcmVmZXJlbmNlIGVkZ2UgcGF0aHMgb2YgZGlmZmVyZW50IHByZWRlZmluZWQgc2l6ZXMgcGVyIGNvbG9yLiAtLT4KICAgICAgPHBhdGgKICAgICAgICBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1wYXRoIgogICAgICAgIGQ9Ik0gMCwwIEwgMTAsNSBMIDAsMTAgQyAzLDcgMywzIDAsMCIKICAgICAgPjwvcGF0aD4KICAgICAgPG1hcmtlcgogICAgICAgIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIgogICAgICAgIGlkPSJyZWZlcmVuY2UtYXJyb3doZWFkLXNtYWxsIgogICAgICAgIHZpZXdCb3g9IjAgMCAxMCAxMCIKICAgICAgICBtYXJrZXJXaWR0aD0iNSIKICAgICAgICBtYXJrZXJIZWlnaHQ9IjUiCiAgICAgICAgcmVmWD0iMiIKICAgICAgICByZWZZPSI1IgogICAgICAgIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIgogICAgICAgIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgPgogICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3JlZmVyZW5jZS1hcnJvd2hlYWQtcGF0aCI+PC91c2U+CiAgICAgIDwvbWFya2VyPgogICAgICA8bWFya2VyCiAgICAgICAgY2xhc3M9InJlZmVyZW5jZS1hcnJvd2hlYWQiCiAgICAgICAgaWQ9InJlZmVyZW5jZS1hcnJvd2hlYWQtbWVkaXVtIgogICAgICAgIHZpZXdCb3g9IjAgMCAxMCAxMCIKICAgICAgICBtYXJrZXJXaWR0aD0iMTMiCiAgICAgICAgbWFya2VySGVpZ2h0PSIxMyIKICAgICAgICByZWZYPSIyIgogICAgICAgIHJlZlk9IjUiCiAgICAgICAgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiCiAgICAgICAgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICA+CiAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcmVmZXJlbmNlLWFycm93aGVhZC1wYXRoIj48L3VzZT4KICAgICAgPC9tYXJrZXI+CiAgICAgIDxtYXJrZXIKICAgICAgICBjbGFzcz0icmVmZXJlbmNlLWFycm93aGVhZCIKICAgICAgICBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1sYXJnZSIKICAgICAgICB2aWV3Qm94PSIwIDAgMTAgMTAiCiAgICAgICAgbWFya2VyV2lkdGg9IjE2IgogICAgICAgIG1hcmtlckhlaWdodD0iMTYiCiAgICAgICAgcmVmWD0iMiIKICAgICAgICByZWZZPSI1IgogICAgICAgIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIgogICAgICAgIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgPgogICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3JlZmVyZW5jZS1hcnJvd2hlYWQtcGF0aCI+PC91c2U+CiAgICAgIDwvbWFya2VyPgogICAgICA8bWFya2VyCiAgICAgICAgY2xhc3M9InJlZmVyZW5jZS1hcnJvd2hlYWQiCiAgICAgICAgaWQ9InJlZmVyZW5jZS1hcnJvd2hlYWQteGxhcmdlIgogICAgICAgIHZpZXdCb3g9IjAgMCAxMCAxMCIKICAgICAgICBtYXJrZXJXaWR0aD0iMjAiCiAgICAgICAgbWFya2VySGVpZ2h0PSIyMCIKICAgICAgICByZWZYPSIyIgogICAgICAgIHJlZlk9IjUiCiAgICAgICAgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiCiAgICAgICAgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICA+CiAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcmVmZXJlbmNlLWFycm93aGVhZC1wYXRoIj48L3VzZT4KICAgICAgPC9tYXJrZXI+CgogICAgICA8IS0tIEFycm93IGhlYWRzIGZvciBkYXRhZmxvdyBlZGdlIHBhdGhzIG9mIGRpZmZlcmVudCBwcmVkZWZpbmVkIHNpemVzIHBlciBjb2xvci4gLS0+CiAgICAgIDxwYXRoCiAgICAgICAgaWQ9ImRhdGFmbG93LWFycm93aGVhZC1wYXRoIgogICAgICAgIGQ9Ik0gMCwwIEwgMTAsNSBMIDAsMTAgQyAzLDcgMywzIDAsMCIKICAgICAgPjwvcGF0aD4KICAgICAgPG1hcmtlcgogICAgICAgIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiCiAgICAgICAgaWQ9ImRhdGFmbG93LWFycm93aGVhZC1zbWFsbCIKICAgICAgICB2aWV3Qm94PSIwIDAgMTAgMTAiCiAgICAgICAgbWFya2VyV2lkdGg9IjUiCiAgICAgICAgbWFya2VySGVpZ2h0PSI1IgogICAgICAgIHJlZlg9IjIiCiAgICAgICAgcmVmWT0iNSIKICAgICAgICBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIKICAgICAgICBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgID4KICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNkYXRhZmxvdy1hcnJvd2hlYWQtcGF0aCI+PC91c2U+CiAgICAgIDwvbWFya2VyPgogICAgICA8bWFya2VyCiAgICAgICAgY2xhc3M9ImRhdGFmbG93LWFycm93aGVhZCIKICAgICAgICBpZD0iZGF0YWZsb3ctYXJyb3doZWFkLW1lZGl1bSIKICAgICAgICB2aWV3Qm94PSIwIDAgMTAgMTAiCiAgICAgICAgbWFya2VyV2lkdGg9IjEzIgogICAgICAgIG1hcmtlckhlaWdodD0iMTMiCiAgICAgICAgcmVmWD0iMiIKICAgICAgICByZWZZPSI1IgogICAgICAgIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIgogICAgICAgIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgPgogICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2RhdGFmbG93LWFycm93aGVhZC1wYXRoIj48L3VzZT4KICAgICAgPC9tYXJrZXI+CiAgICAgIDxtYXJrZXIKICAgICAgICBjbGFzcz0iZGF0YWZsb3ctYXJyb3doZWFkIgogICAgICAgIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtbGFyZ2UiCiAgICAgICAgdmlld0JveD0iMCAwIDEwIDEwIgogICAgICAgIG1hcmtlcldpZHRoPSIxNiIKICAgICAgICBtYXJrZXJIZWlnaHQ9IjE2IgogICAgICAgIHJlZlg9IjIiCiAgICAgICAgcmVmWT0iNSIKICAgICAgICBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIKICAgICAgICBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgID4KICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNkYXRhZmxvdy1hcnJvd2hlYWQtcGF0aCI+PC91c2U+CiAgICAgIDwvbWFya2VyPgogICAgICA8bWFya2VyCiAgICAgICAgY2xhc3M9ImRhdGFmbG93LWFycm93aGVhZCIKICAgICAgICBpZD0iZGF0YWZsb3ctYXJyb3doZWFkLXhsYXJnZSIKICAgICAgICB2aWV3Qm94PSIwIDAgMTAgMTAiCiAgICAgICAgbWFya2VyV2lkdGg9IjIwIgogICAgICAgIG1hcmtlckhlaWdodD0iMjAiCiAgICAgICAgcmVmWD0iMiIKICAgICAgICByZWZZPSI1IgogICAgICAgIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIgogICAgICAgIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgPgogICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2RhdGFmbG93LWFycm93aGVhZC1wYXRoIj48L3VzZT4KICAgICAgPC9tYXJrZXI+CgogICAgICA8IS0tIEFycm93IGhlYWQgZm9yIGFubm90YXRpb24gZWRnZSBwYXRocy4gLS0+CiAgICAgIDxtYXJrZXIKICAgICAgICBpZD0iYW5ub3RhdGlvbi1hcnJvd2hlYWQiCiAgICAgICAgbWFya2VyV2lkdGg9IjUiCiAgICAgICAgbWFya2VySGVpZ2h0PSI1IgogICAgICAgIHJlZlg9IjUiCiAgICAgICAgcmVmWT0iMi41IgogICAgICAgIG9yaWVudD0iYXV0byIKICAgICAgPgogICAgICAgIDxwYXRoIGQ9Ik0gMCwwIEwgNSwyLjUgTCAwLDUgTCAwLDAiPjwvcGF0aD4KICAgICAgPC9tYXJrZXI+CiAgICAgIDxtYXJrZXIKICAgICAgICBpZD0iYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQiCiAgICAgICAgbWFya2VyV2lkdGg9IjUiCiAgICAgICAgbWFya2VySGVpZ2h0PSI1IgogICAgICAgIHJlZlg9IjUiCiAgICAgICAgcmVmWT0iMi41IgogICAgICAgIG9yaWVudD0iYXV0byIKICAgICAgPgogICAgICAgIDxwYXRoIGQ9Ik0gMCwwIEwgNSwyLjUgTCAwLDUgTCAwLDAiPjwvcGF0aD4KICAgICAgPC9tYXJrZXI+CiAgICAgIDxtYXJrZXIKICAgICAgICBpZD0icmVmLWFubm90YXRpb24tYXJyb3doZWFkIgogICAgICAgIG1hcmtlcldpZHRoPSI1IgogICAgICAgIG1hcmtlckhlaWdodD0iNSIKICAgICAgICByZWZYPSIwIgogICAgICAgIHJlZlk9IjIuNSIKICAgICAgICBvcmllbnQ9ImF1dG8iCiAgICAgID4KICAgICAgICA8cGF0aCBkPSJNIDUsMCBMIDAsMi41IEwgNSw1IEwgNSwwIj48L3BhdGg+CiAgICAgIDwvbWFya2VyPgogICAgICA8bWFya2VyCiAgICAgICAgaWQ9InJlZi1hbm5vdGF0aW9uLWFycm93aGVhZC1mYWRlZCIKICAgICAgICBtYXJrZXJXaWR0aD0iNSIKICAgICAgICBtYXJrZXJIZWlnaHQ9IjUiCiAgICAgICAgcmVmWD0iMCIKICAgICAgICByZWZZPSIyLjUiCiAgICAgICAgb3JpZW50PSJhdXRvIgogICAgICA+CiAgICAgICAgPHBhdGggZD0iTSA1LDAgTCAwLDIuNSBMIDUsNSBMIDUsMCI+PC9wYXRoPgogICAgICA8L21hcmtlcj4KICAgICAgPCEtLSBUZW1wbGF0ZSBmb3IgYW4gT3Agbm9kZSBlbGxpcHNlLiAtLT4KICAgICAgPGVsbGlwc2UKICAgICAgICBpZD0ib3Atbm9kZS1zdGFtcCIKICAgICAgICByeD0iNy41IgogICAgICAgIHJ5PSIzIgogICAgICAgIHN0cm9rZT0iaW5oZXJpdCIKICAgICAgICBmaWxsPSJpbmhlcml0IgogICAgICA+PC9lbGxpcHNlPgogICAgICA8IS0tIFRlbXBsYXRlIGZvciBhbiBPcCBub2RlIGFubm90YXRpb24gZWxsaXBzZSAoc21hbGxlcikuIC0tPgogICAgICA8ZWxsaXBzZQogICAgICAgIGlkPSJvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiCiAgICAgICAgcng9IjUiCiAgICAgICAgcnk9IjIiCiAgICAgICAgc3Ryb2tlPSJpbmhlcml0IgogICAgICAgIGZpbGw9ImluaGVyaXQiCiAgICAgID48L2VsbGlwc2U+CiAgICAgIDwhLS0gVmVydGljYWxseSBzdGFja2VkIHNlcmllcyBvZiBPcCBub2RlcyB3aGVuIHVuZXhwYW5kZWQuIC0tPgogICAgICA8ZyBpZD0ib3Atc2VyaWVzLXZlcnRpY2FsLXN0YW1wIj4KICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSI5Ij48L3VzZT4KICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSI2Ij48L3VzZT4KICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSIzIj48L3VzZT4KICAgICAgPC9nPgogICAgICA8IS0tIEhvcml6b250YWxseSBzdGFja2VkIHNlcmllcyBvZiBPcCBub2RlcyB3aGVuIHVuZXhwYW5kZWQuIC0tPgogICAgICA8ZyBpZD0ib3Atc2VyaWVzLWhvcml6b250YWwtc3RhbXAiPgogICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjE2IiB5PSI0Ij48L3VzZT4KICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSIxMiIgeT0iNCI+PC91c2U+CiAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iOCIgeT0iNCI+PC91c2U+CiAgICAgIDwvZz4KICAgICAgPCEtLSBIb3Jpem9udGFsbHkgc3RhY2tlZCBzZXJpZXMgb2YgT3Agbm9kZXMgZm9yIGFubm90YXRpb24uIC0tPgogICAgICA8ZyBpZD0ib3Atc2VyaWVzLWFubm90YXRpb24tc3RhbXAiPgogICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtYW5ub3RhdGlvbi1zdGFtcCIgeD0iOSIgeT0iMiI+PC91c2U+CiAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1hbm5vdGF0aW9uLXN0YW1wIiB4PSI3IiB5PSIyIj48L3VzZT4KICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjUiIHk9IjIiPjwvdXNlPgogICAgICA8L2c+CiAgICAgIDxzdmcKICAgICAgICBpZD0ic3VtbWFyeS1pY29uIgogICAgICAgIGZpbGw9IiM4NDg0ODQiCiAgICAgICAgaGVpZ2h0PSIxMiIKICAgICAgICB2aWV3Qm94PSIwIDAgMjQgMjQiCiAgICAgICAgd2lkdGg9IjEyIgogICAgICA+CiAgICAgICAgPHBhdGgKICAgICAgICAgIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnpNOSAxN0g3di03aDJ2N3ptNCAwaC0yVjdoMnYxMHptNCAwaC0ydi00aDJ2NHoiCiAgICAgICAgPjwvcGF0aD4KICAgICAgPC9zdmc+CgogICAgICA8IS0tIEhhdGNoIHBhdHRlcm5zIGZvciBmYWRlZCBvdXQgbm9kZXMuIC0tPgogICAgICA8cGF0dGVybgogICAgICAgIGlkPSJyZWN0SGF0Y2giCiAgICAgICAgcGF0dGVyblRyYW5zZm9ybT0icm90YXRlKDQ1IDAgMCkiCiAgICAgICAgd2lkdGg9IjUiCiAgICAgICAgaGVpZ2h0PSI1IgogICAgICAgIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgID4KICAgICAgICA8bGluZSB4MT0iMCIgeTE9IjAiIHgyPSIwIiB5Mj0iNSIgc3R5bGU9InN0cm9rZS13aWR0aDogMSI+PC9saW5lPgogICAgICA8L3BhdHRlcm4+CiAgICAgIDxwYXR0ZXJuCiAgICAgICAgaWQ9ImVsbGlwc2VIYXRjaCIKICAgICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJyb3RhdGUoNDUgMCAwKSIKICAgICAgICB3aWR0aD0iMiIKICAgICAgICBoZWlnaHQ9IjIiCiAgICAgICAgcGF0dGVyblVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgPgogICAgICAgIDxsaW5lIHgxPSIwIiB5MT0iMCIgeDI9IjAiIHkyPSIyIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxIj48L2xpbmU+CiAgICAgIDwvcGF0dGVybj4KCiAgICAgIDwhLS0gQSBzaGFkb3cgZm9yIGhlYWx0aCBwaWxscy4gLS0+CiAgICAgIDxmaWx0ZXIKICAgICAgICBpZD0iaGVhbHRoLXBpbGwtc2hhZG93IgogICAgICAgIHg9Ii00MCUiCiAgICAgICAgeT0iLTQwJSIKICAgICAgICB3aWR0aD0iMTgwJSIKICAgICAgICBoZWlnaHQ9IjE4MCUiCiAgICAgID4KICAgICAgICA8ZmVHYXVzc2lhbkJsdXIgaW49IlNvdXJjZUFscGhhIiBzdGREZXZpYXRpb249IjAuOCI+PC9mZUdhdXNzaWFuQmx1cj4KICAgICAgICA8ZmVPZmZzZXQgZHg9IjAiIGR5PSIwIiByZXN1bHQ9Im9mZnNldGJsdXIiPjwvZmVPZmZzZXQ+CiAgICAgICAgPGZlRmxvb2QgZmxvb2QtY29sb3I9IiMwMDAwMDAiPjwvZmVGbG9vZD4KICAgICAgICA8ZmVDb21wb3NpdGUgaW4yPSJvZmZzZXRibHVyIiBvcGVyYXRvcj0iaW4iPjwvZmVDb21wb3NpdGU+CiAgICAgICAgPGZlTWVyZ2U+CiAgICAgICAgICA8ZmVNZXJnZU5vZGU+PC9mZU1lcmdlTm9kZT4KICAgICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iU291cmNlR3JhcGhpYyI+PC9mZU1lcmdlTm9kZT4KICAgICAgICA8L2ZlTWVyZ2U+CiAgICAgIDwvZmlsdGVyPgogICAgPC9kZWZzPgogICAgPCEtLSBNYWtlIGEgbGFyZ2UgcmVjdGFuZ2xlIHRoYXQgZmlsbHMgdGhlIHN2ZyBzcGFjZSBzbyB0aGF0CiAgem9vbSBldmVudHMgZ2V0IGNhcHR1cmVkIG9uIHNhZmFyaSAtLT4KICAgIDxyZWN0IGZpbGw9IndoaXRlIiB3aWR0aD0iMTAwMDAiIGhlaWdodD0iMTAwMDAiPjwvcmVjdD4KICAgIDxnIGlkPSJyb290Ij48L2c+CiAgPC9zdmc+CiAgPHRmLWdyYXBoLW1pbmltYXAgaWQ9Im1pbmltYXAiPjwvdGYtZ3JhcGgtbWluaW1hcD4KICA8ZGl2IGlkPSJjb250ZXh0TWVudSIgY2xhc3M9ImNvbnRleHQtbWVudSI+PC9kaXY+CmA7bGV0IFVadD1jbGFzcyBleHRlbmRzKGNyKGdsKHdlKSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl96b29tZWQ9ITEsdGhpcy5fem9vbVN0YXJ0Q29vcmRzPW51bGwsdGhpcy5fem9vbVRyYW5zZm9ybT1udWxsLHRoaXMuX21heFpvb21EaXN0YW5jZUZvckNsaWNrPTIwLHRoaXMuX25vZGVHcm91cEluZGV4PXt9LHRoaXMuX2Fubm90YXRpb25Hcm91cEluZGV4PXt9LHRoaXMuX2VkZ2VHcm91cEluZGV4PXt9LHRoaXMubWF4TWV0YW5vZGVMYWJlbExlbmd0aEZvbnRTaXplPTksdGhpcy5taW5NZXRhbm9kZUxhYmVsTGVuZ3RoRm9udFNpemU9Nix0aGlzLm1heE1ldGFub2RlTGFiZWxMZW5ndGhMYXJnZUZvbnQ9MTEsdGhpcy5tYXhNZXRhbm9kZUxhYmVsTGVuZ3RoPTE4fWdldE5vZGUodCl7cmV0dXJuIHRoaXMucmVuZGVySGllcmFyY2h5LmdldFJlbmRlck5vZGVCeU5hbWUodCl9aXNOb2RlRXhwYW5kZWQodCl7cmV0dXJuIHQuZXhwYW5kZWR9c2V0Tm9kZUV4cGFuZGVkKHQpe3RoaXMuX2J1aWxkKHRoaXMucmVuZGVySGllcmFyY2h5KSx0aGlzLl91cGRhdGVMYWJlbHMoIXRoaXMuX3pvb21lZCl9cGFuVG9Ob2RlKHQpeyhmdW5jdGlvbiBlKHQsbixpLHIpe2NvbnN0IG89RHUobikuc2VsZWN0KGBbZGF0YS1uYW1lPSIke3R9Il1gKS5ub2RlKCk7aWYoIW8pcmV0dXJuIGNvbnNvbGUud2FybihgcGFuVG9Ob2RlKCkgZmFpbGVkIGZvciBub2RlIG5hbWUgIiR7dH0iYCksITE7bGV0IGE9by5nZXRCQm94KCkscz1vLmdldFNjcmVlbkNUTSgpLGw9bi5jcmVhdGVTVkdQb2ludCgpLGM9bi5jcmVhdGVTVkdQb2ludCgpO2wueD1hLngsbC55PWEueSxjLng9YS54K2Eud2lkdGgsYy55PWEueSthLmhlaWdodCxsPWwubWF0cml4VHJhbnNmb3JtKHMpLGM9Yy5tYXRyaXhUcmFuc2Zvcm0ocyk7bGV0IHU9KHQsZSxuLGkpPT4hKHQ+biYmZTxpKSxoPW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7Y29uc3QgZD1oLnRvcCtoLmhlaWdodC0xNTA7aWYodShsLngsYy54LGgubGVmdCxoLmxlZnQraC53aWR0aC0zMjApfHx1KGwueSxjLnksaC50b3AsZCkpe2xldCB0PWgubGVmdCtoLndpZHRoLzItKGwueCtjLngpLzIsZT1oLnRvcCtoLmhlaWdodC8yLShsLnkrYy55KS8yO2NvbnN0IGk9WU4obik7cmV0dXJuIER1KG4pLnRyYW5zaXRpb24oKS5kdXJhdGlvbig1MDApLmNhbGwoci50cmFuc2xhdGVCeSx0L2kuayxlL2kuayksITB9cmV0dXJuITF9KSh0LHRoaXMuJC5zdmcsMCx0aGlzLl96b29tKSYmKHRoaXMuX3pvb21lZD0hMCl9Z2V0R3JhcGhTdmdSb290KCl7cmV0dXJuIHRoaXMuJC5zdmd9Z2V0Q29udGV4dE1lbnUoKXtyZXR1cm4gdGhpcy4kLmNvbnRleHRNZW51fV9yZXNldFN0YXRlKCl7dGhpcy5fbm9kZUdyb3VwSW5kZXg9e30sdGhpcy5fYW5ub3RhdGlvbkdyb3VwSW5kZXg9e30sdGhpcy5fZWRnZUdyb3VwSW5kZXg9e30sdGhpcy5fdXBkYXRlTGFiZWxzKCExKSxEdSh0aGlzLiQuc3ZnKS5zZWxlY3QoIiNyb290Iikuc2VsZWN0QWxsKCIqIikucmVtb3ZlKCksQVp0KHRoaXMuJC5zdmcpfV9idWlsZCh0KXt0aGlzLnRlbXBsYXRlSW5kZXg9dC5oaWVyYXJjaHkuZ2V0VGVtcGxhdGVJbmRleCgpLGQkdCgidGYtZ3JhcGgtc2NlbmUgKGxheW91dCk6IixmdW5jdGlvbigpe0dLdCh0LnJvb3QpfS5iaW5kKHRoaXMpLEJBdC5SRU5ERVJfU0NFTkVfTEFZT1VUKSxkJHQoInRmLWdyYXBoLXNjZW5lIChidWlsZCBzY2VuZSk6IixmdW5jdGlvbigpe0JadChEdSh0aGlzLiQucm9vdCksdC5yb290LHRoaXMpLChmdW5jdGlvbiBlKHQsbil7RHUodCkub24oImNsaWNrIiwoKCk9PntuLmZpcmUoImdyYXBoLXNlbGVjdCIpfSkpfSkodGhpcy4kLnN2Zyx0aGlzKSx0aGlzLl91cGRhdGVJbnB1dFRyYWNlKCl9LmJpbmQodGhpcyksQkF0LlJFTkRFUl9TQ0VORV9CVUlMRF9TQ0VORSksc2V0VGltZW91dChmdW5jdGlvbigpe3RoaXMuX3VwZGF0ZUhlYWx0aFBpbGxzKHRoaXMubm9kZU5hbWVzVG9IZWFsdGhQaWxscyx0aGlzLmhlYWx0aFBpbGxTdGVwSW5kZXgpLHRoaXMubWluaW1hcC51cGRhdGUoKX0uYmluZCh0aGlzKSxVS3QuYW5pbWF0aW9uLmR1cmF0aW9uKX1yZWFkeSgpe3N1cGVyLnJlYWR5KCksdGhpcy5fem9vbT1uSSgpLm9uKCJlbmQiLGZ1bmN0aW9uKCl7dGhpcy5fem9vbVN0YXJ0Q29vcmRzJiYoTWF0aC5zcXJ0KE1hdGgucG93KHRoaXMuX3pvb21TdGFydENvb3Jkcy54LXRoaXMuX3pvb21UcmFuc2Zvcm0ueCwyKStNYXRoLnBvdyh0aGlzLl96b29tU3RhcnRDb29yZHMueS10aGlzLl96b29tVHJhbnNmb3JtLnksMikpPHRoaXMuX21heFpvb21EaXN0YW5jZUZvckNsaWNrP3RoaXMuX2ZpcmVFbmFibGVDbGljaygpOnNldFRpbWVvdXQodGhpcy5fZmlyZUVuYWJsZUNsaWNrLmJpbmQodGhpcyksNTApKTt0aGlzLl96b29tU3RhcnRDb29yZHM9bnVsbH0uYmluZCh0aGlzKSkub24oInpvb20iLGZ1bmN0aW9uKCl7dGhpcy5fem9vbVRyYW5zZm9ybT1NdS50cmFuc2Zvcm0sdGhpcy5fem9vbVN0YXJ0Q29vcmRzfHwodGhpcy5fem9vbVN0YXJ0Q29vcmRzPXRoaXMuX3pvb21UcmFuc2Zvcm0sdGhpcy5maXJlKCJkaXNhYmxlLWNsaWNrIikpLHRoaXMuX3pvb21lZD0hMCxEdSh0aGlzLiQucm9vdCkuYXR0cigidHJhbnNmb3JtIixNdS50cmFuc2Zvcm0pLHRoaXMubWluaW1hcC56b29tKE11LnRyYW5zZm9ybSl9LmJpbmQodGhpcykpLER1KHRoaXMuJC5zdmcpLmNhbGwodGhpcy5fem9vbSkub24oImRibGNsaWNrLnpvb20iLG51bGwpLER1KHdpbmRvdykub24oInJlc2l6ZSIsZnVuY3Rpb24oKXt0aGlzLm1pbmltYXAuem9vbSgpfS5iaW5kKHRoaXMpKSx0aGlzLm1pbmltYXA9dGhpcy4kLm1pbmltYXAuaW5pdCh0aGlzLiQuc3ZnLHRoaXMuJC5yb290LHRoaXMuX3pvb20sVUt0Lm1pbmltYXAuc2l6ZSxVS3Quc3Vic2NlbmUubWV0YS5sYWJlbEhlaWdodCl9YXR0YWNoZWQoKXt0aGlzLnNldCgiX2lzQXR0YWNoZWQiLCEwKX1kZXRhY2hlZCgpe3RoaXMuc2V0KCJfaXNBdHRhY2hlZCIsITEpfV9yZW5kZXJIaWVyYXJjaHlDaGFuZ2VkKCl7dmFyIHQ9dGhpcy5yZW5kZXJIaWVyYXJjaHk7dGhpcy5faGFzUmVuZGVySGllcmFyY2h5QmVlbkZpdE9uY2U9ITEsdGhpcy5fcmVzZXRTdGF0ZSgpLHRoaXMuX2J1aWxkKHQpfV9hbmltYXRlQW5kRml0KCl7IXRoaXMuX2hhc1JlbmRlckhpZXJhcmNoeUJlZW5GaXRPbmNlJiZ0aGlzLl9pc0F0dGFjaGVkJiZzZXRUaW1lb3V0KHRoaXMuZml0LmJpbmQodGhpcyksVUt0LmFuaW1hdGlvbi5kdXJhdGlvbil9X3VwZGF0ZUxhYmVscyh0KXt2YXIgZT10aGlzLiQkKCIudGl0bGUiKSxuPWUuc3R5bGUsaT10aGlzLiQkKCIuYXV4VGl0bGUiKSxyPWkuc3R5bGUsbz10aGlzLiQkKCIuZnVuY3Rpb25MaWJyYXJ5VGl0bGUiKS5zdHlsZTtjb25zdCBhPUR1KHRoaXMuJC5zdmcpO3ZhciBzPWEuc2VsZWN0KCIuIitaS3QuU2NlbmUuR1JPVVArIj4uIitaS3QuU2NlbmUuQ09SRSkubm9kZSgpO2lmKHQmJnMmJnRoaXMucHJvZ3Jlc3MmJjEwMD09PXRoaXMucHJvZ3Jlc3MudmFsdWUpe3ZhciBsPWEuc2VsZWN0KCIuIitaS3QuU2NlbmUuR1JPVVArIj4uIitaS3QuU2NlbmUuSU5FWFRSQUNUKS5ub2RlKCl8fGEuc2VsZWN0KCIuIitaS3QuU2NlbmUuR1JPVVArIj4uIitaS3QuU2NlbmUuT1VURVhUUkFDVCkubm9kZSgpLGM9cy5nZXRDVE0oKS5lLHU9bD9sLmdldENUTSgpLmU6bnVsbDtuLmRpc3BsYXk9ImlubGluZSIsbi5sZWZ0PWMrInB4IixudWxsIT09dSYmdSE9PWM/KHIuZGlzcGxheT0iaW5saW5lIix1PU1hdGgubWF4KGMrZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCx1KSxyLmxlZnQ9dSsicHgiKTpyLmRpc3BsYXk9Im5vbmUiO2xldCB0PWEuc2VsZWN0KCIuIitaS3QuU2NlbmUuR1JPVVArIj4uIitaS3QuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSkubm9kZSgpLGg9dD90LmdldENUTSgpLmU6bnVsbDtudWxsIT09aCYmaCE9PXU/KG8uZGlzcGxheT0iaW5saW5lIixoPU1hdGgubWF4KHUraS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCxoKSxvLmxlZnQ9aCsicHgiKTpvLmRpc3BsYXk9Im5vbmUifWVsc2Ugbi5kaXNwbGF5PSJub25lIixyLmRpc3BsYXk9Im5vbmUiLG8uZGlzcGxheT0ibm9uZSJ9bm9kZUNvbG9yc0NoYW5nZWQoKXtudWxsIT10aGlzLnJlbmRlckhpZXJhcmNoeSYmKHRoaXMudGVtcGxhdGVJbmRleD10aGlzLnJlbmRlckhpZXJhcmNoeS5oaWVyYXJjaHkuZ2V0VGVtcGxhdGVJbmRleCgpLENlLmV4cG9ydHMuZWFjaCh0aGlzLl9ub2RlR3JvdXBJbmRleCwoKHQsZSk9Pnt0aGlzLl91cGRhdGVOb2RlU3RhdGUoZSl9KSksdGhpcy5taW5pbWFwLnVwZGF0ZSgpKX1maXQoKXt0aGlzLl9oYXNSZW5kZXJIaWVyYXJjaHlCZWVuRml0T25jZT0hMCwoZnVuY3Rpb24gdChlLG4saSxyKXtsZXQgbz1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGE9bnVsbDt0cnl7aWYoYT1uLmdldEJCb3goKSwwPT09YS53aWR0aClyZXR1cm59Y2F0Y2godCl7cmV0dXJufWxldCBzPS45Kk1hdGgubWluKG8ud2lkdGgvYS53aWR0aCxvLmhlaWdodC9hLmhlaWdodCwyKSxsPVVLdC5ncmFwaDtjb25zdCBjPXFOLnNjYWxlKHMpLnRyYW5zbGF0ZShsLnBhZGRpbmcucGFkZGluZ0xlZnQsbC5wYWRkaW5nLnBhZGRpbmdUb3ApO0R1KGUpLnRyYW5zaXRpb24oKS5kdXJhdGlvbig1MDApLmNhbGwoaS50cmFuc2Zvcm0sYykub24oImVuZC5maXR0ZWQiLCgoKT0+e2kub24oImVuZC5maXR0ZWQiLG51bGwpLHIoKX0pKX0pKHRoaXMuJC5zdmcsdGhpcy4kLnJvb3QsdGhpcy5fem9vbSxmdW5jdGlvbigpe3RoaXMuX3pvb21lZD0hMX0uYmluZCh0aGlzKSl9Z2V0SW1hZ2VCbG9iKCl7cmV0dXJuIHRoaXMubWluaW1hcC5nZXRJbWFnZUJsb2IoKX1pc05vZGVTZWxlY3RlZCh0KXtyZXR1cm4gdD09PXRoaXMuc2VsZWN0ZWROb2RlfWlzTm9kZUhpZ2hsaWdodGVkKHQpe3JldHVybiB0PT09dGhpcy5oaWdobGlnaHRlZE5vZGV9YWRkQW5ub3RhdGlvbkdyb3VwKHQsZSxuKXt2YXIgaT10Lm5vZGUubmFtZTt0aGlzLl9hbm5vdGF0aW9uR3JvdXBJbmRleFtpXT10aGlzLl9hbm5vdGF0aW9uR3JvdXBJbmRleFtpXXx8e30sdGhpcy5fYW5ub3RhdGlvbkdyb3VwSW5kZXhbaV1bZS5ub2RlLm5hbWVdPW59Z2V0QW5ub3RhdGlvbkdyb3Vwc0luZGV4KHQpe3JldHVybiB0aGlzLl9hbm5vdGF0aW9uR3JvdXBJbmRleFt0XX1yZW1vdmVBbm5vdGF0aW9uR3JvdXAodCxlKXtkZWxldGUgdGhpcy5fYW5ub3RhdGlvbkdyb3VwSW5kZXhbdC5ub2RlLm5hbWVdW2Uubm9kZS5uYW1lXX1hZGROb2RlR3JvdXAodCxlKXt0aGlzLl9ub2RlR3JvdXBJbmRleFt0XT1lfWdldE5vZGVHcm91cCh0KXtyZXR1cm4gdGhpcy5fbm9kZUdyb3VwSW5kZXhbdF19cmVtb3ZlTm9kZUdyb3VwKHQpe2RlbGV0ZSB0aGlzLl9ub2RlR3JvdXBJbmRleFt0XX1hZGRFZGdlR3JvdXAodCxlKXt0aGlzLl9lZGdlR3JvdXBJbmRleFt0XT1lfWdldEVkZ2VHcm91cCh0KXtyZXR1cm4gdGhpcy5fZWRnZUdyb3VwSW5kZXhbdF19X3VwZGF0ZUhlYWx0aFBpbGxzKCl7IShmdW5jdGlvbiB0KGUsbixpKXtpZighbilyZXR1cm47bGV0IHI9MTtEdShlKS5zZWxlY3RBbGwoImcubm9kZXNoYXBlIikuZWFjaCgoZnVuY3Rpb24odCl7Y29uc3QgZT1uW3Qubm9kZS5uYW1lXTtpWnQodGhpcyxlP2VbaV06bnVsbCx0LHIrKyl9KSl9KSh0aGlzLiQuc3ZnLHRoaXMubm9kZU5hbWVzVG9IZWFsdGhQaWxscyx0aGlzLmhlYWx0aFBpbGxTdGVwSW5kZXgpfV91cGRhdGVOb2RlU3RhdGUodCl7dmFyIGU9dGhpcy5nZXROb2RlKHQpLG49dGhpcy5nZXROb2RlR3JvdXAodCk7KG4mJkxadChuLGUsdGhpcyksZS5ub2RlLnR5cGU9PT1BJHQuTUVUQSYmZS5ub2RlLmFzc29jaWF0ZWRGdW5jdGlvbiYmIWUuaXNMaWJyYXJ5RnVuY3Rpb24pJiZMWnQoRHUoIi4iK1pLdC5TY2VuZS5HUk9VUCsiPi4iK1pLdC5TY2VuZS5GVU5DVElPTl9MSUJSQVJZKycgZ1tkYXRhLW5hbWU9IicrKFQkdCtlLm5vZGUuYXNzb2NpYXRlZEZ1bmN0aW9uKSsnIl0nKSxlLHRoaXMpO3ZhciBpPXRoaXMuZ2V0QW5ub3RhdGlvbkdyb3Vwc0luZGV4KHQpO0NlLmV4cG9ydHMuZWFjaChpLCgodCxuKT0+e0xadCh0LGUsdGhpcyxaS3QuQW5ub3RhdGlvbi5OT0RFKX0pKX1fc2VsZWN0ZWROb2RlQ2hhbmdlZCh0LGUpe2lmKHQhPT1lJiYoZSYmdGhpcy5fdXBkYXRlTm9kZVN0YXRlKGUpLHQpKXt0aGlzLm1pbmltYXAudXBkYXRlKCk7Zm9yKHZhciBuLGk9dGhpcy5yZW5kZXJIaWVyYXJjaHkuaGllcmFyY2h5Lm5vZGUodCkscj1bXTtudWxsIT1pLnBhcmVudE5vZGUmJmkucGFyZW50Tm9kZS5uYW1lIT1FJHQ7KXIucHVzaCgoaT1pLnBhcmVudE5vZGUpLm5hbWUpO0NlLmV4cG9ydHMuZm9yRWFjaFJpZ2h0KHIsKHQ9Pnt0aGlzLnJlbmRlckhpZXJhcmNoeS5idWlsZFN1YmhpZXJhcmNoeSh0KTt2YXIgZT10aGlzLnJlbmRlckhpZXJhcmNoeS5nZXRSZW5kZXJOb2RlQnlOYW1lKHQpO2Uubm9kZS5pc0dyb3VwTm9kZSYmIWUuZXhwYW5kZWQmJihlLmV4cGFuZGVkPSEwLG58fChuPWUpKX0pKSxuJiYodGhpcy5zZXROb2RlRXhwYW5kZWQobiksdGhpcy5fem9vbWVkPSEwKSx0JiZ0aGlzLl91cGRhdGVOb2RlU3RhdGUodCksc2V0VGltZW91dCgoKCk9Pnt0aGlzLnBhblRvTm9kZSh0KX0pLFVLdC5hbmltYXRpb24uZHVyYXRpb24pfX1faGlnaGxpZ2h0ZWROb2RlQ2hhbmdlZCh0LGUpe3QhPT1lJiYodCYmdGhpcy5fdXBkYXRlTm9kZVN0YXRlKHQpLGUmJnRoaXMuX3VwZGF0ZU5vZGVTdGF0ZShlKSl9X29uWm9vbUNoYW5nZWQoKXt0aGlzLl91cGRhdGVMYWJlbHMoIXRoaXMuX3pvb21lZCl9X2ZpcmVFbmFibGVDbGljaygpe3RoaXMuZmlyZSgiZW5hYmxlLWNsaWNrIil9X3VwZGF0ZUlucHV0VHJhY2UoKXtOWnQodGhpcy5nZXRHcmFwaFN2Z1Jvb3QoKSx0aGlzLnJlbmRlckhpZXJhcmNoeSx0aGlzLnNlbGVjdGVkTm9kZSx0aGlzLnRyYWNlSW5wdXRzKX19O1VadC50ZW1wbGF0ZT1WWnQsdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsQUt0KV0sVVp0LnByb3RvdHlwZSwicmVuZGVySGllcmFyY2h5Iix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFVadC5wcm90b3R5cGUsIm5hbWUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sVVp0LnByb3RvdHlwZSwiY29sb3JCeSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLFVadC5wcm90b3R5cGUsInRyYWNlSW5wdXRzIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sVVp0LnByb3RvdHlwZSwiX2hhc1JlbmRlckhpZXJhcmNoeUJlZW5GaXRPbmNlIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sVVp0LnByb3RvdHlwZSwiX2lzQXR0YWNoZWQiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sVVp0LnByb3RvdHlwZSwiX3pvb20iLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9oaWdobGlnaHRlZE5vZGVDaGFuZ2VkIn0pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxVWnQucHJvdG90eXBlLCJoaWdobGlnaHRlZE5vZGUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9zZWxlY3RlZE5vZGVDaGFuZ2VkIn0pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxVWnQucHJvdG90eXBlLCJzZWxlY3RlZE5vZGUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sVVp0LnByb3RvdHlwZSwiaGFuZGxlRWRnZVNlbGVjdGVkIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX29uWm9vbUNoYW5nZWQifSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxVWnQucHJvdG90eXBlLCJfem9vbWVkIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFVadC5wcm90b3R5cGUsIl96b29tU3RhcnRDb29yZHMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sVVp0LnByb3RvdHlwZSwiX3pvb21UcmFuc2Zvcm0iLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sVVp0LnByb3RvdHlwZSwiX21heFpvb21EaXN0YW5jZUZvckNsaWNrIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKV0sVVp0LnByb3RvdHlwZSwidGVtcGxhdGVJbmRleCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxVWnQucHJvdG90eXBlLCJfbm9kZUdyb3VwSW5kZXgiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sVVp0LnByb3RvdHlwZSwiX2Fubm90YXRpb25Hcm91cEluZGV4Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFVadC5wcm90b3R5cGUsIl9lZGdlR3JvdXBJbmRleCIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxVWnQucHJvdG90eXBlLCJtYXhNZXRhbm9kZUxhYmVsTGVuZ3RoRm9udFNpemUiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sVVp0LnByb3RvdHlwZSwibWluTWV0YW5vZGVMYWJlbExlbmd0aEZvbnRTaXplIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLFVadC5wcm90b3R5cGUsIm1heE1ldGFub2RlTGFiZWxMZW5ndGhMYXJnZUZvbnQiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sVVp0LnByb3RvdHlwZSwibWF4TWV0YW5vZGVMYWJlbExlbmd0aCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxVWnQucHJvdG90eXBlLCJwcm9ncmVzcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sVVp0LnByb3RvdHlwZSwibm9kZUNvbnRleHRNZW51SXRlbXMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sVVp0LnByb3RvdHlwZSwibm9kZU5hbWVzVG9IZWFsdGhQaWxscyIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxVWnQucHJvdG90eXBlLCJoZWFsdGhQaWxsU3RlcEluZGV4Iix2b2lkIDApLHQoW2EoInJlbmRlckhpZXJhcmNoeSIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sVVp0LnByb3RvdHlwZSwiX3JlbmRlckhpZXJhcmNoeUNoYW5nZWQiLG51bGwpLHQoW2EoIl9pc0F0dGFjaGVkIiwicmVuZGVySGllcmFyY2h5IiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxVWnQucHJvdG90eXBlLCJfYW5pbWF0ZUFuZEZpdCIsbnVsbCksdChbYSgiY29sb3JCeSIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sVVp0LnByb3RvdHlwZSwibm9kZUNvbG9yc0NoYW5nZWQiLG51bGwpLHQoW2EoIm5vZGVOYW1lc1RvSGVhbHRoUGlsbHMiLCJoZWFsdGhQaWxsU3RlcEluZGV4IiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxVWnQucHJvdG90eXBlLCJfdXBkYXRlSGVhbHRoUGlsbHMiLG51bGwpLHQoW2EoInRyYWNlSW5wdXRzIiwic2VsZWN0ZWROb2RlIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxVWnQucHJvdG90eXBlLCJfdXBkYXRlSW5wdXRUcmFjZSIsbnVsbCksVVp0PXQoW2koInRmLWdyYXBoLXNjZW5lIildLFVadCk7bGV0IGpadD1jbGFzcyBleHRlbmRzKGNyKHdlKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX3JlbmRlckRlcHRoPTEsdGhpcy5fYWxsb3dHcmFwaFNlbGVjdD0hMCx0aGlzLmVkZ2VXaWR0aEZ1bmN0aW9uPSIiLHRoaXMuaGFuZGxlTm9kZVNlbGVjdGVkPSIiLHRoaXMuZWRnZUxhYmVsRnVuY3Rpb249IiIsdGhpcy5oYW5kbGVFZGdlU2VsZWN0ZWQ9IiJ9cGFuVG9Ob2RlKHQpe3RoaXMuJCQoInRmLWdyYXBoLXNjZW5lIikucGFuVG9Ob2RlKHQpfV9hdXRvRXh0cmFjdE5vZGVzQ2hhbmdlZCgpe3ZhciB0PXRoaXMuZ3JhcGhIaWVyYXJjaHk7aWYodCl7Zm9yKGNvbnN0IGUgb2YgT2JqZWN0LnZhbHVlcyh0LmdldE5vZGVNYXAoKSkpZS5pbmNsdWRlPWskdC5VTlNQRUNJRklFRDt0aGlzLl9idWlsZFJlbmRlckhpZXJhcmNoeSh0KX19X2J1aWxkTmV3UmVuZGVySGllcmFyY2h5KCl7dmFyIHQ9dGhpcy5ncmFwaEhpZXJhcmNoeTt0JiZ0aGlzLl9idWlsZFJlbmRlckhpZXJhcmNoeSh0KX1fc3RhdHNDaGFuZ2VkKCl7dmFyIHQ9dGhpcy5zdGF0cyxlPXRoaXMuZGV2aWNlc0ZvclN0YXRzO3RoaXMuZ3JhcGhIaWVyYXJjaHkmJih0JiZlJiYoIShmdW5jdGlvbiBuKHQsZSxpKXtDZS5leHBvcnRzLmVhY2godC5ub2RlcywodD0+e3Quc3RhdHM9bnVsbH0pKSxDZS5leHBvcnRzLmVhY2goZS5kZXZfc3RhdHMsKGU9PntpJiYhaVtlLmRldmljZV18fENlLmV4cG9ydHMuZWFjaChlLm5vZGVfc3RhdHMsKG49PntsZXQgaT1uLm5vZGVfbmFtZSBpbiB0Lm5vZGVzP24ubm9kZV9uYW1lOiQkdChuLm5vZGVfbmFtZSk7aWYoIShpIGluIHQubm9kZXMpKXJldHVybjtsZXQgcj0wO24ubWVtb3J5JiZDZS5leHBvcnRzLmVhY2gobi5tZW1vcnksKHQ9Pnt0LnRvdGFsX2J5dGVzJiYodC50b3RhbF9ieXRlcz4wP3IrPU51bWJlcih0LnRvdGFsX2J5dGVzKTpjb25zb2xlLmxvZygiaWdub3JpbmcgbmVnYXRpdmUgbWVtb3J5IGFsbG9jYXRpb24gZm9yICIraSkpfSkpO2xldCBvPW51bGw7bi5vdXRwdXQmJihvPUNlLmV4cG9ydHMubWFwKG4ub3V0cHV0LCh0PT5DZS5leHBvcnRzLm1hcCh0LnRlbnNvcl9kZXNjcmlwdGlvbi5zaGFwZS5kaW0sKHQ9Pk51bWJlcih0LnNpemUpKSkpKSksdC5ub2Rlc1tpXS5kZXZpY2U9ZS5kZXZpY2UsbnVsbD09dC5ub2Rlc1tpXS5zdGF0cyYmKHQubm9kZXNbaV0uc3RhdHM9bmV3IGwkdChvKSksdC5ub2Rlc1tpXS5zdGF0cy5hZGRCeXRlc0FsbG9jYXRpb24ociksbi5hbGxfZW5kX3JlbF9taWNyb3MmJihuLmFsbF9lbmRfcmVsX21pY3Jvcz4wP3Qubm9kZXNbaV0uc3RhdHMuYWRkRXhlY3V0aW9uVGltZShuLmFsbF9zdGFydF9taWNyb3Msbi5hbGxfc3RhcnRfbWljcm9zK24uYWxsX2VuZF9yZWxfbWljcm9zKTpjb25zb2xlLmxvZygiaWdub3JpbmcgbmVnYXRpdmUgcnVudGltZSBmb3IgIitpKSl9KSl9KSl9KSh0aGlzLmJhc2ljR3JhcGgsdCxlKSwoZnVuY3Rpb24gaSh0LGUpe2xldCBuPXt9LGk9e307Q2UuZXhwb3J0cy5lYWNoKHQucm9vdC5sZWF2ZXMoKSwoZT0+e2xldCByPXQubm9kZShlKTtudWxsIT1yLmRldmljZSYmKG5bci5kZXZpY2VdPSEwKSxudWxsIT1yLnhsYUNsdXN0ZXImJihpW3IueGxhQ2x1c3Rlcl09ITApfSkpLHQuZGV2aWNlcz1DZS5leHBvcnRzLmtleXMobiksdC54bGFDbHVzdGVycz1DZS5leHBvcnRzLmtleXMoaSksQ2UuZXhwb3J0cy5lYWNoKHQuZ2V0Tm9kZU1hcCgpLCgodCxlKT0+e3QuaXNHcm91cE5vZGUmJih0LnN0YXRzPW5ldyBsJHQobnVsbCksdC5kZXZpY2VIaXN0b2dyYW09e30pfSkpLENlLmV4cG9ydHMuZWFjaCh0LnJvb3QubGVhdmVzKCksKGU9PntsZXQgbj10Lm5vZGUoZSksaT1uO2Zvcig7bnVsbCE9aS5wYXJlbnROb2RlOyl7aWYobnVsbCE9bi5kZXZpY2Upe2xldCB0PWkucGFyZW50Tm9kZS5kZXZpY2VIaXN0b2dyYW07dFtuLmRldmljZV09KHRbbi5kZXZpY2VdfHwwKSsxfWlmKG51bGwhPW4ueGxhQ2x1c3Rlcil7bGV0IHQ9aS5wYXJlbnROb2RlLnhsYUNsdXN0ZXJIaXN0b2dyYW07dFtuLnhsYUNsdXN0ZXJdPSh0W24ueGxhQ2x1c3Rlcl18fDApKzF9bnVsbCE9bi5zdGF0cyYmaS5wYXJlbnROb2RlLnN0YXRzLmNvbWJpbmUobi5zdGF0cyksaT1pLnBhcmVudE5vZGV9fSkpfSkodGhpcy5ncmFwaEhpZXJhcmNoeSkpLHRoaXMuX2J1aWxkUmVuZGVySGllcmFyY2h5KHRoaXMuZ3JhcGhIaWVyYXJjaHkpKX1yZWFkeSgpe3N1cGVyLnJlYWR5KCksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJncmFwaC1zZWxlY3QiLHRoaXMuX2dyYXBoU2VsZWN0ZWQuYmluZCh0aGlzKSksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJkaXNhYmxlLWNsaWNrIix0aGlzLl9kaXNhYmxlQ2xpY2suYmluZCh0aGlzKSksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJlbmFibGUtY2xpY2siLHRoaXMuX2VuYWJsZUNsaWNrLmJpbmQodGhpcykpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigibm9kZS10b2dnbGUtZXhwYW5kIix0aGlzLl9ub2RlVG9nZ2xlRXhwYW5kLmJpbmQodGhpcykpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigibm9kZS1zZWxlY3QiLHRoaXMuX25vZGVTZWxlY3RlZC5iaW5kKHRoaXMpKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoIm5vZGUtaGlnaGxpZ2h0Iix0aGlzLl9ub2RlSGlnaGxpZ2h0ZWQuYmluZCh0aGlzKSksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJub2RlLXVuaGlnaGxpZ2h0Iix0aGlzLl9ub2RlVW5oaWdobGlnaHRlZC5iaW5kKHRoaXMpKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoIm5vZGUtdG9nZ2xlLWV4dHJhY3QiLHRoaXMuX25vZGVUb2dnbGVFeHRyYWN0LmJpbmQodGhpcykpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigibm9kZS10b2dnbGUtc2VyaWVzZ3JvdXAiLHRoaXMuX25vZGVUb2dnbGVTZXJpZXNHcm91cC5iaW5kKHRoaXMpKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImVkZ2Utc2VsZWN0Iix0aGlzLl9lZGdlU2VsZWN0ZWQuYmluZCh0aGlzKSksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJhbm5vdGF0aW9uLXNlbGVjdCIsdGhpcy5fbm9kZVNlbGVjdGVkLmJpbmQodGhpcykpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigiYW5ub3RhdGlvbi1oaWdobGlnaHQiLHRoaXMuX25vZGVIaWdobGlnaHRlZC5iaW5kKHRoaXMpKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImFubm90YXRpb24tdW5oaWdobGlnaHQiLHRoaXMuX25vZGVVbmhpZ2hsaWdodGVkLmJpbmQodGhpcykpfV9idWlsZFJlbmRlckhpZXJhcmNoeSh0KXtpZih0LnJvb3QudHlwZSE9PUEkdC5NRVRBKXJldHVybjtjb25zdCBlPXRoaXMsbj1kJHQoIm5ldyB0Zl9ncmFwaF9yZW5kZXIuSGllcmFyY2h5IiwoKCk9Pntjb25zdCBuPW5ldyBBS3QodCwhIXRoaXMuc3RhdHMsdGhpcy5hdXRvRXh0cmFjdE5vZGVzKTtmdW5jdGlvbiBpKHQpe3JldHVybnttaW5WYWx1ZTp0LmRvbWFpbigpWzBdLG1heFZhbHVlOnQuZG9tYWluKClbMV0sc3RhcnRDb2xvcjp0LnJhbmdlKClbMF0sZW5kQ29sb3I6dC5yYW5nZSgpWzFdfX1yZXR1cm4gbi5lZGdlTGFiZWxGdW5jdGlvbj10aGlzLmVkZ2VMYWJlbEZ1bmN0aW9uLG4uZWRnZVdpZHRoRnVuY3Rpb249dGhpcy5lZGdlV2lkdGhGdW5jdGlvbixlLl9zZXRDb2xvckJ5UGFyYW1zKHtjb21wdXRlX3RpbWU6aShuLmNvbXB1dGVUaW1lU2NhbGUpLG1lbW9yeTppKG4ubWVtb3J5VXNhZ2VTY2FsZSksZGV2aWNlOkNlLmV4cG9ydHMubWFwKG4uZGV2aWNlQ29sb3JNYXAuZG9tYWluKCksKGZ1bmN0aW9uKHQpe3JldHVybntkZXZpY2U6dCxjb2xvcjpuLmRldmljZUNvbG9yTWFwKHQpfX0pKSx4bGFfY2x1c3RlcjpDZS5leHBvcnRzLm1hcChuLnhsYUNsdXN0ZXJDb2xvck1hcC5kb21haW4oKSwoZnVuY3Rpb24odCl7cmV0dXJue3hsYV9jbHVzdGVyOnQsY29sb3I6bi54bGFDbHVzdGVyQ29sb3JNYXAodCl9fSkpfSksbn0pLEJBdC5SRU5ERVJfQlVJTERfSElFUkFSQ0hZKTtlLl9zZXRSZW5kZXJIaWVyYXJjaHkobil9X2dldFZpc2libGUodCl7cmV0dXJuIHQ/dGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0TmVhcmVzdFZpc2libGVBbmNlc3Rvcih0KTp0fWZpdCgpe3RoaXMuJC5zY2VuZS5maXQoKX1nZXRJbWFnZUJsb2IoKXtyZXR1cm4gdGhpcy4kLnNjZW5lLmdldEltYWdlQmxvYigpfV9ncmFwaENoYW5nZWQoKXt0aGlzLmdyYXBoSGllcmFyY2h5JiYodGhpcy5ncmFwaEhpZXJhcmNoeS5hZGRMaXN0ZW5lcihpS3QuVEVNUExBVEVTX1VQREFURUQsKCgpPT57dGhpcy4kLnNjZW5lLm5vZGVDb2xvcnNDaGFuZ2VkKCl9KSksdGhpcy5maXJlKCJncmFwaC1zZWxlY3QiKSl9X2dyYXBoU2VsZWN0ZWQodCl7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdCYmKHRoaXMuc2V0KCJzZWxlY3RlZE5vZGUiLG51bGwpLHRoaXMuc2V0KCJzZWxlY3RlZEVkZ2UiLG51bGwpKSx0aGlzLl9hbGxvd0dyYXBoU2VsZWN0PSEwfV9kaXNhYmxlQ2xpY2sodCl7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdD0hMX1fZW5hYmxlQ2xpY2sodCl7dGhpcy5fYWxsb3dHcmFwaFNlbGVjdD0hMH1fc2VsZWN0ZWROb2RlQ2hhbmdlZCgpe3RoaXMuaGFuZGxlTm9kZVNlbGVjdGVkJiZ0aGlzLmhhbmRsZU5vZGVTZWxlY3RlZCh0aGlzLnNlbGVjdGVkTm9kZSl9X3NlbGVjdGVkRWRnZUNoYW5nZWQoKXt2YXIgdD10aGlzLnNlbGVjdGVkRWRnZTt0aGlzLl9kZXNlbGVjdFByZXZpb3VzRWRnZSgpLHQmJih0aGlzLl9sYXN0U2VsZWN0ZWRFZGdlR3JvdXAuY2xhc3NlZChaS3QuRWRnZS5TRUxFQ1RFRCwhMCksdGhpcy5fdXBkYXRlTWFya2VyT2ZTZWxlY3RlZEVkZ2UodCkpLHRoaXMuaGFuZGxlRWRnZVNlbGVjdGVkJiZ0aGlzLmhhbmRsZUVkZ2VTZWxlY3RlZCh0KX1fbm9kZVNlbGVjdGVkKHQpe3RoaXMuX2FsbG93R3JhcGhTZWxlY3QmJnRoaXMuc2V0KCJzZWxlY3RlZE5vZGUiLHQuZGV0YWlsLm5hbWUpLHRoaXMuX2FsbG93R3JhcGhTZWxlY3Q9ITB9X2VkZ2VTZWxlY3RlZCh0KXt0aGlzLl9hbGxvd0dyYXBoU2VsZWN0JiYodGhpcy5zZXQoIl9sYXN0U2VsZWN0ZWRFZGdlR3JvdXAiLHQuZGV0YWlsLmVkZ2VHcm91cCksdGhpcy5zZXQoInNlbGVjdGVkRWRnZSIsdC5kZXRhaWwuZWRnZURhdGEpKSx0aGlzLl9hbGxvd0dyYXBoU2VsZWN0PSEwfV9ub2RlSGlnaGxpZ2h0ZWQodCl7dGhpcy5zZXQoImhpZ2hsaWdodGVkTm9kZSIsdC5kZXRhaWwubmFtZSl9X25vZGVVbmhpZ2hsaWdodGVkKHQpe3RoaXMuc2V0KCJoaWdobGlnaHRlZE5vZGUiLG51bGwpfV9ub2RlVG9nZ2xlRXhwYW5kKHQpe3RoaXMuX25vZGVTZWxlY3RlZCh0KTt2YXIgZT10LmRldGFpbC5uYW1lLG49dGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0UmVuZGVyTm9kZUJ5TmFtZShlKTtuLm5vZGUudHlwZSE9PUEkdC5PUCYmKHRoaXMucmVuZGVySGllcmFyY2h5LmJ1aWxkU3ViaGllcmFyY2h5KGUpLG4uZXhwYW5kZWQ9IW4uZXhwYW5kZWQsdGhpcy5hc3luYygoZnVuY3Rpb24oKXt0aGlzLiQuc2NlbmUuc2V0Tm9kZUV4cGFuZGVkKG4pfSksNzUpLGgkdCh7YWN0aW9uSWQ6QkF0Lk5PREVfRVhQQU5TSU9OX1RPR0dMRUQsZXZlbnRMYWJlbDpuLmV4cGFuZGVkPyJleHBhbmRlZCI6ImNvbGxhcHNlZCJ9KSl9X25vZGVUb2dnbGVFeHRyYWN0KHQpe3RoaXMubm9kZVRvZ2dsZUV4dHJhY3QodC5kZXRhaWwubmFtZSl9bm9kZVRvZ2dsZUV4dHJhY3QodCl7Y29uc3QgZT10aGlzLnJlbmRlckhpZXJhcmNoeS5nZXRSZW5kZXJOb2RlQnlOYW1lKHQpO2Uubm9kZS5pbmNsdWRlPWUubm9kZS5pbmNsdWRlPT1rJHQuSU5DTFVERT9rJHQuRVhDTFVERTplLm5vZGUuaW5jbHVkZT09ayR0LkVYQ0xVREV8fHRoaXMucmVuZGVySGllcmFyY2h5LmlzTm9kZUF1eGlsaWFyeShlKT9rJHQuSU5DTFVERTprJHQuRVhDTFVERSx0aGlzLl9idWlsZFJlbmRlckhpZXJhcmNoeSh0aGlzLmdyYXBoSGllcmFyY2h5KSxoJHQoe2FjdGlvbklkOkJBdC5OT0RFX0FVWElMSUFSWV9FWFRSQUNUSU9OX0NIQU5HRUQsZXZlbnRMYWJlbDplLm5vZGUuaW5jbHVkZT09PWskdC5JTkNMVURFPyJBdXhpbGlhcnkgdG8gTWFpbiI6Ik1haW4gdG8gQXV4aWxpYXJ5In0pfV9ub2RlVG9nZ2xlU2VyaWVzR3JvdXAodCl7dGhpcy5ub2RlVG9nZ2xlU2VyaWVzR3JvdXAodC5kZXRhaWwubmFtZSl9bm9kZVRvZ2dsZVNlcmllc0dyb3VwKHQpe3RoaXMuc2V0KCJwcm9ncmVzcyIse3ZhbHVlOjAsbXNnOiIifSk7dmFyIGU9ZiR0KHAkdCh0aGlzKSwxMDAsIk5hbWVzcGFjZSBoaWVyYXJjaHkiKTtjb25zdCBuPU9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSx0aGlzLmhpZXJhcmNoeVBhcmFtcykse3Nlcmllc01hcDp0aGlzLmdyYXBoSGllcmFyY2h5LmJ1aWxkU2VyaWVzR3JvdXBNYXBUb2dnbGVkKHQpfSk7c0t0KHRoaXMuYmFzaWNHcmFwaCxuLGUpLnRoZW4oZnVuY3Rpb24odCl7dGhpcy5zZXQoImdyYXBoSGllcmFyY2h5Iix0KSx0aGlzLl9idWlsZFJlbmRlckhpZXJhcmNoeSh0aGlzLmdyYXBoSGllcmFyY2h5KX0uYmluZCh0aGlzKSl9X2Rlc2VsZWN0UHJldmlvdXNFZGdlKCl7RHUoIi4iK1pLdC5FZGdlLlNFTEVDVEVEKS5jbGFzc2VkKFpLdC5FZGdlLlNFTEVDVEVELCExKS5lYWNoKCgodCxlKT0+e2lmKHQubGFiZWwpe2NvbnN0IGU9RHUodGhpcykuc2VsZWN0QWxsKCJwYXRoLmVkZ2VsaW5lIik7dC5sYWJlbC5zdGFydE1hcmtlcklkJiZlLnN0eWxlKCJtYXJrZXItc3RhcnQiLGB1cmwoIyR7dC5sYWJlbC5zdGFydE1hcmtlcklkfSlgKSx0LmxhYmVsLmVuZE1hcmtlcklkJiZlLnN0eWxlKCJtYXJrZXItZW5kIixgdXJsKCMke3QubGFiZWwuZW5kTWFya2VySWR9KWApfX0pKX1fdXBkYXRlTWFya2VyT2ZTZWxlY3RlZEVkZ2UodCl7aWYodC5sYWJlbCl7Y29uc3QgZT10LmxhYmVsLnN0YXJ0TWFya2VySWR8fHQubGFiZWwuZW5kTWFya2VySWQ7aWYoZSl7Y29uc3Qgbj1lLnJlcGxhY2UoImRhdGFmbG93LSIsInNlbGVjdGVkLSIpO2xldCBpPXRoaXMuJCQoIiMiK24pO2lmKCFpKXtjb25zdCB0PXRoaXMuJC5zY2VuZS5xdWVyeVNlbGVjdG9yKCIjIitlKTtpPXQuY2xvbmVOb2RlKCEwKSxpLnNldEF0dHJpYnV0ZSgiaWQiLG4pLGkuY2xhc3NMaXN0LmFkZCgic2VsZWN0ZWQtYXJyb3doZWFkIiksdC5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGkpfWNvbnN0IHI9dC5sYWJlbC5zdGFydE1hcmtlcklkPyJtYXJrZXItc3RhcnQiOiJtYXJrZXItZW5kIjt0aGlzLl9sYXN0U2VsZWN0ZWRFZGdlR3JvdXAuc2VsZWN0QWxsKCJwYXRoLmVkZ2VsaW5lIikuc3R5bGUocixgdXJsKCMke259KWApfX19bm90KHQpe3JldHVybiF0fX07alp0LnRlbXBsYXRlPXhlYAogICAgPHN0eWxlPgogICAgICAuY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICAgICAgYm94LXNoYWRvdzogMCAxcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4yKTsKICAgICAgfQoKICAgICAgLnZlcnRpY2FsIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICB9CgogICAgICAuYXV0byB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtdmVydGljYWw7CiAgICAgIH0KCiAgICAgIGgyIHsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICA8ZGl2IGNsYXNzPSJ2ZXJ0aWNhbCI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3RpdGxlXV0iPgogICAgICAgICAgPGgyPltbdGl0bGVdXTwvaDI+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGYtZ3JhcGgtc2NlbmUKICAgICAgICAgIGlkPSJzY2VuZSIKICAgICAgICAgIGNsYXNzPSJhdXRvIgogICAgICAgICAgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIKICAgICAgICAgIGhpZ2hsaWdodGVkLW5vZGU9IltbX2dldFZpc2libGUoaGlnaGxpZ2h0ZWROb2RlKV1dIgogICAgICAgICAgc2VsZWN0ZWQtbm9kZT0ie3tzZWxlY3RlZE5vZGV9fSIKICAgICAgICAgIHNlbGVjdGVkLWVkZ2U9Int7c2VsZWN0ZWRFZGdlfX0iCiAgICAgICAgICBjb2xvci1ieT0iW1tjb2xvckJ5XV0iCiAgICAgICAgICBwcm9ncmVzcz0iW1twcm9ncmVzc11dIgogICAgICAgICAgbm9kZS1jb250ZXh0LW1lbnUtaXRlbXM9Iltbbm9kZUNvbnRleHRNZW51SXRlbXNdXSIKICAgICAgICAgIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIKICAgICAgICAgIGhlYWx0aC1waWxsLXN0ZXAtaW5kZXg9Int7aGVhbHRoUGlsbFN0ZXBJbmRleH19IgogICAgICAgICAgaGFuZGxlLWVkZ2Utc2VsZWN0ZWQ9IltbaGFuZGxlRWRnZVNlbGVjdGVkXV0iCiAgICAgICAgICB0cmFjZS1pbnB1dHM9IltbdHJhY2VJbnB1dHNdXSIKICAgICAgICA+PC90Zi1ncmFwaC1zY2VuZT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICBgLHQoW28oe3R5cGU6T2JqZWN0LG5vdGlmeTohMCxvYnNlcnZlcjoiX2dyYXBoQ2hhbmdlZCJ9KSxlKCJkZXNpZ246dHlwZSIsckt0KV0salp0LnByb3RvdHlwZSwiZ3JhcGhIaWVyYXJjaHkiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsSSR0KV0salp0LnByb3RvdHlwZSwiYmFzaWNHcmFwaCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxqWnQucHJvdG90eXBlLCJzdGF0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxqWnQucHJvdG90eXBlLCJkZXZpY2VzRm9yU3RhdHMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0salp0LnByb3RvdHlwZSwiaGllcmFyY2h5UGFyYW1zIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0LG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxqWnQucHJvdG90eXBlLCJwcm9ncmVzcyIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxqWnQucHJvdG90eXBlLCJ0aXRsZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0salp0LnByb3RvdHlwZSwic2VsZWN0ZWROb2RlIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0LG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxqWnQucHJvdG90eXBlLCJzZWxlY3RlZEVkZ2UiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0salp0LnByb3RvdHlwZSwiX2xhc3RTZWxlY3RlZEVkZ2VHcm91cCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0salp0LnByb3RvdHlwZSwiaGlnaGxpZ2h0ZWROb2RlIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLGpadC5wcm90b3R5cGUsImNvbG9yQnkiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHJlYWRPbmx5OiEwfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGpadC5wcm90b3R5cGUsImNvbG9yQnlQYXJhbXMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLEFLdCldLGpadC5wcm90b3R5cGUsInJlbmRlckhpZXJhcmNoeSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGpadC5wcm90b3R5cGUsInRyYWNlSW5wdXRzIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0salp0LnByb3RvdHlwZSwiYXV0b0V4dHJhY3ROb2RlcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0salp0LnByb3RvdHlwZSwibm9kZUNvbnRleHRNZW51SXRlbXMiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0salp0LnByb3RvdHlwZSwiX3JlbmRlckRlcHRoIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0salp0LnByb3RvdHlwZSwiX2FsbG93R3JhcGhTZWxlY3QiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0salp0LnByb3RvdHlwZSwibm9kZU5hbWVzVG9IZWFsdGhQaWxscyIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxqWnQucHJvdG90eXBlLCJoZWFsdGhQaWxsU3RlcEluZGV4Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGpadC5wcm90b3R5cGUsImVkZ2VXaWR0aEZ1bmN0aW9uIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGpadC5wcm90b3R5cGUsImhhbmRsZU5vZGVTZWxlY3RlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxqWnQucHJvdG90eXBlLCJlZGdlTGFiZWxGdW5jdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxqWnQucHJvdG90eXBlLCJoYW5kbGVFZGdlU2VsZWN0ZWQiLHZvaWQgMCksdChbYSgiYXV0b0V4dHJhY3ROb2RlcyIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0salp0LnByb3RvdHlwZSwiX2F1dG9FeHRyYWN0Tm9kZXNDaGFuZ2VkIixudWxsKSx0KFthKCJncmFwaEhpZXJhcmNoeSIsImVkZ2VXaWR0aEZ1bmN0aW9uIiwiaGFuZGxlTm9kZVNlbGVjdGVkIiwiZWRnZUxhYmVsRnVuY3Rpb24iLCJoYW5kbGVFZGdlU2VsZWN0ZWQiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGpadC5wcm90b3R5cGUsIl9idWlsZE5ld1JlbmRlckhpZXJhcmNoeSIsbnVsbCksdChbYSgic3RhdHMiLCJkZXZpY2VzRm9yU3RhdHMiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGpadC5wcm90b3R5cGUsIl9zdGF0c0NoYW5nZWQiLG51bGwpLHQoW2EoInNlbGVjdGVkTm9kZSIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0salp0LnByb3RvdHlwZSwiX3NlbGVjdGVkTm9kZUNoYW5nZWQiLG51bGwpLHQoW2EoInNlbGVjdGVkRWRnZSIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0salp0LnByb3RvdHlwZSwiX3NlbGVjdGVkRWRnZUNoYW5nZWQiLG51bGwpLGpadD10KFtpKCJ0Zi1ncmFwaCIpXSxqWnQpO2xldCBHWnQ9Y2xhc3MgZXh0ZW5kcyhjcih3ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLnNwZWNpZmljSGVhbHRoUGlsbFN0ZXA9MCx0aGlzLmhlYWx0aFBpbGxFbnRyaWVzPUpLdH1yZWFkeSgpe3N1cGVyLnJlYWR5KCk7dmFyIHQ9ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1haW5Db250YWluZXIiKSxlPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInRmLWRhc2hib2FyZC1sYXlvdXQgLnNjcm9sbGJhciIpO3QmJmUmJih0LnN0eWxlLm92ZXJmbG93PSJoaWRkZW4iLGUuc3R5bGUub3ZlcmZsb3c9ImhpZGRlbiIpfV9oZWFsdGhQaWxsc0F2YWlsYWJsZSh0LGUpe3JldHVybiB0JiZlfV9jb21wdXRlVGVuc29yQ291bnRTdHJpbmcodCxlKXtyZXR1cm4gdD90W2VdLnRvRml4ZWQoMCk6IiJ9Z2V0IGhlYWx0aFBpbGxWYWx1ZXNGb3JTZWxlY3RlZE5vZGUoKXt2YXIgdD10aGlzLnNlbGVjdGVkTm9kZTtpZih0aGlzLmFyZUhlYWx0aFBpbGxzTG9hZGluZylyZXR1cm4gbnVsbDtpZighdClyZXR1cm4gbnVsbDtjb25zdCBlPXRoaXMubm9kZU5hbWVzVG9IZWFsdGhQaWxsc1t0XTtpZighZSlyZXR1cm4gbnVsbDtjb25zdCBuPWVbdGhpcy5hbGxTdGVwc01vZGVFbmFibGVkPzA6dGhpcy5oZWFsdGhQaWxsU3RlcEluZGV4XTtyZXR1cm4gbj9uLnZhbHVlLnNsaWNlKDIsOCk6bnVsbH1nZXQgX2N1cnJlbnRTdGVwRGlzcGxheVZhbHVlKCl7dmFyIHQ9dGhpcy5ub2RlTmFtZXNUb0hlYWx0aFBpbGxzLGU9dGhpcy5oZWFsdGhQaWxsU3RlcEluZGV4LG49dGhpcy5hcmVIZWFsdGhQaWxsc0xvYWRpbmc7aWYodGhpcy5hbGxTdGVwc01vZGVFbmFibGVkKXJldHVybiB0aGlzLnNwZWNpZmljSGVhbHRoUGlsbFN0ZXAudG9GaXhlZCgwKTtpZihuKXJldHVybiAwO2ZvcihsZXQgbiBpbiB0KXJldHVybiB0W25dW2VdLnN0ZXAudG9GaXhlZCgwKTtyZXR1cm4gMH1nZXQgX2JpZ2dlc3RTdGVwRXZlclNlZW4oKXt2YXIgdD10aGlzLm5vZGVOYW1lc1RvSGVhbHRoUGlsbHM7Zm9yKGxldCBuIGluIHQpe3ZhciBlPXRbbl07cmV0dXJuIE1hdGgubWF4KHRoaXMuX2JpZ2dlc3RTdGVwRXZlclNlZW4sZVtlLmxlbmd0aC0xXS5zdGVwKX1yZXR1cm4gdGhpcy5fYmlnZ2VzdFN0ZXBFdmVyU2Vlbnx8MH1nZXQgX21heFN0ZXBJbmRleCgpe3ZhciB0PXRoaXMubm9kZU5hbWVzVG9IZWFsdGhQaWxscztmb3IobGV0IGUgaW4gdClyZXR1cm4gdFtlXS5sZW5ndGgtMTtyZXR1cm4gMH1faGFzRGVidWdnZXJOdW1lcmljQWxlcnRzKHQpe3JldHVybiB0JiZ0Lmxlbmd0aH1fdXBkYXRlQWxlcnRzTGlzdCgpe3ZhciB0PXRoaXMuZGVidWdnZXJOdW1lcmljQWxlcnRzLGU9dGhpcy4kJCgiI251bWVyaWMtYWxlcnRzLWJvZHkiKTtpZihlKXtlLmlubmVyVGV4dD0iIjtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7dmFyIGk9dFtuXSxyPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIiksbz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO28uaW5uZXJUZXh0PShmPWkuZmlyc3RfdGltZXN0YW1wLG09dm9pZCAwLChtPStuZXcgRGF0ZS0rbmV3IERhdGUoZi8xZTMpKTwzZTQ/Imp1c3Qgbm93IjptPDZlND9NYXRoLmZsb29yKG0vMWUzKSsiIHNlY29uZHMgYWdvIjptPDEyZTQ/ImEgbWludXRlIGFnbyI6bTwzNmU1P01hdGguZmxvb3IobS82ZTQpKyIgbWludXRlcyBhZ28iOjE9PU1hdGguZmxvb3IobS8zNmU1KT8iYW4gaG91ciBhZ28iOm08ODY0ZTU/TWF0aC5mbG9vcihtLzM2ZTUpKyIgaG91cnMgYWdvIjptPDE3MjhlNT8ieWVzdGVyZGF5IjpNYXRoLmZsb29yKG0vODY0ZTUpKyIgZGF5cyBhZ28iKSxvLmNsYXNzTGlzdC5hZGQoImZpcnN0LW9mZmVuc2UtdGQiKSxyLmFwcGVuZENoaWxkKG8pO3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRkIik7YS5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3ItZGV2aWNlLXRkIik7dmFyIHM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7cy5jbGFzc0xpc3QuYWRkKCJ0ZW5zb3Itc2VjdGlvbi13aXRoaW4tdGFibGUiKSxzLmlubmVyVGV4dD1pLnRlbnNvcl9uYW1lLHRoaXMuX2FkZE9wRXhwYW5zaW9uTGlzdGVuZXIocyxpLnRlbnNvcl9uYW1lKSxhLmFwcGVuZENoaWxkKHMpO3ZhciBsPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2wuY2xhc3NMaXN0LmFkZCgiZGV2aWNlLXNlY3Rpb24td2l0aGluLXRhYmxlIiksbC5pbm5lclRleHQ9IigiK2kuZGV2aWNlX25hbWUrIikiLGEuYXBwZW5kQ2hpbGQobCksci5hcHBlbmRDaGlsZChhKTt2YXIgYz1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTtjLmNsYXNzTGlzdC5hZGQoIm1pbmktaGVhbHRoLXBpbGwiKTt2YXIgdT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZCIpO2lmKHUuY2xhc3NMaXN0LmFkZCgibWluaS1oZWFsdGgtcGlsbC10ZCIpLHUuYXBwZW5kQ2hpbGQoYyksci5hcHBlbmRDaGlsZCh1KSxpLm5lZ19pbmZfZXZlbnRfY291bnQpe3ZhciBoPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO2guY2xhc3NMaXN0LmFkZCgibmVnYXRpdmUtaW5mLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiIpLGguaW5uZXJUZXh0PWkubmVnX2luZl9ldmVudF9jb3VudCxoLnNldEF0dHJpYnV0ZSgidGl0bGUiLGkubmVnX2luZl9ldmVudF9jb3VudCsiIGV2ZW50cyB3aXRoIC3iiJ4iKSxjLmFwcGVuZENoaWxkKGgpfWlmKGkucG9zX2luZl9ldmVudF9jb3VudCl7dmFyIGQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7ZC5jbGFzc0xpc3QuYWRkKCJwb3NpdGl2ZS1pbmYtbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIiksZC5pbm5lclRleHQ9aS5wb3NfaW5mX2V2ZW50X2NvdW50LGQuc2V0QXR0cmlidXRlKCJ0aXRsZSIsaS5wb3NfaW5mX2V2ZW50X2NvdW50KyIgZXZlbnRzIHdpdGggK+KIniIpLGMuYXBwZW5kQ2hpbGQoZCl9aWYoaS5uYW5fZXZlbnRfY291bnQpe3ZhciBwPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3AuY2xhc3NMaXN0LmFkZCgibmFuLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiIpLHAuaW5uZXJUZXh0PWkubmFuX2V2ZW50X2NvdW50LHAuc2V0QXR0cmlidXRlKCJ0aXRsZSIsaS5uYW5fZXZlbnRfY291bnQrIiBldmVudHMgd2l0aCBOYU4iKSxjLmFwcGVuZENoaWxkKHApfWVyKGUpLmFwcGVuZENoaWxkKHIpfXZhciBmLG19fV9hZGRPcEV4cGFuc2lvbkxpc3RlbmVyKHQsZSl7dC5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsKCgpPT57dmFyIHQsbj0oZnVuY3Rpb24gaSh0LGUsbil7Y29uc3QgaT1uLnNwbGl0KCIvIikscj1pW2kubGVuZ3RoLTFdLm1hdGNoKC8oLiopOlx3Ky8pOzI9PT1yLmxlbmd0aCYmKGlbaS5sZW5ndGgtMV09clsxXSk7bGV0IG89aVswXSxhPWUuZ2V0UmVuZGVyTm9kZUJ5TmFtZShvKTtmb3IobGV0IG49MTtuPGkubGVuZ3RoJiZhLm5vZGUudHlwZSE9PUEkdC5PUDtuKyspZS5idWlsZFN1YmhpZXJhcmNoeShvKSxhLmV4cGFuZGVkPSEwLHQuc2V0Tm9kZUV4cGFuZGVkKGEpLG8rPSIvIitpW25dLGE9ZS5nZXRSZW5kZXJOb2RlQnlOYW1lKG8pO3JldHVybiBhLm5vZGUubmFtZX0pKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzY2VuZSIpLHRoaXMucmVuZGVySGllcmFyY2h5LGUpLHI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcigidGYtZ3JhcGgtaW5mbyNncmFwaC1pbmZvIik7ciYmKHQ9ci5zY3JvbGxIZWlnaHQtci5zY3JvbGxUb3ApO3ZhciBvPXRoaXMuc2VsZWN0ZWROb2RlO3RoaXMuc2V0KCJzZWxlY3RlZE5vZGUiLG4pO3ZhciBhPSgpPT57ci5zY3JvbGxUb3A9ci5zY3JvbGxIZWlnaHQtdH07ciYmKG8/YSgpOndpbmRvdy5zZXRUaW1lb3V0KGEsMjApKX0pKX19O3ZhciBXWnQ7R1p0LnRlbXBsYXRlPXhlYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBoMiB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtbGVnZW5kIHsKICAgICAgICBwYWRkaW5nOiAxNXB4OwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtbGVnZW5kIGgyIHsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtZW50cnkgewogICAgICAgIG1hcmdpbjogMTBweCAxMHB4IDEwcHggMDsKICAgICAgfQoKICAgICAgLmhlYWx0aC1waWxsLWVudHJ5IC5jb2xvci1wcmV2aWV3IHsKICAgICAgICB3aWR0aDogMjZweDsKICAgICAgICBoZWlnaHQ6IDI2cHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBtYXJnaW46IDAgMTBweCAwIDA7CiAgICAgIH0KCiAgICAgIC5oZWFsdGgtcGlsbC1lbnRyeSAuY29sb3ItbGFiZWwsCiAgICAgIC5oZWFsdGgtcGlsbC1lbnRyeSAudGVuc29yLWNvdW50IHsKICAgICAgICBjb2xvcjogIzc3NzsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAyNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMjJweDsKICAgICAgICBsaW5lLWhlaWdodDogMjZweDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtZW50cnkgLnRlbnNvci1jb3VudCB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CgogICAgICAjaGVhbHRoLXBpbGwtc3RlcC1zbGlkZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1hcmdpbjogMCAwIDAgLTE1cHg7CiAgICAgICAgLyogMzEgY29tZXMgZnJvbSBhZGRpbmcgYSBwYWRkaW5nIG9mIDE1cHggZnJvbSBib3RoIHNpZGVzIG9mIHRoZSBwYXBlci1zbGlkZXIsIHN1YnRyYWN0aW5nCiAgICogMXB4IHNvIHRoYXQgdGhlIHNsaWRlciB3aWR0aCBhbGlnbnMgd2l0aCB0aGUgaW1hZ2UgKHRoZSBsYXN0IHNsaWRlciBtYXJrZXIgdGFrZXMgdXAgMXB4KSwKICAgKiBhbmQgYWRkaW5nIDJweCB0byBhY2NvdW50IGZvciBhIGJvcmRlciBvZiAxcHggb24gYm90aCBzaWRlcyBvZiB0aGUgaW1hZ2UuIDMwIC0gMSArIDIuCiAgICogQXBwYXJlbnRseSwgdGhlIHBhcGVyLXNsaWRlciBsYWNrcyBhIG1peGluIGZvciB0aG9zZSBwYWRkaW5nIHZhbHVlcy4gKi8KICAgICAgICB3aWR0aDogY2FsYygxMDAlICsgMzFweCk7CiAgICAgIH0KCiAgICAgICNoZWFsdGgtcGlsbHMtbG9hZGluZy1zcGlubmVyIHsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgfQoKICAgICAgI2hlYWx0aC1waWxsLXN0ZXAtbnVtYmVyLWlucHV0IHsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRvcDsKICAgICAgfQoKICAgICAgI251bWVyaWMtYWxlcnRzLXRhYmxlLWNvbnRhaW5lciB7CiAgICAgICAgbWF4LWhlaWdodDogNDAwcHg7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgICNudW1lcmljLWFsZXJ0cy10YWJsZSB7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgfQoKICAgICAgI251bWVyaWMtYWxlcnRzLXRhYmxlIHRkIHsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CgogICAgICAjbnVtZXJpYy1hbGVydHMtdGFibGUgLmZpcnN0LW9mZmVuc2UtdGQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLmZpcnN0LW9mZmVuc2UtdGQgewogICAgICAgIHdpZHRoOiA4MHB4OwogICAgICB9CgogICAgICAudGVuc29yLWRldmljZS10ZCB7CiAgICAgICAgbWF4LXdpZHRoOiAxNDBweDsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KCiAgICAgIC50ZW5zb3Itc2VjdGlvbi13aXRoaW4tdGFibGUgewogICAgICAgIGNvbG9yOiAjMjY2MjM2OwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBvcGFjaXR5OiAwLjg7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KCiAgICAgIC50ZW5zb3Itc2VjdGlvbi13aXRoaW4tdGFibGU6aG92ZXIgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC5kZXZpY2Utc2VjdGlvbi13aXRoaW4tdGFibGUgewogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICB9CgogICAgICAubWluaS1oZWFsdGgtcGlsbCB7CiAgICAgICAgd2lkdGg6IDEzMHB4OwogICAgICB9CgogICAgICAubWluaS1oZWFsdGgtcGlsbCA+IGRpdiB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiA2MHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgfQoKICAgICAgI2V2ZW50LWNvdW50cy10aCB7CiAgICAgICAgcGFkZGluZzogMCAwIDAgMTBweDsKICAgICAgfQoKICAgICAgLm5lZ2F0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24gewogICAgICAgIGJhY2tncm91bmQ6IHJnYigyNTUsIDE0MSwgMCk7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5wb3NpdGl2ZS1pbmYtbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2IoMCwgNjIsIDIxMik7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5uYW4tbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBiYWNrZ3JvdW5kOiByZ2IoMjA0LCA0NywgNDQpOwogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICB9CgogICAgICAubmVnYXRpdmUtaW5mLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiwKICAgICAgLnBvc2l0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24sCiAgICAgIC5uYW4tbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyMHB4OwogICAgICAgIG1hcmdpbjogMCAwIDAgMTBweDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIC5uby1udW1lcmljLWFsZXJ0cy1ub3RpZmljYXRpb24gewogICAgICAgIG1hcmdpbjogMDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxwYXBlci1tYXRlcmlhbCBlbGV2YXRpb249IjEiIGNsYXNzPSJjYXJkIGhlYWx0aC1waWxsLWxlZ2VuZCI+CiAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj4KICAgICAgICBFbmFibGUgYWxsIChub3QganVzdCBzYW1wbGVkKSBzdGVwcy4gUmVxdWlyZXMgc2xvdyBkaXNrIHJlYWQuCiAgICAgIDwvZGl2PgogICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbgogICAgICAgIGlkPSJlbmFibGVBbGxTdGVwc01vZGVUb2dnbGUiCiAgICAgICAgY2hlY2tlZD0ie3thbGxTdGVwc01vZGVFbmFibGVkfX0iCiAgICAgID4KICAgICAgPC9wYXBlci10b2dnbGUtYnV0dG9uPgogICAgICA8aDI+CiAgICAgICAgU3RlcCBvZiBIZWFsdGggUGlsbHM6CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2FsbFN0ZXBzTW9kZUVuYWJsZWRdXSI+CiAgICAgICAgICA8aW5wdXQKICAgICAgICAgICAgdHlwZT0ibnVtYmVyIgogICAgICAgICAgICBpZD0iaGVhbHRoLXBpbGwtc3RlcC1udW1iZXItaW5wdXQiCiAgICAgICAgICAgIG1pbj0iMCIKICAgICAgICAgICAgbWF4PSJbW19iaWdnZXN0U3RlcEV2ZXJTZWVuXV0iCiAgICAgICAgICAgIHZhbHVlPSJ7e3NwZWNpZmljSGVhbHRoUGlsbFN0ZXA6OmlucHV0fX0iCiAgICAgICAgICAvPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFhbGxTdGVwc01vZGVFbmFibGVkXV0iPgogICAgICAgICAgW1tfY3VycmVudFN0ZXBEaXNwbGF5VmFsdWVdXQogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHBhcGVyLXNwaW5uZXItbGl0ZQogICAgICAgICAgYWN0aXZlCiAgICAgICAgICBoaWRkZW4kPSJbWyFhcmVIZWFsdGhQaWxsc0xvYWRpbmddXSIKICAgICAgICAgIGlkPSJoZWFsdGgtcGlsbHMtbG9hZGluZy1zcGlubmVyIgogICAgICAgID48L3BhcGVyLXNwaW5uZXItbGl0ZT4KICAgICAgPC9oMj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2FsbFN0ZXBzTW9kZUVuYWJsZWRdXSI+CiAgICAgICAgPHBhcGVyLXNsaWRlcgogICAgICAgICAgaWQ9ImhlYWx0aC1waWxsLXN0ZXAtc2xpZGVyIgogICAgICAgICAgaW1tZWRpYXRlLXZhbHVlPSJ7e3NwZWNpZmljSGVhbHRoUGlsbFN0ZXB9fSIKICAgICAgICAgIG1heD0iW1tfYmlnZ2VzdFN0ZXBFdmVyU2Vlbl1dIgogICAgICAgICAgc25hcHMKICAgICAgICAgIHN0ZXA9IjEiCiAgICAgICAgICB2YWx1ZT0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwfX0iCiAgICAgICAgPjwvcGFwZXItc2xpZGVyPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIWFsbFN0ZXBzTW9kZUVuYWJsZWRdXSI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19tYXhTdGVwSW5kZXhdXSI+CiAgICAgICAgICA8cGFwZXItc2xpZGVyCiAgICAgICAgICAgIGlkPSJoZWFsdGgtcGlsbC1zdGVwLXNsaWRlciIKICAgICAgICAgICAgaW1tZWRpYXRlLXZhbHVlPSJ7e2hlYWx0aFBpbGxTdGVwSW5kZXh9fSIKICAgICAgICAgICAgbWF4PSJbW19tYXhTdGVwSW5kZXhdXSIKICAgICAgICAgICAgc25hcHMKICAgICAgICAgICAgc3RlcD0iMSIKICAgICAgICAgICAgdmFsdWU9Int7aGVhbHRoUGlsbFN0ZXBJbmRleH19IgogICAgICAgICAgPjwvcGFwZXItc2xpZGVyPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDxoMj4KICAgICAgICBIZWFsdGggUGlsbAogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1toZWFsdGhQaWxsVmFsdWVzRm9yU2VsZWN0ZWROb2RlXV0iPgogICAgICAgICAgQ291bnRzIGZvciBTZWxlY3RlZCBOb2RlCiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIWhlYWx0aFBpbGxWYWx1ZXNGb3JTZWxlY3RlZE5vZGVdXSI+CiAgICAgICAgICBMZWdlbmQKICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2gyPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2hlYWx0aFBpbGxFbnRyaWVzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWx0aC1waWxsLWVudHJ5Ij4KICAgICAgICAgIDxkaXYKICAgICAgICAgICAgY2xhc3M9ImNvbG9yLXByZXZpZXciCiAgICAgICAgICAgIHN0eWxlPSJiYWNrZ3JvdW5kOltbaXRlbS5iYWNrZ3JvdW5kX2NvbG9yXV0iCiAgICAgICAgICA+PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sYWJlbCI+W1tpdGVtLmxhYmVsXV08L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRlbnNvci1jb3VudCI+CiAgICAgICAgICAgIFtbX2NvbXB1dGVUZW5zb3JDb3VudFN0cmluZyhoZWFsdGhQaWxsVmFsdWVzRm9yU2VsZWN0ZWROb2RlLAogICAgICAgICAgICBpbmRleCldXQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDxkaXYgaGlkZGVuJD0iW1shX2hhc0RlYnVnZ2VyTnVtZXJpY0FsZXJ0cyhkZWJ1Z2dlck51bWVyaWNBbGVydHMpXV0iPgogICAgICAgIDxoMiBpZD0ibnVtZXJpYy1hbGVydHMtaGVhZGVyIj5OdW1lcmljIEFsZXJ0czwvaDI+CiAgICAgICAgPHA+QWxlcnRzIGFyZSBzb3J0ZWQgZnJvbSB0b3AgdG8gYm90dG9tIGJ5IGluY3JlYXNpbmcgdGltZXN0YW1wLjwvcD4KICAgICAgICA8ZGl2IGlkPSJudW1lcmljLWFsZXJ0cy10YWJsZS1jb250YWluZXIiPgogICAgICAgICAgPHRhYmxlIGlkPSJudW1lcmljLWFsZXJ0cy10YWJsZSI+CiAgICAgICAgICAgIDx0aGVhZD4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGg+Rmlyc3QgT2ZmZW5zZTwvdGg+CiAgICAgICAgICAgICAgICA8dGg+VGVuc29yIChEZXZpY2UpPC90aD4KICAgICAgICAgICAgICAgIDx0aCBpZD0iZXZlbnQtY291bnRzLXRoIj5FdmVudCBDb3VudHM8L3RoPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGhlYWQ+CiAgICAgICAgICAgIDx0Ym9keSBpZD0ibnVtZXJpYy1hbGVydHMtYm9keSI+PC90Ym9keT4KICAgICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8dGVtcGxhdGUKICAgICAgICBpcz0iZG9tLWlmIgogICAgICAgIGlmPSJbWyFfaGFzRGVidWdnZXJOdW1lcmljQWxlcnRzKGRlYnVnZ2VyTnVtZXJpY0FsZXJ0cyldXSIKICAgICAgPgogICAgICAgIDxwIGNsYXNzPSJuby1udW1lcmljLWFsZXJ0cy1ub3RpZmljYXRpb24iPgogICAgICAgICAgTm8gbnVtZXJpYyBhbGVydHMgc28gZmFyLiBUaGF0IGlzIGxpa2VseSBnb29kLiBBbGVydHMgaW5kaWNhdGUgdGhlCiAgICAgICAgICBwcmVzZW5jZSBvZiBOYU4gb3IgKCsvLSkgSW5maW5pdHkgdmFsdWVzLCB3aGljaCBtYXkgYmUgY29uY2VybmluZy4KICAgICAgICA8L3A+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3BhcGVyLW1hdGVyaWFsPgogIGAsdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsQUt0KV0sR1p0LnByb3RvdHlwZSwicmVuZGVySGllcmFyY2h5Iix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXksbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEdadC5wcm90b3R5cGUsImRlYnVnZ2VyTnVtZXJpY0FsZXJ0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxHWnQucHJvdG90eXBlLCJub2RlTmFtZXNUb0hlYWx0aFBpbGxzIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyLG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxHWnQucHJvdG90eXBlLCJoZWFsdGhQaWxsU3RlcEluZGV4Iix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyLG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxHWnQucHJvdG90eXBlLCJzcGVjaWZpY0hlYWx0aFBpbGxTdGVwIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nLG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxHWnQucHJvdG90eXBlLCJzZWxlY3RlZE5vZGUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEdadC5wcm90b3R5cGUsImhpZ2hsaWdodGVkTm9kZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcixub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sR1p0LnByb3RvdHlwZSwic2VsZWN0ZWROb2RlSW5jbHVkZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sR1p0LnByb3RvdHlwZSwiYXJlSGVhbHRoUGlsbHNMb2FkaW5nIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxHWnQucHJvdG90eXBlLCJoZWFsdGhQaWxsRW50cmllcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEdadC5wcm90b3R5cGUsImFsbFN0ZXBzTW9kZUVuYWJsZWQiLHZvaWQgMCksdChbcygibm9kZU5hbWVzVG9IZWFsdGhQaWxscyIsImhlYWx0aFBpbGxTdGVwSW5kZXgiLCJzZWxlY3RlZE5vZGUiLCJhbGxTdGVwc01vZGVFbmFibGVkIiwiYXJlSGVhbHRoUGlsbHNMb2FkaW5nIiksZSgiZGVzaWduOnR5cGUiLEFycmF5KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxHWnQucHJvdG90eXBlLCJoZWFsdGhQaWxsVmFsdWVzRm9yU2VsZWN0ZWROb2RlIixudWxsKSx0KFtzKCJub2RlTmFtZXNUb0hlYWx0aFBpbGxzIiwiaGVhbHRoUGlsbFN0ZXBJbmRleCIsImFsbFN0ZXBzTW9kZUVuYWJsZWQiLCJzcGVjaWZpY0hlYWx0aFBpbGxTdGVwIiwiYXJlSGVhbHRoUGlsbHNMb2FkaW5nIiksZSgiZGVzaWduOnR5cGUiLE9iamVjdCksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sR1p0LnByb3RvdHlwZSwiX2N1cnJlbnRTdGVwRGlzcGxheVZhbHVlIixudWxsKSx0KFtzKCJub2RlTmFtZXNUb0hlYWx0aFBpbGxzIiksZSgiZGVzaWduOnR5cGUiLE51bWJlciksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sR1p0LnByb3RvdHlwZSwiX2JpZ2dlc3RTdGVwRXZlclNlZW4iLG51bGwpLHQoW3MoIm5vZGVOYW1lc1RvSGVhbHRoUGlsbHMiKSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxHWnQucHJvdG90eXBlLCJfbWF4U3RlcEluZGV4IixudWxsKSx0KFthKCJkZWJ1Z2dlck51bWVyaWNBbGVydHMiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLEdadC5wcm90b3R5cGUsIl91cGRhdGVBbGVydHNMaXN0IixudWxsKSxHWnQ9dChbaSgidGYtZ3JhcGgtZGVidWdnZXItZGF0YS1jYXJkIildLEdadCksKGZ1bmN0aW9uKHQpe3QuQ09OU1Q9IkNPTlNUIix0Lk1FVEE9Ik1FVEEiLHQuT1A9Ik9QIix0LlNFUklFUz0iU0VSSUVTIix0LlNVTU1BUlk9IlNVTU1BUlkifSkoV1p0fHwoV1p0PXt9KSk7bGV0IHFadD1jbGFzcyBleHRlbmRzKGNyKGdsKHdlKSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLnZlcnRpY2FsPSExLHRoaXMuZmlsbE92ZXJyaWRlPW51bGwsdGhpcy5zdHJva2VPdmVycmlkZT1udWxsLHRoaXMuaGVpZ2h0PTIwLHRoaXMuZmFkZWQ9ITF9Z2V0U3ZnRGVmaW5hYmxlRWxlbWVudCgpe3JldHVybiB0aGlzLiQuc3ZnRGVmc31nZXQgX2ZpbGwoKXt2YXIgdD10aGlzLmZpbGxPdmVycmlkZTtpZihudWxsIT10KXJldHVybiB0O3N3aXRjaCh0aGlzLnR5cGUpe2Nhc2UgV1p0Lk1FVEE6cmV0dXJuIGdLdC5ERUZBVUxUX0ZJTEw7Y2FzZSBXWnQuU0VSSUVTOnJldHVybiBfS3Q7ZGVmYXVsdDpyZXR1cm4gZEt0fX1nZXQgX3N0cm9rZSgpe3ZhciB0PXRoaXMuc3Ryb2tlT3ZlcnJpZGU7aWYobnVsbCE9dClyZXR1cm4gdDtzd2l0Y2godGhpcy50eXBlKXtjYXNlIFdadC5NRVRBOnJldHVybiBnS3QuREVGQVVMVF9TVFJPS0U7Y2FzZSBXWnQuU0VSSUVTOnJldHVybiB5S3Q7ZGVmYXVsdDpyZXR1cm4gcEt0fX1faXNUeXBlKHQsZSl7cmV0dXJuIHQ9PT1lfV9mYWRlZENsYXNzKHQsZSl7cmV0dXJuIHQ/ImZhZGVkLSIrZToiIn19O3FadC50ZW1wbGF0ZT14ZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGZvbnQtc2l6ZTogMDsKICAgICAgfQoKICAgICAgOmhvc3QoLmRhcmstbW9kZSkgc3ZnIHsKICAgICAgICBmaWx0ZXI6IGludmVydCgxKTsKICAgICAgfQoKICAgICAgLmZhZGVkLXJlY3QgewogICAgICAgIGZpbGw6IHVybCgjcmVjdEhhdGNoKTsKICAgICAgfQoKICAgICAgLmZhZGVkLWVsbGlwc2UgewogICAgICAgIGZpbGw6IHVybCgjZWxsaXBzZUhhdGNoKTsKICAgICAgfQoKICAgICAgLmZhZGVkLXJlY3QsCiAgICAgIC5mYWRlZC1lbGxpcHNlLAogICAgICAuZmFkZWQtc2VyaWVzIHsKICAgICAgICBzdHJva2U6IHZhcigtLXRiLWdyYXBoLWZhZGVkKSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgICNyZWN0SGF0Y2ggbGluZSwKICAgICAgI2VsbGlwc2VIYXRjaCBsaW5lIHsKICAgICAgICBjb2xvcjogI2UwZDRiMyAhaW1wb3J0YW50OwogICAgICAgIGZpbGw6IHdoaXRlOwogICAgICAgIHN0cm9rZTogI2UwZDRiMyAhaW1wb3J0YW50OwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPCEtLSBTVkcgZm9yIGRlZmluaXRpb25zIC0tPgogICAgPHN2ZyBoZWlnaHQ9IjAiIHdpZHRoPSIwIiBpZD0ic3ZnRGVmcyI+CiAgICAgIDxkZWZzPgogICAgICAgIDwhLS0gSGF0Y2ggcGF0dGVybnMgZm9yIGZhZGVkIG91dCBub2Rlcy4gLS0+CiAgICAgICAgPHBhdHRlcm4KICAgICAgICAgIGlkPSJyZWN0SGF0Y2giCiAgICAgICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJyb3RhdGUoNDUgMCAwKSIKICAgICAgICAgIHdpZHRoPSI1IgogICAgICAgICAgaGVpZ2h0PSI1IgogICAgICAgICAgcGF0dGVyblVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgICA+CiAgICAgICAgICA8bGluZSB4MT0iMCIgeTE9IjAiIHgyPSIwIiB5Mj0iNSIgc3R5bGU9InN0cm9rZS13aWR0aDogMSI+PC9saW5lPgogICAgICAgIDwvcGF0dGVybj4KICAgICAgICA8cGF0dGVybgogICAgICAgICAgaWQ9ImVsbGlwc2VIYXRjaCIKICAgICAgICAgIHBhdHRlcm5UcmFuc2Zvcm09InJvdGF0ZSg0NSAwIDApIgogICAgICAgICAgd2lkdGg9IjIiCiAgICAgICAgICBoZWlnaHQ9IjIiCiAgICAgICAgICBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgID4KICAgICAgICAgIDxsaW5lIHgxPSIwIiB5MT0iMCIgeDI9IjAiIHkyPSIyIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxIj48L2xpbmU+CiAgICAgICAgPC9wYXR0ZXJuPgogICAgICAgIDwhLS0gVGVtcGxhdGUgZm9yIGFuIE9wIG5vZGUgZWxsaXBzZS4gLS0+CiAgICAgICAgPGVsbGlwc2UKICAgICAgICAgIGlkPSJvcC1ub2RlLXN0YW1wIgogICAgICAgICAgcng9IjcuNSIKICAgICAgICAgIHJ5PSIzIgogICAgICAgICAgc3Ryb2tlPSJpbmhlcml0IgogICAgICAgICAgZmlsbD0iaW5oZXJpdCIKICAgICAgICA+PC9lbGxpcHNlPgogICAgICAgIDwhLS0gVGVtcGxhdGUgZm9yIGFuIE9wIG5vZGUgYW5ub3RhdGlvbiBlbGxpcHNlIChzbWFsbGVyKS4gLS0+CiAgICAgICAgPGVsbGlwc2UKICAgICAgICAgIGlkPSJvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiCiAgICAgICAgICByeD0iNSIKICAgICAgICAgIHJ5PSIyIgogICAgICAgICAgc3Ryb2tlPSJpbmhlcml0IgogICAgICAgICAgZmlsbD0iaW5oZXJpdCIKICAgICAgICA+PC9lbGxpcHNlPgogICAgICAgIDwhLS0gVmVydGljYWxseSBzdGFja2VkIHNlcmllcyBvZiBPcCBub2RlcyB3aGVuIHVuZXhwYW5kZWQuIC0tPgogICAgICAgIDxnIGlkPSJvcC1zZXJpZXMtdmVydGljYWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iOCIgeT0iOSI+PC91c2U+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSI2Ij48L3VzZT4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjMiPjwvdXNlPgogICAgICAgIDwvZz4KICAgICAgICA8ZyBpZD0ib3Atc2VyaWVzLWhvcml6b250YWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iMTYiIHk9IjQiPjwvdXNlPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iMTIiIHk9IjQiPjwvdXNlPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iOCIgeT0iNCI+PC91c2U+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICBpZD0ic3VtbWFyeS1pY29uIgogICAgICAgICAgZmlsbD0iIzg0ODQ4NCIKICAgICAgICAgIGhlaWdodD0iMTIiCiAgICAgICAgICB2aWV3Qm94PSIwIDAgMjQgMjQiCiAgICAgICAgICB3aWR0aD0iMTIiCiAgICAgICAgPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yek05IDE3SDd2LTdoMnY3em00IDBoLTJWN2gydjEwem00IDBoLTJ2LTRoMnY0eiIKICAgICAgICAgID48L3BhdGg+CiAgICAgICAgPC9nPgogICAgICA8L2RlZnM+CiAgICA8L3N2Zz4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNUeXBlKHR5cGUsICdDT05TVCcpXV0iPgogICAgICA8c3ZnCiAgICAgICAgaGVpZ2h0JD0iW1toZWlnaHRdXSIKICAgICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pZCBtZWV0IgogICAgICAgIHZpZXdCb3g9IjAgMCAxMCAxMCIKICAgICAgPgogICAgICAgIDxjaXJjbGUKICAgICAgICAgIGN4PSI1IgogICAgICAgICAgY3k9IjUiCiAgICAgICAgICByPSIzIgogICAgICAgICAgZmlsbCQ9IltbX2ZpbGxdXSIKICAgICAgICAgIHN0cm9rZSQ9IltbX3N0cm9rZV1dIgogICAgICAgID48L2NpcmNsZT4KICAgICAgPC9zdmc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1R5cGUodHlwZSwgJ1NVTU1BUlknKV1dIj4KICAgICAgPHN2ZwogICAgICAgIHdpZHRoJD0iW1toZWlnaHRdXSIKICAgICAgICBoZWlnaHQkPSJbW2hlaWdodF1dIgogICAgICAgIHZpZXdCb3g9IjAgMCAyNCAyNCIKICAgICAgICBmaWxsPSIjODQ4NDg0IgogICAgICA+CiAgICAgICAgPHBhdGgKICAgICAgICAgIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnpNOSAxN0g3di03aDJ2N3ptNCAwaC0yVjdoMnYxMHptNCAwaC0ydi00aDJ2NHoiCiAgICAgICAgPjwvcGF0aD4KICAgICAgPC9zdmc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1R5cGUodHlwZSwgJ09QJyldXSI+CiAgICAgIDxzdmcKICAgICAgICBoZWlnaHQkPSJbW2hlaWdodF1dIgogICAgICAgIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaW5ZTWlkIG1lZXQiCiAgICAgICAgdmlld0JveD0iMCAwIDE2IDgiCiAgICAgID4KICAgICAgICA8dXNlCiAgICAgICAgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgICAgICAgIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIgogICAgICAgICAgZmlsbCQ9IltbX2ZpbGxdXSIKICAgICAgICAgIHN0cm9rZSQ9IltbX3N0cm9rZV1dIgogICAgICAgICAgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGZhZGVkLCAnZWxsaXBzZScpfX0iCiAgICAgICAgICB4PSI4IgogICAgICAgICAgeT0iNCIKICAgICAgICA+PC91c2U+CiAgICAgIDwvc3ZnPgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNUeXBlKHR5cGUsICdNRVRBJyldXSI+CiAgICAgIDxzdmcKICAgICAgICBoZWlnaHQkPSJbW2hlaWdodF1dIgogICAgICAgIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaW5ZTWlkIG1lZXQiCiAgICAgICAgdmlld0JveD0iMCAwIDM3IDE2IgogICAgICA+CiAgICAgICAgPHJlY3QKICAgICAgICAgIHg9IjEiCiAgICAgICAgICB5PSIxIgogICAgICAgICAgZmlsbCQ9IltbX2ZpbGxdXSIKICAgICAgICAgIHN0cm9rZSQ9IltbX3N0cm9rZV1dIgogICAgICAgICAgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGZhZGVkLCAncmVjdCcpfX0iCiAgICAgICAgICBzdHJva2Utd2lkdGg9IjJweCIKICAgICAgICAgIGhlaWdodD0iMTQiCiAgICAgICAgICB3aWR0aD0iMzUiCiAgICAgICAgICByeD0iNSIKICAgICAgICAgIHJ5PSI1IgogICAgICAgID48L3JlY3Q+CiAgICAgIDwvc3ZnPgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNUeXBlKHR5cGUsICdTRVJJRVMnKV1dIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3ZlcnRpY2FsXV0iPgogICAgICAgIDxzdmcKICAgICAgICAgIGhlaWdodCQ9IltbaGVpZ2h0XV0iCiAgICAgICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pZCBtZWV0IgogICAgICAgICAgdmlld0JveD0iMCAwIDE2IDE1IgogICAgICAgID4KICAgICAgICAgIDx1c2UKICAgICAgICAgICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgICAgICAgICAgIHhsaW5rOmhyZWY9IiNvcC1zZXJpZXMtdmVydGljYWwtc3RhbXAiCiAgICAgICAgICAgIGZpbGwkPSJbW19maWxsXV0iCiAgICAgICAgICAgIHN0cm9rZSQ9IltbX3N0cm9rZV1dIgogICAgICAgICAgICBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoZmFkZWQsICdzZXJpZXMnKX19IgogICAgICAgICAgICB4PSIwIgogICAgICAgICAgICB5PSIyIgogICAgICAgICAgPjwvdXNlPgogICAgICAgIDwvc3ZnPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIXZlcnRpY2FsXV0iPgogICAgICAgIDxzdmcKICAgICAgICAgIGhlaWdodCQ9IltbaGVpZ2h0XV0iCiAgICAgICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pZCBtZWV0IgogICAgICAgICAgdmlld0JveD0iMCAwIDI0IDEwIgogICAgICAgID4KICAgICAgICAgIDx1c2UKICAgICAgICAgICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgICAgICAgICAgIHhsaW5rOmhyZWY9IiNvcC1zZXJpZXMtaG9yaXpvbnRhbC1zdGFtcCIKICAgICAgICAgICAgZmlsbCQ9IltbX2ZpbGxdXSIKICAgICAgICAgICAgc3Ryb2tlJD0iW1tfc3Ryb2tlXV0iCiAgICAgICAgICAgIGNsYXNzJD0ie3tfZmFkZWRDbGFzcyhmYWRlZCwgJ3NlcmllcycpfX0iCiAgICAgICAgICAgIHg9IjAiCiAgICAgICAgICAgIHk9IjEiCiAgICAgICAgICA+PC91c2U+CiAgICAgICAgPC9zdmc+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3RlbXBsYXRlPgogIGAsdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0scVp0LnByb3RvdHlwZSwidHlwZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLHFadC5wcm90b3R5cGUsInZlcnRpY2FsIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLHFadC5wcm90b3R5cGUsImZpbGxPdmVycmlkZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxxWnQucHJvdG90eXBlLCJzdHJva2VPdmVycmlkZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxxWnQucHJvdG90eXBlLCJoZWlnaHQiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxxWnQucHJvdG90eXBlLCJmYWRlZCIsdm9pZCAwKSx0KFtzKCJ0eXBlIiwiZmlsbE92ZXJyaWRlIiksZSgiZGVzaWduOnR5cGUiLFN0cmluZyksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0scVp0LnByb3RvdHlwZSwiX2ZpbGwiLG51bGwpLHQoW3MoInR5cGUiLCJzdHJva2VPdmVycmlkZSIpLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLHFadC5wcm90b3R5cGUsIl9zdHJva2UiLG51bGwpLHFadD10KFtpKCJ0Zi1ncmFwaC1pY29uIildLHFadCk7dmFyIFladD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxnZXQgR3JhcGhJY29uVHlwZSgpe3JldHVybiBXWnR9fSk7bGV0IFhadD1jbGFzcyBleHRlbmRzKGNyKHdlKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMubm9kZT1udWxsLHRoaXMucmVuZGVySW5mbz1udWxsLHRoaXMuY29sb3JCeT1yWnQuU1RSVUNUVVJFLHRoaXMudGVtcGxhdGVJbmRleD1udWxsLHRoaXMudHlwZT1udWxsLHRoaXMudmVydGljYWw9ITEsdGhpcy5jb25zdD0hMSx0aGlzLnN1bW1hcnk9ITEsdGhpcy5maWxsPW51bGwsdGhpcy5oZWlnaHQ9MjB9X2NvbXB1dGVGaWxsT3ZlcnJpZGUodCxlLG4saSxyKXtyZXR1cm4gdCYmZSYmaT9rWnQoaSxuLGUsITEpOnJ9X2dldFN0cm9rZU92ZXJyaWRlKHQpe3JldHVybiB0P1BadCh0KTpudWxsfV9nZXRUeXBlKHQsZSxuLGkpe2NvbnN0e0dyYXBoSWNvblR5cGU6cn09WVp0O2lmKHQpc3dpdGNoKHQudHlwZSl7Y2FzZSBBJHQuT1A6e2NvbnN0IGk9dC5vcDtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGk/ci5PUDoiQ29uc3QiPT09aXx8bj9yLkNPTlNUOmkuZW5kc1dpdGgoIlN1bW1hcnkiKXx8ZT9yLlNVTU1BUlk6ci5PUH1jYXNlIEEkdC5NRVRBOnJldHVybiByLk1FVEE7Y2FzZSBBJHQuU0VSSUVTOnJldHVybiByLlNFUklFU31yZXR1cm4gaX1faXNWZXJ0aWNhbCh0LGUpe3JldHVybiB0P3QuaGFzTm9uQ29udHJvbEVkZ2VzOiEhZX1fZ2V0RmFkZWQodCl7cmV0dXJuIHQmJnQuaXNGYWRlZE91dH1fb25GaWxsT3ZlcnJpZGVDaGFuZ2VkKHQsZSl7Y29uc3R7bm9kZTpuLHJlbmRlckluZm86aSxjb2xvckJ5OnIsdGVtcGxhdGVJbmRleDpvfT10aGlzO3QhPT1lJiZBWnQodGhpcy4kLmljb24uZ2V0U3ZnRGVmaW5hYmxlRWxlbWVudCgpKSxuJiZpJiZvJiZrWnQobyxyLGksITEsdGhpcy4kLmljb24uZ2V0U3ZnRGVmaW5hYmxlRWxlbWVudCgpKX19O1hadC50ZW1wbGF0ZT14ZWAKICAgIDxzdHlsZT4KICAgICAgdGYtZ3JhcGgtaWNvbiB7CiAgICAgICAgLS10Yi1ncmFwaC1mYWRlZDogdmFyKC0tdGItZ3JhcGgtZmFkZWQpOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHRmLWdyYXBoLWljb24KICAgICAgaWQ9Imljb24iCiAgICAgIHR5cGU9IltbX2dldFR5cGUobm9kZSwgc3VtbWFyeSwgY29uc3QsIHR5cGUpXV0iCiAgICAgIGhlaWdodD0iW1toZWlnaHRdXSIKICAgICAgZmlsbC1vdmVycmlkZT0iW1tfZmlsbE92ZXJyaWRlXV0iCiAgICAgIHN0cm9rZS1vdmVycmlkZT0iW1tfZ2V0U3Ryb2tlT3ZlcnJpZGUoX2ZpbGxPdmVycmlkZSldXSIKICAgICAgZmFkZWQ9IltbX2dldEZhZGVkKHJlbmRlckluZm8pXV0iCiAgICAgIHZlcnRpY2FsPSJbW19pc1ZlcnRpY2FsKG5vZGUsIHZlcnRpY2FsKV1dIgogICAgPjwvdGYtZ3JhcGgtaWNvbj4KICBgLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFhadC5wcm90b3R5cGUsIm5vZGUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sWFp0LnByb3RvdHlwZSwicmVuZGVySW5mbyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxYWnQucHJvdG90eXBlLCJjb2xvckJ5Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKV0sWFp0LnByb3RvdHlwZSwidGVtcGxhdGVJbmRleCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxYWnQucHJvdG90eXBlLCJ0eXBlIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sWFp0LnByb3RvdHlwZSwidmVydGljYWwiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxYWnQucHJvdG90eXBlLCJjb25zdCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLFhadC5wcm90b3R5cGUsInN1bW1hcnkiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sWFp0LnByb3RvdHlwZSwiZmlsbCIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxYWnQucHJvdG90eXBlLCJoZWlnaHQiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmcsY29tcHV0ZWQ6Il9jb21wdXRlRmlsbE92ZXJyaWRlKG5vZGUsIHJlbmRlckluZm8sIGNvbG9yQnksIHRlbXBsYXRlSW5kZXgsIGZpbGwpIixvYnNlcnZlcjoiX29uRmlsbE92ZXJyaWRlQ2hhbmdlZCJ9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sWFp0LnByb3RvdHlwZSwiX2ZpbGxPdmVycmlkZSIsdm9pZCAwKSxYWnQ9dChbaSgidGYtbm9kZS1pY29uIildLFhadCk7bGV0ICRadD1jbGFzcyBleHRlbmRzKGNyKHdlKSl7X2l0ZW1UeXBlQ2hhbmdlZCgpeyJzdWJub2RlIiE9PXRoaXMuaXRlbVR5cGU/dGhpcy4kWyJsaXN0LWl0ZW0iXS5jbGFzc0xpc3QuYWRkKCJjbGlja2FibGUiKTp0aGlzLiRbImxpc3QtaXRlbSJdLmNsYXNzTGlzdC5yZW1vdmUoImNsaWNrYWJsZSIpfV9ub2RlTGlzdGVuZXIodCl7dGhpcy5maXJlKCJub2RlLWxpc3QtaXRlbS0iK3QudHlwZSx7bm9kZU5hbWU6dGhpcy5uYW1lLHR5cGU6dGhpcy5pdGVtVHlwZX0pfV9mYWRlZENsYXNzKHQpe3JldHVybiB0JiZ0LmlzRmFkZWRPdXQ/ImZhZGVkIjoiIn19OyRadC50ZW1wbGF0ZT14ZWAKICAgIDxzdHlsZT4KICAgICAgI2xpc3QtaXRlbSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgY29sb3I6IHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKTsKICAgICAgICBmb250LXNpemU6IDExcHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICAjbGlzdC1pdGVtOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1nb29nbGUteWVsbG93LTEwMCk7CiAgICAgIH0KCiAgICAgIC5jbGlja2FibGUgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbSBzcGFuIHsKICAgICAgICBtYXJnaW4tbGVmdDogNDBweDsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbS5leGNsdWRlZCBzcGFuIHsKICAgICAgICBjb2xvcjogIzk5OTsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbSBzcGFuLmVkZ2UtbGFiZWwgewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDNweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDVweDsKICAgICAgfQoKICAgICAgLm5vZGUtaWNvbiB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMXB4OwogICAgICAgIGxlZnQ6IDJweDsKICAgICAgfQoKICAgICAgLmZhZGVkIHNwYW4gewogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1ncmFwaC1mYWRlZCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdgogICAgICBpZD0ibGlzdC1pdGVtIgogICAgICBvbi1tb3VzZW92ZXI9Il9ub2RlTGlzdGVuZXIiCiAgICAgIG9uLW1vdXNlb3V0PSJfbm9kZUxpc3RlbmVyIgogICAgICBvbi1jbGljaz0iX25vZGVMaXN0ZW5lciIKICAgID4KICAgICAgPGRpdiBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoaXRlbVJlbmRlckluZm8pfX0iPgogICAgICAgIDx0Zi1ub2RlLWljb24KICAgICAgICAgIGNsYXNzPSJub2RlLWljb24iCiAgICAgICAgICBoZWlnaHQ9IjEyIgogICAgICAgICAgY29sb3ItYnk9IltbY29sb3JCeV1dIgogICAgICAgICAgY29sb3ItYnktcGFyYW1zPSJbW2NvbG9yQnlQYXJhbXNdXSIKICAgICAgICAgIG5vZGU9IltbaXRlbU5vZGVdXSIKICAgICAgICAgIHJlbmRlci1pbmZvPSJbW2l0ZW1SZW5kZXJJbmZvXV0iCiAgICAgICAgICB0ZW1wbGF0ZS1pbmRleD0iW1t0ZW1wbGF0ZUluZGV4XV0iCiAgICAgICAgPgogICAgICAgIDwvdGYtbm9kZS1pY29uPgogICAgICAgIDxzcGFuIHRpdGxlJD0iW1tuYW1lXV0iPltbbmFtZV1dPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIGAsdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sJFp0LnByb3RvdHlwZSwiY2FyZE5vZGUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sJFp0LnByb3RvdHlwZSwiaXRlbU5vZGUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sJFp0LnByb3RvdHlwZSwiZWRnZUxhYmVsIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLCRadC5wcm90b3R5cGUsIml0ZW1SZW5kZXJJbmZvIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLCRadC5wcm90b3R5cGUsIm5hbWUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9pdGVtVHlwZUNoYW5nZWQifSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLCRadC5wcm90b3R5cGUsIml0ZW1UeXBlIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLCRadC5wcm90b3R5cGUsImNvbG9yQnkiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sJFp0LnByb3RvdHlwZSwiY29sb3JCeVBhcmFtcyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbildLCRadC5wcm90b3R5cGUsInRlbXBsYXRlSW5kZXgiLHZvaWQgMCksJFp0PXQoW2koInRmLWdyYXBoLW9wLWNvbXBhdC1saXN0LWl0ZW0iKV0sJFp0KTtsZXQgS1p0PWNsYXNzIGV4dGVuZHMoY3IoZ2wod2UpKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX2V4cGFuZGVkPSEwLHRoaXMuX29wQ29tcGF0Q29sb3I9Zkt0LHRoaXMuX29wSW5jb21wYXRDb2xvcj1tS3QsdGhpcy5fdGVtcGxhdGVJbmRleD1udWxsfV9nZXROb2RlKHQsZSl7cmV0dXJuIGUubm9kZSh0KX1fZ2V0UmVuZGVySW5mbyh0LGUpe3JldHVybiB0aGlzLnJlbmRlckhpZXJhcmNoeS5nZXRPckNyZWF0ZVJlbmRlck5vZGVCeU5hbWUodCl9X3RvZ2dsZUV4cGFuZGVkKCl7dGhpcy5fZXhwYW5kZWQ9IXRoaXMuX2V4cGFuZGVkfV9nZXRUb2dnbGVJY29uKHQpe3JldHVybiB0PyJleHBhbmQtbGVzcyI6ImV4cGFuZC1tb3JlIn1fcmVzaXplTGlzdCh0KXt2YXIgZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHQpO2UmJmUuZmlyZSgiaXJvbi1yZXNpemUiKX1nZXQgX2luY29tcGF0aWJsZU9wTm9kZXMoKXtjb25zdCB0PXRoaXMuZ3JhcGhIaWVyYXJjaHk7cmV0dXJuIHQmJnQucm9vdD8odGhpcy5hc3luYyh0aGlzLl9yZXNpemVMaXN0LmJpbmQodGhpcywiI2luY29tcGF0aWJsZU9wc0xpc3QiKSksKGZ1bmN0aW9uIGUodCl7Y29uc3QgZT1bXSxuPXt9O3JldHVybiBDZS5leHBvcnRzLmVhY2godC5yb290LmxlYXZlcygpLChpPT57bGV0IHI9dC5ub2RlKGkpO2lmKHIudHlwZT09QSR0Lk9QKXtsZXQgaT1yO2lmKCFpLmNvbXBhdGlibGUpaWYoaS5vd25pbmdTZXJpZXMpe2lmKHQuZ2V0U2VyaWVzR3JvdXBUeXBlKGkub3duaW5nU2VyaWVzKT09PUwkdC5VTkdST1VQKWUucHVzaChpKTtlbHNlIGlmKCFuW2kub3duaW5nU2VyaWVzXSl7bGV0IHI9dC5ub2RlKGkub3duaW5nU2VyaWVzKTtyJiYobltpLm93bmluZ1Nlcmllc109cixlLnB1c2gocikpfX1lbHNlIGUucHVzaChpKTtDZS5leHBvcnRzLmVhY2goaS5pbkVtYmVkZGluZ3MsKHQ9Pnt0LmNvbXBhdGlibGV8fGUucHVzaCh0KX0pKSxDZS5leHBvcnRzLmVhY2goaS5vdXRFbWJlZGRpbmdzLCh0PT57dC5jb21wYXRpYmxlfHxlLnB1c2godCl9KSl9fSkpLGV9KSh0KSk6W119Z2V0IF9vcENvbXBhdFNjb3JlKCl7dmFyIHQ9dGhpcy5ncmFwaEhpZXJhcmNoeTtpZih0JiZ0LnJvb3Qpe3ZhciBlPXQucm9vdCxuPWUuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlLGk9ZS5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZTtyZXR1cm4gMD09biYmMD09aT8wOk1hdGguZmxvb3IoMTAwKm4vKG4raSkpLzEwMH1yZXR1cm4gMH1nZXQgX29wQ29tcGF0U2NvcmVMYWJlbCgpe3ZhciB0PXRoaXMuX29wQ29tcGF0U2NvcmU7cmV0dXJuIER5KCIuMCUiKSh0KX1nZXQgX3RvdGFsSW5jb21wYXRPcHMoKXt2YXIgdD10aGlzLmdyYXBoSGllcmFyY2h5O3JldHVybiB0JiZ0LnJvb3Q/dC5yb290LmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlOjB9X2dyYXBoSGllcmFyY2h5Q2hhbmdlZCgpe3RoaXMuX3RlbXBsYXRlSW5kZXg9dGhpcy5ncmFwaEhpZXJhcmNoeS5nZXRUZW1wbGF0ZUluZGV4KCksdGhpcy5ncmFwaEhpZXJhcmNoeS5hZGRMaXN0ZW5lcihpS3QuVEVNUExBVEVTX1VQREFURUQsKCgpPT57dGhpcy5fdGVtcGxhdGVJbmRleD10aGlzLmdyYXBoSGllcmFyY2h5LmdldFRlbXBsYXRlSW5kZXgoKX0pKX19O0tadC50ZW1wbGF0ZT14ZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIG1heC1oZWlnaHQ6IDUwMHB4OwogICAgICB9CgogICAgICAuaW5jb21wYXRpYmxlLW9wcy1saXN0IHsKICAgICAgICBoZWlnaHQ6IDM1MHB4OwogICAgICAgIG1heC1oZWlnaHQ6IDQwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IHNjcm9sbDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIH0KCiAgICAgIGlyb24tbGlzdCB7CiAgICAgICAgZmxleDogMSAxIGF1dG87CiAgICAgIH0KCiAgICAgIHBhcGVyLWl0ZW0gewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tc2Vjb25kYXJ5LWJhY2tncm91bmQtY29sb3IpOwogICAgICB9CgogICAgICBwYXBlci1pdGVtLWJvZHlbdHdvLWxpbmVdIHsKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4IDRweDsKICAgICAgfQoKICAgICAgLmV4cGFuZGVkSW5mbyB7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBmb250LXNpemU6IDEycHQ7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5ub2RlLW5hbWUgewogICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIGZvbnQtc2l6ZTogMTRwdDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICB9CgogICAgICAuc3VidGl0bGUgewogICAgICAgIGNvbG9yOiB2YXIoLS1zZWNvbmRhcnktdGV4dC1jb2xvcik7CiAgICAgICAgZm9udC1zaXplOiAxMnB0OwogICAgICB9CgogICAgICAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIG1heC1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC5ub24tY29udHJvbC1saXN0LWl0ZW0gewogICAgICAgIHBhZGRpbmctbGVmdDogMTBweDsKICAgICAgfQoKICAgICAgZGl2Lm9wLWNvbXBhdC1kaXNwbGF5IHsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNhZGx5LCBiZWNhdXNlIHRoZSB3aG9sZSBib2R5IGlzIGludmVydGVkIGluIGNvbG9yLCBsZWdlbmRzIGFsc28gbmVlZAogICAgICAgKiB0byBiZSBpbnZlcnRlZC4KICAgICAgICoqLwogICAgICA6aG9zdCguZGFyay1tb2RlKSBkaXYub3AtY29tcGF0LWRpc3BsYXkgewogICAgICAgIGZpbHRlcjogaW52ZXJ0KDEpOwogICAgICB9CgogICAgICBzdmcub3AtY29tcGF0IHsKICAgICAgICB3aWR0aDogMjUwcHg7CiAgICAgICAgaGVpZ2h0OiAyNXB4OwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICB9CgogICAgICBkaXYub3AtY29tcGF0LXZhbHVlIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBjb2xvcjogYmxhY2s7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHBhcGVyLWl0ZW0+CiAgICAgIDxwYXBlci1pdGVtLWJvZHkgdHdvLWxpbmU+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbgogICAgICAgICAgICBpY29uPSJ7e19nZXRUb2dnbGVJY29uKF9leHBhbmRlZCl9fSIKICAgICAgICAgICAgb24tY2xpY2s9Il90b2dnbGVFeHBhbmRlZCIKICAgICAgICAgICAgY2xhc3M9InRvZ2dsZS1idXR0b24iCiAgICAgICAgICA+CiAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm9kZS1uYW1lIiBpZD0ibm9kZXRpdGxlIj5bW25vZGVUaXRsZV1dPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBzZWNvbmRhcnk+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWJ0aXRsZSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9wLWNvbXBhdC1kaXNwbGF5Ij4KICAgICAgICAgICAgICA8c3ZnCiAgICAgICAgICAgICAgICBjbGFzcz0ib3AtY29tcGF0IgogICAgICAgICAgICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pbllNaWQgbWVldCIKICAgICAgICAgICAgICAgIHZpZXdCb3g9IjAgMCAyNTAgMjUiCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPGRlZnM+CiAgICAgICAgICAgICAgICAgIDxsaW5lYXJHcmFkaWVudCBpZD0ib3AtY29tcGF0LWZpbGwiPgogICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD0iMCIgc3RvcC1jb2xvciQ9IltbX29wQ29tcGF0Q29sb3JdXSI+PC9zdG9wPgogICAgICAgICAgICAgICAgICAgIDxzdG9wCiAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQkPSJbW19vcENvbXBhdFNjb3JlXV0iCiAgICAgICAgICAgICAgICAgICAgICBzdG9wLWNvbG9yJD0iW1tfb3BDb21wYXRDb2xvcl1dIgogICAgICAgICAgICAgICAgICAgID48L3N0b3A+CiAgICAgICAgICAgICAgICAgICAgPHN0b3AKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCQ9IltbX29wQ29tcGF0U2NvcmVdXSIKICAgICAgICAgICAgICAgICAgICAgIHN0b3AtY29sb3IkPSJbW19vcEluY29tcGF0Q29sb3JdXSIKICAgICAgICAgICAgICAgICAgICA+PC9zdG9wPgogICAgICAgICAgICAgICAgICAgIDxzdG9wIG9mZnNldD0iMSIgc3RvcC1jb2xvciQ9IltbX29wSW5jb21wYXRDb2xvciBdXSI+PC9zdG9wPgogICAgICAgICAgICAgICAgICA8L2xpbmVhckdyYWRpZW50PgogICAgICAgICAgICAgICAgPC9kZWZzPgogICAgICAgICAgICAgICAgPHJlY3QKICAgICAgICAgICAgICAgICAgaGVpZ2h0PSIyNSIKICAgICAgICAgICAgICAgICAgd2lkdGg9IjI1MCIKICAgICAgICAgICAgICAgICAgcng9IjUiCiAgICAgICAgICAgICAgICAgIHJ5PSI1IgogICAgICAgICAgICAgICAgICBzdHlsZT0iZmlsbDogdXJsKCcjb3AtY29tcGF0LWZpbGwnKTsiCiAgICAgICAgICAgICAgICA+PC9yZWN0PgogICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9Im9wLWNvbXBhdC12YWx1ZSI+W1tfb3BDb21wYXRTY29yZUxhYmVsXV08L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9wYXBlci1pdGVtLWJvZHk+CiAgICA8L3BhcGVyLWl0ZW0+CgogICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19leHBhbmRlZH19Ij4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19leHBhbmRlZH19IiByZXN0YW1wPSJ0cnVlIj4KICAgICAgICA8ZGl2IGNsYXNzPSJleHBhbmRlZEluZm8iPgogICAgICAgICAgSW5jb21wYXRpYmxlIE9wZXJhdGlvbnM6ICg8c3Bhbj5bW190b3RhbEluY29tcGF0T3BzXV08L3NwYW4+KQogICAgICAgICAgPGlyb24tbGlzdAogICAgICAgICAgICBjbGFzcz0iaW5jb21wYXRpYmxlLW9wcy1saXN0IgogICAgICAgICAgICBpZD0iaW5jb21wYXRpYmxlT3BzTGlzdCIKICAgICAgICAgICAgaXRlbXM9IltbX2luY29tcGF0aWJsZU9wTm9kZXNdXSIKICAgICAgICAgID4KICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgIDx0Zi1ncmFwaC1vcC1jb21wYXQtbGlzdC1pdGVtCiAgICAgICAgICAgICAgICBjbGFzcz0ibm9uLWNvbnRyb2wtbGlzdC1pdGVtIgogICAgICAgICAgICAgICAgaXRlbS1ub2RlPSJbW2l0ZW1dXSIKICAgICAgICAgICAgICAgIGl0ZW0tcmVuZGVyLWluZm89IltbX2dldFJlbmRlckluZm8oaXRlbS5uYW1lLCByZW5kZXJIaWVyYXJjaHkpXV0iCiAgICAgICAgICAgICAgICBuYW1lPSJbW2l0ZW0ubmFtZV1dIgogICAgICAgICAgICAgICAgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSIKICAgICAgICAgICAgICAgIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIKICAgICAgICAgICAgICAgIGl0ZW0tdHlwZT0iaW5jb21wYXRpYmxlLW9wcyIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgPC90Zi1ncmFwaC1vcC1jb21wYXQtbGlzdC1pdGVtPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2lyb24tY29sbGFwc2U+CiAgYCx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixyS3QpXSxLWnQucHJvdG90eXBlLCJncmFwaEhpZXJhcmNoeSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixBS3QpXSxLWnQucHJvdG90eXBlLCJyZW5kZXJIaWVyYXJjaHkiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sS1p0LnByb3RvdHlwZSwibm9kZVRpdGxlIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sS1p0LnByb3RvdHlwZSwiX2V4cGFuZGVkIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLEtadC5wcm90b3R5cGUsIl9vcENvbXBhdENvbG9yIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLEtadC5wcm90b3R5cGUsIl9vcEluY29tcGF0Q29sb3IiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pXSxLWnQucHJvdG90eXBlLCJfdGVtcGxhdGVJbmRleCIsdm9pZCAwKSx0KFtzKCJncmFwaEhpZXJhcmNoeSIpLGUoImRlc2lnbjp0eXBlIixBcnJheSksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sS1p0LnByb3RvdHlwZSwiX2luY29tcGF0aWJsZU9wTm9kZXMiLG51bGwpLHQoW3MoImdyYXBoSGllcmFyY2h5IiksZSgiZGVzaWduOnR5cGUiLE51bWJlciksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sS1p0LnByb3RvdHlwZSwiX29wQ29tcGF0U2NvcmUiLG51bGwpLHQoW3MoIl9vcENvbXBhdFNjb3JlIiksZSgiZGVzaWduOnR5cGUiLFN0cmluZyksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sS1p0LnByb3RvdHlwZSwiX29wQ29tcGF0U2NvcmVMYWJlbCIsbnVsbCksdChbcygiZ3JhcGhIaWVyYXJjaHkiKSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxLWnQucHJvdG90eXBlLCJfdG90YWxJbmNvbXBhdE9wcyIsbnVsbCksdChbYSgiZ3JhcGhIaWVyYXJjaHkiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLEtadC5wcm90b3R5cGUsIl9ncmFwaEhpZXJhcmNoeUNoYW5nZWQiLG51bGwpLEtadD10KFtpKCJ0Zi1ncmFwaC1vcC1jb21wYXQtY2FyZCIpXSxLWnQpO2xldCBaWnQ9Y2xhc3MgZXh0ZW5kcyhjcihnbCh3ZSkpKXtfaXRlbVR5cGVDaGFuZ2VkKCl7InN1Ym5vZGUiIT09dGhpcy5pdGVtVHlwZT90aGlzLiRbImxpc3QtaXRlbSJdLmNsYXNzTGlzdC5hZGQoImNsaWNrYWJsZSIpOnRoaXMuJFsibGlzdC1pdGVtIl0uY2xhc3NMaXN0LnJlbW92ZSgiY2xpY2thYmxlIil9X25vZGVMaXN0ZW5lcih0KXt0aGlzLmZpcmUoIm5vZGUtbGlzdC1pdGVtLSIrdC50eXBlLHtjYXJkTm9kZTp0aGlzLmNhcmROb2RlLm5hbWUsbm9kZU5hbWU6dGhpcy5uYW1lLHR5cGU6dGhpcy5pdGVtVHlwZX0pfV9mYWRlZENsYXNzKHQpe3JldHVybiB0JiZ0LmlzRmFkZWRPdXQ/ImZhZGVkIjoiIn19O1padC50ZW1wbGF0ZT14ZWAKICAgIDxzdHlsZT4KICAgICAgI2xpc3QtaXRlbSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgY29sb3I6IHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKTsKICAgICAgICBmb250LXNpemU6IDExcHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICAjbGlzdC1pdGVtOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1nb29nbGUteWVsbG93LTEwMCk7CiAgICAgIH0KCiAgICAgIDpob3N0KC5kYXJrLW1vZGUpICNsaXN0LWl0ZW06aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXllbGxvdy05MDApOwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICB9CgogICAgICAuY2xpY2thYmxlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0gc3BhbiB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDQwcHg7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0uZXhjbHVkZWQgc3BhbiB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0gc3Bhbi5lZGdlLWxhYmVsIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiAzcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICAgIH0KCiAgICAgIC5ub2RlLWljb24gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDFweDsKICAgICAgICBsZWZ0OiAycHg7CiAgICAgIH0KCiAgICAgIC5mYWRlZCBzcGFuIHsKICAgICAgICBjb2xvcjogdmFyKC0tdGItZ3JhcGgtZmFkZWQpOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdgogICAgICBpZD0ibGlzdC1pdGVtIgogICAgICBvbi1tb3VzZW92ZXI9Il9ub2RlTGlzdGVuZXIiCiAgICAgIG9uLW1vdXNlb3V0PSJfbm9kZUxpc3RlbmVyIgogICAgICBvbi1jbGljaz0iX25vZGVMaXN0ZW5lciIKICAgID4KICAgICAgPGRpdiBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoaXRlbVJlbmRlckluZm8pfX0iPgogICAgICAgIDx0Zi1ub2RlLWljb24KICAgICAgICAgIGNsYXNzPSJub2RlLWljb24iCiAgICAgICAgICBoZWlnaHQ9IjEyIgogICAgICAgICAgY29sb3ItYnk9IltbY29sb3JCeV1dIgogICAgICAgICAgY29sb3ItYnktcGFyYW1zPSJbW2NvbG9yQnlQYXJhbXNdXSIKICAgICAgICAgIG5vZGU9IltbaXRlbU5vZGVdXSIKICAgICAgICAgIHJlbmRlci1pbmZvPSJbW2l0ZW1SZW5kZXJJbmZvXV0iCiAgICAgICAgICB0ZW1wbGF0ZS1pbmRleD0iW1t0ZW1wbGF0ZUluZGV4XV0iCiAgICAgICAgPjwvdGYtbm9kZS1pY29uPgogICAgICAgIDxzcGFuIHRpdGxlJD0iW1tuYW1lXV0iPltbbmFtZV1dPC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJlZGdlLWxhYmVsIj5bW2VkZ2VMYWJlbF1dPC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIGAsdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sWlp0LnByb3RvdHlwZSwiY2FyZE5vZGUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sWlp0LnByb3RvdHlwZSwiaXRlbU5vZGUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sWlp0LnByb3RvdHlwZSwiZWRnZUxhYmVsIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFpadC5wcm90b3R5cGUsIml0ZW1SZW5kZXJJbmZvIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFpadC5wcm90b3R5cGUsIm5hbWUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmcsb2JzZXJ2ZXI6Il9pdGVtVHlwZUNoYW5nZWQifSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFpadC5wcm90b3R5cGUsIml0ZW1UeXBlIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFpadC5wcm90b3R5cGUsImNvbG9yQnkiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sWlp0LnByb3RvdHlwZSwiY29sb3JCeVBhcmFtcyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxaWnQucHJvdG90eXBlLCJ0ZW1wbGF0ZUluZGV4Iix2b2lkIDApLFpadD10KFtpKCJ0Zi1ub2RlLWxpc3QtaXRlbSIpXSxaWnQpO2xldCBKWnQ9Y2xhc3MgZXh0ZW5kcyhjcih3ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9leHBhbmRlZD0hMCx0aGlzLl9vcGVuZWRDb250cm9sUHJlZD0hMSx0aGlzLl9vcGVuZWRDb250cm9sU3VjYz0hMSx0aGlzLl90ZW1wbGF0ZUluZGV4PW51bGx9ZXhwYW5kTm9kZSgpe3RoaXMuZmlyZSgiX25vZGUuZXhwYW5kIix0aGlzLm5vZGUpfV9nZXROb2RlKHQsZSl7cmV0dXJuIGUubm9kZSh0KX1fZ2V0Tm9kZVN0YXRzKHQsZSl7dmFyIG49dGhpcy5fZ2V0Tm9kZSh0LGUpO3JldHVybiBuP24uc3RhdHM6bnVsbH1fZ2V0VG90YWxNaWNyb3ModCl7cmV0dXJuIHQ/dC5nZXRUb3RhbE1pY3JvcygpOjB9Z2V0IF9oYXNEaXNwbGF5YWJsZU5vZGVTdGF0cygpe3JldHVybiBiJHQodGhpcy5fbm9kZVN0YXRzKX1nZXQgX25vZGVTdGF0c0Zvcm1hdHRlZEJ5dGVzKCl7dmFyIHQ9dGhpcy5fbm9kZVN0YXRzO2lmKHQmJnQudG90YWxCeXRlcylyZXR1cm4gdiR0KHQudG90YWxCeXRlcyxfJHQpfWdldCBfbm9kZVN0YXRzRm9ybWF0dGVkQ29tcHV0ZVRpbWUoKXt2YXIgdD10aGlzLl9ub2RlU3RhdHM7aWYodCYmdC5nZXRUb3RhbE1pY3JvcygpKXJldHVybiB2JHQodC5nZXRUb3RhbE1pY3JvcygpLHkkdCl9Z2V0IF9ub2RlU3RhdHNGb3JtYXR0ZWRPdXRwdXRTaXplcygpe3ZhciB0PXRoaXMuX25vZGVTdGF0cztpZih0JiZ0Lm91dHB1dFNpemUmJnQub3V0cHV0U2l6ZS5sZW5ndGgpcmV0dXJuIENlLmV4cG9ydHMubWFwKHQub3V0cHV0U2l6ZSwoZnVuY3Rpb24odCl7cmV0dXJuIDA9PT10Lmxlbmd0aD8ic2NhbGFyIjoiWyIrdC5qb2luKCIsICIpKyJdIn0pKX1fZ2V0UmVuZGVySW5mbyh0LGUpe3JldHVybiB0aGlzLnJlbmRlckhpZXJhcmNoeS5nZXRPckNyZWF0ZVJlbmRlck5vZGVCeU5hbWUodCl9Z2V0IF9hdHRyaWJ1dGVzKCl7dmFyIHQ9dGhpcy5fbm9kZTtpZih0aGlzLmFzeW5jKHRoaXMuX3Jlc2l6ZUxpc3QuYmluZCh0aGlzLCIjYXR0cmlidXRlc0xpc3QiKSksIXR8fCF0LmF0dHIpcmV0dXJuW107dmFyIGU9W107cmV0dXJuIENlLmV4cG9ydHMuZWFjaCh0LmF0dHIsKGZ1bmN0aW9uKHQpeyJfdG9vX2xhcmdlX2F0dHJzIj09PXQua2V5P2U9ZS5jb25jYXQodC52YWx1ZS5saXN0LnMubWFwKChmdW5jdGlvbih0KXtyZXR1cm57a2V5OnQsdmFsdWU6IlRvbyBsYXJnZSB0byBzaG93Li4uIn19KSkpOmUucHVzaCh7a2V5OnQua2V5LHZhbHVlOkpTT04uc3RyaW5naWZ5KHQudmFsdWUpfSl9KSksZX1nZXQgX2RldmljZSgpe3ZhciB0PXRoaXMuX25vZGU7cmV0dXJuIHQ/dC5kZXZpY2U6bnVsbH1nZXQgX3N1Y2Nlc3NvcnMoKXt2YXIgdD10aGlzLl9ub2RlLGU9dGhpcy5ncmFwaEhpZXJhcmNoeTtyZXR1cm4gdGhpcy5fcmVmcmVzaE5vZGVJdGVtTGlzdCgiaW5wdXRzTGlzdCIpLHQ/dGhpcy5fY29udmVydEVkZ2VMaXN0VG9FZGdlSW5mb0xpc3QoZS5nZXRTdWNjZXNzb3JzKHQubmFtZSksITEsdC5pc0dyb3VwTm9kZSk6e3JlZ3VsYXI6W10sY29udHJvbDpbXX19Z2V0IF9wcmVkZWNlc3NvcnMoKXt2YXIgdD10aGlzLl9ub2RlLGU9dGhpcy5ncmFwaEhpZXJhcmNoeTtyZXR1cm4gdGhpcy5fcmVmcmVzaE5vZGVJdGVtTGlzdCgib3V0cHV0c0xpc3QiKSx0P3RoaXMuX2NvbnZlcnRFZGdlTGlzdFRvRWRnZUluZm9MaXN0KGUuZ2V0UHJlZGVjZXNzb3JzKHQubmFtZSksITAsdC5pc0dyb3VwTm9kZSk6e3JlZ3VsYXI6W10sY29udHJvbDpbXX19Z2V0IF9mdW5jdGlvblVzYWdlcygpe3ZhciB0PXRoaXMuX25vZGUsZT10aGlzLmdyYXBoSGllcmFyY2h5O2lmKHRoaXMuX3JlZnJlc2hOb2RlSXRlbUxpc3QoImZ1bmN0aW9uVXNhZ2VzTGlzdCIpLCF0fHx0LnR5cGUhPT1BJHQuTUVUQSlyZXR1cm5bXTtjb25zdCBuPWUubGlicmFyeUZ1bmN0aW9uc1t0LmFzc29jaWF0ZWRGdW5jdGlvbl07cmV0dXJuIG4/bi51c2FnZXM6W119X3JlZnJlc2hOb2RlSXRlbUxpc3QodCl7dGhpcy5hc3luYyh0aGlzLl9yZXNpemVMaXN0LmJpbmQodGhpcyxgIyR7dH1gKSl9X2NvbnZlcnRFZGdlTGlzdFRvRWRnZUluZm9MaXN0KHQsZSxuKXt2YXIgaT10PT5DZS5leHBvcnRzLm1hcCh0LmJhc2VFZGdlTGlzdCwodD0+e3ZhciBuPWU/dC52OnQudztyZXR1cm57bmFtZTpuLG5vZGU6dGhpcy5fZ2V0Tm9kZShuLHRoaXMuZ3JhcGhIaWVyYXJjaHkpLGVkZ2VMYWJlbDpjWnQodCx0aGlzLnJlbmRlckhpZXJhcmNoeSkscmVuZGVySW5mbzp0aGlzLl9nZXRSZW5kZXJJbmZvKG4sdGhpcy5yZW5kZXJIaWVyYXJjaHkpfX0pKSxyPWZ1bmN0aW9uKHQpe3ZhciByPVtdO3JldHVybiBDZS5leHBvcnRzLmVhY2godCwodD0+e3ZhciBvPWU/dC52OnQudztuJiYxIT10LmJhc2VFZGdlTGlzdC5sZW5ndGg/ci5wdXNoKHtuYW1lOm8sbm9kZTp0aGlzLl9nZXROb2RlKG8sdGhpcy5ncmFwaEhpZXJhcmNoeSksZWRnZUxhYmVsOnVadCh0LHRoaXMucmVuZGVySGllcmFyY2h5KSxyZW5kZXJJbmZvOnRoaXMuX2dldFJlbmRlckluZm8obyx0aGlzLnJlbmRlckhpZXJhcmNoeSl9KTpyPXIuY29uY2F0KGkodCkpfSkpLHJ9LmJpbmQodGhpcyk7cmV0dXJue3JlZ3VsYXI6cih0LnJlZ3VsYXIpLGNvbnRyb2w6cih0LmNvbnRyb2wpfX1nZXQgX3N1Ym5vZGVzKCl7dmFyIHQ9dGhpcy5fbm9kZTtyZXR1cm4gdCYmdC5tZXRhZ3JhcGg/dC5tZXRhZ3JhcGgubm9kZXMoKTpudWxsfWdldCBfdG90YWxQcmVkZWNlc3NvcnMoKXt2YXIgdD10aGlzLl9wcmVkZWNlc3NvcnM7cmV0dXJuIHQucmVndWxhci5sZW5ndGgrdC5jb250cm9sLmxlbmd0aH1nZXQgX3RvdGFsU3VjY2Vzc29ycygpe3ZhciB0PXRoaXMuX3N1Y2Nlc3NvcnM7cmV0dXJuIHQucmVndWxhci5sZW5ndGgrdC5jb250cm9sLmxlbmd0aH1fdG9nZ2xlQ29udHJvbFByZWQoKXt0aGlzLl9vcGVuZWRDb250cm9sUHJlZD0hdGhpcy5fb3BlbmVkQ29udHJvbFByZWR9X3RvZ2dsZUNvbnRyb2xTdWNjKCl7dGhpcy5fb3BlbmVkQ29udHJvbFN1Y2M9IXRoaXMuX29wZW5lZENvbnRyb2xTdWNjfV90b2dnbGVFeHBhbmRlZCgpe3RoaXMuX2V4cGFuZGVkPSF0aGlzLl9leHBhbmRlZH1fZ2V0VG9nZ2xlSWNvbih0KXtyZXR1cm4gdD8iZXhwYW5kLWxlc3MiOiJleHBhbmQtbW9yZSJ9X3Jlc2V0U3RhdGUoKXt0aGlzLl9vcGVuZWRDb250cm9sUHJlZD0hMSx0aGlzLl9vcGVuZWRDb250cm9sU3VjYz0hMSx0aGlzLnNldCgiX2dyb3VwQnV0dG9uVGV4dCIseFp0KHRoaXMuX25vZGUpKX1fcmVzaXplTGlzdCh0KXt2YXIgZT1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKHQpO2UmJmUuZmlyZSgiaXJvbi1yZXNpemUiKX1fdG9nZ2xlSW5jbHVkZSgpe3RoaXMuZmlyZSgibm9kZS10b2dnbGUtaW5jbHVzaW9uIix7bmFtZTp0aGlzLmdyYXBoTm9kZU5hbWV9KX1fbm9kZUluY2x1ZGVTdGF0ZUNoYW5nZWQodCxlKXt0aGlzLnNldCgiX2F1eEJ1dHRvblRleHQiLEokdCh0KSl9X3RvZ2dsZUdyb3VwKCl7dmFyIHQ9Ylp0KHRoaXMuX25vZGUpO3RoaXMuZmlyZSgibm9kZS10b2dnbGUtc2VyaWVzZ3JvdXAiLHtuYW1lOnR9KX1faXNMaWJyYXJ5RnVuY3Rpb24odCl7cmV0dXJuIHQmJnQubmFtZS5zdGFydHNXaXRoKFQkdCl9X2lzSW5TZXJpZXModCl7cmV0dXJuIHZadCh0KX1fZ3JhcGhIaWVyYXJjaHlDaGFuZ2VkKCl7dGhpcy5fdGVtcGxhdGVJbmRleD10aGlzLmdyYXBoSGllcmFyY2h5LmdldFRlbXBsYXRlSW5kZXgoKSx0aGlzLmdyYXBoSGllcmFyY2h5LmFkZExpc3RlbmVyKGlLdC5URU1QTEFURVNfVVBEQVRFRCwoKCk9Pnt0aGlzLl90ZW1wbGF0ZUluZGV4PXRoaXMuZ3JhcGhIaWVyYXJjaHkuZ2V0VGVtcGxhdGVJbmRleCgpfSkpfX07Slp0LnRlbXBsYXRlPXhlYAogICAgPHN0eWxlPgogICAgICAuc3ViLWxpc3QtZ3JvdXAgewogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgZm9udC1zaXplOiAxMnB0OwogICAgICAgIHBhZGRpbmctYm90dG9tOiA4cHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdCB7CiAgICAgICAgbWF4LWhlaWdodDogMzAwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogc2Nyb2xsOwogICAgICB9CgogICAgICAuYXR0ci1sZWZ0IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgICB3aWR0aDogMzAlOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICBjb2xvcjogdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpOwogICAgICAgIGZvbnQtc2l6ZTogMTFwdDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICB9CgogICAgICAuYXR0ci1yaWdodCB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDMwJTsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgY29sb3I6IHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKTsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICB9CgogICAgICAuc3ViLWxpc3QtdGFibGUgewogICAgICAgIGRpc3BsYXk6IHRhYmxlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAuc3ViLWxpc3QtdGFibGUtcm93IHsKICAgICAgICBkaXNwbGF5OiB0YWJsZS1yb3c7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdC10YWJsZS1yb3cgLnN1Yi1saXN0LXRhYmxlLWNlbGw6bGFzdC1jaGlsZCB7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdC10YWJsZS1jZWxsIHsKICAgICAgICBjb2xvcjogdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpOwogICAgICAgIGRpc3BsYXk6IHRhYmxlLWNlbGw7CiAgICAgICAgZm9udC1zaXplOiAxMXB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbWF4LXdpZHRoOiAyMDBweDsKICAgICAgICBwYWRkaW5nOiAwIDRweDsKICAgICAgfQoKICAgICAgcGFwZXItaXRlbSB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wcmltYXJ5LWJhY2tncm91bmQtY29sb3IpOwogICAgICB9CgogICAgICBwYXBlci1pdGVtLWJvZHlbdHdvLWxpbmVdIHsKICAgICAgICBtaW4taGVpZ2h0OiAwOwogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4IDRweDsKICAgICAgfQoKICAgICAgLmV4cGFuZGVkSW5mbyB7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHg7CiAgICAgIH0KCiAgICAgIC5jb250cm9sRGVwcyB7CiAgICAgICAgcGFkZGluZzogMCAwIDAgOHB4OwogICAgICB9CgogICAgICAubm9kZS1uYW1lIHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICBmb250LXNpemU6IDE0cHQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgfQoKICAgICAgLm5vZGUtaWNvbiB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CgogICAgICAuc3VidGl0bGUgewogICAgICAgIGNvbG9yOiB2YXIoLS1zZWNvbmRhcnktdGV4dC1jb2xvcik7CiAgICAgICAgZm9udC1zaXplOiAxMnB0OwogICAgICB9CgogICAgICAuY29udHJvbExpbmUgewogICAgICAgIGZvbnQtc2l6ZTogMTFwdDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICB9CgogICAgICAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIG1heC1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC5jb250cm9sLXRvZ2dsZS1idXR0b24gewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIG1heC1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtaW5jbHVkZS1ncm91cCB7CiAgICAgICAgcGFkZGluZy10b3A6IDRweDsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1pbmNsdWRlIHsKICAgICAgICBtYXJnaW46IDVweCA2cHg7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgcGFkZGluZzogNHB4IDZweDsKICAgICAgICBmb250LXNpemU6IDEwcHQ7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZmFmYTsKICAgICAgICBjb2xvcjogIzY2NjsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1pbmNsdWRlOmhvdmVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1nb29nbGUteWVsbG93LTEwMCk7CiAgICAgIH0KCiAgICAgIC5ub24tY29udHJvbC1saXN0LWl0ZW0gewogICAgICAgIHBhZGRpbmctbGVmdDogMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxwYXBlci1pdGVtPgogICAgICA8cGFwZXItaXRlbS1ib2R5IHR3by1saW5lPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICAgICAgaWNvbj0ie3tfZ2V0VG9nZ2xlSWNvbihfZXhwYW5kZWQpfX0iCiAgICAgICAgICAgIG9uLWNsaWNrPSJfdG9nZ2xlRXhwYW5kZWQiCiAgICAgICAgICAgIGNsYXNzPSJ0b2dnbGUtYnV0dG9uIgogICAgICAgICAgPgogICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vZGUtbmFtZSI+CiAgICAgICAgICAgIDx0Zi13YnItc3RyaW5nIHZhbHVlPSJbW19ub2RlLm5hbWVdXSIgZGVsaW1pdGVyLXBhdHRlcm49Ii8iPgogICAgICAgICAgICA8L3RmLXdici1zdHJpbmc+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IHNlY29uZGFyeT4KICAgICAgICAgIDx0Zi1ub2RlLWljb24KICAgICAgICAgICAgY2xhc3M9Im5vZGUtaWNvbiIKICAgICAgICAgICAgbm9kZT0iW1tfbm9kZV1dIgogICAgICAgICAgICByZW5kZXItaW5mbz0iW1tfZ2V0UmVuZGVySW5mbyhncmFwaE5vZGVOYW1lLCByZW5kZXJIaWVyYXJjaHkpXV0iCiAgICAgICAgICAgIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIKICAgICAgICAgICAgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSIKICAgICAgICAgID48L3RmLW5vZGUtaWNvbj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfbm9kZS5vcH19Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3VidGl0bGUiPgogICAgICAgICAgICAgIE9wZXJhdGlvbjoKICAgICAgICAgICAgICA8c3Bhbj5bW19ub2RlLm9wXV08L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfbm9kZS5tZXRhZ3JhcGh9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1YnRpdGxlIj4KICAgICAgICAgICAgICBTdWJncmFwaDoKICAgICAgICAgICAgICA8c3Bhbj5bW19ub2RlLmNhcmRpbmFsaXR5XV08L3NwYW4+IG5vZGVzCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9wYXBlci1pdGVtLWJvZHk+CiAgICA8L3BhcGVyLWl0ZW0+CiAgICA8aXJvbi1jb2xsYXBzZSBvcGVuZWQ9Int7X2V4cGFuZGVkfX0iPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X2V4cGFuZGVkfX0iIHJlc3RhbXA9InRydWUiPgogICAgICAgIDxkaXYgY2xhc3M9ImV4cGFuZGVkSW5mbyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC1ncm91cCBhdHRyaWJ1dGVzIj4KICAgICAgICAgICAgQXR0cmlidXRlcyAoPHNwYW4+W1tfYXR0cmlidXRlcy5sZW5ndGhdXTwvc3Bhbj4pCiAgICAgICAgICAgIDxpcm9uLWxpc3QKICAgICAgICAgICAgICBjbGFzcz0ic3ViLWxpc3QiCiAgICAgICAgICAgICAgaWQ9ImF0dHJpYnV0ZXNMaXN0IgogICAgICAgICAgICAgIGl0ZW1zPSJbW19hdHRyaWJ1dGVzXV0iCiAgICAgICAgICAgID4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdHRyLWxlZnQiPltbaXRlbS5rZXldXTwvZGl2PgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdHRyLXJpZ2h0Ij5bW2l0ZW0udmFsdWVdXTwvZGl2PgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X2RldmljZX19Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgZGV2aWNlIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJhdHRyLWxlZnQiPkRldmljZTwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImF0dHItcmlnaHQiPltbX2RldmljZV1dPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC1ncm91cCBwcmVkZWNlc3NvcnMiPgogICAgICAgICAgICBJbnB1dHMgKDxzcGFuPltbX3RvdGFsUHJlZGVjZXNzb3JzXV08L3NwYW4+KQogICAgICAgICAgICA8aXJvbi1saXN0CiAgICAgICAgICAgICAgY2xhc3M9InN1Yi1saXN0IgogICAgICAgICAgICAgIGlkPSJpbnB1dHNMaXN0IgogICAgICAgICAgICAgIGl0ZW1zPSJbW19wcmVkZWNlc3NvcnMucmVndWxhcl1dIgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtCiAgICAgICAgICAgICAgICAgIGNsYXNzPSJub24tY29udHJvbC1saXN0LWl0ZW0iCiAgICAgICAgICAgICAgICAgIGNhcmQtbm9kZT0iW1tfbm9kZV1dIgogICAgICAgICAgICAgICAgICBpdGVtLW5vZGU9IltbaXRlbS5ub2RlXV0iCiAgICAgICAgICAgICAgICAgIGVkZ2UtbGFiZWw9IltbaXRlbS5lZGdlTGFiZWxdXSIKICAgICAgICAgICAgICAgICAgaXRlbS1yZW5kZXItaW5mbz0iW1tpdGVtLnJlbmRlckluZm9dXSIKICAgICAgICAgICAgICAgICAgbmFtZT0iW1tpdGVtLm5hbWVdXSIKICAgICAgICAgICAgICAgICAgaXRlbS10eXBlPSJwcmVkZWNlc3NvcnMiCiAgICAgICAgICAgICAgICAgIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIKICAgICAgICAgICAgICAgICAgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSIKICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDwvdGYtbm9kZS1saXN0LWl0ZW0+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfcHJlZGVjZXNzb3JzLmNvbnRyb2wubGVuZ3RoXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xEZXBzIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xMaW5lIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgICAgICAgICAgICAgaWNvbj0ie3tfZ2V0VG9nZ2xlSWNvbihfb3BlbmVkQ29udHJvbFByZWQpfX0iCiAgICAgICAgICAgICAgICAgICAgb24tY2xpY2s9Il90b2dnbGVDb250cm9sUHJlZCIKICAgICAgICAgICAgICAgICAgICBjbGFzcz0iY29udHJvbC10b2dnbGUtYnV0dG9uIgogICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgIENvbnRyb2wgZGVwZW5kZW5jaWVzCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0ie3tfb3BlbmVkQ29udHJvbFByZWR9fSIgbm8tYW5pbWF0aW9uPgogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUKICAgICAgICAgICAgICAgICAgICBpcz0iZG9tLWlmIgogICAgICAgICAgICAgICAgICAgIGlmPSJ7e19vcGVuZWRDb250cm9sUHJlZH19IgogICAgICAgICAgICAgICAgICAgIHJlc3RhbXA9InRydWUiCiAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICA8aXJvbi1saXN0CiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz0ic3ViLWxpc3QiCiAgICAgICAgICAgICAgICAgICAgICBpdGVtcz0iW1tfcHJlZGVjZXNzb3JzLmNvbnRyb2xdXSIKICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgICAgIDx0Zi1ub2RlLWxpc3QtaXRlbQogICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmQtbm9kZT0iW1tfbm9kZV1dIgogICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tbm9kZT0iW1tpdGVtLm5vZGVdXSIKICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLXJlbmRlci1pbmZvPSJbW2l0ZW0ucmVuZGVySW5mb11dIgogICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU9IltbaXRlbS5uYW1lXV0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS10eXBlPSJwcmVkZWNlc3NvcnMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3ItYnk9IltbY29sb3JCeV1dIgogICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLWluZGV4PSJbW190ZW1wbGF0ZUluZGV4XV0iCiAgICAgICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgICAgPC90Zi1ub2RlLWxpc3QtaXRlbT4KICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L2lyb24tY29sbGFwc2U+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KCiAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC1ncm91cCBzdWNjZXNzb3JzIj4KICAgICAgICAgICAgT3V0cHV0cyAoPHNwYW4+W1tfdG90YWxTdWNjZXNzb3JzXV08L3NwYW4+KQogICAgICAgICAgICA8aXJvbi1saXN0CiAgICAgICAgICAgICAgY2xhc3M9InN1Yi1saXN0IgogICAgICAgICAgICAgIGlkPSJvdXRwdXRzTGlzdCIKICAgICAgICAgICAgICBpdGVtcz0iW1tfc3VjY2Vzc29ycy5yZWd1bGFyXV0iCiAgICAgICAgICAgID4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtbm9kZS1saXN0LWl0ZW0KICAgICAgICAgICAgICAgICAgY2xhc3M9Im5vbi1jb250cm9sLWxpc3QtaXRlbSIKICAgICAgICAgICAgICAgICAgY2FyZC1ub2RlPSJbW19ub2RlXV0iCiAgICAgICAgICAgICAgICAgIGl0ZW0tbm9kZT0iW1tpdGVtLm5vZGVdXSIKICAgICAgICAgICAgICAgICAgZWRnZS1sYWJlbD0iW1tpdGVtLmVkZ2VMYWJlbF1dIgogICAgICAgICAgICAgICAgICBpdGVtLXJlbmRlci1pbmZvPSJbW2l0ZW0ucmVuZGVySW5mb11dIgogICAgICAgICAgICAgICAgICBuYW1lPSJbW2l0ZW0ubmFtZV1dIgogICAgICAgICAgICAgICAgICBpdGVtLXR5cGU9InN1Y2Nlc3NvciIKICAgICAgICAgICAgICAgICAgY29sb3ItYnk9IltbY29sb3JCeV1dIgogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIgogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPC90Zi1ub2RlLWxpc3QtaXRlbT4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zdWNjZXNzb3JzLmNvbnRyb2wubGVuZ3RoXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xEZXBzIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2xMaW5lIj4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgICAgICAgICAgICAgaWNvbj0ie3tfZ2V0VG9nZ2xlSWNvbihfb3BlbmVkQ29udHJvbFN1Y2MpfX0iCiAgICAgICAgICAgICAgICAgICAgb24tY2xpY2s9Il90b2dnbGVDb250cm9sU3VjYyIKICAgICAgICAgICAgICAgICAgICBjbGFzcz0iY29udHJvbC10b2dnbGUtYnV0dG9uIgogICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgICAgIENvbnRyb2wgZGVwZW5kZW5jaWVzCiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0ie3tfb3BlbmVkQ29udHJvbFN1Y2N9fSIgbm8tYW5pbWF0aW9uPgogICAgICAgICAgICAgICAgICA8dGVtcGxhdGUKICAgICAgICAgICAgICAgICAgICBpcz0iZG9tLWlmIgogICAgICAgICAgICAgICAgICAgIGlmPSJ7e19vcGVuZWRDb250cm9sU3VjY319IgogICAgICAgICAgICAgICAgICAgIHJlc3RhbXA9InRydWUiCiAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICA8aXJvbi1saXN0IGNsYXNzPSJzdWItbGlzdCIgaXRlbXM9IltbX3N1Y2Nlc3NvcnMuY29udHJvbF1dIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC1ub2RlPSJbW19ub2RlXV0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS1ub2RlPSJbW2l0ZW0ubm9kZV1dIgogICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tcmVuZGVyLWluZm89IltbaXRlbS5yZW5kZXJJbmZvXV0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iW1tpdGVtLm5hbWVdXSIKICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLXR5cGU9InN1Y2Nlc3NvcnMiCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3ItYnk9IltbY29sb3JCeV1dIgogICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLWluZGV4PSJbW190ZW1wbGF0ZUluZGV4XV0iCiAgICAgICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgICAgPC90Zi1ub2RlLWxpc3QtaXRlbT4KICAgICAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L2lyb24tY29sbGFwc2U+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfaGFzRGlzcGxheWFibGVOb2RlU3RhdHN9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIG5vZGUtc3RhdHMiPgogICAgICAgICAgICAgIE5vZGUgU3RhdHMKICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZSI+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGVTdGF0cy50b3RhbEJ5dGVzfX0iPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPk1lbW9yeTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPgogICAgICAgICAgICAgICAgICAgICAgW1tfbm9kZVN0YXRzRm9ybWF0dGVkQnl0ZXNdXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X2dldFRvdGFsTWljcm9zKF9ub2RlU3RhdHMpfX0iPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPkNvbXB1dGUgVGltZTwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPgogICAgICAgICAgICAgICAgICAgICAgW1tfbm9kZVN0YXRzRm9ybWF0dGVkQ29tcHV0ZVRpbWVdXQogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X25vZGVTdGF0cy5vdXRwdXRTaXplfX0iPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1yb3ciPgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPlRlbnNvciBPdXRwdXQgU2l6ZXM8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC10YWJsZS1jZWxsIj4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZQogICAgICAgICAgICAgICAgICAgICAgICBpcz0iZG9tLXJlcGVhdCIKICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXM9Int7X25vZGVTdGF0c0Zvcm1hdHRlZE91dHB1dFNpemVzfX0iCiAgICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICAgIFtbaXRlbV1dIDxiciAvPgogICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19mdW5jdGlvblVzYWdlcy5sZW5ndGhdXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIHByZWRlY2Vzc29ycyI+CiAgICAgICAgICAgICAgVXNhZ2VzIG9mIHRoZSBGdW5jdGlvbiAoPHNwYW4+W1tfZnVuY3Rpb25Vc2FnZXMubGVuZ3RoXV08L3NwYW4+KQogICAgICAgICAgICAgIDxpcm9uLWxpc3QKICAgICAgICAgICAgICAgIGNsYXNzPSJzdWItbGlzdCIKICAgICAgICAgICAgICAgIGlkPSJmdW5jdGlvblVzYWdlc0xpc3QiCiAgICAgICAgICAgICAgICBpdGVtcz0iW1tfZnVuY3Rpb25Vc2FnZXNdXSIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICAgIDx0Zi1ub2RlLWxpc3QtaXRlbQogICAgICAgICAgICAgICAgICAgIGNsYXNzPSJub24tY29udHJvbC1saXN0LWl0ZW0iCiAgICAgICAgICAgICAgICAgICAgY2FyZC1ub2RlPSJbW19ub2RlXV0iCiAgICAgICAgICAgICAgICAgICAgaXRlbS1ub2RlPSJbW2l0ZW1dXSIKICAgICAgICAgICAgICAgICAgICBuYW1lPSJbW2l0ZW0ubmFtZV1dIgogICAgICAgICAgICAgICAgICAgIGl0ZW0tdHlwZT0iZnVuY3Rpb25Vc2FnZXMiCiAgICAgICAgICAgICAgICAgICAgY29sb3ItYnk9IltbY29sb3JCeV1dIgogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLWluZGV4PSJbW190ZW1wbGF0ZUluZGV4XV0iCiAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgPC90Zi1ub2RlLWxpc3QtaXRlbT4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9pcm9uLWxpc3Q+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9pc0xpYnJhcnlGdW5jdGlvbihfbm9kZSldXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1pbmNsdWRlLWdyb3VwIj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgICByYWlzZWQKICAgICAgICAgICAgICAgIGNsYXNzPSJ0b2dnbGUtaW5jbHVkZSIKICAgICAgICAgICAgICAgIG9uLWNsaWNrPSJfdG9nZ2xlSW5jbHVkZSIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8c3Bhbj5bW19hdXhCdXR0b25UZXh0XV08L3NwYW4+CiAgICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7X2lzSW5TZXJpZXMoX25vZGUpfX0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0b2dnbGUtaW5jbHVkZS1ncm91cCI+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbgogICAgICAgICAgICAgICAgcmFpc2VkCiAgICAgICAgICAgICAgICBjbGFzcz0idG9nZ2xlLWluY2x1ZGUiCiAgICAgICAgICAgICAgICBvbi1jbGljaz0iX3RvZ2dsZUdyb3VwIgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDxzcGFuPltbX2dyb3VwQnV0dG9uVGV4dF1dPC9zcGFuPgogICAgICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2lyb24tY29sbGFwc2U+CiAgYCx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxKWnQucHJvdG90eXBlLCJncmFwaE5vZGVOYW1lIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLHJLdCldLEpadC5wcm90b3R5cGUsImdyYXBoSGllcmFyY2h5Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEpadC5wcm90b3R5cGUsInJlbmRlckhpZXJhcmNoeSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxKWnQucHJvdG90eXBlLCJjb2xvckJ5Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0LGNvbXB1dGVkOiJfZ2V0Tm9kZShncmFwaE5vZGVOYW1lLCBncmFwaEhpZXJhcmNoeSkiLG9ic2VydmVyOiJfcmVzZXRTdGF0ZSJ9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sSlp0LnByb3RvdHlwZSwiX25vZGUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3QsY29tcHV0ZWQ6Il9nZXROb2RlU3RhdHMoZ3JhcGhOb2RlTmFtZSwgZ3JhcGhIaWVyYXJjaHkpIixvYnNlcnZlcjoiX3Jlc2V0U3RhdGUifSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEpadC5wcm90b3R5cGUsIl9ub2RlU3RhdHMiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXIsb2JzZXJ2ZXI6Il9ub2RlSW5jbHVkZVN0YXRlQ2hhbmdlZCJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sSlp0LnByb3RvdHlwZSwibm9kZUluY2x1ZGUiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxKWnQucHJvdG90eXBlLCJfZXhwYW5kZWQiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxKWnQucHJvdG90eXBlLCJfb3BlbmVkQ29udHJvbFByZWQiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxKWnQucHJvdG90eXBlLCJfb3BlbmVkQ29udHJvbFN1Y2MiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sSlp0LnByb3RvdHlwZSwiX2F1eEJ1dHRvblRleHQiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sSlp0LnByb3RvdHlwZSwiX2dyb3VwQnV0dG9uVGV4dCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbildLEpadC5wcm90b3R5cGUsIl90ZW1wbGF0ZUluZGV4Iix2b2lkIDApLHQoW3MoIl9ub2RlU3RhdHMiKSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sSlp0LnByb3RvdHlwZSwiX2hhc0Rpc3BsYXlhYmxlTm9kZVN0YXRzIixudWxsKSx0KFtzKCJfbm9kZVN0YXRzIiksZSgiZGVzaWduOnR5cGUiLFN0cmluZyksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sSlp0LnByb3RvdHlwZSwiX25vZGVTdGF0c0Zvcm1hdHRlZEJ5dGVzIixudWxsKSx0KFtzKCJfbm9kZVN0YXRzIiksZSgiZGVzaWduOnR5cGUiLFN0cmluZyksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sSlp0LnByb3RvdHlwZSwiX25vZGVTdGF0c0Zvcm1hdHRlZENvbXB1dGVUaW1lIixudWxsKSx0KFtzKCJfbm9kZVN0YXRzIiksZSgiZGVzaWduOnR5cGUiLEFycmF5KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxKWnQucHJvdG90eXBlLCJfbm9kZVN0YXRzRm9ybWF0dGVkT3V0cHV0U2l6ZXMiLG51bGwpLHQoW3MoIl9ub2RlIiksZSgiZGVzaWduOnR5cGUiLEFycmF5KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxKWnQucHJvdG90eXBlLCJfYXR0cmlidXRlcyIsbnVsbCksdChbcygiX25vZGUiKSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxKWnQucHJvdG90eXBlLCJfZGV2aWNlIixudWxsKSx0KFtzKCJfbm9kZSIsImdyYXBoSGllcmFyY2h5IiksZSgiZGVzaWduOnR5cGUiLE9iamVjdCksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sSlp0LnByb3RvdHlwZSwiX3N1Y2Nlc3NvcnMiLG51bGwpLHQoW3MoIl9ub2RlIiwiZ3JhcGhIaWVyYXJjaHkiKSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxKWnQucHJvdG90eXBlLCJfcHJlZGVjZXNzb3JzIixudWxsKSx0KFtzKCJfbm9kZSIsImdyYXBoSGllcmFyY2h5IiksZSgiZGVzaWduOnR5cGUiLEFycmF5KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxKWnQucHJvdG90eXBlLCJfZnVuY3Rpb25Vc2FnZXMiLG51bGwpLHQoW3MoIl9ub2RlIiksZSgiZGVzaWduOnR5cGUiLEFycmF5KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxKWnQucHJvdG90eXBlLCJfc3Vibm9kZXMiLG51bGwpLHQoW3MoIl9wcmVkZWNlc3NvcnMiKSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxKWnQucHJvdG90eXBlLCJfdG90YWxQcmVkZWNlc3NvcnMiLG51bGwpLHQoW3MoIl9zdWNjZXNzb3JzIiksZSgiZGVzaWduOnR5cGUiLE51bWJlciksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sSlp0LnByb3RvdHlwZSwiX3RvdGFsU3VjY2Vzc29ycyIsbnVsbCksdChbYSgiZ3JhcGhIaWVyYXJjaHkiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLEpadC5wcm90b3R5cGUsIl9ncmFwaEhpZXJhcmNoeUNoYW5nZWQiLG51bGwpLEpadD10KFtpKCJ0Zi1ub2RlLWluZm8iKV0sSlp0KTtsZXQgUVp0PWNsYXNzIGV4dGVuZHMoY3Iod2UpKXtyZWFkeSgpe3N1cGVyLnJlYWR5KCksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJub2RlLWxpc3QtaXRlbS1jbGljayIsdGhpcy5fbm9kZUxpc3RJdGVtQ2xpY2tlZC5iaW5kKHRoaXMpKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoIm5vZGUtbGlzdC1pdGVtLW1vdXNlb3ZlciIsdGhpcy5fbm9kZUxpc3RJdGVtTW91c2VvdmVyLmJpbmQodGhpcykpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigibm9kZS1saXN0LWl0ZW0tbW91c2VvdXQiLHRoaXMuX25vZGVMaXN0SXRlbU1vdXNlb3V0LmJpbmQodGhpcykpfV9ub2RlTGlzdEl0ZW1DbGlja2VkKHQpe3RoaXMuc2VsZWN0ZWROb2RlPXQuZGV0YWlsLm5vZGVOYW1lfV9ub2RlTGlzdEl0ZW1Nb3VzZW92ZXIodCl7dGhpcy5oaWdobGlnaHRlZE5vZGU9dC5kZXRhaWwubm9kZU5hbWV9X25vZGVMaXN0SXRlbU1vdXNlb3V0KCl7dGhpcy5oaWdobGlnaHRlZE5vZGU9bnVsbH1faGVhbHRoUGlsbHNBdmFpbGFibGUodCxlKXtyZXR1cm4gdCYmZSYmT2JqZWN0LmtleXMoZSkubGVuZ3RoPjB9X2VxdWFscyh0LGUpe3JldHVybiB0PT09ZX19O1FadC50ZW1wbGF0ZT14ZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXNlY29uZGFyeS1iYWNrZ3JvdW5kLWNvbG9yKTsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWF4LWhlaWdodDogNjUwcHg7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIGgyIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBtYXJnaW46IDA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Int7c2VsZWN0ZWROb2RlfX0iPgogICAgICA8cGFwZXItbWF0ZXJpYWwgZWxldmF0aW9uPSIxIiBjbGFzcz0iY2FyZCI+CiAgICAgICAgPHRmLW5vZGUtaW5mbwogICAgICAgICAgZ3JhcGgtaGllcmFyY2h5PSJbW2dyYXBoSGllcmFyY2h5XV0iCiAgICAgICAgICByZW5kZXItaGllcmFyY2h5PSJbW3JlbmRlckhpZXJhcmNoeV1dIgogICAgICAgICAgZmxhdC1ncmFwaD0iW1tncmFwaF1dIgogICAgICAgICAgZ3JhcGgtbm9kZS1uYW1lPSJbW3NlbGVjdGVkTm9kZV1dIgogICAgICAgICAgbm9kZS1pbmNsdWRlPSJbW3NlbGVjdGVkTm9kZUluY2x1ZGVdXSIKICAgICAgICAgIGhpZ2hsaWdodGVkLW5vZGU9Int7aGlnaGxpZ2h0ZWROb2RlfX0iCiAgICAgICAgICBjb2xvci1ieT0iW1tjb2xvckJ5XV0iCiAgICAgICAgPgogICAgICAgIDwvdGYtbm9kZS1pbmZvPgogICAgICA8L3BhcGVyLW1hdGVyaWFsPgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZXF1YWxzKGNvbG9yQnksICdvcF9jb21wYXRpYmlsaXR5JyldXSI+CiAgICAgIDx0Zi1ncmFwaC1vcC1jb21wYXQtY2FyZAogICAgICAgIGdyYXBoLWhpZXJhcmNoeT0iW1tncmFwaEhpZXJhcmNoeV1dIgogICAgICAgIHJlbmRlci1oaWVyYXJjaHk9IltbcmVuZGVySGllcmFyY2h5XV0iCiAgICAgICAgY29sb3ItYnk9IltbY29sb3JCeV1dIgogICAgICAgIG5vZGUtdGl0bGU9IltbY29tcGF0Tm9kZVRpdGxlXV0iCiAgICAgID4KICAgICAgPC90Zi1ncmFwaC1vcC1jb21wYXQtY2FyZD4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUKICAgICAgaXM9ImRvbS1pZiIKICAgICAgaWY9IltbX2hlYWx0aFBpbGxzQXZhaWxhYmxlKGRlYnVnZ2VyRGF0YUVuYWJsZWQsIG5vZGVOYW1lc1RvSGVhbHRoUGlsbHMpXV0iCiAgICA+CiAgICAgIDx0Zi1ncmFwaC1kZWJ1Z2dlci1kYXRhLWNhcmQKICAgICAgICByZW5kZXItaGllcmFyY2h5PSJbW3JlbmRlckhpZXJhcmNoeV1dIgogICAgICAgIGRlYnVnZ2VyLW51bWVyaWMtYWxlcnRzPSJbW2RlYnVnZ2VyTnVtZXJpY0FsZXJ0c11dIgogICAgICAgIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIKICAgICAgICBzZWxlY3RlZC1ub2RlPSJ7e3NlbGVjdGVkTm9kZX19IgogICAgICAgIGhpZ2hsaWdodGVkLW5vZGU9Int7aGlnaGxpZ2h0ZWROb2RlfX0iCiAgICAgICAgYXJlLWhlYWx0aC1waWxscy1sb2FkaW5nPSJbW2FyZUhlYWx0aFBpbGxzTG9hZGluZ11dIgogICAgICAgIGFsbC1zdGVwcy1tb2RlLWVuYWJsZWQ9Int7YWxsU3RlcHNNb2RlRW5hYmxlZH19IgogICAgICAgIHNwZWNpZmljLWhlYWx0aC1waWxsLXN0ZXA9Int7c3BlY2lmaWNIZWFsdGhQaWxsU3RlcH19IgogICAgICAgIGhlYWx0aC1waWxsLXN0ZXAtaW5kZXg9Int7aGVhbHRoUGlsbFN0ZXBJbmRleH19IgogICAgICA+CiAgICAgIDwvdGYtZ3JhcGgtZGVidWdnZXItZGF0YS1jYXJkPgogICAgPC90ZW1wbGF0ZT4KICBgLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFFadC5wcm90b3R5cGUsInRpdGxlIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLHJLdCldLFFadC5wcm90b3R5cGUsImdyYXBoSGllcmFyY2h5Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLEkkdCldLFFadC5wcm90b3R5cGUsImdyYXBoIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLEFLdCldLFFadC5wcm90b3R5cGUsInJlbmRlckhpZXJhcmNoeSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxRWnQucHJvdG90eXBlLCJub2RlTmFtZXNUb0hlYWx0aFBpbGxzIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyLG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxRWnQucHJvdG90eXBlLCJoZWFsdGhQaWxsU3RlcEluZGV4Iix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFFadC5wcm90b3R5cGUsImNvbG9yQnkiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sUVp0LnByb3RvdHlwZSwiY29tcGF0Tm9kZVRpdGxlIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nLG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxRWnQucHJvdG90eXBlLCJzZWxlY3RlZE5vZGUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFFadC5wcm90b3R5cGUsImhpZ2hsaWdodGVkTm9kZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcixub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sUVp0LnByb3RvdHlwZSwic2VsZWN0ZWROb2RlSW5jbHVkZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLFFadC5wcm90b3R5cGUsImRlYnVnZ2VyRGF0YUVuYWJsZWQiLHZvaWQgMCksUVp0PXQoW2koInRmLWdyYXBoLWluZm8iKV0sUVp0KTtjb25zdCB0SnQ9e01BWF9OT0RFX0NPVU5UOjFlNCxNQVhfRURHRV9DT1VOVDoxZTR9O2xldCBlSnQ9Y2xhc3MgZXh0ZW5kcyhjcih3ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmhpZXJhcmNoeVBhcmFtcz1hS3QsdGhpcy5hbGxTdGVwc01vZGVFbmFibGVkPSExLHRoaXMuc3BlY2lmaWNIZWFsdGhQaWxsU3RlcD0wLHRoaXMuY29tcGF0Tm9kZVRpdGxlPSJUUFUgQ29tcGF0aWJpbGl0eSJ9Zml0KCl7dGhpcy4kLmdyYXBoLmZpdCgpfWRvd25sb2FkQXNJbWFnZSh0KXtyZXR1cm4gbih0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IGU9eWllbGQgdGhpcy4kLmdyYXBoLmdldEltYWdlQmxvYigpLG49ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiYSIpO24uaHJlZj1VUkwuY3JlYXRlT2JqZWN0VVJMKGUpLG4uZG93bmxvYWQ9dCxuLmNsaWNrKCksVVJMLnJldm9rZU9iamVjdFVSTChuLmhyZWYpfSkpfV9pc05vdENvbXBsZXRlKHQpe3JldHVybiB0LnZhbHVlPDEwMH1fZ2V0Q29udGFpbmVyQ2xhc3ModCl7dmFyIGU9ImNvbnRhaW5lciI7cmV0dXJuIHQuZXJyb3ImJihlKz0iIGVycm9yIiksdGhpcy5faXNOb3RDb21wbGV0ZSh0KSYmKGUrPSIgbG9hZGluZyIpLGV9X29uTm9kZUluY2x1c2lvblRvZ2dsZWQodCl7dGhpcy4kLmdyYXBoLm5vZGVUb2dnbGVFeHRyYWN0KHQuZGV0YWlsLm5hbWUpfV9vbk5vZGVTZXJpZXNHcm91cFRvZ2dsZWQodCl7dGhpcy4kLmdyYXBoLm5vZGVUb2dnbGVTZXJpZXNHcm91cCh0LmRldGFpbC5uYW1lKX1fdXBkYXRlTm9kZUluY2x1ZGUoKXtjb25zdCB0PXRoaXMucmVuZGVySGllcmFyY2h5P3RoaXMucmVuZGVySGllcmFyY2h5LmdldE5vZGVCeU5hbWUodGhpcy5zZWxlY3RlZE5vZGUpOm51bGw7dGhpcy5fc2VsZWN0ZWROb2RlSW5jbHVkZT10P3QuaW5jbHVkZTprJHQuVU5TUEVDSUZJRUR9X3NsaW1HcmFwaENoYW5nZWQoKXtpZighdGhpcy5ncmFwaClyZXR1cm47Y29uc3R7TUFYX05PREVfQ09VTlQ6dCxNQVhfRURHRV9DT1VOVDplfT10SnQ7T2JqZWN0LmtleXModGhpcy5ncmFwaC5ub2RlcykubGVuZ3RoPnQmJnRoaXMuZ3JhcGguZWRnZXMubGVuZ3RoPmUmJnRoaXMuY29sb3JCeT09PXJadC5TVFJVQ1RVUkUmJih0aGlzLmNvbG9yQnk9clp0Lk5PTkUpfV9lbnN1cmVUZW1wbGF0ZXMoKXt0aGlzLmdyYXBoSGllcmFyY2h5JiZ0aGlzLmNvbG9yQnk9PT1yWnQuU1RSVUNUVVJFJiYodGhpcy5ncmFwaEhpZXJhcmNoeS5nZXRUZW1wbGF0ZUluZGV4KCl8fHRoaXMuZ3JhcGhIaWVyYXJjaHkudXBkYXRlVGVtcGxhdGVzKCkpfX07ZUp0LnRlbXBsYXRlPXhlYAogICAgPHN0eWxlPgogICAgICA6Omhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICAvZGVlcC8gLmNsb3NlIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGxlZnQ6IDE1cHg7CiAgICAgICAgYm90dG9tOiAxNXB4OwogICAgICB9CgogICAgICAuY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLmNvbnRhaW5lci5sb2FkaW5nIHsKICAgICAgICBjdXJzb3I6IHByb2dyZXNzOwogICAgICAgIG9wYWNpdHk6IDAuMTsKICAgICAgfQoKICAgICAgLmNvbnRhaW5lci5sb2FkaW5nLmVycm9yIHsKICAgICAgICBjdXJzb3I6IGF1dG87CiAgICAgIH0KCiAgICAgICNpbmZvIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDVweDsKICAgICAgICB0b3A6IDVweDsKICAgICAgICBwYWRkaW5nOiAwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAzODBweDsKICAgICAgICBtaW4td2lkdGg6IDMyMHB4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC45KTsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTJkcDsKICAgICAgfQoKICAgICAgI21haW4gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgI3Byb2dyZXNzLWJhciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogNDBweDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgfQoKICAgICAgI3Byb2dyZXNzLW1zZyB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgICAgIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICAgICAgICB3aWR0aDogNDAwcHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLXByb2dyZXNzIHsKICAgICAgICB3aWR0aDogNDAwcHg7CiAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1oZWlnaHQ6IDZweDsKICAgICAgICAtLXBhcGVyLXByb2dyZXNzLWFjdGl2ZS1jb2xvcjogI2YzOTEzZTsKICAgICAgfQoKICAgICAgLmNvbnRleHQtbWVudSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2UyZTJlMjsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2Q0ZDRkNDsKICAgICAgfQoKICAgICAgL2RlZXAvIC5jb250ZXh0LW1lbnUgdWwgewogICAgICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgIH0KCiAgICAgIC9kZWVwLyAuY29udGV4dC1tZW51IHVsIGxpIHsKICAgICAgICBwYWRkaW5nOiA0cHggMTZweDsKICAgICAgfQoKICAgICAgL2RlZXAvIC5jb250ZXh0LW1lbnUgdWwgbGk6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmMzkxM2U7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc05vdENvbXBsZXRlKHByb2dyZXNzKV1dIj4KICAgICAgPGRpdiBpZD0icHJvZ3Jlc3MtYmFyIj4KICAgICAgICA8ZGl2IGlkPSJwcm9ncmVzcy1tc2ciPltbcHJvZ3Jlc3MubXNnXV08L2Rpdj4KICAgICAgICA8cGFwZXItcHJvZ3Jlc3MgdmFsdWU9IltbcHJvZ3Jlc3MudmFsdWVdXSI+PC9wYXBlci1wcm9ncmVzcz4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPGRpdiBjbGFzcyQ9IltbX2dldENvbnRhaW5lckNsYXNzKHByb2dyZXNzKV1dIj4KICAgICAgPGRpdiBpZD0ibWFpbiI+CiAgICAgICAgPHRmLWdyYXBoCiAgICAgICAgICBpZD0iZ3JhcGgiCiAgICAgICAgICBncmFwaC1oaWVyYXJjaHk9Int7Z3JhcGhIaWVyYXJjaHl9fSIKICAgICAgICAgIGJhc2ljLWdyYXBoPSJbW2dyYXBoXV0iCiAgICAgICAgICBoaWVyYXJjaHktcGFyYW1zPSJbW2hpZXJhcmNoeVBhcmFtc11dIgogICAgICAgICAgcmVuZGVyLWhpZXJhcmNoeT0ie3tyZW5kZXJIaWVyYXJjaHl9fSIKICAgICAgICAgIGRldmljZXMtZm9yLXN0YXRzPSJbW2RldmljZXNGb3JTdGF0c11dIgogICAgICAgICAgc3RhdHM9Iltbc3RhdHNdXSIKICAgICAgICAgIHNlbGVjdGVkLW5vZGU9Int7c2VsZWN0ZWROb2RlfX0iCiAgICAgICAgICBoaWdobGlnaHRlZC1ub2RlPSJ7e19oaWdobGlnaHRlZE5vZGV9fSIKICAgICAgICAgIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIKICAgICAgICAgIGNvbG9yLWJ5LXBhcmFtcz0ie3tjb2xvckJ5UGFyYW1zfX0iCiAgICAgICAgICBwcm9ncmVzcz0ie3twcm9ncmVzc319IgogICAgICAgICAgZWRnZS1sYWJlbC1mdW5jdGlvbj0iW1tlZGdlTGFiZWxGdW5jdGlvbl1dIgogICAgICAgICAgZWRnZS13aWR0aC1mdW5jdGlvbj0iW1tlZGdlV2lkdGhGdW5jdGlvbl1dIgogICAgICAgICAgbm9kZS1uYW1lcy10by1oZWFsdGgtcGlsbHM9Iltbbm9kZU5hbWVzVG9IZWFsdGhQaWxsc11dIgogICAgICAgICAgaGVhbHRoLXBpbGwtc3RlcC1pbmRleD0iW1toZWFsdGhQaWxsU3RlcEluZGV4XV0iCiAgICAgICAgICBoYW5kbGUtbm9kZS1zZWxlY3RlZD0iW1toYW5kbGVOb2RlU2VsZWN0ZWRdXSIKICAgICAgICAgIGhhbmRsZS1lZGdlLXNlbGVjdGVkPSJbW2hhbmRsZUVkZ2VTZWxlY3RlZF1dIgogICAgICAgICAgdHJhY2UtaW5wdXRzPSJbW3RyYWNlSW5wdXRzXV0iCiAgICAgICAgICBhdXRvLWV4dHJhY3Qtbm9kZXM9IltbYXV0b0V4dHJhY3ROb2Rlc11dIgogICAgICAgID48L3RmLWdyYXBoPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBpZD0iaW5mbyI+CiAgICAgICAgPHRmLWdyYXBoLWluZm8KICAgICAgICAgIGlkPSJncmFwaC1pbmZvIgogICAgICAgICAgdGl0bGU9InNlbGVjdGVkIgogICAgICAgICAgZ3JhcGgtaGllcmFyY2h5PSJbW2dyYXBoSGllcmFyY2h5XV0iCiAgICAgICAgICByZW5kZXItaGllcmFyY2h5PSJbW3JlbmRlckhpZXJhcmNoeV1dIgogICAgICAgICAgZ3JhcGg9IltbZ3JhcGhdXSIKICAgICAgICAgIHNlbGVjdGVkLW5vZGU9Int7c2VsZWN0ZWROb2RlfX0iCiAgICAgICAgICBzZWxlY3RlZC1ub2RlLWluY2x1ZGU9Int7X3NlbGVjdGVkTm9kZUluY2x1ZGV9fSIKICAgICAgICAgIGhpZ2hsaWdodGVkLW5vZGU9Int7X2hpZ2hsaWdodGVkTm9kZX19IgogICAgICAgICAgY29sb3ItYnk9IltbY29sb3JCeV1dIgogICAgICAgICAgY29sb3ItYnktcGFyYW1zPSJbW2NvbG9yQnlQYXJhbXNdXSIKICAgICAgICAgIGRlYnVnZ2VyLWRhdGEtZW5hYmxlZD0iW1tkZWJ1Z2dlckRhdGFFbmFibGVkXV0iCiAgICAgICAgICBhcmUtaGVhbHRoLXBpbGxzLWxvYWRpbmc9IltbYXJlSGVhbHRoUGlsbHNMb2FkaW5nXV0iCiAgICAgICAgICBkZWJ1Z2dlci1udW1lcmljLWFsZXJ0cz0iW1tkZWJ1Z2dlck51bWVyaWNBbGVydHNdXSIKICAgICAgICAgIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIKICAgICAgICAgIGFsbC1zdGVwcy1tb2RlLWVuYWJsZWQ9Int7YWxsU3RlcHNNb2RlRW5hYmxlZH19IgogICAgICAgICAgc3BlY2lmaWMtaGVhbHRoLXBpbGwtc3RlcD0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwfX0iCiAgICAgICAgICBoZWFsdGgtcGlsbC1zdGVwLWluZGV4PSJ7e2hlYWx0aFBpbGxTdGVwSW5kZXh9fSIKICAgICAgICAgIGNvbXBhdC1ub2RlLXRpdGxlPSJbW2NvbXBhdE5vZGVUaXRsZV1dIgogICAgICAgICAgb24tbm9kZS10b2dnbGUtaW5jbHVzaW9uPSJfb25Ob2RlSW5jbHVzaW9uVG9nZ2xlZCIKICAgICAgICAgIG9uLW5vZGUtdG9nZ2xlLXNlcmllc2dyb3VwPSJfb25Ob2RlU2VyaWVzR3JvdXBUb2dnbGVkIgogICAgICAgID48L3RmLWdyYXBoLWluZm8+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgYCx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixyS3QpXSxlSnQucHJvdG90eXBlLCJncmFwaEhpZXJhcmNoeSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixJJHQpXSxlSnQucHJvdG90eXBlLCJncmFwaCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxlSnQucHJvdG90eXBlLCJoaWVyYXJjaHlQYXJhbXMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sZUp0LnByb3RvdHlwZSwic3RhdHMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sZUp0LnByb3RvdHlwZSwicHJvZ3Jlc3MiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxlSnQucHJvdG90eXBlLCJ0cmFjZUlucHV0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGVKdC5wcm90b3R5cGUsImF1dG9FeHRyYWN0Tm9kZXMiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLGVKdC5wcm90b3R5cGUsImNvbG9yQnkiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGVKdC5wcm90b3R5cGUsImNvbG9yQnlQYXJhbXMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLEFLdCldLGVKdC5wcm90b3R5cGUsInJlbmRlckhpZXJhcmNoeSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGVKdC5wcm90b3R5cGUsImRlYnVnZ2VyRGF0YUVuYWJsZWQiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxlSnQucHJvdG90eXBlLCJhcmVIZWFsdGhQaWxsc0xvYWRpbmciLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheSxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxlSnQucHJvdG90eXBlLCJkZWJ1Z2dlck51bWVyaWNBbGVydHMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sZUp0LnByb3RvdHlwZSwibm9kZU5hbWVzVG9IZWFsdGhQaWxscyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxlSnQucHJvdG90eXBlLCJhbGxTdGVwc01vZGVFbmFibGVkIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyLG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxlSnQucHJvdG90eXBlLCJzcGVjaWZpY0hlYWx0aFBpbGxTdGVwIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLGVKdC5wcm90b3R5cGUsImhlYWx0aFBpbGxTdGVwSW5kZXgiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmcsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLGVKdC5wcm90b3R5cGUsInNlbGVjdGVkTm9kZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxlSnQucHJvdG90eXBlLCJjb21wYXROb2RlVGl0bGUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sZUp0LnByb3RvdHlwZSwiZWRnZVdpZHRoRnVuY3Rpb24iLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sZUp0LnByb3RvdHlwZSwiX3NlbGVjdGVkTm9kZUluY2x1ZGUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sZUp0LnByb3RvdHlwZSwiX2hpZ2hsaWdodGVkTm9kZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxlSnQucHJvdG90eXBlLCJoYW5kbGVOb2RlU2VsZWN0ZWQiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sZUp0LnByb3RvdHlwZSwiZWRnZUxhYmVsRnVuY3Rpb24iLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sZUp0LnByb3RvdHlwZSwiaGFuZGxlRWRnZVNlbGVjdGVkIix2b2lkIDApLHQoW2EoInNlbGVjdGVkTm9kZSIsInJlbmRlckhpZXJhcmNoeSIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sZUp0LnByb3RvdHlwZSwiX3VwZGF0ZU5vZGVJbmNsdWRlIixudWxsKSx0KFthKCJncmFwaCIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sZUp0LnByb3RvdHlwZSwiX3NsaW1HcmFwaENoYW5nZWQiLG51bGwpLHQoW2EoImNvbG9yQnkiLCJncmFwaEhpZXJhcmNoeSIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sZUp0LnByb3RvdHlwZSwiX2Vuc3VyZVRlbXBsYXRlcyIsbnVsbCksZUp0PXQoW2koInRmLWdyYXBoLWJvYXJkIildLGVKdCk7Y2xhc3Mgbkp0e2lzTm90VHB1T3AodCl7cmV0dXJuLTEhPXQudG9Mb3dlckNhc2UoKS5zZWFyY2goImNwdToiKXx8KC0xIT10LnRvTG93ZXJDYXNlKCkuc2VhcmNoKCJncHU6Iil8fC0xPT10LnRvTG93ZXJDYXNlKCkuc2VhcmNoKCJ0cHUiKSl9b3BWYWxpZCh0KXtyZXR1cm4gMD09dC5uYW1lLnNlYXJjaChUJHQpfHwoIXQub3B8fCghKCF0LmRldmljZXx8IXRoaXMuaXNOb3RUcHVPcCh0LmRldmljZSkpfHwoISghdC5kZXZpY2V8fC0xPT10LmRldmljZS5zZWFyY2goIlRQVV9TWVNURU0iKSl8fENlLmV4cG9ydHMuaW5jbHVkZXMobkp0LldISVRFTElTVCx0Lm9wKSkpKX19bkp0LldISVRFTElTVD1bIkFicyIsIkFjb3MiLCJBY29zaCIsIkFkZCIsIkFkZE4iLCJBZGRWMiIsIkFkanVzdENvbnRyYXN0djIiLCJBZGp1c3RIdWUiLCJBZGp1c3RTYXR1cmF0aW9uIiwiQWxsIiwiQWxsVG9BbGwiLCJBbmdsZSIsIkFueSIsIkFwcHJveGltYXRlRXF1YWwiLCJBcmdNYXgiLCJBcmdNaW4iLCJBc2luIiwiQXNpbmgiLCJBc3NlcnQiLCJBc3NpZ25BZGRWYXJpYWJsZU9wIiwiQXNzaWduU3ViVmFyaWFibGVPcCIsIkFzc2lnblZhcmlhYmxlT3AiLCJBdGFuIiwiQXRhbjIiLCJBdGFuaCIsIkF2Z1Bvb2wiLCJBdmdQb29sM0QiLCJBdmdQb29sM0RHcmFkIiwiQXZnUG9vbEdyYWQiLCJCYXRjaE1hdE11bCIsIkJhdGNoTWF0TXVsVjIiLCJCYXRjaFRvU3BhY2UiLCJCYXRjaFRvU3BhY2VORCIsIkJlc3NlbEkwZSIsIkJlc3NlbEkxZSIsIkJldGFpbmMiLCJCaWFzQWRkIiwiQmlhc0FkZEdyYWQiLCJCaWFzQWRkVjEiLCJCaXRjYXN0IiwiQml0d2lzZUFuZCIsIkJpdHdpc2VPciIsIkJpdHdpc2VYb3IiLCJCcm9hZGNhc3RBcmdzIiwiQnJvYWRjYXN0R3JhZGllbnRBcmdzIiwiQnJvYWRjYXN0VG8iLCJCdWNrZXRpemUiLCJDYXNlIiwiQ2FzdCIsIkNlaWwiLCJDaGVja051bWVyaWNzIiwiQ2hvbGVza3kiLCJDbGlwQnlWYWx1ZSIsIkNvbGxlY3RpdmVQZXJtdXRlIiwiQ29sbGVjdGl2ZVJlZHVjZVYyIiwiQ29tcGxleCIsIkNvbXBsZXhBYnMiLCJDb25jYXQiLCJDb25jYXRPZmZzZXQiLCJDb25jYXRWMiIsIkNvbmoiLCJDb25qdWdhdGVUcmFuc3Bvc2UiLCJDb25zdCIsIkNvbnRyb2xUcmlnZ2VyIiwiQ29udjJEIiwiQ29udjJEQmFja3Byb3BGaWx0ZXIiLCJDb252MkRCYWNrcHJvcElucHV0IiwiQ29udjNEIiwiQ29udjNEQmFja3Byb3BGaWx0ZXJWMiIsIkNvbnYzREJhY2twcm9wSW5wdXRWMiIsIkNvcyIsIkNvc2giLCJDcm9zcyIsIkNyb3NzUmVwbGljYVN1bSIsIkN1bXByb2QiLCJDdW1zdW0iLCJEYXRhRm9ybWF0RGltTWFwIiwiRGF0YUZvcm1hdFZlY1Blcm11dGUiLCJEZXB0aFRvU3BhY2UiLCJEZXB0aHdpc2VDb252MmROYXRpdmUiLCJEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciIsIkRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQiLCJEZXF1YW50aXplIiwiRGV2aWNlSW5kZXgiLCJEaWFnIiwiRGlhZ1BhcnQiLCJEaWdhbW1hIiwiRGl2IiwiRGl2Tm9OYW4iLCJEeW5hbWljU3RpdGNoIiwiRWluc3VtIiwiRWx1IiwiRWx1R3JhZCIsIkVtcHR5IiwiRW1wdHlUZW5zb3JMaXN0IiwiRW5zdXJlU2hhcGUiLCJFcXVhbCIsIkVyZiIsIkVyZmMiLCJFcmZpbnYiLCJFeHAiLCJFeHBhbmREaW1zIiwiRXhwbTEiLCJFeHRyYWN0SW1hZ2VQYXRjaGVzIiwiRkZUIiwiRkZUMkQiLCJGRlQzRCIsIkZha2VQYXJhbSIsIkZha2VRdWFudFdpdGhNaW5NYXhBcmdzIiwiRmFrZVF1YW50V2l0aE1pbk1heEFyZ3NHcmFkaWVudCIsIkZha2VRdWFudFdpdGhNaW5NYXhWYXJzIiwiRmFrZVF1YW50V2l0aE1pbk1heFZhcnNHcmFkaWVudCIsIkZpbGwiLCJGbG9vciIsIkZsb29yRGl2IiwiRmxvb3JNb2QiLCJGdXNlZEJhdGNoTm9ybSIsIkZ1c2VkQmF0Y2hOb3JtR3JhZCIsIkZ1c2VkQmF0Y2hOb3JtR3JhZFYyIiwiRnVzZWRCYXRjaE5vcm1HcmFkVjMiLCJGdXNlZEJhdGNoTm9ybVYyIiwiRnVzZWRCYXRjaE5vcm1WMyIsIkdhdGhlciIsIkdhdGhlck5kIiwiR2F0aGVyVjIiLCJHZXRJdGVtIiwiR3JlYXRlciIsIkdyZWF0ZXJFcXVhbCIsIkhTVlRvUkdCIiwiSUZGVCIsIklGRlQyRCIsIklGRlQzRCIsIklSRkZUIiwiSVJGRlQyRCIsIklSRkZUM0QiLCJJZGVudGl0eSIsIklkZW50aXR5TiIsIklmIiwiSWdhbW1hIiwiSWdhbW1hR3JhZEEiLCJJZ2FtbWFjIiwiSW1hZyIsIkluVG9wS1YyIiwiSW5mZWVkRGVxdWV1ZSIsIkluZmVlZERlcXVldWVUdXBsZSIsIklucGxhY2VBZGQiLCJJbnBsYWNlVXBkYXRlIiwiSW52IiwiSW52ZXJ0IiwiSW52ZXJ0UGVybXV0YXRpb24iLCJJc0Zpbml0ZSIsIklzSW5mIiwiSXNOYW4iLCJLdGhPcmRlclN0YXRpc3RpYyIsIkwyTG9zcyIsIkxSTiIsIkxSTkdyYWQiLCJMZWFreVJlbHUiLCJMZWFreVJlbHVHcmFkIiwiTGVmdFNoaWZ0IiwiTGVzcyIsIkxlc3NFcXVhbCIsIkxnYW1tYSIsIkxpblNwYWNlIiwiTGlzdERpZmYiLCJMb2ciLCJMb2cxcCIsIkxvZ1NvZnRtYXgiLCJMb2dpY2FsQW5kIiwiTG9naWNhbE5vdCIsIkxvZ2ljYWxPciIsIkxvd2VyQm91bmQiLCJNYWtlVW5pcXVlIiwiTWF0TXVsIiwiTWF0cml4QmFuZFBhcnQiLCJNYXRyaXhEaWFnIiwiTWF0cml4RGlhZ1BhcnQiLCJNYXRyaXhEaWFnUGFydFYyIiwiTWF0cml4RGlhZ1BhcnRWMyIsIk1hdHJpeERpYWdWMiIsIk1hdHJpeERpYWdWMyIsIk1hdHJpeEludmVyc2UiLCJNYXRyaXhTZXREaWFnIiwiTWF0cml4U2V0RGlhZ1YyIiwiTWF0cml4U2V0RGlhZ1YzIiwiTWF0cml4U29sdmUiLCJNYXRyaXhUcmlhbmd1bGFyU29sdmUiLCJNYXgiLCJNYXhQb29sIiwiTWF4UG9vbDNEIiwiTWF4UG9vbDNER3JhZCIsIk1heFBvb2wzREdyYWRHcmFkIiwiTWF4UG9vbEdyYWQiLCJNYXhQb29sR3JhZEdyYWQiLCJNYXhQb29sR3JhZEdyYWRWMiIsIk1heFBvb2xHcmFkVjIiLCJNYXhQb29sVjIiLCJNYXhpbXVtIiwiTWVhbiIsIk1pbiIsIk1pbmltdW0iLCJNaXJyb3JQYWQiLCJNaXJyb3JQYWRHcmFkIiwiTW9kIiwiTXVsIiwiTXVsTm9OYW4iLCJNdWx0aW5vbWlhbCIsIk5kdHJpIiwiTmVnIiwiTmV4dEFmdGVyIiwiTm9PcCIsIk5vbk1heFN1cHByZXNzaW9uVjQiLCJOb3RFcXVhbCIsIk9uZUhvdCIsIk9uZXNMaWtlIiwiT3V0ZmVlZEVucXVldWUiLCJPdXRmZWVkRW5xdWV1ZVR1cGxlIiwiUGFjayIsIlBhZCIsIlBhZFYyIiwiUGFyYWxsZWxEeW5hbWljU3RpdGNoIiwiUGFyYW1ldGVyaXplZFRydW5jYXRlZE5vcm1hbCIsIlBhcnRpdGlvbmVkQ2FsbCIsIlBsYWNlaG9sZGVyV2l0aERlZmF1bHQiLCJQb2x5Z2FtbWEiLCJQb3B1bGF0aW9uQ291bnQiLCJQb3ciLCJQcmV2ZW50R3JhZGllbnQiLCJQcm9kIiwiUXIiLCJRdWFudGl6ZUFuZERlcXVhbnRpemVWMiIsIlF1YW50aXplQW5kRGVxdWFudGl6ZVYzIiwiUkZGVCIsIlJGRlQyRCIsIlJGRlQzRCIsIlJHQlRvSFNWIiwiUmFuZG9tR2FtbWFHcmFkIiwiUmFuZG9tU2h1ZmZsZSIsIlJhbmRvbVN0YW5kYXJkTm9ybWFsIiwiUmFuZG9tVW5pZm9ybSIsIlJhbmRvbVVuaWZvcm1JbnQiLCJSYW5nZSIsIlJhbmsiLCJSZWFkVmFyaWFibGVPcCIsIlJlYWwiLCJSZWFsRGl2IiwiUmVjaXByb2NhbCIsIlJlY2lwcm9jYWxHcmFkIiwiUmVsdSIsIlJlbHU2IiwiUmVsdTZHcmFkIiwiUmVsdUdyYWQiLCJSZXNoYXBlIiwiUmVzaXplQmlsaW5lYXIiLCJSZXNpemVCaWxpbmVhckdyYWQiLCJSZXNpemVOZWFyZXN0TmVpZ2hib3IiLCJSZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkIiwiUmVzb3VyY2VBcHBseUFkYU1heCIsIlJlc291cmNlQXBwbHlBZGFkZWx0YSIsIlJlc291cmNlQXBwbHlBZGFncmFkIiwiUmVzb3VyY2VBcHBseUFkYWdyYWREQSIsIlJlc291cmNlQXBwbHlBZGFncmFkVjIiLCJSZXNvdXJjZUFwcGx5QWRhbSIsIlJlc291cmNlQXBwbHlBZGRTaWduIiwiUmVzb3VyY2VBcHBseUNlbnRlcmVkUk1TUHJvcCIsIlJlc291cmNlQXBwbHlGdHJsIiwiUmVzb3VyY2VBcHBseUZ0cmxWMiIsIlJlc291cmNlQXBwbHlHcmFkaWVudERlc2NlbnQiLCJSZXNvdXJjZUFwcGx5S2VyYXNNb21lbnR1bSIsIlJlc291cmNlQXBwbHlNb21lbnR1bSIsIlJlc291cmNlQXBwbHlQb3dlclNpZ24iLCJSZXNvdXJjZUFwcGx5UHJveGltYWxBZGFncmFkIiwiUmVzb3VyY2VBcHBseVByb3hpbWFsR3JhZGllbnREZXNjZW50IiwiUmVzb3VyY2VBcHBseVJNU1Byb3AiLCJSZXNvdXJjZUdhdGhlciIsIlJlc291cmNlU2NhdHRlckFkZCIsIlJlc291cmNlU2NhdHRlckRpdiIsIlJlc291cmNlU2NhdHRlck1heCIsIlJlc291cmNlU2NhdHRlck1pbiIsIlJlc291cmNlU2NhdHRlck11bCIsIlJlc291cmNlU2NhdHRlck5kQWRkIiwiUmVzb3VyY2VTY2F0dGVyTmRTdWIiLCJSZXNvdXJjZVNjYXR0ZXJOZFVwZGF0ZSIsIlJlc291cmNlU2NhdHRlclN1YiIsIlJlc291cmNlU2NhdHRlclVwZGF0ZSIsIlJlc291cmNlU3RyaWRlZFNsaWNlQXNzaWduIiwiUmV2ZXJzZSIsIlJldmVyc2VTZXF1ZW5jZSIsIlJldmVyc2VWMiIsIlJpZ2h0U2hpZnQiLCJSaW50IiwiUm5nUmVhZEFuZFNraXAiLCJSbmdTa2lwIiwiUm9sbCIsIlJvdW5kIiwiUnNxcnQiLCJSc3FydEdyYWQiLCJTY2F0dGVyTmQiLCJTZWxlY3QiLCJTZWxlY3RWMiIsIlNlbGZBZGpvaW50RWlnVjIiLCJTZWx1IiwiU2VsdUdyYWQiLCJTaGFwZSIsIlNoYXBlTiIsIlNpZ21vaWQiLCJTaWdtb2lkR3JhZCIsIlNpZ24iLCJTaW4iLCJTaW5oIiwiU2l6ZSIsIlNsaWNlIiwiU25hcHNob3QiLCJTb2Z0bWF4IiwiU29mdG1heENyb3NzRW50cm9weVdpdGhMb2dpdHMiLCJTb2Z0cGx1cyIsIlNvZnRwbHVzR3JhZCIsIlNvZnRzaWduIiwiU29mdHNpZ25HcmFkIiwiU3BhY2VUb0JhdGNoIiwiU3BhY2VUb0JhdGNoTkQiLCJTcGFjZVRvRGVwdGgiLCJTcGFyc2VNYXRNdWwiLCJTcGFyc2VTb2Z0bWF4Q3Jvc3NFbnRyb3B5V2l0aExvZ2l0cyIsIlNwYXJzZVRvRGVuc2UiLCJTcGxpdCIsIlNwbGl0ViIsIlNxcnQiLCJTcXJ0R3JhZCIsIlNxdWFyZSIsIlNxdWFyZWREaWZmZXJlbmNlIiwiU3F1ZWV6ZSIsIlN0YWNrQ2xvc2VWMiIsIlN0YWNrUG9wVjIiLCJTdGFja1B1c2hWMiIsIlN0YWNrVjIiLCJTdGF0ZWZ1bFBhcnRpdGlvbmVkQ2FsbCIsIlN0YXRlZnVsU3RhbmRhcmROb3JtYWxWMiIsIlN0YXRlZnVsVHJ1bmNhdGVkTm9ybWFsIiwiU3RhdGVmdWxVbmlmb3JtIiwiU3RhdGVmdWxVbmlmb3JtRnVsbEludCIsIlN0YXRlZnVsVW5pZm9ybUludCIsIlN0YXRlbGVzc0Nhc2UiLCJTdGF0ZWxlc3NJZiIsIlN0YXRlbGVzc011bHRpbm9taWFsIiwiU3RhdGVsZXNzUmFuZG9tR2V0QWxnIiwiU3RhdGVsZXNzUmFuZG9tR2V0S2V5Q291bnRlciIsIlN0YXRlbGVzc1JhbmRvbUdldEtleUNvdW50ZXJBbGciLCJTdGF0ZWxlc3NSYW5kb21Ob3JtYWwiLCJTdGF0ZWxlc3NSYW5kb21Ob3JtYWxWMiIsIlN0YXRlbGVzc1JhbmRvbVVuaWZvcm0iLCJTdGF0ZWxlc3NSYW5kb21Vbmlmb3JtRnVsbEludCIsIlN0YXRlbGVzc1JhbmRvbVVuaWZvcm1GdWxsSW50VjIiLCJTdGF0ZWxlc3NSYW5kb21Vbmlmb3JtSW50IiwiU3RhdGVsZXNzUmFuZG9tVW5pZm9ybUludFYyIiwiU3RhdGVsZXNzUmFuZG9tVW5pZm9ybVYyIiwiU3RhdGVsZXNzVHJ1bmNhdGVkTm9ybWFsIiwiU3RhdGVsZXNzVHJ1bmNhdGVkTm9ybWFsVjIiLCJTdGF0ZWxlc3NXaGlsZSIsIlN0b3BHcmFkaWVudCIsIlN0cmlkZWRTbGljZSIsIlN0cmlkZWRTbGljZUdyYWQiLCJTdWIiLCJTdW0iLCJTdmQiLCJTeW1ib2xpY0dyYWRpZW50IiwiVFBVRW1iZWRkaW5nQWN0aXZhdGlvbnMiLCJUYW4iLCJUYW5oIiwiVGFuaEdyYWQiLCJUZW5zb3JBcnJheUNsb3NlVjMiLCJUZW5zb3JBcnJheUNvbmNhdFYzIiwiVGVuc29yQXJyYXlHYXRoZXJWMyIsIlRlbnNvckFycmF5R3JhZFYzIiwiVGVuc29yQXJyYXlSZWFkVjMiLCJUZW5zb3JBcnJheVNjYXR0ZXJWMyIsIlRlbnNvckFycmF5U2l6ZVYzIiwiVGVuc29yQXJyYXlTcGxpdFYzIiwiVGVuc29yQXJyYXlWMyIsIlRlbnNvckFycmF5V3JpdGVWMyIsIlRlbnNvckxpc3RDb25jYXRWMiIsIlRlbnNvckxpc3RFbGVtZW50U2hhcGUiLCJUZW5zb3JMaXN0RnJvbVRlbnNvciIsIlRlbnNvckxpc3RHYXRoZXIiLCJUZW5zb3JMaXN0R2V0SXRlbSIsIlRlbnNvckxpc3RMZW5ndGgiLCJUZW5zb3JMaXN0UG9wQmFjayIsIlRlbnNvckxpc3RQdXNoQmFjayIsIlRlbnNvckxpc3RSZXNlcnZlIiwiVGVuc29yTGlzdFNldEl0ZW0iLCJUZW5zb3JMaXN0U3BsaXQiLCJUZW5zb3JMaXN0U3RhY2siLCJUZW5zb3JTY2F0dGVyQWRkIiwiVGVuc29yU2NhdHRlck1heCIsIlRlbnNvclNjYXR0ZXJNaW4iLCJUZW5zb3JTY2F0dGVyU3ViIiwiVGVuc29yU2NhdHRlclVwZGF0ZSIsIlRlbnNvclN0cmlkZWRTbGljZVVwZGF0ZSIsIlRpbGUiLCJUb3BLVW5pcXVlIiwiVG9wS1YyIiwiVG9wS1dpdGhVbmlxdWUiLCJUcmFuc3Bvc2UiLCJUcmlkaWFnb25hbFNvbHZlIiwiVHJ1bmNhdGVEaXYiLCJUcnVuY2F0ZU1vZCIsIlRydW5jYXRlZE5vcm1hbCIsIlVuaXF1ZSIsIlVucGFjayIsIlVuc29ydGVkU2VnbWVudE1heCIsIlVuc29ydGVkU2VnbWVudE1pbiIsIlVuc29ydGVkU2VnbWVudFByb2QiLCJVbnNvcnRlZFNlZ21lbnRTdW0iLCJVcHBlckJvdW5kIiwiVmFySXNJbml0aWFsaXplZE9wIiwiVmFyaWFibGVTaGFwZSIsIldoZXJlIiwiV2hpbGUiLCJYZGl2eSIsIlhsYUJyb2FkY2FzdEhlbHBlciIsIlhsYUNvbnYiLCJYbGFDb252VjIiLCJYbGFEZXF1YW50aXplIiwiWGxhRG90IiwiWGxhRG90VjIiLCJYbGFEeW5hbWljU2xpY2UiLCJYbGFEeW5hbWljVXBkYXRlU2xpY2UiLCJYbGFFaW5zdW0iLCJYbGFHYXRoZXIiLCJYbGFIb3N0Q29tcHV0ZSIsIlhsYUlmIiwiWGxhS2V5VmFsdWVTb3J0IiwiWGxhUGFkIiwiWGxhUmVjdiIsIlhsYVJlY3ZGcm9tSG9zdCIsIlhsYVJlZHVjZSIsIlhsYVJlZHVjZVdpbmRvdyIsIlhsYVJlcGxpY2FJZCIsIlhsYVNjYXR0ZXIiLCJYbGFTZWxlY3RBbmRTY2F0dGVyIiwiWGxhU2VsZkFkam9pbnRFaWciLCJYbGFTZW5kIiwiWGxhU2VuZFRvSG9zdCIsIlhsYVNldEJvdW5kIiwiWGxhU2V0RHluYW1pY0RpbWVuc2lvblNpemUiLCJYbGFTaGFyZGluZyIsIlhsYVNvcnQiLCJYbGFTcG1kRnVsbFRvU2hhcmRTaGFwZSIsIlhsYVNwbWRTaGFyZFRvRnVsbFNoYXBlIiwiWGxhU3ZkIiwiWGxhVmFyaWFkaWNSZWR1Y2UiLCJYbGFWYXJpYWRpY1NvcnQiLCJYbGFXaGlsZSIsIlhsb2cxcHkiLCJYbG9neSIsIlplcm9zTGlrZSIsIlpldGEiLCJFbnRlciIsIkV4aXQiLCJMb29wQ29uZCIsIk1lcmdlIiwiTmV4dEl0ZXJhdGlvbiIsIlN3aXRjaCIsIl9BcmciLCJfQXJyYXlUb0xpc3QiLCJfRnVzZWRCYXRjaE5vcm1FeCIsIl9MaXN0VG9BcnJheSIsIl9QYXJhbGxlbENvbmNhdFVwZGF0ZSIsIl9SZWN2VFBVRW1iZWRkaW5nQWN0aXZhdGlvbnMiLCJfUmVjdlRQVUVtYmVkZGluZ0RlZHVwbGljYXRpb25EYXRhIiwiX1JldHZhbCIsIl9TZW5kVFBVRW1iZWRkaW5nR3JhZGllbnRzIiwiX1RQVUNvbXBpbGUiLCJfVFBVRXhlY3V0ZSIsIl9VbmFyeU9wc0NvbXBvc2l0aW9uIiwiVFBVQ29tcGlsYXRpb25SZXN1bHQiLCJUUFVSZXBsaWNhdGVkSW5wdXQiLCJUUFVSZXBsaWNhdGVkT3V0cHV0IiwiVFBVUmVwbGljYXRlTWV0YWRhdGEiLCJNZXJnZVYyQ2hlY2twb2ludHMiLCJSZXN0b3JlVjIiLCJTYXZlVjIiLCJBYm9ydCIsIkFzc2VydCIsIkFzc2lnbiIsIlBsYWNlaG9sZGVyIiwiUGxhY2Vob2xkZXJWMiIsIlNoYXJkZWRGaWxlbmFtZSIsIlN0cmluZ0pvaW4iLCJWYXJpYWJsZSIsIlZhcmlhYmxlVjIiLCJWYXJIYW5kbGVPcCIsIkF1ZGlvU3VtbWFyeSIsIkF1ZGlvU3VtbWFyeVYyIiwiRGVidWdOdW1lcmljU3VtbWFyeSIsIkhpc3RvZ3JhbVN1bW1hcnkiLCJJbWFnZVN1bW1hcnkiLCJNZXJnZVN1bW1hcnkiLCJTY2FsYXJTdW1tYXJ5IiwiU3RhdHNBZ2dyZWdhdG9yU3VtbWFyeSJdO2xldCBpSnQ9Y2xhc3MgZXh0ZW5kcyhjcih3ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9yYXdSZWdleElucHV0PSIiLHRoaXMuX3ByZXZpb3VzUmVnZXhJbnB1dD0iIix0aGlzLl9zZWFyY2hUaW1lb3V0RGVsYXk9MTUwLHRoaXMuX21heFJlZ2V4UmVzdWx0cz00Mn1nZXQgX3JlZ2V4SW5wdXQoKXtyZXR1cm4gdGhpcy5fcmF3UmVnZXhJbnB1dC50cmltKCl9X3JlZ2V4SW5wdXRDaGFuZ2VkKCl7dGhpcy5fcmVxdWVzdFNlYXJjaCgpfV9jbGVhclNlYXJjaFJlc3VsdHMoKXt0aGlzLnNldCgiX3JlZ2V4TWF0Y2hlcyIsW10pfV9yZXF1ZXN0U2VhcmNoKCl7dGhpcy5fc2VhcmNoUGVuZGluZ3x8KHRoaXMuX3JlZ2V4SW5wdXQhPT10aGlzLl9wcmV2aW91c1JlZ2V4SW5wdXQ/KHRoaXMuX3NlYXJjaFBlbmRpbmc9ITAsdGhpcy5fZXhlY3V0ZVNlYXJjaCgpLHRoaXMuYXN5bmMoKCgpPT57dGhpcy5fc2VhcmNoUGVuZGluZz0hMSx0aGlzLl9yZXF1ZXN0U2VhcmNoKCl9KSx0aGlzLl9zZWFyY2hUaW1lb3V0RGVsYXkpKTp0aGlzLl9zZWFyY2hQZW5kaW5nPSExKX1fZXhlY3V0ZVNlYXJjaCgpe2lmKHRoaXMuX3ByZXZpb3VzUmVnZXhJbnB1dD10aGlzLl9yZWdleElucHV0LCF0aGlzLl9yZWdleElucHV0KXJldHVybiB2b2lkIHRoaXMuX2NsZWFyU2VhcmNoUmVzdWx0cygpO3RyeXt2YXIgdD1uZXcgUmVnRXhwKHRoaXMuX3JlZ2V4SW5wdXQpfWNhdGNoKHQpe3JldHVybiB2b2lkIHRoaXMuX2NsZWFyU2VhcmNoUmVzdWx0cygpfWNvbnN0IGU9W10sbj10aGlzLnJlbmRlckhpZXJhcmNoeS5oaWVyYXJjaHkuZ2V0Tm9kZU1hcCgpO0NlLmV4cG9ydHMuZWFjaChuLCgobixpKT0+e2lmKGUubGVuZ3RoPj10aGlzLl9tYXhSZWdleFJlc3VsdHMpcmV0dXJuITE7dC50ZXN0KGkpJiZlLnB1c2goaSl9KSksdGhpcy5zZXQoIl9yZWdleE1hdGNoZXMiLGUpfV9tYXRjaENsaWNrZWQodCl7dGhpcy5zZXQoInNlbGVjdGVkTm9kZSIsdC5tb2RlbC5pdGVtKSxoJHQoe2FjdGlvbklkOkJBdC5OT0RFX1NFQVJDSF9SRVNVTFRfRk9DVVNFRH0pfX07aUp0LnRlbXBsYXRlPXhlYAogICAgPGRpdiBpZD0ic2VhcmNoLWNvbnRhaW5lciI+CiAgICAgIDxwYXBlci1pbnB1dAogICAgICAgIGlkPSJydW5zLXJlZ2V4IgogICAgICAgIGxhYmVsPSJTZWFyY2ggbm9kZXMgKHJlZ2V4KSIKICAgICAgICB2YWx1ZT0ie3tfcmF3UmVnZXhJbnB1dH19IgogICAgICA+CiAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgIDxkaXYgaWQ9InNlYXJjaC1yZXN1bHRzLWFuY2hvciI+CiAgICAgICAgPGRpdiBpZD0ic2VhcmNoLXJlc3VsdHMiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfcmVnZXhNYXRjaGVzXV0iPgogICAgICAgICAgICA8ZGl2IGlkPSJzZWFyY2gtbWF0Y2giIG9uLWNsaWNrPSJfbWF0Y2hDbGlja2VkIj5bW2l0ZW1dXTwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgI3NlYXJjaC1jb250YWluZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG92ZXJmbG93OiB2aXNpYmxlOwogICAgICB9CgogICAgICAjcnVucy1yZWdleCB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNzZWFyY2gtcmVzdWx0cy1hbmNob3IgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgI3NlYXJjaC1yZXN1bHRzIHsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbWF4LWhlaWdodDogMjAwcHg7CiAgICAgICAgb3ZlcmZsb3cteDogaGlkZGVuOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIH0KCiAgICAgICNzZWFyY2gtbWF0Y2ggewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIHBhZGRpbmc6IDNweDsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBkaXJlY3Rpb246IHJ0bDsKICAgICAgfQoKICAgICAgI3NlYXJjaC1tYXRjaDpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdGItb3JhbmdlLXdlYWspOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGlKdC5wcm90b3R5cGUsInJlbmRlckhpZXJhcmNoeSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZyxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0saUp0LnByb3RvdHlwZSwic2VsZWN0ZWROb2RlIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLGlKdC5wcm90b3R5cGUsIl9yYXdSZWdleElucHV0Iix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLGlKdC5wcm90b3R5cGUsIl9wcmV2aW91c1JlZ2V4SW5wdXQiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0saUp0LnByb3RvdHlwZSwiX3NlYXJjaFRpbWVvdXREZWxheSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGlKdC5wcm90b3R5cGUsIl9zZWFyY2hQZW5kaW5nIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLGlKdC5wcm90b3R5cGUsIl9tYXhSZWdleFJlc3VsdHMiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLGlKdC5wcm90b3R5cGUsIl9yZWdleE1hdGNoZXMiLHZvaWQgMCksdChbcygicmVuZGVySGllcmFyY2h5IiwiX3Jhd1JlZ2V4SW5wdXQiKSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxpSnQucHJvdG90eXBlLCJfcmVnZXhJbnB1dCIsbnVsbCksdChbYSgiX3JlZ2V4SW5wdXQiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGlKdC5wcm90b3R5cGUsIl9yZWdleElucHV0Q2hhbmdlZCIsbnVsbCksaUp0PXQoW2koInRmLWdyYXBoLW5vZGUtc2VhcmNoIildLGlKdCk7Y29uc3Qgckp0PS9kZXZpY2U6KFteOl0rOlswLTldKykkLyxvSnQ9W3tyZWdleDpySnR9XSxhSnQ9W10sc0p0PW5ldyBTZXQoW3JadC5DT01QVVRFX1RJTUUsclp0Lk1FTU9SWV0pO2xldCBsSnQ9Y2xhc3MgZXh0ZW5kcyhjcihnbCh3ZSkpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5Db2xvckJ5PXJadCx0aGlzLnN0YXRzPW51bGwsdGhpcy5kZXZpY2VzRm9yU3RhdHM9bnVsbCx0aGlzLmNvbG9yQnk9clp0LlNUUlVDVFVSRSx0aGlzLmRhdGFzZXRzPVtdLHRoaXMuX3NlbGVjdGVkUnVuSW5kZXg9MCx0aGlzLnRyYWNlSW5wdXRzPSExLHRoaXMuYXV0b0V4dHJhY3ROb2Rlcz0hMCx0aGlzLl9zZWxlY3RlZFRhZ0luZGV4PTAsdGhpcy5fc2VsZWN0ZWRHcmFwaFR5cGU9UVh0Lk9QX0dSQVBILHRoaXMuc2hvd1Nlc3Npb25SdW5zRHJvcGRvd249ITAsdGhpcy5zaG93VXBsb2FkQnV0dG9uPSEwLHRoaXMuX2xlZ2VuZE9wZW5lZD0hMCx0aGlzLl9kb3dubG9hZEZpbGVuYW1lPSJncmFwaC5wbmcifV9vbkdyYXBoVHlwZUNoYW5nZWRCeVVzZXJHZXN0dXJlKCl7aCR0KHthY3Rpb25JZDpCQXQuR1JBUEhfVFlQRV9DSEFOR0VELGV2ZW50TGFiZWw6dGhpcy5fc2VsZWN0ZWRHcmFwaFR5cGV9KX1fb25Db2xvckJ5Q2hhbmdlZEJ5VXNlckdlc3R1cmUoKXtoJHQoe2FjdGlvbklkOkJBdC5OT0RFX0NPTE9SX01PREVfQ0hBTkdFRCxldmVudExhYmVsOnRoaXMuY29sb3JCeX0pfV9vblRyYWNlSW5wdXRzQ2hhbmdlZEJ5VXNlckdlc3R1cmUoKXtoJHQoe2FjdGlvbklkOkJBdC5UUkFDRV9JTlBVVF9NT0RFX1RPR0dMRUR9KX1feGxhQ2x1c3RlcnNQcm92aWRlZCh0KXtyZXR1cm4gdCYmdC5oaWVyYXJjaHkmJnQuaGllcmFyY2h5LnhsYUNsdXN0ZXJzLmxlbmd0aD4wfV9zdGF0c0NoYW5nZWQodCl7aWYobnVsbCE9dCl7dmFyIGU9e307Q2UuZXhwb3J0cy5lYWNoKHQuZGV2X3N0YXRzLChmdW5jdGlvbih0KXt2YXIgbj1DZS5leHBvcnRzLnNvbWUob0p0LChmdW5jdGlvbihlKXtyZXR1cm4gZS5yZWdleC50ZXN0KHQuZGV2aWNlKX0pKSxpPUNlLmV4cG9ydHMuc29tZShhSnQsKGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlZ2V4LnRlc3QodC5kZXZpY2UpfSkpO24mJiFpJiYoZVt0LmRldmljZV09ITApfSkpLHRoaXMuc2V0KCJkZXZpY2VzRm9yU3RhdHMiLGUpfX1nZXQgX2N1cnJlbnREZXZpY2VzKCl7dmFyIHQ9dGhpcy5kZXZpY2VzRm9yU3RhdHM7Y29uc3QgZT10aGlzLnN0YXRzLG49KGU/ZS5kZXZfc3RhdHM6W10pLm1hcCgodD0+dC5kZXZpY2UpKS5maWx0ZXIoKHQ9Pm9KdC5zb21lKChlPT5lLnJlZ2V4LnRlc3QodCkpKSkpLGk9eCR0KG4pO2lmKDE9PWkubGVuZ3RoKXtjb25zdCB0PWlbMF0ubWF0Y2gockp0KTt0JiYoaVswXT10WzFdKX1yZXR1cm4gbi5tYXAoKChlLG4pPT57bGV0IHI9bnVsbDtyZXR1cm4gYUp0LmZvckVhY2goKHQ9Pnt0LnJlZ2V4LnRlc3QoZSkmJihyPXQubXNnKX0pKSx7ZGV2aWNlOmUsc3VmZml4Omlbbl0sdXNlZDp0W2VdLGlnbm9yZWRNc2c6cn19KSl9X2RldmljZUNoZWNrYm94Q2xpY2tlZCh0KXtjb25zdCBlPXQudGFyZ2V0LG49T2JqZWN0LmFzc2lnbih7fSx0aGlzLmRldmljZXNGb3JTdGF0cyksaT1lLnZhbHVlO2UuY2hlY2tlZD9uW2ldPSEwOmRlbGV0ZSBuW2ldLHRoaXMuc2V0KCJkZXZpY2VzRm9yU3RhdHMiLG4pfV9udW1UYWdzKHQsZSl7cmV0dXJuIHRoaXMuX2dldFRhZ3ModCxlKS5sZW5ndGh9X2dldFRhZ3ModCxlKXtyZXR1cm4gdCYmdFtlXT90W2VdLnRhZ3M6W119X2ZpdCgpe3RoaXMuZmlyZSgiZml0LXRhcCIpfV9pc0dyYWRpZW50Q29sb3JpbmcodCxlKXtyZXR1cm4gc0p0LmhhcyhlKSYmbnVsbCE9dH1fZXF1YWxzKHQsZSl7cmV0dXJuIHQ9PT1lfWdldCBfY3VycmVudERldmljZVBhcmFtcygpe2NvbnN0IHQ9dGhpcy5jb2xvckJ5UGFyYW1zLmRldmljZS5maWx0ZXIoKHQ9Pm9KdC5zb21lKChlPT5lLnJlZ2V4LnRlc3QodC5kZXZpY2UpKSkpKSxlPXgkdCh0Lm1hcCgodD0+dC5kZXZpY2UpKSk7aWYoMT09ZS5sZW5ndGgpe3ZhciBuPWVbMF0ubWF0Y2gockp0KTtuJiYoZVswXT1uWzFdKX1yZXR1cm4gdC5tYXAoKCh0LG4pPT4oe2RldmljZTplW25dLGNvbG9yOnQuY29sb3J9KSkpfWdldCBfY3VycmVudFhsYUNsdXN0ZXJQYXJhbXMoKXtyZXR1cm4gdGhpcy5jb2xvckJ5UGFyYW1zLnhsYV9jbHVzdGVyfWdldCBfY3VycmVudEdyYWRpZW50UGFyYW1zKCl7dmFyIHQ9dGhpcy5jb2xvckJ5UGFyYW1zLGU9dGhpcy5jb2xvckJ5O2lmKCF0aGlzLl9pc0dyYWRpZW50Q29sb3JpbmcodGhpcy5zdGF0cyxlKSlyZXR1cm47Y29uc3Qgbj10W2VdO2xldCBpPW4ubWluVmFsdWUscj1uLm1heFZhbHVlO3JldHVybiBlPT09clp0Lk1FTU9SWT8oaT12JHQoaSxfJHQpLHI9diR0KHIsXyR0KSk6ZT09PXJadC5DT01QVVRFX1RJTUUmJihpPXYkdChpLHkkdCkscj12JHQocix5JHQpKSx7bWluVmFsdWU6aSxtYXhWYWx1ZTpyLHN0YXJ0Q29sb3I6bi5zdGFydENvbG9yLGVuZENvbG9yOm4uZW5kQ29sb3J9fWRvd25sb2FkKCl7dGhpcy5maXJlKCJkb3dubG9hZC1pbWFnZS1yZXF1ZXN0ZWQiLHRoaXMuX2Rvd25sb2FkRmlsZW5hbWUpfV91cGRhdGVGaWxlSW5wdXQodCl7Y29uc3QgZT10LnRhcmdldC5maWxlc1swXTtpZighZSlyZXR1cm47bGV0IG49ZS5uYW1lO2NvbnN0IGk9bi5sYXN0SW5kZXhPZigiLiIpO2k+PTAmJihuPW4uc3Vic3RyaW5nKDAsaSkpO2NvbnN0IHI9bi5sYXN0SW5kZXhPZigiLyIpO3I+PTAmJihuPW4uc3Vic3RyaW5nKHIrMSkpLHRoaXMuX3NldERvd25sb2FkRmlsZW5hbWUobiksdGhpcy5zZXQoInNlbGVjdGVkRmlsZSIsdCksaCR0KHthY3Rpb25JZDpCQXQuVVBMT0FERURfR1JBUEhfRlJPTV9GSUxFU1lTVEVNfSl9X2RhdGFzZXRzQ2hhbmdlZCh0LGUpe3ZhciBuO251bGwhPWUmJih0aGlzLl9zZWxlY3RlZFJ1bkluZGV4PTApLHRoaXMuX3NldERvd25sb2FkRmlsZW5hbWUobnVsbD09PShuPXRoaXMuZGF0YXNldHNbdGhpcy5fc2VsZWN0ZWRSdW5JbmRleF0pfHx2b2lkIDA9PT1uP3ZvaWQgMDpuLm5hbWUpfV9jb21wdXRlU2VsZWN0aW9uKHQsZSxuLGkpe3JldHVybiB0W2VdJiZ0W2VdLnRhZ3Nbbl0/e3J1bjp0W2VdLm5hbWUsdGFnOnRbZV0udGFnc1tuXS50YWcsdHlwZTppfTpudWxsfV9zZWxlY3RlZFJ1bkluZGV4Q2hhbmdlZCh0KXt2YXIgZTt0aGlzLmRhdGFzZXRzJiYodGhpcy5jb2xvckJ5PXJadC5TVFJVQ1RVUkUsdGhpcy5fc2VsZWN0ZWRUYWdJbmRleD0wLHRoaXMuX3NlbGVjdGVkR3JhcGhUeXBlPXRoaXMuX2dldERlZmF1bHRTZWxlY3Rpb25UeXBlKCksdGhpcy50cmFjZUlucHV0cz0hMSx0aGlzLl9zZXREb3dubG9hZEZpbGVuYW1lKG51bGw9PT0oZT10aGlzLmRhdGFzZXRzW3RdKXx8dm9pZCAwPT09ZT92b2lkIDA6ZS5uYW1lKSl9X3NlbGVjdGVkVGFnSW5kZXhDaGFuZ2VkKCl7dGhpcy5fc2VsZWN0ZWRHcmFwaFR5cGU9dGhpcy5fZ2V0RGVmYXVsdFNlbGVjdGlvblR5cGUoKX1fZ2V0RGVmYXVsdFNlbGVjdGlvblR5cGUoKXtjb25zdHtkYXRhc2V0czp0LF9zZWxlY3RlZFJ1bkluZGV4OmUsX3NlbGVjdGVkVGFnSW5kZXg6bn09dGhpcztpZighdHx8IXRbZV18fCF0W2VdLnRhZ3Nbbl18fHRbZV0udGFnc1tuXS5vcEdyYXBoKXJldHVybiBRWHQuT1BfR1JBUEg7Y29uc3QgaT10W2VdO3JldHVybiBpLnRhZ3Nbbl0ucHJvZmlsZT9RWHQuUFJPRklMRTppLnRhZ3Nbbl0uY29uY2VwdHVhbEdyYXBoP1FYdC5DT05DRVBUVUFMX0dSQVBIOlFYdC5PUF9HUkFQSH1fZ2V0RmlsZSgpe3RoaXMuJCQoIiNmaWxlIikuY2xpY2soKX1fc2V0RG93bmxvYWRGaWxlbmFtZSh0KXt0aGlzLl9kb3dubG9hZEZpbGVuYW1lPSh0fHwiZ3JhcGgiKSsiLnBuZyJ9X3N0YXRzTm90TnVsbCh0KXtyZXR1cm4gbnVsbCE9PXR9X3RvZ2dsZUxlZ2VuZE9wZW4oKXt0aGlzLnNldCgiX2xlZ2VuZE9wZW5lZCIsIXRoaXMuX2xlZ2VuZE9wZW5lZCl9X2dldFRvZ2dsZUxlZ2VuZEljb24odCl7cmV0dXJuIHQ/ImV4cGFuZC1tb3JlIjoiZXhwYW5kLWxlc3MifV9nZXRTZWxlY3Rpb25PcEdyYXBoRGlzYWJsZWQodCxlLG4pe3JldHVybiF0W2VdfHwhdFtlXS50YWdzW25dfHwhdFtlXS50YWdzW25dLm9wR3JhcGh9X2dldFNlbGVjdGlvblByb2ZpbGVEaXNhYmxlZCh0LGUsbil7cmV0dXJuIXRbZV18fCF0W2VdLnRhZ3Nbbl18fCF0W2VdLnRhZ3Nbbl0ucHJvZmlsZX1fZ2V0U2VsZWN0aW9uQ29uY2VwdHVhbEdyYXBoRGlzYWJsZWQodCxlLG4pe3JldHVybiF0W2VdfHwhdFtlXS50YWdzW25dfHwhdFtlXS50YWdzW25dLmNvbmNlcHR1YWxHcmFwaH19O2Z1bmN0aW9uIGNKdCh0KXtyZXR1cm4gbmV3IFByb21pc2UoKChlLG4pPT57ZmV0Y2godCkudGhlbigodD0+e3Qub2s/dC5hcnJheUJ1ZmZlcigpLnRoZW4oZSxuKTp0LnRleHQoKS50aGVuKG4sbil9KSl9KSl9ZnVuY3Rpb24gdUp0KHQsZSl7cmV0dXJuKGZ1bmN0aW9uIG4odCxlLGkscixvKXtyLnNldE1lc3NhZ2UodCk7dHJ5e2xldCBuPWQkdCh0LGksbyk7cmV0dXJuIHIudXBkYXRlUHJvZ3Jlc3MoZSksbn1jYXRjaChlKXtyLnJlcG9ydEVycm9yKCJGYWlsZWQgIit0LGUpfX0pKCJSZWFkaW5nIG1ldGFkYXRhIHBidHh0Iiw0MCwoKCk9Pm51bGw9PXQ/UHJvbWlzZS5yZXNvbHZlKG51bGwpOmNKdCh0KSksZSxCQXQuRkVUQ0hfTUVUQURBVEFfUEJUWFRfQllURVMpLnRoZW4oKHQ9PmckdCgiUGFyc2luZyBtZXRhZGF0YS5wYnR4dCIsNjAsKCgpPT5udWxsIT10PyhmdW5jdGlvbiBlKHQpe3JldHVybiBmSnQodCxwSnQpLnRoZW4oKHQ9PnQuc3RlcF9zdGF0cykpfSkodCk6UHJvbWlzZS5yZXNvbHZlKG51bGwpKSxlLEJBdC5QQVJTRV9NRVRBREFUQV9QQlRYVF9JTlRPX09CSkVDVCkpKX1mdW5jdGlvbiBoSnQodCxlLGkpe3JldHVybiBnJHQoIlJlYWRpbmcgZ3JhcGggcGJ0eHQiLDQwLCgoKT0+bih0aGlzLHZvaWQgMCx2b2lkIDAsKGZ1bmN0aW9uKigpe2NvbnN0IG49RGF0ZS5ub3coKTtpZihlKXtjb25zdCB0PXlpZWxkIG5ldyBQcm9taXNlKChmdW5jdGlvbih0LG4pe2xldCBpPW5ldyBGaWxlUmVhZGVyO2kub25sb2FkPSgpPT50KGkucmVzdWx0KSxpLm9uZXJyb3I9KCk9Pm4oaS5lcnJvciksaS5yZWFkQXNBcnJheUJ1ZmZlcihlKX0pKTtyZXR1cm4gaCR0KHt0aW1pbmdJZDpCQXQuRkVUQ0hfUEJUWFRfQllURVNfRlJPTV9GSUxFU1lTVEVNLGV2ZW50VmFsdWU6RGF0ZS5ub3coKS1ufSksdH1jb25zdCBpPXlpZWxkIGNKdCh0KTtyZXR1cm4gaCR0KHt0aW1pbmdJZDpCQXQuRkVUQ0hfUEJUWFRfQllURVNfRlJPTV9TRVJWRVIsZXZlbnRWYWx1ZTpEYXRlLm5vdygpLW59KSxpfSkpKSxpLEJBdC5GRVRDSF9QQlRYVF9CWVRFUykudGhlbigodD0+ZyR0KCJQYXJzaW5nIGdyYXBoLnBidHh0Iiw2MCwoKCk9PihmdW5jdGlvbiBlKHQpe3JldHVybiBmSnQodCxkSnQpfSkodCkpLGksQkF0LlBBUlNFX1BCVFhUX0lOVE9fT0JKRUNUKSkpfWxKdC50ZW1wbGF0ZT14ZWAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGNvbG9yOiAjNTU1OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgLS10Yi1ncmFwaC1jb250cm9scy10aXRsZS1jb2xvcjogIzAwMDsKICAgICAgICAtLXRiLWdyYXBoLWNvbnRyb2xzLWxlZ2VuZC10ZXh0LWNvbG9yOiAjMDAwOwogICAgICAgIC0tdGItZ3JhcGgtY29udHJvbHMtdGV4dC1jb2xvcjogIzU1NTsKICAgICAgICAtLXRiLWdyYXBoLWNvbnRyb2xzLXRpdGxlLWZvbnQtc2l6ZTogMTRweDsKICAgICAgICAtLXRiLWdyYXBoLWNvbnRyb2xzLXN1YnRpdGxlLWZvbnQtc2l6ZTogMTRweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1zaGFyZWQtaW5wdXQtc3R5bGVfLV9mb250LXNpemU6IDE0cHg7CiAgICAgICAgLS1wYXBlci1mb250LXN1YmhlYWRfLV9mb250LXNpemU6IDE0cHg7CiAgICAgIH0KCiAgICAgIDpob3N0KC5kYXJrLW1vZGUpIHsKICAgICAgICAtLXRiLWdyYXBoLWNvbnRyb2xzLXRpdGxlLWNvbG9yOiAjZmZmOwogICAgICAgIC0tdGItZ3JhcGgtY29udHJvbHMtbGVnZW5kLXRleHQtY29sb3I6ICNmM2YzZjM7CiAgICAgICAgLS10Yi1ncmFwaC1jb250cm9scy10ZXh0LWNvbG9yOiAjZWVlOwogICAgICB9CgogICAgICBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtaW5wdXQ6IHsKICAgICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgICBjb2xvcjogZ3JheTsKICAgICAgICB9CiAgICAgICAgLS1pcm9uLWljb24td2lkdGg6IDE1cHg7CiAgICAgICAgLS1pcm9uLWljb24taGVpZ2h0OiAxNXB4OwogICAgICAgIC0tcHJpbWFyeS10ZXh0LWNvbG9yOiBncmF5OwogICAgICAgIC0tcGFwZXItaXRlbS1taW4taGVpZ2h0OiAzMHB4OwogICAgICB9CgogICAgICBwYXBlci1idXR0b25bcmFpc2VkXS5rZXlib2FyZC1mb2N1cyB7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgfQoKICAgICAgLnJ1bi1kcm9wZG93biB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXI6IHsKICAgICAgICAgIHBhZGRpbmc6IDVweCAwIDVweCA1cHg7CiAgICAgICAgfQogICAgICB9CgogICAgICB0YWJsZSB7CiAgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgICAgICBib3JkZXItc3BhY2luZzogMDsKICAgICAgfQoKICAgICAgdGFibGUgdHIgewogICAgICAgIGhlaWdodDogMjBweDsKICAgICAgfQoKICAgICAgdGFibGUgdGQgewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CgogICAgICAuYWxsY29udHJvbHMgewogICAgICAgIHBhZGRpbmc6IDAgMjBweCAyMHB4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CgogICAgICAubGVnZW5kLWhvbGRlciB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tc2Vjb25kYXJ5LWJhY2tncm91bmQtY29sb3IpOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLWdyYXBoLWNvbnRyb2xzLXRleHQtY29sb3IpOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAubGVnZW5kLXRvb2xiYXIgewogICAgICAgIGFwcGVhcmFuY2U6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogaW5oZXJpdDsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2NjYzsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2NjYzsKICAgICAgICBib3JkZXItcmlnaHQ6IG5vbmU7CiAgICAgICAgYm9yZGVyLWxlZnQ6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1ncmFwaC1jb250cm9scy1sZWdlbmQtdGV4dC1jb2xvcik7CiAgICAgICAgZm9udDogaW5oZXJpdDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAubGVnZW5kLXRvb2xiYXIsCiAgICAgIC5sZWdlbmQtY29udGVudCB7CiAgICAgICAgcGFkZGluZzogOHB4IDIwcHg7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtbGVnZW5kLWJ1dHRvbiB7CiAgICAgICAgbWF4LWhlaWdodDogMjBweDsKICAgICAgICBtYXgtd2lkdGg6IDIwcHg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1sZWdlbmQtdGV4dCB7CiAgICAgICAgZm9udC1zaXplOiB2YXIoLS10Yi1ncmFwaC1jb250cm9scy1zdWJ0aXRsZS1mb250LXNpemUpOwogICAgICB9CgogICAgICBwYXBlci1yYWRpby1idXR0b24gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDVweDsKICAgICAgfQogICAgICBzdmcuaWNvbiwKICAgICAgdGYtZ3JhcGgtaWNvbiB7CiAgICAgICAgd2lkdGg6IDYwcHg7CiAgICAgICAgaGVpZ2h0OiAxOHB4OwogICAgICB9CiAgICAgIC5kb21haW5WYWx1ZXMgewogICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgICAgd2lkdGg6IDE2NXB4OwogICAgICB9CiAgICAgIC5kb21haW5TdGFydCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgIH0KICAgICAgLmRvbWFpbkVuZCB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICB9CiAgICAgIC5jb2xvckJveCB7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5pbWFnZS1pY29uIHsKICAgICAgICB3aWR0aDogMjRweDsKICAgICAgICBoZWlnaHQ6IDI0cHg7CiAgICAgIH0KCiAgICAgIC5oZWxwLWljb24gewogICAgICAgIGhlaWdodDogMTVweDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLmdyYXkgewogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICB9CgogICAgICAudGl0bGUgewogICAgICAgIGZvbnQtc2l6ZTogdmFyKC0tdGItZ3JhcGgtY29udHJvbHMtdGl0bGUtZm9udC1zaXplKTsKICAgICAgICBtYXJnaW46IDhweCA1cHggOHB4IDA7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLWdyYXBoLWNvbnRyb2xzLXRpdGxlLWNvbG9yKTsKICAgICAgfQogICAgICAudGl0bGUgc21hbGwgewogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgIH0KICAgICAgLmRldmljZUxpc3QsCiAgICAgIC54bGFDbHVzdGVyTGlzdCB7CiAgICAgICAgbWF4LWhlaWdodDogMjAwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQoKICAgICAgI2ZpbGUgewogICAgICAgIHBhZGRpbmc6IDhweCAwOwogICAgICB9CgogICAgICAuY29sb3ItbGVnZW5kLXJvdyB7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBjbGVhcjogYm90aDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGhlaWdodDogMjBweDsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgIH0KCiAgICAgIC5jb2xvci1sZWdlbmQtcm93IC5sYWJlbCwKICAgICAgLmNvbG9yLWxlZ2VuZC1yb3cgc3ZnLAogICAgICAuY29sb3ItbGVnZW5kLXJvdyB0Zi1ncmFwaC1pY29uIHsKICAgICAgICBmbGV4OiAwIDAgNDBweDsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5kZXZpY2VzLWNoZWNrYm94IGlucHV0IHsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgIC5jb250cm9sLWhvbGRlciAuaWNvbi1idXR0b24gewogICAgICAgIGZvbnQtc2l6ZTogdmFyKC0tdGItZ3JhcGgtY29udHJvbHMtc3VidGl0bGUtZm9udC1zaXplKTsKICAgICAgICBtYXJnaW46IDAgLTVweDsKICAgICAgICBwYWRkaW5nOiA1cHg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLWdyYXBoLWNvbnRyb2xzLXRleHQtY29sb3IpOwogICAgICB9CgogICAgICAuYnV0dG9uLXRleHQgewogICAgICAgIHBhZGRpbmctbGVmdDogMjBweDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgfQoKICAgICAgLnVwbG9hZC1idXR0b24gewogICAgICAgIHdpZHRoOiAxNjVweDsKICAgICAgICBoZWlnaHQ6IDI1cHg7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgbWFyZ2luLXRvcDogNHB4OwogICAgICB9CgogICAgICAuYnV0dG9uLWljb24gewogICAgICAgIHdpZHRoOiAyNnB4OwogICAgICAgIGhlaWdodDogMjZweDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTUwMCk7CiAgICAgIH0KCiAgICAgIC5oaWRkZW4taW5wdXQgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5hbGxjb250cm9scyAuY29udHJvbC1ob2xkZXIgewogICAgICAgIGNsZWFyOiBib3RoOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9CgogICAgICAuYWxsY29udHJvbHMgLmNvbnRyb2wtaG9sZGVyLmNvbnRyb2wtb3B0aW9ucyB7CiAgICAgICAgcGFkZGluZzogMCAwIDE1cHggMTVweDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICAuYWxsY29udHJvbHMgLmNvbnRyb2wtaG9sZGVyIHBhcGVyLXRvZ2dsZS1idXR0b24gewogICAgICAgIG1hcmdpbi1ib3R0b206IDVweDsKICAgICAgfQoKICAgICAgc3Bhbi5jb3VudGVyIHsKICAgICAgICBmb250LXNpemU6IHZhcigtLXRiLWdyYXBoLWNvbnRyb2xzLXN1YnRpdGxlLWZvbnQtc2l6ZSk7CiAgICAgICAgY29sb3I6IGdyYXk7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDRweDsKICAgICAgfQoKICAgICAgLnJ1bnMtcm93IC50aXRsZSwKICAgICAgLnRhZ3Mtcm93IC50aXRsZSB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBhbGlnbi1pdGVtczogYmFzZWxpbmU7CiAgICAgIH0KCiAgICAgIC5ydW5zLXJvdyBwYXBlci1pdGVtLAogICAgICAudGFncy1yb3cgcGFwZXItaXRlbSB7CiAgICAgICAgLS1wYXBlci1pdGVtOiB7CiAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdGFibGUuY29udHJvbC1ob2xkZXIgewogICAgICAgIGJvcmRlcjogMDsKICAgICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgICB9CgogICAgICB0YWJsZS50Zi1ncmFwaC1jb250cm9scyB0ZC5pbnB1dC1lbGVtZW50LXRhYmxlLWRhdGEgewogICAgICAgIHBhZGRpbmc6IDAgMCAwIDIwcHg7CiAgICAgIH0KCiAgICAgIC5zcGFjZXIgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQoKICAgICAgLmNvbG9yLXRleHQgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5jb2xvci10ZXh0LmdyYWRpZW50LWNvbnRhaW5lciB7CiAgICAgICAgbWFyZ2luOiAwIDVweDsKICAgICAgfQoKICAgICAgLyoqIE92ZXJyaWRlIGlubGluZSBzdHlsZXMgdGhhdCBzdXBwcmVzcyBwb2ludGVyIGV2ZW50cyBmb3IgZGlzYWJsZWQgYnV0dG9ucy4gT3RoZXJ3aXNlLCB0aGUgKi8KICAgICAgLyogIHRvb2x0aXBzIGRvIG5vdCBhcHBlYXIuICovCiAgICAgIHBhcGVyLXJhZGlvLWdyb3VwIHBhcGVyLXJhZGlvLWJ1dHRvbiB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG8gIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLmxlZ2VuZC1jbGFyaWZpZXIgewogICAgICAgIGNvbG9yOiAjMjY2MjM2OwogICAgICAgIGN1cnNvcjogaGVscDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgIH0KCiAgICAgIC5sZWdlbmQtY2xhcmlmaWVyIHBhcGVyLXRvb2x0aXAgewogICAgICAgIHdpZHRoOiAxNTBweDsKICAgICAgfQoKICAgICAgLyoqIE90aGVyd2lzZSwgcG9seW1lciBVSSBjb250cm9scyBhcHBlYXIgYXRvcCBub2RlIHNlYXJjaC4gKi8KICAgICAgdGYtZ3JhcGgtbm9kZS1zZWFyY2ggewogICAgICAgIHotaW5kZXg6IDE7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGNsYXNzPSJhbGxjb250cm9scyI+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICA8dGYtZ3JhcGgtbm9kZS1zZWFyY2gKICAgICAgICAgIHNlbGVjdGVkLW5vZGU9Int7c2VsZWN0ZWROb2RlfX0iCiAgICAgICAgICByZW5kZXItaGllcmFyY2h5PSJbW3JlbmRlckhpZXJhcmNoeV1dIgogICAgICAgID48L3RmLWdyYXBoLW5vZGUtc2VhcmNoPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgIDxwYXBlci1idXR0b24gY2xhc3M9Imljb24tYnV0dG9uIiBvbi10YXA9Il9maXQiIGFsdD0iRml0IHRvIHNjcmVlbiI+CiAgICAgICAgICA8aXJvbi1pY29uIGljb249ImFzcGVjdC1yYXRpbyIgY2xhc3M9ImJ1dHRvbi1pY29uIj48L2lyb24taWNvbj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJidXR0b24tdGV4dCI+Rml0IHRvIHNjcmVlbjwvc3Bhbj4KICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICA8cGFwZXItYnV0dG9uCiAgICAgICAgICBjbGFzcz0iaWNvbi1idXR0b24iCiAgICAgICAgICBvbi1jbGljaz0iZG93bmxvYWQiCiAgICAgICAgICBhbHQ9IkRvd25sb2FkIFBORyIKICAgICAgICA+CiAgICAgICAgICA8aXJvbi1pY29uIGljb249ImZpbGUtZG93bmxvYWQiIGNsYXNzPSJidXR0b24taWNvbiI+PC9pcm9uLWljb24+CiAgICAgICAgICA8c3BhbiBjbGFzcz0iYnV0dG9uLXRleHQiPkRvd25sb2FkIFBORzwvc3Bhbj4KICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgPC9kaXY+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG93VXBsb2FkQnV0dG9uXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICAgIDxwYXBlci1idXR0b24KICAgICAgICAgICAgY2xhc3M9Imljb24tYnV0dG9uIgogICAgICAgICAgICBvbi1jbGljaz0iX2dldEZpbGUiCiAgICAgICAgICAgIGFsdD0iVXBsb2FkIGZpbGUiCiAgICAgICAgICAgIHRpdGxlPSJVcGxvYWQgYSBwYnR4dCBmaWxlIHRvIHZpZXcgYSBncmFwaCBmcm9tIHRoZSBsb2NhbCBmaWxlc3lzdGVtIgogICAgICAgICAgPgogICAgICAgICAgICA8aXJvbi1pY29uIGljb249ImZpbGUtdXBsb2FkIiBjbGFzcz0iYnV0dG9uLWljb24iPjwvaXJvbi1pY29uPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0iYnV0dG9uLXRleHQiPlVwbG9hZCBmaWxlPC9zcGFuPgogICAgICAgICAgPC9wYXBlci1idXR0b24+CgogICAgICAgICAgPGRpdiBjbGFzcz0iaGlkZGVuLWlucHV0Ij4KICAgICAgICAgICAgPGlucHV0CiAgICAgICAgICAgICAgdHlwZT0iZmlsZSIKICAgICAgICAgICAgICBpZD0iZmlsZSIKICAgICAgICAgICAgICBuYW1lPSJmaWxlIgogICAgICAgICAgICAgIG9uLWNoYW5nZT0iX3VwZGF0ZUZpbGVJbnB1dCIKICAgICAgICAgICAgICBhY2NlcHQ9Ii5wYnR4dCIKICAgICAgICAgICAgLz4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciBydW5zLXJvdyI+CiAgICAgICAgPGRpdiBjbGFzcz0idGl0bGUiPgogICAgICAgICAgUnVuIDxzcGFuIGNsYXNzPSJjb3VudGVyIj4oW1tkYXRhc2V0cy5sZW5ndGhdXSk8L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUKICAgICAgICAgIG5vLWxhYmVsLWZsb2F0CiAgICAgICAgICBuby1hbmltYXRpb25zCiAgICAgICAgICBub2luawogICAgICAgICAgaG9yaXpvbnRhbC1hbGlnbj0ibGVmdCIKICAgICAgICAgIGNsYXNzPSJydW4tZHJvcGRvd24iCiAgICAgICAgPgogICAgICAgICAgPHBhcGVyLWxpc3Rib3gKICAgICAgICAgICAgY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiCiAgICAgICAgICAgIHNlbGVjdGVkPSJ7e19zZWxlY3RlZFJ1bkluZGV4fX0iCiAgICAgICAgICAgIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiCiAgICAgICAgICA+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbZGF0YXNldHNdXSI+CiAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+W1tpdGVtLm5hbWVdXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgIDwvZGl2PgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvd1Nlc3Npb25SdW5zRHJvcGRvd25dXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIgdGFncy1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0idGl0bGUiPgogICAgICAgICAgICBUYWcKICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvdW50ZXIiCiAgICAgICAgICAgICAgPihbW19udW1UYWdzKGRhdGFzZXRzLCBfc2VsZWN0ZWRSdW5JbmRleCldXSk8L3NwYW4KICAgICAgICAgICAgPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8cGFwZXItZHJvcGRvd24tbWVudQogICAgICAgICAgICBuby1sYWJlbC1mbG9hdAogICAgICAgICAgICBuby1hbmltYXRpb25zCiAgICAgICAgICAgIGhvcml6b250YWwtYWxpZ249ImxlZnQiCiAgICAgICAgICAgIG5vaW5rCiAgICAgICAgICAgIGNsYXNzPSJydW4tZHJvcGRvd24iCiAgICAgICAgICA+CiAgICAgICAgICAgIDxwYXBlci1saXN0Ym94CiAgICAgICAgICAgICAgY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiCiAgICAgICAgICAgICAgc2VsZWN0ZWQ9Int7X3NlbGVjdGVkVGFnSW5kZXh9fSIKICAgICAgICAgICAgICBzbG90PSJkcm9wZG93bi1jb250ZW50IgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgPHRlbXBsYXRlCiAgICAgICAgICAgICAgICBpcz0iZG9tLXJlcGVhdCIKICAgICAgICAgICAgICAgIGl0ZW1zPSJbW19nZXRUYWdzKGRhdGFzZXRzLCBfc2VsZWN0ZWRSdW5JbmRleCldXSIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5bW2l0ZW0uZGlzcGxheU5hbWVdXTwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj5HcmFwaCB0eXBlPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIGNvbnRyb2wtb3B0aW9ucyI+CiAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwCiAgICAgICAgICBzZWxlY3RlZD0ie3tfc2VsZWN0ZWRHcmFwaFR5cGV9fSIKICAgICAgICAgIG9uLXBhcGVyLXJhZGlvLWdyb3VwLWNoYW5nZWQ9Il9vbkdyYXBoVHlwZUNoYW5nZWRCeVVzZXJHZXN0dXJlIgogICAgICAgID4KICAgICAgICAgIDwhLS0gTm90ZSB0aGF0IHRoZSBuYW1lIGhhcyB0byBtYXRjaCB0aGF0IG9mIHRmX2dyYXBoX2NvbW1vbi5TZWxlY3Rpb25UeXBlLiAtLT4KICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24KICAgICAgICAgICAgbmFtZT0ib3BfZ3JhcGgiCiAgICAgICAgICAgIGRpc2FibGVkPSJbW19nZXRTZWxlY3Rpb25PcEdyYXBoRGlzYWJsZWQoZGF0YXNldHMsIF9zZWxlY3RlZFJ1bkluZGV4LCBfc2VsZWN0ZWRUYWdJbmRleCldXSIKICAgICAgICAgICAgPk9wIGdyYXBoPC9wYXBlci1yYWRpby1idXR0b24KICAgICAgICAgID4KICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24KICAgICAgICAgICAgbmFtZT0iY29uY2VwdHVhbF9ncmFwaCIKICAgICAgICAgICAgZGlzYWJsZWQ9IltbX2dldFNlbGVjdGlvbkNvbmNlcHR1YWxHcmFwaERpc2FibGVkKGRhdGFzZXRzLCBfc2VsZWN0ZWRSdW5JbmRleCwgX3NlbGVjdGVkVGFnSW5kZXgpXV0iCiAgICAgICAgICAgID5Db25jZXB0dWFsIGdyYXBoPC9wYXBlci1yYWRpby1idXR0b24KICAgICAgICAgID4KICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24KICAgICAgICAgICAgbmFtZT0icHJvZmlsZSIKICAgICAgICAgICAgZGlzYWJsZWQ9IltbX2dldFNlbGVjdGlvblByb2ZpbGVEaXNhYmxlZChkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgsIF9zZWxlY3RlZFRhZ0luZGV4KV1dIgogICAgICAgICAgICA+UHJvZmlsZTwvcGFwZXItcmFkaW8tYnV0dG9uCiAgICAgICAgICA+CiAgICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj5Ob2RlIG9wdGlvbnM8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIgY29udHJvbC1vcHRpb25zIj4KICAgICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbgogICAgICAgICAgY2hlY2tlZD0ie3t0cmFjZUlucHV0c319IgogICAgICAgICAgb24tY2hhbmdlPSJfb25UcmFjZUlucHV0c0NoYW5nZWRCeVVzZXJHZXN0dXJlIgogICAgICAgID4KICAgICAgICAgIFRyYWNlIGlucHV0cwogICAgICAgIDwvcGFwZXItdG9nZ2xlLWJ1dHRvbj4KICAgICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbiBjaGVja2VkPSJ7e2F1dG9FeHRyYWN0Tm9kZXN9fSI+CiAgICAgICAgICBBdXRvLWV4dHJhY3QgaGlnaC1kZWdyZWUgbm9kZXMKICAgICAgICA8L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgIDwvZGl2PgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaGVhbHRoUGlsbHNGZWF0dXJlRW5hYmxlZF1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbiBjaGVja2VkPSJ7e2hlYWx0aFBpbGxzVG9nZ2xlZE9ufX0iCiAgICAgICAgICAgID5TaG93IGhlYWx0aCBwaWxsczwvcGFwZXItdG9nZ2xlLWJ1dHRvbgogICAgICAgICAgPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+Q29sb3IgYnk8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIgY29udHJvbC1vcHRpb25zIj4KICAgICAgICA8cGFwZXItcmFkaW8tZ3JvdXAKICAgICAgICAgIHNlbGVjdGVkPSJ7e2NvbG9yQnl9fSIKICAgICAgICAgIG9uLXBhcGVyLXJhZGlvLWdyb3VwLWNoYW5nZWQ9Il9vbkNvbG9yQnlDaGFuZ2VkQnlVc2VyR2VzdHVyZSIKICAgICAgICA+CiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9IltbQ29sb3JCeS5OT05FXV0iPk5vbmU8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KCiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9IltbQ29sb3JCeS5TVFJVQ1RVUkVdXSIKICAgICAgICAgICAgPlN0cnVjdHVyZTwvcGFwZXItcmFkaW8tYnV0dG9uCiAgICAgICAgICA+CgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJbW0NvbG9yQnkuREVWSUNFXV0iCiAgICAgICAgICAgID5EZXZpY2U8L3BhcGVyLXJhZGlvLWJ1dHRvbgogICAgICAgICAgPgoKICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24KICAgICAgICAgICAgaWQ9InhsYS1jbHVzdGVyLXJhZGlvLWJ1dHRvbiIKICAgICAgICAgICAgbmFtZT0iW1tDb2xvckJ5LlhMQV9DTFVTVEVSXV0iCiAgICAgICAgICAgIGRpc2FibGVkPSJbWyFfeGxhQ2x1c3RlcnNQcm92aWRlZChyZW5kZXJIaWVyYXJjaHkpXV0iCiAgICAgICAgICA+CiAgICAgICAgICAgIFhMQSBjbHVzdGVyCiAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci10b29sdGlwCiAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheT0iMCIKICAgICAgICAgICAgZm9yPSJ4bGEtY2x1c3Rlci1yYWRpby1idXR0b24iCiAgICAgICAgICAgIHBvc2l0aW9uPSJyaWdodCIKICAgICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICAgPgogICAgICAgICAgICBDb2xvcmluZyBieSBYTEEgY2x1c3RlciBpcyBvbmx5IGVuYWJsZWQgaWYgYXQgbGVhc3QgMSBvcCBzcGVjaWZpZXMKICAgICAgICAgICAgYW4gWExBIGNsdXN0ZXIuCiAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbgogICAgICAgICAgICBpZD0iY29tcHV0ZS10aW1lLXJhZGlvLWJ1dHRvbiIKICAgICAgICAgICAgbmFtZT0iW1tDb2xvckJ5LkNPTVBVVEVfVElNRV1dIgogICAgICAgICAgICBkaXNhYmxlZD0iW1shc3RhdHNdXSIKICAgICAgICAgID4KICAgICAgICAgICAgQ29tcHV0ZSB0aW1lCiAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci10b29sdGlwCiAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheT0iMCIKICAgICAgICAgICAgZm9yPSJjb21wdXRlLXRpbWUtcmFkaW8tYnV0dG9uIgogICAgICAgICAgICBwb3NpdGlvbj0icmlnaHQiCiAgICAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgID4KICAgICAgICAgICAgQ29sb3JpbmcgYnkgY29tcHV0ZSB0aW1lIGlzIG9ubHkgZW5hYmxlZCBpZiB0aGUgUnVuTWV0YWRhdGEgcHJvdG8gaXMKICAgICAgICAgICAgcGFzc2VkIHRvIHRoZSBGaWxlV3JpdGVyIHdoZW4gYSBzcGVjaWZpYyBzZXNzaW9uIGlzIHJ1bi4KICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KCiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uCiAgICAgICAgICAgIGlkPSJtZW1vcnktcmFkaW8tYnV0dG9uIgogICAgICAgICAgICBuYW1lPSJbW0NvbG9yQnkuTUVNT1JZXV0iCiAgICAgICAgICAgIGRpc2FibGVkPSJbWyFzdGF0c11dIgogICAgICAgICAgPgogICAgICAgICAgICBNZW1vcnkKICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgPHBhcGVyLXRvb2x0aXAKICAgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5PSIwIgogICAgICAgICAgICBmb3I9Im1lbW9yeS1yYWRpby1idXR0b24iCiAgICAgICAgICAgIHBvc2l0aW9uPSJyaWdodCIKICAgICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICAgPgogICAgICAgICAgICBDb2xvcmluZyBieSBtZW1vcnkgaXMgb25seSBlbmFibGVkIGlmIHRoZSBSdW5NZXRhZGF0YSBwcm90byBpcwogICAgICAgICAgICBwYXNzZWQgdG8gdGhlIEZpbGVXcml0ZXIgd2hlbiBhIHNwZWNpZmljIHNlc3Npb24gaXMgcnVuLgogICAgICAgICAgPC9wYXBlci10b29sdGlwPgoKICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24KICAgICAgICAgICAgaWQ9InRwdS1jb21wYXRpYmlsaXR5LXJhZGlvLWJ1dHRvbiIKICAgICAgICAgICAgbmFtZT0iW1tDb2xvckJ5Lk9QX0NPTVBBVElCSUxJVFldXSIKICAgICAgICAgID4KICAgICAgICAgICAgVFBVIGNvbXBhdGliaWxpdHkKICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgPHBhcGVyLXRvb2x0aXAKICAgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5PSIwIgogICAgICAgICAgICBmb3I9InRwdS1jb21wYXRpYmlsaXR5LXJhZGlvLWJ1dHRvbiIKICAgICAgICAgICAgcG9zaXRpb249InJpZ2h0IgogICAgICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgICA+CiAgICAgICAgICAgIENvbG9yaW5nIGJ5IHdoZXRoZXIgYW4gb3BlcmF0aW9uIGlzIGNvbXBhdGlibGUgZm9yIHRoZSBUUFUgZGV2aWNlLgogICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgICAgPHNwYW4gY2xhc3M9InNwYWNlciI+PC9zcGFuPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz0ibGVnZW5kLWhvbGRlciI+CiAgICAgIDxidXR0b24gY2xhc3M9ImxlZ2VuZC10b29sYmFyIiBvbi1jbGljaz0iX3RvZ2dsZUxlZ2VuZE9wZW4iPgogICAgICAgIDxzcGFuIGNsYXNzPSJ0b2dnbGUtbGVnZW5kLXRleHQiPkxlZ2VuZDwvc3Bhbj4KICAgICAgICA8aXJvbi1pY29uCiAgICAgICAgICBpY29uPSJbW19nZXRUb2dnbGVMZWdlbmRJY29uKF9sZWdlbmRPcGVuZWQpXV0iCiAgICAgICAgICBjbGFzcz0idG9nZ2xlLWxlZ2VuZC1idXR0b24iCiAgICAgICAgPgogICAgICAgIDwvaXJvbi1pY29uPgogICAgICA8L2J1dHRvbj4KICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJbW19sZWdlbmRPcGVuZWRdXSIgY2xhc3M9ImxlZ2VuZC1jb250ZW50Ij4KICAgICAgICA8IS0tIENvbG9yLW1vZGUtc3BlY2lmaWMgbGVnZW5kIGl0ZW1zIC0tPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzR3JhZGllbnRDb2xvcmluZyhzdGF0cywgY29sb3JCeSldXSI+CiAgICAgICAgICAgIDxzdmcgd2lkdGg9IjE0MCIgaGVpZ2h0PSIyMCIgY2xhc3M9ImNvbG9yLXRleHQgZ3JhZGllbnQtY29udGFpbmVyIj4KICAgICAgICAgICAgICA8ZGVmcz4KICAgICAgICAgICAgICAgIDxsaW5lYXJHcmFkaWVudAogICAgICAgICAgICAgICAgICBpZD0ibGluZWFyR3JhZGllbnQiCiAgICAgICAgICAgICAgICAgIHgxPSIwJSIKICAgICAgICAgICAgICAgICAgeTE9IjAlIgogICAgICAgICAgICAgICAgICB4Mj0iMTAwJSIKICAgICAgICAgICAgICAgICAgeTI9IjAlIgogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICA8c3RvcAogICAgICAgICAgICAgICAgICAgIGNsYXNzPSJzdGFydCIKICAgICAgICAgICAgICAgICAgICBvZmZzZXQ9IjAlIgogICAgICAgICAgICAgICAgICAgIHN0b3AtY29sb3IkPSJbW19jdXJyZW50R3JhZGllbnRQYXJhbXMuc3RhcnRDb2xvcl1dIgogICAgICAgICAgICAgICAgICA+PC9zdG9wPgogICAgICAgICAgICAgICAgICA8c3RvcAogICAgICAgICAgICAgICAgICAgIGNsYXNzPSJlbmQiCiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0PSIxMDAlIgogICAgICAgICAgICAgICAgICAgIHN0b3AtY29sb3IkPSJbW19jdXJyZW50R3JhZGllbnRQYXJhbXMuZW5kQ29sb3JdXSIKICAgICAgICAgICAgICAgICAgPjwvc3RvcD4KICAgICAgICAgICAgICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICAgICAgICAgICAgPC9kZWZzPgogICAgICAgICAgICAgIDxyZWN0CiAgICAgICAgICAgICAgICB4PSIwIgogICAgICAgICAgICAgICAgeT0iMCIKICAgICAgICAgICAgICAgIHdpZHRoPSIxMzUiCiAgICAgICAgICAgICAgICBoZWlnaHQ9IjIwIgogICAgICAgICAgICAgICAgZmlsbD0idXJsKCNsaW5lYXJHcmFkaWVudCkiCiAgICAgICAgICAgICAgICBzdHJva2U9ImJsYWNrIgogICAgICAgICAgICAgID48L3JlY3Q+CiAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkb21haW5WYWx1ZXMgY29sb3ItdGV4dCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZG9tYWluU3RhcnQiPltbX2N1cnJlbnRHcmFkaWVudFBhcmFtcy5taW5WYWx1ZV1dPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iZG9tYWluRW5kIj5bW19jdXJyZW50R3JhZGllbnRQYXJhbXMubWF4VmFsdWVdXTwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGJyIHN0eWxlPSJjbGVhcjogYm90aCIgLz4KICAgICAgICAgICAgPGRpdj5EZXZpY2VzIGluY2x1ZGVkIGluIHN0YXRzOjwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJkZXZpY2VMaXN0Ij4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jdXJyZW50RGV2aWNlc11dIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3cgZGV2aWNlcy1jaGVja2JveCI+CiAgICAgICAgICAgICAgICAgIDxzcGFuCiAgICAgICAgICAgICAgICAgICAgPjxpbnB1dAogICAgICAgICAgICAgICAgICAgICAgdHlwZT0iY2hlY2tib3giCiAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSQ9IltbaXRlbS5kZXZpY2VdXSIKICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQkPSJbW2l0ZW0udXNlZF1dIgogICAgICAgICAgICAgICAgICAgICAgb24tY2xpY2s9Il9kZXZpY2VDaGVja2JveENsaWNrZWQiCiAgICAgICAgICAgICAgICAgIC8+PC9zcGFuPgogICAgICAgICAgICAgICAgICA8c3Bhbj5bW2l0ZW0uc3VmZml4XV08L3NwYW4+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tpdGVtLmlnbm9yZWRNc2ddXSI+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgICAgICAgICAgICAgICBpY29uPSJoZWxwIgogICAgICAgICAgICAgICAgICAgICAgY2xhc3M9ImhlbHAtaWNvbiIKICAgICAgICAgICAgICAgICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcAogICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb249InJpZ2h0IgogICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5PSIwIgogICAgICAgICAgICAgICAgICAgICAgPltbaXRlbS5pZ25vcmVkTXNnXV08L3BhcGVyLXRvb2x0aXAKICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2VxdWFscyhjb2xvckJ5LCAnc3RydWN0dXJlJyldXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLXRleHQiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImxhYmVsIj4gY29sb3JzIDwvc3Bhbj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPnNhbWUgc3Vic3RydWN0dXJlPC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24KICAgICAgICAgICAgICAgICAgdHlwZT0iTUVUQSIKICAgICAgICAgICAgICAgICAgaGVpZ2h0PSIxNiIKICAgICAgICAgICAgICAgICAgZmlsbC1vdmVycmlkZT0iI2VlZSIKICAgICAgICAgICAgICAgICAgc3Ryb2tlLW92ZXJyaWRlPSIjYTZhNmE2IgogICAgICAgICAgICAgICAgPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPnVuaXF1ZSBzdWJzdHJ1Y3R1cmU8L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZXF1YWxzKGNvbG9yQnksICdkZXZpY2UnKV1dIj4KICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jdXJyZW50RGV2aWNlUGFyYW1zXV0iPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uCiAgICAgICAgICAgICAgICAgICAgdHlwZT0iTUVUQSIKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9IjE2IgogICAgICAgICAgICAgICAgICAgIGZpbGwtb3ZlcnJpZGU9IltbaXRlbS5jb2xvcl1dIgogICAgICAgICAgICAgICAgICAgIHN0cm9rZS1vdmVycmlkZT0iI2E2YTZhNiIKICAgICAgICAgICAgICAgICAgPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+W1tpdGVtLmRldmljZV1dPC9zcGFuPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uCiAgICAgICAgICAgICAgICAgIHR5cGU9Ik1FVEEiCiAgICAgICAgICAgICAgICAgIGhlaWdodD0iMTYiCiAgICAgICAgICAgICAgICAgIGZpbGwtb3ZlcnJpZGU9IiNlZWUiCiAgICAgICAgICAgICAgICAgIHN0cm9rZS1vdmVycmlkZT0iI2E2YTZhNiIKICAgICAgICAgICAgICAgID48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj51bmtub3duIGRldmljZTwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19lcXVhbHMoY29sb3JCeSwgJ3hsYV9jbHVzdGVyJyldXSI+CiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY3VycmVudFhsYUNsdXN0ZXJQYXJhbXNdXSI+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICAgICAgPHN2Zz4KICAgICAgICAgICAgICAgICAgICA8dXNlCiAgICAgICAgICAgICAgICAgICAgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgICAgICAgICAgICAgICAgICAgIHhsaW5rOmhyZWY9IiN1bmZpbGxlZC1yZWN0IgogICAgICAgICAgICAgICAgICAgICAgeD0iMCIKICAgICAgICAgICAgICAgICAgICAgIHk9IjAiCiAgICAgICAgICAgICAgICAgICAgICBzdHlsZT0iZmlsbDpbW2l0ZW0uY29sb3JdXSIKICAgICAgICAgICAgICAgICAgICA+PC91c2U+CiAgICAgICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj5bW2l0ZW0ueGxhX2NsdXN0ZXJdXTwvc3Bhbj4KICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgICA8c3ZnPgogICAgICAgICAgICAgICAgICA8dXNlCiAgICAgICAgICAgICAgICAgICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgICAgICAgICAgICAgICAgICAgeGxpbms6aHJlZj0iI2dyZXktcmVjdCIKICAgICAgICAgICAgICAgICAgICB4PSIwIgogICAgICAgICAgICAgICAgICAgIHk9IjAiCiAgICAgICAgICAgICAgICAgID48L3VzZT4KICAgICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+dW5rbm93biBYTEEgY2x1c3Rlcjwvc3Bhbj4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19lcXVhbHMoY29sb3JCeSwgJ29wX2NvbXBhdGliaWxpdHknKV1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItdGV4dCI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbgogICAgICAgICAgICAgICAgICB0eXBlPSJPUCIKICAgICAgICAgICAgICAgICAgaGVpZ2h0PSIxNiIKICAgICAgICAgICAgICAgICAgZmlsbC1vdmVycmlkZT0iIzBmOWQ1OCIKICAgICAgICAgICAgICAgICAgc3Ryb2tlLW92ZXJyaWRlPSIjY2NjIgogICAgICAgICAgICAgICAgPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPlZhbGlkIE9wPC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24KICAgICAgICAgICAgICAgICAgdHlwZT0iT1AiCiAgICAgICAgICAgICAgICAgIGhlaWdodD0iMTYiCiAgICAgICAgICAgICAgICAgIGZpbGwtb3ZlcnJpZGU9IiNkYjQ0MzciCiAgICAgICAgICAgICAgICAgIHN0cm9rZS1vdmVycmlkZT0iI2NjYyIKICAgICAgICAgICAgICAgID48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj5JbnZhbGlkIE9wPC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3N0YXRzTm90TnVsbChzdGF0cyldXSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik1FVEEiIGhlaWdodD0iMTYiIGZhZGVkPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj51bnVzZWQgc3Vic3RydWN0dXJlPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CgogICAgICAgIDwhLS0gQ29tbW9uIGxlZ2VuZCBpdGVtcyAtLT4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHRhYmxlPgogICAgICAgICAgICA8dGJvZHk+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPjwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+KCogPSBleHBhbmRhYmxlKTwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uCiAgICAgICAgICAgICAgICAgICAgdHlwZT0iTUVUQSIKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9IjE2IgogICAgICAgICAgICAgICAgICAgIGZpbGwtb3ZlcnJpZGU9IiNkOWQ5ZDkiCiAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLW92ZXJyaWRlPSIjY2NjIgogICAgICAgICAgICAgICAgICA+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgTmFtZXNwYWNlPHNwYW4gY2xhc3M9ImdyYXkiPio8L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAKICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheT0iMCIKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPSJyaWdodCIKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICBFbmNhcHN1bGF0ZXMgYSBzZXQgb2Ygbm9kZXMuIE5hbWVzcGFjZSBpcyBoaWVyYXJjaGljYWwgYW5kCiAgICAgICAgICAgICAgICAgICAgICBiYXNlZCBvbiBzY29wZS4KICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24gdHlwZT0iT1AiIGhlaWdodD0iMTYiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIE9wTm9kZQogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwCiAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24tZGVsYXk9IjAiCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj0icmlnaHQiCiAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgTm9kZSB0aGF0IHBlcmZvcm1zIGFuIG9wZXJhdGlvbi4gVGhlc2Ugbm9kZXMgY2Fubm90CiAgICAgICAgICAgICAgICAgICAgICBleHBhbmQuCiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9IlNFUklFUyIgaGVpZ2h0PSIxNiI+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgVW5jb25uZWN0ZWQgc2VyaWVzPHNwYW4gY2xhc3M9ImdyYXkiPio8L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAKICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheT0iMCIKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPSJyaWdodCIKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZSBvZiBudW1iZXJlZCBub2RlcyB0aGF0IGFyZSBub3QgY29ubmVjdGVkIHRvIGVhY2gKICAgICAgICAgICAgICAgICAgICAgIG90aGVyLgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbgogICAgICAgICAgICAgICAgICAgIHR5cGU9IlNFUklFUyIKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9IjE2IgogICAgICAgICAgICAgICAgICAgIHZlcnRpY2FsCiAgICAgICAgICAgICAgICAgID48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICBDb25uZWN0ZWQgc2VyaWVzPHNwYW4gY2xhc3M9ImdyYXkiPio8L3NwYW4+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAKICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheT0iMCIKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPSJyaWdodCIKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZSBvZiBudW1iZXJlZCBub2RlcyB0aGF0IGFyZSBjb25uZWN0ZWQgdG8gZWFjaAogICAgICAgICAgICAgICAgICAgICAgb3RoZXIuCiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIDxzdmcgY2xhc3M9Imljb24iPgogICAgICAgICAgICAgICAgICAgIDxjaXJjbGUKICAgICAgICAgICAgICAgICAgICAgIGZpbGw9IndoaXRlIgogICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPSIjODQ4NDg0IgogICAgICAgICAgICAgICAgICAgICAgY3g9IjEwIgogICAgICAgICAgICAgICAgICAgICAgY3k9IjEwIgogICAgICAgICAgICAgICAgICAgICAgcj0iNSIKICAgICAgICAgICAgICAgICAgICA+PC9jaXJjbGU+CiAgICAgICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgQ29uc3RhbnQKICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcAogICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5PSIwIgogICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb249InJpZ2h0IgogICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgIE5vZGUgdGhhdCBvdXRwdXRzIGEgY29uc3RhbnQgdmFsdWUuCiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9IlNVTU1BUlkiIGhlaWdodD0iMjAiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIFN1bW1hcnkKICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcAogICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5PSIwIgogICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb249InJpZ2h0IgogICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgIE5vZGUgdGhhdCBjb2xsZWN0cyBkYXRhIGZvciB2aXN1YWxpemF0aW9uIHdpdGhpbgogICAgICAgICAgICAgICAgICAgICAgVGVuc29yQm9hcmQuCiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIDxzdmcKICAgICAgICAgICAgICAgICAgICBjbGFzcz0iaWNvbiIKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9IjE1cHgiCiAgICAgICAgICAgICAgICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pbllNaWQgbWVldCIKICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PSIwIDAgMTUgMTUiCiAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICA8ZGVmcz4KICAgICAgICAgICAgICAgICAgICAgIDxtYXJrZXIKICAgICAgICAgICAgICAgICAgICAgICAgaWQ9ImRhdGFmbG93LWFycm93aGVhZC1sZWdlbmQiCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9IiNiYmIiCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlcldpZHRoPSIxMCIKICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VySGVpZ2h0PSIxMCIKICAgICAgICAgICAgICAgICAgICAgICAgcmVmWD0iOSIKICAgICAgICAgICAgICAgICAgICAgICAgcmVmWT0iNSIKICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiCiAgICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0gMCwwIEwgMTAsNSBMIDAsMTAgQyAzLDcgMywzIDAsMCI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgICAgPC9tYXJrZXI+CiAgICAgICAgICAgICAgICAgICAgPC9kZWZzPgogICAgICAgICAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgICAgICAgICBtYXJrZXItZW5kPSJ1cmwoI2RhdGFmbG93LWFycm93aGVhZC1sZWdlbmQpIgogICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPSIjYmJiIgogICAgICAgICAgICAgICAgICAgICAgZD0iTTIgOSBsIDI5IDAiCiAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD0icm91bmQiCiAgICAgICAgICAgICAgICAgICAgPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgPC9zdmc+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICBEYXRhZmxvdyBlZGdlCiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAKICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheT0iMCIKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPSJyaWdodCIKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICBFZGdlIHNob3dpbmcgdGhlIGRhdGEgZmxvdyBiZXR3ZWVuIG9wZXJhdGlvbnMuIEVkZ2VzIGZsb3cKICAgICAgICAgICAgICAgICAgICAgIHVwd2FyZHMgdW5sZXNzIGFycm93aGVhZHMgc3BlY2lmeSBvdGhlcndpc2UuCiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIDxzdmcKICAgICAgICAgICAgICAgICAgICBjbGFzcz0iaWNvbiIKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9IjE1cHgiCiAgICAgICAgICAgICAgICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pbllNaWQgbWVldCIKICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PSIwIDAgMTUgMTUiCiAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlPSIjYmJiIgogICAgICAgICAgICAgICAgICAgICAgZD0iTTIgOSBsIDI5IDAiCiAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtbGluZWNhcD0icm91bmQiCiAgICAgICAgICAgICAgICAgICAgICBzdHJva2UtZGFzaGFycmF5PSIyLCAyIgogICAgICAgICAgICAgICAgICAgID48L3BhdGg+CiAgICAgICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgQ29udHJvbCBkZXBlbmRlbmN5IGVkZ2UKICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcAogICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5PSIwIgogICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb249InJpZ2h0IgogICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgIEVkZ2Ugc2hvd2luZyB0aGUgY29udHJvbCBkZXBlbmRlbmN5IGJldHdlZW4gb3BlcmF0aW9ucy4KICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgPHN2ZwogICAgICAgICAgICAgICAgICAgIGNsYXNzPSJpY29uIgogICAgICAgICAgICAgICAgICAgIGhlaWdodD0iMTVweCIKICAgICAgICAgICAgICAgICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pZCBtZWV0IgogICAgICAgICAgICAgICAgICAgIHZpZXdCb3g9IjAgMCAxNSAxNSIKICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgIDxkZWZzPgogICAgICAgICAgICAgICAgICAgICAgPG1hcmtlcgogICAgICAgICAgICAgICAgICAgICAgICBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1sZWdlbmQiCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9IiNGRkI3NEQiCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlcldpZHRoPSIxMCIKICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VySGVpZ2h0PSIxMCIKICAgICAgICAgICAgICAgICAgICAgICAgcmVmWD0iOSIKICAgICAgICAgICAgICAgICAgICAgICAgcmVmWT0iNSIKICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiCiAgICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoIGQ9Ik0gMCwwIEwgMTAsNSBMIDAsMTAgQyAzLDcgMywzIDAsMCI+PC9wYXRoPgogICAgICAgICAgICAgICAgICAgICAgPC9tYXJrZXI+CiAgICAgICAgICAgICAgICAgICAgPC9kZWZzPgogICAgICAgICAgICAgICAgICAgIDxwYXRoCiAgICAgICAgICAgICAgICAgICAgICBtYXJrZXItZW5kPSJ1cmwoI3JlZmVyZW5jZS1hcnJvd2hlYWQtbGVnZW5kKSIKICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT0iI0ZGQjc0RCIKICAgICAgICAgICAgICAgICAgICAgIGQ9Ik0yIDkgbCAyOSAwIgogICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogICAgICAgICAgICAgICAgICAgID48L3BhdGg+CiAgICAgICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgUmVmZXJlbmNlIGVkZ2UKICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcAogICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5PSIwIgogICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb249InJpZ2h0IgogICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgIEVkZ2Ugc2hvd2luZyB0aGF0IHRoZSBvdXRnb2luZyBvcGVyYXRpb24gbm9kZSBjYW4gbXV0YXRlCiAgICAgICAgICAgICAgICAgICAgICB0aGUgaW5jb21pbmcgdGVuc29yLgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgIDwvdGJvZHk+CiAgICAgICAgICA8L3RhYmxlPgogICAgICAgIDwvZGl2PgogICAgICA8L2lyb24tY29sbGFwc2U+CiAgICA8L2Rpdj4KICBgLHQoW28oe3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfc3RhdHNDaGFuZ2VkIn0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxsSnQucHJvdG90eXBlLCJzdGF0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdCxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sbEp0LnByb3RvdHlwZSwiZGV2aWNlc0ZvclN0YXRzIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nLG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxsSnQucHJvdG90eXBlLCJjb2xvckJ5Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0LG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxsSnQucHJvdG90eXBlLCJjb2xvckJ5UGFyYW1zIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXksb2JzZXJ2ZXI6Il9kYXRhc2V0c0NoYW5nZWQifSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGxKdC5wcm90b3R5cGUsImRhdGFzZXRzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLEFLdCldLGxKdC5wcm90b3R5cGUsInJlbmRlckhpZXJhcmNoeSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdCxub3RpZnk6ITAscmVhZE9ubHk6ITAsY29tcHV0ZWQ6Il9jb21wdXRlU2VsZWN0aW9uKGRhdGFzZXRzLCBfc2VsZWN0ZWRSdW5JbmRleCwgX3NlbGVjdGVkVGFnSW5kZXgsIF9zZWxlY3RlZEdyYXBoVHlwZSkifSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGxKdC5wcm90b3R5cGUsInNlbGVjdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdCxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sbEp0LnByb3RvdHlwZSwic2VsZWN0ZWRGaWxlIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyLG9ic2VydmVyOiJfc2VsZWN0ZWRSdW5JbmRleENoYW5nZWQifSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLGxKdC5wcm90b3R5cGUsIl9zZWxlY3RlZFJ1bkluZGV4Iix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbixub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGxKdC5wcm90b3R5cGUsInRyYWNlSW5wdXRzIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbixub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGxKdC5wcm90b3R5cGUsImF1dG9FeHRyYWN0Tm9kZXMiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXIsb2JzZXJ2ZXI6Il9zZWxlY3RlZFRhZ0luZGV4Q2hhbmdlZCJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sbEp0LnByb3RvdHlwZSwiX3NlbGVjdGVkVGFnSW5kZXgiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sbEp0LnByb3RvdHlwZSwiX3NlbGVjdGVkR3JhcGhUeXBlIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nLG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxsSnQucHJvdG90eXBlLCJzZWxlY3RlZE5vZGUiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxsSnQucHJvdG90eXBlLCJzaG93U2Vzc2lvblJ1bnNEcm9wZG93biIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGxKdC5wcm90b3R5cGUsInNob3dVcGxvYWRCdXR0b24iLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxsSnQucHJvdG90eXBlLCJoZWFsdGhQaWxsc0ZlYXR1cmVFbmFibGVkIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbixub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLGxKdC5wcm90b3R5cGUsImhlYWx0aFBpbGxzVG9nZ2xlZE9uIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sbEp0LnByb3RvdHlwZSwiX2xlZ2VuZE9wZW5lZCIsdm9pZCAwKSx0KFtzKCJkZXZpY2VzRm9yU3RhdHMiKSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLGxKdC5wcm90b3R5cGUsIl9jdXJyZW50RGV2aWNlcyIsbnVsbCksdChbcygiY29sb3JCeVBhcmFtcyIpLGUoImRlc2lnbjp0eXBlIixBcnJheSksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sbEp0LnByb3RvdHlwZSwiX2N1cnJlbnREZXZpY2VQYXJhbXMiLG51bGwpLHQoW3MoImNvbG9yQnlQYXJhbXMiKSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLGxKdC5wcm90b3R5cGUsIl9jdXJyZW50WGxhQ2x1c3RlclBhcmFtcyIsbnVsbCksdChbcygiY29sb3JCeVBhcmFtcyIsImNvbG9yQnkiKSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxsSnQucHJvdG90eXBlLCJfY3VycmVudEdyYWRpZW50UGFyYW1zIixudWxsKSxsSnQ9dChbaSgidGYtZ3JhcGgtY29udHJvbHMiKV0sbEp0KTtjb25zdCBkSnQ9eyJsaWJyYXJ5LmZ1bmN0aW9uIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZiI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuaW5wdXQiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5iIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QuZiI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LmZ1bmMiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5pIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QucyI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LnNoYXBlIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3Quc2hhcGUuZGltIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QudGVuc29yIjohMCwibGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QudHlwZSI6ITAsImxpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5zaGFwZS5kaW0iOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUudGVuc29yLnN0cmluZ192YWwiOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUudGVuc29yLnRlbnNvcl9zaGFwZS5kaW0iOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLnNpZ25hdHVyZS5pbnB1dF9hcmciOiEwLCJsaWJyYXJ5LmZ1bmN0aW9uLnNpZ25hdHVyZS5vdXRwdXRfYXJnIjohMCwibGlicmFyeS52ZXJzaW9ucyI6ITAsbm9kZTohMCwibm9kZS5pbnB1dCI6ITAsIm5vZGUuYXR0ciI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LmIiOiEwLCJub2RlLmF0dHIudmFsdWUubGlzdC5mIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3QuZnVuYyI6ITAsIm5vZGUuYXR0ci52YWx1ZS5saXN0LmkiOiEwLCJub2RlLmF0dHIudmFsdWUubGlzdC5zIjohMCwibm9kZS5hdHRyLnZhbHVlLmxpc3Quc2hhcGUiOiEwLCJub2RlLmF0dHIudmFsdWUubGlzdC5zaGFwZS5kaW0iOiEwLCJub2RlLmF0dHIudmFsdWUubGlzdC50ZW5zb3IiOiEwLCJub2RlLmF0dHIudmFsdWUubGlzdC50eXBlIjohMCwibm9kZS5hdHRyLnZhbHVlLnNoYXBlLmRpbSI6ITAsIm5vZGUuYXR0ci52YWx1ZS50ZW5zb3Iuc3RyaW5nX3ZhbCI6ITAsIm5vZGUuYXR0ci52YWx1ZS50ZW5zb3IudGVuc29yX3NoYXBlLmRpbSI6ITB9LHBKdD17InN0ZXBfc3RhdHMuZGV2X3N0YXRzIjohMCwic3RlcF9zdGF0cy5kZXZfc3RhdHMubm9kZV9zdGF0cyI6ITAsInN0ZXBfc3RhdHMuZGV2X3N0YXRzLm5vZGVfc3RhdHMub3V0cHV0IjohMCwic3RlcF9zdGF0cy5kZXZfc3RhdHMubm9kZV9zdGF0cy5tZW1vcnkiOiEwLCJzdGVwX3N0YXRzLmRldl9zdGF0cy5ub2RlX3N0YXRzLm91dHB1dC50ZW5zb3JfZGVzY3JpcHRpb24uc2hhcGUuZGltIjohMH07ZnVuY3Rpb24gZkp0KHQsZSl7bGV0IG49e30saT1bXSxyPVtdLG89bjtmdW5jdGlvbiBhKHQpe2xldCBlPXQuaW5kZXhPZigiOiIpO3JldHVybntuYW1lOnQuc3Vic3RyaW5nKDAsZSkudHJpbSgpLHZhbHVlOihmdW5jdGlvbiBuKHQpe2lmKCJ0cnVlIj09PXQpcmV0dXJuITA7aWYoImZhbHNlIj09PXQpcmV0dXJuITE7aWYoJyInPT09dFswXSlyZXR1cm4gdC5zdWJzdHJpbmcoMSx0Lmxlbmd0aC0xKTtsZXQgZT1wYXJzZUZsb2F0KHQpO3JldHVybiBpc05hTihlKT90OmV9KSh0LnN1YnN0cmluZyhlKzIpLnRyaW0oKSl9fWZ1bmN0aW9uIHModCxuLGkscil7bGV0IG89dFtuXTtudWxsPT1vP3Rbbl09ci5qb2luKCIuIilpbiBlP1tpXTppOkFycmF5LmlzQXJyYXkobyk/by5wdXNoKGkpOnRbbl09W28saV19cmV0dXJuKGZ1bmN0aW9uIGwodCxlLG49MWU2LGk9IlxuIil7cmV0dXJuIG5ldyBQcm9taXNlKChmdW5jdGlvbihyLG8peyEoZnVuY3Rpb24gYShzLGwsYyl7Y29uc3QgdT1jPj10LmJ5dGVMZW5ndGgsaD1sLnNwbGl0KGkpO2hbMF09cytoWzBdO2NvbnN0IGQ9dT8iIjpoLnBvcCgpO2ZvcihsZXQgdCBvZiBoKXRyeXtlKHQpfWNhdGNoKHQpe3JldHVybiB2b2lkIG8odCl9aWYodSlyZXR1cm4gdm9pZCByKCEwKTtjb25zdCBwPW5ldyBCbG9iKFt0LnNsaWNlKGMsYytuKV0pLGY9bmV3IEZpbGVSZWFkZXI7Zi5vbmxvYWQ9ZnVuY3Rpb24odCl7YShkLHQudGFyZ2V0LnJlc3VsdCxjK24pfSxmLnJlYWRBc1RleHQocCl9KSgiIiwiIiwwKX0pKX0pKHQsKGZ1bmN0aW9uKHQpe2lmKHQ9dC50cmltKCkpc3dpdGNoKHRbdC5sZW5ndGgtMV0pe2Nhc2UieyI6bGV0IGU9dC5zdWJzdHJpbmcoMCx0Lmxlbmd0aC0yKS50cmltKCksbj17fTtpLnB1c2gobyksci5wdXNoKGUpLHMobyxlLG4sciksbz1uO2JyZWFrO2Nhc2UifSI6bz1pLnBvcCgpLHIucG9wKCk7YnJlYWs7ZGVmYXVsdDpsZXQgbD1hKHQpO3MobyxsLm5hbWUsbC52YWx1ZSxyLmNvbmNhdChsLm5hbWUpKX19KSkudGhlbigoZnVuY3Rpb24oKXtyZXR1cm4gbn0pKX1mdW5jdGlvbiBtSnQodCxlLGkscj1uZXcgbkp0LG89YUt0KXtjb25zdCBhPWYkdCh0LDMwLCJEYXRhIikscz1mJHQodCwyMCwiR3JhcGgiKSxsPWYkdCh0LDUwLCJOYW1lc3BhY2UgaGllcmFyY2h5IiksYz1EYXRlLm5vdygpO3JldHVybiBoSnQoZSxpLGEpLnRoZW4oKGZ1bmN0aW9uKHQpe2lmKCF0Lm5vZGUpdGhyb3cgbmV3IEVycm9yKCJUaGUgZ3JhcGggaXMgZW1wdHkuIFRoaXMgY2FuIGhhcHBlbiB3aGVuIFRlbnNvckZsb3cgY291bGQgbm90IHRyYWNlIGFueSBncmFwaC4gUGxlYXNlIHJlZmVyIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2lzc3Vlcy8xOTYxIGZvciBtb3JlIGluZm9ybWF0aW9uLiIpO3JldHVybiBxJHQodCxXJHQscyl9KSwoKCk9Pnt0aHJvdyBuZXcgRXJyb3IoIk1hbGZvcm1lZCBHcmFwaERlZi4gVGhpcyBjYW4gc29tZXRpbWVzIGJlIGNhdXNlZCBieSBhIGJhZCBuZXR3b3JrIGNvbm5lY3Rpb24gb3IgZGlmZmljdWx0eSByZWNvbmNpbGluZyBtdWx0aXBsZSBHcmFwaERlZnM7IGZvciB0aGUgbGF0dGVyIGNhc2UsIHBsZWFzZSByZWZlciB0byBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9pc3N1ZXMvMTkyOS4iKX0pKS50aGVuKCh0PT5uKHRoaXMsdm9pZCAwLHZvaWQgMCwoZnVuY3Rpb24qKCl7IShmdW5jdGlvbiBlKHQsbil7aWYobnVsbD09PW4pdGhyb3cgbmV3IEVycm9yKCJDb21wYXRpYmlsaXR5IHByb3ZpZGVyIHJlcXVpcmVkLCBidXQgZ290OiAiK24pO0NlLmV4cG9ydHMuZWFjaCh0Lm5vZGVzLCh0PT57dC5jb21wYXRpYmxlPW4ub3BWYWxpZCh0KSxDZS5leHBvcnRzLmVhY2godC5pbkVtYmVkZGluZ3MsKHQ9Pnt0LmNvbXBhdGlibGU9bi5vcFZhbGlkKHQpfSkpLENlLmV4cG9ydHMuZWFjaCh0Lm91dEVtYmVkZGluZ3MsKHQ9Pnt0LmNvbXBhdGlibGU9bi5vcFZhbGlkKHQpfSkpfSkpfSkodCxyKTtjb25zdCBuPXlpZWxkIHNLdCh0LG8sbCk7cmV0dXJuIGgkdCh7dGltaW5nSWQ6QkF0LkdSQVBIX0xPQURfU1VDQ0VFREVELGV2ZW50VmFsdWU6RGF0ZS5ub3coKS1jfSkse2dyYXBoOnQsZ3JhcGhIaWVyYXJjaHk6bn19KSkpKS5jYXRjaCgoZT0+e3Rocm93IHQucmVwb3J0RXJyb3IoYEdyYXBoIHZpc3VhbGl6YXRpb24gZmFpbGVkLlxuXG4ke2V9YCxlKSxoJHQoe3RpbWluZ0lkOkJBdC5HUkFQSF9MT0FEX0ZBSUxFRCxldmVudFZhbHVlOkRhdGUubm93KCktY30pLGV9KSl9bGV0IGdKdD1jbGFzcyBleHRlbmRzKGNyKHdlKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29tcGF0aWJpbGl0eVByb3ZpZGVyPW5ldyBuSnQsdGhpcy5oaWVyYXJjaHlQYXJhbXM9YUt0LHRoaXMuX3RlbXBsYXRlPW51bGx9X3NlbGVjdGlvbkNoYW5nZWQoKXt0aGlzLnNlbGVjdGlvbiYmdGhpcy5kZWJvdW5jZSgic2VsZWN0aW9uY2hhbmdlIiwoKCk9Pnt0aGlzLl9sb2FkKHRoaXMuc2VsZWN0aW9uKX0pKX1fbG9hZCh0KXtjb25zdHtydW46ZSx0YWc6bix0eXBlOml9PXQ7c3dpdGNoKGkpe2Nhc2UgUVh0Lk9QX0dSQVBIOmNhc2UgUVh0LkNPTkNFUFRVQUxfR1JBUEg6eyhmdW5jdGlvbigpe3RoaXMuX3NldE91dFN0YXRzKG51bGwpfSkuYmluZCh0aGlzKSgpO2NvbnN0IHQ9bmV3IFVSTFNlYXJjaFBhcmFtczt0LnNldCgicnVuIixlKSx0LnNldCgiY29uY2VwdHVhbCIsU3RyaW5nKGk9PT1RWHQuQ09OQ0VQVFVBTF9HUkFQSCkpLG4mJnQuc2V0KCJ0YWciLG4pO2NvbnN0IHI9RXIoKS5wbHVnaW5Sb3V0ZSgiZ3JhcGhzIiwiL2dyYXBoIix0KTtyZXR1cm4gdGhpcy5fZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaChyKS50aGVuKCgoKT0+e3RoaXMuX2dyYXBoUnVuVGFnPXtydW46ZSx0YWc6bn19KSl9Y2FzZSBRWHQuUFJPRklMRTp7Y29uc3R7dGFnczp0fT10aGlzLmRhdGFzZXRzLmZpbmQoKCh7bmFtZTp0fSk9PnQ9PT1lKSksaT10LmZpbmQoKHQ9PnQudGFnPT09bikpLm9wR3JhcGg/bjpudWxsO2NvbnNvbGUuYXNzZXJ0KHQuZmluZCgodD0+dC50YWc9PT1pKSksYFJlcXVpcmVkIHRhZyAoJHtpfSkgaXMgbWlzc2luZy5gKTtjb25zdCByPSF0aGlzLl9ncmFwaFJ1blRhZ3x8dGhpcy5fZ3JhcGhSdW5UYWcucnVuIT09ZXx8dGhpcy5fZ3JhcGhSdW5UYWcudGFnIT09aT90aGlzLl9sb2FkKHtydW46ZSx0YWc6aSx0eXBlOlFYdC5PUF9HUkFQSH0pOlByb21pc2UucmVzb2x2ZSgpLG89bmV3IFVSTFNlYXJjaFBhcmFtcztvLnNldCgidGFnIixuKSxvLnNldCgicnVuIixlKTtjb25zdCBhPUVyKCkucGx1Z2luUm91dGUoImdyYXBocyIsIi9ydW5fbWV0YWRhdGEiLG8pO3JldHVybiByLnRoZW4oKCgpPT50aGlzLl9yZWFkQW5kUGFyc2VNZXRhZGF0YShhKSkpfWRlZmF1bHQ6cmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgVW5rbm93biBzZWxlY3Rpb24gdHlwZTogJHtpfWApKX19X3JlYWRBbmRQYXJzZU1ldGFkYXRhKHQpe3RoaXMuc2V0KCJwcm9ncmVzcyIse3ZhbHVlOjAsbXNnOiIifSksdUp0KHQscCR0KHRoaXMpKS50aGVuKGZ1bmN0aW9uKHQpe3RoaXMuX3NldE91dFN0YXRzKHQpfS5iaW5kKHRoaXMpKX1fZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaCh0LGUpe3RoaXMuc2V0KCJwcm9ncmVzcyIse3ZhbHVlOjAsbXNnOiIifSk7cmV0dXJuIG1KdChwJHQodGhpcyksdCxlLHRoaXMuY29tcGF0aWJpbGl0eVByb3ZpZGVyLHRoaXMuaGllcmFyY2h5UGFyYW1zKS50aGVuKGZ1bmN0aW9uKHtncmFwaDp0LGdyYXBoSGllcmFyY2h5OmV9KXt0aGlzLl9zZXRPdXRHcmFwaCh0KSx0aGlzLl9zZXRPdXRHcmFwaEhpZXJhcmNoeShlKX0uYmluZCh0aGlzKSl9X3NlbGVjdGVkRmlsZUNoYW5nZWQoKXt2YXIgdD10aGlzLnNlbGVjdGVkRmlsZTtpZighdClyZXR1cm47Y29uc3QgZT10LnRhcmdldCxuPWUuZmlsZXNbMF07biYmKGUudmFsdWU9IiIsdGhpcy5fZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaChudWxsLG4pKX19O3QoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxnSnQucHJvdG90eXBlLCJkYXRhc2V0cyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdCxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sZ0p0LnByb3RvdHlwZSwicHJvZ3Jlc3MiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sZ0p0LnByb3RvdHlwZSwic2VsZWN0aW9uIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGdKdC5wcm90b3R5cGUsInNlbGVjdGVkRmlsZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxnSnQucHJvdG90eXBlLCJjb21wYXRpYmlsaXR5UHJvdmlkZXIiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sZ0p0LnByb3RvdHlwZSwiaGllcmFyY2h5UGFyYW1zIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0LHJlYWRPbmx5OiEwLG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixyS3QpXSxnSnQucHJvdG90eXBlLCJvdXRHcmFwaEhpZXJhcmNoeSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdCxyZWFkT25seTohMCxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsSSR0KV0sZ0p0LnByb3RvdHlwZSwib3V0R3JhcGgiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3QscmVhZE9ubHk6ITAsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGdKdC5wcm90b3R5cGUsIm91dFN0YXRzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGdKdC5wcm90b3R5cGUsIl9ncmFwaFJ1blRhZyIsdm9pZCAwKSx0KFthKCJzZWxlY3Rpb24iLCJjb21wYXRpYmlsaXR5UHJvdmlkZXIiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGdKdC5wcm90b3R5cGUsIl9zZWxlY3Rpb25DaGFuZ2VkIixudWxsKSx0KFthKCJzZWxlY3RlZEZpbGUiLCJjb21wYXRpYmlsaXR5UHJvdmlkZXIiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGdKdC5wcm90b3R5cGUsIl9zZWxlY3RlZEZpbGVDaGFuZ2VkIixudWxsKSxnSnQ9dChbaSgidGYtZ3JhcGgtZGFzaGJvYXJkLWxvYWRlciIpXSxnSnQpO2xldCBfSnQ9Y2xhc3MgZXh0ZW5kcyhjcih3ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9kYXRhc2V0cz1bXSx0aGlzLl9kYXRhc2V0c0ZldGNoZWQ9ITEsdGhpcy5fc2VsZWN0ZWREYXRhc2V0PTAsdGhpcy5fcmVxdWVzdE1hbmFnZXI9bmV3IGJyLHRoaXMuX2NhbmNlbGxlcj1uZXcgeE8sdGhpcy5zcGVjaWZpY0hlYWx0aFBpbGxTdGVwPTAsdGhpcy5oZWFsdGhQaWxsc1RvZ2dsZWRPbj0hMSx0aGlzLl9kZWJ1Z2dlck51bWVyaWNBbGVydHM9W10sdGhpcy5fbm9kZU5hbWVzVG9IZWFsdGhQaWxscz17fSx0aGlzLl9oZWFsdGhQaWxsUmVxdWVzdElkPTEsdGhpcy5faGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJEZWxheT01MDAsdGhpcy5ydW49WHMoInJ1biIse2RlZmF1bHRWYWx1ZToiIix1c2VMb2NhbFN0b3JhZ2U6ITF9KS5jYWxsKHRoaXMpLHRoaXMuX3J1bk9ic2VydmVyPSRzKCJydW4iLHtkZWZhdWx0VmFsdWU6IiIscG9seW1lclByb3BlcnR5OiJydW4iLHVzZUxvY2FsU3RvcmFnZTohMX0pfWF0dGFjaGVkKCl7dGhpcy5zZXQoIl9pc0F0dGFjaGVkIiwhMCl9ZGV0YWNoZWQoKXt0aGlzLnNldCgiX2lzQXR0YWNoZWQiLCExKX1yZWFkeSgpe3N1cGVyLnJlYWR5KCksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJub2RlLXRvZ2dsZS1leHBhbmQiLHRoaXMuX2hhbmRsZU5vZGVUb2dnbGVFeHBhbmQuYmluZCh0aGlzKSl9cmVsb2FkKCl7dGhpcy5fZGVidWdnZXJEYXRhRW5hYmxlZHx8dGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChFcigpLnBsdWdpbnNMaXN0aW5nKCkpLnRoZW4odGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKCh0PT57dC5jYW5jZWxsZWR8fHQudmFsdWUuZGVidWdnZXImJnRoaXMuc2V0KCJfZGVidWdnZXJEYXRhRW5hYmxlZCIsITApfSkpKSx0aGlzLl9tYXliZUZldGNoSGVhbHRoUGlsbHMoKX1fZml0KCl7dGhpcy4kJCgiI2dyYXBoYm9hcmQiKS5maXQoKX1fb25Eb3dubG9hZEltYWdlUmVxdWVzdGVkKHQpe3RoaXMuJCQoIiNncmFwaGJvYXJkIikuZG93bmxvYWRBc0ltYWdlKHQuZGV0YWlsKX1fZ2V0R3JhcGhEaXNwbGF5Q2xhc3NOYW1lKHQsZSl7cmV0dXJuIHR8fGUubGVuZ3RoPyIiOiJuby1ncmFwaCJ9X2ZldGNoRGF0YXNldCgpe3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KEVyKCkucGx1Z2luUm91dGUoImdyYXBocyIsIi9pbmZvIikpfV9mZXRjaEhlYWx0aFBpbGxzKHQsZSl7Y29uc3Qgbj17bm9kZV9uYW1lczpKU09OLnN0cmluZ2lmeSh0KSxydW46Il9fZGVidWdnZXJfZGF0YV9fIn07dm9pZCAwIT09ZSYmKG4uc3RlcD1lKTtjb25zdCBpPUVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwiL2hlYWx0aF9waWxscyIpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KGksbil9X2ZldGNoRGVidWdnZXJOdW1lcmljc0FsZXJ0cygpe3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KEVyKCkucGx1Z2luUm91dGUoImRlYnVnZ2VyIiwiL251bWVyaWNzX2FsZXJ0X3JlcG9ydCIpKX1fZ3JhcGhVcmwodCxlLG4pe3JldHVybiBFcigpLnBsdWdpblJvdXRlKCJncmFwaHMiLCIvZ3JhcGgiLG5ldyBVUkxTZWFyY2hQYXJhbXMoe3J1bjp0LGxpbWl0X2F0dHJfc2l6ZTplLGxhcmdlX2F0dHJzX2tleTpufSkpfV9zaG91bGRSZXF1ZXN0SGVhbHRoUGlsbHMoKXtyZXR1cm4gdGhpcy5fZGVidWdnZXJEYXRhRW5hYmxlZCYmdGhpcy5oZWFsdGhQaWxsc1RvZ2dsZWRPbiYmdGhpcy5fcmVuZGVySGllcmFyY2h5JiZ0aGlzLl9kYXRhc2V0c1N0YXRlKHRoaXMuX2RhdGFzZXRzRmV0Y2hlZCx0aGlzLl9kYXRhc2V0cywiUFJFU0VOVCIpfV9tYXliZUluaXRpYWxpemVEYXNoYm9hcmQoKXshdGhpcy5faW5pdGlhbGl6ZWQmJnRoaXMuX2lzQXR0YWNoZWQmJih0aGlzLnNldCgiX2NvbXBhdGliaWxpdHlQcm92aWRlciIsbmV3IG5KdCksdGhpcy5faW5pdGlhbGl6ZWQ9ITAsdGhpcy5fZmV0Y2hEYXRhc2V0KCkudGhlbigodD0+e2NvbnN0IGU9T2JqZWN0LmtleXModCk7dGhpcy5fZGF0YXNldHM9ZS5zb3J0KHVyKS5tYXAoKGU9Pntjb25zdCBuPXRbZV0saT1PYmplY3Qua2V5cyhuLnRhZ3MpLnNvcnQodXIpLm1hcCgodD0+bi50YWdzW3RdKSkubWFwKCgoe3RhZzp0LGNvbmNlcHR1YWxfZ3JhcGg6ZSxvcF9ncmFwaDpuLHByb2ZpbGU6aX0pPT4oe3RhZzp0LGRpc3BsYXlOYW1lOnQsY29uY2VwdHVhbEdyYXBoOmUsb3BHcmFwaDpuLHByb2ZpbGU6aX0pKSk7cmV0dXJue25hbWU6ZSx0YWdzOm4ucnVuX2dyYXBoP1t7dGFnOm51bGwsZGlzcGxheU5hbWU6IkRlZmF1bHQiLGNvbmNlcHR1YWxHcmFwaDohMSxvcEdyYXBoOiEwLHByb2ZpbGU6ITF9LC4uLmldOml9fSkpLHRoaXMuX2RhdGFzZXRzRmV0Y2hlZD0hMH0pKSl9X2RldGVybWluZVNlbGVjdGVkRGF0YXNldCgpe3ZhciB0PXRoaXMuX2RhdGFzZXRzRmV0Y2hlZCxlPXRoaXMuX2RhdGFzZXRzLG49dGhpcy5ydW47aWYoIW4pcmV0dXJuIHZvaWQgdGhpcy5zZXQoIl9zZWxlY3RlZERhdGFzZXQiLDApO2NvbnN0IGk9ZS5maW5kSW5kZXgoKHQ9PnQubmFtZT09PW4pKTtpZigtMSE9PWkpdGhpcy5zZXQoIl9zZWxlY3RlZERhdGFzZXQiLGkpO2Vsc2UgaWYodCl7Y29uc3QgdD10aGlzLiQkKCIjZXJyb3ItZGlhbG9nIik7dC50ZXh0Q29udGVudD1gTm8gZGF0YXNldCBuYW1lZCAiJHtufSIgY291bGQgYmUgZm91bmQuYCx0Lm9wZW4oKX19X3VwZGF0ZVNlbGVjdGVkRGF0YXNldE5hbWUoKXt2YXIgdD10aGlzLl9kYXRhc2V0cyxlPXRoaXMuX3NlbGVjdGVkRGF0YXNldDt0aGlzLl9kYXRhc2V0c0ZldGNoZWQmJih0Lmxlbmd0aDw9ZXx8dGhpcy5zZXQoInJ1biIsdFtlXS5uYW1lKSl9X3JlcXVlc3RIZWFsdGhQaWxscygpe3RoaXMuc2V0KCJfYXJlSGVhbHRoUGlsbHNMb2FkaW5nIiwhMCk7dmFyIHQ9Kyt0aGlzLl9oZWFsdGhQaWxsUmVxdWVzdElkO251bGwhPT10aGlzLl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lcklkJiYod2luZG93LmNsZWFyVGltZW91dCh0aGlzLl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lcklkKSx0aGlzLl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lcklkPW51bGwpLHRoaXMuYWxsU3RlcHNNb2RlRW5hYmxlZD90aGlzLl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lcklkPXNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aGlzLl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lcklkPW51bGwsdGhpcy5faW5pdGlhdGVOZXR3b3JrUmVxdWVzdEZvckhlYWx0aFBpbGxzKHQpfS5iaW5kKHRoaXMpLHRoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVyRGVsYXkpOnRoaXMuX2luaXRpYXRlTmV0d29ya1JlcXVlc3RGb3JIZWFsdGhQaWxscyh0KX1faW5pdGlhdGVOZXR3b3JrUmVxdWVzdEZvckhlYWx0aFBpbGxzKHQpe2lmKHRoaXMuX2hlYWx0aFBpbGxSZXF1ZXN0SWQhPT10KXJldHVybjtjb25zdCBlPXRoaXMuYWxsU3RlcHNNb2RlRW5hYmxlZD90aGlzLnNwZWNpZmljSGVhbHRoUGlsbFN0ZXA6dm9pZCAwLG49dGhpcy5fZmV0Y2hIZWFsdGhQaWxscyh0aGlzLl9yZW5kZXJIaWVyYXJjaHkuZ2V0TmFtZXNPZlJlbmRlcmVkT3BzKCksZSksaT10aGlzLl9mZXRjaERlYnVnZ2VyTnVtZXJpY3NBbGVydHMoKTtQcm9taXNlLmFsbChbbixpXSkudGhlbihmdW5jdGlvbihlKXt2YXIgbj1lWzBdLGk9ZVsxXTtpZih0aGlzLmhlYWx0aFBpbGxzVG9nZ2xlZE9uJiZ0PT09dGhpcy5faGVhbHRoUGlsbFJlcXVlc3RJZCl7Zm9yKHZhciByIGluIG4pe3RoaXMuc2V0KCJfaGVhbHRoUGlsbFN0ZXBJbmRleCIsbltyXS5sZW5ndGgtMSk7YnJlYWt9dGhpcy5zZXQoIl9kZWJ1Z2dlck51bWVyaWNBbGVydHMiLGkpLHRoaXMuc2V0KCJfbm9kZU5hbWVzVG9IZWFsdGhQaWxscyIsbiksdGhpcy5zZXQoIl9hcmVIZWFsdGhQaWxsc0xvYWRpbmciLCExKSx0aGlzLnNldCgiX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQiLG51bGwpfX0uYmluZCh0aGlzKSl9X2RhdGFzZXRzU3RhdGUodCxlLG4pe3JldHVybiB0P2UmJmUubGVuZ3RoPyJQUkVTRU5UIj09PW46IkVNUFRZIj09PW46Ik5PVF9MT0FERUQiPT09bn1fcmVuZGVySGllcmFyY2h5Q2hhbmdlZCh0KXt0aGlzLnJlbG9hZCgpfV9oYW5kbGVOb2RlVG9nZ2xlRXhwYW5kKCl7dGhpcy5fbWF5YmVGZXRjaEhlYWx0aFBpbGxzKCl9X2hlYWx0aFBpbGxzVG9nZ2xlZE9uQ2hhbmdlZCh0KXt0P3RoaXMucmVsb2FkKCk6dGhpcy5zZXQoIl9ub2RlTmFtZXNUb0hlYWx0aFBpbGxzIix7fSl9X21heWJlRmV0Y2hIZWFsdGhQaWxscygpe3RoaXMuX3Nob3VsZFJlcXVlc3RIZWFsdGhQaWxscygpJiZ0aGlzLl9yZXF1ZXN0SGVhbHRoUGlsbHMoKX19O19KdC50ZW1wbGF0ZT14ZWAKICAgIDxwYXBlci1kaWFsb2cgaWQ9ImVycm9yLWRpYWxvZyIgd2l0aC1iYWNrZHJvcD48L3BhcGVyLWRpYWxvZz4KICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8dGYtZ3JhcGgtY29udHJvbHMKICAgICAgICBpZD0iY29udHJvbHMiCiAgICAgICAgY2xhc3M9InNpZGViYXIiCiAgICAgICAgc2xvdD0ic2lkZWJhciIKICAgICAgICBkZXZpY2VzLWZvci1zdGF0cz0ie3tfZGV2aWNlc0ZvclN0YXRzfX0iCiAgICAgICAgY29sb3ItYnktcGFyYW1zPSJbW19jb2xvckJ5UGFyYW1zXV0iCiAgICAgICAgc3RhdHM9IltbX3N0YXRzXV0iCiAgICAgICAgY29sb3ItYnk9Int7X2NvbG9yQnl9fSIKICAgICAgICBkYXRhc2V0cz0iW1tfZGF0YXNldHNdXSIKICAgICAgICByZW5kZXItaGllcmFyY2h5PSJbW19yZW5kZXJIaWVyYXJjaHldXSIKICAgICAgICBzZWxlY3Rpb249Int7X3NlbGVjdGlvbn19IgogICAgICAgIHNlbGVjdGVkLWZpbGU9Int7X3NlbGVjdGVkRmlsZX19IgogICAgICAgIHNlbGVjdGVkLW5vZGU9Int7X3NlbGVjdGVkTm9kZX19IgogICAgICAgIGhlYWx0aC1waWxscy1mZWF0dXJlLWVuYWJsZWQ9IltbX2RlYnVnZ2VyRGF0YUVuYWJsZWRdXSIKICAgICAgICBoZWFsdGgtcGlsbHMtdG9nZ2xlZC1vbj0ie3toZWFsdGhQaWxsc1RvZ2dsZWRPbn19IgogICAgICAgIG9uLWZpdC10YXA9Il9maXQiCiAgICAgICAgdHJhY2UtaW5wdXRzPSJ7e190cmFjZUlucHV0c319IgogICAgICAgIGF1dG8tZXh0cmFjdC1ub2Rlcz0ie3tfYXV0b0V4dHJhY3ROb2Rlc319IgogICAgICAgIG9uLWRvd25sb2FkLWltYWdlLXJlcXVlc3RlZD0iX29uRG93bmxvYWRJbWFnZVJlcXVlc3RlZCIKICAgICAgPjwvdGYtZ3JhcGgtY29udHJvbHM+CiAgICAgIDxkaXYKICAgICAgICBjbGFzcyQ9ImNlbnRlciBbW19nZXRHcmFwaERpc3BsYXlDbGFzc05hbWUoX3NlbGVjdGVkRmlsZSwgX2RhdGFzZXRzKV1dIgogICAgICAgIHNsb3Q9ImNlbnRlciIKICAgICAgPgogICAgICAgIDx0Zi1ncmFwaC1kYXNoYm9hcmQtbG9hZGVyCiAgICAgICAgICBpZD0ibG9hZGVyIgogICAgICAgICAgZGF0YXNldHM9IltbX2RhdGFzZXRzXV0iCiAgICAgICAgICBzZWxlY3Rpb249IltbX3NlbGVjdGlvbl1dIgogICAgICAgICAgc2VsZWN0ZWQtZmlsZT0iW1tfc2VsZWN0ZWRGaWxlXV0iCiAgICAgICAgICBvdXQtZ3JhcGgtaGllcmFyY2h5PSJ7e19ncmFwaEhpZXJhcmNoeX19IgogICAgICAgICAgb3V0LWdyYXBoPSJ7e19ncmFwaH19IgogICAgICAgICAgb3V0LXN0YXRzPSJ7e19zdGF0c319IgogICAgICAgICAgcHJvZ3Jlc3M9Int7X3Byb2dyZXNzfX0iCiAgICAgICAgICBoaWVyYXJjaHktcGFyYW1zPSJbW19oaWVyYXJjaHlQYXJhbXNdXSIKICAgICAgICAgIGNvbXBhdGliaWxpdHktcHJvdmlkZXI9IltbX2NvbXBhdGliaWxpdHlQcm92aWRlcl1dIgogICAgICAgID48L3RmLWdyYXBoLWRhc2hib2FyZC1sb2FkZXI+CiAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS1tZXNzYWdlIj4KICAgICAgICAgIDxoMz5ObyBncmFwaCBkZWZpbml0aW9uIGZpbGVzIHdlcmUgZm91bmQuPC9oMz4KICAgICAgICAgIDxwPgogICAgICAgICAgICBUbyBzdG9yZSBhIGdyYXBoLCBjcmVhdGUgYQogICAgICAgICAgICA8Y29kZT50Zi5zdW1tYXJ5LkZpbGVXcml0ZXI8L2NvZGU+CiAgICAgICAgICAgIGFuZCBwYXNzIHRoZSBncmFwaCBlaXRoZXIgdmlhIHRoZSBjb25zdHJ1Y3Rvciwgb3IgYnkgY2FsbGluZyBpdHMKICAgICAgICAgICAgPGNvZGU+YWRkX2dyYXBoKCk8L2NvZGU+IG1ldGhvZC4gWW91IG1heSB3YW50IHRvIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvdGVuc29yYm9hcmQvZ3JhcGhzIgogICAgICAgICAgICAgID5leGFtaW5pbmcgdGhlIFRlbnNvckZsb3cgZ3JhcGggdHV0b3JpYWw8L2EKICAgICAgICAgICAgPi4KICAgICAgICAgIDwvcD4KCiAgICAgICAgICA8cD4KICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8gYWRkCiAgICAgICAgICAgIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIgogICAgICAgICAgICAgID5SRUFETUU8L2EKICAgICAgICAgICAgPgogICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgPGEKICAgICAgICAgICAgICBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIgogICAgICAgICAgICAgID5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYQogICAgICAgICAgICA+LgogICAgICAgICAgPC9wPgoKICAgICAgICAgIDxwPgogICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICA8YQogICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciCiAgICAgICAgICAgICAgPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2EKICAgICAgICAgICAgPgogICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgIDwvcD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJncmFwaGJvYXJkIj4KICAgICAgICAgIDx0Zi1ncmFwaC1ib2FyZAogICAgICAgICAgICBpZD0iZ3JhcGhib2FyZCIKICAgICAgICAgICAgZGV2aWNlcy1mb3Itc3RhdHM9IltbX2RldmljZXNGb3JTdGF0c11dIgogICAgICAgICAgICBjb2xvci1ieT0ie3tfY29sb3JCeX19IgogICAgICAgICAgICBjb2xvci1ieS1wYXJhbXM9Int7X2NvbG9yQnlQYXJhbXN9fSIKICAgICAgICAgICAgZ3JhcGgtaGllcmFyY2h5PSJbW19ncmFwaEhpZXJhcmNoeV1dIgogICAgICAgICAgICBncmFwaD0iW1tfZ3JhcGhdXSIKICAgICAgICAgICAgaGllcmFyY2h5LXBhcmFtcz0iW1tfaGllcmFyY2h5UGFyYW1zXV0iCiAgICAgICAgICAgIHByb2dyZXNzPSJbW19wcm9ncmVzc11dIgogICAgICAgICAgICBkZWJ1Z2dlci1kYXRhLWVuYWJsZWQ9IltbX2RlYnVnZ2VyRGF0YUVuYWJsZWRdXSIKICAgICAgICAgICAgYXJlLWhlYWx0aC1waWxscy1sb2FkaW5nPSJbW19hcmVIZWFsdGhQaWxsc0xvYWRpbmddXSIKICAgICAgICAgICAgZGVidWdnZXItbnVtZXJpYy1hbGVydHM9IltbX2RlYnVnZ2VyTnVtZXJpY0FsZXJ0c11dIgogICAgICAgICAgICBub2RlLW5hbWVzLXRvLWhlYWx0aC1waWxscz0iW1tfbm9kZU5hbWVzVG9IZWFsdGhQaWxsc11dIgogICAgICAgICAgICBhbGwtc3RlcHMtbW9kZS1lbmFibGVkPSJ7e2FsbFN0ZXBzTW9kZUVuYWJsZWR9fSIKICAgICAgICAgICAgc3BlY2lmaWMtaGVhbHRoLXBpbGwtc3RlcD0ie3tzcGVjaWZpY0hlYWx0aFBpbGxTdGVwfX0iCiAgICAgICAgICAgIGhlYWx0aC1waWxsLXN0ZXAtaW5kZXg9IltbX2hlYWx0aFBpbGxTdGVwSW5kZXhdXSIKICAgICAgICAgICAgcmVuZGVyLWhpZXJhcmNoeT0ie3tfcmVuZGVySGllcmFyY2h5fX0iCiAgICAgICAgICAgIHNlbGVjdGVkLW5vZGU9Int7X3NlbGVjdGVkTm9kZX19IgogICAgICAgICAgICBzdGF0cz0iW1tfc3RhdHNdXSIKICAgICAgICAgICAgdHJhY2UtaW5wdXRzPSJbW190cmFjZUlucHV0c11dIgogICAgICAgICAgICBhdXRvLWV4dHJhY3Qtbm9kZXM9IltbX2F1dG9FeHRyYWN0Tm9kZXNdXSIKICAgICAgICAgID48L3RmLWdyYXBoLWJvYXJkPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgL2RlZXAvIHsKICAgICAgICBmb250LWZhbWlseTogJ1JvYm90bycsIHNhbnMtc2VyaWY7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLmNlbnRlciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgcGFwZXItZGlhbG9nIHsKICAgICAgICBwYWRkaW5nOiAyMHB4OwogICAgICB9CgogICAgICAubm8tZGF0YS1tZXNzYWdlIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQoKICAgICAgLmdyYXBoYm9hcmQgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLm5vLWdyYXBoIC5ncmFwaGJvYXJkIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAuY2VudGVyOm5vdCgubm8tZ3JhcGgpIC5uby1kYXRhLW1lc3NhZ2UgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIGEgewogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1saW5rKTsKICAgICAgfQoKICAgICAgYTp2aXNpdGVkIHsKICAgICAgICBjb2xvcjogdmFyKC0tdGItbGluay12aXNpdGVkKTsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxfSnQucHJvdG90eXBlLCJfZGF0YXNldHMiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxfSnQucHJvdG90eXBlLCJfZGF0YXNldHNGZXRjaGVkIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLF9KdC5wcm90b3R5cGUsIl9zZWxlY3RlZERhdGFzZXQiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il9yZW5kZXJIaWVyYXJjaHlDaGFuZ2VkIn0pLGUoImRlc2lnbjp0eXBlIixBS3QpXSxfSnQucHJvdG90eXBlLCJfcmVuZGVySGllcmFyY2h5Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLGJyKV0sX0p0LnByb3RvdHlwZSwiX3JlcXVlc3RNYW5hZ2VyIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLHhPKV0sX0p0LnByb3RvdHlwZSwiX2NhbmNlbGxlciIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLF9KdC5wcm90b3R5cGUsIl9kZWJ1Z2dlckRhdGFFbmFibGVkIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sX0p0LnByb3RvdHlwZSwiYWxsU3RlcHNNb2RlRW5hYmxlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxfSnQucHJvdG90eXBlLCJzcGVjaWZpY0hlYWx0aFBpbGxTdGVwIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbixvYnNlcnZlcjoiX2hlYWx0aFBpbGxzVG9nZ2xlZE9uQ2hhbmdlZCJ9KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLF9KdC5wcm90b3R5cGUsImhlYWx0aFBpbGxzVG9nZ2xlZE9uIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nLG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxfSnQucHJvdG90eXBlLCJzZWxlY3RlZE5vZGUiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxfSnQucHJvdG90eXBlLCJfaXNBdHRhY2hlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLF9KdC5wcm90b3R5cGUsIl9pbml0aWFsaXplZCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLF9KdC5wcm90b3R5cGUsIl9hcmVIZWFsdGhQaWxsc0xvYWRpbmciLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheSxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxfSnQucHJvdG90eXBlLCJfZGVidWdnZXJOdW1lcmljQWxlcnRzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLF9KdC5wcm90b3R5cGUsIl9ub2RlTmFtZXNUb0hlYWx0aFBpbGxzIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLF9KdC5wcm90b3R5cGUsIl9oZWFsdGhQaWxsU3RlcEluZGV4Iix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLF9KdC5wcm90b3R5cGUsIl9oZWFsdGhQaWxsUmVxdWVzdElkIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLF9KdC5wcm90b3R5cGUsIl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lcklkIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLF9KdC5wcm90b3R5cGUsIl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lckRlbGF5Iix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxfSnQucHJvdG90eXBlLCJydW5zIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nLG5vdGlmeTohMCxvYnNlcnZlcjoiX3J1bk9ic2VydmVyIn0pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxfSnQucHJvdG90eXBlLCJydW4iLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sX0p0LnByb3RvdHlwZSwiX3NlbGVjdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxfSnQucHJvdG90eXBlLCJfY29tcGF0aWJpbGl0eVByb3ZpZGVyIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sX0p0LnByb3RvdHlwZSwiX3RyYWNlSW5wdXRzIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sX0p0LnByb3RvdHlwZSwiX2F1dG9FeHRyYWN0Tm9kZXMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sX0p0LnByb3RvdHlwZSwiX3NlbGVjdGVkRmlsZSIsdm9pZCAwKSx0KFthKCJfaXNBdHRhY2hlZCIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sX0p0LnByb3RvdHlwZSwiX21heWJlSW5pdGlhbGl6ZURhc2hib2FyZCIsbnVsbCksdChbYSgiX2RhdGFzZXRzRmV0Y2hlZCIsIl9kYXRhc2V0cyIsInJ1biIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sX0p0LnByb3RvdHlwZSwiX2RldGVybWluZVNlbGVjdGVkRGF0YXNldCIsbnVsbCksdChbYSgiX2RhdGFzZXRzRmV0Y2hlZCIsIl9kYXRhc2V0cyIsIl9zZWxlY3RlZERhdGFzZXQiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLF9KdC5wcm90b3R5cGUsIl91cGRhdGVTZWxlY3RlZERhdGFzZXROYW1lIixudWxsKSxfSnQ9dChbaSgidGYtZ3JhcGgtZGFzaGJvYXJkIildLF9KdCk7Y29uc3QgeUp0PWlJO2xldCB2SnQ9Y2xhc3MgZXh0ZW5kcyhjcihnbCh3ZSkpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5tb2RlPSJvZmZzZXQiLHRoaXMudGltZVByb3BlcnR5PSJzdGVwIix0aGlzLmJpbnM9ImJpbnMiLHRoaXMueD0ieCIsdGhpcy5keD0iZHgiLHRoaXMueT0ieSIsdGhpcy5jb2xvclNjYWxlPXlKdC5zY2FsZU9yZGluYWwoeUp0LnNjaGVtZUNhdGVnb3J5MTApLHRoaXMubW9kZVRyYW5zaXRpb25EdXJhdGlvbj01MDAsdGhpcy5fbmFtZT1udWxsLHRoaXMuX2RhdGE9bnVsbH1yZWFkeSgpe3N1cGVyLnJlYWR5KCksdGhpcy5zY29wZVN1YnRyZWUodGhpcy4kLnN2ZywhMCl9YXR0YWNoZWQoKXt0aGlzLl9hdHRhY2hlZD0hMH1kZXRhY2hlZCgpe3RoaXMuX2F0dGFjaGVkPSExfXNldFNlcmllc0RhdGEodCxlKXt0aGlzLl9uYW1lPXQsdGhpcy5fZGF0YT1lLHRoaXMucmVkcmF3KCl9X3JlZHJhd09uQ2hhbmdlKCl7dGhpcy5yZWRyYXcoKX1yZWRyYXcoKXt0aGlzLl9kcmF3KDApfV9tb2RlUmVkcmF3KCl7dGhpcy5fZHJhdyh0aGlzLm1vZGVUcmFuc2l0aW9uRHVyYXRpb24pfV9kcmF3KHQpe2lmKCF0aGlzLl9hdHRhY2hlZHx8IXRoaXMuX2RhdGEpcmV0dXJuO2lmKHZvaWQgMD09PXQpdGhyb3cgbmV3IEVycm9yKCJ2ei1oaXN0b2dyYW0tdGltZXNlcmllcyBfZHJhdyBuZWVkcyBkdXJhdGlvbiIpO2lmKHRoaXMuX2RhdGEubGVuZ3RoPD0wKXRocm93IG5ldyBFcnJvcigiTm90IGVub3VnaCBzdGVwcyBpbiB0aGUgZGF0YSIpO2lmKCF0aGlzLl9kYXRhWzBdLmhhc093blByb3BlcnR5KHRoaXMuYmlucykpdGhyb3cgbmV3IEVycm9yKCJObyBiaW5zIHByb3BlcnR5IG9mICciK3RoaXMuYmlucysiJyBpbiBkYXRhIik7aWYodGhpcy5fZGF0YVswXVt0aGlzLmJpbnNdLmxlbmd0aDw9MCl0aHJvdyBuZXcgRXJyb3IoIk11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgYmluIGluIGJpbnMgaW4gZGF0YSIpO2lmKCF0aGlzLl9kYXRhWzBdW3RoaXMuYmluc11bMF0uaGFzT3duUHJvcGVydHkodGhpcy54KSl0aHJvdyBuZXcgRXJyb3IoIk5vIHggcHJvcGVydHkgJyIrdGhpcy54KyInIG9uIGJpbnMgZGF0YSIpO2lmKCF0aGlzLl9kYXRhWzBdW3RoaXMuYmluc11bMF0uaGFzT3duUHJvcGVydHkodGhpcy5keCkpdGhyb3cgbmV3IEVycm9yKCJObyBkeCBwcm9wZXJ0eSAnIit0aGlzLmR4KyInIG9uIGJpbnMgZGF0YSIpO2lmKCF0aGlzLl9kYXRhWzBdW3RoaXMuYmluc11bMF0uaGFzT3duUHJvcGVydHkodGhpcy55KSl0aHJvdyBuZXcgRXJyb3IoIk5vIHkgcHJvcGVydHkgJyIrdGhpcy55KyInIG9uIGJpbnMgZGF0YSIpO3ZhciBlPXRoaXMudGltZVByb3BlcnR5LG49dGhpcy54LGk9dGhpcy5iaW5zLHI9dGhpcy5keCxvPXRoaXMueSxhPXRoaXMuX2RhdGEscz10aGlzLm1vZGUsbD15SnQuaGNsKHRoaXMuY29sb3JTY2FsZSh0aGlzLl9uYW1lKSksYz15SnQuc2VsZWN0KHRoaXMuJC50b29sdGlwKSx1PWZ1bmN0aW9uKHQpe3JldHVybiB0W25dfSxoPWZ1bmN0aW9uKHQpe3JldHVybiB0W29dfSxkPWZ1bmN0aW9uKHQpe3JldHVybiB0W25dK3Rbcl19LHA9ZnVuY3Rpb24odCl7cmV0dXJuIHRbZV19OyJyZWxhdGl2ZSI9PT1lJiYocD1mdW5jdGlvbih0KXtyZXR1cm4gdC53YWxsX3RpbWUtYVswXS53YWxsX3RpbWV9KTt2YXIgZixtPXRoaXMuJC5zdmcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksZz1tLndpZHRoLF89bS5oZWlnaHQseT17dG9wOjUscmlnaHQ6NjAsYm90dG9tOjIwLGxlZnQ6MjR9OyJvZmZzZXQiPT09cz95LnRvcD0oZj1fLzIuNSkrNTpmPV8teS50b3AteS5ib3R0b207dmFyIHY9Zy15LmxlZnQteS5yaWdodCxiPV8teS50b3AteS5ib3R0b207eUp0Lm1pbihhLHUpLHlKdC5tYXgoYSxkKTt2YXIgeD15SnQuZm9ybWF0KCIuM24iKSx3PXlKdC5mb3JtYXQoIi4wZiIpOyJ3YWxsX3RpbWUiPT09ZT93PXlKdC50aW1lRm9ybWF0KCIlbS8lZCAlWCIpOiJyZWxhdGl2ZSI9PT1lJiYodz1mdW5jdGlvbih0KXtyZXR1cm4geUp0LmZvcm1hdCgiLjFyIikodC8zNmU1KSsiaCJ9KTt2YXIgUz1hLm1hcCgoZnVuY3Rpb24odCxlKXtyZXR1cm5beUp0Lm1pbih0W2ldLHUpLHlKdC5tYXgodFtpXSxkKV19KSksTT1hLm1hcCgoZnVuY3Rpb24odCl7cmV0dXJuIHlKdC5leHRlbnQodFtpXSxoKX0pKSxFPTUwMCxUPXlKdC5leHRlbnQoYSxwKSxDPSgid2FsbF90aW1lIj09PWU/eUp0LnNjYWxlVGltZSgpOnlKdC5zY2FsZUxpbmVhcigpKS5kb21haW4oVCkucmFuZ2UoWzAsIm9mZnNldCI9PT1zP2I6MF0pLEE9eUp0LnNjYWxlTGluZWFyKCkuZG9tYWluKFswLHlKdC5tYXgoYSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gTVtlXVsxXX0pKV0pLnJhbmdlKFtmLDBdKSxrPXlKdC5zY2FsZUxpbmVhcigpLmRvbWFpbihBLmRvbWFpbigpKS5yYW5nZShbRSwwXSksTD15SnQuc2NhbGVMaW5lYXIoKS5kb21haW4oW3lKdC5taW4oYSwoZnVuY3Rpb24odCxlKXtyZXR1cm4gU1tlXVswXX0pKSx5SnQubWF4KGEsKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIFNbZV1bMV19KSldKS5uaWNlKCkucmFuZ2UoWzAsdl0pLFA9eUp0LnNjYWxlTGluZWFyKCkuZG9tYWluKEwuZG9tYWluKCkpLnJhbmdlKFswLEVdKTtjb25zdCBOPXlKdC5zY2FsZUxpbmVhcigpLmRvbWFpbih5SnQuZXh0ZW50KGEscCkpLnJhbmdlKFtsLmJyaWdodGVyKCksbC5kYXJrZXIoKV0pLmludGVycG9sYXRlKHlKdC5pbnRlcnBvbGF0ZUhjbCk7dmFyIEk9eUp0LmF4aXNCb3R0b20oTCkudGlja3MoTWF0aC5tYXgoMix2LzIwKSksUj15SnQuYXhpc1JpZ2h0KEMpLnRpY2tzKE1hdGgubWF4KDIsYi8xNSkpLnRpY2tGb3JtYXQodyksTz15SnQuYXhpc1JpZ2h0KEEpLnRpY2tzKE1hdGgubWF4KDIsYi8xNSkpLnRpY2tTaXplKHYrNSkudGlja0Zvcm1hdCh4KSx6PWZ1bmN0aW9uKHQpe3JldHVybiB0W25dK3Rbcl0vMn0sRD15SnQubGluZSgpLngoKGZ1bmN0aW9uKHQpe3JldHVybiBQKHoodCkpfSkpLnkoKGZ1bmN0aW9uKHQpe3JldHVybiBrKHRbb10pfSkpLEI9dGhpcy4kLnN2ZyxIPXlKdC5zZWxlY3QoQiksRj1ILnRyYW5zaXRpb24oKS5kdXJhdGlvbih0KSxWPUguc2VsZWN0KCJnIikuY2xhc3NlZCgic21hbGwiLChmdW5jdGlvbigpe3JldHVybiB2PjAmJnY8PTE1MH0pKS5jbGFzc2VkKCJtZWRpdW0iLChmdW5jdGlvbigpe3JldHVybiB2PjE1MCYmdjw9MzAwfSkpLmNsYXNzZWQoImxhcmdlIiwoZnVuY3Rpb24oKXtyZXR1cm4gdj4zMDB9KSksVT1GLnNlbGVjdCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK3kubGVmdCsiLCIreS50b3ArIikiKSxqPXlKdC5iaXNlY3RvcihkKS5sZWZ0LEc9Vi5zZWxlY3QoIi5zdGFnZSIpLm9uKCJtb3VzZW92ZXIiLChmdW5jdGlvbigpe0ouc3R5bGUoIm9wYWNpdHkiLDEpLGV0LnN0eWxlKCJvcGFjaXR5IiwxKSxydC5zdHlsZSgib3BhY2l0eSIsMSksc3Quc3R5bGUoIm9wYWNpdHkiLDEpLGMuc3R5bGUoIm9wYWNpdHkiLDEpfSkpLm9uKCJtb3VzZW91dCIsKGZ1bmN0aW9uKCl7Si5zdHlsZSgib3BhY2l0eSIsMCksZXQuc3R5bGUoIm9wYWNpdHkiLDApLHJ0LnN0eWxlKCJvcGFjaXR5IiwwKSxzdC5zdHlsZSgib3BhY2l0eSIsMCksSi5jbGFzc2VkKCJob3Zlci1jbG9zZXN0IiwhMSksSy5jbGFzc2VkKCJvdXRsaW5lLWhvdmVyIiwhMSksYy5zdHlsZSgib3BhY2l0eSIsMCl9KSkub24oIm1vdXNlbW92ZSIsKGZ1bmN0aW9uIFcoKXt2YXIgdCxhPXlKdC5tb3VzZSh0aGlzKSxsPUwuaW52ZXJ0KGFbMF0pO2Z1bmN0aW9uIHUodCl7cmV0dXJuIE1hdGgubWluKHRbaV0ubGVuZ3RoLTEsaih0W2ldLGwpKX1DLmludmVydChhWzFdKTt2YXIgaCxkPTEvMDtKLmF0dHIoInRyYW5zZm9ybSIsKGZ1bmN0aW9uKGUsbCl7dmFyIGM9dShlKTtoPWU7dmFyIG09TChlW2ldW2NdW25dK2VbaV1bY11bcl0vMiksZz1BKGVbaV1bY11bb10pLF89Im9mZnNldCI9PT1zP0MocChlKSktKGYtZyk6Zyx5PU1hdGguYWJzKGFbMV0tXyk7cmV0dXJuIHk8ZCYmKGQ9eSx0PWUpLCJ0cmFuc2xhdGUoIittKyIsIitnKyIpIn0pKSxKLnNlbGVjdCgidGV4dCIpLnRleHQoKGZ1bmN0aW9uKHQpe3ZhciBlPXUodCk7cmV0dXJuIHRbaV1bZV1bb119KSksSi5jbGFzc2VkKCJob3Zlci1jbG9zZXN0IiwoZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10fSkpLEsuY2xhc3NlZCgib3V0bGluZS1ob3ZlciIsKGZ1bmN0aW9uKGUpe3JldHVybiBlPT09dH0pKTt2YXIgbT11KGgpO2V0LmF0dHIoInRyYW5zZm9ybSIsKGZ1bmN0aW9uKHQpe3JldHVybiJ0cmFuc2xhdGUoIitMKGhbaV1bbV1bbl0raFtpXVttXVtyXS8yKSsiLCAiK2IrIikifSkpLnNlbGVjdCgidGV4dCIpLnRleHQoKGZ1bmN0aW9uKHQpe3JldHVybiB4KGhbaV1bbV1bbl0raFtpXVttXVtyXS8yKX0pKTt2YXIgZz1SLnRpY2tGb3JtYXQoKTtydC5hdHRyKCJ0cmFuc2Zvcm0iLChmdW5jdGlvbihlKXtyZXR1cm4idHJhbnNsYXRlKCIrdisiLCAiKygib2Zmc2V0Ij09PXM/QyhwKHQpKTowKSsiKSJ9KSkuc3R5bGUoImRpc3BsYXkiLCJvZmZzZXQiPT09cz8iIjoibm9uZSIpLnNlbGVjdCgidGV4dCIpLnRleHQoKGZ1bmN0aW9uKGUpe3JldHVybiBnKHAodCkpfSkpO3ZhciBfPU8udGlja0Zvcm1hdCgpO3N0LmF0dHIoInRyYW5zZm9ybSIsKGZ1bmN0aW9uKGUpe3JldHVybiJ0cmFuc2xhdGUoIit2KyIsICIrKCJvZmZzZXQiPT09cz8wOkEodFtpXVttXVtvXSkpKyIpIn0pKS5zdHlsZSgiZGlzcGxheSIsIm9mZnNldCI9PT1zPyJub25lIjoiIikuc2VsZWN0KCJ0ZXh0IikudGV4dCgoZnVuY3Rpb24oZSl7cmV0dXJuIF8odFtpXVttXVtvXSl9KSk7dmFyIHk9eUp0Lm1vdXNlKEIpO2Muc3R5bGUoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiKyh5WzBdKzE1KSsicHgsIisoeVsxXS0xNSkrInB4KSIpLnNlbGVjdCgic3BhbiIpLnRleHQoIm9mZnNldCI9PT1zP18odFtpXVttXVtvXSk6KCJzdGVwIj09PWU/InN0ZXAgIjoiIikrZyhwKHQpKSl9KSk7Ry5zZWxlY3QoIi5iYWNrZ3JvdW5kIikuYXR0cigidHJhbnNmb3JtIiwidHJhbnNsYXRlKCIrLXkubGVmdCsiLCIrLXkudG9wKyIpIikuYXR0cigid2lkdGgiLGcpLmF0dHIoImhlaWdodCIsXyk7dmFyIHE9Ry5zZWxlY3RBbGwoIi5oaXN0b2dyYW0iKS5kYXRhKGEpO3EuZXhpdCgpLnJlbW92ZSgpO3ZhciBZPXEuZW50ZXIoKS5hcHBlbmQoImciKS5hdHRyKCJjbGFzcyIsImhpc3RvZ3JhbSIpLFg9WS5tZXJnZShxKS5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiBwKHQpLXAoZSl9KSksJD1VLnNlbGVjdEFsbCgiLmhpc3RvZ3JhbSIpLmF0dHIoInRyYW5zZm9ybSIsKGZ1bmN0aW9uKHQpe3JldHVybiJ0cmFuc2xhdGUoMCwgIisoIm9mZnNldCI9PT1zP0MocCh0KSktZjowKSsiKSJ9KSk7WS5hcHBlbmQoImxpbmUiKS5hdHRyKCJjbGFzcyIsImJhc2VsaW5lIiksJC5zZWxlY3QoIi5iYXNlbGluZSIpLnN0eWxlKCJzdHJva2Utb3BhY2l0eSIsKGZ1bmN0aW9uKHQpe3JldHVybiJvZmZzZXQiPT09cz8uMTowfSkpLmF0dHIoInkxIixmKS5hdHRyKCJ5MiIsZikuYXR0cigieDIiLHYpLFkuYXBwZW5kKCJwYXRoIikuYXR0cigiY2xhc3MiLCJvdXRsaW5lIik7dmFyIEs9WC5zZWxlY3QoIi5vdXRsaW5lIikuYXR0cigidmVjdG9yLWVmZmVjdCIsIm5vbi1zY2FsaW5nLXN0cm9rZSIpLmF0dHIoImQiLChmdW5jdGlvbih0KXtyZXR1cm4oZnVuY3Rpb24odCl7cmV0dXJuIk0iK1Aoeih0WzBdKSkrIiwiK2soMCkrIkwiK0QodCkuc2xpY2UoMSkrIkwiK1Aoeih0W3QubGVuZ3RoLTFdKSkrIiwiK2soMCl9KSh0W2ldKX0pKS5zdHlsZSgic3Ryb2tlLXdpZHRoIiwxKTskLnNlbGVjdCgiLm91dGxpbmUiKS5hdHRyKCJ0cmFuc2Zvcm0iLCJzY2FsZSgiK3YvRSsiLCAiK2YvRSsiKSIpLnN0eWxlKCJzdHJva2UiLChmdW5jdGlvbih0KXtyZXR1cm4ib2Zmc2V0Ij09PXM/IiI6TihwKHQpKX0pKS5zdHlsZSgiZmlsbC1vcGFjaXR5IiwoZnVuY3Rpb24odCl7cmV0dXJuIm9mZnNldCI9PT1zPzE6MH0pKS5zdHlsZSgiZmlsbCIsKGZ1bmN0aW9uKHQpe3JldHVybiBOKHAodCkpfSkpO3ZhciBaPVkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJob3ZlciIpLEo9WC5zZWxlY3QoIi5ob3ZlciIpLnN0eWxlKCJmaWxsIiwoZnVuY3Rpb24odCl7cmV0dXJuIE4ocCh0KSl9KSk7Wi5hcHBlbmQoImNpcmNsZSIpLmF0dHIoInIiLDIpLFouYXBwZW5kKCJ0ZXh0Iikuc3R5bGUoImRpc3BsYXkiLCJub25lIikuYXR0cigiZHgiLDQpO3ZhciBRPVYuc2VsZWN0KCIueC1heGlzLWhvdmVyIikuc2VsZWN0QWxsKCIubGFiZWwiKS5kYXRhKFsieCJdKSx0dD1RLmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJsYWJlbCIpLGV0PVEubWVyZ2UodHQpO3R0LmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLC0yMCkuYXR0cigieSIsNikuYXR0cigid2lkdGgiLDQwKS5hdHRyKCJoZWlnaHQiLDE0KSx0dC5hcHBlbmQoImxpbmUiKS5hdHRyKCJ4MSIsMCkuYXR0cigieDIiLDApLmF0dHIoInkxIiwwKS5hdHRyKCJ5MiIsNiksdHQuYXBwZW5kKCJ0ZXh0IikuYXR0cigiZHkiLDE4KTt2YXIgbnQ9Vi5zZWxlY3QoIi55LWF4aXMtaG92ZXIiKS5zZWxlY3RBbGwoIi5sYWJlbCIpLmRhdGEoWyJ5Il0pLGl0PW50LmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJsYWJlbCIpLHJ0PW50Lm1lcmdlKGl0KTtpdC5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4Iiw4KS5hdHRyKCJ5IiwtNikuYXR0cigid2lkdGgiLDQwKS5hdHRyKCJoZWlnaHQiLDE0KSxpdC5hcHBlbmQoImxpbmUiKS5hdHRyKCJ4MSIsMCkuYXR0cigieDIiLDYpLmF0dHIoInkxIiwwKS5hdHRyKCJ5MiIsMCksaXQuYXBwZW5kKCJ0ZXh0IikuYXR0cigiZHgiLDgpLmF0dHIoImR5Iiw0KTt2YXIgb3Q9Vi5zZWxlY3QoIi55LXNsaWNlLWF4aXMtaG92ZXIiKS5zZWxlY3RBbGwoIi5sYWJlbCIpLmRhdGEoWyJ5Il0pLGF0PW90LmVudGVyKCkuYXBwZW5kKCJnIikuYXR0cigiY2xhc3MiLCJsYWJlbCIpLHN0PW90Lm1lcmdlKGF0KTthdC5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4Iiw4KS5hdHRyKCJ5IiwtNikuYXR0cigid2lkdGgiLDQwKS5hdHRyKCJoZWlnaHQiLDE0KSxhdC5hcHBlbmQoImxpbmUiKS5hdHRyKCJ4MSIsMCkuYXR0cigieDIiLDYpLmF0dHIoInkxIiwwKS5hdHRyKCJ5MiIsMCksYXQuYXBwZW5kKCJ0ZXh0IikuYXR0cigiZHgiLDgpLmF0dHIoImR5Iiw0KSxVLnNlbGVjdCgiLnkuYXhpcy5zbGljZSIpLnN0eWxlKCJvcGFjaXR5Iiwib2Zmc2V0Ij09PXM/MDoxKS5hdHRyKCJ0cmFuc2Zvcm0iLCJ0cmFuc2xhdGUoMCwgIisoIm9mZnNldCI9PT1zPy1mOjApKyIpIikuY2FsbChPKSxVLnNlbGVjdCgiLnguYXhpcyIpLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgwLCAiK2IrIikiKS5jYWxsKEkpLFUuc2VsZWN0KCIueS5heGlzIikuc3R5bGUoIm9wYWNpdHkiLCJvZmZzZXQiPT09cz8xOjApLmF0dHIoInRyYW5zZm9ybSIsInRyYW5zbGF0ZSgiK3YrIiwgIisoIm9mZnNldCI9PT1zPzA6YikrIikiKS5jYWxsKFIpLFUuc2VsZWN0QWxsKCIudGljayB0ZXh0IikuYXR0cigiZmlsbCIsIiNhYWEiKSxVLnNlbGVjdEFsbCgiLmF4aXMgcGF0aC5kb21haW4iKS5hdHRyKCJzdHJva2UiLCJub25lIil9fTtmdW5jdGlvbiBiSnQodCl7Y29uc3RbZSxuLGldPXQ7cmV0dXJue3dhbGxfdGltZTplLHN0ZXA6bixtaW46c2MoaS5tYXAoKChbdCwsXSk9PnQpKSksbWF4Om9jKGkubWFwKCgoWyx0XSk9PnQpKSksYnVja2V0czppLm1hcCgoKFt0LGUsbl0pPT4oe2xlZnQ6dCxyaWdodDplLGNvdW50Om59KSkpfX1mdW5jdGlvbiB4SnQodCxlLG4saT0zMCl7dm9pZCAwIT09ZSYmbnVsbCE9bnx8KGU9MCxuPTApLG49PT1lJiYobj0xLjEqZSsxLGU9ZS8xLjEtMSk7Y29uc3Qgcj0obi1lKS9pO2xldCBvPTA7Y29uc3QgYT1bXTtmb3IobGV0IHM9MDtzPGk7cysrKXtjb25zdCBpPWUrcypyLGw9aStyO2xldCBjPTA7Zm9yKDtvPHQuYnVja2V0cy5sZW5ndGg7KXtjb25zdCByPU1hdGgubWluKG4sdC5idWNrZXRzW29dLnJpZ2h0KSxhPU1hdGgubWF4KGUsdC5idWNrZXRzW29dLmxlZnQpO2lmKHItYT4wKXtjb25zdCBlPU1hdGgubWluKHIsbCktTWF0aC5tYXgoYSxpKSxuPWUvKHItYSkqdC5idWNrZXRzW29dLmNvdW50O2MrPWU+MD9uOjB9ZWxzZXtjb25zdCBlPWw+PW47Yys9aTw9YSYmKGU/cjw9bDpyPGwpP3QuYnVja2V0c1tvXS5jb3VudDowfWlmKHI+bClicmVhaztvKyt9YS5wdXNoKHt4OmksZHg6cix5OmN9KX1yZXR1cm4gYX12SnQudGVtcGxhdGU9eGVgCiAgICA8ZGl2IGlkPSJ0b29sdGlwIj48c3Bhbj48L3NwYW4+PC9kaXY+CiAgICA8c3ZnIGlkPSJzdmciPgogICAgICA8Zz4KICAgICAgICA8ZyBjbGFzcz0iYXhpcyB4Ij48L2c+CiAgICAgICAgPGcgY2xhc3M9ImF4aXMgeSI+PC9nPgogICAgICAgIDxnIGNsYXNzPSJheGlzIHkgc2xpY2UiPjwvZz4KICAgICAgICA8ZyBjbGFzcz0ic3RhZ2UiPgogICAgICAgICAgPHJlY3QgY2xhc3M9ImJhY2tncm91bmQiPjwvcmVjdD4KICAgICAgICA8L2c+CiAgICAgICAgPGcgY2xhc3M9IngtYXhpcy1ob3ZlciI+PC9nPgogICAgICAgIDxnIGNsYXNzPSJ5LWF4aXMtaG92ZXIiPjwvZz4KICAgICAgICA8ZyBjbGFzcz0ieS1zbGljZS1heGlzLWhvdmVyIj48L2c+CiAgICAgIDwvZz4KICAgIDwvc3ZnPgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGNvbG9yOiAjYWFhOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIC0tdnotaGlzdG9ncmFtLXRpbWVzZXJpZXMtaG92ZXItYmctY29sb3I6ICNmZmY7CiAgICAgICAgLS12ei1oaXN0b2dyYW0tdGltZXNlcmllcy1vdXRsaW5lLWNvbG9yOiAjZmZmOwogICAgICAgIC0tdnotaGlzdG9ncmFtLXRpbWVzZXJpZXMtaG92ZXItb3V0bGluZS1jb2xvcjogIzAwMDsKICAgICAgfQoKICAgICAgOmhvc3QoLmRhcmstbW9kZSkgewogICAgICAgIC0tdnotaGlzdG9ncmFtLXRpbWVzZXJpZXMtaG92ZXItYmctY29sb3I6IHZhcigKICAgICAgICAgIC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yCiAgICAgICAgKTsKICAgICAgICAtLXZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzLW91dGxpbmUtY29sb3I6IHZhcigtLXBhcGVyLWdyZXktNjAwKTsKICAgICAgICAtLXZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzLWhvdmVyLW91dGxpbmUtY29sb3I6ICNmZmY7CiAgICAgIH0KCiAgICAgIHN2ZyB7CiAgICAgICAgZm9udC1mYW1pbHk6IHJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgIH0KCiAgICAgIHRleHQgewogICAgICAgIGZpbGw6IGN1cnJlbnRDb2xvcjsKICAgICAgfQoKICAgICAgI3Rvb2x0aXAgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgfQoKICAgICAgLmJhY2tncm91bmQgewogICAgICAgIGZpbGwtb3BhY2l0eTogMDsKICAgICAgICBmaWxsOiByZWQ7CiAgICAgIH0KCiAgICAgIC5oaXN0b2dyYW0gewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAuaG92ZXIgewogICAgICAgIGZvbnQtc2l6ZTogOXB4OwogICAgICAgIGRvbWluYW50LWJhc2VsaW5lOiBtaWRkbGU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLmhvdmVyIGNpcmNsZSB7CiAgICAgICAgc3Ryb2tlOiB3aGl0ZTsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMC41OwogICAgICAgIHN0cm9rZS13aWR0aDogMXB4OwogICAgICB9CgogICAgICAuaG92ZXIgdGV4dCB7CiAgICAgICAgZmlsbDogYmxhY2s7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgLmhvdmVyLmhvdmVyLWNsb3Nlc3QgY2lyY2xlIHsKICAgICAgICBmaWxsOiB2YXIoLS12ei1oaXN0b2dyYW0tdGltZXNlcmllcy1ob3Zlci1vdXRsaW5lLWNvbG9yKSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuaG92ZXIuaG92ZXItY2xvc2VzdCB0ZXh0IHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAuYmFzZWxpbmUgewogICAgICAgIHN0cm9rZTogYmxhY2s7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDAuMTsKICAgICAgfQoKICAgICAgLm91dGxpbmUgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiB2YXIoLS12ei1oaXN0b2dyYW0tdGltZXNlcmllcy1vdXRsaW5lLWNvbG9yKTsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMC41OwogICAgICB9CgogICAgICAub3V0bGluZS5vdXRsaW5lLWhvdmVyIHsKICAgICAgICBzdHJva2U6IHZhcigtLXZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzLWhvdmVyLW91dGxpbmUtY29sb3IpICFpbXBvcnRhbnQ7CiAgICAgICAgc3Ryb2tlLW9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC54LWF4aXMtaG92ZXIsCiAgICAgIC55LWF4aXMtaG92ZXIsCiAgICAgIC55LXNsaWNlLWF4aXMtaG92ZXIgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyIC5sYWJlbCwKICAgICAgLnktYXhpcy1ob3ZlciAubGFiZWwsCiAgICAgIC55LXNsaWNlLWF4aXMtaG92ZXIgLmxhYmVsIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICAgIGZvbnQtc2l6ZTogMTFweDsKICAgICAgICB0ZXh0LWFuY2hvcjogZW5kOwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyIHRleHQgewogICAgICAgIHRleHQtYW5jaG9yOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgIC55LWF4aXMtaG92ZXIgdGV4dCwKICAgICAgLnktc2xpY2UtYXhpcy1ob3ZlciB0ZXh0IHsKICAgICAgICB0ZXh0LWFuY2hvcjogc3RhcnQ7CiAgICAgIH0KCiAgICAgIC54LWF4aXMtaG92ZXIgbGluZSwKICAgICAgLnktYXhpcy1ob3ZlciBsaW5lLAogICAgICAueS1zbGljZS1heGlzLWhvdmVyIGxpbmUgewogICAgICAgIHN0cm9rZTogY3VycmVudENvbG9yOwogICAgICB9CgogICAgICAueC1heGlzLWhvdmVyIHJlY3QsCiAgICAgIC55LWF4aXMtaG92ZXIgcmVjdCwKICAgICAgLnktc2xpY2UtYXhpcy1ob3ZlciByZWN0IHsKICAgICAgICBmaWxsOiB2YXIoLS12ei1oaXN0b2dyYW0tdGltZXNlcmllcy1ob3Zlci1iZy1jb2xvcik7CiAgICAgIH0KCiAgICAgICN0b29sdGlwLAogICAgICAueC1heGlzLWhvdmVyIHRleHQsCiAgICAgIC55LWF4aXMtaG92ZXIgdGV4dCwKICAgICAgLnktc2xpY2UtYXhpcy1ob3ZlciB0ZXh0IHsKICAgICAgICBjb2xvcjogdmFyKC0tdnotaGlzdG9ncmFtLXRpbWVzZXJpZXMtaG92ZXItb3V0bGluZS1jb2xvcik7CiAgICAgIH0KCiAgICAgIC5heGlzIHsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgIH0KCiAgICAgIC5heGlzIHBhdGguZG9tYWluIHsKICAgICAgICBmaWxsOiBub25lOwogICAgICB9CgogICAgICAuYXhpcyAudGljayBsaW5lIHsKICAgICAgICBzdHJva2U6ICNkZGQ7CiAgICAgIH0KCiAgICAgIC5heGlzLnNsaWNlIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICB9CgogICAgICAuYXhpcy5zbGljZSAudGljayBsaW5lIHsKICAgICAgICBzdHJva2UtZGFzaGFycmF5OiAyOwogICAgICB9CgogICAgICAuc21hbGwgLmF4aXMgdGV4dCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgICAuc21hbGwgLmF4aXMgLnRpY2s6Zmlyc3Qtb2YtdHlwZSB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAuc21hbGwgLmF4aXMgLnRpY2s6bGFzdC1vZi10eXBlIHRleHQgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5tZWRpdW0gLmF4aXMgdGV4dCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgICAubWVkaXVtIC5heGlzIC50aWNrOm50aC1jaGlsZCgybiArIDEpIHRleHQgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5sYXJnZSAuYXhpcyB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICAgIC5sYXJnZSAuYXhpcyAudGljazpudGgtY2hpbGQoMm4gKyAxKSB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLHZKdC5wcm90b3R5cGUsIm1vZGUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sdkp0LnByb3RvdHlwZSwidGltZVByb3BlcnR5Iix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLHZKdC5wcm90b3R5cGUsImJpbnMiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sdkp0LnByb3RvdHlwZSwieCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSx2SnQucHJvdG90eXBlLCJkeCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSx2SnQucHJvdG90eXBlLCJ5Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHZKdC5wcm90b3R5cGUsImNvbG9yU2NhbGUiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sdkp0LnByb3RvdHlwZSwibW9kZVRyYW5zaXRpb25EdXJhdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLHZKdC5wcm90b3R5cGUsIl9hdHRhY2hlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSx2SnQucHJvdG90eXBlLCJfbmFtZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sdkp0LnByb3RvdHlwZSwiX2RhdGEiLHZvaWQgMCksdChbYSgidGltZVByb3BlcnR5IiwiY29sb3JTY2FsZSIsIl9hdHRhY2hlZCIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sdkp0LnByb3RvdHlwZSwiX3JlZHJhd09uQ2hhbmdlIixudWxsKSx0KFthKCJtb2RlIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSx2SnQucHJvdG90eXBlLCJfbW9kZVJlZHJhdyIsbnVsbCksdkp0PXQoW2koInZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzIildLHZKdCk7bGV0IHdKdD1jbGFzcyBleHRlbmRzKGJDdChjcih3ZSkpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5nZXREYXRhTG9hZE5hbWU9KHtydW46dH0pPT50LHRoaXMucmVxdWVzdERhdGE9KHQsZSxuKT0+e2NvbnN0IGk9RXIoKS5wbHVnaW5Sb3V0ZSgiaGlzdG9ncmFtcyIsIi9oaXN0b2dyYW1zIik7UHJvbWlzZS5hbGwodC5tYXAoKHQ9Pntjb25zdCBuPVBPKGkse3RhZzp0LnRhZyxydW46dC5ydW59KTtyZXR1cm4gdGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KG4pLnRoZW4oKG49PntlKHtpdGVtOnQsZGF0YTpufSl9KSl9KSkpLmZpbmFsbHkoKCgpPT57bigpfSkpfSx0aGlzLmxvYWREYXRhQ2FsbGJhY2s9KHQsZSxuKT0+e2NvbnN0IGk9KGZ1bmN0aW9uIHIodCl7Y29uc3QgZT10Lm1hcChiSnQpLG49c2MoZSwodD0+dC5taW4pKSxpPW9jKGUsKHQ9PnQubWF4KSk7cmV0dXJuIGUubWFwKCh0PT4oe3dhbGxfdGltZTp0LndhbGxfdGltZSxzdGVwOnQuc3RlcCxiaW5zOnhKdCh0LG4saSl9KSkpfSkobiksbz10aGlzLmdldERhdGFMb2FkTmFtZShlKTt0aGlzLiQuY2hhcnQuc2V0U2VyaWVzRGF0YShvLGkpfSx0aGlzLl9jb2xvclNjYWxlRnVuY3Rpb249X08sdGhpcy5fZXhwYW5kZWQ9ITF9X3JlbG9hZE9uUnVuVGFnUmVxdWVzdE1hbmFnZXJDaGFuZ2UoKXt0aGlzLnJlbG9hZCgpfV91cGRhdGVEYXRhVG9Mb2FkKCl7dGhpcy5kYXRhVG9Mb2FkPVt7cnVuOnRoaXMucnVuLHRhZzp0aGlzLnRhZ31dfWdldCBfcnVuQ29sb3IoKXtyZXR1cm4gdGhpcy5fY29sb3JTY2FsZUZ1bmN0aW9uKHRoaXMucnVuKX1yZWRyYXcoKXt0aGlzLiQuY2hhcnQucmVkcmF3KCl9X3RvZ2dsZUV4cGFuZGVkKHQpe3RoaXMuc2V0KCJfZXhwYW5kZWQiLCF0aGlzLl9leHBhbmRlZCksdGhpcy5yZWRyYXcoKX19O3dKdC50ZW1wbGF0ZT14ZWAKICAgIDx0Zi1jYXJkLWhlYWRpbmcKICAgICAgdGFnPSJbW3RhZ11dIgogICAgICBydW49IltbcnVuXV0iCiAgICAgIGRpc3BsYXktbmFtZT0iW1t0YWdNZXRhZGF0YS5kaXNwbGF5TmFtZV1dIgogICAgICBkZXNjcmlwdGlvbj0iW1t0YWdNZXRhZGF0YS5kZXNjcmlwdGlvbl1dIgogICAgICBjb2xvcj0iW1tfcnVuQ29sb3JdXSIKICAgID48L3RmLWNhcmQtaGVhZGluZz4KICAgIDwhLS0KICAgICAgVGhlIG1haW4gaGlzdG9ncmFtIHRoYXQgd2UgcmVuZGVyLiBEYXRhIGlzIHNldCBkaXJlY3RseSB3aXRoCiAgICAgIFxgc2V0U2VyaWVzRGF0YVxgLCBub3Qgd2l0aCBhIGJvdW5kIHByb3BlcnR5LgogICAgLS0+CiAgICA8dnotaGlzdG9ncmFtLXRpbWVzZXJpZXMKICAgICAgaWQ9ImNoYXJ0IgogICAgICB0aW1lLXByb3BlcnR5PSJbW3RpbWVQcm9wZXJ0eV1dIgogICAgICBtb2RlPSJbW2hpc3RvZ3JhbU1vZGVdXSIKICAgICAgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVGdW5jdGlvbl1dIgogICAgPjwvdnotaGlzdG9ncmFtLXRpbWVzZXJpZXM+CiAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBmbGV4OyBmbGV4LWRpcmVjdGlvbjogcm93OyI+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbgogICAgICAgIHNlbGVjdGVkJD0iW1tfZXhwYW5kZWRdXSIKICAgICAgICBpY29uPSJmdWxsc2NyZWVuIgogICAgICAgIG9uLXRhcD0iX3RvZ2dsZUV4cGFuZGVkIgogICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIHdpZHRoOiAzMzBweDsKICAgICAgICBoZWlnaHQ6IDIzNXB4OwogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxNXB4OwogICAgICB9CiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSB7CiAgICAgICAgd2lkdGg6IDcwMHB4OwogICAgICAgIGhlaWdodDogNTAwcHg7CiAgICAgIH0KCiAgICAgIHZ6LWhpc3RvZ3JhbS10aW1lc2VyaWVzIHsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CgogICAgICB0Zi1jYXJkLWhlYWRpbmcgewogICAgICAgIG1hcmdpbi1ib3R0b206IDEwcHg7CiAgICAgICAgd2lkdGg6IDkwJTsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLHdKdC5wcm90b3R5cGUsInJ1biIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSx3SnQucHJvdG90eXBlLCJ0YWciLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sd0p0LnByb3RvdHlwZSwiZ2V0RGF0YUxvYWROYW1lIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLGJyKV0sd0p0LnByb3RvdHlwZSwicmVxdWVzdE1hbmFnZXIiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sd0p0LnByb3RvdHlwZSwibG9hZERhdGFDYWxsYmFjayIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSx3SnQucHJvdG90eXBlLCJ0YWdNZXRhZGF0YSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSx3SnQucHJvdG90eXBlLCJ0aW1lUHJvcGVydHkiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sd0p0LnByb3RvdHlwZSwiaGlzdG9ncmFtTW9kZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbildLHdKdC5wcm90b3R5cGUsIl9jb2xvclNjYWxlRnVuY3Rpb24iLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFuLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sd0p0LnByb3RvdHlwZSwiX2V4cGFuZGVkIix2b2lkIDApLHQoW2EoInJ1biIsInRhZyIsInJlcXVlc3RNYW5hZ2VyIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSx3SnQucHJvdG90eXBlLCJfcmVsb2FkT25SdW5UYWdSZXF1ZXN0TWFuYWdlckNoYW5nZSIsbnVsbCksdChbYSgicnVuIiwidGFnIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSx3SnQucHJvdG90eXBlLCJfdXBkYXRlRGF0YVRvTG9hZCIsbnVsbCksdChbcygicnVuIiksZSgiZGVzaWduOnR5cGUiLFN0cmluZyksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sd0p0LnByb3RvdHlwZSwiX3J1bkNvbG9yIixudWxsKSx3SnQ9dChbaSgidGYtaGlzdG9ncmFtLWxvYWRlciIpXSx3SnQpO2xldCBTSnQ9Y2xhc3MgZXh0ZW5kcyhjcih3ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLnJlbG9hZE9uUmVhZHk9ITAsdGhpcy5faGlzdG9ncmFtTW9kZT0ib2Zmc2V0Iix0aGlzLl90aW1lUHJvcGVydHk9InN0ZXAiLHRoaXMuX3Jlc3RhbXA9ITEsdGhpcy5fcmVxdWVzdE1hbmFnZXI9bmV3IGJyfV9yZWRyYXdDYXRlZ29yeVBhbmUodCxlKXtlJiZ0LnRhcmdldC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1oaXN0b2dyYW0tbG9hZGVyIikuZm9yRWFjaCgodD0+dC5yZWRyYXcoKSkpfXJlYWR5KCl7c3VwZXIucmVhZHkoKSx0aGlzLnJlbG9hZE9uUmVhZHkmJnRoaXMucmVsb2FkKCl9cmVsb2FkKCl7dGhpcy5fZmV0Y2hUYWdzKCkudGhlbigoKCk9Pnt0aGlzLl9yZWxvYWRIaXN0b2dyYW1zKCl9KSl9X2ZldGNoVGFncygpe2NvbnN0IHQ9RXIoKS5wbHVnaW5Sb3V0ZSgiaGlzdG9ncmFtcyIsIi90YWdzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QodCkudGhlbigodD0+e2lmKENlLmV4cG9ydHMuaXNFcXVhbCh0LHRoaXMuX3J1blRvVGFnSW5mbykpcmV0dXJuO2NvbnN0IGU9Q2UuZXhwb3J0cy5tYXBWYWx1ZXModCwodD0+T2JqZWN0LmtleXModCkpKSxuPWZyKGUpO3RoaXMuc2V0KCJfZGF0YU5vdEZvdW5kIiwwPT09bi5sZW5ndGgpLHRoaXMuc2V0KCJfcnVuVG9UYWciLGUpLHRoaXMuc2V0KCJfcnVuVG9UYWdJbmZvIix0KSx0aGlzLmFzeW5jKCgoKT0+e3RoaXMuc2V0KCJfY2F0ZWdvcmllc0RvbVJlYWR5IiwhMCl9KSl9KSl9X3JlbG9hZEhpc3RvZ3JhbXMoKXt0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtaGlzdG9ncmFtLWxvYWRlciIpLmZvckVhY2goKHQ9Pnt0LnJlbG9hZCgpfSkpfV9zaG91bGRPcGVuKHQpe3JldHVybiB0PD0yfWdldCBfY2F0ZWdvcmllcygpe3JldHVybiBJcih0aGlzLl9ydW5Ub1RhZyx0aGlzLl9zZWxlY3RlZFJ1bnMsdGhpcy5fdGFnRmlsdGVyKX1fdGFnTWV0YWRhdGEodCxlLG4pe3JldHVybiB0W2VdW25dfX07U0p0LnRlbXBsYXRlPXhlYAogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2V0dGluZ3MiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgICAgPHRmLW9wdGlvbi1zZWxlY3RvcgogICAgICAgICAgICAgIGlkPSJoaXN0b2dyYW1Nb2RlU2VsZWN0b3IiCiAgICAgICAgICAgICAgbmFtZT0iSGlzdG9ncmFtIG1vZGUiCiAgICAgICAgICAgICAgc2VsZWN0ZWQtaWQ9Int7X2hpc3RvZ3JhbU1vZGV9fSIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9Im92ZXJsYXkiPm92ZXJsYXk8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJvZmZzZXQiPm9mZnNldDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgICAgPHRmLW9wdGlvbi1zZWxlY3RvcgogICAgICAgICAgICAgIGlkPSJ0aW1lUHJvcGVydHlTZWxlY3RvciIKICAgICAgICAgICAgICBuYW1lPSJPZmZzZXQgdGltZSBheGlzIgogICAgICAgICAgICAgIHNlbGVjdGVkLWlkPSJ7e190aW1lUHJvcGVydHl9fSIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InN0ZXAiPnN0ZXA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJyZWxhdGl2ZSI+cmVsYXRpdmU8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJ3YWxsX3RpbWUiPndhbGw8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPC90Zi1vcHRpb24tc2VsZWN0b3I+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24gcnVucy1zZWxlY3RvciI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+CiAgICAgICAgICA8L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IHNsb3Q9ImNlbnRlciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+Tm8gaGlzdG9ncmFtIGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczo8L3A+CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBZb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IGhpc3RvZ3JhbSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuCiAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCIKICAgICAgICAgICAgICAgID5SRUFETUU8L2EKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiCiAgICAgICAgICAgICAgICA+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2EKICAgICAgICAgICAgICA+LgogICAgICAgICAgICA8L3A+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIgogICAgICAgICAgICAgICAgPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2EKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIDwvcD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPHRmLXRhZy1maWx0ZXJlciB0YWctZmlsdGVyPSJ7e190YWdGaWx0ZXJ9fSI+PC90Zi10YWctZmlsdGVyZXI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jYXRlZ29yaWVzXV0iIGFzPSJjYXRlZ29yeSI+CiAgICAgICAgICAgIDx0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldwogICAgICAgICAgICAgIGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iCiAgICAgICAgICAgICAgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iCiAgICAgICAgICAgID4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtaGlzdG9ncmFtLWxvYWRlcgogICAgICAgICAgICAgICAgICBydW49IltbaXRlbS5ydW5dXSIKICAgICAgICAgICAgICAgICAgdGFnPSJbW2l0ZW0udGFnXV0iCiAgICAgICAgICAgICAgICAgIGFjdGl2ZT0iW1thY3RpdmVdXSIKICAgICAgICAgICAgICAgICAgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShfcnVuVG9UYWdJbmZvLCBpdGVtLnJ1biwgaXRlbS50YWcpXV0iCiAgICAgICAgICAgICAgICAgIHRpbWUtcHJvcGVydHk9IltbX3RpbWVQcm9wZXJ0eV1dIgogICAgICAgICAgICAgICAgICBoaXN0b2dyYW0tbW9kZT0iW1tfaGlzdG9ncmFtTW9kZV1dIgogICAgICAgICAgICAgICAgICByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iCiAgICAgICAgICAgICAgICA+PC90Zi1oaXN0b2dyYW0tbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxTSnQucHJvdG90eXBlLCJyZWxvYWRPblJlYWR5Iix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFNKdC5wcm90b3R5cGUsIl9oaXN0b2dyYW1Nb2RlIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFNKdC5wcm90b3R5cGUsIl90aW1lUHJvcGVydHkiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLFNKdC5wcm90b3R5cGUsIl9zZWxlY3RlZFJ1bnMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sU0p0LnByb3RvdHlwZSwiX3J1blRvVGFnIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFNKdC5wcm90b3R5cGUsIl9ydW5Ub1RhZ0luZm8iLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxTSnQucHJvdG90eXBlLCJfZGF0YU5vdEZvdW5kIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFNKdC5wcm90b3R5cGUsIl90YWdGaWx0ZXIiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxTSnQucHJvdG90eXBlLCJfcmVzdGFtcCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLFNKdC5wcm90b3R5cGUsIl9jYXRlZ29yaWVzRG9tUmVhZHkiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsYnIpXSxTSnQucHJvdG90eXBlLCJfcmVxdWVzdE1hbmFnZXIiLHZvaWQgMCksdChbcygiX3J1blRvVGFnIiwiX3NlbGVjdGVkUnVucyIsIl90YWdGaWx0ZXIiLCJfY2F0ZWdvcmllc0RvbVJlYWR5IiksZSgiZGVzaWduOnR5cGUiLEFycmF5KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxTSnQucHJvdG90eXBlLCJfY2F0ZWdvcmllcyIsbnVsbCksU0p0PXQoW2koInRmLWhpc3RvZ3JhbS1kYXNoYm9hcmQiKV0sU0p0KTtjbGFzcyBNSnR7Y29uc3RydWN0b3IodCxlLG49ITApe3RoaXMuX2FwaVVybD10LHRoaXMuX3JlcXVlc3RNYW5hZ2VyPWUsdGhpcy5fdXNlSHR0cEdldD1ufWdldEV4cGVyaW1lbnQodCl7cmV0dXJuIHRoaXMuX3NlbmRSZXF1ZXN0KCJleHBlcmltZW50Iix0KX1nZXREb3dubG9hZFVybCh0LGUsbil7cmV0dXJuIHRoaXMuX2FwaVVybCsiL2Rvd25sb2FkX2RhdGE/IituZXcgVVJMU2VhcmNoUGFyYW1zKHtmb3JtYXQ6dCxjb2x1bW5zVmlzaWJpbGl0eTpKU09OLnN0cmluZ2lmeShuKSxyZXF1ZXN0OkpTT04uc3RyaW5naWZ5KGUpfSl9bGlzdFNlc3Npb25Hcm91cHModCl7cmV0dXJuIHRoaXMuX3NlbmRSZXF1ZXN0KCJzZXNzaW9uX2dyb3VwcyIsdCl9bGlzdE1ldHJpY0V2YWxzKHQpe3JldHVybiB0aGlzLl9zZW5kUmVxdWVzdCgibWV0cmljX2V2YWxzIix0KX1fc2VuZFJlcXVlc3QodCxlKXtpZih0aGlzLl91c2VIdHRwR2V0KXtjb25zdCBuPWVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShlKSk7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QodGhpcy5fYXBpVXJsKyIvIit0KyI/cmVxdWVzdD0iK24pfWNvbnN0IG49bmV3IHZyO24ud2l0aENyZWRlbnRpYWxzPSEwLG4ubWV0aG9kVHlwZT15ci5QT1NULG4uY29udGVudFR5cGU9InRleHQvcGxhaW4iLG4uYm9keT1KU09OLnN0cmluZ2lmeShlKTtyZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdFdpdGhPcHRpb25zKHRoaXMuX2FwaVVybCsiLyIrdCxuKX19bGV0IEVKdD1jbGFzcyBleHRlbmRzIHdle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLm9yaWVudGF0aW9uPSJob3Jpem9udGFsIn19O2Z1bmN0aW9uIFRKdCh0KXtyZXR1cm4iIiE9PXQuZGlzcGxheU5hbWUmJnZvaWQgMCE9PXQuZGlzcGxheU5hbWU/dC5kaXNwbGF5TmFtZTp0Lm5hbWV9ZnVuY3Rpb24gQ0p0KHQpe2lmKCIiIT09dC5kaXNwbGF5TmFtZSYmdm9pZCAwIT09dC5kaXNwbGF5TmFtZSlyZXR1cm4gdC5kaXNwbGF5TmFtZTtsZXQgZT10Lm5hbWUuZ3JvdXAsbj10Lm5hbWUudGFnO3JldHVybiB2b2lkIDA9PT1lJiYoZT0iIiksdm9pZCAwPT09biYmKG49IiIpLCIiPT09ZT9uOmUrIi4iK259ZnVuY3Rpb24gQUp0KHQsZSl7aWYoZTx0LmhwYXJhbUNvbHVtbnMubGVuZ3RoKXJldHVybiBUSnQodC5ocGFyYW1Db2x1bW5zW2VdLmhwYXJhbUluZm8pO3JldHVybiBDSnQodC5tZXRyaWNDb2x1bW5zW2UtdC5ocGFyYW1Db2x1bW5zLmxlbmd0aF0ubWV0cmljSW5mbyl9ZnVuY3Rpb24ga0p0KHQpe3JldHVybiB0LmhwYXJhbUNvbHVtbnMubGVuZ3RofWZ1bmN0aW9uIExKdCh0KXtyZXR1cm4gdC5tZXRyaWNDb2x1bW5zLmxlbmd0aH1mdW5jdGlvbiBQSnQodCl7cmV0dXJuIGtKdCh0KStMSnQodCl9ZnVuY3Rpb24gTkp0KHQsZSl7cmV0dXJuIHRbZV19ZnVuY3Rpb24gSUp0KHQsZSl7cmV0dXJuIHQuZmluZCgodD0+Q2UuZXhwb3J0cy5pc0VxdWFsKHQubmFtZSxlKSkpfWZ1bmN0aW9uIFJKdCh0LGUsbil7cmV0dXJuIGUuaHBhcmFtc1t0LmhwYXJhbUNvbHVtbnNbbl0uaHBhcmFtSW5mby5uYW1lXX1mdW5jdGlvbiBPSnQodCxlLG4pe2NvbnN0IGk9SUp0KGUubWV0cmljVmFsdWVzLHQubWV0cmljQ29sdW1uc1tuXS5tZXRyaWNJbmZvLm5hbWUpO3JldHVybiB2b2lkIDA9PT1pP3ZvaWQgMDppLnZhbHVlfWZ1bmN0aW9uIHpKdCh0LGUsbil7cmV0dXJuIG48dC5ocGFyYW1Db2x1bW5zLmxlbmd0aD9SSnQodCxlLG4pOk9KdCh0LGUsbi10LmhwYXJhbUNvbHVtbnMubGVuZ3RoKX1mdW5jdGlvbiBESnQodCxlLG4pe3JldHVybiBHbChlLChlPT56SnQodCxlLG4pKSl9ZnVuY3Rpb24gQkp0KHQsZSxuKXtsZXQgaTtpZihuPGUuaHBhcmFtSW5mb3MubGVuZ3RoKWk9dC5ocGFyYW1Db2x1bW5zLmZpbmRJbmRleCgodD0+dC5ocGFyYW1JbmZvLm5hbWU9PT1lLmhwYXJhbUluZm9zW25dLm5hbWUpKTtlbHNle2NvbnN0IHI9ZS5tZXRyaWNJbmZvc1tuLWUuaHBhcmFtSW5mb3MubGVuZ3RoXS5uYW1lO2k9dC5ocGFyYW1Db2x1bW5zLmxlbmd0aCt0Lm1ldHJpY0NvbHVtbnMuZmluZEluZGV4KCh0PT50Lm1ldHJpY0luZm8ubmFtZT09PXIpKX1yZXR1cm4gY29uc29sZS5hc3NlcnQoLTEhPT1pKSxpfWZ1bmN0aW9uIEhKdCh0KXtyZXR1cm4gdC5ocGFyYW1JbmZvcy5sZW5ndGh9ZnVuY3Rpb24gRkp0KHQpe3JldHVybiB0Lm1ldHJpY0luZm9zLmxlbmd0aH1mdW5jdGlvbiBWSnQodCxlLG4pe3JldHVybiBHbChlLChlPT5XSnQodCxlLG4pKSl9ZnVuY3Rpb24gVUp0KHQsZSl7cmV0dXJuIHQuZmluZCgodD0+dC5uYW1lPT09ZSkpfWZ1bmN0aW9uIGpKdCh0LGUsbil7cmV0dXJuIGUuaHBhcmFtc1t0LmhwYXJhbUluZm9zW25dLm5hbWVdfWZ1bmN0aW9uIEdKdCh0LGUsbil7Y29uc3QgaT1JSnQoZS5tZXRyaWNWYWx1ZXMsdC5tZXRyaWNJbmZvc1tuXS5uYW1lKTtyZXR1cm4gdm9pZCAwPT09aT92b2lkIDA6aS52YWx1ZX1mdW5jdGlvbiBXSnQodCxlLG4pe3JldHVybiBuPHQuaHBhcmFtSW5mb3MubGVuZ3RoP2pKdCh0LGUsbik6R0p0KHQsZSxuLXQuaHBhcmFtSW5mb3MubGVuZ3RoKX1mdW5jdGlvbiBxSnQodCl7cmV0dXJuIENlLmV4cG9ydHMuaXNOdW1iZXIodCk/dC50b1ByZWNpc2lvbig1KTp2b2lkIDA9PT10PyIiOnQudG9TdHJpbmcoKX1mdW5jdGlvbiBZSnQodCxlKXtyZXR1cm4gdCp0K2UqZX1mdW5jdGlvbiBYSnQodCxlLG4saSl7cmV0dXJuIE1hdGguc3FydChZSnQodC1uLGUtaSkpfWZ1bmN0aW9uICRKdCh0LGUsbixpLHIsbyl7aWYodDxuJiZlPGkpcmV0dXJuIFhKdCh0LGUsbixpKTtpZihuPD10JiZ0PHImJmU8aSlyZXR1cm4gaS1lO2lmKHI8PXQmJmU8aSlyZXR1cm4gWEp0KHQsZSxyLGkpO2lmKHQ8biYmaTw9ZSYmZTxvKXJldHVybiBuLXQ7aWYobjw9dCYmdDxyJiZpPD1lJiZlPG8pcmV0dXJuIDA7aWYocjw9dCYmaTw9ZSYmZTxvKXJldHVybiB0LXI7aWYodDxuJiZvPD1lKXJldHVybiBYSnQodCxlLG4sbyk7aWYobjw9dCYmdDxyJiZvPD1lKXJldHVybiBlLW87aWYocjw9dCYmbzw9ZSlyZXR1cm4gWEp0KHQsZSxyLG8pO3Rocm93IlBvaW50ICh4LHkpIG11c3QgYmUgaW4gb25lIG9mIHRoZSByZWdpb25zIGRlZmluZWQgYWJvdmUuIn1mdW5jdGlvbiBLSnQodCxlKXtyZXR1cm4gdm9pZCAwPT09ZT8idHJhbnNsYXRlKCIrdCsiKSI6InRyYW5zbGF0ZSgiK3QrIiwiK2UrIikifWZ1bmN0aW9uIFpKdCh0LGUsbil7Y29uc3QgaT10LmdldChlLHQpO0FycmF5LmlzQXJyYXkoaSk/dC5zcGxpY2UuYXBwbHkodCxbZSwwLGkubGVuZ3RoXS5jb25jYXQobikpOnQuc2V0KGUsbil9ZnVuY3Rpb24gSkp0KHQpe2xldCBlPTA7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDsrK24pZT0zMSplK3QuY2hhckNvZGVBdChuKSY0Mjk0OTY3Mjk1O3JldHVybiBlK01hdGgucG93KDIsMzEpfUVKdC50ZW1wbGF0ZT14ZWAKICAgIDxzbG90IG5hbWU9ImNvbnRlbnQiPjwvc2xvdD4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgOmhvc3Qgc2xvdCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIDpob3N0IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgZmxleDogMCAwIGF1dG87CiAgICAgIH0KCiAgICAgIDpob3N0KFtvcmllbnRhdGlvbj0naG9yaXpvbnRhbCddKSBzbG90IHsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIG92ZXJmbG93LXg6IGF1dG87CiAgICAgIH0KCiAgICAgIDpob3N0KFtvcmllbnRhdGlvbj0ndmVydGljYWwnXSkgc2xvdCB7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdCA6OnNsb3R0ZWQoKjpub3QoOmxhc3QtY2hpbGQpKSB7CiAgICAgICAgYm9yZGVyOiAwIHNvbGlkIHZhcigtLWRpdmlkZXItY29sb3IsICNjY2MpOwogICAgICB9CgogICAgICA6aG9zdChbb3JpZW50YXRpb249J3ZlcnRpY2FsJ10pIDo6c2xvdHRlZCgqOm5vdCg6bGFzdC1jaGlsZCkpIHsKICAgICAgICBib3JkZXItYm90dG9tLXdpZHRoOiA1cHg7CiAgICAgIH0KCiAgICAgIDpob3N0KFtvcmllbnRhdGlvbj0naG9yaXpvbnRhbCddKSA6OnNsb3R0ZWQoKjpub3QoOmxhc3QtY2hpbGQpKSB7CiAgICAgICAgYm9yZGVyLXJpZ2h0LXdpZHRoOiA1cHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOlN0cmluZyxyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sRUp0LnByb3RvdHlwZSwib3JpZW50YXRpb24iLHZvaWQgMCksRUp0PXQoW2koImhwYXJhbXMtc3BsaXQtbGF5b3V0IildLEVKdCk7dmFyIFFKdD1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxocGFyYW1OYW1lOlRKdCxtZXRyaWNOYW1lOkNKdCxzY2hlbWFDb2x1bW5OYW1lOkFKdCxudW1IUGFyYW1zOmtKdCxudW1NZXRyaWNzOkxKdCxudW1Db2x1bW5zOlBKdCxocGFyYW1WYWx1ZUJ5TmFtZTpOSnQsbWV0cmljVmFsdWVCeU5hbWU6SUp0LGhwYXJhbVZhbHVlQnlJbmRleDpSSnQsbWV0cmljVmFsdWVCeUluZGV4Ok9KdCxjb2x1bW5WYWx1ZUJ5SW5kZXg6ekp0LG51bWVyaWNDb2x1bW5FeHRlbnQ6REp0LGdldEFic29sdXRlQ29sdW1uSW5kZXg6Qkp0LHNjaGVtYVZpc2libGVDb2x1bW5OYW1lOmZ1bmN0aW9uIHRRdCh0LGUpe3JldHVybiBlPHQuaHBhcmFtSW5mb3MubGVuZ3RoP1RKdCh0LmhwYXJhbUluZm9zW2VdKTpDSnQodC5tZXRyaWNJbmZvc1tlLXQuaHBhcmFtSW5mb3MubGVuZ3RoXSl9LG51bVZpc2libGVIUGFyYW1zOkhKdCxudW1WaXNpYmxlTWV0cmljczpGSnQsbnVtVmlzaWJsZUNvbHVtbnM6ZnVuY3Rpb24gZVF0KHQpe3JldHVybiBISnQodCkrRkp0KHQpfSx2aXNpYmxlTnVtZXJpY0NvbHVtbkV4dGVudDpWSnQscHJldHR5UHJpbnRIUGFyYW1WYWx1ZUJ5TmFtZTpmdW5jdGlvbiBuUXQodCxlKXtyZXR1cm4gcUp0KE5KdCh0LGUpKX0scHJldHR5UHJpbnRNZXRyaWNWYWx1ZUJ5TmFtZTpmdW5jdGlvbiBpUXQodCxlKXtyZXR1cm4gcUp0KElKdCh0LGUpKX0sc2Vzc2lvbkdyb3VwV2l0aE5hbWU6VUp0LGhwYXJhbVZhbHVlQnlWaXNpYmxlSW5kZXg6akp0LG1ldHJpY1ZhbHVlQnlWaXNpYmxlSW5kZXg6R0p0LGNvbHVtblZhbHVlQnlWaXNpYmxlSW5kZXg6V0p0LHByZXR0eVByaW50OnFKdCxsMk5vcm1TcXVhcmVkOllKdCxldWNsaWRlYW5EaXN0OlhKdCxwb2ludFRvUmVjdGFuZ2xlRGlzdDokSnQsdHJhbnNsYXRlU3RyOktKdCxyb3RhdGVTdHI6ZnVuY3Rpb24gclF0KHQsZSxuKXtsZXQgaT0icm90YXRlKCIrdDtyZXR1cm4gdm9pZCAwIT09ZSYmdm9pZCAwIT09biYmKGk9aSsiLCIrZSsiLCIrbiksaSs9IikiLGl9LGlzTnVsbE9yVW5kZWZpbmVkOmZ1bmN0aW9uIG9RdCh0KXtyZXR1cm4gbnVsbD09dH0scXVhZFRyZWVWaXNpdFBvaW50c0luUmVjdDpmdW5jdGlvbiBhUXQodCxlLG4saSxyLG8pe3QudmlzaXQoKChhLHMsbCxjLHUpPT57aWYodm9pZCAwPT09YS5sZW5ndGgpe2Rve2NvbnN0IHM9dC54KCkoYS5kYXRhKSxsPXQueSgpKGEuZGF0YSk7ZTw9cyYmczxpJiZuPD1sJiZsPHImJm8oYS5kYXRhKX13aGlsZShhPWEubmV4dCk7cmV0dXJuITB9cmV0dXJuIHM+PWl8fGM8PWV8fGw+PXJ8fHU8PW59KSl9LHF1YWRUcmVlVmlzaXRQb2ludHNJbkRpc2s6ZnVuY3Rpb24gc1F0KHQsZSxuLGkscil7dC52aXNpdCgoKG8sYSxzLGwsYyk9PntpZih2b2lkIDA9PT1vLmxlbmd0aCl7ZG97Y29uc3QgYT10LngoKShvLmRhdGEpLHM9dC55KCkoby5kYXRhKSxsPVhKdChlLG4sYSxzKTtsPD1pJiZyKG8uZGF0YSxsKX13aGlsZShvPW8ubmV4dCk7cmV0dXJuITB9cmV0dXJuICRKdChlLG4sYSxzLGwsYyk+aX0pKX0sZmlsdGVyU2V0OmZ1bmN0aW9uIGxRdCh0LGUpe2NvbnN0IG49bmV3IFNldDtyZXR1cm4gdC5mb3JFYWNoKCh0PT57ZSh0KSYmbi5hZGQodCl9KSksbn0sc2V0QXJyYXlPYnNlcnZhYmx5OlpKdCxoYXNoT2ZTdHJpbmc6Skp0fSk7bGV0IGNRdD1jbGFzcyBleHRlbmRzKGNyKHdlKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuY29uZmlndXJhdGlvbj17c2NoZW1hOntocGFyYW1Db2x1bW5zOltdLG1ldHJpY0NvbHVtbnM6W119LGNvbHVtbnNWaXNpYmlsaXR5OltdLHZpc2libGVTY2hlbWE6e2hwYXJhbUluZm9zOltdLG1ldHJpY0luZm9zOltdfX0sdGhpcy5zZXNzaW9uR3JvdXBzPVtdLHRoaXMuZGF0YUxvYWRlZFdpdGhOb25FbXB0eUhwYXJhbXM9ITEsdGhpcy5kYXRhTG9hZGVkV2l0aEVtcHR5SHBhcmFtcz0hMSx0aGlzLl9zdGF0dXNlcz1be3ZhbHVlOiJTVEFUVVNfVU5LTk9XTiIsZGlzcGxheU5hbWU6IlVua25vd24iLGFsbG93ZWQ6ITB9LHt2YWx1ZToiU1RBVFVTX1NVQ0NFU1MiLGRpc3BsYXlOYW1lOiJTdWNjZXNzIixhbGxvd2VkOiEwfSx7dmFsdWU6IlNUQVRVU19GQUlMVVJFIixkaXNwbGF5TmFtZToiRmFpbHVyZSIsYWxsb3dlZDohMH0se3ZhbHVlOiJTVEFUVVNfUlVOTklORyIsZGlzcGxheU5hbWU6IlJ1bm5pbmciLGFsbG93ZWQ6ITB9XSx0aGlzLl9nZXRFeHBlcmltZW50UmVzb2x2ZWQ9bmV3IFByb21pc2UoKHQ9Pnt0aGlzLl9yZXNvbHZlR2V0RXhwZXJpbWVudD10fSkpLHRoaXMuX2xpc3RTZXNzaW9uR3JvdXBzQ2FuY2VsbGVyPW5ldyB4Tyx0aGlzLl9wYWdlU2l6ZUlucHV0PXt2YWx1ZToiMTAwIixpbnZhbGlkOiExfSx0aGlzLl9wYWdlTnVtYmVySW5wdXQ9e3ZhbHVlOiIxIixpbnZhbGlkOiExfSx0aGlzLl9wYWdlQ291bnRTdHI9Ij8iLHRoaXMuX2hwYXJhbU5hbWU9VEp0LHRoaXMuX21ldHJpY05hbWU9Q0p0LHRoaXMuX3ByZXR0eVByaW50PXFKdH1yZWxvYWQoKXt0aGlzLl9xdWVyeVNlcnZlcigpfV9jc3ZVcmwodCxlKXtyZXR1cm4gdGhpcy5fZG93bmxvYWREYXRhVXJsKHQsZSwiY3N2Iil9X2pzb25VcmwodCxlKXtyZXR1cm4gdGhpcy5fZG93bmxvYWREYXRhVXJsKHQsZSwianNvbiIpfV9sYXRleFVybCh0LGUpe3JldHVybiB0aGlzLl9kb3dubG9hZERhdGFVcmwodCxlLCJsYXRleCIpfV9kb3dubG9hZERhdGFVcmwodCxlLG4pe3JldHVybiB0aGlzLmJhY2tlbmQuZ2V0RG93bmxvYWRVcmwobix0LGUuY29sdW1uc1Zpc2liaWxpdHkpfV9jb21wdXRlRXhwZXJpbWVudEFuZFJlbGF0ZWRQcm9wcygpe2NvbnN0IHQ9UUp0O2lmKHQuaXNOdWxsT3JVbmRlZmluZWQodGhpcy5iYWNrZW5kKXx8dC5pc051bGxPclVuZGVmaW5lZCh0aGlzLmV4cGVyaW1lbnROYW1lKSlyZXR1cm47dGhpcy5iYWNrZW5kLmdldEV4cGVyaW1lbnQoe2V4cGVyaW1lbnROYW1lOnRoaXMuZXhwZXJpbWVudE5hbWV9KS50aGVuKCh0PT57Q2UuZXhwb3J0cy5pc0VxdWFsKHQsdGhpcy5fZXhwZXJpbWVudCl8fCh0aGlzLnNldCgiX2V4cGVyaW1lbnQiLHQpLHRoaXMuX2NvbXB1dGVIUGFyYW1zKCksdGhpcy5fY29tcHV0ZU1ldHJpY3MoKSx0aGlzLl9xdWVyeVNlcnZlcigpLHRoaXMuX3Jlc29sdmVHZXRFeHBlcmltZW50KCkpfSkpLmZpbmFsbHkoKCgpPT57dGhpcy5fY29tcHV0ZURhdGFGb3VuZCgpfSkpfV9jb21wdXRlRGF0YUZvdW5kKCl7Y29uc3QgdD1Cb29sZWFuKHRoaXMuX2V4cGVyaW1lbnQmJnRoaXMuX2V4cGVyaW1lbnQuaHBhcmFtSW5mb3MmJnRoaXMuX2V4cGVyaW1lbnQuaHBhcmFtSW5mb3MubGVuZ3RoPjAmJnRoaXMuX2V4cGVyaW1lbnQubWV0cmljSW5mb3MmJnRoaXMuX2V4cGVyaW1lbnQubWV0cmljSW5mb3MubGVuZ3RoPjApO3RoaXMuc2V0KCJkYXRhTG9hZGVkV2l0aE5vbkVtcHR5SHBhcmFtcyIsdCksdGhpcy5zZXQoImRhdGFMb2FkZWRXaXRoRW1wdHlIcGFyYW1zIiwhdCl9X2NvbXB1dGVIUGFyYW1zKCl7Y29uc3QgdD1bXTt0aGlzLl9leHBlcmltZW50LmhwYXJhbUluZm9zLmZvckVhY2goKChlLG4pPT57Y29uc3QgaT17aW5mbzplLGRpc3BsYXllZDpuPDUsZmlsdGVyOnt9fTtpLmluZm8uaGFzT3duUHJvcGVydHkoImRvbWFpbkRpc2NyZXRlIik/KGkuZmlsdGVyLmRvbWFpbkRpc2NyZXRlPVtdLGkuaW5mby5kb21haW5EaXNjcmV0ZS5mb3JFYWNoKCh0PT57aS5maWx0ZXIuZG9tYWluRGlzY3JldGUucHVzaCh7dmFsdWU6dCxjaGVja2VkOiEwfSl9KSkpOiJEQVRBX1RZUEVfQk9PTCI9PT1pLmluZm8udHlwZT9pLmZpbHRlci5kb21haW5EaXNjcmV0ZT1be3ZhbHVlOiExLGNoZWNrZWQ6ITB9LHt2YWx1ZTohMCxjaGVja2VkOiEwfV06IkRBVEFfVFlQRV9GTE9BVDY0Ij09PWkuaW5mby50eXBlP2kuZmlsdGVyLmludGVydmFsPXttaW46e3ZhbHVlOiIiLGludmFsaWQ6ITF9LG1heDp7dmFsdWU6IiIsaW52YWxpZDohMX19OiJEQVRBX1RZUEVfU1RSSU5HIj09PWkuaW5mby50eXBlP2kuZmlsdGVyLnJlZ2V4cD0iIjpjb25zb2xlLndhcm4oInVua25vd24gaHBhcmFtLmluZm8udHlwZTogJXMiLGkuaW5mby50eXBlKSx0LnB1c2goaSl9KSksdGhpcy5zZXQoIl9ocGFyYW1zIix0KX1fY29tcHV0ZU1ldHJpY3MoKXtjb25zdCB0PVtdO3RoaXMuX2V4cGVyaW1lbnQubWV0cmljSW5mb3MuZm9yRWFjaCgoKGUsbik9Pnt0LnB1c2goe2luZm86ZSxmaWx0ZXI6e2ludGVydmFsOnttaW46e3ZhbHVlOiIiLGludmFsaWQ6ITF9LG1heDp7dmFsdWU6IiIsaW52YWxpZDohMX19fSxkaXNwbGF5ZWQ6bjw1fSl9KSksdGhpcy5zZXQoIl9tZXRyaWNzIix0KX1fY29tcHV0ZVNjaGVtYSgpe3JldHVybiB0aGlzLl9ocGFyYW1zJiZ0aGlzLl9tZXRyaWNzP3tocGFyYW1Db2x1bW5zOnRoaXMuX2hwYXJhbXMubWFwKCh0PT4oe2hwYXJhbUluZm86dC5pbmZvfSkpKSxtZXRyaWNDb2x1bW5zOnRoaXMuX21ldHJpY3MubWFwKCh0PT4oe21ldHJpY0luZm86dC5pbmZvfSkpKX06e2hwYXJhbUNvbHVtbnM6W10sbWV0cmljQ29sdW1uczpbXX19X3VwZGF0ZUNvbmZpZ3VyYXRpb24oKXt0aGlzLmRlYm91bmNlKCJfdXBkYXRlQ29uZmlndXJhdGlvbiIsKCgpPT57dGhpcy5jb25maWd1cmF0aW9uPXtzY2hlbWE6dGhpcy5fY29tcHV0ZVNjaGVtYSgpLGNvbHVtbnNWaXNpYmlsaXR5OnRoaXMuX2NvbXB1dGVDb2x1bW5zVmlzaWJpbGl0eSgpLHZpc2libGVTY2hlbWE6dGhpcy5fY29tcHV0ZVZpc2libGVTY2hlbWEoKX19KSl9X2NvbXB1dGVDb2x1bW5zVmlzaWJpbGl0eSgpe3JldHVybiB0aGlzLl9ocGFyYW1zJiZ0aGlzLl9tZXRyaWNzP3RoaXMuX2hwYXJhbXMubWFwKCh0PT50LmRpc3BsYXllZCkpLmNvbmNhdCh0aGlzLl9tZXRyaWNzLm1hcCgodD0+dC5kaXNwbGF5ZWQpKSk6W119X2NvbXB1dGVWaXNpYmxlU2NoZW1hKCl7aWYoIXRoaXMuX2hwYXJhbXN8fCF0aGlzLl9tZXRyaWNzKXJldHVybntocGFyYW1JbmZvczpbXSxtZXRyaWNJbmZvczpbXX07cmV0dXJue2hwYXJhbUluZm9zOnRoaXMuX2hwYXJhbXMuZmlsdGVyKCh0PT50LmRpc3BsYXllZCkpLm1hcCgodD0+dC5pbmZvKSksbWV0cmljSW5mb3M6dGhpcy5fbWV0cmljcy5maWx0ZXIoKHQ9PnQuZGlzcGxheWVkKSkubWFwKCh0PT50LmluZm8pKX19X3F1ZXJ5U2VydmVyKCl7dGhpcy5kZWJvdW5jZSgicXVlcnlTZXJ2ZXIiLCgoKT0+dGhpcy5fcXVlcnlTZXJ2ZXJOb0RlYm91bmNlKCkpLDEwMCl9X3F1ZXJ5U2VydmVyTm9EZWJvdW5jZSgpe2lmKHRoaXMuX2hwYXJhbXMmJnRoaXMuX21ldHJpY3MpcmV0dXJuIHRoaXMuX3NlbmRMaXN0U2Vzc2lvbkdyb3Vwc1JlcXVlc3QoKS50aGVuKHRoaXMuX2xpc3RTZXNzaW9uR3JvdXBzQ2FuY2VsbGVyLmNhbmNlbGxhYmxlKCgoe3ZhbHVlOnQsY2FuY2VsbGVkOmV9KT0+e2lmKCFlKXtpZih0LnRvdGFsU2l6ZT49MCl7dGhpcy5zZXQoIl9wYWdlQ291bnRTdHIiLFN0cmluZyhNYXRoLmNlaWwodC50b3RhbFNpemUvK3RoaXMuX3BhZ2VTaXplSW5wdXQudmFsdWUpKSksdGhpcy5zZXQoIl90b3RhbFNlc3Npb25Hcm91cHNDb3VudFN0ciIsdC50b3RhbFNpemUpfWVsc2UgdGhpcy5zZXQoIl9wYWdlQ291bnRTdHIiLCI/IiksdGhpcy5zZXQoIl90b3RhbFNlc3Npb25Hcm91cHNDb3VudFN0ciIsIlVua25vd24iKTtaSnQodGhpcywic2Vzc2lvbkdyb3VwcyIsdC5zZXNzaW9uR3JvdXBzKX19KSkpfV9zZW5kTGlzdFNlc3Npb25Hcm91cHNSZXF1ZXN0KCl7Y29uc3QgdD10aGlzLl9idWlsZExpc3RTZXNzaW9uR3JvdXBzUmVxdWVzdCgpO2lmKG51bGwhPT10KXJldHVybiB0aGlzLnNldCgiX3Nlc3Npb25Hcm91cHNSZXF1ZXN0Iix0KSx0aGlzLl9saXN0U2Vzc2lvbkdyb3Vwc0NhbmNlbGxlci5jYW5jZWxBbGwoKSx0aGlzLmJhY2tlbmQubGlzdFNlc3Npb25Hcm91cHModCl9X2J1aWxkTGlzdFNlc3Npb25Hcm91cHNSZXF1ZXN0KCl7Y29uc3QgdD10aGlzO2xldCBlPSEwO2Z1bmN0aW9uIG4obil7Y29uc3QgaT10LmdldChuKyIubWluLnZhbHVlIik7Y29uc29sZS5hc3NlcnQodm9pZCAwIT09aSk7Y29uc3Qgcj0iIj09PWk/Ii1JbmZpbml0eSI6K2k7dC5zZXQobisiLm1pbi5pbnZhbGlkIixpc05hTihyKSksZT1lJiYhaXNOYU4ocik7Y29uc3Qgbz10LmdldChuKyIubWF4LnZhbHVlIik7Y29uc29sZS5hc3NlcnQodm9pZCAwIT09byk7Y29uc3QgYT0iIj09PW8/IkluZmluaXR5IjorbztyZXR1cm4gdC5zZXQobisiLm1heC5pbnZhbGlkIixpc05hTihhKSksZT1lJiYhaXNOYU4oYSksaXNOYU4ocil8fGlzTmFOKGEpP251bGw6e21pblZhbHVlOnIsbWF4VmFsdWU6YX19ZnVuY3Rpb24gaShuKXtjb25zdCBpPXQuZ2V0KG4rIi52YWx1ZSIpO2NvbnNvbGUuYXNzZXJ0KHZvaWQgMCE9PWkpO2NvbnN0IHI9K2ksbz1OdW1iZXIuaXNJbnRlZ2VyKHIpJiZyPjA7cmV0dXJuIHQuc2V0KG4rIi5pbnZhbGlkIiwhbyksZT1lJiZvLG8/cjpudWxsfWNvbnN0IHI9dGhpcy5fc3RhdHVzZXMuZmlsdGVyKCh0PT50LmFsbG93ZWQpKS5tYXAoKHQ9PnQudmFsdWUpKTtsZXQgbz1bXTtpZih0aGlzLl9ocGFyYW1zLmZvckVhY2goKCh0LGUpPT57bGV0IGk9e2hwYXJhbTp0LmluZm8ubmFtZX07aWYodC5maWx0ZXIuZG9tYWluRGlzY3JldGUpaS5maWx0ZXJEaXNjcmV0ZT1bXSx0LmZpbHRlci5kb21haW5EaXNjcmV0ZS5mb3JFYWNoKCh0PT57dC5jaGVja2VkJiZpLmZpbHRlckRpc2NyZXRlLnB1c2godC52YWx1ZSl9KSk7ZWxzZSBpZih0LmZpbHRlci5pbnRlcnZhbClpLmZpbHRlckludGVydmFsPW4oIl9ocGFyYW1zLiIrZSsiLmZpbHRlci5pbnRlcnZhbCIpO2Vsc2V7aWYoIXQuZmlsdGVyLnJlZ2V4cClyZXR1cm4gY29uc29sZS5lcnJvcigiaHBhcmFtLmZpbHRlciB3aXRoIG5vIGRvbWFpbkRpc2NyZXRlLCBpbnRlcnZhbCBvciByZWdleHAgcHJvcGVydGllcyBzZXQ6ICVzIix0KSxudWxsO2kuZmlsdGVyUmVnZXhwPXQuZmlsdGVyLnJlZ2V4cH1vLnB1c2goaSl9KSksdGhpcy5fbWV0cmljcy5mb3JFYWNoKCgodCxlKT0+e2xldCBpPXttZXRyaWM6dC5pbmZvLm5hbWUsZmlsdGVySW50ZXJ2YWw6bigiX21ldHJpY3MuIitlKyIuZmlsdGVyLmludGVydmFsIil9O28ucHVzaChpKX0pKSx2b2lkIDAhPT10aGlzLl9zb3J0QnlJbmRleCYmdm9pZCAwIT09dGhpcy5fc29ydERpcmVjdGlvbil7aWYoISh0aGlzLl9zb3J0QnlJbmRleCBpbiBvKSlyZXR1cm4gY29uc29sZS5lcnJvcigiTm8gY29sdW1uIGluIGNvbFBhcmFtcyB3aXRoIGluZGV4IHNvcnRCeUluZGV4OiAlcyIsdGhpcy5fc29ydEJ5SW5kZXgpLG51bGw7b1t0aGlzLl9zb3J0QnlJbmRleF0ub3JkZXI9MD09PXRoaXMuX3NvcnREaXJlY3Rpb24/Ik9SREVSX0FTQyI6Ik9SREVSX0RFU0MifWNvbnN0IGE9aSgiX3BhZ2VOdW1iZXJJbnB1dCIpLHM9aSgiX3BhZ2VTaXplSW5wdXQiKTtpZighZSlyZXR1cm4gbnVsbDtyZXR1cm57ZXhwZXJpbWVudE5hbWU6dGhpcy5leHBlcmltZW50TmFtZSxhbGxvd2VkU3RhdHVzZXM6cixjb2xQYXJhbXM6byxzdGFydEluZGV4OnMqKGEtMSksc2xpY2VTaXplOnN9fV9tZXRyaWNTb3J0QnlJbmRleCh0KXtyZXR1cm4gdCt0aGlzLl9ocGFyYW1zLmxlbmd0aH19O2NRdC50ZW1wbGF0ZT14ZWAKICAgIDxocGFyYW1zLXNwbGl0LWxheW91dCBvcmllbnRhdGlvbj0idmVydGljYWwiPgogICAgICA8ZGl2IHNsb3Q9ImNvbnRlbnQiIGNsYXNzPSJzZWN0aW9uIGh5cGVycGFyYW1ldGVycyI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+SHlwZXJwYXJhbWV0ZXJzPC9kaXY+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tfaHBhcmFtc319IiBhcz0iaHBhcmFtIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhwYXJhbSI+CiAgICAgICAgICAgIDxwYXBlci1jaGVja2JveAogICAgICAgICAgICAgIGNoZWNrZWQ9Int7aHBhcmFtLmRpc3BsYXllZH19IgogICAgICAgICAgICAgIGNsYXNzPSJocGFyYW0tY2hlY2tib3giCiAgICAgICAgICAgID4KICAgICAgICAgICAgICBbW19ocGFyYW1OYW1lKGhwYXJhbS5pbmZvKV1dCiAgICAgICAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICAgIDwhLS0gUHJlY2lzZWx5IG9uZSBvZiB0aGUgdGVtcGxhdGVzIGJlbG93IHdpbGwgYmUgc3RhbXBlZC4tLT4KICAgICAgICAgICAgPCEtLSAxLiBBIGxpc3Qgb2YgY2hlY2tib3hlcyAtLT4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hwYXJhbS5maWx0ZXIuZG9tYWluRGlzY3JldGVdXSI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlCiAgICAgICAgICAgICAgICBpcz0iZG9tLXJlcGVhdCIKICAgICAgICAgICAgICAgIGl0ZW1zPSJbW2hwYXJhbS5maWx0ZXIuZG9tYWluRGlzY3JldGVdXSIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3gKICAgICAgICAgICAgICAgICAgY2hlY2tlZD0ie3tpdGVtLmNoZWNrZWR9fSIKICAgICAgICAgICAgICAgICAgY2xhc3M9ImRpc2NyZXRlLXZhbHVlLWNoZWNrYm94IgogICAgICAgICAgICAgICAgICBvbi1jaGFuZ2U9Il9xdWVyeVNlcnZlciIKICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgW1tfcHJldHR5UHJpbnQoaXRlbS52YWx1ZSldXQogICAgICAgICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8IS0tIDIuIEEgbnVtZXJpYyBpbnRlcnZhbCAtLT4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hwYXJhbS5maWx0ZXIuaW50ZXJ2YWxdXSI+CiAgICAgICAgICAgICAgPHBhcGVyLWlucHV0CiAgICAgICAgICAgICAgICBsYWJlbD0iTWluIgogICAgICAgICAgICAgICAgdmFsdWU9Int7aHBhcmFtLmZpbHRlci5pbnRlcnZhbC5taW4udmFsdWV9fSIKICAgICAgICAgICAgICAgIGFsbG93ZWRfcGF0dGVybj0iWzAtOS5lXFwtXSIKICAgICAgICAgICAgICAgIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIKICAgICAgICAgICAgICAgIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiCiAgICAgICAgICAgICAgICBpbnZhbGlkPSJbW2hwYXJhbS5maWx0ZXIuaW50ZXJ2YWwubWluLmludmFsaWRdXSIKICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSItaW5maW5pdHkiCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgICAgPHBhcGVyLWlucHV0CiAgICAgICAgICAgICAgICBsYWJlbD0iTWF4IgogICAgICAgICAgICAgICAgdmFsdWU9Int7aHBhcmFtLmZpbHRlci5pbnRlcnZhbC5tYXgudmFsdWV9fSIKICAgICAgICAgICAgICAgIGFsbG93ZWRfcGF0dGVybj0iWzAtOS5lXFwtXSIKICAgICAgICAgICAgICAgIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIKICAgICAgICAgICAgICAgIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiCiAgICAgICAgICAgICAgICBpbnZhbGlkPSJbW2hwYXJhbS5maWx0ZXIuaW50ZXJ2YWwubWF4LmludmFsaWRdXSIKICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSIraW5maW5pdHkiCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwhLS0gMy4gQSByZWdleHAgLS0+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tocGFyYW0uZmlsdGVyLnJlZ2V4cF1dIj4KICAgICAgICAgICAgICA8cGFwZXItaW5wdXQKICAgICAgICAgICAgICAgIGxhYmVsPSJSZWd1bGFyIGV4cHJlc3Npb24iCiAgICAgICAgICAgICAgICB2YWx1ZT0ie3tocGFyYW0uZmlsdGVyLnJlZ2V4cH19IgogICAgICAgICAgICAgICAgb24tdmFsdWUtY2hhbmdlZD0iX3F1ZXJ5U2VydmVyIgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgc2xvdD0iY29udGVudCIgY2xhc3M9InNlY3Rpb24gbWV0cmljcyI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+TWV0cmljczwvZGl2PgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7X21ldHJpY3N9fSIgYXM9Im1ldHJpYyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJtZXRyaWMiPgogICAgICAgICAgICA8IS0tIFRPRE8oZXJleik6IE1ha2UgaXQgZWFzaWVyIHRvIGhhbmRsZSBhIGxhcmdlIG51bWJlciBvZgogICAgICAgICAgICAgICAgICBtZXRyaWNzOgogICAgICAgICAgICAgICAgICAxLiBBZGQgYW4gJ2lzb2xhdG9yJyByYWRpby1idXR0b24gdG8gc2VsZWN0IGp1c3Qgb25lCiAgICAgICAgICAgICAgICAgIG1ldHJpYyBhbmQKICAgICAgICAgICAgICAgICAgaGlkZSBhbGwgdGhlIHJlc3QKICAgICAgICAgICAgICAgICAgMi4gQWRkIGEgJ3RvZ2dsZS1hbGwnIGJ1dHRvbiB0aGF0IHdpbGwgaGlkZS91bmhpZGUKICAgICAgICAgICAgICAgICAgICBhbGwgdGhlCiAgICAgICAgICAgICAgICAgIG1ldHJpY3MuCiAgICAgICAgICAgICAgICAgIFVzZSBzaW1pbGFyIGxvZ2ljL2FwcGVhcmFuY2UgdG8gdGhlIHJ1bi1zZWxlY3RvciBvZgogICAgICAgICAgICAgICAgICBzY2FsYXJzLi0tPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3gKICAgICAgICAgICAgICBjaGVja2VkPSJ7e21ldHJpYy5kaXNwbGF5ZWR9fSIKICAgICAgICAgICAgICBjbGFzcz0ibWV0cmljLWNoZWNrYm94IgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgW1tfbWV0cmljTmFtZShtZXRyaWMuaW5mbyldXQogICAgICAgICAgICA8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbmxpbmUtZWxlbWVudCI+CiAgICAgICAgICAgICAgPHBhcGVyLWlucHV0CiAgICAgICAgICAgICAgICBsYWJlbD0iTWluIgogICAgICAgICAgICAgICAgdmFsdWU9Int7bWV0cmljLmZpbHRlci5pbnRlcnZhbC5taW4udmFsdWV9fSIKICAgICAgICAgICAgICAgIGFsbG93ZWQtcGF0dGVybj0iWzAtOS5lXFwtXSIKICAgICAgICAgICAgICAgIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIKICAgICAgICAgICAgICAgIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiCiAgICAgICAgICAgICAgICBpbnZhbGlkPSJ7e21ldHJpYy5maWx0ZXIuaW50ZXJ2YWwubWluLmludmFsaWR9fSIKICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSItaW5maW5pdHkiCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJpbmxpbmUtZWxlbWVudCI+CiAgICAgICAgICAgICAgPHBhcGVyLWlucHV0CiAgICAgICAgICAgICAgICBsYWJlbD0iTWF4IgogICAgICAgICAgICAgICAgYWxsb3dlZC1wYXR0ZXJuPSJbMC05LmVcXC1dIgogICAgICAgICAgICAgICAgdmFsdWU9Int7bWV0cmljLmZpbHRlci5pbnRlcnZhbC5tYXgudmFsdWV9fSIKICAgICAgICAgICAgICAgIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIKICAgICAgICAgICAgICAgIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiCiAgICAgICAgICAgICAgICBpbnZhbGlkPSJ7e21ldHJpYy5maWx0ZXIuaW50ZXJ2YWwubWF4LmludmFsaWR9fSIKICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPSIraW5maW5pdHkiCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgc2xvdD0iY29udGVudCIgY2xhc3M9InNlY3Rpb24gc3RhdHVzIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5TdGF0dXM8L2Rpdj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19zdGF0dXNlc11dIiBhcz0ic3RhdHVzIj4KICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjaGVja2VkPSJ7e3N0YXR1cy5hbGxvd2VkfX0iIG9uLWNoYW5nZT0iX3F1ZXJ5U2VydmVyIj4KICAgICAgICAgICAgW1tzdGF0dXMuZGlzcGxheU5hbWVdXQogICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzbG90PSJjb250ZW50IiBjbGFzcz0ic2VjdGlvbiBzb3J0aW5nIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZWN0aW9uLXRpdGxlIj5Tb3J0aW5nPC9kaXY+CiAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUKICAgICAgICAgIGxhYmVsPSJTb3J0IGJ5IgogICAgICAgICAgb24tc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiCiAgICAgICAgICBob3Jpem9udGFsLWFsaWduPSJsZWZ0IgogICAgICAgID4KICAgICAgICAgIDxwYXBlci1saXN0Ym94CiAgICAgICAgICAgIGNsYXNzPSJkcm9wZG93bi1jb250ZW50IgogICAgICAgICAgICBzbG90PSJkcm9wZG93bi1jb250ZW50IgogICAgICAgICAgICBzZWxlY3RlZD0ie3tfc29ydEJ5SW5kZXh9fSIKICAgICAgICAgICAgb24tc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiCiAgICAgICAgICA+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2hwYXJhbXNdXSIgYXM9ImhwYXJhbSI+CiAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+IFtbX2hwYXJhbU5hbWUoaHBhcmFtLmluZm8pXV0gPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19tZXRyaWNzXV0iIGFzPSJtZXRyaWMiPgogICAgICAgICAgICAgIDxwYXBlci1pdGVtPiBbW19tZXRyaWNOYW1lKG1ldHJpYy5pbmZvKV1dIDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUKICAgICAgICAgIGxhYmVsPSJEaXJlY3Rpb24iCiAgICAgICAgICBvbi1zZWxlY3RlZC1pdGVtLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIKICAgICAgICAgIGhvcml6b250YWwtYWxpZ249ImxlZnQiCiAgICAgICAgPgogICAgICAgICAgPHBhcGVyLWxpc3Rib3gKICAgICAgICAgICAgY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiCiAgICAgICAgICAgIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiCiAgICAgICAgICAgIHNlbGVjdGVkPSJ7e19zb3J0RGlyZWN0aW9ufX0iCiAgICAgICAgICA+CiAgICAgICAgICAgIDxwYXBlci1pdGVtPkFzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0+RGVzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IHNsb3Q9ImNvbnRlbnQiIGNsYXNzPSJzZWN0aW9uIHBhZ2luZyI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+UGFnaW5nPC9kaXY+CiAgICAgICAgPGRpdj4KICAgICAgICAgIE51bWJlciBvZiBtYXRjaGluZyBzZXNzaW9uIGdyb3VwczogW1tfdG90YWxTZXNzaW9uR3JvdXBzQ291bnRTdHJdXQogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9ImlubGluZS1lbGVtZW50IHBhZ2UtbnVtYmVyLWlucHV0Ij4KICAgICAgICAgIDxwYXBlci1pbnB1dAogICAgICAgICAgICBsYWJlbD0iUGFnZSAjIgogICAgICAgICAgICB2YWx1ZT0ie3tfcGFnZU51bWJlcklucHV0LnZhbHVlfX0iCiAgICAgICAgICAgIGFsbG93ZWQtcGF0dGVybj0iWzAtOV0iCiAgICAgICAgICAgIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiCiAgICAgICAgICAgIGludmFsaWQ9IltbX3BhZ2VOdW1iZXJJbnB1dC5pbnZhbGlkXV0iCiAgICAgICAgICAgIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIKICAgICAgICAgID4KICAgICAgICAgICAgPGRpdiBzbG90PSJzdWZmaXgiIGNsYXNzPSJwYWdlLXN1ZmZpeCI+LyBbW19wYWdlQ291bnRTdHJdXTwvZGl2PgogICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJpbmxpbmUtZWxlbWVudCBwYWdlLXNpemUtaW5wdXQiPgogICAgICAgICAgPHBhcGVyLWlucHV0CiAgICAgICAgICAgIGxhYmVsPSJNYXggIyBvZiBzZXNzaW9uIGdyb3VwcyBwZXIgcGFnZToiCiAgICAgICAgICAgIHZhbHVlPSJ7e19wYWdlU2l6ZUlucHV0LnZhbHVlfX0iCiAgICAgICAgICAgIGFsbG93ZWQtcGF0dGVybj0iWzAtOV0iCiAgICAgICAgICAgIGVycm9yLW1lc3NhZ2U9IkludmFsaWQgaW5wdXQiCiAgICAgICAgICAgIGludmFsaWQ9IltbX3BhZ2VTaXplSW5wdXQuaW52YWxpZF1dIgogICAgICAgICAgICBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiCiAgICAgICAgICA+CiAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzbG90PSJjb250ZW50IiBjbGFzcz0ic2VjdGlvbiBkb3dubG9hZCI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zZXNzaW9uR3JvdXBzUmVxdWVzdF1dIj4KICAgICAgICAgIERvd25sb2FkIGRhdGEgYXMKICAgICAgICAgIDxzcGFuPgogICAgICAgICAgICA8YQogICAgICAgICAgICAgIGlkPSJjc3ZMaW5rIgogICAgICAgICAgICAgIGRvd25sb2FkPSJocGFyYW1zX3RhYmxlLmNzdiIKICAgICAgICAgICAgICBocmVmPSJbW19jc3ZVcmwoX3Nlc3Npb25Hcm91cHNSZXF1ZXN0LCBjb25maWd1cmF0aW9uKV1dIgogICAgICAgICAgICAgID5DU1Y8L2EKICAgICAgICAgICAgPgogICAgICAgICAgICA8YQogICAgICAgICAgICAgIGlkPSJqc29uTGluayIKICAgICAgICAgICAgICBkb3dubG9hZD0iaHBhcmFtc190YWJsZS5qc29uIgogICAgICAgICAgICAgIGhyZWY9IltbX2pzb25VcmwoX3Nlc3Npb25Hcm91cHNSZXF1ZXN0LCBjb25maWd1cmF0aW9uKV1dIgogICAgICAgICAgICAgID5KU09OPC9hCiAgICAgICAgICAgID4KICAgICAgICAgICAgPGEKICAgICAgICAgICAgICBpZD0ibGF0ZXhMaW5rIgogICAgICAgICAgICAgIGRvd25sb2FkPSJocGFyYW1zX3RhYmxlLnRleCIKICAgICAgICAgICAgICBocmVmPSJbW19sYXRleFVybChfc2Vzc2lvbkdyb3Vwc1JlcXVlc3QsIGNvbmZpZ3VyYXRpb24pXV0iCiAgICAgICAgICAgICAgPkxhVGVYPC9hCiAgICAgICAgICAgID4KICAgICAgICAgIDwvc3Bhbj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvaHBhcmFtcy1zcGxpdC1sYXlvdXQ+CiAgICA8c3R5bGU+CiAgICAgIC5zZWN0aW9uIHsKICAgICAgICBwYWRkaW5nOiAxMHB4OwogICAgICB9CiAgICAgIC5zZWN0aW9uLXRpdGxlIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgICBtYXJnaW4tYm90dG9tOiA3cHg7CiAgICAgIH0KICAgICAgLmRpc2NyZXRlLXZhbHVlLWNoZWNrYm94LAogICAgICAubWV0cmljLWNoZWNrYm94LAogICAgICAuaHBhcmFtLWNoZWNrYm94IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAuZGlzY3JldGUtdmFsdWUtY2hlY2tib3ggewogICAgICAgIG1hcmdpbi1sZWZ0OiAyMHB4OwogICAgICB9CiAgICAgIC5ocGFyYW0sCiAgICAgIC5tZXRyaWMgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5pbmxpbmUtZWxlbWVudCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiA0MCU7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDEwcHg7CiAgICAgIH0KICAgICAgLnBhZ2UtbnVtYmVyLWlucHV0IHsKICAgICAgICB3aWR0aDogMjAlOwogICAgICB9CiAgICAgIC5wYWdlLXNpemUtaW5wdXQgewogICAgICAgIHdpZHRoOiA2MCU7CiAgICAgIH0KICAgICAgdmFhZGluLXNwbGl0LWxheW91dCB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIHBhcGVyLWxpc3Rib3ggewogICAgICAgIG1heC1oZWlnaHQ6IDE1ZW07CiAgICAgIH0KICAgICAgLnBhZ2Utc3VmZml4IHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sY1F0LnByb3RvdHlwZSwiZXhwZXJpbWVudE5hbWUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGNRdC5wcm90b3R5cGUsImNvbmZpZ3VyYXRpb24iLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheSxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sY1F0LnByb3RvdHlwZSwic2Vzc2lvbkdyb3VwcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxjUXQucHJvdG90eXBlLCJkYXRhTG9hZGVkV2l0aE5vbkVtcHR5SHBhcmFtcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4sbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxjUXQucHJvdG90eXBlLCJkYXRhTG9hZGVkV2l0aEVtcHR5SHBhcmFtcyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxjUXQucHJvdG90eXBlLCJfZXhwZXJpbWVudCIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sY1F0LnByb3RvdHlwZSwiX2hwYXJhbXMiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLGNRdC5wcm90b3R5cGUsIl9tZXRyaWNzIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sY1F0LnByb3RvdHlwZSwiX3N0YXR1c2VzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGNRdC5wcm90b3R5cGUsIl9nZXRFeHBlcmltZW50UmVzb2x2ZWQiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pXSxjUXQucHJvdG90eXBlLCJfcmVzb2x2ZUdldEV4cGVyaW1lbnQiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sY1F0LnByb3RvdHlwZSwiX2xpc3RTZXNzaW9uR3JvdXBzQ2FuY2VsbGVyIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLGNRdC5wcm90b3R5cGUsIl9zb3J0QnlJbmRleCIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxjUXQucHJvdG90eXBlLCJfc29ydERpcmVjdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxjUXQucHJvdG90eXBlLCJfcGFnZVNpemVJbnB1dCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxjUXQucHJvdG90eXBlLCJfcGFnZU51bWJlcklucHV0Iix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLGNRdC5wcm90b3R5cGUsIl9wYWdlQ291bnRTdHIiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sY1F0LnByb3RvdHlwZSwiX3RvdGFsU2Vzc2lvbkdyb3Vwc0NvdW50U3RyIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGNRdC5wcm90b3R5cGUsIl9zZXNzaW9uR3JvdXBzUmVxdWVzdCIsdm9pZCAwKSx0KFthKCJiYWNrZW5kIiwiZXhwZXJpbWVudE5hbWUiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGNRdC5wcm90b3R5cGUsIl9jb21wdXRlRXhwZXJpbWVudEFuZFJlbGF0ZWRQcm9wcyIsbnVsbCksdChbYSgiX2hwYXJhbXMuKiIsIl9tZXRyaWNzLioiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLGNRdC5wcm90b3R5cGUsIl91cGRhdGVDb25maWd1cmF0aW9uIixudWxsKSxjUXQ9dChbaSgidGYtaHBhcmFtcy1xdWVyeS1wYW5lIildLGNRdCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgICogVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICAgKiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICAgKiBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgICogc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAgKi8KY29uc3QgdVF0PSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZudWxsIT13aW5kb3cuY3VzdG9tRWxlbWVudHMmJnZvaWQgMCE9PXdpbmRvdy5jdXN0b21FbGVtZW50cy5wb2x5ZmlsbFdyYXBGbHVzaENhbGxiYWNrLGhRdD0odCxlLG49bnVsbCk9Pntmb3IoO2UhPT1uOyl7Y29uc3Qgbj1lLm5leHRTaWJsaW5nO3QucmVtb3ZlQ2hpbGQoZSksZT1ufX0sZFF0PWB7e2xpdC0ke1N0cmluZyhNYXRoLnJhbmRvbSgpKS5zbGljZSgyKX19fWAscFF0PWBceDNjIS0tJHtkUXR9LS1ceDNlYCxmUXQ9bmV3IFJlZ0V4cChgJHtkUXR9fCR7cFF0fWApLG1RdD0iJGxpdCQiO2NsYXNzIGdRdHtjb25zdHJ1Y3Rvcih0LGUpe3RoaXMucGFydHM9W10sdGhpcy5lbGVtZW50PWU7Y29uc3Qgbj1bXSxpPVtdLHI9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihlLmNvbnRlbnQsMTMzLG51bGwsITEpO2xldCBvPTAsYT0tMSxzPTA7Y29uc3R7c3RyaW5nczpsLHZhbHVlczp7bGVuZ3RoOmN9fT10O2Zvcig7czxjOyl7Y29uc3QgdD1yLm5leHROb2RlKCk7aWYobnVsbCE9PXQpe2lmKGErKywxPT09dC5ub2RlVHlwZSl7aWYodC5oYXNBdHRyaWJ1dGVzKCkpe2NvbnN0IGU9dC5hdHRyaWJ1dGVzLHtsZW5ndGg6bn09ZTtsZXQgaT0wO2ZvcihsZXQgdD0wO3Q8bjt0KyspX1F0KGVbdF0ubmFtZSxtUXQpJiZpKys7Zm9yKDtpLS0gPjA7KXtjb25zdCBlPWJRdC5leGVjKGxbc10pWzJdLG49ZS50b0xvd2VyQ2FzZSgpK21RdCxpPXQuZ2V0QXR0cmlidXRlKG4pO3QucmVtb3ZlQXR0cmlidXRlKG4pO2NvbnN0IHI9aS5zcGxpdChmUXQpO3RoaXMucGFydHMucHVzaCh7dHlwZToiYXR0cmlidXRlIixpbmRleDphLG5hbWU6ZSxzdHJpbmdzOnJ9KSxzKz1yLmxlbmd0aC0xfX0iVEVNUExBVEUiPT09dC50YWdOYW1lJiYoaS5wdXNoKHQpLHIuY3VycmVudE5vZGU9dC5jb250ZW50KX1lbHNlIGlmKDM9PT10Lm5vZGVUeXBlKXtjb25zdCBlPXQuZGF0YTtpZihlLmluZGV4T2YoZFF0KT49MCl7Y29uc3QgaT10LnBhcmVudE5vZGUscj1lLnNwbGl0KGZRdCksbz1yLmxlbmd0aC0xO2ZvcihsZXQgZT0wO2U8bztlKyspe2xldCBuLG89cltlXTtpZigiIj09PW8pbj12UXQoKTtlbHNle2NvbnN0IHQ9YlF0LmV4ZWMobyk7bnVsbCE9PXQmJl9RdCh0WzJdLG1RdCkmJihvPW8uc2xpY2UoMCx0LmluZGV4KSt0WzFdK3RbMl0uc2xpY2UoMCwtbVF0Lmxlbmd0aCkrdFszXSksbj1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShvKX1pLmluc2VydEJlZm9yZShuLHQpLHRoaXMucGFydHMucHVzaCh7dHlwZToibm9kZSIsaW5kZXg6KythfSl9IiI9PT1yW29dPyhpLmluc2VydEJlZm9yZSh2UXQoKSx0KSxuLnB1c2godCkpOnQuZGF0YT1yW29dLHMrPW99fWVsc2UgaWYoOD09PXQubm9kZVR5cGUpaWYodC5kYXRhPT09ZFF0KXtjb25zdCBlPXQucGFyZW50Tm9kZTtudWxsIT09dC5wcmV2aW91c1NpYmxpbmcmJmEhPT1vfHwoYSsrLGUuaW5zZXJ0QmVmb3JlKHZRdCgpLHQpKSxvPWEsdGhpcy5wYXJ0cy5wdXNoKHt0eXBlOiJub2RlIixpbmRleDphfSksbnVsbD09PXQubmV4dFNpYmxpbmc/dC5kYXRhPSIiOihuLnB1c2godCksYS0tKSxzKyt9ZWxzZXtsZXQgZT0tMTtmb3IoOy0xIT09KGU9dC5kYXRhLmluZGV4T2YoZFF0LGUrMSkpOyl0aGlzLnBhcnRzLnB1c2goe3R5cGU6Im5vZGUiLGluZGV4Oi0xfSkscysrfX1lbHNlIHIuY3VycmVudE5vZGU9aS5wb3AoKX1mb3IoY29uc3QgdCBvZiBuKXQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KX19Y29uc3QgX1F0PSh0LGUpPT57Y29uc3Qgbj10Lmxlbmd0aC1lLmxlbmd0aDtyZXR1cm4gbj49MCYmdC5zbGljZShuKT09PWV9LHlRdD10PT4tMSE9PXQuaW5kZXgsdlF0PSgpPT5kb2N1bWVudC5jcmVhdGVDb21tZW50KCIiKSxiUXQ9LyhbIFx4MDlceDBhXHgwY1x4MGRdKShbXlwwLVx4MUZceDdGLVx4OUYgIic+PS9dKykoWyBceDA5XHgwYVx4MGNceDBkXSo9WyBceDA5XHgwYVx4MGNceDBkXSooPzpbXiBceDA5XHgwYVx4MGNceDBkIidgPD49XSp8IlteIl0qfCdbXiddKikpJC87ZnVuY3Rpb24geFF0KHQsZSl7Y29uc3R7ZWxlbWVudDp7Y29udGVudDpufSxwYXJ0czppfT10LHI9ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihuLDEzMyxudWxsLCExKTtsZXQgbz1TUXQoaSksYT1pW29dLHM9LTEsbD0wO2NvbnN0IGM9W107bGV0IHU9bnVsbDtmb3IoO3IubmV4dE5vZGUoKTspe3MrKztjb25zdCB0PXIuY3VycmVudE5vZGU7Zm9yKHQucHJldmlvdXNTaWJsaW5nPT09dSYmKHU9bnVsbCksZS5oYXModCkmJihjLnB1c2godCksbnVsbD09PXUmJih1PXQpKSxudWxsIT09dSYmbCsrO3ZvaWQgMCE9PWEmJmEuaW5kZXg9PT1zOylhLmluZGV4PW51bGwhPT11Py0xOmEuaW5kZXgtbCxvPVNRdChpLG8pLGE9aVtvXX1jLmZvckVhY2goKHQ9PnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSkpfWNvbnN0IHdRdD10PT57bGV0IGU9MTE9PT10Lm5vZGVUeXBlPzA6MTtjb25zdCBuPWRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIodCwxMzMsbnVsbCwhMSk7Zm9yKDtuLm5leHROb2RlKCk7KWUrKztyZXR1cm4gZX0sU1F0PSh0LGU9LTEpPT57Zm9yKGxldCBuPWUrMTtuPHQubGVuZ3RoO24rKyl7aWYoeVF0KHRbbl0pKXJldHVybiBufXJldHVybi0xfTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICAgKiBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgICAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgICAqIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICAgKiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICAqLwpjb25zdCBNUXQ9bmV3IFdlYWtNYXAsRVF0PXt9LFRRdD17fTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICAgKiBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgICAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgICAqIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICAgKiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICAqLwpjbGFzcyBDUXR7Y29uc3RydWN0b3IodCxlLG4pe3RoaXMuX19wYXJ0cz1bXSx0aGlzLnRlbXBsYXRlPXQsdGhpcy5wcm9jZXNzb3I9ZSx0aGlzLm9wdGlvbnM9bn11cGRhdGUodCl7bGV0IGU9MDtmb3IoY29uc3QgbiBvZiB0aGlzLl9fcGFydHMpdm9pZCAwIT09biYmbi5zZXRWYWx1ZSh0W2VdKSxlKys7Zm9yKGNvbnN0IHQgb2YgdGhpcy5fX3BhcnRzKXZvaWQgMCE9PXQmJnQuY29tbWl0KCl9X2Nsb25lKCl7Y29uc3QgdD11UXQ/dGhpcy50ZW1wbGF0ZS5lbGVtZW50LmNvbnRlbnQuY2xvbmVOb2RlKCEwKTpkb2N1bWVudC5pbXBvcnROb2RlKHRoaXMudGVtcGxhdGUuZWxlbWVudC5jb250ZW50LCEwKSxlPVtdLG49dGhpcy50ZW1wbGF0ZS5wYXJ0cyxpPWRvY3VtZW50LmNyZWF0ZVRyZWVXYWxrZXIodCwxMzMsbnVsbCwhMSk7bGV0IHIsbz0wLGE9MCxzPWkubmV4dE5vZGUoKTtmb3IoO288bi5sZW5ndGg7KWlmKHI9bltvXSx5UXQocikpe2Zvcig7YTxyLmluZGV4OylhKyssIlRFTVBMQVRFIj09PXMubm9kZU5hbWUmJihlLnB1c2gocyksaS5jdXJyZW50Tm9kZT1zLmNvbnRlbnQpLG51bGw9PT0ocz1pLm5leHROb2RlKCkpJiYoaS5jdXJyZW50Tm9kZT1lLnBvcCgpLHM9aS5uZXh0Tm9kZSgpKTtpZigibm9kZSI9PT1yLnR5cGUpe2NvbnN0IHQ9dGhpcy5wcm9jZXNzb3IuaGFuZGxlVGV4dEV4cHJlc3Npb24odGhpcy5vcHRpb25zKTt0Lmluc2VydEFmdGVyTm9kZShzLnByZXZpb3VzU2libGluZyksdGhpcy5fX3BhcnRzLnB1c2godCl9ZWxzZSB0aGlzLl9fcGFydHMucHVzaCguLi50aGlzLnByb2Nlc3Nvci5oYW5kbGVBdHRyaWJ1dGVFeHByZXNzaW9ucyhzLHIubmFtZSxyLnN0cmluZ3MsdGhpcy5vcHRpb25zKSk7bysrfWVsc2UgdGhpcy5fX3BhcnRzLnB1c2godm9pZCAwKSxvKys7cmV0dXJuIHVRdCYmKGRvY3VtZW50LmFkb3B0Tm9kZSh0KSxjdXN0b21FbGVtZW50cy51cGdyYWRlKHQpKSx0fX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICAgKiBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgICAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgICAqIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICAgKiBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICAqL2NvbnN0IEFRdD13aW5kb3cudHJ1c3RlZFR5cGVzJiZ0cnVzdGVkVHlwZXMuY3JlYXRlUG9saWN5KCJsaXQtaHRtbCIse2NyZWF0ZUhUTUw6dD0+dH0pLGtRdD1gICR7ZFF0fSBgO2NsYXNzIExRdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLnZhbHVlPXZvaWQgMCx0aGlzLl9fcGVuZGluZ1ZhbHVlPXZvaWQgMCx0aGlzLm9wdGlvbnM9dH1hcHBlbmRJbnRvKHQpe3RoaXMuc3RhcnROb2RlPXQuYXBwZW5kQ2hpbGQodlF0KCkpLHRoaXMuZW5kTm9kZT10LmFwcGVuZENoaWxkKHZRdCgpKX1pbnNlcnRBZnRlck5vZGUodCl7dGhpcy5zdGFydE5vZGU9dCx0aGlzLmVuZE5vZGU9dC5uZXh0U2libGluZ31hcHBlbmRJbnRvUGFydCh0KXt0Ll9faW5zZXJ0KHRoaXMuc3RhcnROb2RlPXZRdCgpKSx0Ll9faW5zZXJ0KHRoaXMuZW5kTm9kZT12UXQoKSl9aW5zZXJ0QWZ0ZXJQYXJ0KHQpe3QuX19pbnNlcnQodGhpcy5zdGFydE5vZGU9dlF0KCkpLHRoaXMuZW5kTm9kZT10LmVuZE5vZGUsdC5lbmROb2RlPXRoaXMuc3RhcnROb2RlfXNldFZhbHVlKHQpe3RoaXMuX19wZW5kaW5nVmFsdWU9dH1jb21taXQoKXtpZihudWxsPT09dGhpcy5zdGFydE5vZGUucGFyZW50Tm9kZSlyZXR1cm47Zm9yKDsiZnVuY3Rpb24iPT10eXBlb2YodD10aGlzLl9fcGVuZGluZ1ZhbHVlKSYmTVF0Lmhhcyh0KTspe2NvbnN0IHQ9dGhpcy5fX3BlbmRpbmdWYWx1ZTt0aGlzLl9fcGVuZGluZ1ZhbHVlPUVRdCx0KHRoaXMpfXZhciB0O2NvbnN0IGU9dGhpcy5fX3BlbmRpbmdWYWx1ZTtlIT09RVF0JiYoKHQ9Pm51bGw9PT10fHwhKCJvYmplY3QiPT10eXBlb2YgdHx8ImZ1bmN0aW9uIj09dHlwZW9mIHQpKShlKT9lIT09dGhpcy52YWx1ZSYmdGhpcy5fX2NvbW1pdFRleHQoZSk6ZSBpbnN0YW5jZW9mIGNsYXNze2NvbnN0cnVjdG9yKHQsZSxuLGkpe3RoaXMuc3RyaW5ncz10LHRoaXMudmFsdWVzPWUsdGhpcy50eXBlPW4sdGhpcy5wcm9jZXNzb3I9aX1nZXRIVE1MKCl7Y29uc3QgdD10aGlzLnN0cmluZ3MubGVuZ3RoLTE7bGV0IGU9IiIsbj0hMTtmb3IobGV0IGk9MDtpPHQ7aSsrKXtjb25zdCB0PXRoaXMuc3RyaW5nc1tpXSxyPXQubGFzdEluZGV4T2YoIlx4M2MhLS0iKTtuPShyPi0xfHxuKSYmLTE9PT10LmluZGV4T2YoIi0tXHgzZSIscisxKTtjb25zdCBvPWJRdC5leGVjKHQpO2UrPW51bGw9PT1vP3QrKG4/a1F0OnBRdCk6dC5zdWJzdHIoMCxvLmluZGV4KStvWzFdK29bMl0rbVF0K29bM10rZFF0fXJldHVybiBlKz10aGlzLnN0cmluZ3NbdF0sZX1nZXRUZW1wbGF0ZUVsZW1lbnQoKXtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIik7bGV0IGU9dGhpcy5nZXRIVE1MKCk7cmV0dXJuIHZvaWQgMCE9PUFRdCYmKGU9QVF0LmNyZWF0ZUhUTUwoZSkpLHQuaW5uZXJIVE1MPWUsdH19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgICogVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICAgKiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICAgKiBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgICogc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAgKi8/dGhpcy5fX2NvbW1pdFRlbXBsYXRlUmVzdWx0KGUpOmUgaW5zdGFuY2VvZiBOb2RlP3RoaXMuX19jb21taXROb2RlKGUpOih0PT5BcnJheS5pc0FycmF5KHQpfHwhKCF0fHwhdFtTeW1ib2wuaXRlcmF0b3JdKSkoZSk/dGhpcy5fX2NvbW1pdEl0ZXJhYmxlKGUpOmU9PT1UUXQ/KHRoaXMudmFsdWU9VFF0LHRoaXMuY2xlYXIoKSk6dGhpcy5fX2NvbW1pdFRleHQoZSkpfV9faW5zZXJ0KHQpe3RoaXMuZW5kTm9kZS5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0LHRoaXMuZW5kTm9kZSl9X19jb21taXROb2RlKHQpe3RoaXMudmFsdWUhPT10JiYodGhpcy5jbGVhcigpLHRoaXMuX19pbnNlcnQodCksdGhpcy52YWx1ZT10KX1fX2NvbW1pdFRleHQodCl7Y29uc3QgZT10aGlzLnN0YXJ0Tm9kZS5uZXh0U2libGluZyxuPSJzdHJpbmciPT10eXBlb2YodD1udWxsPT10PyIiOnQpP3Q6U3RyaW5nKHQpO2U9PT10aGlzLmVuZE5vZGUucHJldmlvdXNTaWJsaW5nJiYzPT09ZS5ub2RlVHlwZT9lLmRhdGE9bjp0aGlzLl9fY29tbWl0Tm9kZShkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuKSksdGhpcy52YWx1ZT10fV9fY29tbWl0VGVtcGxhdGVSZXN1bHQodCl7Y29uc3QgZT10aGlzLm9wdGlvbnMudGVtcGxhdGVGYWN0b3J5KHQpO2lmKHRoaXMudmFsdWUgaW5zdGFuY2VvZiBDUXQmJnRoaXMudmFsdWUudGVtcGxhdGU9PT1lKXRoaXMudmFsdWUudXBkYXRlKHQudmFsdWVzKTtlbHNle2NvbnN0IG49bmV3IENRdChlLHQucHJvY2Vzc29yLHRoaXMub3B0aW9ucyksaT1uLl9jbG9uZSgpO24udXBkYXRlKHQudmFsdWVzKSx0aGlzLl9fY29tbWl0Tm9kZShpKSx0aGlzLnZhbHVlPW59fV9fY29tbWl0SXRlcmFibGUodCl7QXJyYXkuaXNBcnJheSh0aGlzLnZhbHVlKXx8KHRoaXMudmFsdWU9W10sdGhpcy5jbGVhcigpKTtjb25zdCBlPXRoaXMudmFsdWU7bGV0IG4saT0wO2Zvcihjb25zdCByIG9mIHQpbj1lW2ldLHZvaWQgMD09PW4mJihuPW5ldyBMUXQodGhpcy5vcHRpb25zKSxlLnB1c2gobiksMD09PWk/bi5hcHBlbmRJbnRvUGFydCh0aGlzKTpuLmluc2VydEFmdGVyUGFydChlW2ktMV0pKSxuLnNldFZhbHVlKHIpLG4uY29tbWl0KCksaSsrO2k8ZS5sZW5ndGgmJihlLmxlbmd0aD1pLHRoaXMuY2xlYXIobiYmbi5lbmROb2RlKSl9Y2xlYXIodD10aGlzLnN0YXJ0Tm9kZSl7aFF0KHRoaXMuc3RhcnROb2RlLnBhcmVudE5vZGUsdC5uZXh0U2libGluZyx0aGlzLmVuZE5vZGUpfX1sZXQgUFF0PSExOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgICAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgICogVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgICogQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgICAqIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgICovCmZ1bmN0aW9uIE5RdCh0KXtsZXQgZT1JUXQuZ2V0KHQudHlwZSk7dm9pZCAwPT09ZSYmKGU9e3N0cmluZ3NBcnJheTpuZXcgV2Vha01hcCxrZXlTdHJpbmc6bmV3IE1hcH0sSVF0LnNldCh0LnR5cGUsZSkpO2xldCBuPWUuc3RyaW5nc0FycmF5LmdldCh0LnN0cmluZ3MpO2lmKHZvaWQgMCE9PW4pcmV0dXJuIG47Y29uc3QgaT10LnN0cmluZ3Muam9pbihkUXQpO3JldHVybiBuPWUua2V5U3RyaW5nLmdldChpKSx2b2lkIDA9PT1uJiYobj1uZXcgZ1F0KHQsdC5nZXRUZW1wbGF0ZUVsZW1lbnQoKSksZS5rZXlTdHJpbmcuc2V0KGksbikpLGUuc3RyaW5nc0FycmF5LnNldCh0LnN0cmluZ3Msbiksbn0oKCk9Pnt0cnl7Y29uc3QgdD17Z2V0IGNhcHR1cmUoKXtyZXR1cm4gUFF0PSEwLCExfX07d2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInRlc3QiLHQsdCksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoInRlc3QiLHQsdCl9Y2F0Y2godCl7fX0pKCk7Y29uc3QgSVF0PW5ldyBNYXAsUlF0PW5ldyBXZWFrTWFwOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgICAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgICogVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgICogQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgICAqIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgICovCi8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgICogVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICAgKiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICAgKiBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgICogc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAgKi8KInVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJih3aW5kb3cubGl0SHRtbFZlcnNpb25zfHwod2luZG93LmxpdEh0bWxWZXJzaW9ucz1bXSkpLnB1c2goIjEuNC4xIik7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgICogVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICAgKiBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICAgKiBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgICogc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdAogICAgICogaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAgKi9jb25zdCBPUXQ9KHQsZSk9PmAke3R9LS0ke2V9YDtsZXQgelF0PSEwO3ZvaWQgMD09PXdpbmRvdy5TaGFkeUNTUz96UXQ9ITE6dm9pZCAwPT09d2luZG93LlNoYWR5Q1NTLnByZXBhcmVUZW1wbGF0ZURvbSYmKGNvbnNvbGUud2FybigiSW5jb21wYXRpYmxlIFNoYWR5Q1NTIHZlcnNpb24gZGV0ZWN0ZWQuIFBsZWFzZSB1cGRhdGUgdG8gYXQgbGVhc3QgQHdlYmNvbXBvbmVudHMvd2ViY29tcG9uZW50c2pzQDIuMC4yIGFuZCBAd2ViY29tcG9uZW50cy9zaGFkeWNzc0AxLjMuMS4iKSx6UXQ9ITEpO2NvbnN0IERRdD10PT5lPT57Y29uc3Qgbj1PUXQoZS50eXBlLHQpO2xldCBpPUlRdC5nZXQobik7dm9pZCAwPT09aSYmKGk9e3N0cmluZ3NBcnJheTpuZXcgV2Vha01hcCxrZXlTdHJpbmc6bmV3IE1hcH0sSVF0LnNldChuLGkpKTtsZXQgcj1pLnN0cmluZ3NBcnJheS5nZXQoZS5zdHJpbmdzKTtpZih2b2lkIDAhPT1yKXJldHVybiByO2NvbnN0IG89ZS5zdHJpbmdzLmpvaW4oZFF0KTtpZihyPWkua2V5U3RyaW5nLmdldChvKSx2b2lkIDA9PT1yKXtjb25zdCBuPWUuZ2V0VGVtcGxhdGVFbGVtZW50KCk7elF0JiZ3aW5kb3cuU2hhZHlDU1MucHJlcGFyZVRlbXBsYXRlRG9tKG4sdCkscj1uZXcgZ1F0KGUsbiksaS5rZXlTdHJpbmcuc2V0KG8scil9cmV0dXJuIGkuc3RyaW5nc0FycmF5LnNldChlLnN0cmluZ3Mscikscn0sQlF0PVsiaHRtbCIsInN2ZyJdLEhRdD1uZXcgU2V0LEZRdD0odCxlLG4pPT57SFF0LmFkZCh0KTtjb25zdCBpPW4/bi5lbGVtZW50OmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIikscj1lLnF1ZXJ5U2VsZWN0b3JBbGwoInN0eWxlIikse2xlbmd0aDpvfT1yO2lmKDA9PT1vKXJldHVybiB2b2lkIHdpbmRvdy5TaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGVTdHlsZXMoaSx0KTtjb25zdCBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7Zm9yKGxldCB0PTA7dDxvO3QrKyl7Y29uc3QgZT1yW3RdO2UucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChlKSxhLnRleHRDb250ZW50Kz1lLnRleHRDb250ZW50fSh0PT57QlF0LmZvckVhY2goKGU9Pntjb25zdCBuPUlRdC5nZXQoT1F0KGUsdCkpO3ZvaWQgMCE9PW4mJm4ua2V5U3RyaW5nLmZvckVhY2goKHQ9Pntjb25zdHtlbGVtZW50Ontjb250ZW50OmV9fT10LG49bmV3IFNldDtBcnJheS5mcm9tKGUucXVlcnlTZWxlY3RvckFsbCgic3R5bGUiKSkuZm9yRWFjaCgodD0+e24uYWRkKHQpfSkpLHhRdCh0LG4pfSkpfSkpfSkodCk7Y29uc3Qgcz1pLmNvbnRlbnQ7bj8oZnVuY3Rpb24gbCh0LGUsbj1udWxsKXtjb25zdHtlbGVtZW50Ontjb250ZW50Oml9LHBhcnRzOnJ9PXQ7aWYobnVsbD09bilyZXR1cm4gdm9pZCBpLmFwcGVuZENoaWxkKGUpO2NvbnN0IG89ZG9jdW1lbnQuY3JlYXRlVHJlZVdhbGtlcihpLDEzMyxudWxsLCExKTtsZXQgYT1TUXQocikscz0wLGw9LTE7Zm9yKDtvLm5leHROb2RlKCk7KWZvcihsKyssby5jdXJyZW50Tm9kZT09PW4mJihzPXdRdChlKSxuLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsbikpOy0xIT09YSYmclthXS5pbmRleD09PWw7KXtpZihzPjApe2Zvcig7LTEhPT1hOylyW2FdLmluZGV4Kz1zLGE9U1F0KHIsYSk7cmV0dXJufWE9U1F0KHIsYSl9fSkobixhLHMuZmlyc3RDaGlsZCk6cy5pbnNlcnRCZWZvcmUoYSxzLmZpcnN0Q2hpbGQpLHdpbmRvdy5TaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGVTdHlsZXMoaSx0KTtjb25zdCBjPXMucXVlcnlTZWxlY3Rvcigic3R5bGUiKTtpZih3aW5kb3cuU2hhZHlDU1MubmF0aXZlU2hhZG93JiZudWxsIT09YyllLmluc2VydEJlZm9yZShjLmNsb25lTm9kZSghMCksZS5maXJzdENoaWxkKTtlbHNlIGlmKG4pe3MuaW5zZXJ0QmVmb3JlKGEscy5maXJzdENoaWxkKTtjb25zdCB0PW5ldyBTZXQ7dC5hZGQoYSkseFF0KG4sdCl9fTt3aW5kb3cuSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eT0odCxlKT0+dDtjb25zdCBWUXQ9e3RvQXR0cmlidXRlKHQsZSl7c3dpdGNoKGUpe2Nhc2UgQm9vbGVhbjpyZXR1cm4gdD8iIjpudWxsO2Nhc2UgT2JqZWN0OmNhc2UgQXJyYXk6cmV0dXJuIG51bGw9PXQ/dDpKU09OLnN0cmluZ2lmeSh0KX1yZXR1cm4gdH0sZnJvbUF0dHJpYnV0ZSh0LGUpe3N3aXRjaChlKXtjYXNlIEJvb2xlYW46cmV0dXJuIG51bGwhPT10O2Nhc2UgTnVtYmVyOnJldHVybiBudWxsPT09dD9udWxsOk51bWJlcih0KTtjYXNlIE9iamVjdDpjYXNlIEFycmF5OnJldHVybiBKU09OLnBhcnNlKHQpfXJldHVybiB0fX0sVVF0PSh0LGUpPT5lIT09dCYmKGU9PWV8fHQ9PXQpLGpRdD17YXR0cmlidXRlOiEwLHR5cGU6U3RyaW5nLGNvbnZlcnRlcjpWUXQscmVmbGVjdDohMSxoYXNDaGFuZ2VkOlVRdH0sR1F0PSJmaW5hbGl6ZWQiO2NsYXNzIFdRdCBleHRlbmRzIEhUTUxFbGVtZW50e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmluaXRpYWxpemUoKX1zdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpe3RoaXMuZmluYWxpemUoKTtjb25zdCB0PVtdO3JldHVybiB0aGlzLl9jbGFzc1Byb3BlcnRpZXMuZm9yRWFjaCgoKGUsbik9Pntjb25zdCBpPXRoaXMuX2F0dHJpYnV0ZU5hbWVGb3JQcm9wZXJ0eShuLGUpO3ZvaWQgMCE9PWkmJih0aGlzLl9hdHRyaWJ1dGVUb1Byb3BlcnR5TWFwLnNldChpLG4pLHQucHVzaChpKSl9KSksdH1zdGF0aWMgX2Vuc3VyZUNsYXNzUHJvcGVydGllcygpe2lmKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoIl9jbGFzc1Byb3BlcnRpZXMiLHRoaXMpKSl7dGhpcy5fY2xhc3NQcm9wZXJ0aWVzPW5ldyBNYXA7Y29uc3QgdD1PYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcykuX2NsYXNzUHJvcGVydGllczt2b2lkIDAhPT10JiZ0LmZvckVhY2goKCh0LGUpPT50aGlzLl9jbGFzc1Byb3BlcnRpZXMuc2V0KGUsdCkpKX19c3RhdGljIGNyZWF0ZVByb3BlcnR5KHQsZT1qUXQpe2lmKHRoaXMuX2Vuc3VyZUNsYXNzUHJvcGVydGllcygpLHRoaXMuX2NsYXNzUHJvcGVydGllcy5zZXQodCxlKSxlLm5vQWNjZXNzb3J8fHRoaXMucHJvdG90eXBlLmhhc093blByb3BlcnR5KHQpKXJldHVybjtjb25zdCBuPSJzeW1ib2wiPT10eXBlb2YgdD9TeW1ib2woKTpgX18ke3R9YCxpPXRoaXMuZ2V0UHJvcGVydHlEZXNjcmlwdG9yKHQsbixlKTt2b2lkIDAhPT1pJiZPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcy5wcm90b3R5cGUsdCxpKX1zdGF0aWMgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKHQsZSxuKXtyZXR1cm57Z2V0KCl7cmV0dXJuIHRoaXNbZV19LHNldChpKXtjb25zdCByPXRoaXNbdF07dGhpc1tlXT1pLHRoaXMucmVxdWVzdFVwZGF0ZUludGVybmFsKHQscixuKX0sY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITB9fXN0YXRpYyBnZXRQcm9wZXJ0eU9wdGlvbnModCl7cmV0dXJuIHRoaXMuX2NsYXNzUHJvcGVydGllcyYmdGhpcy5fY2xhc3NQcm9wZXJ0aWVzLmdldCh0KXx8alF0fXN0YXRpYyBmaW5hbGl6ZSgpe2NvbnN0IHQ9T2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpO2lmKHQuaGFzT3duUHJvcGVydHkoR1F0KXx8dC5maW5hbGl6ZSgpLHRoaXMuZmluYWxpemVkPSEwLHRoaXMuX2Vuc3VyZUNsYXNzUHJvcGVydGllcygpLHRoaXMuX2F0dHJpYnV0ZVRvUHJvcGVydHlNYXA9bmV3IE1hcCx0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoInByb3BlcnRpZXMiLHRoaXMpKSl7Y29uc3QgdD10aGlzLnByb3BlcnRpZXMsZT1bLi4uT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModCksLi4uImZ1bmN0aW9uIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM/T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyh0KTpbXV07Zm9yKGNvbnN0IG4gb2YgZSl0aGlzLmNyZWF0ZVByb3BlcnR5KG4sdFtuXSl9fXN0YXRpYyBfYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHQsZSl7Y29uc3Qgbj1lLmF0dHJpYnV0ZTtyZXR1cm4hMT09PW4/dm9pZCAwOiJzdHJpbmciPT10eXBlb2Ygbj9uOiJzdHJpbmciPT10eXBlb2YgdD90LnRvTG93ZXJDYXNlKCk6dm9pZCAwfXN0YXRpYyBfdmFsdWVIYXNDaGFuZ2VkKHQsZSxuPVVRdCl7cmV0dXJuIG4odCxlKX1zdGF0aWMgX3Byb3BlcnR5VmFsdWVGcm9tQXR0cmlidXRlKHQsZSl7Y29uc3Qgbj1lLmNvbnZlcnRlcnx8VlF0LGk9ImZ1bmN0aW9uIj09dHlwZW9mIG4/bjpuLmZyb21BdHRyaWJ1dGU7cmV0dXJuIGk/aSh0LGUudHlwZSk6dH1zdGF0aWMgX3Byb3BlcnR5VmFsdWVUb0F0dHJpYnV0ZSh0LGUpe2lmKHZvaWQgMD09PWUucmVmbGVjdClyZXR1cm47Y29uc3Qgbj1lLmNvbnZlcnRlcjtyZXR1cm4obiYmbi50b0F0dHJpYnV0ZXx8VlF0LnRvQXR0cmlidXRlKSh0LGUudHlwZSl9aW5pdGlhbGl6ZSgpe3RoaXMuX3VwZGF0ZVN0YXRlPTAsdGhpcy5fdXBkYXRlUHJvbWlzZT1uZXcgUHJvbWlzZSgodD0+dGhpcy5fZW5hYmxlVXBkYXRpbmdSZXNvbHZlcj10KSksdGhpcy5fY2hhbmdlZFByb3BlcnRpZXM9bmV3IE1hcCx0aGlzLl9zYXZlSW5zdGFuY2VQcm9wZXJ0aWVzKCksdGhpcy5yZXF1ZXN0VXBkYXRlSW50ZXJuYWwoKX1fc2F2ZUluc3RhbmNlUHJvcGVydGllcygpe3RoaXMuY29uc3RydWN0b3IuX2NsYXNzUHJvcGVydGllcy5mb3JFYWNoKCgodCxlKT0+e2lmKHRoaXMuaGFzT3duUHJvcGVydHkoZSkpe2NvbnN0IHQ9dGhpc1tlXTtkZWxldGUgdGhpc1tlXSx0aGlzLl9pbnN0YW5jZVByb3BlcnRpZXN8fCh0aGlzLl9pbnN0YW5jZVByb3BlcnRpZXM9bmV3IE1hcCksdGhpcy5faW5zdGFuY2VQcm9wZXJ0aWVzLnNldChlLHQpfX0pKX1fYXBwbHlJbnN0YW5jZVByb3BlcnRpZXMoKXt0aGlzLl9pbnN0YW5jZVByb3BlcnRpZXMuZm9yRWFjaCgoKHQsZSk9PnRoaXNbZV09dCkpLHRoaXMuX2luc3RhbmNlUHJvcGVydGllcz12b2lkIDB9Y29ubmVjdGVkQ2FsbGJhY2soKXt0aGlzLmVuYWJsZVVwZGF0aW5nKCl9ZW5hYmxlVXBkYXRpbmcoKXt2b2lkIDAhPT10aGlzLl9lbmFibGVVcGRhdGluZ1Jlc29sdmVyJiYodGhpcy5fZW5hYmxlVXBkYXRpbmdSZXNvbHZlcigpLHRoaXMuX2VuYWJsZVVwZGF0aW5nUmVzb2x2ZXI9dm9pZCAwKX1kaXNjb25uZWN0ZWRDYWxsYmFjaygpe31hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodCxlLG4pe2UhPT1uJiZ0aGlzLl9hdHRyaWJ1dGVUb1Byb3BlcnR5KHQsbil9X3Byb3BlcnR5VG9BdHRyaWJ1dGUodCxlLG49alF0KXtjb25zdCBpPXRoaXMuY29uc3RydWN0b3Iscj1pLl9hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkodCxuKTtpZih2b2lkIDAhPT1yKXtjb25zdCB0PWkuX3Byb3BlcnR5VmFsdWVUb0F0dHJpYnV0ZShlLG4pO2lmKHZvaWQgMD09PXQpcmV0dXJuO3RoaXMuX3VwZGF0ZVN0YXRlPTh8dGhpcy5fdXBkYXRlU3RhdGUsbnVsbD09dD90aGlzLnJlbW92ZUF0dHJpYnV0ZShyKTp0aGlzLnNldEF0dHJpYnV0ZShyLHQpLHRoaXMuX3VwZGF0ZVN0YXRlPS05JnRoaXMuX3VwZGF0ZVN0YXRlfX1fYXR0cmlidXRlVG9Qcm9wZXJ0eSh0LGUpe2lmKDgmdGhpcy5fdXBkYXRlU3RhdGUpcmV0dXJuO2NvbnN0IG49dGhpcy5jb25zdHJ1Y3RvcixpPW4uX2F0dHJpYnV0ZVRvUHJvcGVydHlNYXAuZ2V0KHQpO2lmKHZvaWQgMCE9PWkpe2NvbnN0IHQ9bi5nZXRQcm9wZXJ0eU9wdGlvbnMoaSk7dGhpcy5fdXBkYXRlU3RhdGU9MTZ8dGhpcy5fdXBkYXRlU3RhdGUsdGhpc1tpXT1uLl9wcm9wZXJ0eVZhbHVlRnJvbUF0dHJpYnV0ZShlLHQpLHRoaXMuX3VwZGF0ZVN0YXRlPS0xNyZ0aGlzLl91cGRhdGVTdGF0ZX19cmVxdWVzdFVwZGF0ZUludGVybmFsKHQsZSxuKXtsZXQgaT0hMDtpZih2b2lkIDAhPT10KXtjb25zdCByPXRoaXMuY29uc3RydWN0b3I7bj1ufHxyLmdldFByb3BlcnR5T3B0aW9ucyh0KSxyLl92YWx1ZUhhc0NoYW5nZWQodGhpc1t0XSxlLG4uaGFzQ2hhbmdlZCk/KHRoaXMuX2NoYW5nZWRQcm9wZXJ0aWVzLmhhcyh0KXx8dGhpcy5fY2hhbmdlZFByb3BlcnRpZXMuc2V0KHQsZSksITAhPT1uLnJlZmxlY3R8fDE2JnRoaXMuX3VwZGF0ZVN0YXRlfHwodm9pZCAwPT09dGhpcy5fcmVmbGVjdGluZ1Byb3BlcnRpZXMmJih0aGlzLl9yZWZsZWN0aW5nUHJvcGVydGllcz1uZXcgTWFwKSx0aGlzLl9yZWZsZWN0aW5nUHJvcGVydGllcy5zZXQodCxuKSkpOmk9ITF9IXRoaXMuX2hhc1JlcXVlc3RlZFVwZGF0ZSYmaSYmKHRoaXMuX3VwZGF0ZVByb21pc2U9dGhpcy5fZW5xdWV1ZVVwZGF0ZSgpKX1yZXF1ZXN0VXBkYXRlKHQsZSl7cmV0dXJuIHRoaXMucmVxdWVzdFVwZGF0ZUludGVybmFsKHQsZSksdGhpcy51cGRhdGVDb21wbGV0ZX1hc3luYyBfZW5xdWV1ZVVwZGF0ZSgpe3RoaXMuX3VwZGF0ZVN0YXRlPTR8dGhpcy5fdXBkYXRlU3RhdGU7dHJ5e2F3YWl0IHRoaXMuX3VwZGF0ZVByb21pc2V9Y2F0Y2godCl7fWNvbnN0IHQ9dGhpcy5wZXJmb3JtVXBkYXRlKCk7cmV0dXJuIG51bGwhPXQmJmF3YWl0IHQsIXRoaXMuX2hhc1JlcXVlc3RlZFVwZGF0ZX1nZXQgX2hhc1JlcXVlc3RlZFVwZGF0ZSgpe3JldHVybiA0JnRoaXMuX3VwZGF0ZVN0YXRlfWdldCBoYXNVcGRhdGVkKCl7cmV0dXJuIDEmdGhpcy5fdXBkYXRlU3RhdGV9cGVyZm9ybVVwZGF0ZSgpe2lmKCF0aGlzLl9oYXNSZXF1ZXN0ZWRVcGRhdGUpcmV0dXJuO3RoaXMuX2luc3RhbmNlUHJvcGVydGllcyYmdGhpcy5fYXBwbHlJbnN0YW5jZVByb3BlcnRpZXMoKTtsZXQgdD0hMTtjb25zdCBlPXRoaXMuX2NoYW5nZWRQcm9wZXJ0aWVzO3RyeXt0PXRoaXMuc2hvdWxkVXBkYXRlKGUpLHQ/dGhpcy51cGRhdGUoZSk6dGhpcy5fbWFya1VwZGF0ZWQoKX1jYXRjaChlKXt0aHJvdyB0PSExLHRoaXMuX21hcmtVcGRhdGVkKCksZX10JiYoMSZ0aGlzLl91cGRhdGVTdGF0ZXx8KHRoaXMuX3VwZGF0ZVN0YXRlPTF8dGhpcy5fdXBkYXRlU3RhdGUsdGhpcy5maXJzdFVwZGF0ZWQoZSkpLHRoaXMudXBkYXRlZChlKSl9X21hcmtVcGRhdGVkKCl7dGhpcy5fY2hhbmdlZFByb3BlcnRpZXM9bmV3IE1hcCx0aGlzLl91cGRhdGVTdGF0ZT0tNSZ0aGlzLl91cGRhdGVTdGF0ZX1nZXQgdXBkYXRlQ29tcGxldGUoKXtyZXR1cm4gdGhpcy5fZ2V0VXBkYXRlQ29tcGxldGUoKX1fZ2V0VXBkYXRlQ29tcGxldGUoKXtyZXR1cm4gdGhpcy5nZXRVcGRhdGVDb21wbGV0ZSgpfWdldFVwZGF0ZUNvbXBsZXRlKCl7cmV0dXJuIHRoaXMuX3VwZGF0ZVByb21pc2V9c2hvdWxkVXBkYXRlKHQpe3JldHVybiEwfXVwZGF0ZSh0KXt2b2lkIDAhPT10aGlzLl9yZWZsZWN0aW5nUHJvcGVydGllcyYmdGhpcy5fcmVmbGVjdGluZ1Byb3BlcnRpZXMuc2l6ZT4wJiYodGhpcy5fcmVmbGVjdGluZ1Byb3BlcnRpZXMuZm9yRWFjaCgoKHQsZSk9PnRoaXMuX3Byb3BlcnR5VG9BdHRyaWJ1dGUoZSx0aGlzW2VdLHQpKSksdGhpcy5fcmVmbGVjdGluZ1Byb3BlcnRpZXM9dm9pZCAwKSx0aGlzLl9tYXJrVXBkYXRlZCgpfXVwZGF0ZWQodCl7fWZpcnN0VXBkYXRlZCh0KXt9fVdRdC5maW5hbGl6ZWQ9ITA7Ci8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxOSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwpjb25zdCBxUXQ9d2luZG93LlNoYWRvd1Jvb3QmJih2b2lkIDA9PT13aW5kb3cuU2hhZHlDU1N8fHdpbmRvdy5TaGFkeUNTUy5uYXRpdmVTaGFkb3cpJiYiYWRvcHRlZFN0eWxlU2hlZXRzImluIERvY3VtZW50LnByb3RvdHlwZSYmInJlcGxhY2UiaW4gQ1NTU3R5bGVTaGVldC5wcm90b3R5cGUsWVF0PVN5bWJvbCgpO2NsYXNzIFhRdHtjb25zdHJ1Y3Rvcih0LGUpe2lmKGUhPT1ZUXQpdGhyb3cgbmV3IEVycm9yKCJDU1NSZXN1bHQgaXMgbm90IGNvbnN0cnVjdGFibGUuIFVzZSBgdW5zYWZlQ1NTYCBvciBgY3NzYCBpbnN0ZWFkLiIpO3RoaXMuY3NzVGV4dD10fWdldCBzdHlsZVNoZWV0KCl7cmV0dXJuIHZvaWQgMD09PXRoaXMuX3N0eWxlU2hlZXQmJihxUXQ/KHRoaXMuX3N0eWxlU2hlZXQ9bmV3IENTU1N0eWxlU2hlZXQsdGhpcy5fc3R5bGVTaGVldC5yZXBsYWNlU3luYyh0aGlzLmNzc1RleHQpKTp0aGlzLl9zdHlsZVNoZWV0PW51bGwpLHRoaXMuX3N0eWxlU2hlZXR9dG9TdHJpbmcoKXtyZXR1cm4gdGhpcy5jc3NUZXh0fX1jb25zdCAkUXQ9KHQsLi4uZSk9Pntjb25zdCBuPWUucmVkdWNlKCgoZSxuLGkpPT5lKyh0PT57aWYodCBpbnN0YW5jZW9mIFhRdClyZXR1cm4gdC5jc3NUZXh0O2lmKCJudW1iZXIiPT10eXBlb2YgdClyZXR1cm4gdDt0aHJvdyBuZXcgRXJyb3IoYFZhbHVlIHBhc3NlZCB0byAnY3NzJyBmdW5jdGlvbiBtdXN0IGJlIGEgJ2NzcycgZnVuY3Rpb24gcmVzdWx0OiAke3R9LiBVc2UgJ3Vuc2FmZUNTUycgdG8gcGFzcyBub24tbGl0ZXJhbCB2YWx1ZXMsIGJ1dFxuICAgICAgICAgICAgdGFrZSBjYXJlIHRvIGVuc3VyZSBwYWdlIHNlY3VyaXR5LmApfSkobikrdFtpKzFdKSx0WzBdKTtyZXR1cm4gbmV3IFhRdChuLFlRdCl9OwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgICAqIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgICogVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgICogQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgICAqIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgICovCih3aW5kb3cubGl0RWxlbWVudFZlcnNpb25zfHwod2luZG93LmxpdEVsZW1lbnRWZXJzaW9ucz1bXSkpLnB1c2goIjIuNS4xIik7Y29uc3QgS1F0PXt9O2NsYXNzIFpRdCBleHRlbmRzIFdRdHtzdGF0aWMgZ2V0U3R5bGVzKCl7cmV0dXJuIHRoaXMuc3R5bGVzfXN0YXRpYyBfZ2V0VW5pcXVlU3R5bGVzKCl7aWYodGhpcy5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCJfc3R5bGVzIix0aGlzKSkpcmV0dXJuO2NvbnN0IHQ9dGhpcy5nZXRTdHlsZXMoKTtpZihBcnJheS5pc0FycmF5KHQpKXtjb25zdCBlPSh0LG4pPT50LnJlZHVjZVJpZ2h0KCgodCxuKT0+QXJyYXkuaXNBcnJheShuKT9lKG4sdCk6KHQuYWRkKG4pLHQpKSxuKSxuPWUodCxuZXcgU2V0KSxpPVtdO24uZm9yRWFjaCgodD0+aS51bnNoaWZ0KHQpKSksdGhpcy5fc3R5bGVzPWl9ZWxzZSB0aGlzLl9zdHlsZXM9dm9pZCAwPT09dD9bXTpbdF07dGhpcy5fc3R5bGVzPXRoaXMuX3N0eWxlcy5tYXAoKHQ9PntpZih0IGluc3RhbmNlb2YgQ1NTU3R5bGVTaGVldCYmIXFRdCl7cmV0dXJuKHQ9Pm5ldyBYUXQoU3RyaW5nKHQpLFlRdCkpKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQuY3NzUnVsZXMpLnJlZHVjZSgoKHQsZSk9PnQrZS5jc3NUZXh0KSwiIikpfXJldHVybiB0fSkpfWluaXRpYWxpemUoKXtzdXBlci5pbml0aWFsaXplKCksdGhpcy5jb25zdHJ1Y3Rvci5fZ2V0VW5pcXVlU3R5bGVzKCksdGhpcy5yZW5kZXJSb290PXRoaXMuY3JlYXRlUmVuZGVyUm9vdCgpLHdpbmRvdy5TaGFkb3dSb290JiZ0aGlzLnJlbmRlclJvb3QgaW5zdGFuY2VvZiB3aW5kb3cuU2hhZG93Um9vdCYmdGhpcy5hZG9wdFN0eWxlcygpfWNyZWF0ZVJlbmRlclJvb3QoKXtyZXR1cm4gdGhpcy5hdHRhY2hTaGFkb3codGhpcy5jb25zdHJ1Y3Rvci5zaGFkb3dSb290T3B0aW9ucyl9YWRvcHRTdHlsZXMoKXtjb25zdCB0PXRoaXMuY29uc3RydWN0b3IuX3N0eWxlczswIT09dC5sZW5ndGgmJih2b2lkIDA9PT13aW5kb3cuU2hhZHlDU1N8fHdpbmRvdy5TaGFkeUNTUy5uYXRpdmVTaGFkb3c/cVF0P3RoaXMucmVuZGVyUm9vdC5hZG9wdGVkU3R5bGVTaGVldHM9dC5tYXAoKHQ9PnQgaW5zdGFuY2VvZiBDU1NTdHlsZVNoZWV0P3Q6dC5zdHlsZVNoZWV0KSk6dGhpcy5fbmVlZHNTaGltQWRvcHRlZFN0eWxlU2hlZXRzPSEwOndpbmRvdy5TaGFkeUNTUy5TY29waW5nU2hpbS5wcmVwYXJlQWRvcHRlZENzc1RleHQodC5tYXAoKHQ9PnQuY3NzVGV4dCkpLHRoaXMubG9jYWxOYW1lKSl9Y29ubmVjdGVkQ2FsbGJhY2soKXtzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpLHRoaXMuaGFzVXBkYXRlZCYmdm9pZCAwIT09d2luZG93LlNoYWR5Q1NTJiZ3aW5kb3cuU2hhZHlDU1Muc3R5bGVFbGVtZW50KHRoaXMpfXVwZGF0ZSh0KXtjb25zdCBlPXRoaXMucmVuZGVyKCk7c3VwZXIudXBkYXRlKHQpLGUhPT1LUXQmJnRoaXMuY29uc3RydWN0b3IucmVuZGVyKGUsdGhpcy5yZW5kZXJSb290LHtzY29wZU5hbWU6dGhpcy5sb2NhbE5hbWUsZXZlbnRDb250ZXh0OnRoaXN9KSx0aGlzLl9uZWVkc1NoaW1BZG9wdGVkU3R5bGVTaGVldHMmJih0aGlzLl9uZWVkc1NoaW1BZG9wdGVkU3R5bGVTaGVldHM9ITEsdGhpcy5jb25zdHJ1Y3Rvci5fc3R5bGVzLmZvckVhY2goKHQ9Pntjb25zdCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInN0eWxlIik7ZS50ZXh0Q29udGVudD10LmNzc1RleHQsdGhpcy5yZW5kZXJSb290LmFwcGVuZENoaWxkKGUpfSkpKX1yZW5kZXIoKXtyZXR1cm4gS1F0fX1aUXQuZmluYWxpemVkPSEwLFpRdC5yZW5kZXI9KHQsZSxuKT0+e2lmKCFufHwib2JqZWN0IiE9dHlwZW9mIG58fCFuLnNjb3BlTmFtZSl0aHJvdyBuZXcgRXJyb3IoIlRoZSBgc2NvcGVOYW1lYCBvcHRpb24gaXMgcmVxdWlyZWQuIik7Y29uc3QgaT1uLnNjb3BlTmFtZSxyPVJRdC5oYXMoZSksbz16UXQmJjExPT09ZS5ub2RlVHlwZSYmISFlLmhvc3QsYT1vJiYhSFF0LmhhcyhpKSxzPWE/ZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOmU7aWYoKCh0LGUsbik9PntsZXQgaT1SUXQuZ2V0KGUpO3ZvaWQgMD09PWkmJihoUXQoZSxlLmZpcnN0Q2hpbGQpLFJRdC5zZXQoZSxpPW5ldyBMUXQoT2JqZWN0LmFzc2lnbih7dGVtcGxhdGVGYWN0b3J5Ok5RdH0sbikpKSxpLmFwcGVuZEludG8oZSkpLGkuc2V0VmFsdWUodCksaS5jb21taXQoKX0pKHQscyxPYmplY3QuYXNzaWduKHt0ZW1wbGF0ZUZhY3Rvcnk6RFF0KGkpfSxuKSksYSl7Y29uc3QgdD1SUXQuZ2V0KHMpO1JRdC5kZWxldGUocyk7RlF0KGkscyx0LnZhbHVlIGluc3RhbmNlb2YgQ1F0P3QudmFsdWUudGVtcGxhdGU6dm9pZCAwKSxoUXQoZSxlLmZpcnN0Q2hpbGQpLGUuYXBwZW5kQ2hpbGQocyksUlF0LnNldChlLHQpfSFyJiZvJiZ3aW5kb3cuU2hhZHlDU1Muc3R5bGVFbGVtZW50KGUuaG9zdCl9LFpRdC5zaGFkb3dSb290T3B0aW9ucz17bW9kZToib3BlbiJ9O2xldCBKUXQ9MDtjb25zdCBRUXQ9e30sdDF0PSh0LGUsbik9Pntjb25zdCBpPW4mJm4ubW9kdWxlSWR8fCJjdXN0b20tc3R5bGUtbW9kdWxlLSIrSlF0Kys7QXJyYXkuaXNBcnJheShlKXx8KGU9ZT9bZV06W10pLGUuZm9yRWFjaCgodD0+e2lmKCEodCBpbnN0YW5jZW9mIFhRdCkpdGhyb3cgbmV3IEVycm9yKCJBbiBpdGVtIGluIHN0eWxlcyBpcyBub3Qgb2YgdHlwZSBDU1NSZXN1bHQuIFVzZSBgdW5zYWZlQ1NTYCBvciBgY3NzYC4iKTtpZighUVF0W3RdKXtjb25zdCBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRvbS1tb2R1bGUiKTtlLmlubmVySFRNTD1gXG4gICAgICAgIDx0ZW1wbGF0ZT5cbiAgICAgICAgICA8c3R5bGU+JHt0LnRvU3RyaW5nKCl9PC9zdHlsZT5cbiAgICAgICAgPC90ZW1wbGF0ZT5cbiAgICAgIGA7Y29uc3Qgbj0iY3VzdG9tLXN0eWxlLW1vZHVsZS0iK0pRdCsrO2UucmVnaXN0ZXIobiksUVF0W3RdPW59fSkpO2NvbnN0IHI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZG9tLW1vZHVsZSIpO2lmKHQpe2NvbnN0IGU9Y3VzdG9tRWxlbWVudHMuZ2V0KHQpO2UmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLCJfX2ZpbmFsaXplZCIpJiZjb25zb2xlLndhcm4oYFRoZSBjdXN0b20gZWxlbWVudCBkZWZpbml0aW9uIGZvciAiJHt0fSJcbiAgICAgIHdhcyBmaW5hbGl6ZWQgYmVmb3JlIGEgc3R5bGUgbW9kdWxlIHdhcyByZWdpc3RlcmVkLlxuICAgICAgTWFrZSBzdXJlIHRvIGFkZCBjb21wb25lbnQgc3BlY2lmaWMgc3R5bGUgbW9kdWxlcyBiZWZvcmVcbiAgICAgIGltcG9ydGluZyB0aGUgY29ycmVzcG9uZGluZyBjdXN0b20gZWxlbWVudC5gKSxyLnNldEF0dHJpYnV0ZSgidGhlbWUtZm9yIix0KX1yLmlubmVySFRNTD1gXG4gICAgPHRlbXBsYXRlPlxuICAgICAgJHsobiYmbi5pbmNsdWRlfHxbXSkubWFwKCh0PT5gPHN0eWxlIGluY2x1ZGU9JHt0fT48L3N0eWxlPmApKX1cbiAgICAgICR7ZS5tYXAoKHQ9PmA8c3R5bGUgaW5jbHVkZT0ke1FRdFt0XX0+PC9zdHlsZT5gKSl9XG4gICAgPC90ZW1wbGF0ZT5cbiAgYCxyLnJlZ2lzdGVyKGkpfTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDIxIFZhYWRpbiBMdGQuCiAgICAgKiBUaGlzIHByb2dyYW0gaXMgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBhdmFpbGFibGUgYXQgaHR0cHM6Ly92YWFkaW4uY29tL2xpY2Vuc2UvCiAgICAgKi8KY2xhc3MgZTF0IGV4dGVuZHMgSFRNTEVsZW1lbnR7c3RhdGljIGdldCB2ZXJzaW9uKCl7cmV0dXJuIjIwLjAuMiJ9fWN1c3RvbUVsZW1lbnRzLmRlZmluZSgidmFhZGluLWx1bW8tc3R5bGVzIixlMXQpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqLwpjb25zdCBuMXQ9JFF0YAogIDpob3N0IHsKICAgIC8qIEJhc2UgKGJhY2tncm91bmQpICovCiAgICAtLWx1bW8tYmFzZS1jb2xvcjogI2ZmZjsKCiAgICAvKiBUaW50ICovCiAgICAtLWx1bW8tdGludC01cGN0OiBoc2xhKDAsIDAlLCAxMDAlLCAwLjMpOwogICAgLS1sdW1vLXRpbnQtMTBwY3Q6IGhzbGEoMCwgMCUsIDEwMCUsIDAuMzcpOwogICAgLS1sdW1vLXRpbnQtMjBwY3Q6IGhzbGEoMCwgMCUsIDEwMCUsIDAuNDQpOwogICAgLS1sdW1vLXRpbnQtMzBwY3Q6IGhzbGEoMCwgMCUsIDEwMCUsIDAuNSk7CiAgICAtLWx1bW8tdGludC00MHBjdDogaHNsYSgwLCAwJSwgMTAwJSwgMC41Nyk7CiAgICAtLWx1bW8tdGludC01MHBjdDogaHNsYSgwLCAwJSwgMTAwJSwgMC42NCk7CiAgICAtLWx1bW8tdGludC02MHBjdDogaHNsYSgwLCAwJSwgMTAwJSwgMC43KTsKICAgIC0tbHVtby10aW50LTcwcGN0OiBoc2xhKDAsIDAlLCAxMDAlLCAwLjc3KTsKICAgIC0tbHVtby10aW50LTgwcGN0OiBoc2xhKDAsIDAlLCAxMDAlLCAwLjg0KTsKICAgIC0tbHVtby10aW50LTkwcGN0OiBoc2xhKDAsIDAlLCAxMDAlLCAwLjkpOwogICAgLS1sdW1vLXRpbnQ6ICNmZmY7CgogICAgLyogU2hhZGUgKi8KICAgIC0tbHVtby1zaGFkZS01cGN0OiBoc2xhKDIxNCwgNjElLCAyNSUsIDAuMDUpOwogICAgLS1sdW1vLXNoYWRlLTEwcGN0OiBoc2xhKDIxNCwgNTclLCAyNCUsIDAuMSk7CiAgICAtLWx1bW8tc2hhZGUtMjBwY3Q6IGhzbGEoMjE0LCA1MyUsIDIzJSwgMC4xNik7CiAgICAtLWx1bW8tc2hhZGUtMzBwY3Q6IGhzbGEoMjE0LCA1MCUsIDIyJSwgMC4yNik7CiAgICAtLWx1bW8tc2hhZGUtNDBwY3Q6IGhzbGEoMjE0LCA0NyUsIDIxJSwgMC4zOCk7CiAgICAtLWx1bW8tc2hhZGUtNTBwY3Q6IGhzbGEoMjE0LCA0NSUsIDIwJSwgMC41KTsKICAgIC0tbHVtby1zaGFkZS02MHBjdDogaHNsYSgyMTQsIDQzJSwgMTklLCAwLjYxKTsKICAgIC0tbHVtby1zaGFkZS03MHBjdDogaHNsYSgyMTQsIDQyJSwgMTglLCAwLjcyKTsKICAgIC0tbHVtby1zaGFkZS04MHBjdDogaHNsYSgyMTQsIDQxJSwgMTclLCAwLjgzKTsKICAgIC0tbHVtby1zaGFkZS05MHBjdDogaHNsYSgyMTQsIDQwJSwgMTYlLCAwLjk0KTsKICAgIC0tbHVtby1zaGFkZTogaHNsKDIxNCwgMzUlLCAxNSUpOwoKICAgIC8qIENvbnRyYXN0ICovCiAgICAtLWx1bW8tY29udHJhc3QtNXBjdDogdmFyKC0tbHVtby1zaGFkZS01cGN0KTsKICAgIC0tbHVtby1jb250cmFzdC0xMHBjdDogdmFyKC0tbHVtby1zaGFkZS0xMHBjdCk7CiAgICAtLWx1bW8tY29udHJhc3QtMjBwY3Q6IHZhcigtLWx1bW8tc2hhZGUtMjBwY3QpOwogICAgLS1sdW1vLWNvbnRyYXN0LTMwcGN0OiB2YXIoLS1sdW1vLXNoYWRlLTMwcGN0KTsKICAgIC0tbHVtby1jb250cmFzdC00MHBjdDogdmFyKC0tbHVtby1zaGFkZS00MHBjdCk7CiAgICAtLWx1bW8tY29udHJhc3QtNTBwY3Q6IHZhcigtLWx1bW8tc2hhZGUtNTBwY3QpOwogICAgLS1sdW1vLWNvbnRyYXN0LTYwcGN0OiB2YXIoLS1sdW1vLXNoYWRlLTYwcGN0KTsKICAgIC0tbHVtby1jb250cmFzdC03MHBjdDogdmFyKC0tbHVtby1zaGFkZS03MHBjdCk7CiAgICAtLWx1bW8tY29udHJhc3QtODBwY3Q6IHZhcigtLWx1bW8tc2hhZGUtODBwY3QpOwogICAgLS1sdW1vLWNvbnRyYXN0LTkwcGN0OiB2YXIoLS1sdW1vLXNoYWRlLTkwcGN0KTsKICAgIC0tbHVtby1jb250cmFzdDogdmFyKC0tbHVtby1zaGFkZSk7CgogICAgLyogVGV4dCAqLwogICAgLS1sdW1vLWhlYWRlci10ZXh0LWNvbG9yOiB2YXIoLS1sdW1vLWNvbnRyYXN0KTsKICAgIC0tbHVtby1ib2R5LXRleHQtY29sb3I6IHZhcigtLWx1bW8tY29udHJhc3QtOTBwY3QpOwogICAgLS1sdW1vLXNlY29uZGFyeS10ZXh0LWNvbG9yOiB2YXIoLS1sdW1vLWNvbnRyYXN0LTcwcGN0KTsKICAgIC0tbHVtby10ZXJ0aWFyeS10ZXh0LWNvbG9yOiB2YXIoLS1sdW1vLWNvbnRyYXN0LTUwcGN0KTsKICAgIC0tbHVtby1kaXNhYmxlZC10ZXh0LWNvbG9yOiB2YXIoLS1sdW1vLWNvbnRyYXN0LTMwcGN0KTsKCiAgICAvKiBQcmltYXJ5ICovCiAgICAtLWx1bW8tcHJpbWFyeS1jb2xvcjogaHNsKDIxNCwgOTAlLCA1MiUpOwogICAgLS1sdW1vLXByaW1hcnktY29sb3ItNTBwY3Q6IGhzbGEoMjE0LCA5MCUsIDUyJSwgMC41KTsKICAgIC0tbHVtby1wcmltYXJ5LWNvbG9yLTEwcGN0OiBoc2xhKDIxNCwgOTAlLCA1MiUsIDAuMSk7CiAgICAtLWx1bW8tcHJpbWFyeS10ZXh0LWNvbG9yOiB2YXIoLS1sdW1vLXByaW1hcnktY29sb3IpOwogICAgLS1sdW1vLXByaW1hcnktY29udHJhc3QtY29sb3I6ICNmZmY7CgogICAgLyogRXJyb3IgKi8KICAgIC0tbHVtby1lcnJvci1jb2xvcjogaHNsKDMsIDEwMCUsIDYxJSk7CiAgICAtLWx1bW8tZXJyb3ItY29sb3ItNTBwY3Q6IGhzbGEoMywgMTAwJSwgNjAlLCAwLjUpOwogICAgLS1sdW1vLWVycm9yLWNvbG9yLTEwcGN0OiBoc2xhKDMsIDEwMCUsIDYwJSwgMC4xKTsKICAgIC0tbHVtby1lcnJvci10ZXh0LWNvbG9yOiBoc2woMywgOTIlLCA1MyUpOwogICAgLS1sdW1vLWVycm9yLWNvbnRyYXN0LWNvbG9yOiAjZmZmOwoKICAgIC8qIFN1Y2Nlc3MgKi8KICAgIC0tbHVtby1zdWNjZXNzLWNvbG9yOiBoc2woMTQ1LCA4MCUsIDQyJSk7IC8qIGhzbCgxNDQsODIlLDM3JSk7ICovCiAgICAtLWx1bW8tc3VjY2Vzcy1jb2xvci01MHBjdDogaHNsYSgxNDUsIDc2JSwgNDQlLCAwLjU1KTsKICAgIC0tbHVtby1zdWNjZXNzLWNvbG9yLTEwcGN0OiBoc2xhKDE0NSwgNzYlLCA0NCUsIDAuMTIpOwogICAgLS1sdW1vLXN1Y2Nlc3MtdGV4dC1jb2xvcjogaHNsKDE0NSwgMTAwJSwgMzIlKTsKICAgIC0tbHVtby1zdWNjZXNzLWNvbnRyYXN0LWNvbG9yOiAjZmZmOwogIH0KYCxpMXQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTtpMXQuaW5uZXJIVE1MPWA8c3R5bGU+JHtuMXQudG9TdHJpbmcoKS5yZXBsYWNlKCI6aG9zdCIsImh0bWwiKX08L3N0eWxlPmAsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChpMXQuY29udGVudCk7dDF0KCIiLCRRdGAKICBbdGhlbWV+PSdkYXJrJ10gewogICAgLyogQmFzZSAoYmFja2dyb3VuZCkgKi8KICAgIC0tbHVtby1iYXNlLWNvbG9yOiBoc2woMjE0LCAzNSUsIDIxJSk7CgogICAgLyogVGludCAqLwogICAgLS1sdW1vLXRpbnQtNXBjdDogaHNsYSgyMTQsIDY1JSwgODUlLCAwLjA2KTsKICAgIC0tbHVtby10aW50LTEwcGN0OiBoc2xhKDIxNCwgNjAlLCA4MCUsIDAuMTQpOwogICAgLS1sdW1vLXRpbnQtMjBwY3Q6IGhzbGEoMjE0LCA2NCUsIDgyJSwgMC4yMyk7CiAgICAtLWx1bW8tdGludC0zMHBjdDogaHNsYSgyMTQsIDY5JSwgODQlLCAwLjMyKTsKICAgIC0tbHVtby10aW50LTQwcGN0OiBoc2xhKDIxNCwgNzMlLCA4NiUsIDAuNDEpOwogICAgLS1sdW1vLXRpbnQtNTBwY3Q6IGhzbGEoMjE0LCA3OCUsIDg4JSwgMC41KTsKICAgIC0tbHVtby10aW50LTYwcGN0OiBoc2xhKDIxNCwgODIlLCA5MCUsIDAuNik7CiAgICAtLWx1bW8tdGludC03MHBjdDogaHNsYSgyMTQsIDg3JSwgOTIlLCAwLjcpOwogICAgLS1sdW1vLXRpbnQtODBwY3Q6IGhzbGEoMjE0LCA5MSUsIDk0JSwgMC44KTsKICAgIC0tbHVtby10aW50LTkwcGN0OiBoc2xhKDIxNCwgOTYlLCA5NiUsIDAuOSk7CiAgICAtLWx1bW8tdGludDogaHNsKDIxNCwgMTAwJSwgOTglKTsKCiAgICAvKiBTaGFkZSAqLwogICAgLS1sdW1vLXNoYWRlLTVwY3Q6IGhzbGEoMjE0LCAwJSwgMCUsIDAuMDcpOwogICAgLS1sdW1vLXNoYWRlLTEwcGN0OiBoc2xhKDIxNCwgNCUsIDIlLCAwLjE1KTsKICAgIC0tbHVtby1zaGFkZS0yMHBjdDogaHNsYSgyMTQsIDglLCA0JSwgMC4yMyk7CiAgICAtLWx1bW8tc2hhZGUtMzBwY3Q6IGhzbGEoMjE0LCAxMiUsIDYlLCAwLjMyKTsKICAgIC0tbHVtby1zaGFkZS00MHBjdDogaHNsYSgyMTQsIDE2JSwgOCUsIDAuNDEpOwogICAgLS1sdW1vLXNoYWRlLTUwcGN0OiBoc2xhKDIxNCwgMjAlLCAxMCUsIDAuNSk7CiAgICAtLWx1bW8tc2hhZGUtNjBwY3Q6IGhzbGEoMjE0LCAyNCUsIDEyJSwgMC42KTsKICAgIC0tbHVtby1zaGFkZS03MHBjdDogaHNsYSgyMTQsIDI4JSwgMTMlLCAwLjcpOwogICAgLS1sdW1vLXNoYWRlLTgwcGN0OiBoc2xhKDIxNCwgMzIlLCAxMyUsIDAuOCk7CiAgICAtLWx1bW8tc2hhZGUtOTBwY3Q6IGhzbGEoMjE0LCAzMyUsIDEzJSwgMC45KTsKICAgIC0tbHVtby1zaGFkZTogaHNsKDIxNCwgMzMlLCAxMyUpOwoKICAgIC8qIENvbnRyYXN0ICovCiAgICAtLWx1bW8tY29udHJhc3QtNXBjdDogdmFyKC0tbHVtby10aW50LTVwY3QpOwogICAgLS1sdW1vLWNvbnRyYXN0LTEwcGN0OiB2YXIoLS1sdW1vLXRpbnQtMTBwY3QpOwogICAgLS1sdW1vLWNvbnRyYXN0LTIwcGN0OiB2YXIoLS1sdW1vLXRpbnQtMjBwY3QpOwogICAgLS1sdW1vLWNvbnRyYXN0LTMwcGN0OiB2YXIoLS1sdW1vLXRpbnQtMzBwY3QpOwogICAgLS1sdW1vLWNvbnRyYXN0LTQwcGN0OiB2YXIoLS1sdW1vLXRpbnQtNDBwY3QpOwogICAgLS1sdW1vLWNvbnRyYXN0LTUwcGN0OiB2YXIoLS1sdW1vLXRpbnQtNTBwY3QpOwogICAgLS1sdW1vLWNvbnRyYXN0LTYwcGN0OiB2YXIoLS1sdW1vLXRpbnQtNjBwY3QpOwogICAgLS1sdW1vLWNvbnRyYXN0LTcwcGN0OiB2YXIoLS1sdW1vLXRpbnQtNzBwY3QpOwogICAgLS1sdW1vLWNvbnRyYXN0LTgwcGN0OiB2YXIoLS1sdW1vLXRpbnQtODBwY3QpOwogICAgLS1sdW1vLWNvbnRyYXN0LTkwcGN0OiB2YXIoLS1sdW1vLXRpbnQtOTBwY3QpOwogICAgLS1sdW1vLWNvbnRyYXN0OiB2YXIoLS1sdW1vLXRpbnQpOwoKICAgIC8qIFRleHQgKi8KICAgIC0tbHVtby1oZWFkZXItdGV4dC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdCk7CiAgICAtLWx1bW8tYm9keS10ZXh0LWNvbG9yOiB2YXIoLS1sdW1vLWNvbnRyYXN0LTkwcGN0KTsKICAgIC0tbHVtby1zZWNvbmRhcnktdGV4dC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC03MHBjdCk7CiAgICAtLWx1bW8tdGVydGlhcnktdGV4dC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC01MHBjdCk7CiAgICAtLWx1bW8tZGlzYWJsZWQtdGV4dC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC0zMHBjdCk7CgogICAgLyogUHJpbWFyeSAqLwogICAgLS1sdW1vLXByaW1hcnktY29sb3I6IGhzbCgyMTQsIDg2JSwgNTUlKTsKICAgIC0tbHVtby1wcmltYXJ5LWNvbG9yLTUwcGN0OiBoc2xhKDIxNCwgODYlLCA1NSUsIDAuNSk7CiAgICAtLWx1bW8tcHJpbWFyeS1jb2xvci0xMHBjdDogaHNsYSgyMTQsIDkwJSwgNjMlLCAwLjEpOwogICAgLS1sdW1vLXByaW1hcnktdGV4dC1jb2xvcjogaHNsKDIxNCwgMTAwJSwgNzAlKTsKICAgIC0tbHVtby1wcmltYXJ5LWNvbnRyYXN0LWNvbG9yOiAjZmZmOwoKICAgIC8qIEVycm9yICovCiAgICAtLWx1bW8tZXJyb3ItY29sb3I6IGhzbCgzLCA5MCUsIDYzJSk7CiAgICAtLWx1bW8tZXJyb3ItY29sb3ItNTBwY3Q6IGhzbGEoMywgOTAlLCA2MyUsIDAuNSk7CiAgICAtLWx1bW8tZXJyb3ItY29sb3ItMTBwY3Q6IGhzbGEoMywgOTAlLCA2MyUsIDAuMSk7CiAgICAtLWx1bW8tZXJyb3ItdGV4dC1jb2xvcjogaHNsKDMsIDEwMCUsIDY3JSk7CgogICAgLyogU3VjY2VzcyAqLwogICAgLS1sdW1vLXN1Y2Nlc3MtY29sb3I6IGhzbCgxNDUsIDY1JSwgNDIlKTsKICAgIC0tbHVtby1zdWNjZXNzLWNvbG9yLTUwcGN0OiBoc2xhKDE0NSwgNjUlLCA0MiUsIDAuNSk7CiAgICAtLWx1bW8tc3VjY2Vzcy1jb2xvci0xMHBjdDogaHNsYSgxNDUsIDY1JSwgNDIlLCAwLjEpOwogICAgLS1sdW1vLXN1Y2Nlc3MtdGV4dC1jb2xvcjogaHNsKDE0NSwgODUlLCA0NyUpOwogIH0KCiAgaHRtbCB7CiAgICBjb2xvcjogdmFyKC0tbHVtby1ib2R5LXRleHQtY29sb3IpOwogICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbHVtby1iYXNlLWNvbG9yKTsKICB9CgogIFt0aGVtZX49J2RhcmsnXSB7CiAgICBjb2xvcjogdmFyKC0tbHVtby1ib2R5LXRleHQtY29sb3IpOwogICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbHVtby1iYXNlLWNvbG9yKTsKICB9CgogIGgxLAogIGgyLAogIGgzLAogIGg0LAogIGg1LAogIGg2IHsKICAgIGNvbG9yOiB2YXIoLS1sdW1vLWhlYWRlci10ZXh0LWNvbG9yKTsKICB9CgogIGEgewogICAgY29sb3I6IHZhcigtLWx1bW8tcHJpbWFyeS10ZXh0LWNvbG9yKTsKICB9CgogIGJsb2NrcXVvdGUgewogICAgY29sb3I6IHZhcigtLWx1bW8tc2Vjb25kYXJ5LXRleHQtY29sb3IpOwogIH0KCiAgY29kZSwKICBwcmUgewogICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC0xMHBjdCk7CiAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1sdW1vLWJvcmRlci1yYWRpdXMtbSk7CiAgfQpgLHttb2R1bGVJZDoibHVtby1jb2xvciJ9KTt0MXQoIiIsJFF0YAogIDpob3N0IHsKICAgIGNvbG9yOiB2YXIoLS1sdW1vLWJvZHktdGV4dC1jb2xvcikgIWltcG9ydGFudDsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWx1bW8tYmFzZS1jb2xvcikgIWltcG9ydGFudDsKICB9CmAse21vZHVsZUlkOiJsdW1vLWNvbG9yLWxlZ2FjeSIsaW5jbHVkZTpbImx1bW8tY29sb3IiXX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqLwpjb25zdCByMXQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTtyMXQuaW5uZXJIVE1MPSdcbiAgPHN0eWxlPlxuICAgIEBmb250LWZhY2Uge1xuICAgICAgZm9udC1mYW1pbHk6IFwnbHVtby1pY29uc1wnO1xuICAgICAgc3JjOiB1cmwoZGF0YTphcHBsaWNhdGlvbi9mb250LXdvZmY7Y2hhcnNldD11dGYtODtiYXNlNjQsZDA5R1JnQUJBQUFBQUJFY0FBc0FBQUFBSWl3QUFRQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUJIVTFWQ0FBQUJDQUFBQURzQUFBQlVJSXNsZWs5VEx6SUFBQUZFQUFBQVF3QUFBRlpBSVV1S1kyMWhjQUFBQVlnQUFBRDRBQUFEcnNDVThkNW5iSGxtQUFBQ2dBQUFDMk1BQUJkNGg5VG8yV2hsWVdRQUFBM2tBQUFBTUFBQUFEWmEvNlNzYUdobFlRQUFEaFFBQUFBZEFBQUFKQWJwQTM1b2JYUjRBQUFPTkFBQUFCQUFBQUNzcEJBQUFHeHZZMkVBQUE1RUFBQUFXQUFBQUZoNTVJQXNiV0Y0Y0FBQURwd0FBQUFmQUFBQUlBRktBWEJ1WVcxbEFBQU92QUFBQVRFQUFBSXVVVUpaQ0hCdmMzUUFBQS93QUFBQkt3QUFBZWxtOFN6VmVKeGpZR1JnWU9CaU1HQ3dZMkJ5Y2ZNSlllRExTU3pKWTVCaVlHR0FBSkE4TXBzeEp6TTlrWUVEeGdQS3NZQnBEaUJtZzRnQ0FDWTdCVWdBZUp4allHUyt5RGlCZ1pXQmdhbUthUThEQTBNUGhHWjh3R0RJeUFRVVpXQmxac0FLQXRKY1V4Z2NYakcrMG1JTytwL0ZFTVVjeERBTktNd0lrZ01BQm44TUxRQjRuTzNTV1c2RE1BQkYwVXR3Q0VuSVBNL3poTEs4THFoZlhSeWJTUDE0WFVZdEhWOWhHWVF3UUJOSW8zY1VJUGtoUWVNN3JpYjFla3FuWGc5ODFYdUMxcXZ5ODRsem9qbGVoM3B1eEwwaFBqR2pSVTQ3M3RlbG9FZWZBVU5Hakprd1pjYWNCVXRXck5td1pjZWVBMGRPbkxsdzVjYWRCMDllbFBHaEdmK2owTlRJLzY1S2ZYZXJUNkpocUtucFJLdGdPcHVxYVRydEtqUFVscUhtaHRvMjFJN3BMNmk2aGxxWTNxN3FHV3JmVUFlR09qVFVrYUdPRFhWaXFGTkRuUm5xM0ZBWGhybzAxSldocmcxMVk2aGJROTBaNnQ1UUQ0WjZOTlNUb1o0TjlXS29WME85R2VyZFVCK0cralRVbDZHV1J2a0wyNEJrRVhpY3RWaDliRnZWRmIvbnh2YnorN1JmL042ekhjZDJiQ2ZQK1dnYzFaOU4wanBObkVMNmtiUlZTNkhBMmhRWUdoOVRHUjFDYkNxYTJyWHJXT2tRRS9zSE5KZ210WnZvVk5acUUxQjFETkh4elRReENlaFVUWWlKVFF5RU51aTBxU0xlenIzUGR1eVFmZ21SV09mZGU4Kzk1NTF6N3Jubi9PNGpMb0ovYlJQMFVhS1FNTEZKanBCQXZwaExaQzNEazBvazdXQnpSMi91cEpzN1J5dy9uZkZibG4vdXVOL2FwQ3Z3cktMclN2VXFSdWZibTVwbjBmczB3NGdZeG5HVlA2cUhuTzRiV2lEUUdRZ3d0UzZsbTNsQjNRb1gxTTJ2d0VtdXppckYzOXkrRXMyK0RKOGQxcGt5cUJJcW96ZTNEMStaejREckZvYXp4SThkV3dNckRsWjJETXFRQVI5QVJPc0pVKzJjbWxUUGF6VGNvNTJGMXhUYTJhMitLOHZ2cTkyZFZIbXRMb1BlUVgvQVpQUllHdGhEWU9lWmpCaktvRnNWR3VsUjNsV1U5NVdlQ0s0NHFIVTdNaFdVR1VLWkRUM29LVWNHMkdXdWgrRUREZlVZQS9qaEFobDBUT3NKTllTRXU3bVFtaTNVemZYd1pLQTRCc1ZzSExYUVlHZ1JXOTV1RXRwSjFWZm45WGlMcmlSQmxGRXF4c0RqQTA5eUNOVW9ReHh3ZDdLV1NUdDJ5M0dUS2lmbHFIUlNvV1pjM20xMVdhL2ZKZEZnWEQ0c1NZZmxlSkJLZDhHTXo3SjhkWm4vY0dSQ2NLR0RuQTJHZTNmS3pjdmxuVEROdGhHV0xYelgvV2FYdFVBbVJnZUxsSFNyMzByMEc5VVRYTWIwQXRtd3pPb3k3M2ZrU2xIWmtkdXcvVFl1VTljQUQ0WXV0UG94VFRzQTM3OTd3VnI0Wi8xTkM1ekFSSHI0dnR4Smp4SWZpWk1oTWtiV2srMTRCbkpaS3dxR1p3RGZzd0x5eFdEU2cxMXJGTEpGN05vcHhqZDFoMS9RT1Qrb2V6Z2Z1M1lxK0hrK2R1ZjV4KzQwbzFHVGthSWdpa0svSUVuQzZhWXhDVUJhWkpTTjRYVFlGalUvWU1OSUtxSndoREdPQ0NJOEZEWG5YbVhqdEdoR0p5U2hxakFPbkJPa1cySkc5UzdHZ1llTVdBVTVKemhuV21CT2FPTStDS0VQb3FTZkZEQzJVbnErRExsVWdVVlVGRkxaR0pnNmp0bG9qc2RzYThrUE9iUHVKZGk1ZG5CZEJzTEpNR1RXRGE0dDJKdnR3dVBvOXMrWTg2c3V2L1czM1FHMXJBYU9BVVYrdng0SzZmMkQwNFBWS2xDN1dMU3JaekFpNDVaVjZsSUM3V29YcW1SeXZVcW9Wd3J6VW9Wc0lqZVRYV1F2K1JINUdUbEJYaUIvSW44bG4wSWJCQ0FGT2FqQUpyZ1pZeU9IV3FPZlVlL2FIakkxMlI2T1FvMWpDZ3QyMTVsKzRmNlhQYiswTU5vdTBWKzQzbjJGNzd0U2ZSYjI0ZDd6aXRnbkttdllIczY5enVnYVB2Qnd2NmlvWGtiMkxkTDY1QXR3NTF1TGtYbHUxYmhNTVJjWFNQY1lvcUtJUmxoMzRsUVA4LzVKYnVVRnllNHZ4RDYvNk14RkYxMUMwdVZMcjlVbGd3NDR0UzNwTVZpTkxVRXhieWNGZ0xJY3QrUURNaWJSaW14MXlkVXo4RlhaaXVPSURCT01WWDJuVVpjK2h1TkU1WFVKODF1aUpvaWFid3FhVkYwdWFjS2JhdS9wbDRSMlZXMFhYbEpyYTZib1ZyWUc2NDZURjVOWXp3eTR2akVOVnJEbGNOcFpQbDhESDZYWDhYV0N4MG12V1ZaWTZLRkxydnNZNjYvelBpY3Q1Rm54YU5VUi9qdXZaQ00zVHZENjBFMlcxdFppemJYVFBEdWFiY20wbmJienBXS3BtQTFheUJROGdpZWRMVU0rQTBrTmpCalFqbXVZejdZcmdJWFl2bUY2M1pMQndTWHJwbjlUYjl3d2RkL1UxSDBQTVFLM1hjTzh1bDNXVDdQeVBQZHB5MFRlbUt4TlJjSk5hdWlYSm5uVURwVXBwUVdzNFNuVUl5MEVFU0dZcUpZUUxHSHh6YUdXd1ZJYVM2WTdtUUZNOFpqWURRM2F4amY2MVNXalUzM0p3T1pBMXB3YUcxTDltemY3MWFIUmRYMUpIdzZGcDBhWGhOd2JxeWVHTmc0TmJkekdDQnhvejRaWGp5NE51NjlacjZzRFk2dk1yTFU1bkExUDhKa2JkV1hKNkVSZk1yeXZOaDFKZlE5K1Q0ZEloR3ZLOXczZHhqQkJ6YXRzUS9NbE9IVklEbllwRHo2b2RBWGxRMDF0MlBhNUlhZmQ4TU1weEFlREtQMEM2Q2pnVkxUNW9zQjZpY1V4MDFsV2pYeHpUL0d5UkYyd2VsRU01Wi83akczVmpRMVNyTm41SWJ5ek9HNWRvYkIzL1FIeHladnNYY296OElvRXdTN3BsQ2crenhIUWs0MjRxOUJmRXBrRVNKYkZIUXVzREJTV0ZrdUJrb1BPMGtMS3dSVllqeEdYbEhUY1REUU1KL0g2VFg5YWZrTzdtbnJhVE8xZmVUblpBWEx1NGNwN0hBWE1tTkcxeWVGazlUZ1MvTkhoWlIvNFFvQlRyL1pCKzZoQ2d5bDE1TnExVWJONm5FMS9ablAxVTJjaXpDQnB2czhjSlFaSjRMa1l4NU4veVpQQVVaTlFRMFY0ZjNCUWxsV3JLM1lSemwzMGRPVDZSVm4ydXBOdXI2d29TYThDcXBkVC9hS25CTTRvM2pOdXI5ZDl4cXRVVDZ2ZUJFdDlDYTlhdCtFUnpFRWhVa1I4c2E1bVE0YVZ2Sm9WZUVBOHpJNGVpNW1VTFhGR3lVN3ovNlRBZVlMVmNwelNXWlk4UFlZRjV5clRWNjBzVDArWFYxNDF2WCsrV2YxNlYyYkZlR1ZQWlh4RnBrdnllS1RXTGx6ZlcwbW5LeHNZNlkzMjk0LzA5OThTQ2ZYMWJsbTVwYmN2RkdscS9yMDdNUkFNaFlJRGlXNUpGS1dXM3ZkckVwQ3NaU0pHK29tN1p1L1BTU2NaSmhOa0xibVc1V3NyMTJwV3FXNXpLdGx3UlM0YkZPeFV3MTdtQ3p5Nmxza0NEbDFXWU9HV0RZckFEck1BN0JERHdlV1dOZDVrb2lKblIxZHoreXRMUDJxMFNxUEIxbG5LMmNjQjdSWWU0RlNvUGtzM2lCM3Q0dHhUU0hjdGIyc3kxaXZrMHB2SHVDTm02dzFmNnd4djMrT0NnTjc4THFkUW5VVmg3UjBvVEFwMHpPZjJyYlc3NzBWdTVDMmRJeUdkVG5Ibzh6U2ppN2RwcGowVVNvVkN6K2xoUk1UaDUzVGVxOVZiR2ZianVTYkFvb1NkWGF5WTRQWUhnMzc0QzZmN2dsMUIvRFh1SjQvUVh4T0JkSkZKc3BGc0kzZWdwb1dVVUNqbFRJRm5OWU5sK1p5WkttQmVZS0dIa0QxUXlEbGhhS2JLd0tjSUpxSjRUTEoyT21kWS9KV1hhZTREZEdCdzhIWjdlWGNnRkYyenIyU29hbERyeTVpS3FvYTBQdWhlM2hQUTJzM2VsVFlNK01JK24zckswS2dMNy9MYTNHZU1MdDZtN3U5MTJ2R252dE9SaUlhMHFCbWhxVmkrWFc5WE5CbXFiOGVWZ0t6SUhmR0k1Yk5vRzdYMFVDemVJU21xSWNPL25ZOEZIN1U4YXZYOWZ4L1NUK2h4MHNlelB3OVF5OE11bTNHV2YyTjRVeS95SVlHVkJYYkpIV0lacDdkZlRjcHRkTVRyOVFtcTdEYWlLL3VrcUNMNGt0NFJVZlM1WFBuTXRtVDIyL21RRnFGN2VtU3F0cmx1OFNWRWx4RFJKclpPRGtwdXdlMFZmVGZqZEVwMWY3QTd2K2Zvek5CWFVKLzZXVHVLMlR0RmxwRlZaQVozTGNGdlVpMVoycDJZVCtFTUFrR0pWU3RPekxUQVBnNElxV0lBbHpSU2pPQmtsMnp4ajNUS3ljcHpUL01udlgzdWFTTVdNK2dVMHJrWGpvaGhlZlZSTWFwczMva0xNU0t2MjNsVDIzdXhRcmtRanlPSmxlTURzZGhBbkQ2WkdFbFdaNU1qQ1h6Q0UvaGtXWCtXRjRrbnpHaFZPeUsyZVFaZWtWM2V5bzB6TDhrdVlXQ25EQ3ZqamhBa2NUUE9CRFhWZG9hdjNIVmNGblFqTHZ0VjlTMnAwekE2SmVnUHdNUXh0K3lGYjNsbDl6R2xxLzVkUktiM2NFeVFZb2FOWXBoYXJKN3hDQjdBV3hzTFkzampaWFkwWHNaajBXandjOUk2UFAvZEtBQm5DWmFxSHBhWkVBQ3hrNFplTFpTS05nWkFCbCtsWVFYMXNKUU9TWDNuNnI0MTBldmNvdWQ1SmVBR1VYVlA5SDF0Wk9LZWpUcTRPbm8wejBlcnJvMUZybk9wb2h2YTFkL2hUZHRWc1FkS041VzlSbFQzTmpEMG56bnlLTlRnS0FNZldOV2N5b2RWMElHTFBJSE9GMG80SnlxdWZhSzR6NldJSXp1R2gzZDhjOGN3UWc4RVIrT1Z4eXJqZG04dk51aHRzNExvT2loR3hJTXVVZGd6d2lZTjd4aGgxK29abkpOdVRHN2dRWnZ1NFhXWjlHQVpaakdFdWJ3ZVBxWWh0S0RUSCs5VlFrbDE3L2lHeWJzbkorOCtzS3R5UHJjbGw5dHk2NVpzZHN0LzlpcXBFS2g3TTVWZEJ4aDNjc09kTmM2dFczSTF1eU0xUHpPWGVnU09yTEZzRk5JMk8yN00rVEYyQXBuTjlNVXY1dWQ2TGp4SXZFUW5IUnp4SXU0SXNBOU1MRmtKbjJ0Y1pvWjdPTjdkWGU3dWpyYzhIcnVzUEthbWxxWHdkNzdsUVV1THBpbGF1NFBVTWFwdWVCYjdpclU0Um9VWEVZWHVWdUlHbFJHbU9wKzJsTmthUlBWemlPcW1sYVp2YXFHNGRGZ1NqMGp4RUpXcnYxMklVV250bXcrcmZRYXJSRTBBcGg0b2NJNm5sVWxHcXMrdTMvK1QvZXRoVzYyUHBIcDJlSGJac3RuaC93T085NXlEQUhpY1kyQmtZR0FBNHBtSjZRSHgvRFpmR2JpWlh3QkZHR3BVTnpRaTZQK3ZtYWN5M1FKeU9SaVlRS0lBTm9VTFZYaWNZMkJrWUdBTytwOEZKRjh3QUFIelZBWkdCbFNnRFFCVzlnTnZBQUFBZUp4allHQmdZSDR4TkRBQXp3UW1qd0FBQUFBQVRnQ2FBT2dCQ2dFc0FVNEJjQUdhQWNRQjdnSWFBcHdDNkFTYUJMd0UxZ1R5QlE0RktnVjZCZEFGL2daRUJtWUd0Z2NZQjVBSUdBaFNDR29JL2dsR0NiNEoyZ29FQ2p3S2dncTRDdkFMVUF1V0M3eDRuR05nWkdCZzBHWk1ZUkJsQUFFbUlPWUNRZ2FHLzJBK0F3QVlsQUc4QUhpY2JaRTlUc013R0liZjlBL1JTZ2dFWW1IeEFndHErak4yWkdqM0R0M1QxR2xUT1hIa3VCVzlBeWZnRUJ5Q2dUTndDQTdCVy9OSmxWQnR5ZC9qeCs4WEt3bUFhM3dod25GRTZJYjFPQnE0NE82UG02UWI0UmI1UWJpTkhoNkZPL1JENFM2ZU1SSHU0UmFhVDRoYWx6UjNlQlZ1NEFwdndrMzZkK0VXK1VPNGpYdDhDbmZvdjRXN1dPQkh1SWVuNk1Yc0N0dlBVMXZXYzczZW1jU2R4SWtXMnRXNUxkVW9IcDdrVEpmYUpWNnYxUEtnNnYxNjdIMm1NbWNMTmJXbDE4WllWVG03MWFtUE45NVhrOEVnRXgrbnRvREJEZ1VzK3NpUnNwYW9NZWY3cnVrTkVyaXppWE51d1M3SG1vZTl3Z2d4ditlNTVJekpNcVFUZU5ZVjAwc2N1TmJZOCtZeHJVZkdmY2FNWmIvQ05QUWUwNGJUMGxUaGJFdVQwc2ZZaEs2Sy8yM0FtZjNMeCtIMjRoY2o0R1NjQUFBQWVKeHRqdGx1Z3pBUVJia0pVRUpJdXUvN3ZxUjhsR05QQWNXeDBZQWI1ZS9Ma2xSOTZFZ2VuU3VmR1kwMzhQcUt2ZjlyaGdHRzhCRWd4QTRpakJCampBUVRUTEdMUGV6akFJYzR3akZPY0lvem5PTUNsN2pDTlc1d2l6dmM0d0dQZU1Jelh2Q0tON3pqQXpOOGVvblFSV1pTU2FZbWp2dWc2YXNlOThoRmx0ZXhNSm1tVk5tVjJXQnZkTmdaVWMrdWpBV3pYVzNVRG51MXc0M2FzU3RIYzhHcHpBWFgvcHkwanFUUVpKVGdrY3hKTHBhQ0YwbEQzMnhOdCs0M3RBc24yOURmdDAydURLUzJjakdVTmdzazI2cUsybEZ0aFlvVTI3SU5QcW1pRHFnNWdvZTBwcVI1cVNvcU1kZWsvQ1VaRnl3TDQ2ckVzaUltbGVxaXFvTXl0NGJhWGx1LzFHTGRORmY1emJjTm1kcjFZVVdDWmU0N28relVtYi9Eb1N0YnczY1ZzZWY5QUxqamlQUUEpIGZvcm1hdChcJ3dvZmZcJyk7XG4gICAgICBmb250LXdlaWdodDogbm9ybWFsO1xuICAgICAgZm9udC1zdHlsZTogbm9ybWFsO1xuICAgIH1cblxuICAgIGh0bWwge1xuICAgICAgLS1sdW1vLWljb25zLWFsaWduLWNlbnRlcjogIlxcZWEwMSI7XG4gICAgICAtLWx1bW8taWNvbnMtYWxpZ24tbGVmdDogIlxcZWEwMiI7XG4gICAgICAtLWx1bW8taWNvbnMtYWxpZ24tcmlnaHQ6ICJcXGVhMDMiO1xuICAgICAgLS1sdW1vLWljb25zLWFuZ2xlLWRvd246ICJcXGVhMDQiO1xuICAgICAgLS1sdW1vLWljb25zLWFuZ2xlLWxlZnQ6ICJcXGVhMDUiO1xuICAgICAgLS1sdW1vLWljb25zLWFuZ2xlLXJpZ2h0OiAiXFxlYTA2IjtcbiAgICAgIC0tbHVtby1pY29ucy1hbmdsZS11cDogIlxcZWEwNyI7XG4gICAgICAtLWx1bW8taWNvbnMtYXJyb3ctZG93bjogIlxcZWEwOCI7XG4gICAgICAtLWx1bW8taWNvbnMtYXJyb3ctbGVmdDogIlxcZWEwOSI7XG4gICAgICAtLWx1bW8taWNvbnMtYXJyb3ctcmlnaHQ6ICJcXGVhMGEiO1xuICAgICAgLS1sdW1vLWljb25zLWFycm93LXVwOiAiXFxlYTBiIjtcbiAgICAgIC0tbHVtby1pY29ucy1iYXItY2hhcnQ6ICJcXGVhMGMiO1xuICAgICAgLS1sdW1vLWljb25zLWJlbGw6ICJcXGVhMGQiO1xuICAgICAgLS1sdW1vLWljb25zLWNhbGVuZGFyOiAiXFxlYTBlIjtcbiAgICAgIC0tbHVtby1pY29ucy1jaGVja21hcms6ICJcXGVhMGYiO1xuICAgICAgLS1sdW1vLWljb25zLWNoZXZyb24tZG93bjogIlxcZWExMCI7XG4gICAgICAtLWx1bW8taWNvbnMtY2hldnJvbi1sZWZ0OiAiXFxlYTExIjtcbiAgICAgIC0tbHVtby1pY29ucy1jaGV2cm9uLXJpZ2h0OiAiXFxlYTEyIjtcbiAgICAgIC0tbHVtby1pY29ucy1jaGV2cm9uLXVwOiAiXFxlYTEzIjtcbiAgICAgIC0tbHVtby1pY29ucy1jbG9jazogIlxcZWExNCI7XG4gICAgICAtLWx1bW8taWNvbnMtY29nOiAiXFxlYTE1IjtcbiAgICAgIC0tbHVtby1pY29ucy1jcm9zczogIlxcZWExNiI7XG4gICAgICAtLWx1bW8taWNvbnMtZG93bmxvYWQ6ICJcXGVhMTciO1xuICAgICAgLS1sdW1vLWljb25zLWRyb3Bkb3duOiAiXFxlYTE4IjtcbiAgICAgIC0tbHVtby1pY29ucy1lZGl0OiAiXFxlYTE5IjtcbiAgICAgIC0tbHVtby1pY29ucy1lcnJvcjogIlxcZWExYSI7XG4gICAgICAtLWx1bW8taWNvbnMtZXllOiAiXFxlYTFiIjtcbiAgICAgIC0tbHVtby1pY29ucy1leWUtZGlzYWJsZWQ6ICJcXGVhMWMiO1xuICAgICAgLS1sdW1vLWljb25zLW1lbnU6ICJcXGVhMWQiO1xuICAgICAgLS1sdW1vLWljb25zLW1pbnVzOiAiXFxlYTFlIjtcbiAgICAgIC0tbHVtby1pY29ucy1vcmRlcmVkLWxpc3Q6ICJcXGVhMWYiO1xuICAgICAgLS1sdW1vLWljb25zLXBob25lOiAiXFxlYTIwIjtcbiAgICAgIC0tbHVtby1pY29ucy1waG90bzogIlxcZWEyMSI7XG4gICAgICAtLWx1bW8taWNvbnMtcGxheTogIlxcZWEyMiI7XG4gICAgICAtLWx1bW8taWNvbnMtcGx1czogIlxcZWEyMyI7XG4gICAgICAtLWx1bW8taWNvbnMtcmVkbzogIlxcZWEyNCI7XG4gICAgICAtLWx1bW8taWNvbnMtcmVsb2FkOiAiXFxlYTI1IjtcbiAgICAgIC0tbHVtby1pY29ucy1zZWFyY2g6ICJcXGVhMjYiO1xuICAgICAgLS1sdW1vLWljb25zLXVuZG86ICJcXGVhMjciO1xuICAgICAgLS1sdW1vLWljb25zLXVub3JkZXJlZC1saXN0OiAiXFxlYTI4IjtcbiAgICAgIC0tbHVtby1pY29ucy11cGxvYWQ6ICJcXGVhMjkiO1xuICAgICAgLS1sdW1vLWljb25zLXVzZXI6ICJcXGVhMmEiO1xuICAgIH1cbiAgPC9zdHlsZT5cbicsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChyMXQuY29udGVudCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovCmNvbnN0IG8xdD0kUXRgCiAgOmhvc3QgewogICAgLS1sdW1vLXNpemUteHM6IDEuNjI1cmVtOwogICAgLS1sdW1vLXNpemUtczogMS44NzVyZW07CiAgICAtLWx1bW8tc2l6ZS1tOiAyLjI1cmVtOwogICAgLS1sdW1vLXNpemUtbDogMi43NXJlbTsKICAgIC0tbHVtby1zaXplLXhsOiAzLjVyZW07CgogICAgLyogSWNvbnMgKi8KICAgIC0tbHVtby1pY29uLXNpemUtczogMS4yNWVtOwogICAgLS1sdW1vLWljb24tc2l6ZS1tOiAxLjVlbTsKICAgIC0tbHVtby1pY29uLXNpemUtbDogMi4yNWVtOwogICAgLyogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCiAgICAtLWx1bW8taWNvbi1zaXplOiB2YXIoLS1sdW1vLWljb24tc2l6ZS1tKTsKICB9CmAsYTF0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRlbXBsYXRlIik7YTF0LmlubmVySFRNTD1gPHN0eWxlPiR7bzF0LnRvU3RyaW5nKCkucmVwbGFjZSgiOmhvc3QiLCJodG1sIil9PC9zdHlsZT5gLGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoYTF0LmNvbnRlbnQpOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqLwpjb25zdCBzMXQ9JFF0YAogIDpob3N0IHsKICAgIC8qIFNxdWFyZSAqLwogICAgLS1sdW1vLXNwYWNlLXhzOiAwLjI1cmVtOwogICAgLS1sdW1vLXNwYWNlLXM6IDAuNXJlbTsKICAgIC0tbHVtby1zcGFjZS1tOiAxcmVtOwogICAgLS1sdW1vLXNwYWNlLWw6IDEuNXJlbTsKICAgIC0tbHVtby1zcGFjZS14bDogMi41cmVtOwoKICAgIC8qIFdpZGUgKi8KICAgIC0tbHVtby1zcGFjZS13aWRlLXhzOiBjYWxjKHZhcigtLWx1bW8tc3BhY2UteHMpIC8gMikgdmFyKC0tbHVtby1zcGFjZS14cyk7CiAgICAtLWx1bW8tc3BhY2Utd2lkZS1zOiBjYWxjKHZhcigtLWx1bW8tc3BhY2UtcykgLyAyKSB2YXIoLS1sdW1vLXNwYWNlLXMpOwogICAgLS1sdW1vLXNwYWNlLXdpZGUtbTogY2FsYyh2YXIoLS1sdW1vLXNwYWNlLW0pIC8gMikgdmFyKC0tbHVtby1zcGFjZS1tKTsKICAgIC0tbHVtby1zcGFjZS13aWRlLWw6IGNhbGModmFyKC0tbHVtby1zcGFjZS1sKSAvIDIpIHZhcigtLWx1bW8tc3BhY2UtbCk7CiAgICAtLWx1bW8tc3BhY2Utd2lkZS14bDogY2FsYyh2YXIoLS1sdW1vLXNwYWNlLXhsKSAvIDIpIHZhcigtLWx1bW8tc3BhY2UteGwpOwoKICAgIC8qIFRhbGwgKi8KICAgIC0tbHVtby1zcGFjZS10YWxsLXhzOiB2YXIoLS1sdW1vLXNwYWNlLXhzKSBjYWxjKHZhcigtLWx1bW8tc3BhY2UteHMpIC8gMik7CiAgICAtLWx1bW8tc3BhY2UtdGFsbC1zOiB2YXIoLS1sdW1vLXNwYWNlLXMpIGNhbGModmFyKC0tbHVtby1zcGFjZS1zKSAvIDIpOwogICAgLS1sdW1vLXNwYWNlLXRhbGwtbTogdmFyKC0tbHVtby1zcGFjZS1tKSBjYWxjKHZhcigtLWx1bW8tc3BhY2UtbSkgLyAyKTsKICAgIC0tbHVtby1zcGFjZS10YWxsLWw6IHZhcigtLWx1bW8tc3BhY2UtbCkgY2FsYyh2YXIoLS1sdW1vLXNwYWNlLWwpIC8gMik7CiAgICAtLWx1bW8tc3BhY2UtdGFsbC14bDogdmFyKC0tbHVtby1zcGFjZS14bCkgY2FsYyh2YXIoLS1sdW1vLXNwYWNlLXhsKSAvIDIpOwogIH0KYCxsMXQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTtsMXQuaW5uZXJIVE1MPWA8c3R5bGU+JHtzMXQudG9TdHJpbmcoKS5yZXBsYWNlKCI6aG9zdCIsImh0bWwiKX08L3N0eWxlPmAsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChsMXQuY29udGVudCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovCmNvbnN0IGMxdD0kUXRgCiAgOmhvc3QgewogICAgLyogQm9yZGVyIHJhZGl1cyAqLwogICAgLS1sdW1vLWJvcmRlci1yYWRpdXMtczogMC4yNWVtOyAvKiBDaGVja2JveCwgYmFkZ2UsIGRhdGUtcGlja2VyIHllYXIgaW5kaWNhdG9yLCBldGMgKi8KICAgIC0tbHVtby1ib3JkZXItcmFkaXVzLW06IHZhcigtLWx1bW8tYm9yZGVyLXJhZGl1cywgMC4yNWVtKTsgLyogQnV0dG9uLCB0ZXh0IGZpZWxkLCBtZW51IG92ZXJsYXksIGV0YyAqLwogICAgLS1sdW1vLWJvcmRlci1yYWRpdXMtbDogMC41ZW07IC8qIERpYWxvZywgbm90aWZpY2F0aW9uLCBldGMgKi8KICAgIC0tbHVtby1ib3JkZXItcmFkaXVzOiAwLjI1ZW07IC8qIERlcHJlY2F0ZWQgKi8KCiAgICAvKiBTaGFkb3cgKi8KICAgIC0tbHVtby1ib3gtc2hhZG93LXhzOiAwIDFweCA0cHggLTFweCB2YXIoLS1sdW1vLXNoYWRlLTUwcGN0KTsKICAgIC0tbHVtby1ib3gtc2hhZG93LXM6IDAgMnB4IDRweCAtMXB4IHZhcigtLWx1bW8tc2hhZGUtMjBwY3QpLCAwIDNweCAxMnB4IC0xcHggdmFyKC0tbHVtby1zaGFkZS0zMHBjdCk7CiAgICAtLWx1bW8tYm94LXNoYWRvdy1tOiAwIDJweCA2cHggLTFweCB2YXIoLS1sdW1vLXNoYWRlLTIwcGN0KSwgMCA4cHggMjRweCAtNHB4IHZhcigtLWx1bW8tc2hhZGUtNDBwY3QpOwogICAgLS1sdW1vLWJveC1zaGFkb3ctbDogMCAzcHggMThweCAtMnB4IHZhcigtLWx1bW8tc2hhZGUtMjBwY3QpLCAwIDEycHggNDhweCAtNnB4IHZhcigtLWx1bW8tc2hhZGUtNDBwY3QpOwogICAgLS1sdW1vLWJveC1zaGFkb3cteGw6IDAgNHB4IDI0cHggLTNweCB2YXIoLS1sdW1vLXNoYWRlLTIwcGN0KSwgMCAxOHB4IDY0cHggLThweCB2YXIoLS1sdW1vLXNoYWRlLTQwcGN0KTsKCiAgICAvKiBDbGlja2FibGUgZWxlbWVudCBjdXJzb3IgKi8KICAgIC0tbHVtby1jbGlja2FibGUtY3Vyc29yOiBkZWZhdWx0OwogIH0KYCx1MXQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidGVtcGxhdGUiKTt1MXQuaW5uZXJIVE1MPWA8c3R5bGU+JHtjMXQudG9TdHJpbmcoKS5yZXBsYWNlKCI6aG9zdCIsImh0bWwiKX08L3N0eWxlPmAsZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh1MXQuY29udGVudCk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovCmNvbnN0IGgxdD0kUXRgCiAgOmhvc3QgewogICAgLyogcHJldHRpZXItaWdub3JlICovCiAgICAtLWx1bW8tZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgJ1JvYm90bycsICdTZWdvZSBVSScsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYsICdBcHBsZSBDb2xvciBFbW9qaScsICdTZWdvZSBVSSBFbW9qaScsICdTZWdvZSBVSSBTeW1ib2wnOwoKICAgIC8qIEZvbnQgc2l6ZXMgKi8KICAgIC0tbHVtby1mb250LXNpemUteHhzOiAwLjc1cmVtOwogICAgLS1sdW1vLWZvbnQtc2l6ZS14czogMC44MTI1cmVtOwogICAgLS1sdW1vLWZvbnQtc2l6ZS1zOiAwLjg3NXJlbTsKICAgIC0tbHVtby1mb250LXNpemUtbTogMXJlbTsKICAgIC0tbHVtby1mb250LXNpemUtbDogMS4xMjVyZW07CiAgICAtLWx1bW8tZm9udC1zaXplLXhsOiAxLjM3NXJlbTsKICAgIC0tbHVtby1mb250LXNpemUteHhsOiAxLjc1cmVtOwogICAgLS1sdW1vLWZvbnQtc2l6ZS14eHhsOiAyLjVyZW07CgogICAgLyogTGluZSBoZWlnaHRzICovCiAgICAtLWx1bW8tbGluZS1oZWlnaHQteHM6IDEuMjU7CiAgICAtLWx1bW8tbGluZS1oZWlnaHQtczogMS4zNzU7CiAgICAtLWx1bW8tbGluZS1oZWlnaHQtbTogMS42MjU7CiAgfQpgLGQxdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIpO2QxdC5pbm5lckhUTUw9YDxzdHlsZT4ke2gxdC50b1N0cmluZygpLnJlcGxhY2UoIjpob3N0IiwiaHRtbCIpfTwvc3R5bGU+YCxkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGQxdC5jb250ZW50KTt0MXQoIiIsJFF0YAogIGh0bWwgewogICAgZm9udC1mYW1pbHk6IHZhcigtLWx1bW8tZm9udC1mYW1pbHkpOwogICAgZm9udC1zaXplOiB2YXIoLS1sdW1vLWZvbnQtc2l6ZSwgdmFyKC0tbHVtby1mb250LXNpemUtbSkpOwogICAgbGluZS1oZWlnaHQ6IHZhcigtLWx1bW8tbGluZS1oZWlnaHQtbSk7CiAgICAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IDEwMCU7CiAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7CiAgfQoKICAvKiBDYW7igJl0IGNvbWJpbmUgd2l0aCB0aGUgYWJvdmUgc2VsZWN0b3IgYmVjYXVzZSB0aGF0IGRvZXNu4oCZdCB3b3JrIGluIGJyb3dzZXJzIHdpdGhvdXQgbmF0aXZlIHNoYWRvdyBkb20gKi8KICA6aG9zdCB7CiAgICBmb250LWZhbWlseTogdmFyKC0tbHVtby1mb250LWZhbWlseSk7CiAgICBmb250LXNpemU6IHZhcigtLWx1bW8tZm9udC1zaXplLCB2YXIoLS1sdW1vLWZvbnQtc2l6ZS1tKSk7CiAgICBsaW5lLWhlaWdodDogdmFyKC0tbHVtby1saW5lLWhlaWdodC1tKTsKICAgIC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogMTAwJTsKICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTsKICB9CgogIHNtYWxsLAogIFt0aGVtZX49J2ZvbnQtc2l6ZS1zJ10gewogICAgZm9udC1zaXplOiB2YXIoLS1sdW1vLWZvbnQtc2l6ZS1zKTsKICAgIGxpbmUtaGVpZ2h0OiB2YXIoLS1sdW1vLWxpbmUtaGVpZ2h0LXMpOwogIH0KCiAgW3RoZW1lfj0nZm9udC1zaXplLXhzJ10gewogICAgZm9udC1zaXplOiB2YXIoLS1sdW1vLWZvbnQtc2l6ZS14cyk7CiAgICBsaW5lLWhlaWdodDogdmFyKC0tbHVtby1saW5lLWhlaWdodC14cyk7CiAgfQoKICBoMSwKICBoMiwKICBoMywKICBoNCwKICBoNSwKICBoNiB7CiAgICBmb250LXdlaWdodDogNjAwOwogICAgbGluZS1oZWlnaHQ6IHZhcigtLWx1bW8tbGluZS1oZWlnaHQteHMpOwogICAgbWFyZ2luLXRvcDogMS4yNWVtOwogIH0KCiAgaDEgewogICAgZm9udC1zaXplOiB2YXIoLS1sdW1vLWZvbnQtc2l6ZS14eHhsKTsKICAgIG1hcmdpbi1ib3R0b206IDAuNzVlbTsKICB9CgogIGgyIHsKICAgIGZvbnQtc2l6ZTogdmFyKC0tbHVtby1mb250LXNpemUteHhsKTsKICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOwogIH0KCiAgaDMgewogICAgZm9udC1zaXplOiB2YXIoLS1sdW1vLWZvbnQtc2l6ZS14bCk7CiAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKICB9CgogIGg0IHsKICAgIGZvbnQtc2l6ZTogdmFyKC0tbHVtby1mb250LXNpemUtbCk7CiAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKICB9CgogIGg1IHsKICAgIGZvbnQtc2l6ZTogdmFyKC0tbHVtby1mb250LXNpemUtbSk7CiAgICBtYXJnaW4tYm90dG9tOiAwLjI1ZW07CiAgfQoKICBoNiB7CiAgICBmb250LXNpemU6IHZhcigtLWx1bW8tZm9udC1zaXplLXhzKTsKICAgIG1hcmdpbi1ib3R0b206IDA7CiAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgbGV0dGVyLXNwYWNpbmc6IDAuMDNlbTsKICB9CgogIHAsCiAgYmxvY2txdW90ZSB7CiAgICBtYXJnaW4tdG9wOiAwLjVlbTsKICAgIG1hcmdpbi1ib3R0b206IDAuNzVlbTsKICB9CgogIGEgewogICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogIH0KCiAgYTpob3ZlciB7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICB9CgogIGhyIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgIGhlaWdodDogMXB4OwogICAgYm9yZGVyOiAwOwogICAgcGFkZGluZzogMDsKICAgIG1hcmdpbjogdmFyKC0tbHVtby1zcGFjZS1zKSBjYWxjKHZhcigtLWx1bW8tYm9yZGVyLXJhZGl1cy1tKSAvIDIpOwogICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC0xMHBjdCk7CiAgfQoKICBibG9ja3F1b3RlIHsKICAgIGJvcmRlci1sZWZ0OiAycHggc29saWQgdmFyKC0tbHVtby1jb250cmFzdC0zMHBjdCk7CiAgfQoKICBiLAogIHN0cm9uZyB7CiAgICBmb250LXdlaWdodDogNjAwOwogIH0KCiAgLyogUlRMIHNwZWNpZmljIHN0eWxlcyAqLwoKICBibG9ja3F1b3RlW2Rpcj0ncnRsJ10gewogICAgYm9yZGVyLWxlZnQ6IG5vbmU7CiAgICBib3JkZXItcmlnaHQ6IDJweCBzb2xpZCB2YXIoLS1sdW1vLWNvbnRyYXN0LTMwcGN0KTsKICB9CmAse21vZHVsZUlkOiJsdW1vLXR5cG9ncmFwaHkifSksdDF0KCJ2YWFkaW4tY2hlY2tib3giLCRRdGAKICAgIDpob3N0IHsKICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgb3V0bGluZTogbm9uZTsKICAgIH0KCiAgICBbcGFydD0nbGFiZWwnXTpub3QoW2VtcHR5XSkgewogICAgICBtYXJnaW46IDAuMTg3NWVtIDAuODc1ZW0gMC4xODc1ZW0gMC4zNzVlbTsKICAgIH0KCiAgICBbcGFydD0nY2hlY2tib3gnXSB7CiAgICAgIHdpZHRoOiBjYWxjKDFlbSArIDJweCk7CiAgICAgIGhlaWdodDogY2FsYygxZW0gKyAycHgpOwogICAgICBtYXJnaW46IDAuMTg3NWVtOwogICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWx1bW8tYm9yZGVyLXJhZGl1cy1zKTsKICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC0yMHBjdCk7CiAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjJzIGN1YmljLWJlemllcigwLjEyLCAwLjMyLCAwLjU0LCAyKSwgYmFja2dyb3VuZC1jb2xvciAwLjE1czsKICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICB9CgogICAgOmhvc3QoW2luZGV0ZXJtaW5hdGVdKSBbcGFydD0nY2hlY2tib3gnXSwKICAgIDpob3N0KFtjaGVja2VkXSkgW3BhcnQ9J2NoZWNrYm94J10gewogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1sdW1vLXByaW1hcnktY29sb3IpOwogICAgfQoKICAgIC8qIE5lZWRlZCB0byBhbGlnbiB0aGUgY2hlY2tib3ggbmljZWx5IG9uIHRoZSBiYXNlbGluZSAqLwogICAgW3BhcnQ9J2NoZWNrYm94J106OmJlZm9yZSB7CiAgICAgIGNvbnRlbnQ6ICdcXDIwMDMnOwogICAgfQoKICAgIC8qIENoZWNrbWFyayAqLwogICAgW3BhcnQ9J2NoZWNrYm94J106OmFmdGVyIHsKICAgICAgY29udGVudDogJyc7CiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgd2lkdGg6IDA7CiAgICAgIGhlaWdodDogMDsKICAgICAgYm9yZGVyOiAwIHNvbGlkIHZhcigtLWx1bW8tcHJpbWFyeS1jb250cmFzdC1jb2xvcik7CiAgICAgIGJvcmRlci13aWR0aDogMC4xODc1ZW0gMCAwIDAuMTg3NWVtOwogICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICB0cmFuc2Zvcm0tb3JpZ2luOiAwIDA7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgdG9wOiAwLjgxMjVlbTsKICAgICAgbGVmdDogMC41ZW07CiAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC41NSkgcm90YXRlKC0xMzVkZWcpOwogICAgICBvcGFjaXR5OiAwOwogICAgfQoKICAgIDpob3N0KFtjaGVja2VkXSkgW3BhcnQ9J2NoZWNrYm94J106OmFmdGVyIHsKICAgICAgb3BhY2l0eTogMTsKICAgICAgd2lkdGg6IDAuNjI1ZW07CiAgICAgIGhlaWdodDogMS4wNjI1ZW07CiAgICB9CgogICAgLyogSW5kZXRlcm1pbmF0ZSBjaGVja21hcmsgKi8KICAgIDpob3N0KFtpbmRldGVybWluYXRlXSkgW3BhcnQ9J2NoZWNrYm94J106OmFmdGVyIHsKICAgICAgdHJhbnNmb3JtOiBub25lOwogICAgICBvcGFjaXR5OiAxOwogICAgICB0b3A6IDQ1JTsKICAgICAgaGVpZ2h0OiAxMCU7CiAgICAgIGxlZnQ6IDIyJTsKICAgICAgcmlnaHQ6IDIyJTsKICAgICAgd2lkdGg6IGF1dG87CiAgICAgIGJvcmRlcjogMDsKICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbHVtby1wcmltYXJ5LWNvbnRyYXN0LWNvbG9yKTsKICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjI1czsKICAgIH0KCiAgICAvKiBGb2N1cyByaW5nICovCiAgICA6aG9zdChbZm9jdXMtcmluZ10pIFtwYXJ0PSdjaGVja2JveCddIHsKICAgICAgYm94LXNoYWRvdzogMCAwIDAgM3B4IHZhcigtLWx1bW8tcHJpbWFyeS1jb2xvci01MHBjdCk7CiAgICB9CgogICAgLyogRGlzYWJsZWQgKi8KICAgIDpob3N0KFtkaXNhYmxlZF0pIHsKICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIGNvbG9yOiB2YXIoLS1sdW1vLWRpc2FibGVkLXRleHQtY29sb3IpOwogICAgfQoKICAgIDpob3N0KFtkaXNhYmxlZF0pIFtwYXJ0PSdsYWJlbCddIDo6c2xvdHRlZCgqKSB7CiAgICAgIGNvbG9yOiBpbmhlcml0OwogICAgfQoKICAgIDpob3N0KFtkaXNhYmxlZF0pIFtwYXJ0PSdjaGVja2JveCddIHsKICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC0xMHBjdCk7CiAgICB9CgogICAgOmhvc3QoW2Rpc2FibGVkXSkgW3BhcnQ9J2NoZWNrYm94J106OmFmdGVyIHsKICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1sdW1vLWNvbnRyYXN0LTMwcGN0KTsKICAgIH0KCiAgICA6aG9zdChbaW5kZXRlcm1pbmF0ZV1bZGlzYWJsZWRdKSBbcGFydD0nY2hlY2tib3gnXTo6YWZ0ZXIgewogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1sdW1vLWNvbnRyYXN0LTMwcGN0KTsKICAgIH0KCiAgICAvKiBSVEwgc3BlY2lmaWMgc3R5bGVzICovCiAgICA6aG9zdChbZGlyPSdydGwnXSkgW3BhcnQ9J2xhYmVsJ106bm90KFtlbXB0eV0pIHsKICAgICAgbWFyZ2luOiAwLjE4NzVlbSAwLjM3NWVtIDAuMTg3NWVtIDAuODc1ZW07CiAgICB9CgogICAgLyogVHJhbnNpdGlvbiB0aGUgY2hlY2ttYXJrIGlmIGFjdGl2YXRlZCB3aXRoIHRoZSBtb3VzZSAoZGlzYWJsZWQgZm9yIGdyaWQgc2VsZWN0LWFsbCB0aGlzIHdheSkgKi8KICAgIDpob3N0KDpob3ZlcikgW3BhcnQ9J2NoZWNrYm94J106OmFmdGVyIHsKICAgICAgdHJhbnNpdGlvbjogd2lkdGggMC4xcywgaGVpZ2h0IDAuMjVzOwogICAgfQoKICAgIC8qIFVzZWQgZm9yIGFjdGl2YXRpb24gImhhbG8iICovCiAgICBbcGFydD0nY2hlY2tib3gnXTo6YmVmb3JlIHsKICAgICAgY29sb3I6IHRyYW5zcGFyZW50OwogICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIGJvcmRlci1yYWRpdXM6IGluaGVyaXQ7CiAgICAgIGJhY2tncm91bmQtY29sb3I6IGluaGVyaXQ7CiAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS40KTsKICAgICAgb3BhY2l0eTogMDsKICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMXMsIG9wYWNpdHkgMC44czsKICAgIH0KCiAgICAvKiBIb3ZlciAqLwogICAgOmhvc3QoOm5vdChbY2hlY2tlZF0pOm5vdChbaW5kZXRlcm1pbmF0ZV0pOm5vdChbZGlzYWJsZWRdKTpob3ZlcikgW3BhcnQ9J2NoZWNrYm94J10gewogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1sdW1vLWNvbnRyYXN0LTMwcGN0KTsKICAgIH0KCiAgICAvKiBEaXNhYmxlIGhvdmVyIGZvciB0b3VjaCBkZXZpY2VzICovCiAgICBAbWVkaWEgKHBvaW50ZXI6IGNvYXJzZSkgewogICAgICA6aG9zdCg6bm90KFtjaGVja2VkXSk6bm90KFtpbmRldGVybWluYXRlXSk6bm90KFtkaXNhYmxlZF0pOmhvdmVyKSBbcGFydD0nY2hlY2tib3gnXSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC0yMHBjdCk7CiAgICAgIH0KICAgIH0KCiAgICAvKiBBY3RpdmUgKi8KICAgIDpob3N0KFthY3RpdmVdKSBbcGFydD0nY2hlY2tib3gnXSB7CiAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC45KTsKICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4wNXM7CiAgICB9CgogICAgOmhvc3QoW2FjdGl2ZV1bY2hlY2tlZF0pIFtwYXJ0PSdjaGVja2JveCddIHsKICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjEpOwogICAgfQoKICAgIDpob3N0KFthY3RpdmVdOm5vdChbY2hlY2tlZF0pKSBbcGFydD0nY2hlY2tib3gnXTo6YmVmb3JlIHsKICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4wMXMsIDAuMDFzOwogICAgICB0cmFuc2Zvcm06IHNjYWxlKDApOwogICAgICBvcGFjaXR5OiAwLjQ7CiAgICB9CiAgYCx7bW9kdWxlSWQ6Imx1bW8tY2hlY2tib3gifSk7Y29uc3QgcDF0PXQ9PmNsYXNzIGV4dGVuZHMgdHtzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKXtyZXR1cm57dGhlbWU6e3R5cGU6U3RyaW5nLHJlYWRPbmx5OiEwfX19YXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHQsZSxuKXtzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodCxlLG4pLCJ0aGVtZSI9PT10JiZ0aGlzLl9zZXRUaGVtZShuKX19LGYxdD10PT5jbGFzcyBleHRlbmRzKHAxdCh0KSl7c3RhdGljIGZpbmFsaXplKCl7c3VwZXIuZmluYWxpemUoKTtjb25zdCB0PXRoaXMucHJvdG90eXBlLl90ZW1wbGF0ZSxlPU9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzLnByb3RvdHlwZSkuX3RlbXBsYXRlO2UmJkFycmF5LmZyb20oZS5jb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoInN0eWxlW2luY2x1ZGVdIikpLmZvckVhY2goKGU9Pnt0aGlzLl9pbmNsdWRlU3R5bGUoZS5nZXRBdHRyaWJ1dGUoImluY2x1ZGUiKSx0KX0pKSx0aGlzLl9pbmNsdWRlTWF0Y2hpbmdUaGVtZXModCl9c3RhdGljIF9pbmNsdWRlTWF0Y2hpbmdUaGVtZXModCl7Y29uc3QgZT1CLnByb3RvdHlwZS5tb2R1bGVzO2xldCBuPSExO2NvbnN0IGk9dGhpcy5pcysiLWRlZmF1bHQtdGhlbWUiO09iamVjdC5rZXlzKGUpLnNvcnQoKCh0LGUpPT57Y29uc3Qgbj0wPT09dC5pbmRleE9mKCJ2YWFkaW4tIiksaT0wPT09ZS5pbmRleE9mKCJ2YWFkaW4tIikscj1bImx1bW8tIiwibWF0ZXJpYWwtIl0sbz1yLmZpbHRlcigoZT0+MD09PXQuaW5kZXhPZihlKSkpLmxlbmd0aD4wLGE9ci5maWx0ZXIoKHQ9PjA9PT1lLmluZGV4T2YodCkpKS5sZW5ndGg+MDtyZXR1cm4gbiE9PWk/bj8tMToxOm8hPT1hP28/LTE6MTowfSkpLmZvckVhY2goKHI9PntpZihyIT09aSl7Y29uc3QgaT1lW3JdLmdldEF0dHJpYnV0ZSgidGhlbWUtZm9yIik7aSYmaS5zcGxpdCgiICIpLmZvckVhY2goKGU9PntuZXcgUmVnRXhwKCJeIitlLnNwbGl0KCIqIikuam9pbigiLioiKSsiJCIpLnRlc3QodGhpcy5pcykmJihuPSEwLHRoaXMuX2luY2x1ZGVTdHlsZShyLHQpKX0pKX19KSksIW4mJmVbaV0mJnRoaXMuX2luY2x1ZGVTdHlsZShpLHQpfXN0YXRpYyBfaW5jbHVkZVN0eWxlKHQsZSl7aWYoZSYmIWUuY29udGVudC5xdWVyeVNlbGVjdG9yKGBzdHlsZVtpbmNsdWRlPSIke3R9Il1gKSl7Y29uc3Qgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzdHlsZSIpO24uc2V0QXR0cmlidXRlKCJpbmNsdWRlIix0KSxlLmNvbnRlbnQuYXBwZW5kQ2hpbGQobil9fX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDIxIFZhYWRpbiBMdGQuCiAgICAgKiBUaGlzIHByb2dyYW0gaXMgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBhdmFpbGFibGUgYXQgaHR0cHM6Ly92YWFkaW4uY29tL2xpY2Vuc2UvCiAgICAgKi87bGV0IG0xdD0hMTt3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsKCgpPT57bTF0PSEwfSkse2NhcHR1cmU6ITB9KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwoKCk9PnttMXQ9ITF9KSx7Y2FwdHVyZTohMH0pO2NvbnN0IGcxdD10PT5jbGFzcyBleHRlbmRzKCh0PT5jbGFzcyBleHRlbmRzIHR7c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7cmV0dXJue3RhYmluZGV4Ont0eXBlOk51bWJlcix2YWx1ZTowLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCxvYnNlcnZlcjoiX3RhYmluZGV4Q2hhbmdlZCJ9fX19KSh0KSl7c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7cmV0dXJue2F1dG9mb2N1czp7dHlwZTpCb29sZWFufSxfcHJldmlvdXNUYWJJbmRleDp7dHlwZTpOdW1iZXJ9LGRpc2FibGVkOnt0eXBlOkJvb2xlYW4sb2JzZXJ2ZXI6Il9kaXNhYmxlZENoYW5nZWQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0sX2lzU2hpZnRUYWJiaW5nOnt0eXBlOkJvb2xlYW59fX1yZWFkeSgpe3RoaXMuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXNpbiIsKHQ9Pnt0LmNvbXBvc2VkUGF0aCgpWzBdPT09dGhpcz90aGlzLmNvbnRhaW5zKHQucmVsYXRlZFRhcmdldCl8fHRoaXMuX2ZvY3VzKCk6LTE9PT10LmNvbXBvc2VkUGF0aCgpLmluZGV4T2YodGhpcy5mb2N1c0VsZW1lbnQpfHx0aGlzLmRpc2FibGVkfHx0aGlzLl9zZXRGb2N1c2VkKCEwKX0pKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImZvY3Vzb3V0IiwoKCk9PnRoaXMuX3NldEZvY3VzZWQoITEpKSksc3VwZXIucmVhZHkoKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImtleWRvd24iLCh0PT57IXQuZGVmYXVsdFByZXZlbnRlZCYmOT09PXQua2V5Q29kZSYmdC5zaGlmdEtleSYmKHRoaXMuX2lzU2hpZnRUYWJiaW5nPSEwLEhUTUxFbGVtZW50LnByb3RvdHlwZS5mb2N1cy5hcHBseSh0aGlzKSx0aGlzLl9zZXRGb2N1c2VkKCExKSxzZXRUaW1lb3V0KCgoKT0+dGhpcy5faXNTaGlmdFRhYmJpbmc9ITEpLDApKX0pKSx0aGlzLmF1dG9mb2N1cyYmIXRoaXMuZGlzYWJsZWQmJndpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT57dGhpcy5fZm9jdXMoKSx0aGlzLl9zZXRGb2N1c2VkKCEwKSx0aGlzLnNldEF0dHJpYnV0ZSgiZm9jdXMtcmluZyIsIiIpfSkpfWRpc2Nvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKSx0aGlzLmhhc0F0dHJpYnV0ZSgiZm9jdXNlZCIpJiZ0aGlzLl9zZXRGb2N1c2VkKCExKX1fc2V0Rm9jdXNlZCh0KXt0P3RoaXMuc2V0QXR0cmlidXRlKCJmb2N1c2VkIiwiIik6dGhpcy5yZW1vdmVBdHRyaWJ1dGUoImZvY3VzZWQiKSx0JiZtMXQ/dGhpcy5zZXRBdHRyaWJ1dGUoImZvY3VzLXJpbmciLCIiKTp0aGlzLnJlbW92ZUF0dHJpYnV0ZSgiZm9jdXMtcmluZyIpfWdldCBmb2N1c0VsZW1lbnQoKXtyZXR1cm4gd2luZG93LmNvbnNvbGUud2FybihgUGxlYXNlIGltcGxlbWVudCB0aGUgJ2ZvY3VzRWxlbWVudCcgcHJvcGVydHkgaW4gPCR7dGhpcy5sb2NhbE5hbWV9PmApLHRoaXN9X2ZvY3VzKCl7dGhpcy5mb2N1c0VsZW1lbnQmJiF0aGlzLl9pc1NoaWZ0VGFiYmluZyYmKHRoaXMuZm9jdXNFbGVtZW50LmZvY3VzKCksdGhpcy5fc2V0Rm9jdXNlZCghMCkpfWZvY3VzKCl7dGhpcy5mb2N1c0VsZW1lbnQmJiF0aGlzLmRpc2FibGVkJiYodGhpcy5mb2N1c0VsZW1lbnQuZm9jdXMoKSx0aGlzLl9zZXRGb2N1c2VkKCEwKSl9Ymx1cigpe3RoaXMuZm9jdXNFbGVtZW50JiYodGhpcy5mb2N1c0VsZW1lbnQuYmx1cigpLHRoaXMuX3NldEZvY3VzZWQoITEpKX1fZGlzYWJsZWRDaGFuZ2VkKHQpe3RoaXMuZm9jdXNFbGVtZW50LmRpc2FibGVkPXQsdD8odGhpcy5ibHVyKCksdGhpcy5fcHJldmlvdXNUYWJJbmRleD10aGlzLnRhYmluZGV4LHRoaXMudGFiaW5kZXg9LTEsdGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtZGlzYWJsZWQiLCJ0cnVlIikpOih2b2lkIDAhPT10aGlzLl9wcmV2aW91c1RhYkluZGV4JiYodGhpcy50YWJpbmRleD10aGlzLl9wcmV2aW91c1RhYkluZGV4KSx0aGlzLnJlbW92ZUF0dHJpYnV0ZSgiYXJpYS1kaXNhYmxlZCIpKX1fdGFiaW5kZXhDaGFuZ2VkKHQpe3ZvaWQgMCE9PXQmJih0aGlzLmZvY3VzRWxlbWVudC50YWJJbmRleD10KSx0aGlzLmRpc2FibGVkJiZ0aGlzLnRhYmluZGV4JiYoLTEhPT10aGlzLnRhYmluZGV4JiYodGhpcy5fcHJldmlvdXNUYWJJbmRleD10aGlzLnRhYmluZGV4KSx0aGlzLnRhYmluZGV4PXQ9dm9pZCAwKX1jbGljaygpe3RoaXMuZGlzYWJsZWR8fHN1cGVyLmNsaWNrKCl9fSxfMXQ9L1wvXCpcKlxzK3ZhYWRpbi1kZXYtbW9kZTpzdGFydChbXHNcU10qKXZhYWRpbi1kZXYtbW9kZTplbmRccytcKlwqXC8vaSx5MXQ9d2luZG93LlZhYWRpbiYmd2luZG93LlZhYWRpbi5GbG93JiZ3aW5kb3cuVmFhZGluLkZsb3cuY2xpZW50cztmdW5jdGlvbiB2MXQodCxlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgdClyZXR1cm47Y29uc3Qgbj1fMXQuZXhlYyh0LnRvU3RyaW5nKCkpO2lmKG4pdHJ5e3Q9bmV3IEZ1bmN0aW9uKG5bMV0pfWNhdGNoKHQpe2NvbnNvbGUubG9nKCJ2YWFkaW4tZGV2ZWxvcG1lbnQtbW9kZS1kZXRlY3RvcjogdW5jb21tZW50QW5kUnVuKCkgZmFpbGVkIix0KX1yZXR1cm4gdChlKX13aW5kb3cuVmFhZGluPXdpbmRvdy5WYWFkaW58fHt9O2NvbnN0IGIxdD1mdW5jdGlvbih0LGUpe2lmKHdpbmRvdy5WYWFkaW4uZGV2ZWxvcG1lbnRNb2RlKXJldHVybiB2MXQodCxlKX07ZnVuY3Rpb24geDF0KCl7fXZvaWQgMD09PXdpbmRvdy5WYWFkaW4uZGV2ZWxvcG1lbnRNb2RlJiYod2luZG93LlZhYWRpbi5kZXZlbG9wbWVudE1vZGU9KGZ1bmN0aW9uIHcxdCgpe3RyeXtyZXR1cm4hIShmdW5jdGlvbiB0KCl7cmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJ2YWFkaW4uZGV2ZWxvcG1lbnRtb2RlLmZvcmNlIil9KSgpfHwhIShmdW5jdGlvbiBlKCl7cmV0dXJuWyJsb2NhbGhvc3QiLCIxMjcuMC4wLjEiXS5pbmRleE9mKHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk+PTB9KSgpJiYoeTF0PyEoZnVuY3Rpb24gbigpe3JldHVybiEhKHkxdCYmT2JqZWN0LmtleXMoeTF0KS5tYXAoKHQ9PnkxdFt0XSkpLmZpbHRlcigodD0+dC5wcm9kdWN0aW9uTW9kZSkpLmxlbmd0aD4wKX0pKCk6IShmdW5jdGlvbiBpKCl7cmV0dXJuIHYxdCgoZnVuY3Rpb24gdCgpe3JldHVybiEwfSkpfSkoKSl9Y2F0Y2godCl7cmV0dXJuITF9fSkoKSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovCmNsYXNzIFMxdHtzdGF0aWMgZGV0ZWN0U2Nyb2xsVHlwZSgpe2NvbnN0IHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7dC50ZXh0Q29udGVudD0iQUJDRCIsdC5kaXI9InJ0bCIsdC5zdHlsZS5mb250U2l6ZT0iMTRweCIsdC5zdHlsZS53aWR0aD0iNHB4Iix0LnN0eWxlLmhlaWdodD0iMXB4Iix0LnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsdC5zdHlsZS50b3A9Ii0xMDAwcHgiLHQuc3R5bGUub3ZlcmZsb3c9InNjcm9sbCIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0KTtsZXQgZT0icmV2ZXJzZSI7cmV0dXJuIHQuc2Nyb2xsTGVmdD4wP2U9ImRlZmF1bHQiOih0LnNjcm9sbExlZnQ9Mix0LnNjcm9sbExlZnQ8MiYmKGU9Im5lZ2F0aXZlIikpLGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodCksZX1zdGF0aWMgZ2V0Tm9ybWFsaXplZFNjcm9sbExlZnQodCxlLG4pe2NvbnN0e3Njcm9sbExlZnQ6aX09bjtpZigicnRsIiE9PWV8fCF0KXJldHVybiBpO3N3aXRjaCh0KXtjYXNlIm5lZ2F0aXZlIjpyZXR1cm4gbi5zY3JvbGxXaWR0aC1uLmNsaWVudFdpZHRoK2k7Y2FzZSJyZXZlcnNlIjpyZXR1cm4gbi5zY3JvbGxXaWR0aC1uLmNsaWVudFdpZHRoLWl9cmV0dXJuIGl9c3RhdGljIHNldE5vcm1hbGl6ZWRTY3JvbGxMZWZ0KHQsZSxuLGkpe2lmKCJydGwiPT09ZSYmdClzd2l0Y2godCl7Y2FzZSJuZWdhdGl2ZSI6bi5zY3JvbGxMZWZ0PW4uY2xpZW50V2lkdGgtbi5zY3JvbGxXaWR0aCtpO2JyZWFrO2Nhc2UicmV2ZXJzZSI6bi5zY3JvbGxMZWZ0PW4uc2Nyb2xsV2lkdGgtbi5jbGllbnRXaWR0aC1pO2JyZWFrO2RlZmF1bHQ6bi5zY3JvbGxMZWZ0PWl9ZWxzZSBuLnNjcm9sbExlZnQ9aX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovY29uc3QgTTF0PVtdO2xldCBFMXQ7bmV3IE11dGF0aW9uT2JzZXJ2ZXIoKGZ1bmN0aW9uKCl7Y29uc3QgdD1DMXQoKTtNMXQuZm9yRWFjaCgoZT0+e1QxdChlLHQpfSkpfSkpLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LHthdHRyaWJ1dGVzOiEwLGF0dHJpYnV0ZUZpbHRlcjpbImRpciJdfSk7Y29uc3QgVDF0PWZ1bmN0aW9uKHQsZSxuPXQuZ2V0QXR0cmlidXRlKCJkaXIiKSl7ZT90LnNldEF0dHJpYnV0ZSgiZGlyIixlKTpudWxsIT1uJiZ0LnJlbW92ZUF0dHJpYnV0ZSgiZGlyIil9LEMxdD1mdW5jdGlvbigpe3JldHVybiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZ2V0QXR0cmlidXRlKCJkaXIiKX0sQTF0PXQ9PmNsYXNzIGV4dGVuZHMgdHtzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKXtyZXR1cm57ZGlyOnt0eXBlOlN0cmluZyx2YWx1ZToiIixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9fX1zdGF0aWMgZmluYWxpemUoKXtzdXBlci5maW5hbGl6ZSgpLEUxdHx8KEUxdD1TMXQuZGV0ZWN0U2Nyb2xsVHlwZSgpKX1jb25uZWN0ZWRDYWxsYmFjaygpe3N1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCksdGhpcy5oYXNBdHRyaWJ1dGUoImRpciIpfHwodGhpcy5fX3N1YnNjcmliZSgpLFQxdCh0aGlzLEMxdCgpLG51bGwpKX1hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodCxlLG4pe2lmKHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayh0LGUsbiksImRpciIhPT10KXJldHVybjtjb25zdCBpPUMxdCgpLHI9bj09PWkmJi0xPT09TTF0LmluZGV4T2YodGhpcyksbz0hbiYmZSYmLTE9PT1NMXQuaW5kZXhPZih0aGlzKSxhPW4hPT1pJiZlPT09aTtyfHxvPyh0aGlzLl9fc3Vic2NyaWJlKCksVDF0KHRoaXMsaSxuKSk6YSYmdGhpcy5fX3N1YnNjcmliZSghMSl9ZGlzY29ubmVjdGVkQ2FsbGJhY2soKXtzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpLHRoaXMuX19zdWJzY3JpYmUoITEpLHRoaXMucmVtb3ZlQXR0cmlidXRlKCJkaXIiKX1fdmFsdWVUb05vZGVBdHRyaWJ1dGUodCxlLG4peygiZGlyIiE9PW58fCIiIT09ZXx8dC5oYXNBdHRyaWJ1dGUoImRpciIpKSYmc3VwZXIuX3ZhbHVlVG9Ob2RlQXR0cmlidXRlKHQsZSxuKX1fYXR0cmlidXRlVG9Qcm9wZXJ0eSh0LGUsbil7ImRpciIhPT10fHxlP3N1cGVyLl9hdHRyaWJ1dGVUb1Byb3BlcnR5KHQsZSxuKTp0aGlzLmRpcj0iIn1fX3N1YnNjcmliZSh0PSEwKXt0Py0xPT09TTF0LmluZGV4T2YodGhpcykmJk0xdC5wdXNoKHRoaXMpOk0xdC5pbmRleE9mKHRoaXMpPi0xJiZNMXQuc3BsaWNlKE0xdC5pbmRleE9mKHRoaXMpLDEpfV9fZ2V0Tm9ybWFsaXplZFNjcm9sbExlZnQodCl7cmV0dXJuIFMxdC5nZXROb3JtYWxpemVkU2Nyb2xsTGVmdChFMXQsdGhpcy5nZXRBdHRyaWJ1dGUoImRpciIpfHwibHRyIix0KX1fX3NldE5vcm1hbGl6ZWRTY3JvbGxMZWZ0KHQsZSl7cmV0dXJuIFMxdC5zZXROb3JtYWxpemVkU2Nyb2xsTGVmdChFMXQsdGhpcy5nZXRBdHRyaWJ1dGUoImRpciIpfHwibHRyIix0LGUpfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDIxIFZhYWRpbiBMdGQuCiAgICAgKiBUaGlzIHByb2dyYW0gaXMgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBhdmFpbGFibGUgYXQgaHR0cHM6Ly92YWFkaW4uY29tL2xpY2Vuc2UvCiAgICAgKi87bGV0IGsxdDt3aW5kb3cuVmFhZGluPXdpbmRvdy5WYWFkaW58fHt9LHdpbmRvdy5WYWFkaW4ucmVnaXN0cmF0aW9ucz13aW5kb3cuVmFhZGluLnJlZ2lzdHJhdGlvbnN8fFtdLHdpbmRvdy5WYWFkaW4uZGV2ZWxvcG1lbnRNb2RlQ2FsbGJhY2s9d2luZG93LlZhYWRpbi5kZXZlbG9wbWVudE1vZGVDYWxsYmFja3x8e30sd2luZG93LlZhYWRpbi5kZXZlbG9wbWVudE1vZGVDYWxsYmFja1sidmFhZGluLXVzYWdlLXN0YXRpc3RpY3MiXT1mdW5jdGlvbigpe2IxdCh4MXQpfTtjb25zdCBMMXQ9bmV3IFNldCxQMXQ9dD0+Y2xhc3MgZXh0ZW5kcyhBMXQodCkpe3N0YXRpYyBmaW5hbGl6ZSgpe3N1cGVyLmZpbmFsaXplKCk7Y29uc3R7aXM6dH09dGhpczt0JiYhTDF0Lmhhcyh0KSYmKHdpbmRvdy5WYWFkaW4ucmVnaXN0cmF0aW9ucy5wdXNoKHRoaXMpLEwxdC5hZGQodCksd2luZG93LlZhYWRpbi5kZXZlbG9wbWVudE1vZGVDYWxsYmFjayYmKGsxdD1Obi5kZWJvdW5jZShrMXQseXQsKCgpPT57d2luZG93LlZhYWRpbi5kZXZlbG9wbWVudE1vZGVDYWxsYmFja1sidmFhZGluLXVzYWdlLXN0YXRpc3RpY3MiXSgpfSkpLFJuKGsxdCkpKX1jb25zdHJ1Y3Rvcigpe3N1cGVyKCksbnVsbD09PWRvY3VtZW50LmRvY3R5cGUmJmNvbnNvbGUud2FybignVmFhZGluIGNvbXBvbmVudHMgcmVxdWlyZSB0aGUgInN0YW5kYXJkcyBtb2RlIiBkZWNsYXJhdGlvbi4gUGxlYXNlIGFkZCA8IURPQ1RZUEUgaHRtbD4gdG8gdGhlIEhUTUwgZG9jdW1lbnQuJyl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqLztjbGFzcyBOMXQgZXh0ZW5kcyhQMXQoZzF0KGYxdChiaSh3ZSkpKSkpe3N0YXRpYyBnZXQgdGVtcGxhdGUoKXtyZXR1cm4geGVgCiAgICAgIDxzdHlsZT4KICAgICAgICA6aG9zdCB7CiAgICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgfQoKICAgICAgICA6aG9zdChbaGlkZGVuXSkgewogICAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICAgIH0KCiAgICAgICAgbGFiZWwgewogICAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICAgICAgICBhbGlnbi1pdGVtczogYmFzZWxpbmU7CiAgICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIH0KCiAgICAgICAgW3BhcnQ9J2NoZWNrYm94J10gewogICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgICAgZmxleDogbm9uZTsKICAgICAgICB9CgogICAgICAgIGlucHV0W3R5cGU9J2NoZWNrYm94J10gewogICAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgICAgdG9wOiAwOwogICAgICAgICAgbGVmdDogMDsKICAgICAgICAgIHJpZ2h0OiAwOwogICAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgICAgY3Vyc29yOiBpbmhlcml0OwogICAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIH0KCiAgICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgewogICAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgICB9CiAgICAgIDwvc3R5bGU+CgogICAgICA8bGFiZWw+CiAgICAgICAgPHNwYW4gcGFydD0iY2hlY2tib3giPgogICAgICAgICAgPGlucHV0CiAgICAgICAgICAgIHR5cGU9ImNoZWNrYm94IgogICAgICAgICAgICBjaGVja2VkPSJ7e2NoZWNrZWQ6OmNoYW5nZX19IgogICAgICAgICAgICBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIKICAgICAgICAgICAgaW5kZXRlcm1pbmF0ZT0ie3tpbmRldGVybWluYXRlOjpjaGFuZ2V9fSIKICAgICAgICAgICAgcm9sZT0icHJlc2VudGF0aW9uIgogICAgICAgICAgICB0YWJpbmRleD0iLTEiCiAgICAgICAgICAvPgogICAgICAgIDwvc3Bhbj4KCiAgICAgICAgPHNwYW4gcGFydD0ibGFiZWwiPgogICAgICAgICAgPHNsb3Q+PC9zbG90PgogICAgICAgIDwvc3Bhbj4KICAgICAgPC9sYWJlbD4KICAgIGB9c3RhdGljIGdldCBpcygpe3JldHVybiJ2YWFkaW4tY2hlY2tib3gifXN0YXRpYyBnZXQgdmVyc2lvbigpe3JldHVybiIyMC4wLjIifXN0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybntjaGVja2VkOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITEsbm90aWZ5OiEwLG9ic2VydmVyOiJfY2hlY2tlZENoYW5nZWQiLHJlZmxlY3RUb0F0dHJpYnV0ZTohMH0saW5kZXRlcm1pbmF0ZTp7dHlwZTpCb29sZWFuLG5vdGlmeTohMCxvYnNlcnZlcjoiX2luZGV0ZXJtaW5hdGVDaGFuZ2VkIixyZWZsZWN0VG9BdHRyaWJ1dGU6ITAsdmFsdWU6ITF9LHZhbHVlOnt0eXBlOlN0cmluZyx2YWx1ZToib24ifSxfbmF0aXZlQ2hlY2tib3g6e3R5cGU6T2JqZWN0fX19Y29uc3RydWN0b3IoKXtzdXBlcigpfWdldCBuYW1lKCl7cmV0dXJuIHRoaXMuY2hlY2tlZD90aGlzLl9zdG9yZWROYW1lOiIifXNldCBuYW1lKHQpe3RoaXMuX3N0b3JlZE5hbWU9dH1yZWFkeSgpe3N1cGVyLnJlYWR5KCksdGhpcy5zZXRBdHRyaWJ1dGUoInJvbGUiLCJjaGVja2JveCIpLHRoaXMuX25hdGl2ZUNoZWNrYm94PXRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdpbnB1dFt0eXBlPSJjaGVja2JveCJdJyksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5faGFuZGxlQ2xpY2suYmluZCh0aGlzKSksdGhpcy5fYWRkQWN0aXZlTGlzdGVuZXJzKCk7Y29uc3QgdD10aGlzLmdldEF0dHJpYnV0ZSgibmFtZSIpO3QmJih0aGlzLm5hbWU9dCksdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ1twYXJ0fj0ibGFiZWwiXScpLnF1ZXJ5U2VsZWN0b3IoInNsb3QiKS5hZGRFdmVudExpc3RlbmVyKCJzbG90Y2hhbmdlIix0aGlzLl91cGRhdGVMYWJlbEF0dHJpYnV0ZS5iaW5kKHRoaXMpKSx0aGlzLl91cGRhdGVMYWJlbEF0dHJpYnV0ZSgpfV91cGRhdGVMYWJlbEF0dHJpYnV0ZSgpe2NvbnN0IHQ9dGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ1twYXJ0fj0ibGFiZWwiXScpLGU9dC5maXJzdEVsZW1lbnRDaGlsZC5hc3NpZ25lZE5vZGVzKCk7dGhpcy5faXNBc3NpZ25lZE5vZGVzRW1wdHkoZSk/dC5zZXRBdHRyaWJ1dGUoImVtcHR5IiwiIik6dC5yZW1vdmVBdHRyaWJ1dGUoImVtcHR5Iil9X2lzQXNzaWduZWROb2Rlc0VtcHR5KHQpe3JldHVybiAwPT09dC5sZW5ndGh8fDE9PXQubGVuZ3RoJiZ0WzBdLm5vZGVUeXBlPT1Ob2RlLlRFWFRfTk9ERSYmIiI9PT10WzBdLnRleHRDb250ZW50LnRyaW0oKX1fY2hlY2tlZENoYW5nZWQodCl7dGhpcy5zZXRBdHRyaWJ1dGUoImFyaWEtY2hlY2tlZCIsdGhpcy5pbmRldGVybWluYXRlPyJtaXhlZCI6Qm9vbGVhbih0KSl9X2luZGV0ZXJtaW5hdGVDaGFuZ2VkKHQpe3RoaXMuc2V0QXR0cmlidXRlKCJhcmlhLWNoZWNrZWQiLHQ/Im1peGVkIjp0aGlzLmNoZWNrZWQpfV9hZGRBY3RpdmVMaXN0ZW5lcnMoKXt0aGlzLl9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKHRoaXMsImRvd24iLCh0PT57dGhpcy5fX2ludGVyYWN0aW9uc0FsbG93ZWQodCkmJnRoaXMuc2V0QXR0cmlidXRlKCJhY3RpdmUiLCIiKX0pKSx0aGlzLl9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKHRoaXMsInVwIiwoKCk9PnRoaXMucmVtb3ZlQXR0cmlidXRlKCJhY3RpdmUiKSkpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigia2V5ZG93biIsKHQ9Pnt0aGlzLl9faW50ZXJhY3Rpb25zQWxsb3dlZCh0KSYmMzI9PT10LmtleUNvZGUmJih0LnByZXZlbnREZWZhdWx0KCksdGhpcy5zZXRBdHRyaWJ1dGUoImFjdGl2ZSIsIiIpKX0pKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImtleXVwIiwodD0+e3RoaXMuX19pbnRlcmFjdGlvbnNBbGxvd2VkKHQpJiYzMj09PXQua2V5Q29kZSYmKHQucHJldmVudERlZmF1bHQoKSx0aGlzLl90b2dnbGVDaGVja2VkKCksdGhpcy5yZW1vdmVBdHRyaWJ1dGUoImFjdGl2ZSIpLHRoaXMuaW5kZXRlcm1pbmF0ZSYmKHRoaXMuaW5kZXRlcm1pbmF0ZT0hMSkpfSkpfWdldCBmb2N1c0VsZW1lbnQoKXtyZXR1cm4gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoImlucHV0Iil9X19pbnRlcmFjdGlvbnNBbGxvd2VkKHQpe3JldHVybiF0aGlzLmRpc2FibGVkJiYiYSIhPT10LnRhcmdldC5sb2NhbE5hbWV9X2hhbmRsZUNsaWNrKHQpe3RoaXMuX19pbnRlcmFjdGlvbnNBbGxvd2VkKHQpJiYodGhpcy5pbmRldGVybWluYXRlPyh0aGlzLmluZGV0ZXJtaW5hdGU9ITEsdC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX3RvZ2dsZUNoZWNrZWQoKSk6dC5jb21wb3NlZFBhdGgoKVswXSE9PXRoaXMuX25hdGl2ZUNoZWNrYm94JiYodC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX3RvZ2dsZUNoZWNrZWQoKSkpfV90b2dnbGVDaGVja2VkKCl7dGhpcy5jaGVja2VkPSF0aGlzLmNoZWNrZWQsdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiY2hhbmdlIix7Y29tcG9zZWQ6ITEsYnViYmxlczohMH0pKX19Y3VzdG9tRWxlbWVudHMuZGVmaW5lKE4xdC5pcyxOMXQpLHQxdCgidmFhZGluLWdyaWQiLCRRdGAKICAgIDpob3N0IHsKICAgICAgZm9udC1mYW1pbHk6IHZhcigtLWx1bW8tZm9udC1mYW1pbHkpOwogICAgICBmb250LXNpemU6IHZhcigtLWx1bW8tZm9udC1zaXplLW0pOwogICAgICBsaW5lLWhlaWdodDogdmFyKC0tbHVtby1saW5lLWhlaWdodC1zKTsKICAgICAgY29sb3I6IHZhcigtLWx1bW8tYm9keS10ZXh0LWNvbG9yKTsKICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbHVtby1iYXNlLWNvbG9yKTsKICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlOwogICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50OwogICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgLW1vei1vc3gtZm9udC1zbW9vdGhpbmc6IGdyYXlzY2FsZTsKCiAgICAgIC8qIEZvciBpbnRlcm5hbCB1c2Ugb25seSAqLwogICAgICAtLV9sdW1vLWdyaWQtYm9yZGVyLWNvbG9yOiB2YXIoLS1sdW1vLWNvbnRyYXN0LTIwcGN0KTsKICAgICAgLS1fbHVtby1ncmlkLXNlY29uZGFyeS1ib3JkZXItY29sb3I6IHZhcigtLWx1bW8tY29udHJhc3QtMTBwY3QpOwogICAgICAtLV9sdW1vLWdyaWQtYm9yZGVyLXdpZHRoOiAxcHg7CiAgICAgIC0tX2x1bW8tZ3JpZC1zZWxlY3RlZC1yb3ctY29sb3I6IHZhcigtLWx1bW8tcHJpbWFyeS1jb2xvci0xMHBjdCk7CiAgICB9CgogICAgLyogTm8gKG91dGVyKSBib3JkZXIgKi8KCiAgICA6aG9zdCg6bm90KFt0aGVtZX49J25vLWJvcmRlciddKSkgewogICAgICBib3JkZXI6IHZhcigtLV9sdW1vLWdyaWQtYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS1fbHVtby1ncmlkLWJvcmRlci1jb2xvcik7CiAgICB9CgogICAgLyogQ2VsbCBzdHlsZXMgKi8KCiAgICBbcGFydH49J2NlbGwnXSB7CiAgICAgIG1pbi1oZWlnaHQ6IHZhcigtLWx1bW8tc2l6ZS1tKTsKICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbHVtby1iYXNlLWNvbG9yKTsKICAgIH0KCiAgICBbcGFydH49J2NlbGwnXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgcGFkZGluZzogdmFyKC0tbHVtby1zcGFjZS14cykgdmFyKC0tbHVtby1zcGFjZS1tKTsKICAgIH0KCiAgICAvKiBBcHBseSByb3cgYm9yZGVycyBieSBkZWZhdWx0IGFuZCBpbnRyb2R1Y2UgdGhlICJuby1yb3ctYm9yZGVycyIgdmFyaWFudCAqLwogICAgOmhvc3QoOm5vdChbdGhlbWV+PSduby1yb3ctYm9yZGVycyddKSkgW3BhcnR+PSdjZWxsJ106bm90KFtwYXJ0fj0nZGV0YWlscy1jZWxsJ10pIHsKICAgICAgYm9yZGVyLXRvcDogdmFyKC0tX2x1bW8tZ3JpZC1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLV9sdW1vLWdyaWQtc2Vjb25kYXJ5LWJvcmRlci1jb2xvcik7CiAgICB9CgogICAgLyogSGlkZSBmaXJzdCBib2R5IHJvdyB0b3AgYm9yZGVyICovCiAgICA6aG9zdCg6bm90KFt0aGVtZX49J25vLXJvdy1ib3JkZXJzJ10pKSBbcGFydD0ncm93J11bZmlyc3RdIFtwYXJ0fj0nY2VsbCddOm5vdChbcGFydH49J2RldGFpbHMtY2VsbCddKSB7CiAgICAgIGJvcmRlci10b3A6IDA7CiAgICAgIG1pbi1oZWlnaHQ6IGNhbGModmFyKC0tbHVtby1zaXplLW0pIC0gdmFyKC0tX2x1bW8tZ3JpZC1ib3JkZXItd2lkdGgpKTsKICAgIH0KCiAgICAvKiBGb2N1cy1yaW5nICovCgogICAgW3BhcnR+PSdjZWxsJ106Zm9jdXMgewogICAgICBvdXRsaW5lOiBub25lOwogICAgfQoKICAgIDpob3N0KFtuYXZpZ2F0aW5nXSkgW3BhcnR+PSdjZWxsJ106Zm9jdXM6OmJlZm9yZSB7CiAgICAgIGNvbnRlbnQ6ICcnOwogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIHRvcDogMDsKICAgICAgcmlnaHQ6IDA7CiAgICAgIGJvdHRvbTogMDsKICAgICAgbGVmdDogMDsKICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDJweCB2YXIoLS1sdW1vLXByaW1hcnktY29sb3ItNTBwY3QpOwogICAgfQoKICAgIC8qIERyYWcgYW5kIERyb3Agc3R5bGVzICovCiAgICA6aG9zdChbZHJhZ292ZXJdKTo6YWZ0ZXIgewogICAgICBjb250ZW50OiAnJzsKICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB6LWluZGV4OiAxMDA7CiAgICAgIHRvcDogMDsKICAgICAgcmlnaHQ6IDA7CiAgICAgIGJvdHRvbTogMDsKICAgICAgbGVmdDogMDsKICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDJweCB2YXIoLS1sdW1vLXByaW1hcnktY29sb3ItNTBwY3QpOwogICAgfQoKICAgIFtwYXJ0fj0ncm93J11bZHJhZ292ZXJdIHsKICAgICAgei1pbmRleDogMTAwICFpbXBvcnRhbnQ7CiAgICB9CgogICAgW3BhcnR+PSdyb3cnXVtkcmFnb3Zlcl0gW3BhcnR+PSdjZWxsJ10gewogICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgIH0KCiAgICBbcGFydH49J3JvdyddW2RyYWdvdmVyXSBbcGFydH49J2NlbGwnXTo6YWZ0ZXIgewogICAgICBjb250ZW50OiAnJzsKICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB0b3A6IDA7CiAgICAgIHJpZ2h0OiAwOwogICAgICBib3R0b206IDA7CiAgICAgIGxlZnQ6IDA7CiAgICAgIGhlaWdodDogY2FsYyh2YXIoLS1fbHVtby1ncmlkLWJvcmRlci13aWR0aCkgKyAycHgpOwogICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgYmFja2dyb3VuZDogdmFyKC0tbHVtby1wcmltYXJ5LWNvbG9yLTUwcGN0KTsKICAgIH0KCiAgICA6aG9zdChbdGhlbWV+PSduby1yb3ctYm9yZGVycyddKSBbZHJhZ292ZXJdIFtwYXJ0fj0nY2VsbCddOjphZnRlciB7CiAgICAgIGhlaWdodDogMnB4OwogICAgfQoKICAgIFtwYXJ0fj0ncm93J11bZHJhZ292ZXI9J2JlbG93J10gW3BhcnR+PSdjZWxsJ106OmFmdGVyIHsKICAgICAgdG9wOiAxMDAlOwogICAgICBib3R0b206IGF1dG87CiAgICAgIG1hcmdpbi10b3A6IC0xcHg7CiAgICB9CgogICAgW3BhcnR+PSdyb3cnXVtkcmFnb3Zlcj0nYWJvdmUnXSBbcGFydH49J2NlbGwnXTo6YWZ0ZXIgewogICAgICB0b3A6IGF1dG87CiAgICAgIGJvdHRvbTogMTAwJTsKICAgICAgbWFyZ2luLWJvdHRvbTogLTFweDsKICAgIH0KCiAgICBbcGFydH49J3JvdyddW2RldGFpbHMtb3BlbmVkXVtkcmFnb3Zlcj0nYmVsb3cnXSBbcGFydH49J2NlbGwnXTpub3QoW3BhcnR+PSdkZXRhaWxzLWNlbGwnXSk6OmFmdGVyLAogICAgW3BhcnR+PSdyb3cnXVtkZXRhaWxzLW9wZW5lZF1bZHJhZ292ZXI9J2Fib3ZlJ10gW3BhcnR+PSdkZXRhaWxzLWNlbGwnXTo6YWZ0ZXIgewogICAgICBkaXNwbGF5OiBub25lOwogICAgfQoKICAgIFtwYXJ0fj0ncm93J11bZHJhZ292ZXJdW2RyYWdvdmVyPSdvbi10b3AnXSBbcGFydH49J2NlbGwnXTo6YWZ0ZXIgewogICAgICBoZWlnaHQ6IDEwMCU7CiAgICB9CgogICAgW3BhcnR+PSdyb3cnXVtkcmFnc3RhcnRdIHsKICAgICAgLyogQWRkIGJvdHRvbS1zcGFjZSB0byB0aGUgcm93IHNvIHRoZSBkcmFnIG51bWJlciBkb2Vzbid0IGdldCBjbGlwcGVkLiBOZWVkZWQgZm9yIElFL0VkZ2UgKi8KICAgICAgYm9yZGVyLWJvdHRvbTogMTAwcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgIHotaW5kZXg6IDEwMCAhaW1wb3J0YW50OwogICAgICBvcGFjaXR5OiAwLjk7CiAgICB9CgogICAgW3BhcnR+PSdyb3cnXVtkcmFnc3RhcnRdIFtwYXJ0fj0nY2VsbCddIHsKICAgICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICAgIGJveC1zaGFkb3c6IG5vbmUgIWltcG9ydGFudDsKICAgIH0KCiAgICBbcGFydH49J3JvdyddW2RyYWdzdGFydF0gW3BhcnR+PSdjZWxsJ11bbGFzdC1jb2x1bW5dIHsKICAgICAgYm9yZGVyLXJhZGl1czogMCB2YXIoLS1sdW1vLWJvcmRlci1yYWRpdXMtcykgdmFyKC0tbHVtby1ib3JkZXItcmFkaXVzLXMpIDA7CiAgICB9CgogICAgW3BhcnR+PSdyb3cnXVtkcmFnc3RhcnRdIFtwYXJ0fj0nY2VsbCddW2ZpcnN0LWNvbHVtbl0gewogICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1sdW1vLWJvcmRlci1yYWRpdXMtcykgMCAwIHZhcigtLWx1bW8tYm9yZGVyLXJhZGl1cy1zKTsKICAgIH0KCiAgICBbaW9zXSBbcGFydH49J3JvdyddW2RyYWdzdGFydF0gW3BhcnR+PSdjZWxsJ10gewogICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1sdW1vLXByaW1hcnktY29sb3ItNTBwY3QpOwogICAgfQoKICAgICNzY3JvbGxlcjpub3QoW2lvc10pIFtwYXJ0fj0ncm93J11bZHJhZ3N0YXJ0XTpub3QoW2RyYWdzdGFydD0nJ10pOjphZnRlciB7CiAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIGxlZnQ6IHZhcigtLV9ncmlkLWRyYWctc3RhcnQteCk7CiAgICAgIHRvcDogdmFyKC0tX2dyaWQtZHJhZy1zdGFydC15KTsKICAgICAgei1pbmRleDogMTAwOwogICAgICBjb250ZW50OiBhdHRyKGRyYWdzdGFydCk7CiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICBwYWRkaW5nOiBjYWxjKHZhcigtLWx1bW8tc3BhY2UteHMpICogMC44KTsKICAgICAgY29sb3I6IHZhcigtLWx1bW8tZXJyb3ItY29udHJhc3QtY29sb3IpOwogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1sdW1vLWVycm9yLWNvbG9yKTsKICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbHVtby1ib3JkZXItcmFkaXVzLW0pOwogICAgICBmb250LWZhbWlseTogdmFyKC0tbHVtby1mb250LWZhbWlseSk7CiAgICAgIGZvbnQtc2l6ZTogdmFyKC0tbHVtby1mb250LXNpemUteHhzKTsKICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIHRleHQtdHJhbnNmb3JtOiBpbml0aWFsOwogICAgICBsZXR0ZXItc3BhY2luZzogaW5pdGlhbDsKICAgICAgbWluLXdpZHRoOiBjYWxjKHZhcigtLWx1bW8tc2l6ZS1zKSAqIDAuNyk7CiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgIH0KCiAgICAvKiBIZWFkZXJzIGFuZCBmb290ZXJzICovCgogICAgW3BhcnR+PSdoZWFkZXItY2VsbCddIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpLAogICAgW3BhcnR+PSdmb290ZXItY2VsbCddIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpLAogICAgW3BhcnR+PSdyZW9yZGVyLWdob3N0J10gewogICAgICBmb250LXNpemU6IHZhcigtLWx1bW8tZm9udC1zaXplLXMpOwogICAgICBmb250LXdlaWdodDogNTAwOwogICAgfQoKICAgIFtwYXJ0fj0nZm9vdGVyLWNlbGwnXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICB9CgogICAgW3BhcnQ9J3JvdyddOm9ubHktY2hpbGQgW3BhcnR+PSdoZWFkZXItY2VsbCddIHsKICAgICAgbWluLWhlaWdodDogdmFyKC0tbHVtby1zaXplLXhsKTsKICAgIH0KCiAgICAvKiBIZWFkZXIgYm9yZGVycyAqLwoKICAgIC8qIEhpZGUgZmlyc3QgaGVhZGVyIHJvdyB0b3AgYm9yZGVyICovCiAgICA6aG9zdCg6bm90KFt0aGVtZX49J25vLXJvdy1ib3JkZXJzJ10pKSBbcGFydD0ncm93J106Zmlyc3QtY2hpbGQgW3BhcnR+PSdoZWFkZXItY2VsbCddIHsKICAgICAgYm9yZGVyLXRvcDogMDsKICAgIH0KCiAgICBbcGFydD0ncm93J106bGFzdC1jaGlsZCBbcGFydH49J2hlYWRlci1jZWxsJ10gewogICAgICBib3JkZXItYm90dG9tOiB2YXIoLS1fbHVtby1ncmlkLWJvcmRlci13aWR0aCkgc29saWQgdHJhbnNwYXJlbnQ7CiAgICB9CgogICAgOmhvc3QoOm5vdChbdGhlbWV+PSduby1yb3ctYm9yZGVycyddKSkgW3BhcnQ9J3JvdyddOmxhc3QtY2hpbGQgW3BhcnR+PSdoZWFkZXItY2VsbCddIHsKICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdmFyKC0tX2x1bW8tZ3JpZC1zZWNvbmRhcnktYm9yZGVyLWNvbG9yKTsKICAgIH0KCiAgICAvKiBPdmVyZmxvdyB1c2VzIGEgc3Ryb25nZXIgYm9yZGVyIGNvbG9yICovCiAgICA6aG9zdChbb3ZlcmZsb3d+PSd0b3AnXSkgW3BhcnQ9J3JvdyddOmxhc3QtY2hpbGQgW3BhcnR+PSdoZWFkZXItY2VsbCddIHsKICAgICAgYm9yZGVyLWJvdHRvbS1jb2xvcjogdmFyKC0tX2x1bW8tZ3JpZC1ib3JkZXItY29sb3IpOwogICAgfQoKICAgIC8qIEZvb3RlciBib3JkZXJzICovCgogICAgW3BhcnQ9J3JvdyddOmZpcnN0LWNoaWxkIFtwYXJ0fj0nZm9vdGVyLWNlbGwnXSB7CiAgICAgIGJvcmRlci10b3A6IHZhcigtLV9sdW1vLWdyaWQtYm9yZGVyLXdpZHRoKSBzb2xpZCB0cmFuc3BhcmVudDsKICAgIH0KCiAgICA6aG9zdCg6bm90KFt0aGVtZX49J25vLXJvdy1ib3JkZXJzJ10pKSBbcGFydD0ncm93J106Zmlyc3QtY2hpbGQgW3BhcnR+PSdmb290ZXItY2VsbCddIHsKICAgICAgYm9yZGVyLXRvcC1jb2xvcjogdmFyKC0tX2x1bW8tZ3JpZC1zZWNvbmRhcnktYm9yZGVyLWNvbG9yKTsKICAgIH0KCiAgICAvKiBPdmVyZmxvdyB1c2VzIGEgc3Ryb25nZXIgYm9yZGVyIGNvbG9yICovCiAgICA6aG9zdChbb3ZlcmZsb3d+PSdib3R0b20nXSkgW3BhcnQ9J3JvdyddOmZpcnN0LWNoaWxkIFtwYXJ0fj0nZm9vdGVyLWNlbGwnXSB7CiAgICAgIGJvcmRlci10b3AtY29sb3I6IHZhcigtLV9sdW1vLWdyaWQtYm9yZGVyLWNvbG9yKTsKICAgIH0KCiAgICAvKiBDb2x1bW4gcmVvcmRlcmluZyAqLwoKICAgIDpob3N0KFtyZW9yZGVyaW5nXSkgW3BhcnR+PSdjZWxsJ10gewogICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodmFyKC0tbHVtby1zaGFkZS0yMHBjdCksIHZhcigtLWx1bW8tc2hhZGUtMjBwY3QpKSB2YXIoLS1sdW1vLWJhc2UtY29sb3IpOwogICAgfQoKICAgIDpob3N0KFtyZW9yZGVyaW5nXSkgW3BhcnR+PSdjZWxsJ11bcmVvcmRlci1zdGF0dXM9J2FsbG93ZWQnXSB7CiAgICAgIGJhY2tncm91bmQ6IHZhcigtLWx1bW8tYmFzZS1jb2xvcik7CiAgICB9CgogICAgOmhvc3QoW3Jlb3JkZXJpbmddKSBbcGFydH49J2NlbGwnXVtyZW9yZGVyLXN0YXR1cz0nZHJhZ2dpbmcnXSB7CiAgICAgIGJhY2tncm91bmQ6IGxpbmVhci1ncmFkaWVudCh2YXIoLS1sdW1vLWNvbnRyYXN0LTVwY3QpLCB2YXIoLS1sdW1vLWNvbnRyYXN0LTVwY3QpKSB2YXIoLS1sdW1vLWJhc2UtY29sb3IpOwogICAgfQoKICAgIFtwYXJ0fj0ncmVvcmRlci1naG9zdCddIHsKICAgICAgb3BhY2l0eTogMC44NTsKICAgICAgYm94LXNoYWRvdzogdmFyKC0tbHVtby1ib3gtc2hhZG93LXMpOwogICAgICAvKiBUT0RPIFVzZSB0aGUgc2FtZSBzdHlsZXMgYXMgZm9yIHRoZSBjZWxsIGVsZW1lbnQgKHJlb3JkZXItZ2hvc3QgY29waWVzIHN0eWxlcyBmcm9tIHRoZSBjZWxsIGVsZW1lbnQpICovCiAgICAgIHBhZGRpbmc6IHZhcigtLWx1bW8tc3BhY2UtcykgdmFyKC0tbHVtby1zcGFjZS1tKSAhaW1wb3J0YW50OwogICAgfQoKICAgIC8qIENvbHVtbiByZXNpemluZyAqLwoKICAgIFtwYXJ0PSdyZXNpemUtaGFuZGxlJ10gewogICAgICB3aWR0aDogM3B4OwogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1sdW1vLXByaW1hcnktY29sb3ItNTBwY3QpOwogICAgICBvcGFjaXR5OiAwOwogICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnM7CiAgICB9CgogICAgOmhvc3QoOm5vdChbcmVvcmRlcmluZ10pKSAqOm5vdChbY29sdW1uLXJlc2l6aW5nXSkgW3BhcnR+PSdjZWxsJ106aG92ZXIgW3BhcnQ9J3Jlc2l6ZS1oYW5kbGUnXSwKICAgIFtwYXJ0PSdyZXNpemUtaGFuZGxlJ106YWN0aXZlIHsKICAgICAgb3BhY2l0eTogMTsKICAgICAgdHJhbnNpdGlvbi1kZWxheTogMC4xNXM7CiAgICB9CgogICAgLyogQ29sdW1uIGJvcmRlcnMgKi8KCiAgICA6aG9zdChbdGhlbWV+PSdjb2x1bW4tYm9yZGVycyddKSBbcGFydH49J2NlbGwnXTpub3QoW2xhc3QtY29sdW1uXSk6bm90KFtwYXJ0fj0nZGV0YWlscy1jZWxsJ10pIHsKICAgICAgYm9yZGVyLXJpZ2h0OiB2YXIoLS1fbHVtby1ncmlkLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tX2x1bW8tZ3JpZC1zZWNvbmRhcnktYm9yZGVyLWNvbG9yKTsKICAgIH0KCiAgICAvKiBGcm96ZW4gY29sdW1ucyAqLwoKICAgIFtsYXN0LWZyb3plbl0gewogICAgICBib3JkZXItcmlnaHQ6IHZhcigtLV9sdW1vLWdyaWQtYm9yZGVyLXdpZHRoKSBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIH0KCiAgICA6aG9zdChbb3ZlcmZsb3d+PSdsZWZ0J10pIFtwYXJ0fj0nY2VsbCddW2xhc3QtZnJvemVuXTpub3QoW3BhcnR+PSdkZXRhaWxzLWNlbGwnXSkgewogICAgICBib3JkZXItcmlnaHQtY29sb3I6IHZhcigtLV9sdW1vLWdyaWQtYm9yZGVyLWNvbG9yKTsKICAgIH0KCiAgICAvKiBSb3cgc3RyaXBlcyAqLwoKICAgIDpob3N0KFt0aGVtZX49J3Jvdy1zdHJpcGVzJ10pIFtwYXJ0fj0ncm93J106bm90KFtvZGRdKSBbcGFydH49J2JvZHktY2VsbCddLAogICAgOmhvc3QoW3RoZW1lfj0ncm93LXN0cmlwZXMnXSkgW3BhcnR+PSdyb3cnXTpub3QoW29kZF0pIFtwYXJ0fj0nZGV0YWlscy1jZWxsJ10gewogICAgICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodmFyKC0tbHVtby1jb250cmFzdC01cGN0KSwgdmFyKC0tbHVtby1jb250cmFzdC01cGN0KSk7CiAgICAgIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDsKICAgIH0KCiAgICAvKiBTZWxlY3RlZCByb3cgKi8KCiAgICAvKiBSYWlzZSB0aGUgc2VsZWN0ZWQgcm93cyBhYm92ZSB1bnNlbGVjdGVkIHJvd3MgKHNvIHRoYXQgYm94LXNoYWRvdyBjYW4gY292ZXIgdW5zZWxlY3RlZCByb3dzKSAqLwogICAgOmhvc3QoOm5vdChbcmVvcmRlcmluZ10pKSBbcGFydH49J3JvdyddW3NlbGVjdGVkXSB7CiAgICAgIHotaW5kZXg6IDE7CiAgICB9CgogICAgOmhvc3QoOm5vdChbcmVvcmRlcmluZ10pKSBbcGFydH49J3JvdyddW3NlbGVjdGVkXSBbcGFydH49J2JvZHktY2VsbCddOm5vdChbcGFydH49J2RldGFpbHMtY2VsbCddKSB7CiAgICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh2YXIoLS1fbHVtby1ncmlkLXNlbGVjdGVkLXJvdy1jb2xvciksIHZhcigtLV9sdW1vLWdyaWQtc2VsZWN0ZWQtcm93LWNvbG9yKSk7CiAgICAgIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQ7CiAgICB9CgogICAgLyogQ292ZXIgdGhlIGJvcmRlciBvZiBhbiB1bnNlbGVjdGVkIHJvdyAqLwogICAgOmhvc3QoOm5vdChbdGhlbWV+PSduby1yb3ctYm9yZGVycyddKSkgW3BhcnR+PSdyb3cnXVtzZWxlY3RlZF0gW3BhcnR+PSdjZWxsJ106bm90KFtwYXJ0fj0nZGV0YWlscy1jZWxsJ10pIHsKICAgICAgYm94LXNoYWRvdzogMCB2YXIoLS1fbHVtby1ncmlkLWJvcmRlci13aWR0aCkgMCAwIHZhcigtLV9sdW1vLWdyaWQtc2VsZWN0ZWQtcm93LWNvbG9yKTsKICAgIH0KCiAgICAvKiBDb21wYWN0ICovCgogICAgOmhvc3QoW3RoZW1lfj0nY29tcGFjdCddKSBbcGFydD0ncm93J106b25seS1jaGlsZCBbcGFydH49J2hlYWRlci1jZWxsJ10gewogICAgICBtaW4taGVpZ2h0OiB2YXIoLS1sdW1vLXNpemUtbSk7CiAgICB9CgogICAgOmhvc3QoW3RoZW1lfj0nY29tcGFjdCddKSBbcGFydH49J2NlbGwnXSB7CiAgICAgIG1pbi1oZWlnaHQ6IHZhcigtLWx1bW8tc2l6ZS1zKTsKICAgIH0KCiAgICA6aG9zdChbdGhlbWV+PSdjb21wYWN0J10pIFtwYXJ0PSdyb3cnXVtmaXJzdF0gW3BhcnR+PSdjZWxsJ106bm90KFtwYXJ0fj0nZGV0YWlscy1jZWxsJ10pIHsKICAgICAgbWluLWhlaWdodDogY2FsYyh2YXIoLS1sdW1vLXNpemUtcykgLSB2YXIoLS1fbHVtby1ncmlkLWJvcmRlci13aWR0aCkpOwogICAgfQoKICAgIDpob3N0KFt0aGVtZX49J2NvbXBhY3QnXSkgW3BhcnR+PSdjZWxsJ10gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICBwYWRkaW5nOiB2YXIoLS1sdW1vLXNwYWNlLXhzKSB2YXIoLS1sdW1vLXNwYWNlLXMpOwogICAgfQoKICAgIC8qIFdyYXAgY2VsbCBjb250ZW50cyAqLwoKICAgIDpob3N0KFt0aGVtZX49J3dyYXAtY2VsbC1jb250ZW50J10pIFtwYXJ0fj0nY2VsbCddIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgIH0KCiAgICAvKiBSVEwgc3BlY2lmaWMgc3R5bGVzICovCgogICAgOmhvc3QoW2Rpcj0ncnRsJ10pIFtwYXJ0fj0ncm93J11bZHJhZ3N0YXJ0XSBbcGFydH49J2NlbGwnXVtsYXN0LWNvbHVtbl0gewogICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1sdW1vLWJvcmRlci1yYWRpdXMtcykgMCAwIHZhcigtLWx1bW8tYm9yZGVyLXJhZGl1cy1zKTsKICAgIH0KCiAgICA6aG9zdChbZGlyPSdydGwnXSkgW3BhcnR+PSdyb3cnXVtkcmFnc3RhcnRdIFtwYXJ0fj0nY2VsbCddW2ZpcnN0LWNvbHVtbl0gewogICAgICBib3JkZXItcmFkaXVzOiAwIHZhcigtLWx1bW8tYm9yZGVyLXJhZGl1cy1zKSB2YXIoLS1sdW1vLWJvcmRlci1yYWRpdXMtcykgMDsKICAgIH0KCiAgICA6aG9zdChbZGlyPSdydGwnXVt0aGVtZX49J2NvbHVtbi1ib3JkZXJzJ10pIFtwYXJ0fj0nY2VsbCddOm5vdChbbGFzdC1jb2x1bW5dKTpub3QoW3BhcnR+PSdkZXRhaWxzLWNlbGwnXSkgewogICAgICBib3JkZXItcmlnaHQ6IG5vbmU7CiAgICAgIGJvcmRlci1sZWZ0OiB2YXIoLS1fbHVtby1ncmlkLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tX2x1bW8tZ3JpZC1zZWNvbmRhcnktYm9yZGVyLWNvbG9yKTsKICAgIH0KCiAgICA6aG9zdChbZGlyPSdydGwnXSkgW2xhc3QtZnJvemVuXSB7CiAgICAgIGJvcmRlci1yaWdodDogbm9uZTsKICAgICAgYm9yZGVyLWxlZnQ6IHZhcigtLV9sdW1vLWdyaWQtYm9yZGVyLXdpZHRoKSBzb2xpZCB0cmFuc3BhcmVudDsKICAgIH0KCiAgICA6aG9zdChbZGlyPSdydGwnXVtvdmVyZmxvd349J3JpZ2h0J10pIFtwYXJ0fj0nY2VsbCddW2xhc3QtZnJvemVuXTpub3QoW3BhcnR+PSdkZXRhaWxzLWNlbGwnXSkgewogICAgICBib3JkZXItbGVmdC1jb2xvcjogdmFyKC0tX2x1bW8tZ3JpZC1ib3JkZXItY29sb3IpOwogICAgfQogIGAse21vZHVsZUlkOiJsdW1vLWdyaWQifSksdDF0KCJ2YWFkaW4tY2hlY2tib3giLCRRdGAKICAgIDpob3N0KC52YWFkaW4tZ3JpZC1zZWxlY3QtYWxsLWNoZWNrYm94KSB7CiAgICAgIGZvbnQtc2l6ZTogdmFyKC0tbHVtby1mb250LXNpemUtbSk7CiAgICB9CiAgYCx7bW9kdWxlSWQ6InZhYWRpbi1ncmlkLXNlbGVjdC1hbGwtY2hlY2tib3gtbHVtbyJ9KTsKLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KY29uc3QgSTF0PW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQKD86aG9uZXxhZDsoPzogVTspPyBDUFUpIE9TIChcZCspLyksUjF0PUkxdCYmSTF0WzFdPj04LE8xdD1Vcih7YmVoYXZpb3JzOltDbywkb10sX3JhdGlvOi41LF9zY3JvbGxlclBhZGRpbmdUb3A6MCxfc2Nyb2xsUG9zaXRpb246MCxfcGh5c2ljYWxTaXplOjAsX3BoeXNpY2FsQXZlcmFnZTowLF9waHlzaWNhbEF2ZXJhZ2VDb3VudDowLF9waHlzaWNhbFRvcDowLF92aXJ0dWFsQ291bnQ6MCxfZXN0U2Nyb2xsSGVpZ2h0OjAsX3Njcm9sbEhlaWdodDowLF92aWV3cG9ydEhlaWdodDowLF92aWV3cG9ydFdpZHRoOjAsX3BoeXNpY2FsSXRlbXM6bnVsbCxfcGh5c2ljYWxTaXplczpudWxsLF9maXJzdFZpc2libGVJbmRleFZhbDpudWxsLF9sYXN0VmlzaWJsZUluZGV4VmFsOm51bGwsX21heFBhZ2VzOjIsX2ZvY3VzZWRWaXJ0dWFsSW5kZXg6LTEsX3RlbXBsYXRlQ29zdDowLGdldCBfcGh5c2ljYWxCb3R0b20oKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxUb3ArdGhpcy5fcGh5c2ljYWxTaXplfSxnZXQgX3Njcm9sbEJvdHRvbSgpe3JldHVybiB0aGlzLl9zY3JvbGxQb3NpdGlvbit0aGlzLl92aWV3cG9ydEhlaWdodH0sZ2V0IF92aXJ0dWFsRW5kKCl7cmV0dXJuIHRoaXMuX3ZpcnR1YWxTdGFydCt0aGlzLl9waHlzaWNhbENvdW50LTF9LGdldCBfaGlkZGVuQ29udGVudFNpemUoKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxTaXplLXRoaXMuX3ZpZXdwb3J0SGVpZ2h0fSxnZXQgX21heFNjcm9sbFRvcCgpe3JldHVybiB0aGlzLl9lc3RTY3JvbGxIZWlnaHQtdGhpcy5fdmlld3BvcnRIZWlnaHQrdGhpcy5fc2Nyb2xsT2Zmc2V0fSxnZXQgX21heFZpcnR1YWxTdGFydCgpe3JldHVybiBNYXRoLm1heCgwLHRoaXMuX3ZpcnR1YWxDb3VudC10aGlzLl9waHlzaWNhbENvdW50KX0sc2V0IF92aXJ0dWFsU3RhcnQodCl7dD10aGlzLl9jbGFtcCh0LDAsdGhpcy5fbWF4VmlydHVhbFN0YXJ0KSx0aGlzLl92aXJ0dWFsU3RhcnRWYWw9dH0sZ2V0IF92aXJ0dWFsU3RhcnQoKXtyZXR1cm4gdGhpcy5fdmlydHVhbFN0YXJ0VmFsfHwwfSxzZXQgX3BoeXNpY2FsU3RhcnQodCl7KHQlPXRoaXMuX3BoeXNpY2FsQ291bnQpPDAmJih0PXRoaXMuX3BoeXNpY2FsQ291bnQrdCksdGhpcy5fcGh5c2ljYWxTdGFydFZhbD10fSxnZXQgX3BoeXNpY2FsU3RhcnQoKXtyZXR1cm4gdGhpcy5fcGh5c2ljYWxTdGFydFZhbHx8MH0sZ2V0IF9waHlzaWNhbEVuZCgpe3JldHVybih0aGlzLl9waHlzaWNhbFN0YXJ0K3RoaXMuX3BoeXNpY2FsQ291bnQtMSkldGhpcy5fcGh5c2ljYWxDb3VudH0sc2V0IF9waHlzaWNhbENvdW50KHQpe3RoaXMuX3BoeXNpY2FsQ291bnRWYWw9dH0sZ2V0IF9waHlzaWNhbENvdW50KCl7cmV0dXJuIHRoaXMuX3BoeXNpY2FsQ291bnRWYWx8fDB9LGdldCBfb3B0UGh5c2ljYWxTaXplKCl7cmV0dXJuIDA9PT10aGlzLl92aWV3cG9ydEhlaWdodD8xLzA6dGhpcy5fdmlld3BvcnRIZWlnaHQqdGhpcy5fbWF4UGFnZXN9LGdldCBfaXNWaXNpYmxlKCl7cmV0dXJuIEJvb2xlYW4odGhpcy5vZmZzZXRXaWR0aHx8dGhpcy5vZmZzZXRIZWlnaHQpfSxnZXQgZmlyc3RWaXNpYmxlSW5kZXgoKXtsZXQgdD10aGlzLl9maXJzdFZpc2libGVJbmRleFZhbDtpZihudWxsPT10KXtsZXQgZT10aGlzLl9waHlzaWNhbFRvcCt0aGlzLl9zY3JvbGxPZmZzZXQ7dD10aGlzLl9pdGVyYXRlSXRlbXMoKGZ1bmN0aW9uKHQsbil7aWYoZSs9dGhpcy5fcGh5c2ljYWxTaXplc1t0XSxlPnRoaXMuX3Njcm9sbFBvc2l0aW9uKXJldHVybiBufSkpfHwwLHRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPXR9cmV0dXJuIHR9LGdldCBsYXN0VmlzaWJsZUluZGV4KCl7bGV0IHQ9dGhpcy5fbGFzdFZpc2libGVJbmRleFZhbDtpZihudWxsPT10KXtsZXQgZT10aGlzLl9waHlzaWNhbFRvcCt0aGlzLl9zY3JvbGxPZmZzZXQ7dGhpcy5faXRlcmF0ZUl0ZW1zKChmdW5jdGlvbihuLGkpe2U8dGhpcy5fc2Nyb2xsQm90dG9tJiYodD1pKSxlKz10aGlzLl9waHlzaWNhbFNpemVzW25dfSkpLHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9dH1yZXR1cm4gdH0sZ2V0IF9zY3JvbGxPZmZzZXQoKXtyZXR1cm4gdGhpcy5fc2Nyb2xsZXJQYWRkaW5nVG9wfSxhdHRhY2hlZDpmdW5jdGlvbigpe3RoaXMuX2RlYm91bmNlKCJfcmVuZGVyIix0aGlzLl9yZW5kZXIsX3QpLHRoaXMubGlzdGVuKHRoaXMsImlyb24tcmVzaXplIiwiX3Jlc2l6ZUhhbmRsZXIiKX0sZGV0YWNoZWQ6ZnVuY3Rpb24oKXt0aGlzLnVubGlzdGVuKHRoaXMsImlyb24tcmVzaXplIiwiX3Jlc2l6ZUhhbmRsZXIiKX0sdXBkYXRlVmlld3BvcnRCb3VuZGFyaWVzOmZ1bmN0aW9uKCl7Y29uc3QgdD13aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKTt0aGlzLl9zY3JvbGxlclBhZGRpbmdUb3A9dGhpcy5zY3JvbGxUYXJnZXQ9PT10aGlzPzA6cGFyc2VJbnQodFsicGFkZGluZy10b3AiXSwxMCksdGhpcy5faXNSVEw9Qm9vbGVhbigicnRsIj09PXQuZGlyZWN0aW9uKSx0aGlzLl92aWV3cG9ydFdpZHRoPXRoaXMuJC5pdGVtcy5vZmZzZXRXaWR0aCx0aGlzLl92aWV3cG9ydEhlaWdodD10aGlzLl9zY3JvbGxUYXJnZXRIZWlnaHR9LF9zY3JvbGxIYW5kbGVyOmZ1bmN0aW9uKCl7Y29uc3QgdD1NYXRoLm1heCgwLE1hdGgubWluKHRoaXMuX21heFNjcm9sbFRvcCx0aGlzLl9zY3JvbGxUb3ApKTtsZXQgZT10LXRoaXMuX3Njcm9sbFBvc2l0aW9uO2NvbnN0IG49ZT49MDtpZih0aGlzLl9zY3JvbGxQb3NpdGlvbj10LHRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsPW51bGwsdGhpcy5fbGFzdFZpc2libGVJbmRleFZhbD1udWxsLE1hdGguYWJzKGUpPnRoaXMuX3BoeXNpY2FsU2l6ZSYmdGhpcy5fcGh5c2ljYWxTaXplPjApe2UtPXRoaXMuX3Njcm9sbE9mZnNldDtjb25zdCB0PU1hdGgucm91bmQoZS90aGlzLl9waHlzaWNhbEF2ZXJhZ2UpO3RoaXMuX3ZpcnR1YWxTdGFydD10aGlzLl92aXJ0dWFsU3RhcnQrdCx0aGlzLl9waHlzaWNhbFN0YXJ0PXRoaXMuX3BoeXNpY2FsU3RhcnQrdCx0aGlzLl9waHlzaWNhbFRvcD1NYXRoLmZsb29yKHRoaXMuX3ZpcnR1YWxTdGFydCkqdGhpcy5fcGh5c2ljYWxBdmVyYWdlLHRoaXMuX3VwZGF0ZSgpfWVsc2UgaWYodGhpcy5fcGh5c2ljYWxDb3VudD4wKXtjb25zdHtwaHlzaWNhbFRvcDp0LGluZGV4ZXM6ZX09dGhpcy5fZ2V0UmV1c2FibGVzKG4pO24/KHRoaXMuX3BoeXNpY2FsVG9wPXQsdGhpcy5fdmlydHVhbFN0YXJ0PXRoaXMuX3ZpcnR1YWxTdGFydCtlLmxlbmd0aCx0aGlzLl9waHlzaWNhbFN0YXJ0PXRoaXMuX3BoeXNpY2FsU3RhcnQrZS5sZW5ndGgpOih0aGlzLl92aXJ0dWFsU3RhcnQ9dGhpcy5fdmlydHVhbFN0YXJ0LWUubGVuZ3RoLHRoaXMuX3BoeXNpY2FsU3RhcnQ9dGhpcy5fcGh5c2ljYWxTdGFydC1lLmxlbmd0aCksdGhpcy5fdXBkYXRlKGUsbj9udWxsOmUpLHRoaXMuX2RlYm91bmNlKCJfaW5jcmVhc2VQb29sSWZOZWVkZWQiLHRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkLmJpbmQodGhpcywwKSx2dCl9fSxfZ2V0UmV1c2FibGVzOmZ1bmN0aW9uKHQpe2xldCBlLG4saTtjb25zdCByPVtdLG89dGhpcy5faGlkZGVuQ29udGVudFNpemUqdGhpcy5fcmF0aW8sYT10aGlzLl92aXJ0dWFsU3RhcnQscz10aGlzLl92aXJ0dWFsRW5kLGw9dGhpcy5fcGh5c2ljYWxDb3VudDtsZXQgYz10aGlzLl9waHlzaWNhbFRvcCt0aGlzLl9zY3JvbGxPZmZzZXQ7Y29uc3QgdT10aGlzLl9zY3JvbGxUb3AsaD10aGlzLl9zY3JvbGxCb3R0b207Zm9yKHQ/KGU9dGhpcy5fcGh5c2ljYWxTdGFydCxuPXUtYyk6KGU9dGhpcy5fcGh5c2ljYWxFbmQsbj10aGlzLl9waHlzaWNhbEJvdHRvbSt0aGlzLl9zY3JvbGxPZmZzZXQtaCk7aT10aGlzLl9waHlzaWNhbFNpemVzW2VdLG4tPWksIShyLmxlbmd0aD49bHx8bjw9byk7KWlmKHQpe2lmKHMrci5sZW5ndGgrMT49dGhpcy5fdmlydHVhbENvdW50KWJyZWFrO2lmKGMraT49dS10aGlzLl9zY3JvbGxPZmZzZXQpYnJlYWs7ci5wdXNoKGUpLGMrPWksZT0oZSsxKSVsfWVsc2V7aWYoYS1yLmxlbmd0aDw9MClicmVhaztpZihjK3RoaXMuX3BoeXNpY2FsU2l6ZS1pPD1oKWJyZWFrO3IucHVzaChlKSxjLT1pLGU9MD09PWU/bC0xOmUtMX1yZXR1cm57aW5kZXhlczpyLHBoeXNpY2FsVG9wOmMtdGhpcy5fc2Nyb2xsT2Zmc2V0fX0sX3VwZGF0ZTpmdW5jdGlvbih0LGUpe2lmKCEodCYmMD09PXQubGVuZ3RofHwwPT09dGhpcy5fcGh5c2ljYWxDb3VudCkpe2lmKHRoaXMuX2Fzc2lnbk1vZGVscyh0KSx0aGlzLl91cGRhdGVNZXRyaWNzKHQpLGUpZm9yKDtlLmxlbmd0aDspe2NvbnN0IHQ9ZS5wb3AoKTt0aGlzLl9waHlzaWNhbFRvcC09dGhpcy5fcGh5c2ljYWxTaXplc1t0XX10aGlzLl9wb3NpdGlvbkl0ZW1zKCksdGhpcy5fdXBkYXRlU2Nyb2xsZXJTaXplKCl9fSxfaXNDbGllbnRGdWxsOmZ1bmN0aW9uKCl7cmV0dXJuIDAhPXRoaXMuX3Njcm9sbEJvdHRvbSYmdGhpcy5fcGh5c2ljYWxCb3R0b20tMT49dGhpcy5fc2Nyb2xsQm90dG9tJiZ0aGlzLl9waHlzaWNhbFRvcDw9dGhpcy5fc2Nyb2xsUG9zaXRpb259LF9pbmNyZWFzZVBvb2xJZk5lZWRlZDpmdW5jdGlvbih0KXtjb25zdCBlPXRoaXMuX2NsYW1wKHRoaXMuX3BoeXNpY2FsQ291bnQrdCwzLHRoaXMuX3ZpcnR1YWxDb3VudC10aGlzLl92aXJ0dWFsU3RhcnQpLXRoaXMuX3BoeXNpY2FsQ291bnQ7bGV0IG49TWF0aC5yb3VuZCguNSp0aGlzLl9waHlzaWNhbENvdW50KTtpZighKGU8MCkpe2lmKGU+MCl7Y29uc3QgdD13aW5kb3cucGVyZm9ybWFuY2Uubm93KCk7W10ucHVzaC5hcHBseSh0aGlzLl9waHlzaWNhbEl0ZW1zLHRoaXMuX2NyZWF0ZVBvb2woZSkpO2ZvcihsZXQgdD0wO3Q8ZTt0KyspdGhpcy5fcGh5c2ljYWxTaXplcy5wdXNoKDApO3RoaXMuX3BoeXNpY2FsQ291bnQ9dGhpcy5fcGh5c2ljYWxDb3VudCtlLHRoaXMuX3BoeXNpY2FsU3RhcnQ+dGhpcy5fcGh5c2ljYWxFbmQmJnRoaXMuX2lzSW5kZXhSZW5kZXJlZCh0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4KSYmdGhpcy5fZ2V0UGh5c2ljYWxJbmRleCh0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4KTx0aGlzLl9waHlzaWNhbEVuZCYmKHRoaXMuX3BoeXNpY2FsU3RhcnQ9dGhpcy5fcGh5c2ljYWxTdGFydCtlKSx0aGlzLl91cGRhdGUoKSx0aGlzLl90ZW1wbGF0ZUNvc3Q9KHdpbmRvdy5wZXJmb3JtYW5jZS5ub3coKS10KS9lLG49TWF0aC5yb3VuZCguNSp0aGlzLl9waHlzaWNhbENvdW50KX10aGlzLl92aXJ0dWFsRW5kPj10aGlzLl92aXJ0dWFsQ291bnQtMXx8MD09PW58fCh0aGlzLl9pc0NsaWVudEZ1bGwoKT90aGlzLl9waHlzaWNhbFNpemU8dGhpcy5fb3B0UGh5c2ljYWxTaXplJiZ0aGlzLl9kZWJvdW5jZSgiX2luY3JlYXNlUG9vbElmTmVlZGVkIix0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZC5iaW5kKHRoaXMsdGhpcy5fY2xhbXAoTWF0aC5yb3VuZCg1MC90aGlzLl90ZW1wbGF0ZUNvc3QpLDEsbikpLHl0KTp0aGlzLl9kZWJvdW5jZSgiX2luY3JlYXNlUG9vbElmTmVlZGVkIix0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZC5iaW5kKHRoaXMsbiksdnQpKX19LF9yZW5kZXI6ZnVuY3Rpb24oKXtpZih0aGlzLmlzQXR0YWNoZWQmJnRoaXMuX2lzVmlzaWJsZSlpZigwIT09dGhpcy5fcGh5c2ljYWxDb3VudCl7Y29uc3R7cGh5c2ljYWxUb3A6dCxpbmRleGVzOmV9PXRoaXMuX2dldFJldXNhYmxlcyghMCk7dGhpcy5fcGh5c2ljYWxUb3A9dCx0aGlzLl92aXJ0dWFsU3RhcnQ9dGhpcy5fdmlydHVhbFN0YXJ0K2UubGVuZ3RoLHRoaXMuX3BoeXNpY2FsU3RhcnQ9dGhpcy5fcGh5c2ljYWxTdGFydCtlLmxlbmd0aCx0aGlzLl91cGRhdGUoZSksdGhpcy5fdXBkYXRlKCksdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQoMCl9ZWxzZSB0aGlzLl92aXJ0dWFsQ291bnQ+MCYmKHRoaXMudXBkYXRlVmlld3BvcnRCb3VuZGFyaWVzKCksdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQoMykpfSxfaXRlbXNDaGFuZ2VkOmZ1bmN0aW9uKHQpeyJpdGVtcyI9PT10LnBhdGgmJih0aGlzLl92aXJ0dWFsU3RhcnQ9MCx0aGlzLl9waHlzaWNhbFRvcD0wLHRoaXMuX3ZpcnR1YWxDb3VudD10aGlzLml0ZW1zP3RoaXMuaXRlbXMubGVuZ3RoOjAsdGhpcy5fcGh5c2ljYWxJbmRleEZvcktleT17fSx0aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD1udWxsLHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9bnVsbCx0aGlzLl9waHlzaWNhbENvdW50PXRoaXMuX3BoeXNpY2FsQ291bnR8fDAsdGhpcy5fcGh5c2ljYWxJdGVtcz10aGlzLl9waHlzaWNhbEl0ZW1zfHxbXSx0aGlzLl9waHlzaWNhbFNpemVzPXRoaXMuX3BoeXNpY2FsU2l6ZXN8fFtdLHRoaXMuX3BoeXNpY2FsU3RhcnQ9MCx0aGlzLl9zY3JvbGxUb3A+dGhpcy5fc2Nyb2xsT2Zmc2V0JiZ0aGlzLl9yZXNldFNjcm9sbFBvc2l0aW9uKDApLHRoaXMuX2RlYm91bmNlKCJfcmVuZGVyIix0aGlzLl9yZW5kZXIsX3QpKX0sX2l0ZXJhdGVJdGVtczpmdW5jdGlvbih0LGUpe2xldCBuLGkscixvO2lmKDI9PT1hcmd1bWVudHMubGVuZ3RoJiZlKXtmb3Iobz0wO288ZS5sZW5ndGg7bysrKWlmKG49ZVtvXSxpPXRoaXMuX2NvbXB1dGVWaWR4KG4pLG51bGwhPShyPXQuY2FsbCh0aGlzLG4saSkpKXJldHVybiByfWVsc2V7Zm9yKG49dGhpcy5fcGh5c2ljYWxTdGFydCxpPXRoaXMuX3ZpcnR1YWxTdGFydDtuPHRoaXMuX3BoeXNpY2FsQ291bnQ7bisrLGkrKylpZihudWxsIT0ocj10LmNhbGwodGhpcyxuLGkpKSlyZXR1cm4gcjtmb3Iobj0wO248dGhpcy5fcGh5c2ljYWxTdGFydDtuKyssaSsrKWlmKG51bGwhPShyPXQuY2FsbCh0aGlzLG4saSkpKXJldHVybiByfX0sX2NvbXB1dGVWaWR4OmZ1bmN0aW9uKHQpe3JldHVybiB0Pj10aGlzLl9waHlzaWNhbFN0YXJ0P3RoaXMuX3ZpcnR1YWxTdGFydCsodC10aGlzLl9waHlzaWNhbFN0YXJ0KTp0aGlzLl92aXJ0dWFsU3RhcnQrKHRoaXMuX3BoeXNpY2FsQ291bnQtdGhpcy5fcGh5c2ljYWxTdGFydCkrdH0sX3VwZGF0ZU1ldHJpY3M6ZnVuY3Rpb24odCl7aWYoIXRoaXMuX2lzVmlzaWJsZSlyZXR1cm47V2koKTtsZXQgZT0wLG49MDtjb25zdCBpPXRoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50LHI9dGhpcy5fcGh5c2ljYWxBdmVyYWdlO3RoaXMuX2l0ZXJhdGVJdGVtcygoZnVuY3Rpb24odCl7bis9dGhpcy5fcGh5c2ljYWxTaXplc1t0XSx0aGlzLl9waHlzaWNhbFNpemVzW3RdPXRoaXMuX3BoeXNpY2FsSXRlbXNbdF0ub2Zmc2V0SGVpZ2h0LGUrPXRoaXMuX3BoeXNpY2FsU2l6ZXNbdF0sdGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQrPXRoaXMuX3BoeXNpY2FsU2l6ZXNbdF0/MTowfSksdCksdGhpcy5fcGh5c2ljYWxTaXplPXRoaXMuX3BoeXNpY2FsU2l6ZStlLW4sdGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQhPT1pJiYodGhpcy5fcGh5c2ljYWxBdmVyYWdlPU1hdGgucm91bmQoKHIqaStlKS90aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCkpfSxfcG9zaXRpb25JdGVtczpmdW5jdGlvbigpe3RoaXMuX2FkanVzdFNjcm9sbFBvc2l0aW9uKCk7bGV0IHQ9dGhpcy5fcGh5c2ljYWxUb3A7dGhpcy5faXRlcmF0ZUl0ZW1zKChmdW5jdGlvbihlKXt0aGlzLnRyYW5zbGF0ZTNkKDAsdCsicHgiLDAsdGhpcy5fcGh5c2ljYWxJdGVtc1tlXSksdCs9dGhpcy5fcGh5c2ljYWxTaXplc1tlXX0pKX0sX2FkanVzdFNjcm9sbFBvc2l0aW9uOmZ1bmN0aW9uKCl7Y29uc3QgdD0wPT09dGhpcy5fdmlydHVhbFN0YXJ0P3RoaXMuX3BoeXNpY2FsVG9wOk1hdGgubWluKHRoaXMuX3Njcm9sbFBvc2l0aW9uK3RoaXMuX3BoeXNpY2FsVG9wLDApO2lmKDAhPT10KXt0aGlzLl9waHlzaWNhbFRvcD10aGlzLl9waHlzaWNhbFRvcC10O2NvbnN0IGU9dGhpcy5fc2Nyb2xsVG9wOyFSMXQmJmU+MCYmdGhpcy5fcmVzZXRTY3JvbGxQb3NpdGlvbihlLXQpfX0sX3Jlc2V0U2Nyb2xsUG9zaXRpb246ZnVuY3Rpb24odCl7dGhpcy5zY3JvbGxUYXJnZXQmJnQ+PTAmJih0aGlzLl9zY3JvbGxUb3A9dCx0aGlzLl9zY3JvbGxQb3NpdGlvbj10aGlzLl9zY3JvbGxUb3ApfSxfdXBkYXRlU2Nyb2xsZXJTaXplOmZ1bmN0aW9uKHQpe3RoaXMuX2VzdFNjcm9sbEhlaWdodD10aGlzLl9waHlzaWNhbEJvdHRvbStNYXRoLm1heCh0aGlzLl92aXJ0dWFsQ291bnQtdGhpcy5fcGh5c2ljYWxDb3VudC10aGlzLl92aXJ0dWFsU3RhcnQsMCkqdGhpcy5fcGh5c2ljYWxBdmVyYWdlLCgodD0odD10fHwwPT09dGhpcy5fc2Nyb2xsSGVpZ2h0KXx8dGhpcy5fc2Nyb2xsUG9zaXRpb24+PXRoaXMuX2VzdFNjcm9sbEhlaWdodC10aGlzLl9waHlzaWNhbFNpemUpfHxNYXRoLmFicyh0aGlzLl9lc3RTY3JvbGxIZWlnaHQtdGhpcy5fc2Nyb2xsSGVpZ2h0KT49dGhpcy5fdmlld3BvcnRIZWlnaHQpJiYodGhpcy4kLml0ZW1zLnN0eWxlLmhlaWdodD10aGlzLl9lc3RTY3JvbGxIZWlnaHQrInB4Iix0aGlzLl9zY3JvbGxIZWlnaHQ9dGhpcy5fZXN0U2Nyb2xsSGVpZ2h0KX0sc2Nyb2xsVG9JbmRleDpmdW5jdGlvbih0KXtpZigibnVtYmVyIiE9dHlwZW9mIHR8fHQ8MHx8dD50aGlzLml0ZW1zLmxlbmd0aC0xKXJldHVybjtpZihXaSgpLDA9PT10aGlzLl9waHlzaWNhbENvdW50KXJldHVybjt0PXRoaXMuX2NsYW1wKHQsMCx0aGlzLl92aXJ0dWFsQ291bnQtMSksKCF0aGlzLl9pc0luZGV4UmVuZGVyZWQodCl8fHQ+PXRoaXMuX21heFZpcnR1YWxTdGFydCkmJih0aGlzLl92aXJ0dWFsU3RhcnQ9dC0xKSx0aGlzLl9hc3NpZ25Nb2RlbHMoKSx0aGlzLl91cGRhdGVNZXRyaWNzKCksdGhpcy5fcGh5c2ljYWxUb3A9TWF0aC5mbG9vcih0aGlzLl92aXJ0dWFsU3RhcnQpKnRoaXMuX3BoeXNpY2FsQXZlcmFnZTtsZXQgZT10aGlzLl9waHlzaWNhbFN0YXJ0LG49dGhpcy5fdmlydHVhbFN0YXJ0LGk9MDtjb25zdCByPXRoaXMuX2hpZGRlbkNvbnRlbnRTaXplO2Zvcig7bjx0JiZpPD1yOylpKz10aGlzLl9waHlzaWNhbFNpemVzW2VdLGU9KGUrMSkldGhpcy5fcGh5c2ljYWxDb3VudCxuKys7dGhpcy5fdXBkYXRlU2Nyb2xsZXJTaXplKCEwKSx0aGlzLl9wb3NpdGlvbkl0ZW1zKCksdGhpcy5fcmVzZXRTY3JvbGxQb3NpdGlvbih0aGlzLl9waHlzaWNhbFRvcCt0aGlzLl9zY3JvbGxPZmZzZXQraSksdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQoMCksdGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw9bnVsbCx0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsPW51bGx9LF9yZXNldEF2ZXJhZ2U6ZnVuY3Rpb24oKXt0aGlzLl9waHlzaWNhbEF2ZXJhZ2U9MCx0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudD0wfSxfcmVzaXplSGFuZGxlcjpmdW5jdGlvbigpe3RoaXMuX2RlYm91bmNlKCJfcmVuZGVyIiwoZnVuY3Rpb24oKXt0aGlzLl9maXJzdFZpc2libGVJbmRleFZhbD1udWxsLHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw9bnVsbCx0aGlzLnVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllcygpLHRoaXMuX2lzVmlzaWJsZT8odGhpcy50b2dnbGVTY3JvbGxMaXN0ZW5lcighMCksdGhpcy5fcmVzZXRBdmVyYWdlKCksdGhpcy5fcmVuZGVyKCkpOnRoaXMudG9nZ2xlU2Nyb2xsTGlzdGVuZXIoITEpfSksX3QpfSxfaXNJbmRleFJlbmRlcmVkOmZ1bmN0aW9uKHQpe3JldHVybiB0Pj10aGlzLl92aXJ0dWFsU3RhcnQmJnQ8PXRoaXMuX3ZpcnR1YWxFbmR9LF9nZXRQaHlzaWNhbEluZGV4OmZ1bmN0aW9uKHQpe3JldHVybih0aGlzLl9waHlzaWNhbFN0YXJ0Kyh0LXRoaXMuX3ZpcnR1YWxTdGFydCkpJXRoaXMuX3BoeXNpY2FsQ291bnR9LF9jbGFtcDpmdW5jdGlvbih0LGUsbil7cmV0dXJuIE1hdGgubWluKG4sTWF0aC5tYXgoZSx0KSl9LF9kZWJvdW5jZTpmdW5jdGlvbih0LGUsbil7dGhpcy5fZGVib3VuY2Vycz10aGlzLl9kZWJvdW5jZXJzfHx7fSx0aGlzLl9kZWJvdW5jZXJzW3RdPU5uLmRlYm91bmNlKHRoaXMuX2RlYm91bmNlcnNbdF0sbixlLmJpbmQodGhpcykpLFJuKHRoaXMuX2RlYm91bmNlcnNbdF0pfX0pOwovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqLwpjbGFzcyB6MXQgZXh0ZW5kcyBPMXR7c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7cmV0dXJue3NpemU6e3R5cGU6TnVtYmVyLG5vdGlmeTohMH0sX3ZpZHhPZmZzZXQ6e3R5cGU6TnVtYmVyLHZhbHVlOjB9fX1zdGF0aWMgZ2V0IG9ic2VydmVycygpe3JldHVyblsiX2VmZmVjdGl2ZVNpemVDaGFuZ2VkKF9lZmZlY3RpdmVTaXplKSJdfWNvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKSx0aGlzLl9zY3JvbGxIYW5kbGVyKCl9X3VwZGF0ZVNjcm9sbGVySXRlbSgpe31fYWZ0ZXJTY3JvbGwoKXt9X2dldFJvd1RhcmdldCgpe31fY3JlYXRlU2Nyb2xsZXJSb3dzKCl7fV9jYW5Qb3B1bGF0ZSgpe31zY3JvbGxUb0luZGV4KHQpe3RoaXMuX3dhcm5Qcml2YXRlQVBJQWNjZXNzKCJzY3JvbGxUb0luZGV4IiksdGhpcy5fc2Nyb2xsaW5nVG9JbmRleD0hMCx0PU1hdGgubWluKE1hdGgubWF4KHQsMCksdGhpcy5fZWZmZWN0aXZlU2l6ZS0xKSx0aGlzLiQudGFibGUuc2Nyb2xsVG9wPXQvdGhpcy5fZWZmZWN0aXZlU2l6ZSoodGhpcy4kLnRhYmxlLnNjcm9sbEhlaWdodC10aGlzLiQudGFibGUub2Zmc2V0SGVpZ2h0KSx0aGlzLl9zY3JvbGxIYW5kbGVyKCksdGhpcy5fYWNjZXNzSXJvbkxpc3RBUEkoKCgpPT50aGlzLl9tYXhTY3JvbGxUb3ApKSYmdGhpcy5fdmlydHVhbENvdW50PHRoaXMuX2VmZmVjdGl2ZVNpemUmJnRoaXMuX2FkanVzdFZpcnR1YWxJbmRleE9mZnNldCgxZTYpLHRoaXMuX2FjY2Vzc0lyb25MaXN0QVBJKCgoKT0+c3VwZXIuc2Nyb2xsVG9JbmRleCh0LXRoaXMuX3ZpZHhPZmZzZXQpKSksdGhpcy5fc2Nyb2xsSGFuZGxlcigpO2NvbnN0IGU9QXJyYXkuZnJvbSh0aGlzLiQuaXRlbXMuY2hpbGRyZW4pLmZpbHRlcigoZT0+ZS5pbmRleD09PXQpKVswXTtpZihlKXtjb25zdCB0PWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wLXRoaXMuJC5oZWFkZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tO01hdGguYWJzKHQpPjEmJih0aGlzLiQudGFibGUuc2Nyb2xsVG9wKz10LHRoaXMuX3Njcm9sbEhhbmRsZXIoKSl9dGhpcy5fc2Nyb2xsaW5nVG9JbmRleD0hMX1fZWZmZWN0aXZlU2l6ZUNoYW5nZWQodCl7bGV0IGUsbj0wO2lmKHRoaXMuX2l0ZXJhdGVJdGVtcygoKHQsaSk9PntpZihpPT09dGhpcy5fZmlyc3RWaXNpYmxlSW5kZXgpe2NvbnN0IGk9dGhpcy5fcGh5c2ljYWxJdGVtc1t0XTtlPWkuaW5kZXgsbj1pLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcH19KSksdGhpcy5pdGVtcyYmdDx0aGlzLml0ZW1zLmxlbmd0aCYmKHRoaXMuX3Njcm9sbFRvcD0wKSwhQXJyYXkuaXNBcnJheSh0aGlzLml0ZW1zKSl7dGhpcy5pdGVtcz17bGVuZ3RoOk1hdGgubWluKHQsMWU1KX19dGhpcy5fYWNjZXNzSXJvbkxpc3RBUEkoKCgpPT5zdXBlci5faXRlbXNDaGFuZ2VkKHtwYXRoOiJpdGVtcyJ9KSkpLHRoaXMuX3ZpcnR1YWxDb3VudD1NYXRoLm1pbih0aGlzLml0ZW1zLmxlbmd0aCx0KXx8MCwwPT09dGhpcy5fc2Nyb2xsVG9wJiYodGhpcy5fYWNjZXNzSXJvbkxpc3RBUEkoKCgpPT50aGlzLl9zY3JvbGxUb0luZGV4KE1hdGgubWluKHQtMSxlKSkpKSx0aGlzLl9pdGVyYXRlSXRlbXMoKHQ9Pntjb25zdCBpPXRoaXMuX3BoeXNpY2FsSXRlbXNbdF07aWYoaS5pbmRleD09PWUmJih0aGlzLiQudGFibGUuc2Nyb2xsVG9wKz1NYXRoLnJvdW5kKGkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wLW4pKSxpLmluZGV4PT09dGhpcy5fZm9jdXNlZEl0ZW1JbmRleCYmdGhpcy5faXRlbXNGb2N1c2FibGUmJnRoaXMuJC5pdGVtcy5jb250YWlucyh0aGlzLnNoYWRvd1Jvb3QuYWN0aXZlRWxlbWVudCkpe2NvbnN0IHQ9QXJyYXkuZnJvbSh0aGlzLl9pdGVtc0ZvY3VzYWJsZS5wYXJlbnRFbGVtZW50LmNoaWxkcmVuKS5pbmRleE9mKHRoaXMuX2l0ZW1zRm9jdXNhYmxlKTtpLmNoaWxkcmVuW3RdLmZvY3VzKCl9fSkpKSx0aGlzLl9hc3NpZ25Nb2RlbHMoKSxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT50aGlzLl91cGRhdGUoKSkpLHRoaXMuX191cGRhdGVGb290ZXJQb3NpdGlvbmluZygpfV9wb3NpdGlvbkl0ZW1zKCl7bGV0IHQ7dGhpcy5fYWRqdXN0U2Nyb2xsUG9zaXRpb24oKSxpc05hTih0aGlzLl9waHlzaWNhbFRvcCkmJih0PSEwLHRoaXMuX3BoeXNpY2FsVG9wPTApO2xldCBlPXRoaXMuX3BoeXNpY2FsVG9wO3RoaXMuX2l0ZXJhdGVJdGVtcygodD0+e3RoaXMuX3BoeXNpY2FsSXRlbXNbdF0uc3R5bGUudHJhbnNmb3JtPWB0cmFuc2xhdGVZKCR7ZX1weClgLGUrPXRoaXMuX3BoeXNpY2FsU2l6ZXNbdF19KSksdCYmdGhpcy5fc2Nyb2xsVG9JbmRleCgwKX1faW5jcmVhc2VQb29sSWZOZWVkZWQodCl7MD09PXQmJnRoaXMuX3Njcm9sbGluZ1RvSW5kZXh8fCF0aGlzLl9jYW5Qb3B1bGF0ZSgpfHwhdGhpcy5fZWZmZWN0aXZlU2l6ZXx8KHRoaXMuX2luaXRpYWxQb29sQ3JlYXRlZD90aGlzLl9vcHRQaHlzaWNhbFNpemUhPT0xLzAmJih0aGlzLl9kZWJvdW5jZUluY3JlYXNlUG9vbD1Obi5kZWJvdW5jZSh0aGlzLl9kZWJvdW5jZUluY3JlYXNlUG9vbCxfdCwoKCk9Pnt0aGlzLl91cGRhdGVNZXRyaWNzKCk7bGV0IHQ9TWF0aC5jZWlsKCh0aGlzLl9vcHRQaHlzaWNhbFNpemUtdGhpcy5fcGh5c2ljYWxTaXplKS90aGlzLl9waHlzaWNhbEF2ZXJhZ2UpO3RoaXMuX3BoeXNpY2FsQ291bnQrdD50aGlzLl9lZmZlY3RpdmVTaXplJiYodD1NYXRoLm1heCgwLHRoaXMuX2VmZmVjdGl2ZVNpemUtdGhpcy5fcGh5c2ljYWxDb3VudCkpLHRoaXMuX3BoeXNpY2FsU2l6ZSYmdD4wJiZ0aGlzLl9vcHRQaHlzaWNhbFNpemUhPT0xLzAmJihzdXBlci5faW5jcmVhc2VQb29sSWZOZWVkZWQodCksdGhpcy5fX3Jlb3JkZXJDaGlsZE5vZGVzKCkpfSkpKToodGhpcy5faW5pdGlhbFBvb2xDcmVhdGVkPSEwLHN1cGVyLl9pbmNyZWFzZVBvb2xJZk5lZWRlZCgyNSkpKX1fX3Jlb3JkZXJDaGlsZE5vZGVzKCl7Y29uc3QgdD1BcnJheS5mcm9tKHRoaXMuJC5pdGVtcy5jaGlsZE5vZGVzKTshIXQucmVkdWNlKCgodCxlLG4saSk9PntpZigwPT09bnx8aVtuLTFdLmluZGV4PT09ZS5pbmRleC0xKXJldHVybiB0fSksITApfHx0LnNvcnQoKCh0LGUpPT50LmluZGV4LWUuaW5kZXgpKS5mb3JFYWNoKCh0PT50aGlzLiQuaXRlbXMuYXBwZW5kQ2hpbGQodCkpKX1fY3JlYXRlUG9vbCh0KXtjb25zdCBlPWRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxuPXRoaXMuX2NyZWF0ZVNjcm9sbGVyUm93cyh0KTtuLmZvckVhY2goKHQ9PmUuYXBwZW5kQ2hpbGQodCkpKSx0aGlzLl9nZXRSb3dUYXJnZXQoKS5hcHBlbmRDaGlsZChlKTtjb25zdCBpPXRoaXMucXVlcnlTZWxlY3RvcigiW3Nsb3RdIik7aWYoaSl7Y29uc3QgdD1pLmdldEF0dHJpYnV0ZSgic2xvdCIpO2kuc2V0QXR0cmlidXRlKCJzbG90IiwiZm9vLWJhciIpLGkuc2V0QXR0cmlidXRlKCJzbG90Iix0KX1yZXR1cm4gRGkodGhpcywoKCk9PnRoaXMubm90aWZ5UmVzaXplKCkpKSxufV9hc3NpZ25Nb2RlbHModCl7dGhpcy5faXRlcmF0ZUl0ZW1zKCgodCxlKT0+e2NvbnN0IG49dGhpcy5fcGh5c2ljYWxJdGVtc1t0XTt0aGlzLl90b2dnbGVBdHRyaWJ1dGUoImhpZGRlbiIsZT49dGhpcy5fZWZmZWN0aXZlU2l6ZSxuKSx0aGlzLl91cGRhdGVTY3JvbGxlckl0ZW0obixlKyh0aGlzLl92aWR4T2Zmc2V0fHwwKSl9KSx0KX1fc2Nyb2xsSGFuZGxlcigpe2NvbnN0IHQ9dGhpcy4kLnRhYmxlLnNjcm9sbFRvcC10aGlzLl9zY3JvbGxQb3NpdGlvbjt0aGlzLl9hY2Nlc3NJcm9uTGlzdEFQSShzdXBlci5fc2Nyb2xsSGFuZGxlcik7Y29uc3QgZT10aGlzLl92aWR4T2Zmc2V0O3RoaXMuX2FjY2Vzc0lyb25MaXN0QVBJKCgoKT0+dGhpcy5fbWF4U2Nyb2xsVG9wKSkmJnRoaXMuX3ZpcnR1YWxDb3VudDx0aGlzLl9lZmZlY3RpdmVTaXplP3RoaXMuX2FkanVzdFZpcnR1YWxJbmRleE9mZnNldCh0KTp0aGlzLl92aWR4T2Zmc2V0PTAsdGhpcy5fdmlkeE9mZnNldCE9PWUmJnRoaXMuX3VwZGF0ZSgpLHRoaXMuX2FmdGVyU2Nyb2xsKCl9X2FkanVzdFZpcnR1YWxJbmRleE9mZnNldCh0KXtpZihNYXRoLmFicyh0KT4xZTQpe2lmKHRoaXMuX25vU2NhbGUpcmV0dXJuIHZvaWQodGhpcy5fbm9TY2FsZT0hMSk7Y29uc3QgdD10aGlzLiQudGFibGUuc2Nyb2xsVG9wLyh0aGlzLiQudGFibGUuc2Nyb2xsSGVpZ2h0LXRoaXMuJC50YWJsZS5vZmZzZXRIZWlnaHQpO3RoaXMuX3ZpZHhPZmZzZXQ9TWF0aC5yb3VuZCh0KnRoaXMuX2VmZmVjdGl2ZVNpemUtdCp0aGlzLl92aXJ0dWFsQ291bnQpfWVsc2V7Y29uc3QgdD10aGlzLl92aWR4T2Zmc2V0fHwwLGU9MWUzLG49MTAwOzA9PT10aGlzLl9zY3JvbGxUb3A/KHRoaXMuX3ZpZHhPZmZzZXQ9MCx0IT09dGhpcy5fdmlkeE9mZnNldCYmc3VwZXIuc2Nyb2xsVG9JbmRleCgwKSk6dGhpcy5maXJzdFZpc2libGVJbmRleDxlJiZ0aGlzLl92aWR4T2Zmc2V0PjAmJih0aGlzLl92aWR4T2Zmc2V0LT1NYXRoLm1pbih0aGlzLl92aWR4T2Zmc2V0LG4pLHQhPT10aGlzLl92aWR4T2Zmc2V0JiZzdXBlci5zY3JvbGxUb0luZGV4KHRoaXMuZmlyc3RWaXNpYmxlSW5kZXgrKHQtdGhpcy5fdmlkeE9mZnNldCkpLHRoaXMuX25vU2NhbGU9ITApO2NvbnN0IGk9dGhpcy5fZWZmZWN0aXZlU2l6ZS10aGlzLl92aXJ0dWFsQ291bnQ7dGhpcy5fc2Nyb2xsVG9wPj10aGlzLl9tYXhTY3JvbGxUb3AmJnRoaXMuX21heFNjcm9sbFRvcD4wPyh0aGlzLl92aWR4T2Zmc2V0PWksdCE9PXRoaXMuX3ZpZHhPZmZzZXQmJnN1cGVyLnNjcm9sbFRvSW5kZXgodGhpcy5fdmlydHVhbENvdW50KSk6dGhpcy5maXJzdFZpc2libGVJbmRleD50aGlzLl92aXJ0dWFsQ291bnQtZSYmdGhpcy5fdmlkeE9mZnNldDxpJiYodGhpcy5fdmlkeE9mZnNldCs9TWF0aC5taW4oaS10aGlzLl92aWR4T2Zmc2V0LG4pLHQhPT10aGlzLl92aWR4T2Zmc2V0JiZzdXBlci5zY3JvbGxUb0luZGV4KHRoaXMuZmlyc3RWaXNpYmxlSW5kZXgtKHRoaXMuX3ZpZHhPZmZzZXQtdCkpLHRoaXMuX25vU2NhbGU9ITApfX1fYWNjZXNzSXJvbkxpc3RBUEkodCl7dGhpcy5fd2FyblByaXZhdGVBUElBY2Nlc3NBc3luY0VuYWJsZWQ9ITE7Y29uc3QgZT10LmFwcGx5KHRoaXMpO3JldHVybiB0aGlzLl9kZWJvdW5jZXJXYXJuUHJpdmF0ZUFQSUFjY2Vzcz1Obi5kZWJvdW5jZSh0aGlzLl9kZWJvdW5jZXJXYXJuUHJpdmF0ZUFQSUFjY2VzcyxfdCwoKCk9PnRoaXMuX3dhcm5Qcml2YXRlQVBJQWNjZXNzQXN5bmNFbmFibGVkPSEwKSksZX1fZGVib3VuY2VSZW5kZXIodCxlKXtzdXBlci5fZGVib3VuY2VSZW5kZXIoKCgpPT50aGlzLl9hY2Nlc3NJcm9uTGlzdEFQSSh0KSksZSl9X3dhcm5Qcml2YXRlQVBJQWNjZXNzKHQpe3RoaXMuX3dhcm5Qcml2YXRlQVBJQWNjZXNzQXN5bmNFbmFibGVkJiZjb25zb2xlLndhcm4oYEFjY2Vzc2luZyBwcml2YXRlIEFQSSAoJHt0fSkhYCl9X3JlbmRlcigpe3RoaXMuX2FjY2Vzc0lyb25MaXN0QVBJKHN1cGVyLl9yZW5kZXIpfV9pdGVtc0NoYW5nZWQoKXt9Z2V0IF9maXJzdFZpc2libGVJbmRleCgpe3JldHVybiB0aGlzLl9hY2Nlc3NJcm9uTGlzdEFQSSgoKCk9PnN1cGVyLmZpcnN0VmlzaWJsZUluZGV4KSl9Z2V0IF9sYXN0VmlzaWJsZUluZGV4KCl7cmV0dXJuIHRoaXMuX2FjY2Vzc0lyb25MaXN0QVBJKCgoKT0+c3VwZXIubGFzdFZpc2libGVJbmRleCkpfV9zY3JvbGxUb0luZGV4KHQpe3RoaXMuX2FjY2Vzc0lyb25MaXN0QVBJKCgoKT0+dGhpcy5zY3JvbGxUb0luZGV4KHQpKSl9Z2V0IGZpcnN0VmlzaWJsZUluZGV4KCl7cmV0dXJuIHRoaXMuX3dhcm5Qcml2YXRlQVBJQWNjZXNzKCJmaXJzdFZpc2libGVJbmRleCIpLHN1cGVyLmZpcnN0VmlzaWJsZUluZGV4fXNldCBmaXJzdFZpc2libGVJbmRleCh0KXt0aGlzLl93YXJuUHJpdmF0ZUFQSUFjY2VzcygiZmlyc3RWaXNpYmxlSW5kZXgiKSxzdXBlci5maXJzdFZpc2libGVJbmRleD10fWdldCBsYXN0VmlzaWJsZUluZGV4KCl7cmV0dXJuIHRoaXMuX3dhcm5Qcml2YXRlQVBJQWNjZXNzKCJsYXN0VmlzaWJsZUluZGV4Iiksc3VwZXIubGFzdFZpc2libGVJbmRleH1zZXQgbGFzdFZpc2libGVJbmRleCh0KXt0aGlzLl93YXJuUHJpdmF0ZUFQSUFjY2VzcygibGFzdFZpc2libGVJbmRleCIpLHN1cGVyLmxhc3RWaXNpYmxlSW5kZXg9dH11cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXMoKXt0aGlzLl93YXJuUHJpdmF0ZUFQSUFjY2VzcygidXBkYXRlVmlld3BvcnRCb3VuZGFyaWVzIiksc3VwZXIudXBkYXRlVmlld3BvcnRCb3VuZGFyaWVzLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1fcmVzaXplSGFuZGxlcigpe3N1cGVyLl9yZXNpemVIYW5kbGVyKCksV2koKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovY29uc3QgRDF0PXQ9PmNsYXNzIGV4dGVuZHMgdHtzdGF0aWMgZ2V0IG9ic2VydmVycygpe3JldHVyblsiX2ExMXlVcGRhdGVHcmlkU2l6ZShzaXplLCBfY29sdW1uVHJlZSwgX2NvbHVtblRyZWUuKikiXX1fYTExeUdldEhlYWRlclJvd0NvdW50KHQpe3JldHVybiB0LmZpbHRlcigodD0+dC5zb21lKCh0PT50Ll9oZWFkZXJUZW1wbGF0ZXx8dC5oZWFkZXJSZW5kZXJlcnx8dC5wYXRofHx0LmhlYWRlcikpKSkubGVuZ3RofV9hMTF5R2V0Rm9vdGVyUm93Q291bnQodCl7cmV0dXJuIHQuZmlsdGVyKCh0PT50LnNvbWUoKHQ9PnQuX2hlYWRlclRlbXBsYXRlfHx0LmhlYWRlclJlbmRlcmVyKSkpKS5sZW5ndGh9X2ExMXlVcGRhdGVHcmlkU2l6ZSh0LGUpe2lmKHZvaWQgMD09PXR8fHZvaWQgMD09PWUpcmV0dXJuO2NvbnN0IG49ZVtlLmxlbmd0aC0xXTt0aGlzLiQudGFibGUuc2V0QXR0cmlidXRlKCJhcmlhLXJvd2NvdW50Iix0K3RoaXMuX2ExMXlHZXRIZWFkZXJSb3dDb3VudChlKSt0aGlzLl9hMTF5R2V0Rm9vdGVyUm93Q291bnQoZSkpLHRoaXMuJC50YWJsZS5zZXRBdHRyaWJ1dGUoImFyaWEtY29sY291bnQiLG4mJm4ubGVuZ3RofHwwKSx0aGlzLl9hMTF5VXBkYXRlSGVhZGVyUm93cygpLHRoaXMuX2ExMXlVcGRhdGVGb290ZXJSb3dzKCl9X2ExMXlVcGRhdGVIZWFkZXJSb3dzKCl7QXJyYXkuZnJvbSh0aGlzLiQuaGVhZGVyLmNoaWxkcmVuKS5mb3JFYWNoKCgodCxlKT0+dC5zZXRBdHRyaWJ1dGUoImFyaWEtcm93aW5kZXgiLGUrMSkpKX1fYTExeVVwZGF0ZUZvb3RlclJvd3MoKXtBcnJheS5mcm9tKHRoaXMuJC5mb290ZXIuY2hpbGRyZW4pLmZvckVhY2goKCh0LGUpPT50LnNldEF0dHJpYnV0ZSgiYXJpYS1yb3dpbmRleCIsdGhpcy5fYTExeUdldEhlYWRlclJvd0NvdW50KHRoaXMuX2NvbHVtblRyZWUpK3RoaXMuc2l6ZStlKzEpKSl9X2ExMXlVcGRhdGVSb3dSb3dpbmRleCh0LGUpe3Quc2V0QXR0cmlidXRlKCJhcmlhLXJvd2luZGV4IixlK3RoaXMuX2ExMXlHZXRIZWFkZXJSb3dDb3VudCh0aGlzLl9jb2x1bW5UcmVlKSsxKX1fYTExeVVwZGF0ZVJvd1NlbGVjdGVkKHQsZSl7dC5zZXRBdHRyaWJ1dGUoImFyaWEtc2VsZWN0ZWQiLEJvb2xlYW4oZSkpLEFycmF5LmZyb20odC5jaGlsZHJlbikuZm9yRWFjaCgodD0+dC5zZXRBdHRyaWJ1dGUoImFyaWEtc2VsZWN0ZWQiLEJvb2xlYW4oZSkpKSl9X2ExMXlVcGRhdGVSb3dMZXZlbCh0LGUpe3Quc2V0QXR0cmlidXRlKCJhcmlhLWxldmVsIixlKzEpfV9hMTF5VXBkYXRlUm93RGV0YWlsc09wZW5lZCh0LGUpe0FycmF5LmZyb20odC5jaGlsZHJlbikuZm9yRWFjaCgodD0+eyJib29sZWFuIj09dHlwZW9mIGU/dC5zZXRBdHRyaWJ1dGUoImFyaWEtZXhwYW5kZWQiLGUpOnQuaGFzQXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIikmJnQucmVtb3ZlQXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIil9KSl9X2ExMXlTZXRSb3dEZXRhaWxzQ2VsbCh0LGUpe0FycmF5LmZyb20odC5jaGlsZHJlbikuZm9yRWFjaCgodD0+e3QhPT1lJiZ0LnNldEF0dHJpYnV0ZSgiYXJpYS1jb250cm9scyIsZS5pZCl9KSl9X2ExMXlVcGRhdGVDZWxsQ29sc3Bhbih0LGUpe3Quc2V0QXR0cmlidXRlKCJhcmlhLWNvbHNwYW4iLE51bWJlcihlKSl9X2ExMXlVcGRhdGVTb3J0ZXJzKCl7QXJyYXkuZnJvbSh0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoInZhYWRpbi1ncmlkLXNvcnRlciIpKS5mb3JFYWNoKCh0PT57bGV0IGU9dC5wYXJlbnROb2RlO2Zvcig7ZSYmInZhYWRpbi1ncmlkLWNlbGwtY29udGVudCIhPT1lLmxvY2FsTmFtZTspZT1lLnBhcmVudE5vZGU7aWYoZSYmZS5hc3NpZ25lZFNsb3Qpe2UuYXNzaWduZWRTbG90LnBhcmVudE5vZGUuc2V0QXR0cmlidXRlKCJhcmlhLXNvcnQiLHthc2M6ImFzY2VuZGluZyIsZGVzYzoiZGVzY2VuZGluZyJ9W1N0cmluZyh0LmRpcmVjdGlvbildfHwibm9uZSIpfX0pKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovLEIxdD10PT5jbGFzcyBleHRlbmRzIHR7c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7cmV0dXJue2FjdGl2ZUl0ZW06e3R5cGU6T2JqZWN0LG5vdGlmeTohMCx2YWx1ZTpudWxsfX19cmVhZHkoKXtzdXBlci5yZWFkeSgpLHRoaXMuJC5zY3JvbGxlci5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsdGhpcy5fb25DbGljay5iaW5kKHRoaXMpKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImNlbGwtYWN0aXZhdGUiLHRoaXMuX2FjdGl2YXRlSXRlbS5iaW5kKHRoaXMpKX1fYWN0aXZhdGVJdGVtKHQpe2NvbnN0IGU9dC5kZXRhaWwubW9kZWwsbj1lP2UuaXRlbTpudWxsO24mJih0aGlzLmFjdGl2ZUl0ZW09dGhpcy5faXRlbXNFcXVhbCh0aGlzLmFjdGl2ZUl0ZW0sbik/bnVsbDpuKX1fb25DbGljayh0KXtpZih0LmRlZmF1bHRQcmV2ZW50ZWQpcmV0dXJuO2NvbnN0IGU9dC5jb21wb3NlZFBhdGgoKSxuPWVbZS5pbmRleE9mKHRoaXMuJC50YWJsZSktM107aWYoIW58fG4uZ2V0QXR0cmlidXRlKCJwYXJ0IikuaW5kZXhPZigiZGV0YWlscy1jZWxsIik+LTEpcmV0dXJuO2NvbnN0IGk9bi5fY29udGVudCxyPXRoaXMuZ2V0Um9vdE5vZGUoKS5hY3RpdmVFbGVtZW50O2kuY29udGFpbnMocil8fHRoaXMuX2lzRm9jdXNhYmxlKHQudGFyZ2V0KXx8dGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiY2VsbC1hY3RpdmF0ZSIse2RldGFpbDp7bW9kZWw6dGhpcy5fX2dldFJvd01vZGVsKG4ucGFyZW50RWxlbWVudCl9fSkpfV9pc0ZvY3VzYWJsZSh0KXtyZXR1cm4gSDF0KHQpfX0sSDF0PXQ9PntpZighdC5wYXJlbnROb2RlKXJldHVybiExO2NvbnN0IGU9LTEhPT1BcnJheS5mcm9tKHQucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKCJbdGFiaW5kZXhdLCBidXR0b24sIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBvYmplY3QsIGlmcmFtZSwgbGFiZWwsIGFbaHJlZl0sIGFyZWFbaHJlZl0iKSkuZmlsdGVyKCh0PT4iY2VsbCBib2R5LWNlbGwiIT09dC5nZXRBdHRyaWJ1dGUoInBhcnQiKSkpLmluZGV4T2YodCk7cmV0dXJuIXQuZGlzYWJsZWQmJmV9LEYxdD10PT5jbGFzcyBleHRlbmRzIHR7c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7cmV0dXJue2l0ZW1zOkFycmF5fX1zdGF0aWMgZ2V0IG9ic2VydmVycygpe3JldHVyblsiX2l0ZW1zQ2hhbmdlZChpdGVtcywgaXRlbXMuKiwgaXNBdHRhY2hlZCkiXX1faXRlbXNDaGFuZ2VkKHQsZSxuKXtpZihuKXtpZighQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gbnVsbD09dCYmKHRoaXMuc2l6ZT0wKSx2b2lkKHRoaXMuZGF0YVByb3ZpZGVyPT09dGhpcy5fYXJyYXlEYXRhUHJvdmlkZXImJih0aGlzLmRhdGFQcm92aWRlcj12b2lkIDApKTt0aGlzLnNpemU9dC5sZW5ndGgsdGhpcy5kYXRhUHJvdmlkZXI9dGhpcy5kYXRhUHJvdmlkZXJ8fHRoaXMuX2FycmF5RGF0YVByb3ZpZGVyLHRoaXMuY2xlYXJDYWNoZSgpLHRoaXMuX2Vuc3VyZUZpcnN0UGFnZUxvYWRlZCgpfX1fYXJyYXlEYXRhUHJvdmlkZXIodCxlKXtsZXQgbj0oQXJyYXkuaXNBcnJheSh0aGlzLml0ZW1zKT90aGlzLml0ZW1zOltdKS5zbGljZSgwKTt0aGlzLl9maWx0ZXJzJiZ0aGlzLl9jaGVja1BhdGhzKHRoaXMuX2ZpbHRlcnMsImZpbHRlcmluZyIsbikmJihuPXRoaXMuX2ZpbHRlcihuKSksdGhpcy5zaXplPW4ubGVuZ3RoLHQuc29ydE9yZGVycy5sZW5ndGgmJnRoaXMuX2NoZWNrUGF0aHModGhpcy5fc29ydGVycywic29ydGluZyIsbikmJihuPW4uc29ydCh0aGlzLl9tdWx0aVNvcnQuYmluZCh0aGlzKSkpO2NvbnN0IGk9dC5wYWdlKnQucGFnZVNpemU7ZShuLnNsaWNlKGksaSt0LnBhZ2VTaXplKSxuLmxlbmd0aCl9X2NoZWNrUGF0aHModCxlLG4pe2lmKCFuLmxlbmd0aClyZXR1cm4hMTtsZXQgaT0hMDtmb3IobGV0IHIgaW4gdCl7Y29uc3Qgbz10W3JdLnBhdGg7aWYoIW98fC0xPT09by5pbmRleE9mKCIuIikpY29udGludWU7Y29uc3QgYT1vLnJlcGxhY2UoL1wuW14uXSokLywiIik7dm9pZCAwPT09RW8uZ2V0KGEsblswXSkmJihjb25zb2xlLndhcm4oYFBhdGggIiR7b30iIHVzZWQgZm9yICR7ZX0gZG9lcyBub3QgZXhpc3QgaW4gYWxsIG9mIHRoZSBpdGVtcywgJHtlfSBpcyBkaXNhYmxlZC5gKSxpPSExKX1yZXR1cm4gaX1fbXVsdGlTb3J0KHQsZSl7cmV0dXJuIHRoaXMuX3NvcnRlcnMubWFwKChuPT4iYXNjIj09PW4uZGlyZWN0aW9uP3RoaXMuX2NvbXBhcmUoRW8uZ2V0KG4ucGF0aCx0KSxFby5nZXQobi5wYXRoLGUpKToiZGVzYyI9PT1uLmRpcmVjdGlvbj90aGlzLl9jb21wYXJlKEVvLmdldChuLnBhdGgsZSksRW8uZ2V0KG4ucGF0aCx0KSk6MCkpLnJlZHVjZSgoKHQsZSk9PnR8fGUpLDApfV9ub3JtYWxpemVFbXB0eVZhbHVlKHQpe3JldHVyblt2b2lkIDAsbnVsbF0uaW5kZXhPZih0KT49MD8iIjppc05hTih0KT90LnRvU3RyaW5nKCk6dH1fY29tcGFyZSh0LGUpe3JldHVybih0PXRoaXMuX25vcm1hbGl6ZUVtcHR5VmFsdWUodCkpPChlPXRoaXMuX25vcm1hbGl6ZUVtcHR5VmFsdWUoZSkpPy0xOnQ+ZT8xOjB9X2ZpbHRlcih0KXtyZXR1cm4gdC5maWx0ZXIoKHQ9PjA9PT10aGlzLl9maWx0ZXJzLmZpbHRlcigoZT0+e2NvbnN0IG49dGhpcy5fbm9ybWFsaXplRW1wdHlWYWx1ZShFby5nZXQoZS5wYXRoLHQpKSxpPXRoaXMuX25vcm1hbGl6ZUVtcHR5VmFsdWUoZS52YWx1ZSkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpO3JldHVybi0xPT09bi50b1N0cmluZygpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihpKX0pKS5sZW5ndGgpKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovLFYxdD10PT5jbGFzcyBleHRlbmRzKGJpKHQpKXtyZWFkeSgpe3N1cGVyLnJlYWR5KCk7Y29uc3QgdD10aGlzLiQuc2Nyb2xsZXI7Y2kodCwidHJhY2siLHRoaXMuX29uSGVhZGVyVHJhY2suYmluZCh0aGlzKSksdC5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaG1vdmUiLChlPT50Lmhhc0F0dHJpYnV0ZSgiY29sdW1uLXJlc2l6aW5nIikmJmUucHJldmVudERlZmF1bHQoKSkpLHQuYWRkRXZlbnRMaXN0ZW5lcigiY29udGV4dG1lbnUiLCh0PT4icmVzaXplLWhhbmRsZSI9PXQudGFyZ2V0LmdldEF0dHJpYnV0ZSgicGFydCIpJiZ0LnByZXZlbnREZWZhdWx0KCkpKSx0LmFkZEV2ZW50TGlzdGVuZXIoIm1vdXNlZG93biIsKHQ9PiJyZXNpemUtaGFuZGxlIj09PXQudGFyZ2V0LmdldEF0dHJpYnV0ZSgicGFydCIpJiZ0LnByZXZlbnREZWZhdWx0KCkpKX1fb25IZWFkZXJUcmFjayh0KXtjb25zdCBlPXQudGFyZ2V0O2lmKCJyZXNpemUtaGFuZGxlIj09PWUuZ2V0QXR0cmlidXRlKCJwYXJ0Iikpe2xldCBuPWUucGFyZW50RWxlbWVudC5fY29sdW1uO2Zvcih0aGlzLl90b2dnbGVBdHRyaWJ1dGUoImNvbHVtbi1yZXNpemluZyIsITAsdGhpcy4kLnNjcm9sbGVyKTsidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIj09PW4ubG9jYWxOYW1lOyluPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKG4uX2NoaWxkQ29sdW1ucywwKS5zb3J0KChmdW5jdGlvbih0LGUpe3JldHVybiB0Ll9vcmRlci1lLl9vcmRlcn0pKS5maWx0ZXIoKGZ1bmN0aW9uKHQpe3JldHVybiF0LmhpZGRlbn0pKS5wb3AoKTtjb25zdCBpPUFycmF5LmZyb20odGhpcy4kLmhlYWRlci5xdWVyeVNlbGVjdG9yQWxsKCdbcGFydH49InJvdyJdOmxhc3QtY2hpbGQgW3BhcnR+PSJjZWxsIl0nKSkscj1pLmZpbHRlcigodD0+dC5fY29sdW1uPT09bikpWzBdO2lmKHIub2Zmc2V0V2lkdGgpe2NvbnN0IGU9d2luZG93LmdldENvbXB1dGVkU3R5bGUociksaT0xMCtwYXJzZUludChlLnBhZGRpbmdMZWZ0KStwYXJzZUludChlLnBhZGRpbmdSaWdodCkrcGFyc2VJbnQoZS5ib3JkZXJMZWZ0V2lkdGgpK3BhcnNlSW50KGUuYm9yZGVyUmlnaHRXaWR0aCkrcGFyc2VJbnQoZS5tYXJnaW5MZWZ0KStwYXJzZUludChlLm1hcmdpblJpZ2h0KSxvPXIub2Zmc2V0V2lkdGgrKHRoaXMuX19pc1JUTD9yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQtdC5kZXRhaWwueDp0LmRldGFpbC54LXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQpO24ud2lkdGg9TWF0aC5tYXgoaSxvKSsicHgiLG4uZmxleEdyb3c9MH1pLnNvcnQoKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQuX2NvbHVtbi5fb3JkZXItZS5fY29sdW1uLl9vcmRlcn0pKS5mb3JFYWNoKChmdW5jdGlvbih0LGUsbil7ZTxuLmluZGV4T2YocikmJih0Ll9jb2x1bW4ud2lkdGg9dC5vZmZzZXRXaWR0aCsicHgiLHQuX2NvbHVtbi5mbGV4R3Jvdz0wKX0pKSwiZW5kIj09PXQuZGV0YWlsLnN0YXRlJiYodGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJjb2x1bW4tcmVzaXppbmciLCExLHRoaXMuJC5zY3JvbGxlciksdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgiY29sdW1uLXJlc2l6ZSIse2RldGFpbDp7cmVzaXplZENvbHVtbjpufX0pKSksdGhpcy5fcmVzaXplSGFuZGxlcigpfX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovLFUxdD1jbGFzcyB0e2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLmdyaWQ9dCx0aGlzLnBhcmVudENhY2hlPWUsdGhpcy5wYXJlbnRJdGVtPW4sdGhpcy5pdGVtQ2FjaGVzPXt9LHRoaXMuaXRlbXM9e30sdGhpcy5lZmZlY3RpdmVTaXplPTAsdGhpcy5zaXplPTAsdGhpcy5wZW5kaW5nUmVxdWVzdHM9e319aXNMb2FkaW5nKCl7cmV0dXJuIEJvb2xlYW4oT2JqZWN0LmtleXModGhpcy5wZW5kaW5nUmVxdWVzdHMpLmxlbmd0aHx8T2JqZWN0LmtleXModGhpcy5pdGVtQ2FjaGVzKS5maWx0ZXIoKHQ9PnRoaXMuaXRlbUNhY2hlc1t0XS5pc0xvYWRpbmcoKSkpWzBdKX1nZXRJdGVtRm9ySW5kZXgodCl7Y29uc3R7Y2FjaGU6ZSxzY2FsZWRJbmRleDpufT10aGlzLmdldENhY2hlQW5kSW5kZXgodCk7cmV0dXJuIGUuaXRlbXNbbl19dXBkYXRlU2l6ZSgpe3RoaXMuZWZmZWN0aXZlU2l6ZT0hdGhpcy5wYXJlbnRJdGVtfHx0aGlzLmdyaWQuX2lzRXhwYW5kZWQodGhpcy5wYXJlbnRJdGVtKT90aGlzLnNpemUrT2JqZWN0LmtleXModGhpcy5pdGVtQ2FjaGVzKS5yZWR1Y2UoKCh0LGUpPT57Y29uc3Qgbj10aGlzLml0ZW1DYWNoZXNbZV07cmV0dXJuIG4udXBkYXRlU2l6ZSgpLHQrbi5lZmZlY3RpdmVTaXplfSksMCk6MH1lbnN1cmVTdWJDYWNoZUZvclNjYWxlZEluZGV4KGUpe2lmKCF0aGlzLml0ZW1DYWNoZXNbZV0pe2NvbnN0IG49bmV3IHQodGhpcy5ncmlkLHRoaXMsdGhpcy5pdGVtc1tlXSk7dGhpcy5pdGVtQ2FjaGVzW2VdPW4sdGhpcy5ncmlkLl9sb2FkUGFnZSgwLG4pfX1nZXRDYWNoZUFuZEluZGV4KHQpe2xldCBlPXQ7Y29uc3Qgbj1PYmplY3Qua2V5cyh0aGlzLml0ZW1DYWNoZXMpO2ZvcihsZXQgdD0wO3Q8bi5sZW5ndGg7dCsrKXtjb25zdCBpPU51bWJlcihuW3RdKSxyPXRoaXMuaXRlbUNhY2hlc1tpXTtpZihlPD1pKXJldHVybntjYWNoZTp0aGlzLHNjYWxlZEluZGV4OmV9O2lmKGU8PWkrci5lZmZlY3RpdmVTaXplKXJldHVybiByLmdldENhY2hlQW5kSW5kZXgoZS1pLTEpO2UtPXIuZWZmZWN0aXZlU2l6ZX1yZXR1cm57Y2FjaGU6dGhpcyxzY2FsZWRJbmRleDplfX19LGoxdD10PT5jbGFzcyBleHRlbmRzIHR7c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7cmV0dXJue3BhZ2VTaXplOnt0eXBlOk51bWJlcix2YWx1ZTo1MCxvYnNlcnZlcjoiX3BhZ2VTaXplQ2hhbmdlZCJ9LGRhdGFQcm92aWRlcjp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLG9ic2VydmVyOiJfZGF0YVByb3ZpZGVyQ2hhbmdlZCJ9LGxvYWRpbmc6e3R5cGU6Qm9vbGVhbixub3RpZnk6ITAscmVhZE9ubHk6ITAscmVmbGVjdFRvQXR0cmlidXRlOiEwfSxfY2FjaGU6e3R5cGU6T2JqZWN0LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIG5ldyBVMXQodGhpcyl9fSxpdGVtSWRQYXRoOnt0eXBlOlN0cmluZyx2YWx1ZTpudWxsfSxleHBhbmRlZEl0ZW1zOnt0eXBlOk9iamVjdCxub3RpZnk6ITAsdmFsdWU6KCk9PltdfX19c3RhdGljIGdldCBvYnNlcnZlcnMoKXtyZXR1cm5bIl9zaXplQ2hhbmdlZChzaXplKSIsIl9pdGVtSWRQYXRoQ2hhbmdlZChpdGVtSWRQYXRoKSIsIl9leHBhbmRlZEl0ZW1zQ2hhbmdlZChleHBhbmRlZEl0ZW1zLiopIl19X3NpemVDaGFuZ2VkKHQpe2NvbnN0IGU9dC10aGlzLl9jYWNoZS5zaXplO3RoaXMuX2NhY2hlLnNpemUrPWUsdGhpcy5fY2FjaGUuZWZmZWN0aXZlU2l6ZSs9ZSx0aGlzLl9lZmZlY3RpdmVTaXplPXRoaXMuX2NhY2hlLmVmZmVjdGl2ZVNpemUsdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQoMCksdGhpcy5fZGVib3VuY2VJbmNyZWFzZVBvb2wmJnRoaXMuX2RlYm91bmNlSW5jcmVhc2VQb29sLmZsdXNoKCl9X2dldEl0ZW0odCxlKXtpZih0Pj10aGlzLl9lZmZlY3RpdmVTaXplKXJldHVybjtlLmluZGV4PXQ7Y29uc3R7Y2FjaGU6bixzY2FsZWRJbmRleDppfT10aGlzLl9jYWNoZS5nZXRDYWNoZUFuZEluZGV4KHQpLHI9bi5pdGVtc1tpXTtyPyh0aGlzLl90b2dnbGVBdHRyaWJ1dGUoImxvYWRpbmciLCExLGUpLHRoaXMuX3VwZGF0ZUl0ZW0oZSxyKSx0aGlzLl9pc0V4cGFuZGVkKHIpJiZuLmVuc3VyZVN1YkNhY2hlRm9yU2NhbGVkSW5kZXgoaSkpOih0aGlzLl90b2dnbGVBdHRyaWJ1dGUoImxvYWRpbmciLCEwLGUpLHRoaXMuX2xvYWRQYWdlKHRoaXMuX2dldFBhZ2VGb3JJbmRleChpKSxuKSl9X2V4cGFuZGVkSW5zdGFuY2VDaGFuZ2VkQ2FsbGJhY2sodCxlKXt2b2lkIDAhPT10Lml0ZW0mJihlP3RoaXMuZXhwYW5kSXRlbSh0Lml0ZW0pOnRoaXMuY29sbGFwc2VJdGVtKHQuaXRlbSkpfWdldEl0ZW1JZCh0KXtyZXR1cm4gdGhpcy5pdGVtSWRQYXRoP3RoaXMuZ2V0KHRoaXMuaXRlbUlkUGF0aCx0KTp0fV9pc0V4cGFuZGVkKHQpe3JldHVybiB0aGlzLl9fZXhwYW5kZWRLZXlzLmhhcyh0aGlzLmdldEl0ZW1JZCh0KSl9X2V4cGFuZGVkSXRlbXNDaGFuZ2VkKCl7dGhpcy5fX2NhY2hlRXhwYW5kZWRLZXlzKCksdGhpcy5fY2FjaGUudXBkYXRlU2l6ZSgpLHRoaXMuX2VmZmVjdGl2ZVNpemU9dGhpcy5fY2FjaGUuZWZmZWN0aXZlU2l6ZSx0aGlzLl9hc3NpZ25Nb2RlbHMoKX1faXRlbUlkUGF0aENoYW5nZWQoKXt0aGlzLl9fY2FjaGVFeHBhbmRlZEtleXMoKX1fX2NhY2hlRXhwYW5kZWRLZXlzKCl7dGhpcy5leHBhbmRlZEl0ZW1zJiYodGhpcy5fX2V4cGFuZGVkS2V5cz1uZXcgU2V0LHRoaXMuZXhwYW5kZWRJdGVtcy5mb3JFYWNoKCh0PT57dGhpcy5fX2V4cGFuZGVkS2V5cy5hZGQodGhpcy5nZXRJdGVtSWQodCkpfSkpKX1leHBhbmRJdGVtKHQpe3RoaXMuX2lzRXhwYW5kZWQodCl8fCh0aGlzLmV4cGFuZGVkSXRlbXM9Wy4uLnRoaXMuZXhwYW5kZWRJdGVtcyx0XSl9Y29sbGFwc2VJdGVtKHQpe3RoaXMuX2lzRXhwYW5kZWQodCkmJih0aGlzLmV4cGFuZGVkSXRlbXM9dGhpcy5leHBhbmRlZEl0ZW1zLmZpbHRlcigoZT0+IXRoaXMuX2l0ZW1zRXF1YWwoZSx0KSkpKX1fZ2V0SW5kZXhMZXZlbCh0KXtsZXR7Y2FjaGU6ZX09dGhpcy5fY2FjaGUuZ2V0Q2FjaGVBbmRJbmRleCh0KSxuPTA7Zm9yKDtlLnBhcmVudENhY2hlOyllPWUucGFyZW50Q2FjaGUsbisrO3JldHVybiBufV9jYW5Qb3B1bGF0ZSgpe3JldHVybiBCb29sZWFuKHRoaXMuX2hhc0RhdGEmJnRoaXMuX2NvbHVtblRyZWUpfV9sb2FkUGFnZSh0LGUpe2lmKCFlLnBlbmRpbmdSZXF1ZXN0c1t0XSYmdGhpcy5kYXRhUHJvdmlkZXIpe3RoaXMuX3NldExvYWRpbmcoITApLGUucGVuZGluZ1JlcXVlc3RzW3RdPSEwO2NvbnN0IG49e3BhZ2U6dCxwYWdlU2l6ZTp0aGlzLnBhZ2VTaXplLHNvcnRPcmRlcnM6dGhpcy5fbWFwU29ydGVycygpLGZpbHRlcnM6dGhpcy5fbWFwRmlsdGVycygpLHBhcmVudEl0ZW06ZS5wYXJlbnRJdGVtfTt0aGlzLl9kZWJvdW5jZUluY3JlYXNlUG9vbCYmdGhpcy5fZGVib3VuY2VJbmNyZWFzZVBvb2wuZmx1c2goKSx0aGlzLmRhdGFQcm92aWRlcihuLCgoaSxyKT0+e3ZvaWQgMCE9PXI/ZS5zaXplPXI6bi5wYXJlbnRJdGVtJiYoZS5zaXplPWkubGVuZ3RoKTtjb25zdCBvPUFycmF5LmZyb20odGhpcy4kLml0ZW1zLmNoaWxkcmVuKS5tYXAoKHQ9PnQuX2l0ZW0pKTtpLmZvckVhY2goKChuLGkpPT57Y29uc3Qgcj10KnRoaXMucGFnZVNpemUraTtlLml0ZW1zW3JdPW4sdGhpcy5faXNFeHBhbmRlZChuKSYmby5pbmRleE9mKG4pPi0xJiZlLmVuc3VyZVN1YkNhY2hlRm9yU2NhbGVkSW5kZXgocil9KSksdGhpcy5faGFzRGF0YT0hMCxkZWxldGUgZS5wZW5kaW5nUmVxdWVzdHNbdF0sdGhpcy5fZGVib3VuY2VyQXBwbHlDYWNoZWREYXRhPU5uLmRlYm91bmNlKHRoaXMuX2RlYm91bmNlckFwcGx5Q2FjaGVkRGF0YSxndC5hZnRlcigwKSwoKCk9Pnt0aGlzLl9zZXRMb2FkaW5nKCExKSx0aGlzLl9jYWNoZS51cGRhdGVTaXplKCksdGhpcy5fZWZmZWN0aXZlU2l6ZT10aGlzLl9jYWNoZS5lZmZlY3RpdmVTaXplLEFycmF5LmZyb20odGhpcy4kLml0ZW1zLmNoaWxkcmVuKS5maWx0ZXIoKHQ9PiF0LmhpZGRlbikpLmZvckVhY2goKHQ9Pnt0aGlzLl9jYWNoZS5nZXRJdGVtRm9ySW5kZXgodC5pbmRleCkmJnRoaXMuX2dldEl0ZW0odC5pbmRleCx0KX0pKSx0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZCgwKSx0aGlzLl9fc2Nyb2xsVG9QZW5kaW5nSW5kZXgoKX0pKSx0aGlzLl9jYWNoZS5pc0xvYWRpbmcoKXx8dGhpcy5fZGVib3VuY2VyQXBwbHlDYWNoZWREYXRhLmZsdXNoKCksdGhpcy5fX2l0ZW1zUmVjZWl2ZWQoKX0pKX19X2dldFBhZ2VGb3JJbmRleCh0KXtyZXR1cm4gTWF0aC5mbG9vcih0L3RoaXMucGFnZVNpemUpfWNsZWFyQ2FjaGUoKXt0aGlzLl9jYWNoZT1uZXcgVTF0KHRoaXMpLEFycmF5LmZyb20odGhpcy4kLml0ZW1zLmNoaWxkcmVuKS5mb3JFYWNoKCh0PT57QXJyYXkuZnJvbSh0LmNoaWxkcmVuKS5mb3JFYWNoKCh0PT57dC5faW5zdGFuY2UmJnQuX2luc3RhbmNlLl9zZXRQZW5kaW5nUHJvcGVydHkoIml0ZW0iLHt9LCExKX0pKX0pKSx0aGlzLl9jYWNoZS5zaXplPXRoaXMuc2l6ZXx8MCx0aGlzLl9jYWNoZS51cGRhdGVTaXplKCksdGhpcy5faGFzRGF0YT0hMSx0aGlzLl9hc3NpZ25Nb2RlbHMoKSx0aGlzLl9lZmZlY3RpdmVTaXplJiZ0aGlzLl9pbml0aWFsUG9vbENyZWF0ZWR8fHRoaXMuX2xvYWRQYWdlKDAsdGhpcy5fY2FjaGUpfV9wYWdlU2l6ZUNoYW5nZWQodCxlKXt2b2lkIDAhPT1lJiZ0IT09ZSYmdGhpcy5jbGVhckNhY2hlKCl9X2NoZWNrU2l6ZSgpe3ZvaWQgMD09PXRoaXMuc2l6ZSYmMD09PXRoaXMuX2VmZmVjdGl2ZVNpemUmJmNvbnNvbGUud2FybigiVGhlIDx2YWFkaW4tZ3JpZD4gbmVlZHMgdGhlIHRvdGFsIG51bWJlciBvZiBpdGVtcyBpbiBvcmRlciB0byBkaXNwbGF5IHJvd3MuIFNldCB0aGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zIHRvIHRoZSBgc2l6ZWAgcHJvcGVydHksIG9yIHByb3ZpZGUgdGhlIHRvdGFsIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mIHRoZSBgZGF0YVByb3ZpZGVyYOKAmXMgYGNhbGxiYWNrYCBjYWxsLiIpfV9kYXRhUHJvdmlkZXJDaGFuZ2VkKHQsZSl7dm9pZCAwIT09ZSYmdGhpcy5jbGVhckNhY2hlKCksdCYmdGhpcy5pdGVtcyYmdGhpcy5pdGVtcy5sZW5ndGgmJnRoaXMuX3Njcm9sbFRvSW5kZXgodGhpcy5fZmlyc3RWaXNpYmxlSW5kZXgpLHRoaXMuX2Vuc3VyZUZpcnN0UGFnZUxvYWRlZCgpLHRoaXMuX2RlYm91bmNlckNoZWNrU2l6ZT1Obi5kZWJvdW5jZSh0aGlzLl9kZWJvdW5jZXJDaGVja1NpemUsZ3QuYWZ0ZXIoMmUzKSx0aGlzLl9jaGVja1NpemUuYmluZCh0aGlzKSksdGhpcy5fc2Nyb2xsSGFuZGxlcigpfV9lbnN1cmVGaXJzdFBhZ2VMb2FkZWQoKXt0aGlzLl9oYXNEYXRhfHx0aGlzLl9sb2FkUGFnZSgwLHRoaXMuX2NhY2hlKX1faXRlbXNFcXVhbCh0LGUpe3JldHVybiB0aGlzLmdldEl0ZW1JZCh0KT09PXRoaXMuZ2V0SXRlbUlkKGUpfV9nZXRJdGVtSW5kZXhJbkFycmF5KHQsZSl7bGV0IG49LTE7cmV0dXJuIGUuZm9yRWFjaCgoKGUsaSk9Pnt0aGlzLl9pdGVtc0VxdWFsKGUsdCkmJihuPWkpfSkpLG59c2Nyb2xsVG9JbmRleCh0KXtzdXBlci5zY3JvbGxUb0luZGV4KHQpLGlzTmFOKHQpfHwhdGhpcy5fY2FjaGUuaXNMb2FkaW5nKCkmJnRoaXMuY2xpZW50SGVpZ2h0fHwodGhpcy5fX3BlbmRpbmdTY3JvbGxUb0luZGV4PXQpfV9fc2Nyb2xsVG9QZW5kaW5nSW5kZXgoKXtpZih0aGlzLl9fcGVuZGluZ1Njcm9sbFRvSW5kZXgmJnRoaXMuJC5pdGVtcy5jaGlsZHJlbi5sZW5ndGgpe2NvbnN0IHQ9dGhpcy5fX3BlbmRpbmdTY3JvbGxUb0luZGV4O2RlbGV0ZSB0aGlzLl9fcGVuZGluZ1Njcm9sbFRvSW5kZXgsdGhpcy5fZGVib3VuY2VJbmNyZWFzZVBvb2wmJnRoaXMuX2RlYm91bmNlSW5jcmVhc2VQb29sLmZsdXNoKCksdGhpcy5zY3JvbGxUb0luZGV4KHQpfX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovLEcxdD10PT5jbGFzcyBleHRlbmRzIHR7cmVhZHkoKXtzdXBlci5yZWFkeSgpLHRoaXMuX2FkZE5vZGVPYnNlcnZlcigpfV9oYXNDb2x1bW5Hcm91cHModCl7Zm9yKGxldCBlPTA7ZTx0Lmxlbmd0aDtlKyspaWYoInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCI9PT10W2VdLmxvY2FsTmFtZSlyZXR1cm4hMDtyZXR1cm4hMX1fZ2V0Q2hpbGRDb2x1bW5zKHQpe3JldHVybiBHaS5nZXRGbGF0dGVuZWROb2Rlcyh0KS5maWx0ZXIodGhpcy5faXNDb2x1bW5FbGVtZW50KX1fZmxhdHRlbkNvbHVtbkdyb3Vwcyh0KXtyZXR1cm4gdC5tYXAoKHQ9PiJ2YWFkaW4tZ3JpZC1jb2x1bW4tZ3JvdXAiPT09dC5sb2NhbE5hbWU/dGhpcy5fZ2V0Q2hpbGRDb2x1bW5zKHQpOlt0XSkpLnJlZHVjZSgoKHQsZSk9PnQuY29uY2F0KGUpKSxbXSl9X2dldENvbHVtblRyZWUoKXtjb25zdCB0PVtdO2ZvcihsZXQgZT1HaS5nZXRGbGF0dGVuZWROb2Rlcyh0aGlzKS5maWx0ZXIodGhpcy5faXNDb2x1bW5FbGVtZW50KTt0LnB1c2goZSksdGhpcy5faGFzQ29sdW1uR3JvdXBzKGUpOyllPXRoaXMuX2ZsYXR0ZW5Db2x1bW5Hcm91cHMoZSk7cmV0dXJuIHR9X3VwZGF0ZUNvbHVtblRyZWUoKXtjb25zdCB0PXRoaXMuX2dldENvbHVtblRyZWUoKTt0aGlzLl9hcnJheUVxdWFscyh0LHRoaXMuX2NvbHVtblRyZWUpfHwodGhpcy5fY29sdW1uVHJlZT10KX1fYWRkTm9kZU9ic2VydmVyKCl7dGhpcy5fb2JzZXJ2ZXI9bmV3IEdpKHRoaXMsKHQ9Pntjb25zdCBlPXQuYWRkZWROb2Rlcy5maWx0ZXIoKHQ9PiJ0ZW1wbGF0ZSI9PT10LmxvY2FsTmFtZSYmdC5jbGFzc0xpc3QuY29udGFpbnMoInJvdy1kZXRhaWxzIikpKVswXTtlJiZ0aGlzLl9yb3dEZXRhaWxzVGVtcGxhdGUhPT1lJiYodGhpcy5fcm93RGV0YWlsc1RlbXBsYXRlPWUpO2NvbnN0IG49dD0+dC5maWx0ZXIodGhpcy5faXNDb2x1bW5FbGVtZW50KS5sZW5ndGg+MDtpZihuKHQuYWRkZWROb2Rlcyl8fG4odC5yZW1vdmVkTm9kZXMpKXtjb25zdCBlPXQucmVtb3ZlZE5vZGVzLmZsYXRNYXAoKHQ9PnQuX2FsbENlbGxzKSksbj10PT5lLmZpbHRlcigoZT0+ZS5fY29udGVudC5jb250YWlucyh0KSkpLmxlbmd0aDt0aGlzLl9fcmVtb3ZlU29ydGVycyh0aGlzLl9zb3J0ZXJzLmZpbHRlcihuKSksdGhpcy5fX3JlbW92ZUZpbHRlcnModGhpcy5fZmlsdGVycy5maWx0ZXIobikpLHRoaXMuX3VwZGF0ZUNvbHVtblRyZWUoKX10aGlzLl9kZWJvdW5jZXJDaGVja0ltcG9ydHM9Tm4uZGVib3VuY2UodGhpcy5fZGVib3VuY2VyQ2hlY2tJbXBvcnRzLGd0LmFmdGVyKDJlMyksdGhpcy5fY2hlY2tJbXBvcnRzLmJpbmQodGhpcykpLHRoaXMuX2Vuc3VyZUZpcnN0UGFnZUxvYWRlZCgpfSkpfV9hcnJheUVxdWFscyh0LGUpe2lmKCF0fHwhZXx8dC5sZW5ndGghPWUubGVuZ3RoKXJldHVybiExO2ZvcihsZXQgbj0wLGk9dC5sZW5ndGg7bjxpO24rKylpZih0W25daW5zdGFuY2VvZiBBcnJheSYmZVtuXWluc3RhbmNlb2YgQXJyYXkpe2lmKCF0aGlzLl9hcnJheUVxdWFscyh0W25dLGVbbl0pKXJldHVybiExfWVsc2UgaWYodFtuXSE9ZVtuXSlyZXR1cm4hMTtyZXR1cm4hMH1fY2hlY2tJbXBvcnRzKCl7WyJ2YWFkaW4tZ3JpZC1jb2x1bW4tZ3JvdXAiLCJ2YWFkaW4tZ3JpZC1maWx0ZXIiLCJ2YWFkaW4tZ3JpZC1maWx0ZXItY29sdW1uIiwidmFhZGluLWdyaWQtdHJlZS10b2dnbGUiLCJ2YWFkaW4tZ3JpZC1zZWxlY3Rpb24tY29sdW1uIiwidmFhZGluLWdyaWQtc29ydC1jb2x1bW4iLCJ2YWFkaW4tZ3JpZC1zb3J0ZXIiXS5mb3JFYWNoKCh0PT57Y29uc3QgZT10aGlzLnF1ZXJ5U2VsZWN0b3IodCk7IWV8fGUgaW5zdGFuY2VvZiB3ZXx8Y29uc29sZS53YXJuKGBNYWtlIHN1cmUgeW91IGhhdmUgaW1wb3J0ZWQgdGhlIHJlcXVpcmVkIG1vZHVsZSBmb3IgPCR7dH0+IGVsZW1lbnQuYCl9KSl9X3VwZGF0ZUZpcnN0QW5kTGFzdENvbHVtbigpe0FycmF5LmZyb20odGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRyIikpLmZvckVhY2goKHQ9PnRoaXMuX3VwZGF0ZUZpcnN0QW5kTGFzdENvbHVtbkZvclJvdyh0KSkpfV91cGRhdGVGaXJzdEFuZExhc3RDb2x1bW5Gb3JSb3codCl7QXJyYXkuZnJvbSh0LnF1ZXJ5U2VsZWN0b3JBbGwoJ1twYXJ0fj0iY2VsbCJdOm5vdChbcGFydH49ImRldGFpbHMtY2VsbCJdKScpKS5zb3J0KCgodCxlKT0+dC5fY29sdW1uLl9vcmRlci1lLl9jb2x1bW4uX29yZGVyKSkuZm9yRWFjaCgoKHQsZSxuKT0+e3RoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgiZmlyc3QtY29sdW1uIiwwPT09ZSx0KSx0aGlzLl90b2dnbGVBdHRyaWJ1dGUoImxhc3QtY29sdW1uIixlPT09bi5sZW5ndGgtMSx0KX0pKX1faXNDb2x1bW5FbGVtZW50KHQpe3JldHVybiB0Lm5vZGVUeXBlPT09Tm9kZS5FTEVNRU5UX05PREUmJi9cYmNvbHVtblxiLy50ZXN0KHQubG9jYWxOYW1lKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovLFcxdD10PT5jbGFzcyBleHRlbmRzIHR7Z2V0RXZlbnRDb250ZXh0KHQpe2NvbnN0IGU9e30sbj10LmNvbXBvc2VkUGF0aCgpLGk9bltuLmluZGV4T2YodGhpcy4kLnRhYmxlKS0zXTtyZXR1cm4gaT8oZS5zZWN0aW9uPVsiYm9keSIsImhlYWRlciIsImZvb3RlciIsImRldGFpbHMiXS5maWx0ZXIoKHQ9PmkuZ2V0QXR0cmlidXRlKCJwYXJ0IikuaW5kZXhPZih0KT4tMSkpWzBdLGkuX2NvbHVtbiYmKGUuY29sdW1uPWkuX2NvbHVtbiksImJvZHkiIT09ZS5zZWN0aW9uJiYiZGV0YWlscyIhPT1lLnNlY3Rpb258fE9iamVjdC5hc3NpZ24oZSx0aGlzLl9fZ2V0Um93TW9kZWwoaS5wYXJlbnRFbGVtZW50KSksZSk6ZX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovLHExdD10PT5jbGFzcyBleHRlbmRzIHR7c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7cmV0dXJue19maWx0ZXJzOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fX19cmVhZHkoKXtzdXBlci5yZWFkeSgpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigiZmlsdGVyLWNoYW5nZWQiLHRoaXMuX2ZpbHRlckNoYW5nZWQuYmluZCh0aGlzKSl9X2ZpbHRlckNoYW5nZWQodCl7dC5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLl9fYWRkRmlsdGVyKHQudGFyZ2V0KSx0aGlzLl9fYXBwbHlGaWx0ZXJzKCl9X19yZW1vdmVGaWx0ZXJzKHQpezAhPXQubGVuZ3RoJiYodGhpcy5fZmlsdGVycz10aGlzLl9maWx0ZXJzLmZpbHRlcigoZT0+dC5pbmRleE9mKGUpPDApKSx0aGlzLl9fYXBwbHlGaWx0ZXJzKCkpfV9fYWRkRmlsdGVyKHQpey0xPT09dGhpcy5fZmlsdGVycy5pbmRleE9mKHQpJiZ0aGlzLl9maWx0ZXJzLnB1c2godCl9X19hcHBseUZpbHRlcnMoKXt0aGlzLmRhdGFQcm92aWRlciYmdGhpcy5pc0F0dGFjaGVkJiZ0aGlzLmNsZWFyQ2FjaGUoKX1fbWFwRmlsdGVycygpe3JldHVybiB0aGlzLl9maWx0ZXJzLm1hcCgodD0+KHtwYXRoOnQucGF0aCx2YWx1ZTp0LnZhbHVlfSkpKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovO2NsYXNzIFkxdCBleHRlbmRzIHdle3N0YXRpYyBnZXQgaXMoKXtyZXR1cm4idmFhZGluLWdyaWQtdGVtcGxhdGl6ZXIifXN0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybntkYXRhSG9zdDpPYmplY3QsdGVtcGxhdGU6T2JqZWN0LF90ZW1wbGF0ZUluc3RhbmNlczp7dHlwZTpBcnJheSx2YWx1ZTpmdW5jdGlvbigpe3JldHVybltdfX0sX3BhcmVudFBhdGhWYWx1ZXM6e3ZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJue319fSxfZ3JpZDpPYmplY3R9fXN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCl7cmV0dXJuWyJfdGVtcGxhdGVJbnN0YW5jZXNDaGFuZ2VkKF90ZW1wbGF0ZUluc3RhbmNlcy4qLCBfcGFyZW50UGF0aFZhbHVlcy4qKSJdfWNvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLl9pbnN0YW5jZVByb3BzPXtkZXRhaWxzT3BlbmVkOiEwLGluZGV4OiEwLGl0ZW06ITAsc2VsZWN0ZWQ6ITAsZXhwYW5kZWQ6ITAsbGV2ZWw6ITB9fWNyZWF0ZUluc3RhbmNlKCl7dGhpcy5fZW5zdXJlVGVtcGxhdGl6ZWQoKTtjb25zdCB0PW5ldyB0aGlzLl9UZW1wbGF0ZUNsYXNzKHt9KTtyZXR1cm4gdGhpcy5hZGRJbnN0YW5jZSh0KSx0fWFkZEluc3RhbmNlKHQpey0xPT09dGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMuaW5kZXhPZih0KSYmKHRoaXMuX3RlbXBsYXRlSW5zdGFuY2VzLnB1c2godCkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+dGhpcy5ub3RpZnlQYXRoKCJfdGVtcGxhdGVJbnN0YW5jZXMuKiIsdGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMpKSkpfXJlbW92ZUluc3RhbmNlKHQpe2NvbnN0IGU9dGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMuaW5kZXhPZih0KTt0aGlzLnNwbGljZSgiX3RlbXBsYXRlSW5zdGFuY2VzIixlLDEpfV9lbnN1cmVUZW1wbGF0aXplZCgpe3RoaXMuX1RlbXBsYXRlQ2xhc3N8fCh0aGlzLl9UZW1wbGF0ZUNsYXNzPWFvKHRoaXMudGVtcGxhdGUsdGhpcyx7aW5zdGFuY2VQcm9wczp0aGlzLl9pbnN0YW5jZVByb3BzLHBhcmVudE1vZGVsOiEwLGZvcndhcmRIb3N0UHJvcDpmdW5jdGlvbih0LGUpe3RoaXMuX2ZvcndhcmRQYXJlbnRQcm9wKHQsZSksdGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMmJnRoaXMuX3RlbXBsYXRlSW5zdGFuY2VzLmZvckVhY2goKG49Pm4ubm90aWZ5UGF0aCh0LGUpKSl9LG5vdGlmeUluc3RhbmNlUHJvcDpmdW5jdGlvbih0LGUsbil7aWYoImluZGV4Ij09PWV8fCJpdGVtIj09PWUpcmV0dXJuO2NvbnN0IGk9YF9fJHtlfV9fYDtpZih0W2ldPT09bilyZXR1cm47dFtpXT1uO2NvbnN0IHI9QXJyYXkuZnJvbSh0aGlzLl9ncmlkLiQuaXRlbXMuY2hpbGRyZW4pLmZpbHRlcigoZT0+dGhpcy5fZ3JpZC5faXRlbXNFcXVhbChlLl9pdGVtLHQuaXRlbSkpKVswXTtyJiZBcnJheS5mcm9tKHIuY2hpbGRyZW4pLmZvckVhY2goKHQ9Pnt0Ll9pbnN0YW5jZSYmKHQuX2luc3RhbmNlW2ldPW4sdC5faW5zdGFuY2Uubm90aWZ5UGF0aChlLG4pKX0pKTtjb25zdCBvPSJpdGVtLiI7aWYoQXJyYXkuaXNBcnJheSh0aGlzLl9ncmlkLml0ZW1zKSYmMD09PWUuaW5kZXhPZihvKSl7Y29uc3QgaT10aGlzLl9ncmlkLml0ZW1zLmluZGV4T2YodC5pdGVtKSxyPWUuc2xpY2Uoby5sZW5ndGgpO3RoaXMuX2dyaWQubm90aWZ5UGF0aChgaXRlbXMuJHtpfS4ke3J9YCxuKX1jb25zdCBhPWBfJHtlfUluc3RhbmNlQ2hhbmdlZENhbGxiYWNrYDt0aGlzLl9ncmlkJiZ0aGlzLl9ncmlkW2FdJiZ0aGlzLl9ncmlkW2FdKHQsbil9fSkpfV9mb3J3YXJkUGFyZW50UHJvcCh0LGUpe3RoaXMuX3BhcmVudFBhdGhWYWx1ZXNbdF09ZSx0aGlzLl90ZW1wbGF0ZUluc3RhbmNlcy5mb3JFYWNoKChuPT5uLm5vdGlmeVBhdGgodCxlKSkpfV90ZW1wbGF0ZUluc3RhbmNlc0NoYW5nZWQodCl7bGV0IGUsbjtpZigiX3RlbXBsYXRlSW5zdGFuY2VzIj09PXQucGF0aCllPTAsbj10aGlzLl90ZW1wbGF0ZUluc3RhbmNlcy5sZW5ndGg7ZWxzZXtpZigiX3RlbXBsYXRlSW5zdGFuY2VzLnNwbGljZXMiIT09dC5wYXRoKXJldHVybjtlPXQudmFsdWUuaW5kZXgsbj10LnZhbHVlLmFkZGVkQ291bnR9T2JqZWN0LmtleXModGhpcy5fcGFyZW50UGF0aFZhbHVlc3x8e30pLmZvckVhY2goKHQ9Pntmb3IobGV0IGk9ZTtpPGUrbjtpKyspdGhpcy5fdGVtcGxhdGVJbnN0YW5jZXNbaV0uc2V0KHQsdGhpcy5fcGFyZW50UGF0aFZhbHVlc1t0XSl9KSl9fWN1c3RvbUVsZW1lbnRzLmRlZmluZShZMXQuaXMsWTF0KTsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDIxIFZhYWRpbiBMdGQuCiAgICAgKiBUaGlzIHByb2dyYW0gaXMgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBhdmFpbGFibGUgYXQgaHR0cHM6Ly92YWFkaW4uY29tL2xpY2Vuc2UvCiAgICAgKi8KY29uc3QgWDF0PXQ9PmNsYXNzIGV4dGVuZHMgdHtzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKXtyZXR1cm57ZGV0YWlsc09wZW5lZEl0ZW1zOnt0eXBlOkFycmF5LHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuW119fSxfcm93RGV0YWlsc1RlbXBsYXRlOk9iamVjdCxyb3dEZXRhaWxzUmVuZGVyZXI6RnVuY3Rpb24sX2RldGFpbHNDZWxsczp7dHlwZTpBcnJheX19fXN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCl7cmV0dXJuWyJfZGV0YWlsc09wZW5lZEl0ZW1zQ2hhbmdlZChkZXRhaWxzT3BlbmVkSXRlbXMuKiwgX3Jvd0RldGFpbHNUZW1wbGF0ZSwgcm93RGV0YWlsc1JlbmRlcmVyKSIsIl9yb3dEZXRhaWxzVGVtcGxhdGVPclJlbmRlcmVyQ2hhbmdlZChfcm93RGV0YWlsc1RlbXBsYXRlLCByb3dEZXRhaWxzUmVuZGVyZXIpIl19X3Jvd0RldGFpbHNUZW1wbGF0ZU9yUmVuZGVyZXJDaGFuZ2VkKHQsZSl7aWYodCYmZSl0aHJvdyBuZXcgRXJyb3IoIllvdSBzaG91bGQgb25seSB1c2UgZWl0aGVyIGEgcmVuZGVyZXIgb3IgYSB0ZW1wbGF0ZSBmb3Igcm93IGRldGFpbHMiKTtpZih0fHxlKXtpZih0JiYhdC50ZW1wbGF0aXplcil7Y29uc3QgZT1uZXcgWTF0O2UuX2dyaWQ9dGhpcyxlLmRhdGFIb3N0PXRoaXMuZGF0YUhvc3QsZS50ZW1wbGF0ZT10LHQudGVtcGxhdGl6ZXI9ZX10aGlzLl9jb2x1bW5UcmVlJiZBcnJheS5mcm9tKHRoaXMuJC5pdGVtcy5jaGlsZHJlbikuZm9yRWFjaCgodD0+e3QucXVlcnlTZWxlY3RvcigiW3BhcnR+PWRldGFpbHMtY2VsbF0iKXx8KHRoaXMuX3VwZGF0ZVJvdyh0LHRoaXMuX2NvbHVtblRyZWVbdGhpcy5fY29sdW1uVHJlZS5sZW5ndGgtMV0pLHRoaXMuX2ExMXlVcGRhdGVSb3dEZXRhaWxzT3BlbmVkKHQsITEpKSxkZWxldGUgdC5xdWVyeVNlbGVjdG9yKCJbcGFydH49ZGV0YWlscy1jZWxsXSIpLl9pbnN0YW5jZX0pKSx0aGlzLmRldGFpbHNPcGVuZWRJdGVtcy5sZW5ndGgmJihBcnJheS5mcm9tKHRoaXMuJC5pdGVtcy5jaGlsZHJlbikuZm9yRWFjaCh0aGlzLl90b2dnbGVEZXRhaWxzQ2VsbCx0aGlzKSx0aGlzLl91cGRhdGUoKSl9fV9kZXRhaWxzT3BlbmVkSXRlbXNDaGFuZ2VkKHQpeyJkZXRhaWxzT3BlbmVkSXRlbXMubGVuZ3RoIiE9PXQucGF0aCYmdC52YWx1ZSYmQXJyYXkuZnJvbSh0aGlzLiQuaXRlbXMuY2hpbGRyZW4pLmZvckVhY2goKHQ9Pnt0aGlzLl90b2dnbGVEZXRhaWxzQ2VsbCh0LHQuX2l0ZW0pLHRoaXMuX2ExMXlVcGRhdGVSb3dEZXRhaWxzT3BlbmVkKHQsdGhpcy5faXNEZXRhaWxzT3BlbmVkKHQuX2l0ZW0pKSx0aGlzLl90b2dnbGVBdHRyaWJ1dGUoImRldGFpbHMtb3BlbmVkIix0aGlzLl9pc0RldGFpbHNPcGVuZWQodC5faXRlbSksdCl9KSl9X2NvbmZpZ3VyZURldGFpbHNDZWxsKHQpe3Quc2V0QXR0cmlidXRlKCJwYXJ0IiwiY2VsbCBkZXRhaWxzLWNlbGwiKSx0aGlzLl90b2dnbGVBdHRyaWJ1dGUoImZyb3plbiIsITAsdCl9X3RvZ2dsZURldGFpbHNDZWxsKHQsZSl7Y29uc3Qgbj10LnF1ZXJ5U2VsZWN0b3IoJ1twYXJ0fj0iZGV0YWlscy1jZWxsIl0nKTtpZighbilyZXR1cm47Y29uc3QgaT0hdGhpcy5faXNEZXRhaWxzT3BlbmVkKGUpLHI9ISFuLmhpZGRlbiE9PWk7KG4uX2luc3RhbmNlfHxuLl9yZW5kZXJlcikmJm4uaGlkZGVuPT09aXx8KG4uaGlkZGVuPWksaT90LnN0eWxlLnJlbW92ZVByb3BlcnR5KCJwYWRkaW5nLWJvdHRvbSIpOih0aGlzLnJvd0RldGFpbHNSZW5kZXJlcj8obi5fcmVuZGVyZXI9dGhpcy5yb3dEZXRhaWxzUmVuZGVyZXIsbi5fcmVuZGVyZXIuY2FsbCh0aGlzLG4uX2NvbnRlbnQsdGhpcyx7aW5kZXg6dC5pbmRleCxpdGVtOmV9KSk6dGhpcy5fcm93RGV0YWlsc1RlbXBsYXRlJiYhbi5faW5zdGFuY2UmJihuLl9pbnN0YW5jZT10aGlzLl9yb3dEZXRhaWxzVGVtcGxhdGUudGVtcGxhdGl6ZXIuY3JlYXRlSW5zdGFuY2UoKSxuLl9jb250ZW50LmlubmVySFRNTD0iIixuLl9jb250ZW50LmFwcGVuZENoaWxkKG4uX2luc3RhbmNlLnJvb3QpLHRoaXMuX3VwZGF0ZUl0ZW0odCxlKSksV2koKSx0LnN0eWxlLnNldFByb3BlcnR5KCJwYWRkaW5nLWJvdHRvbSIsYCR7bi5vZmZzZXRIZWlnaHR9cHhgKSxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT50aGlzLm5vdGlmeVJlc2l6ZSgpKSkpKSxyJiYodGhpcy5fdXBkYXRlTWV0cmljcygpLHRoaXMuX3Bvc2l0aW9uSXRlbXMoKSl9X3VwZGF0ZURldGFpbHNDZWxsSGVpZ2h0cygpe0FycmF5LmZyb20odGhpcy4kLml0ZW1zLnF1ZXJ5U2VsZWN0b3JBbGwoJ1twYXJ0fj0iZGV0YWlscy1jZWxsIl06bm90KFtoaWRkZW5dKScpKS5mb3JFYWNoKCh0PT57dC5wYXJlbnRFbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KCJwYWRkaW5nLWJvdHRvbSIsYCR7dC5vZmZzZXRIZWlnaHR9cHhgKX0pKX1faXNEZXRhaWxzT3BlbmVkKHQpe3JldHVybiB0aGlzLmRldGFpbHNPcGVuZWRJdGVtcyYmLTEhPT10aGlzLl9nZXRJdGVtSW5kZXhJbkFycmF5KHQsdGhpcy5kZXRhaWxzT3BlbmVkSXRlbXMpfW9wZW5JdGVtRGV0YWlscyh0KXt0aGlzLl9pc0RldGFpbHNPcGVuZWQodCl8fCh0aGlzLmRldGFpbHNPcGVuZWRJdGVtcz1bLi4udGhpcy5kZXRhaWxzT3BlbmVkSXRlbXMsdF0pfWNsb3NlSXRlbURldGFpbHModCl7dGhpcy5faXNEZXRhaWxzT3BlbmVkKHQpJiYodGhpcy5kZXRhaWxzT3BlbmVkSXRlbXM9dGhpcy5kZXRhaWxzT3BlbmVkSXRlbXMuZmlsdGVyKChlPT4hdGhpcy5faXRlbXNFcXVhbChlLHQpKSkpfV9kZXRhaWxzT3BlbmVkSW5zdGFuY2VDaGFuZ2VkQ2FsbGJhY2sodCxlKXtlP3RoaXMub3Blbkl0ZW1EZXRhaWxzKHQuaXRlbSk6dGhpcy5jbG9zZUl0ZW1EZXRhaWxzKHQuaXRlbSl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqLywkMXQ9NTAwLEsxdD01MDAsWjF0PXQ9PmNsYXNzIGV4dGVuZHMgdHtzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKXtyZXR1cm57X2Zyb3plbkNlbGxzOnt0eXBlOkFycmF5LHZhbHVlOigpPT5bXX0sX3Jvd1dpdGhGb2N1c2VkRWxlbWVudDpFbGVtZW50LF9kZWx0YVlBY2M6e3R5cGU6TnVtYmVyLHZhbHVlOjB9LF91c2VTdGlja3k6e3R5cGU6Qm9vbGVhbix2YWx1ZTp3aW5kb3cuQ1NTJiZ3aW5kb3cuQ1NTLnN1cHBvcnRzJiYod2luZG93LkNTUy5zdXBwb3J0cygicG9zaXRpb24iLCJzdGlja3kiKXx8d2luZG93LkNTUy5zdXBwb3J0cygicG9zaXRpb24iLCItd2Via2l0LXN0aWNreSIpKX19fXN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCl7cmV0dXJuWyJfc2Nyb2xsVmlld3BvcnRIZWlnaHRVcGRhdGVkKF92aWV3cG9ydEhlaWdodCkiXX1zZXQgX3Njcm9sbFRvcCh0KXt0aGlzLiQudGFibGUuc2Nyb2xsVG9wPXR9Z2V0IF9zY3JvbGxUb3AoKXtyZXR1cm4gdGhpcy4kLnRhYmxlLnNjcm9sbFRvcH1jb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5fc2Nyb2xsTGluZUhlaWdodD10aGlzLl9nZXRTY3JvbGxMaW5lSGVpZ2h0KCl9X2dldFNjcm9sbExpbmVIZWlnaHQoKXtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3Quc3R5bGUuZm9udFNpemU9ImluaXRpYWwiLHQuc3R5bGUuZGlzcGxheT0ibm9uZSIsZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0KTtjb25zdCBlPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpLmZvbnRTaXplO3JldHVybiBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHQpLGU/d2luZG93LnBhcnNlSW50KGUpOnZvaWQgMH1fc2Nyb2xsVmlld3BvcnRIZWlnaHRVcGRhdGVkKHQpe3RoaXMuX3Njcm9sbFBhZ2VIZWlnaHQ9dC10aGlzLiQuaGVhZGVyLmNsaWVudEhlaWdodC10aGlzLiQuZm9vdGVyLmNsaWVudEhlaWdodC10aGlzLl9zY3JvbGxMaW5lSGVpZ2h0fXJlYWR5KCl7c3VwZXIucmVhZHkoKSx0aGlzLiQub3V0ZXJzY3JvbGxlcj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSx0aGlzLnNjcm9sbFRhcmdldD10aGlzLiQudGFibGUsdGhpcy5hZGRFdmVudExpc3RlbmVyKCJ3aGVlbCIsdGhpcy5fb25XaGVlbCksdGhpcy4kLml0ZW1zLmFkZEV2ZW50TGlzdGVuZXIoImZvY3VzaW4iLCh0PT57Y29uc3QgZT10LmNvbXBvc2VkUGF0aCgpLmluZGV4T2YodGhpcy4kLml0ZW1zKTt0aGlzLl9yb3dXaXRoRm9jdXNlZEVsZW1lbnQ9dC5jb21wb3NlZFBhdGgoKVtlLTFdfSkpLHRoaXMuJC5pdGVtcy5hZGRFdmVudExpc3RlbmVyKCJmb2N1c291dCIsKCgpPT50aGlzLl9yb3dXaXRoRm9jdXNlZEVsZW1lbnQ9dm9pZCAwKSksdGhpcy5zY3JvbGxUYXJnZXQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwoKCk9PnRoaXMuX19tb3VzZURvd249ITApKSx0aGlzLnNjcm9sbFRhcmdldC5hZGRFdmVudExpc3RlbmVyKCJtb3VzZXVwIiwoKCk9Pnt0aGlzLl9fbW91c2VEb3duPSExLHRoaXMuX19wZW5kaW5nUmVvcmRlciYmKHRoaXMuX19wZW5kaW5nUmVvcmRlcj0hMSxzZXRUaW1lb3V0KCgoKT0+dGhpcy5fcmVvcmRlclJvd3MoKSksJDF0KSl9KSl9c2Nyb2xsVG9JbmRleCh0KXt0aGlzLl9hY2Nlc3NJcm9uTGlzdEFQSSgoKCk9PnN1cGVyLnNjcm9sbFRvSW5kZXgodCkpKX1fb25XaGVlbCh0KXtpZih0LmN0cmxLZXl8fHRoaXMuX2hhc1Njcm9sbGVkQW5jZXN0b3IodC50YXJnZXQsdC5kZWx0YVgsdC5kZWx0YVkpKXJldHVybjtjb25zdCBlPXRoaXMuJC50YWJsZTtsZXQgbj10LmRlbHRhWTtpZih0LmRlbHRhTW9kZT09PVdoZWVsRXZlbnQuRE9NX0RFTFRBX0xJTkU/bio9dGhpcy5fc2Nyb2xsTGluZUhlaWdodDp0LmRlbHRhTW9kZT09PVdoZWVsRXZlbnQuRE9NX0RFTFRBX1BBR0UmJihuKj10aGlzLl9zY3JvbGxQYWdlSGVpZ2h0KSx0aGlzLl93aGVlbEFuaW1hdGlvbkZyYW1lKXJldHVybiB0aGlzLl9kZWx0YVlBY2MrPW4sdm9pZCB0LnByZXZlbnREZWZhdWx0KCk7bis9dGhpcy5fZGVsdGFZQWNjLHRoaXMuX2RlbHRhWUFjYz0wLHRoaXMuX3doZWVsQW5pbWF0aW9uRnJhbWU9ITAsdGhpcy5fZGVib3VuY2VyV2hlZWxBbmltYXRpb25GcmFtZT1Obi5kZWJvdW5jZSh0aGlzLl9kZWJvdW5jZXJXaGVlbEFuaW1hdGlvbkZyYW1lLF90LCgoKT0+dGhpcy5fd2hlZWxBbmltYXRpb25GcmFtZT0hMSkpO2NvbnN0IGk9TWF0aC5hYnModC5kZWx0YVgpK01hdGguYWJzKG4pO3RoaXMuX2NhblNjcm9sbChlLHQuZGVsdGFYLG4pPyh0LnByZXZlbnREZWZhdWx0KCksZS5zY3JvbGxUb3ArPW4sZS5zY3JvbGxMZWZ0Kz10LmRlbHRhWCx0aGlzLl9zY3JvbGxIYW5kbGVyKCksdGhpcy5faGFzUmVzaWR1YWxNb21lbnR1bT0hMCx0aGlzLl9pZ25vcmVOZXdXaGVlbD0hMCx0aGlzLl9kZWJvdW5jZXJJZ25vcmVOZXdXaGVlbD1Obi5kZWJvdW5jZSh0aGlzLl9kZWJvdW5jZXJJZ25vcmVOZXdXaGVlbCxndC5hZnRlcihLMXQpLCgoKT0+dGhpcy5faWdub3JlTmV3V2hlZWw9ITEpKSk6dGhpcy5faGFzUmVzaWR1YWxNb21lbnR1bSYmaTw9dGhpcy5fcHJldmlvdXNNb21lbnR1bXx8dGhpcy5faWdub3JlTmV3V2hlZWw/dC5wcmV2ZW50RGVmYXVsdCgpOmk+dGhpcy5fcHJldmlvdXNNb21lbnR1bSYmKHRoaXMuX2hhc1Jlc2lkdWFsTW9tZW50dW09ITEpLHRoaXMuX3ByZXZpb3VzTW9tZW50dW09aX1faGFzU2Nyb2xsZWRBbmNlc3Rvcih0LGUsbil7cmV0dXJuInZhYWRpbi1ncmlkLWNlbGwtY29udGVudCIhPT10LmxvY2FsTmFtZSYmKCEoIXRoaXMuX2NhblNjcm9sbCh0LGUsbil8fC0xPT09WyJhdXRvIiwic2Nyb2xsIl0uaW5kZXhPZihnZXRDb21wdXRlZFN0eWxlKHQpLm92ZXJmbG93KSl8fCh0IT09dGhpcyYmdC5wYXJlbnRFbGVtZW50P3RoaXMuX2hhc1Njcm9sbGVkQW5jZXN0b3IodC5wYXJlbnRFbGVtZW50LGUsbik6dm9pZCAwKSl9X2NhblNjcm9sbCh0LGUsbil7cmV0dXJuIG4+MCYmdC5zY3JvbGxUb3A8dC5zY3JvbGxIZWlnaHQtdC5vZmZzZXRIZWlnaHR8fG48MCYmdC5zY3JvbGxUb3A+MHx8ZT4wJiZ0LnNjcm9sbExlZnQ8dC5zY3JvbGxXaWR0aC10Lm9mZnNldFdpZHRofHxlPDAmJnQuc2Nyb2xsTGVmdD4wfV9zY2hlZHVsZVNjcm9sbGluZygpe3RoaXMuX3Njcm9sbGluZ0ZyYW1lfHwodGhpcy5fc2Nyb2xsaW5nRnJhbWU9cmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+dGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJzY3JvbGxpbmciLCEwLHRoaXMuJC5zY3JvbGxlcikpKSksdGhpcy5fZGVib3VuY2VTY3JvbGxpbmc9Tm4uZGVib3VuY2UodGhpcy5fZGVib3VuY2VTY3JvbGxpbmcsZ3QuYWZ0ZXIoJDF0KSwoKCk9PntjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9zY3JvbGxpbmdGcmFtZSksZGVsZXRlIHRoaXMuX3Njcm9sbGluZ0ZyYW1lLHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgic2Nyb2xsaW5nIiwhMSx0aGlzLiQuc2Nyb2xsZXIpLHRoaXMuX3Jlb3JkZXJSb3dzKCl9KSl9X2FmdGVyU2Nyb2xsKCl7dGhpcy5fdHJhbnNsYXRlU3RhdGlvbmFyeUVsZW1lbnRzKCksdGhpcy5oYXNBdHRyaWJ1dGUoInJlb3JkZXJpbmciKXx8dGhpcy5fc2NoZWR1bGVTY3JvbGxpbmcoKSx0aGlzLl91cGRhdGVPdmVyZmxvdygpfV91cGRhdGVPdmVyZmxvdygpe2xldCB0PSIiO2NvbnN0IGU9dGhpcy4kLnRhYmxlO2Uuc2Nyb2xsVG9wPGUuc2Nyb2xsSGVpZ2h0LWUuY2xpZW50SGVpZ2h0JiYodCs9IiBib3R0b20iKSxlLnNjcm9sbFRvcD4wJiYodCs9IiB0b3AiKSxlLnNjcm9sbExlZnQ8ZS5zY3JvbGxXaWR0aC1lLmNsaWVudFdpZHRoJiYodCs9IiByaWdodCIpLGUuc2Nyb2xsTGVmdD4wJiYodCs9IiBsZWZ0IiksdGhpcy5fZGVib3VuY2VPdmVyZmxvdz1Obi5kZWJvdW5jZSh0aGlzLl9kZWJvdW5jZU92ZXJmbG93LF90LCgoKT0+e2NvbnN0IGU9dC50cmltKCk7ZS5sZW5ndGg+MCYmdGhpcy5nZXRBdHRyaWJ1dGUoIm92ZXJmbG93IikhPT1lP3RoaXMuc2V0QXR0cmlidXRlKCJvdmVyZmxvdyIsZSk6MD09ZS5sZW5ndGgmJnRoaXMuaGFzQXR0cmlidXRlKCJvdmVyZmxvdyIpJiZ0aGlzLnJlbW92ZUF0dHJpYnV0ZSgib3ZlcmZsb3ciKX0pKX1fcmVvcmRlclJvd3MoKXtpZih0aGlzLl9fbW91c2VEb3duKXJldHVybiB2b2lkKHRoaXMuX19wZW5kaW5nUmVvcmRlcj0hMCk7Y29uc3QgdD10aGlzLiQuaXRlbXMsZT10LnF1ZXJ5U2VsZWN0b3JBbGwoInRyIik7aWYoIWUubGVuZ3RoKXJldHVybjtjb25zdCBuPXRoaXMuX3ZpcnR1YWxTdGFydCt0aGlzLl92aWR4T2Zmc2V0LGk9dGhpcy5fcm93V2l0aEZvY3VzZWRFbGVtZW50fHxBcnJheS5mcm9tKGUpLmZpbHRlcigodD0+IXQuaGlkZGVuKSlbMF07aWYoIWkpcmV0dXJuO2NvbnN0IHI9aS5pbmRleC1uLG89QXJyYXkuZnJvbShlKS5pbmRleE9mKGkpLXI7aWYobz4wKWZvcihsZXQgbj0wO248bztuKyspdC5hcHBlbmRDaGlsZChlW25dKTtlbHNlIGlmKG88MClmb3IobGV0IG49ZS5sZW5ndGgrbztuPGUubGVuZ3RoO24rKyl0Lmluc2VydEJlZm9yZShlW25dLGVbMF0pO2lmKHRoaXMuX3NhZmFyaSl7Y29uc3R7dHJhbnNmb3JtOnR9PXRoaXMuJC5oZWFkZXIuc3R5bGU7dGhpcy4kLmhlYWRlci5zdHlsZS50cmFuc2Zvcm09IiIsc2V0VGltZW91dCgoKCk9PnRoaXMuJC5oZWFkZXIuc3R5bGUudHJhbnNmb3JtPXQpKX19X2Zyb3plbkNlbGxzQ2hhbmdlZCgpe3RoaXMuX2RlYm91bmNlckNhY2hlRWxlbWVudHM9Tm4uZGVib3VuY2UodGhpcy5fZGVib3VuY2VyQ2FjaGVFbGVtZW50cyx2dCwoKCk9PntBcnJheS5mcm9tKHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCdbcGFydH49ImNlbGwiXScpKS5mb3JFYWNoKChmdW5jdGlvbih0KXt0LnN0eWxlLnRyYW5zZm9ybT0iIn0pKSx0aGlzLl9mcm96ZW5DZWxscz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLiQudGFibGUucXVlcnlTZWxlY3RvckFsbCgiW2Zyb3plbl0iKSksdGhpcy5fdXBkYXRlU2Nyb2xsZXJNZWFzdXJlbWVudHMoKSx0aGlzLl90cmFuc2xhdGVTdGF0aW9uYXJ5RWxlbWVudHMoKX0pKSx0aGlzLl91cGRhdGVMYXN0RnJvemVuKCl9X3VwZGF0ZVNjcm9sbGVyTWVhc3VyZW1lbnRzKCl7dGhpcy5fZnJvemVuQ2VsbHMubGVuZ3RoPjAmJnRoaXMuX19pc1JUTCYmKHRoaXMuX19zY3JvbGxlck1ldHJpY3M9e3Njcm9sbFdpZHRoOnRoaXMuJC50YWJsZS5zY3JvbGxXaWR0aCxjbGllbnRXaWR0aDp0aGlzLiQudGFibGUuY2xpZW50V2lkdGh9KX1fdXBkYXRlTGFzdEZyb3plbigpe2lmKCF0aGlzLl9jb2x1bW5UcmVlKXJldHVybjtjb25zdCB0PXRoaXMuX2NvbHVtblRyZWVbdGhpcy5fY29sdW1uVHJlZS5sZW5ndGgtMV0uc2xpY2UoMCk7dC5zb3J0KCgodCxlKT0+dC5fb3JkZXItZS5fb3JkZXIpKTtjb25zdCBlPXQucmVkdWNlKCgodCxlLG4pPT4oZS5fbGFzdEZyb3plbj0hMSxlLmZyb3plbiYmIWUuaGlkZGVuP246dCkpLHZvaWQgMCk7dm9pZCAwIT09ZSYmKHRbZV0uX2xhc3RGcm96ZW49ITApfV90cmFuc2xhdGVTdGF0aW9uYXJ5RWxlbWVudHMoKXtjb25zdCB0PU1hdGgubWF4KDAsdGhpcy5fc2Nyb2xsTGVmdCksZT1NYXRoLm1heCgwLHRoaXMuX3Njcm9sbFRvcCk7bGV0IG49MCxpPTAscj0wO2lmKHRoaXMuX3VzZVN0aWNreXx8KG49dCxpPWUscj10aGlzLiQudGFibGUuY2xpZW50SGVpZ2h0LXRoaXMuJC5mb290ZXIub2Zmc2V0SGVpZ2h0LXRoaXMuJC5mb290ZXIub2Zmc2V0VG9wKSx0aGlzLiQuaGVhZGVyLnN0eWxlLnRyYW5zZm9ybT10aGlzLl9nZXRUcmFuc2xhdGUoLXQrbixpKSx0aGlzLiQuZm9vdGVyLnN0eWxlLnRyYW5zZm9ybT10aGlzLl9nZXRUcmFuc2xhdGUoLXQrbixpK3IpLHRoaXMuJC5pdGVtcy5zdHlsZS50cmFuc2Zvcm09dGhpcy5fZ2V0VHJhbnNsYXRlKC10K24sMCksdGhpcy5fZnJvemVuQ2VsbHMubGVuZ3RoPjApe2NvbnN0IHQ9dGhpcy5fX2lzUlRMP3RoaXMuX19nZXROb3JtYWxpemVkU2Nyb2xsTGVmdCh0aGlzLiQudGFibGUpK3RoaXMuX19zY3JvbGxlck1ldHJpY3MuY2xpZW50V2lkdGgtdGhpcy5fX3Njcm9sbGVyTWV0cmljcy5zY3JvbGxXaWR0aDp0aGlzLl9zY3JvbGxMZWZ0LGU9dGhpcy5fZ2V0VHJhbnNsYXRlKHQsMCk7Zm9yKGxldCB0PTA7dDx0aGlzLl9mcm96ZW5DZWxscy5sZW5ndGg7dCsrKXRoaXMuX2Zyb3plbkNlbGxzW3RdLnN0eWxlLnRyYW5zZm9ybT1lfX1fZ2V0VHJhbnNsYXRlKHQsZSl7cmV0dXJuYHRyYW5zbGF0ZSgke3R9cHgsICR7ZX1weClgfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDIxIFZhYWRpbiBMdGQuCiAgICAgKiBUaGlzIHByb2dyYW0gaXMgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBhdmFpbGFibGUgYXQgaHR0cHM6Ly92YWFkaW4uY29tL2xpY2Vuc2UvCiAgICAgKi8sSjF0PXQ9PmNsYXNzIGV4dGVuZHMgdHtzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKXtyZXR1cm57c2VsZWN0ZWRJdGVtczp7dHlwZTpPYmplY3Qsbm90aWZ5OiEwLHZhbHVlOigpPT5bXX19fXN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCl7cmV0dXJuWyJfc2VsZWN0ZWRJdGVtc0NoYW5nZWQoc2VsZWN0ZWRJdGVtcy4qKSJdfV9pc1NlbGVjdGVkKHQpe3JldHVybiB0aGlzLnNlbGVjdGVkSXRlbXMmJnRoaXMuX2dldEl0ZW1JbmRleEluQXJyYXkodCx0aGlzLnNlbGVjdGVkSXRlbXMpPi0xfXNlbGVjdEl0ZW0odCl7dGhpcy5faXNTZWxlY3RlZCh0KXx8KHRoaXMuc2VsZWN0ZWRJdGVtcz1bLi4udGhpcy5zZWxlY3RlZEl0ZW1zLHRdKX1kZXNlbGVjdEl0ZW0odCl7dGhpcy5faXNTZWxlY3RlZCh0KSYmKHRoaXMuc2VsZWN0ZWRJdGVtcz10aGlzLnNlbGVjdGVkSXRlbXMuZmlsdGVyKChlPT4hdGhpcy5faXRlbXNFcXVhbChlLHQpKSkpfV90b2dnbGVJdGVtKHQpey0xPT09dGhpcy5fZ2V0SXRlbUluZGV4SW5BcnJheSh0LHRoaXMuc2VsZWN0ZWRJdGVtcyk/dGhpcy5zZWxlY3RJdGVtKHQpOnRoaXMuZGVzZWxlY3RJdGVtKHQpfV9zZWxlY3RlZEl0ZW1zQ2hhbmdlZCh0KXshdGhpcy4kLml0ZW1zLmNoaWxkcmVuLmxlbmd0aHx8InNlbGVjdGVkSXRlbXMiIT09dC5wYXRoJiYic2VsZWN0ZWRJdGVtcy5zcGxpY2VzIiE9PXQucGF0aHx8QXJyYXkuZnJvbSh0aGlzLiQuaXRlbXMuY2hpbGRyZW4pLmZvckVhY2goKHQ9Pnt0aGlzLl91cGRhdGVJdGVtKHQsdC5faXRlbSl9KSl9X3NlbGVjdGVkSW5zdGFuY2VDaGFuZ2VkQ2FsbGJhY2sodCxlKXtlP3RoaXMuc2VsZWN0SXRlbSh0Lml0ZW0pOnRoaXMuZGVzZWxlY3RJdGVtKHQuaXRlbSl9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqLyxRMXQ9dD0+Y2xhc3MgZXh0ZW5kcyB0e3N0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybnttdWx0aVNvcnQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMX0sX3NvcnRlcnM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19LF9wcmV2aW91c1NvcnRlcnM6e3R5cGU6QXJyYXksdmFsdWU6ZnVuY3Rpb24oKXtyZXR1cm5bXX19fX1yZWFkeSgpe3N1cGVyLnJlYWR5KCksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJzb3J0ZXItY2hhbmdlZCIsdGhpcy5fb25Tb3J0ZXJDaGFuZ2VkKX1fb25Tb3J0ZXJDaGFuZ2VkKHQpe2NvbnN0IGU9dC50YXJnZXQ7dC5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLl9fdXBkYXRlU29ydGVyKGUpLHRoaXMuX19hcHBseVNvcnRlcnMoKX1fX3JlbW92ZVNvcnRlcnModCl7MCE9dC5sZW5ndGgmJih0aGlzLl9zb3J0ZXJzPXRoaXMuX3NvcnRlcnMuZmlsdGVyKChlPT50LmluZGV4T2YoZSk8MCkpLHRoaXMubXVsdGlTb3J0JiZ0aGlzLl9fdXBkYXRlU29ydE9yZGVycygpLHRoaXMuX19hcHBseVNvcnRlcnMoKSl9X191cGRhdGVTb3J0T3JkZXJzKCl7dGhpcy5fc29ydGVycy5mb3JFYWNoKCgodCxlKT0+dC5fb3JkZXI9dGhpcy5fc29ydGVycy5sZW5ndGg+MT9lOm51bGwpLHRoaXMpfV9fdXBkYXRlU29ydGVyKHQpe2lmKHQuZGlyZWN0aW9ufHwtMSE9PXRoaXMuX3NvcnRlcnMuaW5kZXhPZih0KSlpZih0Ll9vcmRlcj1udWxsLHRoaXMubXVsdGlTb3J0KXRoaXMuX3JlbW92ZUFycmF5SXRlbSh0aGlzLl9zb3J0ZXJzLHQpLHQuZGlyZWN0aW9uJiZ0aGlzLl9zb3J0ZXJzLnVuc2hpZnQodCksdGhpcy5fX3VwZGF0ZVNvcnRPcmRlcnMoKTtlbHNlIGlmKHQuZGlyZWN0aW9uKXtjb25zdCBlPXRoaXMuX3NvcnRlcnMuZmlsdGVyKChlPT5lIT10KSk7dGhpcy5fc29ydGVycz1bdF0sZS5mb3JFYWNoKCh0PT57dC5fb3JkZXI9bnVsbCx0LmRpcmVjdGlvbj1udWxsfSkpfX1fX2FwcGx5U29ydGVycygpe3RoaXMuZGF0YVByb3ZpZGVyJiZ0aGlzLmlzQXR0YWNoZWQmJkpTT04uc3RyaW5naWZ5KHRoaXMuX3ByZXZpb3VzU29ydGVycykhPT1KU09OLnN0cmluZ2lmeSh0aGlzLl9tYXBTb3J0ZXJzKCkpJiZ0aGlzLmNsZWFyQ2FjaGUoKSx0aGlzLl9hMTF5VXBkYXRlU29ydGVycygpLHRoaXMuX3ByZXZpb3VzU29ydGVycz10aGlzLl9tYXBTb3J0ZXJzKCl9X21hcFNvcnRlcnMoKXtyZXR1cm4gdGhpcy5fc29ydGVycy5tYXAoKHQ9Pih7cGF0aDp0LnBhdGgsZGlyZWN0aW9uOnQuZGlyZWN0aW9ufSkpKX1fcmVtb3ZlQXJyYXlJdGVtKHQsZSl7Y29uc3Qgbj10LmluZGV4T2YoZSk7bj4tMSYmdC5zcGxpY2UobiwxKX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovLHQwdD10PT5jbGFzcyBleHRlbmRzIHR7c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7cmV0dXJue2NlbGxDbGFzc05hbWVHZW5lcmF0b3I6RnVuY3Rpb259fXN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCl7cmV0dXJuWyJfX2NlbGxDbGFzc05hbWVHZW5lcmF0b3JDaGFuZ2VkKGNlbGxDbGFzc05hbWVHZW5lcmF0b3IpIl19X19jZWxsQ2xhc3NOYW1lR2VuZXJhdG9yQ2hhbmdlZCgpe3RoaXMuZ2VuZXJhdGVDZWxsQ2xhc3NOYW1lcygpfWdlbmVyYXRlQ2VsbENsYXNzTmFtZXMoKXtBcnJheS5mcm9tKHRoaXMuJC5pdGVtcy5jaGlsZHJlbikuZmlsdGVyKCh0PT4hdC5oaWRkZW4pKS5mb3JFYWNoKCh0PT50aGlzLl9nZW5lcmF0ZUNlbGxDbGFzc05hbWVzKHQsdGhpcy5fX2dldFJvd01vZGVsKHQpKSkpfV9nZW5lcmF0ZUNlbGxDbGFzc05hbWVzKHQsZSl7QXJyYXkuZnJvbSh0LmNoaWxkcmVuKS5mb3JFYWNoKCh0PT57aWYodC5fX2dlbmVyYXRlZENsYXNzZXMmJnQuX19nZW5lcmF0ZWRDbGFzc2VzLmZvckVhY2goKGU9PnQuY2xhc3NMaXN0LnJlbW92ZShlKSkpLHRoaXMuY2VsbENsYXNzTmFtZUdlbmVyYXRvcil7Y29uc3Qgbj10aGlzLmNlbGxDbGFzc05hbWVHZW5lcmF0b3IodC5fY29sdW1uLGUpO3QuX19nZW5lcmF0ZWRDbGFzc2VzPW4mJm4uc3BsaXQoIiAiKS5maWx0ZXIoKHQ9PnQubGVuZ3RoPjApKSx0Ll9fZ2VuZXJhdGVkQ2xhc3NlcyYmdC5fX2dlbmVyYXRlZENsYXNzZXMuZm9yRWFjaCgoZT0+dC5jbGFzc0xpc3QuYWRkKGUpKSl9fSkpfX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDIxIFZhYWRpbiBMdGQuCiAgICAgKiBUaGlzIHByb2dyYW0gaXMgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBhdmFpbGFibGUgYXQgaHR0cHM6Ly92YWFkaW4uY29tL2xpY2Vuc2UvCiAgICAgKi8sZTB0PSJiZXR3ZWVuIixuMHQ9Im9uLXRvcC1vci1iZXR3ZWVuIixpMHQ9Im9uLWdyaWQiLHIwdD0ib24tdG9wIixvMHQ9ImFib3ZlIixhMHQ9ImJlbG93IixzMHQ9ImVtcHR5IixsMHQ9dD0+Y2xhc3MgZXh0ZW5kcyB0e3N0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybntkcm9wTW9kZTpTdHJpbmcscm93c0RyYWdnYWJsZTpCb29sZWFuLGRyYWdGaWx0ZXI6RnVuY3Rpb24sZHJvcEZpbHRlcjpGdW5jdGlvbixfX2RuZEF1dG9TY3JvbGxUaHJlc2hvbGQ6e3ZhbHVlOjUwfX19c3RhdGljIGdldCBvYnNlcnZlcnMoKXtyZXR1cm5bIl9kcmFnRHJvcEFjY2Vzc0NoYW5nZWQocm93c0RyYWdnYWJsZSwgZHJvcE1vZGUsIGRyYWdGaWx0ZXIsIGRyb3BGaWx0ZXIpIl19cmVhZHkoKXtzdXBlci5yZWFkeSgpLHRoaXMuJC50YWJsZS5hZGRFdmVudExpc3RlbmVyKCJkcmFnc3RhcnQiLHRoaXMuX29uRHJhZ1N0YXJ0LmJpbmQodGhpcykpLHRoaXMuJC50YWJsZS5hZGRFdmVudExpc3RlbmVyKCJkcmFnZW5kIix0aGlzLl9vbkRyYWdFbmQuYmluZCh0aGlzKSksdGhpcy4kLnRhYmxlLmFkZEV2ZW50TGlzdGVuZXIoImRyYWdvdmVyIix0aGlzLl9vbkRyYWdPdmVyLmJpbmQodGhpcykpLHRoaXMuJC50YWJsZS5hZGRFdmVudExpc3RlbmVyKCJkcmFnbGVhdmUiLHRoaXMuX29uRHJhZ0xlYXZlLmJpbmQodGhpcykpLHRoaXMuJC50YWJsZS5hZGRFdmVudExpc3RlbmVyKCJkcm9wIix0aGlzLl9vbkRyb3AuYmluZCh0aGlzKSksdGhpcy4kLnRhYmxlLmFkZEV2ZW50TGlzdGVuZXIoImRyYWdlbnRlciIsKHQ9Pnt0aGlzLmRyb3BNb2RlJiYodC5wcmV2ZW50RGVmYXVsdCgpLHQuc3RvcFByb3BhZ2F0aW9uKCkpfSkpfV9vbkRyYWdTdGFydCh0KXtpZih0aGlzLnJvd3NEcmFnZ2FibGUpe2xldCBlPXQudGFyZ2V0O2lmKCJ2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQiPT09ZS5sb2NhbE5hbWUmJihlPWUuYXNzaWduZWRTbG90LnBhcmVudE5vZGUucGFyZW50Tm9kZSksZS5wYXJlbnROb2RlIT09dGhpcy4kLml0ZW1zKXJldHVybjtpZih0LnN0b3BQcm9wYWdhdGlvbigpLHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgiZHJhZ2dpbmctcm93cyIsITAsdGhpcyksdGhpcy5fc2FmYXJpKXtjb25zdCB0PWUuc3R5bGUudHJhbnNmb3JtO2Uuc3R5bGUudG9wPS90cmFuc2xhdGVZXCgoLiopXCkvLmV4ZWModClbMV0sZS5zdHlsZS50cmFuc2Zvcm09Im5vbmUiLHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKCk9PntlLnN0eWxlLnRvcD0iIixlLnN0eWxlLnRyYW5zZm9ybT10fSkpfWNvbnN0IG49ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTt0aGlzLl9pb3M/dC5kYXRhVHJhbnNmZXIuc2V0RHJhZ0ltYWdlKGUpOnQuZGF0YVRyYW5zZmVyLnNldERyYWdJbWFnZShlLHQuY2xpZW50WC1uLmxlZnQsdC5jbGllbnRZLW4udG9wKTtsZXQgaT1bZV07dGhpcy5faXNTZWxlY3RlZChlLl9pdGVtKSYmKGk9dGhpcy5fX2dldFZpZXdwb3J0Um93cygpLmZpbHRlcigodD0+dGhpcy5faXNTZWxlY3RlZCh0Ll9pdGVtKSkpLmZpbHRlcigodD0+IXRoaXMuZHJhZ0ZpbHRlcnx8dGhpcy5kcmFnRmlsdGVyKHRoaXMuX19nZXRSb3dNb2RlbCh0KSkpKSksdC5kYXRhVHJhbnNmZXIuc2V0RGF0YSgidGV4dCIsdGhpcy5fX2Zvcm1hdERlZmF1bHRUcmFuc2ZlckRhdGEoaSkpLGUuc2V0QXR0cmlidXRlKCJkcmFnc3RhcnQiLGkubGVuZ3RoPjE/aS5sZW5ndGg6IiIpLHRoaXMudXBkYXRlU3R5bGVzKHsiLS1fZ3JpZC1kcmFnLXN0YXJ0LXgiOnQuY2xpZW50WC1uLmxlZnQrMjArInB4IiwiLS1fZ3JpZC1kcmFnLXN0YXJ0LXkiOnQuY2xpZW50WS1uLnRvcCsxMCsicHgifSkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+e2UucmVtb3ZlQXR0cmlidXRlKCJkcmFnc3RhcnQiKSx0aGlzLnVwZGF0ZVN0eWxlcyh7Ii0tX2dyaWQtZHJhZy1zdGFydC14IjoiIiwiLS1fZ3JpZC1kcmFnLXN0YXJ0LXkiOiIifSl9KSk7Y29uc3Qgcj1uZXcgQ3VzdG9tRXZlbnQoImdyaWQtZHJhZ3N0YXJ0Iix7ZGV0YWlsOntkcmFnZ2VkSXRlbXM6aS5tYXAoKHQ9PnQuX2l0ZW0pKSxzZXREcmFnRGF0YTooZSxuKT0+dC5kYXRhVHJhbnNmZXIuc2V0RGF0YShlLG4pLHNldERyYWdnZWRJdGVtc0NvdW50OnQ9PmUuc2V0QXR0cmlidXRlKCJkcmFnc3RhcnQiLHQpfX0pO3Iub3JpZ2luYWxFdmVudD10LHRoaXMuZGlzcGF0Y2hFdmVudChyKX19X29uRHJhZ0VuZCh0KXt0aGlzLl90b2dnbGVBdHRyaWJ1dGUoImRyYWdnaW5nLXJvd3MiLCExLHRoaXMpLHQuc3RvcFByb3BhZ2F0aW9uKCk7Y29uc3QgZT1uZXcgQ3VzdG9tRXZlbnQoImdyaWQtZHJhZ2VuZCIpO2Uub3JpZ2luYWxFdmVudD10LHRoaXMuZGlzcGF0Y2hFdmVudChlKX1fb25EcmFnTGVhdmUodCl7dC5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLl9jbGVhckRyYWdTdHlsZXMoKX1fb25EcmFnT3Zlcih0KXtpZih0aGlzLmRyb3BNb2RlKXtpZih0aGlzLl9kcm9wTG9jYXRpb249dm9pZCAwLHRoaXMuX2RyYWdPdmVySXRlbT12b2lkIDAsdGhpcy5fX2RuZEF1dG9TY3JvbGwodC5jbGllbnRZKSlyZXR1cm4gdm9pZCB0aGlzLl9jbGVhckRyYWdTdHlsZXMoKTtsZXQgZT10LmNvbXBvc2VkUGF0aCgpLmZpbHRlcigodD0+InRyIj09PXQubG9jYWxOYW1lKSlbMF07aWYodGhpcy5fZWZmZWN0aXZlU2l6ZSYmdGhpcy5kcm9wTW9kZSE9PWkwdClpZihlJiZlLnBhcmVudE5vZGU9PT10aGlzLiQuaXRlbXMpe2NvbnN0IG49ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtpZih0aGlzLl9kcm9wTG9jYXRpb249cjB0LHRoaXMuZHJvcE1vZGU9PT1lMHQpe3RoaXMuX2Ryb3BMb2NhdGlvbj10LmNsaWVudFktbi50b3A8bi5ib3R0b20tdC5jbGllbnRZP28wdDphMHR9ZWxzZSB0aGlzLmRyb3BNb2RlPT09bjB0JiYodC5jbGllbnRZLW4udG9wPG4uaGVpZ2h0LzM/dGhpcy5fZHJvcExvY2F0aW9uPW8wdDp0LmNsaWVudFktbi50b3A+bi5oZWlnaHQvMyoyJiYodGhpcy5fZHJvcExvY2F0aW9uPWEwdCkpfWVsc2V7aWYoZSlyZXR1cm47aWYodGhpcy5kcm9wTW9kZSE9PWUwdCYmdGhpcy5kcm9wTW9kZSE9PW4wdClyZXR1cm47ZT1BcnJheS5mcm9tKHRoaXMuJC5pdGVtcy5jaGlsZHJlbikuZmlsdGVyKCh0PT4hdC5oaWRkZW4pKS5wb3AoKSx0aGlzLl9kcm9wTG9jYXRpb249YTB0fWVsc2UgdGhpcy5fZHJvcExvY2F0aW9uPXMwdDtpZihlJiZlLmhhc0F0dHJpYnV0ZSgiZHJvcC1kaXNhYmxlZCIpKXJldHVybiB2b2lkKHRoaXMuX2Ryb3BMb2NhdGlvbj12b2lkIDApO3Quc3RvcFByb3BhZ2F0aW9uKCksdC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2Ryb3BMb2NhdGlvbj09PXMwdD90aGlzLl90b2dnbGVBdHRyaWJ1dGUoImRyYWdvdmVyIiwhMCx0aGlzKTplPyh0aGlzLl9kcmFnT3Zlckl0ZW09ZS5faXRlbSxlLmdldEF0dHJpYnV0ZSgiZHJhZ292ZXIiKSE9PXRoaXMuX2Ryb3BMb2NhdGlvbiYmZS5zZXRBdHRyaWJ1dGUoImRyYWdvdmVyIix0aGlzLl9kcm9wTG9jYXRpb24pKTp0aGlzLl9jbGVhckRyYWdTdHlsZXMoKX19X19kbmRBdXRvU2Nyb2xsKHQpe2lmKHRoaXMuX19kbmRBdXRvU2Nyb2xsaW5nKXJldHVybiEwO2NvbnN0IGU9dGhpcy4kLmhlYWRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20sbj10aGlzLiQuZm9vdGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCxpPWUtdCt0aGlzLl9fZG5kQXV0b1Njcm9sbFRocmVzaG9sZCxyPXQtbit0aGlzLl9fZG5kQXV0b1Njcm9sbFRocmVzaG9sZDtsZXQgbz0wO2lmKHI+MD9vPTIqcjppPjAmJihvPTIqLWkpLG8pe2NvbnN0IHQ9dGhpcy4kLnRhYmxlLnNjcm9sbFRvcDt0aGlzLiQudGFibGUuc2Nyb2xsVG9wKz1vO2lmKHQhPT10aGlzLiQudGFibGUuc2Nyb2xsVG9wKXJldHVybiB0aGlzLl9fZG5kQXV0b1Njcm9sbGluZz0hMCxzZXRUaW1lb3V0KCgoKT0+dGhpcy5fX2RuZEF1dG9TY3JvbGxpbmc9ITEpLDIwKSx0aGlzLl9zY3JvbGxIYW5kbGVyKCksITB9fV9fZ2V0Vmlld3BvcnRSb3dzKCl7Y29uc3QgdD10aGlzLiQuaGVhZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbSxlPXRoaXMuJC5mb290ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO3JldHVybiBBcnJheS5mcm9tKHRoaXMuJC5pdGVtcy5jaGlsZHJlbikuZmlsdGVyKChuPT57Y29uc3QgaT1uLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO3JldHVybiBpLmJvdHRvbT50JiZpLnRvcDxlfSkpfV9jbGVhckRyYWdTdHlsZXMoKXt0aGlzLnJlbW92ZUF0dHJpYnV0ZSgiZHJhZ292ZXIiKSxBcnJheS5mcm9tKHRoaXMuJC5pdGVtcy5jaGlsZHJlbikuZm9yRWFjaCgodD0+dC5yZW1vdmVBdHRyaWJ1dGUoImRyYWdvdmVyIikpKX1fb25Ecm9wKHQpe2lmKHRoaXMuZHJvcE1vZGUpe3Quc3RvcFByb3BhZ2F0aW9uKCksdC5wcmV2ZW50RGVmYXVsdCgpO2NvbnN0IGU9dC5kYXRhVHJhbnNmZXIudHlwZXMmJkFycmF5LmZyb20odC5kYXRhVHJhbnNmZXIudHlwZXMpLm1hcCgoZT0+KHt0eXBlOmUsZGF0YTp0LmRhdGFUcmFuc2Zlci5nZXREYXRhKGUpfSkpKTt0aGlzLl9jbGVhckRyYWdTdHlsZXMoKTtjb25zdCBuPW5ldyBDdXN0b21FdmVudCgiZ3JpZC1kcm9wIix7YnViYmxlczp0LmJ1YmJsZXMsY2FuY2VsYWJsZTp0LmNhbmNlbGFibGUsZGV0YWlsOntkcm9wVGFyZ2V0SXRlbTp0aGlzLl9kcmFnT3Zlckl0ZW0sZHJvcExvY2F0aW9uOnRoaXMuX2Ryb3BMb2NhdGlvbixkcmFnRGF0YTplfX0pO24ub3JpZ2luYWxFdmVudD10LHRoaXMuZGlzcGF0Y2hFdmVudChuKX19X19mb3JtYXREZWZhdWx0VHJhbnNmZXJEYXRhKHQpe3JldHVybiB0Lm1hcCgodD0+QXJyYXkuZnJvbSh0LmNoaWxkcmVuKS5maWx0ZXIoKHQ9PiF0LmhpZGRlbiYmLTE9PT10LmdldEF0dHJpYnV0ZSgicGFydCIpLmluZGV4T2YoImRldGFpbHMtY2VsbCIpKSkuc29ydCgoKHQsZSk9PnQuX2NvbHVtbi5fb3JkZXI+ZS5fY29sdW1uLl9vcmRlcj8xOi0xKSkubWFwKCh0PT50Ll9jb250ZW50LnRleHRDb250ZW50LnRyaW0oKSkpLmZpbHRlcigodD0+dCkpLmpvaW4oIlx0IikpKS5qb2luKCJcbiIpfV9kcmFnRHJvcEFjY2Vzc0NoYW5nZWQoKXt0aGlzLmZpbHRlckRyYWdBbmREcm9wKCl9ZmlsdGVyRHJhZ0FuZERyb3AoKXtBcnJheS5mcm9tKHRoaXMuJC5pdGVtcy5jaGlsZHJlbikuZmlsdGVyKCh0PT4hdC5oaWRkZW4pKS5mb3JFYWNoKCh0PT57dGhpcy5fZmlsdGVyRHJhZ0FuZERyb3AodCx0aGlzLl9fZ2V0Um93TW9kZWwodCkpfSkpfV9maWx0ZXJEcmFnQW5kRHJvcCh0LGUpe2NvbnN0IG49IXRoaXMucm93c0RyYWdnYWJsZXx8dGhpcy5kcmFnRmlsdGVyJiYhdGhpcy5kcmFnRmlsdGVyKGUpLGk9IXRoaXMuZHJvcE1vZGV8fHRoaXMuZHJvcEZpbHRlciYmIXRoaXMuZHJvcEZpbHRlcihlKTtBcnJheS5mcm9tKHQuY2hpbGRyZW4pLm1hcCgodD0+dC5fY29udGVudCkpLmZvckVhY2goKHQ9PntuP3QucmVtb3ZlQXR0cmlidXRlKCJkcmFnZ2FibGUiKTp0LnNldEF0dHJpYnV0ZSgiZHJhZ2dhYmxlIiwhMCl9KSksdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJkcmFnLWRpc2FibGVkIixuLHQpLHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgiZHJvcC1kaXNhYmxlZCIsaSx0KX19Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovLGMwdD10PT5jbGFzcyBleHRlbmRzIHR7c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7cmV0dXJue19oZWFkZXJGb2N1c2FibGU6e3R5cGU6T2JqZWN0LG9ic2VydmVyOiJfZm9jdXNhYmxlQ2hhbmdlZCJ9LF9pdGVtc0ZvY3VzYWJsZTp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il9mb2N1c2FibGVDaGFuZ2VkIn0sX2Zvb3RlckZvY3VzYWJsZTp7dHlwZTpPYmplY3Qsb2JzZXJ2ZXI6Il9mb2N1c2FibGVDaGFuZ2VkIn0sX25hdmlnYXRpbmdJc0hpZGRlbjpCb29sZWFuLF9mb2N1c2VkSXRlbUluZGV4Ont0eXBlOk51bWJlcix2YWx1ZTowfSxfZm9jdXNlZENvbHVtbk9yZGVyOk51bWJlcixpbnRlcmFjdGluZzp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCxyZWFkT25seTohMCxvYnNlcnZlcjoiX2ludGVyYWN0aW5nQ2hhbmdlZCJ9fX1yZWFkeSgpe3N1cGVyLnJlYWR5KCksdGhpcy5faW9zfHx0aGlzLl9hbmRyb2lkfHwodGhpcy5hZGRFdmVudExpc3RlbmVyKCJrZXlkb3duIix0aGlzLl9vbktleURvd24pLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigia2V5dXAiLHRoaXMuX29uS2V5VXApLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXNpbiIsdGhpcy5fb25Gb2N1c0luKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImZvY3Vzb3V0Iix0aGlzLl9vbkZvY3VzT3V0KSx0aGlzLiQudGFibGUuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXNpbiIsdGhpcy5fb25DZWxsRm9jdXNJbi5iaW5kKHRoaXMpKSx0aGlzLiQudGFibGUuYWRkRXZlbnRMaXN0ZW5lcigiZm9jdXNvdXQiLHRoaXMuX29uQ2VsbEZvY3VzT3V0LmJpbmQodGhpcykpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwoKCk9Pnt0aGlzLl90b2dnbGVBdHRyaWJ1dGUoIm5hdmlnYXRpbmciLCExLHRoaXMpLHRoaXMuX2lzTW91c2Vkb3duPSEwfSkpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsKCgpPT50aGlzLl9pc01vdXNlZG93bj0hMSkpKX1fZm9jdXNhYmxlQ2hhbmdlZCh0LGUpe2UmJmUuc2V0QXR0cmlidXRlKCJ0YWJpbmRleCIsIi0xIiksdCYmdGhpcy5fdXBkYXRlR3JpZFNlY3Rpb25Gb2N1c1RhcmdldCh0KX1faW50ZXJhY3RpbmdDaGFuZ2VkKCl7dGhpcy5fdXBkYXRlR3JpZFNlY3Rpb25Gb2N1c1RhcmdldCh0aGlzLl9oZWFkZXJGb2N1c2FibGUpLHRoaXMuX3VwZGF0ZUdyaWRTZWN0aW9uRm9jdXNUYXJnZXQodGhpcy5faXRlbXNGb2N1c2FibGUpLHRoaXMuX3VwZGF0ZUdyaWRTZWN0aW9uRm9jdXNUYXJnZXQodGhpcy5fZm9vdGVyRm9jdXNhYmxlKX1fb25LZXlEb3duKHQpe2NvbnN0IGU9dC5rZXk7bGV0IG47c3dpdGNoKGUpe2Nhc2UiQXJyb3dVcCI6Y2FzZSJBcnJvd0Rvd24iOmNhc2UiQXJyb3dMZWZ0IjpjYXNlIkFycm93UmlnaHQiOmNhc2UiUGFnZVVwIjpjYXNlIlBhZ2VEb3duIjpjYXNlIkhvbWUiOmNhc2UiRW5kIjpuPSJOYXZpZ2F0aW9uIjticmVhaztjYXNlIkVudGVyIjpjYXNlIkVzY2FwZSI6Y2FzZSJGMiI6bj0iSW50ZXJhY3Rpb24iO2JyZWFrO2Nhc2UiVGFiIjpuPSJUYWIiO2JyZWFrO2Nhc2UiICI6bj0iU3BhY2UifXRoaXMuX2RldGVjdEludGVyYWN0aW5nKHQpLHRoaXMuaW50ZXJhY3RpbmcmJiJJbnRlcmFjdGlvbiIhPT1uJiYobj12b2lkIDApLG4mJnRoaXNbYF9vbiR7bn1LZXlEb3duYF0odCxlKX1fZW5zdXJlU2Nyb2xsZWRUb0luZGV4KHQpe0FycmF5LmZyb20odGhpcy4kLml0ZW1zLmNoaWxkcmVuKS5maWx0ZXIoKGU9PmUuaW5kZXg9PT10KSlbMF18fHRoaXMuX3Njcm9sbFRvSW5kZXgodCl9X29uTmF2aWdhdGlvbktleURvd24odCxlKXtmdW5jdGlvbiBuKHQpe3JldHVybiBBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKHQucGFyZW50Tm9kZS5jaGlsZHJlbix0KX10aGlzLl9zY3JvbGxIYW5kbGVyKCksdC5wcmV2ZW50RGVmYXVsdCgpO2NvbnN0IGk9dGhpcy5fbGFzdFZpc2libGVJbmRleC10aGlzLl9maXJzdFZpc2libGVJbmRleC0xO2xldCByPTAsbz0wO3N3aXRjaChlKXtjYXNlIkFycm93UmlnaHQiOnI9dGhpcy5fX2lzUlRMPy0xOjE7YnJlYWs7Y2FzZSJBcnJvd0xlZnQiOnI9dGhpcy5fX2lzUlRMPzE6LTE7YnJlYWs7Y2FzZSJIb21lIjpyPS0xLzAsdC5jdHJsS2V5JiYobz0tMS8wKTticmVhaztjYXNlIkVuZCI6cj0xLzAsdC5jdHJsS2V5JiYobz0xLzApO2JyZWFrO2Nhc2UiQXJyb3dEb3duIjpvPTE7YnJlYWs7Y2FzZSJBcnJvd1VwIjpvPS0xO2JyZWFrO2Nhc2UiUGFnZURvd24iOm89aTticmVhaztjYXNlIlBhZ2VVcCI6bz0taX1jb25zdCBhPXQuY29tcG9zZWRQYXRoKClbMF0scz1uKGEpLGw9dGhpcy5fZWxlbWVudE1hdGNoZXMoYSwnW3BhcnR+PSJkZXRhaWxzLWNlbGwiXScpLGM9YS5wYXJlbnROb2RlLHU9Yy5wYXJlbnROb2RlLGg9KHU9PT10aGlzLiQuaXRlbXM/dGhpcy5fZWZmZWN0aXZlU2l6ZTp1LmNoaWxkcmVuLmxlbmd0aCktMSxkPXU9PT10aGlzLiQuaXRlbXM/dm9pZCAwIT09dGhpcy5fZm9jdXNlZEl0ZW1JbmRleD90aGlzLl9mb2N1c2VkSXRlbUluZGV4OmMuaW5kZXg6bihjKTtsZXQgcD1NYXRoLm1heCgwLE1hdGgubWluKGQrbyxoKSksZj0hMTtpZih1PT09dGhpcy4kLml0ZW1zKXtjb25zdCB0PWMuX2l0ZW0sZT10aGlzLl9jYWNoZS5nZXRJdGVtRm9ySW5kZXgocCk7Zj1sPzA9PT1vOjE9PT1vJiZ0aGlzLl9pc0RldGFpbHNPcGVuZWQodCl8fC0xPT09byYmcCE9PWQmJnRoaXMuX2lzRGV0YWlsc09wZW5lZChlKSxmIT09bCYmKDE9PT1vJiZmfHwtMT09PW8mJiFmKSYmKHA9ZCl9aWYodSE9PXRoaXMuJC5pdGVtcylpZihwPmQpZm9yKDtwPGgmJnUuY2hpbGRyZW5bcF0uaGlkZGVuOylwKys7ZWxzZSBpZihwPGQpZm9yKDtwPjAmJnUuY2hpbGRyZW5bcF0uaGlkZGVuOylwLS07dm9pZCAwPT09dGhpcy5fZm9jdXNlZENvbHVtbk9yZGVyJiYodGhpcy5fZm9jdXNlZENvbHVtbk9yZGVyPWw/MDp0aGlzLl9nZXRDb2x1bW5zKHUsZCkuZmlsdGVyKCh0PT4hdC5oaWRkZW4pKVtzXS5fb3JkZXIpO2NvbnN0IG09dGhpcy5fZ2V0Q29sdW1ucyh1LHApLmZpbHRlcigodD0+IXQuaGlkZGVuKSksZz1tLm1hcCgodD0+dC5fb3JkZXIpKS5zb3J0KCgodCxlKT0+dC1lKSksXz1nLmxlbmd0aC0xLHk9Zy5pbmRleE9mKGcuc2xpY2UoMCkuc29ydCgoKHQsZSk9Pk1hdGguYWJzKHQtdGhpcy5fZm9jdXNlZENvbHVtbk9yZGVyKS1NYXRoLmFicyhlLXRoaXMuX2ZvY3VzZWRDb2x1bW5PcmRlcikpKVswXSksdj0wPT09byYmbD95Ok1hdGgubWF4KDAsTWF0aC5taW4oeStyLF8pKTt2IT09eSYmKHRoaXMuX2ZvY3VzZWRDb2x1bW5PcmRlcj12b2lkIDApLHU9PT10aGlzLiQuaXRlbXMmJnRoaXMuX2Vuc3VyZVNjcm9sbGVkVG9JbmRleChwKSx0aGlzLl90b2dnbGVBdHRyaWJ1dGUoIm5hdmlnYXRpbmciLCEwLHRoaXMpO2NvbnN0IGI9bS5yZWR1Y2UoKCh0LGUsbik9Pih0W2UuX29yZGVyXT1uLHQpKSx7fSlbZ1t2XV0seD11PT09dGhpcy4kLml0ZW1zP0FycmF5LmZyb20odS5jaGlsZHJlbikuZmlsdGVyKCh0PT50LmluZGV4PT09cCkpWzBdOnUuY2hpbGRyZW5bcF07aWYoIXgpcmV0dXJuO2NvbnN0IHc9Zj9BcnJheS5mcm9tKHguY2hpbGRyZW4pLmZpbHRlcigodD0+dGhpcy5fZWxlbWVudE1hdGNoZXModCwnW3BhcnR+PSJkZXRhaWxzLWNlbGwiXScpKSlbMF06eC5jaGlsZHJlbltiXTtpZih0aGlzLl9zY3JvbGxIb3Jpem9udGFsbHlUb0NlbGwodyksdT09PXRoaXMuJC5pdGVtcyYmKHRoaXMuX2ZvY3VzZWRJdGVtSW5kZXg9cCksdT09PXRoaXMuJC5pdGVtcyl7Y29uc3QgdD13LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLGU9dGhpcy4kLmZvb3Rlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3Asbj10aGlzLiQuaGVhZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbTt0LmJvdHRvbT5lPyh0aGlzLiQudGFibGUuc2Nyb2xsVG9wKz10LmJvdHRvbS1lLHRoaXMuX3Njcm9sbEhhbmRsZXIoKSk6dC50b3A8biYmKHRoaXMuJC50YWJsZS5zY3JvbGxUb3AtPW4tdC50b3AsdGhpcy5fc2Nyb2xsSGFuZGxlcigpKX13LmZvY3VzKCl9X29uSW50ZXJhY3Rpb25LZXlEb3duKHQsZSl7Y29uc3Qgbj10LmNvbXBvc2VkUGF0aCgpWzBdLGk9ImlucHV0Ij09PW4ubG9jYWxOYW1lJiYhL14oYnV0dG9ufGNoZWNrYm94fGNvbG9yfGZpbGV8aW1hZ2V8cmFkaW98cmFuZ2V8cmVzZXR8c3VibWl0KSQvaS50ZXN0KG4udHlwZSk7bGV0IHI7c3dpdGNoKGUpe2Nhc2UiRW50ZXIiOnI9IXRoaXMuaW50ZXJhY3Rpbmd8fCFpO2JyZWFrO2Nhc2UiRXNjYXBlIjpyPSExO2JyZWFrO2Nhc2UiRjIiOnI9IXRoaXMuaW50ZXJhY3Rpbmd9Y29uc3R7Y2VsbDpvfT10aGlzLl9nZXRHcmlkRXZlbnRMb2NhdGlvbih0KTtpZih0aGlzLmludGVyYWN0aW5nIT09ciYmbnVsbCE9PW8paWYocil7Y29uc3QgZT1vLl9jb250ZW50LnF1ZXJ5U2VsZWN0b3IoIltmb2N1cy10YXJnZXRdIil8fG8uX2NvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQ7ZSYmKHQucHJldmVudERlZmF1bHQoKSxlLmZvY3VzKCksdGhpcy5fc2V0SW50ZXJhY3RpbmcoITApLHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgibmF2aWdhdGluZyIsITEsdGhpcykpfWVsc2UgdC5wcmV2ZW50RGVmYXVsdCgpLHRoaXMuX2ZvY3VzZWRDb2x1bW5PcmRlcj12b2lkIDAsby5mb2N1cygpLHRoaXMuX3NldEludGVyYWN0aW5nKCExKSx0aGlzLl90b2dnbGVBdHRyaWJ1dGUoIm5hdmlnYXRpbmciLCEwLHRoaXMpfV9wcmVkaWN0Rm9jdXNTdGVwVGFyZ2V0KHQsZSl7Y29uc3Qgbj1bdGhpcy4kLnRhYmxlLHRoaXMuX2hlYWRlckZvY3VzYWJsZSx0aGlzLl9pdGVtc0ZvY3VzYWJsZSx0aGlzLl9mb290ZXJGb2N1c2FibGUsdGhpcy4kLmZvY3VzZXhpdF07bGV0IGk9bi5pbmRleE9mKHQpO2ZvcihpKz1lO2k+PTAmJmk8PW4ubGVuZ3RoLTEmJighbltpXXx8bltpXS5wYXJlbnROb2RlLmhpZGRlbik7KWkrPWU7cmV0dXJuIG5baV19X29uVGFiS2V5RG93bih0KXtjb25zdCBlPXRoaXMuX3ByZWRpY3RGb2N1c1N0ZXBUYXJnZXQodC5jb21wb3NlZFBhdGgoKVswXSx0LnNoaWZ0S2V5Py0xOjEpO2lmKGU9PT10aGlzLiQudGFibGUpdGhpcy4kLnRhYmxlLmZvY3VzKCk7ZWxzZSBpZihlPT09dGhpcy4kLmZvY3VzZXhpdCl0aGlzLiQuZm9jdXNleGl0LmZvY3VzKCk7ZWxzZSBpZihlPT09dGhpcy5faXRlbXNGb2N1c2FibGUpe2xldCBuPWU7Y29uc3QgaT10aGlzLl9pdGVtc0ZvY3VzYWJsZS5wYXJlbnROb2RlO2lmKHRoaXMuX2Vuc3VyZVNjcm9sbGVkVG9JbmRleCh0aGlzLl9mb2N1c2VkSXRlbUluZGV4KSxpLmluZGV4IT09dGhpcy5fZm9jdXNlZEl0ZW1JbmRleCl7Y29uc3QgdD1BcnJheS5mcm9tKGkuY2hpbGRyZW4pLmluZGV4T2YodGhpcy5faXRlbXNGb2N1c2FibGUpLGU9QXJyYXkuZnJvbSh0aGlzLiQuaXRlbXMuY2hpbGRyZW4pLmZpbHRlcigodD0+dC5pbmRleD09PXRoaXMuX2ZvY3VzZWRJdGVtSW5kZXgpKVswXTtlJiYobj1lLmNoaWxkcmVuW3RdKX10LnByZXZlbnREZWZhdWx0KCksbi5mb2N1cygpfWVsc2UgdC5wcmV2ZW50RGVmYXVsdCgpLGUuZm9jdXMoKTt0aGlzLl90b2dnbGVBdHRyaWJ1dGUoIm5hdmlnYXRpbmciLCEwLHRoaXMpfV9vblNwYWNlS2V5RG93bih0KXt0LnByZXZlbnREZWZhdWx0KCk7Y29uc3QgZT10LmNvbXBvc2VkUGF0aCgpWzBdO2UuX2NvbnRlbnQmJmUuX2NvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGR8fHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImNlbGwtYWN0aXZhdGUiLHtkZXRhaWw6e21vZGVsOnRoaXMuX19nZXRSb3dNb2RlbChlLnBhcmVudEVsZW1lbnQpfX0pKX1fb25LZXlVcCh0KXtpZighL14oIHxTcGFjZUJhcikkLy50ZXN0KHQua2V5KSlyZXR1cm47dC5wcmV2ZW50RGVmYXVsdCgpO2NvbnN0IGU9dC5jb21wb3NlZFBhdGgoKVswXTtpZihlLl9jb250ZW50JiZlLl9jb250ZW50LmZpcnN0RWxlbWVudENoaWxkKXtjb25zdCB0PXRoaXMuaGFzQXR0cmlidXRlKCJuYXZpZ2F0aW5nIik7ZS5fY29udGVudC5maXJzdEVsZW1lbnRDaGlsZC5jbGljaygpLHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgibmF2aWdhdGluZyIsdCx0aGlzKX19X29uRm9jdXNJbih0KXt0aGlzLl9pc01vdXNlZG93bnx8dGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJuYXZpZ2F0aW5nIiwhMCx0aGlzKTtjb25zdCBlPXQuY29tcG9zZWRQYXRoKClbMF07ZT09PXRoaXMuJC50YWJsZXx8ZT09PXRoaXMuJC5mb2N1c2V4aXQ/KHRoaXMuX3ByZWRpY3RGb2N1c1N0ZXBUYXJnZXQoZSxlPT09dGhpcy4kLnRhYmxlPzE6LTEpLmZvY3VzKCksdGhpcy5fc2V0SW50ZXJhY3RpbmcoITEpKTp0aGlzLl9kZXRlY3RJbnRlcmFjdGluZyh0KX1fb25Gb2N1c091dCh0KXt0aGlzLl90b2dnbGVBdHRyaWJ1dGUoIm5hdmlnYXRpbmciLCExLHRoaXMpLHRoaXMuX2RldGVjdEludGVyYWN0aW5nKHQpfV9vbkNlbGxGb2N1c0luKHQpe2NvbnN0e3NlY3Rpb246ZSxjZWxsOm59PXRoaXMuX2dldEdyaWRFdmVudExvY2F0aW9uKHQpO3RoaXMuX2RldGVjdEludGVyYWN0aW5nKHQpLGUmJm4mJih0aGlzLl9hY3RpdmVSb3dHcm91cD1lLHRoaXMuJC5oZWFkZXI9PT1lP3RoaXMuX2hlYWRlckZvY3VzYWJsZT1uOnRoaXMuJC5pdGVtcz09PWU/dGhpcy5faXRlbXNGb2N1c2FibGU9bjp0aGlzLiQuZm9vdGVyPT09ZSYmKHRoaXMuX2Zvb3RlckZvY3VzYWJsZT1uKSxuLl9jb250ZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJjZWxsLWZvY3VzaW4iLHtidWJibGVzOiExfSkpLG4uZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImNlbGwtZm9jdXMiLHtidWJibGVzOiEwLGNvbXBvc2VkOiEwfSkpKSx0aGlzLl9kZXRlY3RGb2N1c2VkSXRlbUluZGV4KHQpfV9vbkNlbGxGb2N1c091dCh0KXtpZigzPT09dC5jb21wb3NlZFBhdGgoKS5pbmRleE9mKHRoaXMuJC50YWJsZSkpe3QuY29tcG9zZWRQYXRoKClbMF0uX2NvbnRlbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoImNlbGwtZm9jdXNvdXQiLHtidWJibGVzOiExfSkpfX1fZGV0ZWN0SW50ZXJhY3RpbmcodCl7Y29uc3QgZT10LmNvbXBvc2VkUGF0aCgpLnNvbWUoKHQ9PiJ2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQiPT09dC5sb2NhbE5hbWUpKTt0aGlzLl9zZXRJbnRlcmFjdGluZyhlKX1fZGV0ZWN0Rm9jdXNlZEl0ZW1JbmRleCh0KXtjb25zdHtzZWN0aW9uOmUscm93Om59PXRoaXMuX2dldEdyaWRFdmVudExvY2F0aW9uKHQpO2U9PT10aGlzLiQuaXRlbXMmJih0aGlzLl9mb2N1c2VkSXRlbUluZGV4PW4uaW5kZXgpfV91cGRhdGVHcmlkU2VjdGlvbkZvY3VzVGFyZ2V0KHQpe2lmKCF0KXJldHVybjtjb25zdCBlPXRoaXMuX2dldEdyaWRTZWN0aW9uRnJvbUZvY3VzVGFyZ2V0KHQpO3QudGFiSW5kZXg9dGhpcy5pbnRlcmFjdGluZyYmZT09PXRoaXMuX2FjdGl2ZVJvd0dyb3VwPy0xOjB9X3ByZXZlbnRTY3JvbGxlclJvdGF0aW5nQ2VsbEZvY3VzKHQsZSl7dC5pbmRleD09PXRoaXMuX2ZvY3VzZWRJdGVtSW5kZXgmJnRoaXMuaGFzQXR0cmlidXRlKCJuYXZpZ2F0aW5nIikmJnRoaXMuX2FjdGl2ZVJvd0dyb3VwPT09dGhpcy4kLml0ZW1zJiYodGhpcy5fbmF2aWdhdGluZ0lzSGlkZGVuPSEwLHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgibmF2aWdhdGluZyIsITEsdGhpcykpLGU9PT10aGlzLl9mb2N1c2VkSXRlbUluZGV4JiZ0aGlzLl9uYXZpZ2F0aW5nSXNIaWRkZW4mJih0aGlzLl9uYXZpZ2F0aW5nSXNIaWRkZW49ITEsdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJuYXZpZ2F0aW5nIiwhMCx0aGlzKSl9X2dldENvbHVtbnModCxlKXtsZXQgbj10aGlzLl9jb2x1bW5UcmVlLmxlbmd0aC0xO3JldHVybiB0PT09dGhpcy4kLmhlYWRlcj9uPWU6dD09PXRoaXMuJC5mb290ZXImJihuPXRoaXMuX2NvbHVtblRyZWUubGVuZ3RoLTEtZSksdGhpcy5fY29sdW1uVHJlZVtuXX1fcmVzZXRLZXlib2FyZE5hdmlnYXRpb24oKXtpZih0aGlzLiQuaGVhZGVyLmZpcnN0RWxlbWVudENoaWxkJiYodGhpcy5faGVhZGVyRm9jdXNhYmxlPUFycmF5LmZyb20odGhpcy4kLmhlYWRlci5maXJzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbikuZmlsdGVyKCh0PT4hdC5oaWRkZW4pKVswXSksdGhpcy4kLml0ZW1zLmZpcnN0RWxlbWVudENoaWxkKXtjb25zdCB0PXRoaXMuX2l0ZXJhdGVJdGVtcygoKHQsZSk9PntpZih0aGlzLl9maXJzdFZpc2libGVJbmRleD09PWUpcmV0dXJuIHRoaXMuJC5pdGVtcy5jaGlsZHJlblt0XX0pKTt0JiYodGhpcy5faXRlbXNGb2N1c2FibGU9QXJyYXkuZnJvbSh0LmNoaWxkcmVuKS5maWx0ZXIoKHQ9PiF0LmhpZGRlbikpWzBdKX10aGlzLiQuZm9vdGVyLmZpcnN0RWxlbWVudENoaWxkJiYodGhpcy5fZm9vdGVyRm9jdXNhYmxlPUFycmF5LmZyb20odGhpcy4kLmZvb3Rlci5maXJzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbikuZmlsdGVyKCh0PT4hdC5oaWRkZW4pKVswXSl9X3Njcm9sbEhvcml6b250YWxseVRvQ2VsbCh0KXtpZih0Lmhhc0F0dHJpYnV0ZSgiZnJvemVuIil8fHRoaXMuX2VsZW1lbnRNYXRjaGVzKHQsJ1twYXJ0fj0iZGV0YWlscy1jZWxsIl0nKSlyZXR1cm47Y29uc3QgZT10LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49dC5wYXJlbnROb2RlLGk9QXJyYXkuZnJvbShuLmNoaWxkcmVuKS5pbmRleE9mKHQpLHI9dGhpcy4kLnRhYmxlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2xldCBvPXIubGVmdCxhPXIucmlnaHQ7Zm9yKGxldCB0PWktMTt0Pj0wO3QtLSl7Y29uc3QgZT1uLmNoaWxkcmVuW3RdO2lmKCFlLmhhc0F0dHJpYnV0ZSgiaGlkZGVuIikmJiF0aGlzLl9lbGVtZW50TWF0Y2hlcyhlLCdbcGFydH49ImRldGFpbHMtY2VsbCJdJykmJmUuaGFzQXR0cmlidXRlKCJmcm96ZW4iKSl7bz1lLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0O2JyZWFrfX1mb3IobGV0IHQ9aSsxO3Q8bi5jaGlsZHJlbi5sZW5ndGg7dCsrKXtjb25zdCBlPW4uY2hpbGRyZW5bdF07aWYoIWUuaGFzQXR0cmlidXRlKCJoaWRkZW4iKSYmIXRoaXMuX2VsZW1lbnRNYXRjaGVzKGUsJ1twYXJ0fj0iZGV0YWlscy1jZWxsIl0nKSYmZS5oYXNBdHRyaWJ1dGUoImZyb3plbiIpKXthPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDticmVha319ZS5sZWZ0PG8mJih0aGlzLiQudGFibGUuc2Nyb2xsTGVmdCs9TWF0aC5yb3VuZChlLmxlZnQtbykpLGUucmlnaHQ+YSYmKHRoaXMuJC50YWJsZS5zY3JvbGxMZWZ0Kz1NYXRoLnJvdW5kKGUucmlnaHQtYSkpfV9lbGVtZW50TWF0Y2hlcyh0LGUpe3JldHVybiB0Lm1hdGNoZXM/dC5tYXRjaGVzKGUpOi0xIT09QXJyYXkuZnJvbSh0LnBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbChlKSkuaW5kZXhPZih0KX1fZ2V0R3JpZEV2ZW50TG9jYXRpb24odCl7Y29uc3QgZT10LmNvbXBvc2VkUGF0aCgpLG49ZS5pbmRleE9mKHRoaXMuJC50YWJsZSk7cmV0dXJue3NlY3Rpb246bj49MT9lW24tMV06bnVsbCxyb3c6bj49Mj9lW24tMl06bnVsbCxjZWxsOm4+PTM/ZVtuLTNdOm51bGx9fV9nZXRHcmlkU2VjdGlvbkZyb21Gb2N1c1RhcmdldCh0KXtyZXR1cm4gdD09PXRoaXMuX2hlYWRlckZvY3VzYWJsZT90aGlzLiQuaGVhZGVyOnQ9PT10aGlzLl9pdGVtc0ZvY3VzYWJsZT90aGlzLiQuaXRlbXM6dD09PXRoaXMuX2Zvb3RlckZvY3VzYWJsZT90aGlzLiQuZm9vdGVyOm51bGx9fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqLzsKLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDIxIFZhYWRpbiBMdGQuCiAgICAgKiBUaGlzIHByb2dyYW0gaXMgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBhdmFpbGFibGUgYXQgaHR0cHM6Ly92YWFkaW4uY29tL2xpY2Vuc2UvCiAgICAgKi8KY29uc3QgdTB0PXQ9PmNsYXNzIGV4dGVuZHMoYmkodCkpe3N0YXRpYyBnZXQgcHJvcGVydGllcygpe3JldHVybntjb2x1bW5SZW9yZGVyaW5nQWxsb3dlZDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfb3JkZXJCYXNlU2NvcGU6e3R5cGU6TnVtYmVyLHZhbHVlOjFlN319fXN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCl7cmV0dXJuWyJfdXBkYXRlT3JkZXJzKF9jb2x1bW5UcmVlLCBfY29sdW1uVHJlZS4qKSJdfXJlYWR5KCl7c3VwZXIucmVhZHkoKSxjaSh0aGlzLCJ0cmFjayIsdGhpcy5fb25UcmFja0V2ZW50KSx0aGlzLl9yZW9yZGVyR2hvc3Q9dGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ1twYXJ0PSJyZW9yZGVyLWdob3N0Il0nKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNoc3RhcnQiLHRoaXMuX29uVG91Y2hTdGFydC5iaW5kKHRoaXMpKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoInRvdWNobW92ZSIsdGhpcy5fb25Ub3VjaE1vdmUuYmluZCh0aGlzKSksdGhpcy5hZGRFdmVudExpc3RlbmVyKCJ0b3VjaGVuZCIsdGhpcy5fb25Ub3VjaEVuZC5iaW5kKHRoaXMpKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImNvbnRleHRtZW51Iix0aGlzLl9vbkNvbnRleHRNZW51LmJpbmQodGhpcykpfV9vbkNvbnRleHRNZW51KHQpe3RoaXMuaGFzQXR0cmlidXRlKCJyZW9yZGVyaW5nIikmJnQucHJldmVudERlZmF1bHQoKX1fb25Ub3VjaFN0YXJ0KHQpe3RoaXMuX3N0YXJ0VG91Y2hSZW9yZGVyVGltZW91dD1zZXRUaW1lb3V0KCgoKT0+e3RoaXMuX29uVHJhY2tTdGFydCh7ZGV0YWlsOnt4OnQudG91Y2hlc1swXS5jbGllbnRYLHk6dC50b3VjaGVzWzBdLmNsaWVudFl9fSl9KSwxMDApfV9vblRvdWNoTW92ZSh0KXt0aGlzLl9kcmFnZ2VkQ29sdW1uJiZ0LnByZXZlbnREZWZhdWx0KCksY2xlYXJUaW1lb3V0KHRoaXMuX3N0YXJ0VG91Y2hSZW9yZGVyVGltZW91dCl9X29uVG91Y2hFbmQoKXtjbGVhclRpbWVvdXQodGhpcy5fc3RhcnRUb3VjaFJlb3JkZXJUaW1lb3V0KSx0aGlzLl9vblRyYWNrRW5kKCl9X29uVHJhY2tFdmVudCh0KXtpZigic3RhcnQiPT09dC5kZXRhaWwuc3RhdGUpe2NvbnN0IGU9dC5jb21wb3NlZFBhdGgoKSxuPWVbZS5pbmRleE9mKHRoaXMuJC5oZWFkZXIpLTJdO2lmKCFufHwhbi5fY29udGVudClyZXR1cm47aWYobi5fY29udGVudC5jb250YWlucyh0aGlzLmdldFJvb3ROb2RlKCkuYWN0aXZlRWxlbWVudCkpcmV0dXJuO2lmKHRoaXMuJC5zY3JvbGxlci5oYXNBdHRyaWJ1dGUoImNvbHVtbi1yZXNpemluZyIpKXJldHVybjt0aGlzLl90b3VjaERldmljZXx8dGhpcy5fb25UcmFja1N0YXJ0KHQpfWVsc2UidHJhY2siPT09dC5kZXRhaWwuc3RhdGU/dGhpcy5fb25UcmFjayh0KToiZW5kIj09PXQuZGV0YWlsLnN0YXRlJiZ0aGlzLl9vblRyYWNrRW5kKHQpfV9vblRyYWNrU3RhcnQodCl7aWYoIXRoaXMuY29sdW1uUmVvcmRlcmluZ0FsbG93ZWQpcmV0dXJuO2NvbnN0IGU9dC5jb21wb3NlZFBhdGgmJnQuY29tcG9zZWRQYXRoKCk7aWYoZSYmZS5maWx0ZXIoKHQ9PnQuaGFzQXR0cmlidXRlJiZ0Lmhhc0F0dHJpYnV0ZSgiZHJhZ2dhYmxlIikpKVswXSlyZXR1cm47Y29uc3Qgbj10aGlzLl9jZWxsRnJvbVBvaW50KHQuZGV0YWlsLngsdC5kZXRhaWwueSk7aWYobiYmLTEhPT1uLmdldEF0dHJpYnV0ZSgicGFydCIpLmluZGV4T2YoImhlYWRlci1jZWxsIikpe2Zvcih0aGlzLl90b2dnbGVBdHRyaWJ1dGUoInJlb3JkZXJpbmciLCEwLHRoaXMpLHRoaXMuX2RyYWdnZWRDb2x1bW49bi5fY29sdW1uOzE9PT10aGlzLl9kcmFnZ2VkQ29sdW1uLnBhcmVudEVsZW1lbnQuY2hpbGRFbGVtZW50Q291bnQ7KXRoaXMuX2RyYWdnZWRDb2x1bW49dGhpcy5fZHJhZ2dlZENvbHVtbi5wYXJlbnRFbGVtZW50O3RoaXMuX3NldFNpYmxpbmdzUmVvcmRlclN0YXR1cyh0aGlzLl9kcmFnZ2VkQ29sdW1uLCJhbGxvd2VkIiksdGhpcy5fZHJhZ2dlZENvbHVtbi5fcmVvcmRlclN0YXR1cz0iZHJhZ2dpbmciLHRoaXMuX3VwZGF0ZUdob3N0KG4pLHRoaXMuX3Jlb3JkZXJHaG9zdC5zdHlsZS52aXNpYmlsaXR5PSJ2aXNpYmxlIix0aGlzLl91cGRhdGVHaG9zdFBvc2l0aW9uKHQuZGV0YWlsLngsdGhpcy5fdG91Y2hEZXZpY2U/dC5kZXRhaWwueS01MDp0LmRldGFpbC55KSx0aGlzLl9hdXRvU2Nyb2xsZXIoKX19X29uVHJhY2sodCl7aWYoIXRoaXMuX2RyYWdnZWRDb2x1bW4pcmV0dXJuO2NvbnN0IGU9dGhpcy5fY2VsbEZyb21Qb2ludCh0LmRldGFpbC54LHQuZGV0YWlsLnkpO2lmKCFlKXJldHVybjtjb25zdCBuPXRoaXMuX2dldFRhcmdldENvbHVtbihlLHRoaXMuX2RyYWdnZWRDb2x1bW4pO3RoaXMuX2lzU3dhcEFsbG93ZWQodGhpcy5fZHJhZ2dlZENvbHVtbixuKSYmdGhpcy5faXNTd2FwcGFibGVCeVBvc2l0aW9uKG4sdC5kZXRhaWwueCkmJnRoaXMuX3N3YXBDb2x1bW5PcmRlcnModGhpcy5fZHJhZ2dlZENvbHVtbixuKSx0aGlzLl91cGRhdGVHaG9zdFBvc2l0aW9uKHQuZGV0YWlsLngsdGhpcy5fdG91Y2hEZXZpY2U/dC5kZXRhaWwueS01MDp0LmRldGFpbC55KSx0aGlzLl9sYXN0RHJhZ0NsaWVudFg9dC5kZXRhaWwueH1fb25UcmFja0VuZCgpe3RoaXMuX2RyYWdnZWRDb2x1bW4mJih0aGlzLl90b2dnbGVBdHRyaWJ1dGUoInJlb3JkZXJpbmciLCExLHRoaXMpLHRoaXMuX2RyYWdnZWRDb2x1bW4uX3Jlb3JkZXJTdGF0dXM9IiIsdGhpcy5fc2V0U2libGluZ3NSZW9yZGVyU3RhdHVzKHRoaXMuX2RyYWdnZWRDb2x1bW4sIiIpLHRoaXMuX2RyYWdnZWRDb2x1bW49bnVsbCx0aGlzLl9sYXN0RHJhZ0NsaWVudFg9bnVsbCx0aGlzLl9yZW9yZGVyR2hvc3Quc3R5bGUudmlzaWJpbGl0eT0iaGlkZGVuIix0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCJjb2x1bW4tcmVvcmRlciIse2RldGFpbDp7Y29sdW1uczp0aGlzLl9nZXRDb2x1bW5zSW5PcmRlcigpfX0pKSl9X2dldENvbHVtbnNJbk9yZGVyKCl7cmV0dXJuIHRoaXMuX2NvbHVtblRyZWUuc2xpY2UoMCkucG9wKCkuZmlsdGVyKCh0PT4hdC5oaWRkZW4pKS5zb3J0KCgodCxlKT0+dC5fb3JkZXItZS5fb3JkZXIpKX1fY2VsbEZyb21Qb2ludCh0LGUpe3Q9dHx8MCxlPWV8fDAsdGhpcy5fZHJhZ2dlZENvbHVtbnx8dGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJuby1jb250ZW50LXBvaW50ZXItZXZlbnRzIiwhMCx0aGlzLiQuc2Nyb2xsZXIpO2NvbnN0IG49dGhpcy5zaGFkb3dSb290LmVsZW1lbnRGcm9tUG9pbnQodCxlKTtpZih0aGlzLl90b2dnbGVBdHRyaWJ1dGUoIm5vLWNvbnRlbnQtcG9pbnRlci1ldmVudHMiLCExLHRoaXMuJC5zY3JvbGxlciksbiYmbi5fY29sdW1uKXJldHVybiBufV91cGRhdGVHaG9zdFBvc2l0aW9uKHQsZSl7Y29uc3Qgbj10aGlzLl9yZW9yZGVyR2hvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksaT10LW4ud2lkdGgvMixyPWUtbi5oZWlnaHQvMixvPXBhcnNlSW50KHRoaXMuX3Jlb3JkZXJHaG9zdC5fbGVmdHx8MCksYT1wYXJzZUludCh0aGlzLl9yZW9yZGVyR2hvc3QuX3RvcHx8MCk7dGhpcy5fcmVvcmRlckdob3N0Ll9sZWZ0PW8tKG4ubGVmdC1pKSx0aGlzLl9yZW9yZGVyR2hvc3QuX3RvcD1hLShuLnRvcC1yKSx0aGlzLl9yZW9yZGVyR2hvc3Quc3R5bGUudHJhbnNmb3JtPWB0cmFuc2xhdGUoJHt0aGlzLl9yZW9yZGVyR2hvc3QuX2xlZnR9cHgsICR7dGhpcy5fcmVvcmRlckdob3N0Ll90b3B9cHgpYH1fdXBkYXRlR2hvc3QodCl7Y29uc3QgZT10aGlzLl9yZW9yZGVyR2hvc3Q7ZS50ZXh0Q29udGVudD10Ll9jb250ZW50LmlubmVyVGV4dDtjb25zdCBuPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHQpO3JldHVyblsiYm94U2l6aW5nIiwiZGlzcGxheSIsIndpZHRoIiwiaGVpZ2h0IiwiYmFja2dyb3VuZCIsImFsaWduSXRlbXMiLCJwYWRkaW5nIiwiYm9yZGVyIiwiZmxleC1kaXJlY3Rpb24iLCJvdmVyZmxvdyJdLmZvckVhY2goKHQ9PmUuc3R5bGVbdF09blt0XSkpLGV9X3VwZGF0ZU9yZGVycyh0LGUpe3ZvaWQgMCE9PXQmJnZvaWQgMCE9PWUmJih0WzBdLmZvckVhY2goKHQ9PnQuX29yZGVyPTApKSwoZnVuY3Rpb24gbih0LGUsaSl7bGV0IHI9MTt0LmZvckVhY2goKHQ9PntyJTEwPT0wJiZyKyssdC5fb3JkZXI9aStyKmUscisrfSkpfSkodFswXSx0aGlzLl9vcmRlckJhc2VTY29wZSwwKSl9X3NldFNpYmxpbmdzUmVvcmRlclN0YXR1cyh0LGUpe0FycmF5LmZyb20odC5wYXJlbnROb2RlLmNoaWxkcmVuKS5maWx0ZXIoKGU9Pi9jb2x1bW4vLnRlc3QoZS5sb2NhbE5hbWUpJiZ0aGlzLl9pc1N3YXBBbGxvd2VkKGUsdCkpKS5mb3JFYWNoKCh0PT50Ll9yZW9yZGVyU3RhdHVzPWUpKX1fYXV0b1Njcm9sbGVyKCl7aWYodGhpcy5fbGFzdERyYWdDbGllbnRYKXtjb25zdCB0PXRoaXMuX2xhc3REcmFnQ2xpZW50WC10aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0KzUwLGU9dGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0LXRoaXMuX2xhc3REcmFnQ2xpZW50WCs1MDt0PjA/dGhpcy4kLnRhYmxlLnNjcm9sbExlZnQrPXQvMTA6ZT4wJiYodGhpcy4kLnRhYmxlLnNjcm9sbExlZnQtPWUvMTApLHRoaXMuX3Njcm9sbEhhbmRsZXIoKX10aGlzLl9kcmFnZ2VkQ29sdW1uJiZ0aGlzLmFzeW5jKHRoaXMuX2F1dG9TY3JvbGxlciwxMCl9X2lzU3dhcEFsbG93ZWQodCxlKXtpZih0JiZlKXtjb25zdCBuPXQucGFyZW50RWxlbWVudD09PWUucGFyZW50RWxlbWVudCxpPXQuZnJvemVuPT09ZS5mcm96ZW47cmV0dXJuIHQhPT1lJiZuJiZpfX1faXNTd2FwcGFibGVCeVBvc2l0aW9uKHQsZSl7Y29uc3Qgbj1BcnJheS5mcm9tKHRoaXMuJC5oZWFkZXIucXVlcnlTZWxlY3RvckFsbCgndHI6bm90KFtoaWRkZW5dKSBbcGFydH49ImNlbGwiXScpKS5maWx0ZXIoKGU9PnQuY29udGFpbnMoZS5fY29sdW1uKSkpWzBdLGk9dGhpcy4kLmhlYWRlci5xdWVyeVNlbGVjdG9yKCJ0cjpub3QoW2hpZGRlbl0pIFtyZW9yZGVyLXN0YXR1cz1kcmFnZ2luZ10iKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxyPW4uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJuIHIubGVmdD5pLmxlZnQ/ZT5yLnJpZ2h0LWkud2lkdGg6ZTxyLmxlZnQraS53aWR0aH1fc3dhcENvbHVtbk9yZGVycyh0LGUpe2NvbnN0IG49dC5fb3JkZXI7dC5fb3JkZXI9ZS5fb3JkZXIsZS5fb3JkZXI9bix0aGlzLl91cGRhdGVMYXN0RnJvemVuKCksdGhpcy5fdXBkYXRlRmlyc3RBbmRMYXN0Q29sdW1uKCl9X2dldFRhcmdldENvbHVtbih0LGUpe2lmKHQmJmUpe2xldCBuPXQuX2NvbHVtbjtmb3IoO24ucGFyZW50RWxlbWVudCE9PWUucGFyZW50RWxlbWVudCYmbiE9PXRoaXM7KW49bi5wYXJlbnRFbGVtZW50O3JldHVybiBuLnBhcmVudEVsZW1lbnQ9PT1lLnBhcmVudEVsZW1lbnQ/bjp0Ll9jb2x1bW59fX0KLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IChjKSAyMDIxIFZhYWRpbiBMdGQuCiAgICAgKiBUaGlzIHByb2dyYW0gaXMgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBhdmFpbGFibGUgYXQgaHR0cHM6Ly92YWFkaW4uY29tL2xpY2Vuc2UvCiAgICAgKi8saDB0PXQ9PmNsYXNzIGV4dGVuZHMgdHtzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKXtyZXR1cm57cmVzaXphYmxlOnt0eXBlOkJvb2xlYW4sdmFsdWU6ZnVuY3Rpb24oKXtpZigidmFhZGluLWdyaWQtY29sdW1uLWdyb3VwIj09PXRoaXMubG9jYWxOYW1lKXJldHVybjtjb25zdCB0PXRoaXMucGFyZW50Tm9kZTtyZXR1cm4gdCYmInZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCI9PT10LmxvY2FsTmFtZSYmdC5yZXNpemFibGV8fCExfX0sX2hlYWRlclRlbXBsYXRlOnt0eXBlOk9iamVjdH0sX2Zvb3RlclRlbXBsYXRlOnt0eXBlOk9iamVjdH0sZnJvemVuOnt0eXBlOkJvb2xlYW4sdmFsdWU6ITF9LGhpZGRlbjp7dHlwZTpCb29sZWFufSxoZWFkZXI6e3R5cGU6U3RyaW5nfSx0ZXh0QWxpZ246e3R5cGU6U3RyaW5nfSxfbGFzdEZyb3plbjp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfb3JkZXI6TnVtYmVyLF9yZW9yZGVyU3RhdHVzOkJvb2xlYW4sX2VtcHR5Q2VsbHM6QXJyYXksX2hlYWRlckNlbGw6T2JqZWN0LF9mb290ZXJDZWxsOk9iamVjdCxfZ3JpZDpPYmplY3QsaGVhZGVyUmVuZGVyZXI6RnVuY3Rpb24sZm9vdGVyUmVuZGVyZXI6RnVuY3Rpb259fXN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCl7cmV0dXJuWyJfd2lkdGhDaGFuZ2VkKHdpZHRoLCBfaGVhZGVyQ2VsbCwgX2Zvb3RlckNlbGwsIF9jZWxscy4qKSIsIl9mcm96ZW5DaGFuZ2VkKGZyb3plbiwgX2hlYWRlckNlbGwsIF9mb290ZXJDZWxsLCBfY2VsbHMuKikiLCJfZmxleEdyb3dDaGFuZ2VkKGZsZXhHcm93LCBfaGVhZGVyQ2VsbCwgX2Zvb3RlckNlbGwsIF9jZWxscy4qKSIsIl9wYXRoT3JIZWFkZXJDaGFuZ2VkKHBhdGgsIGhlYWRlciwgX2hlYWRlckNlbGwsIF9mb290ZXJDZWxsLCBfY2VsbHMuKiwgcmVuZGVyZXIsIGhlYWRlclJlbmRlcmVyLCBfYm9keVRlbXBsYXRlLCBfaGVhZGVyVGVtcGxhdGUpIiwiX3RleHRBbGlnbkNoYW5nZWQodGV4dEFsaWduLCBfY2VsbHMuKiwgX2hlYWRlckNlbGwsIF9mb290ZXJDZWxsKSIsIl9vcmRlckNoYW5nZWQoX29yZGVyLCBfaGVhZGVyQ2VsbCwgX2Zvb3RlckNlbGwsIF9jZWxscy4qKSIsIl9sYXN0RnJvemVuQ2hhbmdlZChfbGFzdEZyb3plbikiLCJfc2V0Qm9keVRlbXBsYXRlT3JSZW5kZXJlcihfYm9keVRlbXBsYXRlLCByZW5kZXJlciwgX2NlbGxzLCBfY2VsbHMuKikiLCJfc2V0SGVhZGVyVGVtcGxhdGVPclJlbmRlcmVyKF9oZWFkZXJUZW1wbGF0ZSwgaGVhZGVyUmVuZGVyZXIsIF9oZWFkZXJDZWxsKSIsIl9zZXRGb290ZXJUZW1wbGF0ZU9yUmVuZGVyZXIoX2Zvb3RlclRlbXBsYXRlLCBmb290ZXJSZW5kZXJlciwgX2Zvb3RlckNlbGwpIiwiX3Jlc2l6YWJsZUNoYW5nZWQocmVzaXphYmxlLCBfaGVhZGVyQ2VsbCkiLCJfcmVvcmRlclN0YXR1c0NoYW5nZWQoX3Jlb3JkZXJTdGF0dXMsIF9oZWFkZXJDZWxsLCBfZm9vdGVyQ2VsbCwgX2NlbGxzLiopIiwiX2hpZGRlbkNoYW5nZWQoaGlkZGVuLCBfaGVhZGVyQ2VsbCwgX2Zvb3RlckNlbGwsIF9jZWxscy4qKSJdfWNvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKSx0aGlzLl9ib2R5VGVtcGxhdGUmJih0aGlzLl9ib2R5VGVtcGxhdGUudGVtcGxhdGl6ZXIuX2dyaWQ9dGhpcy5fZ3JpZCksdGhpcy5faGVhZGVyVGVtcGxhdGUmJih0aGlzLl9oZWFkZXJUZW1wbGF0ZS50ZW1wbGF0aXplci5fZ3JpZD10aGlzLl9ncmlkKSx0aGlzLl9mb290ZXJUZW1wbGF0ZSYmKHRoaXMuX2Zvb3RlclRlbXBsYXRlLnRlbXBsYXRpemVyLl9ncmlkPXRoaXMuX2dyaWQpLHRoaXMuX3RlbXBsYXRlT2JzZXJ2ZXIuZmx1c2goKSx0aGlzLl9ib2R5VGVtcGxhdGV8fHRoaXMuX3RlbXBsYXRlT2JzZXJ2ZXIuY2FsbGJhY2soKSxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCgpPT57dGhpcy5fYWxsQ2VsbHMuZm9yRWFjaCgodD0+e3QuX2NvbnRlbnQucGFyZW50Tm9kZXx8dGhpcy5fZ3JpZCYmdGhpcy5fZ3JpZC5hcHBlbmRDaGlsZCh0Ll9jb250ZW50KX0pKX0pKX1kaXNjb25uZWN0ZWRDYWxsYmFjaygpe3N1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+e3RoaXMuX2ZpbmRIb3N0R3JpZCgpfHx0aGlzLl9hbGxDZWxscy5mb3JFYWNoKCh0PT57dC5fY29udGVudC5wYXJlbnROb2RlJiZ0Ll9jb250ZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodC5fY29udGVudCl9KSl9KSksdGhpcy5fZ3JpZFZhbHVlPXZvaWQgMH1fZmluZEhvc3RHcmlkKCl7bGV0IHQ9dGhpcztmb3IoO3QmJiEvXnZhYWRpbi4qZ3JpZCgtcHJvKT8kLy50ZXN0KHQubG9jYWxOYW1lKTspdD10LmFzc2lnbmVkU2xvdD90LmFzc2lnbmVkU2xvdC5wYXJlbnROb2RlOnQucGFyZW50Tm9kZTtyZXR1cm4gdHx8dm9pZCAwfWdldCBfZ3JpZCgpe3JldHVybiB0aGlzLl9ncmlkVmFsdWV8fCh0aGlzLl9ncmlkVmFsdWU9dGhpcy5fZmluZEhvc3RHcmlkKCkpLHRoaXMuX2dyaWRWYWx1ZX1nZXQgX2FsbENlbGxzKCl7cmV0dXJuW10uY29uY2F0KHRoaXMuX2NlbGxzfHxbXSkuY29uY2F0KHRoaXMuX2VtcHR5Q2VsbHN8fFtdKS5jb25jYXQodGhpcy5faGVhZGVyQ2VsbCkuY29uY2F0KHRoaXMuX2Zvb3RlckNlbGwpLmZpbHRlcigodD0+dCkpfWNvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLl90ZW1wbGF0ZU9ic2VydmVyPW5ldyBHaSh0aGlzLCgoKT0+e3RoaXMuX2hlYWRlclRlbXBsYXRlPXRoaXMuX3ByZXBhcmVIZWFkZXJUZW1wbGF0ZSgpLHRoaXMuX2Zvb3RlclRlbXBsYXRlPXRoaXMuX3ByZXBhcmVGb290ZXJUZW1wbGF0ZSgpLHRoaXMuX2JvZHlUZW1wbGF0ZT10aGlzLl9wcmVwYXJlQm9keVRlbXBsYXRlKCl9KSl9X3ByZXBhcmVIZWFkZXJUZW1wbGF0ZSgpe3JldHVybiB0aGlzLl9wcmVwYXJlVGVtcGxhdGl6ZXIodGhpcy5fZmluZFRlbXBsYXRlKCEwKXx8bnVsbCx7fSl9X3ByZXBhcmVGb290ZXJUZW1wbGF0ZSgpe3JldHVybiB0aGlzLl9wcmVwYXJlVGVtcGxhdGl6ZXIodGhpcy5fZmluZFRlbXBsYXRlKCExLCEwKXx8bnVsbCx7fSl9X3ByZXBhcmVCb2R5VGVtcGxhdGUoKXtyZXR1cm4gdGhpcy5fcHJlcGFyZVRlbXBsYXRpemVyKHRoaXMuX2ZpbmRUZW1wbGF0ZSgpfHxudWxsKX1fcHJlcGFyZVRlbXBsYXRpemVyKHQsZSl7aWYodCYmIXQudGVtcGxhdGl6ZXIpe2NvbnN0IG49bmV3IFkxdDtuLl9ncmlkPXRoaXMuX2dyaWQsbi5kYXRhSG9zdD10aGlzLmRhdGFIb3N0LG4uX2luc3RhbmNlUHJvcHM9ZXx8bi5faW5zdGFuY2VQcm9wcyxuLnRlbXBsYXRlPXQsdC50ZW1wbGF0aXplcj1ufXJldHVybiB0fV9yZW5kZXJIZWFkZXJBbmRGb290ZXIoKXt0aGlzLmhlYWRlclJlbmRlcmVyJiZ0aGlzLl9oZWFkZXJDZWxsJiZ0aGlzLl9fcnVuUmVuZGVyZXIodGhpcy5oZWFkZXJSZW5kZXJlcix0aGlzLl9oZWFkZXJDZWxsKSx0aGlzLmZvb3RlclJlbmRlcmVyJiZ0aGlzLl9mb290ZXJDZWxsJiZ0aGlzLl9fcnVuUmVuZGVyZXIodGhpcy5mb290ZXJSZW5kZXJlcix0aGlzLl9mb290ZXJDZWxsKX1fX3J1blJlbmRlcmVyKHQsZSxuKXtjb25zdCBpPVtlLl9jb250ZW50LHRoaXNdO24mJm4uaXRlbSYmaS5wdXNoKG4pLHQuYXBwbHkodGhpcyxpKX1fX3NldENvbHVtblRlbXBsYXRlT3JSZW5kZXJlcih0LGUsbil7aWYoIXRoaXMuaGlkZGVuKXtpZih0JiZlKXRocm93IG5ldyBFcnJvcigiWW91IHNob3VsZCBvbmx5IHVzZSBlaXRoZXIgYSByZW5kZXJlciBvciBhIHRlbXBsYXRlIik7bi5mb3JFYWNoKChuPT57Y29uc3QgaT10aGlzLl9ncmlkLl9fZ2V0Um93TW9kZWwobi5wYXJlbnRFbGVtZW50KTtpZihlKW4uX3JlbmRlcmVyPWUsKGkuaXRlbXx8ZT09PXRoaXMuaGVhZGVyUmVuZGVyZXJ8fGU9PT10aGlzLmZvb3RlclJlbmRlcmVyKSYmdGhpcy5fX3J1blJlbmRlcmVyKGUsbixpKTtlbHNlIGlmKG4uX3RlbXBsYXRlIT09dCl7bi5fdGVtcGxhdGU9dCxuLl9jb250ZW50LmlubmVySFRNTD0iIix0LnRlbXBsYXRpemVyLl9ncmlkPXQudGVtcGxhdGl6ZXIuX2dyaWR8fHRoaXMuX2dyaWQ7Y29uc3QgZT10LnRlbXBsYXRpemVyLmNyZWF0ZUluc3RhbmNlKCk7bi5fY29udGVudC5hcHBlbmRDaGlsZChlLnJvb3QpLG4uX2luc3RhbmNlPWUsaS5pdGVtJiZuLl9pbnN0YW5jZS5zZXRQcm9wZXJ0aWVzKGkpfX0pKX19X3NldEJvZHlUZW1wbGF0ZU9yUmVuZGVyZXIodCxlLG4peyh0fHxlKSYmbiYmdGhpcy5fX3NldENvbHVtblRlbXBsYXRlT3JSZW5kZXJlcih0LGUsbil9X3NldEhlYWRlclRlbXBsYXRlT3JSZW5kZXJlcih0LGUsbil7KHR8fGUpJiZuJiZ0aGlzLl9fc2V0Q29sdW1uVGVtcGxhdGVPclJlbmRlcmVyKHQsZSxbbl0pfV9zZXRGb290ZXJUZW1wbGF0ZU9yUmVuZGVyZXIodCxlLG4peyh0fHxlKSYmbiYmKHRoaXMuX19zZXRDb2x1bW5UZW1wbGF0ZU9yUmVuZGVyZXIodCxlLFtuXSksdGhpcy5fZ3JpZC5fX3VwZGF0ZUhlYWRlckZvb3RlclJvd1Zpc2liaWxpdHkobi5wYXJlbnRFbGVtZW50KSl9X3NlbGVjdEZpcnN0VGVtcGxhdGUodD0hMSxlPSExKXtyZXR1cm4gR2kuZ2V0RmxhdHRlbmVkTm9kZXModGhpcykuZmlsdGVyKChuPT4idGVtcGxhdGUiPT09bi5sb2NhbE5hbWUmJm4uY2xhc3NMaXN0LmNvbnRhaW5zKCJoZWFkZXIiKT09PXQmJm4uY2xhc3NMaXN0LmNvbnRhaW5zKCJmb290ZXIiKT09PWUpKVswXX1fZmluZFRlbXBsYXRlKHQsZSl7Y29uc3Qgbj10aGlzLl9zZWxlY3RGaXJzdFRlbXBsYXRlKHQsZSk7cmV0dXJuIG4mJnRoaXMuZGF0YUhvc3QmJihuLl9yb290RGF0YUhvc3Q9dGhpcy5kYXRhSG9zdC5fcm9vdERhdGFIb3N0fHx0aGlzLmRhdGFIb3N0KSxufV9mbGV4R3Jvd0NoYW5nZWQodCl7dGhpcy5wYXJlbnRFbGVtZW50JiZ0aGlzLnBhcmVudEVsZW1lbnQuX2NvbHVtblByb3BDaGFuZ2VkJiZ0aGlzLnBhcmVudEVsZW1lbnQuX2NvbHVtblByb3BDaGFuZ2VkKCJmbGV4R3JvdyIpLHRoaXMuX2FsbENlbGxzLmZvckVhY2goKGU9PmUuc3R5bGUuZmxleEdyb3c9dCkpfV9vcmRlckNoYW5nZWQodCl7dGhpcy5fYWxsQ2VsbHMuZm9yRWFjaCgoZT0+ZS5zdHlsZS5vcmRlcj10KSl9X3dpZHRoQ2hhbmdlZCh0KXt0aGlzLnBhcmVudEVsZW1lbnQmJnRoaXMucGFyZW50RWxlbWVudC5fY29sdW1uUHJvcENoYW5nZWQmJnRoaXMucGFyZW50RWxlbWVudC5fY29sdW1uUHJvcENoYW5nZWQoIndpZHRoIiksdGhpcy5fYWxsQ2VsbHMuZm9yRWFjaCgoZT0+ZS5zdHlsZS53aWR0aD10KSksdGhpcy5fZ3JpZCYmdGhpcy5fZ3JpZC5fX2ZvcmNlUmVmbG93JiZ0aGlzLl9ncmlkLl9fZm9yY2VSZWZsb3coKX1fZnJvemVuQ2hhbmdlZCh0KXt0aGlzLnBhcmVudEVsZW1lbnQmJnRoaXMucGFyZW50RWxlbWVudC5fY29sdW1uUHJvcENoYW5nZWQmJnRoaXMucGFyZW50RWxlbWVudC5fY29sdW1uUHJvcENoYW5nZWQoImZyb3plbiIsdCksdGhpcy5fYWxsQ2VsbHMuZm9yRWFjaCgoZT0+dGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJmcm96ZW4iLHQsZSkpKSx0aGlzLl9ncmlkJiZ0aGlzLl9ncmlkLl9mcm96ZW5DZWxsc0NoYW5nZWQmJnRoaXMuX2dyaWQuX2Zyb3plbkNlbGxzQ2hhbmdlZCgpfV9sYXN0RnJvemVuQ2hhbmdlZCh0KXt0aGlzLl9hbGxDZWxscy5mb3JFYWNoKChlPT50aGlzLl90b2dnbGVBdHRyaWJ1dGUoImxhc3QtZnJvemVuIix0LGUpKSksdGhpcy5wYXJlbnRFbGVtZW50JiZ0aGlzLnBhcmVudEVsZW1lbnQuX2NvbHVtblByb3BDaGFuZ2VkJiYodGhpcy5wYXJlbnRFbGVtZW50Ll9sYXN0RnJvemVuPXQpfV9wYXRoT3JIZWFkZXJDaGFuZ2VkKHQsZSxuLGkscixvLGEscyxsKXtjb25zdCBjPXZvaWQgMCE9PWU7aWYoIWEmJiFsJiZjJiZuJiZ0aGlzLl9fc2V0VGV4dENvbnRlbnQobi5fY29udGVudCxlKSx0JiZyLnZhbHVlKXtpZighbyYmIXMpe3RoaXMuX19zZXRDb2x1bW5UZW1wbGF0ZU9yUmVuZGVyZXIodm9pZCAwLCgoZSxuLHtpdGVtOml9KT0+dGhpcy5fX3NldFRleHRDb250ZW50KGUsdGhpcy5nZXQodCxpKSkpLHIudmFsdWUpfWF8fGx8fGN8fCFufHxudWxsPT09ZXx8dGhpcy5fX3NldFRleHRDb250ZW50KG4uX2NvbnRlbnQsdGhpcy5fZ2VuZXJhdGVIZWFkZXIodCkpfW4mJnRoaXMuX2dyaWQuX191cGRhdGVIZWFkZXJGb290ZXJSb3dWaXNpYmlsaXR5KG4ucGFyZW50RWxlbWVudCl9X19zZXRUZXh0Q29udGVudCh0LGUpe3QudGV4dENvbnRlbnQhPT1lJiYodC50ZXh0Q29udGVudD1lKX1fZ2VuZXJhdGVIZWFkZXIodCl7cmV0dXJuIHQuc3Vic3RyKHQubGFzdEluZGV4T2YoIi4iKSsxKS5yZXBsYWNlKC8oW0EtWl0pL2csIi0kMSIpLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvLS9nLCIgIikucmVwbGFjZSgvXi4vLCh0PT50LnRvVXBwZXJDYXNlKCkpKX1fdG9nZ2xlQXR0cmlidXRlKHQsZSxuKXtuLmhhc0F0dHJpYnV0ZSh0KT09PSFlJiYoZT9uLnNldEF0dHJpYnV0ZSh0LCIiKTpuLnJlbW92ZUF0dHJpYnV0ZSh0KSl9X3Jlb3JkZXJTdGF0dXNDaGFuZ2VkKHQpe3RoaXMuX2FsbENlbGxzLmZvckVhY2goKGU9PmUuc2V0QXR0cmlidXRlKCJyZW9yZGVyLXN0YXR1cyIsdCkpKX1fcmVzaXphYmxlQ2hhbmdlZCh0LGUpe3ZvaWQgMCE9PXQmJnZvaWQgMCE9PWUmJmUmJltlXS5jb25jYXQodGhpcy5fZW1wdHlDZWxscykuZm9yRWFjaCgoZT0+e2lmKGUpe2NvbnN0IG49ZS5xdWVyeVNlbGVjdG9yKCdbcGFydH49InJlc2l6ZS1oYW5kbGUiXScpO2lmKG4mJmUucmVtb3ZlQ2hpbGQobiksdCl7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTt0LnNldEF0dHJpYnV0ZSgicGFydCIsInJlc2l6ZS1oYW5kbGUiKSxlLmFwcGVuZENoaWxkKHQpfX19KSl9X3RleHRBbGlnbkNoYW5nZWQodCl7aWYodm9pZCAwPT09dClyZXR1cm47aWYoLTE9PT1bInN0YXJ0IiwiZW5kIiwiY2VudGVyIl0uaW5kZXhPZih0KSlyZXR1cm4gdm9pZCBjb25zb2xlLndhcm4oJ3RleHRBbGlnbiBjYW4gb25seSBiZSBzZXQgYXMgInN0YXJ0IiwgImVuZCIgb3IgImNlbnRlciInKTtsZXQgZTsibHRyIj09PWdldENvbXB1dGVkU3R5bGUodGhpcy5fZ3JpZCkuZGlyZWN0aW9uPyJzdGFydCI9PT10P2U9ImxlZnQiOiJlbmQiPT09dCYmKGU9InJpZ2h0Iik6InN0YXJ0Ij09PXQ/ZT0icmlnaHQiOiJlbmQiPT09dCYmKGU9ImxlZnQiKSx0aGlzLl9hbGxDZWxscy5mb3JFYWNoKChuPT57bi5fY29udGVudC5zdHlsZS50ZXh0QWxpZ249dCxnZXRDb21wdXRlZFN0eWxlKG4uX2NvbnRlbnQpLnRleHRBbGlnbiE9PXQmJihuLl9jb250ZW50LnN0eWxlLnRleHRBbGlnbj1lKX0pKX1faGlkZGVuQ2hhbmdlZCh0KXt0aGlzLnBhcmVudEVsZW1lbnQmJnRoaXMucGFyZW50RWxlbWVudC5fY29sdW1uUHJvcENoYW5nZWQmJnRoaXMucGFyZW50RWxlbWVudC5fY29sdW1uUHJvcENoYW5nZWQoImhpZGRlbiIsdCksISF0IT0hIXRoaXMuX3ByZXZpb3VzSGlkZGVuJiZ0aGlzLl9ncmlkJiYoITA9PT10JiZ0aGlzLl9hbGxDZWxscy5mb3JFYWNoKCh0PT57dC5fY29udGVudC5wYXJlbnROb2RlJiZ0Ll9jb250ZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodC5fY29udGVudCl9KSksdGhpcy5fZ3JpZC5fZGVib3VuY2VySGlkZGVuQ2hhbmdlZD1Obi5kZWJvdW5jZSh0aGlzLl9ncmlkLl9kZWJvdW5jZXJIaWRkZW5DaGFuZ2VkLF90LCgoKT0+e3RoaXMuX2dyaWQmJnRoaXMuX2dyaWQuX3JlbmRlckNvbHVtblRyZWUmJnRoaXMuX2dyaWQuX3JlbmRlckNvbHVtblRyZWUodGhpcy5fZ3JpZC5fY29sdW1uVHJlZSl9KSksdGhpcy5fZ3JpZC5fdXBkYXRlTGFzdEZyb3plbiYmdGhpcy5fZ3JpZC5fdXBkYXRlTGFzdEZyb3plbigpLHRoaXMuX2dyaWQubm90aWZ5UmVzaXplJiZ0aGlzLl9ncmlkLm5vdGlmeVJlc2l6ZSgpLHRoaXMuX2dyaWQuX3Jlc2V0S2V5Ym9hcmROYXZpZ2F0aW9uJiZ0aGlzLl9ncmlkLl9yZXNldEtleWJvYXJkTmF2aWdhdGlvbigpKSx0aGlzLl9wcmV2aW91c0hpZGRlbj10fX07Y2xhc3MgZDB0IGV4dGVuZHMoaDB0KEExdCh3ZSkpKXtzdGF0aWMgZ2V0IGlzKCl7cmV0dXJuInZhYWRpbi1ncmlkLWNvbHVtbiJ9c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7cmV0dXJue3dpZHRoOnt0eXBlOlN0cmluZyx2YWx1ZToiMTAwcHgifSxmbGV4R3Jvdzp7dHlwZTpOdW1iZXIsdmFsdWU6MX0scmVuZGVyZXI6RnVuY3Rpb24scGF0aDp7dHlwZTpTdHJpbmd9LGF1dG9XaWR0aDp7dHlwZTpCb29sZWFuLHZhbHVlOiExfSxfYm9keVRlbXBsYXRlOnt0eXBlOk9iamVjdH0sX2NlbGxzOkFycmF5fX19Y3VzdG9tRWxlbWVudHMuZGVmaW5lKGQwdC5pcyxkMHQpLAovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgKGMpIDIwMjEgVmFhZGluIEx0ZC4KICAgICAqIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICAqLwp0MXQoInZhYWRpbi1ncmlkIiwkUXRgCiAgICBAa2V5ZnJhbWVzIHZhYWRpbi1ncmlkLWFwcGVhciB7CiAgICAgIHRvIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CiAgICB9CgogICAgOmhvc3QgewogICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgYW5pbWF0aW9uOiAxbXMgdmFhZGluLWdyaWQtYXBwZWFyOwogICAgICBoZWlnaHQ6IDQwMHB4OwogICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgfQoKICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgIH0KCiAgICAjc2Nyb2xsZXIgewogICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwogICAgICB3aWR0aDogYXV0bzsKICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIHRvcDogMDsKICAgICAgcmlnaHQ6IDA7CiAgICAgIGJvdHRvbTogMDsKICAgICAgbGVmdDogMDsKICAgIH0KCiAgICA6aG9zdChbaGVpZ2h0LWJ5LXJvd3NdKSB7CiAgICAgIGhlaWdodDogYXV0bzsKICAgICAgYWxpZ24tc2VsZjogZmxleC1zdGFydDsKICAgICAgZmxleC1ncm93OiAwOwogICAgICB3aWR0aDogMTAwJTsKICAgIH0KCiAgICA6aG9zdChbaGVpZ2h0LWJ5LXJvd3NdKSAjc2Nyb2xsZXIgewogICAgICB3aWR0aDogMTAwJTsKICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB9CgogICAgI3RhYmxlIHsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIGhlaWdodDogMTAwJTsKICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgLyogV29ya2Fyb3VuZCBmb3IgYSBEZXNrdG9wIFNhZmFyaSBidWc6IG5ldyBzdGFja2luZyBjb250ZXh0IGhlcmUgcHJldmVudHMgdGhlIHNjcm9sbGJhciBmcm9tIGdldHRpbmcgaGlkZGVuICovCiAgICAgIHotaW5kZXg6IDA7CiAgICB9CgogICAgI2hlYWRlciwKICAgICNmb290ZXIgewogICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgcG9zaXRpb246IC13ZWJraXQtc3RpY2t5OwogICAgICBwb3NpdGlvbjogc3RpY2t5OwogICAgICBsZWZ0OiAwOwogICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIHotaW5kZXg6IDE7CiAgICB9CgogICAgI2hlYWRlciB7CiAgICAgIHRvcDogMDsKICAgIH0KCiAgICB0aCB7CiAgICAgIHRleHQtYWxpZ246IGluaGVyaXQ7CiAgICB9CgogICAgLyogU2FmYXJpIGRvZXNuJ3Qgd29yayB3aXRoICJpbmhlcml0IiAqLwogICAgW3NhZmFyaV0gdGggewogICAgICB0ZXh0LWFsaWduOiBpbml0aWFsOwogICAgfQoKICAgICNmb290ZXIgewogICAgICBib3R0b206IDA7CiAgICB9CgogICAgI2l0ZW1zIHsKICAgICAgZmxleC1ncm93OiAxOwogICAgICBmbGV4LXNocmluazogMDsKICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIHBvc2l0aW9uOiAtd2Via2l0LXN0aWNreTsKICAgICAgcG9zaXRpb246IHN0aWNreTsKICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIGxlZnQ6IDA7CiAgICAgIG92ZXJmbG93OiB2aXNpYmxlOwogICAgfQoKICAgIFtwYXJ0fj0ncm93J10gewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB3aWR0aDogMTAwJTsKICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgbWFyZ2luOiAwOwogICAgfQoKICAgIFtwYXJ0fj0ncm93J11bbG9hZGluZ10gW3BhcnR+PSdib2R5LWNlbGwnXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgIG9wYWNpdHk6IDA7CiAgICB9CgogICAgI2l0ZW1zIFtwYXJ0fj0ncm93J10gewogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB9CgogICAgI2l0ZW1zIFtwYXJ0fj0ncm93J106ZW1wdHkgewogICAgICBoZWlnaHQ6IDFlbTsKICAgIH0KCiAgICBbcGFydH49J2NlbGwnXTpub3QoW3BhcnR+PSdkZXRhaWxzLWNlbGwnXSkgewogICAgICBmbGV4LXNocmluazogMDsKICAgICAgZmxleC1ncm93OiAxOwogICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB3aWR0aDogMTAwJTsKICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICBwYWRkaW5nOiAwOwogICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgfQoKICAgIFtwYXJ0fj0nZGV0YWlscy1jZWxsJ10gewogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIGJvdHRvbTogMDsKICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIHBhZGRpbmc6IDA7CiAgICB9CgogICAgW3BhcnR+PSdjZWxsJ10gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgfQoKICAgIFtoaWRkZW5dIHsKICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgfQoKICAgIFtmcm96ZW5dIHsKICAgICAgei1pbmRleDogMjsKICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgIH0KCiAgICBbbm8tc2Nyb2xsYmFyc11bc2FmYXJpXSAjdGFibGUsCiAgICBbbm8tc2Nyb2xsYmFyc11bZmlyZWZveF0gI3RhYmxlIHsKICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIH0KCiAgICAvKiBSZW9yZGVyaW5nIHN0eWxlcyAqLwogICAgOmhvc3QoW3Jlb3JkZXJpbmddKSBbcGFydH49J2NlbGwnXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSwKICAgIDpob3N0KFtyZW9yZGVyaW5nXSkgW3BhcnR+PSdyZXNpemUtaGFuZGxlJ10sCiAgICAjc2Nyb2xsZXJbbm8tY29udGVudC1wb2ludGVyLWV2ZW50c10gW3BhcnR+PSdjZWxsJ10gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIH0KCiAgICBbcGFydH49J3Jlb3JkZXItZ2hvc3QnXSB7CiAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgb3BhY2l0eTogMC41OwoKICAgICAgLyogUHJldmVudCBvdmVyZmxvd2luZyB0aGUgZ3JpZCBpbiBGaXJlZm94ICovCiAgICAgIHRvcDogMDsKICAgICAgbGVmdDogMDsKICAgIH0KCiAgICA6aG9zdChbcmVvcmRlcmluZ10pIHsKICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICB9CgogICAgLyogUmVzaXppbmcgc3R5bGVzICovCiAgICBbcGFydH49J3Jlc2l6ZS1oYW5kbGUnXSB7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgdG9wOiAwOwogICAgICByaWdodDogMDsKICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICBjdXJzb3I6IGNvbC1yZXNpemU7CiAgICAgIHotaW5kZXg6IDE7CiAgICB9CgogICAgW3BhcnR+PSdyZXNpemUtaGFuZGxlJ106OmJlZm9yZSB7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgY29udGVudDogJyc7CiAgICAgIGhlaWdodDogMTAwJTsKICAgICAgd2lkdGg6IDM1cHg7CiAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTsKICAgIH0KCiAgICBbbGFzdC1jb2x1bW5dIFtwYXJ0fj0ncmVzaXplLWhhbmRsZSddOjpiZWZvcmUsCiAgICBbbGFzdC1mcm96ZW5dIFtwYXJ0fj0ncmVzaXplLWhhbmRsZSddOjpiZWZvcmUgewogICAgICB3aWR0aDogMThweDsKICAgICAgdHJhbnNmb3JtOiBub25lOwogICAgICByaWdodDogMDsKICAgIH0KCiAgICAjc2Nyb2xsZXJbY29sdW1uLXJlc2l6aW5nXSB7CiAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICB9CgogICAgLyogU2l6ZXIgc3R5bGVzICovCiAgICAjc2l6ZXIgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgIH0KCiAgICAjc2l6ZXIgW3BhcnR+PSdkZXRhaWxzLWNlbGwnXSB7CiAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgIH0KCiAgICAjc2l6ZXIgW3BhcnR+PSdjZWxsJ11baGlkZGVuXSB7CiAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgIH0KCiAgICAjc2l6ZXIgW3BhcnR+PSdjZWxsJ10gewogICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgIGxpbmUtaGVpZ2h0OiAwOwogICAgICBoZWlnaHQ6IDAgIWltcG9ydGFudDsKICAgICAgbWluLWhlaWdodDogMCAhaW1wb3J0YW50OwogICAgICBtYXgtaGVpZ2h0OiAwICFpbXBvcnRhbnQ7CiAgICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgICAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7CiAgICB9CgogICAgI3NpemVyIFtwYXJ0fj0nY2VsbCddOjpiZWZvcmUgewogICAgICBjb250ZW50OiAnLSc7CiAgICB9CgogICAgI3NpemVyIFtwYXJ0fj0nY2VsbCddIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgfQoKICAgIC8qIFJUTCBzcGVjaWZpYyBzdHlsZXMgKi8KCiAgICA6aG9zdChbZGlyPSdydGwnXSkgI2l0ZW1zLAogICAgOmhvc3QoW2Rpcj0ncnRsJ10pICNoZWFkZXIsCiAgICA6aG9zdChbZGlyPSdydGwnXSkgI2Zvb3RlciB7CiAgICAgIGxlZnQ6IGF1dG87CiAgICB9CgogICAgOmhvc3QoW2Rpcj0ncnRsJ10pIFtwYXJ0fj0ncmVvcmRlci1naG9zdCddIHsKICAgICAgbGVmdDogYXV0bzsKICAgICAgcmlnaHQ6IDA7CiAgICB9CgogICAgOmhvc3QoW2Rpcj0ncnRsJ10pIFtwYXJ0fj0ncmVzaXplLWhhbmRsZSddIHsKICAgICAgbGVmdDogMDsKICAgICAgcmlnaHQ6IGF1dG87CiAgICB9CgogICAgOmhvc3QoW2Rpcj0ncnRsJ10pIFtwYXJ0fj0ncmVzaXplLWhhbmRsZSddOjpiZWZvcmUgewogICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVgoNTAlKTsKICAgIH0KCiAgICA6aG9zdChbZGlyPSdydGwnXSkgW2xhc3QtY29sdW1uXSBbcGFydH49J3Jlc2l6ZS1oYW5kbGUnXTo6YmVmb3JlLAogICAgOmhvc3QoW2Rpcj0ncnRsJ10pIFtsYXN0LWZyb3plbl0gW3BhcnR+PSdyZXNpemUtaGFuZGxlJ106OmJlZm9yZSB7CiAgICAgIGxlZnQ6IDA7CiAgICAgIHJpZ2h0OiBhdXRvOwogICAgfQogIGAse21vZHVsZUlkOiJ2YWFkaW4tZ3JpZC1zdHlsZXMifSk7Ci8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAyMSBWYWFkaW4gTHRkLgogICAgICogVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgICovCmNvbnN0IHAwdD0oKCk9Pnt0cnl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUV2ZW50KCJUb3VjaEV2ZW50IiksITB9Y2F0Y2godCl7cmV0dXJuITF9fSkoKTtjbGFzcyBmMHQgZXh0ZW5kcyhQMXQoZjF0KGoxdChGMXQoRzF0KEIxdChaMXQoSjF0KFExdChYMXQoYzB0KEQxdChxMXQodTB0KFYxdChXMXQobDB0KHQwdCh6MXQpKSkpKSkpKSkpKSkpKSkpKSkpe3N0YXRpYyBnZXQgdGVtcGxhdGUoKXtyZXR1cm4geGVgCiAgICAgIDxkaXYKICAgICAgICBpZD0ic2Nyb2xsZXIiCiAgICAgICAgc2FmYXJpJD0iW1tfc2FmYXJpXV0iCiAgICAgICAgaW9zJD0iW1tfaW9zXV0iCiAgICAgICAgbG9hZGluZyQ9IltbbG9hZGluZ11dIgogICAgICAgIGNvbHVtbi1yZW9yZGVyaW5nLWFsbG93ZWQkPSJbW2NvbHVtblJlb3JkZXJpbmdBbGxvd2VkXV0iCiAgICAgID4KICAgICAgICA8dGFibGUgaWQ9InRhYmxlIiByb2xlPSJncmlkIiBhcmlhLW11bHRpc2VsZWN0YWJsZT0idHJ1ZSIgdGFiaW5kZXg9IjAiPgogICAgICAgICAgPGNhcHRpb24gaWQ9InNpemVyIiBwYXJ0PSJyb3ciPjwvY2FwdGlvbj4KICAgICAgICAgIDx0aGVhZCBpZD0iaGVhZGVyIiByb2xlPSJyb3dncm91cCI+PC90aGVhZD4KICAgICAgICAgIDx0Ym9keSBpZD0iaXRlbXMiIHJvbGU9InJvd2dyb3VwIj48L3Rib2R5PgogICAgICAgICAgPHRmb290IGlkPSJmb290ZXIiIHJvbGU9InJvd2dyb3VwIj48L3Rmb290PgogICAgICAgIDwvdGFibGU+CgogICAgICAgIDxkaXYgcGFydD0icmVvcmRlci1naG9zdCI+PC9kaXY+CiAgICAgIDwvZGl2PgoKICAgICAgPGRpdiBpZD0iZm9jdXNleGl0IiB0YWJpbmRleD0iMCI+PC9kaXY+CiAgICBgfXN0YXRpYyBnZXQgaXMoKXtyZXR1cm4idmFhZGluLWdyaWQifXN0YXRpYyBnZXQgdmVyc2lvbigpe3JldHVybiIyMC4wLjIifXN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCl7cmV0dXJuWyJfY29sdW1uVHJlZUNoYW5nZWQoX2NvbHVtblRyZWUsIF9jb2x1bW5UcmVlLiopIl19c3RhdGljIGdldCBwcm9wZXJ0aWVzKCl7cmV0dXJue19zYWZhcmk6e3R5cGU6Qm9vbGVhbix2YWx1ZTovXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfSxfaW9zOnt0eXBlOkJvb2xlYW4sdmFsdWU6L2lQYWR8aVBob25lfGlQb2QvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkmJiF3aW5kb3cuTVNTdHJlYW18fCJNYWNJbnRlbCI9PT1uYXZpZ2F0b3IucGxhdGZvcm0mJm5hdmlnYXRvci5tYXhUb3VjaFBvaW50cz4xfSxfZmlyZWZveDp7dHlwZTpCb29sZWFuLHZhbHVlOm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJmaXJlZm94Iik+LTF9LF9hbmRyb2lkOnt0eXBlOkJvb2xlYW4sdmFsdWU6L2FuZHJvaWQvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpfSxfdG91Y2hEZXZpY2U6e3R5cGU6Qm9vbGVhbix2YWx1ZTpwMHR9LGhlaWdodEJ5Um93czp7dHlwZTpCb29sZWFuLHZhbHVlOiExLHJlZmxlY3RUb0F0dHJpYnV0ZTohMCxvYnNlcnZlcjoiX2hlaWdodEJ5Um93c0NoYW5nZWQifSxfcmVjYWxjdWxhdGVDb2x1bW5XaWR0aE9uY2VMb2FkaW5nRmluaXNoZWQ6e3R5cGU6Qm9vbGVhbix2YWx1ZTohMH19fWNvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmFkZEV2ZW50TGlzdGVuZXIoImFuaW1hdGlvbmVuZCIsdGhpcy5fb25BbmltYXRpb25FbmQpfWNvbm5lY3RlZENhbGxiYWNrKCl7c3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKSx0aGlzLnJlY2FsY3VsYXRlQ29sdW1uV2lkdGhzKCl9YXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKHQsZSxuKXtzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sodCxlLG4pLCJkaXIiPT09dCYmKHRoaXMuX19pc1JUTD0icnRsIj09PW4sdGhpcy5fdXBkYXRlU2Nyb2xsZXJNZWFzdXJlbWVudHMoKSl9X19oYXNSb3dzV2l0aENsaWVudEhlaWdodCgpe3JldHVybiEhQXJyYXkuZnJvbSh0aGlzLiQuaXRlbXMuY2hpbGRyZW4pLmZpbHRlcigodD0+dC5jbGllbnRIZWlnaHQpKS5sZW5ndGh9X19pdGVtc1JlY2VpdmVkKCl7dGhpcy5fcmVjYWxjdWxhdGVDb2x1bW5XaWR0aE9uY2VMb2FkaW5nRmluaXNoZWQmJiF0aGlzLl9jYWNoZS5pc0xvYWRpbmcoKSYmdGhpcy5fX2hhc1Jvd3NXaXRoQ2xpZW50SGVpZ2h0KCkmJih0aGlzLl9yZWNhbGN1bGF0ZUNvbHVtbldpZHRoT25jZUxvYWRpbmdGaW5pc2hlZD0hMSx0aGlzLnJlY2FsY3VsYXRlQ29sdW1uV2lkdGhzKCkpfV9yZWNhbGN1bGF0ZUNvbHVtbldpZHRocyh0KXt0LmZvckVhY2goKHQ9Pnt0LndpZHRoPSJhdXRvIix0Ll9vcmlnRmxleEdyb3c9dC5mbGV4R3Jvdyx0LmZsZXhHcm93PTB9KSksdC5mb3JFYWNoKCh0PT57dC5fY3VycmVudFdpZHRoPTAsdC5fYWxsQ2VsbHMuZm9yRWFjaCgoZT0+e3QuX2N1cnJlbnRXaWR0aD1NYXRoLm1heCh0Ll9jdXJyZW50V2lkdGgsZS5vZmZzZXRXaWR0aCsxKX0pKX0pKSx0LmZvckVhY2goKHQ9Pnt0LndpZHRoPWAke3QuX2N1cnJlbnRXaWR0aH1weGAsdC5mbGV4R3Jvdz10Ll9vcmlnRmxleEdyb3csdC5fY3VycmVudFdpZHRoPXZvaWQgMCx0Ll9vcmlnRmxleEdyb3c9dm9pZCAwfSkpfXJlY2FsY3VsYXRlQ29sdW1uV2lkdGhzKCl7aWYodGhpcy5fY29sdW1uVHJlZSlpZih0aGlzLl9jYWNoZS5pc0xvYWRpbmcoKSl0aGlzLl9yZWNhbGN1bGF0ZUNvbHVtbldpZHRoT25jZUxvYWRpbmdGaW5pc2hlZD0hMDtlbHNle2NvbnN0IHQ9dGhpcy5fZ2V0Q29sdW1ucygpLmZpbHRlcigodD0+IXQuaGlkZGVuJiZ0LmF1dG9XaWR0aCkpO3RoaXMuX3JlY2FsY3VsYXRlQ29sdW1uV2lkdGhzKHQpfX1fY3JlYXRlU2Nyb2xsZXJSb3dzKHQpe2NvbnN0IGU9W107Zm9yKGxldCBuPTA7bjx0O24rKyl7Y29uc3QgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpO3Quc2V0QXR0cmlidXRlKCJwYXJ0Iiwicm93IiksdC5zZXRBdHRyaWJ1dGUoInJvbGUiLCJyb3ciKSx0aGlzLl9jb2x1bW5UcmVlJiZ0aGlzLl91cGRhdGVSb3codCx0aGlzLl9jb2x1bW5UcmVlW3RoaXMuX2NvbHVtblRyZWUubGVuZ3RoLTFdLCJib2R5IiwhMSwhMCksZS5wdXNoKHQpfXJldHVybiB0aGlzLl9jb2x1bW5UcmVlJiZ0aGlzLl9jb2x1bW5UcmVlW3RoaXMuX2NvbHVtblRyZWUubGVuZ3RoLTFdLmZvckVhY2goKHQ9PnQuaXNDb25uZWN0ZWQmJnQubm90aWZ5UGF0aCYmdC5ub3RpZnlQYXRoKCJfY2VsbHMuKiIsdC5fY2VsbHMpKSksKGZ1bmN0aW9uIG4odCxlLGkpe05pfHxPaSgpLElpLnB1c2goW3QsZSxpXSl9KSh0aGlzLCgoKT0+e3RoaXMuX3VwZGF0ZUZpcnN0QW5kTGFzdENvbHVtbigpLHRoaXMuX3Jlc2V0S2V5Ym9hcmROYXZpZ2F0aW9uKCl9KSksZX1fZ2V0Um93VGFyZ2V0KCl7cmV0dXJuIHRoaXMuJC5pdGVtc31fY3JlYXRlQ2VsbCh0KXtjb25zdCBlPSJ2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQtIisodGhpcy5fY29udGVudEluZGV4PXRoaXMuX2NvbnRlbnRJbmRleCsxfHwwKSxuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInZhYWRpbi1ncmlkLWNlbGwtY29udGVudCIpO24uc2V0QXR0cmlidXRlKCJzbG90IixlKTtjb25zdCBpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodCk7aS5pZD1lLnJlcGxhY2UoIi1jb250ZW50LSIsIi0iKSxpLnNldEF0dHJpYnV0ZSgidGFiaW5kZXgiLCItMSIpLGkuc2V0QXR0cmlidXRlKCJyb2xlIiwidGQiPT09dD8iZ3JpZGNlbGwiOiJjb2x1bW5oZWFkZXIiKTtjb25zdCByPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNsb3QiKTtyZXR1cm4gci5zZXRBdHRyaWJ1dGUoIm5hbWUiLGUpLGkuYXBwZW5kQ2hpbGQociksaS5fY29udGVudD1uLG4uYWRkRXZlbnRMaXN0ZW5lcigibW91c2Vkb3duIiwoKCk9PntpZih3aW5kb3cuY2hyb21lKXtjb25zdCB0PSgpPT57bi5jb250YWlucyh0aGlzLmdldFJvb3ROb2RlKCkuYWN0aXZlRWxlbWVudCl8fGkuZm9jdXMoKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCJtb3VzZXVwIix0LCEwKX07ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigibW91c2V1cCIsdCwhMCl9ZWxzZSBzZXRUaW1lb3V0KCgoKT0+e24uY29udGFpbnModGhpcy5nZXRSb290Tm9kZSgpLmFjdGl2ZUVsZW1lbnQpfHxpLmZvY3VzKCl9KSl9KSksaX1fdXBkYXRlUm93KHQsZSxuLGkscil7bj1ufHwiYm9keSI7Y29uc3Qgbz1kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7QXJyYXkuZnJvbSh0LmNoaWxkcmVuKS5mb3JFYWNoKCh0PT50Ll92YWNhbnQ9ITApKSx0LmlubmVySFRNTD0iIiwic2l6ZXIiIT09dC5pZCYmKHQuaGlkZGVuPSEwKSxlLmZpbHRlcigodD0+IXQuaGlkZGVuKSkuZm9yRWFjaCgoKGUsYSxzKT0+e2xldCBsO2lmKCJib2R5Ij09PW4pe2lmKGUuX2NlbGxzPWUuX2NlbGxzfHxbXSxsPWUuX2NlbGxzLmZpbHRlcigodD0+dC5fdmFjYW50KSlbMF0sbHx8KGw9dGhpcy5fY3JlYXRlQ2VsbCgidGQiKSxlLl9jZWxscy5wdXNoKGwpKSxsLnNldEF0dHJpYnV0ZSgicGFydCIsImNlbGwgYm9keS1jZWxsIiksdC5hcHBlbmRDaGlsZChsKSxhPT09cy5sZW5ndGgtMSYmKHRoaXMuX3Jvd0RldGFpbHNUZW1wbGF0ZXx8dGhpcy5yb3dEZXRhaWxzUmVuZGVyZXIpKXt0aGlzLl9kZXRhaWxzQ2VsbHM9dGhpcy5fZGV0YWlsc0NlbGxzfHxbXTtjb25zdCBlPXRoaXMuX2RldGFpbHNDZWxscy5maWx0ZXIoKHQ9PnQuX3ZhY2FudCkpWzBdfHx0aGlzLl9jcmVhdGVDZWxsKCJ0ZCIpOy0xPT09dGhpcy5fZGV0YWlsc0NlbGxzLmluZGV4T2YoZSkmJnRoaXMuX2RldGFpbHNDZWxscy5wdXNoKGUpLGUuX2NvbnRlbnQucGFyZW50RWxlbWVudHx8by5hcHBlbmRDaGlsZChlLl9jb250ZW50KSx0aGlzLl9jb25maWd1cmVEZXRhaWxzQ2VsbChlKSx0LmFwcGVuZENoaWxkKGUpLHRoaXMuX2ExMXlTZXRSb3dEZXRhaWxzQ2VsbCh0LGUpLGUuX3ZhY2FudD0hMX1lLm5vdGlmeVBhdGgmJiFyJiZlLm5vdGlmeVBhdGgoIl9jZWxscy4qIixlLl9jZWxscyl9ZWxzZXtjb25zdCByPSJoZWFkZXIiPT09bj8idGgiOiJ0ZCI7aXx8InZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCI9PT1lLmxvY2FsTmFtZT8obD1lW2BfJHtufUNlbGxgXXx8dGhpcy5fY3JlYXRlQ2VsbChyKSxsLl9jb2x1bW49ZSx0LmFwcGVuZENoaWxkKGwpLGVbYF8ke259Q2VsbGBdPWwpOihlLl9lbXB0eUNlbGxzPWUuX2VtcHR5Q2VsbHN8fFtdLGw9ZS5fZW1wdHlDZWxscy5maWx0ZXIoKHQ9PnQuX3ZhY2FudCkpWzBdfHx0aGlzLl9jcmVhdGVDZWxsKHIpLGwuX2NvbHVtbj1lLHQuYXBwZW5kQ2hpbGQobCksLTE9PT1lLl9lbXB0eUNlbGxzLmluZGV4T2YobCkmJmUuX2VtcHR5Q2VsbHMucHVzaChsKSksbC5zZXRBdHRyaWJ1dGUoInBhcnQiLGBjZWxsICR7bn0tY2VsbGApLHRoaXMuX191cGRhdGVIZWFkZXJGb290ZXJSb3dWaXNpYmlsaXR5KHQpfWwuX2NvbnRlbnQucGFyZW50RWxlbWVudHx8by5hcHBlbmRDaGlsZChsLl9jb250ZW50KSxsLl92YWNhbnQ9ITEsbC5fY29sdW1uPWV9KSksdGhpcy5hcHBlbmRDaGlsZChvKSx0aGlzLl9mcm96ZW5DZWxsc0NoYW5nZWQoKSx0aGlzLl91cGRhdGVGaXJzdEFuZExhc3RDb2x1bW5Gb3JSb3codCl9X191cGRhdGVIZWFkZXJGb290ZXJSb3dWaXNpYmlsaXR5KHQpe2lmKCF0KXJldHVybjtjb25zdCBlPUFycmF5LmZyb20odC5jaGlsZHJlbikuZmlsdGVyKChlPT57Y29uc3Qgbj1lLl9jb2x1bW47aWYobi5fZW1wdHlDZWxscyYmbi5fZW1wdHlDZWxscy5pbmRleE9mKGUpPi0xKXJldHVybiExO2lmKHQucGFyZW50RWxlbWVudD09PXRoaXMuJC5oZWFkZXIpe2lmKG4uaGVhZGVyUmVuZGVyZXJ8fG4uX2hlYWRlclRlbXBsYXRlKXJldHVybiEwO2lmKG51bGw9PT1uLmhlYWRlcilyZXR1cm4hMTtpZihuLnBhdGh8fHZvaWQgMCE9PW4uaGVhZGVyKXJldHVybiEwfWVsc2UgaWYobi5mb290ZXJSZW5kZXJlcnx8bi5fZm9vdGVyVGVtcGxhdGUpcmV0dXJuITB9KSk7dC5oaWRkZW4hPT0hZS5sZW5ndGgmJih0LmhpZGRlbj0hZS5sZW5ndGgsdGhpcy5ub3RpZnlSZXNpemUoKSl9X3VwZGF0ZVNjcm9sbGVySXRlbSh0LGUpe3RoaXMuX3ByZXZlbnRTY3JvbGxlclJvdGF0aW5nQ2VsbEZvY3VzKHQsZSksdGhpcy5fY29sdW1uVHJlZSYmKHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgiZmlyc3QiLDA9PT1lLHQpLHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgib2RkIixlJTIsdCksdGhpcy5fYTExeVVwZGF0ZVJvd1Jvd2luZGV4KHQsZSksdGhpcy5fZ2V0SXRlbShlLHQpKX1fY29sdW1uVHJlZUNoYW5nZWQodCl7dGhpcy5fcmVuZGVyQ29sdW1uVHJlZSh0KSx0aGlzLnJlY2FsY3VsYXRlQ29sdW1uV2lkdGhzKCl9X3JlbmRlckNvbHVtblRyZWUodCl7Zm9yKEFycmF5LmZyb20odGhpcy4kLml0ZW1zLmNoaWxkcmVuKS5mb3JFYWNoKChlPT50aGlzLl91cGRhdGVSb3coZSx0W3QubGVuZ3RoLTFdLG51bGwsITEsITApKSk7dGhpcy4kLmhlYWRlci5jaGlsZHJlbi5sZW5ndGg8dC5sZW5ndGg7KXtjb25zdCB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInRyIik7dC5zZXRBdHRyaWJ1dGUoInBhcnQiLCJyb3ciKSx0LnNldEF0dHJpYnV0ZSgicm9sZSIsInJvdyIpLHRoaXMuJC5oZWFkZXIuYXBwZW5kQ2hpbGQodCk7Y29uc3QgZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ0ciIpO2Uuc2V0QXR0cmlidXRlKCJwYXJ0Iiwicm93IiksZS5zZXRBdHRyaWJ1dGUoInJvbGUiLCJyb3ciKSx0aGlzLiQuZm9vdGVyLmFwcGVuZENoaWxkKGUpfWZvcig7dGhpcy4kLmhlYWRlci5jaGlsZHJlbi5sZW5ndGg+dC5sZW5ndGg7KXRoaXMuJC5oZWFkZXIucmVtb3ZlQ2hpbGQodGhpcy4kLmhlYWRlci5maXJzdEVsZW1lbnRDaGlsZCksdGhpcy4kLmZvb3Rlci5yZW1vdmVDaGlsZCh0aGlzLiQuZm9vdGVyLmZpcnN0RWxlbWVudENoaWxkKTtBcnJheS5mcm9tKHRoaXMuJC5oZWFkZXIuY2hpbGRyZW4pLmZvckVhY2goKChlLG4pPT50aGlzLl91cGRhdGVSb3coZSx0W25dLCJoZWFkZXIiLG49PT10Lmxlbmd0aC0xKSkpLEFycmF5LmZyb20odGhpcy4kLmZvb3Rlci5jaGlsZHJlbikuZm9yRWFjaCgoKGUsbik9PnRoaXMuX3VwZGF0ZVJvdyhlLHRbdC5sZW5ndGgtMS1uXSwiZm9vdGVyIiwwPT09bikpKSx0aGlzLl91cGRhdGVSb3codGhpcy4kLnNpemVyLHRbdC5sZW5ndGgtMV0pLHRoaXMuX3Jlc2l6ZUhhbmRsZXIoKSx0aGlzLl9mcm96ZW5DZWxsc0NoYW5nZWQoKSx0aGlzLl91cGRhdGVGaXJzdEFuZExhc3RDb2x1bW4oKSx0aGlzLl9yZXNldEtleWJvYXJkTmF2aWdhdGlvbigpLHRoaXMuX2ExMXlVcGRhdGVIZWFkZXJSb3dzKCksdGhpcy5fYTExeVVwZGF0ZUZvb3RlclJvd3MoKSx0aGlzLl9fdXBkYXRlRm9vdGVyUG9zaXRpb25pbmcoKX1fX3VwZGF0ZUZvb3RlclBvc2l0aW9uaW5nKCl7aWYodGhpcy5fZmlyZWZveCYmKHRoaXMuJC5pdGVtcy5zdHlsZS5wYWRkaW5nQm90dG9tPTAsdGhpcy5oZWlnaHRCeVJvd3N8fCh0aGlzLiQuaXRlbXMuc3R5bGUucGFkZGluZ0JvdHRvbT1gJHt0aGlzLiQuZm9vdGVyLm9mZnNldEhlaWdodH1weGApKSx0aGlzLl9pb3MpeyF3aW5kb3cuQ1NTLnN1cHBvcnRzKCJwb3NpdGlvbiIsInN0aWNreSIpJiYodGhpcy4kLnRhYmxlLnN0eWxlLmhlaWdodD0iIix0aGlzLiQudGFibGUuc3R5bGUubWluSGVpZ2h0PSIxMDAlIix0aGlzLiQudGFibGUuc3R5bGUubWF4SGVpZ2h0PSIxMDAlIixzZXRUaW1lb3V0KCgoKT0+dGhpcy4kLnRhYmxlLnN0eWxlLmhlaWdodD1gJHt0aGlzLiQuc2Nyb2xsZXIub2Zmc2V0SGVpZ2h0fXB4YCkpKX19X3VwZGF0ZUl0ZW0odCxlKXt0Ll9pdGVtPWU7Y29uc3Qgbj10aGlzLl9fZ2V0Um93TW9kZWwodCk7dGhpcy5fdG9nZ2xlQXR0cmlidXRlKCJzZWxlY3RlZCIsbi5zZWxlY3RlZCx0KSx0aGlzLl9hMTF5VXBkYXRlUm93U2VsZWN0ZWQodCxuLnNlbGVjdGVkKSx0aGlzLl9hMTF5VXBkYXRlUm93TGV2ZWwodCxuLmxldmVsKSx0aGlzLl90b2dnbGVBdHRyaWJ1dGUoImV4cGFuZGVkIixuLmV4cGFuZGVkLHQpLHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgiZGV0YWlscy1vcGVuZWQiLHRoaXMuX2lzRGV0YWlsc09wZW5lZChlKSx0KSwodGhpcy5fcm93RGV0YWlsc1RlbXBsYXRlfHx0aGlzLnJvd0RldGFpbHNSZW5kZXJlcikmJnRoaXMuX3RvZ2dsZURldGFpbHNDZWxsKHQsZSksdGhpcy5fZ2VuZXJhdGVDZWxsQ2xhc3NOYW1lcyh0LG4pLHRoaXMuX2ZpbHRlckRyYWdBbmREcm9wKHQsbiksQXJyYXkuZnJvbSh0LmNoaWxkcmVuKS5mb3JFYWNoKCh0PT57aWYodC5fcmVuZGVyZXIpe2NvbnN0IGU9dC5fY29sdW1ufHx0aGlzO3QuX3JlbmRlcmVyLmNhbGwoZSx0Ll9jb250ZW50LGUsbil9ZWxzZSB0Ll9pbnN0YW5jZSYmKHQuX2luc3RhbmNlLl9fZGV0YWlsc09wZW5lZF9fPW4uZGV0YWlsc09wZW5lZCx0Ll9pbnN0YW5jZS5fX3NlbGVjdGVkX189bi5zZWxlY3RlZCx0Ll9pbnN0YW5jZS5fX2xldmVsX189bi5sZXZlbCx0Ll9pbnN0YW5jZS5fX2V4cGFuZGVkX189bi5leHBhbmRlZCx0Ll9pbnN0YW5jZS5zZXRQcm9wZXJ0aWVzKG4pKX0pKSx0aGlzLl9kZWJvdW5jZXJVcGRhdGVIZWlnaHRzPU5uLmRlYm91bmNlKHRoaXMuX2RlYm91bmNlclVwZGF0ZUhlaWdodHMsZ3QuYWZ0ZXIoMSksKCgpPT57dGhpcy5fdXBkYXRlTWV0cmljcygpLHRoaXMuX3Bvc2l0aW9uSXRlbXMoKSx0aGlzLl91cGRhdGVTY3JvbGxlclNpemUoKX0pKX1fcmVzaXplSGFuZGxlcigpe3RoaXMuX3VwZGF0ZURldGFpbHNDZWxsSGVpZ2h0cygpLHRoaXMuX2FjY2Vzc0lyb25MaXN0QVBJKHN1cGVyLl9yZXNpemVIYW5kbGVyLCEwKSx0aGlzLl91cGRhdGVTY3JvbGxlck1lYXN1cmVtZW50cygpLHRoaXMuX191cGRhdGVGb290ZXJQb3NpdGlvbmluZygpfV9vbkFuaW1hdGlvbkVuZCh0KXswPT09dC5hbmltYXRpb25OYW1lLmluZGV4T2YoInZhYWRpbi1ncmlkLWFwcGVhciIpJiYodGhpcy5fcmVuZGVyKCksdC5zdG9wUHJvcGFnYXRpb24oKSx0aGlzLm5vdGlmeVJlc2l6ZSgpLHRoaXMuX19pdGVtc1JlY2VpdmVkKCkscmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgoKT0+e3RoaXMuX19zY3JvbGxUb1BlbmRpbmdJbmRleCgpLHRoaXMuJC50YWJsZS5zdHlsZS53ZWJraXRPdmVyZmxvd1Njcm9sbGluZz0idG91Y2gifSkpKX1fdG9nZ2xlQXR0cmlidXRlKHQsZSxuKXtuLmhhc0F0dHJpYnV0ZSh0KT09PSFlJiYoZT9uLnNldEF0dHJpYnV0ZSh0LCIiKTpuLnJlbW92ZUF0dHJpYnV0ZSh0KSl9X19nZXRSb3dNb2RlbCh0KXtyZXR1cm57aW5kZXg6dC5pbmRleCxpdGVtOnQuX2l0ZW0sbGV2ZWw6dGhpcy5fZ2V0SW5kZXhMZXZlbCh0LmluZGV4KSxleHBhbmRlZDp0aGlzLl9pc0V4cGFuZGVkKHQuX2l0ZW0pLHNlbGVjdGVkOnRoaXMuX2lzU2VsZWN0ZWQodC5faXRlbSksZGV0YWlsc09wZW5lZDohKCF0aGlzLl9yb3dEZXRhaWxzVGVtcGxhdGUmJiF0aGlzLnJvd0RldGFpbHNSZW5kZXJlcikmJnRoaXMuX2lzRGV0YWlsc09wZW5lZCh0Ll9pdGVtKX19cmVuZGVyKCl7dGhpcy5fY29sdW1uVHJlZSYmKHRoaXMuX2NvbHVtblRyZWUuZm9yRWFjaCgodD0+e3QuZm9yRWFjaCgodD0+dC5fcmVuZGVySGVhZGVyQW5kRm9vdGVyKCkpKX0pKSx0aGlzLl91cGRhdGUoKSl9bm90aWZ5UmVzaXplKCl7c3VwZXIubm90aWZ5UmVzaXplKCl9X2hlaWdodEJ5Um93c0NoYW5nZWQodCxlKXsodHx8ZSkmJnRoaXMubm90aWZ5UmVzaXplKCl9X19mb3JjZVJlZmxvdygpe3RoaXMuX2RlYm91bmNlckZvcmNlUmVmbG93PU5uLmRlYm91bmNlKHRoaXMuX2RlYm91bmNlckZvcmNlUmVmbG93LF90LCgoKT0+e3RoaXMuJC5zY3JvbGxlci5zdHlsZS5vdmVyZmxvdz0iaGlkZGVuIixzZXRUaW1lb3V0KCgoKT0+dGhpcy4kLnNjcm9sbGVyLnN0eWxlLm92ZXJmbG93PSIiKSl9KSl9fWZ1bmN0aW9uIG0wdCh0LGUpe3JldHVybihmdW5jdGlvbiBuKHQsZSl7cmV0dXJuIFZyKHt9LGNyKGUpLHQpfSkodCxlKX1jdXN0b21FbGVtZW50cy5kZWZpbmUoZjB0LmlzLGYwdCk7bGV0IGcwdD1jbGFzcyBleHRlbmRzIHdle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9ydW49IiJ9X2NzdlVybCh0LGUsbil7cmV0dXJuIGU/UE8obih0LGUpLHtmb3JtYXQ6ImNzdiJ9KToiIn1fanNvblVybCh0LGUsbil7cmV0dXJuIGU/bih0LGUpOiIifV9jc3ZOYW1lKHQsZSl7cmV0dXJuIGU/YHJ1bi0ke2V9LXRhZy0ke3R9LmNzdmA6IiJ9X2pzb25OYW1lKHQsZSl7cmV0dXJuIGU/YHJ1bi0ke2V9LXRhZy0ke3R9Lmpzb25gOiIifX07ZzB0LnRlbXBsYXRlPXhlYAogICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUKICAgICAgbm8tbGFiZWwtZmxvYXQ9InRydWUiCiAgICAgIGxhYmVsPSJydW4gdG8gZG93bmxvYWQiCiAgICAgIHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X3J1bn19IgogICAgPgogICAgICA8cGFwZXItbGlzdGJveCBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW3J1bnNdXSI+CiAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSI+W1tpdGVtXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19ydW5dXSI+CiAgICAgIDxhIGRvd25sb2FkPSJbW19jc3ZOYW1lKHRhZywgX3J1bildXSIgaHJlZj0iW1tfY3N2VXJsKHRhZywgX3J1biwgdXJsRm4pXV0iCiAgICAgICAgPkNTVjwvYQogICAgICA+PCEtLQogICAgICAtLT48YQogICAgICAgIGRvd25sb2FkPSJbW19qc29uTmFtZSh0YWcsIF9ydW4pXV0iCiAgICAgICAgaHJlZj0iW1tfanNvblVybCh0YWcsIF9ydW4sIHVybEZuKV1dIgogICAgICAgID5KU09OPC9hCiAgICAgID4KICAgIDwvdGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICB9CiAgICAgIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIHdpZHRoOiAxMDBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgfQogICAgICBhIHsKICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgbWFyZ2luOiAwIDAuMmVtOwogICAgICB9CiAgICAgIHBhcGVyLWlucHV0IHsKICAgICAgICBmb250LXNpemU6IDIycHg7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxnMHQucHJvdG90eXBlLCJfcnVuIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxnMHQucHJvdG90eXBlLCJydW5zIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLGcwdC5wcm90b3R5cGUsInRhZyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxnMHQucHJvdG90eXBlLCJ1cmxGbiIsdm9pZCAwKSxnMHQ9dChbaSgidGYtZG93bmxvYWRlciIpXSxnMHQpO25ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCk7bGV0IF8wdD1jbGFzcyBleHRlbmRzIHdle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLmNvbG9yU2NhbGU9bnVsbCx0aGlzLl9sb2FkRGF0YUNhbGxiYWNrPSh0LGUsbik9PntpZihudWxsPT1uKXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIkZhaWxlZCB0byBsb2FkIGRhdGEgZm9yOiIsZSk7Y29uc3QgaT1uLm1hcCgodD0+KHt3YWxsX3RpbWU6bmV3IERhdGUoMWUzKnRbMF0pLHN0ZXA6dFsxXSxzY2FsYXI6dFsyXX0pKSkscj10aGlzLl9nZXRTZXJpZXNOYW1lRnJvbURhdHVtKGUpO3Quc2V0U2VyaWVzTWV0YWRhdGEocixlKSx0LnNldFNlcmllc0RhdGEocixpKX0sdGhpcy5nZXREYXRhTG9hZFVybD0oe3RhZzp0LHJ1bjplfSk9PkVyKCkucGx1Z2luUm91dGUoInNjYWxhcnMiLCIvc2NhbGFycyIsbmV3IFVSTFNlYXJjaFBhcmFtcyh7dGFnOnQscnVuOmV9KSksdGhpcy5fZG93bmxvYWRVcmxGbj0odCxlKT0+dGhpcy5nZXREYXRhTG9hZFVybCh7dGFnOnQscnVuOmV9KSx0aGlzLnJlcXVlc3REYXRhPSh0LGUsbik9PnRoaXMuaW5Db2xhYj90aGlzLl9yZXF1ZXN0RGF0YUdldCh0LGUsbik6dGhpcy5fcmVxdWVzdERhdGFQb3N0KHQsZSxuKSx0aGlzLl9yZXF1ZXN0RGF0YUdldD0odCxlLG4pPT57Y29uc3QgaT1FcigpLnBsdWdpblJvdXRlKCJzY2FsYXJzIiwiL3NjYWxhcnMiKTtQcm9taXNlLmFsbCh0Lm1hcCgodD0+e2NvbnN0IG49UE8oaSx7dGFnOnQudGFnLHJ1bjp0LnJ1bn0pO3JldHVybiB0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QobikudGhlbigobj0+e2Uoe2l0ZW06dCxkYXRhOm59KX0pKX0pKSkuZmluYWxseSgoKCk9PntuKCl9KSl9LHRoaXMuX3JlcXVlc3REYXRhUG9zdD0odCxlLG4pPT57dmFyIGk7Y29uc3Qgcj1FcigpLnBsdWdpblJvdXRlKCJzY2FsYXJzIiwiL3NjYWxhcnNfbXVsdGlydW4iKSxvPW5ldyBNYXA7Zm9yKGNvbnN0e3RhZzplLHJ1bjpufW9mIHQpe2xldCB0PW8uZ2V0KGUpO251bGw9PXQmJm8uc2V0KGUsdD1bXSksdC5wdXNoKG4pfWNvbnN0IGE9bnVsbCE9PShpPXRoaXMuYmF0Y2hTaXplKSYmdm9pZCAwIT09aT9pOjY0LHM9W107Zm9yKGNvbnN0W3QsZV1vZiBvKWZvcihsZXQgbj0wO248ZS5sZW5ndGg7bis9YSlzLnB1c2goe3RhZzp0LHJ1bnM6ZS5zbGljZShuLG4rYSl9KTtQcm9taXNlLmFsbChzLm1hcCgoKHt0YWc6dCxydW5zOm59KT0+dGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHIse3RhZzp0LHJ1bnM6bn0pLnRoZW4oKGk9Pntmb3IoY29uc3QgciBvZiBuKXtjb25zdCBuPXt0YWc6dCxydW46cn07T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGkscik/ZSh7aXRlbTpuLGRhdGE6aVtyXX0pOmUoe2l0ZW06bixkYXRhOm51bGx9KX19KSkpKSkuZmluYWxseSgoKCk9PntuKCl9KSl9LHRoaXMuX2dldERhdGFMb2FkTmFtZT10PT50aGlzLl9nZXRTZXJpZXNOYW1lRnJvbURhdHVtKHQpLHRoaXMuX2V4cGFuZGVkPSExLHRoaXMuX3Rvb2x0aXBDb2x1bW5zPSgoKT0+e2NvbnN0IHQ9cEF0LnNsaWNlKCksZT10LmZpbmRJbmRleCgodD0+Ik5hbWUiPT10LnRpdGxlKSk7cmV0dXJuIHQuc3BsaWNlKGUsMSx7dGl0bGU6Ik5hbWUiLGV2YWx1YXRlOnQ9Pntjb25zdCBlPXQuZGF0YXNldC5tZXRhZGF0YSgpLm1ldGE7cmV0dXJuIHRoaXMuX2dldFNlcmllc0Rpc3BsYXlOYW1lRnJvbURhdHVtKGUpfX0pLHR9KSgpfV9nZXRDaGFydERhdGFMb2FkZXIoKXtyZXR1cm4gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoInRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIiKX1yZWxvYWQoKXt0aGlzLl9nZXRDaGFydERhdGFMb2FkZXIoKS5yZWxvYWQoKX1yZWRyYXcoKXt0aGlzLl9nZXRDaGFydERhdGFMb2FkZXIoKS5yZWRyYXcoKX1fdG9nZ2xlRXhwYW5kZWQodCl7dGhpcy5zZXQoIl9leHBhbmRlZCIsIXRoaXMuX2V4cGFuZGVkKSx0aGlzLnJlZHJhdygpfV90b2dnbGVMb2dTY2FsZSgpe3RoaXMuc2V0KCJfbG9nU2NhbGVBY3RpdmUiLCF0aGlzLl9sb2dTY2FsZUFjdGl2ZSl9X3Jlc2V0RG9tYWluKCl7Y29uc3QgdD10aGlzLl9nZXRDaGFydERhdGFMb2FkZXIoKTt0JiZ0LnJlc2V0RG9tYWluKCl9X3VwZGF0ZURvd25sb2FkTGluaygpe2NvbnN0IHQ9dGhpcy5fZ2V0Q2hhcnREYXRhTG9hZGVyKCkuZXhwb3J0QXNTdmdTdHJpbmcoKTt0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigiI3N2Z0xpbmsiKS5ocmVmPWBkYXRhOmltYWdlL3N2Zyt4bWw7YmFzZTY0LCR7YnRvYSh0KX1gfV9ydW5zRnJvbURhdGEodCl7cmV0dXJuIHQubWFwKCh0PT50LnJ1bikpfV9nZXREYXRhU2VyaWVzKCl7cmV0dXJuIHRoaXMuZGF0YVRvTG9hZC5tYXAoKHQ9PnRoaXMuX2dldFNlcmllc05hbWVGcm9tRGF0dW0odCkpKX1fZ2V0U2VyaWVzTmFtZUZyb21EYXR1bSh7cnVuOnQsZXhwZXJpbWVudDplPXtuYW1lOiJfZGVmYXVsdCJ9fSl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KFtlLm5hbWUsdF0pfV9nZXRTZXJpZXNEaXNwbGF5TmFtZUZyb21EYXR1bSh0KXtyZXR1cm4gdC5ydW59X2dldENvbG9yU2NhbGUoKXtyZXR1cm4gbnVsbCE9PXRoaXMuY29sb3JTY2FsZT90aGlzLmNvbG9yU2NhbGU6e3NjYWxlOnQ9Pntjb25zdFssZV09SlNPTi5wYXJzZSh0KTtyZXR1cm4gX08oZSl9fX19O18wdC50ZW1wbGF0ZT14ZWAKICAgIDx0Zi1jYXJkLWhlYWRpbmcKICAgICAgdGFnPSJbW3RhZ11dIgogICAgICBkaXNwbGF5LW5hbWU9IltbdGFnTWV0YWRhdGEuZGlzcGxheU5hbWVdXSIKICAgICAgZGVzY3JpcHRpb249IltbdGFnTWV0YWRhdGEuZGVzY3JpcHRpb25dXSIKICAgID48L3RmLWNhcmQtaGVhZGluZz4KICAgIDxkaXYgaWQ9InRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXItY29udGFpbmVyIj4KICAgICAgPHRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIKICAgICAgICBhY3RpdmU9IltbYWN0aXZlXV0iCiAgICAgICAgY29sb3Itc2NhbGU9IltbX2dldENvbG9yU2NhbGUoY29sb3JTY2FsZSldXSIKICAgICAgICBkYXRhLXNlcmllcz0iW1tfZ2V0RGF0YVNlcmllcyhkYXRhVG9Mb2FkLiopXV0iCiAgICAgICAgZGF0YS10by1sb2FkPSJbW2RhdGFUb0xvYWRdXSIKICAgICAgICBnZXQtZGF0YS1sb2FkLW5hbWU9IltbX2dldERhdGFMb2FkTmFtZV1dIgogICAgICAgIGdldC1kYXRhLWxvYWQtdXJsPSJbW2dldERhdGFMb2FkVXJsXV0iCiAgICAgICAgcmVxdWVzdC1kYXRhPSJbW3JlcXVlc3REYXRhXV0iCiAgICAgICAgaWdub3JlLXktb3V0bGllcnM9IltbaWdub3JlWU91dGxpZXJzXV0iCiAgICAgICAgbG9hZC1kYXRhLWNhbGxiYWNrPSJbW19sb2FkRGF0YUNhbGxiYWNrXV0iCiAgICAgICAgbG9hZC1rZXk9IltbdGFnXV0iCiAgICAgICAgbG9nLXNjYWxlLWFjdGl2ZT0iW1tfbG9nU2NhbGVBY3RpdmVdXSIKICAgICAgICByZXF1ZXN0LW1hbmFnZXI9IltbcmVxdWVzdE1hbmFnZXJdXSIKICAgICAgICBzbW9vdGhpbmctZW5hYmxlZD0iW1tzbW9vdGhpbmdFbmFibGVkXV0iCiAgICAgICAgc21vb3RoaW5nLXdlaWdodD0iW1tzbW9vdGhpbmdXZWlnaHRdXSIKICAgICAgICB0YWctbWV0YWRhdGE9IltbdGFnTWV0YWRhdGFdXSIKICAgICAgICB0b29sdGlwLWNvbHVtbnM9IltbX3Rvb2x0aXBDb2x1bW5zXV0iCiAgICAgICAgdG9vbHRpcC1wb3NpdGlvbj0iYXV0byIKICAgICAgICB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iCiAgICAgICAgeC10eXBlPSJbW3hUeXBlXV0iCiAgICAgID4KICAgICAgPC90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJidXR0b25zIj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIgogICAgICAgIGljb249ImZ1bGxzY3JlZW4iCiAgICAgICAgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiCiAgICAgID48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICBzZWxlY3RlZCQ9IltbX2xvZ1NjYWxlQWN0aXZlXV0iCiAgICAgICAgaWNvbj0ibGluZS13ZWlnaHQiCiAgICAgICAgb24tdGFwPSJfdG9nZ2xlTG9nU2NhbGUiCiAgICAgICAgdGl0bGU9IlRvZ2dsZSB5LWF4aXMgbG9nIHNjYWxlIgogICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgaWNvbj0ic2V0dGluZ3Mtb3ZlcnNjYW4iCiAgICAgICAgb24tdGFwPSJfcmVzZXREb21haW4iCiAgICAgICAgdGl0bGU9IkZpdCBkb21haW4gdG8gZGF0YSIKICAgICAgPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tzaG93RG93bmxvYWRMaW5rc11dIj4KICAgICAgICA8cGFwZXItbWVudS1idXR0b24gb24tcGFwZXItZHJvcGRvd24tb3Blbj0iX3VwZGF0ZURvd25sb2FkTGluayI+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICAgICAgY2xhc3M9ImRyb3Bkb3duLXRyaWdnZXIiCiAgICAgICAgICAgIHNsb3Q9ImRyb3Bkb3duLXRyaWdnZXIiCiAgICAgICAgICAgIGljb249ImZpbGUtZG93bmxvYWQiCiAgICAgICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci1saXN0Ym94IGNsYXNzPSJkcm9wZG93bi1jb250ZW50IiBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgPGEgaWQ9InN2Z0xpbmsiIGRvd25sb2FkPSJbW3RhZ11dLnN2ZyI+CiAgICAgICAgICAgICAgICBEb3dubG9hZCBDdXJyZW50IENoYXJ0IGFzIFNWRwogICAgICAgICAgICAgIDwvYT4KICAgICAgICAgICAgPC9wYXBlci1pdGVtPgogICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgIDwvcGFwZXItbWVudS1idXR0b24+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDxzcGFuIHN0eWxlPSJmbGV4LWdyb3c6IDEiPjwvc3Bhbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3dEb3dubG9hZExpbmtzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImRvd25sb2FkLWxpbmtzIj4KICAgICAgICAgIDx0Zi1kb3dubG9hZGVyCiAgICAgICAgICAgIHJ1bnM9IltbX3J1bnNGcm9tRGF0YShkYXRhVG9Mb2FkKV1dIgogICAgICAgICAgICB0YWc9IltbdGFnXV0iCiAgICAgICAgICAgIHVybC1mbj0iW1tfZG93bmxvYWRVcmxGbl1dIgogICAgICAgICAgPjwvdGYtZG93bmxvYWRlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgbWFyZ2luOiA1cHg7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDMzMHB4OwogICAgICB9CgogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICA6aG9zdChbX2V4cGFuZGVkXSkgI3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXItY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDQwMHB4OwogICAgICB9CgogICAgICAjdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIgewogICAgICAgIGhlaWdodDogMjAwcHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIHRmLWNhcmQtaGVhZGluZyB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgfQoKICAgICAgI2J1dHRvbnMgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgYSB7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICBtYXJnaW46IDJweDsKICAgICAgfQoKICAgICAgLmRvd25sb2FkLWxpbmtzIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICAgIHdpZHRoOiAxMDBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIH0KICAgICAgfQoKICAgICAgcGFwZXItbWVudS1idXR0b24gewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KICAgICAgcGFwZXItaXRlbSBhIHsKICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLF8wdC5wcm90b3R5cGUsInRhZyIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sXzB0LnByb3RvdHlwZSwiZGF0YVRvTG9hZCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxfMHQucHJvdG90eXBlLCJ4VHlwZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLF8wdC5wcm90b3R5cGUsImFjdGl2ZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLF8wdC5wcm90b3R5cGUsImlnbm9yZVlPdXRsaWVycyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixicildLF8wdC5wcm90b3R5cGUsInJlcXVlc3RNYW5hZ2VyIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sXzB0LnByb3RvdHlwZSwic2hvd0Rvd25MaW5rcyIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLF8wdC5wcm90b3R5cGUsInNtb290aGluZ0VuYWJsZWQiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sXzB0LnByb3RvdHlwZSwic21vb3RoaW5nV2VpZ2h0Iix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLF8wdC5wcm90b3R5cGUsInRhZ01ldGFkYXRhIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLF8wdC5wcm90b3R5cGUsImNvbG9yU2NhbGUiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sXzB0LnByb3RvdHlwZSwidG9vbHRpcFNvcnRpbmdNZXRob2QiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sXzB0LnByb3RvdHlwZSwiYmF0Y2hTaXplIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxfMHQucHJvdG90eXBlLCJpbkNvbGFiIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLF8wdC5wcm90b3R5cGUsIl9sb2FkRGF0YUNhbGxiYWNrIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKV0sXzB0LnByb3RvdHlwZSwiZ2V0RGF0YUxvYWRVcmwiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sXzB0LnByb3RvdHlwZSwiX2Rvd25sb2FkVXJsRm4iLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pXSxfMHQucHJvdG90eXBlLCJyZXF1ZXN0RGF0YSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxfMHQucHJvdG90eXBlLCJfZ2V0RGF0YUxvYWROYW1lIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbixyZWZsZWN0VG9BdHRyaWJ1dGU6ITB9KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLF8wdC5wcm90b3R5cGUsIl9leHBhbmRlZCIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW59KSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbildLF8wdC5wcm90b3R5cGUsIl9sb2dTY2FsZUFjdGl2ZSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sXzB0LnByb3RvdHlwZSwiX3Rvb2x0aXBDb2x1bW5zIix2b2lkIDApLF8wdD10KFtpKCJ0Zi1zY2FsYXItY2FyZCIpXSxfMHQpO2xldCB5MHQ9Y2xhc3MgZXh0ZW5kcyhtMHQoW0FvXSx3ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLnNlc3Npb25Hcm91cD1udWxsLHRoaXMuX3hUeXBlPXdDdC5TVEVQLHRoaXMuX25vTXVsdGlFeHBlcmltZW50cz0hMSx0aGlzLl9yZXF1ZXN0RGF0YT0odCxlLG4pPT57UHJvbWlzZS5hbGwodC5tYXAoKHQ9PnRoaXMuYmFja2VuZC5saXN0TWV0cmljRXZhbHMoe2V4cGVyaW1lbnROYW1lOnRoaXMuZXhwZXJpbWVudE5hbWUsc2Vzc2lvbk5hbWU6dC5ydW4sbWV0cmljTmFtZTp0LnRhZ30pLnRoZW4oKG49PntlKHtpdGVtOnQsZGF0YTpufSl9KSkpKSkuZmluYWxseSgoKCk9PntuKCl9KSl9LHRoaXMuX2NvbG9yU2NhbGU9e3NjYWxlOnQ9Pntjb25zdCBlPUpTT04ucGFyc2UodClbMV0sbj10aGlzLl9pbmRleE9mU2Vzc2lvbi5nZXQoZSk7cmV0dXJuIGZPWyh0aGlzLl9zZXNzaW9uR3JvdXBOYW1lSGFzaCtuKSVmTy5sZW5ndGhdfX19Y29ubmVjdGVkQ2FsbGJhY2soKXtzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpLHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigiaXJvbi1yZXNpemUiLHRoaXMucmVkcmF3LmJpbmQodGhpcykpfXJlZHJhdygpe3RoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCJ0Zi1zY2FsYXItY2FyZCIpLmZvckVhY2goKHQ9PnQucmVkcmF3KCkpKX1fc2Vzc2lvbkdyb3VwQ2hhbmdlZCgpe3RoaXMuc2Vzc2lvbkdyb3VwJiYwIT1PYmplY3Qua2V5cyh0aGlzLnNlc3Npb25Hcm91cCkubGVuZ3RoPyh0aGlzLl9pbmRleE9mU2Vzc2lvbj1uZXcgTWFwKHRoaXMuc2Vzc2lvbkdyb3VwLnNlc3Npb25zLm1hcCgoKHQsZSk9Plt0Lm5hbWUsZV0pKSksdGhpcy5fc2Vzc2lvbkdyb3VwTmFtZUhhc2g9Skp0KHRoaXMuc2Vzc2lvbkdyb3VwLm5hbWUpKToodGhpcy5faW5kZXhPZlNlc3Npb249bmV3IE1hcCx0aGlzLl9zZXNzaW9uR3JvdXBOYW1lSGFzaD0wKSx0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvckFsbCgidGYtc2NhbGFyLWNhcmQiKS5mb3JFYWNoKCh0PT57Y29uc3QgZT10LG49ZS5nZXQoInRhZyIpO2Uuc2V0KCJ0YWciLCIiKSxlLnNldCgidGFnIixuKX0pKX1faGF2ZU1ldHJpY3MoKXtyZXR1cm4gdGhpcy52aXNpYmxlU2NoZW1hJiZBcnJheS5pc0FycmF5KHRoaXMudmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvcykmJnRoaXMudmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvcy5sZW5ndGg+MH1faGF2ZU1ldHJpY3NBbmRTZXNzaW9uR3JvdXAoKXtyZXR1cm4gdGhpcy5zZXNzaW9uR3JvdXAmJnRoaXMuX2hhdmVNZXRyaWNzKCl9X2NvbXB1dGVTZXJpZXNGb3JTZXNzaW9uR3JvdXBNZXRyaWModCxlKXtyZXR1cm4gbnVsbD09PXR8fDA9PU9iamVjdC5rZXlzKHQpLmxlbmd0aHx8bnVsbD09PWU/W106dC5zZXNzaW9ucy5maWx0ZXIoKHQ9PnZvaWQgMCE9PUlKdCh0Lm1ldHJpY1ZhbHVlcyxlLm5hbWUpKSkubWFwKCh0PT4oe3RhZzplLm5hbWUscnVuOnQubmFtZX0pKSl9X2NvbXB1dGVUYWdNZXRhZGF0YSh0KXtyZXR1cm57ZGlzcGxheU5hbWU6Q0p0KHQpLGRlc2NyaXB0aW9uOnQuZGVzY3JpcHRpb258fCIifX19O3kwdC50ZW1wbGF0ZT14ZWAKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shc2Vzc2lvbkdyb3VwXV0iPgogICAgICA8ZGl2PgogICAgICAgIDxoMz5ObyBzZXNzaW9uIGdyb3VwIHNlbGVjdGVkPC9oMz4KICAgICAgICA8cD5QbGVhc2Ugc2VsZWN0IGEgc2Vzc2lvbiBncm91cCB0byBzZWUgaXRzIG1ldHJpYy1ncmFwaHMgaGVyZS48L3A+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2hhdmVNZXRyaWNzKHZpc2libGVTY2hlbWEuKildXSI+CiAgICAgIDxkaXY+CiAgICAgICAgPGgzPk5vIG1ldHJpY3MgYXJlIGVuYWJsZWQ8L2gzPgogICAgICAgIDxwPlBsZWFzZSBlbmFibGUgc29tZSBtZXRyaWNzIHRvIHNlZSBjb250ZW50IGhlcmUuPC9wPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJsYXlvdXQgaG9yaXpvbnRhbCB3cmFwIHNlc3Npb24tZ3JvdXAtZGV0YWlscyI+CiAgICAgIDx0ZW1wbGF0ZQogICAgICAgIGlzPSJkb20taWYiCiAgICAgICAgaWY9IltbX2hhdmVNZXRyaWNzQW5kU2Vzc2lvbkdyb3VwKHZpc2libGVTY2hlbWEuKiwgc2Vzc2lvbkdyb3VwKV1dIgogICAgICA+CiAgICAgICAgPHRlbXBsYXRlCiAgICAgICAgICBpcz0iZG9tLXJlcGVhdCIKICAgICAgICAgIGl0ZW1zPSJbW3Zpc2libGVTY2hlbWEubWV0cmljSW5mb3NdXSIKICAgICAgICAgIGFzPSJtZXRyaWNJbmZvIgogICAgICAgID4KICAgICAgICAgIDwhLS0gTm90ZSB0aGF0IHdlIGRvIG5vdCBwcm92aWRlIGEgcmVxdWVzdC1tYW5hZ2VyIGF0dHJpYnV0ZSBzaW5jZQogICAgICAgICAgICAgICB3ZSBwcm92aWRlIGEgZnVuY3Rpb24gaW4gcmVxdWVzdC1kYXRhIGZvciBjYWxsaW5nIHRoZSBiYWNrZW5kCiAgICAgICAgICAgICAgIHRvIGdldCB0aGUgbWV0cmljcyBkYXRhLgogICAgICAgICAgICAtLT4KICAgICAgICAgIDx0Zi1zY2FsYXItY2FyZAogICAgICAgICAgICBjbGFzcz0ic2NhbGFyLWNhcmQiCiAgICAgICAgICAgIGNvbG9yLXNjYWxlPSJbW19jb2xvclNjYWxlXV0iCiAgICAgICAgICAgIGRhdGEtdG8tbG9hZD0iW1tfY29tcHV0ZVNlcmllc0ZvclNlc3Npb25Hcm91cE1ldHJpYyhzZXNzaW9uR3JvdXAsIG1ldHJpY0luZm8pXV0iCiAgICAgICAgICAgIHRhZz0iW1ttZXRyaWNJbmZvLm5hbWUudGFnXV0iCiAgICAgICAgICAgIHRhZy1tZXRhZGF0YT0iW1tfY29tcHV0ZVRhZ01ldGFkYXRhKG1ldHJpY0luZm8pXV0iCiAgICAgICAgICAgIHgtdHlwZT0iW1tfeFR5cGVdXSIKICAgICAgICAgICAgbXVsdGktZXhwZXJpbWVudHM9IltbX25vTXVsdGlFeHBlcmltZW50c11dIgogICAgICAgICAgICByZXF1ZXN0LWRhdGE9IltbX3JlcXVlc3REYXRhXV0iCiAgICAgICAgICAgIGFjdGl2ZQogICAgICAgICAgPgogICAgICAgICAgPC90Zi1zY2FsYXItY2FyZD4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8IS0tICJpcm9uLWZsZXgiIGlzIG5lZWRlZCB0byB1c2UgdGhlIGxheW91dCBjbGFzc2VzIGluIHRoZSBkaXYgYWJvdmUgLS0+CiAgICA8c3R5bGUgaW5jbHVkZT0iaXJvbi1mbGV4Ij4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0seTB0LnByb3RvdHlwZSwiYmFja2VuZCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSx5MHQucHJvdG90eXBlLCJleHBlcmltZW50TmFtZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSx5MHQucHJvdG90eXBlLCJ2aXNpYmxlU2NoZW1hIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHkwdC5wcm90b3R5cGUsInNlc3Npb25Hcm91cCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSx5MHQucHJvdG90eXBlLCJfeFR5cGUiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSx5MHQucHJvdG90eXBlLCJfbm9NdWx0aUV4cGVyaW1lbnRzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLHkwdC5wcm90b3R5cGUsIl9pbmRleE9mU2Vzc2lvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSx5MHQucHJvdG90eXBlLCJfc2Vzc2lvbkdyb3VwTmFtZUhhc2giLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pXSx5MHQucHJvdG90eXBlLCJfcmVxdWVzdERhdGEiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0seTB0LnByb3RvdHlwZSwiX2NvbG9yU2NhbGUiLHZvaWQgMCksdChbYSgic2Vzc2lvbkdyb3VwLioiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLHkwdC5wcm90b3R5cGUsIl9zZXNzaW9uR3JvdXBDaGFuZ2VkIixudWxsKSx5MHQ9dChbaSgidGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHMiKV0seTB0KTtsZXQgdjB0PWNsYXNzIGV4dGVuZHMoY3IoZ2wod2UpKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX2hwYXJhbU5hbWU9VEp0LHRoaXMuX21ldHJpY05hbWU9Q0p0fV92aXNpYmxlU2NoZW1hT3JTZXNzaW9uR3JvdXBzQ2hhbmdlZCgpe2NvbnN0IHQ9dGhpcy4kLnNlc3Npb25Hcm91cHNUYWJsZS5nZXQoImRldGFpbHNPcGVuZWRJdGVtcyIpO3RoaXMuJC5zZXNzaW9uR3JvdXBzVGFibGUuc2V0KCJkZXRhaWxzT3BlbmVkSXRlbXMiLFtdKSxXaSgpO2NvbnN0IGU9bmV3IE1hcDt0aGlzLnNlc3Npb25Hcm91cHMuZm9yRWFjaCgodD0+e2Uuc2V0KHQubmFtZSx0KX0pKSx0aGlzLiQuc2Vzc2lvbkdyb3Vwc1RhYmxlLnNldCgiZGV0YWlsc09wZW5lZEl0ZW1zIix0Lm1hcCgodD0+ZS5nZXQodC5uYW1lKSkpLmZpbHRlcihCb29sZWFuKSl9X3Nlc3Npb25Hcm91cEhQYXJhbSh0LGUpe3JldHVybiBudWxsIT10JiYwIT1PYmplY3Qua2V5cyh0KS5sZW5ndGgmJk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0LmhwYXJhbXMsZSk/cUp0KHQuaHBhcmFtc1tlXSk6IiJ9X3Nlc3Npb25Hcm91cE1ldHJpYyh0LGUpe2lmKG51bGw9PXR8fDA9PU9iamVjdC5rZXlzKHQpLmxlbmd0aClyZXR1cm4iIjtmb3IobGV0IG49MDtuPHQubWV0cmljVmFsdWVzLmxlbmd0aDsrK24pe2xldCBpPXQubWV0cmljVmFsdWVzW25dO2lmKGkubmFtZS5ncm91cD09PWUuZ3JvdXAmJmkubmFtZS50YWc9PWUudGFnKXJldHVybiBxSnQoaS52YWx1ZSl9cmV0dXJuIiJ9X3Jvd051bWJlcih0KXtyZXR1cm4gdCsxfX07djB0LnRlbXBsYXRlPXhlYAogICAgPHZhYWRpbi1ncmlkCiAgICAgIGNsYXNzPSJzZXNzaW9uLWdyb3VwLXRhYmxlIgogICAgICBpZD0ic2Vzc2lvbkdyb3Vwc1RhYmxlIgogICAgICBjb2x1bW4tcmVvcmRlcmluZy1hbGxvd2VkPSIiCiAgICAgIGl0ZW1zPSJbW3Nlc3Npb25Hcm91cHNdXSIKICAgID4KICAgICAgPHZhYWRpbi1ncmlkLWNvbHVtbiBmbGV4LWdyb3c9IjAiIHdpZHRoPSIxMGVtIiByZXNpemFibGU9IiI+CiAgICAgICAgPHRlbXBsYXRlIGNsYXNzPSJoZWFkZXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtaGVhZGVyIHRhYmxlLWNlbGwiPlRyaWFsIElEPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jZWxsIj5bW2l0ZW0ubmFtZV1dPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC92YWFkaW4tZ3JpZC1jb2x1bW4+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tlbmFibGVTaG93TWV0cmljc11dIj4KICAgICAgICA8dmFhZGluLWdyaWQtY29sdW1uIGZsZXgtZ3Jvdz0iMCIgYXV0b1dpZHRoPSIiIHJlc2l6YWJsZT0iIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBjbGFzcz0iaGVhZGVyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtaGVhZGVyIHRhYmxlLWNlbGwiPlNob3cgTWV0cmljczwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNsYXNzPSJ0YWJsZS1jZWxsIiBjaGVja2VkPSJ7e2RldGFpbHNPcGVuZWR9fSI+CiAgICAgICAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdmFhZGluLWdyaWQtY29sdW1uPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUKICAgICAgICBpcz0iZG9tLXJlcGVhdCIKICAgICAgICBpdGVtcz0iW1t2aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zXV0iCiAgICAgICAgYXM9ImhwYXJhbUluZm8iCiAgICAgICAgaW5kZXgtYXM9ImhwYXJhbUluZGV4IgogICAgICA+CiAgICAgICAgPHZhYWRpbi1ncmlkLWNvbHVtbiBmbGV4LWdyb3c9IjIiIHdpZHRoPSIxMGVtIiByZXNpemFibGU9IiI+CiAgICAgICAgICA8dGVtcGxhdGUgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWhlYWRlciB0YWJsZS1jZWxsIj4KICAgICAgICAgICAgICBbW19ocGFyYW1OYW1lKGhwYXJhbUluZm8pXV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jZWxsIj4KICAgICAgICAgICAgICBbW19zZXNzaW9uR3JvdXBIUGFyYW0oaXRlbSwgaHBhcmFtSW5mby5uYW1lKV1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3ZhYWRpbi1ncmlkLWNvbHVtbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlCiAgICAgICAgaXM9ImRvbS1yZXBlYXQiCiAgICAgICAgaXRlbXM9Int7dmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvc319IgogICAgICAgIGFzPSJtZXRyaWNJbmZvIgogICAgICAgIGluZGV4LWFzPSJtZXRyaWNJbmRleCIKICAgICAgPgogICAgICAgIDx2YWFkaW4tZ3JpZC1jb2x1bW4gZmxleC1ncm93PSIyIiB3aWR0aD0iMTBlbSIgcmVzaXphYmxlPSIiPgogICAgICAgICAgPHRlbXBsYXRlIGNsYXNzPSJoZWFkZXIiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1oZWFkZXIgdGFibGUtY2VsbCI+CiAgICAgICAgICAgICAgW1tfbWV0cmljTmFtZShtZXRyaWNJbmZvKV1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY2VsbCI+CiAgICAgICAgICAgICAgW1tfc2Vzc2lvbkdyb3VwTWV0cmljKGl0ZW0sIG1ldHJpY0luZm8ubmFtZSldXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC92YWFkaW4tZ3JpZC1jb2x1bW4+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBjbGFzcz0icm93LWRldGFpbHMiPgogICAgICAgIDx0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscwogICAgICAgICAgYmFja2VuZD0iW1tiYWNrZW5kXV0iCiAgICAgICAgICBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIKICAgICAgICAgIHNlc3Npb24tZ3JvdXA9IltbaXRlbV1dIgogICAgICAgICAgdmlzaWJsZS1zY2hlbWE9IltbdmlzaWJsZVNjaGVtYV1dIgogICAgICAgICAgY2xhc3M9InNlc3Npb24tZ3JvdXAtZGV0YWlscyIKICAgICAgICA+CiAgICAgICAgPC90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscz4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvdmFhZGluLWdyaWQ+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lOwogICAgICB9CgogICAgICA6aG9zdCguZGFyay1tb2RlKSB7CiAgICAgICAgLS1sdW1vLWJhc2UtY29sb3I6ICMzMDMwMzA7CiAgICAgICAgLS1sdW1vLWJvZHktdGV4dC1jb2xvcjogI2ZmZjsKICAgICAgfQoKICAgICAgOmhvc3QoLmRhcmstbW9kZSkgdmFhZGluLWdyaWQgewogICAgICAgIC0tX2x1bW8tZ3JpZC1zZWNvbmRhcnktYm9yZGVyLWNvbG9yOiAjNTA1MDUwOwogICAgICB9CgogICAgICAudGFibGUtY2VsbCB7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICAgIC50YWJsZS1oZWFkZXIgewogICAgICAgIC8qIGxpbmUtYnJlYWsgb3ZlcmZsb3dpbmcgY29sdW1uIGhlYWRlcnMgKi8KICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICAgIG92ZXJmbG93LXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgIH0KICAgICAgLnNlc3Npb24tZ3JvdXAtdGFibGUgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAuc2Vzc2lvbi1ncm91cC1kZXRhaWxzIHsKICAgICAgICBoZWlnaHQ6IDM2MHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSx2MHQucHJvdG90eXBlLCJ2aXNpYmxlU2NoZW1hIix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSx2MHQucHJvdG90eXBlLCJzZXNzaW9uR3JvdXBzIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sdjB0LnByb3RvdHlwZSwiZW5hYmxlU2hvd01ldHJpY3MiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sdjB0LnByb3RvdHlwZSwiYmFja2VuZCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSx2MHQucHJvdG90eXBlLCJleHBlcmltZW50TmFtZSIsdm9pZCAwKSx0KFthKCJ2aXNpYmxlU2NoZW1hLioiLCJzZXNzaW9uR3JvdXBzLioiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLHYwdC5wcm90b3R5cGUsIl92aXNpYmxlU2NoZW1hT3JTZXNzaW9uR3JvdXBzQ2hhbmdlZCIsbnVsbCksdjB0PXQoW2koInRmLWhwYXJhbXMtdGFibGUtdmlldyIpXSx2MHQpO2xldCBiMHQ9Y2xhc3MgZXh0ZW5kcyB3ZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5zZXNzaW9uR3JvdXA9bnVsbCx0aGlzLnZpc2libGVTY2hlbWE9bnVsbH1fcHJvcGVydGllc0FyZVBvcHVsYXRlZCh0LGUpe3JldHVybiBudWxsIT10JiZudWxsIT1lfV9zaW5nbGV0b25TZXNzaW9uR3JvdXBzKHQpe3JldHVybiBudWxsPT10P1tdOlt0XX19O2Z1bmN0aW9uIHgwdCh0LGUsbixpKXtpZihlLmxlbmd0aDwyKXJldHVybiBjb25zb2xlLmVycm9yKCJMZXNzIHRoYW4gdHdvIGF4ZXMgaW4gcGFyYWxsZWwgY29vcmRpbmF0ZXMgcGxvdC4iKSxudWxsO2NvbnN0IHI9blswXSxvPW5bMV07aWYocjw9ZVswXXx8cj49ZVtlLmxlbmd0aC0xXSlyZXR1cm4gbnVsbDtjb25zdCBhPUNlLmV4cG9ydHMuc29ydGVkSW5kZXgoZSxyKTtjb25zb2xlLmFzc2VydChhPjApLGNvbnNvbGUuYXNzZXJ0KGE8ZS5sZW5ndGgpO2NvbnN0IHM9YS0xO2xldCBsPW51bGwsYz1udWxsO3JldHVybiB0LmZvckVhY2goKHQ9Pntjb25zdCBlPShmdW5jdGlvbiBuKHQsZSxpLGEpe2NvbnN0IHM9dC1pLGw9ZS1hLGM9ci1pLHU9by1hLGg9KHMqYytsKnUpLyhzKnMrbCpsKTtpZihoPD0wKXJldHVybiBZSnQoYyx1KTtpZihoPj0xKXJldHVybiBZSnQodC1yLGUtbyk7cmV0dXJuIFlKdChjLWgqcyx1LWgqbCl9KSh0LmNvbnRyb2xQb2ludHNbc11bMF0sdC5jb250cm9sUG9pbnRzW3NdWzFdLHQuY29udHJvbFBvaW50c1thXVswXSx0LmNvbnRyb2xQb2ludHNbYV1bMV0pO2U+aXx8KG51bGw9PT1sfHxlPGwpJiYobD1lLGM9dCl9KSksY31mdW5jdGlvbiB3MHQodCxlLG4pe2Z1bmN0aW9uIGkoKXtpZigwPT09dC5sZW5ndGgpcmV0dXJuWzEsMl07Y29uc3RbZSxuXT1HbCh0KTtyZXR1cm4gZSE9PW4/W2Usbl06ZT4wP1suNSplLDEuNSplXTplPDA/WzEuNSplLC41KmVdOlstMSwxXX1pZigiTElORUFSIj09PW4pcmV0dXJuIGNFKCkuZG9tYWluKGkoKSkucmFuZ2UoW2UsMF0pO2lmKCJMT0ciPT09bil7Y29uc3Qgbj1pKCk7cmV0dXJuIG5bMF08PTAmJm5bMV0+PTA/dzB0KHQsZSwiTElORUFSIik6eUUoKS5kb21haW4obikucmFuZ2UoW2UsMF0pfWlmKCJRVUFOVElMRSI9PT1uKXtjb25zdCBuPTIwLGk9S2wobikubWFwKCh0PT5lLXQqZS8obi0xKSkpO3JldHVybiAwPT09dC5sZW5ndGgmJih0PVsxXSksQ0UoKS5kb21haW4oQ2UuZXhwb3J0cy51bmlxKHQpKS5yYW5nZShpKX1pZigiTk9OX05VTUVSSUMiPT09bilyZXR1cm4gS00oKS5kb21haW4oQ2UuZXhwb3J0cy51bmlxKHQuc29ydCgpKSkucmFuZ2UoW2UsMF0pLnBhZGRpbmcoLjEpO3Rocm93IFJhbmdlRXJyb3IoIlVua25vd24gc2NhbGU6ICIrbil9dmFyIFMwdCxNMHQ7YjB0LnRlbXBsYXRlPXhlYAogICAgPCEtLSBJZiBzZXNzaW9uR3JvdXAgb3IgdmlzaWJsZVNjaGVtYSBhcmUgbm90IHBvcHVsYXRlZCwgZG8gbm90IGRpc3BsYXkKICAgICAgICAgYW55dGhpbmcuCiAgICAgIC0tPgogICAgPHRlbXBsYXRlCiAgICAgIGlzPSJkb20taWYiCiAgICAgIGlmPSJbW19wcm9wZXJ0aWVzQXJlUG9wdWxhdGVkKHZpc2libGVTY2hlbWEsIHNlc3Npb25Hcm91cCldXSIKICAgID4KICAgICAgPCEtLSBEaXNwbGF5IG9uZSByb3cgd2l0aG91dCBhICJzaG93LW1ldHJpY3MiIGNvbHVtbiAtLT4KICAgICAgPHRmLWhwYXJhbXMtdGFibGUtdmlldwogICAgICAgIHZpc2libGUtc2NoZW1hPSJbW3Zpc2libGVTY2hlbWFdXSIKICAgICAgICBzZXNzaW9uLWdyb3Vwcz0iW1tfc2luZ2xldG9uU2Vzc2lvbkdyb3VwcyhzZXNzaW9uR3JvdXApXV0iCiAgICAgID4KICAgICAgPC90Zi1ocGFyYW1zLXRhYmxlLXZpZXc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlCiAgICAgIGlzPSJkb20taWYiCiAgICAgIGlmPSJbWyFfcHJvcGVydGllc0FyZVBvcHVsYXRlZCh2aXNpYmxlU2NoZW1hLCBzZXNzaW9uR3JvdXApXV0iCiAgICA+CiAgICAgIDxkaXY+Q2xpY2sgb3IgaG92ZXIgb3ZlciBhIHNlc3Npb24gZ3JvdXAgdG8gZGlzcGxheSBpdHMgdmFsdWVzIGhlcmUuPC9kaXY+CiAgICA8L3RlbXBsYXRlPgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sYjB0LnByb3RvdHlwZSwic2Vzc2lvbkdyb3VwIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLGIwdC5wcm90b3R5cGUsInZpc2libGVTY2hlbWEiLHZvaWQgMCksYjB0PXQoW2koInRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMiKV0sYjB0KSwoZnVuY3Rpb24odCl7dC5MSU5FQVI9IkxJTkVBUiIsdC5MT0c9IkxPRyIsdC5RVUFOVElMRT0iUVVBTlRJTEUiLHQuTk9OX05VTUVSSUM9Ik5PTl9OVU1FUklDIn0pKFMwdHx8KFMwdD17fSkpO2NsYXNzIEUwdHtpc1Bhc3NpbmcodCl7cmV0dXJuITB9fWNsYXNzIFQwdHtjb25zdHJ1Y3Rvcih0LGUsbixpKXt0aGlzLl9sb3dlcj10LHRoaXMuX3VwcGVyPWUsdGhpcy5fbG93ZXJPcGVuPW4sdGhpcy5fdXBwZXJPcGVuPWl9aXNQYXNzaW5nKHQpe2NvbnN0IGU9dDtyZXR1cm4gdGhpcy5fYmVmb3JlKHRoaXMuX2xvd2VyLGUsIXRoaXMuX2xvd2VyT3BlbikmJnRoaXMuX2JlZm9yZShlLHRoaXMuX3VwcGVyLCF0aGlzLl91cHBlck9wZW4pfV9iZWZvcmUodCxlLG4pe3JldHVybiBuP3Q8PWU6dDxlfX1jbGFzcyBDMHR7Y29uc3RydWN0b3IodCl7dGhpcy5fZG9tYWluU2V0PXR9aXNQYXNzaW5nKHQpe3JldHVybi0xIT09dGhpcy5fZG9tYWluU2V0LmZpbmRJbmRleCgoZT0+ZT09PXQpKX19Y2xhc3MgQTB0e2NvbnN0cnVjdG9yKHQsZSxuLGkpe3RoaXMuX3N2Z1Byb3BzPXQsdGhpcy5fc2NoZW1hPWUsdGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyPW4sdGhpcy5fY29sSW5kZXg9aSx0aGlzLl9pc0Rpc3BsYXllZD0hMSx0aGlzLl95U2NhbGU9bnVsbCx0aGlzLl9zY2FsZVR5cGU9bnVsbCx0aGlzLnNldEJydXNoU2VsZWN0aW9uKG51bGwpfWNvbEluZGV4KCl7cmV0dXJuIHRoaXMuX2NvbEluZGV4fXlTY2FsZSgpe3JldHVybiB0aGlzLl95U2NhbGV9c2NhbGVUeXBlKCl7cmV0dXJuIHRoaXMuX3NjYWxlVHlwZX1icnVzaFNlbGVjdGlvbigpe3JldHVybiB0aGlzLl9icnVzaFNlbGVjdGlvbn1pc0Rpc3BsYXllZCgpe3JldHVybiB0aGlzLl9pc0Rpc3BsYXllZH1zZXRCcnVzaFNlbGVjdGlvbih0KXt0aGlzLl9icnVzaFNlbGVjdGlvbj10LHRoaXMuX2JydXNoRmlsdGVyPXRoaXMuX2J1aWxkQnJ1c2hGaWx0ZXIodGhpcy5icnVzaFNlbGVjdGlvbigpLHRoaXMuc2NhbGVUeXBlKCksdGhpcy55U2NhbGUoKSl9c2V0RG9tYWluQW5kU2NhbGUodCxlKXt0aGlzLl9zY2FsZVR5cGU9ZSx0aGlzLl95U2NhbGU9dzB0KHQuc2xpY2UoKSx0aGlzLl9zdmdQcm9wcy5oZWlnaHQsdGhpcy5zY2FsZVR5cGUoKSksdGhpcy5fYnJ1c2hGaWx0ZXI9dGhpcy5fYnVpbGRCcnVzaEZpbHRlcih0aGlzLmJydXNoU2VsZWN0aW9uKCksdGhpcy5zY2FsZVR5cGUoKSx0aGlzLnlTY2FsZSgpKX1icnVzaEZpbHRlcigpe3JldHVybiB0aGlzLl9icnVzaEZpbHRlcn11cGRhdGVET00odCl7bGV0IGU9YmModGhpcy55U2NhbGUoKSk7dGhpcy5zY2FsZVR5cGUoKT09PVMwdC5RVUFOVElMRSYmKGU9ZS50aWNrVmFsdWVzKHRoaXMueVNjYWxlKCkucXVhbnRpbGVzKCkpLnRpY2tGb3JtYXQoRHkoIi0uNmciKSkpO2NvbnN0IG49RHUodCk7bi5zZWxlY3RBbGwoImciKS5yZW1vdmUoKSxuLmFwcGVuZCgiZyIpLmNsYXNzZWQoImF4aXMiLCEwKS5jYWxsKGUpLmFwcGVuZCgidGV4dCIpLmNsYXNzZWQoImF4aXMtdGl0bGUiLCEwKS5zdHlsZSgiY3Vyc29yIiwibW92ZSIpLnN0eWxlKCJ0ZXh0LWFuY2hvciIsIm1pZGRsZSIpLmF0dHIoInkiLC05KS50ZXh0KCh0PT5BSnQodGhpcy5fc2NoZW1hLHQpKSksbi5jYWxsKEloKCkub24oInN0YXJ0IiwoKCk9Pnt0LnNldEF0dHJpYnV0ZSgiaXMtZHJhZ2dpbmciLCIiKSx0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIub25EcmFnU3RhcnQodGhpcy5jb2xJbmRleCgpKX0pKS5vbigiZHJhZyIsKCgpPT50aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIub25EcmFnKE11LngpKSkub24oImVuZCIsKCgpPT57dGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uRHJhZ0VuZCgpLHQucmVtb3ZlQXR0cmlidXRlKCJpcy1kcmFnZ2luZyIpfSkpKTtjb25zdCBpPXlnKCkuZXh0ZW50KFtbLTgsMF0sWzgsdGhpcy5fc3ZnUHJvcHMuaGVpZ2h0KzFdXSkub24oInN0YXJ0IiwoKCk9PntMMHQoTXUpJiYodC5zZXRBdHRyaWJ1dGUoImlzLWJydXNoaW5nIiwiIiksdGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uQnJ1c2hDaGFuZ2VkKHRoaXMuY29sSW5kZXgoKSxNdS5zZWxlY3Rpb24pKX0pKS5vbigiYnJ1c2giLCgoKT0+e0wwdChNdSkmJnRoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5vbkJydXNoQ2hhbmdlZCh0aGlzLmNvbEluZGV4KCksTXUuc2VsZWN0aW9uKX0pKS5vbigiZW5kIiwoKCk9PntMMHQoTXUpJiYodGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uQnJ1c2hDaGFuZ2VkKHRoaXMuY29sSW5kZXgoKSxNdS5zZWxlY3Rpb24pLHQucmVtb3ZlQXR0cmlidXRlKCJpcy1icnVzaGluZyIpKX0pKSxyPUR1KHQpLmFwcGVuZCgiZyIpLmNsYXNzZWQoImJydXNoIiwhMCk7ci5jYWxsKGkpLGkubW92ZShyLHRoaXMuYnJ1c2hTZWxlY3Rpb24oKSl9c2V0RGlzcGxheWVkKHQpe3RoaXMuX2lzRGlzcGxheWVkPXR9X2J1aWxkQnJ1c2hGaWx0ZXIodCxlLG4pe2lmKG51bGw9PT10KXJldHVybiBuZXcgRTB0O2lmKG51bGw9PT1lKXJldHVybiBjb25zb2xlLmVycm9yKCJTY2FsZSB0eXBlIGlzIG51bGwsIGJ1dCBicnVzaFNlbGVjdGlvbiBpc24ndDogIix0KSxuZXcgRTB0O3N3aXRjaChlKXtjYXNlIFMwdC5MSU5FQVI6Y2FzZSBTMHQuTE9HOntjb25zdFtlLGldPShmdW5jdGlvbiByKHQsZSxuKXtyZXR1cm5bdC5pbnZlcnQoZSksdC5pbnZlcnQobildLnNvcnQoKCh0LGUpPT50LWUpKX0pKG4sdFswXSx0WzFdKTtyZXR1cm4gbmV3IFQwdChlLGksITEsITEpfWNhc2UgUzB0LlFVQU5USUxFOntjb25zdFtlLGldPShmdW5jdGlvbiByKHQsZSxuKXtjb25zdCBpPXQucmFuZ2UoKSxyPWkuZmlsdGVyKCh0PT5lPD10JiZ0PD1uKSkubWFwKChlPT57Y29uc3Qgbj10LmludmVydEV4dGVudChlKTtyZXR1cm4gZT09PWlbaS5sZW5ndGgtMV0/W25bMF0sblsxXSsxXTpufSkpO3JldHVybiAwPT1yLmxlbmd0aD9bMCwwXTpHbChhYyhyKSl9KShuLHRbMF0sdFsxXSk7cmV0dXJuIG5ldyBUMHQoZSxpLCExLCEwKX1jYXNlIFMwdC5OT05fTlVNRVJJQzpyZXR1cm4gbmV3IEMwdCgoZnVuY3Rpb24gZSh0LG4saSl7cmV0dXJuIHQuZG9tYWluKCkuZmlsdGVyKChlPT57Y29uc3Qgcj10KGUpO3JldHVybiBuPD1yJiZyPD1pfSkpfSkobix0WzBdLHRbMV0pKX1yZXR1cm4gY29uc29sZS5lcnJvcigiVW5rbm93biBzY2FsZSB0eXBlOiAiLGUpLG5ldyBFMHR9fWNsYXNzIGswdHtjb25zdHJ1Y3Rvcih0LGUsbil7dGhpcy5fc3ZnUHJvcHM9dCx0aGlzLl9zY2hlbWE9ZSx0aGlzLl9heGVzPXRoaXMuX2NyZWF0ZUF4ZXMobiksdGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnM9S00oKS5yYW5nZShbMSx0aGlzLl9zdmdQcm9wcy53aWR0aC0xXSkucGFkZGluZyguNSksdGhpcy5fZHJhZ2dlZEF4aXM9bnVsbCx0aGlzLl9zdmdQcm9wcy5zdmdHLnNlbGVjdEFsbCgiZy5heGlzLXBhcmVudCIpLnJlbW92ZSgpLHRoaXMuX3BhcmVudHNTZWw9dGhpcy5fc3ZnUHJvcHMuc3ZnRy5zZWxlY3RBbGwoIi5heGlzLXBhcmVudCIpfXVwZGF0ZUF4ZXModCxlKXtjb25zb2xlLmFzc2VydCghdGhpcy5pc0F4aXNEcmFnZ2luZygpKTtjb25zdCBuPW5ldyBTZXQ7dC5jb2x1bW5zLmZvckVhY2goKHQ9Pntjb25zdCBpPXQuYWJzb2x1dGVJbmRleDtsZXQgcj10aGlzLl9heGVzW2ldO3Iuc2V0RGlzcGxheWVkKCEwKTtjb25zdCBvPWUubWFwKCh0PT56SnQodGhpcy5fc2NoZW1hLHQsaSkpKTtyLnNldERvbWFpbkFuZFNjYWxlKG8sdC5zY2FsZSksbi5hZGQoaSl9KSksdGhpcy5fYXhlcy5mb3JFYWNoKCh0PT57bi5oYXModC5jb2xJbmRleCgpKXx8dC5zZXREaXNwbGF5ZWQoITEpfSkpLHRoaXMuX3VwZGF0ZVN0YXRpb25hcnlBeGVzUG9zaXRpb25zKG4pLHRoaXMuX3BhcmVudHNTZWw9dGhpcy5fcGFyZW50c1NlbC5kYXRhKEFycmF5LmZyb20obiksKHQ9PnQpKSx0aGlzLl9wYXJlbnRzU2VsLmV4aXQoKS5yZW1vdmUoKSx0aGlzLl9wYXJlbnRzU2VsPXRoaXMuX3BhcmVudHNTZWwuZW50ZXIoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJheGlzLXBhcmVudCIsITApLm1lcmdlKHRoaXMuX3BhcmVudHNTZWwpO2NvbnN0IGk9dGhpczt0aGlzLl9wYXJlbnRzU2VsLmNhbGwoKHQ9PnRoaXMuX3VwZGF0ZUF4ZXNQb3NpdGlvbnNJbkRPTSh0KSkpLmVhY2goKGZ1bmN0aW9uKHQpe2kuX2F4ZXNbdF0udXBkYXRlRE9NKHRoaXMpfSkpfW1hcFZpc2libGVBeGVzKHQpe3JldHVybiB0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucy5kb21haW4oKS5tYXAoKGU9PnQodGhpcy5nZXRBeGlzUG9zaXRpb24oZSksdGhpcy5fYXhlc1tlXSkpKX1hbGxWaXNpYmxlQXhlc1NhdGlzZnkodCl7cmV0dXJuIHRoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zLmRvbWFpbigpLmV2ZXJ5KChlPT50KHRoaXMuZ2V0QXhpc1Bvc2l0aW9uKGUpLHRoaXMuX2F4ZXNbZV0pKSl9Z2V0QXhpc0ZvckNvbEluZGV4KHQpe3JldHVybiB0aGlzLl9heGVzW3RdfWRyYWdTdGFydCh0KXtjb25zb2xlLmFzc2VydCghdGhpcy5pc0F4aXNEcmFnZ2luZygpKSxjb25zb2xlLmFzc2VydCh0aGlzLl9heGVzW3RdLmlzRGlzcGxheWVkKCkpLHRoaXMuX2RyYWdnZWRBeGlzPXRoaXMuX2F4ZXNbdF0sdGhpcy5fZHJhZ2dlZEF4aXNQb3NpdGlvbj10aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucyh0KX1kcmFnKHQpe3Q9TWF0aC5taW4oTWF0aC5tYXgodCwwKSx0aGlzLl9zdmdQcm9wcy53aWR0aCksdGhpcy5fZHJhZ2dlZEF4aXNQb3NpdGlvbj10O2xldCBlPXRoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zLmRvbWFpbigpO2Uuc29ydCgoKHQsZSk9PnRoaXMuZ2V0QXhpc1Bvc2l0aW9uKHQpLXRoaXMuZ2V0QXhpc1Bvc2l0aW9uKGUpKSksdGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMuZG9tYWluKGUpLHRoaXMuX3VwZGF0ZUF4ZXNQb3NpdGlvbnNJbkRPTSh0aGlzLl9wYXJlbnRzU2VsKX1kcmFnRW5kKHQpe2NvbnNvbGUuYXNzZXJ0KHRoaXMuaXNBeGlzRHJhZ2dpbmcoKSksdGhpcy5fZHJhZ2dlZEF4aXNQb3NpdGlvbj1udWxsLHRoaXMuX2RyYWdnZWRBeGlzPW51bGwsdGhpcy5fdXBkYXRlQXhlc1Bvc2l0aW9uc0luRE9NKHRoaXMuX3BhcmVudHNTZWwudHJhbnNpdGlvbigpLmR1cmF0aW9uKHQpKX1pc0F4aXNEcmFnZ2luZygpe3JldHVybiBudWxsIT09dGhpcy5fZHJhZ2dlZEF4aXN9Z2V0QXhpc1Bvc2l0aW9uKHQpe3JldHVybiBudWxsIT09dGhpcy5fZHJhZ2dlZEF4aXMmJnRoaXMuX2RyYWdnZWRBeGlzLmNvbEluZGV4KCk9PT10P3RoaXMuX2RyYWdnZWRBeGlzUG9zaXRpb246dGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnModCl9X3VwZGF0ZVN0YXRpb25hcnlBeGVzUG9zaXRpb25zKHQpe2NvbnN0IGU9dGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMuZG9tYWluKCkuZmlsdGVyKChlPT50LmhhcyhlKSkpLG49QXJyYXkuZnJvbShuZXcgU2V0KFsuLi5lLC4uLkFycmF5LmZyb20odCldKSk7dGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMuZG9tYWluKG4pfV91cGRhdGVBeGVzUG9zaXRpb25zSW5ET00odCl7dC5hdHRyKCJ0cmFuc2Zvcm0iLCh0PT5LSnQodGhpcy5nZXRBeGlzUG9zaXRpb24odCkpKSl9X2NyZWF0ZUF4ZXModCl7cmV0dXJuIEtsKFBKdCh0aGlzLl9zY2hlbWEpKS5tYXAoKGU9Pm5ldyBBMHQodGhpcy5fc3ZnUHJvcHMsdGhpcy5fc2NoZW1hLHQsZSkpKX19ZnVuY3Rpb24gTDB0KHQpe3JldHVybiBudWxsIT09dC5zb3VyY2VFdmVudH0hKGZ1bmN0aW9uKHQpe3RbdC5GT1JFR1JPVU5EPTBdPSJGT1JFR1JPVU5EIix0W3QuQkFDS0dST1VORD0xXT0iQkFDS0dST1VORCJ9KShNMHR8fChNMHQ9e30pKTtjbGFzcyBQMHR7Y29uc3RydWN0b3IodCl7dm9pZCAwPT09dCYmKHQ9eGgobnVsbCkpLGNvbnNvbGUuYXNzZXJ0KHQuc2l6ZSgpPD0xKSx0aGlzLl9zZXNzaW9uR3JvdXBTZWw9dH1zZXNzaW9uR3JvdXAoKXtyZXR1cm4gMT09PXRoaXMuX3Nlc3Npb25Hcm91cFNlbC5zaXplKCk/dGhpcy5fc2Vzc2lvbkdyb3VwU2VsLmRhdHVtKCk6bnVsbH1pc051bGwoKXtyZXR1cm4gbnVsbD09PXRoaXMuc2Vzc2lvbkdyb3VwKCl9c2VsZWN0aW9uKCl7cmV0dXJuIHRoaXMuX3Nlc3Npb25Hcm91cFNlbH1lcXVhbHNUbyh0KXtyZXR1cm4gdGhpcy5pc051bGwoKT90LmlzTnVsbCgpOiF0LmlzTnVsbCgpJiZ0LnNlc3Npb25Hcm91cCgpLm5hbWU9PXRoaXMuc2Vzc2lvbkdyb3VwKCkubmFtZX19Y2xhc3MgTjB0e2NvbnN0cnVjdG9yKHQsZSxuKXt0aGlzLl9zdmdQcm9wcz10LHRoaXMuX3NjaGVtYT1lLHRoaXMuX2F4ZXNDb2xsZWN0aW9uPW4sdGhpcy5fc2Vzc2lvbkdyb3Vwcz1bXSx0aGlzLl9zdmdQcm9wcy5zdmdHLnNlbGVjdEFsbCgiZy5iYWNrZ3JvdW5kIikucmVtb3ZlKCksdGhpcy5fc3ZnUHJvcHMuc3ZnRy5zZWxlY3RBbGwoImcuZm9yZWdyb3VuZCIpLnJlbW92ZSgpLHRoaXMuX2JnUGF0aHNTZWw9dGhpcy5fc3ZnUHJvcHMuc3ZnRy5hcHBlbmQoImciKS5jbGFzc2VkKCJiYWNrZ3JvdW5kIiwhMCkuc2VsZWN0QWxsKCJwYXRoIiksdGhpcy5fZmdQYXRoc1NlbD10aGlzLl9zdmdQcm9wcy5zdmdHLmFwcGVuZCgiZyIpLmNsYXNzZWQoImZvcmVncm91bmQiLCEwKS5zZWxlY3RBbGwoInBhdGgiKSx0aGlzLl91cGRhdGVWaXNpYmxlRmdQYXRoc1NlbCgpLHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cEhhbmRsZT1uZXcgUDB0LHRoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlPW5ldyBQMHQsdGhpcy5fZDNsaW5lPURMKCkuY3VydmUoUkwpfWdldFNlc3Npb25Hcm91cEhhbmRsZSh0KXtyZXR1cm4gbnVsbD09dD9uZXcgUDB0Om5ldyBQMHQodGhpcy5fZmdQYXRoc1NlbC5maWx0ZXIoKGU9PmUubmFtZT09PXQubmFtZSkpKX1oaWRlQmFja2dyb3VuZExpbmVzKCl7dGhpcy5fYmdQYXRoc1NlbC5hdHRyKCJ2aXNpYmlsaXR5IiwiaGlkZGVuIil9c2hvd0JhY2tncm91bmRMaW5lcygpe3RoaXMuX2JnUGF0aHNTZWwuYXR0cigidmlzaWJpbGl0eSIsbnVsbCl9cGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCl7cmV0dXJuIHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cEhhbmRsZX1zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpe3JldHVybiB0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZX1yZWNvbXB1dGVDb250cm9sUG9pbnRzKHQsZT0wKXsodD09PU0wdC5GT1JFR1JPVU5EP3RoaXMuX2ZnUGF0aHNTZWw6dGhpcy5fYmdQYXRoc1NlbCkudHJhbnNpdGlvbigpLmR1cmF0aW9uKGUpLmF0dHIoImQiLCh0PT50aGlzLl9wYXRoREF0dHJpYnV0ZSh0KSkpLHQ9PT1NMHQuRk9SRUdST1VORCYmd2luZG93LnNldFRpbWVvdXQoKCgpPT57Y29uc3QgdD10aGlzO3RoaXMuX2ZnUGF0aHNTZWwuZWFjaCgoZnVuY3Rpb24oZSl7dC5fc2V0Q29udHJvbFBvaW50c1Byb3BlcnR5KHRoaXMsZSl9KSl9KSl9cmVjb21wdXRlRm9yZWdyb3VuZExpbmVzVmlzaWJpbGl0eSgpe3RoaXMuX2ZnUGF0aHNTZWwuY2xhc3NlZCgiaW52aXNpYmxlLXBhdGgiLCh0PT4hdGhpcy5fYXhlc0NvbGxlY3Rpb24uYWxsVmlzaWJsZUF4ZXNTYXRpc2Z5KCgoZSxuKT0+bi5icnVzaEZpbHRlcigpLmlzUGFzc2luZyh6SnQodGhpcy5fc2NoZW1hLHQsbi5jb2xJbmRleCgpKSkpKSkpLHRoaXMuX3VwZGF0ZVZpc2libGVGZ1BhdGhzU2VsKCl9c2V0Rm9yZWdyb3VuZExpbmVzQ29sb3IodCxlLG4pe2NvbnN0IGk9dGhpcy5fY3JlYXRlTGluZUNvbG9yRnVuY3Rpb24odCxlLG4pO3RoaXMuX2ZnUGF0aHNTZWwuYXR0cigic3Ryb2tlIixpKX1yZWRyYXcodCxlLG4saSl7Y29uc3Qgcj10aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2Vzc2lvbkdyb3VwKCksbz10aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZS5zZXNzaW9uR3JvdXAoKTt0aGlzLl9zZXNzaW9uR3JvdXBzPXQsdGhpcy5fZmdQYXRoc1NlbD10aGlzLl9yZWNvbXB1dGVQYXRoU2VsZWN0aW9uKHRoaXMuX2ZnUGF0aHNTZWwpLHRoaXMuX2JnUGF0aHNTZWw9dGhpcy5fcmVjb21wdXRlUGF0aFNlbGVjdGlvbih0aGlzLl9iZ1BhdGhzU2VsKSx0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGU9dGhpcy5nZXRTZXNzaW9uR3JvdXBIYW5kbGUociksdGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGU9dGhpcy5nZXRTZXNzaW9uR3JvdXBIYW5kbGUobyksdGhpcy5yZWNvbXB1dGVDb250cm9sUG9pbnRzKE0wdC5GT1JFR1JPVU5EKSx0aGlzLnJlY29tcHV0ZUNvbnRyb2xQb2ludHMoTTB0LkJBQ0tHUk9VTkQpLHRoaXMucmVjb21wdXRlRm9yZWdyb3VuZExpbmVzVmlzaWJpbGl0eSgpLHRoaXMuc2V0Rm9yZWdyb3VuZExpbmVzQ29sb3IoZSxuLGkpfXVwZGF0ZVBlYWtlZFNlc3Npb25Hcm91cCh0KXt0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2VsZWN0aW9uKCkuY2xhc3NlZCgicGVha2VkLXBhdGgiLCExKSx0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGU9dCx0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2VsZWN0aW9uKCkuY2xhc3NlZCgicGVha2VkLXBhdGgiLCEwKX1jbGVhclBlYWtlZFNlc3Npb25Hcm91cCgpe3RoaXMudXBkYXRlUGVha2VkU2Vzc2lvbkdyb3VwKG5ldyBQMHQpfXVwZGF0ZVNlbGVjdGVkU2Vzc2lvbkdyb3VwKHQpe3RoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlbGVjdGlvbigpLmNsYXNzZWQoInNlbGVjdGVkLXBhdGgiLCExKSx0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZT10LHRoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlbGVjdGlvbigpLmNsYXNzZWQoInNlbGVjdGVkLXBhdGgiLCEwKX1maW5kQ2xvc2VzdFNlc3Npb25Hcm91cCh0LGUpe2NvbnN0IG49dGhpcy5fYXhlc0NvbGxlY3Rpb24ubWFwVmlzaWJsZUF4ZXMoKCh0LGUpPT50KSksaT14MHQodGhpcy5fdmlzaWJsZUZnUGF0aHNTZWwubm9kZXMoKSxuLFt0LGVdLDEwMCk7cmV0dXJuIG51bGw9PT1pP25ldyBQMHQ6bmV3IFAwdChEdShpKSl9X2NyZWF0ZUxpbmVDb2xvckZ1bmN0aW9uKHQsZSxuKXtpZihudWxsPT09dClyZXR1cm4oKT0+InJlZCI7Y29uc3QgaT1jRSgpLmRvbWFpbihESnQodGhpcy5fc2NoZW1hLHRoaXMuX3Nlc3Npb25Hcm91cHMsdCkpLnJhbmdlKFtlLG5dKS5pbnRlcnBvbGF0ZShrcCk7cmV0dXJuIGU9Pmkoekp0KHRoaXMuX3NjaGVtYSxlLHQpKX1fcmVjb21wdXRlUGF0aFNlbGVjdGlvbih0KXtyZXR1cm4odD10LmRhdGEodGhpcy5fc2Vzc2lvbkdyb3VwcywodD0+dC5uYW1lKSkpLmV4aXQoKS5yZW1vdmUoKSx0LmVudGVyKCkuYXBwZW5kKCJwYXRoIikubWVyZ2UodCl9X3NldENvbnRyb2xQb2ludHNQcm9wZXJ0eSh0LGUpe3QuY29udHJvbFBvaW50cz10aGlzLl9jb21wdXRlQ29udHJvbFBvaW50cyhlKX1fY29tcHV0ZUNvbnRyb2xQb2ludHModCl7cmV0dXJuIHRoaXMuX2F4ZXNDb2xsZWN0aW9uLm1hcFZpc2libGVBeGVzKCgoZSxuKT0+W2Usbi55U2NhbGUoKSh6SnQodGhpcy5fc2NoZW1hLHQsbi5jb2xJbmRleCgpKSldKSl9X3BhdGhEQXR0cmlidXRlKHQpe3JldHVybiB0aGlzLl9kM2xpbmUodGhpcy5fY29tcHV0ZUNvbnRyb2xQb2ludHModCkpfV91cGRhdGVWaXNpYmxlRmdQYXRoc1NlbCgpe3RoaXMuX3Zpc2libGVGZ1BhdGhzU2VsPXRoaXMuX2ZnUGF0aHNTZWwuZmlsdGVyKCI6bm90KC5pbnZpc2libGUtcGF0aCkiKX19Y2xhc3MgSTB0e2NvbnN0cnVjdG9yKHQsZSl7dGhpcy5zdmc9RHUodCk7Y29uc3Qgbj0zMCxpPTEwLHI9MTAsbz0xMCxhPTEwMCplK28raSxzPTIwMCtuK3I7dGhpcy5zdmcuYXR0cigidmlld0JveCIsYDAgMCAke2F9ICR7c31gKSx0aGlzLnN2Zy5hdHRyKCJwcmVzZXJ2ZUFzcGVjdFJhdGlvIiwieE1pZFlNaWQiKSx0aGlzLnN2Zy5zdHlsZSgibWluLXdpZHRoIixhKyJweCIpLHRoaXMuc3ZnLnN0eWxlKCJtaW4taGVpZ2h0IixzKyJweCIpLHRoaXMud2lkdGg9YS1vLWksdGhpcy5oZWlnaHQ9cy1uLXIsdGhpcy5zdmdHPXRoaXMuc3ZnLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsS0p0KG8sbikpfX1jbGFzcyBSMHR7Y29uc3RydWN0b3IodCxlLG4saSl7dGhpcy5fc3ZnUHJvcHM9dCx0aGlzLl9zY2hlbWE9ZSx0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBDaGFuZ2VkQ0I9bix0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cENoYW5nZWRDQj1pLHRoaXMuX2F4ZXNDb2xsZWN0aW9uPW5ldyBrMHQodCxlLHRoaXMpLHRoaXMuX2xpbmVzQ29sbGVjdGlvbj1uZXcgTjB0KHQsZSx0aGlzLl9heGVzQ29sbGVjdGlvbiksdGhpcy5fc3ZnUHJvcHMuc3ZnLm9uKCJjbGljayIsKCgpPT50aGlzLm9uQ2xpY2soKSkpLm9uKCJtb3VzZW1vdmUgbW91c2VlbnRlciIsKCgpPT57Y29uc3RbdCxlXT1iaCh0aGlzLl9zdmdQcm9wcy5zdmdHLm5vZGUoKSk7dGhpcy5vbk1vdXNlTW92ZWQodCxlKX0pKS5vbigibW91c2VsZWF2ZSIsKCgpPT50aGlzLm9uTW91c2VMZWF2ZSgpKSl9b25EcmFnU3RhcnQodCl7dGhpcy5fYXhlc0NvbGxlY3Rpb24uZHJhZ1N0YXJ0KHQpLHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5oaWRlQmFja2dyb3VuZExpbmVzKCl9b25EcmFnKHQpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLmRyYWcodCksdGhpcy5fbGluZXNDb2xsZWN0aW9uLnJlY29tcHV0ZUNvbnRyb2xQb2ludHMoTTB0LkZPUkVHUk9VTkQpfW9uRHJhZ0VuZCgpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLmRyYWdFbmQoNTAwKSx0aGlzLl9saW5lc0NvbGxlY3Rpb24ucmVjb21wdXRlQ29udHJvbFBvaW50cyhNMHQuRk9SRUdST1VORCw1MDApLHdpbmRvdy5zZXRUaW1lb3V0KCgoKT0+e3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWNvbXB1dGVDb250cm9sUG9pbnRzKE0wdC5CQUNLR1JPVU5EKSx0aGlzLl9saW5lc0NvbGxlY3Rpb24uc2hvd0JhY2tncm91bmRMaW5lcygpfSksNTAwKX1vbkJydXNoQ2hhbmdlZCh0LGUpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLmdldEF4aXNGb3JDb2xJbmRleCh0KS5zZXRCcnVzaFNlbGVjdGlvbihlKSx0aGlzLl9saW5lc0NvbGxlY3Rpb24ucmVjb21wdXRlRm9yZWdyb3VuZExpbmVzVmlzaWJpbGl0eSgpfW9uTW91c2VNb3ZlZCh0LGUpe3RoaXMuX2xpbmVzQ29sbGVjdGlvbi51cGRhdGVQZWFrZWRTZXNzaW9uR3JvdXAodGhpcy5fbGluZXNDb2xsZWN0aW9uLmZpbmRDbG9zZXN0U2Vzc2lvbkdyb3VwKHQsZSkpLHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cENoYW5nZWRDQih0aGlzLl9saW5lc0NvbGxlY3Rpb24ucGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCkuc2Vzc2lvbkdyb3VwKCkpfW9uTW91c2VMZWF2ZSgpe3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5pc051bGwoKXx8KHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5jbGVhclBlYWtlZFNlc3Npb25Hcm91cCgpLHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cENoYW5nZWRDQihudWxsKSl9b25DbGljaygpe3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKT09PXRoaXMuX2xpbmVzQ29sbGVjdGlvbi5zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpLnNlc3Npb25Hcm91cCgpP3RoaXMuX2xpbmVzQ29sbGVjdGlvbi51cGRhdGVTZWxlY3RlZFNlc3Npb25Hcm91cChuZXcgUDB0KTp0aGlzLl9saW5lc0NvbGxlY3Rpb24udXBkYXRlU2VsZWN0ZWRTZXNzaW9uR3JvdXAodGhpcy5fbGluZXNDb2xsZWN0aW9uLnBlYWtlZFNlc3Npb25Hcm91cEhhbmRsZSgpKSx0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cENoYW5nZWRDQih0aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKSl9b25PcHRpb25zT3JTZXNzaW9uR3JvdXBzQ2hhbmdlZCh0LGUpe3RoaXMuX2F4ZXNDb2xsZWN0aW9uLnVwZGF0ZUF4ZXModCxlKTtjb25zdCBuPXRoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKSxpPXRoaXMuX2xpbmVzQ29sbGVjdGlvbi5zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpO3RoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWRyYXcoZSx2b2lkIDAhPT10LmNvbG9yQnlDb2x1bW5JbmRleD90LmNvbHVtbnNbdC5jb2xvckJ5Q29sdW1uSW5kZXhdLmFic29sdXRlSW5kZXg6bnVsbCx0Lm1pbkNvbG9yLHQubWF4Q29sb3IpLG4uZXF1YWxzVG8odGhpcy5fbGluZXNDb2xsZWN0aW9uLnBlYWtlZFNlc3Npb25Hcm91cEhhbmRsZSgpKXx8dGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKS5zZXNzaW9uR3JvdXAoKSksaS5lcXVhbHNUbyh0aGlzLl9saW5lc0NvbGxlY3Rpb24uc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUoKSl8fHRoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpLnNlc3Npb25Hcm91cCgpKX1zY2hlbWEoKXtyZXR1cm4gdGhpcy5fc2NoZW1hfX1sZXQgTzB0PWNsYXNzIGV4dGVuZHMoY3IoZ2wod2UpKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXA9bnVsbCx0aGlzLmNsb3Nlc3RTZXNzaW9uR3JvdXA9bnVsbCx0aGlzLnJlZHJhd0NvdW50PTB9X29wdGlvbnNPclNlc3Npb25Hcm91cHNDaGFuZ2VkKCl7dmFyIHQ7aWYoIXRoaXMub3B0aW9ucylyZXR1cm47Y29uc3R7Y29uZmlndXJhdGlvbjplfT1udWxsIT09KHQ9dGhpcy5fcHJldk9wdGlvbnMpJiZ2b2lkIDAhPT10P3Q6e30se2NvbmZpZ3VyYXRpb246bn09dGhpcy5vcHRpb25zO2lmKHZvaWQgMD09PXRoaXMuX2ludGVyYWN0aW9uTWFuYWdlcnx8IUNlLmV4cG9ydHMuaXNFcXVhbChlLnNjaGVtYSxuLnNjaGVtYSl8fCFDZS5leHBvcnRzLmlzRXF1YWwoZS5jb2x1bW5zVmlzaWJpbGl0eSxuLmNvbHVtbnNWaXNpYmlsaXR5KSl7RHUodGhpcy4kLnN2Zykuc2VsZWN0QWxsKCIqIikucmVtb3ZlKCk7Y29uc3QgdD1uZXcgSTB0KHRoaXMuJC5zdmcsbi5jb2x1bW5zVmlzaWJpbGl0eS5maWx0ZXIoQm9vbGVhbikubGVuZ3RoKTt0aGlzLnNjb3BlU3VidHJlZSh0aGlzLiQuc3ZnLCEwKSx0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXI9bmV3IFIwdCh0LG4uc2NoZW1hLCh0PT50aGlzLmNsb3Nlc3RTZXNzaW9uR3JvdXBDaGFuZ2VkKHQpKSwodD0+dGhpcy5zZWxlY3RlZFNlc3Npb25Hcm91cENoYW5nZWQodCkpKX10aGlzLl9jb21wdXRlVmFsaWRTZXNzaW9uR3JvdXBzKCksdGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uT3B0aW9uc09yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQodGhpcy5vcHRpb25zLHRoaXMuX3ZhbGlkU2Vzc2lvbkdyb3VwcyksdGhpcy5yZWRyYXdDb3VudCsrLHRoaXMuX3ByZXZPcHRpb25zPXRoaXMub3B0aW9uc31jbG9zZXN0U2Vzc2lvbkdyb3VwQ2hhbmdlZCh0KXt0aGlzLmNsb3Nlc3RTZXNzaW9uR3JvdXA9dH1zZWxlY3RlZFNlc3Npb25Hcm91cENoYW5nZWQodCl7dGhpcy5zZWxlY3RlZFNlc3Npb25Hcm91cD10fV9jb21wdXRlVmFsaWRTZXNzaW9uR3JvdXBzKCl7Y29uc3QgdD1RSnQ7aWYodm9pZCAwPT09dGhpcy5zZXNzaW9uR3JvdXBzKXJldHVybiB2b2lkKHRoaXMuX3ZhbGlkU2Vzc2lvbkdyb3Vwcz12b2lkIDApO2NvbnN0IGU9dGhpcy5vcHRpb25zLmNvbmZpZ3VyYXRpb24uc2NoZW1hO3RoaXMuX3ZhbGlkU2Vzc2lvbkdyb3Vwcz10aGlzLnNlc3Npb25Hcm91cHMuZmlsdGVyKChuPT57Zm9yKGxldCBpPTA7aTx0Lm51bUNvbHVtbnMoZSk7KytpKWlmKHRoaXMub3B0aW9ucy5jb25maWd1cmF0aW9uLmNvbHVtbnNWaXNpYmlsaXR5W2ldJiZ2b2lkIDA9PT10LmNvbHVtblZhbHVlQnlJbmRleChlLG4saSkpcmV0dXJuITE7cmV0dXJuITB9KSl9fTtPMHQudGVtcGxhdGU9eGVgCiAgICA8ZGl2IGlkPSJjb250YWluZXIiPgogICAgICA8c3ZnIGlkPSJzdmciPjwvc3ZnPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAtLXRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QtYXhpcy1zaGFkb3c6IDAgMXB4IDAgI2ZmZiwKICAgICAgICAgIDFweCAwIDAgI2ZmZiwgMCAtMXB4IDAgI2ZmZiwgLTFweCAwIDAgI2ZmZjsKICAgICAgfQogICAgICA6aG9zdCguZGFyay1tb2RlKSB7CiAgICAgICAgLS10Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90LWF4aXMtc2hhZG93OiAwIDFweCAwICMwMDAsCiAgICAgICAgICAxcHggMCAwICMwMDAsIDAgLTFweCAwICMwMDAsIC0xcHggMCAwICMwMDA7CiAgICAgIH0KICAgICAgc3ZnIHsKICAgICAgICBmb250OiAxMHB4IHNhbnMtc2VyaWY7CiAgICAgIH0KCiAgICAgIC5iYWNrZ3JvdW5kIHBhdGggewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjZGRkOwogICAgICAgIHNoYXBlLXJlbmRlcmluZzogY3Jpc3BFZGdlczsKICAgICAgfQoKICAgICAgLmZvcmVncm91bmQgcGF0aCB7CiAgICAgICAgZmlsbDogbm9uZTsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMC43OwogICAgICAgIHN0cm9rZS13aWR0aDogMTsKICAgICAgfQoKICAgICAgLyogV2lsbCBiZSBzZXQgb24gZm9yZWdyb3VuZCBwYXRocyB0aGF0IGFyZSBub3QgImNvbnRhaW5lZCIgaW4gdGhlIGN1cnJlbnQKICAgICAgICAgYXhlcyBicnVzaGVzLiBJZiBubyBicnVzaGVzIGFyZSBzZXQsIG5vIHBhdGggd2lsbCBoYXZlIHRoaXMgY2xhc3MuICovCiAgICAgIC5mb3JlZ3JvdW5kIC5pbnZpc2libGUtcGF0aCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQoKICAgICAgLyogU3R5bGUgZm9yIHRoZSBwYXRoIGNsb3Nlc3QgdG8gdGhlIG1vdXNlIHBvaW50ZXIgKHR5cGljYWxseSB3aWxsIGJlY29tZQogICAgICB0aGUgc2VsZWN0ZWQgcGF0aCB3aGVuIHRoZSB1c2VyIGNsaWNrcykuICovCiAgICAgIC5mb3JlZ3JvdW5kIC5wZWFrZWQtcGF0aCB7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAzOwogICAgICB9CgogICAgICAvKiBUaGUgY3VycmVudGx5IHNlbGVjdGVkIHBhdGggY2xhc3MuIFdlIHVzZSAhaW1wb3J0YW50IHRvIG92ZXJyaWRlIHRoZQogICAgICAgICBpbmxpbmUgc3R5bGUgdGhhdCBzZXRzIHRoZSByZWd1bGFyIGNvbG9yIG9mIGEgcGF0aC4gKi8KICAgICAgLmZvcmVncm91bmQgLnNlbGVjdGVkLXBhdGggewogICAgICAgIHN0cm9rZS13aWR0aDogMyAhaW1wb3J0YW50OwogICAgICAgIHN0cm9rZTogIzBmMCAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAjY29udGFpbmVyIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIHN2ZyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAuYXhpcyB0ZXh0IHsKICAgICAgICB0ZXh0LXNoYWRvdzogdmFyKC0tdGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtcGxvdC1heGlzLXNoYWRvdyk7CiAgICAgICAgZmlsbDogY3VycmVudENvbG9yOwogICAgICAgIGN1cnNvcjogbW92ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxPMHQucHJvdG90eXBlLCJzZXNzaW9uR3JvdXBzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLE8wdC5wcm90b3R5cGUsIm9wdGlvbnMiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3Qsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLE8wdC5wcm90b3R5cGUsInNlbGVjdGVkU2Vzc2lvbkdyb3VwIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0LG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxPMHQucHJvdG90eXBlLCJjbG9zZXN0U2Vzc2lvbkdyb3VwIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLE8wdC5wcm90b3R5cGUsInJlZHJhd0NvdW50Iix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxPMHQucHJvdG90eXBlLCJfdmFsaWRTZXNzaW9uR3JvdXBzIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLE8wdC5wcm90b3R5cGUsIl9pbnRlcmFjdGlvbk1hbmFnZXIiLHZvaWQgMCksdChbYSgib3B0aW9ucy4qIiwic2Vzc2lvbkdyb3Vwcy4qIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxPMHQucHJvdG90eXBlLCJfb3B0aW9uc09yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQiLG51bGwpLE8wdD10KFtpKCJ0Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90IildLE8wdCk7bGV0IHowdD1jbGFzcyBleHRlbmRzIHdle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLm9wdGlvbnM9bnVsbH1fY29uZmlndXJhdGlvbkNoYW5nZWQoKXtjb25zdCB0PXRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLGU9dGhpcy5jb25maWd1cmF0aW9uLnNjaGVtYSxuPXtjb2x1bW5zOnQuaHBhcmFtSW5mb3MubWFwKCgobixpKT0+KHtuYW1lOlRKdChuKSxpbmRleDppLGFic29sdXRlSW5kZXg6Qkp0KGUsdCxpKSxzY2FsZTp0aGlzLl9pc051bWVyaWNDb2x1bW4oaSk/IkxJTkVBUiI6Ik5PTl9OVU1FUklDIn0pKSkuY29uY2F0KHQubWV0cmljSW5mb3MubWFwKCgobixpKT0+e2NvbnN0IHI9aSt0LmhwYXJhbUluZm9zLmxlbmd0aDtyZXR1cm57c2NhbGU6IkxJTkVBUiIsbmFtZTpDSnQobiksaW5kZXg6cixhYnNvbHV0ZUluZGV4OkJKdChlLHQscil9fSkpKSxtaW5Db2xvcjoiIzAwMDBGRiIsbWF4Q29sb3I6IiNGRjAwMDAiLGNvbmZpZ3VyYXRpb246dGhpcy5jb25maWd1cmF0aW9ufTt0aGlzLnNldCgib3B0aW9ucyIsbiksV2koKSx0aGlzLnNldCgib3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXgiLHRoaXMuX2RlZmF1bHRDb2xvckJ5Q29sdW1uSW5kZXgoKSl9X3Vuc2VsZWN0RGlzYWJsZWRMb2dTY2FsZXMoKXtudWxsIT09dGhpcy5vcHRpb25zJiZ0aGlzLm9wdGlvbnMuY29sdW1ucy5mb3JFYWNoKCh0PT57Y29uc3QgZT0ib3B0aW9ucy5jb2x1bW5zLiIrdC5pbmRleDt0aGlzLl9hbGxvd0xvZ1NjYWxlKHQpfHwiTE9HIiE9PXQuc2NhbGV8fHRoaXMuc2V0KGUrIi5zY2FsZSIsIkxJTkVBUiIpfSkpfV9hbGxvd0xvZ1NjYWxlKHQpe2lmKCF0aGlzLl9pc051bWVyaWNDb2x1bW4odC5pbmRleCl8fCF0aGlzLnNlc3Npb25Hcm91cHMpcmV0dXJuITE7Y29uc3RbZSxuXT1WSnQodGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEsdGhpcy5zZXNzaW9uR3JvdXBzLHQuaW5kZXgpO3JldHVybiBlPjB8fG48MH1faXNOdW1lcmljQ29sdW1uKHQpe3JldHVybiB0Pj10aGlzLmNvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYS5ocGFyYW1JbmZvcy5sZW5ndGh8fCJEQVRBX1RZUEVfRkxPQVQ2NCI9PT10aGlzLmNvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYS5ocGFyYW1JbmZvc1t0XS50eXBlfV9kZWZhdWx0Q29sb3JCeUNvbHVtbkluZGV4KCl7aWYodGhpcy5jb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWEubWV0cmljSW5mb3MubGVuZ3RoPjApcmV0dXJuIHRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zLmxlbmd0aDtjb25zdCB0PXRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zLmZpbmRJbmRleCgodD0+IkRBVEFfVFlQRV9GTE9BVDY0Ij09PXQudHlwZSkpO3JldHVybi0xIT09dD90OnZvaWQgMH19O3owdC50ZW1wbGF0ZT14ZWAKICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtcGFuZWwiPgogICAgICA8IS0tICdDb2xvciBieScgZHJvcCBkb3duIG1lbnUgLS0+CiAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51CiAgICAgICAgbGFiZWw9IkNvbG9yIGJ5IgogICAgICAgIGlkPSJjb2xvckJ5RHJvcERvd25NZW51IgogICAgICAgIGhvcml6b250YWwtYWxpZ249ImxlZnQiCiAgICAgID4KICAgICAgICA8cGFwZXItbGlzdGJveAogICAgICAgICAgY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiCiAgICAgICAgICBzbG90PSJkcm9wZG93bi1jb250ZW50IgogICAgICAgICAgc2VsZWN0ZWQ9Int7b3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXh9fSIKICAgICAgICAgIGlkPSJjb2xvckJ5TGlzdEJveCIKICAgICAgICA+CiAgICAgICAgICA8dGVtcGxhdGUKICAgICAgICAgICAgaXM9ImRvbS1yZXBlYXQiCiAgICAgICAgICAgIGl0ZW1zPSJbW29wdGlvbnMuY29sdW1uc11dIgogICAgICAgICAgICBhcz0iY29sdW1uIgogICAgICAgICAgICBpZD0iY29sb3JCeUNvbHVtblRlbXBsYXRlIgogICAgICAgICAgPgogICAgICAgICAgICA8cGFwZXItaXRlbSBkaXNhYmxlZD0iW1shX2lzTnVtZXJpY0NvbHVtbihjb2x1bW4uaW5kZXgpXV0iPgogICAgICAgICAgICAgIFtbY29sdW1uLm5hbWVdXQogICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgoKICAgICAgPCEtLSBDb2x1bW5zIHNjYWxlcyAtLT4KICAgICAgPGRpdiBjbGFzcz0iY29sdW1ucy1jb250YWluZXIiPgogICAgICAgIDwhLS0gU2NhbGUgb3B0aW9ucyBmb3IgZWFjaCBudW1lcmljIGZlYXR1cmUgLS0+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tvcHRpb25zLmNvbHVtbnN9fSIgYXM9ImNvbHVtbiI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzTnVtZXJpY0NvbHVtbihjb2x1bW4uaW5kZXgpXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2x1bW4iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbHVtbi10aXRsZSI+W1tjb2x1bW4ubmFtZV1dPC9kaXY+CiAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1ncm91cAogICAgICAgICAgICAgICAgICBjbGFzcz0ic2NhbGUtcmFkaW8tZ3JvdXAiCiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkPSJ7e2NvbHVtbi5zY2FsZX19IgogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9IkxJTkVBUiI+CiAgICAgICAgICAgICAgICAgICAgTGluZWFyCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgICA8IS0tIFRoZSBpZCBoZXJlIGlzIHVzZWQgdG8gYWNjZXNzIHRoaXMgYnV0dG9uIGluIHVuaXQKICAgICAgICAgICAgICAgICAgICAgICB0ZXN0cy4tLT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbgogICAgICAgICAgICAgICAgICAgIGlkPSJsb2dTY2FsZUJ1dHRvbl9bW2NvbHVtbi5uYW1lXV0iCiAgICAgICAgICAgICAgICAgICAgbmFtZT0iTE9HIgogICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPSJbWyFfYWxsb3dMb2dTY2FsZShjb2x1bW4sIHNlc3Npb25Hcm91cHMuKildXSIKICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgIExvZ2FyaXRobWljCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9IlFVQU5USUxFIj4KICAgICAgICAgICAgICAgICAgICBRdWFudGlsZQogICAgICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5jb250cm9sLXBhbmVsIHsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgfQogICAgICAuY29sdW1uIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICAgICAgYm9yZGVyOiBzb2xpZCAxcHggZGFya2dyYXk7CiAgICAgICAgcGFkZGluZzogM3B4OwogICAgICB9CiAgICAgIC5jb2x1bW4tdGl0bGUgewogICAgICAgIC8qIEZpdCBldmVyeSB0aXRsZSBpbiBvbmUgbGluZSBzbyB0aGUgcmFkaW8gYm94ZXMgYWxpZ24gdmVydGljYWxseS4gKi8KICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICB9CiAgICAgIC5jb2x1bW5zLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9CiAgICAgIC5zY2FsZS1yYWRpby1ncm91cCBwYXBlci1yYWRpby1idXR0b24gewogICAgICAgIHBhZGRpbmc6IDJweDsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICBwYXBlci1saXN0Ym94IHsKICAgICAgICBtYXgtaGVpZ2h0OiAxNWVtOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sejB0LnByb3RvdHlwZSwiY29uZmlndXJhdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sejB0LnByb3RvdHlwZSwic2Vzc2lvbkdyb3VwcyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdCxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sejB0LnByb3RvdHlwZSwib3B0aW9ucyIsdm9pZCAwKSx0KFthKCJjb25maWd1cmF0aW9uLioiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLHowdC5wcm90b3R5cGUsIl9jb25maWd1cmF0aW9uQ2hhbmdlZCIsbnVsbCksdChbYSgic2Vzc2lvbkdyb3Vwcy4qIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSx6MHQucHJvdG90eXBlLCJfdW5zZWxlY3REaXNhYmxlZExvZ1NjYWxlcyIsbnVsbCksejB0PXQoW2koInRmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzIildLHowdCk7bGV0IEQwdD1jbGFzcyBleHRlbmRzIHdle19jbG9zZXN0T3JTZWxlY3RlZCh0LGUpe3JldHVybiBudWxsIT09dD90OmV9fTtEMHQudGVtcGxhdGU9eGVgCiAgICA8IS0tIENvbnRyb2xzIGJlaGF2aW9yIG9mIHBhcmFsbGVsIGNvb3JkaW5hdGVzIHBsb3QKICAgICAgICAgb3V0cHV0cyBzZXQgb3B0aW9ucyB0byB0aGUgX29wdGlvbnMgcHJvcGVydHkuCiAgICAgIC0tPgogICAgPGhwYXJhbXMtc3BsaXQtbGF5b3V0IG9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CiAgICAgIDwhLS0gVGhlIHNjYWxlIGFuZCBjb2xvciBjb250cm9scy4gLS0+CiAgICAgIDx0Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scwogICAgICAgIGlkPSJjb250cm9scyIKICAgICAgICBzbG90PSJjb250ZW50IgogICAgICAgIGNsYXNzPSJzZWN0aW9uIgogICAgICAgIGNvbmZpZ3VyYXRpb249IltbY29uZmlndXJhdGlvbl1dIgogICAgICAgIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSIKICAgICAgICBvcHRpb25zPSJ7e19vcHRpb25zfX0iCiAgICAgID4KICAgICAgPC90Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scz4KICAgICAgPCEtLSBUaGUgYWN0dWFsIHBhcmFsbGVsIGNvb3JkaW5hdGVzIHBsb3QgLS0+CiAgICAgIDx0Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy1wbG90CiAgICAgICAgaWQ9InBsb3QiCiAgICAgICAgc2xvdD0iY29udGVudCIKICAgICAgICBjbGFzcz0ic2VjdGlvbiIKICAgICAgICBzZXNzaW9uLWdyb3Vwcz0iW1tzZXNzaW9uR3JvdXBzXV0iCiAgICAgICAgc2VsZWN0ZWQtc2Vzc2lvbi1ncm91cD0ie3tfc2VsZWN0ZWRHcm91cH19IgogICAgICAgIGNsb3Nlc3Qtc2Vzc2lvbi1ncm91cD0ie3tfY2xvc2VzdEdyb3VwfX0iCiAgICAgICAgb3B0aW9ucz0iW1tfb3B0aW9uc11dIgogICAgICA+CiAgICAgIDwvdGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtcGxvdD4KICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMKICAgICAgICBpZD0idmFsdWVzIgogICAgICAgIHNsb3Q9ImNvbnRlbnQiCiAgICAgICAgY2xhc3M9InNlY3Rpb24iCiAgICAgICAgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iCiAgICAgICAgc2Vzc2lvbi1ncm91cD0iW1tfY2xvc2VzdE9yU2VsZWN0ZWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2Nsb3Nlc3RHcm91cCwgX3NlbGVjdGVkR3JvdXApXV0iCiAgICAgID4KICAgICAgPC90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtdmFsdWVzPgogICAgICA8dGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHMKICAgICAgICBpZD0iZGV0YWlscyIKICAgICAgICBzbG90PSJjb250ZW50IgogICAgICAgIGNsYXNzPSJzZWN0aW9uIgogICAgICAgIGJhY2tlbmQ9IltbYmFja2VuZF1dIgogICAgICAgIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIgogICAgICAgIHNlc3Npb24tZ3JvdXA9IltbX3NlbGVjdGVkR3JvdXBdXSIKICAgICAgICB2aXNpYmxlLXNjaGVtYT0iW1tjb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWFdXSIKICAgICAgPgogICAgICA8L3RmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC1kZXRhaWxzPgogICAgPC9ocGFyYW1zLXNwbGl0LWxheW91dD4KCiAgICA8c3R5bGU+CiAgICAgIC5zZWN0aW9uIHsKICAgICAgICBwYWRkaW5nOiAxMHB4OwogICAgICB9CiAgICAgICN2YWx1ZXMgewogICAgICAgIGhlaWdodDogMTE1cHg7CiAgICAgIH0KICAgICAgI2RldGFpbHMgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEQwdC5wcm90b3R5cGUsImJhY2tlbmQiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sRDB0LnByb3RvdHlwZSwiZXhwZXJpbWVudE5hbWUiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sRDB0LnByb3RvdHlwZSwiY29uZmlndXJhdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sRDB0LnByb3RvdHlwZSwic2Vzc2lvbkdyb3VwcyIsdm9pZCAwKSxEMHQ9dChbaSgidGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtdmlldyIpXSxEMHQpO2xldCBCMHQ9Y2xhc3MgZXh0ZW5kcyhjcih3ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLnNlbGVjdGVkU2Vzc2lvbkdyb3VwPW51bGwsdGhpcy5jbG9zZXN0U2Vzc2lvbkdyb3VwPW51bGwsdGhpcy5fY29udGFpbmVyPW51bGwsdGhpcy5fc3ZnPW51bGwsdGhpcy53aWR0aD0wLHRoaXMuaGVpZ2h0PTAsdGhpcy5fYnJ1c2hlZENlbGxJbmRleD1udWxsLHRoaXMuX2JydXNoU2VsZWN0aW9uPW51bGx9cmVhZHkoKXtzdXBlci5yZWFkeSgpLHRoaXMuX2NvbnRhaW5lcj10aGlzLiQuY29udGFpbmVyLHRoaXMuX3N2Zz1EdSh0aGlzLiQuc3ZnKSx0aGlzLl9yZWRyYXcoKX1fc2Vzc2lvbkdyb3Vwc0NoYW5nZWQoKXtudWxsIT09dGhpcy5zZWxlY3RlZFNlc3Npb25Hcm91cCYmKHRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXA9VUp0KHRoaXMuc2Vzc2lvbkdyb3Vwcyx0aGlzLnNlbGVjdGVkU2Vzc2lvbkdyb3VwLm5hbWUpfHxudWxsKSx0aGlzLl9yZWRyYXcoKX1fdmlzaWJsZVNjaGVtYUNoYW5nZWQoKXt0aGlzLl9icnVzaGVkQ2VsbEluZGV4PW51bGwsdGhpcy5fYnJ1c2hTZWxlY3Rpb249bnVsbCx0aGlzLl9yZWRyYXcoKX1fcmVkcmF3KCl7dGhpcy5kZWJvdW5jZSgiX3JlZHJhdyIsKCgpPT57Y29uc3QgdD1RSnQ7dGhpcy53aWR0aD1NYXRoLm1heCgxNTAqdC5udW1WaXNpYmxlQ29sdW1ucyh0aGlzLnZpc2libGVTY2hlbWEpLDEyMDApLHRoaXMuaGVpZ2h0PU1hdGgubWF4KDExMi41KnQubnVtVmlzaWJsZU1ldHJpY3ModGhpcy52aXNpYmxlU2NoZW1hKSw0ODApLHRoaXMuX2NvbnRhaW5lci5zdHlsZS53aWR0aD10aGlzLndpZHRoKyJweCIsdGhpcy5fY29udGFpbmVyLnN0eWxlLmhlaWdodD10aGlzLmhlaWdodCsicHgiLHRoaXMuX3N2Zy5hdHRyKCJ3aWR0aCIsdGhpcy53aWR0aCkuYXR0cigiaGVpZ2h0Iix0aGlzLmhlaWdodCksdGhpcy5fc3ZnLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpLHRoaXMuX2RyYXcoKX0pLDEwMCl9X2RyYXcoKXtjb25zdCB0PVFKdCxlPXRoaXM7aWYoIXRoaXMuc2Vzc2lvbkdyb3Vwc3x8MD09dGhpcy5zZXNzaW9uR3JvdXBzLmxlbmd0aHx8IXRoaXMudmlzaWJsZVNjaGVtYXx8MD09dGhpcy52aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zLmxlbmd0aClyZXR1cm47Y29uc3Qgbj1LbCh0Lm51bVZpc2libGVDb2x1bW5zKGUudmlzaWJsZVNjaGVtYSkpLGk9S2wodC5udW1WaXNpYmxlTWV0cmljcyhlLnZpc2libGVTY2hlbWEpKSxyPTgwLG89NTAsYT1YTSgpLmRvbWFpbihuKS5yYW5nZShbODUsdGhpcy53aWR0aC0xLTVdKS5wYWRkaW5nSW5uZXIoLjEpLHM9WE0oKS5kb21haW4oaSkucmFuZ2UoW3RoaXMuaGVpZ2h0LTEtNS1vLDVdKS5wYWRkaW5nSW5uZXIoLjEpLGw9YS5iYW5kd2lkdGgoKSxjPXMuYmFuZHdpZHRoKCksdT1uLm1hcCgodD0+ZS5fY2VsbFNjYWxlKHQsWzAsbC0xXSkpKSxoPWkubWFwKChuPT5lLl9jZWxsU2NhbGUobit0Lm51bVZpc2libGVIUGFyYW1zKGUudmlzaWJsZVNjaGVtYSksW2MtMSwwXSkpKSxkPXRoaXMuX3N2Zy5zZWxlY3RBbGwoIi54LWF4aXMiKS5kYXRhKG4pLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZCgieC1heGlzIiwhMCkuYXR0cigidHJhbnNmb3JtIiwoZT0+dC50cmFuc2xhdGVTdHIoYShlKSwwKSkpO2Z1bmN0aW9uIHAodCl7cmV0dXJuIngtYXhpcy1jbGlwLXBhdGgtIit0fWZ1bmN0aW9uIGYodCl7cmV0dXJuIngtbGFiZWwtY2xpcC1wYXRoLSIrdH1kLmFwcGVuZCgiY2xpcFBhdGgiKS5hdHRyKCJpZCIscCkuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsLTUpLmF0dHIoInkiLDApLmF0dHIoIndpZHRoIixsKzEwKS5hdHRyKCJoZWlnaHQiLGUuaGVpZ2h0LTI1KSxkLmFwcGVuZCgiY2xpcFBhdGgiKS5hdHRyKCJpZCIsZikuYXBwZW5kKCJyZWN0IikuYXR0cigieCIsMCkuYXR0cigieSIsZS5oZWlnaHQtMjUpLmF0dHIoIndpZHRoIixsKS5hdHRyKCJoZWlnaHQiLDI1KSxkLmFwcGVuZCgiZyIpLmF0dHIoImNsaXAtcGF0aCIsKHQ9PiJ1cmwoIyIrcCh0KSsiKSIpKS5lYWNoKChmdW5jdGlvbih0KXtEdSh0aGlzKS5jYWxsKHksdmModVt0XSkudGlja1NpemUoZS5oZWlnaHQtbyksbCw0MCxlLm9wdGlvbnMuY29sdW1uc1t0XS5zY2FsZSl9KSksZC5hcHBlbmQoImciKS5jbGFzc2VkKCJ4LWF4aXMtbGFiZWwiLCEwKS5hdHRyKCJjbGlwLXBhdGgiLCh0PT4idXJsKCMiK2YodCkrIikiKSkuYXBwZW5kKCJ0ZXh0IikuYXR0cigidGV4dC1hbmNob3IiLCJtaWRkbGUiKS5hdHRyKCJ4IixsLzIpLmF0dHIoInkiLGUuaGVpZ2h0LTEtMTIuNSkudGV4dCgobj0+dC5zY2hlbWFWaXNpYmxlQ29sdW1uTmFtZShlLnZpc2libGVTY2hlbWEsbikpKS5hcHBlbmQoInRpdGxlIikudGV4dCgobj0+dC5zY2hlbWFWaXNpYmxlQ29sdW1uTmFtZShlLnZpc2libGVTY2hlbWEsbikpKTtjb25zdCBtPXRoaXMuX3N2Zy5zZWxlY3RBbGwoIi55LWF4aXMiKS5kYXRhKGkpLmVudGVyKCkuYXBwZW5kKCJnIikuY2xhc3NlZCgieS1heGlzIiwhMCkuYXR0cigidHJhbnNmb3JtIiwobj0+dC50cmFuc2xhdGVTdHIoZS53aWR0aC0xLHMobikpKSk7ZnVuY3Rpb24gZyh0KXtyZXR1cm4ieS1heGlzLWNsaXAtcGF0aC0iK3R9ZnVuY3Rpb24gXyh0KXtyZXR1cm4ieS1sYWJlbC1jbGlwLXBhdGgtIit0fWZ1bmN0aW9uIHkodCxlLG4saSxyKXtjb25zdCBvPU1hdGguZmxvb3Iobi9pKSxhPWUuc2NhbGUoKTtpZigiUVVBTlRJTEUiPT09cil7bGV0IHQ9YS5xdWFudGlsZXMoKTtjb25zdCBuPU1hdGguY2VpbCh0Lmxlbmd0aC9vKTt0PUtsKDAsdC5sZW5ndGgsbikubWFwKChlPT50W2VdKSksZS50aWNrVmFsdWVzKHQpLnRpY2tGb3JtYXQoRHkoIi0uMmciKSl9IkxJTkVBUiIhPT1yJiYiTE9HIiE9PXJ8fGUudGlja3MobyksdC5jYWxsKGUpLHQuc2VsZWN0QWxsKCIuZG9tYWluIikucmVtb3ZlKCksdC5zZWxlY3RBbGwoIi50aWNrIGxpbmUiKS5hdHRyKCJzdHJva2UiLCIjZGRkIil9bS5hcHBlbmQoImNsaXBQYXRoIikuYXR0cigiaWQiLGcpLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLC0oZS53aWR0aC00MC0xKSkuYXR0cigieSIsLTUpLmF0dHIoIndpZHRoIixlLndpZHRoLTQwKS5hdHRyKCJoZWlnaHQiLGMrMTApLG0uYXBwZW5kKCJjbGlwUGF0aCIpLmF0dHIoImlkIixfKS5hcHBlbmQoInJlY3QiKS5hdHRyKCJ4IiwtKGUud2lkdGgtMSkpLmF0dHIoInkiLDApLmF0dHIoIndpZHRoIiw0MCkuYXR0cigiaGVpZ2h0IixjKSxtLmFwcGVuZCgiZyIpLmF0dHIoImNsaXAtcGF0aCIsKHQ9PiJ1cmwoIyIrZyh0KSsiKSIpKS5lYWNoKChmdW5jdGlvbihuKXtEdSh0aGlzKS5jYWxsKHksYmMoaFtuXSkudGlja1NpemUoZS53aWR0aC1yKSxjLDIwLGUub3B0aW9ucy5jb2x1bW5zW24rdC5udW1WaXNpYmxlSFBhcmFtcyhlLnZpc2libGVTY2hlbWEpXS5zY2FsZSl9KSksbS5hcHBlbmQoImciKS5jbGFzc2VkKCJ5LWF4aXMtbGFiZWwiLCEwKS5hdHRyKCJjbGlwLXBhdGgiLCh0PT4idXJsKCMiK18odCkrIikiKSkuYXBwZW5kKCJ0ZXh0IikuYXR0cigidGV4dC1hbmNob3IiLCJtaWRkbGUiKS5hdHRyKCJ4IiwtKGUud2lkdGgtMjAtMSkpLmF0dHIoInkiLGMvMikuYXR0cigidHJhbnNmb3JtIix0LnJvdGF0ZVN0cig5MCwtKGUud2lkdGgtMjAtMSksYy8yKSkudGV4dCgobj0+dC5tZXRyaWNOYW1lKGUudmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvc1tuXSkpKS5hcHBlbmQoInRpdGxlIikudGV4dCgobj0+dC5tZXRyaWNOYW1lKGUudmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvc1tuXSkpKTtjb25zdCB2PXRoaXMuX3N2Zy5zZWxlY3RBbGwoIi5jZWxsIikuZGF0YShGbChuLGkpKS5lbnRlcigpLmFwcGVuZCgiZyIpLmNsYXNzZWQoImNlbGwiLCEwKS5hdHRyKCJ0cmFuc2Zvcm0iLCgoW2Usbl0pPT50LnRyYW5zbGF0ZVN0cihhKGUpLHMobikpKSk7di5hcHBlbmQoImciKS5jbGFzc2VkKCJmcmFtZSIsITApLmFwcGVuZCgicmVjdCIpLmF0dHIoIngiLC01KS5hdHRyKCJ5IiwtNSkuYXR0cigid2lkdGgiLGwrMTApLmF0dHIoImhlaWdodCIsYysxMCkuYXR0cigic3Ryb2tlIiwiIzAwMCIpLmF0dHIoImZpbGwiLCJub25lIikuYXR0cigic2hhcGUtcmVuZGVyaW5nIiwiY3Jpc3BFZGdlcyIpO2xldCBiPW51bGw7dm9pZCAwIT09ZS5vcHRpb25zLmNvbG9yQnlDb2x1bW5JbmRleCYmKGI9Y0UoKS5kb21haW4odGhpcy5fY29sRXh0ZW50KHRoaXMub3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXgpKS5yYW5nZShbdGhpcy5vcHRpb25zLm1pbkNvbG9yLHRoaXMub3B0aW9ucy5tYXhDb2xvcl0pLmludGVycG9sYXRlKGtwKSk7Y29uc3QgeD12b2lkIDA9PT1lLm9wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4PygpPT4icmVkIjooe3Nlc3Npb25Hcm91cDp0fSk9PmIodGhpcy5fY29sVmFsdWUodCxlLm9wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4KSk7ZnVuY3Rpb24gdyh0LG4pe3JldHVybiB1W25dKGUuX2NvbFZhbHVlKHQsbikpfWZ1bmN0aW9uIFModCxuKXtyZXR1cm4gaFtuXShlLl9tZXRyaWNWYWx1ZSh0LG4pKX1jb25zdFtNLEUsVF09KGZ1bmN0aW9uIEModCxyKXtjb25zdCBvPXQuc2VsZWN0QWxsKCIuZGF0YS1tYXJrZXIiKS5kYXRhKCgoW3Qsbl0pPT5lLnNlc3Npb25Hcm91cHMuZmlsdGVyKChpPT52b2lkIDAhPT1lLl9jb2xWYWx1ZShpLHQpJiZ2b2lkIDAhPT1lLl9tZXRyaWNWYWx1ZShpLG4pKSkubWFwKChlPT4oe2NvbDp0LG1ldHJpYzpuLHNlc3Npb25Hcm91cDplLHg6dyhlLHQpLHk6UyhlLG4pLHNlc3Npb25Hcm91cE1hcmtlcnM6bnVsbH0pKSkpKS5lbnRlcigpLmFwcGVuZCgiY2lyY2xlIikuY2xhc3NlZCgiZGF0YS1tYXJrZXIiLCEwKS5hdHRyKCJjeCIsKCh7eDp0fSk9PnQpKS5hdHRyKCJjeSIsKCh7eTp0fSk9PnQpKS5hdHRyKCJyIiwyKS5hdHRyKCJmaWxsIixyKSxhPW5ldyBNYXA7ZS5zZXNzaW9uR3JvdXBzLmZvckVhY2goKHQ9PnthLnNldCh0LFtdKX0pKSxvLmVhY2goKGZ1bmN0aW9uKHQpe2EuZ2V0KHQuc2Vzc2lvbkdyb3VwKS5wdXNoKHRoaXMpfSkpLG8uZWFjaCgodD0+e2NvbnN0IGU9YS5nZXQodC5zZXNzaW9uR3JvdXApO3Quc2Vzc2lvbkdyb3VwTWFya2Vycz1uZXcgU2V0KGUpfSkpO2NvbnN0IHM9bi5tYXAoKHQ9PmkubWFwKChlPT5vLmZpbHRlcigobj0+bi5jb2w9PXQmJm4ubWV0cmljPT1lKSkpKSkpO3JldHVybltvLHMsYV19KSh2LmFwcGVuZCgiZyIpLHgpO2NvbnN0IEE9bi5tYXAoKHQ9PmkubWFwKChlPT4oZnVuY3Rpb24gbih0LGUpe2NvbnN0IG49W107cmV0dXJuIEVbdF1bZV0uZWFjaCgoZnVuY3Rpb24oKXtuLnB1c2godGhpcyl9KSksdHkoKS54KCh0PT5EdSh0KS5kYXR1bSgpLngpKS55KCh0PT5EdSh0KS5kYXR1bSgpLnkpKS5hZGRBbGwobil9KSh0LGUpKSkpKTtsZXQgaz1udWxsO1IoKSYmKGs9di5maWx0ZXIoKHQ9PkNlLmV4cG9ydHMuaXNFcXVhbCh0LGUuX2JydXNoZWRDZWxsSW5kZXgpKSksY29uc29sZS5hc3NlcnQoMT09ay5zaXplKCksaykpO2xldCBMPW5ldyBTZXQoTS5ub2RlcygpKTtmdW5jdGlvbiBQKCl7bGV0IG49bmV3IFNldChNLm5vZGVzKCkpOyhmdW5jdGlvbiBpKCl7cmV0dXJuIVIoKXx8ZS5fYnJ1c2hTZWxlY3Rpb25bMF1bMF09PT1lLl9icnVzaFNlbGVjdGlvblsxXVswXXx8ZS5fYnJ1c2hTZWxlY3Rpb25bMF1bMV09PT1lLl9icnVzaFNlbGVjdGlvblsxXVsxXX0pKCl8fChuPShmdW5jdGlvbiByKGUsbil7Y29uc29sZS5hc3NlcnQobnVsbCE9PWUpLGNvbnNvbGUuYXNzZXJ0KG51bGwhPT1uKTtjb25zdFtpLHJdPWUsbz1uZXcgU2V0O3JldHVybiB0LnF1YWRUcmVlVmlzaXRQb2ludHNJblJlY3QoQVtpXVtyXSxuWzBdWzBdLG5bMF1bMV0sblsxXVswXSxuWzFdWzFdLCh0PT57RHUodCkuZGF0dW0oKS5zZXNzaW9uR3JvdXBNYXJrZXJzLmZvckVhY2goKHQ9PntvLmFkZCh0KX0pKX0pKSxvfSkoZS5fYnJ1c2hlZENlbGxJbmRleCxlLl9icnVzaFNlbGVjdGlvbikpLHhoKEFycmF5LmZyb20odC5maWx0ZXJTZXQobiwodD0+IUwuaGFzKHQpKSkpKS5hdHRyKCJmaWxsIix4KSx4aChBcnJheS5mcm9tKHQuZmlsdGVyU2V0KEwsKHQ9PiFuLmhhcyh0KSkpKSkuYXR0cigiZmlsbCIsIiNkZGQiKSxMPW59UCgpO2NvbnN0IE49dmcoKS5leHRlbnQoW1stNCwtNF0sW2wtMSs1LTEsYy0xKzUtMV1dKS5vbigic3RhcnQiLChmdW5jdGlvbigpe1IoKSYmay5ub2RlKCkhPXRoaXMmJk4ubW92ZShrLG51bGwpLEkodGhpcyl9KSkub24oImJydXNoIiwoZnVuY3Rpb24oKXtJKHRoaXMpfSkpLm9uKCJlbmQiLChmdW5jdGlvbigpe0kodGhpcyl9KSk7ZnVuY3Rpb24gSSh0KXtjb25zdCBuPV9nKHQpOyFSKCkmJm51bGw9PT1ufHxSKCkmJnQ9PT1rLm5vZGUoKSYmQ2UuZXhwb3J0cy5pc0VxdWFsKG4sZS5fYnJ1c2hTZWxlY3Rpb24pfHwoZS5fYnJ1c2hTZWxlY3Rpb249bixudWxsIT09bj8oaz1EdSh0KSxlLl9icnVzaGVkQ2VsbEluZGV4PWsuZGF0dW0oKSk6KGs9bnVsbCxlLl9icnVzaGVkQ2VsbEluZGV4PW51bGwpLFAoKSl9ZnVuY3Rpb24gUigpe3JldHVybiBudWxsIT09ZS5fYnJ1c2hlZENlbGxJbmRleCYmbnVsbCE9PWUuX2JydXNoU2VsZWN0aW9ufXYuY2FsbChOKSxSKCkmJk4ubW92ZShrLGUuX2JydXNoU2VsZWN0aW9uKTtsZXQgTz1udWxsLHo9bnVsbDtudWxsIT09dGhpcy5zZWxlY3RlZFNlc3Npb25Hcm91cCYmKHo9eGgoVC5nZXQodGhpcy5zZWxlY3RlZFNlc3Npb25Hcm91cCkpLmNsYXNzZWQoInNlbGVjdGVkLW1hcmtlciIsITApKSx2Lm9uKCJjbGljayIsKGZ1bmN0aW9uKCl7Y29uc3QgdD1PPT09ej9udWxsOk87aWYodD09PXopcmV0dXJuO251bGwhPT16JiZ6LmNsYXNzZWQoInNlbGVjdGVkLW1hcmtlciIsITEpLHo9dCxudWxsIT09eiYmei5jbGFzc2VkKCJzZWxlY3RlZC1tYXJrZXIiLCEwKTtjb25zdCBuPW51bGw9PT16P251bGw6ei5kYXR1bSgpLnNlc3Npb25Hcm91cDtlLnNlbGVjdGVkU2Vzc2lvbkdyb3VwPW59KSkub24oIm1vdXNlbW92ZSBtb3VzZWVudGVyIiwoZnVuY3Rpb24oW24saV0pe2NvbnN0W3Isb109YmgodGhpcyksYT0oZnVuY3Rpb24gcyhlLG4saSxyLG8pe2xldCBhPTEvMCxzPW51bGw7aWYodC5xdWFkVHJlZVZpc2l0UG9pbnRzSW5EaXNrKEFbZV1bbl0saSxyLG8sKCh0LGUpPT57aWYoTC5oYXModCkmJmU8YSl7Y29uc3Qgbj1EdSh0KS5kYXR1bSgpO2E9ZSxzPW4uc2Vzc2lvbkdyb3VwfX0pKSxudWxsPT09cylyZXR1cm4gbnVsbDtyZXR1cm4geGgoVC5nZXQocykpfSkobixpLHIsbywyMCk7TyE9PWEmJihudWxsIT09TyYmTy5jbGFzc2VkKCJjbG9zZXN0LW1hcmtlciIsITEpLE89YSxudWxsIT09Tz8oTy5jbGFzc2VkKCJjbG9zZXN0LW1hcmtlciIsITApLGUuY2xvc2VzdFNlc3Npb25Hcm91cD1PLmRhdHVtKCkuc2Vzc2lvbkdyb3VwKTplLmNsb3Nlc3RTZXNzaW9uR3JvdXA9bnVsbCl9KSkub24oIm1vdXNlbGVhdmUiLChmdW5jdGlvbihbdCxuXSl7bnVsbCE9PU8mJihPLmNsYXNzZWQoImNsb3Nlc3QtbWFya2VyIiwhMSksTz1udWxsLGUuY2xvc2VzdFNlc3Npb25Hcm91cD1udWxsKX0pKSx0aGlzLl9zdmcuc2VsZWN0QWxsKCIqIikuY2xhc3NlZCgidGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QiLCEwKX1fY2VsbFNjYWxlKHQsZSl7Y29uc3Qgbj10aGlzLl9jb2xFeHRlbnQodCksaT1jRSgpLmRvbWFpbihuKS5yYW5nZShlKTtpZigiTElORUFSIj09PXRoaXMub3B0aW9ucy5jb2x1bW5zW3RdLnNjYWxlKXJldHVybiBpO2lmKCJMT0ciPT09dGhpcy5vcHRpb25zLmNvbHVtbnNbdF0uc2NhbGUpcmV0dXJuIG5bMF08PTAmJm5bMV0+PTA/aTp5RSgpLmRvbWFpbihuKS5yYW5nZShlKTtpZigiUVVBTlRJTEUiPT09dGhpcy5vcHRpb25zLmNvbHVtbnNbdF0uc2NhbGUpe2NvbnN0IG49KGVbMV0tZVswXSkvMTksaT1LbCgyMCkubWFwKCh0PT5lWzBdK24qdCkpO3JldHVybiBDRSgpLmRvbWFpbihDZS5leHBvcnRzLnVuaXEodGhpcy5zZXNzaW9uR3JvdXBzLm1hcCgoZT0+dGhpcy5fY29sVmFsdWUoZSx0KSkpKSkucmFuZ2UoaSl9aWYoIk5PTl9OVU1FUklDIj09PXRoaXMub3B0aW9ucy5jb2x1bW5zW3RdLnNjYWxlKXJldHVybiBLTSgpLmRvbWFpbihDZS5leHBvcnRzLnVuaXEodGhpcy5zZXNzaW9uR3JvdXBzLm1hcCgoZT0+dGhpcy5fY29sVmFsdWUoZSx0KSkpLnNvcnQoKSkpLnJhbmdlKGUpLnBhZGRpbmcoLjEpO3Rocm93IlVua25vd24gc2NhbGUgZm9yIGNvbHVtbjogIit0KyIuIG9wdGlvbnM6ICIrdGhpcy5vcHRpb25zfV9jb2xWYWx1ZSh0LGUpe3JldHVybiBXSnQodGhpcy52aXNpYmxlU2NoZW1hLHQsZSl9X21ldHJpY1ZhbHVlKHQsZSl7cmV0dXJuIEdKdCh0aGlzLnZpc2libGVTY2hlbWEsdCxlKX1fY29sRXh0ZW50KHQpe3JldHVybiBWSnQodGhpcy52aXNpYmxlU2NoZW1hLHRoaXMuc2Vzc2lvbkdyb3Vwcyx0KX19O0IwdC50ZW1wbGF0ZT14ZWAKICAgIDxkaXYgaWQ9ImNvbnRhaW5lciI+CiAgICAgIDxzdmcgaWQ9InN2ZyI+PC9zdmc+CiAgICA8L2Rpdj4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICBzdmcgewogICAgICAgIGZvbnQ6IDEwcHggc2Fucy1zZXJpZjsKICAgICAgfQoKICAgICAgdGV4dCB7CiAgICAgICAgZmlsbDogY3VycmVudENvbG9yOwogICAgICB9CgogICAgICAuZnJhbWUgcmVjdCB7CiAgICAgICAgc3Ryb2tlOiBjdXJyZW50Q29sb3I7CiAgICAgIH0KCiAgICAgIC8qIFRoZSBjbG9zZXN0IGRhdGEgcG9pbnQgbWFya2VyIHRvIHRoZSBtb3VzZSBwb2ludGVyLiBXZSB1c2UgIWltcG9ydGFudAogICAgICAgICB0byBvdmVycmlkZSB0aGUgaW5saW5lIHN0eWxlIHRoYXQgc2V0cyB0aGUgcmVndWxhciBzdHlsZSBvZiBhIG1hcmtlci4KICAgICAgKi8KICAgICAgLmNsb3Nlc3QtbWFya2VyIHsKICAgICAgICByOiA2ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZGF0YSBwb2ludCBtYXJrZXIuIFdlIHVzZSAhaW1wb3J0YW50IHRvCiAgICAgICAgIG92ZXJyaWRlIHRoZSBpbmxpbmUgc3R5bGUgdGhhdCBzZXRzIHRoZSByZWd1bGFyIHN0eWxlIG9mIGEgbWFya2VyLiAqLwogICAgICAuc2VsZWN0ZWQtbWFya2VyIHsKICAgICAgICByOiA2ICFpbXBvcnRhbnQ7CiAgICAgICAgZmlsbDogIzBmMCAhaW1wb3J0YW50OwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sQjB0LnByb3RvdHlwZSwidmlzaWJsZVNjaGVtYSIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sQjB0LnByb3RvdHlwZSwic2Vzc2lvbkdyb3VwcyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxCMHQucHJvdG90eXBlLCJvcHRpb25zIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0LG5vdGlmeTohMH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxCMHQucHJvdG90eXBlLCJzZWxlY3RlZFNlc3Npb25Hcm91cCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdCxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sQjB0LnByb3RvdHlwZSwiY2xvc2VzdFNlc3Npb25Hcm91cCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixIVE1MRWxlbWVudCldLEIwdC5wcm90b3R5cGUsIl9jb250YWluZXIiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sQjB0LnByb3RvdHlwZSwiX3N2ZyIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxCMHQucHJvdG90eXBlLCJ3aWR0aCIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxCMHQucHJvdG90eXBlLCJoZWlnaHQiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sQjB0LnByb3RvdHlwZSwiX2JydXNoZWRDZWxsSW5kZXgiLHZvaWQgMCksdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sQjB0LnByb3RvdHlwZSwiX2JydXNoU2VsZWN0aW9uIix2b2lkIDApLHQoW2EoInNlc3Npb25Hcm91cHMuKiIpLGUoImRlc2lnbjp0eXBlIixGdW5jdGlvbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKSxlKCJkZXNpZ246cmV0dXJudHlwZSIsdm9pZCAwKV0sQjB0LnByb3RvdHlwZSwiX3Nlc3Npb25Hcm91cHNDaGFuZ2VkIixudWxsKSx0KFthKCJ2aXNpYmxlU2NoZW1hLioiKSxlKCJkZXNpZ246dHlwZSIsRnVuY3Rpb24pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSksZSgiZGVzaWduOnJldHVybnR5cGUiLHZvaWQgMCldLEIwdC5wcm90b3R5cGUsIl92aXNpYmxlU2NoZW1hQ2hhbmdlZCIsbnVsbCksdChbYSgib3B0aW9ucy4qIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxCMHQucHJvdG90eXBlLCJfcmVkcmF3IixudWxsKSxCMHQ9dChbaSgidGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QiKV0sQjB0KTtsZXQgSDB0PWNsYXNzIGV4dGVuZHMgd2V7X2Nsb3Nlc3RPclNlbGVjdGVkKHQsZSl7cmV0dXJuIG51bGwhPT10P3Q6ZX19O0gwdC50ZW1wbGF0ZT14ZWAKICAgIDxocGFyYW1zLXNwbGl0LWxheW91dCBvcmllbnRhdGlvbj0idmVydGljYWwiPgogICAgICA8IS0tIENvbnRyb2xzIGJlaGF2aW9yIG9mIHRoZSBzY2F0dGVyIHBsb3QgbWF0cml4CiAgICAgICAgICAgICBvdXRwdXRzIHRoZSBjb25maWd1cmVkIG9wdGlvbnMgdG8gdGhlIF9vcHRpb25zIHByb3BlcnR5LiAtLT4KICAgICAgPHRmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzCiAgICAgICAgc2xvdD0iY29udGVudCIKICAgICAgICBjbGFzcz0ic2VjdGlvbiIKICAgICAgICBpZD0iY29udHJvbHMiCiAgICAgICAgY29uZmlndXJhdGlvbj0iW1tjb25maWd1cmF0aW9uXV0iCiAgICAgICAgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIgogICAgICAgIG9wdGlvbnM9Int7X29wdGlvbnN9fSIKICAgICAgPgogICAgICA8L3RmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzPgogICAgICA8IS0tIFRoZSBhY3R1YWwgc2NhdHRlciBwbG90IG1hdHJpeCAtLT4KICAgICAgPHRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90CiAgICAgICAgc2xvdD0iY29udGVudCIKICAgICAgICBjbGFzcz0ic2VjdGlvbiIKICAgICAgICBpZD0icGxvdCIKICAgICAgICB2aXNpYmxlLXNjaGVtYT0iW1tjb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWFdXSIKICAgICAgICBzZXNzaW9uLWdyb3Vwcz0iW1tzZXNzaW9uR3JvdXBzXV0iCiAgICAgICAgc2VsZWN0ZWQtc2Vzc2lvbi1ncm91cD0ie3tfc2VsZWN0ZWRHcm91cH19IgogICAgICAgIGNsb3Nlc3Qtc2Vzc2lvbi1ncm91cD0ie3tfY2xvc2VzdEdyb3VwfX0iCiAgICAgICAgb3B0aW9ucz0iW1tfb3B0aW9uc11dIgogICAgICA+CiAgICAgIDwvdGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3Q+CiAgICAgIDx0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtdmFsdWVzCiAgICAgICAgc2xvdD0iY29udGVudCIKICAgICAgICBjbGFzcz0ic2VjdGlvbiIKICAgICAgICBpZD0idmFsdWVzIgogICAgICAgIHZpc2libGUtc2NoZW1hPSJbW2NvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYV1dIgogICAgICAgIHNlc3Npb24tZ3JvdXA9IltbX2Nsb3Nlc3RPclNlbGVjdGVkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY2xvc2VzdEdyb3VwLCBfc2VsZWN0ZWRHcm91cCldXSIKICAgICAgPgogICAgICA8L3RmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXM+CiAgICAgIDwhLS0gU2hvd3Mgc2Vzc2lvbiBncm91cCBkZXRhaWxzIGZvciB0aGUgY2xpY2tlZCBtYXJrZXIuIC0tPgogICAgICA8dGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHMKICAgICAgICBzbG90PSJjb250ZW50IgogICAgICAgIGNsYXNzPSJzZWN0aW9uIgogICAgICAgIGlkPSJkZXRhaWxzIgogICAgICAgIGJhY2tlbmQ9IltbYmFja2VuZF1dIgogICAgICAgIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIgogICAgICAgIHNlc3Npb24tZ3JvdXA9IltbX3NlbGVjdGVkR3JvdXBdXSIKICAgICAgICB2aXNpYmxlLXNjaGVtYT0iW1tjb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWFdXSIKICAgICAgPgogICAgICA8L3RmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC1kZXRhaWxzPgogICAgPC9ocGFyYW1zLXNwbGl0LWxheW91dD4KICAgIDxzdHlsZT4KICAgICAgLnNlY3Rpb24gewogICAgICAgIHBhZGRpbmc6IDEwcHg7CiAgICAgIH0KICAgICAgI2NvbnRyb2xzIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjcGxvdCB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgbWF4LWhlaWdodDogZml0LWNvbnRlbnQ7CiAgICAgIH0KICAgICAgI3ZhbHVlcyB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgaGVpZ2h0OiAxMTVweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG1heC1oZWlnaHQ6IGZpdC1jb250ZW50OwogICAgICB9CiAgICAgICNkZXRhaWxzIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICB2YWFkaW4tc3BsaXQtbGF5b3V0IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxIMHQucHJvdG90eXBlLCJiYWNrZW5kIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLEgwdC5wcm90b3R5cGUsImV4cGVyaW1lbnROYW1lIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEgwdC5wcm90b3R5cGUsImNvbmZpZ3VyYXRpb24iLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLEgwdC5wcm90b3R5cGUsInNlc3Npb25Hcm91cHMiLHZvaWQgMCksSDB0PXQoW2koInRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3IildLEgwdCk7bGV0IEYwdD1jbGFzcyBleHRlbmRzIHdle2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9zZWxlY3RlZFRhYj0wfX07RjB0LnRlbXBsYXRlPXhlYAogICAgPHBhcGVyLWhlYWRlci1wYW5lbD4KICAgICAgPHBhcGVyLXRvb2xiYXIgc2xvdD0iaGVhZGVyIiBjbGFzcz0idGFiLWJhciI+CiAgICAgICAgPHBhcGVyLXRhYnMgc2VsZWN0ZWQ9Int7X3NlbGVjdGVkVGFifX0iIHNsb3Q9InRvcCI+CiAgICAgICAgICA8IS0tIHZpZXctaWQgY2FuIGJlIHVzZWQgYnkgaW50ZWdyYXRpb24gdGVzdHMgdG8gbG9jYXRlIGEgdGFiLgogICAgICAgICAgICAgICBJdCBzaG91bGQgYmUgdGhlIG5hbWUgb2YgdGhlIHJvb3QgZWxlbWVudCBpbXBsZW1lbnRpbmcgdGhlIHZpZXcKICAgICAgICAgICAgICAgd2l0aG91dCB0aGUgJ3RmLWhwYXJhbXMtJyBwcmVmaXguIC0tPgogICAgICAgICAgPHBhcGVyLXRhYiB2aWV3LWlkPSJ0YWJsZS12aWV3Ij4gVEFCTEUgVklFVyA8L3BhcGVyLXRhYj4KICAgICAgICAgIDxwYXBlci10YWIgdmlldy1pZD0icGFyYWxsZWwtY29vcmRzLXZpZXciPgogICAgICAgICAgICBQQVJBTExFTCBDT09SRElOQVRFUyBWSUVXCiAgICAgICAgICA8L3BhcGVyLXRhYj4KICAgICAgICAgIDxwYXBlci10YWIgdmlldy1pZD0ic2NhdHRlci1wbG90LW1hdHJpeC12aWV3Ij4KICAgICAgICAgICAgU0NBVFRFUiBQTE9UIE1BVFJJWCBWSUVXCiAgICAgICAgICA8L3BhcGVyLXRhYj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlbHAtYW5kLWZlZWRiYWNrIj4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2J1Z1JlcG9ydFVybF1dIj4KICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZiQ9IltbYnVnUmVwb3J0VXJsXV0iCiAgICAgICAgICAgICAgICB0YXJnZXQ9Il9ibGFuayIKICAgICAgICAgICAgICAgIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgICAgIGlkPSJidWctcmVwb3J0IgogICAgICAgICAgICAgICAgICByYWlzZWQKICAgICAgICAgICAgICAgICAgdGl0bGU9IlNlbmQgYSBidWcgcmVwb3J0IG9yIGZlYXR1cmUgcmVxdWVzdCIKICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgQnVnIFJlcG9ydCAvIEZlYXR1cmUgUmVxdWVzdAogICAgICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaGVscFVybF1dIj4KICAgICAgICAgICAgICA8YSBocmVmJD0iW1toZWxwVXJsXV0iIHRhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIG5vcmVmZXJyZXIiPgogICAgICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgICAgICAgICAgIGljb249ImhlbHAtb3V0bGluZSIKICAgICAgICAgICAgICAgICAgdGl0bGU9IlZpZXcgZG9jdW1lbnRhdGlvbiIKICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9wYXBlci10YWJzPgogICAgICA8L3BhcGVyLXRvb2xiYXI+CiAgICAgIDxpcm9uLXBhZ2VzIHNlbGVjdGVkPSJbW19zZWxlY3RlZFRhYl1dIiBjbGFzcz0iZml0IHRhYi12aWV3Ij4KICAgICAgICA8ZGl2IGlkPSIwIiBjbGFzcz0idGFiIj4KICAgICAgICAgIDx0Zi1ocGFyYW1zLXRhYmxlLXZpZXcKICAgICAgICAgICAgYmFja2VuZD0iW1tiYWNrZW5kXV0iCiAgICAgICAgICAgIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIgogICAgICAgICAgICB2aXNpYmxlLXNjaGVtYT0iW1tjb25maWd1cmF0aW9uLnZpc2libGVTY2hlbWFdXSIKICAgICAgICAgICAgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIgogICAgICAgICAgICBlbmFibGUtc2hvdy1tZXRyaWNzCiAgICAgICAgICA+CiAgICAgICAgICA8L3RmLWhwYXJhbXMtdGFibGUtdmlldz4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSIxIiBjbGFzcz0idGFiIj4KICAgICAgICAgIDx0Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy12aWV3CiAgICAgICAgICAgIGJhY2tlbmQ9IltbYmFja2VuZF1dIgogICAgICAgICAgICBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIKICAgICAgICAgICAgY29uZmlndXJhdGlvbj0iW1tjb25maWd1cmF0aW9uXV0iCiAgICAgICAgICAgIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSIKICAgICAgICAgID4KICAgICAgICAgIDwvdGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtdmlldz4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGlkPSIyIiBjbGFzcz0idGFiIj4KICAgICAgICAgIDx0Zi1ocGFyYW1zLXNjYXR0ZXItcGxvdC1tYXRyaXgtdmlldwogICAgICAgICAgICBiYWNrZW5kPSJbW2JhY2tlbmRdXSIKICAgICAgICAgICAgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iCiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb249IltbY29uZmlndXJhdGlvbl1dIgogICAgICAgICAgICBzZXNzaW9uLWdyb3Vwcz0iW1tzZXNzaW9uR3JvdXBzXV0iCiAgICAgICAgICA+CiAgICAgICAgICA8L3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3PgogICAgICAgIDwvZGl2PgogICAgICA8L2lyb24tcGFnZXM+CiAgICA8L3BhcGVyLWhlYWRlci1wYW5lbD4KCiAgICA8c3R5bGU+CiAgICAgIC50YWItdmlldyB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIC50YWItYmFyIHsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoCiAgICAgICAgICAtLXRiLXRvb2xiYXItYmFja2dyb3VuZC1jb2xvciwKICAgICAgICAgIHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpCiAgICAgICAgKTsKICAgICAgfQogICAgICAudGFiIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgcGFwZXItdGFicyB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICAtLXBhcGVyLXRhYnMtc2VsZWN0aW9uLWJhci1jb2xvcjogd2hpdGU7CiAgICAgICAgLS1wYXBlci10YWJzLWNvbnRlbnQ6IHsKICAgICAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgICAgIH0KICAgICAgfQogICAgICB0Zi1ocGFyYW1zLXRhYmxlLXZpZXcgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICAuaGVscC1hbmQtZmVlZGJhY2sgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OyAvKiBFbnN1cmUgdGhhdCBpY29ucyBzdGF5IGFsaWduZWQgKi8KICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICB9CiAgICAgICNidWctcmVwb3J0IHsKICAgICAgICBib3JkZXI6IHNvbGlkIGJsYWNrOwogICAgICAgIGJhY2tncm91bmQ6IHJlZDsKICAgICAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgICAgIHdvcmQtYnJlYWs6IGJyZWFrLXdvcmRzOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBtYXgtd2lkdGg6IDE1MHB4OwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KICAgICAgLmhlbHAtYW5kLWZlZWRiYWNrIGEgewogICAgICAgIGNvbG9yOiB3aGl0ZTsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYCx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxGMHQucHJvdG90eXBlLCJiYWNrZW5kIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLEYwdC5wcm90b3R5cGUsImhlbHBVcmwiLHZvaWQgMCksdChbbyh7dHlwZTpTdHJpbmd9KSxlKCJkZXNpZ246dHlwZSIsU3RyaW5nKV0sRjB0LnByb3RvdHlwZSwiYnVnUmVwb3J0VXJsIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLEYwdC5wcm90b3R5cGUsImV4cGVyaW1lbnROYW1lIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEYwdC5wcm90b3R5cGUsImNvbmZpZ3VyYXRpb24iLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheX0pLGUoImRlc2lnbjp0eXBlIixBcnJheSldLEYwdC5wcm90b3R5cGUsInNlc3Npb25Hcm91cHMiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sRjB0LnByb3RvdHlwZSwiX3NlbGVjdGVkVGFiIix2b2lkIDApLEYwdD10KFtpKCJ0Zi1ocGFyYW1zLXNlc3Npb25zLXBhbmUiKV0sRjB0KTtsZXQgVjB0PWNsYXNzIGV4dGVuZHMoY3Iod2UpKXtyZWxvYWQoKXt0aGlzLiRbInF1ZXJ5LXBhbmUiXS5yZWxvYWQoKX19O1YwdC50ZW1wbGF0ZT14ZWAKICAgIDxocGFyYW1zLXNwbGl0LWxheW91dD4KICAgICAgPGRpdiBzbG90PSJjb250ZW50IiBjbGFzcz0ic2lkZWJhciI+CiAgICAgICAgPHRmLWhwYXJhbXMtcXVlcnktcGFuZQogICAgICAgICAgaWQ9InF1ZXJ5LXBhbmUiCiAgICAgICAgICBiYWNrZW5kPSJbW2JhY2tlbmRdXSIKICAgICAgICAgIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIgogICAgICAgICAgY29uZmlndXJhdGlvbj0ie3tfY29uZmlndXJhdGlvbn19IgogICAgICAgICAgc2Vzc2lvbi1ncm91cHM9Int7X3Nlc3Npb25Hcm91cHN9fSIKICAgICAgICAgIGRhdGEtbG9hZGVkLXdpdGgtbm9uLWVtcHR5LWhwYXJhbXM9Int7X2RhdGFMb2FkZWRXaXRoTm9uRW1wdHlIcGFyYW1zfX0iCiAgICAgICAgICBkYXRhLWxvYWRlZC13aXRoLWVtcHR5LWhwYXJhbXM9Int7X2RhdGFMb2FkZWRXaXRoRW1wdHlIcGFyYW1zfX0iCiAgICAgICAgPgogICAgICAgIDwvdGYtaHBhcmFtcy1xdWVyeS1wYW5lPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzbG90PSJjb250ZW50IiBjbGFzcz0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFMb2FkZWRXaXRoRW1wdHlIcGFyYW1zXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIGhwYXJhbXMgZGF0YSB3YXMgZm91bmQuPC9oMz4KICAgICAgICAgICAgPHA+UHJvYmFibGUgY2F1c2VzOjwvcD4KICAgICAgICAgICAgPHVsPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IGhwYXJhbXMgZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgRXZlbnQgZmlsZXMgYXJlIHN0aWxsIGJlaW5nIGxvYWRlZCAodHJ5IHJlbG9hZGluZyB0aGlzIHBhZ2UpLgogICAgICAgICAgICAgIDwvbGk+CiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiCiAgICAgICAgICAgICAgICA+UkVBRE1FPC9hCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIgogICAgICAgICAgICAgICAgPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hCiAgICAgICAgICAgICAgPi4KICAgICAgICAgICAgPC9wPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyIKICAgICAgICAgICAgICAgID50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICA8L3A+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFMb2FkZWRXaXRoTm9uRW1wdHlIcGFyYW1zXV0iPgogICAgICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbnMtcGFuZQogICAgICAgICAgICBpZD0ic2Vzc2lvbnMtcGFuZSIKICAgICAgICAgICAgYmFja2VuZD0iW1tiYWNrZW5kXV0iCiAgICAgICAgICAgIGhlbHAtdXJsPSJbW2hlbHBVcmxdXSIKICAgICAgICAgICAgYnVnLXJlcG9ydC11cmw9IltbYnVnUmVwb3J0VXJsXV0iCiAgICAgICAgICAgIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIgogICAgICAgICAgICBjb25maWd1cmF0aW9uPSJbW19jb25maWd1cmF0aW9uXV0iCiAgICAgICAgICAgIHNlc3Npb24tZ3JvdXBzPSJbW19zZXNzaW9uR3JvdXBzXV0iCiAgICAgICAgICA+CiAgICAgICAgICA8L3RmLWhwYXJhbXMtc2Vzc2lvbnMtcGFuZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvaHBhcmFtcy1zcGxpdC1sYXlvdXQ+CiAgICA8c3R5bGU+CiAgICAgIGhwYXJhbXMtc3BsaXQtbGF5b3V0IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLnNpZGViYXIgewogICAgICAgIHdpZHRoOiAyMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBtaW4td2lkdGg6IDEwJTsKICAgICAgfQoKICAgICAgLmNlbnRlciB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIHdpZHRoOiA4MCU7CiAgICAgIH0KCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQoKICAgICAgYSB7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLWxpbmspOwogICAgICB9CgogICAgICBhOnZpc2l0ZWQgewogICAgICAgIGNvbG9yOiB2YXIoLS10Yi1saW5rLXZpc2l0ZWQpOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsTUp0KV0sVjB0LnByb3RvdHlwZSwiYmFja2VuZCIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxWMHQucHJvdG90eXBlLCJleHBlcmltZW50TmFtZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxWMHQucHJvdG90eXBlLCJoZWxwVXJsIix2b2lkIDApLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLFYwdC5wcm90b3R5cGUsImJ1Z1JlcG9ydFVybCIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxWMHQucHJvdG90eXBlLCJfY29uZmlndXJhdGlvbiIsdm9pZCAwKSx0KFtvKHt0eXBlOkFycmF5fSksZSgiZGVzaWduOnR5cGUiLEFycmF5KV0sVjB0LnByb3RvdHlwZSwiX3Nlc3Npb25Hcm91cHMiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxWMHQucHJvdG90eXBlLCJfZGF0YUxvYWRlZFdpdGhOb25FbXB0eUhwYXJhbXMiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxWMHQucHJvdG90eXBlLCJfZGF0YUxvYWRlZFdpdGhFbXB0eUhwYXJhbXMiLHZvaWQgMCksVjB0PXQoW2koInRmLWhwYXJhbXMtbWFpbiIpXSxWMHQpO2NvbnN0IFUwdD0idHJ1ZSI9PT1uZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpLmdldCgidGVuc29yYm9hcmRDb2xhYiIpO2xldCBqMHQ9Y2xhc3MgZXh0ZW5kcyhjcih3ZSkpe2NvbnN0cnVjdG9yKCl7c3VwZXIoLi4uYXJndW1lbnRzKSx0aGlzLl9iYWNrZW5kPW5ldyBNSnQoRXIoKS5wbHVnaW5Sb3V0ZSgiaHBhcmFtcyIsIiIpLG5ldyBicixVMHQpfXJlbG9hZCgpe3RoaXMuJFsiaHBhcmFtcy1tYWluIl0ucmVsb2FkKCl9fTtqMHQudGVtcGxhdGU9eGVgCiAgICA8IS0tIFRlbnNvckJvYXJkIGRvZXMgbm90IHNwZWNpZnkgYW4gZXhwZXJpbWVudE5hbWUuIEN1cnJlbnRseSBpdCBvbmx5CiAgICAgICAgIHN1cHBvcnRzIG9uZSBleHBlcmltZW50IHBlciBpbnZvY2F0aW9uLiAtLT4KICAgIDx0Zi1ocGFyYW1zLW1haW4KICAgICAgaWQ9ImhwYXJhbXMtbWFpbiIKICAgICAgYmFja2VuZD0iW1tfYmFja2VuZF1dIgogICAgICBleHBlcmltZW50LW5hbWU9IiIKICAgID4KICAgIDwvdGYtaHBhcmFtcy1tYWluPgogIGAsdChbbyh7dHlwZTpPYmplY3R9KSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KV0sajB0LnByb3RvdHlwZSwiX2JhY2tlbmQiLHZvaWQgMCksajB0PXQoW2koInRmLWhwYXJhbXMtZGFzaGJvYXJkIildLGowdCk7bGV0IEcwdD1jbGFzcyBleHRlbmRzKGNyKHdlKSl7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuYWN0dWFsU2l6ZT0hMSx0aGlzLmJyaWdodG5lc3NBZGp1c3RtZW50PS41LHRoaXMuY29udHJhc3RQZXJjZW50YWdlPTAsdGhpcy5fbWV0YWRhdGFDYW5jZWxsZXI9bmV3IHhPLHRoaXMuX2ltYWdlQ2FuY2VsbGVyPW5ldyB4Tyx0aGlzLl9zdGVwcz1bXSx0aGlzLl9pc0ltYWdlTG9hZGluZz0hMX1nZXQgX3J1bkNvbG9yKCl7cmV0dXJuIF9PKHRoaXMucnVuKX1nZXQgX2hhc0F0TGVhc3RPbmVTdGVwKCl7dmFyIHQ9dGhpcy5fc3RlcHM7cmV0dXJuISF0JiZ0Lmxlbmd0aD4wfWdldCBfaGFzTXVsdGlwbGVTdGVwcygpe3ZhciB0PXRoaXMuX3N0ZXBzO3JldHVybiEhdCYmdC5sZW5ndGg+MX1nZXQgX2N1cnJlbnRTdGVwKCl7cmV0dXJuIHRoaXMuX3N0ZXBzW3RoaXMuX3N0ZXBJbmRleF18fG51bGx9Z2V0IF9zdGVwVmFsdWUoKXt2YXIgdD10aGlzLl9jdXJyZW50U3RlcDtyZXR1cm4gdD90LnN0ZXA6MH1nZXQgX2N1cnJlbnRXYWxsVGltZSgpe3ZhciB0PXRoaXMuX2N1cnJlbnRTdGVwO3JldHVybiB0P1NPKHQud2FsbF90aW1lKToiIn1nZXQgX21heFN0ZXBJbmRleCgpe3JldHVybiB0aGlzLl9zdGVwcy5sZW5ndGgtMX1nZXQgX3NhbXBsZVRleHQoKXtyZXR1cm5gJHt0aGlzLnNhbXBsZSsxfWB9Z2V0IF9oYXNNdWx0aXBsZVNhbXBsZXMoKXtyZXR1cm4gdGhpcy5vZlNhbXBsZXM+MX1fZ2V0QXJpYUV4cGFuZGVkKCl7cmV0dXJuIHRoaXMuYWN0dWFsU2l6ZT8idHJ1ZSI6ImZhbHNlIn1hdHRhY2hlZCgpe3RoaXMucmVsb2FkKCl9cmVsb2FkKCl7aWYoIXRoaXMuaXNBdHRhY2hlZClyZXR1cm47dGhpcy5fbWV0YWRhdGFDYW5jZWxsZXIuY2FuY2VsQWxsKCk7Y29uc3QgdD1QTyhFcigpLnBsdWdpblJvdXRlKCJpbWFnZXMiLCIvaW1hZ2VzIikse3RhZzp0aGlzLnRhZyxydW46dGhpcy5ydW4sc2FtcGxlOnRoaXMuc2FtcGxlfSksZT10aGlzLl9tZXRhZGF0YUNhbmNlbGxlci5jYW5jZWxsYWJsZSgodD0+e2lmKHQuY2FuY2VsbGVkKXJldHVybjtjb25zdCBlPXQudmFsdWUubWFwKHRoaXMuX2NyZWF0ZVN0ZXBEYXR1bS5iaW5kKHRoaXMpKTt0aGlzLnNldCgiX3N0ZXBzIixlKSx0aGlzLnNldCgiX3N0ZXBJbmRleCIsZS5sZW5ndGgtMSl9KSk7dGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHQpLnRoZW4oZSl9X2NyZWF0ZVN0ZXBEYXR1bSh0KXtsZXQgZT1FcigpLnBsdWdpblJvdXRlKCJpbWFnZXMiLCIvaW5kaXZpZHVhbEltYWdlIik7cmV0dXJuIGU9UE8oZSx7dHM6dC53YWxsX3RpbWV9KSxlKz0iJiIrdC5xdWVyeSx7d2FsbF90aW1lOm5ldyBEYXRlKDFlMyp0LndhbGxfdGltZSksc3RlcDp0LnN0ZXAsdXJsOmV9fV91cGRhdGVJbWFnZVVybCgpe3ZhciB0PXRoaXMuX2N1cnJlbnRTdGVwLGU9dGhpcy5icmlnaHRuZXNzQWRqdXN0bWVudCxuPXRoaXMuY29udHJhc3RQZXJjZW50YWdlO2lmKCF0KXJldHVybjtjb25zdCBpPW5ldyBJbWFnZTt0aGlzLl9pbWFnZUNhbmNlbGxlci5jYW5jZWxBbGwoKSxpLm9ubG9hZD1pLm9uZXJyb3I9dGhpcy5faW1hZ2VDYW5jZWxsZXIuY2FuY2VsbGFibGUoKHQ9PntpZih0LmNhbmNlbGxlZClyZXR1cm47Y29uc3QgZT10aGlzLiQkKCIjbWFpbi1pbWFnZS1jb250YWluZXIiKTtlLnRleHRDb250ZW50PSIiLGVyKGUpLmFwcGVuZENoaWxkKGkpLHRoaXMuc2V0KCJfaXNJbWFnZUxvYWRpbmciLCExKX0pKS5iaW5kKHRoaXMpLGkuc3R5bGUuZmlsdGVyPWBjb250cmFzdCgke259JSkgYCxpLnN0eWxlLmZpbHRlcis9YGJyaWdodG5lc3MoJHtlfSlgLHRoaXMuc2V0KCJfaXNJbWFnZUxvYWRpbmciLCEwKSxpLnNyYz10LnVybH1faGFuZGxlVGFwKHQpe3RoaXMuc2V0KCJhY3R1YWxTaXplIiwhdGhpcy5hY3R1YWxTaXplKX1fdG9Mb2NhbGVTdHJpbmcodCl7cmV0dXJuIHQudG9Mb2NhbGVTdHJpbmcoKX19O0cwdC50ZW1wbGF0ZT14ZWAKICAgIDx0Zi1jYXJkLWhlYWRpbmcKICAgICAgdGFnPSJbW3RhZ11dIgogICAgICBydW49IltbcnVuXV0iCiAgICAgIGRpc3BsYXktbmFtZT0iW1t0YWdNZXRhZGF0YS5kaXNwbGF5TmFtZV1dIgogICAgICBkZXNjcmlwdGlvbj0iW1t0YWdNZXRhZGF0YS5kZXNjcmlwdGlvbl1dIgogICAgICBjb2xvcj0iW1tfcnVuQ29sb3JdXSIKICAgID4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19oYXNNdWx0aXBsZVNhbXBsZXNdXSI+CiAgICAgICAgPGRpdj5zYW1wbGU6IFtbX3NhbXBsZVRleHRdXSBvZiBbW29mU2FtcGxlc11dPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzQXRMZWFzdE9uZVN0ZXBdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1sYWJlbCI+CiAgICAgICAgICAgIHN0ZXAKICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0OiBib2xkIgogICAgICAgICAgICAgID5bW190b0xvY2FsZVN0cmluZyhfc3RlcFZhbHVlKV1dPC9zcGFuCiAgICAgICAgICAgID4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1sYWJlbCBoZWFkaW5nLXJpZ2h0IGRhdGV0aW1lIj4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19jdXJyZW50V2FsbFRpbWVdXSI+CiAgICAgICAgICAgICAgW1tfY3VycmVudFdhbGxUaW1lXV0KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ibGFiZWwgcmlnaHQiPgogICAgICAgICAgICA8cGFwZXItc3Bpbm5lci1saXRlIGFjdGl2ZSBoaWRkZW4kPSJbWyFfaXNJbWFnZUxvYWRpbmddXSI+CiAgICAgICAgICAgIDwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTXVsdGlwbGVTdGVwc11dIj4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHBhcGVyLXNsaWRlcgogICAgICAgICAgICBpZD0ic3RlcHMiCiAgICAgICAgICAgIGltbWVkaWF0ZS12YWx1ZT0ie3tfc3RlcEluZGV4fX0iCiAgICAgICAgICAgIG1heD0iW1tfbWF4U3RlcEluZGV4XV0iCiAgICAgICAgICAgIG1heC1tYXJrZXJzPSJbW19tYXhTdGVwSW5kZXhdXSIKICAgICAgICAgICAgc25hcHMKICAgICAgICAgICAgc3RlcD0iMSIKICAgICAgICAgICAgdmFsdWU9Int7X3N0ZXBJbmRleH19IgogICAgICAgICAgPjwvcGFwZXItc2xpZGVyPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC90Zi1jYXJkLWhlYWRpbmc+CgogICAgPCEtLSBTZW1hbnRpY2FsbHkgYSBidXR0b24gYnV0IDxpbWc+IGluc2lkZSBhIDxidXR0b24+IGRpc2FsbG93cyB1c2VyIHRvIGRvCiAgICBhbiBpbnRlcmVzdGluZyBvcGVyYXRpb24gbGlrZSAiQ29weSBJbWFnZSIgaW4gbm9uLUNocm9taXVtIGJyb3dzZXJzLiAtLT4KICAgIDxhCiAgICAgIGlkPSJtYWluLWltYWdlLWNvbnRhaW5lciIKICAgICAgcm9sZT0iYnV0dG9uIgogICAgICBhcmlhLWxhYmVsPSJUb2dnbGUgYWN0dWFsIHNpemUiCiAgICAgIGFyaWEtZXhwYW5kZWQkPSJbW19nZXRBcmlhRXhwYW5kZWQoYWN0dWFsU2l6ZSldXSIKICAgICAgb24tdGFwPSJfaGFuZGxlVGFwIgogICAgPjwvYT4KCiAgICA8c3R5bGUgaW5jbHVkZT0idGYtY2FyZC1oZWFkaW5nLXN0eWxlIj4KICAgICAgLyoqIE1ha2UgYnV0dG9uIGEgZGl2LiAqLwogICAgICBidXR0b24gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGJhY2tncm91bmQ6IG5vbmU7CiAgICAgICAgYm9yZGVyOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC8qKiBGaXJlZm94OiBHZXQgcmlkIG9mIGRvdHRlZCBsaW5lIGluc2lkZSBidXR0b24uICovCiAgICAgIGJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciB7CiAgICAgICAgYm9yZGVyOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC8qKiBGaXJlZm94OiBTaW11bGF0ZSBDaHJvbWUncyBvdXRlciBnbG93IG9uIGJ1dHRvbiB3aGVuIGZvY3VzZWQuICovCiAgICAgIGJ1dHRvbjotbW96LWZvY3VzcmluZyB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBib3gtc2hhZG93OiAwcHggMHB4IDFweCAycHggSGlnaGxpZ2h0OwogICAgICB9CgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDM1MHB4OwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbWFyZ2luOiAwIDE1cHggNDBweCAwOwogICAgICAgIG92ZXJmbG93LXg6IGF1dG87CiAgICAgIH0KCiAgICAgIC8qKiBXaGVuIGFjdHVhbCBzaXplIHNob3duIGlzIG9uLCB1c2UgdGhlIGFjdHVhbCBpbWFnZSB3aWR0aC4gKi8KICAgICAgOmhvc3QoW2FjdHVhbC1zaXplXSkgewogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgICB3aWR0aDogYXV0bzsKICAgICAgfQoKICAgICAgOmhvc3QoW2FjdHVhbC1zaXplXSkgI21haW4taW1hZ2UtY29udGFpbmVyIHsKICAgICAgICBtYXgtaGVpZ2h0OiBub25lOwogICAgICAgIHdpZHRoOiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdChbYWN0dWFsLXNpemVdKSAjbWFpbi1pbWFnZS1jb250YWluZXIgaW1nIHsKICAgICAgICB3aWR0aDogYXV0bzsKICAgICAgfQoKICAgICAgcGFwZXItc3Bpbm5lci1saXRlIHsKICAgICAgICB3aWR0aDogMTRweDsKICAgICAgICBoZWlnaHQ6IDE0cHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IHRleHQtYm90dG9tOwogICAgICAgIC0tcGFwZXItc3Bpbm5lci1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgIH0KCiAgICAgICNzdGVwcyB7CiAgICAgICAgaGVpZ2h0OiAxNXB4OwogICAgICAgIG1hcmdpbjogMCAwIDAgLTE1cHg7CiAgICAgICAgLyoKICAgICAgICAgKiAzMSBjb21lcyBmcm9tIGFkZGluZyBhIHBhZGRpbmcgb2YgMTVweCBmcm9tIGJvdGggc2lkZXMgb2YgdGhlCiAgICAgICAgICogcGFwZXItc2xpZGVyLCBzdWJ0cmFjdGluZyAxcHggc28gdGhhdCB0aGUgc2xpZGVyIHdpZHRoIGFsaWducwogICAgICAgICAqIHdpdGggdGhlIGltYWdlICh0aGUgbGFzdCBzbGlkZXIgbWFya2VyIHRha2VzIHVwIDFweCksIGFuZAogICAgICAgICAqIGFkZGluZyAycHggdG8gYWNjb3VudCBmb3IgYSBib3JkZXIgb2YgMXB4IG9uIGJvdGggc2lkZXMgb2YKICAgICAgICAgKiB0aGUgaW1hZ2UuIDMwIC0gMSArIDIuCiAgICAgICAgICovCiAgICAgICAgd2lkdGg6IGNhbGMoMTAwJSArIDMxcHgpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWFjdGl2ZS1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLW1hcmtlcnMtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgfQoKICAgICAgI21haW4taW1hZ2UtY29udGFpbmVyIHsKICAgICAgICBtYXgtaGVpZ2h0OiAxMDI0cHg7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH0KCiAgICAgICNtYWluLWltYWdlLWNvbnRhaW5lciBpbWcgewogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBpbWFnZS1yZW5kZXJpbmc6IC1tb3otY3Jpc3AtZWRnZXM7CiAgICAgICAgaW1hZ2UtcmVuZGVyaW5nOiBwaXhlbGF0ZWQ7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbiB7CiAgICAgICAgY29sb3I6ICMyMTk2ZjM7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTAwJTsKICAgICAgICB3aWR0aDogMzJweDsKICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgICAgcGFkZGluZzogNHB4OwogICAgICB9CiAgICAgIHBhcGVyLWljb24tYnV0dG9uW3NlbGVjdGVkXSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgfQogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICBgLHQoW28oe3R5cGU6U3RyaW5nfSksZSgiZGVzaWduOnR5cGUiLFN0cmluZyldLEcwdC5wcm90b3R5cGUsInJ1biIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxHMHQucHJvdG90eXBlLCJ0YWciLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sRzB0LnByb3RvdHlwZSwic2FtcGxlIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLEcwdC5wcm90b3R5cGUsIm9mU2FtcGxlcyIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxHMHQucHJvdG90eXBlLCJ0YWdNZXRhZGF0YSIsdm9pZCAwKSx0KFtvKHt0eXBlOkJvb2xlYW4scmVmbGVjdFRvQXR0cmlidXRlOiEwfSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxHMHQucHJvdG90eXBlLCJhY3R1YWxTaXplIix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLEcwdC5wcm90b3R5cGUsImJyaWdodG5lc3NBZGp1c3RtZW50Iix2b2lkIDApLHQoW28oe3R5cGU6TnVtYmVyfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLEcwdC5wcm90b3R5cGUsImNvbnRyYXN0UGVyY2VudGFnZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixicildLEcwdC5wcm90b3R5cGUsInJlcXVlc3RNYW5hZ2VyIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLEcwdC5wcm90b3R5cGUsIl9tZXRhZGF0YUNhbmNlbGxlciIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxHMHQucHJvdG90eXBlLCJfaW1hZ2VDYW5jZWxsZXIiLHZvaWQgMCksdChbbyh7dHlwZTpBcnJheSxub3RpZnk6ITB9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxHMHQucHJvdG90eXBlLCJfc3RlcHMiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXIsbm90aWZ5OiEwfSksZSgiZGVzaWduOnR5cGUiLE51bWJlcildLEcwdC5wcm90b3R5cGUsIl9zdGVwSW5kZXgiLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxHMHQucHJvdG90eXBlLCJfaXNJbWFnZUxvYWRpbmciLHZvaWQgMCksdChbcygicnVuIiksZSgiZGVzaWduOnR5cGUiLFN0cmluZyksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sRzB0LnByb3RvdHlwZSwiX3J1bkNvbG9yIixudWxsKSx0KFtzKCJfc3RlcHMiKSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sRzB0LnByb3RvdHlwZSwiX2hhc0F0TGVhc3RPbmVTdGVwIixudWxsKSx0KFtzKCJfc3RlcHMiKSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sRzB0LnByb3RvdHlwZSwiX2hhc011bHRpcGxlU3RlcHMiLG51bGwpLHQoW3MoIl9zdGVwcyIsIl9zdGVwSW5kZXgiKSxlKCJkZXNpZ246dHlwZSIsT2JqZWN0KSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pXSxHMHQucHJvdG90eXBlLCJfY3VycmVudFN0ZXAiLG51bGwpLHQoW3MoIl9jdXJyZW50U3RlcCIpLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLEcwdC5wcm90b3R5cGUsIl9zdGVwVmFsdWUiLG51bGwpLHQoW3MoIl9jdXJyZW50U3RlcCIpLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLEcwdC5wcm90b3R5cGUsIl9jdXJyZW50V2FsbFRpbWUiLG51bGwpLHQoW3MoIl9zdGVwcyIpLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLEcwdC5wcm90b3R5cGUsIl9tYXhTdGVwSW5kZXgiLG51bGwpLHQoW3MoInNhbXBsZSIpLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLEcwdC5wcm90b3R5cGUsIl9zYW1wbGVUZXh0IixudWxsKSx0KFtzKCJvZlNhbXBsZXMiKSxlKCJkZXNpZ246dHlwZSIsQm9vbGVhbiksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sRzB0LnByb3RvdHlwZSwiX2hhc011bHRpcGxlU2FtcGxlcyIsbnVsbCksdChbYSgicnVuIiwidGFnIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxHMHQucHJvdG90eXBlLCJyZWxvYWQiLG51bGwpLHQoW2EoIl9jdXJyZW50U3RlcCIsImJyaWdodG5lc3NBZGp1c3RtZW50IiwiY29udHJhc3RQZXJjZW50YWdlIiksZSgiZGVzaWduOnR5cGUiLEZ1bmN0aW9uKSxlKCJkZXNpZ246cGFyYW10eXBlcyIsW10pLGUoImRlc2lnbjpyZXR1cm50eXBlIix2b2lkIDApXSxHMHQucHJvdG90eXBlLCJfdXBkYXRlSW1hZ2VVcmwiLG51bGwpLEcwdD10KFtpKCJ0Zi1pbWFnZS1sb2FkZXIiKV0sRzB0KTtsZXQgVzB0PWNsYXNzIGV4dGVuZHMoY3Iod2UpKXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5yZWxvYWRPblJlYWR5PSEwLHRoaXMuX2RlZmF1bHRCcmlnaHRuZXNzQWRqdXN0bWVudD0xLHRoaXMuX2RlZmF1bHRDb250cmFzdFBlcmNlbnRhZ2U9MTAwLHRoaXMuX2JyaWdodG5lc3NBZGp1c3RtZW50PTEsdGhpcy5fY29udHJhc3RQZXJjZW50YWdlPTEwMCx0aGlzLl9yZXF1ZXN0TWFuYWdlcj1uZXcgYnJ9cmVhZHkoKXtzdXBlci5yZWFkeSgpLHRoaXMucmVsb2FkT25SZWFkeSYmdGhpcy5yZWxvYWQoKX1yZWxvYWQoKXt0aGlzLl9mZXRjaFRhZ3MoKS50aGVuKCgoKT0+e3RoaXMuX3JlbG9hZEltYWdlcygpfSkpfV9mZXRjaFRhZ3MoKXtjb25zdCB0PUVyKCkucGx1Z2luUm91dGUoImltYWdlcyIsIi90YWdzIik7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QodCkudGhlbigodD0+e2lmKENlLmV4cG9ydHMuaXNFcXVhbCh0LHRoaXMuX3J1blRvVGFnSW5mbykpcmV0dXJuO2NvbnN0IGU9ZnIoQ2UuZXhwb3J0cy5tYXBWYWx1ZXModCwodD0+T2JqZWN0LmtleXModCkpKSk7dGhpcy5zZXQoIl9kYXRhTm90Rm91bmQiLDA9PT1lLmxlbmd0aCksdGhpcy5zZXQoIl9ydW5Ub1RhZ0luZm8iLHQpLHRoaXMuYXN5bmMoKCgpPT57dGhpcy5zZXQoIl9jYXRlZ29yaWVzRG9tUmVhZHkiLCEwKX0pKX0pKX1fcmVsb2FkSW1hZ2VzKCl7dGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoInRmLWltYWdlLWxvYWRlciIpLmZvckVhY2goKHQ9Pnt0LnJlbG9hZCgpfSkpfV9zaG91bGRPcGVuKHQpe3JldHVybiB0PD0yfV9yZXNldEJyaWdodG5lc3MoKXt0aGlzLl9icmlnaHRuZXNzQWRqdXN0bWVudD10aGlzLl9kZWZhdWx0QnJpZ2h0bmVzc0FkanVzdG1lbnR9X3Jlc2V0Q29udHJhc3QoKXt0aGlzLl9jb250cmFzdFBlcmNlbnRhZ2U9dGhpcy5fZGVmYXVsdENvbnRyYXN0UGVyY2VudGFnZX1nZXQgX2JyaWdodG5lc3NJc0RlZmF1bHQoKXtyZXR1cm4gdGhpcy5fYnJpZ2h0bmVzc0FkanVzdG1lbnQ9PT10aGlzLl9kZWZhdWx0QnJpZ2h0bmVzc0FkanVzdG1lbnR9Z2V0IF9jb250cmFzdElzRGVmYXVsdCgpe3JldHVybiB0aGlzLl9jb250cmFzdFBlcmNlbnRhZ2U9PT10aGlzLl9kZWZhdWx0Q29udHJhc3RQZXJjZW50YWdlfWdldCBfY2F0ZWdvcmllcygpe3ZhciB0PXRoaXMuX3J1blRvVGFnSW5mbyxlPXRoaXMuX3NlbGVjdGVkUnVucyxuPXRoaXMuX3RhZ0ZpbHRlcjtmdW5jdGlvbiBpKGUpe2NvbnN0IG49dFtlLnJ1bl1bZS50YWddLnNhbXBsZXM7cmV0dXJuIENlLmV4cG9ydHMucmFuZ2UobikubWFwKCh0PT5PYmplY3QuYXNzaWduKHt9LGUse3NhbXBsZTp0LG9mU2FtcGxlczpufSkpKX1yZXR1cm4gSXIoQ2UuZXhwb3J0cy5tYXBWYWx1ZXModCwodD0+T2JqZWN0LmtleXModCkpKSxlLG4pLm1hcCgodD0+T2JqZWN0LmFzc2lnbih7fSx0LHtpdGVtczpbXS5jb25jYXQuYXBwbHkoW10sdC5pdGVtcy5tYXAoaSkpfSkpKX1fdGFnTWV0YWRhdGEodCxlLG4pe3JldHVybiB0W2VdW25dfX07dmFyIHEwdCxZMHQsWDB0O1cwdC50ZW1wbGF0ZT14ZWAKICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZXR0aW5ncyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJsaW5lLWl0ZW0iPgogICAgICAgICAgICAgIDxwYXBlci1jaGVja2JveCBjaGVja2VkPSJ7e19hY3R1YWxTaXplfX0iCiAgICAgICAgICAgICAgICA+U2hvdyBhY3R1YWwgaW1hZ2Ugc2l6ZTwvcGFwZXItY2hlY2tib3gKICAgICAgICAgICAgICA+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8aDMgY2xhc3M9InRvb2x0aXAtY29udGFpbmVyIj5CcmlnaHRuZXNzIGFkanVzdG1lbnQ8L2gzPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJyZXNldHRhYmxlLXNsaWRlci1jb250YWluZXIiPgogICAgICAgICAgICAgIDxwYXBlci1zbGlkZXIKICAgICAgICAgICAgICAgIG1pbj0iMCIKICAgICAgICAgICAgICAgIG1heD0iMiIKICAgICAgICAgICAgICAgIHNuYXBzCiAgICAgICAgICAgICAgICBwaW4KICAgICAgICAgICAgICAgIHN0ZXA9IjAuMDEiCiAgICAgICAgICAgICAgICB2YWx1ZT0ie3tfYnJpZ2h0bmVzc0FkanVzdG1lbnR9fSIKICAgICAgICAgICAgICAgIGltbWVkaWF0ZS12YWx1ZT0ie3tfYnJpZ2h0bmVzc0FkanVzdG1lbnR9fSIKICAgICAgICAgICAgICA+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbgogICAgICAgICAgICAgICAgY2xhc3M9IngtYnV0dG9uIgogICAgICAgICAgICAgICAgb24tdGFwPSJfcmVzZXRCcmlnaHRuZXNzIgogICAgICAgICAgICAgICAgZGlzYWJsZWQ9IltbX2JyaWdodG5lc3NJc0RlZmF1bHRdXSIKICAgICAgICAgICAgICAgID5SZXNldDwvcGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgICAgPGgzIGNsYXNzPSJ0b29sdGlwLWNvbnRhaW5lciI+Q29udHJhc3QgYWRqdXN0bWVudDwvaDM+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InJlc2V0dGFibGUtc2xpZGVyLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgPHBhcGVyLXNsaWRlcgogICAgICAgICAgICAgICAgbWluPSIwIgogICAgICAgICAgICAgICAgbWF4PSI1MDAiCiAgICAgICAgICAgICAgICBzbmFwcwogICAgICAgICAgICAgICAgcGluCiAgICAgICAgICAgICAgICBzdGVwPSIxIgogICAgICAgICAgICAgICAgdmFsdWU9Int7X2NvbnRyYXN0UGVyY2VudGFnZX19IgogICAgICAgICAgICAgICAgaW1tZWRpYXRlLXZhbHVlPSJ7e19jb250cmFzdFBlcmNlbnRhZ2V9fSIKICAgICAgICAgICAgICA+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbgogICAgICAgICAgICAgICAgY2xhc3M9IngtYnV0dG9uIgogICAgICAgICAgICAgICAgb24tdGFwPSJfcmVzZXRDb250cmFzdCIKICAgICAgICAgICAgICAgIGRpc2FibGVkPSJbW19jb250cmFzdElzRGVmYXVsdF1dIgogICAgICAgICAgICAgICAgPlJlc2V0PC9wYXBlci1idXR0b24KICAgICAgICAgICAgICA+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIHJ1bnMtc2VsZWN0b3IiPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3IKICAgICAgICAgICAgaWQ9InJ1bnMtc2VsZWN0b3IiCiAgICAgICAgICAgIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319IgogICAgICAgICAgPjwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBpbWFnZSBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6PC9wPgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPllvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgaW1hZ2UgZGF0YSB0byB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiCiAgICAgICAgICAgICAgICA+UkVBRE1FPC9hCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIgogICAgICAgICAgICAgICAgPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hCiAgICAgICAgICAgICAgPi4KICAgICAgICAgICAgPC9wPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyIKICAgICAgICAgICAgICAgID50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICA8L3A+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcKICAgICAgICAgICAgICBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIgogICAgICAgICAgICAgIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLWltYWdlLWxvYWRlcgogICAgICAgICAgICAgICAgICBhY3RpdmU9IltbYWN0aXZlXV0iCiAgICAgICAgICAgICAgICAgIHJ1bj0iW1tpdGVtLnJ1bl1dIgogICAgICAgICAgICAgICAgICB0YWc9IltbaXRlbS50YWddXSIKICAgICAgICAgICAgICAgICAgc2FtcGxlPSJbW2l0ZW0uc2FtcGxlXV0iCiAgICAgICAgICAgICAgICAgIG9mLXNhbXBsZXM9IltbaXRlbS5vZlNhbXBsZXNdXSIKICAgICAgICAgICAgICAgICAgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShfcnVuVG9UYWdJbmZvLCBpdGVtLnJ1biwgaXRlbS50YWcpXV0iCiAgICAgICAgICAgICAgICAgIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIKICAgICAgICAgICAgICAgICAgYWN0dWFsLXNpemU9IltbX2FjdHVhbFNpemVdXSIKICAgICAgICAgICAgICAgICAgYnJpZ2h0bmVzcy1hZGp1c3RtZW50PSJbW19icmlnaHRuZXNzQWRqdXN0bWVudF1dIgogICAgICAgICAgICAgICAgICBjb250cmFzdC1wZXJjZW50YWdlPSJbW19jb250cmFzdFBlcmNlbnRhZ2VdXSIKICAgICAgICAgICAgICAgID48L3RmLWltYWdlLWxvYWRlcj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5yZXNldHRhYmxlLXNsaWRlci1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KICAgICAgLnJlc2V0dGFibGUtc2xpZGVyLWNvbnRhaW5lciBwYXBlci1zbGlkZXIgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgfQogICAgICAucmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICB9CiAgICAgIC5yZXNldHRhYmxlLXNsaWRlci1jb250YWluZXIgcGFwZXItYnV0dG9uW2Rpc2FibGVkXSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdW5zZXQ7CiAgICAgIH0KICAgICAgLngtYnV0dG9uIHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgICBjb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICB9CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICAgIHBhcGVyLXNsaWRlciB7CiAgICAgICAgLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItbWFya2Vycy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICB9CiAgICA8L3N0eWxlPgogIGAsdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxXMHQucHJvdG90eXBlLCJyZWxvYWRPblJlYWR5Iix2b2lkIDApLHQoW28oe3R5cGU6QXJyYXl9KSxlKCJkZXNpZ246dHlwZSIsQXJyYXkpXSxXMHQucHJvdG90eXBlLCJfc2VsZWN0ZWRSdW5zIix2b2lkIDApLHQoW28oe3R5cGU6T2JqZWN0fSksZSgiZGVzaWduOnR5cGUiLE9iamVjdCldLFcwdC5wcm90b3R5cGUsIl9ydW5Ub1RhZ0luZm8iLHZvaWQgMCksdChbbyh7dHlwZTpCb29sZWFufSksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pXSxXMHQucHJvdG90eXBlLCJfZGF0YU5vdEZvdW5kIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sVzB0LnByb3RvdHlwZSwiX2FjdHVhbFNpemUiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sVzB0LnByb3RvdHlwZSwiX2RlZmF1bHRCcmlnaHRuZXNzQWRqdXN0bWVudCIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxXMHQucHJvdG90eXBlLCJfZGVmYXVsdENvbnRyYXN0UGVyY2VudGFnZSIsdm9pZCAwKSx0KFtvKHt0eXBlOk51bWJlcn0pLGUoImRlc2lnbjp0eXBlIixOdW1iZXIpXSxXMHQucHJvdG90eXBlLCJfYnJpZ2h0bmVzc0FkanVzdG1lbnQiLHZvaWQgMCksdChbbyh7dHlwZTpOdW1iZXJ9KSxlKCJkZXNpZ246dHlwZSIsTnVtYmVyKV0sVzB0LnByb3RvdHlwZSwiX2NvbnRyYXN0UGVyY2VudGFnZSIsdm9pZCAwKSx0KFtvKHt0eXBlOlN0cmluZ30pLGUoImRlc2lnbjp0eXBlIixTdHJpbmcpXSxXMHQucHJvdG90eXBlLCJfdGFnRmlsdGVyIix2b2lkIDApLHQoW28oe3R5cGU6Qm9vbGVhbn0pLGUoImRlc2lnbjp0eXBlIixCb29sZWFuKV0sVzB0LnByb3RvdHlwZSwiX2NhdGVnb3JpZXNEb21SZWFkeSIsdm9pZCAwKSx0KFtvKHt0eXBlOk9iamVjdH0pLGUoImRlc2lnbjp0eXBlIixPYmplY3QpXSxXMHQucHJvdG90eXBlLCJfcmVxdWVzdE1hbmFnZXIiLHZvaWQgMCksdChbcygiX2JyaWdodG5lc3NBZGp1c3RtZW50IiksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLFcwdC5wcm90b3R5cGUsIl9icmlnaHRuZXNzSXNEZWZhdWx0IixudWxsKSx0KFtzKCJfY29udHJhc3RQZXJjZW50YWdlIiksZSgiZGVzaWduOnR5cGUiLEJvb2xlYW4pLGUoImRlc2lnbjpwYXJhbXR5cGVzIixbXSldLFcwdC5wcm90b3R5cGUsIl9jb250cmFzdElzRGVmYXVsdCIsbnVsbCksdChbcygiX3J1blRvVGFnSW5mbyIsIl9zZWxlY3RlZFJ1bnMiLCJfdGFnRmlsdGVyIiwiX2NhdGVnb3JpZXNEb21SZWFkeSIpLGUoImRlc2lnbjp0eXBlIixBcnJheSksZSgiZGVzaWduOnBhcmFtdHlwZXMiLFtdKV0sVzB0LnByb3RvdHlwZSwiX2NhdGVnb3JpZXMiLG51bGwpLFcwdD10KFtpKCJ0Zi1pbWFnZS1kYXNoYm9hcmQiKV0sVzB0KSwoZnVuY3Rpb24odCl7dFt0LkNBTkNFTExFRD0xXT0iQ0FOQ0VMTEVEIn0pKHEwdHx8KHEwdD17fSkpLChmdW5jdGlvbih0KXt0W3QuVkVSVEVYPTFdPSJWRVJURVgiLHRbdC5GQUNFPTJdPSJGQUNFIix0W3QuQ09MT1I9M109IkNPTE9SIn0pKFkwdHx8KFkwdD17fSkpLChmdW5jdGlvbih0KXt0LlZFUlRFWD0iZmxvYXQzMiIsdC5GQUNFPSJpbnQzMiIsdC5DT0xPUj0idWludDgifSkoWDB0fHwoWDB0PXt9KSk7Y2xhc3MgJDB0e2NvbnN0cnVjdG9yKHQpe3RoaXMuX2NhbmNlbGxlcj1uZXcgeE8sdGhpcy5fcmVxdWVzdE1hbmFnZXI9dH1yZWxvYWQodCxlLG4pe3JldHVybiB0aGlzLl9jYW5jZWxsZXIuY2FuY2VsQWxsKCksdGhpcy5fZmV0Y2hNZXRhZGF0YSh0LGUsbil9X2ZldGNoRGF0YUJ5U3RlcCh0LGUsbixpLHIsbyl7Y29uc3QgYT1FcigpLnBsdWdpblJvdXRlKCJtZXNoIiwiL2RhdGEiLG5ldyBVUkxTZWFyY2hQYXJhbXMoe3RhZzplLHJ1bjp0LGNvbnRlbnRfdHlwZTpuLHNhbXBsZTpTdHJpbmcoaSksc3RlcDpTdHJpbmcocil9KSkscz1mdW5jdGlvbih0KXtsZXQgZT1bXTtmb3IobGV0IG49MDtuPHQubGVuZ3RoLzM7bisrKXtsZXQgaT1bXTtmb3IobGV0IGU9MDtlPDM7ZSsrKWkucHVzaCh0WzMqbitlXSk7ZS5wdXNoKGkpfXJldHVybiBlfSxsPXRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZSgodD0+e2lmKHQuY2FuY2VsbGVkKXJldHVybiBQcm9taXNlLnJlamVjdCh7Y29kZTpxMHQuQ0FOQ0VMTEVELG1lc3NhZ2U6IlJlc3BvbnNlIHdhcyBpbnZhbGlkYXRlZC4ifSk7bGV0IGU9dC52YWx1ZTtzd2l0Y2gobil7Y2FzZSJWRVJURVgiOm8udmVydGljZXM9cyhuZXcgRmxvYXQzMkFycmF5KGUpKTticmVhaztjYXNlIkZBQ0UiOm8uZmFjZXM9cyhuZXcgSW50MzJBcnJheShlKSk7YnJlYWs7Y2FzZSJDT0xPUiI6by5jb2xvcnM9cyhuZXcgVWludDhBcnJheShlKSl9cmV0dXJuIG99KSk7cmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLmZldGNoKGEse21ldGhvZDoiR0VUIixoZWFkZXJzOntyZXNwb25zZVR5cGU6ImFycmF5YnVmZmVyIixjb250ZW50VHlwZTpYMHRbbl19fSkudGhlbigodD0+dC5hcnJheUJ1ZmZlcigpKSkudGhlbihsKX1mZXRjaERhdGEodCxlLG4saSl7bGV0IHI9W10sbz1uZXcgTWFwO3JldHVybiBPYmplY3Qua2V5cyhZMHQpLmZvckVhY2goKGE9Pnt0LmNvbXBvbmVudHMmMTw8WTB0W2FdJiZyLnB1c2godGhpcy5fZmV0Y2hEYXRhQnlTdGVwKGUsbixhLGksdC5zdGVwLG8pKX0pKSxQcm9taXNlLmFsbChyKX1fZmV0Y2hNZXRhZGF0YSh0LGUsbil7dGhpcy5fY2FuY2VsbGVyLmNhbmNlbEFsbCgpO2NvbnN0IGk9RXIoKS5wbHVnaW5Sb3V0ZSgibWVzaCIsIi9tZXNoZXMiLG5ldyBVUkxTZWFyY2hQYXJhbXMoe3RhZzplLHJ1bjp0LHNhbXBsZTpufSkpLHI9dGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKCh0PT50LmNhbmNlbGxlZD9Qcm9taXNlLnJlamVjdCh7Y29kZTpxMHQuQ0FOQ0VMTEVELG1lc3NhZ2U6IlJlc3BvbnNlIHdhcyBpbnZhbGlkYXRlZC4ifSk6dC52YWx1ZSkpO3JldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5mZXRjaChpKS50aGVuKCh0PT50Lmpzb24oKSkpLnRoZW4ocikudGhlbih0aGlzLl9wcm9jZXNzTWV0YWRhdGEuYmluZCh0aGlzKSl9X3Byb2Nlc3NNZXRhZGF0YSh0KXtpZighdClyZXR1cm47Y29uc3QgZT1uZXcgTWFwO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtsZXQgaT10W25dO2UuaGFzKGkuc3RlcCl8fGUuc2V0KGkuc3RlcCxbXSksZS5nZXQoaS5zdGVwKS5wdXNoKGkpfWxldCBuPVtdO3JldHVybiBlLmZvckVhY2goKHQ9PntsZXQgZT10aGlzLl9jcmVhdGVTdGVwRGF0dW0odFswXSk7bi5wdXNoKGUpfSkpLG59X2NyZWF0ZVN0ZXBEYXR1bSh0KXtyZXR1cm57d2FsbF90aW1lOm5ldyBEYXRlKDFlMyp0LndhbGxfdGltZSksc3RlcDp0LnN0ZXAsY29uZmlnOnQuY29uZmlnLGNvbnRlbnRfdHlwZTp0LmNvbnRlbnRfdHlwZSxjb21wb25lbnRzOnQuY29tcG9uZW50c319fQovKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgMjAxMC0yMDIxIFRocmVlLmpzIEF1dGhvcnMKICAgICAqIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVQKICAgICAqL2NvbnN0IEswdD0iMTMxIixaMHQ9e0xFRlQ6MCxNSURETEU6MSxSSUdIVDoyLFJPVEFURTowLERPTExZOjEsUEFOOjJ9LEowdD17Uk9UQVRFOjAsUEFOOjEsRE9MTFlfUEFOOjIsRE9MTFlfUk9UQVRFOjN9LFEwdD0xMDAsdDJ0PTMwMCxlMnQ9MzAxLG4ydD0zMDIsaTJ0PTMwMyxyMnQ9MzA0LG8ydD0zMDYsYTJ0PTMwNyxzMnQ9MWUzLGwydD0xMDAxLGMydD0xMDAyLHUydD0xMDAzLGgydD0xMDA0LGQydD0xMDA1LHAydD0xMDA2LGYydD0xMDA3LG0ydD0xMDA4LGcydD0xMDA5LF8ydD0xMDEyLHkydD0xMDE0LHYydD0xMDE1LGIydD0xMDE2LHgydD0xMDIwLHcydD0xMDIyLFMydD0xMDIzLE0ydD0xMDI2LEUydD0xMDI3LFQydD0zMzc3NixDMnQ9MzM3NzcsQTJ0PTMzNzc4LGsydD0zMzc3OSxMMnQ9MzU4NDAsUDJ0PTM1ODQxLE4ydD0zNTg0MixJMnQ9MzU4NDMsUjJ0PTM3NDkyLE8ydD0zNzQ5Nix6MnQ9MjMwMCxEMnQ9MjMwMSxCMnQ9MjMwMixIMnQ9MjQwMCxGMnQ9MjQwMSxWMnQ9MjQwMixVMnQ9MjUwMCxqMnQ9MjUwMSxHMnQ9M2UzLFcydD0zMDAxLHEydD0zMDA3LFkydD0zMDAyLFgydD0zMDA0LCQydD0zMDA1LEsydD0zMDA2LFoydD03NjgwLEoydD0zNTA0NCxRMnQ9MzUwNDgsdDV0PSIzMDAgZXMiO2NsYXNzIGU1dHthZGRFdmVudExpc3RlbmVyKHQsZSl7dm9pZCAwPT09dGhpcy5fbGlzdGVuZXJzJiYodGhpcy5fbGlzdGVuZXJzPXt9KTtjb25zdCBuPXRoaXMuX2xpc3RlbmVyczt2b2lkIDA9PT1uW3RdJiYoblt0XT1bXSksLTE9PT1uW3RdLmluZGV4T2YoZSkmJm5bdF0ucHVzaChlKX1oYXNFdmVudExpc3RlbmVyKHQsZSl7aWYodm9pZCAwPT09dGhpcy5fbGlzdGVuZXJzKXJldHVybiExO2NvbnN0IG49dGhpcy5fbGlzdGVuZXJzO3JldHVybiB2b2lkIDAhPT1uW3RdJiYtMSE9PW5bdF0uaW5kZXhPZihlKX1yZW1vdmVFdmVudExpc3RlbmVyKHQsZSl7aWYodm9pZCAwPT09dGhpcy5fbGlzdGVuZXJzKXJldHVybjtjb25zdCBuPXRoaXMuX2xpc3RlbmVyc1t0XTtpZih2b2lkIDAhPT1uKXtjb25zdCB0PW4uaW5kZXhPZihlKTstMSE9PXQmJm4uc3BsaWNlKHQsMSl9fWRpc3BhdGNoRXZlbnQodCl7aWYodm9pZCAwPT09dGhpcy5fbGlzdGVuZXJzKXJldHVybjtjb25zdCBlPXRoaXMuX2xpc3RlbmVyc1t0LnR5cGVdO2lmKHZvaWQgMCE9PWUpe3QudGFyZ2V0PXRoaXM7Y29uc3Qgbj1lLnNsaWNlKDApO2ZvcihsZXQgZT0wLGk9bi5sZW5ndGg7ZTxpO2UrKyluW2VdLmNhbGwodGhpcyx0KTt0LnRhcmdldD1udWxsfX19Y29uc3QgbjV0PVtdO2ZvcihsZXQgdD0wO3Q8MjU2O3QrKyluNXRbdF09KHQ8MTY/IjAiOiIiKSt0LnRvU3RyaW5nKDE2KTtsZXQgaTV0PTEyMzQ1Njc7Y29uc3QgcjV0PU1hdGguUEkvMTgwLG81dD0xODAvTWF0aC5QSTtmdW5jdGlvbiBhNXQoKXtjb25zdCB0PTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwLGU9NDI5NDk2NzI5NSpNYXRoLnJhbmRvbSgpfDAsbj00Mjk0OTY3Mjk1Kk1hdGgucmFuZG9tKCl8MCxpPTQyOTQ5NjcyOTUqTWF0aC5yYW5kb20oKXwwO3JldHVybihuNXRbMjU1JnRdK241dFt0Pj44JjI1NV0rbjV0W3Q+PjE2JjI1NV0rbjV0W3Q+PjI0JjI1NV0rIi0iK241dFsyNTUmZV0rbjV0W2U+PjgmMjU1XSsiLSIrbjV0W2U+PjE2JjE1fDY0XStuNXRbZT4+MjQmMjU1XSsiLSIrbjV0WzYzJm58MTI4XStuNXRbbj4+OCYyNTVdKyItIituNXRbbj4+MTYmMjU1XStuNXRbbj4+MjQmMjU1XStuNXRbMjU1JmldK241dFtpPj44JjI1NV0rbjV0W2k+PjE2JjI1NV0rbjV0W2k+PjI0JjI1NV0pLnRvVXBwZXJDYXNlKCl9ZnVuY3Rpb24gczV0KHQsZSxuKXtyZXR1cm4gTWF0aC5tYXgoZSxNYXRoLm1pbihuLHQpKX1mdW5jdGlvbiBsNXQodCxlKXtyZXR1cm4odCVlK2UpJWV9ZnVuY3Rpb24gYzV0KHQsZSxuKXtyZXR1cm4oMS1uKSp0K24qZX1mdW5jdGlvbiB1NXQodCl7cmV0dXJuIDA9PSh0JnQtMSkmJjAhPT10fWZ1bmN0aW9uIGg1dCh0KXtyZXR1cm4gTWF0aC5wb3coMixNYXRoLmNlaWwoTWF0aC5sb2codCkvTWF0aC5MTjIpKX1mdW5jdGlvbiBkNXQodCl7cmV0dXJuIE1hdGgucG93KDIsTWF0aC5mbG9vcihNYXRoLmxvZyh0KS9NYXRoLkxOMikpfXZhciBwNXQ9T2JqZWN0LmZyZWV6ZSh7X19wcm90b19fOm51bGwsREVHMlJBRDpyNXQsUkFEMkRFRzpvNXQsZ2VuZXJhdGVVVUlEOmE1dCxjbGFtcDpzNXQsZXVjbGlkZWFuTW9kdWxvOmw1dCxtYXBMaW5lYXI6ZnVuY3Rpb24gZjV0KHQsZSxuLGkscil7cmV0dXJuIGkrKHQtZSkqKHItaSkvKG4tZSl9LGludmVyc2VMZXJwOmZ1bmN0aW9uIG01dCh0LGUsbil7cmV0dXJuIHQhPT1lPyhuLXQpLyhlLXQpOjB9LGxlcnA6YzV0LGRhbXA6ZnVuY3Rpb24gZzV0KHQsZSxuLGkpe3JldHVybiBjNXQodCxlLDEtTWF0aC5leHAoLW4qaSkpfSxwaW5ncG9uZzpmdW5jdGlvbiBfNXQodCxlPTEpe3JldHVybiBlLU1hdGguYWJzKGw1dCh0LDIqZSktZSl9LHNtb290aHN0ZXA6ZnVuY3Rpb24geTV0KHQsZSxuKXtyZXR1cm4gdDw9ZT8wOnQ+PW4/MToodD0odC1lKS8obi1lKSkqdCooMy0yKnQpfSxzbW9vdGhlcnN0ZXA6ZnVuY3Rpb24gdjV0KHQsZSxuKXtyZXR1cm4gdDw9ZT8wOnQ+PW4/MToodD0odC1lKS8obi1lKSkqdCp0Kih0Kig2KnQtMTUpKzEwKX0scmFuZEludDpmdW5jdGlvbiBiNXQodCxlKXtyZXR1cm4gdCtNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkqKGUtdCsxKSl9LHJhbmRGbG9hdDpmdW5jdGlvbiB4NXQodCxlKXtyZXR1cm4gdCtNYXRoLnJhbmRvbSgpKihlLXQpfSxyYW5kRmxvYXRTcHJlYWQ6ZnVuY3Rpb24gdzV0KHQpe3JldHVybiB0KiguNS1NYXRoLnJhbmRvbSgpKX0sc2VlZGVkUmFuZG9tOmZ1bmN0aW9uIFM1dCh0KXtyZXR1cm4gdm9pZCAwIT09dCYmKGk1dD10JTIxNDc0ODM2NDcpLGk1dD0xNjgwNyppNXQlMjE0NzQ4MzY0NywoaTV0LTEpLzIxNDc0ODM2NDZ9LGRlZ1RvUmFkOmZ1bmN0aW9uIE01dCh0KXtyZXR1cm4gdCpyNXR9LHJhZFRvRGVnOmZ1bmN0aW9uIEU1dCh0KXtyZXR1cm4gdCpvNXR9LGlzUG93ZXJPZlR3bzp1NXQsY2VpbFBvd2VyT2ZUd286aDV0LGZsb29yUG93ZXJPZlR3bzpkNXQsc2V0UXVhdGVybmlvbkZyb21Qcm9wZXJFdWxlcjpmdW5jdGlvbiBUNXQodCxlLG4saSxyKXtjb25zdCBvPU1hdGguY29zLGE9TWF0aC5zaW4scz1vKG4vMiksbD1hKG4vMiksYz1vKChlK2kpLzIpLHU9YSgoZStpKS8yKSxoPW8oKGUtaSkvMiksZD1hKChlLWkpLzIpLHA9bygoaS1lKS8yKSxmPWEoKGktZSkvMik7c3dpdGNoKHIpe2Nhc2UiWFlYIjp0LnNldChzKnUsbCpoLGwqZCxzKmMpO2JyZWFrO2Nhc2UiWVpZIjp0LnNldChsKmQscyp1LGwqaCxzKmMpO2JyZWFrO2Nhc2UiWlhaIjp0LnNldChsKmgsbCpkLHMqdSxzKmMpO2JyZWFrO2Nhc2UiWFpYIjp0LnNldChzKnUsbCpmLGwqcCxzKmMpO2JyZWFrO2Nhc2UiWVhZIjp0LnNldChsKnAscyp1LGwqZixzKmMpO2JyZWFrO2Nhc2UiWllaIjp0LnNldChsKmYsbCpwLHMqdSxzKmMpO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKCJUSFJFRS5NYXRoVXRpbHM6IC5zZXRRdWF0ZXJuaW9uRnJvbVByb3BlckV1bGVyKCkgZW5jb3VudGVyZWQgYW4gdW5rbm93biBvcmRlcjogIityKX19fSk7Y2xhc3MgQzV0e2NvbnN0cnVjdG9yKHQ9MCxlPTApe3RoaXMueD10LHRoaXMueT1lfWdldCB3aWR0aCgpe3JldHVybiB0aGlzLnh9c2V0IHdpZHRoKHQpe3RoaXMueD10fWdldCBoZWlnaHQoKXtyZXR1cm4gdGhpcy55fXNldCBoZWlnaHQodCl7dGhpcy55PXR9c2V0KHQsZSl7cmV0dXJuIHRoaXMueD10LHRoaXMueT1lLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9dCx0aGlzfXNldFgodCl7cmV0dXJuIHRoaXMueD10LHRoaXN9c2V0WSh0KXtyZXR1cm4gdGhpcy55PXQsdGhpc31zZXRDb21wb25lbnQodCxlKXtzd2l0Y2godCl7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfXJldHVybiB0aGlzfWdldENvbXBvbmVudCh0KXtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSl9Y29weSh0KXtyZXR1cm4gdGhpcy54PXQueCx0aGlzLnk9dC55LHRoaXN9YWRkKHQsZSl7cmV0dXJuIHZvaWQgMCE9PWU/KGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMjogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuYWRkVmVjdG9ycyh0LGUpKToodGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpcyl9YWRkU2NhbGFyKHQpe3JldHVybiB0aGlzLngrPXQsdGhpcy55Kz10LHRoaXN9YWRkVmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54K2UueCx0aGlzLnk9dC55K2UueSx0aGlzfWFkZFNjYWxlZFZlY3Rvcih0LGUpe3JldHVybiB0aGlzLngrPXQueCplLHRoaXMueSs9dC55KmUsdGhpc31zdWIodCxlKXtyZXR1cm4gdm9pZCAwIT09ZT8oY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IyOiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5zdWJWZWN0b3JzKHQsZSkpOih0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzKX1zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpc31zdWJWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngtZS54LHRoaXMueT10LnktZS55LHRoaXN9bXVsdGlwbHkodCl7cmV0dXJuIHRoaXMueCo9dC54LHRoaXMueSo9dC55LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7cmV0dXJuIHRoaXMueCo9dCx0aGlzLnkqPXQsdGhpc31kaXZpZGUodCl7cmV0dXJuIHRoaXMueC89dC54LHRoaXMueS89dC55LHRoaXN9ZGl2aWRlU2NhbGFyKHQpe3JldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKDEvdCl9YXBwbHlNYXRyaXgzKHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LGk9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PWlbMF0qZStpWzNdKm4raVs2XSx0aGlzLnk9aVsxXSplK2lbNF0qbitpWzddLHRoaXN9bWluKHQpe3JldHVybiB0aGlzLng9TWF0aC5taW4odGhpcy54LHQueCksdGhpcy55PU1hdGgubWluKHRoaXMueSx0LnkpLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXN9Y2xhbXAodCxlKXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHQueCxNYXRoLm1pbihlLngsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KHQueSxNYXRoLm1pbihlLnksdGhpcy55KSksdGhpc31jbGFtcFNjYWxhcih0LGUpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueCkpLHRoaXMueT1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy55KSksdGhpc31jbGFtcExlbmd0aCh0LGUpe2NvbnN0IG49dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIobnx8MSkubXVsdGlwbHlTY2FsYXIoTWF0aC5tYXgodCxNYXRoLm1pbihlLG4pKSl9Zmxvb3IoKXtyZXR1cm4gdGhpcy54PU1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpLHRoaXN9Y2VpbCgpe3JldHVybiB0aGlzLng9TWF0aC5jZWlsKHRoaXMueCksdGhpcy55PU1hdGguY2VpbCh0aGlzLnkpLHRoaXN9cm91bmQoKXtyZXR1cm4gdGhpcy54PU1hdGgucm91bmQodGhpcy54KSx0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpLHRoaXN9cm91bmRUb1plcm8oKXtyZXR1cm4gdGhpcy54PXRoaXMueDwwP01hdGguY2VpbCh0aGlzLngpOk1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9dGhpcy55PDA/TWF0aC5jZWlsKHRoaXMueSk6TWF0aC5mbG9vcih0aGlzLnkpLHRoaXN9bmVnYXRlKCl7cmV0dXJuIHRoaXMueD0tdGhpcy54LHRoaXMueT0tdGhpcy55LHRoaXN9ZG90KHQpe3JldHVybiB0aGlzLngqdC54K3RoaXMueSp0Lnl9Y3Jvc3ModCl7cmV0dXJuIHRoaXMueCp0LnktdGhpcy55KnQueH1sZW5ndGhTcSgpe3JldHVybiB0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnl9bGVuZ3RoKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkpfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSl9bm9ybWFsaXplKCl7cmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKHRoaXMubGVuZ3RoKCl8fDEpfWFuZ2xlKCl7cmV0dXJuIE1hdGguYXRhbjIoLXRoaXMueSwtdGhpcy54KStNYXRoLlBJfWRpc3RhbmNlVG8odCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLmRpc3RhbmNlVG9TcXVhcmVkKHQpKX1kaXN0YW5jZVRvU3F1YXJlZCh0KXtjb25zdCBlPXRoaXMueC10Lngsbj10aGlzLnktdC55O3JldHVybiBlKmUrbipufW1hbmhhdHRhbkRpc3RhbmNlVG8odCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueC10LngpK01hdGguYWJzKHRoaXMueS10LnkpfXNldExlbmd0aCh0KXtyZXR1cm4gdGhpcy5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0KX1sZXJwKHQsZSl7cmV0dXJuIHRoaXMueCs9KHQueC10aGlzLngpKmUsdGhpcy55Kz0odC55LXRoaXMueSkqZSx0aGlzfWxlcnBWZWN0b3JzKHQsZSxuKXtyZXR1cm4gdGhpcy54PXQueCsoZS54LXQueCkqbix0aGlzLnk9dC55KyhlLnktdC55KSpuLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lng9PT10aGlzLngmJnQueT09PXRoaXMueX1mcm9tQXJyYXkodCxlPTApe3JldHVybiB0aGlzLng9dFtlXSx0aGlzLnk9dFtlKzFdLHRoaXN9dG9BcnJheSh0PVtdLGU9MCl7cmV0dXJuIHRbZV09dGhpcy54LHRbZSsxXT10aGlzLnksdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSxuKXtyZXR1cm4gdm9pZCAwIT09biYmY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3IyOiBvZmZzZXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuIiksdGhpcy54PXQuZ2V0WChlKSx0aGlzLnk9dC5nZXRZKGUpLHRoaXN9cm90YXRlQXJvdW5kKHQsZSl7Y29uc3Qgbj1NYXRoLmNvcyhlKSxpPU1hdGguc2luKGUpLHI9dGhpcy54LXQueCxvPXRoaXMueS10Lnk7cmV0dXJuIHRoaXMueD1yKm4tbyppK3QueCx0aGlzLnk9cippK28qbit0LnksdGhpc31yYW5kb20oKXtyZXR1cm4gdGhpcy54PU1hdGgucmFuZG9tKCksdGhpcy55PU1hdGgucmFuZG9tKCksdGhpc319QzV0LnByb3RvdHlwZS5pc1ZlY3RvcjI9ITA7Y2xhc3MgQTV0e2NvbnN0cnVjdG9yKCl7dGhpcy5lbGVtZW50cz1bMSwwLDAsMCwxLDAsMCwwLDFdLGFyZ3VtZW50cy5sZW5ndGg+MCYmY29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4MzogdGhlIGNvbnN0cnVjdG9yIG5vIGxvbmdlciByZWFkcyBhcmd1bWVudHMuIHVzZSAuc2V0KCkgaW5zdGVhZC4iKX1zZXQodCxlLG4saSxyLG8sYSxzLGwpe2NvbnN0IGM9dGhpcy5lbGVtZW50cztyZXR1cm4gY1swXT10LGNbMV09aSxjWzJdPWEsY1szXT1lLGNbNF09cixjWzVdPXMsY1s2XT1uLGNbN109byxjWzhdPWwsdGhpc31pZGVudGl0eSgpe3JldHVybiB0aGlzLnNldCgxLDAsMCwwLDEsMCwwLDAsMSksdGhpc31jb3B5KHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7cmV0dXJuIGVbMF09blswXSxlWzFdPW5bMV0sZVsyXT1uWzJdLGVbM109blszXSxlWzRdPW5bNF0sZVs1XT1uWzVdLGVbNl09bls2XSxlWzddPW5bN10sZVs4XT1uWzhdLHRoaXN9ZXh0cmFjdEJhc2lzKHQsZSxuKXtyZXR1cm4gdC5zZXRGcm9tTWF0cml4M0NvbHVtbih0aGlzLDApLGUuc2V0RnJvbU1hdHJpeDNDb2x1bW4odGhpcywxKSxuLnNldEZyb21NYXRyaXgzQ29sdW1uKHRoaXMsMiksdGhpc31zZXRGcm9tTWF0cml4NCh0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMuc2V0KGVbMF0sZVs0XSxlWzhdLGVbMV0sZVs1XSxlWzldLGVbMl0sZVs2XSxlWzEwXSksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0LHRoaXMpfW11bHRpcGx5TWF0cmljZXModCxlKXtjb25zdCBuPXQuZWxlbWVudHMsaT1lLmVsZW1lbnRzLHI9dGhpcy5lbGVtZW50cyxvPW5bMF0sYT1uWzNdLHM9bls2XSxsPW5bMV0sYz1uWzRdLHU9bls3XSxoPW5bMl0sZD1uWzVdLHA9bls4XSxmPWlbMF0sbT1pWzNdLGc9aVs2XSxfPWlbMV0seT1pWzRdLHY9aVs3XSxiPWlbMl0seD1pWzVdLHc9aVs4XTtyZXR1cm4gclswXT1vKmYrYSpfK3MqYixyWzNdPW8qbSthKnkrcyp4LHJbNl09bypnK2EqditzKncsclsxXT1sKmYrYypfK3UqYixyWzRdPWwqbStjKnkrdSp4LHJbN109bCpnK2Mqdit1KncsclsyXT1oKmYrZCpfK3AqYixyWzVdPWgqbStkKnkrcCp4LHJbOF09aCpnK2QqditwKncsdGhpc31tdWx0aXBseVNjYWxhcih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHM7cmV0dXJuIGVbMF0qPXQsZVszXSo9dCxlWzZdKj10LGVbMV0qPXQsZVs0XSo9dCxlWzddKj10LGVbMl0qPXQsZVs1XSo9dCxlWzhdKj10LHRoaXN9ZGV0ZXJtaW5hbnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFsxXSxpPXRbMl0scj10WzNdLG89dFs0XSxhPXRbNV0scz10WzZdLGw9dFs3XSxjPXRbOF07cmV0dXJuIGUqbypjLWUqYSpsLW4qcipjK24qYSpzK2kqcipsLWkqbypzfWludmVydCgpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cyxlPXRbMF0sbj10WzFdLGk9dFsyXSxyPXRbM10sbz10WzRdLGE9dFs1XSxzPXRbNl0sbD10WzddLGM9dFs4XSx1PWMqby1hKmwsaD1hKnMtYypyLGQ9bCpyLW8qcyxwPWUqdStuKmgraSpkO2lmKDA9PT1wKXJldHVybiB0aGlzLnNldCgwLDAsMCwwLDAsMCwwLDAsMCk7Y29uc3QgZj0xL3A7cmV0dXJuIHRbMF09dSpmLHRbMV09KGkqbC1jKm4pKmYsdFsyXT0oYSpuLWkqbykqZix0WzNdPWgqZix0WzRdPShjKmUtaSpzKSpmLHRbNV09KGkqci1hKmUpKmYsdFs2XT1kKmYsdFs3XT0obipzLWwqZSkqZix0WzhdPShvKmUtbipyKSpmLHRoaXN9dHJhbnNwb3NlKCl7bGV0IHQ7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiB0PWVbMV0sZVsxXT1lWzNdLGVbM109dCx0PWVbMl0sZVsyXT1lWzZdLGVbNl09dCx0PWVbNV0sZVs1XT1lWzddLGVbN109dCx0aGlzfWdldE5vcm1hbE1hdHJpeCh0KXtyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4NCh0KS5pbnZlcnQoKS50cmFuc3Bvc2UoKX10cmFuc3Bvc2VJbnRvQXJyYXkodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiB0WzBdPWVbMF0sdFsxXT1lWzNdLHRbMl09ZVs2XSx0WzNdPWVbMV0sdFs0XT1lWzRdLHRbNV09ZVs3XSx0WzZdPWVbMl0sdFs3XT1lWzVdLHRbOF09ZVs4XSx0aGlzfXNldFV2VHJhbnNmb3JtKHQsZSxuLGkscixvLGEpe2NvbnN0IHM9TWF0aC5jb3MociksbD1NYXRoLnNpbihyKTtyZXR1cm4gdGhpcy5zZXQobipzLG4qbCwtbioocypvK2wqYSkrbyt0LC1pKmwsaSpzLC1pKigtbCpvK3MqYSkrYStlLDAsMCwxKSx0aGlzfXNjYWxlKHQsZSl7Y29uc3Qgbj10aGlzLmVsZW1lbnRzO3JldHVybiBuWzBdKj10LG5bM10qPXQsbls2XSo9dCxuWzFdKj1lLG5bNF0qPWUsbls3XSo9ZSx0aGlzfXJvdGF0ZSh0KXtjb25zdCBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCksaT10aGlzLmVsZW1lbnRzLHI9aVswXSxvPWlbM10sYT1pWzZdLHM9aVsxXSxsPWlbNF0sYz1pWzddO3JldHVybiBpWzBdPWUqcituKnMsaVszXT1lKm8rbipsLGlbNl09ZSphK24qYyxpWzFdPS1uKnIrZSpzLGlbNF09LW4qbytlKmwsaVs3XT0tbiphK2UqYyx0aGlzfXRyYW5zbGF0ZSh0LGUpe2NvbnN0IG49dGhpcy5lbGVtZW50cztyZXR1cm4gblswXSs9dCpuWzJdLG5bM10rPXQqbls1XSxuWzZdKz10Km5bOF0sblsxXSs9ZSpuWzJdLG5bNF0rPWUqbls1XSxuWzddKz1lKm5bOF0sdGhpc31lcXVhbHModCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztmb3IobGV0IHQ9MDt0PDk7dCsrKWlmKGVbdF0hPT1uW3RdKXJldHVybiExO3JldHVybiEwfWZyb21BcnJheSh0LGU9MCl7Zm9yKGxldCBuPTA7bjw5O24rKyl0aGlzLmVsZW1lbnRzW25dPXRbbitlXTtyZXR1cm4gdGhpc310b0FycmF5KHQ9W10sZT0wKXtjb25zdCBuPXRoaXMuZWxlbWVudHM7cmV0dXJuIHRbZV09blswXSx0W2UrMV09blsxXSx0W2UrMl09blsyXSx0W2UrM109blszXSx0W2UrNF09bls0XSx0W2UrNV09bls1XSx0W2UrNl09bls2XSx0W2UrN109bls3XSx0W2UrOF09bls4XSx0fWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9fWxldCBrNXQ7QTV0LnByb3RvdHlwZS5pc01hdHJpeDM9ITA7Y2xhc3MgTDV0e3N0YXRpYyBnZXREYXRhVVJMKHQpe2lmKC9eZGF0YTovaS50ZXN0KHQuc3JjKSlyZXR1cm4gdC5zcmM7aWYoInVuZGVmaW5lZCI9PXR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudClyZXR1cm4gdC5zcmM7bGV0IGU7aWYodCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50KWU9dDtlbHNle3ZvaWQgMD09PWs1dCYmKGs1dD1kb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiLCJjYW52YXMiKSksazV0LndpZHRoPXQud2lkdGgsazV0LmhlaWdodD10LmhlaWdodDtjb25zdCBuPWs1dC5nZXRDb250ZXh0KCIyZCIpO3QgaW5zdGFuY2VvZiBJbWFnZURhdGE/bi5wdXRJbWFnZURhdGEodCwwLDApOm4uZHJhd0ltYWdlKHQsMCwwLHQud2lkdGgsdC5oZWlnaHQpLGU9azV0fXJldHVybiBlLndpZHRoPjIwNDh8fGUuaGVpZ2h0PjIwNDg/KGNvbnNvbGUud2FybigiVEhSRUUuSW1hZ2VVdGlscy5nZXREYXRhVVJMOiBJbWFnZSBjb252ZXJ0ZWQgdG8ganBnIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIix0KSxlLnRvRGF0YVVSTCgiaW1hZ2UvanBlZyIsLjYpKTplLnRvRGF0YVVSTCgiaW1hZ2UvcG5nIil9fWxldCBQNXQ9MDtjbGFzcyBONXQgZXh0ZW5kcyBlNXR7Y29uc3RydWN0b3IodD1ONXQuREVGQVVMVF9JTUFHRSxlPU41dC5ERUZBVUxUX01BUFBJTkcsbj0xMDAxLGk9MTAwMSxyPTEwMDYsbz0xMDA4LGE9MTAyMyxzPTEwMDksbD0xLGM9M2UzKXtzdXBlcigpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOlA1dCsrfSksdGhpcy51dWlkPWE1dCgpLHRoaXMubmFtZT0iIix0aGlzLmltYWdlPXQsdGhpcy5taXBtYXBzPVtdLHRoaXMubWFwcGluZz1lLHRoaXMud3JhcFM9bix0aGlzLndyYXBUPWksdGhpcy5tYWdGaWx0ZXI9cix0aGlzLm1pbkZpbHRlcj1vLHRoaXMuYW5pc290cm9weT1sLHRoaXMuZm9ybWF0PWEsdGhpcy5pbnRlcm5hbEZvcm1hdD1udWxsLHRoaXMudHlwZT1zLHRoaXMub2Zmc2V0PW5ldyBDNXQoMCwwKSx0aGlzLnJlcGVhdD1uZXcgQzV0KDEsMSksdGhpcy5jZW50ZXI9bmV3IEM1dCgwLDApLHRoaXMucm90YXRpb249MCx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9ITAsdGhpcy5tYXRyaXg9bmV3IEE1dCx0aGlzLmdlbmVyYXRlTWlwbWFwcz0hMCx0aGlzLnByZW11bHRpcGx5QWxwaGE9ITEsdGhpcy5mbGlwWT0hMCx0aGlzLnVucGFja0FsaWdubWVudD00LHRoaXMuZW5jb2Rpbmc9Yyx0aGlzLnZlcnNpb249MCx0aGlzLm9uVXBkYXRlPW51bGwsdGhpcy5pc1JlbmRlclRhcmdldFRleHR1cmU9ITF9dXBkYXRlTWF0cml4KCl7dGhpcy5tYXRyaXguc2V0VXZUcmFuc2Zvcm0odGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55LHRoaXMucmVwZWF0LngsdGhpcy5yZXBlYXQueSx0aGlzLnJvdGF0aW9uLHRoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueSl9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5uYW1lPXQubmFtZSx0aGlzLmltYWdlPXQuaW1hZ2UsdGhpcy5taXBtYXBzPXQubWlwbWFwcy5zbGljZSgwKSx0aGlzLm1hcHBpbmc9dC5tYXBwaW5nLHRoaXMud3JhcFM9dC53cmFwUyx0aGlzLndyYXBUPXQud3JhcFQsdGhpcy5tYWdGaWx0ZXI9dC5tYWdGaWx0ZXIsdGhpcy5taW5GaWx0ZXI9dC5taW5GaWx0ZXIsdGhpcy5hbmlzb3Ryb3B5PXQuYW5pc290cm9weSx0aGlzLmZvcm1hdD10LmZvcm1hdCx0aGlzLmludGVybmFsRm9ybWF0PXQuaW50ZXJuYWxGb3JtYXQsdGhpcy50eXBlPXQudHlwZSx0aGlzLm9mZnNldC5jb3B5KHQub2Zmc2V0KSx0aGlzLnJlcGVhdC5jb3B5KHQucmVwZWF0KSx0aGlzLmNlbnRlci5jb3B5KHQuY2VudGVyKSx0aGlzLnJvdGF0aW9uPXQucm90YXRpb24sdGhpcy5tYXRyaXhBdXRvVXBkYXRlPXQubWF0cml4QXV0b1VwZGF0ZSx0aGlzLm1hdHJpeC5jb3B5KHQubWF0cml4KSx0aGlzLmdlbmVyYXRlTWlwbWFwcz10LmdlbmVyYXRlTWlwbWFwcyx0aGlzLnByZW11bHRpcGx5QWxwaGE9dC5wcmVtdWx0aXBseUFscGhhLHRoaXMuZmxpcFk9dC5mbGlwWSx0aGlzLnVucGFja0FsaWdubWVudD10LnVucGFja0FsaWdubWVudCx0aGlzLmVuY29kaW5nPXQuZW5jb2RpbmcsdGhpc310b0pTT04odCl7Y29uc3QgZT12b2lkIDA9PT10fHwic3RyaW5nIj09dHlwZW9mIHQ7aWYoIWUmJnZvaWQgMCE9PXQudGV4dHVyZXNbdGhpcy51dWlkXSlyZXR1cm4gdC50ZXh0dXJlc1t0aGlzLnV1aWRdO2NvbnN0IG49e21ldGFkYXRhOnt2ZXJzaW9uOjQuNSx0eXBlOiJUZXh0dXJlIixnZW5lcmF0b3I6IlRleHR1cmUudG9KU09OIn0sdXVpZDp0aGlzLnV1aWQsbmFtZTp0aGlzLm5hbWUsbWFwcGluZzp0aGlzLm1hcHBpbmcscmVwZWF0Olt0aGlzLnJlcGVhdC54LHRoaXMucmVwZWF0LnldLG9mZnNldDpbdGhpcy5vZmZzZXQueCx0aGlzLm9mZnNldC55XSxjZW50ZXI6W3RoaXMuY2VudGVyLngsdGhpcy5jZW50ZXIueV0scm90YXRpb246dGhpcy5yb3RhdGlvbix3cmFwOlt0aGlzLndyYXBTLHRoaXMud3JhcFRdLGZvcm1hdDp0aGlzLmZvcm1hdCx0eXBlOnRoaXMudHlwZSxlbmNvZGluZzp0aGlzLmVuY29kaW5nLG1pbkZpbHRlcjp0aGlzLm1pbkZpbHRlcixtYWdGaWx0ZXI6dGhpcy5tYWdGaWx0ZXIsYW5pc290cm9weTp0aGlzLmFuaXNvdHJvcHksZmxpcFk6dGhpcy5mbGlwWSxwcmVtdWx0aXBseUFscGhhOnRoaXMucHJlbXVsdGlwbHlBbHBoYSx1bnBhY2tBbGlnbm1lbnQ6dGhpcy51bnBhY2tBbGlnbm1lbnR9O2lmKHZvaWQgMCE9PXRoaXMuaW1hZ2Upe2NvbnN0IGk9dGhpcy5pbWFnZTtpZih2b2lkIDA9PT1pLnV1aWQmJihpLnV1aWQ9YTV0KCkpLCFlJiZ2b2lkIDA9PT10LmltYWdlc1tpLnV1aWRdKXtsZXQgZTtpZihBcnJheS5pc0FycmF5KGkpKXtlPVtdO2ZvcihsZXQgdD0wLG49aS5sZW5ndGg7dDxuO3QrKyllLnB1c2goSTV0KGlbdF0uaXNEYXRhVGV4dHVyZT9pW3RdLmltYWdlOmlbdF0pKX1lbHNlIGU9STV0KGkpO3QuaW1hZ2VzW2kudXVpZF09e3V1aWQ6aS51dWlkLHVybDplfX1uLmltYWdlPWkudXVpZH1yZXR1cm4gZXx8KHQudGV4dHVyZXNbdGhpcy51dWlkXT1uKSxufWRpc3Bvc2UoKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9dHJhbnNmb3JtVXYodCl7aWYodGhpcy5tYXBwaW5nIT09dDJ0KXJldHVybiB0O2lmKHQuYXBwbHlNYXRyaXgzKHRoaXMubWF0cml4KSx0Lng8MHx8dC54PjEpc3dpdGNoKHRoaXMud3JhcFMpe2Nhc2UgczJ0OnQueD10LngtTWF0aC5mbG9vcih0LngpO2JyZWFrO2Nhc2UgbDJ0OnQueD10Lng8MD8wOjE7YnJlYWs7Y2FzZSBjMnQ6dC54PTE9PT1NYXRoLmFicyhNYXRoLmZsb29yKHQueCklMik/TWF0aC5jZWlsKHQueCktdC54OnQueC1NYXRoLmZsb29yKHQueCl9aWYodC55PDB8fHQueT4xKXN3aXRjaCh0aGlzLndyYXBUKXtjYXNlIHMydDp0Lnk9dC55LU1hdGguZmxvb3IodC55KTticmVhaztjYXNlIGwydDp0Lnk9dC55PDA/MDoxO2JyZWFrO2Nhc2UgYzJ0OnQueT0xPT09TWF0aC5hYnMoTWF0aC5mbG9vcih0LnkpJTIpP01hdGguY2VpbCh0LnkpLXQueTp0LnktTWF0aC5mbG9vcih0LnkpfXJldHVybiB0aGlzLmZsaXBZJiYodC55PTEtdC55KSx0fXNldCBuZWVkc1VwZGF0ZSh0KXshMD09PXQmJnRoaXMudmVyc2lvbisrfX1mdW5jdGlvbiBJNXQodCl7cmV0dXJuInVuZGVmaW5lZCIhPXR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50JiZ0IGluc3RhbmNlb2YgSFRNTEltYWdlRWxlbWVudHx8InVuZGVmaW5lZCIhPXR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCYmdCBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50fHwidW5kZWZpbmVkIiE9dHlwZW9mIEltYWdlQml0bWFwJiZ0IGluc3RhbmNlb2YgSW1hZ2VCaXRtYXA/TDV0LmdldERhdGFVUkwodCk6dC5kYXRhP3tkYXRhOkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHQuZGF0YSksd2lkdGg6dC53aWR0aCxoZWlnaHQ6dC5oZWlnaHQsdHlwZTp0LmRhdGEuY29uc3RydWN0b3IubmFtZX06KGNvbnNvbGUud2FybigiVEhSRUUuVGV4dHVyZTogVW5hYmxlIHRvIHNlcmlhbGl6ZSBUZXh0dXJlLiIpLHt9KX1ONXQuREVGQVVMVF9JTUFHRT12b2lkIDAsTjV0LkRFRkFVTFRfTUFQUElORz10MnQsTjV0LnByb3RvdHlwZS5pc1RleHR1cmU9ITA7Y2xhc3MgUjV0e2NvbnN0cnVjdG9yKHQ9MCxlPTAsbj0wLGk9MSl7dGhpcy54PXQsdGhpcy55PWUsdGhpcy56PW4sdGhpcy53PWl9Z2V0IHdpZHRoKCl7cmV0dXJuIHRoaXMuen1zZXQgd2lkdGgodCl7dGhpcy56PXR9Z2V0IGhlaWdodCgpe3JldHVybiB0aGlzLnd9c2V0IGhlaWdodCh0KXt0aGlzLnc9dH1zZXQodCxlLG4saSl7cmV0dXJuIHRoaXMueD10LHRoaXMueT1lLHRoaXMuej1uLHRoaXMudz1pLHRoaXN9c2V0U2NhbGFyKHQpe3JldHVybiB0aGlzLng9dCx0aGlzLnk9dCx0aGlzLno9dCx0aGlzLnc9dCx0aGlzfXNldFgodCl7cmV0dXJuIHRoaXMueD10LHRoaXN9c2V0WSh0KXtyZXR1cm4gdGhpcy55PXQsdGhpc31zZXRaKHQpe3JldHVybiB0aGlzLno9dCx0aGlzfXNldFcodCl7cmV0dXJuIHRoaXMudz10LHRoaXN9c2V0Q29tcG9uZW50KHQsZSl7c3dpdGNoKHQpe2Nhc2UgMDp0aGlzLng9ZTticmVhaztjYXNlIDE6dGhpcy55PWU7YnJlYWs7Y2FzZSAyOnRoaXMuej1lO2JyZWFrO2Nhc2UgMzp0aGlzLnc9ZTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcigiaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAiK3QpfXJldHVybiB0aGlzfWdldENvbXBvbmVudCh0KXtzd2l0Y2godCl7Y2FzZSAwOnJldHVybiB0aGlzLng7Y2FzZSAxOnJldHVybiB0aGlzLnk7Y2FzZSAyOnJldHVybiB0aGlzLno7Y2FzZSAzOnJldHVybiB0aGlzLnc7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX19Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy54LHRoaXMueSx0aGlzLnosdGhpcy53KX1jb3B5KHQpe3JldHVybiB0aGlzLng9dC54LHRoaXMueT10LnksdGhpcy56PXQueix0aGlzLnc9dm9pZCAwIT09dC53P3QudzoxLHRoaXN9YWRkKHQsZSl7cmV0dXJuIHZvaWQgMCE9PWU/KGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yNDogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuYWRkVmVjdG9ycyh0LGUpKToodGhpcy54Kz10LngsdGhpcy55Kz10LnksdGhpcy56Kz10LnosdGhpcy53Kz10LncsdGhpcyl9YWRkU2NhbGFyKHQpe3JldHVybiB0aGlzLngrPXQsdGhpcy55Kz10LHRoaXMueis9dCx0aGlzLncrPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXMuej10LnorZS56LHRoaXMudz10LncrZS53LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzLnorPXQueiplLHRoaXMudys9dC53KmUsdGhpc31zdWIodCxlKXtyZXR1cm4gdm9pZCAwIT09ZT8oY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3I0OiAuc3ViKCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAuc3ViVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5zdWJWZWN0b3JzKHQsZSkpOih0aGlzLngtPXQueCx0aGlzLnktPXQueSx0aGlzLnotPXQueix0aGlzLnctPXQudyx0aGlzKX1zdWJTY2FsYXIodCl7cmV0dXJuIHRoaXMueC09dCx0aGlzLnktPXQsdGhpcy56LT10LHRoaXMudy09dCx0aGlzfXN1YlZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueC1lLngsdGhpcy55PXQueS1lLnksdGhpcy56PXQuei1lLnosdGhpcy53PXQudy1lLncsdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy54Kj10LngsdGhpcy55Kj10LnksdGhpcy56Kj10LnosdGhpcy53Kj10LncsdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kj10LHRoaXMueSo9dCx0aGlzLnoqPXQsdGhpcy53Kj10LHRoaXN9YXBwbHlNYXRyaXg0KHQpe2NvbnN0IGU9dGhpcy54LG49dGhpcy55LGk9dGhpcy56LHI9dGhpcy53LG89dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PW9bMF0qZStvWzRdKm4rb1s4XSppK29bMTJdKnIsdGhpcy55PW9bMV0qZStvWzVdKm4rb1s5XSppK29bMTNdKnIsdGhpcy56PW9bMl0qZStvWzZdKm4rb1sxMF0qaStvWzE0XSpyLHRoaXMudz1vWzNdKmUrb1s3XSpuK29bMTFdKmkrb1sxNV0qcix0aGlzfWRpdmlkZVNjYWxhcih0KXtyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhcigxL3QpfXNldEF4aXNBbmdsZUZyb21RdWF0ZXJuaW9uKHQpe3RoaXMudz0yKk1hdGguYWNvcyh0LncpO2NvbnN0IGU9TWF0aC5zcXJ0KDEtdC53KnQudyk7cmV0dXJuIGU8MWUtND8odGhpcy54PTEsdGhpcy55PTAsdGhpcy56PTApOih0aGlzLng9dC54L2UsdGhpcy55PXQueS9lLHRoaXMuej10LnovZSksdGhpc31zZXRBeGlzQW5nbGVGcm9tUm90YXRpb25NYXRyaXgodCl7bGV0IGUsbixpLHI7Y29uc3Qgbz0uMDEsYT0uMSxzPXQuZWxlbWVudHMsbD1zWzBdLGM9c1s0XSx1PXNbOF0saD1zWzFdLGQ9c1s1XSxwPXNbOV0sZj1zWzJdLG09c1s2XSxnPXNbMTBdO2lmKE1hdGguYWJzKGMtaCk8byYmTWF0aC5hYnModS1mKTxvJiZNYXRoLmFicyhwLW0pPG8pe2lmKE1hdGguYWJzKGMraCk8YSYmTWF0aC5hYnModStmKTxhJiZNYXRoLmFicyhwK20pPGEmJk1hdGguYWJzKGwrZCtnLTMpPGEpcmV0dXJuIHRoaXMuc2V0KDEsMCwwLDApLHRoaXM7ZT1NYXRoLlBJO2NvbnN0IHQ9KGwrMSkvMixzPShkKzEpLzIsXz0oZysxKS8yLHk9KGMraCkvNCx2PSh1K2YpLzQsYj0ocCttKS80O3JldHVybiB0PnMmJnQ+Xz90PG8/KG49MCxpPS43MDcxMDY3ODEscj0uNzA3MTA2NzgxKToobj1NYXRoLnNxcnQodCksaT15L24scj12L24pOnM+Xz9zPG8/KG49LjcwNzEwNjc4MSxpPTAscj0uNzA3MTA2NzgxKTooaT1NYXRoLnNxcnQocyksbj15L2kscj1iL2kpOl88bz8obj0uNzA3MTA2NzgxLGk9LjcwNzEwNjc4MSxyPTApOihyPU1hdGguc3FydChfKSxuPXYvcixpPWIvciksdGhpcy5zZXQobixpLHIsZSksdGhpc31sZXQgXz1NYXRoLnNxcnQoKG0tcCkqKG0tcCkrKHUtZikqKHUtZikrKGgtYykqKGgtYykpO3JldHVybiBNYXRoLmFicyhfKTwuMDAxJiYoXz0xKSx0aGlzLng9KG0tcCkvXyx0aGlzLnk9KHUtZikvXyx0aGlzLno9KGgtYykvXyx0aGlzLnc9TWF0aC5hY29zKChsK2QrZy0xKS8yKSx0aGlzfW1pbih0KXtyZXR1cm4gdGhpcy54PU1hdGgubWluKHRoaXMueCx0LngpLHRoaXMueT1NYXRoLm1pbih0aGlzLnksdC55KSx0aGlzLno9TWF0aC5taW4odGhpcy56LHQueiksdGhpcy53PU1hdGgubWluKHRoaXMudyx0LncpLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1heCh0aGlzLnosdC56KSx0aGlzLnc9TWF0aC5tYXgodGhpcy53LHQudyksdGhpc31jbGFtcCh0LGUpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodC54LE1hdGgubWluKGUueCx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodC55LE1hdGgubWluKGUueSx0aGlzLnkpKSx0aGlzLno9TWF0aC5tYXgodC56LE1hdGgubWluKGUueix0aGlzLnopKSx0aGlzLnc9TWF0aC5tYXgodC53LE1hdGgubWluKGUudyx0aGlzLncpKSx0aGlzfWNsYW1wU2NhbGFyKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy54KSksdGhpcy55PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLnkpKSx0aGlzLno9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueikpLHRoaXMudz1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy53KSksdGhpc31jbGFtcExlbmd0aCh0LGUpe2NvbnN0IG49dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIobnx8MSkubXVsdGlwbHlTY2FsYXIoTWF0aC5tYXgodCxNYXRoLm1pbihlLG4pKSl9Zmxvb3IoKXtyZXR1cm4gdGhpcy54PU1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpLHRoaXMuej1NYXRoLmZsb29yKHRoaXMueiksdGhpcy53PU1hdGguZmxvb3IodGhpcy53KSx0aGlzfWNlaWwoKXtyZXR1cm4gdGhpcy54PU1hdGguY2VpbCh0aGlzLngpLHRoaXMueT1NYXRoLmNlaWwodGhpcy55KSx0aGlzLno9TWF0aC5jZWlsKHRoaXMueiksdGhpcy53PU1hdGguY2VpbCh0aGlzLncpLHRoaXN9cm91bmQoKXtyZXR1cm4gdGhpcy54PU1hdGgucm91bmQodGhpcy54KSx0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpLHRoaXMuej1NYXRoLnJvdW5kKHRoaXMueiksdGhpcy53PU1hdGgucm91bmQodGhpcy53KSx0aGlzfXJvdW5kVG9aZXJvKCl7cmV0dXJuIHRoaXMueD10aGlzLng8MD9NYXRoLmNlaWwodGhpcy54KTpNYXRoLmZsb29yKHRoaXMueCksdGhpcy55PXRoaXMueTwwP01hdGguY2VpbCh0aGlzLnkpOk1hdGguZmxvb3IodGhpcy55KSx0aGlzLno9dGhpcy56PDA/TWF0aC5jZWlsKHRoaXMueik6TWF0aC5mbG9vcih0aGlzLnopLHRoaXMudz10aGlzLnc8MD9NYXRoLmNlaWwodGhpcy53KTpNYXRoLmZsb29yKHRoaXMudyksdGhpc31uZWdhdGUoKXtyZXR1cm4gdGhpcy54PS10aGlzLngsdGhpcy55PS10aGlzLnksdGhpcy56PS10aGlzLnosdGhpcy53PS10aGlzLncsdGhpc31kb3QodCl7cmV0dXJuIHRoaXMueCp0LngrdGhpcy55KnQueSt0aGlzLnoqdC56K3RoaXMudyp0Lnd9bGVuZ3RoU3EoKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnordGhpcy53KnRoaXMud31sZW5ndGgoKXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMueCp0aGlzLngrdGhpcy55KnRoaXMueSt0aGlzLnoqdGhpcy56K3RoaXMudyp0aGlzLncpfW1hbmhhdHRhbkxlbmd0aCgpe3JldHVybiBNYXRoLmFicyh0aGlzLngpK01hdGguYWJzKHRoaXMueSkrTWF0aC5hYnModGhpcy56KStNYXRoLmFicyh0aGlzLncpfW5vcm1hbGl6ZSgpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX1zZXRMZW5ndGgodCl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodCl9bGVycCh0LGUpe3JldHVybiB0aGlzLngrPSh0LngtdGhpcy54KSplLHRoaXMueSs9KHQueS10aGlzLnkpKmUsdGhpcy56Kz0odC56LXRoaXMueikqZSx0aGlzLncrPSh0LnctdGhpcy53KSplLHRoaXN9bGVycFZlY3RvcnModCxlLG4pe3JldHVybiB0aGlzLng9dC54KyhlLngtdC54KSpuLHRoaXMueT10LnkrKGUueS10LnkpKm4sdGhpcy56PXQueisoZS56LXQueikqbix0aGlzLnc9dC53KyhlLnctdC53KSpuLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lng9PT10aGlzLngmJnQueT09PXRoaXMueSYmdC56PT09dGhpcy56JiZ0Lnc9PT10aGlzLnd9ZnJvbUFycmF5KHQsZT0wKXtyZXR1cm4gdGhpcy54PXRbZV0sdGhpcy55PXRbZSsxXSx0aGlzLno9dFtlKzJdLHRoaXMudz10W2UrM10sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0W2UrMl09dGhpcy56LHRbZSszXT10aGlzLncsdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSxuKXtyZXR1cm4gdm9pZCAwIT09biYmY29uc29sZS53YXJuKCJUSFJFRS5WZWN0b3I0OiBvZmZzZXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuIiksdGhpcy54PXQuZ2V0WChlKSx0aGlzLnk9dC5nZXRZKGUpLHRoaXMuej10LmdldFooZSksdGhpcy53PXQuZ2V0VyhlKSx0aGlzfXJhbmRvbSgpe3JldHVybiB0aGlzLng9TWF0aC5yYW5kb20oKSx0aGlzLnk9TWF0aC5yYW5kb20oKSx0aGlzLno9TWF0aC5yYW5kb20oKSx0aGlzLnc9TWF0aC5yYW5kb20oKSx0aGlzfX1SNXQucHJvdG90eXBlLmlzVmVjdG9yND0hMDtjbGFzcyBPNXQgZXh0ZW5kcyBlNXR7Y29uc3RydWN0b3IodCxlLG49e30pe3N1cGVyKCksdGhpcy53aWR0aD10LHRoaXMuaGVpZ2h0PWUsdGhpcy5kZXB0aD0xLHRoaXMuc2Npc3Nvcj1uZXcgUjV0KDAsMCx0LGUpLHRoaXMuc2Npc3NvclRlc3Q9ITEsdGhpcy52aWV3cG9ydD1uZXcgUjV0KDAsMCx0LGUpLHRoaXMudGV4dHVyZT1uZXcgTjV0KHZvaWQgMCxuLm1hcHBpbmcsbi53cmFwUyxuLndyYXBULG4ubWFnRmlsdGVyLG4ubWluRmlsdGVyLG4uZm9ybWF0LG4udHlwZSxuLmFuaXNvdHJvcHksbi5lbmNvZGluZyksdGhpcy50ZXh0dXJlLmlzUmVuZGVyVGFyZ2V0VGV4dHVyZT0hMCx0aGlzLnRleHR1cmUuaW1hZ2U9e3dpZHRoOnQsaGVpZ2h0OmUsZGVwdGg6MX0sdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz12b2lkIDAhPT1uLmdlbmVyYXRlTWlwbWFwcyYmbi5nZW5lcmF0ZU1pcG1hcHMsdGhpcy50ZXh0dXJlLm1pbkZpbHRlcj12b2lkIDAhPT1uLm1pbkZpbHRlcj9uLm1pbkZpbHRlcjpwMnQsdGhpcy5kZXB0aEJ1ZmZlcj12b2lkIDA9PT1uLmRlcHRoQnVmZmVyfHxuLmRlcHRoQnVmZmVyLHRoaXMuc3RlbmNpbEJ1ZmZlcj12b2lkIDAhPT1uLnN0ZW5jaWxCdWZmZXImJm4uc3RlbmNpbEJ1ZmZlcix0aGlzLmRlcHRoVGV4dHVyZT12b2lkIDAhPT1uLmRlcHRoVGV4dHVyZT9uLmRlcHRoVGV4dHVyZTpudWxsfXNldFRleHR1cmUodCl7dC5pbWFnZT17d2lkdGg6dGhpcy53aWR0aCxoZWlnaHQ6dGhpcy5oZWlnaHQsZGVwdGg6dGhpcy5kZXB0aH0sdGhpcy50ZXh0dXJlPXR9c2V0U2l6ZSh0LGUsbj0xKXt0aGlzLndpZHRoPT09dCYmdGhpcy5oZWlnaHQ9PT1lJiZ0aGlzLmRlcHRoPT09bnx8KHRoaXMud2lkdGg9dCx0aGlzLmhlaWdodD1lLHRoaXMuZGVwdGg9bix0aGlzLnRleHR1cmUuaW1hZ2Uud2lkdGg9dCx0aGlzLnRleHR1cmUuaW1hZ2UuaGVpZ2h0PWUsdGhpcy50ZXh0dXJlLmltYWdlLmRlcHRoPW4sdGhpcy5kaXNwb3NlKCkpLHRoaXMudmlld3BvcnQuc2V0KDAsMCx0LGUpLHRoaXMuc2Npc3Nvci5zZXQoMCwwLHQsZSl9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy53aWR0aD10LndpZHRoLHRoaXMuaGVpZ2h0PXQuaGVpZ2h0LHRoaXMuZGVwdGg9dC5kZXB0aCx0aGlzLnZpZXdwb3J0LmNvcHkodC52aWV3cG9ydCksdGhpcy50ZXh0dXJlPXQudGV4dHVyZS5jbG9uZSgpLHRoaXMudGV4dHVyZS5pbWFnZT17Li4udGhpcy50ZXh0dXJlLmltYWdlfSx0aGlzLmRlcHRoQnVmZmVyPXQuZGVwdGhCdWZmZXIsdGhpcy5zdGVuY2lsQnVmZmVyPXQuc3RlbmNpbEJ1ZmZlcix0aGlzLmRlcHRoVGV4dHVyZT10LmRlcHRoVGV4dHVyZSx0aGlzfWRpc3Bvc2UoKXt0aGlzLmRpc3BhdGNoRXZlbnQoe3R5cGU6ImRpc3Bvc2UifSl9fU81dC5wcm90b3R5cGUuaXNXZWJHTFJlbmRlclRhcmdldD0hMDtjbGFzcyB6NXQgZXh0ZW5kcyBPNXR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKHQsZSk7Y29uc3QgaT10aGlzLnRleHR1cmU7dGhpcy50ZXh0dXJlPVtdO2ZvcihsZXQgdD0wO3Q8bjt0KyspdGhpcy50ZXh0dXJlW3RdPWkuY2xvbmUoKX1zZXRTaXplKHQsZSxuPTEpe2lmKHRoaXMud2lkdGghPT10fHx0aGlzLmhlaWdodCE9PWV8fHRoaXMuZGVwdGghPT1uKXt0aGlzLndpZHRoPXQsdGhpcy5oZWlnaHQ9ZSx0aGlzLmRlcHRoPW47Zm9yKGxldCBpPTAscj10aGlzLnRleHR1cmUubGVuZ3RoO2k8cjtpKyspdGhpcy50ZXh0dXJlW2ldLmltYWdlLndpZHRoPXQsdGhpcy50ZXh0dXJlW2ldLmltYWdlLmhlaWdodD1lLHRoaXMudGV4dHVyZVtpXS5pbWFnZS5kZXB0aD1uO3RoaXMuZGlzcG9zZSgpfXJldHVybiB0aGlzLnZpZXdwb3J0LnNldCgwLDAsdCxlKSx0aGlzLnNjaXNzb3Iuc2V0KDAsMCx0LGUpLHRoaXN9Y29weSh0KXt0aGlzLmRpc3Bvc2UoKSx0aGlzLndpZHRoPXQud2lkdGgsdGhpcy5oZWlnaHQ9dC5oZWlnaHQsdGhpcy5kZXB0aD10LmRlcHRoLHRoaXMudmlld3BvcnQuc2V0KDAsMCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KSx0aGlzLnNjaXNzb3Iuc2V0KDAsMCx0aGlzLndpZHRoLHRoaXMuaGVpZ2h0KSx0aGlzLmRlcHRoQnVmZmVyPXQuZGVwdGhCdWZmZXIsdGhpcy5zdGVuY2lsQnVmZmVyPXQuc3RlbmNpbEJ1ZmZlcix0aGlzLmRlcHRoVGV4dHVyZT10LmRlcHRoVGV4dHVyZSx0aGlzLnRleHR1cmUubGVuZ3RoPTA7Zm9yKGxldCBlPTAsbj10LnRleHR1cmUubGVuZ3RoO2U8bjtlKyspdGhpcy50ZXh0dXJlW2VdPXQudGV4dHVyZVtlXS5jbG9uZSgpO3JldHVybiB0aGlzfX16NXQucHJvdG90eXBlLmlzV2ViR0xNdWx0aXBsZVJlbmRlclRhcmdldHM9ITA7Y2xhc3MgRDV0IGV4dGVuZHMgTzV0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcih0LGUsbiksdGhpcy5zYW1wbGVzPTR9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weS5jYWxsKHRoaXMsdCksdGhpcy5zYW1wbGVzPXQuc2FtcGxlcyx0aGlzfX1ENXQucHJvdG90eXBlLmlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldD0hMDtjbGFzcyBCNXR7Y29uc3RydWN0b3IodD0wLGU9MCxuPTAsaT0xKXt0aGlzLl94PXQsdGhpcy5feT1lLHRoaXMuX3o9bix0aGlzLl93PWl9c3RhdGljIHNsZXJwKHQsZSxuLGkpe3JldHVybiBjb25zb2xlLndhcm4oIlRIUkVFLlF1YXRlcm5pb246IFN0YXRpYyAuc2xlcnAoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgcW0uc2xlcnBRdWF0ZXJuaW9ucyggcWEsIHFiLCB0ICkgaW5zdGVhZC4iKSxuLnNsZXJwUXVhdGVybmlvbnModCxlLGkpfXN0YXRpYyBzbGVycEZsYXQodCxlLG4saSxyLG8sYSl7bGV0IHM9bltpKzBdLGw9bltpKzFdLGM9bltpKzJdLHU9bltpKzNdO2NvbnN0IGg9cltvKzBdLGQ9cltvKzFdLHA9cltvKzJdLGY9cltvKzNdO2lmKDA9PT1hKXJldHVybiB0W2UrMF09cyx0W2UrMV09bCx0W2UrMl09Yyx2b2lkKHRbZSszXT11KTtpZigxPT09YSlyZXR1cm4gdFtlKzBdPWgsdFtlKzFdPWQsdFtlKzJdPXAsdm9pZCh0W2UrM109Zik7aWYodSE9PWZ8fHMhPT1ofHxsIT09ZHx8YyE9PXApe2xldCB0PTEtYTtjb25zdCBlPXMqaCtsKmQrYypwK3UqZixuPWU+PTA/MTotMSxpPTEtZSplO2lmKGk+TnVtYmVyLkVQU0lMT04pe2NvbnN0IHI9TWF0aC5zcXJ0KGkpLG89TWF0aC5hdGFuMihyLGUqbik7dD1NYXRoLnNpbih0Km8pL3IsYT1NYXRoLnNpbihhKm8pL3J9Y29uc3Qgcj1hKm47aWYocz1zKnQraCpyLGw9bCp0K2QqcixjPWMqdCtwKnIsdT11KnQrZipyLHQ9PT0xLWEpe2NvbnN0IHQ9MS9NYXRoLnNxcnQocypzK2wqbCtjKmMrdSp1KTtzKj10LGwqPXQsYyo9dCx1Kj10fX10W2VdPXMsdFtlKzFdPWwsdFtlKzJdPWMsdFtlKzNdPXV9c3RhdGljIG11bHRpcGx5UXVhdGVybmlvbnNGbGF0KHQsZSxuLGkscixvKXtjb25zdCBhPW5baV0scz1uW2krMV0sbD1uW2krMl0sYz1uW2krM10sdT1yW29dLGg9cltvKzFdLGQ9cltvKzJdLHA9cltvKzNdO3JldHVybiB0W2VdPWEqcCtjKnUrcypkLWwqaCx0W2UrMV09cypwK2MqaCtsKnUtYSpkLHRbZSsyXT1sKnArYypkK2EqaC1zKnUsdFtlKzNdPWMqcC1hKnUtcypoLWwqZCx0fWdldCB4KCl7cmV0dXJuIHRoaXMuX3h9c2V0IHgodCl7dGhpcy5feD10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeSgpe3JldHVybiB0aGlzLl95fXNldCB5KHQpe3RoaXMuX3k9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IHooKXtyZXR1cm4gdGhpcy5fen1zZXQgeih0KXt0aGlzLl96PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB3KCl7cmV0dXJuIHRoaXMuX3d9c2V0IHcodCl7dGhpcy5fdz10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1zZXQodCxlLG4saSl7cmV0dXJuIHRoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5fej1uLHRoaXMuX3c9aSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31jbG9uZSgpe3JldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3Rvcih0aGlzLl94LHRoaXMuX3ksdGhpcy5feix0aGlzLl93KX1jb3B5KHQpe3JldHVybiB0aGlzLl94PXQueCx0aGlzLl95PXQueSx0aGlzLl96PXQueix0aGlzLl93PXQudyx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tRXVsZXIodCxlKXtpZighdHx8IXQuaXNFdWxlcil0aHJvdyBuZXcgRXJyb3IoIlRIUkVFLlF1YXRlcm5pb246IC5zZXRGcm9tRXVsZXIoKSBub3cgZXhwZWN0cyBhbiBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLiIpO2NvbnN0IG49dC5feCxpPXQuX3kscj10Ll96LG89dC5fb3JkZXIsYT1NYXRoLmNvcyxzPU1hdGguc2luLGw9YShuLzIpLGM9YShpLzIpLHU9YShyLzIpLGg9cyhuLzIpLGQ9cyhpLzIpLHA9cyhyLzIpO3N3aXRjaChvKXtjYXNlIlhZWiI6dGhpcy5feD1oKmMqdStsKmQqcCx0aGlzLl95PWwqZCp1LWgqYypwLHRoaXMuX3o9bCpjKnAraCpkKnUsdGhpcy5fdz1sKmMqdS1oKmQqcDticmVhaztjYXNlIllYWiI6dGhpcy5feD1oKmMqdStsKmQqcCx0aGlzLl95PWwqZCp1LWgqYypwLHRoaXMuX3o9bCpjKnAtaCpkKnUsdGhpcy5fdz1sKmMqdStoKmQqcDticmVhaztjYXNlIlpYWSI6dGhpcy5feD1oKmMqdS1sKmQqcCx0aGlzLl95PWwqZCp1K2gqYypwLHRoaXMuX3o9bCpjKnAraCpkKnUsdGhpcy5fdz1sKmMqdS1oKmQqcDticmVhaztjYXNlIlpZWCI6dGhpcy5feD1oKmMqdS1sKmQqcCx0aGlzLl95PWwqZCp1K2gqYypwLHRoaXMuX3o9bCpjKnAtaCpkKnUsdGhpcy5fdz1sKmMqdStoKmQqcDticmVhaztjYXNlIllaWCI6dGhpcy5feD1oKmMqdStsKmQqcCx0aGlzLl95PWwqZCp1K2gqYypwLHRoaXMuX3o9bCpjKnAtaCpkKnUsdGhpcy5fdz1sKmMqdS1oKmQqcDticmVhaztjYXNlIlhaWSI6dGhpcy5feD1oKmMqdS1sKmQqcCx0aGlzLl95PWwqZCp1LWgqYypwLHRoaXMuX3o9bCpjKnAraCpkKnUsdGhpcy5fdz1sKmMqdStoKmQqcDticmVhaztkZWZhdWx0OmNvbnNvbGUud2FybigiVEhSRUUuUXVhdGVybmlvbjogLnNldEZyb21FdWxlcigpIGVuY291bnRlcmVkIGFuIHVua25vd24gb3JkZXI6ICIrbyl9cmV0dXJuITEhPT1lJiZ0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tQXhpc0FuZ2xlKHQsZSl7Y29uc3Qgbj1lLzIsaT1NYXRoLnNpbihuKTtyZXR1cm4gdGhpcy5feD10LngqaSx0aGlzLl95PXQueSppLHRoaXMuX3o9dC56KmksdGhpcy5fdz1NYXRoLmNvcyhuKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tUm90YXRpb25NYXRyaXgodCl7Y29uc3QgZT10LmVsZW1lbnRzLG49ZVswXSxpPWVbNF0scj1lWzhdLG89ZVsxXSxhPWVbNV0scz1lWzldLGw9ZVsyXSxjPWVbNl0sdT1lWzEwXSxoPW4rYSt1O2lmKGg+MCl7Y29uc3QgdD0uNS9NYXRoLnNxcnQoaCsxKTt0aGlzLl93PS4yNS90LHRoaXMuX3g9KGMtcykqdCx0aGlzLl95PShyLWwpKnQsdGhpcy5fej0oby1pKSp0fWVsc2UgaWYobj5hJiZuPnUpe2NvbnN0IHQ9MipNYXRoLnNxcnQoMStuLWEtdSk7dGhpcy5fdz0oYy1zKS90LHRoaXMuX3g9LjI1KnQsdGhpcy5feT0oaStvKS90LHRoaXMuX3o9KHIrbCkvdH1lbHNlIGlmKGE+dSl7Y29uc3QgdD0yKk1hdGguc3FydCgxK2Etbi11KTt0aGlzLl93PShyLWwpL3QsdGhpcy5feD0oaStvKS90LHRoaXMuX3k9LjI1KnQsdGhpcy5fej0ocytjKS90fWVsc2V7Y29uc3QgdD0yKk1hdGguc3FydCgxK3Utbi1hKTt0aGlzLl93PShvLWkpL3QsdGhpcy5feD0ocitsKS90LHRoaXMuX3k9KHMrYykvdCx0aGlzLl96PS4yNSp0fXJldHVybiB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zZXRGcm9tVW5pdFZlY3RvcnModCxlKXtsZXQgbj10LmRvdChlKSsxO3JldHVybiBuPE51bWJlci5FUFNJTE9OPyhuPTAsTWF0aC5hYnModC54KT5NYXRoLmFicyh0LnopPyh0aGlzLl94PS10LnksdGhpcy5feT10LngsdGhpcy5fej0wLHRoaXMuX3c9bik6KHRoaXMuX3g9MCx0aGlzLl95PS10LnosdGhpcy5fej10LnksdGhpcy5fdz1uKSk6KHRoaXMuX3g9dC55KmUuei10LnoqZS55LHRoaXMuX3k9dC56KmUueC10LngqZS56LHRoaXMuX3o9dC54KmUueS10LnkqZS54LHRoaXMuX3c9biksdGhpcy5ub3JtYWxpemUoKX1hbmdsZVRvKHQpe3JldHVybiAyKk1hdGguYWNvcyhNYXRoLmFicyhzNXQodGhpcy5kb3QodCksLTEsMSkpKX1yb3RhdGVUb3dhcmRzKHQsZSl7Y29uc3Qgbj10aGlzLmFuZ2xlVG8odCk7aWYoMD09PW4pcmV0dXJuIHRoaXM7Y29uc3QgaT1NYXRoLm1pbigxLGUvbik7cmV0dXJuIHRoaXMuc2xlcnAodCxpKSx0aGlzfWlkZW50aXR5KCl7cmV0dXJuIHRoaXMuc2V0KDAsMCwwLDEpfWludmVydCgpe3JldHVybiB0aGlzLmNvbmp1Z2F0ZSgpfWNvbmp1Z2F0ZSgpe3JldHVybiB0aGlzLl94Kj0tMSx0aGlzLl95Kj0tMSx0aGlzLl96Kj0tMSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31kb3QodCl7cmV0dXJuIHRoaXMuX3gqdC5feCt0aGlzLl95KnQuX3krdGhpcy5feip0Ll96K3RoaXMuX3cqdC5fd31sZW5ndGhTcSgpe3JldHVybiB0aGlzLl94KnRoaXMuX3grdGhpcy5feSp0aGlzLl95K3RoaXMuX3oqdGhpcy5feit0aGlzLl93KnRoaXMuX3d9bGVuZ3RoKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLl94KnRoaXMuX3grdGhpcy5feSp0aGlzLl95K3RoaXMuX3oqdGhpcy5feit0aGlzLl93KnRoaXMuX3cpfW5vcm1hbGl6ZSgpe2xldCB0PXRoaXMubGVuZ3RoKCk7cmV0dXJuIDA9PT10Pyh0aGlzLl94PTAsdGhpcy5feT0wLHRoaXMuX3o9MCx0aGlzLl93PTEpOih0PTEvdCx0aGlzLl94PXRoaXMuX3gqdCx0aGlzLl95PXRoaXMuX3kqdCx0aGlzLl96PXRoaXMuX3oqdCx0aGlzLl93PXRoaXMuX3cqdCksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9bXVsdGlwbHkodCxlKXtyZXR1cm4gdm9pZCAwIT09ZT8oY29uc29sZS53YXJuKCJUSFJFRS5RdWF0ZXJuaW9uOiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseVF1YXRlcm5pb25zKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLm11bHRpcGx5UXVhdGVybmlvbnModCxlKSk6dGhpcy5tdWx0aXBseVF1YXRlcm5pb25zKHRoaXMsdCl9cHJlbXVsdGlwbHkodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlRdWF0ZXJuaW9ucyh0LHRoaXMpfW11bHRpcGx5UXVhdGVybmlvbnModCxlKXtjb25zdCBuPXQuX3gsaT10Ll95LHI9dC5feixvPXQuX3csYT1lLl94LHM9ZS5feSxsPWUuX3osYz1lLl93O3JldHVybiB0aGlzLl94PW4qYytvKmEraSpsLXIqcyx0aGlzLl95PWkqYytvKnMrciphLW4qbCx0aGlzLl96PXIqYytvKmwrbipzLWkqYSx0aGlzLl93PW8qYy1uKmEtaSpzLXIqbCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zbGVycCh0LGUpe2lmKDA9PT1lKXJldHVybiB0aGlzO2lmKDE9PT1lKXJldHVybiB0aGlzLmNvcHkodCk7Y29uc3Qgbj10aGlzLl94LGk9dGhpcy5feSxyPXRoaXMuX3osbz10aGlzLl93O2xldCBhPW8qdC5fdytuKnQuX3graSp0Ll95K3IqdC5fejtpZihhPDA/KHRoaXMuX3c9LXQuX3csdGhpcy5feD0tdC5feCx0aGlzLl95PS10Ll95LHRoaXMuX3o9LXQuX3osYT0tYSk6dGhpcy5jb3B5KHQpLGE+PTEpcmV0dXJuIHRoaXMuX3c9byx0aGlzLl94PW4sdGhpcy5feT1pLHRoaXMuX3o9cix0aGlzO2NvbnN0IHM9MS1hKmE7aWYoczw9TnVtYmVyLkVQU0lMT04pe2NvbnN0IHQ9MS1lO3JldHVybiB0aGlzLl93PXQqbytlKnRoaXMuX3csdGhpcy5feD10Km4rZSp0aGlzLl94LHRoaXMuX3k9dCppK2UqdGhpcy5feSx0aGlzLl96PXQqcitlKnRoaXMuX3osdGhpcy5ub3JtYWxpemUoKSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31jb25zdCBsPU1hdGguc3FydChzKSxjPU1hdGguYXRhbjIobCxhKSx1PU1hdGguc2luKCgxLWUpKmMpL2wsaD1NYXRoLnNpbihlKmMpL2w7cmV0dXJuIHRoaXMuX3c9byp1K3RoaXMuX3cqaCx0aGlzLl94PW4qdSt0aGlzLl94KmgsdGhpcy5feT1pKnUrdGhpcy5feSpoLHRoaXMuX3o9cip1K3RoaXMuX3oqaCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc31zbGVycFF1YXRlcm5pb25zKHQsZSxuKXt0aGlzLmNvcHkodCkuc2xlcnAoZSxuKX1lcXVhbHModCl7cmV0dXJuIHQuX3g9PT10aGlzLl94JiZ0Ll95PT09dGhpcy5feSYmdC5fej09PXRoaXMuX3omJnQuX3c9PT10aGlzLl93fWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMuX3g9dFtlXSx0aGlzLl95PXRbZSsxXSx0aGlzLl96PXRbZSsyXSx0aGlzLl93PXRbZSszXSx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCksdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLl94LHRbZSsxXT10aGlzLl95LHRbZSsyXT10aGlzLl96LHRbZSszXT10aGlzLl93LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpe3JldHVybiB0aGlzLl94PXQuZ2V0WChlKSx0aGlzLl95PXQuZ2V0WShlKSx0aGlzLl96PXQuZ2V0WihlKSx0aGlzLl93PXQuZ2V0VyhlKSx0aGlzfV9vbkNoYW5nZSh0KXtyZXR1cm4gdGhpcy5fb25DaGFuZ2VDYWxsYmFjaz10LHRoaXN9X29uQ2hhbmdlQ2FsbGJhY2soKXt9fUI1dC5wcm90b3R5cGUuaXNRdWF0ZXJuaW9uPSEwO2NsYXNzIEg1dHtjb25zdHJ1Y3Rvcih0PTAsZT0wLG49MCl7dGhpcy54PXQsdGhpcy55PWUsdGhpcy56PW59c2V0KHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09biYmKG49dGhpcy56KSx0aGlzLng9dCx0aGlzLnk9ZSx0aGlzLno9bix0aGlzfXNldFNjYWxhcih0KXtyZXR1cm4gdGhpcy54PXQsdGhpcy55PXQsdGhpcy56PXQsdGhpc31zZXRYKHQpe3JldHVybiB0aGlzLng9dCx0aGlzfXNldFkodCl7cmV0dXJuIHRoaXMueT10LHRoaXN9c2V0Wih0KXtyZXR1cm4gdGhpcy56PXQsdGhpc31zZXRDb21wb25lbnQodCxlKXtzd2l0Y2godCl7Y2FzZSAwOnRoaXMueD1lO2JyZWFrO2Nhc2UgMTp0aGlzLnk9ZTticmVhaztjYXNlIDI6dGhpcy56PWU7YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoImluZGV4IGlzIG91dCBvZiByYW5nZTogIit0KX1yZXR1cm4gdGhpc31nZXRDb21wb25lbnQodCl7c3dpdGNoKHQpe2Nhc2UgMDpyZXR1cm4gdGhpcy54O2Nhc2UgMTpyZXR1cm4gdGhpcy55O2Nhc2UgMjpyZXR1cm4gdGhpcy56O2RlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKCJpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICIrdCl9fWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMueCx0aGlzLnksdGhpcy56KX1jb3B5KHQpe3JldHVybiB0aGlzLng9dC54LHRoaXMueT10LnksdGhpcy56PXQueix0aGlzfWFkZCh0LGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4iKSx0aGlzLmFkZFZlY3RvcnModCxlKSk6KHRoaXMueCs9dC54LHRoaXMueSs9dC55LHRoaXMueis9dC56LHRoaXMpfWFkZFNjYWxhcih0KXtyZXR1cm4gdGhpcy54Kz10LHRoaXMueSs9dCx0aGlzLnorPXQsdGhpc31hZGRWZWN0b3JzKHQsZSl7cmV0dXJuIHRoaXMueD10LngrZS54LHRoaXMueT10LnkrZS55LHRoaXMuej10LnorZS56LHRoaXN9YWRkU2NhbGVkVmVjdG9yKHQsZSl7cmV0dXJuIHRoaXMueCs9dC54KmUsdGhpcy55Kz10LnkqZSx0aGlzLnorPXQueiplLHRoaXN9c3ViKHQsZSl7cmV0dXJuIHZvaWQgMCE9PWU/KGNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogLnN1YigpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLnN1YlZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMuc3ViVmVjdG9ycyh0LGUpKToodGhpcy54LT10LngsdGhpcy55LT10LnksdGhpcy56LT10LnosdGhpcyl9c3ViU2NhbGFyKHQpe3JldHVybiB0aGlzLngtPXQsdGhpcy55LT10LHRoaXMuei09dCx0aGlzfXN1YlZlY3RvcnModCxlKXtyZXR1cm4gdGhpcy54PXQueC1lLngsdGhpcy55PXQueS1lLnksdGhpcy56PXQuei1lLnosdGhpc31tdWx0aXBseSh0LGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5VmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5tdWx0aXBseVZlY3RvcnModCxlKSk6KHRoaXMueCo9dC54LHRoaXMueSo9dC55LHRoaXMueio9dC56LHRoaXMpfW11bHRpcGx5U2NhbGFyKHQpe3JldHVybiB0aGlzLngqPXQsdGhpcy55Kj10LHRoaXMueio9dCx0aGlzfW11bHRpcGx5VmVjdG9ycyh0LGUpe3JldHVybiB0aGlzLng9dC54KmUueCx0aGlzLnk9dC55KmUueSx0aGlzLno9dC56KmUueix0aGlzfWFwcGx5RXVsZXIodCl7cmV0dXJuIHQmJnQuaXNFdWxlcnx8Y29uc29sZS5lcnJvcigiVEhSRUUuVmVjdG9yMzogLmFwcGx5RXVsZXIoKSBub3cgZXhwZWN0cyBhbiBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLiIpLHRoaXMuYXBwbHlRdWF0ZXJuaW9uKFY1dC5zZXRGcm9tRXVsZXIodCkpfWFwcGx5QXhpc0FuZ2xlKHQsZSl7cmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKFY1dC5zZXRGcm9tQXhpc0FuZ2xlKHQsZSkpfWFwcGx5TWF0cml4Myh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxpPXRoaXMueixyPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1yWzBdKmUrclszXSpuK3JbNl0qaSx0aGlzLnk9clsxXSplK3JbNF0qbityWzddKmksdGhpcy56PXJbMl0qZStyWzVdKm4rcls4XSppLHRoaXN9YXBwbHlOb3JtYWxNYXRyaXgodCl7cmV0dXJuIHRoaXMuYXBwbHlNYXRyaXgzKHQpLm5vcm1hbGl6ZSgpfWFwcGx5TWF0cml4NCh0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxpPXRoaXMueixyPXQuZWxlbWVudHMsbz0xLyhyWzNdKmUrcls3XSpuK3JbMTFdKmkrclsxNV0pO3JldHVybiB0aGlzLng9KHJbMF0qZStyWzRdKm4rcls4XSppK3JbMTJdKSpvLHRoaXMueT0oclsxXSplK3JbNV0qbityWzldKmkrclsxM10pKm8sdGhpcy56PShyWzJdKmUrcls2XSpuK3JbMTBdKmkrclsxNF0pKm8sdGhpc31hcHBseVF1YXRlcm5pb24odCl7Y29uc3QgZT10aGlzLngsbj10aGlzLnksaT10aGlzLnoscj10Lngsbz10LnksYT10Lnoscz10LncsbD1zKmUrbyppLWEqbixjPXMqbithKmUtcippLHU9cyppK3Iqbi1vKmUsaD0tciplLW8qbi1hKmk7cmV0dXJuIHRoaXMueD1sKnMraCotcitjKi1hLXUqLW8sdGhpcy55PWMqcytoKi1vK3UqLXItbCotYSx0aGlzLno9dSpzK2gqLWErbCotby1jKi1yLHRoaXN9cHJvamVjdCh0KXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZEludmVyc2UpLmFwcGx5TWF0cml4NCh0LnByb2plY3Rpb25NYXRyaXgpfXVucHJvamVjdCh0KXtyZXR1cm4gdGhpcy5hcHBseU1hdHJpeDQodC5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSkuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpfXRyYW5zZm9ybURpcmVjdGlvbih0KXtjb25zdCBlPXRoaXMueCxuPXRoaXMueSxpPXRoaXMueixyPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMueD1yWzBdKmUrcls0XSpuK3JbOF0qaSx0aGlzLnk9clsxXSplK3JbNV0qbityWzldKmksdGhpcy56PXJbMl0qZStyWzZdKm4rclsxMF0qaSx0aGlzLm5vcm1hbGl6ZSgpfWRpdmlkZSh0KXtyZXR1cm4gdGhpcy54Lz10LngsdGhpcy55Lz10LnksdGhpcy56Lz10LnosdGhpc31kaXZpZGVTY2FsYXIodCl7cmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoMS90KX1taW4odCl7cmV0dXJuIHRoaXMueD1NYXRoLm1pbih0aGlzLngsdC54KSx0aGlzLnk9TWF0aC5taW4odGhpcy55LHQueSksdGhpcy56PU1hdGgubWluKHRoaXMueix0LnopLHRoaXN9bWF4KHQpe3JldHVybiB0aGlzLng9TWF0aC5tYXgodGhpcy54LHQueCksdGhpcy55PU1hdGgubWF4KHRoaXMueSx0LnkpLHRoaXMuej1NYXRoLm1heCh0aGlzLnosdC56KSx0aGlzfWNsYW1wKHQsZSl7cmV0dXJuIHRoaXMueD1NYXRoLm1heCh0LngsTWF0aC5taW4oZS54LHRoaXMueCkpLHRoaXMueT1NYXRoLm1heCh0LnksTWF0aC5taW4oZS55LHRoaXMueSkpLHRoaXMuej1NYXRoLm1heCh0LnosTWF0aC5taW4oZS56LHRoaXMueikpLHRoaXN9Y2xhbXBTY2FsYXIodCxlKXtyZXR1cm4gdGhpcy54PU1hdGgubWF4KHQsTWF0aC5taW4oZSx0aGlzLngpKSx0aGlzLnk9TWF0aC5tYXgodCxNYXRoLm1pbihlLHRoaXMueSkpLHRoaXMuej1NYXRoLm1heCh0LE1hdGgubWluKGUsdGhpcy56KSksdGhpc31jbGFtcExlbmd0aCh0LGUpe2NvbnN0IG49dGhpcy5sZW5ndGgoKTtyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIobnx8MSkubXVsdGlwbHlTY2FsYXIoTWF0aC5tYXgodCxNYXRoLm1pbihlLG4pKSl9Zmxvb3IoKXtyZXR1cm4gdGhpcy54PU1hdGguZmxvb3IodGhpcy54KSx0aGlzLnk9TWF0aC5mbG9vcih0aGlzLnkpLHRoaXMuej1NYXRoLmZsb29yKHRoaXMueiksdGhpc31jZWlsKCl7cmV0dXJuIHRoaXMueD1NYXRoLmNlaWwodGhpcy54KSx0aGlzLnk9TWF0aC5jZWlsKHRoaXMueSksdGhpcy56PU1hdGguY2VpbCh0aGlzLnopLHRoaXN9cm91bmQoKXtyZXR1cm4gdGhpcy54PU1hdGgucm91bmQodGhpcy54KSx0aGlzLnk9TWF0aC5yb3VuZCh0aGlzLnkpLHRoaXMuej1NYXRoLnJvdW5kKHRoaXMueiksdGhpc31yb3VuZFRvWmVybygpe3JldHVybiB0aGlzLng9dGhpcy54PDA/TWF0aC5jZWlsKHRoaXMueCk6TWF0aC5mbG9vcih0aGlzLngpLHRoaXMueT10aGlzLnk8MD9NYXRoLmNlaWwodGhpcy55KTpNYXRoLmZsb29yKHRoaXMueSksdGhpcy56PXRoaXMuejwwP01hdGguY2VpbCh0aGlzLnopOk1hdGguZmxvb3IodGhpcy56KSx0aGlzfW5lZ2F0ZSgpe3JldHVybiB0aGlzLng9LXRoaXMueCx0aGlzLnk9LXRoaXMueSx0aGlzLno9LXRoaXMueix0aGlzfWRvdCh0KXtyZXR1cm4gdGhpcy54KnQueCt0aGlzLnkqdC55K3RoaXMueip0Lnp9bGVuZ3RoU3EoKXtyZXR1cm4gdGhpcy54KnRoaXMueCt0aGlzLnkqdGhpcy55K3RoaXMueip0aGlzLnp9bGVuZ3RoKCl7cmV0dXJuIE1hdGguc3FydCh0aGlzLngqdGhpcy54K3RoaXMueSp0aGlzLnkrdGhpcy56KnRoaXMueil9bWFuaGF0dGFuTGVuZ3RoKCl7cmV0dXJuIE1hdGguYWJzKHRoaXMueCkrTWF0aC5hYnModGhpcy55KStNYXRoLmFicyh0aGlzLnopfW5vcm1hbGl6ZSgpe3JldHVybiB0aGlzLmRpdmlkZVNjYWxhcih0aGlzLmxlbmd0aCgpfHwxKX1zZXRMZW5ndGgodCl7cmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIodCl9bGVycCh0LGUpe3JldHVybiB0aGlzLngrPSh0LngtdGhpcy54KSplLHRoaXMueSs9KHQueS10aGlzLnkpKmUsdGhpcy56Kz0odC56LXRoaXMueikqZSx0aGlzfWxlcnBWZWN0b3JzKHQsZSxuKXtyZXR1cm4gdGhpcy54PXQueCsoZS54LXQueCkqbix0aGlzLnk9dC55KyhlLnktdC55KSpuLHRoaXMuej10LnorKGUuei10LnopKm4sdGhpc31jcm9zcyh0LGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLlZlY3RvcjM6IC5jcm9zcygpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmNyb3NzVmVjdG9ycyggYSwgYiApIGluc3RlYWQuIiksdGhpcy5jcm9zc1ZlY3RvcnModCxlKSk6dGhpcy5jcm9zc1ZlY3RvcnModGhpcyx0KX1jcm9zc1ZlY3RvcnModCxlKXtjb25zdCBuPXQueCxpPXQueSxyPXQueixvPWUueCxhPWUueSxzPWUuejtyZXR1cm4gdGhpcy54PWkqcy1yKmEsdGhpcy55PXIqby1uKnMsdGhpcy56PW4qYS1pKm8sdGhpc31wcm9qZWN0T25WZWN0b3IodCl7Y29uc3QgZT10Lmxlbmd0aFNxKCk7aWYoMD09PWUpcmV0dXJuIHRoaXMuc2V0KDAsMCwwKTtjb25zdCBuPXQuZG90KHRoaXMpL2U7cmV0dXJuIHRoaXMuY29weSh0KS5tdWx0aXBseVNjYWxhcihuKX1wcm9qZWN0T25QbGFuZSh0KXtyZXR1cm4gRjV0LmNvcHkodGhpcykucHJvamVjdE9uVmVjdG9yKHQpLHRoaXMuc3ViKEY1dCl9cmVmbGVjdCh0KXtyZXR1cm4gdGhpcy5zdWIoRjV0LmNvcHkodCkubXVsdGlwbHlTY2FsYXIoMip0aGlzLmRvdCh0KSkpfWFuZ2xlVG8odCl7Y29uc3QgZT1NYXRoLnNxcnQodGhpcy5sZW5ndGhTcSgpKnQubGVuZ3RoU3EoKSk7aWYoMD09PWUpcmV0dXJuIE1hdGguUEkvMjtjb25zdCBuPXRoaXMuZG90KHQpL2U7cmV0dXJuIE1hdGguYWNvcyhzNXQobiwtMSwxKSl9ZGlzdGFuY2VUbyh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlVG9TcXVhcmVkKHQpe2NvbnN0IGU9dGhpcy54LXQueCxuPXRoaXMueS10LnksaT10aGlzLnotdC56O3JldHVybiBlKmUrbipuK2kqaX1tYW5oYXR0YW5EaXN0YW5jZVRvKHQpe3JldHVybiBNYXRoLmFicyh0aGlzLngtdC54KStNYXRoLmFicyh0aGlzLnktdC55KStNYXRoLmFicyh0aGlzLnotdC56KX1zZXRGcm9tU3BoZXJpY2FsKHQpe3JldHVybiB0aGlzLnNldEZyb21TcGhlcmljYWxDb29yZHModC5yYWRpdXMsdC5waGksdC50aGV0YSl9c2V0RnJvbVNwaGVyaWNhbENvb3Jkcyh0LGUsbil7Y29uc3QgaT1NYXRoLnNpbihlKSp0O3JldHVybiB0aGlzLng9aSpNYXRoLnNpbihuKSx0aGlzLnk9TWF0aC5jb3MoZSkqdCx0aGlzLno9aSpNYXRoLmNvcyhuKSx0aGlzfXNldEZyb21DeWxpbmRyaWNhbCh0KXtyZXR1cm4gdGhpcy5zZXRGcm9tQ3lsaW5kcmljYWxDb29yZHModC5yYWRpdXMsdC50aGV0YSx0LnkpfXNldEZyb21DeWxpbmRyaWNhbENvb3Jkcyh0LGUsbil7cmV0dXJuIHRoaXMueD10Kk1hdGguc2luKGUpLHRoaXMueT1uLHRoaXMuej10Kk1hdGguY29zKGUpLHRoaXN9c2V0RnJvbU1hdHJpeFBvc2l0aW9uKHQpe2NvbnN0IGU9dC5lbGVtZW50cztyZXR1cm4gdGhpcy54PWVbMTJdLHRoaXMueT1lWzEzXSx0aGlzLno9ZVsxNF0sdGhpc31zZXRGcm9tTWF0cml4U2NhbGUodCl7Y29uc3QgZT10aGlzLnNldEZyb21NYXRyaXhDb2x1bW4odCwwKS5sZW5ndGgoKSxuPXRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbih0LDEpLmxlbmd0aCgpLGk9dGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKHQsMikubGVuZ3RoKCk7cmV0dXJuIHRoaXMueD1lLHRoaXMueT1uLHRoaXMuej1pLHRoaXN9c2V0RnJvbU1hdHJpeENvbHVtbih0LGUpe3JldHVybiB0aGlzLmZyb21BcnJheSh0LmVsZW1lbnRzLDQqZSl9c2V0RnJvbU1hdHJpeDNDb2x1bW4odCxlKXtyZXR1cm4gdGhpcy5mcm9tQXJyYXkodC5lbGVtZW50cywzKmUpfWVxdWFscyh0KXtyZXR1cm4gdC54PT09dGhpcy54JiZ0Lnk9PT10aGlzLnkmJnQuej09PXRoaXMuen1mcm9tQXJyYXkodCxlPTApe3JldHVybiB0aGlzLng9dFtlXSx0aGlzLnk9dFtlKzFdLHRoaXMuej10W2UrMl0sdGhpc310b0FycmF5KHQ9W10sZT0wKXtyZXR1cm4gdFtlXT10aGlzLngsdFtlKzFdPXRoaXMueSx0W2UrMl09dGhpcy56LHR9ZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUsbil7cmV0dXJuIHZvaWQgMCE9PW4mJmNvbnNvbGUud2FybigiVEhSRUUuVmVjdG9yMzogb2Zmc2V0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSAuZnJvbUJ1ZmZlckF0dHJpYnV0ZSgpLiIpLHRoaXMueD10LmdldFgoZSksdGhpcy55PXQuZ2V0WShlKSx0aGlzLno9dC5nZXRaKGUpLHRoaXN9cmFuZG9tKCl7cmV0dXJuIHRoaXMueD1NYXRoLnJhbmRvbSgpLHRoaXMueT1NYXRoLnJhbmRvbSgpLHRoaXMuej1NYXRoLnJhbmRvbSgpLHRoaXN9fUg1dC5wcm90b3R5cGUuaXNWZWN0b3IzPSEwO2NvbnN0IEY1dD1uZXcgSDV0LFY1dD1uZXcgQjV0O2NsYXNzIFU1dHtjb25zdHJ1Y3Rvcih0PW5ldyBINXQoMS8wLDEvMCwxLzApLGU9bmV3IEg1dCgtMS8wLC0xLzAsLTEvMCkpe3RoaXMubWluPXQsdGhpcy5tYXg9ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5taW4uY29weSh0KSx0aGlzLm1heC5jb3B5KGUpLHRoaXN9c2V0RnJvbUFycmF5KHQpe2xldCBlPTEvMCxuPTEvMCxpPTEvMCxyPS0xLzAsbz0tMS8wLGE9LTEvMDtmb3IobGV0IHM9MCxsPXQubGVuZ3RoO3M8bDtzKz0zKXtjb25zdCBsPXRbc10sYz10W3MrMV0sdT10W3MrMl07bDxlJiYoZT1sKSxjPG4mJihuPWMpLHU8aSYmKGk9dSksbD5yJiYocj1sKSxjPm8mJihvPWMpLHU+YSYmKGE9dSl9cmV0dXJuIHRoaXMubWluLnNldChlLG4saSksdGhpcy5tYXguc2V0KHIsbyxhKSx0aGlzfXNldEZyb21CdWZmZXJBdHRyaWJ1dGUodCl7bGV0IGU9MS8wLG49MS8wLGk9MS8wLHI9LTEvMCxvPS0xLzAsYT0tMS8wO2ZvcihsZXQgcz0wLGw9dC5jb3VudDtzPGw7cysrKXtjb25zdCBsPXQuZ2V0WChzKSxjPXQuZ2V0WShzKSx1PXQuZ2V0WihzKTtsPGUmJihlPWwpLGM8biYmKG49YyksdTxpJiYoaT11KSxsPnImJihyPWwpLGM+byYmKG89YyksdT5hJiYoYT11KX1yZXR1cm4gdGhpcy5taW4uc2V0KGUsbixpKSx0aGlzLm1heC5zZXQocixvLGEpLHRoaXN9c2V0RnJvbVBvaW50cyh0KXt0aGlzLm1ha2VFbXB0eSgpO2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl0aGlzLmV4cGFuZEJ5UG9pbnQodFtlXSk7cmV0dXJuIHRoaXN9c2V0RnJvbUNlbnRlckFuZFNpemUodCxlKXtjb25zdCBuPUc1dC5jb3B5KGUpLm11bHRpcGx5U2NhbGFyKC41KTtyZXR1cm4gdGhpcy5taW4uY29weSh0KS5zdWIobiksdGhpcy5tYXguY29weSh0KS5hZGQobiksdGhpc31zZXRGcm9tT2JqZWN0KHQpe3JldHVybiB0aGlzLm1ha2VFbXB0eSgpLHRoaXMuZXhwYW5kQnlPYmplY3QodCl9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9Y29weSh0KXtyZXR1cm4gdGhpcy5taW4uY29weSh0Lm1pbiksdGhpcy5tYXguY29weSh0Lm1heCksdGhpc31tYWtlRW1wdHkoKXtyZXR1cm4gdGhpcy5taW4ueD10aGlzLm1pbi55PXRoaXMubWluLno9MS8wLHRoaXMubWF4Lng9dGhpcy5tYXgueT10aGlzLm1heC56PS0xLzAsdGhpc31pc0VtcHR5KCl7cmV0dXJuIHRoaXMubWF4Lng8dGhpcy5taW4ueHx8dGhpcy5tYXgueTx0aGlzLm1pbi55fHx0aGlzLm1heC56PHRoaXMubWluLnp9Z2V0Q2VudGVyKHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT90LnNldCgwLDAsMCk6dC5hZGRWZWN0b3JzKHRoaXMubWluLHRoaXMubWF4KS5tdWx0aXBseVNjYWxhciguNSl9Z2V0U2l6ZSh0KXtyZXR1cm4gdGhpcy5pc0VtcHR5KCk/dC5zZXQoMCwwLDApOnQuc3ViVmVjdG9ycyh0aGlzLm1heCx0aGlzLm1pbil9ZXhwYW5kQnlQb2ludCh0KXtyZXR1cm4gdGhpcy5taW4ubWluKHQpLHRoaXMubWF4Lm1heCh0KSx0aGlzfWV4cGFuZEJ5VmVjdG9yKHQpe3JldHVybiB0aGlzLm1pbi5zdWIodCksdGhpcy5tYXguYWRkKHQpLHRoaXN9ZXhwYW5kQnlTY2FsYXIodCl7cmV0dXJuIHRoaXMubWluLmFkZFNjYWxhcigtdCksdGhpcy5tYXguYWRkU2NhbGFyKHQpLHRoaXN9ZXhwYW5kQnlPYmplY3QodCl7dC51cGRhdGVXb3JsZE1hdHJpeCghMSwhMSk7Y29uc3QgZT10Lmdlb21ldHJ5O3ZvaWQgMCE9PWUmJihudWxsPT09ZS5ib3VuZGluZ0JveCYmZS5jb21wdXRlQm91bmRpbmdCb3goKSxXNXQuY29weShlLmJvdW5kaW5nQm94KSxXNXQuYXBwbHlNYXRyaXg0KHQubWF0cml4V29ybGQpLHRoaXMudW5pb24oVzV0KSk7Y29uc3Qgbj10LmNoaWxkcmVuO2ZvcihsZXQgdD0wLGU9bi5sZW5ndGg7dDxlO3QrKyl0aGlzLmV4cGFuZEJ5T2JqZWN0KG5bdF0pO3JldHVybiB0aGlzfWNvbnRhaW5zUG9pbnQodCl7cmV0dXJuISh0Lng8dGhpcy5taW4ueHx8dC54PnRoaXMubWF4Lnh8fHQueTx0aGlzLm1pbi55fHx0Lnk+dGhpcy5tYXgueXx8dC56PHRoaXMubWluLnp8fHQuej50aGlzLm1heC56KX1jb250YWluc0JveCh0KXtyZXR1cm4gdGhpcy5taW4ueDw9dC5taW4ueCYmdC5tYXgueDw9dGhpcy5tYXgueCYmdGhpcy5taW4ueTw9dC5taW4ueSYmdC5tYXgueTw9dGhpcy5tYXgueSYmdGhpcy5taW4uejw9dC5taW4ueiYmdC5tYXguejw9dGhpcy5tYXguen1nZXRQYXJhbWV0ZXIodCxlKXtyZXR1cm4gZS5zZXQoKHQueC10aGlzLm1pbi54KS8odGhpcy5tYXgueC10aGlzLm1pbi54KSwodC55LXRoaXMubWluLnkpLyh0aGlzLm1heC55LXRoaXMubWluLnkpLCh0LnotdGhpcy5taW4ueikvKHRoaXMubWF4LnotdGhpcy5taW4ueikpfWludGVyc2VjdHNCb3godCl7cmV0dXJuISh0Lm1heC54PHRoaXMubWluLnh8fHQubWluLng+dGhpcy5tYXgueHx8dC5tYXgueTx0aGlzLm1pbi55fHx0Lm1pbi55PnRoaXMubWF4Lnl8fHQubWF4Lno8dGhpcy5taW4uenx8dC5taW4uej50aGlzLm1heC56KX1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0aGlzLmNsYW1wUG9pbnQodC5jZW50ZXIsRzV0KSxHNXQuZGlzdGFuY2VUb1NxdWFyZWQodC5jZW50ZXIpPD10LnJhZGl1cyp0LnJhZGl1c31pbnRlcnNlY3RzUGxhbmUodCl7bGV0IGUsbjtyZXR1cm4gdC5ub3JtYWwueD4wPyhlPXQubm9ybWFsLngqdGhpcy5taW4ueCxuPXQubm9ybWFsLngqdGhpcy5tYXgueCk6KGU9dC5ub3JtYWwueCp0aGlzLm1heC54LG49dC5ub3JtYWwueCp0aGlzLm1pbi54KSx0Lm5vcm1hbC55PjA/KGUrPXQubm9ybWFsLnkqdGhpcy5taW4ueSxuKz10Lm5vcm1hbC55KnRoaXMubWF4LnkpOihlKz10Lm5vcm1hbC55KnRoaXMubWF4Lnksbis9dC5ub3JtYWwueSp0aGlzLm1pbi55KSx0Lm5vcm1hbC56PjA/KGUrPXQubm9ybWFsLnoqdGhpcy5taW4ueixuKz10Lm5vcm1hbC56KnRoaXMubWF4LnopOihlKz10Lm5vcm1hbC56KnRoaXMubWF4Lnosbis9dC5ub3JtYWwueip0aGlzLm1pbi56KSxlPD0tdC5jb25zdGFudCYmbj49LXQuY29uc3RhbnR9aW50ZXJzZWN0c1RyaWFuZ2xlKHQpe2lmKHRoaXMuaXNFbXB0eSgpKXJldHVybiExO3RoaXMuZ2V0Q2VudGVyKEo1dCksUTV0LnN1YlZlY3RvcnModGhpcy5tYXgsSjV0KSxxNXQuc3ViVmVjdG9ycyh0LmEsSjV0KSxZNXQuc3ViVmVjdG9ycyh0LmIsSjV0KSxYNXQuc3ViVmVjdG9ycyh0LmMsSjV0KSwkNXQuc3ViVmVjdG9ycyhZNXQscTV0KSxLNXQuc3ViVmVjdG9ycyhYNXQsWTV0KSxaNXQuc3ViVmVjdG9ycyhxNXQsWDV0KTtsZXQgZT1bMCwtJDV0LnosJDV0LnksMCwtSzV0LnosSzV0LnksMCwtWjV0LnosWjV0LnksJDV0LnosMCwtJDV0LngsSzV0LnosMCwtSzV0LngsWjV0LnosMCwtWjV0LngsLSQ1dC55LCQ1dC54LDAsLUs1dC55LEs1dC54LDAsLVo1dC55LFo1dC54LDBdO3JldHVybiEhbjN0KGUscTV0LFk1dCxYNXQsUTV0KSYmKGU9WzEsMCwwLDAsMSwwLDAsMCwxXSwhIW4zdChlLHE1dCxZNXQsWDV0LFE1dCkmJih0M3QuY3Jvc3NWZWN0b3JzKCQ1dCxLNXQpLGU9W3QzdC54LHQzdC55LHQzdC56XSxuM3QoZSxxNXQsWTV0LFg1dCxRNXQpKSl9Y2xhbXBQb2ludCh0LGUpe3JldHVybiBlLmNvcHkodCkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gRzV0LmNvcHkodCkuY2xhbXAodGhpcy5taW4sdGhpcy5tYXgpLnN1Yih0KS5sZW5ndGgoKX1nZXRCb3VuZGluZ1NwaGVyZSh0KXtyZXR1cm4gdGhpcy5nZXRDZW50ZXIodC5jZW50ZXIpLHQucmFkaXVzPS41KnRoaXMuZ2V0U2l6ZShHNXQpLmxlbmd0aCgpLHR9aW50ZXJzZWN0KHQpe3JldHVybiB0aGlzLm1pbi5tYXgodC5taW4pLHRoaXMubWF4Lm1pbih0Lm1heCksdGhpcy5pc0VtcHR5KCkmJnRoaXMubWFrZUVtcHR5KCksdGhpc311bmlvbih0KXtyZXR1cm4gdGhpcy5taW4ubWluKHQubWluKSx0aGlzLm1heC5tYXgodC5tYXgpLHRoaXN9YXBwbHlNYXRyaXg0KHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKXx8KGo1dFswXS5zZXQodGhpcy5taW4ueCx0aGlzLm1pbi55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSxqNXRbMV0uc2V0KHRoaXMubWluLngsdGhpcy5taW4ueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksajV0WzJdLnNldCh0aGlzLm1pbi54LHRoaXMubWF4LnksdGhpcy5taW4ueikuYXBwbHlNYXRyaXg0KHQpLGo1dFszXS5zZXQodGhpcy5taW4ueCx0aGlzLm1heC55LHRoaXMubWF4LnopLmFwcGx5TWF0cml4NCh0KSxqNXRbNF0uc2V0KHRoaXMubWF4LngsdGhpcy5taW4ueSx0aGlzLm1pbi56KS5hcHBseU1hdHJpeDQodCksajV0WzVdLnNldCh0aGlzLm1heC54LHRoaXMubWluLnksdGhpcy5tYXgueikuYXBwbHlNYXRyaXg0KHQpLGo1dFs2XS5zZXQodGhpcy5tYXgueCx0aGlzLm1heC55LHRoaXMubWluLnopLmFwcGx5TWF0cml4NCh0KSxqNXRbN10uc2V0KHRoaXMubWF4LngsdGhpcy5tYXgueSx0aGlzLm1heC56KS5hcHBseU1hdHJpeDQodCksdGhpcy5zZXRGcm9tUG9pbnRzKGo1dCkpLHRoaXN9dHJhbnNsYXRlKHQpe3JldHVybiB0aGlzLm1pbi5hZGQodCksdGhpcy5tYXguYWRkKHQpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm1pbi5lcXVhbHModGhpcy5taW4pJiZ0Lm1heC5lcXVhbHModGhpcy5tYXgpfX1VNXQucHJvdG90eXBlLmlzQm94Mz0hMDtjb25zdCBqNXQ9W25ldyBINXQsbmV3IEg1dCxuZXcgSDV0LG5ldyBINXQsbmV3IEg1dCxuZXcgSDV0LG5ldyBINXQsbmV3IEg1dF0sRzV0PW5ldyBINXQsVzV0PW5ldyBVNXQscTV0PW5ldyBINXQsWTV0PW5ldyBINXQsWDV0PW5ldyBINXQsJDV0PW5ldyBINXQsSzV0PW5ldyBINXQsWjV0PW5ldyBINXQsSjV0PW5ldyBINXQsUTV0PW5ldyBINXQsdDN0PW5ldyBINXQsZTN0PW5ldyBINXQ7ZnVuY3Rpb24gbjN0KHQsZSxuLGkscil7Zm9yKGxldCBvPTAsYT10Lmxlbmd0aC0zO288PWE7bys9Myl7ZTN0LmZyb21BcnJheSh0LG8pO2NvbnN0IGE9ci54Kk1hdGguYWJzKGUzdC54KStyLnkqTWF0aC5hYnMoZTN0LnkpK3IueipNYXRoLmFicyhlM3Queikscz1lLmRvdChlM3QpLGw9bi5kb3QoZTN0KSxjPWkuZG90KGUzdCk7aWYoTWF0aC5tYXgoLU1hdGgubWF4KHMsbCxjKSxNYXRoLm1pbihzLGwsYykpPmEpcmV0dXJuITF9cmV0dXJuITB9Y29uc3QgaTN0PW5ldyBVNXQscjN0PW5ldyBINXQsbzN0PW5ldyBINXQsYTN0PW5ldyBINXQ7Y2xhc3MgczN0e2NvbnN0cnVjdG9yKHQ9bmV3IEg1dCxlPS0xKXt0aGlzLmNlbnRlcj10LHRoaXMucmFkaXVzPWV9c2V0KHQsZSl7cmV0dXJuIHRoaXMuY2VudGVyLmNvcHkodCksdGhpcy5yYWRpdXM9ZSx0aGlzfXNldEZyb21Qb2ludHModCxlKXtjb25zdCBuPXRoaXMuY2VudGVyO3ZvaWQgMCE9PWU/bi5jb3B5KGUpOmkzdC5zZXRGcm9tUG9pbnRzKHQpLmdldENlbnRlcihuKTtsZXQgaT0wO2ZvcihsZXQgZT0wLHI9dC5sZW5ndGg7ZTxyO2UrKylpPU1hdGgubWF4KGksbi5kaXN0YW5jZVRvU3F1YXJlZCh0W2VdKSk7cmV0dXJuIHRoaXMucmFkaXVzPU1hdGguc3FydChpKSx0aGlzfWNvcHkodCl7cmV0dXJuIHRoaXMuY2VudGVyLmNvcHkodC5jZW50ZXIpLHRoaXMucmFkaXVzPXQucmFkaXVzLHRoaXN9aXNFbXB0eSgpe3JldHVybiB0aGlzLnJhZGl1czwwfW1ha2VFbXB0eSgpe3JldHVybiB0aGlzLmNlbnRlci5zZXQoMCwwLDApLHRoaXMucmFkaXVzPS0xLHRoaXN9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gdC5kaXN0YW5jZVRvU3F1YXJlZCh0aGlzLmNlbnRlcik8PXRoaXMucmFkaXVzKnRoaXMucmFkaXVzfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gdC5kaXN0YW5jZVRvKHRoaXMuY2VudGVyKS10aGlzLnJhZGl1c31pbnRlcnNlY3RzU3BoZXJlKHQpe2NvbnN0IGU9dGhpcy5yYWRpdXMrdC5yYWRpdXM7cmV0dXJuIHQuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKHRoaXMuY2VudGVyKTw9ZSplfWludGVyc2VjdHNCb3godCl7cmV0dXJuIHQuaW50ZXJzZWN0c1NwaGVyZSh0aGlzKX1pbnRlcnNlY3RzUGxhbmUodCl7cmV0dXJuIE1hdGguYWJzKHQuZGlzdGFuY2VUb1BvaW50KHRoaXMuY2VudGVyKSk8PXRoaXMucmFkaXVzfWNsYW1wUG9pbnQodCxlKXtjb25zdCBuPXRoaXMuY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKHQpO3JldHVybiBlLmNvcHkodCksbj50aGlzLnJhZGl1cyp0aGlzLnJhZGl1cyYmKGUuc3ViKHRoaXMuY2VudGVyKS5ub3JtYWxpemUoKSxlLm11bHRpcGx5U2NhbGFyKHRoaXMucmFkaXVzKS5hZGQodGhpcy5jZW50ZXIpKSxlfWdldEJvdW5kaW5nQm94KHQpe3JldHVybiB0aGlzLmlzRW1wdHkoKT8odC5tYWtlRW1wdHkoKSx0KToodC5zZXQodGhpcy5jZW50ZXIsdGhpcy5jZW50ZXIpLHQuZXhwYW5kQnlTY2FsYXIodGhpcy5yYWRpdXMpLHQpfWFwcGx5TWF0cml4NCh0KXtyZXR1cm4gdGhpcy5jZW50ZXIuYXBwbHlNYXRyaXg0KHQpLHRoaXMucmFkaXVzPXRoaXMucmFkaXVzKnQuZ2V0TWF4U2NhbGVPbkF4aXMoKSx0aGlzfXRyYW5zbGF0ZSh0KXtyZXR1cm4gdGhpcy5jZW50ZXIuYWRkKHQpLHRoaXN9ZXhwYW5kQnlQb2ludCh0KXthM3Quc3ViVmVjdG9ycyh0LHRoaXMuY2VudGVyKTtjb25zdCBlPWEzdC5sZW5ndGhTcSgpO2lmKGU+dGhpcy5yYWRpdXMqdGhpcy5yYWRpdXMpe2NvbnN0IHQ9TWF0aC5zcXJ0KGUpLG49LjUqKHQtdGhpcy5yYWRpdXMpO3RoaXMuY2VudGVyLmFkZChhM3QubXVsdGlwbHlTY2FsYXIobi90KSksdGhpcy5yYWRpdXMrPW59cmV0dXJuIHRoaXN9dW5pb24odCl7cmV0dXJuIG8zdC5zdWJWZWN0b3JzKHQuY2VudGVyLHRoaXMuY2VudGVyKS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhcih0LnJhZGl1cyksdGhpcy5leHBhbmRCeVBvaW50KHIzdC5jb3B5KHQuY2VudGVyKS5hZGQobzN0KSksdGhpcy5leHBhbmRCeVBvaW50KHIzdC5jb3B5KHQuY2VudGVyKS5zdWIobzN0KSksdGhpc31lcXVhbHModCl7cmV0dXJuIHQuY2VudGVyLmVxdWFscyh0aGlzLmNlbnRlcikmJnQucmFkaXVzPT09dGhpcy5yYWRpdXN9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9fWNvbnN0IGwzdD1uZXcgSDV0LGMzdD1uZXcgSDV0LHUzdD1uZXcgSDV0LGgzdD1uZXcgSDV0LGQzdD1uZXcgSDV0LHAzdD1uZXcgSDV0LGYzdD1uZXcgSDV0O2NsYXNzIG0zdHtjb25zdHJ1Y3Rvcih0PW5ldyBINXQsZT1uZXcgSDV0KDAsMCwtMSkpe3RoaXMub3JpZ2luPXQsdGhpcy5kaXJlY3Rpb249ZX1zZXQodCxlKXtyZXR1cm4gdGhpcy5vcmlnaW4uY29weSh0KSx0aGlzLmRpcmVjdGlvbi5jb3B5KGUpLHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5vcmlnaW4uY29weSh0Lm9yaWdpbiksdGhpcy5kaXJlY3Rpb24uY29weSh0LmRpcmVjdGlvbiksdGhpc31hdCh0LGUpe3JldHVybiBlLmNvcHkodGhpcy5kaXJlY3Rpb24pLm11bHRpcGx5U2NhbGFyKHQpLmFkZCh0aGlzLm9yaWdpbil9bG9va0F0KHQpe3JldHVybiB0aGlzLmRpcmVjdGlvbi5jb3B5KHQpLnN1Yih0aGlzLm9yaWdpbikubm9ybWFsaXplKCksdGhpc31yZWNhc3QodCl7cmV0dXJuIHRoaXMub3JpZ2luLmNvcHkodGhpcy5hdCh0LGwzdCkpLHRoaXN9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUpe2Uuc3ViVmVjdG9ycyh0LHRoaXMub3JpZ2luKTtjb25zdCBuPWUuZG90KHRoaXMuZGlyZWN0aW9uKTtyZXR1cm4gbjwwP2UuY29weSh0aGlzLm9yaWdpbik6ZS5jb3B5KHRoaXMuZGlyZWN0aW9uKS5tdWx0aXBseVNjYWxhcihuKS5hZGQodGhpcy5vcmlnaW4pfWRpc3RhbmNlVG9Qb2ludCh0KXtyZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQodCkpfWRpc3RhbmNlU3FUb1BvaW50KHQpe2NvbnN0IGU9bDN0LnN1YlZlY3RvcnModCx0aGlzLm9yaWdpbikuZG90KHRoaXMuZGlyZWN0aW9uKTtyZXR1cm4gZTwwP3RoaXMub3JpZ2luLmRpc3RhbmNlVG9TcXVhcmVkKHQpOihsM3QuY29weSh0aGlzLmRpcmVjdGlvbikubXVsdGlwbHlTY2FsYXIoZSkuYWRkKHRoaXMub3JpZ2luKSxsM3QuZGlzdGFuY2VUb1NxdWFyZWQodCkpfWRpc3RhbmNlU3FUb1NlZ21lbnQodCxlLG4saSl7YzN0LmNvcHkodCkuYWRkKGUpLm11bHRpcGx5U2NhbGFyKC41KSx1M3QuY29weShlKS5zdWIodCkubm9ybWFsaXplKCksaDN0LmNvcHkodGhpcy5vcmlnaW4pLnN1YihjM3QpO2NvbnN0IHI9LjUqdC5kaXN0YW5jZVRvKGUpLG89LXRoaXMuZGlyZWN0aW9uLmRvdCh1M3QpLGE9aDN0LmRvdCh0aGlzLmRpcmVjdGlvbikscz0taDN0LmRvdCh1M3QpLGw9aDN0Lmxlbmd0aFNxKCksYz1NYXRoLmFicygxLW8qbyk7bGV0IHUsaCxkLHA7aWYoYz4wKWlmKHU9bypzLWEsaD1vKmEtcyxwPXIqYyx1Pj0wKWlmKGg+PS1wKWlmKGg8PXApe2NvbnN0IHQ9MS9jO3UqPXQsaCo9dCxkPXUqKHUrbypoKzIqYSkraCoobyp1K2grMipzKStsfWVsc2UgaD1yLHU9TWF0aC5tYXgoMCwtKG8qaCthKSksZD0tdSp1K2gqKGgrMipzKStsO2Vsc2UgaD0tcix1PU1hdGgubWF4KDAsLShvKmgrYSkpLGQ9LXUqdStoKihoKzIqcykrbDtlbHNlIGg8PS1wPyh1PU1hdGgubWF4KDAsLSgtbypyK2EpKSxoPXU+MD8tcjpNYXRoLm1pbihNYXRoLm1heCgtciwtcyksciksZD0tdSp1K2gqKGgrMipzKStsKTpoPD1wPyh1PTAsaD1NYXRoLm1pbihNYXRoLm1heCgtciwtcyksciksZD1oKihoKzIqcykrbCk6KHU9TWF0aC5tYXgoMCwtKG8qcithKSksaD11PjA/cjpNYXRoLm1pbihNYXRoLm1heCgtciwtcyksciksZD0tdSp1K2gqKGgrMipzKStsKTtlbHNlIGg9bz4wPy1yOnIsdT1NYXRoLm1heCgwLC0obypoK2EpKSxkPS11KnUraCooaCsyKnMpK2w7cmV0dXJuIG4mJm4uY29weSh0aGlzLmRpcmVjdGlvbikubXVsdGlwbHlTY2FsYXIodSkuYWRkKHRoaXMub3JpZ2luKSxpJiZpLmNvcHkodTN0KS5tdWx0aXBseVNjYWxhcihoKS5hZGQoYzN0KSxkfWludGVyc2VjdFNwaGVyZSh0LGUpe2wzdC5zdWJWZWN0b3JzKHQuY2VudGVyLHRoaXMub3JpZ2luKTtjb25zdCBuPWwzdC5kb3QodGhpcy5kaXJlY3Rpb24pLGk9bDN0LmRvdChsM3QpLW4qbixyPXQucmFkaXVzKnQucmFkaXVzO2lmKGk+cilyZXR1cm4gbnVsbDtjb25zdCBvPU1hdGguc3FydChyLWkpLGE9bi1vLHM9bitvO3JldHVybiBhPDAmJnM8MD9udWxsOnRoaXMuYXQoYTwwP3M6YSxlKX1pbnRlcnNlY3RzU3BoZXJlKHQpe3JldHVybiB0aGlzLmRpc3RhbmNlU3FUb1BvaW50KHQuY2VudGVyKTw9dC5yYWRpdXMqdC5yYWRpdXN9ZGlzdGFuY2VUb1BsYW5lKHQpe2NvbnN0IGU9dC5ub3JtYWwuZG90KHRoaXMuZGlyZWN0aW9uKTtpZigwPT09ZSlyZXR1cm4gMD09PXQuZGlzdGFuY2VUb1BvaW50KHRoaXMub3JpZ2luKT8wOm51bGw7Y29uc3Qgbj0tKHRoaXMub3JpZ2luLmRvdCh0Lm5vcm1hbCkrdC5jb25zdGFudCkvZTtyZXR1cm4gbj49MD9uOm51bGx9aW50ZXJzZWN0UGxhbmUodCxlKXtjb25zdCBuPXRoaXMuZGlzdGFuY2VUb1BsYW5lKHQpO3JldHVybiBudWxsPT09bj9udWxsOnRoaXMuYXQobixlKX1pbnRlcnNlY3RzUGxhbmUodCl7Y29uc3QgZT10LmRpc3RhbmNlVG9Qb2ludCh0aGlzLm9yaWdpbik7aWYoMD09PWUpcmV0dXJuITA7cmV0dXJuIHQubm9ybWFsLmRvdCh0aGlzLmRpcmVjdGlvbikqZTwwfWludGVyc2VjdEJveCh0LGUpe2xldCBuLGkscixvLGEscztjb25zdCBsPTEvdGhpcy5kaXJlY3Rpb24ueCxjPTEvdGhpcy5kaXJlY3Rpb24ueSx1PTEvdGhpcy5kaXJlY3Rpb24ueixoPXRoaXMub3JpZ2luO3JldHVybiBsPj0wPyhuPSh0Lm1pbi54LWgueCkqbCxpPSh0Lm1heC54LWgueCkqbCk6KG49KHQubWF4LngtaC54KSpsLGk9KHQubWluLngtaC54KSpsKSxjPj0wPyhyPSh0Lm1pbi55LWgueSkqYyxvPSh0Lm1heC55LWgueSkqYyk6KHI9KHQubWF4LnktaC55KSpjLG89KHQubWluLnktaC55KSpjKSxuPm98fHI+aT9udWxsOigocj5ufHxuIT1uKSYmKG49ciksKG88aXx8aSE9aSkmJihpPW8pLHU+PTA/KGE9KHQubWluLnotaC56KSp1LHM9KHQubWF4LnotaC56KSp1KTooYT0odC5tYXguei1oLnopKnUscz0odC5taW4uei1oLnopKnUpLG4+c3x8YT5pP251bGw6KChhPm58fG4hPW4pJiYobj1hKSwoczxpfHxpIT1pKSYmKGk9cyksaTwwP251bGw6dGhpcy5hdChuPj0wP246aSxlKSkpfWludGVyc2VjdHNCb3godCl7cmV0dXJuIG51bGwhPT10aGlzLmludGVyc2VjdEJveCh0LGwzdCl9aW50ZXJzZWN0VHJpYW5nbGUodCxlLG4saSxyKXtkM3Quc3ViVmVjdG9ycyhlLHQpLHAzdC5zdWJWZWN0b3JzKG4sdCksZjN0LmNyb3NzVmVjdG9ycyhkM3QscDN0KTtsZXQgbyxhPXRoaXMuZGlyZWN0aW9uLmRvdChmM3QpO2lmKGE+MCl7aWYoaSlyZXR1cm4gbnVsbDtvPTF9ZWxzZXtpZighKGE8MCkpcmV0dXJuIG51bGw7bz0tMSxhPS1hfWgzdC5zdWJWZWN0b3JzKHRoaXMub3JpZ2luLHQpO2NvbnN0IHM9byp0aGlzLmRpcmVjdGlvbi5kb3QocDN0LmNyb3NzVmVjdG9ycyhoM3QscDN0KSk7aWYoczwwKXJldHVybiBudWxsO2NvbnN0IGw9byp0aGlzLmRpcmVjdGlvbi5kb3QoZDN0LmNyb3NzKGgzdCkpO2lmKGw8MClyZXR1cm4gbnVsbDtpZihzK2w+YSlyZXR1cm4gbnVsbDtjb25zdCBjPS1vKmgzdC5kb3QoZjN0KTtyZXR1cm4gYzwwP251bGw6dGhpcy5hdChjL2Escil9YXBwbHlNYXRyaXg0KHQpe3JldHVybiB0aGlzLm9yaWdpbi5hcHBseU1hdHJpeDQodCksdGhpcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKHQpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0Lm9yaWdpbi5lcXVhbHModGhpcy5vcmlnaW4pJiZ0LmRpcmVjdGlvbi5lcXVhbHModGhpcy5kaXJlY3Rpb24pfWNsb25lKCl7cmV0dXJuKG5ldyB0aGlzLmNvbnN0cnVjdG9yKS5jb3B5KHRoaXMpfX1jbGFzcyBnM3R7Y29uc3RydWN0b3IoKXt0aGlzLmVsZW1lbnRzPVsxLDAsMCwwLDAsMSwwLDAsMCwwLDEsMCwwLDAsMCwxXSxhcmd1bWVudHMubGVuZ3RoPjAmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLk1hdHJpeDQ6IHRoZSBjb25zdHJ1Y3RvciBubyBsb25nZXIgcmVhZHMgYXJndW1lbnRzLiB1c2UgLnNldCgpIGluc3RlYWQuIil9c2V0KHQsZSxuLGkscixvLGEscyxsLGMsdSxoLGQscCxmLG0pe2NvbnN0IGc9dGhpcy5lbGVtZW50cztyZXR1cm4gZ1swXT10LGdbNF09ZSxnWzhdPW4sZ1sxMl09aSxnWzFdPXIsZ1s1XT1vLGdbOV09YSxnWzEzXT1zLGdbMl09bCxnWzZdPWMsZ1sxMF09dSxnWzE0XT1oLGdbM109ZCxnWzddPXAsZ1sxMV09ZixnWzE1XT1tLHRoaXN9aWRlbnRpdHkoKXtyZXR1cm4gdGhpcy5zZXQoMSwwLDAsMCwwLDEsMCwwLDAsMCwxLDAsMCwwLDAsMSksdGhpc31jbG9uZSgpe3JldHVybihuZXcgZzN0KS5mcm9tQXJyYXkodGhpcy5lbGVtZW50cyl9Y29weSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzO3JldHVybiBlWzBdPW5bMF0sZVsxXT1uWzFdLGVbMl09blsyXSxlWzNdPW5bM10sZVs0XT1uWzRdLGVbNV09bls1XSxlWzZdPW5bNl0sZVs3XT1uWzddLGVbOF09bls4XSxlWzldPW5bOV0sZVsxMF09blsxMF0sZVsxMV09blsxMV0sZVsxMl09blsxMl0sZVsxM109blsxM10sZVsxNF09blsxNF0sZVsxNV09blsxNV0sdGhpc31jb3B5UG9zaXRpb24odCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzLG49dC5lbGVtZW50cztyZXR1cm4gZVsxMl09blsxMl0sZVsxM109blsxM10sZVsxNF09blsxNF0sdGhpc31zZXRGcm9tTWF0cml4Myh0KXtjb25zdCBlPXQuZWxlbWVudHM7cmV0dXJuIHRoaXMuc2V0KGVbMF0sZVszXSxlWzZdLDAsZVsxXSxlWzRdLGVbN10sMCxlWzJdLGVbNV0sZVs4XSwwLDAsMCwwLDEpLHRoaXN9ZXh0cmFjdEJhc2lzKHQsZSxuKXtyZXR1cm4gdC5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsMCksZS5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsMSksbi5zZXRGcm9tTWF0cml4Q29sdW1uKHRoaXMsMiksdGhpc31tYWtlQmFzaXModCxlLG4pe3JldHVybiB0aGlzLnNldCh0LngsZS54LG4ueCwwLHQueSxlLnksbi55LDAsdC56LGUueixuLnosMCwwLDAsMCwxKSx0aGlzfWV4dHJhY3RSb3RhdGlvbih0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LmVsZW1lbnRzLGk9MS9fM3Quc2V0RnJvbU1hdHJpeENvbHVtbih0LDApLmxlbmd0aCgpLHI9MS9fM3Quc2V0RnJvbU1hdHJpeENvbHVtbih0LDEpLmxlbmd0aCgpLG89MS9fM3Quc2V0RnJvbU1hdHJpeENvbHVtbih0LDIpLmxlbmd0aCgpO3JldHVybiBlWzBdPW5bMF0qaSxlWzFdPW5bMV0qaSxlWzJdPW5bMl0qaSxlWzNdPTAsZVs0XT1uWzRdKnIsZVs1XT1uWzVdKnIsZVs2XT1uWzZdKnIsZVs3XT0wLGVbOF09bls4XSpvLGVbOV09bls5XSpvLGVbMTBdPW5bMTBdKm8sZVsxMV09MCxlWzEyXT0wLGVbMTNdPTAsZVsxNF09MCxlWzE1XT0xLHRoaXN9bWFrZVJvdGF0aW9uRnJvbUV1bGVyKHQpe3QmJnQuaXNFdWxlcnx8Y29uc29sZS5lcnJvcigiVEhSRUUuTWF0cml4NDogLm1ha2VSb3RhdGlvbkZyb21FdWxlcigpIG5vdyBleHBlY3RzIGEgRXVsZXIgcm90YXRpb24gcmF0aGVyIHRoYW4gYSBWZWN0b3IzIGFuZCBvcmRlci4iKTtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LngsaT10Lnkscj10Lnosbz1NYXRoLmNvcyhuKSxhPU1hdGguc2luKG4pLHM9TWF0aC5jb3MoaSksbD1NYXRoLnNpbihpKSxjPU1hdGguY29zKHIpLHU9TWF0aC5zaW4ocik7aWYoIlhZWiI9PT10Lm9yZGVyKXtjb25zdCB0PW8qYyxuPW8qdSxpPWEqYyxyPWEqdTtlWzBdPXMqYyxlWzRdPS1zKnUsZVs4XT1sLGVbMV09bitpKmwsZVs1XT10LXIqbCxlWzldPS1hKnMsZVsyXT1yLXQqbCxlWzZdPWkrbipsLGVbMTBdPW8qc31lbHNlIGlmKCJZWFoiPT09dC5vcmRlcil7Y29uc3QgdD1zKmMsbj1zKnUsaT1sKmMscj1sKnU7ZVswXT10K3IqYSxlWzRdPWkqYS1uLGVbOF09bypsLGVbMV09byp1LGVbNV09bypjLGVbOV09LWEsZVsyXT1uKmEtaSxlWzZdPXIrdCphLGVbMTBdPW8qc31lbHNlIGlmKCJaWFkiPT09dC5vcmRlcil7Y29uc3QgdD1zKmMsbj1zKnUsaT1sKmMscj1sKnU7ZVswXT10LXIqYSxlWzRdPS1vKnUsZVs4XT1pK24qYSxlWzFdPW4raSphLGVbNV09bypjLGVbOV09ci10KmEsZVsyXT0tbypsLGVbNl09YSxlWzEwXT1vKnN9ZWxzZSBpZigiWllYIj09PXQub3JkZXIpe2NvbnN0IHQ9bypjLG49byp1LGk9YSpjLHI9YSp1O2VbMF09cypjLGVbNF09aSpsLW4sZVs4XT10KmwrcixlWzFdPXMqdSxlWzVdPXIqbCt0LGVbOV09bipsLWksZVsyXT0tbCxlWzZdPWEqcyxlWzEwXT1vKnN9ZWxzZSBpZigiWVpYIj09PXQub3JkZXIpe2NvbnN0IHQ9bypzLG49bypsLGk9YSpzLHI9YSpsO2VbMF09cypjLGVbNF09ci10KnUsZVs4XT1pKnUrbixlWzFdPXUsZVs1XT1vKmMsZVs5XT0tYSpjLGVbMl09LWwqYyxlWzZdPW4qdStpLGVbMTBdPXQtcip1fWVsc2UgaWYoIlhaWSI9PT10Lm9yZGVyKXtjb25zdCB0PW8qcyxuPW8qbCxpPWEqcyxyPWEqbDtlWzBdPXMqYyxlWzRdPS11LGVbOF09bCpjLGVbMV09dCp1K3IsZVs1XT1vKmMsZVs5XT1uKnUtaSxlWzJdPWkqdS1uLGVbNl09YSpjLGVbMTBdPXIqdSt0fXJldHVybiBlWzNdPTAsZVs3XT0wLGVbMTFdPTAsZVsxMl09MCxlWzEzXT0wLGVbMTRdPTAsZVsxNV09MSx0aGlzfW1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpe3JldHVybiB0aGlzLmNvbXBvc2UodjN0LHQsYjN0KX1sb29rQXQodCxlLG4pe2NvbnN0IGk9dGhpcy5lbGVtZW50cztyZXR1cm4gUzN0LnN1YlZlY3RvcnModCxlKSwwPT09UzN0Lmxlbmd0aFNxKCkmJihTM3Quej0xKSxTM3Qubm9ybWFsaXplKCkseDN0LmNyb3NzVmVjdG9ycyhuLFMzdCksMD09PXgzdC5sZW5ndGhTcSgpJiYoMT09PU1hdGguYWJzKG4ueik/UzN0LngrPTFlLTQ6UzN0LnorPTFlLTQsUzN0Lm5vcm1hbGl6ZSgpLHgzdC5jcm9zc1ZlY3RvcnMobixTM3QpKSx4M3Qubm9ybWFsaXplKCksdzN0LmNyb3NzVmVjdG9ycyhTM3QseDN0KSxpWzBdPXgzdC54LGlbNF09dzN0LngsaVs4XT1TM3QueCxpWzFdPXgzdC55LGlbNV09dzN0LnksaVs5XT1TM3QueSxpWzJdPXgzdC56LGlbNl09dzN0LnosaVsxMF09UzN0LnosdGhpc31tdWx0aXBseSh0LGUpe3JldHVybiB2b2lkIDAhPT1lPyhjb25zb2xlLndhcm4oIlRIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5TWF0cmljZXMoIGEsIGIgKSBpbnN0ZWFkLiIpLHRoaXMubXVsdGlwbHlNYXRyaWNlcyh0LGUpKTp0aGlzLm11bHRpcGx5TWF0cmljZXModGhpcyx0KX1wcmVtdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKHQsdGhpcyl9bXVsdGlwbHlNYXRyaWNlcyh0LGUpe2NvbnN0IG49dC5lbGVtZW50cyxpPWUuZWxlbWVudHMscj10aGlzLmVsZW1lbnRzLG89blswXSxhPW5bNF0scz1uWzhdLGw9blsxMl0sYz1uWzFdLHU9bls1XSxoPW5bOV0sZD1uWzEzXSxwPW5bMl0sZj1uWzZdLG09blsxMF0sZz1uWzE0XSxfPW5bM10seT1uWzddLHY9blsxMV0sYj1uWzE1XSx4PWlbMF0sdz1pWzRdLFM9aVs4XSxNPWlbMTJdLEU9aVsxXSxUPWlbNV0sQz1pWzldLEE9aVsxM10saz1pWzJdLEw9aVs2XSxQPWlbMTBdLE49aVsxNF0sST1pWzNdLFI9aVs3XSxPPWlbMTFdLHo9aVsxNV07cmV0dXJuIHJbMF09byp4K2EqRStzKmsrbCpJLHJbNF09byp3K2EqVCtzKkwrbCpSLHJbOF09bypTK2EqQytzKlArbCpPLHJbMTJdPW8qTSthKkErcypOK2wqeixyWzFdPWMqeCt1KkUraCprK2QqSSxyWzVdPWMqdyt1KlQraCpMK2QqUixyWzldPWMqUyt1KkMraCpQK2QqTyxyWzEzXT1jKk0rdSpBK2gqTitkKnosclsyXT1wKngrZipFK20qaytnKkkscls2XT1wKncrZipUK20qTCtnKlIsclsxMF09cCpTK2YqQyttKlArZypPLHJbMTRdPXAqTStmKkErbSpOK2cqeixyWzNdPV8qeCt5KkUrdiprK2IqSSxyWzddPV8qdyt5KlQrdipMK2IqUixyWzExXT1fKlMreSpDK3YqUCtiKk8sclsxNV09XypNK3kqQSt2Kk4rYip6LHRoaXN9bXVsdGlwbHlTY2FsYXIodCl7Y29uc3QgZT10aGlzLmVsZW1lbnRzO3JldHVybiBlWzBdKj10LGVbNF0qPXQsZVs4XSo9dCxlWzEyXSo9dCxlWzFdKj10LGVbNV0qPXQsZVs5XSo9dCxlWzEzXSo9dCxlWzJdKj10LGVbNl0qPXQsZVsxMF0qPXQsZVsxNF0qPXQsZVszXSo9dCxlWzddKj10LGVbMTFdKj10LGVbMTVdKj10LHRoaXN9ZGV0ZXJtaW5hbnQoKXtjb25zdCB0PXRoaXMuZWxlbWVudHMsZT10WzBdLG49dFs0XSxpPXRbOF0scj10WzEyXSxvPXRbMV0sYT10WzVdLHM9dFs5XSxsPXRbMTNdLGM9dFsyXSx1PXRbNl0saD10WzEwXSxkPXRbMTRdO3JldHVybiB0WzNdKigrcipzKnUtaSpsKnUtciphKmgrbipsKmgraSphKmQtbipzKmQpK3RbN10qKCtlKnMqZC1lKmwqaCtyKm8qaC1pKm8qZCtpKmwqYy1yKnMqYykrdFsxMV0qKCtlKmwqdS1lKmEqZC1yKm8qdStuKm8qZCtyKmEqYy1uKmwqYykrdFsxNV0qKC1pKmEqYy1lKnMqdStlKmEqaCtpKm8qdS1uKm8qaCtuKnMqYyl9dHJhbnNwb3NlKCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzO2xldCBlO3JldHVybiBlPXRbMV0sdFsxXT10WzRdLHRbNF09ZSxlPXRbMl0sdFsyXT10WzhdLHRbOF09ZSxlPXRbNl0sdFs2XT10WzldLHRbOV09ZSxlPXRbM10sdFszXT10WzEyXSx0WzEyXT1lLGU9dFs3XSx0WzddPXRbMTNdLHRbMTNdPWUsZT10WzExXSx0WzExXT10WzE0XSx0WzE0XT1lLHRoaXN9c2V0UG9zaXRpb24odCxlLG4pe2NvbnN0IGk9dGhpcy5lbGVtZW50cztyZXR1cm4gdC5pc1ZlY3RvcjM/KGlbMTJdPXQueCxpWzEzXT10LnksaVsxNF09dC56KTooaVsxMl09dCxpWzEzXT1lLGlbMTRdPW4pLHRoaXN9aW52ZXJ0KCl7Y29uc3QgdD10aGlzLmVsZW1lbnRzLGU9dFswXSxuPXRbMV0saT10WzJdLHI9dFszXSxvPXRbNF0sYT10WzVdLHM9dFs2XSxsPXRbN10sYz10WzhdLHU9dFs5XSxoPXRbMTBdLGQ9dFsxMV0scD10WzEyXSxmPXRbMTNdLG09dFsxNF0sZz10WzE1XSxfPXUqbSpsLWYqaCpsK2YqcypkLWEqbSpkLXUqcypnK2EqaCpnLHk9cCpoKmwtYyptKmwtcCpzKmQrbyptKmQrYypzKmctbypoKmcsdj1jKmYqbC1wKnUqbCtwKmEqZC1vKmYqZC1jKmEqZytvKnUqZyxiPXAqdSpzLWMqZipzLXAqYSpoK28qZipoK2MqYSptLW8qdSptLHg9ZSpfK24qeStpKnYrcipiO2lmKDA9PT14KXJldHVybiB0aGlzLnNldCgwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwKTtjb25zdCB3PTEveDtyZXR1cm4gdFswXT1fKncsdFsxXT0oZipoKnItdSptKnItZippKmQrbiptKmQrdSppKmctbipoKmcpKncsdFsyXT0oYSptKnItZipzKnIrZippKmwtbiptKmwtYSppKmcrbipzKmcpKncsdFszXT0odSpzKnItYSpoKnItdSppKmwrbipoKmwrYSppKmQtbipzKmQpKncsdFs0XT15KncsdFs1XT0oYyptKnItcCpoKnIrcCppKmQtZSptKmQtYyppKmcrZSpoKmcpKncsdFs2XT0ocCpzKnItbyptKnItcCppKmwrZSptKmwrbyppKmctZSpzKmcpKncsdFs3XT0obypoKnItYypzKnIrYyppKmwtZSpoKmwtbyppKmQrZSpzKmQpKncsdFs4XT12KncsdFs5XT0ocCp1KnItYypmKnItcCpuKmQrZSpmKmQrYypuKmctZSp1KmcpKncsdFsxMF09KG8qZipyLXAqYSpyK3AqbipsLWUqZipsLW8qbipnK2UqYSpnKSp3LHRbMTFdPShjKmEqci1vKnUqci1jKm4qbCtlKnUqbCtvKm4qZC1lKmEqZCkqdyx0WzEyXT1iKncsdFsxM109KGMqZippLXAqdSppK3AqbipoLWUqZipoLWMqbiptK2UqdSptKSp3LHRbMTRdPShwKmEqaS1vKmYqaS1wKm4qcytlKmYqcytvKm4qbS1lKmEqbSkqdyx0WzE1XT0obyp1KmktYyphKmkrYypuKnMtZSp1KnMtbypuKmgrZSphKmgpKncsdGhpc31zY2FsZSh0KXtjb25zdCBlPXRoaXMuZWxlbWVudHMsbj10LngsaT10Lnkscj10Lno7cmV0dXJuIGVbMF0qPW4sZVs0XSo9aSxlWzhdKj1yLGVbMV0qPW4sZVs1XSo9aSxlWzldKj1yLGVbMl0qPW4sZVs2XSo9aSxlWzEwXSo9cixlWzNdKj1uLGVbN10qPWksZVsxMV0qPXIsdGhpc31nZXRNYXhTY2FsZU9uQXhpcygpe2NvbnN0IHQ9dGhpcy5lbGVtZW50cztyZXR1cm4gTWF0aC5zcXJ0KE1hdGgubWF4KHRbMF0qdFswXSt0WzFdKnRbMV0rdFsyXSp0WzJdLHRbNF0qdFs0XSt0WzVdKnRbNV0rdFs2XSp0WzZdLHRbOF0qdFs4XSt0WzldKnRbOV0rdFsxMF0qdFsxMF0pKX1tYWtlVHJhbnNsYXRpb24odCxlLG4pe3JldHVybiB0aGlzLnNldCgxLDAsMCx0LDAsMSwwLGUsMCwwLDEsbiwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvblgodCl7Y29uc3QgZT1NYXRoLmNvcyh0KSxuPU1hdGguc2luKHQpO3JldHVybiB0aGlzLnNldCgxLDAsMCwwLDAsZSwtbiwwLDAsbixlLDAsMCwwLDAsMSksdGhpc31tYWtlUm90YXRpb25ZKHQpe2NvbnN0IGU9TWF0aC5jb3ModCksbj1NYXRoLnNpbih0KTtyZXR1cm4gdGhpcy5zZXQoZSwwLG4sMCwwLDEsMCwwLC1uLDAsZSwwLDAsMCwwLDEpLHRoaXN9bWFrZVJvdGF0aW9uWih0KXtjb25zdCBlPU1hdGguY29zKHQpLG49TWF0aC5zaW4odCk7cmV0dXJuIHRoaXMuc2V0KGUsLW4sMCwwLG4sZSwwLDAsMCwwLDEsMCwwLDAsMCwxKSx0aGlzfW1ha2VSb3RhdGlvbkF4aXModCxlKXtjb25zdCBuPU1hdGguY29zKGUpLGk9TWF0aC5zaW4oZSkscj0xLW4sbz10LngsYT10Lnkscz10LnosbD1yKm8sYz1yKmE7cmV0dXJuIHRoaXMuc2V0KGwqbytuLGwqYS1pKnMsbCpzK2kqYSwwLGwqYStpKnMsYyphK24sYypzLWkqbywwLGwqcy1pKmEsYypzK2kqbyxyKnMqcytuLDAsMCwwLDAsMSksdGhpc31tYWtlU2NhbGUodCxlLG4pe3JldHVybiB0aGlzLnNldCh0LDAsMCwwLDAsZSwwLDAsMCwwLG4sMCwwLDAsMCwxKSx0aGlzfW1ha2VTaGVhcih0LGUsbixpLHIsbyl7cmV0dXJuIHRoaXMuc2V0KDEsbixyLDAsdCwxLG8sMCxlLGksMSwwLDAsMCwwLDEpLHRoaXN9Y29tcG9zZSh0LGUsbil7Y29uc3QgaT10aGlzLmVsZW1lbnRzLHI9ZS5feCxvPWUuX3ksYT1lLl96LHM9ZS5fdyxsPXIrcixjPW8rbyx1PWErYSxoPXIqbCxkPXIqYyxwPXIqdSxmPW8qYyxtPW8qdSxnPWEqdSxfPXMqbCx5PXMqYyx2PXMqdSxiPW4ueCx4PW4ueSx3PW4uejtyZXR1cm4gaVswXT0oMS0oZitnKSkqYixpWzFdPShkK3YpKmIsaVsyXT0ocC15KSpiLGlbM109MCxpWzRdPShkLXYpKngsaVs1XT0oMS0oaCtnKSkqeCxpWzZdPShtK18pKngsaVs3XT0wLGlbOF09KHAreSkqdyxpWzldPShtLV8pKncsaVsxMF09KDEtKGgrZikpKncsaVsxMV09MCxpWzEyXT10LngsaVsxM109dC55LGlbMTRdPXQueixpWzE1XT0xLHRoaXN9ZGVjb21wb3NlKHQsZSxuKXtjb25zdCBpPXRoaXMuZWxlbWVudHM7bGV0IHI9XzN0LnNldChpWzBdLGlbMV0saVsyXSkubGVuZ3RoKCk7Y29uc3Qgbz1fM3Quc2V0KGlbNF0saVs1XSxpWzZdKS5sZW5ndGgoKSxhPV8zdC5zZXQoaVs4XSxpWzldLGlbMTBdKS5sZW5ndGgoKTt0aGlzLmRldGVybWluYW50KCk8MCYmKHI9LXIpLHQueD1pWzEyXSx0Lnk9aVsxM10sdC56PWlbMTRdLHkzdC5jb3B5KHRoaXMpO2NvbnN0IHM9MS9yLGw9MS9vLGM9MS9hO3JldHVybiB5M3QuZWxlbWVudHNbMF0qPXMseTN0LmVsZW1lbnRzWzFdKj1zLHkzdC5lbGVtZW50c1syXSo9cyx5M3QuZWxlbWVudHNbNF0qPWwseTN0LmVsZW1lbnRzWzVdKj1sLHkzdC5lbGVtZW50c1s2XSo9bCx5M3QuZWxlbWVudHNbOF0qPWMseTN0LmVsZW1lbnRzWzldKj1jLHkzdC5lbGVtZW50c1sxMF0qPWMsZS5zZXRGcm9tUm90YXRpb25NYXRyaXgoeTN0KSxuLng9cixuLnk9byxuLno9YSx0aGlzfW1ha2VQZXJzcGVjdGl2ZSh0LGUsbixpLHIsbyl7dm9pZCAwPT09byYmY29uc29sZS53YXJuKCJUSFJFRS5NYXRyaXg0OiAubWFrZVBlcnNwZWN0aXZlKCkgaGFzIGJlZW4gcmVkZWZpbmVkIGFuZCBoYXMgYSBuZXcgc2lnbmF0dXJlLiBQbGVhc2UgY2hlY2sgdGhlIGRvY3MuIik7Y29uc3QgYT10aGlzLmVsZW1lbnRzLHM9MipyLyhuLWkpLGw9KGUrdCkvKGUtdCksYz0obitpKS8obi1pKSx1PS0obytyKS8oby1yKSxoPS0yKm8qci8oby1yKTtyZXR1cm4gYVswXT0yKnIvKGUtdCksYVs0XT0wLGFbOF09bCxhWzEyXT0wLGFbMV09MCxhWzVdPXMsYVs5XT1jLGFbMTNdPTAsYVsyXT0wLGFbNl09MCxhWzEwXT11LGFbMTRdPWgsYVszXT0wLGFbN109MCxhWzExXT0tMSxhWzE1XT0wLHRoaXN9bWFrZU9ydGhvZ3JhcGhpYyh0LGUsbixpLHIsbyl7Y29uc3QgYT10aGlzLmVsZW1lbnRzLHM9MS8oZS10KSxsPTEvKG4taSksYz0xLyhvLXIpLHU9KGUrdCkqcyxoPShuK2kpKmwsZD0obytyKSpjO3JldHVybiBhWzBdPTIqcyxhWzRdPTAsYVs4XT0wLGFbMTJdPS11LGFbMV09MCxhWzVdPTIqbCxhWzldPTAsYVsxM109LWgsYVsyXT0wLGFbNl09MCxhWzEwXT0tMipjLGFbMTRdPS1kLGFbM109MCxhWzddPTAsYVsxMV09MCxhWzE1XT0xLHRoaXN9ZXF1YWxzKHQpe2NvbnN0IGU9dGhpcy5lbGVtZW50cyxuPXQuZWxlbWVudHM7Zm9yKGxldCB0PTA7dDwxNjt0KyspaWYoZVt0XSE9PW5bdF0pcmV0dXJuITE7cmV0dXJuITB9ZnJvbUFycmF5KHQsZT0wKXtmb3IobGV0IG49MDtuPDE2O24rKyl0aGlzLmVsZW1lbnRzW25dPXRbbitlXTtyZXR1cm4gdGhpc310b0FycmF5KHQ9W10sZT0wKXtjb25zdCBuPXRoaXMuZWxlbWVudHM7cmV0dXJuIHRbZV09blswXSx0W2UrMV09blsxXSx0W2UrMl09blsyXSx0W2UrM109blszXSx0W2UrNF09bls0XSx0W2UrNV09bls1XSx0W2UrNl09bls2XSx0W2UrN109bls3XSx0W2UrOF09bls4XSx0W2UrOV09bls5XSx0W2UrMTBdPW5bMTBdLHRbZSsxMV09blsxMV0sdFtlKzEyXT1uWzEyXSx0W2UrMTNdPW5bMTNdLHRbZSsxNF09blsxNF0sdFtlKzE1XT1uWzE1XSx0fX1nM3QucHJvdG90eXBlLmlzTWF0cml4ND0hMDtjb25zdCBfM3Q9bmV3IEg1dCx5M3Q9bmV3IGczdCx2M3Q9bmV3IEg1dCgwLDAsMCksYjN0PW5ldyBINXQoMSwxLDEpLHgzdD1uZXcgSDV0LHczdD1uZXcgSDV0LFMzdD1uZXcgSDV0LE0zdD1uZXcgZzN0LEUzdD1uZXcgQjV0O2NsYXNzIFQzdHtjb25zdHJ1Y3Rvcih0PTAsZT0wLG49MCxpPVQzdC5EZWZhdWx0T3JkZXIpe3RoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5fej1uLHRoaXMuX29yZGVyPWl9Z2V0IHgoKXtyZXR1cm4gdGhpcy5feH1zZXQgeCh0KXt0aGlzLl94PXQsdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpfWdldCB5KCl7cmV0dXJuIHRoaXMuX3l9c2V0IHkodCl7dGhpcy5feT10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1nZXQgeigpe3JldHVybiB0aGlzLl96fXNldCB6KHQpe3RoaXMuX3o9dCx0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCl9Z2V0IG9yZGVyKCl7cmV0dXJuIHRoaXMuX29yZGVyfXNldCBvcmRlcih0KXt0aGlzLl9vcmRlcj10LHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKX1zZXQodCxlLG4saT10aGlzLl9vcmRlcil7cmV0dXJuIHRoaXMuX3g9dCx0aGlzLl95PWUsdGhpcy5fej1uLHRoaXMuX29yZGVyPWksdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpLHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5feCx0aGlzLl95LHRoaXMuX3osdGhpcy5fb3JkZXIpfWNvcHkodCl7cmV0dXJuIHRoaXMuX3g9dC5feCx0aGlzLl95PXQuX3ksdGhpcy5fej10Ll96LHRoaXMuX29yZGVyPXQuX29yZGVyLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21Sb3RhdGlvbk1hdHJpeCh0LGU9dGhpcy5fb3JkZXIsbj0hMCl7Y29uc3QgaT10LmVsZW1lbnRzLHI9aVswXSxvPWlbNF0sYT1pWzhdLHM9aVsxXSxsPWlbNV0sYz1pWzldLHU9aVsyXSxoPWlbNl0sZD1pWzEwXTtzd2l0Y2goZSl7Y2FzZSJYWVoiOnRoaXMuX3k9TWF0aC5hc2luKHM1dChhLC0xLDEpKSxNYXRoLmFicyhhKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKC1jLGQpLHRoaXMuX3o9TWF0aC5hdGFuMigtbyxyKSk6KHRoaXMuX3g9TWF0aC5hdGFuMihoLGwpLHRoaXMuX3o9MCk7YnJlYWs7Y2FzZSJZWFoiOnRoaXMuX3g9TWF0aC5hc2luKC1zNXQoYywtMSwxKSksTWF0aC5hYnMoYyk8Ljk5OTk5OTk/KHRoaXMuX3k9TWF0aC5hdGFuMihhLGQpLHRoaXMuX3o9TWF0aC5hdGFuMihzLGwpKToodGhpcy5feT1NYXRoLmF0YW4yKC11LHIpLHRoaXMuX3o9MCk7YnJlYWs7Y2FzZSJaWFkiOnRoaXMuX3g9TWF0aC5hc2luKHM1dChoLC0xLDEpKSxNYXRoLmFicyhoKTwuOTk5OTk5OT8odGhpcy5feT1NYXRoLmF0YW4yKC11LGQpLHRoaXMuX3o9TWF0aC5hdGFuMigtbyxsKSk6KHRoaXMuX3k9MCx0aGlzLl96PU1hdGguYXRhbjIocyxyKSk7YnJlYWs7Y2FzZSJaWVgiOnRoaXMuX3k9TWF0aC5hc2luKC1zNXQodSwtMSwxKSksTWF0aC5hYnModSk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMihoLGQpLHRoaXMuX3o9TWF0aC5hdGFuMihzLHIpKToodGhpcy5feD0wLHRoaXMuX3o9TWF0aC5hdGFuMigtbyxsKSk7YnJlYWs7Y2FzZSJZWlgiOnRoaXMuX3o9TWF0aC5hc2luKHM1dChzLC0xLDEpKSxNYXRoLmFicyhzKTwuOTk5OTk5OT8odGhpcy5feD1NYXRoLmF0YW4yKC1jLGwpLHRoaXMuX3k9TWF0aC5hdGFuMigtdSxyKSk6KHRoaXMuX3g9MCx0aGlzLl95PU1hdGguYXRhbjIoYSxkKSk7YnJlYWs7Y2FzZSJYWlkiOnRoaXMuX3o9TWF0aC5hc2luKC1zNXQobywtMSwxKSksTWF0aC5hYnMobyk8Ljk5OTk5OTk/KHRoaXMuX3g9TWF0aC5hdGFuMihoLGwpLHRoaXMuX3k9TWF0aC5hdGFuMihhLHIpKToodGhpcy5feD1NYXRoLmF0YW4yKC1jLGQpLHRoaXMuX3k9MCk7YnJlYWs7ZGVmYXVsdDpjb25zb2xlLndhcm4oIlRIUkVFLkV1bGVyOiAuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCkgZW5jb3VudGVyZWQgYW4gdW5rbm93biBvcmRlcjogIitlKX1yZXR1cm4gdGhpcy5fb3JkZXI9ZSwhMD09PW4mJnRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXNldEZyb21RdWF0ZXJuaW9uKHQsZSxuKXtyZXR1cm4gTTN0Lm1ha2VSb3RhdGlvbkZyb21RdWF0ZXJuaW9uKHQpLHRoaXMuc2V0RnJvbVJvdGF0aW9uTWF0cml4KE0zdCxlLG4pfXNldEZyb21WZWN0b3IzKHQsZT10aGlzLl9vcmRlcil7cmV0dXJuIHRoaXMuc2V0KHQueCx0LnksdC56LGUpfXJlb3JkZXIodCl7cmV0dXJuIEUzdC5zZXRGcm9tRXVsZXIodGhpcyksdGhpcy5zZXRGcm9tUXVhdGVybmlvbihFM3QsdCl9ZXF1YWxzKHQpe3JldHVybiB0Ll94PT09dGhpcy5feCYmdC5feT09PXRoaXMuX3kmJnQuX3o9PT10aGlzLl96JiZ0Ll9vcmRlcj09PXRoaXMuX29yZGVyfWZyb21BcnJheSh0KXtyZXR1cm4gdGhpcy5feD10WzBdLHRoaXMuX3k9dFsxXSx0aGlzLl96PXRbMl0sdm9pZCAwIT09dFszXSYmKHRoaXMuX29yZGVyPXRbM10pLHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMuX3gsdFtlKzFdPXRoaXMuX3ksdFtlKzJdPXRoaXMuX3osdFtlKzNdPXRoaXMuX29yZGVyLHR9dG9WZWN0b3IzKHQpe3JldHVybiB0P3Quc2V0KHRoaXMuX3gsdGhpcy5feSx0aGlzLl96KTpuZXcgSDV0KHRoaXMuX3gsdGhpcy5feSx0aGlzLl96KX1fb25DaGFuZ2UodCl7cmV0dXJuIHRoaXMuX29uQ2hhbmdlQ2FsbGJhY2s9dCx0aGlzfV9vbkNoYW5nZUNhbGxiYWNrKCl7fX1UM3QucHJvdG90eXBlLmlzRXVsZXI9ITAsVDN0LkRlZmF1bHRPcmRlcj0iWFlaIixUM3QuUm90YXRpb25PcmRlcnM9WyJYWVoiLCJZWlgiLCJaWFkiLCJYWlkiLCJZWFoiLCJaWVgiXTtjbGFzcyBDM3R7Y29uc3RydWN0b3IoKXt0aGlzLm1hc2s9MX1zZXQodCl7dGhpcy5tYXNrPTE8PHR8MH1lbmFibGUodCl7dGhpcy5tYXNrfD0xPDx0fDB9ZW5hYmxlQWxsKCl7dGhpcy5tYXNrPS0xfXRvZ2dsZSh0KXt0aGlzLm1hc2tePTE8PHR8MH1kaXNhYmxlKHQpe3RoaXMubWFzayY9figxPDx0fDApfWRpc2FibGVBbGwoKXt0aGlzLm1hc2s9MH10ZXN0KHQpe3JldHVybiAwIT0odGhpcy5tYXNrJnQubWFzayl9fWxldCBBM3Q9MDtjb25zdCBrM3Q9bmV3IEg1dCxMM3Q9bmV3IEI1dCxQM3Q9bmV3IGczdCxOM3Q9bmV3IEg1dCxJM3Q9bmV3IEg1dCxSM3Q9bmV3IEg1dCxPM3Q9bmV3IEI1dCx6M3Q9bmV3IEg1dCgxLDAsMCksRDN0PW5ldyBINXQoMCwxLDApLEIzdD1uZXcgSDV0KDAsMCwxKSxIM3Q9e3R5cGU6ImFkZGVkIn0sRjN0PXt0eXBlOiJyZW1vdmVkIn07Y2xhc3MgVjN0IGV4dGVuZHMgZTV0e2NvbnN0cnVjdG9yKCl7c3VwZXIoKSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywiaWQiLHt2YWx1ZTpBM3QrK30pLHRoaXMudXVpZD1hNXQoKSx0aGlzLm5hbWU9IiIsdGhpcy50eXBlPSJPYmplY3QzRCIsdGhpcy5wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuPVtdLHRoaXMudXA9VjN0LkRlZmF1bHRVcC5jbG9uZSgpO2NvbnN0IHQ9bmV3IEg1dCxlPW5ldyBUM3Qsbj1uZXcgQjV0LGk9bmV3IEg1dCgxLDEsMSk7ZS5fb25DaGFuZ2UoKGZ1bmN0aW9uIHIoKXtuLnNldEZyb21FdWxlcihlLCExKX0pKSxuLl9vbkNoYW5nZSgoZnVuY3Rpb24gbygpe2Uuc2V0RnJvbVF1YXRlcm5pb24obix2b2lkIDAsITEpfSkpLE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHRoaXMse3Bvc2l0aW9uOntjb25maWd1cmFibGU6ITAsZW51bWVyYWJsZTohMCx2YWx1ZTp0fSxyb3RhdGlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6ZX0scXVhdGVybmlvbjp7Y29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITAsdmFsdWU6bn0sc2NhbGU6e2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOml9LG1vZGVsVmlld01hdHJpeDp7dmFsdWU6bmV3IGczdH0sbm9ybWFsTWF0cml4Ont2YWx1ZTpuZXcgQTV0fX0pLHRoaXMubWF0cml4PW5ldyBnM3QsdGhpcy5tYXRyaXhXb3JsZD1uZXcgZzN0LHRoaXMubWF0cml4QXV0b1VwZGF0ZT1WM3QuRGVmYXVsdE1hdHJpeEF1dG9VcGRhdGUsdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlPSExLHRoaXMubGF5ZXJzPW5ldyBDM3QsdGhpcy52aXNpYmxlPSEwLHRoaXMuY2FzdFNoYWRvdz0hMSx0aGlzLnJlY2VpdmVTaGFkb3c9ITEsdGhpcy5mcnVzdHVtQ3VsbGVkPSEwLHRoaXMucmVuZGVyT3JkZXI9MCx0aGlzLmFuaW1hdGlvbnM9W10sdGhpcy51c2VyRGF0YT17fX1vbkJlZm9yZVJlbmRlcigpe31vbkFmdGVyUmVuZGVyKCl7fWFwcGx5TWF0cml4NCh0KXt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksdGhpcy5tYXRyaXgucHJlbXVsdGlwbHkodCksdGhpcy5tYXRyaXguZGVjb21wb3NlKHRoaXMucG9zaXRpb24sdGhpcy5xdWF0ZXJuaW9uLHRoaXMuc2NhbGUpfWFwcGx5UXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KHQpLHRoaXN9c2V0Um90YXRpb25Gcm9tQXhpc0FuZ2xlKHQsZSl7dGhpcy5xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUodCxlKX1zZXRSb3RhdGlvbkZyb21FdWxlcih0KXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbUV1bGVyKHQsITApfXNldFJvdGF0aW9uRnJvbU1hdHJpeCh0KXt0aGlzLnF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KHQpfXNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24odCl7dGhpcy5xdWF0ZXJuaW9uLmNvcHkodCl9cm90YXRlT25BeGlzKHQsZSl7cmV0dXJuIEwzdC5zZXRGcm9tQXhpc0FuZ2xlKHQsZSksdGhpcy5xdWF0ZXJuaW9uLm11bHRpcGx5KEwzdCksdGhpc31yb3RhdGVPbldvcmxkQXhpcyh0LGUpe3JldHVybiBMM3Quc2V0RnJvbUF4aXNBbmdsZSh0LGUpLHRoaXMucXVhdGVybmlvbi5wcmVtdWx0aXBseShMM3QpLHRoaXN9cm90YXRlWCh0KXtyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoejN0LHQpfXJvdGF0ZVkodCl7cmV0dXJuIHRoaXMucm90YXRlT25BeGlzKEQzdCx0KX1yb3RhdGVaKHQpe3JldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyhCM3QsdCl9dHJhbnNsYXRlT25BeGlzKHQsZSl7cmV0dXJuIGszdC5jb3B5KHQpLmFwcGx5UXVhdGVybmlvbih0aGlzLnF1YXRlcm5pb24pLHRoaXMucG9zaXRpb24uYWRkKGszdC5tdWx0aXBseVNjYWxhcihlKSksdGhpc310cmFuc2xhdGVYKHQpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyh6M3QsdCl9dHJhbnNsYXRlWSh0KXtyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoRDN0LHQpfXRyYW5zbGF0ZVoodCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKEIzdCx0KX1sb2NhbFRvV29ybGQodCl7cmV0dXJuIHQuYXBwbHlNYXRyaXg0KHRoaXMubWF0cml4V29ybGQpfXdvcmxkVG9Mb2NhbCh0KXtyZXR1cm4gdC5hcHBseU1hdHJpeDQoUDN0LmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCkpfWxvb2tBdCh0LGUsbil7dC5pc1ZlY3RvcjM/TjN0LmNvcHkodCk6TjN0LnNldCh0LGUsbik7Y29uc3QgaT10aGlzLnBhcmVudDt0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSxJM3Quc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpLHRoaXMuaXNDYW1lcmF8fHRoaXMuaXNMaWdodD9QM3QubG9va0F0KEkzdCxOM3QsdGhpcy51cCk6UDN0Lmxvb2tBdChOM3QsSTN0LHRoaXMudXApLHRoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoUDN0KSxpJiYoUDN0LmV4dHJhY3RSb3RhdGlvbihpLm1hdHJpeFdvcmxkKSxMM3Quc2V0RnJvbVJvdGF0aW9uTWF0cml4KFAzdCksdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KEwzdC5pbnZlcnQoKSkpfWFkZCh0KXtpZihhcmd1bWVudHMubGVuZ3RoPjEpe2ZvcihsZXQgdD0wO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspdGhpcy5hZGQoYXJndW1lbnRzW3RdKTtyZXR1cm4gdGhpc31yZXR1cm4gdD09PXRoaXM/KGNvbnNvbGUuZXJyb3IoIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IGNhbid0IGJlIGFkZGVkIGFzIGEgY2hpbGQgb2YgaXRzZWxmLiIsdCksdGhpcyk6KHQmJnQuaXNPYmplY3QzRD8obnVsbCE9PXQucGFyZW50JiZ0LnBhcmVudC5yZW1vdmUodCksdC5wYXJlbnQ9dGhpcyx0aGlzLmNoaWxkcmVuLnB1c2godCksdC5kaXNwYXRjaEV2ZW50KEgzdCkpOmNvbnNvbGUuZXJyb3IoIlRIUkVFLk9iamVjdDNELmFkZDogb2JqZWN0IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5PYmplY3QzRC4iLHQpLHRoaXMpfXJlbW92ZSh0KXtpZihhcmd1bWVudHMubGVuZ3RoPjEpe2ZvcihsZXQgdD0wO3Q8YXJndW1lbnRzLmxlbmd0aDt0KyspdGhpcy5yZW1vdmUoYXJndW1lbnRzW3RdKTtyZXR1cm4gdGhpc31jb25zdCBlPXRoaXMuY2hpbGRyZW4uaW5kZXhPZih0KTtyZXR1cm4tMSE9PWUmJih0LnBhcmVudD1udWxsLHRoaXMuY2hpbGRyZW4uc3BsaWNlKGUsMSksdC5kaXNwYXRjaEV2ZW50KEYzdCkpLHRoaXN9cmVtb3ZlRnJvbVBhcmVudCgpe2NvbnN0IHQ9dGhpcy5wYXJlbnQ7cmV0dXJuIG51bGwhPT10JiZ0LnJlbW92ZSh0aGlzKSx0aGlzfWNsZWFyKCl7Zm9yKGxldCB0PTA7dDx0aGlzLmNoaWxkcmVuLmxlbmd0aDt0Kyspe2NvbnN0IGU9dGhpcy5jaGlsZHJlblt0XTtlLnBhcmVudD1udWxsLGUuZGlzcGF0Y2hFdmVudChGM3QpfXJldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aD0wLHRoaXN9YXR0YWNoKHQpe3JldHVybiB0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKSxQM3QuY29weSh0aGlzLm1hdHJpeFdvcmxkKS5pbnZlcnQoKSxudWxsIT09dC5wYXJlbnQmJih0LnBhcmVudC51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksUDN0Lm11bHRpcGx5KHQucGFyZW50Lm1hdHJpeFdvcmxkKSksdC5hcHBseU1hdHJpeDQoUDN0KSx0aGlzLmFkZCh0KSx0LnVwZGF0ZVdvcmxkTWF0cml4KCExLCEwKSx0aGlzfWdldE9iamVjdEJ5SWQodCl7cmV0dXJuIHRoaXMuZ2V0T2JqZWN0QnlQcm9wZXJ0eSgiaWQiLHQpfWdldE9iamVjdEJ5TmFtZSh0KXtyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCJuYW1lIix0KX1nZXRPYmplY3RCeVByb3BlcnR5KHQsZSl7aWYodGhpc1t0XT09PWUpcmV0dXJuIHRoaXM7Zm9yKGxldCBuPTAsaT10aGlzLmNoaWxkcmVuLmxlbmd0aDtuPGk7bisrKXtjb25zdCBpPXRoaXMuY2hpbGRyZW5bbl0uZ2V0T2JqZWN0QnlQcm9wZXJ0eSh0LGUpO2lmKHZvaWQgMCE9PWkpcmV0dXJuIGl9fWdldFdvcmxkUG9zaXRpb24odCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKHRoaXMubWF0cml4V29ybGQpfWdldFdvcmxkUXVhdGVybmlvbih0KXtyZXR1cm4gdGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSksdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoSTN0LHQsUjN0KSx0fWdldFdvcmxkU2NhbGUodCl7cmV0dXJuIHRoaXMudXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKEkzdCxPM3QsdCksdH1nZXRXb3JsZERpcmVjdGlvbih0KXt0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCEwLCExKTtjb25zdCBlPXRoaXMubWF0cml4V29ybGQuZWxlbWVudHM7cmV0dXJuIHQuc2V0KGVbOF0sZVs5XSxlWzEwXSkubm9ybWFsaXplKCl9cmF5Y2FzdCgpe310cmF2ZXJzZSh0KXt0KHRoaXMpO2NvbnN0IGU9dGhpcy5jaGlsZHJlbjtmb3IobGV0IG49MCxpPWUubGVuZ3RoO248aTtuKyspZVtuXS50cmF2ZXJzZSh0KX10cmF2ZXJzZVZpc2libGUodCl7aWYoITE9PT10aGlzLnZpc2libGUpcmV0dXJuO3QodGhpcyk7Y29uc3QgZT10aGlzLmNoaWxkcmVuO2ZvcihsZXQgbj0wLGk9ZS5sZW5ndGg7bjxpO24rKyllW25dLnRyYXZlcnNlVmlzaWJsZSh0KX10cmF2ZXJzZUFuY2VzdG9ycyh0KXtjb25zdCBlPXRoaXMucGFyZW50O251bGwhPT1lJiYodChlKSxlLnRyYXZlcnNlQW5jZXN0b3JzKHQpKX11cGRhdGVNYXRyaXgoKXt0aGlzLm1hdHJpeC5jb21wb3NlKHRoaXMucG9zaXRpb24sdGhpcy5xdWF0ZXJuaW9uLHRoaXMuc2NhbGUpLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMH11cGRhdGVNYXRyaXhXb3JsZCh0KXt0aGlzLm1hdHJpeEF1dG9VcGRhdGUmJnRoaXMudXBkYXRlTWF0cml4KCksKHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZXx8dCkmJihudWxsPT09dGhpcy5wYXJlbnQ/dGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubWF0cml4KTp0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXModGhpcy5wYXJlbnQubWF0cml4V29ybGQsdGhpcy5tYXRyaXgpLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT0hMSx0PSEwKTtjb25zdCBlPXRoaXMuY2hpbGRyZW47Zm9yKGxldCBuPTAsaT1lLmxlbmd0aDtuPGk7bisrKWVbbl0udXBkYXRlTWF0cml4V29ybGQodCl9dXBkYXRlV29ybGRNYXRyaXgodCxlKXtjb25zdCBuPXRoaXMucGFyZW50O2lmKCEwPT09dCYmbnVsbCE9PW4mJm4udXBkYXRlV29ybGRNYXRyaXgoITAsITEpLHRoaXMubWF0cml4QXV0b1VwZGF0ZSYmdGhpcy51cGRhdGVNYXRyaXgoKSxudWxsPT09dGhpcy5wYXJlbnQ/dGhpcy5tYXRyaXhXb3JsZC5jb3B5KHRoaXMubWF0cml4KTp0aGlzLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXModGhpcy5wYXJlbnQubWF0cml4V29ybGQsdGhpcy5tYXRyaXgpLCEwPT09ZSl7Y29uc3QgdD10aGlzLmNoaWxkcmVuO2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl0W2VdLnVwZGF0ZVdvcmxkTWF0cml4KCExLCEwKX19dG9KU09OKHQpe2NvbnN0IGU9dm9pZCAwPT09dHx8InN0cmluZyI9PXR5cGVvZiB0LG49e307ZSYmKHQ9e2dlb21ldHJpZXM6e30sbWF0ZXJpYWxzOnt9LHRleHR1cmVzOnt9LGltYWdlczp7fSxzaGFwZXM6e30sc2tlbGV0b25zOnt9LGFuaW1hdGlvbnM6e319LG4ubWV0YWRhdGE9e3ZlcnNpb246NC41LHR5cGU6Ik9iamVjdCIsZ2VuZXJhdG9yOiJPYmplY3QzRC50b0pTT04ifSk7Y29uc3QgaT17fTtmdW5jdGlvbiByKGUsbil7cmV0dXJuIHZvaWQgMD09PWVbbi51dWlkXSYmKGVbbi51dWlkXT1uLnRvSlNPTih0KSksbi51dWlkfWlmKGkudXVpZD10aGlzLnV1aWQsaS50eXBlPXRoaXMudHlwZSwiIiE9PXRoaXMubmFtZSYmKGkubmFtZT10aGlzLm5hbWUpLCEwPT09dGhpcy5jYXN0U2hhZG93JiYoaS5jYXN0U2hhZG93PSEwKSwhMD09PXRoaXMucmVjZWl2ZVNoYWRvdyYmKGkucmVjZWl2ZVNoYWRvdz0hMCksITE9PT10aGlzLnZpc2libGUmJihpLnZpc2libGU9ITEpLCExPT09dGhpcy5mcnVzdHVtQ3VsbGVkJiYoaS5mcnVzdHVtQ3VsbGVkPSExKSwwIT09dGhpcy5yZW5kZXJPcmRlciYmKGkucmVuZGVyT3JkZXI9dGhpcy5yZW5kZXJPcmRlciksInt9IiE9PUpTT04uc3RyaW5naWZ5KHRoaXMudXNlckRhdGEpJiYoaS51c2VyRGF0YT10aGlzLnVzZXJEYXRhKSxpLmxheWVycz10aGlzLmxheWVycy5tYXNrLGkubWF0cml4PXRoaXMubWF0cml4LnRvQXJyYXkoKSwhMT09PXRoaXMubWF0cml4QXV0b1VwZGF0ZSYmKGkubWF0cml4QXV0b1VwZGF0ZT0hMSksdGhpcy5pc0luc3RhbmNlZE1lc2gmJihpLnR5cGU9Ikluc3RhbmNlZE1lc2giLGkuY291bnQ9dGhpcy5jb3VudCxpLmluc3RhbmNlTWF0cml4PXRoaXMuaW5zdGFuY2VNYXRyaXgudG9KU09OKCksbnVsbCE9PXRoaXMuaW5zdGFuY2VDb2xvciYmKGkuaW5zdGFuY2VDb2xvcj10aGlzLmluc3RhbmNlQ29sb3IudG9KU09OKCkpKSx0aGlzLmlzU2NlbmUpdGhpcy5iYWNrZ3JvdW5kJiYodGhpcy5iYWNrZ3JvdW5kLmlzQ29sb3I/aS5iYWNrZ3JvdW5kPXRoaXMuYmFja2dyb3VuZC50b0pTT04oKTp0aGlzLmJhY2tncm91bmQuaXNUZXh0dXJlJiYoaS5iYWNrZ3JvdW5kPXRoaXMuYmFja2dyb3VuZC50b0pTT04odCkudXVpZCkpLHRoaXMuZW52aXJvbm1lbnQmJnRoaXMuZW52aXJvbm1lbnQuaXNUZXh0dXJlJiYoaS5lbnZpcm9ubWVudD10aGlzLmVudmlyb25tZW50LnRvSlNPTih0KS51dWlkKTtlbHNlIGlmKHRoaXMuaXNNZXNofHx0aGlzLmlzTGluZXx8dGhpcy5pc1BvaW50cyl7aS5nZW9tZXRyeT1yKHQuZ2VvbWV0cmllcyx0aGlzLmdlb21ldHJ5KTtjb25zdCBlPXRoaXMuZ2VvbWV0cnkucGFyYW1ldGVycztpZih2b2lkIDAhPT1lJiZ2b2lkIDAhPT1lLnNoYXBlcyl7Y29uc3Qgbj1lLnNoYXBlcztpZihBcnJheS5pc0FycmF5KG4pKWZvcihsZXQgZT0wLGk9bi5sZW5ndGg7ZTxpO2UrKyl7cih0LnNoYXBlcyxuW2VdKX1lbHNlIHIodC5zaGFwZXMsbil9fWlmKHRoaXMuaXNTa2lubmVkTWVzaCYmKGkuYmluZE1vZGU9dGhpcy5iaW5kTW9kZSxpLmJpbmRNYXRyaXg9dGhpcy5iaW5kTWF0cml4LnRvQXJyYXkoKSx2b2lkIDAhPT10aGlzLnNrZWxldG9uJiYocih0LnNrZWxldG9ucyx0aGlzLnNrZWxldG9uKSxpLnNrZWxldG9uPXRoaXMuc2tlbGV0b24udXVpZCkpLHZvaWQgMCE9PXRoaXMubWF0ZXJpYWwpaWYoQXJyYXkuaXNBcnJheSh0aGlzLm1hdGVyaWFsKSl7Y29uc3QgZT1bXTtmb3IobGV0IG49MCxpPXRoaXMubWF0ZXJpYWwubGVuZ3RoO248aTtuKyspZS5wdXNoKHIodC5tYXRlcmlhbHMsdGhpcy5tYXRlcmlhbFtuXSkpO2kubWF0ZXJpYWw9ZX1lbHNlIGkubWF0ZXJpYWw9cih0Lm1hdGVyaWFscyx0aGlzLm1hdGVyaWFsKTtpZih0aGlzLmNoaWxkcmVuLmxlbmd0aD4wKXtpLmNoaWxkcmVuPVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5jaGlsZHJlbi5sZW5ndGg7ZSsrKWkuY2hpbGRyZW4ucHVzaCh0aGlzLmNoaWxkcmVuW2VdLnRvSlNPTih0KS5vYmplY3QpfWlmKHRoaXMuYW5pbWF0aW9ucy5sZW5ndGg+MCl7aS5hbmltYXRpb25zPVtdO2ZvcihsZXQgZT0wO2U8dGhpcy5hbmltYXRpb25zLmxlbmd0aDtlKyspe2kuYW5pbWF0aW9ucy5wdXNoKHIodC5hbmltYXRpb25zLHRoaXMuYW5pbWF0aW9uc1tlXSkpfX1pZihlKXtjb25zdCBlPW8odC5nZW9tZXRyaWVzKSxpPW8odC5tYXRlcmlhbHMpLHI9byh0LnRleHR1cmVzKSxhPW8odC5pbWFnZXMpLHM9byh0LnNoYXBlcyksbD1vKHQuc2tlbGV0b25zKSxjPW8odC5hbmltYXRpb25zKTtlLmxlbmd0aD4wJiYobi5nZW9tZXRyaWVzPWUpLGkubGVuZ3RoPjAmJihuLm1hdGVyaWFscz1pKSxyLmxlbmd0aD4wJiYobi50ZXh0dXJlcz1yKSxhLmxlbmd0aD4wJiYobi5pbWFnZXM9YSkscy5sZW5ndGg+MCYmKG4uc2hhcGVzPXMpLGwubGVuZ3RoPjAmJihuLnNrZWxldG9ucz1sKSxjLmxlbmd0aD4wJiYobi5hbmltYXRpb25zPWMpfXJldHVybiBuLm9iamVjdD1pLG47ZnVuY3Rpb24gbyh0KXtjb25zdCBlPVtdO2Zvcihjb25zdCBuIGluIHQpe2NvbnN0IGk9dFtuXTtkZWxldGUgaS5tZXRhZGF0YSxlLnB1c2goaSl9cmV0dXJuIGV9fWNsb25lKHQpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzLHQpfWNvcHkodCxlPSEwKXtpZih0aGlzLm5hbWU9dC5uYW1lLHRoaXMudXAuY29weSh0LnVwKSx0aGlzLnBvc2l0aW9uLmNvcHkodC5wb3NpdGlvbiksdGhpcy5yb3RhdGlvbi5vcmRlcj10LnJvdGF0aW9uLm9yZGVyLHRoaXMucXVhdGVybmlvbi5jb3B5KHQucXVhdGVybmlvbiksdGhpcy5zY2FsZS5jb3B5KHQuc2NhbGUpLHRoaXMubWF0cml4LmNvcHkodC5tYXRyaXgpLHRoaXMubWF0cml4V29ybGQuY29weSh0Lm1hdHJpeFdvcmxkKSx0aGlzLm1hdHJpeEF1dG9VcGRhdGU9dC5tYXRyaXhBdXRvVXBkYXRlLHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZT10Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUsdGhpcy5sYXllcnMubWFzaz10LmxheWVycy5tYXNrLHRoaXMudmlzaWJsZT10LnZpc2libGUsdGhpcy5jYXN0U2hhZG93PXQuY2FzdFNoYWRvdyx0aGlzLnJlY2VpdmVTaGFkb3c9dC5yZWNlaXZlU2hhZG93LHRoaXMuZnJ1c3R1bUN1bGxlZD10LmZydXN0dW1DdWxsZWQsdGhpcy5yZW5kZXJPcmRlcj10LnJlbmRlck9yZGVyLHRoaXMudXNlckRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0LnVzZXJEYXRhKSksITA9PT1lKWZvcihsZXQgZT0wO2U8dC5jaGlsZHJlbi5sZW5ndGg7ZSsrKXt0aGlzLmFkZCh0LmNoaWxkcmVuW2VdLmNsb25lKCkpfXJldHVybiB0aGlzfX1WM3QuRGVmYXVsdFVwPW5ldyBINXQoMCwxLDApLFYzdC5EZWZhdWx0TWF0cml4QXV0b1VwZGF0ZT0hMCxWM3QucHJvdG90eXBlLmlzT2JqZWN0M0Q9ITA7Y29uc3QgVTN0PW5ldyBINXQsajN0PW5ldyBINXQsRzN0PW5ldyBINXQsVzN0PW5ldyBINXQscTN0PW5ldyBINXQsWTN0PW5ldyBINXQsWDN0PW5ldyBINXQsJDN0PW5ldyBINXQsSzN0PW5ldyBINXQsWjN0PW5ldyBINXQ7Y2xhc3MgSjN0e2NvbnN0cnVjdG9yKHQ9bmV3IEg1dCxlPW5ldyBINXQsbj1uZXcgSDV0KXt0aGlzLmE9dCx0aGlzLmI9ZSx0aGlzLmM9bn1zdGF0aWMgZ2V0Tm9ybWFsKHQsZSxuLGkpe2kuc3ViVmVjdG9ycyhuLGUpLFUzdC5zdWJWZWN0b3JzKHQsZSksaS5jcm9zcyhVM3QpO2NvbnN0IHI9aS5sZW5ndGhTcSgpO3JldHVybiByPjA/aS5tdWx0aXBseVNjYWxhcigxL01hdGguc3FydChyKSk6aS5zZXQoMCwwLDApfXN0YXRpYyBnZXRCYXJ5Y29vcmQodCxlLG4saSxyKXtVM3Quc3ViVmVjdG9ycyhpLGUpLGozdC5zdWJWZWN0b3JzKG4sZSksRzN0LnN1YlZlY3RvcnModCxlKTtjb25zdCBvPVUzdC5kb3QoVTN0KSxhPVUzdC5kb3QoajN0KSxzPVUzdC5kb3QoRzN0KSxsPWozdC5kb3QoajN0KSxjPWozdC5kb3QoRzN0KSx1PW8qbC1hKmE7aWYoMD09PXUpcmV0dXJuIHIuc2V0KC0yLC0xLC0xKTtjb25zdCBoPTEvdSxkPShsKnMtYSpjKSpoLHA9KG8qYy1hKnMpKmg7cmV0dXJuIHIuc2V0KDEtZC1wLHAsZCl9c3RhdGljIGNvbnRhaW5zUG9pbnQodCxlLG4saSl7cmV0dXJuIHRoaXMuZ2V0QmFyeWNvb3JkKHQsZSxuLGksVzN0KSxXM3QueD49MCYmVzN0Lnk+PTAmJlczdC54K1czdC55PD0xfXN0YXRpYyBnZXRVVih0LGUsbixpLHIsbyxhLHMpe3JldHVybiB0aGlzLmdldEJhcnljb29yZCh0LGUsbixpLFczdCkscy5zZXQoMCwwKSxzLmFkZFNjYWxlZFZlY3RvcihyLFczdC54KSxzLmFkZFNjYWxlZFZlY3RvcihvLFczdC55KSxzLmFkZFNjYWxlZFZlY3RvcihhLFczdC56KSxzfXN0YXRpYyBpc0Zyb250RmFjaW5nKHQsZSxuLGkpe3JldHVybiBVM3Quc3ViVmVjdG9ycyhuLGUpLGozdC5zdWJWZWN0b3JzKHQsZSksVTN0LmNyb3NzKGozdCkuZG90KGkpPDB9c2V0KHQsZSxuKXtyZXR1cm4gdGhpcy5hLmNvcHkodCksdGhpcy5iLmNvcHkoZSksdGhpcy5jLmNvcHkobiksdGhpc31zZXRGcm9tUG9pbnRzQW5kSW5kaWNlcyh0LGUsbixpKXtyZXR1cm4gdGhpcy5hLmNvcHkodFtlXSksdGhpcy5iLmNvcHkodFtuXSksdGhpcy5jLmNvcHkodFtpXSksdGhpc31jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX1jb3B5KHQpe3JldHVybiB0aGlzLmEuY29weSh0LmEpLHRoaXMuYi5jb3B5KHQuYiksdGhpcy5jLmNvcHkodC5jKSx0aGlzfWdldEFyZWEoKXtyZXR1cm4gVTN0LnN1YlZlY3RvcnModGhpcy5jLHRoaXMuYiksajN0LnN1YlZlY3RvcnModGhpcy5hLHRoaXMuYiksLjUqVTN0LmNyb3NzKGozdCkubGVuZ3RoKCl9Z2V0TWlkcG9pbnQodCl7cmV0dXJuIHQuYWRkVmVjdG9ycyh0aGlzLmEsdGhpcy5iKS5hZGQodGhpcy5jKS5tdWx0aXBseVNjYWxhcigxLzMpfWdldE5vcm1hbCh0KXtyZXR1cm4gSjN0LmdldE5vcm1hbCh0aGlzLmEsdGhpcy5iLHRoaXMuYyx0KX1nZXRQbGFuZSh0KXtyZXR1cm4gdC5zZXRGcm9tQ29wbGFuYXJQb2ludHModGhpcy5hLHRoaXMuYix0aGlzLmMpfWdldEJhcnljb29yZCh0LGUpe3JldHVybiBKM3QuZ2V0QmFyeWNvb3JkKHQsdGhpcy5hLHRoaXMuYix0aGlzLmMsZSl9Z2V0VVYodCxlLG4saSxyKXtyZXR1cm4gSjN0LmdldFVWKHQsdGhpcy5hLHRoaXMuYix0aGlzLmMsZSxuLGkscil9Y29udGFpbnNQb2ludCh0KXtyZXR1cm4gSjN0LmNvbnRhaW5zUG9pbnQodCx0aGlzLmEsdGhpcy5iLHRoaXMuYyl9aXNGcm9udEZhY2luZyh0KXtyZXR1cm4gSjN0LmlzRnJvbnRGYWNpbmcodGhpcy5hLHRoaXMuYix0aGlzLmMsdCl9aW50ZXJzZWN0c0JveCh0KXtyZXR1cm4gdC5pbnRlcnNlY3RzVHJpYW5nbGUodGhpcyl9Y2xvc2VzdFBvaW50VG9Qb2ludCh0LGUpe2NvbnN0IG49dGhpcy5hLGk9dGhpcy5iLHI9dGhpcy5jO2xldCBvLGE7cTN0LnN1YlZlY3RvcnMoaSxuKSxZM3Quc3ViVmVjdG9ycyhyLG4pLCQzdC5zdWJWZWN0b3JzKHQsbik7Y29uc3Qgcz1xM3QuZG90KCQzdCksbD1ZM3QuZG90KCQzdCk7aWYoczw9MCYmbDw9MClyZXR1cm4gZS5jb3B5KG4pO0szdC5zdWJWZWN0b3JzKHQsaSk7Y29uc3QgYz1xM3QuZG90KEszdCksdT1ZM3QuZG90KEszdCk7aWYoYz49MCYmdTw9YylyZXR1cm4gZS5jb3B5KGkpO2NvbnN0IGg9cyp1LWMqbDtpZihoPD0wJiZzPj0wJiZjPD0wKXJldHVybiBvPXMvKHMtYyksZS5jb3B5KG4pLmFkZFNjYWxlZFZlY3RvcihxM3Qsbyk7WjN0LnN1YlZlY3RvcnModCxyKTtjb25zdCBkPXEzdC5kb3QoWjN0KSxwPVkzdC5kb3QoWjN0KTtpZihwPj0wJiZkPD1wKXJldHVybiBlLmNvcHkocik7Y29uc3QgZj1kKmwtcypwO2lmKGY8PTAmJmw+PTAmJnA8PTApcmV0dXJuIGE9bC8obC1wKSxlLmNvcHkobikuYWRkU2NhbGVkVmVjdG9yKFkzdCxhKTtjb25zdCBtPWMqcC1kKnU7aWYobTw9MCYmdS1jPj0wJiZkLXA+PTApcmV0dXJuIFgzdC5zdWJWZWN0b3JzKHIsaSksYT0odS1jKS8odS1jKyhkLXApKSxlLmNvcHkoaSkuYWRkU2NhbGVkVmVjdG9yKFgzdCxhKTtjb25zdCBnPTEvKG0rZitoKTtyZXR1cm4gbz1mKmcsYT1oKmcsZS5jb3B5KG4pLmFkZFNjYWxlZFZlY3RvcihxM3QsbykuYWRkU2NhbGVkVmVjdG9yKFkzdCxhKX1lcXVhbHModCl7cmV0dXJuIHQuYS5lcXVhbHModGhpcy5hKSYmdC5iLmVxdWFscyh0aGlzLmIpJiZ0LmMuZXF1YWxzKHRoaXMuYyl9fWxldCBRM3Q9MDtjbGFzcyB0NHQgZXh0ZW5kcyBlNXR7Y29uc3RydWN0b3IoKXtzdXBlcigpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJpZCIse3ZhbHVlOlEzdCsrfSksdGhpcy51dWlkPWE1dCgpLHRoaXMubmFtZT0iIix0aGlzLnR5cGU9Ik1hdGVyaWFsIix0aGlzLmZvZz0hMCx0aGlzLmJsZW5kaW5nPTEsdGhpcy5zaWRlPTAsdGhpcy52ZXJ0ZXhDb2xvcnM9ITEsdGhpcy5vcGFjaXR5PTEsdGhpcy50cmFuc3BhcmVudD0hMSx0aGlzLmJsZW5kU3JjPTIwNCx0aGlzLmJsZW5kRHN0PTIwNSx0aGlzLmJsZW5kRXF1YXRpb249UTB0LHRoaXMuYmxlbmRTcmNBbHBoYT1udWxsLHRoaXMuYmxlbmREc3RBbHBoYT1udWxsLHRoaXMuYmxlbmRFcXVhdGlvbkFscGhhPW51bGwsdGhpcy5kZXB0aEZ1bmM9Myx0aGlzLmRlcHRoVGVzdD0hMCx0aGlzLmRlcHRoV3JpdGU9ITAsdGhpcy5zdGVuY2lsV3JpdGVNYXNrPTI1NSx0aGlzLnN0ZW5jaWxGdW5jPTUxOSx0aGlzLnN0ZW5jaWxSZWY9MCx0aGlzLnN0ZW5jaWxGdW5jTWFzaz0yNTUsdGhpcy5zdGVuY2lsRmFpbD1aMnQsdGhpcy5zdGVuY2lsWkZhaWw9WjJ0LHRoaXMuc3RlbmNpbFpQYXNzPVoydCx0aGlzLnN0ZW5jaWxXcml0ZT0hMSx0aGlzLmNsaXBwaW5nUGxhbmVzPW51bGwsdGhpcy5jbGlwSW50ZXJzZWN0aW9uPSExLHRoaXMuY2xpcFNoYWRvd3M9ITEsdGhpcy5zaGFkb3dTaWRlPW51bGwsdGhpcy5jb2xvcldyaXRlPSEwLHRoaXMucHJlY2lzaW9uPW51bGwsdGhpcy5wb2x5Z29uT2Zmc2V0PSExLHRoaXMucG9seWdvbk9mZnNldEZhY3Rvcj0wLHRoaXMucG9seWdvbk9mZnNldFVuaXRzPTAsdGhpcy5kaXRoZXJpbmc9ITEsdGhpcy5hbHBoYVRlc3Q9MCx0aGlzLmFscGhhVG9Db3ZlcmFnZT0hMSx0aGlzLnByZW11bHRpcGxpZWRBbHBoYT0hMSx0aGlzLnZpc2libGU9ITAsdGhpcy50b25lTWFwcGVkPSEwLHRoaXMudXNlckRhdGE9e30sdGhpcy52ZXJzaW9uPTB9b25CdWlsZCgpe31vbkJlZm9yZUNvbXBpbGUoKXt9Y3VzdG9tUHJvZ3JhbUNhY2hlS2V5KCl7cmV0dXJuIHRoaXMub25CZWZvcmVDb21waWxlLnRvU3RyaW5nKCl9c2V0VmFsdWVzKHQpe2lmKHZvaWQgMCE9PXQpZm9yKGNvbnN0IGUgaW4gdCl7Y29uc3Qgbj10W2VdO2lmKHZvaWQgMD09PW4pe2NvbnNvbGUud2FybigiVEhSRUUuTWF0ZXJpYWw6ICciK2UrIicgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZC4iKTtjb250aW51ZX1pZigic2hhZGluZyI9PT1lKXtjb25zb2xlLndhcm4oIlRIUkVFLiIrdGhpcy50eXBlKyI6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4iKSx0aGlzLmZsYXRTaGFkaW5nPTE9PT1uO2NvbnRpbnVlfWNvbnN0IGk9dGhpc1tlXTt2b2lkIDAhPT1pP2kmJmkuaXNDb2xvcj9pLnNldChuKTppJiZpLmlzVmVjdG9yMyYmbiYmbi5pc1ZlY3RvcjM/aS5jb3B5KG4pOnRoaXNbZV09bjpjb25zb2xlLndhcm4oIlRIUkVFLiIrdGhpcy50eXBlKyI6ICciK2UrIicgaXMgbm90IGEgcHJvcGVydHkgb2YgdGhpcyBtYXRlcmlhbC4iKX19dG9KU09OKHQpe2NvbnN0IGU9dm9pZCAwPT09dHx8InN0cmluZyI9PXR5cGVvZiB0O2UmJih0PXt0ZXh0dXJlczp7fSxpbWFnZXM6e319KTtjb25zdCBuPXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiTWF0ZXJpYWwiLGdlbmVyYXRvcjoiTWF0ZXJpYWwudG9KU09OIn19O2Z1bmN0aW9uIGkodCl7Y29uc3QgZT1bXTtmb3IoY29uc3QgbiBpbiB0KXtjb25zdCBpPXRbbl07ZGVsZXRlIGkubWV0YWRhdGEsZS5wdXNoKGkpfXJldHVybiBlfWlmKG4udXVpZD10aGlzLnV1aWQsbi50eXBlPXRoaXMudHlwZSwiIiE9PXRoaXMubmFtZSYmKG4ubmFtZT10aGlzLm5hbWUpLHRoaXMuY29sb3ImJnRoaXMuY29sb3IuaXNDb2xvciYmKG4uY29sb3I9dGhpcy5jb2xvci5nZXRIZXgoKSksdm9pZCAwIT09dGhpcy5yb3VnaG5lc3MmJihuLnJvdWdobmVzcz10aGlzLnJvdWdobmVzcyksdm9pZCAwIT09dGhpcy5tZXRhbG5lc3MmJihuLm1ldGFsbmVzcz10aGlzLm1ldGFsbmVzcyksdGhpcy5zaGVlbiYmdGhpcy5zaGVlbi5pc0NvbG9yJiYobi5zaGVlbj10aGlzLnNoZWVuLmdldEhleCgpKSx0aGlzLmVtaXNzaXZlJiZ0aGlzLmVtaXNzaXZlLmlzQ29sb3ImJihuLmVtaXNzaXZlPXRoaXMuZW1pc3NpdmUuZ2V0SGV4KCkpLHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkmJjEhPT10aGlzLmVtaXNzaXZlSW50ZW5zaXR5JiYobi5lbWlzc2l2ZUludGVuc2l0eT10aGlzLmVtaXNzaXZlSW50ZW5zaXR5KSx0aGlzLnNwZWN1bGFyJiZ0aGlzLnNwZWN1bGFyLmlzQ29sb3ImJihuLnNwZWN1bGFyPXRoaXMuc3BlY3VsYXIuZ2V0SGV4KCkpLHZvaWQgMCE9PXRoaXMuc3BlY3VsYXJJbnRlbnNpdHkmJihuLnNwZWN1bGFySW50ZW5zaXR5PXRoaXMuc3BlY3VsYXJJbnRlbnNpdHkpLHRoaXMuc3BlY3VsYXJUaW50JiZ0aGlzLnNwZWN1bGFyVGludC5pc0NvbG9yJiYobi5zcGVjdWxhclRpbnQ9dGhpcy5zcGVjdWxhclRpbnQuZ2V0SGV4KCkpLHZvaWQgMCE9PXRoaXMuc2hpbmluZXNzJiYobi5zaGluaW5lc3M9dGhpcy5zaGluaW5lc3MpLHZvaWQgMCE9PXRoaXMuY2xlYXJjb2F0JiYobi5jbGVhcmNvYXQ9dGhpcy5jbGVhcmNvYXQpLHZvaWQgMCE9PXRoaXMuY2xlYXJjb2F0Um91Z2huZXNzJiYobi5jbGVhcmNvYXRSb3VnaG5lc3M9dGhpcy5jbGVhcmNvYXRSb3VnaG5lc3MpLHRoaXMuY2xlYXJjb2F0TWFwJiZ0aGlzLmNsZWFyY29hdE1hcC5pc1RleHR1cmUmJihuLmNsZWFyY29hdE1hcD10aGlzLmNsZWFyY29hdE1hcC50b0pTT04odCkudXVpZCksdGhpcy5jbGVhcmNvYXRSb3VnaG5lc3NNYXAmJnRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwLmlzVGV4dHVyZSYmKG4uY2xlYXJjb2F0Um91Z2huZXNzTWFwPXRoaXMuY2xlYXJjb2F0Um91Z2huZXNzTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmNsZWFyY29hdE5vcm1hbE1hcCYmdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAuaXNUZXh0dXJlJiYobi5jbGVhcmNvYXROb3JtYWxNYXA9dGhpcy5jbGVhcmNvYXROb3JtYWxNYXAudG9KU09OKHQpLnV1aWQsbi5jbGVhcmNvYXROb3JtYWxTY2FsZT10aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlLnRvQXJyYXkoKSksdGhpcy5tYXAmJnRoaXMubWFwLmlzVGV4dHVyZSYmKG4ubWFwPXRoaXMubWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLm1hdGNhcCYmdGhpcy5tYXRjYXAuaXNUZXh0dXJlJiYobi5tYXRjYXA9dGhpcy5tYXRjYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuYWxwaGFNYXAmJnRoaXMuYWxwaGFNYXAuaXNUZXh0dXJlJiYobi5hbHBoYU1hcD10aGlzLmFscGhhTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmxpZ2h0TWFwJiZ0aGlzLmxpZ2h0TWFwLmlzVGV4dHVyZSYmKG4ubGlnaHRNYXA9dGhpcy5saWdodE1hcC50b0pTT04odCkudXVpZCxuLmxpZ2h0TWFwSW50ZW5zaXR5PXRoaXMubGlnaHRNYXBJbnRlbnNpdHkpLHRoaXMuYW9NYXAmJnRoaXMuYW9NYXAuaXNUZXh0dXJlJiYobi5hb01hcD10aGlzLmFvTWFwLnRvSlNPTih0KS51dWlkLG4uYW9NYXBJbnRlbnNpdHk9dGhpcy5hb01hcEludGVuc2l0eSksdGhpcy5idW1wTWFwJiZ0aGlzLmJ1bXBNYXAuaXNUZXh0dXJlJiYobi5idW1wTWFwPXRoaXMuYnVtcE1hcC50b0pTT04odCkudXVpZCxuLmJ1bXBTY2FsZT10aGlzLmJ1bXBTY2FsZSksdGhpcy5ub3JtYWxNYXAmJnRoaXMubm9ybWFsTWFwLmlzVGV4dHVyZSYmKG4ubm9ybWFsTWFwPXRoaXMubm9ybWFsTWFwLnRvSlNPTih0KS51dWlkLG4ubm9ybWFsTWFwVHlwZT10aGlzLm5vcm1hbE1hcFR5cGUsbi5ub3JtYWxTY2FsZT10aGlzLm5vcm1hbFNjYWxlLnRvQXJyYXkoKSksdGhpcy5kaXNwbGFjZW1lbnRNYXAmJnRoaXMuZGlzcGxhY2VtZW50TWFwLmlzVGV4dHVyZSYmKG4uZGlzcGxhY2VtZW50TWFwPXRoaXMuZGlzcGxhY2VtZW50TWFwLnRvSlNPTih0KS51dWlkLG4uZGlzcGxhY2VtZW50U2NhbGU9dGhpcy5kaXNwbGFjZW1lbnRTY2FsZSxuLmRpc3BsYWNlbWVudEJpYXM9dGhpcy5kaXNwbGFjZW1lbnRCaWFzKSx0aGlzLnJvdWdobmVzc01hcCYmdGhpcy5yb3VnaG5lc3NNYXAuaXNUZXh0dXJlJiYobi5yb3VnaG5lc3NNYXA9dGhpcy5yb3VnaG5lc3NNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMubWV0YWxuZXNzTWFwJiZ0aGlzLm1ldGFsbmVzc01hcC5pc1RleHR1cmUmJihuLm1ldGFsbmVzc01hcD10aGlzLm1ldGFsbmVzc01hcC50b0pTT04odCkudXVpZCksdGhpcy5lbWlzc2l2ZU1hcCYmdGhpcy5lbWlzc2l2ZU1hcC5pc1RleHR1cmUmJihuLmVtaXNzaXZlTWFwPXRoaXMuZW1pc3NpdmVNYXAudG9KU09OKHQpLnV1aWQpLHRoaXMuc3BlY3VsYXJNYXAmJnRoaXMuc3BlY3VsYXJNYXAuaXNUZXh0dXJlJiYobi5zcGVjdWxhck1hcD10aGlzLnNwZWN1bGFyTWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwJiZ0aGlzLnNwZWN1bGFySW50ZW5zaXR5TWFwLmlzVGV4dHVyZSYmKG4uc3BlY3VsYXJJbnRlbnNpdHlNYXA9dGhpcy5zcGVjdWxhckludGVuc2l0eU1hcC50b0pTT04odCkudXVpZCksdGhpcy5zcGVjdWxhclRpbnRNYXAmJnRoaXMuc3BlY3VsYXJUaW50TWFwLmlzVGV4dHVyZSYmKG4uc3BlY3VsYXJUaW50TWFwPXRoaXMuc3BlY3VsYXJUaW50TWFwLnRvSlNPTih0KS51dWlkKSx0aGlzLmVudk1hcCYmdGhpcy5lbnZNYXAuaXNUZXh0dXJlJiYobi5lbnZNYXA9dGhpcy5lbnZNYXAudG9KU09OKHQpLnV1aWQsdm9pZCAwIT09dGhpcy5jb21iaW5lJiYobi5jb21iaW5lPXRoaXMuY29tYmluZSkpLHZvaWQgMCE9PXRoaXMuZW52TWFwSW50ZW5zaXR5JiYobi5lbnZNYXBJbnRlbnNpdHk9dGhpcy5lbnZNYXBJbnRlbnNpdHkpLHZvaWQgMCE9PXRoaXMucmVmbGVjdGl2aXR5JiYobi5yZWZsZWN0aXZpdHk9dGhpcy5yZWZsZWN0aXZpdHkpLHZvaWQgMCE9PXRoaXMucmVmcmFjdGlvblJhdGlvJiYobi5yZWZyYWN0aW9uUmF0aW89dGhpcy5yZWZyYWN0aW9uUmF0aW8pLHRoaXMuZ3JhZGllbnRNYXAmJnRoaXMuZ3JhZGllbnRNYXAuaXNUZXh0dXJlJiYobi5ncmFkaWVudE1hcD10aGlzLmdyYWRpZW50TWFwLnRvSlNPTih0KS51dWlkKSx2b2lkIDAhPT10aGlzLnRyYW5zbWlzc2lvbiYmKG4udHJhbnNtaXNzaW9uPXRoaXMudHJhbnNtaXNzaW9uKSx0aGlzLnRyYW5zbWlzc2lvbk1hcCYmdGhpcy50cmFuc21pc3Npb25NYXAuaXNUZXh0dXJlJiYobi50cmFuc21pc3Npb25NYXA9dGhpcy50cmFuc21pc3Npb25NYXAudG9KU09OKHQpLnV1aWQpLHZvaWQgMCE9PXRoaXMudGhpY2tuZXNzJiYobi50aGlja25lc3M9dGhpcy50aGlja25lc3MpLHRoaXMudGhpY2tuZXNzTWFwJiZ0aGlzLnRoaWNrbmVzc01hcC5pc1RleHR1cmUmJihuLnRoaWNrbmVzc01hcD10aGlzLnRoaWNrbmVzc01hcC50b0pTT04odCkudXVpZCksdm9pZCAwIT09dGhpcy5hdHRlbnVhdGlvbkRpc3RhbmNlJiYobi5hdHRlbnVhdGlvbkRpc3RhbmNlPXRoaXMuYXR0ZW51YXRpb25EaXN0YW5jZSksdm9pZCAwIT09dGhpcy5hdHRlbnVhdGlvblRpbnQmJihuLmF0dGVudWF0aW9uVGludD10aGlzLmF0dGVudWF0aW9uVGludC5nZXRIZXgoKSksdm9pZCAwIT09dGhpcy5zaXplJiYobi5zaXplPXRoaXMuc2l6ZSksbnVsbCE9PXRoaXMuc2hhZG93U2lkZSYmKG4uc2hhZG93U2lkZT10aGlzLnNoYWRvd1NpZGUpLHZvaWQgMCE9PXRoaXMuc2l6ZUF0dGVudWF0aW9uJiYobi5zaXplQXR0ZW51YXRpb249dGhpcy5zaXplQXR0ZW51YXRpb24pLDEhPT10aGlzLmJsZW5kaW5nJiYobi5ibGVuZGluZz10aGlzLmJsZW5kaW5nKSwwIT09dGhpcy5zaWRlJiYobi5zaWRlPXRoaXMuc2lkZSksdGhpcy52ZXJ0ZXhDb2xvcnMmJihuLnZlcnRleENvbG9ycz0hMCksdGhpcy5vcGFjaXR5PDEmJihuLm9wYWNpdHk9dGhpcy5vcGFjaXR5KSwhMD09PXRoaXMudHJhbnNwYXJlbnQmJihuLnRyYW5zcGFyZW50PXRoaXMudHJhbnNwYXJlbnQpLG4uZGVwdGhGdW5jPXRoaXMuZGVwdGhGdW5jLG4uZGVwdGhUZXN0PXRoaXMuZGVwdGhUZXN0LG4uZGVwdGhXcml0ZT10aGlzLmRlcHRoV3JpdGUsbi5jb2xvcldyaXRlPXRoaXMuY29sb3JXcml0ZSxuLnN0ZW5jaWxXcml0ZT10aGlzLnN0ZW5jaWxXcml0ZSxuLnN0ZW5jaWxXcml0ZU1hc2s9dGhpcy5zdGVuY2lsV3JpdGVNYXNrLG4uc3RlbmNpbEZ1bmM9dGhpcy5zdGVuY2lsRnVuYyxuLnN0ZW5jaWxSZWY9dGhpcy5zdGVuY2lsUmVmLG4uc3RlbmNpbEZ1bmNNYXNrPXRoaXMuc3RlbmNpbEZ1bmNNYXNrLG4uc3RlbmNpbEZhaWw9dGhpcy5zdGVuY2lsRmFpbCxuLnN0ZW5jaWxaRmFpbD10aGlzLnN0ZW5jaWxaRmFpbCxuLnN0ZW5jaWxaUGFzcz10aGlzLnN0ZW5jaWxaUGFzcyx0aGlzLnJvdGF0aW9uJiYwIT09dGhpcy5yb3RhdGlvbiYmKG4ucm90YXRpb249dGhpcy5yb3RhdGlvbiksITA9PT10aGlzLnBvbHlnb25PZmZzZXQmJihuLnBvbHlnb25PZmZzZXQ9ITApLDAhPT10aGlzLnBvbHlnb25PZmZzZXRGYWN0b3ImJihuLnBvbHlnb25PZmZzZXRGYWN0b3I9dGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yKSwwIT09dGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHMmJihuLnBvbHlnb25PZmZzZXRVbml0cz10aGlzLnBvbHlnb25PZmZzZXRVbml0cyksdGhpcy5saW5ld2lkdGgmJjEhPT10aGlzLmxpbmV3aWR0aCYmKG4ubGluZXdpZHRoPXRoaXMubGluZXdpZHRoKSx2b2lkIDAhPT10aGlzLmRhc2hTaXplJiYobi5kYXNoU2l6ZT10aGlzLmRhc2hTaXplKSx2b2lkIDAhPT10aGlzLmdhcFNpemUmJihuLmdhcFNpemU9dGhpcy5nYXBTaXplKSx2b2lkIDAhPT10aGlzLnNjYWxlJiYobi5zY2FsZT10aGlzLnNjYWxlKSwhMD09PXRoaXMuZGl0aGVyaW5nJiYobi5kaXRoZXJpbmc9ITApLHRoaXMuYWxwaGFUZXN0PjAmJihuLmFscGhhVGVzdD10aGlzLmFscGhhVGVzdCksITA9PT10aGlzLmFscGhhVG9Db3ZlcmFnZSYmKG4uYWxwaGFUb0NvdmVyYWdlPXRoaXMuYWxwaGFUb0NvdmVyYWdlKSwhMD09PXRoaXMucHJlbXVsdGlwbGllZEFscGhhJiYobi5wcmVtdWx0aXBsaWVkQWxwaGE9dGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEpLCEwPT09dGhpcy53aXJlZnJhbWUmJihuLndpcmVmcmFtZT10aGlzLndpcmVmcmFtZSksdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg+MSYmKG4ud2lyZWZyYW1lTGluZXdpZHRoPXRoaXMud2lyZWZyYW1lTGluZXdpZHRoKSwicm91bmQiIT09dGhpcy53aXJlZnJhbWVMaW5lY2FwJiYobi53aXJlZnJhbWVMaW5lY2FwPXRoaXMud2lyZWZyYW1lTGluZWNhcCksInJvdW5kIiE9PXRoaXMud2lyZWZyYW1lTGluZWpvaW4mJihuLndpcmVmcmFtZUxpbmVqb2luPXRoaXMud2lyZWZyYW1lTGluZWpvaW4pLCEwPT09dGhpcy5mbGF0U2hhZGluZyYmKG4uZmxhdFNoYWRpbmc9dGhpcy5mbGF0U2hhZGluZyksITE9PT10aGlzLnZpc2libGUmJihuLnZpc2libGU9ITEpLCExPT09dGhpcy50b25lTWFwcGVkJiYobi50b25lTWFwcGVkPSExKSwie30iIT09SlNPTi5zdHJpbmdpZnkodGhpcy51c2VyRGF0YSkmJihuLnVzZXJEYXRhPXRoaXMudXNlckRhdGEpLGUpe2NvbnN0IGU9aSh0LnRleHR1cmVzKSxyPWkodC5pbWFnZXMpO2UubGVuZ3RoPjAmJihuLnRleHR1cmVzPWUpLHIubGVuZ3RoPjAmJihuLmltYWdlcz1yKX1yZXR1cm4gbn1jbG9uZSgpe3JldHVybihuZXcgdGhpcy5jb25zdHJ1Y3RvcikuY29weSh0aGlzKX1jb3B5KHQpe3RoaXMubmFtZT10Lm5hbWUsdGhpcy5mb2c9dC5mb2csdGhpcy5ibGVuZGluZz10LmJsZW5kaW5nLHRoaXMuc2lkZT10LnNpZGUsdGhpcy52ZXJ0ZXhDb2xvcnM9dC52ZXJ0ZXhDb2xvcnMsdGhpcy5vcGFjaXR5PXQub3BhY2l0eSx0aGlzLnRyYW5zcGFyZW50PXQudHJhbnNwYXJlbnQsdGhpcy5ibGVuZFNyYz10LmJsZW5kU3JjLHRoaXMuYmxlbmREc3Q9dC5ibGVuZERzdCx0aGlzLmJsZW5kRXF1YXRpb249dC5ibGVuZEVxdWF0aW9uLHRoaXMuYmxlbmRTcmNBbHBoYT10LmJsZW5kU3JjQWxwaGEsdGhpcy5ibGVuZERzdEFscGhhPXQuYmxlbmREc3RBbHBoYSx0aGlzLmJsZW5kRXF1YXRpb25BbHBoYT10LmJsZW5kRXF1YXRpb25BbHBoYSx0aGlzLmRlcHRoRnVuYz10LmRlcHRoRnVuYyx0aGlzLmRlcHRoVGVzdD10LmRlcHRoVGVzdCx0aGlzLmRlcHRoV3JpdGU9dC5kZXB0aFdyaXRlLHRoaXMuc3RlbmNpbFdyaXRlTWFzaz10LnN0ZW5jaWxXcml0ZU1hc2ssdGhpcy5zdGVuY2lsRnVuYz10LnN0ZW5jaWxGdW5jLHRoaXMuc3RlbmNpbFJlZj10LnN0ZW5jaWxSZWYsdGhpcy5zdGVuY2lsRnVuY01hc2s9dC5zdGVuY2lsRnVuY01hc2ssdGhpcy5zdGVuY2lsRmFpbD10LnN0ZW5jaWxGYWlsLHRoaXMuc3RlbmNpbFpGYWlsPXQuc3RlbmNpbFpGYWlsLHRoaXMuc3RlbmNpbFpQYXNzPXQuc3RlbmNpbFpQYXNzLHRoaXMuc3RlbmNpbFdyaXRlPXQuc3RlbmNpbFdyaXRlO2NvbnN0IGU9dC5jbGlwcGluZ1BsYW5lcztsZXQgbj1udWxsO2lmKG51bGwhPT1lKXtjb25zdCB0PWUubGVuZ3RoO249bmV3IEFycmF5KHQpO2ZvcihsZXQgaT0wO2khPT10OysraSluW2ldPWVbaV0uY2xvbmUoKX1yZXR1cm4gdGhpcy5jbGlwcGluZ1BsYW5lcz1uLHRoaXMuY2xpcEludGVyc2VjdGlvbj10LmNsaXBJbnRlcnNlY3Rpb24sdGhpcy5jbGlwU2hhZG93cz10LmNsaXBTaGFkb3dzLHRoaXMuc2hhZG93U2lkZT10LnNoYWRvd1NpZGUsdGhpcy5jb2xvcldyaXRlPXQuY29sb3JXcml0ZSx0aGlzLnByZWNpc2lvbj10LnByZWNpc2lvbix0aGlzLnBvbHlnb25PZmZzZXQ9dC5wb2x5Z29uT2Zmc2V0LHRoaXMucG9seWdvbk9mZnNldEZhY3Rvcj10LnBvbHlnb25PZmZzZXRGYWN0b3IsdGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHM9dC5wb2x5Z29uT2Zmc2V0VW5pdHMsdGhpcy5kaXRoZXJpbmc9dC5kaXRoZXJpbmcsdGhpcy5hbHBoYVRlc3Q9dC5hbHBoYVRlc3QsdGhpcy5hbHBoYVRvQ292ZXJhZ2U9dC5hbHBoYVRvQ292ZXJhZ2UsdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGE9dC5wcmVtdWx0aXBsaWVkQWxwaGEsdGhpcy52aXNpYmxlPXQudmlzaWJsZSx0aGlzLnRvbmVNYXBwZWQ9dC50b25lTWFwcGVkLHRoaXMudXNlckRhdGE9SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0LnVzZXJEYXRhKSksdGhpc31kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfXNldCBuZWVkc1VwZGF0ZSh0KXshMD09PXQmJnRoaXMudmVyc2lvbisrfX10NHQucHJvdG90eXBlLmlzTWF0ZXJpYWw9ITA7Y29uc3QgZTR0PXthbGljZWJsdWU6MTU3OTIzODMsYW50aXF1ZXdoaXRlOjE2NDQ0Mzc1LGFxdWE6NjU1MzUsYXF1YW1hcmluZTo4Mzg4NTY0LGF6dXJlOjE1Nzk0MTc1LGJlaWdlOjE2MTE5MjYwLGJpc3F1ZToxNjc3MDI0NCxibGFjazowLGJsYW5jaGVkYWxtb25kOjE2NzcyMDQ1LGJsdWU6MjU1LGJsdWV2aW9sZXQ6OTA1NTIwMixicm93bjoxMDgyNDIzNCxidXJseXdvb2Q6MTQ1OTYyMzEsY2FkZXRibHVlOjYyNjY1MjgsY2hhcnRyZXVzZTo4Mzg4MzUyLGNob2NvbGF0ZToxMzc4OTQ3MCxjb3JhbDoxNjc0NDI3Mixjb3JuZmxvd2VyYmx1ZTo2NTkxOTgxLGNvcm5zaWxrOjE2Nzc1Mzg4LGNyaW1zb246MTQ0MjMxMDAsY3lhbjo2NTUzNSxkYXJrYmx1ZToxMzksZGFya2N5YW46MzU3MjMsZGFya2dvbGRlbnJvZDoxMjA5MjkzOSxkYXJrZ3JheToxMTExOTAxNyxkYXJrZ3JlZW46MjU2MDAsZGFya2dyZXk6MTExMTkwMTcsZGFya2toYWtpOjEyNDMzMjU5LGRhcmttYWdlbnRhOjkxMDk2NDMsZGFya29saXZlZ3JlZW46NTU5Nzk5OSxkYXJrb3JhbmdlOjE2NzQ3NTIwLGRhcmtvcmNoaWQ6MTAwNDAwMTIsZGFya3JlZDo5MTA5NTA0LGRhcmtzYWxtb246MTUzMDg0MTAsZGFya3NlYWdyZWVuOjk0MTk5MTksZGFya3NsYXRlYmx1ZTo0NzM0MzQ3LGRhcmtzbGF0ZWdyYXk6MzEwMDQ5NSxkYXJrc2xhdGVncmV5OjMxMDA0OTUsZGFya3R1cnF1b2lzZTo1Mjk0NSxkYXJrdmlvbGV0Ojk2OTk1MzksZGVlcHBpbms6MTY3MTY5NDcsZGVlcHNreWJsdWU6NDkxNTEsZGltZ3JheTo2OTA4MjY1LGRpbWdyZXk6NjkwODI2NSxkb2RnZXJibHVlOjIwMDMxOTksZmlyZWJyaWNrOjExNjc0MTQ2LGZsb3JhbHdoaXRlOjE2Nzc1OTIwLGZvcmVzdGdyZWVuOjIyNjM4NDIsZnVjaHNpYToxNjcxMTkzNSxnYWluc2Jvcm86MTQ0NzQ0NjAsZ2hvc3R3aGl0ZToxNjMxNjY3MSxnb2xkOjE2NzY2NzIwLGdvbGRlbnJvZDoxNDMyOTEyMCxncmF5Ojg0MjE1MDQsZ3JlZW46MzI3NjgsZ3JlZW55ZWxsb3c6MTE0MDMwNTUsZ3JleTo4NDIxNTA0LGhvbmV5ZGV3OjE1Nzk0MTYwLGhvdHBpbms6MTY3Mzg3NDAsaW5kaWFucmVkOjEzNDU4NTI0LGluZGlnbzo0OTE1MzMwLGl2b3J5OjE2Nzc3MjAwLGtoYWtpOjE1Nzg3NjYwLGxhdmVuZGVyOjE1MTMyNDEwLGxhdmVuZGVyYmx1c2g6MTY3NzMzNjUsbGF3bmdyZWVuOjgxOTA5NzYsbGVtb25jaGlmZm9uOjE2Nzc1ODg1LGxpZ2h0Ymx1ZToxMTM5MzI1NCxsaWdodGNvcmFsOjE1NzYxNTM2LGxpZ2h0Y3lhbjoxNDc0NTU5OSxsaWdodGdvbGRlbnJvZHllbGxvdzoxNjQ0ODIxMCxsaWdodGdyYXk6MTM4ODIzMjMsbGlnaHRncmVlbjo5NDk4MjU2LGxpZ2h0Z3JleToxMzg4MjMyMyxsaWdodHBpbms6MTY3NTg0NjUsbGlnaHRzYWxtb246MTY3NTI3NjIsbGlnaHRzZWFncmVlbjoyMTQyODkwLGxpZ2h0c2t5Ymx1ZTo4OTAwMzQ2LGxpZ2h0c2xhdGVncmF5Ojc4MzM3NTMsbGlnaHRzbGF0ZWdyZXk6NzgzMzc1MyxsaWdodHN0ZWVsYmx1ZToxMTU4NDczNCxsaWdodHllbGxvdzoxNjc3NzE4NCxsaW1lOjY1MjgwLGxpbWVncmVlbjozMzI5MzMwLGxpbmVuOjE2NDQ1NjcwLG1hZ2VudGE6MTY3MTE5MzUsbWFyb29uOjgzODg2MDgsbWVkaXVtYXF1YW1hcmluZTo2NzM3MzIyLG1lZGl1bWJsdWU6MjA1LG1lZGl1bW9yY2hpZDoxMjIxMTY2NyxtZWRpdW1wdXJwbGU6OTY2MjY4MyxtZWRpdW1zZWFncmVlbjozOTc4MDk3LG1lZGl1bXNsYXRlYmx1ZTo4MDg3NzkwLG1lZGl1bXNwcmluZ2dyZWVuOjY0MTU0LG1lZGl1bXR1cnF1b2lzZTo0NzcyMzAwLG1lZGl1bXZpb2xldHJlZDoxMzA0NzE3MyxtaWRuaWdodGJsdWU6MTY0NDkxMixtaW50Y3JlYW06MTYxMjE4NTAsbWlzdHlyb3NlOjE2NzcwMjczLG1vY2Nhc2luOjE2NzcwMjI5LG5hdmFqb3doaXRlOjE2NzY4Njg1LG5hdnk6MTI4LG9sZGxhY2U6MTY2NDM1NTgsb2xpdmU6ODQyMTM3NixvbGl2ZWRyYWI6NzA0ODczOSxvcmFuZ2U6MTY3NTM5MjAsb3JhbmdlcmVkOjE2NzI5MzQ0LG9yY2hpZDoxNDMxNTczNCxwYWxlZ29sZGVucm9kOjE1NjU3MTMwLHBhbGVncmVlbjoxMDAyNTg4MCxwYWxldHVycXVvaXNlOjExNTI5OTY2LHBhbGV2aW9sZXRyZWQ6MTQzODEyMDMscGFwYXlhd2hpcDoxNjc3MzA3NyxwZWFjaHB1ZmY6MTY3Njc2NzMscGVydToxMzQ2ODk5MSxwaW5rOjE2NzYxMDM1LHBsdW06MTQ1MjQ2MzcscG93ZGVyYmx1ZToxMTU5MTkxMCxwdXJwbGU6ODM4ODczNixyZWJlY2NhcHVycGxlOjY2OTc4ODEscmVkOjE2NzExNjgwLHJvc3licm93bjoxMjM1NzUxOSxyb3lhbGJsdWU6NDI4Njk0NSxzYWRkbGVicm93bjo5MTI3MTg3LHNhbG1vbjoxNjQxNjg4MixzYW5keWJyb3duOjE2MDMyODY0LHNlYWdyZWVuOjMwNTAzMjcsc2Vhc2hlbGw6MTY3NzQ2Mzgsc2llbm5hOjEwNTA2Nzk3LHNpbHZlcjoxMjYzMjI1Nixza3libHVlOjg5MDAzMzEsc2xhdGVibHVlOjY5NzAwNjEsc2xhdGVncmF5OjczNzI5NDQsc2xhdGVncmV5OjczNzI5NDQsc25vdzoxNjc3NTkzMCxzcHJpbmdncmVlbjo2NTQwNyxzdGVlbGJsdWU6NDYyMDk4MCx0YW46MTM4MDg3ODAsdGVhbDozMjg5Nix0aGlzdGxlOjE0MjA0ODg4LHRvbWF0bzoxNjczNzA5NSx0dXJxdW9pc2U6NDI1MTg1Nix2aW9sZXQ6MTU2MzEwODYsd2hlYXQ6MTYxMTMzMzEsd2hpdGU6MTY3NzcyMTUsd2hpdGVzbW9rZToxNjExOTI4NSx5ZWxsb3c6MTY3NzY5NjAseWVsbG93Z3JlZW46MTAxNDUwNzR9LG40dD17aDowLHM6MCxsOjB9LGk0dD17aDowLHM6MCxsOjB9O2Z1bmN0aW9uIHI0dCh0LGUsbil7cmV0dXJuIG48MCYmKG4rPTEpLG4+MSYmKG4tPTEpLG48MS82P3QrNiooZS10KSpuOm48LjU/ZTpuPDIvMz90KzYqKGUtdCkqKDIvMy1uKTp0fWZ1bmN0aW9uIG80dCh0KXtyZXR1cm4gdDwuMDQwNDU/LjA3NzM5OTM4MDgqdDpNYXRoLnBvdyguOTQ3ODY3Mjk4Nip0Ky4wNTIxMzI3MDE0LDIuNCl9ZnVuY3Rpb24gYTR0KHQpe3JldHVybiB0PC4wMDMxMzA4PzEyLjkyKnQ6MS4wNTUqTWF0aC5wb3codCwuNDE2NjYpLS4wNTV9Y2xhc3MgczR0e2NvbnN0cnVjdG9yKHQsZSxuKXtyZXR1cm4gdm9pZCAwPT09ZSYmdm9pZCAwPT09bj90aGlzLnNldCh0KTp0aGlzLnNldFJHQih0LGUsbil9c2V0KHQpe3JldHVybiB0JiZ0LmlzQ29sb3I/dGhpcy5jb3B5KHQpOiJudW1iZXIiPT10eXBlb2YgdD90aGlzLnNldEhleCh0KToic3RyaW5nIj09dHlwZW9mIHQmJnRoaXMuc2V0U3R5bGUodCksdGhpc31zZXRTY2FsYXIodCl7cmV0dXJuIHRoaXMucj10LHRoaXMuZz10LHRoaXMuYj10LHRoaXN9c2V0SGV4KHQpe3JldHVybiB0PU1hdGguZmxvb3IodCksdGhpcy5yPSh0Pj4xNiYyNTUpLzI1NSx0aGlzLmc9KHQ+PjgmMjU1KS8yNTUsdGhpcy5iPSgyNTUmdCkvMjU1LHRoaXN9c2V0UkdCKHQsZSxuKXtyZXR1cm4gdGhpcy5yPXQsdGhpcy5nPWUsdGhpcy5iPW4sdGhpc31zZXRIU0wodCxlLG4pe2lmKHQ9bDV0KHQsMSksZT1zNXQoZSwwLDEpLG49czV0KG4sMCwxKSwwPT09ZSl0aGlzLnI9dGhpcy5nPXRoaXMuYj1uO2Vsc2V7Y29uc3QgaT1uPD0uNT9uKigxK2UpOm4rZS1uKmUscj0yKm4taTt0aGlzLnI9cjR0KHIsaSx0KzEvMyksdGhpcy5nPXI0dChyLGksdCksdGhpcy5iPXI0dChyLGksdC0xLzMpfXJldHVybiB0aGlzfXNldFN0eWxlKHQpe2Z1bmN0aW9uIGUoZSl7dm9pZCAwIT09ZSYmcGFyc2VGbG9hdChlKTwxJiZjb25zb2xlLndhcm4oIlRIUkVFLkNvbG9yOiBBbHBoYSBjb21wb25lbnQgb2YgIit0KyIgd2lsbCBiZSBpZ25vcmVkLiIpfWxldCBuO2lmKG49L14oKD86cmdifGhzbClhPylcKChbXlwpXSopXCkvLmV4ZWModCkpe2xldCB0O2NvbnN0IGk9blsyXTtzd2l0Y2goblsxXSl7Y2FzZSJyZ2IiOmNhc2UicmdiYSI6aWYodD0vXlxzKihcZCspXHMqLFxzKihcZCspXHMqLFxzKihcZCspXHMqKD86LFxzKihcZCpcLj9cZCspXHMqKT8kLy5leGVjKGkpKXJldHVybiB0aGlzLnI9TWF0aC5taW4oMjU1LHBhcnNlSW50KHRbMV0sMTApKS8yNTUsdGhpcy5nPU1hdGgubWluKDI1NSxwYXJzZUludCh0WzJdLDEwKSkvMjU1LHRoaXMuYj1NYXRoLm1pbigyNTUscGFyc2VJbnQodFszXSwxMCkpLzI1NSxlKHRbNF0pLHRoaXM7aWYodD0vXlxzKihcZCspXCVccyosXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqKD86LFxzKihcZCpcLj9cZCspXHMqKT8kLy5leGVjKGkpKXJldHVybiB0aGlzLnI9TWF0aC5taW4oMTAwLHBhcnNlSW50KHRbMV0sMTApKS8xMDAsdGhpcy5nPU1hdGgubWluKDEwMCxwYXJzZUludCh0WzJdLDEwKSkvMTAwLHRoaXMuYj1NYXRoLm1pbigxMDAscGFyc2VJbnQodFszXSwxMCkpLzEwMCxlKHRbNF0pLHRoaXM7YnJlYWs7Y2FzZSJoc2wiOmNhc2UiaHNsYSI6aWYodD0vXlxzKihcZCpcLj9cZCspXHMqLFxzKihcZCspXCVccyosXHMqKFxkKylcJVxzKig/OixccyooXGQqXC4/XGQrKVxzKik/JC8uZXhlYyhpKSl7Y29uc3Qgbj1wYXJzZUZsb2F0KHRbMV0pLzM2MCxpPXBhcnNlSW50KHRbMl0sMTApLzEwMCxyPXBhcnNlSW50KHRbM10sMTApLzEwMDtyZXR1cm4gZSh0WzRdKSx0aGlzLnNldEhTTChuLGkscil9fX1lbHNlIGlmKG49L15cIyhbQS1GYS1mXGRdKykkLy5leGVjKHQpKXtjb25zdCB0PW5bMV0sZT10Lmxlbmd0aDtpZigzPT09ZSlyZXR1cm4gdGhpcy5yPXBhcnNlSW50KHQuY2hhckF0KDApK3QuY2hhckF0KDApLDE2KS8yNTUsdGhpcy5nPXBhcnNlSW50KHQuY2hhckF0KDEpK3QuY2hhckF0KDEpLDE2KS8yNTUsdGhpcy5iPXBhcnNlSW50KHQuY2hhckF0KDIpK3QuY2hhckF0KDIpLDE2KS8yNTUsdGhpcztpZig2PT09ZSlyZXR1cm4gdGhpcy5yPXBhcnNlSW50KHQuY2hhckF0KDApK3QuY2hhckF0KDEpLDE2KS8yNTUsdGhpcy5nPXBhcnNlSW50KHQuY2hhckF0KDIpK3QuY2hhckF0KDMpLDE2KS8yNTUsdGhpcy5iPXBhcnNlSW50KHQuY2hhckF0KDQpK3QuY2hhckF0KDUpLDE2KS8yNTUsdGhpc31yZXR1cm4gdCYmdC5sZW5ndGg+MD90aGlzLnNldENvbG9yTmFtZSh0KTp0aGlzfXNldENvbG9yTmFtZSh0KXtjb25zdCBlPWU0dFt0LnRvTG93ZXJDYXNlKCldO3JldHVybiB2b2lkIDAhPT1lP3RoaXMuc2V0SGV4KGUpOmNvbnNvbGUud2FybigiVEhSRUUuQ29sb3I6IFVua25vd24gY29sb3IgIit0KSx0aGlzfWNsb25lKCl7cmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKHRoaXMucix0aGlzLmcsdGhpcy5iKX1jb3B5KHQpe3JldHVybiB0aGlzLnI9dC5yLHRoaXMuZz10LmcsdGhpcy5iPXQuYix0aGlzfWNvcHlHYW1tYVRvTGluZWFyKHQsZT0yKXtyZXR1cm4gdGhpcy5yPU1hdGgucG93KHQucixlKSx0aGlzLmc9TWF0aC5wb3codC5nLGUpLHRoaXMuYj1NYXRoLnBvdyh0LmIsZSksdGhpc31jb3B5TGluZWFyVG9HYW1tYSh0LGU9Mil7Y29uc3Qgbj1lPjA/MS9lOjE7cmV0dXJuIHRoaXMucj1NYXRoLnBvdyh0LnIsbiksdGhpcy5nPU1hdGgucG93KHQuZyxuKSx0aGlzLmI9TWF0aC5wb3codC5iLG4pLHRoaXN9Y29udmVydEdhbW1hVG9MaW5lYXIodCl7cmV0dXJuIHRoaXMuY29weUdhbW1hVG9MaW5lYXIodGhpcyx0KSx0aGlzfWNvbnZlcnRMaW5lYXJUb0dhbW1hKHQpe3JldHVybiB0aGlzLmNvcHlMaW5lYXJUb0dhbW1hKHRoaXMsdCksdGhpc31jb3B5U1JHQlRvTGluZWFyKHQpe3JldHVybiB0aGlzLnI9bzR0KHQuciksdGhpcy5nPW80dCh0LmcpLHRoaXMuYj1vNHQodC5iKSx0aGlzfWNvcHlMaW5lYXJUb1NSR0IodCl7cmV0dXJuIHRoaXMucj1hNHQodC5yKSx0aGlzLmc9YTR0KHQuZyksdGhpcy5iPWE0dCh0LmIpLHRoaXN9Y29udmVydFNSR0JUb0xpbmVhcigpe3JldHVybiB0aGlzLmNvcHlTUkdCVG9MaW5lYXIodGhpcyksdGhpc31jb252ZXJ0TGluZWFyVG9TUkdCKCl7cmV0dXJuIHRoaXMuY29weUxpbmVhclRvU1JHQih0aGlzKSx0aGlzfWdldEhleCgpe3JldHVybiAyNTUqdGhpcy5yPDwxNl4yNTUqdGhpcy5nPDw4XjI1NSp0aGlzLmI8PDB9Z2V0SGV4U3RyaW5nKCl7cmV0dXJuKCIwMDAwMDAiK3RoaXMuZ2V0SGV4KCkudG9TdHJpbmcoMTYpKS5zbGljZSgtNil9Z2V0SFNMKHQpe2NvbnN0IGU9dGhpcy5yLG49dGhpcy5nLGk9dGhpcy5iLHI9TWF0aC5tYXgoZSxuLGkpLG89TWF0aC5taW4oZSxuLGkpO2xldCBhLHM7Y29uc3QgbD0obytyKS8yO2lmKG89PT1yKWE9MCxzPTA7ZWxzZXtjb25zdCB0PXItbztzd2l0Y2gocz1sPD0uNT90LyhyK28pOnQvKDItci1vKSxyKXtjYXNlIGU6YT0obi1pKS90KyhuPGk/NjowKTticmVhaztjYXNlIG46YT0oaS1lKS90KzI7YnJlYWs7Y2FzZSBpOmE9KGUtbikvdCs0fWEvPTZ9cmV0dXJuIHQuaD1hLHQucz1zLHQubD1sLHR9Z2V0U3R5bGUoKXtyZXR1cm4icmdiKCIrKDI1NSp0aGlzLnJ8MCkrIiwiKygyNTUqdGhpcy5nfDApKyIsIisoMjU1KnRoaXMuYnwwKSsiKSJ9b2Zmc2V0SFNMKHQsZSxuKXtyZXR1cm4gdGhpcy5nZXRIU0wobjR0KSxuNHQuaCs9dCxuNHQucys9ZSxuNHQubCs9bix0aGlzLnNldEhTTChuNHQuaCxuNHQucyxuNHQubCksdGhpc31hZGQodCl7cmV0dXJuIHRoaXMucis9dC5yLHRoaXMuZys9dC5nLHRoaXMuYis9dC5iLHRoaXN9YWRkQ29sb3JzKHQsZSl7cmV0dXJuIHRoaXMucj10LnIrZS5yLHRoaXMuZz10LmcrZS5nLHRoaXMuYj10LmIrZS5iLHRoaXN9YWRkU2NhbGFyKHQpe3JldHVybiB0aGlzLnIrPXQsdGhpcy5nKz10LHRoaXMuYis9dCx0aGlzfXN1Yih0KXtyZXR1cm4gdGhpcy5yPU1hdGgubWF4KDAsdGhpcy5yLXQuciksdGhpcy5nPU1hdGgubWF4KDAsdGhpcy5nLXQuZyksdGhpcy5iPU1hdGgubWF4KDAsdGhpcy5iLXQuYiksdGhpc31tdWx0aXBseSh0KXtyZXR1cm4gdGhpcy5yKj10LnIsdGhpcy5nKj10LmcsdGhpcy5iKj10LmIsdGhpc31tdWx0aXBseVNjYWxhcih0KXtyZXR1cm4gdGhpcy5yKj10LHRoaXMuZyo9dCx0aGlzLmIqPXQsdGhpc31sZXJwKHQsZSl7cmV0dXJuIHRoaXMucis9KHQuci10aGlzLnIpKmUsdGhpcy5nKz0odC5nLXRoaXMuZykqZSx0aGlzLmIrPSh0LmItdGhpcy5iKSplLHRoaXN9bGVycENvbG9ycyh0LGUsbil7cmV0dXJuIHRoaXMucj10LnIrKGUuci10LnIpKm4sdGhpcy5nPXQuZysoZS5nLXQuZykqbix0aGlzLmI9dC5iKyhlLmItdC5iKSpuLHRoaXN9bGVycEhTTCh0LGUpe3RoaXMuZ2V0SFNMKG40dCksdC5nZXRIU0woaTR0KTtjb25zdCBuPWM1dChuNHQuaCxpNHQuaCxlKSxpPWM1dChuNHQucyxpNHQucyxlKSxyPWM1dChuNHQubCxpNHQubCxlKTtyZXR1cm4gdGhpcy5zZXRIU0wobixpLHIpLHRoaXN9ZXF1YWxzKHQpe3JldHVybiB0LnI9PT10aGlzLnImJnQuZz09PXRoaXMuZyYmdC5iPT09dGhpcy5ifWZyb21BcnJheSh0LGU9MCl7cmV0dXJuIHRoaXMucj10W2VdLHRoaXMuZz10W2UrMV0sdGhpcy5iPXRbZSsyXSx0aGlzfXRvQXJyYXkodD1bXSxlPTApe3JldHVybiB0W2VdPXRoaXMucix0W2UrMV09dGhpcy5nLHRbZSsyXT10aGlzLmIsdH1mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSl7cmV0dXJuIHRoaXMucj10LmdldFgoZSksdGhpcy5nPXQuZ2V0WShlKSx0aGlzLmI9dC5nZXRaKGUpLCEwPT09dC5ub3JtYWxpemVkJiYodGhpcy5yLz0yNTUsdGhpcy5nLz0yNTUsdGhpcy5iLz0yNTUpLHRoaXN9dG9KU09OKCl7cmV0dXJuIHRoaXMuZ2V0SGV4KCl9fXM0dC5OQU1FUz1lNHQsczR0LnByb3RvdHlwZS5pc0NvbG9yPSEwLHM0dC5wcm90b3R5cGUucj0xLHM0dC5wcm90b3R5cGUuZz0xLHM0dC5wcm90b3R5cGUuYj0xO2NsYXNzIGw0dCBleHRlbmRzIHQ0dHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMudHlwZT0iTWVzaEJhc2ljTWF0ZXJpYWwiLHRoaXMuY29sb3I9bmV3IHM0dCgxNjc3NzIxNSksdGhpcy5tYXA9bnVsbCx0aGlzLmxpZ2h0TWFwPW51bGwsdGhpcy5saWdodE1hcEludGVuc2l0eT0xLHRoaXMuYW9NYXA9bnVsbCx0aGlzLmFvTWFwSW50ZW5zaXR5PTEsdGhpcy5zcGVjdWxhck1hcD1udWxsLHRoaXMuYWxwaGFNYXA9bnVsbCx0aGlzLmVudk1hcD1udWxsLHRoaXMuY29tYmluZT0wLHRoaXMucmVmbGVjdGl2aXR5PTEsdGhpcy5yZWZyYWN0aW9uUmF0aW89Ljk4LHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy53aXJlZnJhbWVMaW5lY2FwPSJyb3VuZCIsdGhpcy53aXJlZnJhbWVMaW5lam9pbj0icm91bmQiLHRoaXMuc2V0VmFsdWVzKHQpfWNvcHkodCl7cmV0dXJuIHN1cGVyLmNvcHkodCksdGhpcy5jb2xvci5jb3B5KHQuY29sb3IpLHRoaXMubWFwPXQubWFwLHRoaXMubGlnaHRNYXA9dC5saWdodE1hcCx0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5PXQubGlnaHRNYXBJbnRlbnNpdHksdGhpcy5hb01hcD10LmFvTWFwLHRoaXMuYW9NYXBJbnRlbnNpdHk9dC5hb01hcEludGVuc2l0eSx0aGlzLnNwZWN1bGFyTWFwPXQuc3BlY3VsYXJNYXAsdGhpcy5hbHBoYU1hcD10LmFscGhhTWFwLHRoaXMuZW52TWFwPXQuZW52TWFwLHRoaXMuY29tYmluZT10LmNvbWJpbmUsdGhpcy5yZWZsZWN0aXZpdHk9dC5yZWZsZWN0aXZpdHksdGhpcy5yZWZyYWN0aW9uUmF0aW89dC5yZWZyYWN0aW9uUmF0aW8sdGhpcy53aXJlZnJhbWU9dC53aXJlZnJhbWUsdGhpcy53aXJlZnJhbWVMaW5ld2lkdGg9dC53aXJlZnJhbWVMaW5ld2lkdGgsdGhpcy53aXJlZnJhbWVMaW5lY2FwPXQud2lyZWZyYW1lTGluZWNhcCx0aGlzLndpcmVmcmFtZUxpbmVqb2luPXQud2lyZWZyYW1lTGluZWpvaW4sdGhpc319bDR0LnByb3RvdHlwZS5pc01lc2hCYXNpY01hdGVyaWFsPSEwO2NvbnN0IGM0dD1uZXcgSDV0LHU0dD1uZXcgQzV0O2NsYXNzIGg0dHtjb25zdHJ1Y3Rvcih0LGUsbil7aWYoQXJyYXkuaXNBcnJheSh0KSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IGFycmF5IHNob3VsZCBiZSBhIFR5cGVkIEFycmF5LiIpO3RoaXMubmFtZT0iIix0aGlzLmFycmF5PXQsdGhpcy5pdGVtU2l6ZT1lLHRoaXMuY291bnQ9dm9pZCAwIT09dD90Lmxlbmd0aC9lOjAsdGhpcy5ub3JtYWxpemVkPSEwPT09bix0aGlzLnVzYWdlPUoydCx0aGlzLnVwZGF0ZVJhbmdlPXtvZmZzZXQ6MCxjb3VudDotMX0sdGhpcy52ZXJzaW9uPTB9b25VcGxvYWRDYWxsYmFjaygpe31zZXQgbmVlZHNVcGRhdGUodCl7ITA9PT10JiZ0aGlzLnZlcnNpb24rK31zZXRVc2FnZSh0KXtyZXR1cm4gdGhpcy51c2FnZT10LHRoaXN9Y29weSh0KXtyZXR1cm4gdGhpcy5uYW1lPXQubmFtZSx0aGlzLmFycmF5PW5ldyB0LmFycmF5LmNvbnN0cnVjdG9yKHQuYXJyYXkpLHRoaXMuaXRlbVNpemU9dC5pdGVtU2l6ZSx0aGlzLmNvdW50PXQuY291bnQsdGhpcy5ub3JtYWxpemVkPXQubm9ybWFsaXplZCx0aGlzLnVzYWdlPXQudXNhZ2UsdGhpc31jb3B5QXQodCxlLG4pe3QqPXRoaXMuaXRlbVNpemUsbio9ZS5pdGVtU2l6ZTtmb3IobGV0IGk9MCxyPXRoaXMuaXRlbVNpemU7aTxyO2krKyl0aGlzLmFycmF5W3QraV09ZS5hcnJheVtuK2ldO3JldHVybiB0aGlzfWNvcHlBcnJheSh0KXtyZXR1cm4gdGhpcy5hcnJheS5zZXQodCksdGhpc31jb3B5Q29sb3JzQXJyYXkodCl7Y29uc3QgZT10aGlzLmFycmF5O2xldCBuPTA7Zm9yKGxldCBpPTAscj10Lmxlbmd0aDtpPHI7aSsrKXtsZXQgcj10W2ldO3ZvaWQgMD09PXImJihjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5Q29sb3JzQXJyYXkoKTogY29sb3IgaXMgdW5kZWZpbmVkIixpKSxyPW5ldyBzNHQpLGVbbisrXT1yLnIsZVtuKytdPXIuZyxlW24rK109ci5ifXJldHVybiB0aGlzfWNvcHlWZWN0b3Iyc0FycmF5KHQpe2NvbnN0IGU9dGhpcy5hcnJheTtsZXQgbj0wO2ZvcihsZXQgaT0wLHI9dC5sZW5ndGg7aTxyO2krKyl7bGV0IHI9dFtpXTt2b2lkIDA9PT1yJiYoY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjJzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCIsaSkscj1uZXcgQzV0KSxlW24rK109ci54LGVbbisrXT1yLnl9cmV0dXJuIHRoaXN9Y29weVZlY3RvcjNzQXJyYXkodCl7Y29uc3QgZT10aGlzLmFycmF5O2xldCBuPTA7Zm9yKGxldCBpPTAscj10Lmxlbmd0aDtpPHI7aSsrKXtsZXQgcj10W2ldO3ZvaWQgMD09PXImJihjb25zb2xlLndhcm4oIlRIUkVFLkJ1ZmZlckF0dHJpYnV0ZS5jb3B5VmVjdG9yM3NBcnJheSgpOiB2ZWN0b3IgaXMgdW5kZWZpbmVkIixpKSxyPW5ldyBINXQpLGVbbisrXT1yLngsZVtuKytdPXIueSxlW24rK109ci56fXJldHVybiB0aGlzfWNvcHlWZWN0b3I0c0FycmF5KHQpe2NvbnN0IGU9dGhpcy5hcnJheTtsZXQgbj0wO2ZvcihsZXQgaT0wLHI9dC5sZW5ndGg7aTxyO2krKyl7bGV0IHI9dFtpXTt2b2lkIDA9PT1yJiYoY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjRzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCIsaSkscj1uZXcgUjV0KSxlW24rK109ci54LGVbbisrXT1yLnksZVtuKytdPXIueixlW24rK109ci53fXJldHVybiB0aGlzfWFwcGx5TWF0cml4Myh0KXtpZigyPT09dGhpcy5pdGVtU2l6ZSlmb3IobGV0IGU9MCxuPXRoaXMuY291bnQ7ZTxuO2UrKyl1NHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0aGlzLGUpLHU0dC5hcHBseU1hdHJpeDModCksdGhpcy5zZXRYWShlLHU0dC54LHU0dC55KTtlbHNlIGlmKDM9PT10aGlzLml0ZW1TaXplKWZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKWM0dC5mcm9tQnVmZmVyQXR0cmlidXRlKHRoaXMsZSksYzR0LmFwcGx5TWF0cml4Myh0KSx0aGlzLnNldFhZWihlLGM0dC54LGM0dC55LGM0dC56KTtyZXR1cm4gdGhpc31hcHBseU1hdHJpeDQodCl7Zm9yKGxldCBlPTAsbj10aGlzLmNvdW50O2U8bjtlKyspYzR0Lng9dGhpcy5nZXRYKGUpLGM0dC55PXRoaXMuZ2V0WShlKSxjNHQuej10aGlzLmdldFooZSksYzR0LmFwcGx5TWF0cml4NCh0KSx0aGlzLnNldFhZWihlLGM0dC54LGM0dC55LGM0dC56KTtyZXR1cm4gdGhpc31hcHBseU5vcm1hbE1hdHJpeCh0KXtmb3IobGV0IGU9MCxuPXRoaXMuY291bnQ7ZTxuO2UrKyljNHQueD10aGlzLmdldFgoZSksYzR0Lnk9dGhpcy5nZXRZKGUpLGM0dC56PXRoaXMuZ2V0WihlKSxjNHQuYXBwbHlOb3JtYWxNYXRyaXgodCksdGhpcy5zZXRYWVooZSxjNHQueCxjNHQueSxjNHQueik7cmV0dXJuIHRoaXN9dHJhbnNmb3JtRGlyZWN0aW9uKHQpe2ZvcihsZXQgZT0wLG49dGhpcy5jb3VudDtlPG47ZSsrKWM0dC54PXRoaXMuZ2V0WChlKSxjNHQueT10aGlzLmdldFkoZSksYzR0Lno9dGhpcy5nZXRaKGUpLGM0dC50cmFuc2Zvcm1EaXJlY3Rpb24odCksdGhpcy5zZXRYWVooZSxjNHQueCxjNHQueSxjNHQueik7cmV0dXJuIHRoaXN9c2V0KHQsZT0wKXtyZXR1cm4gdGhpcy5hcnJheS5zZXQodCxlKSx0aGlzfWdldFgodCl7cmV0dXJuIHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplXX1zZXRYKHQsZSl7cmV0dXJuIHRoaXMuYXJyYXlbdCp0aGlzLml0ZW1TaXplXT1lLHRoaXN9Z2V0WSh0KXtyZXR1cm4gdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMV19c2V0WSh0LGUpe3JldHVybiB0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsxXT1lLHRoaXN9Z2V0Wih0KXtyZXR1cm4gdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrMl19c2V0Wih0LGUpe3JldHVybiB0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSsyXT1lLHRoaXN9Z2V0Vyh0KXtyZXR1cm4gdGhpcy5hcnJheVt0KnRoaXMuaXRlbVNpemUrM119c2V0Vyh0LGUpe3JldHVybiB0aGlzLmFycmF5W3QqdGhpcy5pdGVtU2l6ZSszXT1lLHRoaXN9c2V0WFkodCxlLG4pe3JldHVybiB0aGlzLmFycmF5Wyh0Kj10aGlzLml0ZW1TaXplKSswXT1lLHRoaXMuYXJyYXlbdCsxXT1uLHRoaXN9c2V0WFlaKHQsZSxuLGkpe3JldHVybiB0aGlzLmFycmF5Wyh0Kj10aGlzLml0ZW1TaXplKSswXT1lLHRoaXMuYXJyYXlbdCsxXT1uLHRoaXMuYXJyYXlbdCsyXT1pLHRoaXN9c2V0WFlaVyh0LGUsbixpLHIpe3JldHVybiB0aGlzLmFycmF5Wyh0Kj10aGlzLml0ZW1TaXplKSswXT1lLHRoaXMuYXJyYXlbdCsxXT1uLHRoaXMuYXJyYXlbdCsyXT1pLHRoaXMuYXJyYXlbdCszXT1yLHRoaXN9b25VcGxvYWQodCl7cmV0dXJuIHRoaXMub25VcGxvYWRDYWxsYmFjaz10LHRoaXN9Y2xvbmUoKXtyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IodGhpcy5hcnJheSx0aGlzLml0ZW1TaXplKS5jb3B5KHRoaXMpfXRvSlNPTigpe2NvbnN0IHQ9e2l0ZW1TaXplOnRoaXMuaXRlbVNpemUsdHlwZTp0aGlzLmFycmF5LmNvbnN0cnVjdG9yLm5hbWUsYXJyYXk6QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5hcnJheSksbm9ybWFsaXplZDp0aGlzLm5vcm1hbGl6ZWR9O3JldHVybiIiIT09dGhpcy5uYW1lJiYodC5uYW1lPXRoaXMubmFtZSksdGhpcy51c2FnZSE9PUoydCYmKHQudXNhZ2U9dGhpcy51c2FnZSksMD09PXRoaXMudXBkYXRlUmFuZ2Uub2Zmc2V0JiYtMT09PXRoaXMudXBkYXRlUmFuZ2UuY291bnR8fCh0LnVwZGF0ZVJhbmdlPXRoaXMudXBkYXRlUmFuZ2UpLHR9fWg0dC5wcm90b3R5cGUuaXNCdWZmZXJBdHRyaWJ1dGU9ITA7Y2xhc3MgZDR0IGV4dGVuZHMgaDR0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihuZXcgSW50OEFycmF5KHQpLGUsbil9fWNsYXNzIHA0dCBleHRlbmRzIGg0dHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IFVpbnQ4QXJyYXkodCksZSxuKX19Y2xhc3MgZjR0IGV4dGVuZHMgaDR0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihuZXcgVWludDhDbGFtcGVkQXJyYXkodCksZSxuKX19Y2xhc3MgbTR0IGV4dGVuZHMgaDR0e2NvbnN0cnVjdG9yKHQsZSxuKXtzdXBlcihuZXcgSW50MTZBcnJheSh0KSxlLG4pfX1jbGFzcyBnNHQgZXh0ZW5kcyBoNHR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKG5ldyBVaW50MTZBcnJheSh0KSxlLG4pfX1jbGFzcyBfNHQgZXh0ZW5kcyBoNHR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKG5ldyBJbnQzMkFycmF5KHQpLGUsbil9fWNsYXNzIHk0dCBleHRlbmRzIGg0dHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IFVpbnQzMkFycmF5KHQpLGUsbil9fWNsYXNzIHY0dCBleHRlbmRzIGg0dHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IFVpbnQxNkFycmF5KHQpLGUsbil9fXY0dC5wcm90b3R5cGUuaXNGbG9hdDE2QnVmZmVyQXR0cmlidXRlPSEwO2NsYXNzIGI0dCBleHRlbmRzIGg0dHtjb25zdHJ1Y3Rvcih0LGUsbil7c3VwZXIobmV3IEZsb2F0MzJBcnJheSh0KSxlLG4pfX1jbGFzcyB4NHQgZXh0ZW5kcyBoNHR7Y29uc3RydWN0b3IodCxlLG4pe3N1cGVyKG5ldyBGbG9hdDY0QXJyYXkodCksZSxuKX19ZnVuY3Rpb24gdzR0KHQpe2lmKDA9PT10Lmxlbmd0aClyZXR1cm4tMS8wO2xldCBlPXRbMF07Zm9yKGxldCBuPTEsaT10Lmxlbmd0aDtuPGk7KytuKXRbbl0+ZSYmKGU9dFtuXSk7cmV0dXJuIGV9Y29uc3QgUzR0PXtJbnQ4QXJyYXk6SW50OEFycmF5LFVpbnQ4QXJyYXk6VWludDhBcnJheSxVaW50OENsYW1wZWRBcnJheTpVaW50OENsYW1wZWRBcnJheSxJbnQxNkFycmF5OkludDE2QXJyYXksVWludDE2QXJyYXk6VWludDE2QXJyYXksSW50MzJBcnJheTpJbnQzMkFycmF5LFVpbnQzMkFycmF5OlVpbnQzMkFycmF5LEZsb2F0MzJBcnJheTpGbG9hdDMyQXJyYXksRmxvYXQ2NEFycmF5OkZsb2F0NjRBcnJheX07ZnVuY3Rpb24gTTR0KHQsZSl7cmV0dXJuIG5ldyBTNHRbdF0oZSl9bGV0IEU0dD0wO2NvbnN0IFQ0dD1uZXcgZzN0LEM0dD1uZXcgVjN0LEE0dD1uZXcgSDV0LGs0dD1uZXcgVTV0LEw0dD1uZXcgVTV0LFA0dD1uZXcgSDV0O2NsYXNzIE40dCBleHRlbmRzIGU1dHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsImlkIix7dmFsdWU6RTR0Kyt9KSx0aGlzLnV1aWQ9YTV0KCksdGhpcy5uYW1lPSIiLHRoaXMudHlwZT0iQnVmZmVyR2VvbWV0cnkiLHRoaXMuaW5kZXg9bnVsbCx0aGlzLmF0dHJpYnV0ZXM9e30sdGhpcy5tb3JwaEF0dHJpYnV0ZXM9e30sdGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT0hMSx0aGlzLmdyb3Vwcz1bXSx0aGlzLmJvdW5kaW5nQm94PW51bGwsdGhpcy5ib3VuZGluZ1NwaGVyZT1udWxsLHRoaXMuZHJhd1JhbmdlPXtzdGFydDowLGNvdW50OjEvMH0sdGhpcy51c2VyRGF0YT17fX1nZXRJbmRleCgpe3JldHVybiB0aGlzLmluZGV4fXNldEluZGV4KHQpe3JldHVybiB0aGlzLmluZGV4PUFycmF5LmlzQXJyYXkodCk/bmV3KHc0dCh0KT42NTUzNT95NHQ6ZzR0KSh0LDEpOnQsdGhpc31nZXRBdHRyaWJ1dGUodCl7cmV0dXJuIHRoaXMuYXR0cmlidXRlc1t0XX1zZXRBdHRyaWJ1dGUodCxlKXtyZXR1cm4gdGhpcy5hdHRyaWJ1dGVzW3RdPWUsdGhpc31kZWxldGVBdHRyaWJ1dGUodCl7cmV0dXJuIGRlbGV0ZSB0aGlzLmF0dHJpYnV0ZXNbdF0sdGhpc31oYXNBdHRyaWJ1dGUodCl7cmV0dXJuIHZvaWQgMCE9PXRoaXMuYXR0cmlidXRlc1t0XX1hZGRHcm91cCh0LGUsbj0wKXt0aGlzLmdyb3Vwcy5wdXNoKHtzdGFydDp0LGNvdW50OmUsbWF0ZXJpYWxJbmRleDpufSl9Y2xlYXJHcm91cHMoKXt0aGlzLmdyb3Vwcz1bXX1zZXREcmF3UmFuZ2UodCxlKXt0aGlzLmRyYXdSYW5nZS5zdGFydD10LHRoaXMuZHJhd1JhbmdlLmNvdW50PWV9YXBwbHlNYXRyaXg0KHQpe2NvbnN0IGU9dGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uO3ZvaWQgMCE9PWUmJihlLmFwcGx5TWF0cml4NCh0KSxlLm5lZWRzVXBkYXRlPSEwKTtjb25zdCBuPXRoaXMuYXR0cmlidXRlcy5ub3JtYWw7aWYodm9pZCAwIT09bil7Y29uc3QgZT0obmV3IEE1dCkuZ2V0Tm9ybWFsTWF0cml4KHQpO24uYXBwbHlOb3JtYWxNYXRyaXgoZSksbi5uZWVkc1VwZGF0ZT0hMH1jb25zdCBpPXRoaXMuYXR0cmlidXRlcy50YW5nZW50O3JldHVybiB2b2lkIDAhPT1pJiYoaS50cmFuc2Zvcm1EaXJlY3Rpb24odCksaS5uZWVkc1VwZGF0ZT0hMCksbnVsbCE9PXRoaXMuYm91bmRpbmdCb3gmJnRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCksbnVsbCE9PXRoaXMuYm91bmRpbmdTcGhlcmUmJnRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCksdGhpc31hcHBseVF1YXRlcm5pb24odCl7cmV0dXJuIFQ0dC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbih0KSx0aGlzLmFwcGx5TWF0cml4NChUNHQpLHRoaXN9cm90YXRlWCh0KXtyZXR1cm4gVDR0Lm1ha2VSb3RhdGlvblgodCksdGhpcy5hcHBseU1hdHJpeDQoVDR0KSx0aGlzfXJvdGF0ZVkodCl7cmV0dXJuIFQ0dC5tYWtlUm90YXRpb25ZKHQpLHRoaXMuYXBwbHlNYXRyaXg0KFQ0dCksdGhpc31yb3RhdGVaKHQpe3JldHVybiBUNHQubWFrZVJvdGF0aW9uWih0KSx0aGlzLmFwcGx5TWF0cml4NChUNHQpLHRoaXN9dHJhbnNsYXRlKHQsZSxuKXtyZXR1cm4gVDR0Lm1ha2VUcmFuc2xhdGlvbih0LGUsbiksdGhpcy5hcHBseU1hdHJpeDQoVDR0KSx0aGlzfXNjYWxlKHQsZSxuKXtyZXR1cm4gVDR0Lm1ha2VTY2FsZSh0LGUsbiksdGhpcy5hcHBseU1hdHJpeDQoVDR0KSx0aGlzfWxvb2tBdCh0KXtyZXR1cm4gQzR0Lmxvb2tBdCh0KSxDNHQudXBkYXRlTWF0cml4KCksdGhpcy5hcHBseU1hdHJpeDQoQzR0Lm1hdHJpeCksdGhpc31jZW50ZXIoKXtyZXR1cm4gdGhpcy5jb21wdXRlQm91bmRpbmdCb3goKSx0aGlzLmJvdW5kaW5nQm94LmdldENlbnRlcihBNHQpLm5lZ2F0ZSgpLHRoaXMudHJhbnNsYXRlKEE0dC54LEE0dC55LEE0dC56KSx0aGlzfXNldEZyb21Qb2ludHModCl7Y29uc3QgZT1bXTtmb3IobGV0IG49MCxpPXQubGVuZ3RoO248aTtuKyspe2NvbnN0IGk9dFtuXTtlLnB1c2goaS54LGkueSxpLnp8fDApfXJldHVybiB0aGlzLnNldEF0dHJpYnV0ZSgicG9zaXRpb24iLG5ldyBiNHQoZSwzKSksdGhpc31jb21wdXRlQm91bmRpbmdCb3goKXtudWxsPT09dGhpcy5ib3VuZGluZ0JveCYmKHRoaXMuYm91bmRpbmdCb3g9bmV3IFU1dCk7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb24sZT10aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtpZih0JiZ0LmlzR0xCdWZmZXJBdHRyaWJ1dGUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpOiBHTEJ1ZmZlckF0dHJpYnV0ZSByZXF1aXJlcyBhIG1hbnVhbCBib3VuZGluZyBib3guIEFsdGVybmF0aXZlbHkgc2V0ICJtZXNoLmZydXN0dW1DdWxsZWQiIHRvICJmYWxzZSIuJyx0aGlzKSx2b2lkIHRoaXMuYm91bmRpbmdCb3guc2V0KG5ldyBINXQoLTEvMCwtMS8wLC0xLzApLG5ldyBINXQoMS8wLDEvMCwxLzApKTtpZih2b2lkIDAhPT10KXtpZih0aGlzLmJvdW5kaW5nQm94LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUodCksZSlmb3IobGV0IHQ9MCxuPWUubGVuZ3RoO3Q8bjt0Kyspe2s0dC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKGVbdF0pLHRoaXMubW9ycGhUYXJnZXRzUmVsYXRpdmU/KFA0dC5hZGRWZWN0b3JzKHRoaXMuYm91bmRpbmdCb3gubWluLGs0dC5taW4pLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChQNHQpLFA0dC5hZGRWZWN0b3JzKHRoaXMuYm91bmRpbmdCb3gubWF4LGs0dC5tYXgpLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChQNHQpKToodGhpcy5ib3VuZGluZ0JveC5leHBhbmRCeVBvaW50KGs0dC5taW4pLHRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludChrNHQubWF4KSl9fWVsc2UgdGhpcy5ib3VuZGluZ0JveC5tYWtlRW1wdHkoKTsoaXNOYU4odGhpcy5ib3VuZGluZ0JveC5taW4ueCl8fGlzTmFOKHRoaXMuYm91bmRpbmdCb3gubWluLnkpfHxpc05hTih0aGlzLmJvdW5kaW5nQm94Lm1pbi56KSkmJmNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveCgpOiBDb21wdXRlZCBtaW4vbWF4IGhhdmUgTmFOIHZhbHVlcy4gVGhlICJwb3NpdGlvbiIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJyx0aGlzKX1jb21wdXRlQm91bmRpbmdTcGhlcmUoKXtudWxsPT09dGhpcy5ib3VuZGluZ1NwaGVyZSYmKHRoaXMuYm91bmRpbmdTcGhlcmU9bmV3IHMzdCk7Y29uc3QgdD10aGlzLmF0dHJpYnV0ZXMucG9zaXRpb24sZT10aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjtpZih0JiZ0LmlzR0xCdWZmZXJBdHRyaWJ1dGUpcmV0dXJuIGNvbnNvbGUuZXJyb3IoJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOiBHTEJ1ZmZlckF0dHJpYnV0ZSByZXF1aXJlcyBhIG1hbnVhbCBib3VuZGluZyBzcGhlcmUuIEFsdGVybmF0aXZlbHkgc2V0ICJtZXNoLmZydXN0dW1DdWxsZWQiIHRvICJmYWxzZSIuJyx0aGlzKSx2b2lkIHRoaXMuYm91bmRpbmdTcGhlcmUuc2V0KG5ldyBINXQsMS8wKTtpZih0KXtjb25zdCBuPXRoaXMuYm91bmRpbmdTcGhlcmUuY2VudGVyO2lmKGs0dC5zZXRGcm9tQnVmZmVyQXR0cmlidXRlKHQpLGUpZm9yKGxldCB0PTAsbj1lLmxlbmd0aDt0PG47dCsrKXtMNHQuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZShlW3RdKSx0aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlPyhQNHQuYWRkVmVjdG9ycyhrNHQubWluLEw0dC5taW4pLGs0dC5leHBhbmRCeVBvaW50KFA0dCksUDR0LmFkZFZlY3RvcnMoazR0Lm1heCxMNHQubWF4KSxrNHQuZXhwYW5kQnlQb2ludChQNHQpKTooazR0LmV4cGFuZEJ5UG9pbnQoTDR0Lm1pbiksazR0LmV4cGFuZEJ5UG9pbnQoTDR0Lm1heCkpfWs0dC5nZXRDZW50ZXIobik7bGV0IGk9MDtmb3IobGV0IGU9MCxyPXQuY291bnQ7ZTxyO2UrKylQNHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZSh0LGUpLGk9TWF0aC5tYXgoaSxuLmRpc3RhbmNlVG9TcXVhcmVkKFA0dCkpO2lmKGUpZm9yKGxldCByPTAsbz1lLmxlbmd0aDtyPG87cisrKXtjb25zdCBvPWVbcl0sYT10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlO2ZvcihsZXQgZT0wLHI9by5jb3VudDtlPHI7ZSsrKVA0dC5mcm9tQnVmZmVyQXR0cmlidXRlKG8sZSksYSYmKEE0dC5mcm9tQnVmZmVyQXR0cmlidXRlKHQsZSksUDR0LmFkZChBNHQpKSxpPU1hdGgubWF4KGksbi5kaXN0YW5jZVRvU3F1YXJlZChQNHQpKX10aGlzLmJvdW5kaW5nU3BoZXJlLnJhZGl1cz1NYXRoLnNxcnQoaSksaXNOYU4odGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXMpJiZjb25zb2xlLmVycm9yKCdUSFJFRS5CdWZmZXJHZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTogQ29tcHV0ZWQgcmFkaXVzIGlzIE5hTi4gVGhlICJwb3NpdGlvbiIgYXR0cmlidXRlIGlzIGxpa2VseSB0byBoYXZlIE5hTiB2YWx1ZXMuJyx0aGlzKX19Y29tcHV0ZUZhY2VOb3JtYWxzKCl7fWNvbXB1dGVUYW5nZW50cygpe2NvbnN0IHQ9dGhpcy5pbmRleCxlPXRoaXMuYXR0cmlidXRlcztpZihudWxsPT09dHx8dm9pZCAwPT09ZS5wb3NpdGlvbnx8dm9pZCAwPT09ZS5ub3JtYWx8fHZvaWQgMD09PWUudXYpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jb21wdXRlVGFuZ2VudHMoKSBmYWlsZWQuIE1pc3NpbmcgcmVxdWlyZWQgYXR0cmlidXRlcyAoaW5kZXgsIHBvc2l0aW9uLCBub3JtYWwgb3IgdXYpIik7Y29uc3Qgbj10LmFycmF5LGk9ZS5wb3NpdGlvbi5hcnJheSxyPWUubm9ybWFsLmFycmF5LG89ZS51di5hcnJheSxhPWkubGVuZ3RoLzM7dm9pZCAwPT09ZS50YW5nZW50JiZ0aGlzLnNldEF0dHJpYnV0ZSgidGFuZ2VudCIsbmV3IGg0dChuZXcgRmxvYXQzMkFycmF5KDQqYSksNCkpO2NvbnN0IHM9ZS50YW5nZW50LmFycmF5LGw9W10sYz1bXTtmb3IobGV0IHQ9MDt0PGE7dCsrKWxbdF09bmV3IEg1dCxjW3RdPW5ldyBINXQ7Y29uc3QgdT1uZXcgSDV0LGg9bmV3IEg1dCxkPW5ldyBINXQscD1uZXcgQzV0LGY9bmV3IEM1dCxtPW5ldyBDNXQsZz1uZXcgSDV0LF89bmV3IEg1dDtmdW5jdGlvbiB5KHQsZSxuKXt1LmZyb21BcnJheShpLDMqdCksaC5mcm9tQXJyYXkoaSwzKmUpLGQuZnJvbUFycmF5KGksMypuKSxwLmZyb21BcnJheShvLDIqdCksZi5mcm9tQXJyYXkobywyKmUpLG0uZnJvbUFycmF5KG8sMipuKSxoLnN1Yih1KSxkLnN1Yih1KSxmLnN1YihwKSxtLnN1YihwKTtjb25zdCByPTEvKGYueCptLnktbS54KmYueSk7aXNGaW5pdGUocikmJihnLmNvcHkoaCkubXVsdGlwbHlTY2FsYXIobS55KS5hZGRTY2FsZWRWZWN0b3IoZCwtZi55KS5tdWx0aXBseVNjYWxhcihyKSxfLmNvcHkoZCkubXVsdGlwbHlTY2FsYXIoZi54KS5hZGRTY2FsZWRWZWN0b3IoaCwtbS54KS5tdWx0aXBseVNjYWxhcihyKSxsW3RdLmFkZChnKSxsW2VdLmFkZChnKSxsW25dLmFkZChnKSxjW3RdLmFkZChfKSxjW2VdLmFkZChfKSxjW25dLmFkZChfKSl9bGV0IHY9dGhpcy5ncm91cHM7MD09PXYubGVuZ3RoJiYodj1be3N0YXJ0OjAsY291bnQ6bi5sZW5ndGh9XSk7Zm9yKGxldCB0PTAsZT12Lmxlbmd0aDt0PGU7Kyt0KXtjb25zdCBlPXZbdF0saT1lLnN0YXJ0O2ZvcihsZXQgdD1pLHI9aStlLmNvdW50O3Q8cjt0Kz0zKXkoblt0KzBdLG5bdCsxXSxuW3QrMl0pfWNvbnN0IGI9bmV3IEg1dCx4PW5ldyBINXQsdz1uZXcgSDV0LFM9bmV3IEg1dDtmdW5jdGlvbiBNKHQpe3cuZnJvbUFycmF5KHIsMyp0KSxTLmNvcHkodyk7Y29uc3QgZT1sW3RdO2IuY29weShlKSxiLnN1Yih3Lm11bHRpcGx5U2NhbGFyKHcuZG90KGUpKSkubm9ybWFsaXplKCkseC5jcm9zc1ZlY3RvcnMoUyxlKTtjb25zdCBuPXguZG90KGNbdF0pPDA/LTE6MTtzWzQqdF09Yi54LHNbNCp0KzFdPWIueSxzWzQqdCsyXT1iLnosc1s0KnQrM109bn1mb3IobGV0IHQ9MCxlPXYubGVuZ3RoO3Q8ZTsrK3Qpe2NvbnN0IGU9dlt0XSxpPWUuc3RhcnQ7Zm9yKGxldCB0PWkscj1pK2UuY291bnQ7dDxyO3QrPTMpTShuW3QrMF0pLE0oblt0KzFdKSxNKG5bdCsyXSl9fWNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCl7Y29uc3QgdD10aGlzLmluZGV4LGU9dGhpcy5nZXRBdHRyaWJ1dGUoInBvc2l0aW9uIik7aWYodm9pZCAwIT09ZSl7bGV0IG49dGhpcy5nZXRBdHRyaWJ1dGUoIm5vcm1hbCIpO2lmKHZvaWQgMD09PW4pbj1uZXcgaDR0KG5ldyBGbG9hdDMyQXJyYXkoMyplLmNvdW50KSwzKSx0aGlzLnNldEF0dHJpYnV0ZSgibm9ybWFsIixuKTtlbHNlIGZvcihsZXQgdD0wLGU9bi5jb3VudDt0PGU7dCsrKW4uc2V0WFlaKHQsMCwwLDApO2NvbnN0IGk9bmV3IEg1dCxyPW5ldyBINXQsbz1uZXcgSDV0LGE9bmV3IEg1dCxzPW5ldyBINXQsbD1uZXcgSDV0LGM9bmV3IEg1dCx1PW5ldyBINXQ7aWYodClmb3IobGV0IGg9MCxkPXQuY291bnQ7aDxkO2grPTMpe2NvbnN0IGQ9dC5nZXRYKGgrMCkscD10LmdldFgoaCsxKSxmPXQuZ2V0WChoKzIpO2kuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLGQpLHIuZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHApLG8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLGYpLGMuc3ViVmVjdG9ycyhvLHIpLHUuc3ViVmVjdG9ycyhpLHIpLGMuY3Jvc3ModSksYS5mcm9tQnVmZmVyQXR0cmlidXRlKG4sZCkscy5mcm9tQnVmZmVyQXR0cmlidXRlKG4scCksbC5mcm9tQnVmZmVyQXR0cmlidXRlKG4sZiksYS5hZGQoYykscy5hZGQoYyksbC5hZGQoYyksbi5zZXRYWVooZCxhLngsYS55LGEueiksbi5zZXRYWVoocCxzLngscy55LHMueiksbi5zZXRYWVooZixsLngsbC55LGwueil9ZWxzZSBmb3IobGV0IHQ9MCxhPWUuY291bnQ7dDxhO3QrPTMpaS5mcm9tQnVmZmVyQXR0cmlidXRlKGUsdCswKSxyLmZyb21CdWZmZXJBdHRyaWJ1dGUoZSx0KzEpLG8uZnJvbUJ1ZmZlckF0dHJpYnV0ZShlLHQrMiksYy5zdWJWZWN0b3JzKG8sciksdS5zdWJWZWN0b3JzKGksciksYy5jcm9zcyh1KSxuLnNldFhZWih0KzAsYy54LGMueSxjLnopLG4uc2V0WFlaKHQrMSxjLngsYy55LGMueiksbi5zZXRYWVoodCsyLGMueCxjLnksYy56KTt0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKSxuLm5lZWRzVXBkYXRlPSEwfX1tZXJnZSh0LGUpe2lmKCF0fHwhdC5pc0J1ZmZlckdlb21ldHJ5KXJldHVybiB2b2lkIGNvbnNvbGUuZXJyb3IoIlRIUkVFLkJ1ZmZlckdlb21ldHJ5Lm1lcmdlKCk6IGdlb21ldHJ5IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5CdWZmZXJHZW9tZXRyeS4iLHQpO3ZvaWQgMD09PWUmJihlPTAsY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS5tZXJnZSgpOiBPdmVyd3JpdGluZyBvcmlnaW5hbCBnZW9tZXRyeSwgc3RhcnRpbmcgYXQgb2Zmc2V0PTAuIFVzZSBCdWZmZXJHZW9tZXRyeVV0aWxzLm1lcmdlQnVmZmVyR2VvbWV0cmllcygpIGZvciBsb3NzbGVzcyBtZXJnZS4iKSk7Y29uc3Qgbj10aGlzLmF0dHJpYnV0ZXM7Zm9yKGNvbnN0IGkgaW4gbil7aWYodm9pZCAwPT09dC5hdHRyaWJ1dGVzW2ldKWNvbnRpbnVlO2NvbnN0IHI9bltpXS5hcnJheSxvPXQuYXR0cmlidXRlc1tpXSxhPW8uYXJyYXkscz1vLml0ZW1TaXplKmUsbD1NYXRoLm1pbihhLmxlbmd0aCxyLmxlbmd0aC1zKTtmb3IobGV0IHQ9MCxlPXM7dDxsO3QrKyxlKyspcltlXT1hW3RdfXJldHVybiB0aGlzfW5vcm1hbGl6ZU5vcm1hbHMoKXtjb25zdCB0PXRoaXMuYXR0cmlidXRlcy5ub3JtYWw7Zm9yKGxldCBlPTAsbj10LmNvdW50O2U8bjtlKyspUDR0LmZyb21CdWZmZXJBdHRyaWJ1dGUodCxlKSxQNHQubm9ybWFsaXplKCksdC5zZXRYWVooZSxQNHQueCxQNHQueSxQNHQueil9dG9Ob25JbmRleGVkKCl7ZnVuY3Rpb24gdCh0LGUpe2NvbnN0IG49dC5hcnJheSxpPXQuaXRlbVNpemUscj10Lm5vcm1hbGl6ZWQsbz1uZXcgbi5jb25zdHJ1Y3RvcihlLmxlbmd0aCppKTtsZXQgYT0wLHM9MDtmb3IobGV0IHI9MCxsPWUubGVuZ3RoO3I8bDtyKyspe2E9dC5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlP2Vbcl0qdC5kYXRhLnN0cmlkZSt0Lm9mZnNldDplW3JdKmk7Zm9yKGxldCB0PTA7dDxpO3QrKylvW3MrK109blthKytdfXJldHVybiBuZXcgaDR0KG8saSxyKX1pZihudWxsPT09dGhpcy5pbmRleClyZXR1cm4gY29uc29sZS53YXJuKCJUSFJFRS5CdWZmZXJHZW9tZXRyeS50b05vbkluZGV4ZWQoKTogQnVmZmVyR2VvbWV0cnkgaXMgYWxyZWFkeSBub24taW5kZXhlZC4iKSx0aGlzO2NvbnN0IGU9bmV3IE40dCxuPXRoaXMuaW5kZXguYXJyYXksaT10aGlzLmF0dHJpYnV0ZXM7Zm9yKGNvbnN0IHIgaW4gaSl7Y29uc3Qgbz10KGlbcl0sbik7ZS5zZXRBdHRyaWJ1dGUocixvKX1jb25zdCByPXRoaXMubW9ycGhBdHRyaWJ1dGVzO2Zvcihjb25zdCBpIGluIHIpe2NvbnN0IG89W10sYT1yW2ldO2ZvcihsZXQgZT0wLGk9YS5sZW5ndGg7ZTxpO2UrKyl7Y29uc3QgaT10KGFbZV0sbik7by5wdXNoKGkpfWUubW9ycGhBdHRyaWJ1dGVzW2ldPW99ZS5tb3JwaFRhcmdldHNSZWxhdGl2ZT10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlO2NvbnN0IG89dGhpcy5ncm91cHM7Zm9yKGxldCB0PTAsbj1vLmxlbmd0aDt0PG47dCsrKXtjb25zdCBuPW9bdF07ZS5hZGRHcm91cChuLnN0YXJ0LG4uY291bnQsbi5tYXRlcmlhbEluZGV4KX1yZXR1cm4gZX10b0pTT04oKXtjb25zdCB0PXttZXRhZGF0YTp7dmVyc2lvbjo0LjUsdHlwZToiQnVmZmVyR2VvbWV0cnkiLGdlbmVyYXRvcjoiQnVmZmVyR2VvbWV0cnkudG9KU09OIn19O2lmKHQudXVpZD10aGlzLnV1aWQsdC50eXBlPXRoaXMudHlwZSwiIiE9PXRoaXMubmFtZSYmKHQubmFtZT10aGlzLm5hbWUpLE9iamVjdC5rZXlzKHRoaXMudXNlckRhdGEpLmxlbmd0aD4wJiYodC51c2VyRGF0YT10aGlzLnVzZXJEYXRhKSx2b2lkIDAhPT10aGlzLnBhcmFtZXRlcnMpe2NvbnN0IGU9dGhpcy5wYXJhbWV0ZXJzO2Zvcihjb25zdCBuIGluIGUpdm9pZCAwIT09ZVtuXSYmKHRbbl09ZVtuXSk7cmV0dXJuIHR9dC5kYXRhPXthdHRyaWJ1dGVzOnt9fTtjb25zdCBlPXRoaXMuaW5kZXg7bnVsbCE9PWUmJih0LmRhdGEuaW5kZXg9e3R5cGU6ZS5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLGFycmF5OkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGUuYXJyYXkpfSk7Y29uc3Qgbj10aGlzLmF0dHJpYnV0ZXM7Zm9yKGNvbnN0IGUgaW4gbil7dC5kYXRhLmF0dHJpYnV0ZXNbZV09bltlXS50b0pTT04odC5kYXRhKX1jb25zdCBpPXt9O2xldCByPSExO2Zvcihjb25zdCBlIGluIHRoaXMubW9ycGhBdHRyaWJ1dGVzKXtjb25zdCBuPXRoaXMubW9ycGhBdHRyaWJ1dGVzW2VdLG89W107Zm9yKGxldCBlPTAsaT1uLmxlbmd0aDtlPGk7ZSsrKXtvLnB1c2gobltlXS50b0pTT04odC5kYXRhKSl9by5sZW5ndGg+MCYmKGlbZV09byxyPSEwKX1yJiYodC5kYXRhLm1vcnBoQXR0cmlidXRlcz1pLHQuZGF0YS5tb3JwaFRhcmdldHNSZWxhdGl2ZT10aGlzLm1vcnBoVGFyZ2V0c1JlbGF0aXZlKTtjb25zdCBvPXRoaXMuZ3JvdXBzO28ubGVuZ3RoPjAmJih0LmRhdGEuZ3JvdXBzPUpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobykpKTtjb25zdCBhPXRoaXMuYm91bmRpbmdTcGhlcmU7cmV0dXJuIG51bGwhPT1hJiYodC5kYXRhLmJvdW5kaW5nU3BoZXJlPXtjZW50ZXI6YS5jZW50ZXIudG9BcnJheSgpLHJhZGl1czphLnJhZGl1c30pLHR9Y2xvbmUoKXtyZXR1cm4obmV3IE40dCkuY29weSh0aGlzKX1jb3B5KHQpe3RoaXMuaW5kZXg9bnVsbCx0aGlzLmF0dHJpYnV0ZXM9e30sdGhpcy5tb3JwaEF0dHJpYnV0ZXM9e30sdGhpcy5ncm91cHM9W10sdGhpcy5ib3VuZGluZ0JveD1udWxsLHRoaXMuYm91bmRpbmdTcGhlcmU9bnVsbDtjb25zdCBlPXt9O3RoaXMubmFtZT10Lm5hbWU7Y29uc3Qgbj10LmluZGV4O251bGwhPT1uJiZ0aGlzLnNldEluZGV4KG4uY2xvbmUoZSkpO2NvbnN0IGk9dC5hdHRyaWJ1dGVzO2Zvcihjb25zdCB0IGluIGkpe3RoaXMuc2V0QXR0cmlidXRlKHQsaVt0XS5jbG9uZShlKSl9Y29uc3Qgcj10Lm1vcnBoQXR0cmlidXRlcztmb3IoY29uc3QgdCBpbiByKXtjb25zdCBuPVtdLGk9clt0XTtmb3IobGV0IHQ9MCxyPWkubGVuZ3RoO3Q8cjt0Kyspbi5wdXNoKGlbdF0uY2xvbmUoZSkpO3RoaXMubW9ycGhBdHRyaWJ1dGVzW3RdPW59dGhpcy5tb3JwaFRhcmdldHNSZWxhdGl2ZT10Lm1vcnBoVGFyZ2V0c1JlbGF0aXZlO2NvbnN0IG89dC5ncm91cHM7Zm9yKGxldCB0PTAsZT1vLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPW9bdF07dGhpcy5hZGRHcm91cChlLnN0YXJ0LGUuY291bnQsZS5tYXRlcmlhbEluZGV4KX1jb25zdCBhPXQuYm91bmRpbmdCb3g7bnVsbCE9PWEmJih0aGlzLmJvdW5kaW5nQm94PWEuY2xvbmUoKSk7Y29uc3Qgcz10LmJvdW5kaW5nU3BoZXJlO3JldHVybiBudWxsIT09cyYmKHRoaXMuYm91bmRpbmdTcGhlcmU9cy5jbG9uZSgpKSx0aGlzLmRyYXdSYW5nZS5zdGFydD10LmRyYXdSYW5nZS5zdGFydCx0aGlzLmRyYXdSYW5nZS5jb3VudD10LmRyYXdSYW5nZS5jb3VudCx0aGlzLnVzZXJEYXRhPXQudXNlckRhdGEsdGhpc31kaXNwb3NlKCl7dGhpcy5kaXNwYXRjaEV2ZW50KHt0eXBlOiJkaXNwb3NlIn0pfX1ONHQucHJvdG90eXBlLmlzQnVmZmVyR2VvbWV0cnk9ITA7Y29uc3QgSTR0PW5ldyBnM3QsUjR0PW5ldyBtM3QsTzR0PW5ldyBzM3QsejR0PW5ldyBINXQsRDR0PW5ldyBINXQsQjR0PW5ldyBINXQsSDR0PW5ldyBINXQsRjR0PW5ldyBINXQsVjR0PW5ldyBINXQsVTR0PW5ldyBINXQsajR0PW5ldyBINXQsRzR0PW5ldyBINXQsVzR0PW5ldyBDNXQscTR0PW5ldyBDNXQsWTR0PW5ldyBDNXQsWDR0PW5ldyBINXQsJDR0PW5ldyBINXQ7Y2xhc3MgSzR0IGV4dGVuZHMgVjN0e2NvbnN0cnVjdG9yKHQ9bmV3IE40dCxlPW5ldyBsNHQpe3N1cGVyKCksdGhpcy50eXBlPSJNZXNoIix0aGlzLmdlb21ldHJ5PXQsdGhpcy5tYXRlcmlhbD1lLHRoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx2b2lkIDAhPT10Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyYmKHRoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPXQubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnNsaWNlKCkpLHZvaWQgMCE9PXQubW9ycGhUYXJnZXREaWN0aW9uYXJ5JiYodGhpcy5tb3JwaFRhcmdldERpY3Rpb25hcnk9T2JqZWN0LmFzc2lnbih7fSx0Lm1vcnBoVGFyZ2V0RGljdGlvbmFyeSkpLHRoaXMubWF0ZXJpYWw9dC5tYXRlcmlhbCx0aGlzLmdlb21ldHJ5PXQuZ2VvbWV0cnksdGhpc311cGRhdGVNb3JwaFRhcmdldHMoKXtjb25zdCB0PXRoaXMuZ2VvbWV0cnk7aWYodC5pc0J1ZmZlckdlb21ldHJ5KXtjb25zdCBlPXQubW9ycGhBdHRyaWJ1dGVzLG49T2JqZWN0LmtleXMoZSk7aWYobi5sZW5ndGg+MCl7Y29uc3QgdD1lW25bMF1dO2lmKHZvaWQgMCE9PXQpe3RoaXMubW9ycGhUYXJnZXRJbmZsdWVuY2VzPVtdLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5PXt9O2ZvcihsZXQgZT0wLG49dC5sZW5ndGg7ZTxuO2UrKyl7Y29uc3Qgbj10W2VdLm5hbWV8fFN0cmluZyhlKTt0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKDApLHRoaXMubW9ycGhUYXJnZXREaWN0aW9uYXJ5W25dPWV9fX19ZWxzZXtjb25zdCBlPXQubW9ycGhUYXJnZXRzO3ZvaWQgMCE9PWUmJmUubGVuZ3RoPjAmJmNvbnNvbGUuZXJyb3IoIlRIUkVFLk1lc2gudXBkYXRlTW9ycGhUYXJnZXRzKCkgbm8gbG9uZ2VyIHN1cHBvcnRzIFRIUkVFLkdlb21ldHJ5LiBVc2UgVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKX19cmF5Y2FzdCh0LGUpe2NvbnN0IG49dGhpcy5nZW9tZXRyeSxpPXRoaXMubWF0ZXJpYWwscj10aGlzLm1hdHJpeFdvcmxkO2lmKHZvaWQgMD09PWkpcmV0dXJuO2lmKG51bGw9PT1uLmJvdW5kaW5nU3BoZXJlJiZuLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpLE80dC5jb3B5KG4uYm91bmRpbmdTcGhlcmUpLE80dC5hcHBseU1hdHJpeDQociksITE9PT10LnJheS5pbnRlcnNlY3RzU3BoZXJlKE80dCkpcmV0dXJuO2lmKEk0dC5jb3B5KHIpLmludmVydCgpLFI0dC5jb3B5KHQucmF5KS5hcHBseU1hdHJpeDQoSTR0KSxudWxsIT09bi5ib3VuZGluZ0JveCYmITE9PT1SNHQuaW50ZXJzZWN0c0JveChuLmJvdW5kaW5nQm94KSlyZXR1cm47bGV0IG87aWYobi5pc0J1ZmZlckdlb21ldHJ5KXtjb25zdCByPW4uaW5kZXgsYT1uLmF0dHJpYnV0ZXMucG9zaXRpb24scz1uLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbixsPW4ubW9ycGhUYXJnZXRzUmVsYXRpdmUsYz1uLmF0dHJpYnV0ZXMudXYsdT1uLmF0dHJpYnV0ZXMudXYyLGg9bi5ncm91cHMsZD1uLmRyYXdSYW5nZTtpZihudWxsIT09cilpZihBcnJheS5pc0FycmF5KGkpKWZvcihsZXQgbj0wLHA9aC5sZW5ndGg7bjxwO24rKyl7Y29uc3QgcD1oW25dLGY9aVtwLm1hdGVyaWFsSW5kZXhdO2ZvcihsZXQgbj1NYXRoLm1heChwLnN0YXJ0LGQuc3RhcnQpLGk9TWF0aC5taW4ocC5zdGFydCtwLmNvdW50LGQuc3RhcnQrZC5jb3VudCk7bjxpO24rPTMpe2NvbnN0IGk9ci5nZXRYKG4pLGg9ci5nZXRYKG4rMSksZD1yLmdldFgobisyKTtvPVo0dCh0aGlzLGYsdCxSNHQsYSxzLGwsYyx1LGksaCxkKSxvJiYoby5mYWNlSW5kZXg9TWF0aC5mbG9vcihuLzMpLG8uZmFjZS5tYXRlcmlhbEluZGV4PXAubWF0ZXJpYWxJbmRleCxlLnB1c2gobykpfX1lbHNle2ZvcihsZXQgbj1NYXRoLm1heCgwLGQuc3RhcnQpLGg9TWF0aC5taW4oci5jb3VudCxkLnN0YXJ0K2QuY291bnQpO248aDtuKz0zKXtjb25zdCBoPXIuZ2V0WChuKSxkPXIuZ2V0WChuKzEpLHA9ci5nZXRYKG4rMik7bz1aNHQodGhpcyxpLHQsUjR0LGEscyxsLGMsdSxoLGQscCksbyYmKG8uZmFjZUluZGV4PU1hdGguZmxvb3Iobi8zKSxlLnB1c2gobykpfX1lbHNlIGlmKHZvaWQgMCE9PWEpaWYoQXJyYXkuaXNBcnJheShpKSlmb3IobGV0IG49MCxyPWgubGVuZ3RoO248cjtuKyspe2NvbnN0IHI9aFtuXSxwPWlbci5tYXRlcmlhbEluZGV4XTtmb3IobGV0IG49TWF0aC5tYXgoci5zdGFydCxkLnN0YXJ0KSxpPU1hdGgubWluKHIuc3RhcnQrci5jb3VudCxkLnN0YXJ0K2QuY291bnQpO248aTtuKz0zKXtvPVo0dCh0aGlzLHAsdCxSNHQsYSxzLGwsYyx1LG4sbisxLG4rMiksbyYmKG8uZmFjZUluZGV4PU1hdGguZmxvb3Iobi8zKSxvLmZhY2UubWF0ZXJpYWxJbmRleD1yLm1hdGVyaWFsSW5kZXgsZS5wdXNoKG8pKX19ZWxzZXtmb3IobGV0IG49TWF0aC5tYXgoMCxkLnN0YXJ0KSxyPU1hdGgubWluKGEuY291bnQsZC5zdGFydCtkLmNvdW50KTtuPHI7bis9Myl7bz1aNHQodGhpcyxpLHQsUjR0LGEscyxsLGMsdSxuLG4rMSxuKzIpLG8mJihvLmZhY2VJbmRleD1NYXRoLmZsb29yKG4vMyksZS5wdXNoKG8pKX19fWVsc2Ugbi5pc0dlb21ldHJ5JiZjb25zb2xlLmVycm9yKCJUSFJFRS5NZXNoLnJheWNhc3QoKSBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLiIpfX1mdW5jdGlvbiBaNHQodCxlLG4saSxyLG8sYSxzLGwsYyx1LGgpe3o0dC5mcm9tQnVmZmVyQXR0cmlidXRlKHIsYyksRDR0LmZyb21CdWZmZXJBdHRyaWJ1dGUocix1KSxCNHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShyLGgpO2NvbnN0IGQ9dC5tb3JwaFRhcmdldEluZmx1ZW5jZXM7aWYobyYmZCl7VTR0LnNldCgwLDAsMCksajR0LnNldCgwLDAsMCksRzR0LnNldCgwLDAsMCk7Zm9yKGxldCB0PTAsZT1vLmxlbmd0aDt0PGU7dCsrKXtjb25zdCBlPWRbdF0sbj1vW3RdOzAhPT1lJiYoSDR0LmZyb21CdWZmZXJBdHRyaWJ1dGUobixjKSxGNHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShuLHUpLFY0dC5mcm9tQnVmZmVyQXR0cmlidXRlKG4saCksYT8oVTR0LmFkZFNjYWxlZFZlY3RvcihINHQsZSksajR0LmFkZFNjYWxlZFZlY3RvcihGNHQsZSksRzR0LmFkZFNjYWxlZFZlY3RvcihWNHQsZSkpOihVNHQuYWRkU2NhbGVkVmVjdG9yKEg0dC5zdWIoejR0KSxlKSxqNHQuYWRkU2NhbGVkVmVjdG9yKEY0dC5zdWIoRDR0KSxlKSxHNHQuYWRkU2NhbGVkVmVjdG9yKFY0dC5zdWIoQjR0KSxlKSkpfXo0dC5hZGQoVTR0KSxENHQuYWRkKGo0dCksQjR0LmFkZChHNHQpfXQuaXNTa2lubmVkTWVzaCYmKHQuYm9uZVRyYW5zZm9ybShjLHo0dCksdC5ib25lVHJhbnNmb3JtKHUsRDR0KSx0LmJvbmVUcmFuc2Zvcm0oaCxCNHQpKTtjb25zdCBwPShmdW5jdGlvbiBmKHQsZSxuLGkscixvLGEscyl7bGV0IGw7aWYobD0xPT09ZS5zaWRlP2kuaW50ZXJzZWN0VHJpYW5nbGUoYSxvLHIsITAscyk6aS5pbnRlcnNlY3RUcmlhbmdsZShyLG8sYSwyIT09ZS5zaWRlLHMpLG51bGw9PT1sKXJldHVybiBudWxsOyQ0dC5jb3B5KHMpLCQ0dC5hcHBseU1hdHJpeDQodC5tYXRyaXhXb3JsZCk7Y29uc3QgYz1uLnJheS5vcmlnaW4uZGlzdGFuY2VUbygkNHQpO3JldHVybiBjPG4ubmVhcnx8Yz5uLmZhcj9udWxsOntkaXN0YW5jZTpjLHBvaW50OiQ0dC5jbG9uZSgpLG9iamVjdDp0fX0pKHQsZSxuLGksejR0LEQ0dCxCNHQsWDR0KTtpZihwKXtzJiYoVzR0LmZyb21CdWZmZXJBdHRyaWJ1dGUocyxjKSxxNHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShzLHUpLFk0dC5mcm9tQnVmZmVyQXR0cmlidXRlKHMsaCkscC51dj1KM3QuZ2V0VVYoWDR0LHo0dCxENHQsQjR0LFc0dCxxNHQsWTR0LG5ldyBDNXQpKSxsJiYoVzR0LmZyb21CdWZmZXJBdHRyaWJ1dGUobCxjKSxxNHQuZnJvbUJ1ZmZlckF0dHJpYnV0ZShsLHUpLFk0dC5mcm9tQnVmZmVyQXR0cmlidXRlKGwsaCkscC51djI9SjN0LmdldFVWKFg0dCx6NHQsRDR0LEI0dCxXNHQscTR0LFk0dCxuZXcgQzV0KSk7Y29uc3QgdD17YTpjLGI6dSxjOmgsbm9ybWFsOm5ldyBINXQsbWF0ZXJpYWxJbmRleDowfTtKM3QuZ2V0Tm9ybWFsKHo0dCxENHQsQjR0LHQubm9ybWFsKSxwLmZhY2U9dH1yZXR1cm4gcH1LNHQucHJvdG90eXBlLmlzTWVzaD0hMDtjbGFzcyBKNHQgZXh0ZW5kcyBONHR7Y29uc3RydWN0b3IodD0xLGU9MSxuPTEsaT0xLHI9MSxvPTEpe3N1cGVyKCksdGhpcy50eXBlPSJCb3hHZW9tZXRyeSIsdGhpcy5wYXJhbWV0ZXJzPXt3aWR0aDp0LGhlaWdodDplLGRlcHRoOm4sd2lkdGhTZWdtZW50czppLGhlaWdodFNlZ21lbnRzOnIsZGVwdGhTZWdtZW50czpvfTtjb25zdCBhPXRoaXM7aT1NYXRoLmZsb29yKGkpLHI9TWF0aC5mbG9vcihyKSxvPU1hdGguZmxvb3Iobyk7Y29uc3Qgcz1bXSxsPVtdLGM9W10sdT1bXTtsZXQgaD0wLGQ9MDtmdW5jdGlvbiBwKHQsZSxuLGkscixvLHAsZixtLGcsXyl7Y29uc3QgeT1vL20sdj1wL2csYj1vLzIseD1wLzIsdz1mLzIsUz1tKzEsTT1nKzE7bGV0IEU9MCxUPTA7Y29uc3QgQz1uZXcgSDV0O2ZvcihsZXQgbz0wO288TTtvKyspe2NvbnN0IGE9byp2LXg7Zm9yKGxldCBzPTA7czxTO3MrKyl7Q1t0XT0ocyp5LWIpKmksQ1tlXT1hKnIsQ1tuXT13LGwucHVzaChDLngsQy55LEMueiksQ1t0XT0wLENbZV09MCxDW25dPWY+MD8xOi0xLGMucHVzaChDLngsQy55LEMueiksdS5wdXNoKHMvbSksdS5wdXNoKDEtby9nKSxFKz0xfX1mb3IobGV0IHQ9MDt0PGc7dCsrKWZvcihsZXQgZT0wO2U8bTtlKyspe2NvbnN0IG49aCtlK1MqKHQrMSksaT1oKyhlKzEpK1MqKHQrMSkscj1oKyhlKzEpK1MqdDtzLnB1c2goaCtlK1MqdCxuLHIpLHMucHVzaChuLGksciksVCs9Nn1hLmFkZEdyb3VwKGQsVCxfKSxkKz1ULGgrPUV9cCgieiIsInkiLCJ4IiwtMSwtMSxuLGUsdCxvLHIsMCkscCgieiIsInkiLCJ4IiwxLC0xLG4sZSwtdCxvLHIsMSkscCgieCIsInoiLCJ5IiwxLDEsdCxuLGUsaSxvLDIpLHAoIngiLCJ6IiwieSIsMSwtMSx0LG4sLWUsaSxvLDMpLHAoIngiLCJ5IiwieiIsMSwtMSx0LGUsbixpLHIsNCkscCgieCIsInkiLCJ6IiwtMSwtMSx0LGUsLW4saSxyLDUpLHRoaXMuc2V0SW5kZXgocyksdGhpcy5zZXRBdHRyaWJ1dGUoInBvc2l0aW9uIixuZXcgYjR0KGwsMykpLHRoaXMuc2V0QXR0cmlidXRlKCJub3JtYWwiLG5ldyBiNHQoYywzKSksdGhpcy5zZXRBdHRyaWJ1dGUoInV2IixuZXcgYjR0KHUsMikpfXN0YXRpYyBmcm9tSlNPTih0KXtyZXR1cm4gbmV3IEo0dCh0LndpZHRoLHQuaGVpZ2h0LHQuZGVwdGgsdC53aWR0aFNlZ21lbnRzLHQuaGVpZ2h0U2VnbWVudHMsdC5kZXB0aFNlZ21lbnRzKX19ZnVuY3Rpb24gUTR0KHQpe2NvbnN0IGU9e307Zm9yKGNvbnN0IG4gaW4gdCl7ZVtuXT17fTtmb3IoY29uc3QgaSBpbiB0W25dKXtjb25zdCByPXRbbl1baV07ZVtuXVtpXT1yJiYoci5pc0NvbG9yfHxyLmlzTWF0cml4M3x8ci5pc01hdHJpeDR8fHIuaXNWZWN0b3IyfHxyLmlzVmVjdG9yM3x8ci5pc1ZlY3RvcjR8fHIuaXNUZXh0dXJlfHxyLmlzUXVhdGVybmlvbik/ci5jbG9uZSgpOkFycmF5LmlzQXJyYXkocik/ci5zbGljZSgpOnJ9fXJldHVybiBlfWZ1bmN0aW9uIHQ2dCh0KXtjb25zdCBlPXt9O2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtjb25zdCBpPVE0dCh0W25dKTtmb3IoY29uc3QgdCBpbiBpKWVbdF09aVt0XX1yZXR1cm4gZX1jb25zdCBlNnQ9e2Nsb25lOlE0dCxtZXJnZTp0NnR9O2NsYXNzIG42dCBleHRlbmRzIHQ0dHtjb25zdHJ1Y3Rvcih0KXtzdXBlcigpLHRoaXMudHlwZT0iU2hhZGVyTWF0ZXJpYWwiLHRoaXMuZGVmaW5lcz17fSx0aGlzLnVuaWZvcm1zPXt9LHRoaXMudmVydGV4U2hhZGVyPSJ2b2lkIG1haW4oKSB7XG5cdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcbn0iLHRoaXMuZnJhZ21lbnRTaGFkZXI9InZvaWQgbWFpbigpIHtcblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggMS4wLCAwLjAsIDAuMCwgMS4wICk7XG59Iix0aGlzLmxpbmV3aWR0aD0xLHRoaXMud2lyZWZyYW1lPSExLHRoaXMud2lyZWZyYW1lTGluZXdpZHRoPTEsdGhpcy5mb2c9ITEsdGhpcy5saWdodHM9ITEsdGhpcy5jbGlwcGluZz0hMSx0aGlzLmV4dGVuc2lvbnM9e2Rlcml2YXRpdmVzOiExLGZyYWdEZXB0aDohMSxkcmF3QnVmZmVyczohMSxzaGFkZXJUZXh0dXJlTE9EOiExfSx0aGlzLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXM9e2NvbG9yOlsxLDEsMV0sdXY6WzAsMF0sdXYyOlswLDBdfSx0aGlzLmluZGV4MEF0dHJpYnV0ZU5hbWU9dm9pZCAwLHRoaXMudW5pZm9ybXNOZWVkVXBkYXRlPSExLHRoaXMuZ2xzbFZlcnNpb249bnVsbCx2b2lkIDAhPT10JiYodm9pZCAwIT09dC5hdHRyaWJ1dGVzJiZjb25zb2xlLmVycm9yKCJUSFJFRS5TaGFkZXJNYXRlcmlhbDogYXR0cmlidXRlcyBzaG91bGQgbm93IGJlIGRlZmluZWQgaW4gVEhSRUUuQnVmZmVyR2VvbWV0cnkgaW5zdGVhZC4iKSx0aGlzLnNldFZhbHVlcyh0KSl9Y29weSh0KXtyZXR1cm4gc3VwZXIuY29weSh0KSx0aGlzLmZyYWdtZW50U2hhZGVyPXQuZnJhZ21lbnRTaGFkZXIsdGhpcy52ZXJ0ZXhTaGFkZXI9dC52ZXJ0ZXhTaGFkZXIsdGhpcy51bmlmb3Jtcz1RNHQodC51bmlmb3JtcyksdGhpcy5kZWZpbmVzPU9iamVjdC5hc3NpZ24oe30sdC5kZWZpbmVzKSx0aGlzLndpcmVmcmFtZT10LndpcmVmcmFtZSx0aGlzLndpcmVmcmFtZUxpbmV3aWR0aD10LndpcmVmcmFtZUxpbmV3aWR0aCx0aGlzLmxpZ2h0cz10LmxpZ2h0cyx0aGlzLmNsaXBwaW5nPXQuY2xpcHBpbmcsdGhpcy5leHRlbnNpb25zPU9iamVjdC5hc3NpZ24oe30sdC5leHRlbnNpb25zKSx0aGlzLmdsc2xWZXJzaW9uPXQuZ2xzbFZlcnNpb24sdGhpc310b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7ZS5nbHNsVmVyc2lvbj10aGlzLmdsc2xWZXJzaW9uLGUudW5pZm9ybXM9e307Zm9yKGNvbnN0IG4gaW4gdGhpcy51bmlmb3Jtcyl7Y29uc3QgaT10aGlzLnVuaWZvcm1zW25dLnZhbHVlO2UudW5pZm9ybXNbbl09aSYmaS5pc1RleHR1cmU/e3R5cGU6InQiLHZhbHVlOmkudG9KU09OKHQpLnV1aWR9OmkmJmkuaXNDb2xvcj97dHlwZToiYyIsdmFsdWU6aS5nZXRIZXgoKX06aSYmaS5pc1ZlY3RvcjI/e3R5cGU6InYyIix2YWx1ZTppLnRvQXJyYXkoKX06aSYmaS5pc1ZlY3RvcjM/e3R5cGU6InYzIix2YWx1ZTppLnRvQXJyYXkoKX06aSYmaS5pc1ZlY3RvcjQ/e3R5cGU6InY0Iix2YWx1ZTppLnRvQXJyYXkoKX06aSYmaS5pc01hdHJpeDM/e3R5cGU6Im0zIix2YWx1ZTppLnRvQXJyYXkoKX06aSYmaS5pc01hdHJpeDQ/e3R5cGU6Im00Iix2YWx1ZTppLnRvQXJyYXkoKX06e3ZhbHVlOml9fU9iamVjdC5rZXlzKHRoaXMuZGVmaW5lcykubGVuZ3RoPjAmJihlLmRlZmluZXM9dGhpcy5kZWZpbmVzKSxlLnZlcnRleFNoYWRlcj10aGlzLnZlcnRleFNoYWRlcixlLmZyYWdtZW50U2hhZGVyPXRoaXMuZnJhZ21lbnRTaGFkZXI7Y29uc3Qgbj17fTtmb3IoY29uc3QgdCBpbiB0aGlzLmV4dGVuc2lvbnMpITA9PT10aGlzLmV4dGVuc2lvbnNbdF0mJihuW3RdPSEwKTtyZXR1cm4gT2JqZWN0LmtleXMobikubGVuZ3RoPjAmJihlLmV4dGVuc2lvbnM9biksZX19bjZ0LnByb3RvdHlwZS5pc1NoYWRlck1hdGVyaWFsPSEwO2NsYXNzIGk2dCBleHRlbmRzIFYzdHtjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy50eXBlPSJDYW1lcmEiLHRoaXMubWF0cml4V29ybGRJbnZlcnNlPW5ldyBnM3QsdGhpcy5wcm9qZWN0aW9uTWF0cml4PW5ldyBnM3QsdGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZT1uZXcgZzN0fWNvcHkodCxlKXtyZXR1cm4gc3VwZXIuY29weSh0LGUpLHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkodC5tYXRyaXhXb3JsZEludmVyc2UpLHRoaXMucHJvamVjdGlvbk1hdHJpeC5jb3B5KHQucHJvamVjdGlvbk1hdHJpeCksdGhpcy5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZS5jb3B5KHQucHJvamVjdGlvbk1hdHJpeEludmVyc2UpLHRoaXN9Z2V0V29ybGREaXJlY3Rpb24odCl7dGhpcy51cGRhdGVXb3JsZE1hdHJpeCghMCwhMSk7Y29uc3QgZT10aGlzLm1hdHJpeFdvcmxkLmVsZW1lbnRzO3JldHVybiB0LnNldCgtZVs4XSwtZVs5XSwtZVsxMF0pLm5vcm1hbGl6ZSgpfXVwZGF0ZU1hdHJpeFdvcmxkKHQpe3N1cGVyLnVwZGF0ZU1hdHJpeFdvcmxkKHQpLHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCl9dXBkYXRlV29ybGRNYXRyaXgodCxlKXtzdXBlci51cGRhdGVXb3JsZE1hdHJpeCh0LGUpLHRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkodGhpcy5tYXRyaXhXb3JsZCkuaW52ZXJ0KCl9Y2xvbmUoKXtyZXR1cm4obmV3IHRoaXMuY29uc3RydWN0b3IpLmNvcHkodGhpcyl9fWk2dC5wcm90b3R5cGUuaXNDYW1lcmE9ITA7Y2xhc3MgcjZ0IGV4dGVuZHMgaTZ0e2NvbnN0cnVjdG9yKHQ9NTAsZT0xLG49LjEsaT0yZTMpe3N1cGVyKCksdGhpcy50eXBlPSJQZXJzcGVjdGl2ZUNhbWVyYSIsdGhpcy5mb3Y9dCx0aGlzLnpvb209MSx0aGlzLm5lYXI9bix0aGlzLmZhcj1pLHRoaXMuZm9jdXM9MTAsdGhpcy5hc3BlY3Q9ZSx0aGlzLnZpZXc9bnVsbCx0aGlzLmZpbG1HYXVnZT0zNSx0aGlzLmZpbG1PZmZzZXQ9MCx0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX1jb3B5KHQsZSl7cmV0dXJuIHN1cGVyLmNvcHkodCxlKSx0aGlzLmZvdj10LmZvdix0aGlzLnpvb209dC56b29tLHRoaXMubmVhcj10Lm5lYXIsdGhpcy5mYXI9dC5mYXIsdGhpcy5mb2N1cz10LmZvY3VzLHRoaXMuYXNwZWN0PXQuYXNwZWN0LHRoaXMudmlldz1udWxsPT09dC52aWV3P251bGw6T2JqZWN0LmFzc2lnbih7fSx0LnZpZXcpLHRoaXMuZmlsbUdhdWdlPXQuZmlsbUdhdWdlLHRoaXMuZmlsbU9mZnNldD10LmZpbG1PZmZzZXQsdGhpc31zZXRGb2NhbExlbmd0aCh0KXtjb25zdCBlPS41KnRoaXMuZ2V0RmlsbUhlaWdodCgpL3Q7dGhpcy5mb3Y9MipvNXQqTWF0aC5hdGFuKGUpLHRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpfWdldEZvY2FsTGVuZ3RoKCl7Y29uc3QgdD1NYXRoLnRhbiguNSpyNXQqdGhpcy5mb3YpO3JldHVybi41KnRoaXMuZ2V0RmlsbUhlaWdodCgpL3R9Z2V0RWZmZWN0aXZlRk9WKCl7cmV0dXJuIDIqbzV0Kk1hdGguYXRhbihNYXRoLnRhbiguNSpyNXQqdGhpcy5mb3YpL3RoaXMuem9vbSl9Z2V0RmlsbVdpZHRoKCl7cmV0dXJuIHRoaXMuZmlsbUdhdWdlKk1hdGgubWluKHRoaXMuYXNwZWN0LDEpfWdldEZpbG1IZWlnaHQoKXtyZXR1cm4gdGhpcy5maWxtR2F1Z2UvTWF0aC5tYXgodGhpcy5hc3BlY3QsMSl9c2V0Vmlld09mZnNldCh0LGUsbixpLHIsbyl7dGhpcy5hc3BlY3Q9dC9lLG51bGw9PT10aGlzLnZpZXcmJih0aGlzLnZpZXc9e2VuYWJsZWQ6ITAsZnVsbFdpZHRoOjEsZnVsbEhlaWdodDoxLG9mZnNldFg6MCxvZmZzZXRZOjAsd2lkdGg6MSxoZWlnaHQ6MX0pLHRoaXMudmlldy5lbmFibGVkPSEwLHRoaXMudmlldy5mdWxsV2lkdGg9dCx0aGlzLnZpZXcuZnVsbEhlaWdodD1lLHRoaXMudmlldy5vZmZzZXRYPW4sdGhpcy52aWV3Lm9mZnNldFk9aSx0aGlzLnZpZXcud2lkdGg9cix0aGlzLnZpZXcuaGVpZ2h0PW8sdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl9Y2xlYXJWaWV3T2Zmc2V0KCl7bnVsbCE9PXRoaXMudmlldyYmKHRoaXMudmlldy5lbmFibGVkPSExKSx0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKX11cGRhdGVQcm9qZWN0aW9uTWF0cml4KCl7Y29uc3QgdD10aGlzLm5lYXI7bGV0IGU9dCpNYXRoLnRhbiguNSpyNXQqdGhpcy5mb3YpL3RoaXMuem9vbSxuPTIqZSxpPXRoaXMuYXNwZWN0Km4scj0tLjUqaTtjb25zdCBvPXRoaXMudmlldztpZihudWxsIT09dGhpcy52aWV3JiZ0aGlzLnZpZXcuZW5hYmxlZCl7Y29uc3QgdD1vLmZ1bGxXaWR0aCxhPW8uZnVsbEhlaWdodDtyKz1vLm9mZnNldFgqaS90LGUtPW8ub2Zmc2V0WSpuL2EsaSo9by53aWR0aC90LG4qPW8uaGVpZ2h0L2F9Y29uc3QgYT10aGlzLmZpbG1PZmZzZXQ7MCE9PWEmJihyKz10KmEvdGhpcy5nZXRGaWxtV2lkdGgoKSksdGhpcy5wcm9qZWN0aW9uTWF0cml4Lm1ha2VQZXJzcGVjdGl2ZShyLHIraSxlLGUtbix0LHRoaXMuZmFyKSx0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkodGhpcy5wcm9qZWN0aW9uTWF0cml4KS5pbnZlcnQoKX10b0pTT04odCl7Y29uc3QgZT1zdXBlci50b0pTT04odCk7cmV0dXJuIGUub2JqZWN0LmZvdj10aGlzLmZvdixlLm9iamVjdC56b29tPXRoaXMuem9vbSxlLm9iamVjdC5uZWFyPXRoaXMubmVhcixlLm9iamVjdC5mYXI9dGhpcy5mYXIsZS5vYmplY3QuZm9jdXM9dGhpcy5mb2N1cyxlLm9iamVjdC5hc3BlY3Q9dGhpcy5hc3BlY3QsbnVsbCE9PXRoaXMudmlldyYmKGUub2JqZWN0LnZpZXc9T2JqZWN0LmFzc2lnbih7fSx0aGlzLnZpZXcpKSxlLm9iamVjdC5maWxtR2F1Z2U9dGhpcy5maWxtR2F1Z2UsZS5vYmplY3QuZmlsbU9mZnNldD10aGlzLmZpbG1PZmZzZXQsZX19cjZ0LnByb3RvdHlwZS5pc1BlcnNwZWN0aXZlQ2FtZXJhPSEwO2NvbnN0IG82dD05MDtjbGFzcyBhNnQgZXh0ZW5kcyBWM3R7Y29uc3RydWN0b3IodCxlLG4pe2lmKHN1cGVyKCksdGhpcy50eXBlPSJDdWJlQ2FtZXJhIiwhMCE9PW4uaXNXZWJHTEN1YmVSZW5kZXJUYXJnZXQpcmV0dXJuIHZvaWQgY29uc29sZS5lcnJvcigiVEhSRUUuQ3ViZUNhbWVyYTogVGhlIGNvbnN0cnVjdG9yIG5vdyBleHBlY3RzIGFuIGluc3RhbmNlIG9mIFdlYkdMQ3ViZVJlbmRlclRhcmdldCBhcyB0aGlyZCBwYXJhbWV0ZXIuIik7dGhpcy5yZW5kZXJUYXJnZXQ9bjtjb25zdCBpPW5ldyByNnQobzZ0LDEsdCxlKTtpLmxheWVycz10aGlzLmxheWVycyxpLnVwLnNldCgwLC0xLDApLGkubG9va0F0KG5ldyBINXQoMSwwLDApKSx0aGlzLmFkZChpKTtjb25zdCByPW5ldyByNnQobzZ0LDEsdCxlKTtyLmxheWVycz10aGlzLmxheWVycyxyLnVwLnNldCgwLC0xLDApLHIubG9va0F0KG5ldyBINXQoLTEsMCwwKSksdGhpcy5hZGQocik7Y29uc3Qgbz1uZXcgcjZ0KG82dCwxLHQsZSk7by5sYXllcnM9dGhpcy5sYXllcnMsby51cC5zZXQoMCwwLDEpLG8ubG9va0F0KG5ldyBINXQoMCwxLDApKSx0aGlzLmFkZChvKTtjb25zdCBhPW5ldyByNnQobzZ0LDEsdCxlKTthLmxheWVycz10aGlzLmxheWVycyxhLnVwLnNldCgwLDAsLTEpLGEubG9va0F0KG5ldyBINXQoMCwtMSwwKSksdGhpcy5hZGQoYSk7Y29uc3Qgcz1uZXcgcjZ0KG82dCwxLHQsZSk7cy5sYXllcnM9dGhpcy5sYXllcnMscy51cC5zZXQoMCwtMSwwKSxzLmxvb2tBdChuZXcgSDV0KDAsMCwxKSksdGhpcy5hZGQocyk7Y29uc3QgbD1uZXcgcjZ0KG82dCwxLHQsZSk7bC5sYXllcnM9dGhpcy5sYXllcnMsbC51cC5zZXQoMCwtMSwwKSxsLmxvb2tBdChuZXcgSDV0KDAsMCwtMSkpLHRoaXMuYWRkKGwpfXVwZGF0ZSh0LGUpe251bGw9PT10aGlzLnBhcmVudCYmdGhpcy51cGRhdGVNYXRyaXhXb3JsZCgpO2NvbnN0IG49dGhpcy5yZW5kZXJUYXJnZXQsW2kscixvLGEscyxsXT10aGlzLmNoaWxkcmVuLGM9dC54ci5lbmFibGVkLHU9dC5nZXRSZW5kZXJUYXJnZXQoKTt0LnhyLmVuYWJsZWQ9ITE7Y29uc3QgaD1uLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzO24udGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHM9ITEsdC5zZXRSZW5kZXJUYXJnZXQobiwwKSx0LnJlbmRlcihlLGkpLHQuc2V0UmVuZGVyVGFyZ2V0KG4sMSksdC5yZW5kZXIoZSxyKSx0LnNldFJlbmRlclRhcmdldChuLDIpLHQucmVuZGVyKGUsbyksdC5zZXRSZW5kZXJUYXJnZXQobiwzKSx0LnJlbmRlcihlLGEpLHQuc2V0UmVuZGVyVGFyZ2V0KG4sNCksdC5yZW5kZXIoZSxzKSxuLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzPWgsdC5zZXRSZW5kZXJUYXJnZXQobiw1KSx0LnJlbmRlcihlLGwpLHQuc2V0UmVuZGVyVGFyZ2V0KHUpLHQueHIuZW5hYmxlZD1jfX1jbGFzcyBzNnQgZXh0ZW5kcyBONXR7Y29uc3RydWN0b3IodCxlLG4saSxyLG8sYSxzLGwsYyl7c3VwZXIodD12b2lkIDAhPT10P3Q6W10sZT12b2lkIDAhPT1lP2U6ZTJ0LG4saSxyLG8sYT12b2lkIDAhPT1hP2E6dzJ0LHMsbCxjKSx0aGlzLmZsaXBZPSExfWdldCBpbWFnZXMoKXtyZXR1cm4gdGhpcy5pbWFnZX1zZXQgaW1hZ2VzKHQpe3RoaXMuaW1hZ2U9dH19czZ0LnByb3RvdHlwZS5pc0N1YmVUZXh0dXJlPSEwO2NsYXNzIGw2dCBleHRlbmRzIE81dHtjb25zdHJ1Y3Rvcih0LGUsbil7TnVtYmVyLmlzSW50ZWdlcihlKSYmKGNvbnNvbGUud2FybigiVEhSRUUuV2ViR0xDdWJlUmVuZGVyVGFyZ2V0OiBjb25zdHJ1Y3RvciBzaWduYXR1cmUgaXMgbm93IFdlYkdMQ3ViZVJlbmRlclRhcmdldCggc2l6ZSwgb3B0aW9ucyApIiksZT1uKSxzdXBlcih0LHQsZSksdGhpcy50ZXh0dXJlPW5ldyBzNnQodm9pZCAwLChlPWV8fHt9KS5tYXBwaW5nLGUud3JhcFMsZS53cmFwVCxlLm1hZ0ZpbHRlcixlLm1pbkZpbHRlcixlLmZvcm1hdCxlLnR5cGUsZS5hbmlzb3Ryb3B5LGUuZW5jb2RpbmcpLHRoaXMudGV4dHVyZS5pc1JlbmRlclRhcmdldFRleHR1cmU9ITAsdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz12b2lkIDAhPT1lLmdlbmVyYXRlTWlwbWFwcyYmZS5nZW5lcmF0ZU1pcG1hcHMsdGhpcy50ZXh0dXJlLm1pbkZpbHRlcj12b2lkIDAhPT1lLm1pbkZpbHRlcj9lLm1pbkZpbHRlcjpwMnQsdGhpcy50ZXh0dXJlLl9uZWVkc0ZsaXBFbnZNYXA9ITF9ZnJvbUVxdWlyZWN0YW5ndWxhclRleHR1cmUodCxlKXt0aGlzLnRleHR1cmUudHlwZT1lLnR5cGUsdGhpcy50ZXh0dXJlLmZvcm1hdD1TMnQsdGhpcy50ZXh0dXJlLmVuY29kaW5nPWUuZW5jb2RpbmcsdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcz1lLmdlbmVyYXRlTWlwbWFwcyx0aGlzLnRleHR1cmUubWluRmlsdGVyPWUubWluRmlsdGVyLHRoaXMudGV4dHVyZS5tYWdGaWx0ZXI9ZS5tYWdGaWx0ZXI7Y29uc3Qgbj17dW5pZm9ybXM6e3RFcXVpcmVjdDp7dmFs