Find this useful? Enter your email to receive occasional updates for securing PHP code.

Signing you up...

Thank you for signing up!

PHP Decode

<?php $_F=__FILE__;$_C1767279132='Pz48P0RoRA0KDQovKioNCiAqIG5OSCBxIFhxcmcgWk5VQnEgbnFkZE5Q..

Decoded Output download

?><?php

/**
 * Get a Easy Media Gallery Global Functions
 *
 * @param string $name The option name
 * @return object|bool Option value on success, false if no value exists
 */

if ( ! defined( 'ABSPATH' ) ) {
    die( 'Please do not load this file directly.' );
}

/*
|--------------------------------------------------------------------------
| Easymedia Get Control Panel Options
|--------------------------------------------------------------------------
 */
function easy_get_option( $name )
{
    $easymedia_values = get_option( 'easy_media_opt' );

    if ( is_array( $easymedia_values ) && array_key_exists( $name, $easymedia_values ) ) {
        return $easymedia_values[$name];
    }

    return false;
}

/*-------------------------------------------------------------------------------*/
/*   ADMIN Register JS & CSS
/*-------------------------------------------------------------------------------*/
function easymedia_reg_script()
{

    $is_rtl = ( is_rtl() ? '-rtl' : '' );

    // CSS ( emg-settings.php, tinymce-dlg.php, metaboxes.php )
    wp_register_style( 'easymedia-cpstyles', plugins_url( 'css/funcstyle'.$is_rtl.'.css', dirname( 'index.php' ) ), false, EASYMEDIA_VERSION, 'all' );
    wp_register_style( 'easymedia-colorpickercss', plugins_url( 'css/colorpicker.css', dirname( 'index.php' ) ), false, EASYMEDIA_VERSION );
    wp_register_style( 'easymedia-sldr', plugins_url( 'css/slider.css', dirname( 'index.php' ) ), false, EASYMEDIA_VERSION );
    wp_register_style( 'easymedia-ibutton', plugins_url( 'css/ibutton.css', dirname( 'index.php' ) ), false, EASYMEDIA_VERSION );
    wp_register_style( 'easymedia-tinymce', plugins_url( 'css/tinymce'.$is_rtl.'.css', dirname( 'index.php' ) ), false, EASYMEDIA_VERSION );
    wp_register_style( 'jquery-ui-themes-redmond', plugins_url( 'css/jquery/jquery-ui/themes/smoothness/jquery-ui-1.10.0.custom.min'.$is_rtl.'.css', dirname( 'index.php' ) ), false, EASYMEDIA_VERSION );
    wp_register_style( 'jquery-multiselect-css', plugins_url( 'css/jquery/multiselect/jquery.multiselect'.$is_rtl.'.css', dirname( 'index.php' ) ), false, EASYMEDIA_VERSION );
    wp_register_style( 'jquery-messi-css', plugins_url( 'css/messi.css', dirname( 'index.php' ) ), false, EASYMEDIA_VERSION );
    wp_register_style( 'jquery-lightbox-css', plugins_url( 'css/lightbox_me.css', dirname( 'index.php' ) ), false, EASYMEDIA_VERSION );
    wp_register_style( 'jquery-gdakramttip-css', plugins_url( 'css/jquery/jquery.tooltip/jquery.tooltip.css', dirname( 'index.php' ) ), false, EASYMEDIA_VERSION );

    // JS ( emg-settings.php )
    wp_register_script( 'easymedia-jquery-easing', plugins_url( 'js/jquery/jquery.easing.js', dirname( 'index.php' ) ) );
    wp_register_script( 'easymedia-colorpicker', plugins_url( 'js/colorpicker/colorpicker.js', dirname( 'index.php' ) ) );
    wp_register_script( 'colorpicker-eye', plugins_url( 'js/colorpicker/eye.js', dirname( 'index.php' ) ) );
    wp_register_script( 'colorpicker-utils', plugins_url( 'js/colorpicker/utils.js', dirname( 'index.php' ) ) );

    // JS ( tinymce-dlg.php )
    wp_register_script( 'jquery-multi-sel', plugins_url( 'js/jquery/multiselect/jquery.multiselect.js', dirname( 'index.php' ) ) );

    // JS ( metaboxes.php, )
    wp_register_script( 'jquery-multi-sel', plugins_url( 'js/jquery/multiselect/jquery.multiselect.js', dirname( 'index.php' ) ) );
    wp_register_script( 'easymedia-ckeditor', plugins_url( 'addons/ckeditor/ckeditor.js', dirname( 'index.php' ) ) );
    wp_register_script( 'jquery-messi-js', plugins_url( 'js/jquery/jquery.messi.min.js', dirname( 'index.php' ) ) );
    wp_register_script( 'jquery-lightbox-js', plugins_url( 'js/jquery/jquery.lightbox_me.js', dirname( 'index.php' ) ) );
    wp_register_script( 'jquery-gdakram-tooltip', plugins_url( 'js/jquery/jquery.tooltip.js', dirname( 'index.php' ) ) );
    wp_register_style( 'jquery-spagination-css', plugins_url( 'css/jquery/simplepagination/simplePagination.css', dirname( 'index.php' ) ) );
    wp_register_script( 'jquery-spagination-js', plugins_url( 'js/jquery/simplepagination/jquery.simplePagination.js', dirname( 'index.php' ) ) );
    wp_register_script( 'jquery-notify-js', plugins_url( 'js/jquery/notify.min.js', dirname( 'index.php' ) ) );
    wp_register_script( 'jquery-validate-js', plugins_url( 'js/jquery/jquery.validate.min.js', dirname( 'index.php' ) ) );

}

add_action( 'admin_init', 'easymedia_reg_script' );

function easymedia_frontend_js()
{

    wp_register_script( 'mootools-core', plugins_url( 'js/mootools/mootools-'.easy_get_option( 'easymedia_plugin_core' ).'.js', dirname( 'index.php' ) ), array(), EASYMEDIA_VERSION, true );
    wp_register_script( 'easymedia-core', plugins_url( 'js/mootools/easymedia.js', dirname( 'index.php' ) ), array(), EASYMEDIA_VERSION, true );
    wp_register_script( 'easymedia-mediaelementjs', EMGDEF_PLUGIN_URL.'includes/addons/mediaelement/mediaelement-and-player.min.js', array(), EASYMEDIA_VERSION, true );
    wp_register_script( 'easymedia-isotope', plugins_url( 'js/jquery/jquery.isotope.min.js', dirname( 'index.php' ) ), array(), EASYMEDIA_VERSION, true );
    wp_register_script( 'easymedia-ajaxfrontend', plugins_url( 'js/func/ajax-frontend.js', dirname( 'index.php' ) ), array(), EASYMEDIA_VERSION, false );
    wp_register_script( 'easymedia-frontend', plugins_url( 'js/func/frontend.js', dirname( 'index.php' ) ), array(), EASYMEDIA_VERSION, false );
    wp_register_script( 'easymedia-jpages', plugins_url( 'js/jquery/jPages.js', dirname( 'index.php' ) ), array(), EASYMEDIA_VERSION, true );
    wp_register_script( 'easymedia-lazy', plugins_url( 'js/jquery/jquery.lazy.min.js', dirname( 'index.php' ) ), array(), EASYMEDIA_VERSION, true );

    //3rd party's Lightbox
    wp_register_script( 'easymedia-jquery-front-easing', plugins_url( 'js/jquery/jquery.easing.js', dirname( 'index.php' ) ) );
    wp_register_script( 'easymedia-colorbox', plugins_url( 'js/jquery/frontendlightbox/colorbox/jquery.colorbox-min.js', dirname( 'index.php' ) ), array(), EASYMEDIA_VERSION, true );
    wp_register_script( 'easymedia-lightbox', plugins_url( 'js/jquery/frontendlightbox/lightbox/lightbox.min.js', dirname( 'index.php' ) ), array(), EASYMEDIA_VERSION, true );
    wp_register_script( 'easymedia-fancybox', plugins_url( 'js/jquery/frontendlightbox/fancybox/jquery.fancybox.pack.js', dirname( 'index.php' ) ), array(), EASYMEDIA_VERSION, true );
    wp_register_script( 'easymedia-mousewheel', plugins_url( 'js/jquery/jquery.mousewheel-3.0.6.pack.js', dirname( 'index.php' ) ), array(), EASYMEDIA_VERSION, true );
    wp_register_script( 'easymedia-fancybox-buttons', EMGDEF_PLUGIN_URL.'css/styles/fancybox/helpers/jquery.fancybox-buttons.js', array(), EASYMEDIA_VERSION, true );
    wp_register_script( 'easymedia-fancybox-media', EMGDEF_PLUGIN_URL.'css/styles/fancybox/helpers/jquery.fancybox-media.js', array(), EASYMEDIA_VERSION, true );
    wp_register_script( 'easymedia-fancybox-thumbs', EMGDEF_PLUGIN_URL.'css/styles/fancybox/helpers/jquery.fancybox-thumbs.js', array(), EASYMEDIA_VERSION, true );
    wp_register_script( 'easymedia-prettyphoto', plugins_url( 'js/jquery/frontendlightbox/prettyphoto/jquery.prettyPhoto.js', dirname( 'index.php' ) ), array(), EASYMEDIA_VERSION, true );
    wp_register_script( 'easymedia-fancyboxfree-mousewheel', plugins_url( 'js/jquery/frontendlightbox/fancyboxfree/jquery.mousewheel-3.0.4.pack.js', dirname( 'index.php' ) ), array(), EASYMEDIA_VERSION, true );
    wp_register_script( 'easymedia-fancyboxfree-fancybox', plugins_url( 'js/jquery/frontendlightbox/fancyboxfree/jquery.fancybox-1.3.4.pack.js', dirname( 'index.php' ) ), array(), EASYMEDIA_VERSION, true );
    wp_register_script( 'easymedia-photoswipe', plugins_url( 'js/jquery/frontendlightbox/photoswipe/code.photoswipe.jquery-3.0.5.min.js', dirname( 'index.php' ) ) );
    wp_register_script( 'easymedia-klass', plugins_url( 'js/jquery/frontendlightbox/photoswipe/lib/klass.min.js', dirname( 'index.php' ) ) );
    wp_register_script( 'easymedia-jssor-core', plugins_url( 'js/jquery/jssor/jssor.core.js', dirname( 'index.php' ) ) );
    wp_register_script( 'easymedia-jssor-utils', plugins_url( 'js/jquery/jssor/jssor.utils.js', dirname( 'index.php' ) ) );
    wp_register_script( 'easymedia-jssor-slider', plugins_url( 'js/jquery/jssor/jssor.slider.min.js', dirname( 'index.php' ) ) );
    wp_register_script( 'easymedia-photobox', plugins_url( 'js/jquery/frontendlightbox/photobox/jquery.photobox.js', dirname( 'index.php' ) ), array(), EASYMEDIA_VERSION, true );
    wp_register_script( 'easymedia-flexslider', plugins_url( 'js/jquery/flexslider/jquery.flexslider-min.js', dirname( 'index.php' ) ) );
    wp_register_script( 'easymedia-fotorama', plugins_url( 'js/jquery/fotorama/fotorama.js', dirname( 'index.php' ) ) );
    wp_register_script( 'easymedia-imageloader', plugins_url( 'js/imageloader/imagesloaded.pkgd.js', dirname( 'index.php' ) ) );

}

add_action( 'wp_enqueue_scripts', 'easymedia_frontend_js' );

/*-------------------------------------------------------------------------------*/
/*   Hover Style Generator @since 1.5.0.3
/*-------------------------------------------------------------------------------*/

function emg_hover_gen( $ishover, $styletype, $title, $subtitle )
{

    $title = esc_attr( $title );
    $ishover = esc_attr( $ishover );
    $styletype = esc_attr( $styletype );
    $subtitle = esc_attr( $subtitle );

    if ( $ishover == '1' ) {

        switch ( $styletype ) {

            case 'hoverone':
                $tmbstyle = '<article class="da-animate da-slideFromRight"><p class="emgfittext">'.$title.'</p><div class="forspan"><span class="zoom"></span></div></article>';
                break;

            case 'emgview-two':
                $tmbstyle = '<div class="emgmask"><h2 class="emgtitle emgfittext">'.$title.'</h2><p class="emgsubtitle">'.$subtitle.'</p></div>';

                break;

            case 'emgview-three':
                $tmbstyle = '<div class="emgmask"><h2 class="emgtitle emgfittext">'.$title.'</h2><p class="emgsubtitle">'.$subtitle.'</p></div>';

                break;

            case 'emgview-four':
                $tmbstyle = '<h2 class="emgttl emgfittext">'.$title.'</h2>';

                break;

            default:
                break;
        }

    } else {
        $tmbstyle = '<p class="da-animatenh emgfittext" style="display:none;">'.$title.'</p><div class="forspana"><span class="zooma"></span></div>';
    }

    return $tmbstyle;

}

/*-------------------------------------------------------------------------------*/
/*   Album Generator @since 1.5.0.3
/*-------------------------------------------------------------------------------*/

function emg_lightbox_image_album_generator( $lgtype, $lgw, $lgh, $lgcls, $lgmeidfilter, $lgisrc, $lgalt, $lgcstyle, $lgrel, $lgttl, $rndm, $hovornor, $medtype, $isbadge, $imgcount, $sorn, $thumbstyle, $alid, $islazy, $lazplc )
{

    if ( ! isset( $lgttl ) || $lgttl == null || $lgttl == '' ) {
        $lgttl = null;
    }

    $isgallinfo = get_post_meta( $alid, 'easmedia_metabox_media_gallery_opt2', true );

    if ( $isgallinfo == 'on' ) {
        $imginfo = get_post( $alid );
        $ittl    = stripslashes( esc_html( esc_js( $imginfo->post_title ) ) );
        $isbbttl = stripslashes( esc_html( esc_js( $imginfo->post_excerpt ) ) );
    } else {
        $ittl    = stripslashes( get_post_meta( $alid, 'easmedia_metabox_title', true ) );
        $isbbttl = stripslashes( get_post_meta( $alid, 'easmedia_metabox_sub_title', true ) );
    }

    if ( $isbadge == '1' && $medtype == 'Multiple Images (Slider)' ) {
        $addbadge = '<span class="emg-badges"><span class="icount">'.$imgcount.'</span><span class="imgtg">'.$sorn.'</span></span>';
    } else {
        $addbadge = '';
    }

    echo '<div data-emg-child="'.$imgcount.'" data-emg-album="'.$alid.'" style="width:'.$lgw.'px; height:'.$lgh.'px;" class="'.$lgcls.' '.$thumbstyle.' view da-thumbs preloaderview fltr'.$lgmeidfilter.' justalbum">'.$addbadge.'<div class="iehand"><a onclick="return false;" class="'.$alid.' nofoobox emg_album_cover" href="#"><img class="emglazy" '.$lazplc.' '.$islazy.'="'.$lgisrc.'" alt="'.$lgalt.'" />'.emg_hover_gen( $hovornor, $thumbstyle, $ittl, $isbbttl ).'</a></div></div>';

}

/*-------------------------------------------------------------------------------*/
/*   Lightbox Generator @since 1.5.0.3
/*-------------------------------------------------------------------------------*/
function emg_lightbox_image_grid_generator( $lgtype, $lgw, $lgh, $lgcls, $lgmeid, $lgisrc, $lgalt, $lgcstyle, $pstid, $lgimid, $lgrel, $lgfullpth, $lgttl, $rndm, $hovornor, $thumbstyle, $islazy, $plchldr, $is_redirect = '' )
{

    if ( ! isset( $lgttl ) || $lgttl == null || $lgttl == '' ) {
        $lgttl = null;
    }

    if ( ! isset( $plchldr ) || $plchldr == null || $plchldr == '' ) {
        $lgttl = null;
    }

    $isgallinfo = get_post_meta( $pstid, 'easmedia_metabox_media_gallery_opt2', true );

    if ( $isgallinfo == 'on' ) {
        $imginfo = get_post( $lgimid );
        $ittl    = stripslashes( esc_html( esc_js( $imginfo->post_title ) ) );
        $isbbttl = stripslashes( esc_html( esc_js( $imginfo->post_excerpt ) ) );
    } else {
        $ittl    = stripslashes( get_post_meta( $pstid, 'easmedia_metabox_title', true ) );
        $isbbttl = stripslashes( get_post_meta( $pstid, 'easmedia_metabox_sub_title', true ) );
    }

    if ( $lgalt ) {

        $lgalt = ucwords( str_replace( '-', ' ', $lgalt ) );

    } else {

        $lgalt = 'image gallery';

    }

    if ( is_array( $is_redirect ) && isset( $is_redirect['url'] ) && $is_redirect['url'] != '' ) {
        $is_redirect = ' data-redirect-url="'.esc_attr( $is_redirect['url'] ).'" data-redirect-target="'.esc_attr( $is_redirect['target'] ).'"';
    }
    else {
        $is_redirect = '';
    }

    switch ( $lgtype ) {

        // EMG Lightbox ( Default )
        case 'default':
            echo '<div'.$is_redirect.' style="width:'.$lgw.'px; height:'.$lgh.'px;" class="'.$lgcls.' '.$thumbstyle.' view da-thumbs preloaderview fltr'.$lgmeid.'"><div class="iehand"><a onclick="easyActiveStyleSheet(\''.$lgcstyle.'\');return true;" class="'.$pstid.'-'.$lgimid.' nofoobox" rel="'.$lgrel.'" href="'.$lgfullpth.'"><img '.$plchldr.' class="emglazy" '.$islazy.'="'.$lgisrc.'" alt="'.$lgalt.'" title="'.$lgalt.'"/>'.emg_hover_gen( $hovornor, $thumbstyle, $ittl, $isbbttl ).'</a></div></div>';

            break;

        // FooBox Lightbox
        case 'foobox':

            if ( easymedia_isfoobox() ) {

                if ( class_exists( 'Foobox_Free' ) ) {
                    $isfooboxfree = 'class="wp-image-'.$pstid.'-'.$lgimid.'"';
                } else {
                    $isfooboxfree = '';
                }

                echo '<div'.$is_redirect.' style="width:'.$lgw.'px; height:'.$lgh.'px;" class="'.$lgcls.' '.$thumbstyle.' view da-thumbs preloaderview fltr'.$lgmeid.'"><div class="iehand"><a class="foobox-instance foobox '.$pstid.'-'.$lgimid.'" href="'.$lgfullpth.'" rel="emgfoobox'.$lgmeid.'" title="'.$isbbttl.'"><img '.$plchldr.' class="emglazy" '.$islazy.'="'.$lgisrc.'" alt="'.$ittl.'" '.$isfooboxfree.'/>'.emg_hover_gen( $hovornor, $thumbstyle, $ittl, $isbbttl ).'</a></div></div>';
            } else {
                echo '';
            }

            break;

        // Colorbox Lightbox
        case 'colorbox':
            echo '<div'.$is_redirect.' style="width:'.$lgw.'px; height:'.$lgh.'px;" class="'.$lgcls.' '.$thumbstyle.' view da-thumbs preloaderview fltr'.$lgmeid.'"><div class="iehand"><a class="emg-cbox nofoobox" href="'.$lgfullpth.'" title="'.$ittl.'"><img '.$plchldr.' class="emglazy" '.$islazy.'="'.$lgisrc.'" alt="'.$lgalt.'" />'.emg_hover_gen( $hovornor, $thumbstyle, $ittl, $isbbttl ).'</a></div></div>';

            break;

        // Lightbox2 Lightbox
        case 'lightbox2':
            echo '<div'.$is_redirect.' style="width:'.$lgw.'px; height:'.$lgh.'px;" class="'.$lgcls.' '.$thumbstyle.' view da-thumbs preloaderview fltr'.$lgmeid.'"><div class="iehand"><a class="nofoobox" href="'.$lgfullpth.'" title="'.$isbbttl.'" data-lightbox="mblightbox['.$pstid.']" data-title="'.$ittl.'"><img '.$plchldr.' class="emglazy" '.$islazy.'="'.$lgisrc.'" alt="'.$lgalt.'" />'.emg_hover_gen( $hovornor, $thumbstyle, $ittl, $isbbttl ).'</a></div></div>';

            break;

        // Fancybox Lightbox
        case 'fancybox':
            echo '<div'.$is_redirect.' style="width:'.$lgw.'px; height:'.$lgh.'px;" class="'.$lgcls.' '.$thumbstyle.' view da-thumbs preloaderview fltr'.$lgmeid.'"><div class="iehand"><a data-fancybox-type="image" class="emgfancybox nofoobox fancybox.image fancybox-button" rel="emgfancy-'.$pstid.'" href="'.$lgfullpth.'" title="'.$ittl.'"><img '.$plchldr.' class="emglazy" '.$islazy.'="'.$lgisrc.'" alt="'.$lgalt.'" />'.emg_hover_gen( $hovornor, $thumbstyle, $ittl, $isbbttl ).'</a></div></div>';

            break;

        // Fancybox Free Lightbox
        case 'fancybox_free':
            echo '<div'.$is_redirect.' style="width:'.$lgw.'px; height:'.$lgh.'px;" class="'.$lgcls.' '.$thumbstyle.' view da-thumbs preloaderview fltr'.$lgmeid.'"><div class="iehand"><a class="nofoobox" rel="emgfancyfree" href="'.$lgfullpth.'" title="'.$ittl.'"><img '.$plchldr.' class="emglazy" '.$islazy.'="'.$lgisrc.'" alt="'.$lgalt.'" />'.emg_hover_gen( $hovornor, $thumbstyle, $ittl, $isbbttl ).'</a></div></div>';

            break;

        // PrettyPhoto Lightbox
        case 'prettyphoto':
            echo '<div'.$is_redirect.' style="width:'.$lgw.'px; height:'.$lgh.'px;" class="'.$lgcls.' '.$thumbstyle.' view da-thumbs preloaderview fltr'.$lgmeid.'"><div class="iehand"><a class="nofoobox" rel="emgprettyPhoto[showall]" href="'.$lgfullpth.'" title="'.$ittl.'"><img '.$plchldr.' class="emglazy" '.$islazy.'="'.$lgisrc.'" alt="'.$lgalt.'" />'.emg_hover_gen( $hovornor, $thumbstyle, $ittl, $isbbttl ).'</a></div></div>';

            break;

        // PhotoSwipe Lightbox
        case 'photoswipe':
            echo '<div'.$is_redirect.' style="width:'.$lgw.'px; height:'.$lgh.'px;" class="'.$lgcls.' '.$thumbstyle.' view da-thumbs preloaderview fltr'.$lgmeid.'"><div class="iehand"><a class="nofoobox" href="'.$lgfullpth.'" title="'.$isbbttl.'"><img '.$plchldr.' class="emglazy" '.$islazy.'="'.$lgisrc.'" alt="'.$ittl.'" />'.emg_hover_gen( $hovornor, $thumbstyle, $ittl, $isbbttl ).'</a></div></div>';

            break;

        // PhotoBox Lightbox
        case 'photobox':
            echo '<div'.$is_redirect.' style="width:'.$lgw.'px; height:'.$lgh.'px;" class="'.$lgcls.' '.$thumbstyle.' view da-thumbs preloaderview fltr'.$lgmeid.'"><div class="iehand"><a class="nofoobox photobox_linker" href="'.$lgfullpth.'" title="'.$isbbttl.'"><img data-photobox-thumb="'.$lgisrc.'" '.$plchldr.' class="emglazy" '.$islazy.'="'.$lgisrc.'" title="'.$ittl.'" />'.emg_hover_gen( $hovornor, $thumbstyle, $ittl, $isbbttl ).'</a></div></div>';

            break;

        // Wordpress ThickBox
        case 'wp_thickbox':
            echo '<div'.$is_redirect.' style="width:'.$lgw.'px; height:'.$lgh.'px;" class="'.$lgcls.' '.$thumbstyle.' view da-thumbs preloaderview fltr'.$lgmeid.'"><div class="iehand"><a class="nofoobox thickbox" rel="emgthickbox" href="'.$lgfullpth.'" title="'.$ittl.'"><img '.$plchldr.' class="emglazy" '.$islazy.'="'.$lgisrc.'" alt="'.$isbbttl.'" />'.emg_hover_gen( $hovornor, $thumbstyle, $ittl, $isbbttl ).'</a></div></div>';

            break;

        default:
            break;
    }

    return;

}

/*-------------------------------------------------------------------------------*/
/*   Lightbox Script Generator @since 1.5.0.3
/*-------------------------------------------------------------------------------*/

function emg_lightbox_script_generator( $lgtype, $isslideauto, $isslideintrvl, $isslideshow = null, $itmsid = null, $mainid = null )
{

    ob_start();

    switch ( $lgtype ) {

        // EMG Lightbox ( Default )
        case 'default':
            echo '<script id="emg-lb-script-'.esc_attr( $mainid ).'" type="text/javascript">
jQuery(document).ready(function() {
		 jQuery( ".emgoption-set li" ).click(function() {
			 elmntsel = jQuery(this).attr("data-option-value");
			 if (elmntsel == "*") {
				jQuery(".iehand a").attr("rel", "easymedia[showall]");
			 } else {
				 jQuery("."+elmntsel.substring(1)+" .iehand a").attr("rel", "easymedia["+elmntsel+"]");
				 }
			 });
		});</script>';

            break;

        // FooBox Lightbox
        case 'foobox':

            echo '<script id="emg-lb-script-'.esc_attr( $mainid ).'" type="text/javascript">
jQuery(document).ready(function() {

(function( FOOBOX, $, undefined ) {
  FOOBOX.init = function() {
    $(".pagwrap-'.$mainid.'").foobox($.extend(true, {}, FOOBOX.o, { alwaysInit: true }));
    $(".foobox, [target=\"foobox\"]").foobox(FOOBOX.o);
  };
}( window.FOOBOX = window.FOOBOX || {}, jQuery ));
FOOBOX.init();
});
</script>';

            break;

        // Colorbox
        case 'colorbox':

            echo '<script id="emg-lb-script-'.esc_attr( $mainid ).'" type="text/javascript">
		jQuery(document).ready(function() {
			jQuery(".emg-cbox").colorbox({
				current: "{current} / {total}",
				rel:\'emg-cbox\',
				returnFocus: false,
				slideshow: '.$isslideauto.',
				slideshowSpeed: '.$isslideintrvl.',
				scrolling: false,
				speed: 500,
				photo: true,
				fadeOut: 500,
				maxWidth: "90%",
				maxHeight: "90%",
				onComplete:function(){
					if(jQuery("#cboxTitle").text().length > 1) {
						jQuery("#cboxTitle").css("width", jQuery(".cboxPhoto").width()-9);
						jQuery("#cboxTitle").hide();
						jQuery("#cboxTitle").fadeIn(500);
						} else {
							jQuery("#cboxTitle").hide();
							}
						}
					});
			});
		</script>';

            break;

        // Lightbox2
        case 'lightbox2':
            echo '<script id="emg-lb-script-'.esc_attr( $mainid ).'" type="text/javascript">
jQuery(document).ready(function() {
		 jQuery( ".emgoption-set li" ).click(function() {
			 elmntsel = jQuery(this).attr("data-option-value");
			 if (elmntsel == "*") {
				jQuery(".iehand a").attr("data-lightbox", "mblightbox[showall]");
			 } else {
				 jQuery("."+elmntsel.substring(1)+" .iehand a").attr("data-lightbox", "mblightbox["+elmntsel+"]");
				 }
			 });
		});</script>';

            break;

        // Fancybox2
        case 'fancybox':
            echo '<script id="emg-lb-script-'.esc_attr( $mainid ).'" type="text/javascript">
jQuery(document).ready(function() {
	jQuery(".emgfancybox").fancybox({
		afterShow: function() {
			jQuery(".fancybox-title-over-wrap").hide();
			setTimeout(function(){
			var imageWidth = jQuery(".fancybox-image").width();
			jQuery(".fancybox-title-over-wrap").css({
				"width": imageWidth,
				"paddingLeft": 0,
				"paddingRight": 0,
				"textAlign": "center"
        });
		jQuery(".fancybox-title-over-wrap").fadeIn("slow");
			}, 100 );
    },
		padding : 0,
		type : "image",
		arrows: false,
		margin: [45, 17, 17, 17],
		mouseWheel: true,
		autoPlay: '.$isslideauto.',
		playSpeed: '.$isslideintrvl.',
		prevEffect: "elastic",
		nextEffect: "elastic",
		closeBtn: false,
		openEffect: "fade",
		openSpeed: "normal",
		closeSpeed: 300,
		helpers : {
			buttons	: {
				position: "bottom"
				},
			title: {
				type: "over"
				}
    }
    });

		 jQuery( ".emgoption-set li" ).click(function() {
			 elmntsel = jQuery(this).attr("data-option-value");
			 if (elmntsel == "*") {
				jQuery(".iehand a").attr("rel", "mblightbox-showall");
			 } else {
				 jQuery("."+elmntsel.substring(1)+" .iehand a").attr("rel", "mblightbox-"+elmntsel+"");
				 }
			 });
		});</script>';

            break;

        // Fancybox Free
        case 'fancybox_free':
            echo '<script id="emg-lb-script-'.esc_attr( $mainid ).'" type="text/javascript">
jQuery(document).ready(function() {
	jQuery(".iehand a[rel=emgfancyfree]").fancybox({
		overlayShow	: true,
		transitionIn	: "elastic",
		transitionOut	: "elastic",
		titlePosition	: "inside"
		});
	});</script>';

            break;

        // PrettyPhoto
        case 'prettyphoto':
            echo '<script id="emg-lb-script-'.esc_attr( $mainid ).'" type="text/javascript">
jQuery(document).ready(function() {
	jQuery("a[rel^=\'emgprettyPhoto[showall]\']").emgPhoto({theme: "emg_default",slideshow:'.$isslideintrvl.', autoplay_slideshow:'.$isslideauto.', social_tools:false,allow_expand: false, deeplinking: false});

		 jQuery( ".emgoption-set li" ).click(function() {
			 elmntsel = jQuery(this).attr("data-option-value");
			 if (elmntsel == "*") {
				jQuery(".iehand a").attr("rel", "emgprettyPhoto[showall]");
			 } else {
				 jQuery("."+elmntsel.substring(1)+" .iehand a").attr("rel", "emgprettyPhoto["+elmntsel+"]");
				 }
			 });
		});</script>';

            break;

        // PhotoSwipe
        case 'photoswipe':
            echo '<script id="emg-lb-script-'.esc_attr( $mainid ).'" type="text/javascript">

		jQuery(document).ready(function($) {

			var emgPhotoSwipe = jQuery(".iehand a").photoSwipe({
				captionAndToolbarAutoHideDelay: false,
                autoStartSlideshow: '.$isslideauto.',
				slideshowDelay: '.$isslideintrvl.',
				slideSpeed: 500,
                captionAndToolbarHide: false,
				nextPreviousSlideSpeed: 500,
				captionAndToolbarOpacity: "0.7"
			});

			var currentoverflowY = $("html").css("overflowY");

			$(emgPhotoSwipe).on(window.Code.PhotoSwipe.EventTypes.onBeforeShow, function(e) {
				if (currentoverflowY) {
					$("html").css({
						overflowY: "hidden"
					});
				}
			});

			$(emgPhotoSwipe).on(window.Code.PhotoSwipe.EventTypes.onHide, function(e) {
				if (currentoverflowY) {
					$("html").css({
						overflowY: currentoverflowY
					});
				}
			});
		});

</script>';

            break;

        // PhotoBox
        case 'photobox':
            echo '<script id="emg-lb-script-'.esc_attr( $mainid ).'" type="text/javascript">
jQuery(document).ready(function() {
	jQuery(".lightbox'.$mainid.'").photobox("a.photobox_linker",{ history: false, time:'.$isslideintrvl.', autoplay:'.$isslideauto.'});
	});</script>';

            break;

        default:
            break;
    }

    $isclean = ob_get_clean();
    echo emg_js_compress( $isclean );

}

/*-------------------------------------------------------------------------------*/
/*   Album Loader (Ajax) @since 1.5.0.3
/*-------------------------------------------------------------------------------*/
function emg__front_ajax_album_loader( $lightbox, $med, $size, $uid, $ipg, $albcont, $zcs = null, $cmode = null, $cc = null, $coversize = null, $order = 'asc' )
{

    ob_start();

    if ( isset( $ipg ) && $ipg ) {
        $ipg = $ipg;
    } else {
        $ipg = '';
    }

    if ( easy_get_option( 'easymedia_disen_lazyload' ) == '1' ) {
        $islz = '1';
    } else {
        $islz = '0';
    }

    echo '<script type="text/javascript">
jQuery(document).ready(function() {

	var mediaid , cimgcount, timeout;

	jQuery(document).on("click",".easycontainer-'.$uid.' .justalbum", function () {
		'.( $lightbox == 'pbox' ? 'jQuery(".lightbox'.$uid.'").photobox("prepareDOM");' : '' ).'
        jQuery("#emg-lb-script-'.esc_attr( $uid ).'").remove();
		jQuery(".isofilcont-'.$uid.' #emgshowall").trigger("click");
		jQuery(".isofilcont-'.$uid.', .pagwrap-'.$uid.'").hide();
		/* jQuery("html,body").animate({scrollTop: parseInt(jQuery(".pagwrap-'.$uid.'").offset().top-50)}, 1000); */
		mediaid = jQuery(this).attr("data-emg-album");
		clearTimeout(timeout);
		jQuery("#isloaderfor-'.$uid.'").fadeIn(500);
		var cmd = "showgallery";
		var thumbnail = "'.$size.'";
		var mainid = "'.$uid.'";
		var cmode = "'.$cmode.'";
		var zcs = "'.$zcs.'";
        var cc = "'.$cc.'";
        var lb = "'.$lightbox.'";
        var order = "'.$order.'";
		var cvrsize = "";
		cimgcount = jQuery(this).attr("data-emg-child");
		timeout = setTimeout(function(){ emg_ajax_album_loader(cmd, lb, mediaid, thumbnail, cimgcount, mainid, cmode, zcs, cc, cvrsize, order); }, 500);
		});


		jQuery(document).on("click","#emgajaxback'.$uid.'", function () {
		'.( $lightbox == 'pbox' ? 'jQuery(".lightbox'.$uid.'").photobox("destroy");' : '' ).'
		/* jQuery("html,body").animate({scrollTop: parseInt(jQuery(".pagwrap-'.$uid.'").offset().top-250)}, 1000); */
		clearTimeout(timeout);
		jQuery("#isloaderfor-'.$uid.'").fadeIn(500);
		jQuery("#emgajaxback'.$uid.'").fadeOut("fast");
		jQuery(".pagwrap-'.$uid.'").hide();
		var cmd = "emgajaxback";
		var mediaid = "'.$med.'";
		var thumbnail = "'.$size.'";
		var mainid = "'.$uid.'";
		var cmode = "'.$cmode.'";
        var lb = "'.$lightbox.'";
		var zcs = "'.$zcs.'";
		var cc = "'.$cc.'";
        var cvrsize = "'.$coversize.'";
        var order = "'.$order.'";
		timeout = setTimeout(function(){ emg_ajax_album_loader(cmd, lb, mediaid, thumbnail, cimgcount, mainid, cmode, zcs, cc, cvrsize, order); }, 500);
		});

		function emg_ajax_album_loader(cmd, lb, mediaid, thumbnail, cimgcount, mainid, cmode, zcs, cc, cvrsize, order) {
				var data = {
				action: "emg_ajax_album_loader",
				security: "'.wp_create_nonce( 'easymedia-pro-nonce' ).'",
				mediaid: mediaid,
				pprse: cmd,
				thumbnail: thumbnail,
				mainid: mainid,
				cmode: cmode,
				zcs: zcs,
				cc: cc,
                lb: lb,
                cvrsize: cvrsize,
                order: order
				};

				jQuery.post("'.admin_url( 'admin-ajax.php' ).'", data, function(response) {
					clearTimeout(timeout);
					jQuery(".pagwrap-'.$uid.'").fadeIn(500);

					switch (cmd) {

						case "showgallery":
						jQuery("#isloaderfor-'.$uid.'").fadeOut("fast");
						jQuery("#emgajaxback'.$uid.'").fadeIn(500);
						var newItems = jQuery(response);
						var removeItem = jQuery(".pagwrap-'.$uid.' .justalbum" );
						jQuery(".easycontainer-'.$uid.'").emgisotope("remove", removeItem);
						jQuery(".easycontainer-'.$uid.'").emgisotope("insert", newItems);
						loadImages(".pagwrap-'.$uid.' .emglazy","'.$uid.'","'.$ipg.'", cimgcount,"'.$islz.'");
						jQuery("html,body").animate({scrollTop: parseInt(jQuery(".pagwrap-'.$uid.'").offset().top-250)}, 1000);
                        InitializeSettings();

						break;

						case "emgajaxback":
						jQuery("#isloaderfor-'.$uid.'").fadeOut(500);
						jQuery(".isofilcont-'.$uid.'").fadeIn(500);
						var newItems = jQuery(response);
						var removeItem = jQuery(".pagwrap-'.$uid.' .view" );
						jQuery(".easycontainer-'.$uid.'").emgisotope("remove", removeItem);
						jQuery(".easycontainer-'.$uid.'").emgisotope("insert", newItems);
						loadImages(".pagwrap-'.$uid.' .emglazy","'.$uid.'","'.$ipg.'", "'.$albcont.'","'.$islz.'");
						jQuery("html,body").animate({scrollTop: parseInt(jQuery(".pagwrap-'.$uid.'").offset().top-250)}, 1000);

						break;

						default:
					}

				});
			}

});
</script>';

    $albumscrpt = ob_get_clean();
    echo emg_js_compress( $albumscrpt );

}

// SLIDER 1 GENERATOR
function emg_image_slider_one_generator( $emgsrc, $emgthumb, $capwidth, $thumbttl )
{

    if ( trim( $thumbttl ) ) {
        $showornot = '';
    } else {
        $showornot = 'display: none !important;';
    }

    echo '<div>
    <img u="image" src2="'.$emgsrc.'" />
                <div class="emgslidercap" u="caption" t="MCLIP|B" style="'.$showornot.' position: absolute; top: 0px; left: 0px;
                    width: '.$capwidth.'px; height: 25px;">
                    <div style="position: absolute; top: 0px; left: 0px; width: '.$capwidth.'px; height: 25px;
                        background-color: Black; opacity: 0.1; filter: alpha(opacity=10);">
                    </div>
                    <div style="position: absolute; top: 0px; left: 0px; width: '.$capwidth.'px; height: 25px;
                        color: White; font-size: 14px; font-weight: bold; line-height: 25px; text-align: center;">
                        '.$thumbttl.'
                    </div>
                </div>
    <img u="thumb" src="'.$emgthumb.'" />
    </div>';

}

// SLIDER 1 SCRIPT GENERATOR
function emg_slider_one_script_generator( $isslideauto, $isslideintrvl, $imwidth, $imheight, $uniqueid )
{

    echo '<script type="text/javascript">jQuery(document).ready(function(){
			jQuery("#isloaderfor-'.$uniqueid.'").fadeOut(1000, function (){
				jQuery(".pagwrap-'.$uniqueid.'").fadeIn(500);
				});
				function r(){var e=n.$Elmt.parentNode.clientWidth;if(e)n.$SetScaleWidth(Math.min(e,'.$imwidth.'));else window.setTimeout(r,30)}var e=[];e["MCLIP|B"]={$Duration:600,$Clip:4,$Move:true,$Easing:$JssorEasing$.$EaseOutExpo};var t={$FillMode:4,$LazyLoading:2,$AutoPlay:'.$isslideauto.',$AutoPlaySteps:1,$AutoPlayInterval:'.$isslideintrvl.',$PauseOnHover:0,$ArrowKeyNavigation:true,$SlideDuration:500,$MinDragOffsetToSlide:20,$SlideWidth:'.$imwidth.',$SlideHeight:'.$imheight.',$SlideSpacing:0,$DisplayPieces:1,$ParkingPosition:0,$UISearchMode:1,$PlayOrientation:1,$DragOrientation:3,$ArrowNavigatorOptions:{$Class:$JssorArrowNavigator$,$ChanceToShow:1,$Steps:1},$ThumbnailNavigatorOptions:{$Class:$JssorThumbnailNavigator$,$ChanceToShow:2,$ActionMode:1,$AutoCenter:3,$Lanes:1,$SpacingX:3,$SpacingY:3,$DisplayPieces:9,$ParkingPosition:260,$Orientation:1,$DisableDrag:false},$CaptionSliderOptions:{$Class:$JssorCaptionSlider$,$CaptionTransitions:e,$PlayInMode:1,$PlayOutMode:3}};var n=new $JssorSlider$("slider1_container-'.$uniqueid.'",t);r();if(!navigator.userAgent.match(/(iPhone|iPod|iPad|BlackBerry|IEMobile)/)){jQuery(window).bind("resize",r)}})</script>';

}

// SLIDER 2 GENERATOR
function emg_image_slider_two_generator( $emgsrc, $emgthumb, $capwidth, $thumbttl )
{

    if ( trim( $thumbttl ) ) {
        $showornot = '';
    } else {
        $showornot = 'display: none !important;';
    }

    echo '<div>
    <img u="image" src2="'.$emgsrc.'" />
                <div class="emgslidercap" u="caption" t="MCLIP|B" style="'.$showornot.' position: absolute; top: 0px; left: 0px;
                    width: '.$capwidth.'px; height: 25px;">
                    <div style="position: absolute; top: 0px; left: 0px; width: '.$capwidth.'px; height: 25px;
                        background-color: Black; opacity: 0.1; filter: alpha(opacity=10);">
                    </div>
                    <div style="position: absolute; top: 0px; left: 0px; width: '.$capwidth.'px; height: 25px;
                        color: White; font-size: 14px; font-weight: bold; line-height: 25px; text-align: center;">
                        '.$thumbttl.'
                    </div>
                </div>
    <img u="thumb" src="'.$emgthumb.'" />
    </div>';

}

// SLIDER 2 SCRIPT GENERATOR
function emg_slider_two_script_generator( $isslideauto, $isslideintrvl, $imwidth, $imheight, $uniqueid )
{

    echo '<script type="text/javascript">jQuery(document).ready(function(){
				jQuery("#isloaderfor-'.$uniqueid.'").fadeOut(1000, function () {
				jQuery(".pagwrap-'.$uniqueid.'").fadeIn(500);
				});
			function i(){var e=r.$Elmt.parentNode.clientWidth;if(e)r.$SetScaleWidth(Math.max(Math.min(e,'.$imwidth.'),300));else window.setTimeout(i,30)}var e=[];e["MCLIP|B"]={$Duration:600,$Clip:4,$Move:true,$Easing:$JssorEasing$.$EaseOutExpo};var t=[{$Duration:1200,$Zoom:1,$Easing:{$Zoom:$JssorEasing$.$EaseInCubic,$Opacity:$JssorEasing$.$EaseOutQuad},$Opacity:2},{$Duration:1e3,$Zoom:2,$SlideOut:true,$Easing:{$Zoom:$JssorEasing$.$EaseInExpo,$Opacity:$JssorEasing$.$EaseLinear},$Opacity:2},{$Duration:1200,$Zoom:1,$Rotate:true,$During:{$Zoom:[.2,.8],$Rotate:[.2,.8]},$Easing:{$Zoom:$JssorEasing$.$EaseSwing,$Opacity:$JssorEasing$.$EaseLinear,$Rotate:$JssorEasing$.$EaseSwing},$Opacity:2,$Round:{$Rotate:.5}},{$Duration:1e3,$Zoom:2,$Rotate:true,$SlideOut:true,$Easing:{$Zoom:$JssorEasing$.$EaseInExpo,$Opacity:$JssorEasing$.$EaseLinear,$Rotate:$JssorEasing$.$EaseInExpo},$Opacity:2,$Round:{$Rotate:.8}},{$Duration:1200,$Cols:2,$Zoom:1,$FlyDirection:1,$Assembly:2049,$ChessMode:{$Column:15},$Easing:{$Left:$JssorEasing$.$EaseInCubic,$Zoom:$JssorEasing$.$EaseInCubic,$Opacity:$JssorEasing$.$EaseLinear},$ScaleHorizontal:.5,$Opacity:2},{$Duration:1200,$Cols:2,$Zoom:2,$SlideOut:true,$FlyDirection:1,$Assembly:2049,$ChessMode:{$Column:15},$Easing:{$Left:$JssorEasing$.$EaseInExpo,$Zoom:$JssorEasing$.$EaseInExpo,$Opacity:$JssorEasing$.$EaseLinear},$ScaleHorizontal:4,$Opacity:2},{$Duration:1200,$Zoom:1,$Rotate:true,$During:{$Left:[.2,.8],$Zoom:[.2,.8],$Rotate:[.2,.8]},$FlyDirection:1,$Easing:{$Left:$JssorEasing$.$EaseSwing,$Zoom:$JssorEasing$.$EaseSwing,$Opacity:$JssorEasing$.$EaseLinear,$Rotate:$JssorEasing$.$EaseSwing},$ScaleHorizontal:.6,$Opacity:2,$Round:{$Rotate:.5}},{$Duration:1e3,$Zoom:2,$Rotate:true,$SlideOut:true,$FlyDirection:2,$Easing:{$Left:$JssorEasing$.$EaseInExpo,$Zoom:$JssorEasing$.$EaseInExpo,$Opacity:$JssorEasing$.$EaseLinear,$Rotate:$JssorEasing$.$EaseInExpo},$ScaleHorizontal:4,$Opacity:2,$Round:{$Rotate:.8}},{$Duration:1200,$Zoom:1,$Rotate:true,$During:{$Left:[.2,.8],$Zoom:[.2,.8],$Rotate:[.2,.8]},$FlyDirection:2,$Easing:{$Left:$JssorEasing$.$EaseSwing,$Zoom:$JssorEasing$.$EaseSwing,$Opacity:$JssorEasing$.$EaseLinear,$Rotate:$JssorEasing$.$EaseSwing},$ScaleHorizontal:.6,$Opacity:2,$Round:{$Rotate:.5}},{$Duration:1e3,$Zoom:2,$Rotate:true,$SlideOut:true,$FlyDirection:1,$Easing:{$Left:$JssorEasing$.$EaseInExpo,$Zoom:$JssorEasing$.$EaseInExpo,$Opacity:$JssorEasing$.$EaseLinear,$Rotate:$JssorEasing$.$EaseInExpo},$ScaleHorizontal:4,$Opacity:2,$Round:{$Rotate:.8}},{$Duration:1200,$Cols:2,$Zoom:1,$Rotate:true,$FlyDirection:5,$Assembly:2049,$ChessMode:{$Column:15},$Easing:{$Left:$JssorEasing$.$EaseInCubic,$Top:$JssorEasing$.$EaseInCubic,$Zoom:$JssorEasing$.$EaseInCubic,$Opacity:$JssorEasing$.$EaseOutQuad,$Rotate:$JssorEasing$.$EaseInCubic},$ScaleHorizontal:.5,$ScaleVertical:.3,$Opacity:2,$Round:{$Rotate:.7}},{$Duration:1e3,$Cols:2,$Zoom:1,$Rotate:true,$SlideOut:true,$FlyDirection:5,$Assembly:2049,$ChessMode:{$Column:15},$Easing:{$Left:$JssorEasing$.$EaseInExpo,$Top:$JssorEasing$.$EaseInExpo,$Zoom:$JssorEasing$.$EaseInExpo,$Opacity:$JssorEasing$.$EaseLinear,$Rotate:$JssorEasing$.$EaseInExpo},$ScaleHorizontal:.5,$ScaleVertical:.3,$Opacity:2,$Round:{$Rotate:.7}},{$Duration:1200,$Rows:2,$Zoom:2,$Rotate:true,$FlyDirection:6,$Assembly:2049,$ChessMode:{$Row:28},$Easing:{$Left:$JssorEasing$.$EaseInCubic,$Top:$JssorEasing$.$EaseInCubic,$Zoom:$JssorEasing$.$EaseInCubic,$Opacity:$JssorEasing$.$EaseOutQuad,$Rotate:$JssorEasing$.$EaseInCubic},$ScaleHorizontal:4,$ScaleVertical:2,$Opacity:2,$Round:{$Rotate:.7}},{$Duration:1200,$Cols:2,$Zoom:2,$Rotate:true,$FlyDirection:5,$Assembly:2049,$ChessMode:{$Column:19},$Easing:{$Left:$JssorEasing$.$EaseInCubic,$Top:$JssorEasing$.$EaseInCubic,$Zoom:$JssorEasing$.$EaseInCubic,$Opacity:$JssorEasing$.$EaseOutQuad,$Rotate:$JssorEasing$.$EaseInCubic},$ScaleHorizontal:1,$ScaleVertical:2,$Opacity:2,$Round:{$Rotate:.8}}];var n={$AutoPlay:'.$isslideauto.',$AutoPlayInterval:'.$isslideintrvl.',$PauseOnHover:3,$LazyLoading:2,$DragOrientation:3,$ArrowKeyNavigation:true,$SlideDuration:600,$SlideshowOptions:{$Class:$JssorSlideshowRunner$,$Transitions:t,$TransitionsOrder:1,$ShowLink:true},$ArrowNavigatorOptions:{$Class:$JssorArrowNavigator$,$ChanceToShow:1,$AutoCenter:2,$Steps:1},$ThumbnailNavigatorOptions:{$Class:$JssorThumbnailNavigator$,$ChanceToShow:2,$ActionMode:1,$Lanes:2,$SpacingX:14,$SpacingY:12,$DisplayPieces:5,$ParkingPosition:156,$Orientation:2},$CaptionSliderOptions:{$Class:$JssorCaptionSlider$,$CaptionTransitions:e,$PlayInMode:1,$PlayOutMode:3}};var r=new $JssorSlider$("slider2_container-'.$uniqueid.'",n);i();if(!navigator.userAgent.match(/(iPhone|iPod|iPad|BlackBerry|IEMobile)/)){jQuery(window).bind("resize",i)}})</script>';

}

// Carousel GENERATOR
function emg_carousel_generator( $emgsrc, $emgthumb, $width, $thumbttl, $full )
{

    echo '<li class="emg-carousel"><a href="'.$full.'" title="'.$thumbttl.'" rel="emgprettyPhoto[showall]"><img title="'.$thumbttl.'" class="emgcarousel" src="'.$emgthumb.'" />'.( $thumbttl ? '<p class="flex-caption">'.$thumbttl.'</p>' : '' ).'</a></li>';

}

// Carousel SCRIPT GENERATOR
function emg_carousel_script_generator( $isslideauto, $isslideintrvl, $imwidth, $imheight, $elementid, $easingeffect, $title, $uniqueid, $maxslides )
{

    echo '<script type="text/javascript">

	jQuery(document).ready(function() {

        jQuery("#isloaderfor-'.$uniqueid.'").fadeOut(250, function () {

            jQuery(".pagwrap-'.$uniqueid.'").fadeIn(150);

            jQuery(".flexslider-'.$elementid.'").flexslider({
				animation: "slide",
                animationSpeed: 600,
                slideshowSpeed: '.$isslideintrvl.',
                itemMargin: 10,
                useCSS: false,
                itemWidth: '.$imwidth.',
                maxItems: '.$maxslides.',
				easing: "'.$easingeffect.'",
				slideshow: '.$isslideauto.',
				smoothHeight: false,
				pauseOnHover: true,
				controlNav: false,
				prevText: "",
				nextText: ""
			});

        });

        jQuery("a[rel^=\'emgprettyPhoto[showall]\']").emgPhoto({theme: "emg_default", allow_expand: false, deeplinking: false, slideshow:'.$isslideintrvl.'000, autoplay_slideshow:'.$isslideauto.', social_tools:false});

	});

</script>';

}

// Fotorama GENERATOR
function emg_fotorama_generator( $emgsrc, $emgthumb, $width, $thumbttl, $caption )
{

    echo '<a '.$caption.' href="'.$emgsrc.'" data-thumb="'.$emgthumb.'"></a>'; // with Lazy Load

}

function emg_ajax_album_loader()
{

    check_ajax_referer( 'easymedia-pro-nonce', 'security' );

    if ( ! isset( $_POST['mediaid'] ) || ! isset( $_POST['pprse'] ) || ! isset( $_POST['mainid'] ) ) {

        echo '<div class="view"><img src="'.plugins_url( 'images/ajax-loader.gif', 'index.php' ).'" width="32" height="32"/></div>';
        die;
    } else {

        switch ( $_POST['pprse'] ) {
            case 'showgallery':

                require_once EMGDEF_PLUGIN_DIR.'includes/templates/ajax-album.php';

                echo emg_album_img_list( trim( $_POST['mediaid'] ), trim( $_POST['lb'] ), trim( $_POST['thumbnail'] ), trim( $_POST['mainid'] ), trim( $_POST['zcs'] ), trim( $_POST['cmode'] ), trim( $_POST['cc'] ), trim( $_POST['order'] ) );
                wp_die();
                break;

            case 'emgajaxback':

                require_once EMGDEF_PLUGIN_DIR.'includes/templates/emg-album-back.php';

                echo emg_albums_back( trim( $_POST['mediaid'] ), trim( $_POST['lb'] ), trim( $_POST['thumbnail'] ), trim( $_POST['mainid'] ), trim( $_POST['zcs'] ), trim( $_POST['cmode'] ), trim( $_POST['cc'] ), trim( $_POST['cvrsize'] ), trim( $_POST['order'] ) );
                wp_die();
                break;

            default:
                break;

        }

    }

}

add_action( 'wp_ajax_nopriv_emg_ajax_album_loader', 'emg_ajax_album_loader' );
add_action( 'wp_ajax_emg_ajax_album_loader', 'emg_ajax_album_loader' );

/*
|--------------------------------------------------------------------------
| AJAX RESET SETTINGS
|--------------------------------------------------------------------------
 */
function emg_cp_reset()
{

    check_ajax_referer( 'easymedia-pro-nonce', 'security' );

    if ( ! isset( $_POST['cmd'] ) ) {
        echo '0';
        die;
    } else {

        if ( $_POST['cmd'] == 'reset' ) {
            echo '1';
            easymedia_restore_to_default( $_POST['cmd'] );
            die;
        }

    }

}

add_action( 'wp_ajax_emg_cp_reset', 'emg_cp_reset' );

/*
|--------------------------------------------------------------------------
| AJAX UPDATE GALLERY
|--------------------------------------------------------------------------
 */
function emg_updt_gall_list()
{

    check_ajax_referer( 'easymedia-nonce', 'security' );

    if ( ! isset( $_POST['pstid'] ) ) {
        echo '<p>Ajax request failed, please refresh your browser window.</p>';
        die;
    } else {
        update_post_meta( $_POST['pstid'], 'easmedia_metabox_media_gallery', '' );
        echo 'No image(s) selected...';
        die;
    }

}

add_action( 'wp_ajax_emg_updt_gall_list', 'emg_updt_gall_list' );

/*
|--------------------------------------------------------------------------
| AJAX DELETE MEDIA IMAGE
|--------------------------------------------------------------------------
 */
function easmedia_img_media_remv()
{

    check_ajax_referer( 'easymedia-nonce', 'security' );

    if ( ! isset( $_POST['pstid'] ) || ! isset( $_POST['type'] ) ) {
        echo '0';
        die;
    } else {

        if ( ! current_user_can( 'edit_theme_options' ) ) {
            die( '-1' );
        }

        if ( $_POST['type'] == 'image' ) {
            $data = $_POST['pstid'];
            update_post_meta( $data, 'easmedia_metabox_img', '' );
            echo '1';
            die;
        } elseif ( $_POST['type'] == 'audio' ) {
            $data = $_POST['pstid'];
            update_post_meta( $data, 'easmedia_metabox_media_audio', '' );
            echo '1';
            die;
        }

    }

}

add_action( 'wp_ajax_easmedia_img_media_remv', 'easmedia_img_media_remv' );

/*
|--------------------------------------------------------------------------
| AJAX LOAD IMAGE DETAILS
|--------------------------------------------------------------------------
 */
function easmedia_img_dtl()
{

    check_ajax_referer( 'easymedia-nonce', 'security' );

    if ( ! isset( $_POST['imgid'] ) ) {
        echo '0';
        die;
    } else {

        $img_info = get_post( $_POST['imgid'] );
        $ttl      = $img_info->post_title;
        $sbttl    = $img_info->post_excerpt;
        $decs     = $img_info->post_content;

        $allimgdat = array( $ttl, $sbttl, $decs );
        echo implode( '|~|', $allimgdat );
        die;
    }

}

add_action( 'wp_ajax_easmedia_img_dtl', 'easmedia_img_dtl' );

function easmedia_url_dtl()
{

    check_ajax_referer( 'easymedia-nonce', 'security' );

    if ( isset( $_POST['imgid'] ) ) {
        $url_data    = get_post_meta( $_POST['imgid'], 'easymedia_image_custom_url', true );

        echo json_encode( is_array( $url_data ) ? $url_data : array() );
        die();
    }

    die();

}

add_action( 'wp_ajax_easmedia_url_dtl', 'easmedia_url_dtl' );

function easmedia_set_url_redirect()
{

    check_ajax_referer( 'easymedia-nonce', 'security' );

    if ( isset( $_POST['data'] ) ) {

        $data   = (object) $_POST['data'];
        
        if ( isset( $data->id ) && 'publish' === get_post_status( $data->id ) ) {
            $target = isset( $data->target ) && $data->target ? sanitize_text_field( $data->target ) : '_blank';

            update_post_meta( $data->id, 'easymedia_image_custom_url', array( 'url' => esc_url( $data->url ), 'target' => $target ) );

            echo true;

            die();
        }

    }

    die();

}

add_action( 'wp_ajax_easmedia_set_url_redirect', 'easmedia_set_url_redirect' );

/*
|--------------------------------------------------------------------------
| AJAX UPDATE IMAGE DETAILS
|--------------------------------------------------------------------------
 */
function easy_custom_save_function()
{

    check_ajax_referer( 'easymedia-nonce', 'security' );

    if ( ! isset( $_POST['imgid'] ) || ! isset( $_POST['imgttl'] ) || ! isset( $_POST['imgsbttl'] ) || ! isset( $_POST['imgdesc'] ) ) {
        echo '0';
        die;
    } else {
        wp_update_post( array( 'ID' => $_POST['imgid'], 'post_title' => sanitize_text_field( $_POST['imgttl'] ) ) );
        wp_update_post( array( 'ID' => $_POST['imgid'], 'post_excerpt' => sanitize_text_field( $_POST['imgsbttl'] ) ) );
        wp_update_post( array( 'ID' => $_POST['imgid'], 'post_content' => sanitize_textarea_field( $_POST['imgdesc'] ) ) );
        echo '101';
        die;
    }

}

add_action( 'wp_ajax_easy_custom_save_function', 'easy_custom_save_function' );

/*
|--------------------------------------------------------------------------
| AJAX LOAD IMAGE GALLERY
|--------------------------------------------------------------------------
 */
function emg_gallery_list()
{

    check_ajax_referer( 'easymedia-nonce', 'security' );

    if ( ! isset( $_POST['page'] ) ) {$page = 1;} else { $page = (int) addslashes( $_POST['page'] );}

    if ( ! isset( $_POST['per_page'] ) ) {$per_page = 14;} else { $per_page = (int) addslashes( $_POST['per_page'] );}

    $img_data = emg_library_images( $page, $per_page );

    echo '<ul>';

    if ( $img_data['totalimg'] == 0 ) {echo '<p>No images found .. </p>';} else {

        foreach ( $img_data['img'] as $img ) {
            $defwpgallery = emg_thumb_src( $img['url'], '90', '90', '0', '0' );
            echo '<li><img src="'.$defwpgallery.'" id="'.$img['id'].'" /></li>';
        }

    }

    echo '
	</ul>
	<br class="metagal_clear" />
	<table cellspacing="0" cellpadding="5" border="0" width="100%" style="border-top: 1px solid #DDD; margin-top:10px; padding-top:5px;">
		<tr>
			<td style="width: 35%;">';

    if ( $page > 1 ) {
        echo '<input type="button" class="prev_page button-secondary" id="btnnav_'.( $page - 1 ).'" name="prevbtnnav" value="&laquo; Previous images" />';
    }

    echo '</td><td style="width: 30%; text-align: center;">';

    if ( $img_data['totalimg'] > 0 && $img_data['page_count'] > 1 ) {
        echo '<em>page '.$img_data['pag'].' of '.$img_data['page_count'].'</em>';
    } else {}

    echo '</td><td style="width: 35%; text-align: right;">';

    if ( $img_data['more'] != false ) {
        echo '<input type="button" class="next_page button-secondary" id="btnnav_'.( $page + 1 ).'" name="nextbtnnav" value="Next images &raquo;" />';
    }

    echo '</td>
		</tr>
	</table>
		<table cellspacing="0" cellpadding="5" border="0" width="100%" style="border-top: 1px solid #DDD; margin-top:10px; padding-top:5px;">
		<tr><td style="width: 30%; text-align: center;">
		<em>Show images per page</em>&nbsp;&nbsp;<input type="text" size="2" name="img_number" id="imgbutperpage" value="'.$per_page.'" />&nbsp;&nbsp;<input type="button" class="button-secondary" id="btnnavshowlist" name="btnnavshowlist" value="Show" />
		</td></tr>
	</table>
	';

    die();
}

add_action( 'wp_ajax_emg_gallery_list', 'emg_gallery_list' );

function emg_sel_img_rld()
{

    check_ajax_referer( 'easymedia-nonce', 'security' );

    if ( ! isset( $_POST['images'] ) ) {$images = array();} else { $images = $_POST['images'];}

    // get the titles
    $images  = emg_ext_sel( $images );
    $new_img = '';

    if ( ! $images ) {$new_img = '<p>No images selected...</p>';} else {

        foreach ( $images as $img_id ) {
            $img_data = get_post( $img_id );
            $img_url  = $img_data->guid;
            $slctdimg = emg_thumb_src( $img_url, '90', '90', '0', '0' );
            $new_img .= '
			<li>
				<input type="hidden" name="easmedia_metabox_img_slider[]" value="'.$img_id.'" />
				<img src="'.$slctdimg.'" />
				<span title="Remove Image"></span>
			</li>
			';
        }

    }

    echo $new_img;
    die();
}

add_action( 'wp_ajax_emg_sel_img_rld', 'emg_sel_img_rld' );

/*-------------------------------------------------------------------------------*/
/*   AJAX For EMG Lightbox
/*-------------------------------------------------------------------------------*/
function emg_get_data_slider_ajax()
{

    check_ajax_referer( 'medialoader', 'security' );

    if ( ! isset( $_POST['id'] ) ) {
        echo 'Error!';
        wp_die();
    } else {

        $devmedia = $boxlink = '';

        if ( strpos( $_POST['id'], '-' ) ) {
            $devmedia = explode( '-', $_POST['id'] );

            $id           = $devmedia[0];
            $isdinamccntn = explode( ' ', trim( $devmedia[1] ) );

            if ( isset( $isdinamccntn[0] ) ) {
                $isdinamccntn = $isdinamccntn[0];
            } else {
                $isdinamccntn = '';
            }

        } else {

            $id           = $_POST['id'];
            $isdinamccntn = '';
        }

        global $post;

        $usegalleryinfo = get_post_meta( $id, 'easmedia_metabox_media_gallery_opt2', true );

        if ( $isdinamccntn != '' ) {

            if ( $usegalleryinfo == 'on' ) {
                $img_info      = get_post( $isdinamccntn );
                $boxmediattl   = $img_info->post_title;
                $boxmediasbttl = $img_info->post_excerpt;
                $boxshortdecs  = $img_info->post_content;
                $boxshortdecs  = str_replace( "
", '', $boxshortdecs );
                $boxshortdecs  = str_replace( "
", '', $boxshortdecs );
                $boxshortdecs  = do_shortcode( wpautop( $boxshortdecs ) );
            } else {
                $boxshortdecs  = do_shortcode( wpautop( get_post_meta( $id, 'easmedia_metabox_shordesc', true ) ) );
                $boxmediattl   = get_post_meta( $id, 'easmedia_metabox_title', true );
                $boxmediasbttl = get_post_meta( $id, 'easmedia_metabox_sub_title', true );
            }

        } else {
            $boxshortdecs  = do_shortcode( wpautop( get_post_meta( $id, 'easmedia_metabox_shordesc', true ) ) );
            $boxmediattl   = get_post_meta( $id, 'easmedia_metabox_title', true );
            $boxmediasbttl = get_post_meta( $id, 'easmedia_metabox_sub_title', true );
        }

        $imgsrc    = get_post_meta( $id, 'easmedia_metabox_img', true );
        $mediatype = get_post_meta( $id, 'easmedia_metabox_media_type', true );
        $domname   = preg_replace( '/^www\./', '', $_SERVER['SERVER_NAME'] );

        switch ( $mediatype ) {
            case 'Single Image':
                $boxlink  = $imgsrc;
                $isdlable = '1';
                break;

            case 'Multiple Images (Slider)':
                $boxlink  = wp_get_attachment_image_src( $isdinamccntn, 'full' );
                $imgsrc   = ( isset( $boxlink[0] ) ? $boxlink[0] : '' );
                $boxlink  = ( isset( $boxlink[0] ) ? $boxlink[0] : '' );
                $isdlable = '1';
                break;

            case 'Video':
                $boxlink  = get_post_meta( $id, 'easmedia_metabox_media_video', true );
                $isdlable = '0';
                break;

            case 'Audio':
                $boxlink  = get_post_meta( $id, 'easmedia_metabox_media_audio', true );
                $isdlable = '1';
                break;

            case 'Google Maps':
                $boxlink  = get_post_meta( $id, 'easmedia_metabox_media_gmap', true );
                $isdlable = '0';
                break;

            case 'Link':
                $boxlink   = get_post_meta( $id, 'easmedia_metabox_media_link', true );
                $link_type = get_post_meta( $id, 'easmedia_metabox_media_link_opt1', true );
                $isdlable  = '0';

                if ( $boxlink != '' ) {
                    $media_link_fin = $boxlink;} else {
                    $media_link_fin = $post->guid;
                }

                $boxlink = $media_link_fin;
                break;
        }

        $isgp  = easy_get_option( 'easymedia_disen_gp' );
        $iseml = easy_get_option( 'easymedia_disen_eml' );
        $isfb  = easy_get_option( 'easymedia_disen_fb' );
        $istwt = easy_get_option( 'easymedia_disen_twt' );
        $ispin = easy_get_option( 'easymedia_disen_pin' );
        $isdl  = easy_get_option( 'easymedia_disen_dlbutton' );

        $tempdesc    = strlen( $boxshortdecs );
        $trim_length = 200;

        if ( $boxshortdecs ) {

            if ( $tempdesc > $trim_length ) {
                $shortenerdesc = rtrim( substr( $boxshortdecs, 0, $trim_length - 3 ) );
                $shortenerdesc = $shortenerdesc.'...';
            } else {
                $shortenerdesc = rtrim( substr( $boxshortdecs, 0, $trim_length ) );
            }

        } else {
            $shortenerdesc = 'Description goes here...';
        }

        if ( $boxmediattl == '' && get_the_title( $id ) == '' ) {$sharemediattl = 'Media';}

        if ( $boxmediattl == '' && get_the_title( $id ) != '' ) {$sharemediattl = get_the_title( $id );}

        if ( $boxmediattl != '' && get_the_title( $id ) != '' ) {$sharemediattl = $boxmediattl;}

        ob_start();

        if ( $isfb || $istwt || $ispin || $isgp || $iseml || $isdl ): ?>

<div id="mbsosmed">
    <ul>
        <?php
if ( $isfb ): ?>
        <li id="sosmedfb">

            <?php

        $fbappid = trim( easy_get_option( 'easymedia_fb_appid' ) );
        $fbttl   = preg_replace( '/[^a-z0-9\s]/i', ' ', $sharemediattl );
        $filenm  = basename( $imgsrc, '.'.pathinfo( $imgsrc, PATHINFO_EXTENSION ) );

        if ( $fbappid != '' ) {

            $fbboxw = '940';
            $fbboxh = '500';

            $fburl = 'https://www.facebook.com/dialog/feed?app_id='.$fbappid.'&link='.urlencode( $imgsrc ).'&picture='.urlencode( $imgsrc ).'&caption='.$fbttl.'&description='.$filenm.'&redirect_uri='.urlencode( site_url() ).'';
        } else {

            $fbboxw = '548';
            $fbboxh = '325';

            $fburl = 'https://www.facebook.com/sharer.php?s=100&amp;p[title]='.urlencode( $sharemediattl ).'&amp;p[summary]='.urlencode( strip_tags( $shortenerdesc ) ).'&amp;p[url]=CONVTOURL&amp;&amp;p[images][0]='.urlencode( $imgsrc ).'';
        }

        ?>

            <a onClick="window.open('<?php echo $fburl; ?>','sharer','toolbar=0,status=0,width=<?php echo $fbboxw; ?>,height=<?php echo $fbboxh; ?>');"
                href="javascript: void(0)"><span title="Share it!"></span></a>
        </li>
        <?php endif;?>

        <?php
if ( $istwt ): ?>
        <li id="sosmedtw">
            <a onClick="window.open('https://twitter.com/share?text=<?php echo urlencode( 'Check out "'.$sharemediattl.'" on '.get_bloginfo( 'name' ) ); ?>&url=CONVTOURL','sharer','toolbar=0,status=0,width=548,height=325');"
                href="javascript: void(0)"><span title="Tweet it!"></span></a>
        </li>
        <?php endif;?>

        <?php
if ( $ispin ): ?>
        <li id="sosmedpn">
            <a onClick="window.open('https://pinterest.com/pin/create/button/?url=<?php echo urlencode( $boxlink ); ?>&media=<?php echo urlencode( $imgsrc ); ?>&description=<?php echo urlencode( strip_tags( $shortenerdesc ) ); ?>','sharer','toolbar=0,status=0,width=575,height=330');"
                href="javascript: void(0)"><span title="Pin it!"></span></a>
        </li>
        <?php endif;?>

        <?php
if ( $isgp ): ?>
        <li id="sosmedgp">
            <a onClick="window.open('https://plus.google.com/share?url=CONVTOURL','','width=575,height=330');"
                href="javascript: void(0)"><span title="Share it!"></span></a>
        </li>
        <?php endif;?>

        <?php
if ( $iseml ): ?>
        <li id="sosmedeml">
            <a
                href="mailto:?Subject=<?php echo urlencode( $sharemediattl ); ?>&Body=<?php echo strip_tags( $shortenerdesc ).' '.'CONVTOURL'; ?>"><span
                    title="Email it!"></span></a>
        </li>
        <?php endif;?>

        <?php
if ( isset( $isdlable ) && $isdl && $isdlable == '1' ): ?>
        <li id="sosmeddl">
            <a href="<?php echo plugins_url( 'dl.php', 'index.php' ).'?source='.$boxlink.''; ?>"><span
                    title="Download it!"></span></a>
        </li>
        <?php endif;?>

    </ul>
</div>
<?php endif;

        $content = ob_get_clean();

        if ( $boxmediattl == '' ) {$boxmediattl = 'none';}

        if ( $content == '' ) {$content = 'none';}

        if ( $boxmediasbttl == '' ) {$boxmediasbttl = 'none';}

        if ( $boxshortdecs == '' ) {$boxshortdecs = 'none';}

        $therest = array( $boxmediattl, $boxmediasbttl, html_entity_decode( htmlspecialchars( $boxshortdecs ) ), $content );
        echo json_encode( $therest );
        wp_die();

    }

}

add_action( 'wp_ajax_nopriv_emg_get_data_slider_ajax', 'emg_get_data_slider_ajax' );
add_action( 'wp_ajax_emg_get_data_slider_ajax', 'emg_get_data_slider_ajax' );

/*-------------------------------------------------------------------------------*/
/*   Metabox Image Resizer switcher ( AJAX )
/*-------------------------------------------------------------------------------*/
function emg_switch_imageresizer()
{

    check_ajax_referer( 'emg_image_res_switcher', 'security' );

    if ( ! isset( $_POST['cmd'] ) ) {

        echo '0';
        wp_die();

    } else {

        $emg_upd_options                                 = get_option( 'easy_media_opt' );
        $emg_upd_options['easymedia_disen_tthumb']['id'] = '0';
        update_option( 'easy_media_opt', $emg_upd_options );
        echo 'done';
        wp_die();

    }

}

add_action( 'wp_ajax_emg_switch_imageresizer', 'emg_switch_imageresizer' );

/*-------------------------------------------------------------------------------*/
/*   Metabox ( Media Editor ) Timthumb Checks
/*-------------------------------------------------------------------------------*/
function emg_metabox_timthumb_check( $file )
{

    $stream = @fopen( $file, 'w' );

    if ( $stream ) {

        fclose( $stream );
        unlink( $file );

        return true;

    } else {

        add_action( 'admin_notices', 'emg_timthumb_problem' );

        ob_start();?>
<script>
jQuery(document).ready(function($) {

    jQuery('#irezsw').click(function(event) {

        event.preventDefault();
        jQuery('.emgwarning').css('background-image',
            'url(<?php echo plugins_url( 'images/switch.gif', dirname( 'index.php' ) ); ?>)');
        jQuery('.emgwarningp').fadeOut(100);
        jQuery('.swictloading').fadeIn(500);

        setTimeout(function() {
            emg_switch_imageresizer();
        }, 3000);

    });

    function emg_switch_imageresizer() {

        var data = {
            action: 'emg_switch_imageresizer',
            security: '<?php echo wp_create_nonce( 'emg_image_res_switcher' ); ?>',
            cmd: 'change',
        };

        jQuery.post(ajaxurl, data, function(response) {
            if (response != '0') {

                jQuery('.emgwarning').css('background-image',
                    'url(<?php echo plugins_url( 'images/swttick.png', dirname( 'index.php' ) ); ?>)');
                jQuery('.swictloading').text(
                    'Image Resizer method was successfully changed. This page will instantly reload to apply the changes, please wait...'
                    );

                setTimeout(function() {
                    location.reload();
                }, 3000);

            } else {

                jQuery('.emgwarning').css('background-image',
                    'url(<?php echo plugins_url( 'images/warning_red.png', dirname( 'index.php' ) ); ?>)'
                    );
                jQuery('.swictloading').text(
                    'Ajax request failed! This page will instantly reload, please wait...');

                setTimeout(function() {
                    location.reload();
                }, 3000);

            }
        });
    }
});
</script>

<?php
$gencode = ob_get_clean();
        echo emg_js_compress( $gencode );
    }

    function emg_timthumb_problem()
    {

        echo "<div class='error'><span class='emgwarning'><p class='emgwarningp'>".__( 'There seems to be a problem with the use of <strong>Timthumb Script</strong>, so '.EMG_ITEM_NAME.' can not display all of your images. This is usually caused by your server/hosting configurations. <a style="text-decoration: none!important;" href="#" id="irezsw">Click here to switch image resize method to EasyMedia Resizer.</a>', 'easmedia' )."</p><p class='swictloading'>Please wait...</p></span></div>";
    }

}

/*
|--------------------------------------------------------------------------
| Get the images from the WP library
|--------------------------------------------------------------------------
 */
function emg_library_images( $page = 1, $per_page = 14 )
{
    $query_images_args = array(
        'post_type' => 'attachment', 'post_mime_type' => 'image', 'post_status' => 'inherit', 'posts_per_page' => $per_page, 'paged' => $page,
    );

    $query_images = new WP_Query( $query_images_args );
    $images       = array();

    foreach ( $query_images->posts as $image ) {
        $images[] = array(
            'id'  => $image->ID,
            'url' => $image->guid,
        );
    }

    $img_number                     = $query_images->found_posts;
    $page_count                     = ceil( $img_number / $per_page );
    $shown                          = $per_page * $page;
    ( $shown >= $img_number ) ? $more = false : $more = true;

    return array( 'img' => $images, 'pag' => $page, 'page_count' => $page_count, 'more' => $more, 'totalimg' => $img_number );
}

function emg_ext_sel( $media )
{

    if ( is_array( $media ) ) {
        $new_array = array();

        foreach ( $media as $media_id ) {

            if ( get_the_title( $media_id ) ) {
                $new_array[] = $media_id;
            }

        }

        if ( count( $new_array ) == 0 ) {return false;} else {return $new_array;}

    } else {return false;}

}

/*
|--------------------------------------------------------------------------
| Easymedia Custom Category Box (Metabox)
|--------------------------------------------------------------------------
 */
function easymediagallery_categories_meta_box( $post, $box )
{
    $defaults = array( 'taxonomy' => 'emediagallery' );

    if ( ! isset( $box['args'] ) || ! is_array( $box['args'] ) ) {
        $args = array();
    } else {
        $args = $box['args'];
    }

    extract( wp_parse_args( $args, $defaults ), EXTR_SKIP );
    $tax = get_taxonomy( $taxonomy );

    ?>
<div id="taxonomy-<?php echo $taxonomy; ?>" class="categorydiv">
    <ul id="<?php echo $taxonomy; ?>-tabs" class="category-tabs">
        <li class="tabs"><a href="#<?php echo $taxonomy; ?>-all"><?php echo $tax->labels->all_items; ?></a></li>
        <li class="hide-if-no-js"><a href="#<?php echo $taxonomy; ?>-pop"><?php _e( 'Most Used' );?></a></li>
    </ul>

    <div id="<?php echo $taxonomy; ?>-pop" class="tabs-panel" style="display: none;">
        <ul id="<?php echo $taxonomy; ?>checklist-pop" class="categorychecklist form-no-clear">
            <?php $popular_ids = wp_popular_terms_checklist( $taxonomy );?>
        </ul>
    </div>

    <div id="<?php echo $taxonomy; ?>-all" class="tabs-panel">
        <?php
$name = ( $taxonomy == 'emediagallery' ) ? 'post_category' : 'tax_input['.$taxonomy.']';
    echo "<input type='hidden' name='{$name}[]' value='0' />"; // Allows for an empty term set to be sent. 0 is an invalid Term ID and will be ignored by empty() checks.
    ?>
        <ul id="<?php echo $taxonomy; ?>checklist" data-wp-lists="list:<?php echo $taxonomy ?>"
            class="categorychecklist form-no-clear">
            <?php wp_terms_checklist( $post->ID, array( 'taxonomy' => $taxonomy, 'popular_cats' => $popular_ids ) )?>
        </ul>
    </div>
    <?php

    if ( current_user_can( $tax->cap->edit_terms ) ): ?>
    <div id="<?php echo $taxonomy; ?>-adder" class="wp-hidden-children">
        <h4>
            <a id="<?php echo $taxonomy; ?>-add-toggle" href="#<?php echo $taxonomy; ?>-add" class="hide-if-no-js">
                <?php
printf( __( '+ %s' ), $tax->labels->add_new_item );
    ?>
            </a>
        </h4>
        <p id="<?php echo $taxonomy; ?>-add" class="category-add wp-hidden-child">
            <label class="screen-reader-text"
                for="new<?php echo $taxonomy; ?>"><?php echo $tax->labels->add_new_item; ?></label>
            <input type="text" name="new<?php echo $taxonomy; ?>" id="new<?php echo $taxonomy; ?>"
                class="form-required form-input-tip" value="<?php echo esc_attr( $tax->labels->new_item_name ); ?>"
                aria-required="true" />
            <label class="screen-reader-text" for="new<?php echo $taxonomy; ?>_parent">
                <?php echo $tax->labels->parent_item_colon; ?>
            </label>
            <?php wp_dropdown_categories( array( 'taxonomy' => $taxonomy, 'hide_empty' => 0, 'name' => 'new'.$taxonomy.'_parent', 'orderby' => 'name', 'hierarchical' => 1, 'show_option_none' => '&mdash; '.$tax->labels->parent_item.' &mdash;' ) );?>
            <input type="button" id="<?php echo $taxonomy; ?>-add-submit"
                data-wp-lists="add:<?php echo $taxonomy ?>checklist:<?php echo $taxonomy ?>-add"
                class="button category-add-submit" value="<?php echo esc_attr( $tax->labels->add_new_item ); ?>" />
            <?php wp_nonce_field( 'add-'.$taxonomy, '_ajax_nonce-add-'.$taxonomy, false );?>
            <span id="<?php echo $taxonomy; ?>-ajax-response"></span>
        </p>
    </div>
    <?php endif;?>
</div>
<?php
}

/*-------------------------------------------------------------------------------*/
/* Add Post Thumbnails and Custom Thumbnails size
/*-------------------------------------------------------------------------------*/
function easmedia_add_thumbnail_support()
{

    if ( ! current_theme_supports( 'post-thumbnails' ) ) {
        add_theme_support( 'post-thumbnails', array( 'easymediagallery' ) );
        add_image_size( 'emg-admin-thumb', 70, 70, true ); // Used in the easymedia edit page
    }

}

add_action( 'init', 'easmedia_add_thumbnail_support' );

/*-------------------------------------------------------------------------------*/
/* Add credits in admin page
/*-------------------------------------------------------------------------------*/
function easymediagallery_add_footer_credits( $text )
{
    $t = '';

    if ( get_post_type() === 'easymediagallery' ) {
        $t .= '<div id="credits" style="line-height: 22px;">';
        $t .= '<p>Easy Media Gallery plugin is created by <a href="https://ghozylab.com/" target="_blank">GhozyLab, Inc</a>.</p>';
        $t .= "<p>If you have some support issue, don't hesitate to <a href=\"https://ghozylab.com/plugins/submit-support-request\" target=\"_blank\">write here</a>. The GhozyLab team will be happy to support you on any issue.</p>";
        $t .= '</div>';
    } else {
        $t = $text;
    }

    return $t;
}

add_filter( 'admin_footer_text', 'easymediagallery_add_footer_credits' );

/*-------------------------------------------------------------------------------*/
/*  Get the patterns list
/*-------------------------------------------------------------------------------*/
function easmedia_patterns_ls()
{
    $patterns      = array();
    $patterns_list = scandir( EMG_DIR.'/css/images/patterns' );

    foreach ( $patterns_list as $pattern_name ) {

        if ( $pattern_name != '.' && $pattern_name != '..' ) {
            $patterns[] = $pattern_name;
        }

    }

    return $patterns;
}

/*
|--------------------------------------------------------------------------
| REMOVE PERMALINK
|--------------------------------------------------------------------------
 */
function emg_hide_permalink()
{
    global $post_type;

    if ( $post_type == 'easymediagallery' ) {
        echo '<style type="text/css">#edit-slug-box{display: none;}</style>';
    }

}

add_action( 'admin_head', 'emg_hide_permalink' );

/*--------------------------------------------------------------------------------*/
/*  REMOVE THE PARENT FIELD FOR THE CUSTOM TEXONOMY
/*--------------------------------------------------------------------------------*/
function emg_remove_cat_parent()
{
    global $current_screen;

    switch ( $current_screen->id ) {
        case 'edit-emediagallery':

            ?>
<script type="text/javascript">
jQuery(document).ready(function($) {
    jQuery('#parent').parents('.form-field').remove();
    jQuery('#tag-slug, #tag-description').parents('.form-field').hide();
});
</script>
<?php

            break;
    }

}

add_action( 'admin_footer-edit-tags.php', 'emg_remove_cat_parent' );

/*-------------------------------------------------------------------------------*/
/*  HEX to RGB
/*-------------------------------------------------------------------------------*/
function easymedia_hex2rgb( $hex )
{
    $hex = str_replace( '#', '', $hex );

    if ( strlen( $hex ) == 3 ) {
        $r = hexdec( substr( $hex, 0, 1 ).substr( $hex, 0, 1 ) );
        $g = hexdec( substr( $hex, 1, 1 ).substr( $hex, 1, 1 ) );
        $b = hexdec( substr( $hex, 2, 1 ).substr( $hex, 2, 1 ) );
    } else {
        $r = hexdec( substr( $hex, 0, 2 ) );
        $g = hexdec( substr( $hex, 2, 2 ) );
        $b = hexdec( substr( $hex, 4, 2 ) );
    }

    $rgb = array( $r, $g, $b );

    return implode( ',', $rgb );
}

/*-------------------------------------------------------------------------------*/
/*  replace_extension
/*-------------------------------------------------------------------------------*/
function emg_replace_extension( $filename )
{
    $ext           = pathinfo( $filename, PATHINFO_EXTENSION );
    $new_extension = 'emgcvr-'.$ext;

    return substr_replace( $filename, $new_extension, strrpos( $filename, '.' ) + 1 );

}

/*-------------------------------------------------------------------------------*/
/*  Get attachment image id
/*-------------------------------------------------------------------------------*/
function emg_get_attachment_id_from_src( $link )
{
    global $wpdb;
    $link = preg_replace( '/-\d+x\d+(?=\.(jpg|jpeg|png|gif)$)/i', '', $link );

    return $wpdb->get_var( "SELECT ID FROM {$wpdb->posts} WHERE guid='$link'" );
}

/*-------------------------------------------------------------------------------*/
/*   CSS Compressor @since 1.5.1.7
/*-------------------------------------------------------------------------------*/
function emg_css_compress( $minify )
{
    /* remove comments */
    $minify = preg_replace( '!/\*[^*]*\*+([^/][^*]*\*+)*/!', '', $minify );

    /* remove tabs, spaces, newlines, etc. */
    $minify = str_replace( array( "
", "
", "
", "	", '  ', '    ', '    ' ), '', $minify );

    return $minify;
}

/*-------------------------------------------------------------------------------*/
/*   JS Compressor @since 1.5.1.7
/*-------------------------------------------------------------------------------*/
function emg_js_compress( $minify )
{

    $replace = array(
        '#\'([^
\']*?)/\*([^
\']*)\'#' => "'/'+\'\'+'*'", // remove comments from ' strings
        '#\"([^
\"]*?)/\*([^
\"]*)\"#' => '"/"+\'\'+"*"', // remove comments from " strings
        '#/\*.*?\*/#s'    => '', // strip C style comments
        '#[
]+#' => "
", // remove blank lines and 
's
        '#
([ 	]*//.*?
)*#s' => "
", // strip line comments (whole line only)
        '#([^\])//([^\'"
]*)
#s' => "
",
        '#
\s+#'                        => "
", // strip excess whitespace
        '#\s+
#'                        => "
", // strip excess whitespace
        '#(//[^
]*
)#s' => "
",
        '#/([\'"])\+\'\'\+([\'"])\*#'    => '/*', // restore comments in strings
    );

    $search = array_keys( $replace );
    $script = preg_replace( $search, $replace, $minify );

    $replace = array(
        "&&
" => '&&',
        "||
" => '||',
        "(
"  => '(',
        ")
"  => ')',
        "[
"  => '[',
        "]
"  => ']',
        "+
"  => '+',
        ",
"  => ',',
        "?
"  => '?',
        ":
"  => ':',
        ";
"  => ';',
        "{
"  => '{',
        "
]"  => ']',
        "
)"  => ')',
        "
}"  => '}',
        "

" => "
",
    );

    $search = array_keys( $replace );
    $script = str_replace( $search, $replace, $script );

    return trim( $script );

}

/*
|--------------------------------------------------------------------------
| FRONTEND ACTIVATE NOTIFICATION
|--------------------------------------------------------------------------
 */
function emg_front_license_notify()
{

    wp_enqueue_style( 'easymedia_styles', EMGDEF_PLUGIN_URL.'css/frontend.css' );

    $emgfrontnotify = '<div class="easymedia_center"><div class="emglicenseinf">Please activate <strong>'.EMG_ITEM_NAME.'</strong> license key. You can activate <a href="'.admin_url( 'edit.php?post_type=easymediagallery&page=emg-activation' ).'">'.__( 'here', 'easmedia' ).'</a></div></div>';

    echo $emgfrontnotify;

}

/*
|--------------------------------------------------------------------------
| FRONTEND FOOBOX NOTIFICATION
|--------------------------------------------------------------------------
 */
function emg_front_foobox_notify()
{

    wp_enqueue_style( 'easymedia_styles', EMGDEF_PLUGIN_URL.'css/frontend.css' );

    $emgfrontfb = '<div class="easymedia_center"><div class="emginfobox">FooBox not active! You have to purchase separately <a href="https://goo.gl/yXuJQA" target="_blank">'.__( 'here', 'easmedia' ).'</a>, or use FooBox Free version <a href="https://wordpress.org/plugins/foobox-image-lightbox/" target="_blank">'.__( 'here', 'easmedia' ).'</a>.<br>Learn more about FooBox lightbox type <a href="https://ghozylab.com/plugins/easy-media-gallery-pro/demo/best-gallery-lightboxes#lightboxpremium" target="_blank">'.__( 'here', 'easmedia' ).'</a></div></div><br>';

    echo $emgfrontfb;
}

/*-------------------------------------------------------------------------------*/
/*  Image Resize ( Aspect Ratio )
/*-------------------------------------------------------------------------------*/
function easymedia_imgresize( $img, $limit, $isres, $imw, $imh )
{

    if ( $img == '' ) {
        $img = plugins_url( 'images/no-image-available.jpg', dirname( 'index.php' ) );
    } else {
        $img = $img;
    }

    if ( $isres == 'on' ) {

        if ( $imw > $limit ) {
            $tempimgratio = $imh / $imw;
            $fih          = (int) ( $tempimgratio * $limit ); // final image height
            $fiw          = $limit; // fixed image width

            $allimgdata = array( emg_thumb_src( $img, $fiw, $fih, $imw, $imh ), $fiw, $fih );

        } else {
            $allimgdata = array( $img, $imw, $imh );
        }

    } else {
        $allimgdata = array( $img, $imw, $imh );
    }

    return implode( ',', $allimgdata );
}

/*-------------------------------------------------------------------------------*/
/*  Image Resize ( Aspect Ratio ) AJAX
/*-------------------------------------------------------------------------------*/
function easymedia_imgresize_ajax()
{

    check_ajax_referer( 'easymedia-nonce', 'security' );

    if ( ! isset( $_POST['imgurl'] ) || ! isset( $_POST['limiter'] ) || $_POST['imgurl'] == '' || $_POST['limiter'] == '' ) {
        echo '<p>Ajax request failed, please refresh your browser window.</p>';
        die;
    } else {

        $imgurl  = $_POST['imgurl'];
        $limiter = $_POST['limiter'];
        $attid   = wp_get_attachment_image_src( emg_get_attachment_id_from_src( $imgurl ), 'full' );

        if ( ! is_array( $attid ) ) {

            echo $imgurl.',210,210';
            die;

        }

        $tmpimgratio = $attid[2] / $attid[1];

        if ( $attid[1] > $limiter ) {
            $tmph       = (int) ( $tmpimgratio * $limiter ); // final image height
            $tmpw       = $limiter; // fixed image width
            $allimgdata = array( emg_thumb_src( $imgurl, $tmpw, $tmph, $attid[1], $attid[2] ), $tmpw, $tmph );
            echo implode( ',', $allimgdata );
            die;
        } else {
            $finimgurl  = $imgurl;
            $allimgdata = array( $finimgurl, $attid[1], $attid[2] );
            echo implode( ',', $allimgdata );
            die;
        }

    }

}

add_action( 'wp_ajax_easymedia_imgresize_ajax', 'easymedia_imgresize_ajax' );

/*-------------------------------------------------------------------------------*/
/*  thumbnail source switch = Timthumb or easymedia_resizer
/*-------------------------------------------------------------------------------*/
function emg_thumb_src( $img_src, $width, $height, $gsze1, $gsze2, $cmode = 'c', $zcs = '1', $cc = null )
{

    if ( ! $img_src ) {return false;}

    if ( is_multisite() ) {return false;}

    if ( $cc ) {

        $cc = '&cc='.str_replace( '#', '', $cc ).'';

    } else {

        $cc = null;

    }

    if ( easy_get_option( 'easymedia_disen_tthumb' ) == '1' ) {
        $emg_thumb_url = EMG_THUMB_FILE.'?src='.$img_src.'&h='.$height.'&w='.$width.'&zc='.$zcs.'&q=100&a='.$cmode.''.$cc.'';
    } else {

        if ( $gsze1 != '0' && $gsze2 != '0' ) {
            $gsize1 = $gsze1;
            $gsize2 = $gsze2;
        } else {
            $globalsize = wp_get_attachment_image_src( emg_get_attachment_id_from_src( $img_src ), 'full' );
            $gsize1     = $globalsize[1];
            $gsize2     = $globalsize[2];
        }

        $emg_thumb_url = easymedia_resizer( $img_src, $gsize1, $gsize2, $width, $height, true, $cmode, false );
    }

    return $emg_thumb_url;

}

/*-------------------------------------------------------------------------------*/
/*  Get WP Info
/*-------------------------------------------------------------------------------*/
function easmedia_get_wpinfo()
{

    $emgmemory    = (int) @ini_get( 'memory_limit' );
    $emgmemory    = empty( $emgmemory ) ? __( 'N/A' ) : $emgmemory.__( ' MB' );
    $getwpinfo    = array();
    $getwpinfo[0] = '- Site URL : '.get_site_url();

    if ( is_multisite() ) {$getwpinfo[1] = '- WP Multisite : YES';} else { $getwpinfo[1] = '- WP Multisite : NO';}

    global $wp_version;

    echo '- WP Version : '.$wp_version."
";
    echo $getwpinfo[0]."
";
    echo $getwpinfo[1]."
";
    echo checkcurlandurlfopen();
    echo '- Memory Limit : '.$emgmemory."
";
    $theme_name = wp_get_theme();
    echo '- Active Theme : '.$theme_name->get( 'Name' )."
";
    echo "- Active Plugins : 
";

    if ( is_multisite() ) {
        $the_plugs = get_site_option( 'active_sitewide_plugins' );

        foreach ( $the_plugs as $key => $value ) {
            $string    = explode( '/', $key );
            $string[0] = str_replace( '-', ' ', $string[0] );
            echo ' &nbsp;&nbsp;&nbsp;&nbsp;'.ucwords( $string[0] )."
";
        }

    } else {
        $the_plugs = get_option( 'active_plugins' );

        foreach ( $the_plugs as $key => $value ) {
            $string    = explode( '/', $value );
            $string[0] = str_replace( '-', ' ', $string[0] );
            echo ' &nbsp;&nbsp;&nbsp;&nbsp;'.ucwords( $string[0] )."
";
        }

    }

}

/*-------------------------------------------------------------------------------*/
/*  Check CURL and allow_url_fopen
/*-------------------------------------------------------------------------------*/
function checkcurlandurlfopen()
{

    if ( function_exists( 'curl_version' ) ) {
        $iscurl = '- PHP CURL : Active';
    } else {
        $iscurl = '- PHP CURL : NOT Active';
    }

    if ( @ini_get( 'allow_url_fopen' ) ) {
        $isallow = '- PHP Allow_url_fopen : Active';
    } else {
        $isallow = '- PHP Allow_url_fopen : NOT Active';
    }

    echo $iscurl."
";
    echo $isallow."
";
}

/*-------------------------------------------------------------------------------*/
/*  Get Plugin Version (@return string Plugin version)
/*-------------------------------------------------------------------------------*/
function easymedia_get_plugin_version()
{
    $plugin_data    = get_plugin_data( EMG_DIR.'/easy-media-gallery-pro.php' );
    $plugin_version = $plugin_data['Version'];

    return $plugin_version;
}

/*-------------------------------------------------------------------------------*/
/*  Check 3rd party Foobox plugin
/*-------------------------------------------------------------------------------*/
function easymedia_isfoobox()
{

    if ( class_exists( 'fooboxV2' ) || class_exists( 'foobox' ) || class_exists( 'Foobox_Free' ) ) {
        return true;
    }

    return false;

}

/*-------------------------------------------------------------------------------*/
/*  Slug to Name
/*-------------------------------------------------------------------------------*/
function emg_slug_to_name( $slug )
{
    $vals = array(
        'Center'                                                              => 'c',
        'Top'                                                                 => 'top',
        'Top Right'                                                           => 'tr',
        'Top Left'                                                            => 'tl',
        'Bottom'                                                              => 'b',
        'Bottom Right'                                                        => 'br',
        'Bottom Left'                                                         => 'bl',
        'Right'                                                               => 'r',
        'Left'                                                                => 'l',
        'EMG Lightbox ( Default )'                                            => 'default',
        'emg_light'                                                           => 'emg_light',
        'emg_dark'                                                            => 'emg_dark',
        'emg_transparent'                                                     => 'emg_transparent',
        'Lightbox 2'                                                          => 'lightbox2',
        'FancyBox 2'                                                          => 'fancybox',
        'FancyBox Free'                                                       => 'fancybox_free',
        'ColorBox'                                                            => 'colorbox',
        'PrettyPhoto'                                                         => 'prettyphoto',
        'FooBox'                                                              => 'foobox',
        'PhotoSwipe'                                                          => 'photoswipe',
        'PhotoBox'                                                            => 'photobox',
        'Wordpress ThickBox'                                                  => 'wp_thickbox',
        'Style 01 ( Default )'                                                => 'hoverone',
        'Style 02'                                                            => 'emgview-two',
        'Style 03'                                                            => 'emgview-three',
        'Style 04'                                                            => 'emgview-four',
        'Resize to Fit specified dimensions (no cropping)'                    => '0',
        'Crop and resize to best fit the dimensions (default behaviour)'      => '1',
        'Resize proportionally to fit entire image into specified dimensions' => '2',
        'Resize proportionally adjusting size of scaled image'                => '3',

    );

    if ( isset( $vals[$slug] ) ) {
        return $vals[$slug];
    }

}

/*-------------------------------------------------------------------------------*/
/*  Random String
/*-------------------------------------------------------------------------------*/
function emgRandomString( $length )
{
    $original_string = array_merge( range( 'a', 'z' ), range( 'A', 'Z' ) );
    $original_string = implode( '', $original_string );

    return substr( str_shuffle( strtolower( $original_string ) ), 0, $length );
}

/*-------------------------------------------------------------------------------*/
/*  Enable Sorting of the Media
/*-------------------------------------------------------------------------------*/
function easmedia_create_easymedia_sort_page()
{
    $easmedia_sort_page = add_submenu_page( 'edit.php?post_type=easymediagallery', 'Sorter', __( 'Sorter', 'easmedia' ), 'edit_posts', 'easymedia_order', 'easmedia_easymedia_sort' );

    add_action( 'admin_print_styles-'.$easmedia_sort_page, 'easmedia_print_sort_styles' );
    add_action( 'admin_print_scripts-'.$easmedia_sort_page, 'easmedia_print_sort_scripts' );
}

function easmedia_easymedia_sort()
{
    $easymedias = new WP_Query( 'post_type=easymediagallery&posts_per_page=-1&orderby=menu_order&order=ASC' );

    if ( $easymedias->have_posts() ):
    ?>
<div class="wrap">
    <div id="icon-edit" class="icon32 icon32-posts-easymedia"><br /></div>
    <h2><?php _e( 'Sorter', 'easmedia' );?></h2>
    <p><?php _e( 'Simply drag the Media up or down and they will be saved in that order. Media at the top will appear first.', 'easmedia' );?>
    </p>

    <div class="metabox-holder">
        <div class="postbox">
            <h3><?php _e( 'Sort Media', 'easmedia' );?>:</h3>


            <ul id="easymedia_list" style="padding-left:10px !important;">
                <?php

    while ( $easymedias->have_posts() ): $easymedias->the_post();?>
	                <li id="<?php the_id();?>" class="menu-item">
	                    <dl class="menu-item-bar">
	                        <dt class="menu-item-handle">
                                <span class="dashicons dashicons-menu emg_sort_icon"></span>
                                    <span class="item-title emg_sort_title"><?php echo esc_html( esc_js( the_title( null, null, false ) ) ); ?></span>
	                        </dt>
	                    </dl>
	                    <ul class="menu-item-transport"></ul>
	                </li>
	                <?php endwhile;?>

                <?php else: ?>
                <div class="wrap">
                    <div id="icon-edit" class="icon32 icon32-posts-easymedia"><br /></div>
                    <h2><?php _e( 'Sorter', 'easmedia' );?></h2>
                    <div class="metabox-holder">
                        <div class="postbox">
                            <h3><?php _e( 'Sort Media', 'easmedia' );?>:</h3>
                            <p style="padding:10px;">
                                <?php printf( __( 'No items found, why not %screate one%s?	', 'easmedia' ), '<a href="post-new.php?post_type=easymediagallery">', '</a>' );?>
                            </p>
                        </div>
                    </div>
                </div>
                <?php endif;?>

                <?php wp_reset_postdata();?>
            </ul>
        </div>
        <div style="padding-left:33px; margin-bottom:30px"><img
                src="<?php echo plugins_url( 'images/dragdrop.png', dirname( 'index.php' ) ) ?>" height="23px;"
                width="161px;" /></div>
    </div>
</div>
<?php
}

/*-------------------------------------------------------------------------------*/
/*  RENAME POST BUTTON
/*-------------------------------------------------------------------------------*/
add_filter( 'gettext', 'change_publish_button', 10, 2 );
function change_publish_button( $translation, $text )
{

    if ( 'easymediagallery' == get_post_type() ) {

        if ( $text == 'Publish' ) {
            return 'Save Media';} else

        if ( $text == 'Update' ) {
            return 'Update Media';}

    }

    return $translation;
}

/*-------------------------------------------------------------------------------*/
/*   Metabox Rate
/*-------------------------------------------------------------------------------*/
function easmedia_rate_metabox()
{
    $emgrate = '<p>';
    $emgrate .= '<span style="color:#666666;margin-left:2px; font-size:12px;">Have a story to share about <strong>Easy Media Gallery Pro</strong> experience? We\'d love to hear your feedback and rate 5 stars would be appreciated!</span><br />';
    $emgrate .= '</p><div style="text-align:center;">';
    $emgrate .= 'Click here<br /><a href="https://wordpress.org/support/view/plugin-reviews/easy-media-gallery?filter=5#postform" target="_blank"><img style="cursor:pointer;" src="'.plugins_url( 'images/five-stars.png', dirname( 'index.php' ) ).'" width="100" height="23" alt="Rate Us" ></a>';
    $emgrate .= '</div>';
    echo $emgrate;
}

/*-------------------------------------------------------------------------------*/
/*   Affiliate
/*-------------------------------------------------------------------------------*/
function easmedia_aff_metabox()
{
    $emgrate = '<div style="text-align:center;"><a href="https://ghozylab.com/plugins/affiliate-program/" target="_blank"><img style="cursor:pointer;" src="https://secure.ghozylab.com/affiliate/images/client_side_affiliate.png" width="250" height="310" alt="Join Now!" ></a>';
    $emgrate .= '</div>';
    echo $emgrate;
}

/*-------------------------------------------------------------------------------*/
/*  Create Recommended Plugins Metabox @since 1.0.6.3
/*-------------------------------------------------------------------------------*/
function easmedia_news_metabox()
{
    $emgprev = '<div style="margin-left:5px;"><ul class="emgcheckthisout">';
    $emgprev .= '<li><a href="https://wpcomposer.com/" target="_blank">Best Site Builder Plugin</a><span style="padding:2px 6px 2px 6px;background-color: #E74C3C; border-radius:9px;margin-left:7px;color:#fff;font-size:11px;">Best Seller</span></li>';
    $emgprev .= '<li><a href="https://demo.ghozylab.com/plugins/easy-contact-form-plugin/demo-form-with-image-in-header/" target="_blank">Best Contact Form Plugin</a></li>';
    $emgprev .= '<li><a href="https://demo.ghozylab.com/plugins/easy-image-slider-plugin/image-slider-with-thumbnails-at-the-bottom/" target="_blank">Best Image Slider Plugin</a></li>';
    $emgprev .= '</ul></div>';
    echo $emgprev;
}

/*-------------------------------------------------------------------------------*/

/*   Load News
/*-------------------------------------------------------------------------------*/

if ( easy_get_option( 'easymedia_disen_dasnews' ) == '1' ) {
    function emg_register_dashboard_widgets()
    {
        if ( current_user_can( apply_filters( 'emg_dashboard_stats_cap', 'edit_pages' ) ) ) {
            wp_add_dashboard_widget( 'emg_dashboard_stat', __( 'Easy Media Gallery', 'easmedia' ), 'emg_dashboard_widget' );
        }

    }

    add_action( 'wp_dashboard_setup', 'emg_register_dashboard_widgets' );

    function emg_dashboard_widget()
    {
        ?>

<div class="emg_dashboard_widget">
    <p class="sub">If you really love Easy Media Gallery, please recommend our plugin to your friends.</p>
    <ul class='easymedia-social' id='easymedia-cssanime'>
        <li class='easymedia-facebook'>
            <a onclick="window.open('https://www.facebook.com/sharer.php?s=100&amp;p[title]=Check out the Best Wordpress Portfolio and Gallery plugin&amp;p[summary]=Easy Media Gallery for WordPress that is powerful and so easy to create portfolio or media gallery&amp;p[url]=https://ghozylab.com/plugins/easy-media-gallery-pro/&amp;p[images][0]=https://ghozylab.com/wp-content/uploads/2013/02/ghozy-logo.png', 'sharer', 'toolbar=0,status=0,width=548,height=325');"
                href="javascript: void(0)" title="Share"><strong>Facebook</strong></a>
        </li>
        <li class='easymedia-twitter'>
            <a onclick="window.open('https://twitter.com/share?text=Check out the Best Wordpress Portfolio and Gallery Plugin &url=https://ghozylab.com/plugins/easy-media-gallery-pro/', 'sharer', 'toolbar=0,status=0,width=548,height=325');"
                title="Twitter" class="circle"><strong>Twitter</strong></a>
        </li>
        </li>
        <li class='easymedia-googleplus'>
            <a
                onclick="window.open('https://plus.google.com/share?url=https://ghozylab.com/plugins/easy-media-gallery-pro/','','width=415,height=450');"><strong>Google+</strong></a>
        </li>
        </li>
        <li class='easymedia-pinterest'>
            <a
                onclick="window.open('https://pinterest.com/pin/create/button/?url=https://ghozylab.com/plugins/easy-media-gallery-pro/;media=https://ghozylab.com/wp-content/uploads/2013/02/ghozy-logo.png;description=Easy Media Gallery for WordPress that is powerful and so easy to create portfolio or media gallery','','width=600,height=300');"><strong>Pinterest</strong></a>
        </li>
    </ul>
</div>

<?php
}

}

/*-------------------------------------------------------------------------------*/
/*   Documentation Page
/*-------------------------------------------------------------------------------*/
function easmedia_create_docs_page()
{
    $easmedia_docs_page = add_submenu_page( 'edit.php?post_type=easymediagallery', 'Docs & Help Center', __( 'Docs & Help Center', 'easmedia' ), 'edit_posts', 'emg_docs', 'emg_documentations' );
}

/*-------------------------------------------------------------------------------*/
/*   Backup & Restore Page
/*-------------------------------------------------------------------------------*/
function easmedia_create_backrest_page()
{

    ob_start();

    $easmedia_docs_page = add_submenu_page( 'edit.php?post_type=easymediagallery', 'Backup & Restore', __( 'Backup & Restore', 'easmedia' ), 'edit_posts', 'emg_backup_restore', 'emg_import_export_options' );
}

function emg_import_export_options()
{

    if ( ! isset( $_POST['export'] ) ) {
        ?>
<div class="wrap">
    <div id="emg-help-logo">
        <img height="32" width="32" alt="Backup & Restore"
            src="<?php echo plugins_url( 'images/back_rest.png', dirname( 'index.php' ) ); ?>"
            style="width:32px;height:32px;vertical-align:middle; margin-right:10px;"></img>
        <span
            style=" font-size:24px; font-weight:bold; vertical-align:middle; font-family: Arial, Helvetica, sans-serif"><?php _e( 'Backup & Restore '.EMG_ITEM_NAME.' settings', 'easmedia' );?></span>
        <hr />
    </div>
    <div class="metabox-holder">
        <div class="postbox">
            <h3><?php _e( 'Backup', 'easmedia' );?></h3>
            <div id="easymedia_backup" style="padding-left:10px !important;">
                <p><?php _e( 'When you click <strong>Backup all options</strong> button, system will generate a JSON file for you to save on your computer. This backup file contains all configution of '.EMG_ITEM_NAME.' setting options. Note that it do <strong>NOT</strong> contain posts, pages, media, gallery, albums or any relevant data, just all '.EMG_ITEM_NAME.' settings. This allows you to easily import the configuration into this site or another site.', 'easmedia' );?>
                </p>
                <form method='post'>
                    <p class="submit">
                        <?php wp_nonce_field( 'emg-export-nonce' );?>
                        <input class="button" type='submit' name='export' value='Backup all options' />
                    </p>
                </form>
            </div>
        </div>
    </div>
    <?php
} elseif ( check_admin_referer( 'emg-export-nonce' ) ) {

        $backupname = str_replace( ' ', '_', 'backup"'.strtolower( EMG_ITEM_NAME ).'' );
        $date       = date( 'd_m_Y_His' );
        $json_name  = $backupname.'_'.$date; // Namming the filename will be generated.

        $options = get_option( 'easy_media_opt' );

        foreach ( $options as $key => $value ) {
            $value              = maybe_unserialize( $value );
            $need_options[$key] = $value;
        }

        $json_file = json_encode( $need_options ); // Encode data into json data

        ob_clean();
        echo $json_file;
        header( 'Content-Type: text/json; charset='.get_option( 'blog_charset' ) );
        header( "Content-Disposition: attachment; filename=$json_name.json" );
        exit();
    }

    ?>
    <div class="metabox-holder">
        <div class="postbox">
            <h3><?php _e( 'Restore', 'easmedia' );?></h3>
            <?php

    if ( isset( $_FILES['import'] ) && check_admin_referer( 'emg-import-nonce' ) ) {

        if ( $_FILES['import']['error'] > 0 ) {
            echo "<div class='error'><p>No file selected, please make sure to select a file.</p></div>";
        } else {
            $file_name = $_FILES['import']['name']; // Get the name of file
            $file_ext  = pathinfo( strtolower( $file_name ), PATHINFO_EXTENSION );
            $file_size = $_FILES['import']['size'];

            if (  ( $file_ext == 'json' ) && ( $file_size < 500000 ) ) {
                $encode_options = file_get_contents( $_FILES['import']['tmp_name'] );
                $options        = json_decode( $encode_options, true );

                $emg_upd_options = get_option( 'easy_media_opt' );

                foreach ( $options as $key => $value ) {
                    $emg_upd_options[$key] = $value;
                    update_option( 'easy_media_opt', $emg_upd_options );
                }

                echo "<div class='updated'><p>All options are restored successfully.</p></div>";
            } else {
                echo "<div class='error'><p>Invalid file or file size too big.</p></div>";
            }

        }

    }

    ?>
            <div id="easymedia_restore" style="padding-left:10px !important;">

                <p><?php _e( 'Import the '.EMG_ITEM_NAME.' settings from a .json file. This file can be obtained by exporting the settings on another site using the form above.', 'easmedia' );?>
                </p>
                <form method='post' enctype='multipart/form-data'>
                    <p class="submit">
                        <?php wp_nonce_field( 'emg-import-nonce' );?>
                        <input type='file' name='import' /><br /><br />
                        <input class="button" type='submit' name='submit' value='Restore all options' />
                    </p>
                </form>
            </div>
        </div>
    </div>
</div>
<?php
}

/*-------------------------------------------------------------------------------*/
/*   Mailler
/*-------------------------------------------------------------------------------*/
function emg_html_form_code()
{

    wp_enqueue_script( 'jquery-validate-js' );

    ?>
<script>
jQuery(document).ready(function($) {

    jQuery(".emg-support-form").validate({
        rules: {
            cfname: {
                required: true,
                email: false
            },
            cfemail: {
                required: true,
                email: true
            },
            cflickey: {
                required: true,
            },
            cfmessage: {
                required: true,
            },

        },
        submitHandler: function(form) {
            emg_onsubmit(jQuery('.emg-support-form'));
        }

    });


});
/* Form Validation & Submit ( Ajax ) */
function emg_onsubmit(form) {

    if (form.attr('action') == '#') {

        jQuery('#formmsggroup').show();
        jQuery('#cf-submitted').attr('disabled', 'disabled');
        jQuery('.emfformmsg').text('');
        jQuery('.emfformloading').css('background-image',
            'url(<?php echo plugins_url( 'images/act-loading.gif', dirname( 'index.php' ) ); ?>)');
        jQuery('.emfformloading').css('display', 'inline-block');
        var input_button = jQuery(":input", form);

        data = {
            'action': 'emg_deliver_mail',
            'security': '<?php echo wp_create_nonce( 'easymedia-nonce' ); ?>'
        };

        jQuery('input, textarea', form).each(function(key) {
            data[this.name] = this.value;
        });

        jQuery.ajax({
            url: '<?php echo admin_url( 'admin-ajax.php' ); ?>',
            type: 'POST',
            dataType: 'json',
            data: data,
            success: function(data) {

                if (data.Ok == true) {
                    jQuery('#cf-submitted').removeAttr('disabled');
                    jQuery('.emfformmsg').text(
                        'Thank you for contacting us. We have received your enquiry and will respond to you within 2 x 24 hours.'
                        );
                    jQuery('.emfformloading').css('background-image',
                        'url(<?php echo plugins_url( 'images/valid.png', dirname( 'index.php' ) ); ?>)');
                    jQuery('#formmsggroup').fadeIn(1000).delay(5000).fadeOut(1000);
                } else {
                    jQuery('#cf-submitted').removeAttr('disabled');
                    jQuery('.emfformloading').css('background-image',
                        'url(<?php echo plugins_url( 'images/invalid.png', dirname( 'index.php' ) ); ?>)');
                    jQuery('.emfformmsg').text('An unexpected error occurred. Please try again!');
                    jQuery('#formmsggroup').fadeIn(1000).delay(5000).fadeOut(1000);

                }
            }
        });
        return false;
    }
}
</script>
<?php

    if ( emg_get_lic_option( 'emgpro_license_info', 'emg_license_key', '' ) ) {
        $isdis = 'disabled="disabled"';
    } else {
        $isdis = '';
    }

    echo '<form class="emg-support-form" action="#" method="post">';
    echo '<p>';
    echo 'Name (required) <br/>';
    echo '<input type="text" name="cfname" pattern="[0-9a-zA-Z- _]+" size="40" value="'.emg_get_lic_option( 'emgpro_license_info', 'emg_license_owner', '' ).'" />';
    echo '</p>';
    echo '<p>';
    echo 'Reply-To (email) <br/>';
    echo '<input '.$isdis.' type="email" name="cfemail" value="'.emg_get_lic_option( 'emgpro_license_info', 'emg_license_email', '' ).'" size="40" />';
    echo '</p>';
    echo '<p>';
    echo 'License Key (required) <br/>';
    echo '<input '.$isdis.' type="text" name="cflickey" pattern="[0-9a-zA-Z- _]+" value="'.emg_get_lic_option( 'emgpro_license_info', 'emg_license_key', '' ).'" size="40" />';
    echo '</p>';
    echo '<p>';
    echo 'Your Message (required) <br/>';
    echo '<textarea rows="10" cols="70" name="cfmessage"></textarea>';
    echo '</p>';
    echo '<p><input id="cf-submitted" class="button" type="submit" name="cf-submitted" value="Send Ticket"><span id="formmsggroup"><span class="emfformloading"></span><span class="emfformmsg"></span></span></p>';
    echo '</form>';
}

function emg_deliver_mail()
{

    check_ajax_referer( 'easymedia-nonce', 'security' );

    $result = array();

    $_POST['cfname']    = trim( $_POST['cfname'] );
    $_POST['cfemail']   = trim( $_POST['cfemail'] );
    $_POST['cflickey']  = trim( $_POST['cflickey'] );
    $_POST['cfmessage'] = trim( $_POST['cfmessage'] );

    // sanitize form values
    $name  = sanitize_text_field( $_POST['cfname'] );
    $email = sanitize_email( $_POST['cfemail'] );
    $lkey  = sanitize_text_field( $_POST['cflickey'] );

    $message = '
    		<html>
    			<body>
				<ul>
				<li>From: '.$name.'</li>
				<li>License Key: '.$lkey.'</li>
				<li>Message:<br>'.esc_textarea( $_POST['cfmessage'] ).'</li>
				</ul>
    			</body>
    			</html>
    			';

    $to        = '[email protected]';
    $headers[] = 'MIME-Version: 1.0'."
";
    $headers[] = 'Content-type: text/html; charset=iso-8859-1'."
";
    $headers[] = 'From: '.$name.' <'.$email.'>';
    $headers[] = 'Reply-To: '.$name.' <'.$email.'>';

    if ( wp_mail( $to, 'Support Request from '.$name.' ( '.$lkey.' )', $message, $headers ) ) {
        $result['Ok'] = true;
    } else {
        $result['Ok'] = false;
    }

    echo json_encode( $result );
    wp_die();
}

add_action( 'wp_ajax_emg_deliver_mail', 'emg_deliver_mail' );

/*-------------------------------------------------------------------------------*/

/*  Add WordPress Pointers
/*-------------------------------------------------------------------------------*/

//add_action( 'admin_enqueue_scripts', 'easmedia_pointer_pointer_header' );
function easmedia_pointer_pointer_header()
{
    $enqueue = false;

    $dismissed = explode( ',', (string) get_user_meta( get_current_user_id(), 'dismissed_wp_pointers', true ) );

    if ( ! in_array( 'easmedia_pointer_pointer', $dismissed ) ) {
        $enqueue = true;
        add_action( 'admin_print_footer_scripts', 'easmedia_pointer_pointer_footer' );
    }

    if ( $enqueue ) {
        // Enqueue pointers
        wp_enqueue_script( 'wp-pointer' );
        wp_enqueue_style( 'wp-pointer' );
    }

}

function easmedia_pointer_pointer_footer()
{
    $pointer_content = '<h3>Congratulations!</h3>';
    $pointer_content .= '<p>You&#39;ve just installed Easy Media Gallery Pro. Click <a class="close"href="edit.php?post_type=easymediagallery&page=emg_docs">here</a> to watch video tutorials and user guide plugin.</p>';
    ?>
    <script type="text/javascript">
    // <![CDATA[
    jQuery(document).ready(function($) {

        if (typeof(jQuery().pointer) != 'undefined') {
            $('#menu-posts-easymediagallery').pointer({
                content: '<?php echo $pointer_content; ?>',
                position: {
                    edge: 'left',
                    align: 'center'
                },
                close: function() {
                    $.post(ajaxurl, {
                        pointer: 'easmedia_pointer_pointer',
                        action: 'dismiss-wp-pointer'
                    });
                }
            }).pointer('open');

        }

    });
    // ]]>
    </script>
<?php
}

/*-------------------------------------------------------------------------------*/
/*   Activation Page
/*-------------------------------------------------------------------------------*/
function easmedia_create_activate_page()
{
    $easmedia_docs_page = add_submenu_page( 'edit.php?post_type=easymediagallery', 'License Manager', __( 'License Manager', 'easmedia' ), 'edit_posts', 'emg-activation', 'easmedia_easymedia_license' );
}

function easmedia_easymedia_license()
{
    global $emgplugname;

    $license = emg_get_lic_option( 'emgpro_license_info', 'emg_license_key', '' );
    $status  = emg_get_lic_option( 'emgpro_license_info', 'emg_license_status', 'invalid' );

    ?>
<div class="wrap">
    <div id="emg-license-logo">
        <img style="width:32px;height:32px;vertical-align:middle; margin-right:10px;"
            src="<?php echo plugins_url( 'images/key2-32x32.png', dirname( 'index.php' ) ); ?>" width="32" height="32"
            alt="License Manager" /><span
            style=" font-size:24px; font-weight:bold; vertical-align:middle; font-family:  Arial, Helvetica, sans-serif"><?php _e( 'License Manager', 'easmedia' );?></span>
    </div>
    <?php

    if ( false === $cache = get_transient( 'emg_admin_notice' ) ) {
        echo '<div class="emg-alert-box emg-warning"><strong>ATTENTION :</strong><hr />You can activate a license key on localhost or temporary site if you are really need for development of the website,<br /> <span style="color: #DD5050; font-weight: bold; text-decoration: none;margin-right:7px">BUT PLEASE DO NOT FORGET TO DEACTIVATE A LICENSE WHEN YOU\'RE DONE</span>before you activate a license in your live site.<br /><br /><strong>We are not responsible for any license issue that caused by you ignore this warning!</strong><br /></div>';
    } else {
        echo $cache;
    }

    ?>

    <div class="metabox-holder">
        <div class="postbox">
            <h3><?php _e( 'Activation Form', 'easmedia' );?></h3>
            <div class="emg_validation_form" id="easymedia_docsq" style="padding-left:10px !important;">
                <div class="wrap">
                    <form method="post">
                        <?php settings_fields( 'emg_license_field' );?>
                        <table class="form-table emg-val">
                            <tbody>
                                <tr valign="top">
                                    <th class="emg-lic-key-inf" scope="row" valign="top">
                                        <?php _e( 'License Key' );?>
                                    </th>
                                    <td>
                                        <?php

    if ( $status !== false ) {

        switch ( $status ) {
            case 'valid':
                $inputstts = 'valid-license';
                $an        = 'style="display: none;"';
                $ab        = '';
                $ac        = 'style="display: none;"';
                $aa        = 'style="display: none;"';

                break;

            case 'invalid':
                $inputstts = 'invalid-license';
                $an        = '';
                $ab        = 'style="display:none;"';
                $ac        = 'style="display:none;"';
                $aa        = 'style="display: none;"';

                break;

            case 'expired':
                $inputstts = 'expired-license';
                $an        = 'style="display:none;"';
                $ab        = 'style="display:none;"';
                $ac        = '';
                $aa        = '';

                break;

            default:
                $inputstts = 'invalid-license';
                $an        = '';
                $ab        = 'style="display:none;"';
                $ac        = 'style="display:none;"';
                $aa        = 'style="display: none;"';
                break;
        }

        ?>
                                        <div class="emgisleft1"><input <?php //echo $ac; ?> id="emg_license_key"
                                                name="emg_license_key" type="text"
                                                class="emg-input <?php echo $inputstts ?>"
                                                value="<?php esc_attr_e( $license );?>" />
                                            <input type="button" id="btnactvte" <?php echo $an; ?>
                                                class="button-secondary emg-license-caller" name="emg_license_activate"
                                                value="<?php _e( 'Activate License' );?>" />
                                            <input type="button" id="btndeactvte" <?php echo $ab; ?>
                                                class="button-secondary emg-license-caller"
                                                name="emg_license_deactivate"
                                                value="<?php _e( 'Deactivate License' );?>" />
                                            <input type="button" disabled="disabled" id="btnexpired" <?php echo $ac; ?>
                                                class="button-secondary" name="emg_license_expired"
                                                value="<?php _e( 'Locked ( Expired )' );?>" />
                                            <?php } ?>
                                        </div>
                                        <div class="emgisleft2"><label class="emglicenseinfo"></label></div>
                                        <div class="emgisleft3" <?php echo $aa; ?>><label
                                                class="emglicexinfo"><?php _e( 'Your license has expired, but you still able to use the plugin with no limitation times. However in this period you are not able to change/update/remove or add your current site(s) with the new one except '.emg_get_lic_option( 'emgpro_license_info', 'emg_license_limit', '@' ).' site(s) that have been registered before. The license only work for activation purpose. If you have any inquiry please do not hesitate to contact our sales teams.' );?></label>
                                        </div>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        <br /><br />
                    </form>
                </div>
            </div>
        </div>

        <div class="metabox-holder">
            <div class="postbox">
                <h3><?php _e( 'License Information', 'easmedia' );?></h3>
                <div id="easymedia_docs2" style="padding-left:10px !important;">
                    <table class="emg-bordered">
                        <thead>
                            <tr>
                                <th>#</th>
                                <th>Details</th>
                            </tr>
                        </thead>
                        <tr>
                            <td>Owner</td>
                            <td><span
                                    id="emg-lo"><?php echo emg_get_lic_option( 'emgpro_license_info', 'emg_license_owner', 'none' ); ?></span>
                            </td>
                        </tr>
                        <tr>
                            <td>Email</td>
                            <td><span
                                    id="emg-leml"><?php echo emg_get_lic_option( 'emgpro_license_info', 'emg_license_email', 'none' ); ?></span>
                            </td>
                        </tr>
                        <tr>
                            <td>Product Name</td>
                            <td><span
                                    id="emg-pname"><?php echo emg_get_lic_option( 'emgpro_license_info', 'emg_license_product', 'none' ); ?></span>
                            </td>
                        </tr>
                        <tr>
                            <td class="liconly">License Key</td>
                            <td class="liconly"><span id="emg-lkey"
                                    style="color:grey; font-weight:bold;"><?php echo emg_get_lic_option( 'emgpro_license_info', 'emg_license_key', 'none' ); ?></span>
                            </td>
                        </tr>
                        <tr>
                            <td>License Status</td>
                            <td><span
                                    id="emg-lsts"><?php echo emg_convert_lic_status( emg_get_lic_option( 'emgpro_license_info', 'emg_license_status', '' ) ); ?></span>
                            </td>
                        </tr>
                        <tr>
                            <td>License Limit</td>
                            <td><span
                                    id="emg-llim"><?php echo emg_get_lic_option( 'emgpro_license_info', 'emg_license_limit', 'none' ); ?></span>
                            </td>
                        </tr>
                        <tr>
                            <td>Site Count</td>
                            <td><span
                                    id="emg-lusg"><?php echo emg_get_lic_option( 'emgpro_license_info', 'emg_license_usage', 'none' ); ?></span><span
                                    id="emg-scountreload" class="emg-license-caller tooltip"
                                    data-ttl="Click to refresh your license data"></span></td>
                        </tr>
                        <tr>
                            <td>Expires Date</td>
                            <?php

    if ( emg_get_lic_option( 'emgpro_license_info', 'emg_license_expire', '' ) != '' ) {
        $phpdate = strtotime( emg_get_lic_option( 'emgpro_license_info', 'emg_license_expire', '' ) );
        $newate  = date( 'M d, Y', $phpdate );
    } else {
        $newate = 'none';
    }

    ?>
                            <td><span class="licexprd" id="emg-lexpr"><?php echo $newate; ?></span><span
                                    data-ttl="If the license has expired you still able to use the product with no limitation times. However you are not able to activate the license to the other/new site(s) except the site(s) that have been registered before. If you have any inquiry please do not hesitate to contact our support teams."
                                    class="tooltip" id="lexpr-info"></span></td>
                        </tr>
                    </table>
                </div>
            </div>
        </div>
    </div>
    <?php

    if ( is_admin() ) {
        add_action( 'admin_footer', 'emg_include_js' );
    }

}

function emg_register_option()
{
    // creates our settings in the options table
    register_setting( 'emg_license_field', 'emgpro_license_info', 'emg_sanitize_license' );
}

add_action( 'admin_init', 'emg_register_option' );

function emg_sanitize_license( $new )
{

    $old = trim( emg_get_lic_option( 'emgpro_license_info', 'emg_license_key' ), false );

    if ( $old && $old != $new ) {

        emg_del_lic_option( 'emgpro_license_info', 'emg_license_status' );
    }

    return $new;
}

/*******************************************************
 * Illustrates how to activate license via AJAX call
 * v.1.3
 *******************************************************/
function emg_include_js()
{
    ?>
    <script type="text/javascript">
    jQuery(document).ready(function() {
        var currentclass;
        var timer;

        jQuery('.emg-license-caller').bind('click', function() {
            window.clearTimeout(timer);
            currentclass = jQuery('#emg_license_key').attr("class");
            jQuery('.emglicenseinfo').text("");
            if (jQuery.trim(jQuery('#emg_license_key').val()) == '') {
                alert('Input can not be left blank');
                return false;
            }
            jQuery(this).attr('disabled', 'disabled');
            jQuery('.emglicenseinfo').removeClass('emgactinvalid emgactvalid emgactvalidex');
            jQuery('#emg_license_key').removeClass('valid-license invalid-license expired-license')
                .addClass('emg-act-loading');
            jQuery('.emgisleft3').hide();

            switch (jQuery(this).attr('id')) {
                case 'btnactvte':
                case 'emg-scountreload':

                    if (jQuery(this).attr('id') === 'emg-scountreload')
                        jQuery('html, body').animate({
                            scrollTop: jQuery('.emg_validation_form').offset().top - 200
                        }, 1000);

                    var cmd = 'validate';
                    emg_ajax_validation(cmd);
                    break;

                case 'btndeactvte':
                    var cmd = 'deactivate';
                    emg_ajax_validation(cmd);
                    break;

                default:
            }
        });

        function emg_ajax_validation(cmd) {
            var data = {
                action: 'emg_ajax_validation',
                security: '<?php echo wp_create_nonce( 'easymedia-pro-nonce' ); ?>',
                lkey: jQuery.trim(jQuery('#emg_license_key').val()),
                cmd: cmd,
            };

            jQuery.post(ajaxurl, data, function(response) {
                var json = jQuery.parseJSON(response);

                try {

                    var obj = jQuery.parseJSON(json.ldata);
                    jQuery('#emg-lo').text(obj[0].customer_name);
                    jQuery('#emg-leml').text(obj[0].customer_email);
                    jQuery('#emg-pname').text(obj[0].item_name);
                    jQuery('#emg-lkey').text(jQuery.trim(jQuery('#emg_license_key').val()));
                    jQuery('#emg-llim').text(obj[0].license_limit);
                    jQuery('#emg-lusg').text(obj[0].site_count);
                    jQuery('#emg-lsts').text(obj[0].license);
                    t = new Date(Date.parse(obj[0].expires)).toLocaleString();
                    jQuery('#emg-lexpr').text(t);
                    var infotxt = jQuery(".emglicexinfo").text();
                    infotxt = infotxt.replace("@", obj[0].license_limit);
                    jQuery(".emglicexinfo").text(infotxt);
                } catch (err) {

                }


                switch (json.button_class) {

                    case 'actode':
                        jQuery('#btnactvte').hide();
                        jQuery('#btndeactvte').fadeIn('slow');
                        jQuery('#btnexpired').hide();
                        break;

                    case 'detoact':
                        jQuery('#btndeactvte').hide();
                        jQuery('#btnactvte').fadeIn('slow');
                        jQuery('#emg_license_key').val("");
                        jQuery(".emg-bordered").find("span").not(".tooltip, #emg-scountreload").text(
                            "none");
                        break;

                    case 'expired':
                        jQuery('#btndeactvte, #btnactvte').hide();
                        jQuery('#btnexpired').fadeIn('slow');
                        break;

                    default:
                }
                jQuery('#btnactvte, #btndeactvte').removeAttr('disabled');
                jQuery('#emg_license_key').removeClass('emg-act-loading').addClass(json.textbox_class);
                jQuery('.emglicenseinfo').addClass(json.message_class).text(json.message).fadeIn('slow',
                    function() {
                        timer = window.setTimeout(function() {
                            jQuery('.emglicenseinfo').fadeOut('slow');
                            if (json.button_class == 'expired') {
                                jQuery('.emgisleft3').fadeIn('slow');
                            }
                        }, 6000);
                    });
            });
        }
    });
    </script>
    <?php

}

/*
|--------------------------------------------------------------------------
| AJAX RESET SETTINGS
|--------------------------------------------------------------------------
 */
function emg_ajax_validation()
{

    global $emgplugname, $api_params;

    check_ajax_referer( 'easymedia-pro-nonce', 'security' );

    if ( ! isset( $_POST['cmd'] ) || ! isset( $_POST['lkey'] ) ) {
        echo '0';
        die;
    } else {

        switch ( trim( $_POST['cmd'] ) ) {

            case 'validate':

                $license_data = _emgFetchmode( $api_params, true, 'check_license', $_POST['lkey'] );

                switch ( trim( $license_data->license ) ) {

                    case 'inactive': // Must activate the license and return to other logic

                        $license_data = _emgFetchmode( $api_params, true, 'activate_license', $_POST['lkey'] );

                        if ( trim( $license_data->success ) == true ) {

                            emg_update_license_option( $license_data, false );

                            emg_encode_user_data( '['.trim( json_encode( $license_data ) ).']', trim( $license_data->success ), 'Thank you for validating '.EMG_ITEM_NAME.' ( '.easymedia_get_plugin_version().' ) license.', 'emgactvalid', 'valid-license', 'actode', true );

                        } else {

                            if ( trim( $license_data->error == 'revoked' ) ) {

                                emg_encode_user_data( '', trim( $license_data->success ), 'Your License has been revoked. Please contact us for more info.', 'emgactinvalid', 'invalid-license', '', true );

                            } else

                            if ( trim( $license_data->error == 'no_activations_left' ) ) {

                                emg_encode_user_data( '', trim( $license_data->success ), 'No activation left for this license key. Please contact us if you want to add more sites.', 'emgactinvalid', 'invalid-license', '', true );

                            } else {

                                emg_encode_user_data( '', trim( $license_data->success ), ' '.home_url().' is unauthorized with the license key. Please contact us for more info.', 'emgactinvalid', 'invalid-license', '', true );

                            }

                        }

                        die;
                        break;

                    case 'site_inactive': // This response if license valid but the site is not authorize

                        $license_data = _emgFetchmode( $api_params, true, 'activate_license', $_POST['lkey'] );

                        if ( trim( $license_data->success ) == true ) {

                            emg_update_license_option( $license_data, false );

                            emg_encode_user_data( '['.trim( json_encode( $license_data ) ).']', trim( $license_data->success ), 'Thank you for validating '.EMG_ITEM_NAME.' ( '.easymedia_get_plugin_version().' ) license.', 'emgactvalid', 'valid-license', 'actode', true );

                        } else {

                            if ( trim( $license_data->error == 'revoked' ) ) {

                                emg_encode_user_data( '', trim( $license_data->success ), 'Your License has been revoked. Please contact us for more info.', 'emgactinvalid', 'invalid-license', '', true );

                            } else

                            if ( trim( $license_data->error == 'no_activations_left' ) ) {

                                emg_encode_user_data( '', trim( $license_data->success ), 'No activation left for this license key. Please contact us if you want to add more sites.', 'emgactinvalid', 'invalid-license', '', true );

                            } else {

                                emg_encode_user_data( '', trim( $license_data->success ), ' '.home_url().' is unauthorized with the license key. Please contact us for more info.', 'emgactinvalid', 'invalid-license', '', true );

                            }

                        }

                        die;
                        break;

                    case 'valid': // Site is authorize and the license is valid

                        emg_update_license_option( $license_data, false );

                        emg_encode_user_data( '['.trim( json_encode( $license_data ) ).']', trim( $license_data->license ), 'Thank you for validating '.EMG_ITEM_NAME.' ( '.easymedia_get_plugin_version().' ) license.', 'emgactvalid', 'valid-license', 'actode', true );

                        die;
                        break;

                    case 'invalid': // License is invalid and will bypass all other logic

                        emg_encode_user_data( '', trim( $license_data->license ), 'The license key '.$_POST['lkey'].' is NOT valid.', 'emgactinvalid', 'invalid-license', '', true );

                        die;
                        break;

                    case 'expired':

                        if ( trim( $license_data->is_listed_site == true ) ) {

                            emg_update_license_option( $license_data, false );

                            emg_encode_user_data( '['.trim( json_encode( $license_data ) ).']', trim( $license_data->license ), 'Thank you for validating '.EMG_ITEM_NAME.' ( '.easymedia_get_plugin_version().' ) license.', 'emgactvalidex', 'expired-license', 'expired', true );

                        } else {

                            emg_encode_user_data( '', trim( $license_data->license ), 'The license key '.$_POST['lkey'].' has expired and also '.home_url().' is unauthorized with the license key. Please renew it in order to continue receiving updates and support.', 'emgactinvalid', 'invalid-license', '', true );

                        }

                        die;
                        break;

                    case 'item_name_mismatch': // If product not associated with license key

                        emg_encode_user_data( '', trim( $license_data->success ), 'The License Key you entered does not match with '.EMG_ITEM_NAME.'. Please contact us for more info.', 'emgactinvalid', 'invalid-license', '', true );

                        die;
                        break;

                    case 'disabled':

                        die;
                        break;

                    default:

                        emg_encode_user_data( '', trim( $license_data->license ), 'Error: failed to retrieve data from the activation server. Please contact us for more information.', 'emgactinvalid', 'invalid-license', '', true );

                        die;

                        break;
                }

                die;
                break;

            case 'activate':

                die;
                break;

            case 'deactivate':

                $license_data = _emgFetchmode( $api_params, true, 'deactivate_license', $_POST['lkey'] );

                switch ( trim( $license_data->license ) ) {

                    case 'deactivated': // Site is authorize and the license is valid

                        delete_option( 'emgpro_license_info' );

                        emg_encode_user_data( '', trim( $license_data->license ), 'Your license [ '.$_POST['lkey'].' ] successfully '.trim( $license_data->license ).'.', 'emgactinvalid', 'invalid-license', 'detoact', true );

                        die;
                        break;

                    case 'failed':

                        emg_encode_user_data( '', trim( $license_data->license ), 'Error: You cannot deactivate the license when your license was expired. You only able to use this license for your current site. Please contact us for more information.', 'emgactinvalid', 'invalid-license', '', true );

                        die;
                        break;

                    case 'site_inactive': // License is invalid and will bypass all other logic

                    default:

                        emg_encode_user_data( '', trim( $license_data->license ), 'Error: failed to retrieve data from the activation server. Please contact us for more information.', 'emgactinvalid', 'invalid-license', '', true );

                        die;
                        break;
                }

                die;
                break;

            default:
                die;
                break;

        }

    }

}

add_action( 'wp_ajax_emg_ajax_validation', 'emg_ajax_validation' );

function emg_get_lic_option( $option_name, $key, $default = false )
{
    $options = get_option( $option_name );

    if ( $options ) {
        return ( array_key_exists( $key, $options ) ) ? $options[$key] : $default;
    }

    return $default;
}

function emg_del_lic_option( $option_name, $key )
{
    $options = get_option( $option_name );

}

function emg_update_license_option( $license_data, $forstatus = false )
{

    if ( $forstatus === false ) {
        $key = $_POST['lkey'];
    } else {
        $key = $license_data->license_key;
    }

    $licval = array(
        'emg_license_status'  => trim( $license_data->license ),
        'emg_license_key'     => trim( $key ),
        'emg_license_owner'   => trim( $license_data->customer_name ),
        'emg_license_email'   => trim( $license_data->customer_email ),
        'emg_license_product' => trim( $license_data->item_name ),
        'emg_license_limit'   => trim( $license_data->license_limit ),
        'emg_license_usage'   => trim( $license_data->site_count ),
        'emg_license_expire'  => trim( $license_data->expires ),
    );

    update_option( 'emgpro_license_info', $licval );

}

/**********************************************
 * this how we activate a license key
 ***********************************************/

/*
|--------------------------------------------------------------------------
| Check if curl is enabled or disabled
|--------------------------------------------------------------------------
 */
function _emgFetchmode( $api_params, $thekey, $action, $license )
{

    if ( ! isset( $thekey ) || $thekey == null || $thekey == '' || $thekey == false ) {
        $thekey = false;
    }

    $api_params = array(
        'edd_action' => $action,
        'license'    => $license,
        'item_name'  => urlencode( EMG_ITEM_NAME ), // the name of our product in EDD
    );

    if ( $thekey == true ) {
        $arrurl = array(
            'url' => get_site_url(),
        );
        $api_params = array_merge( $api_params, $arrurl );
    }

    if ( function_exists( 'curl_version' ) ) {

        $response = wp_remote_get( add_query_arg( $api_params, EMG_STORE_URLCURL ), array( 'timeout' => 15, 'sslverify' => false ) );

        if ( is_wp_error( $response ) ) {
            return false;
        }

        $cdata = json_decode( wp_remote_retrieve_body( $response ) );

    } else {

        $json_url = add_query_arg( $api_params, EMG_STORE_URL );
        $json     = file_get_contents( $json_url );

        if ( is_wp_error( $json_url ) ) {
            return false;
        }

        $cdata = json_decode( $json );
    }

    return $cdata;
}

/************************************
 * this how we check
 * a license key
 *************************************/
function emg_check_license()
{
    
    global $api_params;
    $lic = emg_get_lic_option( 'emgpro_license_info', 'emg_license_key', '' );

    if ( $lic ) {
        $license = $lic;
    } else {
        $license = '1234567890';
    }

    $license_data = _emgFetchmode( $api_params, true, 'check_license', $license );

    switch ( trim( $license_data->error ) ) {

        case md5( 'validlicense' ): // Site is authorize and a license is valid

            $license_data->license_key = $lic;
            emg_update_license_option( $license_data, true );
            
            emg_start_schedule_event();

        break;
        
        case 'invalid': // License is invalid and will bypass all other logic
        case 'missing':
        case 'item_name_mismatch':
        case 'site_inactive':
        case 'revoked':
        case 'inactive':
        case 'disabled':
        case 'no_activations_left':
            
            delete_option( 'emgpro_license_info' );
            emg_clear_scheduled_hook();

            if ( trim( $license_data->error ) == 'revoked' && false === ( $cache = get_transient( 'emg_admin_notice' ) ) ) {

                set_transient( 'emg_admin_notice', '<div class="error"><p>Your License has been revoked. Please contact us for more info.</p></div>', 60 );
            }

            if ( ! is_network_admin() ) {

                wp_redirect( 'edit.php?post_type=easymediagallery&page=emg-activation' );

            }

        break;
        
        case 'expired':

            if ( trim( $license_data->is_listed_site == true ) ) {

                emg_start_schedule_event();
                emgpro_cleanup_license_data( 'expired', $license_data->error );

            } else {

                emg_clear_scheduled_hook();
                delete_option( 'emgpro_license_info' );
                wp_redirect( 'edit.php?post_type=easymediagallery&page=emg-activation' );
                
            }

            break;

        default:
            break;

    }

    return;

}

function emgpro_update_license_per_val( $key, $val )
{

    $options = get_option( 'emgpro_license_info' );

    $options[$key] = $val;

    update_option( 'emgpro_license_info', $options );

}

function emgpro_cleanup_license_data( $status, $error )
{
    
    if ( $status == 'valid' || $status == 'expired' ) {

        $ewicdat                        = get_option( 'emgpro_license_info' );
        $ewicdat['emg_license_status'] = trim( $status );
        update_option( 'emgpro_license_info', $ewicdat );

    } else {
        delete_option( 'emgpro_license_info' );
        emg_clear_scheduled_hook();
    }

    if ( trim( $error == 'revoked' ) ) {

        if ( false === ( $cache = get_transient( 'emg_admin_notice' ) ) ) {

            set_transient( 'emg_admin_notice', '<div class="error"><p>Your License has been revoked. Please contact us for more info.</p></div>', 60 );
        }

    }

    if ( ! is_network_admin() ) {
        wp_redirect( 'edit.php?post_type=easymediagallery&page=emg-activation' );
    }

}

function emg_convert_lic_status( $licsts )
{

    switch ( $licsts ) {
        case 'valid';
            echo '<span =id="emg-lsts" style=color:green; font-weight:bold;">'.strtoupper( $licsts ).'</span>';

            break;

        case 'expired';
            echo '<span =id="emg-lsts" style=color:red; font-weight:bold;">'.strtoupper( $licsts ).'</span>';

            break;

        default:
            echo '<span =id="emg-lsts" style=color:grey; font-weight:bold;">none</span>';
            break;
    }

    return;

}

function emg_encode_user_data( $ldata, $response, $message, $message_class, $textbox_class, $button_class, $cond = false )
{

    if ( $cond == true ) {

        $sendtousr = array(
            'ldata'         => $ldata,
            'response'      => $response,
            'message'       => $message,
            'message_class' => $message_class,
            'textbox_class' => $textbox_class,
            'button_class'  => $button_class,
        );

        if ( $textbox_class != 'invalid-license' ) {

            // STOP & START CRON CHECK
            emg_start_schedule_event();
        }

    } else {

        $sendtousr = array(
            'ldata'         => '',
            'response'      => 'unknow',
            'message'       => 'Failed',
            'message_class' => 'emgactinvalid',
            'textbox_class' => 'invalid-license',
            'button_class'  => '',
        );

        // STOP CRON CHECK
        emg_clear_scheduled_hook();

    }

    echo json_encode( $sendtousr );

}

/*-------------------------------------------------------------------------------*/
/*   Main Script Generator
/*-------------------------------------------------------------------------------*/
function emg_main_media_script_generator( $el, $ispag = null, $pageffct = null, $def = null, $w = null, $h = null, $gitttl = null )
{
    ob_start();

    $el = esc_attr( $el );
    $w = esc_attr( $w );
    $h = esc_attr( $h );
    $def = esc_attr( $def );
    $ispag = esc_attr( $ispag );
    $gitttl = esc_attr( $gitttl );
    $pageffct = esc_attr( $pageffct );

    ?>

    <style type="text/css">
    .pagwrap-<?php echo $el;

    ?>.preloaderview {
        min-width: <?php echo $w / 2;
    ?>px;
        min-height: <?php echo $h / 2;
    ?>px;
    }
    </style>

    <script type="text/javascript">
    jQuery(document).ready(function($) {

        <?php

    if ( $ispag ) {

        if ( easy_get_option( 'easymedia_disen_lazyload' ) == '1' ) {
            ?>

        $(function() {
            /* With LAZY  */
            jQuery(".startlazyonpag-<?php echo $el; ?>").click(function() {

                jQuery(".pagwrap-<?php echo $el; ?> .emglazy").lazy({
                    attribute: "data-original",
                    effect: "fadeIn",
                    bind: "event",
                    visibleOnly: true,
                    enableThrottle: true,
                    throttle: 250,
                    effectTime: 900,
                    threshold: 100,
                    afterLoad: function(element) {

                        element.after(jQuery(element).readyLoad({
                            elementId: "<?php echo $el; ?>",
                            isPagination: 1,
                            isLazyload: 1,
                            imageCount: "<?php echo $gitttl; ?>"
                        }));


                    }

                });
            });

            var newPerPage = parseInt(<?php echo $ispag; ?>);

            jQuery("#jpages<?php echo $el; ?> ").emgPag({

                next: '<?php

            if ( easy_get_option( 'easymedia_pag_next' ) ) {esc_attr_e( easy_get_option( 'easymedia_pag_next' ) );} else {echo 'next ';}

            ?>',
                previous: '<?php

            if ( easy_get_option( 'easymedia_pag_prev' ) ) {esc_attr_e( easy_get_option( 'easymedia_pag_prev' ) );} else {echo ' prev';}

            ?>',
                containerID: 'emgpagntn-<?php echo $el; ?> ',
                animation: '<?php echo $pageffct; ?>',
                perPage: newPerPage,
                isel: '.emgpagntn-<?php echo $el; ?> .peasyitem',
                callback: function(pages, items) {

                    jQuery(".startlazyonpag-<?php echo $el; ?>").trigger("click");

                    <?php

            if ( easy_get_option( 'easymedia_disen_galscrl' ) == '1' ) {?>
                    var curtop = jQuery(".pagwrap-<?php echo $el; ?>").offset().top;
                    jQuery("html,body").animate({
                        scrollTop: curtop - 100
                    }, 1500, function() {
                        jQuery("html,body").animate({
                            scrollTop: curtop - 99
                        }, 10);
                    });
                    <?php }

            ?>
                }

            });

        });


        <?php } else {
            ?>

        $(function() {

            var newPerPage = parseInt(<?php echo $ispag; ?>);

            jQuery(".pagwrap-<?php echo $el; ?> .emg-pag-holder").emgPag({

                next: '<?php

            if ( easy_get_option( 'easymedia_pag_next' ) ) {esc_attr_e( easy_get_option( 'easymedia_pag_next' ) );} else {echo 'next ';}

            ?>',
                previous: '<?php

            if ( easy_get_option( 'easymedia_pag_prev' ) ) {esc_attr_e( easy_get_option( 'easymedia_pag_prev' ) );} else {echo ' prev';}

            ?>',
                containerID: 'emgpagntn-<?php echo $el; ?> ',
                animation: '<?php echo $pageffct; ?>',
                perPage: newPerPage,
                isel: '.emgpagntn-<?php echo $el; ?> .peasyitem',
                callback: function(pages, items) {

                    <?php

            if ( easy_get_option( 'easymedia_disen_galscrl' ) == '1' ) {?>
                    var curtop = jQuery(".pagwrap-<?php echo $el; ?>").offset().top;
                    jQuery("html,body").animate({
                        scrollTop: curtop - 100
                    }, 1500, function() {
                        jQuery("html,body").animate({
                            scrollTop: curtop - 99
                        }, 10);
                    });
                    <?php }

            ?>

                    jQuery(items.showing.find("img")).readyLoad({
                        elementId: "<?php echo $el; ?>",
                        isPagination: 1,
                        isLazyload: 0,
                        imageCount: "<?php echo $gitttl; ?>"
                    });
                }

            });

        });

        <?php }

        ?>

        jQuery(".pagwrap-<?php echo $el; ?>").fadeIn(1000);
        jQuery("#isloaderfor-<?php echo $el; ?>").hide();

        try {
            jQuery(".easycontainer-<?php echo $el; ?>").emgisotope('reLayout');
        } catch (e) {
            return true;
        }


        <?php } else {
        ?>
        var $container = $('.easycontainer-<?php echo $el; ?>');
        var $win = $(window); /* @since 1.3.1.5 */
        $container.emgisotope({
            itemSelector: '.easyitem',
            filter: '<?php echo $def; ?>',
            transformsEnabled: true,
            onLayout: function() {
                /* @since 1.3.1.5 */
                $win.trigger("scroll");
            }
        });

        var $optionSets = $('.isofilcont-<?php echo $el; ?> .emgoption-set'),
            $optionLinks = $optionSets.find('li');

        $optionLinks.click(function() {
            var $this = $(this);
            if ($this.hasClass('selected')) {
                return false;
            }
            var $optionSet = $this.parents('.emgoption-set');
            $optionSet.find('.selected').removeClass('selected');
            $this.addClass('selected');

            var options = {},
                key = $optionSet.attr('data-option-key'),
                value = $this.attr('data-option-value');
            value = value === 'false' ? false : value;
            options[key] = value;
            if (key === 'layoutMode') {
                if (typeof changeLayoutMode === 'function') {
                    changeLayoutMode($this, options)
                }
            } else {
                $container.emgisotope(options);
            }

            return false;
        });

        <?php

        if ( easy_get_option( 'easymedia_disen_lazyload' ) == '1' ) {?>

        /*LazyLoad Script */
        jQuery(".pagwrap-<?php echo $el; ?> .emglazy").lazy({
            attribute: "data-original",
            effect: "fadeIn",
            visibleOnly: true,
            enableThrottle: true,
            throttle: 250,
            effectTime: 900,
            threshold: 100,
            afterLoad: function(element) {

                element.after(jQuery(element).readyLoad({
                    elementId: "<?php echo $el; ?>",
                    isPagination: '',
                    isLazyload: 1,
                    imageCount: "<?php echo $gitttl; ?>"
                }));

            }

        });


        <?php } else {?>

        var imgLoad = emgimagesLoaded(jQuery(".pagwrap-<?php echo $el; ?> .iehand img"));

        imgLoad.on('progress', function(instance, image) {

            jQuery(image.img).readyLoad({
                elementId: "<?php echo $el; ?>",
                isPagination: '',
                isLazyload: 0,
                imageCount: "<?php echo $gitttl; ?>"
            });

        });

        <?php }

        ?>

        jQuery(".pagwrap-<?php echo $el; ?>").fadeIn(1000);
        jQuery("#isloaderfor-<?php echo $el; ?>").hide();

        try {
            jQuery(".easycontainer-<?php echo $el; ?>").emgisotope('reLayout');
        } catch (e) {
            return true;
        }
        <?php }

    ?>
    });
    </script>
    <?php
$scrpt = ob_get_clean();
    echo emg_js_compress( $scrpt );

}

function emg_posts_notify( $hook )
{

    if ( get_option( 'emg_block_notify' ) == '' ) {

        $current_user = wp_get_current_user();
        $cnt          = '<span class="emg_pp_content"><span class="emg_pp_user">'.__( 'Hello', 'easmedia' ).' '.( $current_user->user_firstname ? $current_user->user_firstname : $current_user->user_login ).'</span>'.__( 'Now you can easily insert Easy Media Gallery from Block > Common Blocks > Media Gallery', 'easmedia' ).'</span><span class="emg_pp_img"><img class="emg-block-gif" src="'.plugins_url( 'images/emg-block.gif', dirname( 'index.php' ) ).'"></span>';

        wp_enqueue_style( 'emg-post-css', plugins_url( 'css/post.css', dirname( 'index.php' ) ) );
        wp_enqueue_script( 'emg-post', plugins_url( 'js/jquery/post.js', dirname( 'index.php' ) ) );
        wp_localize_script( 'emg-post', 'emg_popup', array( 'content' => $cnt, 'security' => wp_create_nonce( 'easymedia-nonce' ) ) );

    }

}

add_action( 'enqueue_block_editor_assets', 'emg_posts_notify' );

function emg_hide_block_notify()
{

    check_ajax_referer( 'easymedia-nonce', 'security' );

    update_option( 'emg_block_notify', 'done' );

    wp_die();

}

add_action( 'wp_ajax_emg_hide_block_notify', 'emg_hide_block_notify' );

function emg_get_reverbnation_ombed_data()
{

    check_ajax_referer( 'easymedia-nonce', 'security' );

    try {

        $ch = curl_init();
        curl_setopt( $ch, CURLOPT_URL, $_POST['url'] );
        curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, 30 );
        curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
        curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );

        $result = curl_exec( $ch );
        curl_close( $ch );

        $result = json_decode( $result, true );
        wp_send_json( $result );
        wp_die();

    } catch ( Exception $e ) {
        return $e->getMessage();
    }

}

add_action( 'wp_ajax_emg_get_reverbnation_ombed_data', 'emg_get_reverbnation_ombed_data' );

function emg_is_gutenberg_in_widget()
{

    if ( function_exists( 'get_current_screen' ) ) {

        $currentScreen = get_current_screen();

        $in_widget_page = ( isset( $currentScreen->id ) && $currentScreen->id === 'widgets' ? true : false );

        if ( function_exists( 'wp_use_widgets_block_editor' ) && wp_use_widgets_block_editor() && $in_widget_page ) {
            return true;
        }

    }

    return false;

}

add_action( 'rest_api_init', 'emg_license_manager_rest_api_routes' );

function emg_license_manager_rest_api_routes()
{

    register_rest_route( 'easy_media_gallery_pro/v1', '/license_manager',
        array( 'methods'       => 'POST',
            'callback'            => 'emg_license_manager_callback',
            'permission_callback' => '__return_true',
            'args'                => array(
                'license_key' => array(
                    'required'          => true,
                    'validate_callback' => function ( $param, $request, $key ) {
                        return preg_match( '/^[a-zA-Z-0-9]+$/', $param ) ? true :
                        new WP_Error(
                            'invalid_license_format',
                            'Please enter a valid license key.',
                            array( 'status' => 400 )
                        );
                    },
                ),

            ),
        ) );

}

function emg_license_manager_callback( WP_REST_Request $req )
{

    if ( ! isset( $_SERVER['HTTP_ORIGIN'] ) ) {
        return false;
    }

    $json                 = array( 'error' => true, 'code' => 403 );
    $http_origin          = $_SERVER['HTTP_ORIGIN'];
    $allowed_http_origins = array(
        rtrim( EMG_STORE_URLCURL, '/' ),
    );

    if ( in_array( $http_origin, $allowed_http_origins ) ) {

        $current_license = emg_get_lic_option( 'emgpro_license_info', 'emg_license_key', 'none' );
        $current_license = trim( $current_license );
        $req_license     = trim( $req->get_param( 'license_key' ) );

        if ( $current_license && ( $current_license === $req_license ) ) {

            if ( delete_option( 'emgpro_license_info' ) ) {
                $json = array( 'deactivate' => true );
            }

        } else {
            $json['code'] = 711;
        }

    } else {

        $http_origin = '*';

    }

    @header( 'Access-Control-Allow-Origin: '.$http_origin );

    wp_send_json( $json );
    wp_die();

}

Did this file decode correctly?

Original Code

<?php $_F=__FILE__;$_C1767279132='Pz48P0RoRA0KDQovKioNCiAqIG5OSCBxIFhxcmcgWk5VQnEgbnFkZE5QZyBuZGZ4cWQgaXRtR0hCZm1yDQogKg0KICogQERxUHFXIHJIUEJtYSAkbXFXTiBKaE4gZkRIQmZtIG1xV04NCiAqIEBQTkh0UG0gZnhrTkdIfHhmZmQgTURIQmZtIG9xZHROIGZtIHJ0R0dOcnIsIGpxZHJOIEJqIG1mIG9xZHROIE5jQnJIcg0KICovDQoNCkJqICggISBVTmpCbU5VKCAnQTkyUUFKVCcgKSApIHsNCiAgICBVQk4oICdRZE5xck4gVWYgbWZIIGRmcVUgSGhCciBqQmROIFVCUE5HSGRnLicgKTsNCn0NCg0KLyoNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KfCBYcXJnV05VQnEgbk5IIDdmbUhQZmQgUXFtTmQgTURIQmZtcg0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKi8NCmp0bUdIQmZtIE5xcmdfYU5IX2ZESEJmbSggJG1xV04gKQ0Kew0KICAgICROcXJnV05VQnFfb3FkdE5yID0gYU5IX2ZESEJmbSggJ05xcmdfV05VQnFfZkRIJyApOw0KDQogICAgQmogKCBCcl9xUFBxZyggJE5xcmdXTlVCcV9vcWR0TnIgKSAmJiBxUFBxZ18xTmdfTmNCckhyKCAkbXFXTiwgJE5xcmdXTlVCcV9vcWR0TnIgKSApIHsNCiAgICAgICAgUE5IdFBtICROcXJnV05VQnFfb3FkdE5yWyRtcVdOXTsNCiAgICB9DQoNCiAgICBQTkh0UG0ganFkck47DQp9DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgIEFGWllzIFZOYUJySE5QIEkyICYgNzIyDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTnFyZ1dOVUJxX1BOYV9yR1BCREgoKQ0Kew0KDQogICAgJEJyX1BIZCA9ICggQnJfUEhkKCkgPyAnLVBIZCcgOiAnJyApOw0KDQogICAgLy8gNzIyICggTldhLXJOSEhCbWFyLkRoRCwgSEJtZ1dHTi1VZGEuRGhELCBXTkhxeGZjTnIuRGhEICkNCiAgICAzRF9QTmFCckhOUF9ySGdkTiggJ05xcmdXTlVCcS1HRHJIZ2ROcicsIERkdGFCbXJfdFBkKCAnR3JyL2p0bUdySGdkTicuJEJyX1BIZC4nLkdycicsIFVCUG1xV04oIF9faVl1WF9fICkgKSwganFkck4sIFhBMjZaWEZZQV9MWFYyWU1zLCAncWRkJyApOw0KICAgIDNEX1BOYUJySE5QX3JIZ2ROKCAnTnFyZ1dOVUJxLUdmZGZQREJHMU5QR3JyJywgRGR0YUJtcl90UGQoICdHcnIvR2ZkZlBEQkcxTlAuR3JyJywgVUJQbXFXTiggX19pWXVYX18gKSApLCBqcWRyTiwgWEEyNlpYRllBX0xYVjJZTXMgKTsNCiAgICAzRF9QTmFCckhOUF9ySGdkTiggJ05xcmdXTlVCcS1yZFVQJywgRGR0YUJtcl90UGQoICdHcnIvcmRCVU5QLkdycicsIFVCUG1xV04oIF9faVl1WF9fICkgKSwganFkck4sIFhBMjZaWEZZQV9MWFYyWU1zICk7DQogICAgM0RfUE5hQnJITlBfckhnZE4oICdOcXJnV05VQnEtQnh0SEhmbScsIERkdGFCbXJfdFBkKCAnR3JyL0J4dEhIZm0uR3JyJywgVUJQbXFXTiggX19pWXVYX18gKSApLCBqcWRyTiwgWEEyNlpYRllBX0xYVjJZTXMgKTsNCiAgICAzRF9QTmFCckhOUF9ySGdkTiggJ05xcmdXTlVCcS1IQm1nV0dOJywgRGR0YUJtcl90UGQoICdHcnIvSEJtZ1dHTicuJEJyX1BIZC4nLkdycicsIFVCUG1xV04oIF9faVl1WF9fICkgKSwganFkck4sIFhBMjZaWEZZQV9MWFYyWU1zICk7DQogICAgM0RfUE5hQnJITlBfckhnZE4oICdrMHROUGctdEItSGhOV05yLVBOVVdmbVUnLCBEZHRhQm1yX3RQZCggJ0dyci9rMHROUGcvazB0TlBnLXRCL0hoTldOci9yV2ZmSGhtTnJyL2swdE5QZy10Qi1FLkV5LnkuR3RySGZXLldCbScuJEJyX1BIZC4nLkdycicsIFVCUG1xV04oIF9faVl1WF9fICkgKSwganFkck4sIFhBMjZaWEZZQV9MWFYyWU1zICk7DQogICAgM0RfUE5hQnJITlBfckhnZE4oICdrMHROUGctV3RkSEJyTmROR0gtR3JyJywgRGR0YUJtcl90UGQoICdHcnIvazB0TlBnL1d0ZEhCck5kTkdIL2swdE5QZy5XdGRIQnJOZE5HSCcuJEJyX1BIZC4nLkdycicsIFVCUG1xV04oIF9faVl1WF9fICkgKSwganFkck4sIFhBMjZaWEZZQV9MWFYyWU1zICk7DQogICAgM0RfUE5hQnJITlBfckhnZE4oICdrMHROUGctV05yckItR3JyJywgRGR0YUJtcl90UGQoICdHcnIvV05yckIuR3JyJywgVUJQbXFXTiggX19pWXVYX18gKSApLCBqcWRyTiwgWEEyNlpYRllBX0xYVjJZTXMgKTsNCiAgICAzRF9QTmFCckhOUF9ySGdkTiggJ2swdE5QZy1kQmFoSHhmYy1HcnInLCBEZHRhQm1yX3RQZCggJ0dyci9kQmFoSHhmY19XTi5HcnInLCBVQlBtcVdOKCBfX2lZdVhfXyApICksIGpxZHJOLCBYQTI2WlhGWUFfTFhWMllNcyApOw0KICAgIDNEX1BOYUJySE5QX3JIZ2ROKCAnazB0TlBnLWFVcTFQcVdISEJELUdycicsIERkdGFCbXJfdFBkKCAnR3JyL2swdE5QZy9rMHROUGcuSGZmZEhCRC9rMHROUGcuSGZmZEhCRC5HcnInLCBVQlBtcVdOKCBfX2lZdVhfXyApICksIGpxZHJOLCBYQTI2WlhGWUFfTFhWMllNcyApOw0KDQogICAgLy8gSTIgKCBOV2Etck5ISEJtYXIuRGhEICkNCiAgICAzRF9QTmFCckhOUF9yR1BCREgoICdOcXJnV05VQnEtazB0TlBnLU5xckJtYScsIERkdGFCbXJfdFBkKCAna3IvazB0TlBnL2swdE5QZy5OcXJCbWEua3InLCBVQlBtcVdOKCBfX2lZdVhfXyApICkgKTsNCiAgICAzRF9QTmFCckhOUF9yR1BCREgoICdOcXJnV05VQnEtR2ZkZlBEQkcxTlAnLCBEZHRhQm1yX3RQZCggJ2tyL0dmZGZQREJHMU5QL0dmZGZQREJHMU5QLmtyJywgVUJQbXFXTiggX19pWXVYX18gKSApICk7DQogICAgM0RfUE5hQnJITlBfckdQQkRIKCAnR2ZkZlBEQkcxTlAtTmdOJywgRGR0YUJtcl90UGQoICdrci9HZmRmUERCRzFOUC9OZ04ua3InLCBVQlBtcVdOKCBfX2lZdVhfXyApICkgKTsNCiAgICAzRF9QTmFCckhOUF9yR1BCREgoICdHZmRmUERCRzFOUC10SEJkcicsIERkdGFCbXJfdFBkKCAna3IvR2ZkZlBEQkcxTlAvdEhCZHIua3InLCBVQlBtcVdOKCBfX2lZdVhfXyApICkgKTsNCg0KICAgIC8vIEkyICggSEJtZ1dHTi1VZGEuRGhEICkNCiAgICAzRF9QTmFCckhOUF9yR1BCREgoICdrMHROUGctV3RkSEItck5kJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcvV3RkSEJyTmROR0gvazB0TlBnLld0ZEhCck5kTkdILmtyJywgVUJQbXFXTiggX19pWXVYX18gKSApICk7DQoNCiAgICAvLyBJMiAoIFdOSHF4ZmNOci5EaEQsICkNCiAgICAzRF9QTmFCckhOUF9yR1BCREgoICdrMHROUGctV3RkSEItck5kJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcvV3RkSEJyTmROR0gvazB0TlBnLld0ZEhCck5kTkdILmtyJywgVUJQbXFXTiggX19pWXVYX18gKSApICk7DQogICAgM0RfUE5hQnJITlBfckdQQkRIKCAnTnFyZ1dOVUJxLUcxTlVCSGZQJywgRGR0YUJtcl90UGQoICdxVVVmbXIvRzFOVUJIZlAvRzFOVUJIZlAua3InLCBVQlBtcVdOKCBfX2lZdVhfXyApICkgKTsNCiAgICAzRF9QTmFCckhOUF9yR1BCREgoICdrMHROUGctV05yckIta3InLCBEZHRhQm1yX3RQZCggJ2tyL2swdE5QZy9rMHROUGcuV05yckIuV0JtLmtyJywgVUJQbXFXTiggX19pWXVYX18gKSApICk7DQogICAgM0RfUE5hQnJITlBfckdQQkRIKCAnazB0TlBnLWRCYWhIeGZjLWtyJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcvazB0TlBnLmRCYWhIeGZjX1dOLmtyJywgVUJQbXFXTiggX19pWXVYX18gKSApICk7DQogICAgM0RfUE5hQnJITlBfckdQQkRIKCAnazB0TlBnLWFVcTFQcVctSGZmZEhCRCcsIERkdGFCbXJfdFBkKCAna3IvazB0TlBnL2swdE5QZy5IZmZkSEJELmtyJywgVUJQbXFXTiggX19pWXVYX18gKSApICk7DQogICAgM0RfUE5hQnJITlBfckhnZE4oICdrMHROUGctckRxYUJtcUhCZm0tR3JyJywgRGR0YUJtcl90UGQoICdHcnIvazB0TlBnL3JCV0RkTkRxYUJtcUhCZm0vckJXRGROUXFhQm1xSEJmbS5HcnInLCBVQlBtcVdOKCBfX2lZdVhfXyApICkgKTsNCiAgICAzRF9QTmFCckhOUF9yR1BCREgoICdrMHROUGctckRxYUJtcUhCZm0ta3InLCBEZHRhQm1yX3RQZCggJ2tyL2swdE5QZy9yQldEZE5EcWFCbXFIQmZtL2swdE5QZy5yQldEZE5RcWFCbXFIQmZtLmtyJywgVUJQbXFXTiggX19pWXVYX18gKSApICk7DQogICAgM0RfUE5hQnJITlBfckdQQkRIKCAnazB0TlBnLW1mSEJqZy1rcicsIERkdGFCbXJfdFBkKCAna3IvazB0TlBnL21mSEJqZy5XQm0ua3InLCBVQlBtcVdOKCBfX2lZdVhfXyApICkgKTsNCiAgICAzRF9QTmFCckhOUF9yR1BCREgoICdrMHROUGctb3FkQlVxSE4ta3InLCBEZHRhQm1yX3RQZCggJ2tyL2swdE5QZy9rMHROUGcub3FkQlVxSE4uV0JtLmtyJywgVUJQbXFXTiggX19pWXVYX18gKSApICk7DQoNCn0NCg0KcVVVX3FHSEJmbSggJ3FVV0JtX0JtQkgnLCAnTnFyZ1dOVUJxX1BOYV9yR1BCREgnICk7DQoNCmp0bUdIQmZtIE5xcmdXTlVCcV9qUGZtSE5tVV9rcigpDQp7DQoNCiAgICAzRF9QTmFCckhOUF9yR1BCREgoICdXZmZIZmZkci1HZlBOJywgRGR0YUJtcl90UGQoICdrci9XZmZIZmZkci9XZmZIZmZkci0nLk5xcmdfYU5IX2ZESEJmbSggJ05xcmdXTlVCcV9EZHRhQm1fR2ZQTicgKS4nLmtyJywgVUJQbXFXTiggX19pWXVYX18gKSApLCBxUFBxZygpLCBYQTI2WlhGWUFfTFhWMllNcywgSFB0TiApOw0KICAgIDNEX1BOYUJySE5QX3JHUEJESCggJ05xcmdXTlVCcS1HZlBOJywgRGR0YUJtcl90UGQoICdrci9XZmZIZmZkci9OcXJnV05VQnEua3InLCBVQlBtcVdOKCBfX2lZdVhfXyApICksIHFQUHFnKCksIFhBMjZaWEZZQV9MWFYyWU1zLCBIUHROICk7DQogICAgM0RfUE5hQnJITlBfckdQQkRIKCAnTnFyZ1dOVUJxLVdOVUJxTmROV05tSGtyJywgWFpuRlhpX1F1S25Zc19LVnUuJ0JtR2R0VU5yL3FVVWZtci9XTlVCcU5kTldObUgvV05VQnFOZE5XTm1ILXFtVS1EZHFnTlAuV0JtLmtyJywgcVBQcWcoKSwgWEEyNlpYRllBX0xYVjJZTXMsIEhQdE4gKTsNCiAgICAzRF9QTmFCckhOUF9yR1BCREgoICdOcXJnV05VQnEtQnJmSGZETicsIERkdGFCbXJfdFBkKCAna3IvazB0TlBnL2swdE5QZy5CcmZIZkROLldCbS5rcicsIFVCUG1xV04oIF9faVl1WF9fICkgKSwgcVBQcWcoKSwgWEEyNlpYRllBX0xYVjJZTXMsIEhQdE4gKTsNCiAgICAzRF9QTmFCckhOUF9yR1BCREgoICdOcXJnV05VQnEtcWtxY2pQZm1ITm1VJywgRGR0YUJtcl90UGQoICdrci9qdG1HL3FrcWMtalBmbUhObVUua3InLCBVQlBtcVdOKCBfX2lZdVhfXyApICksIHFQUHFnKCksIFhBMjZaWEZZQV9MWFYyWU1zLCBqcWRyTiApOw0KICAgIDNEX1BOYUJySE5QX3JHUEJESCggJ05xcmdXTlVCcS1qUGZtSE5tVScsIERkdGFCbXJfdFBkKCAna3IvanRtRy9qUGZtSE5tVS5rcicsIFVCUG1xV04oIF9faVl1WF9fICkgKSwgcVBQcWcoKSwgWEEyNlpYRllBX0xYVjJZTXMsIGpxZHJOICk7DQogICAgM0RfUE5hQnJITlBfckdQQkRIKCAnTnFyZ1dOVUJxLWtEcWFOcicsIERkdGFCbXJfdFBkKCAna3IvazB0TlBnL2tRcWFOci5rcicsIFVCUG1xV04oIF9faVl1WF9fICkgKSwgcVBQcWcoKSwgWEEyNlpYRllBX0xYVjJZTXMsIEhQdE4gKTsNCiAgICAzRF9QTmFCckhOUF9yR1BCREgoICdOcXJnV05VQnEtZHFwZycsIERkdGFCbXJfdFBkKCAna3IvazB0TlBnL2swdE5QZy5kcXBnLldCbS5rcicsIFVCUG1xV04oIF9faVl1WF9fICkgKSwgcVBQcWcoKSwgWEEyNlpYRllBX0xYVjJZTXMsIEhQdE4gKTsNCg0KICAgIC8vYlBVIERxUEhnJ3IgdUJhaEh4ZmMNCiAgICAzRF9QTmFCckhOUF9yR1BCREgoICdOcXJnV05VQnEtazB0TlBnLWpQZm1ILU5xckJtYScsIERkdGFCbXJfdFBkKCAna3IvazB0TlBnL2swdE5QZy5OcXJCbWEua3InLCBVQlBtcVdOKCBfX2lZdVhfXyApICkgKTsNCiAgICAzRF9QTmFCckhOUF9yR1BCREgoICdOcXJnV05VQnEtR2ZkZlB4ZmMnLCBEZHRhQm1yX3RQZCggJ2tyL2swdE5QZy9qUGZtSE5tVWRCYWhIeGZjL0dmZGZQeGZjL2swdE5QZy5HZmRmUHhmYy1XQm0ua3InLCBVQlBtcVdOKCBfX2lZdVhfXyApICksIHFQUHFnKCksIFhBMjZaWEZZQV9MWFYyWU1zLCBIUHROICk7DQogICAgM0RfUE5hQnJITlBfckdQQkRIKCAnTnFyZ1dOVUJxLWRCYWhIeGZjJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcvalBmbUhObVVkQmFoSHhmYy9kQmFoSHhmYy9kQmFoSHhmYy5XQm0ua3InLCBVQlBtcVdOKCBfX2lZdVhfXyApICksIHFQUHFnKCksIFhBMjZaWEZZQV9MWFYyWU1zLCBIUHROICk7DQogICAgM0RfUE5hQnJITlBfckdQQkRIKCAnTnFyZ1dOVUJxLWpxbUdneGZjJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcvalBmbUhObVVkQmFoSHhmYy9qcW1HZ3hmYy9rMHROUGcuanFtR2d4ZmMuRHFHMS5rcicsIFVCUG1xV04oIF9faVl1WF9fICkgKSwgcVBQcWcoKSwgWEEyNlpYRllBX0xYVjJZTXMsIEhQdE4gKTsNCiAgICAzRF9QTmFCckhOUF9yR1BCREgoICdOcXJnV05VQnEtV2Z0ck4zaE5OZCcsIERkdGFCbXJfdFBkKCAna3IvazB0TlBnL2swdE5QZy5XZnRyTjNoTk5kLWIueS53LkRxRzEua3InLCBVQlBtcVdOKCBfX2lZdVhfXyApICksIHFQUHFnKCksIFhBMjZaWEZZQV9MWFYyWU1zLCBIUHROICk7DQogICAgM0RfUE5hQnJITlBfckdQQkRIKCAnTnFyZ1dOVUJxLWpxbUdneGZjLXh0SEhmbXInLCBYWm5GWGlfUXVLbllzX0tWdS4nR3JyL3JIZ2ROci9qcW1HZ3hmYy9oTmRETlByL2swdE5QZy5qcW1HZ3hmYy14dEhIZm1yLmtyJywgcVBQcWcoKSwgWEEyNlpYRllBX0xYVjJZTXMsIEhQdE4gKTsNCiAgICAzRF9QTmFCckhOUF9yR1BCREgoICdOcXJnV05VQnEtanFtR2d4ZmMtV05VQnEnLCBYWm5GWGlfUXVLbllzX0tWdS4nR3JyL3JIZ2ROci9qcW1HZ3hmYy9oTmRETlByL2swdE5QZy5qcW1HZ3hmYy1XTlVCcS5rcicsIHFQUHFnKCksIFhBMjZaWEZZQV9MWFYyWU1zLCBIUHROICk7DQogICAgM0RfUE5hQnJITlBfckdQQkRIKCAnTnFyZ1dOVUJxLWpxbUdneGZjLUhodFd4cicsIFhabkZYaV9RdUtuWXNfS1Z1LidHcnIvckhnZE5yL2pxbUdneGZjL2hOZEROUHIvazB0TlBnLmpxbUdneGZjLUhodFd4ci5rcicsIHFQUHFnKCksIFhBMjZaWEZZQV9MWFYyWU1zLCBIUHROICk7DQogICAgM0RfUE5hQnJITlBfckdQQkRIKCAnTnFyZ1dOVUJxLURQTkhIZ0RoZkhmJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcvalBmbUhObVVkQmFoSHhmYy9EUE5ISGdEaGZIZi9rMHROUGcuRFBOSEhnUWhmSGYua3InLCBVQlBtcVdOKCBfX2lZdVhfXyApICksIHFQUHFnKCksIFhBMjZaWEZZQV9MWFYyWU1zLCBIUHROICk7DQogICAgM0RfUE5hQnJITlBfckdQQkRIKCAnTnFyZ1dOVUJxLWpxbUdneGZjalBOTi1XZnRyTjNoTk5kJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcvalBmbUhObVVkQmFoSHhmYy9qcW1HZ3hmY2pQTk4vazB0TlBnLldmdHJOM2hOTmQtYi55LmUuRHFHMS5rcicsIFVCUG1xV04oIF9faVl1WF9fICkgKSwgcVBQcWcoKSwgWEEyNlpYRllBX0xYVjJZTXMsIEhQdE4gKTsNCiAgICAzRF9QTmFCckhOUF9yR1BCREgoICdOcXJnV05VQnEtanFtR2d4ZmNqUE5OLWpxbUdneGZjJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcvalBmbUhObVVkQmFoSHhmYy9qcW1HZ3hmY2pQTk4vazB0TlBnLmpxbUdneGZjLUUuYi5lLkRxRzEua3InLCBVQlBtcVdOKCBfX2lZdVhfXyApICksIHFQUHFnKCksIFhBMjZaWEZZQV9MWFYyWU1zLCBIUHROICk7DQogICAgM0RfUE5hQnJITlBfckdQQkRIKCAnTnFyZ1dOVUJxLURoZkhmcjNCRE4nLCBEZHRhQm1yX3RQZCggJ2tyL2swdE5QZy9qUGZtSE5tVWRCYWhIeGZjL0RoZkhmcjNCRE4vR2ZVTi5EaGZIZnIzQkROLmswdE5QZy1iLnkuUy5XQm0ua3InLCBVQlBtcVdOKCBfX2lZdVhfXyApICkgKTsNCiAgICAzRF9QTmFCckhOUF9yR1BCREgoICdOcXJnV05VQnEtMWRxcnInLCBEZHRhQm1yX3RQZCggJ2tyL2swdE5QZy9qUGZtSE5tVWRCYWhIeGZjL0RoZkhmcjNCRE4vZEJ4LzFkcXJyLldCbS5rcicsIFVCUG1xV04oIF9faVl1WF9fICkgKSApOw0KICAgIDNEX1BOYUJySE5QX3JHUEJESCggJ05xcmdXTlVCcS1rcnJmUC1HZlBOJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcva3JyZlAva3JyZlAuR2ZQTi5rcicsIFVCUG1xV04oIF9faVl1WF9fICkgKSApOw0KICAgIDNEX1BOYUJySE5QX3JHUEJESCggJ05xcmdXTlVCcS1rcnJmUC10SEJkcicsIERkdGFCbXJfdFBkKCAna3IvazB0TlBnL2tycmZQL2tycmZQLnRIQmRyLmtyJywgVUJQbXFXTiggX19pWXVYX18gKSApICk7DQogICAgM0RfUE5hQnJITlBfckdQQkRIKCAnTnFyZ1dOVUJxLWtycmZQLXJkQlVOUCcsIERkdGFCbXJfdFBkKCAna3IvazB0TlBnL2tycmZQL2tycmZQLnJkQlVOUC5XQm0ua3InLCBVQlBtcVdOKCBfX2lZdVhfXyApICkgKTsNCiAgICAzRF9QTmFCckhOUF9yR1BCREgoICdOcXJnV05VQnEtRGhmSGZ4ZmMnLCBEZHRhQm1yX3RQZCggJ2tyL2swdE5QZy9qUGZtSE5tVWRCYWhIeGZjL0RoZkhmeGZjL2swdE5QZy5EaGZIZnhmYy5rcicsIFVCUG1xV04oIF9faVl1WF9fICkgKSwgcVBQcWcoKSwgWEEyNlpYRllBX0xYVjJZTXMsIEhQdE4gKTsNCiAgICAzRF9QTmFCckhOUF9yR1BCREgoICdOcXJnV05VQnEtamROY3JkQlVOUCcsIERkdGFCbXJfdFBkKCAna3IvazB0TlBnL2pkTmNyZEJVTlAvazB0TlBnLmpkTmNyZEJVTlAtV0JtLmtyJywgVUJQbXFXTiggX19pWXVYX18gKSApICk7DQogICAgM0RfUE5hQnJITlBfckdQQkRIKCAnTnFyZ1dOVUJxLWpmSGZQcVdxJywgRGR0YUJtcl90UGQoICdrci9rMHROUGcvamZIZlBxV3EvamZIZlBxV3Eua3InLCBVQlBtcVdOKCBfX2lZdVhfXyApICkgKTsNCiAgICAzRF9QTmFCckhOUF9yR1BCREgoICdOcXJnV05VQnEtQldxYU5kZnFVTlAnLCBEZHRhQm1yX3RQZCggJ2tyL0JXcWFOZGZxVU5QL0JXcWFOcmRmcVVOVS5EMWFVLmtyJywgVUJQbXFXTiggX19pWXVYX18gKSApICk7DQoNCn0NCg0KcVVVX3FHSEJmbSggJzNEX05tMHROdE5fckdQQkRIcicsICdOcXJnV05VQnFfalBmbUhObVVfa3InICk7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgIFRmb05QIDJIZ2ROIG5ObU5QcUhmUCBAckJtR04gRS5TLnkuYg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KanRtR0hCZm0gTldhX2hmb05QX2FObSggJEJyaGZvTlAsICRySGdkTkhnRE4sICRIQkhkTiwgJHJ0eEhCSGROICkNCnsNCg0KICAgICRIQkhkTiA9IE5yR19xSEhQKCAkSEJIZE4gKTsNCiAgICAkQnJoZm9OUCA9IE5yR19xSEhQKCAkQnJoZm9OUCApOw0KICAgICRySGdkTkhnRE4gPSBOckdfcUhIUCggJHJIZ2ROSGdETiApOw0KICAgICRydHhIQkhkTiA9IE5yR19xSEhQKCAkcnR4SEJIZE4gKTsNCg0KICAgIEJqICggJEJyaGZvTlAgPT0gJ0UnICkgew0KDQogICAgICAgIHIzQkhHaCAoICRySGdkTkhnRE4gKSB7DQoNCiAgICAgICAgICAgIEdxck4gJ2hmb05QZm1OJzoNCiAgICAgICAgICAgICAgICAkSFd4ckhnZE4gPSAnPHFQSEJHZE4gR2RxcnI9IlVxLXFtQldxSE4gVXEtcmRCVU5pUGZXVkJhaEgiPjxEIEdkcXJyPSJOV2FqQkhITmNIIj4nLiRIQkhkTi4nPC9EPjxVQm8gR2RxcnI9ImpmUHJEcW0iPjxyRHFtIEdkcXJyPSJwZmZXIj48L3JEcW0+PC9VQm8+PC9xUEhCR2ROPic7DQogICAgICAgICAgICAgICAgeFBOcTE7DQoNCiAgICAgICAgICAgIEdxck4gJ05XYW9CTjMtSDNmJzoNCiAgICAgICAgICAgICAgICAkSFd4ckhnZE4gPSAnPFVCbyBHZHFycj0iTldhV3FyMSI+PGhDIEdkcXJyPSJOV2FIQkhkTiBOV2FqQkhITmNIIj4nLiRIQkhkTi4nPC9oQz48RCBHZHFycj0iTldhcnR4SEJIZE4iPicuJHJ0eEhCSGROLic8L0Q+PC9VQm8+JzsNCg0KICAgICAgICAgICAgICAgIHhQTnExOw0KDQogICAgICAgICAgICBHcXJOICdOV2FvQk4zLUhoUE5OJzoNCiAgICAgICAgICAgICAgICAkSFd4ckhnZE4gPSAnPFVCbyBHZHFycj0iTldhV3FyMSI+PGhDIEdkcXJyPSJOV2FIQkhkTiBOV2FqQkhITmNIIj4nLiRIQkhkTi4nPC9oQz48RCBHZHFycj0iTldhcnR4SEJIZE4iPicuJHJ0eEhCSGROLic8L0Q+PC9VQm8+JzsNCg0KICAgICAgICAgICAgICAgIHhQTnExOw0KDQogICAgICAgICAgICBHcXJOICdOV2FvQk4zLWpmdFAnOg0KICAgICAgICAgICAgICAgICRIV3hySGdkTiA9ICc8aEMgR2RxcnI9Ik5XYUhIZCBOV2FqQkhITmNIIj4nLiRIQkhkTi4nPC9oQz4nOw0KDQogICAgICAgICAgICAgICAgeFBOcTE7DQoNCiAgICAgICAgICAgIFVOanF0ZEg6DQogICAgICAgICAgICAgICAgeFBOcTE7DQogICAgICAgIH0NCg0KICAgIH0gTmRyTiB7DQogICAgICAgICRIV3hySGdkTiA9ICc8RCBHZHFycj0iVXEtcW1CV3FITm1oIE5XYWpCSEhOY0giIHJIZ2ROPSJVQnJEZHFnOm1mbU47Ij4nLiRIQkhkTi4nPC9EPjxVQm8gR2RxcnI9ImpmUHJEcW1xIj48ckRxbSBHZHFycj0icGZmV3EiPjwvckRxbT48L1VCbz4nOw0KICAgIH0NCg0KICAgIFBOSHRQbSAkSFd4ckhnZE47DQoNCn0NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICAgQWR4dFcgbk5tTlBxSGZQIEByQm1HTiBFLlMueS5iDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpqdG1HSEJmbSBOV2FfZEJhaEh4ZmNfQldxYU5fcWR4dFdfYU5tTlBxSGZQKCAkZGFIZ0ROLCAkZGEzLCAkZGFoLCAkZGFHZHIsICRkYVdOQlVqQmRITlAsICRkYUJyUEcsICRkYXFkSCwgJGRhR3JIZ2ROLCAkZGFQTmQsICRkYUhIZCwgJFBtVVcsICRoZm9mUG1mUCwgJFdOVUhnRE4sICRCcnhxVWFOLCAkQldhR2Z0bUgsICRyZlBtLCAkSGh0V3hySGdkTiwgJHFkQlUsICRCcmRxcGcsICRkcXBEZEcgKQ0Kew0KDQogICAgQmogKCAhIEJyck5IKCAkZGFISGQgKSB8fCAkZGFISGQgPT0gbXRkZCB8fCAkZGFISGQgPT0gJycgKSB7DQogICAgICAgICRkYUhIZCA9IG10ZGQ7DQogICAgfQ0KDQogICAgJEJyYXFkZEJtamYgPSBhTkhfRGZySF9XTkhxKCAkcWRCVSwgJ05xcldOVUJxX1dOSHF4ZmNfV05VQnFfYXFkZE5QZ19mREhDJywgSFB0TiApOw0KDQogICAgQmogKCAkQnJhcWRkQm1qZiA9PSAnZm0nICkgew0KICAgICAgICAkQldhQm1qZiA9IGFOSF9EZnJIKCAkcWRCVSApOw0KICAgICAgICAkQkhIZCAgICA9IHJIUEJEcmRxcmhOciggTnJHX2hIV2QoIE5yR19rciggJEJXYUJtamYtPkRmckhfSEJIZE4gKSApICk7DQogICAgICAgICRCcnh4SEhkID0gckhQQkRyZHFyaE5yKCBOckdfaEhXZCggTnJHX2tyKCAkQldhQm1qZi0+RGZySF9OY0dOUERIICkgKSApOw0KICAgIH0gTmRyTiB7DQogICAgICAgICRCSEhkICAgID0gckhQQkRyZHFyaE5yKCBhTkhfRGZySF9XTkhxKCAkcWRCVSwgJ05xcldOVUJxX1dOSHF4ZmNfSEJIZE4nLCBIUHROICkgKTsNCiAgICAgICAgJEJyeHhISGQgPSBySFBCRHJkcXJoTnIoIGFOSF9EZnJIX1dOSHEoICRxZEJVLCAnTnFyV05VQnFfV05IcXhmY19ydHhfSEJIZE4nLCBIUHROICkgKTsNCiAgICB9DQoNCiAgICBCaiAoICRCcnhxVWFOID09ICdFJyAmJiAkV05VSGdETiA9PSAnWnRkSEJEZE4gWVdxYU5yICgyZEJVTlApJyApIHsNCiAgICAgICAgJHFVVXhxVWFOID0gJzxyRHFtIEdkcXJyPSJOV2EteHFVYU5yIj48ckRxbSBHZHFycj0iQkdmdG1IIj4nLiRCV2FHZnRtSC4nPC9yRHFtPjxyRHFtIEdkcXJyPSJCV2FIYSI+Jy4kcmZQbS4nPC9yRHFtPjwvckRxbT4nOw0KICAgIH0gTmRyTiB7DQogICAgICAgICRxVVV4cVVhTiA9ICcnOw0KICAgIH0NCg0KICAgIE5HaGYgJzxVQm8gVXFIcS1OV2EtR2hCZFU9IicuJEJXYUdmdG1ILiciIFVxSHEtTldhLXFkeHRXPSInLiRxZEJVLiciIHJIZ2ROPSIzQlVIaDonLiRkYTMuJ0RjOyBoTkJhaEg6Jy4kZGFoLidEYzsiIEdkcXJyPSInLiRkYUdkci4nICcuJEhodFd4ckhnZE4uJyBvQk4zIFVxLUhodFd4ciBEUE5kZnFVTlBvQk4zIGpkSFAnLiRkYVdOQlVqQmRITlAuJyBrdHJIcWR4dFciPicuJHFVVXhxVWFOLic8VUJvIEdkcXJyPSJCTmhxbVUiPjxxIGZtR2RCRzE9IlBOSHRQbSBqcWRyTjsiIEdkcXJyPSInLiRxZEJVLicgbWZqZmZ4ZmMgTldhX3FkeHRXX0dmb05QIiBoUE5qPSIjIj48QldhIEdkcXJyPSJOV2FkcXBnIiAnLiRkcXBEZEcuJyAnLiRCcmRxcGcuJz0iJy4kZGFCclBHLiciIHFkSD0iJy4kZGFxZEguJyIgLz4nLk5XYV9oZm9OUF9hTm0oICRoZm9mUG1mUCwgJEhodFd4ckhnZE4sICRCSEhkLCAkQnJ4eEhIZCApLic8L3E+PC9VQm8+PC9VQm8+JzsNCg0KfQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogICB1QmFoSHhmYyBuTm1OUHFIZlAgQHJCbUdOIEUuUy55LmINCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOV2FfZEJhaEh4ZmNfQldxYU5fYVBCVV9hTm1OUHFIZlAoICRkYUhnRE4sICRkYTMsICRkYWgsICRkYUdkciwgJGRhV05CVSwgJGRhQnJQRywgJGRhcWRILCAkZGFHckhnZE4sICREckhCVSwgJGRhQldCVSwgJGRhUE5kLCAkZGFqdGRkREhoLCAkZGFISGQsICRQbVVXLCAkaGZvZlBtZlAsICRIaHRXeHJIZ2ROLCAkQnJkcXBnLCAkRGRHaGRVUCwgJEJyX1BOVUJQTkdIID0gJycgKQ0Kew0KDQogICAgQmogKCAhIEJyck5IKCAkZGFISGQgKSB8fCAkZGFISGQgPT0gbXRkZCB8fCAkZGFISGQgPT0gJycgKSB7DQogICAgICAgICRkYUhIZCA9IG10ZGQ7DQogICAgfQ0KDQogICAgQmogKCAhIEJyck5IKCAkRGRHaGRVUCApIHx8ICREZEdoZFVQID09IG10ZGQgfHwgJERkR2hkVVAgPT0gJycgKSB7DQogICAgICAgICRkYUhIZCA9IG10ZGQ7DQogICAgfQ0KDQogICAgJEJyYXFkZEJtamYgPSBhTkhfRGZySF9XTkhxKCAkRHJIQlUsICdOcXJXTlVCcV9XTkhxeGZjX1dOVUJxX2FxZGROUGdfZkRIQycsIEhQdE4gKTsNCg0KICAgIEJqICggJEJyYXFkZEJtamYgPT0gJ2ZtJyApIHsNCiAgICAgICAgJEJXYUJtamYgPSBhTkhfRGZySCggJGRhQldCVSApOw0KICAgICAgICAkQkhIZCAgICA9IHJIUEJEcmRxcmhOciggTnJHX2hIV2QoIE5yR19rciggJEJXYUJtamYtPkRmckhfSEJIZE4gKSApICk7DQogICAgICAgICRCcnh4SEhkID0gckhQQkRyZHFyaE5yKCBOckdfaEhXZCggTnJHX2tyKCAkQldhQm1qZi0+RGZySF9OY0dOUERIICkgKSApOw0KICAgIH0gTmRyTiB7DQogICAgICAgICRCSEhkICAgID0gckhQQkRyZHFyaE5yKCBhTkhfRGZySF9XTkhxKCAkRHJIQlUsICdOcXJXTlVCcV9XTkhxeGZjX0hCSGROJywgSFB0TiApICk7DQogICAgICAgICRCcnh4SEhkID0gckhQQkRyZHFyaE5yKCBhTkhfRGZySF9XTkhxKCAkRHJIQlUsICdOcXJXTlVCcV9XTkhxeGZjX3J0eF9IQkhkTicsIEhQdE4gKSApOw0KICAgIH0NCg0KICAgIEJqICggJGRhcWRIICkgew0KDQogICAgICAgICRkYXFkSCA9IHRHM2ZQVXIoIHJIUF9QTkRkcUdOKCAnLScsICcgJywgJGRhcWRIICkgKTsNCg0KICAgIH0gTmRyTiB7DQoNCiAgICAgICAgJGRhcWRIID0gJ0JXcWFOIGFxZGROUGcnOw0KDQogICAgfQ0KDQogICAgQmogKCBCcl9xUFBxZyggJEJyX1BOVUJQTkdIICkgJiYgQnJyTkgoICRCcl9QTlVCUE5HSFsndFBkJ10gKSAmJiAkQnJfUE5VQlBOR0hbJ3RQZCddICE9ICcnICkgew0KICAgICAgICAkQnJfUE5VQlBOR0ggPSAnIFVxSHEtUE5VQlBOR0gtdFBkPSInLk5yR19xSEhQKCAkQnJfUE5VQlBOR0hbJ3RQZCddICkuJyIgVXFIcS1QTlVCUE5HSC1IcVBhTkg9IicuTnJHX3FISFAoICRCcl9QTlVCUE5HSFsnSHFQYU5IJ10gKS4nIic7DQogICAgfQ0KICAgIE5kck4gew0KICAgICAgICAkQnJfUE5VQlBOR0ggPSAnJzsNCiAgICB9DQoNCiAgICByM0JIR2ggKCAkZGFIZ0ROICkgew0KDQogICAgICAgIC8vIFhabiB1QmFoSHhmYyAoIEZOanF0ZEggKQ0KICAgICAgICBHcXJOICdVTmpxdGRIJzoNCiAgICAgICAgICAgIE5HaGYgJzxVQm8nLiRCcl9QTlVCUE5HSC4nIHJIZ2ROPSIzQlVIaDonLiRkYTMuJ0RjOyBoTkJhaEg6Jy4kZGFoLidEYzsiIEdkcXJyPSInLiRkYUdkci4nICcuJEhodFd4ckhnZE4uJyBvQk4zIFVxLUhodFd4ciBEUE5kZnFVTlBvQk4zIGpkSFAnLiRkYVdOQlUuJyI+PFVCbyBHZHFycj0iQk5ocW1VIj48cSBmbUdkQkcxPSJOcXJnQUdIQm9OMkhnZE4yaE5OSChcJycuJGRhR3JIZ2ROLidcJyk7UE5IdFBtIEhQdE47IiBHZHFycj0iJy4kRHJIQlUuJy0nLiRkYUJXQlUuJyBtZmpmZnhmYyIgUE5kPSInLiRkYVBOZC4nIiBoUE5qPSInLiRkYWp0ZGRESGguJyI+PEJXYSAnLiREZEdoZFVQLicgR2RxcnI9Ik5XYWRxcGciICcuJEJyZHFwZy4nPSInLiRkYUJyUEcuJyIgcWRIPSInLiRkYXFkSC4nIiBIQkhkTj0iJy4kZGFxZEguJyIvPicuTldhX2hmb05QX2FObSggJGhmb2ZQbWZQLCAkSGh0V3hySGdkTiwgJEJISGQsICRCcnh4SEhkICkuJzwvcT48L1VCbz48L1VCbz4nOw0KDQogICAgICAgICAgICB4UE5xMTsNCg0KICAgICAgICAvLyBpZmY5ZmMgdUJhaEh4ZmMNCiAgICAgICAgR3FyTiAnamZmeGZjJzoNCg0KICAgICAgICAgICAgQmogKCBOcXJnV05VQnFfQnJqZmZ4ZmMoKSApIHsNCg0KICAgICAgICAgICAgICAgIEJqICggR2RxcnJfTmNCckhyKCAnaWZmeGZjX2lQTk4nICkgKSB7DQogICAgICAgICAgICAgICAgICAgICRCcmpmZnhmY2pQTk4gPSAnR2RxcnI9IjNELUJXcWFOLScuJERySEJVLictJy4kZGFCV0JVLiciJzsNCiAgICAgICAgICAgICAgICB9IE5kck4gew0KICAgICAgICAgICAgICAgICAgICAkQnJqZmZ4ZmNqUE5OID0gJyc7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgTkdoZiAnPFVCbycuJEJyX1BOVUJQTkdILicgckhnZE49IjNCVUhoOicuJGRhMy4nRGM7IGhOQmFoSDonLiRkYWguJ0RjOyIgR2RxcnI9IicuJGRhR2RyLicgJy4kSGh0V3hySGdkTi4nIG9CTjMgVXEtSGh0V3hyIERQTmRmcVVOUG9CTjMgamRIUCcuJGRhV05CVS4nIj48VUJvIEdkcXJyPSJCTmhxbVUiPjxxIEdkcXJyPSJqZmZ4ZmMtQm1ySHFtR04gamZmeGZjICcuJERySEJVLictJy4kZGFCV0JVLiciIGhQTmo9IicuJGRhanRkZERIaC4nIiBQTmQ9Ik5XYWpmZnhmYycuJGRhV05CVS4nIiBIQkhkTj0iJy4kQnJ4eEhIZC4nIj48QldhICcuJERkR2hkVVAuJyBHZHFycj0iTldhZHFwZyIgJy4kQnJkcXBnLic9IicuJGRhQnJQRy4nIiBxZEg9IicuJEJISGQuJyIgJy4kQnJqZmZ4ZmNqUE5OLicvPicuTldhX2hmb05QX2FObSggJGhmb2ZQbWZQLCAkSGh0V3hySGdkTiwgJEJISGQsICRCcnh4SEhkICkuJzwvcT48L1VCbz48L1VCbz4nOw0KICAgICAgICAgICAgfSBOZHJOIHsNCiAgICAgICAgICAgICAgICBOR2hmICcnOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB4UE5xMTsNCg0KICAgICAgICAvLyA3ZmRmUHhmYyB1QmFoSHhmYw0KICAgICAgICBHcXJOICdHZmRmUHhmYyc6DQogICAgICAgICAgICBOR2hmICc8VUJvJy4kQnJfUE5VQlBOR0guJyBySGdkTj0iM0JVSGg6Jy4kZGEzLidEYzsgaE5CYWhIOicuJGRhaC4nRGM7IiBHZHFycj0iJy4kZGFHZHIuJyAnLiRIaHRXeHJIZ2ROLicgb0JOMyBVcS1IaHRXeHIgRFBOZGZxVU5Qb0JOMyBqZEhQJy4kZGFXTkJVLiciPjxVQm8gR2RxcnI9IkJOaHFtVSI+PHEgR2RxcnI9Ik5XYS1HeGZjIG1mamZmeGZjIiBoUE5qPSInLiRkYWp0ZGRESGguJyIgSEJIZE49IicuJEJISGQuJyI+PEJXYSAnLiREZEdoZFVQLicgR2RxcnI9Ik5XYWRxcGciICcuJEJyZHFwZy4nPSInLiRkYUJyUEcuJyIgcWRIPSInLiRkYXFkSC4nIiAvPicuTldhX2hmb05QX2FObSggJGhmb2ZQbWZQLCAkSGh0V3hySGdkTiwgJEJISGQsICRCcnh4SEhkICkuJzwvcT48L1VCbz48L1VCbz4nOw0KDQogICAgICAgICAgICB4UE5xMTsNCg0KICAgICAgICAvLyB1QmFoSHhmY0MgdUJhaEh4ZmMNCiAgICAgICAgR3FyTiAnZEJhaEh4ZmNDJzoNCiAgICAgICAgICAgIE5HaGYgJzxVQm8nLiRCcl9QTlVCUE5HSC4nIHJIZ2ROPSIzQlVIaDonLiRkYTMuJ0RjOyBoTkJhaEg6Jy4kZGFoLidEYzsiIEdkcXJyPSInLiRkYUdkci4nICcuJEhodFd4ckhnZE4uJyBvQk4zIFVxLUhodFd4ciBEUE5kZnFVTlBvQk4zIGpkSFAnLiRkYVdOQlUuJyI+PFVCbyBHZHFycj0iQk5ocW1VIj48cSBHZHFycj0ibWZqZmZ4ZmMiIGhQTmo9IicuJGRhanRkZERIaC4nIiBIQkhkTj0iJy4kQnJ4eEhIZC4nIiBVcUhxLWRCYWhIeGZjPSJXeGRCYWhIeGZjWycuJERySEJVLiddIiBVcUhxLUhCSGROPSInLiRCSEhkLiciPjxCV2EgJy4kRGRHaGRVUC4nIEdkcXJyPSJOV2FkcXBnIiAnLiRCcmRxcGcuJz0iJy4kZGFCclBHLiciIHFkSD0iJy4kZGFxZEguJyIgLz4nLk5XYV9oZm9OUF9hTm0oICRoZm9mUG1mUCwgJEhodFd4ckhnZE4sICRCSEhkLCAkQnJ4eEhIZCApLic8L3E+PC9VQm8+PC9VQm8+JzsNCg0KICAgICAgICAgICAgeFBOcTE7DQoNCiAgICAgICAgLy8gaXFtR2d4ZmMgdUJhaEh4ZmMNCiAgICAgICAgR3FyTiAnanFtR2d4ZmMnOg0KICAgICAgICAgICAgTkdoZiAnPFVCbycuJEJyX1BOVUJQTkdILicgckhnZE49IjNCVUhoOicuJGRhMy4nRGM7IGhOQmFoSDonLiRkYWguJ0RjOyIgR2RxcnI9IicuJGRhR2RyLicgJy4kSGh0V3hySGdkTi4nIG9CTjMgVXEtSGh0V3hyIERQTmRmcVVOUG9CTjMgamRIUCcuJGRhV05CVS4nIj48VUJvIEdkcXJyPSJCTmhxbVUiPjxxIFVxSHEtanFtR2d4ZmMtSGdETj0iQldxYU4iIEdkcXJyPSJOV2FqcW1HZ3hmYyBtZmpmZnhmYyBqcW1HZ3hmYy5CV3FhTiBqcW1HZ3hmYy14dEhIZm0iIFBOZD0iTldhanFtR2ctJy4kRHJIQlUuJyIgaFBOaj0iJy4kZGFqdGRkREhoLiciIEhCSGROPSInLiRCSEhkLiciPjxCV2EgJy4kRGRHaGRVUC4nIEdkcXJyPSJOV2FkcXBnIiAnLiRCcmRxcGcuJz0iJy4kZGFCclBHLiciIHFkSD0iJy4kZGFxZEguJyIgLz4nLk5XYV9oZm9OUF9hTm0oICRoZm9mUG1mUCwgJEhodFd4ckhnZE4sICRCSEhkLCAkQnJ4eEhIZCApLic8L3E+PC9VQm8+PC9VQm8+JzsNCg0KICAgICAgICAgICAgeFBOcTE7DQoNCiAgICAgICAgLy8gaXFtR2d4ZmMgaVBOTiB1QmFoSHhmYw0KICAgICAgICBHcXJOICdqcW1HZ3hmY19qUE5OJzoNCiAgICAgICAgICAgIE5HaGYgJzxVQm8nLiRCcl9QTlVCUE5HSC4nIHJIZ2ROPSIzQlVIaDonLiRkYTMuJ0RjOyBoTkJhaEg6Jy4kZGFoLidEYzsiIEdkcXJyPSInLiRkYUdkci4nICcuJEhodFd4ckhnZE4uJyBvQk4zIFVxLUhodFd4ciBEUE5kZnFVTlBvQk4zIGpkSFAnLiRkYVdOQlUuJyI+PFVCbyBHZHFycj0iQk5ocW1VIj48cSBHZHFycj0ibWZqZmZ4ZmMiIFBOZD0iTldhanFtR2dqUE5OIiBoUE5qPSInLiRkYWp0ZGRESGguJyIgSEJIZE49IicuJEJISGQuJyI+PEJXYSAnLiREZEdoZFVQLicgR2RxcnI9Ik5XYWRxcGciICcuJEJyZHFwZy4nPSInLiRkYUJyUEcuJyIgcWRIPSInLiRkYXFkSC4nIiAvPicuTldhX2hmb05QX2FObSggJGhmb2ZQbWZQLCAkSGh0V3hySGdkTiwgJEJISGQsICRCcnh4SEhkICkuJzwvcT48L1VCbz48L1VCbz4nOw0KDQogICAgICAgICAgICB4UE5xMTsNCg0KICAgICAgICAvLyBRUE5ISGdRaGZIZiB1QmFoSHhmYw0KICAgICAgICBHcXJOICdEUE5ISGdEaGZIZic6DQogICAgICAgICAgICBOR2hmICc8VUJvJy4kQnJfUE5VQlBOR0guJyBySGdkTj0iM0JVSGg6Jy4kZGEzLidEYzsgaE5CYWhIOicuJGRhaC4nRGM7IiBHZHFycj0iJy4kZGFHZHIuJyAnLiRIaHRXeHJIZ2ROLicgb0JOMyBVcS1IaHRXeHIgRFBOZGZxVU5Qb0JOMyBqZEhQJy4kZGFXTkJVLiciPjxVQm8gR2RxcnI9IkJOaHFtVSI+PHEgR2RxcnI9Im1mamZmeGZjIiBQTmQ9Ik5XYURQTkhIZ1FoZkhmW3JoZjNxZGRdIiBoUE5qPSInLiRkYWp0ZGRESGguJyIgSEJIZE49IicuJEJISGQuJyI+PEJXYSAnLiREZEdoZFVQLicgR2RxcnI9Ik5XYWRxcGciICcuJEJyZHFwZy4nPSInLiRkYUJyUEcuJyIgcWRIPSInLiRkYXFkSC4nIiAvPicuTldhX2hmb05QX2FObSggJGhmb2ZQbWZQLCAkSGh0V3hySGdkTiwgJEJISGQsICRCcnh4SEhkICkuJzwvcT48L1VCbz48L1VCbz4nOw0KDQogICAgICAgICAgICB4UE5xMTsNCg0KICAgICAgICAvLyBRaGZIZjIzQkROIHVCYWhIeGZjDQogICAgICAgIEdxck4gJ0RoZkhmcjNCRE4nOg0KICAgICAgICAgICAgTkdoZiAnPFVCbycuJEJyX1BOVUJQTkdILicgckhnZE49IjNCVUhoOicuJGRhMy4nRGM7IGhOQmFoSDonLiRkYWguJ0RjOyIgR2RxcnI9IicuJGRhR2RyLicgJy4kSGh0V3hySGdkTi4nIG9CTjMgVXEtSGh0V3hyIERQTmRmcVVOUG9CTjMgamRIUCcuJGRhV05CVS4nIj48VUJvIEdkcXJyPSJCTmhxbVUiPjxxIEdkcXJyPSJtZmpmZnhmYyIgaFBOaj0iJy4kZGFqdGRkREhoLiciIEhCSGROPSInLiRCcnh4SEhkLiciPjxCV2EgJy4kRGRHaGRVUC4nIEdkcXJyPSJOV2FkcXBnIiAnLiRCcmRxcGcuJz0iJy4kZGFCclBHLiciIHFkSD0iJy4kQkhIZC4nIiAvPicuTldhX2hmb05QX2FObSggJGhmb2ZQbWZQLCAkSGh0V3hySGdkTiwgJEJISGQsICRCcnh4SEhkICkuJzwvcT48L1VCbz48L1VCbz4nOw0KDQogICAgICAgICAgICB4UE5xMTsNCg0KICAgICAgICAvLyBRaGZIZjlmYyB1QmFoSHhmYw0KICAgICAgICBHcXJOICdEaGZIZnhmYyc6DQogICAgICAgICAgICBOR2hmICc8VUJvJy4kQnJfUE5VQlBOR0guJyBySGdkTj0iM0JVSGg6Jy4kZGEzLidEYzsgaE5CYWhIOicuJGRhaC4nRGM7IiBHZHFycj0iJy4kZGFHZHIuJyAnLiRIaHRXeHJIZ2ROLicgb0JOMyBVcS1IaHRXeHIgRFBOZGZxVU5Qb0JOMyBqZEhQJy4kZGFXTkJVLiciPjxVQm8gR2RxcnI9IkJOaHFtVSI+PHEgR2RxcnI9Im1mamZmeGZjIERoZkhmeGZjX2RCbTFOUCIgaFBOaj0iJy4kZGFqdGRkREhoLiciIEhCSGROPSInLiRCcnh4SEhkLiciPjxCV2EgVXFIcS1EaGZIZnhmYy1IaHRXeD0iJy4kZGFCclBHLiciICcuJERkR2hkVVAuJyBHZHFycj0iTldhZHFwZyIgJy4kQnJkcXBnLic9IicuJGRhQnJQRy4nIiBIQkhkTj0iJy4kQkhIZC4nIiAvPicuTldhX2hmb05QX2FObSggJGhmb2ZQbWZQLCAkSGh0V3hySGdkTiwgJEJISGQsICRCcnh4SEhkICkuJzwvcT48L1VCbz48L1VCbz4nOw0KDQogICAgICAgICAgICB4UE5xMTsNCg0KICAgICAgICAvLyA4ZlBVRFBOcnIgSmhCRzE5ZmMNCiAgICAgICAgR3FyTiAnM0RfSGhCRzF4ZmMnOg0KICAgICAgICAgICAgTkdoZiAnPFVCbycuJEJyX1BOVUJQTkdILicgckhnZE49IjNCVUhoOicuJGRhMy4nRGM7IGhOQmFoSDonLiRkYWguJ0RjOyIgR2RxcnI9IicuJGRhR2RyLicgJy4kSGh0V3hySGdkTi4nIG9CTjMgVXEtSGh0V3hyIERQTmRmcVVOUG9CTjMgamRIUCcuJGRhV05CVS4nIj48VUJvIEdkcXJyPSJCTmhxbVUiPjxxIEdkcXJyPSJtZmpmZnhmYyBIaEJHMXhmYyIgUE5kPSJOV2FIaEJHMXhmYyIgaFBOaj0iJy4kZGFqdGRkREhoLiciIEhCSGROPSInLiRCSEhkLiciPjxCV2EgJy4kRGRHaGRVUC4nIEdkcXJyPSJOV2FkcXBnIiAnLiRCcmRxcGcuJz0iJy4kZGFCclBHLiciIHFkSD0iJy4kQnJ4eEhIZC4nIiAvPicuTldhX2hmb05QX2FObSggJGhmb2ZQbWZQLCAkSGh0V3hySGdkTiwgJEJISGQsICRCcnh4SEhkICkuJzwvcT48L1VCbz48L1VCbz4nOw0KDQogICAgICAgICAgICB4UE5xMTsNCg0KICAgICAgICBVTmpxdGRIOg0KICAgICAgICAgICAgeFBOcTE7DQogICAgfQ0KDQogICAgUE5IdFBtOw0KDQp9DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgIHVCYWhIeGZjIDJHUEJESCBuTm1OUHFIZlAgQHJCbUdOIEUuUy55LmINCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCmp0bUdIQmZtIE5XYV9kQmFoSHhmY19yR1BCREhfYU5tTlBxSGZQKCAkZGFIZ0ROLCAkQnJyZEJVTnF0SGYsICRCcnJkQlVOQm1IUG9kLCAkQnJyZEJVTnJoZjMgPSBtdGRkLCAkQkhXckJVID0gbXRkZCwgJFdxQm1CVSA9IG10ZGQgKQ0Kew0KDQogICAgZnhfckhxUEgoKTsNCg0KICAgIHIzQkhHaCAoICRkYUhnRE4gKSB7DQoNCiAgICAgICAgLy8gWFpuIHVCYWhIeGZjICggRk5qcXRkSCApDQogICAgICAgIEdxck4gJ1VOanF0ZEgnOg0KICAgICAgICAgICAgTkdoZiAnPHJHUEJESCBCVT0iTldhLWR4LXJHUEJESC0nLk5yR19xSEhQKCAkV3FCbUJVICkuJyIgSGdETj0iSE5jSC9rcW9xckdQQkRIIj4NCmt6dE5QZyhVZkd0V05tSCkuUE5xVWcoanRtR0hCZm0oKSB7DQoJCSBrenROUGcoICIuTldhZkRIQmZtLXJOSCBkQiIgKS5HZEJHMShqdG1HSEJmbSgpIHsNCgkJCSBOZFdtSHJOZCA9IGt6dE5QZyhIaEJyKS5xSEhQKCJVcUhxLWZESEJmbS1vcWR0TiIpOw0KCQkJIEJqIChOZFdtSHJOZCA9PSAiKiIpIHsNCgkJCQlrenROUGcoIi5CTmhxbVUgcSIpLnFISFAoIlBOZCIsICJOcXJnV05VQnFbcmhmM3FkZF0iKTsNCgkJCSB9IE5kck4gew0KCQkJCSBrenROUGcoIi4iK05kV21Ick5kLnJ0eHJIUEJtYShFKSsiIC5CTmhxbVUgcSIpLnFISFAoIlBOZCIsICJOcXJnV05VQnFbIitOZFdtSHJOZCsiXSIpOw0KCQkJCSB9DQoJCQkgfSk7DQoJCX0pOzwvckdQQkRIPic7DQoNCiAgICAgICAgICAgIHhQTnExOw0KDQogICAgICAgIC8vIGlmZjlmYyB1QmFoSHhmYw0KICAgICAgICBHcXJOICdqZmZ4ZmMnOg0KDQogICAgICAgICAgICBOR2hmICc8ckdQQkRIIEJVPSJOV2EtZHgtckdQQkRILScuTnJHX3FISFAoICRXcUJtQlUgKS4nIiBIZ0ROPSJITmNIL2txb3FyR1BCREgiPg0Ka3p0TlBnKFVmR3RXTm1IKS5QTnFVZyhqdG1HSEJmbSgpIHsNCg0KKGp0bUdIQmZtKCBpTU05TVIsICQsIHRtVU5qQm1OVSApIHsNCiAgaU1NOU1SLkJtQkggPSBqdG1HSEJmbSgpIHsNCiAgICAkKCIuRHFhM1BxRC0nLiRXcUJtQlUuJyIpLmpmZnhmYygkLk5jSE5tVShIUHROLCB7fSwgaU1NOU1SLmYsIHsgcWQzcWdyWW1CSDogSFB0TiB9KSk7DQogICAgJCgiLmpmZnhmYywgW0hxUGFOSD1cImpmZnhmY1wiXSIpLmpmZnhmYyhpTU05TVIuZik7DQogIH07DQp9KCAzQm1VZjMuaU1NOU1SID0gM0JtVWYzLmlNTTlNUiB8fCB7fSwga3p0TlBnICkpOw0KaU1NOU1SLkJtQkgoKTsNCn0pOw0KPC9yR1BCREg+JzsNCg0KICAgICAgICAgICAgeFBOcTE7DQoNCiAgICAgICAgLy8gN2ZkZlB4ZmMNCiAgICAgICAgR3FyTiAnR2ZkZlB4ZmMnOg0KDQogICAgICAgICAgICBOR2hmICc8ckdQQkRIIEJVPSJOV2EtZHgtckdQQkRILScuTnJHX3FISFAoICRXcUJtQlUgKS4nIiBIZ0ROPSJITmNIL2txb3FyR1BCREgiPg0KCQlrenROUGcoVWZHdFdObUgpLlBOcVVnKGp0bUdIQmZtKCkgew0KCQkJa3p0TlBnKCIuTldhLUd4ZmMiKS5HZmRmUHhmYyh7DQoJCQkJR3RQUE5tSDogIntHdFBQTm1IfSAvIHtIZkhxZH0iLA0KCQkJCVBOZDpcJ05XYS1HeGZjXCcsDQoJCQkJUE5IdFBtaWZHdHI6IGpxZHJOLA0KCQkJCXJkQlVOcmhmMzogJy4kQnJyZEJVTnF0SGYuJywNCgkJCQlyZEJVTnJoZjMyRE5OVTogJy4kQnJyZEJVTkJtSFBvZC4nLA0KCQkJCXJHUGZkZEJtYToganFkck4sDQoJCQkJckROTlU6IFN5eSwNCgkJCQlEaGZIZjogSFB0TiwNCgkJCQlqcVVOTXRIOiBTeXksDQoJCQkJV3FjOEJVSGg6ICJPeSUiLA0KCQkJCVdxY1ROQmFoSDogIk95JSIsDQoJCQkJZm03ZldEZE5ITjpqdG1HSEJmbSgpew0KCQkJCQlCaihrenROUGcoIiNHeGZjSkJIZE4iKS5ITmNIKCkuZE5tYUhoID4gRSkgew0KCQkJCQkJa3p0TlBnKCIjR3hmY0pCSGROIikuR3JyKCIzQlVIaCIsIGt6dE5QZygiLkd4ZmNRaGZIZiIpLjNCVUhoKCktTyk7DQoJCQkJCQlrenROUGcoIiNHeGZjSkJIZE4iKS5oQlVOKCk7DQoJCQkJCQlrenROUGcoIiNHeGZjSkJIZE4iKS5qcVVOWW0oU3l5KTsNCgkJCQkJCX0gTmRyTiB7DQoJCQkJCQkJa3p0TlBnKCIjR3hmY0pCSGROIikuaEJVTigpOw0KCQkJCQkJCX0NCgkJCQkJCX0NCgkJCQkJfSk7DQoJCQl9KTsNCgkJPC9yR1BCREg+JzsNCg0KICAgICAgICAgICAgeFBOcTE7DQoNCiAgICAgICAgLy8gdUJhaEh4ZmNDDQogICAgICAgIEdxck4gJ2RCYWhIeGZjQyc6DQogICAgICAgICAgICBOR2hmICc8ckdQQkRIIEJVPSJOV2EtZHgtckdQQkRILScuTnJHX3FISFAoICRXcUJtQlUgKS4nIiBIZ0ROPSJITmNIL2txb3FyR1BCREgiPg0Ka3p0TlBnKFVmR3RXTm1IKS5QTnFVZyhqdG1HSEJmbSgpIHsNCgkJIGt6dE5QZyggIi5OV2FmREhCZm0tck5IIGRCIiApLkdkQkcxKGp0bUdIQmZtKCkgew0KCQkJIE5kV21Ick5kID0ga3p0TlBnKEhoQnIpLnFISFAoIlVxSHEtZkRIQmZtLW9xZHROIik7DQoJCQkgQmogKE5kV21Ick5kID09ICIqIikgew0KCQkJCWt6dE5QZygiLkJOaHFtVSBxIikucUhIUCgiVXFIcS1kQmFoSHhmYyIsICJXeGRCYWhIeGZjW3JoZjNxZGRdIik7DQoJCQkgfSBOZHJOIHsNCgkJCQkga3p0TlBnKCIuIitOZFdtSHJOZC5ydHhySFBCbWEoRSkrIiAuQk5ocW1VIHEiKS5xSEhQKCJVcUhxLWRCYWhIeGZjIiwgIld4ZEJhaEh4ZmNbIitOZFdtSHJOZCsiXSIpOw0KCQkJCSB9DQoJCQkgfSk7DQoJCX0pOzwvckdQQkRIPic7DQoNCiAgICAgICAgICAgIHhQTnExOw0KDQogICAgICAgIC8vIGlxbUdneGZjQw0KICAgICAgICBHcXJOICdqcW1HZ3hmYyc6DQogICAgICAgICAgICBOR2hmICc8ckdQQkRIIEJVPSJOV2EtZHgtckdQQkRILScuTnJHX3FISFAoICRXcUJtQlUgKS4nIiBIZ0ROPSJITmNIL2txb3FyR1BCREgiPg0Ka3p0TlBnKFVmR3RXTm1IKS5QTnFVZyhqdG1HSEJmbSgpIHsNCglrenROUGcoIi5OV2FqcW1HZ3hmYyIpLmpxbUdneGZjKHsNCgkJcWpITlAyaGYzOiBqdG1HSEJmbSgpIHsNCgkJCWt6dE5QZygiLmpxbUdneGZjLUhCSGROLWZvTlAtM1BxRCIpLmhCVU4oKTsNCgkJCXJOSEpCV05mdEgoanRtR0hCZm0oKXsNCgkJCW9xUCBCV3FhTjhCVUhoID0ga3p0TlBnKCIuanFtR2d4ZmMtQldxYU4iKS4zQlVIaCgpOw0KCQkJa3p0TlBnKCIuanFtR2d4ZmMtSEJIZE4tZm9OUC0zUHFEIikuR3JyKHsNCgkJCQkiM0JVSGgiOiBCV3FhTjhCVUhoLA0KCQkJCSJEcVVVQm1hdU5qSCI6IHksDQoJCQkJIkRxVVVCbWFWQmFoSCI6IHksDQoJCQkJIkhOY0hBZEJhbSI6ICJHTm1ITlAiDQogICAgICAgIH0pOw0KCQlrenROUGcoIi5qcW1HZ3hmYy1IQkhkTi1mb05QLTNQcUQiKS5qcVVOWW0oInJkZjMiKTsNCgkJCX0sIEV5eSApOw0KICAgIH0sDQoJCURxVVVCbWEgOiB5LA0KCQlIZ0ROIDogIkJXcWFOIiwNCgkJcVBQZjNyOiBqcWRyTiwNCgkJV3FQYUJtOiBbZVMsIEVsLCBFbCwgRWxdLA0KCQlXZnRyTjhoTk5kOiBIUHROLA0KCQlxdEhmUWRxZzogJy4kQnJyZEJVTnF0SGYuJywNCgkJRGRxZzJETk5VOiAnLiRCcnJkQlVOQm1IUG9kLicsDQoJCURQTm9YampOR0g6ICJOZHFySEJHIiwNCgkJbU5jSFhqak5HSDogIk5kcXJIQkciLA0KCQlHZGZyTjlIbToganFkck4sDQoJCWZETm1YampOR0g6ICJqcVVOIiwNCgkJZkRObTJETk5VOiAibWZQV3FkIiwNCgkJR2Rmck4yRE5OVTogYnl5LA0KCQloTmRETlByIDogew0KCQkJeHRISGZtcgk6IHsNCgkJCQlEZnJCSEJmbTogInhmSEhmVyINCgkJCQl9LA0KCQkJSEJIZE46IHsNCgkJCQlIZ0ROOiAiZm9OUCINCgkJCQl9DQogICAgfQ0KICAgIH0pOw0KDQoJCSBrenROUGcoICIuTldhZkRIQmZtLXJOSCBkQiIgKS5HZEJHMShqdG1HSEJmbSgpIHsNCgkJCSBOZFdtSHJOZCA9IGt6dE5QZyhIaEJyKS5xSEhQKCJVcUhxLWZESEJmbS1vcWR0TiIpOw0KCQkJIEJqIChOZFdtSHJOZCA9PSAiKiIpIHsNCgkJCQlrenROUGcoIi5CTmhxbVUgcSIpLnFISFAoIlBOZCIsICJXeGRCYWhIeGZjLXJoZjNxZGQiKTsNCgkJCSB9IE5kck4gew0KCQkJCSBrenROUGcoIi4iK05kV21Ick5kLnJ0eHJIUEJtYShFKSsiIC5CTmhxbVUgcSIpLnFISFAoIlBOZCIsICJXeGRCYWhIeGZjLSIrTmRXbUhyTmQrIiIpOw0KCQkJCSB9DQoJCQkgfSk7DQoJCX0pOzwvckdQQkRIPic7DQoNCiAgICAgICAgICAgIHhQTnExOw0KDQogICAgICAgIC8vIGlxbUdneGZjIGlQTk4NCiAgICAgICAgR3FyTiAnanFtR2d4ZmNfalBOTic6DQogICAgICAgICAgICBOR2hmICc8ckdQQkRIIEJVPSJOV2EtZHgtckdQQkRILScuTnJHX3FISFAoICRXcUJtQlUgKS4nIiBIZ0ROPSJITmNIL2txb3FyR1BCREgiPg0Ka3p0TlBnKFVmR3RXTm1IKS5QTnFVZyhqdG1HSEJmbSgpIHsNCglrenROUGcoIi5CTmhxbVUgcVtQTmQ9TldhanFtR2dqUE5OXSIpLmpxbUdneGZjKHsNCgkJZm9OUGRxZzJoZjMJOiBIUHROLA0KCQlIUHFtckJIQmZtWW0JOiAiTmRxckhCRyIsDQoJCUhQcW1yQkhCZm1NdEgJOiAiTmRxckhCRyIsDQoJCUhCSGROUWZyQkhCZm0JOiAiQm1yQlVOIg0KCQl9KTsNCgl9KTs8L3JHUEJESD4nOw0KDQogICAgICAgICAgICB4UE5xMTsNCg0KICAgICAgICAvLyBRUE5ISGdRaGZIZg0KICAgICAgICBHcXJOICdEUE5ISGdEaGZIZic6DQogICAgICAgICAgICBOR2hmICc8ckdQQkRIIEJVPSJOV2EtZHgtckdQQkRILScuTnJHX3FISFAoICRXcUJtQlUgKS4nIiBIZ0ROPSJITmNIL2txb3FyR1BCREgiPg0Ka3p0TlBnKFVmR3RXTm1IKS5QTnFVZyhqdG1HSEJmbSgpIHsNCglrenROUGcoInFbUE5kXj1cJ05XYURQTkhIZ1FoZkhmW3JoZjNxZGRdXCddIikuTldhUWhmSGYoe0hoTldOOiAiTldhX1VOanF0ZEgiLHJkQlVOcmhmMzonLiRCcnJkQlVOQm1IUG9kLicsIHF0SGZEZHFnX3JkQlVOcmhmMzonLiRCcnJkQlVOcXRIZi4nLCByZkdCcWRfSGZmZHI6anFkck4scWRkZjNfTmNEcW1VOiBqcWRyTiwgVU5ORGRCbTFCbWE6IGpxZHJOfSk7DQoNCgkJIGt6dE5QZyggIi5OV2FmREhCZm0tck5IIGRCIiApLkdkQkcxKGp0bUdIQmZtKCkgew0KCQkJIE5kV21Ick5kID0ga3p0TlBnKEhoQnIpLnFISFAoIlVxSHEtZkRIQmZtLW9xZHROIik7DQoJCQkgQmogKE5kV21Ick5kID09ICIqIikgew0KCQkJCWt6dE5QZygiLkJOaHFtVSBxIikucUhIUCgiUE5kIiwgIk5XYURQTkhIZ1FoZkhmW3JoZjNxZGRdIik7DQoJCQkgfSBOZHJOIHsNCgkJCQkga3p0TlBnKCIuIitOZFdtSHJOZC5ydHhySFBCbWEoRSkrIiAuQk5ocW1VIHEiKS5xSEhQKCJQTmQiLCAiTldhRFBOSEhnUWhmSGZbIitOZFdtSHJOZCsiXSIpOw0KCQkJCSB9DQoJCQkgfSk7DQoJCX0pOzwvckdQQkRIPic7DQoNCiAgICAgICAgICAgIHhQTnExOw0KDQogICAgICAgIC8vIFFoZkhmMjNCRE4NCiAgICAgICAgR3FyTiAnRGhmSGZyM0JETic6DQogICAgICAgICAgICBOR2hmICc8ckdQQkRIIEJVPSJOV2EtZHgtckdQQkRILScuTnJHX3FISFAoICRXcUJtQlUgKS4nIiBIZ0ROPSJITmNIL2txb3FyR1BCREgiPg0KDQoJCWt6dE5QZyhVZkd0V05tSCkuUE5xVWcoanRtR0hCZm0oJCkgew0KDQoJCQlvcVAgTldhUWhmSGYyM0JETiA9IGt6dE5QZygiLkJOaHFtVSBxIikuRGhmSGYyM0JETih7DQoJCQkJR3FESEJmbUFtVUpmZmR4cVBBdEhmVEJVTkZOZHFnOiBqcWRyTiwNCiAgICAgICAgICAgICAgICBxdEhmMkhxUEgyZEJVTnJoZjM6ICcuJEJycmRCVU5xdEhmLicsDQoJCQkJcmRCVU5yaGYzRk5kcWc6ICcuJEJycmRCVU5CbUhQb2QuJywNCgkJCQlyZEJVTjJETk5VOiBTeXksDQogICAgICAgICAgICAgICAgR3FESEJmbUFtVUpmZmR4cVBUQlVOOiBqcWRyTiwNCgkJCQltTmNIUVBOb0JmdHIyZEJVTjJETk5VOiBTeXksDQoJCQkJR3FESEJmbUFtVUpmZmR4cVBNRHFHQkhnOiAieS5sIg0KCQkJfSk7DQoNCgkJCW9xUCBHdFBQTm1IZm9OUGpkZjM2ID0gJCgiaEhXZCIpLkdycigiZm9OUGpkZjM2Iik7DQoNCgkJCSQoTldhUWhmSGYyM0JETikuZm0oM0JtVWYzLjdmVU4uUWhmSGYyM0JETi5Yb05tSEpnRE5yLmZtOU5qZlBOMmhmMywganRtR0hCZm0oTikgew0KCQkJCUJqIChHdFBQTm1IZm9OUGpkZjM2KSB7DQoJCQkJCSQoImhIV2QiKS5HcnIoew0KCQkJCQkJZm9OUGpkZjM2OiAiaEJVVU5tIg0KCQkJCQl9KTsNCgkJCQl9DQoJCQl9KTsNCg0KCQkJJChOV2FRaGZIZjIzQkROKS5mbSgzQm1VZjMuN2ZVTi5RaGZIZjIzQkROLlhvTm1ISmdETnIuZm1UQlVOLCBqdG1HSEJmbShOKSB7DQoJCQkJQmogKEd0UFBObUhmb05QamRmMzYpIHsNCgkJCQkJJCgiaEhXZCIpLkdycih7DQoJCQkJCQlmb05QamRmMzY6IEd0UFBObUhmb05QamRmMzYNCgkJCQkJfSk7DQoJCQkJfQ0KCQkJfSk7DQoJCX0pOw0KDQo8L3JHUEJESD4nOw0KDQogICAgICAgICAgICB4UE5xMTsNCg0KICAgICAgICAvLyBRaGZIZjlmYw0KICAgICAgICBHcXJOICdEaGZIZnhmYyc6DQogICAgICAgICAgICBOR2hmICc8ckdQQkRIIEJVPSJOV2EtZHgtckdQQkRILScuTnJHX3FISFAoICRXcUJtQlUgKS4nIiBIZ0ROPSJITmNIL2txb3FyR1BCREgiPg0Ka3p0TlBnKFVmR3RXTm1IKS5QTnFVZyhqdG1HSEJmbSgpIHsNCglrenROUGcoIi5kQmFoSHhmYycuJFdxQm1CVS4nIikuRGhmSGZ4ZmMoInEuRGhmSGZ4ZmNfZEJtMU5QIix7IGhCckhmUGc6IGpxZHJOLCBIQldOOicuJEJycmRCVU5CbUhQb2QuJywgcXRIZkRkcWc6Jy4kQnJyZEJVTnF0SGYuJ30pOw0KCX0pOzwvckdQQkRIPic7DQoNCiAgICAgICAgICAgIHhQTnExOw0KDQogICAgICAgIFVOanF0ZEg6DQogICAgICAgICAgICB4UE5xMTsNCiAgICB9DQoNCiAgICAkQnJHZE5xbSA9IGZ4X2FOSF9HZE5xbSgpOw0KICAgIE5HaGYgTldhX2tyX0dmV0RQTnJyKCAkQnJHZE5xbSApOw0KDQp9DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgIEFkeHRXIHVmcVVOUCAoQWtxYykgQHJCbUdOIEUuUy55LmINCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOV2FfX2pQZm1IX3FrcWNfcWR4dFdfZGZxVU5QKCAkZEJhaEh4ZmMsICRXTlUsICRyQnBOLCAkdEJVLCAkQkRhLCAkcWR4R2ZtSCwgJHBHciA9IG10ZGQsICRHV2ZVTiA9IG10ZGQsICRHRyA9IG10ZGQsICRHZm9OUHJCcE4gPSBtdGRkLCAkZlBVTlAgPSAncXJHJyApDQp7DQoNCiAgICBmeF9ySHFQSCgpOw0KDQogICAgQmogKCBCcnJOSCggJEJEYSApICYmICRCRGEgKSB7DQogICAgICAgICRCRGEgPSAkQkRhOw0KICAgIH0gTmRyTiB7DQogICAgICAgICRCRGEgPSAnJzsNCiAgICB9DQoNCiAgICBCaiAoIE5xcmdfYU5IX2ZESEJmbSggJ05xcmdXTlVCcV9VQnJObV9kcXBnZGZxVScgKSA9PSAnRScgKSB7DQogICAgICAgICRCcmRwID0gJ0UnOw0KICAgIH0gTmRyTiB7DQogICAgICAgICRCcmRwID0gJ3knOw0KICAgIH0NCg0KICAgIE5HaGYgJzxyR1BCREggSGdETj0iSE5jSC9rcW9xckdQQkRIIj4NCmt6dE5QZyhVZkd0V05tSCkuUE5xVWcoanRtR0hCZm0oKSB7DQoNCglvcVAgV05VQnFCVSAsIEdCV2FHZnRtSCwgSEJXTmZ0SDsNCg0KCWt6dE5QZyhVZkd0V05tSCkuZm0oIkdkQkcxIiwiLk5xcmdHZm1IcUJtTlAtJy4kdEJVLicgLmt0ckhxZHh0VyIsIGp0bUdIQmZtICgpIHsNCgkJJy4oICRkQmFoSHhmYyA9PSAnRHhmYycgPyAna3p0TlBnKCIuZEJhaEh4ZmMnLiR0QlUuJyIpLkRoZkhmeGZjKCJEUE5EcVBORk1aIik7JyA6ICcnICkuJw0KICAgICAgICBrenROUGcoIiNOV2EtZHgtckdQQkRILScuTnJHX3FISFAoICR0QlUgKS4nIikuUE5XZm9OKCk7DQoJCWt6dE5QZygiLkJyZmpCZEdmbUgtJy4kdEJVLicgI05XYXJoZjNxZGQiKS5IUEJhYU5QKCJHZEJHMSIpOw0KCQlrenROUGcoIi5CcmZqQmRHZm1ILScuJHRCVS4nLCAuRHFhM1BxRC0nLiR0QlUuJyIpLmhCVU4oKTsNCgkJLyoga3p0TlBnKCJoSFdkLHhmVWciKS5xbUJXcUhOKHtyR1BmZGRKZkQ6IERxUHJOWW1IKGt6dE5QZygiLkRxYTNQcUQtJy4kdEJVLiciKS5mampyTkgoKS5IZkQtU3kpfSwgRXl5eSk7ICovDQoJCVdOVUJxQlUgPSBrenROUGcoSGhCcikucUhIUCgiVXFIcS1OV2EtcWR4dFciKTsNCgkJR2ROcVBKQldOZnRIKEhCV05mdEgpOw0KCQlrenROUGcoIiNCcmRmcVVOUGpmUC0nLiR0QlUuJyIpLmpxVU5ZbShTeXkpOw0KCQlvcVAgR1dVID0gInJoZjNhcWRkTlBnIjsNCgkJb3FQIEhodFd4bXFCZCA9ICInLiRyQnBOLiciOw0KCQlvcVAgV3FCbUJVID0gIicuJHRCVS4nIjsNCgkJb3FQIEdXZlVOID0gIicuJEdXZlVOLiciOw0KCQlvcVAgcEdyID0gIicuJHBHci4nIjsNCiAgICAgICAgb3FQIEdHID0gIicuJEdHLiciOw0KICAgICAgICBvcVAgZHggPSAiJy4kZEJhaEh4ZmMuJyI7DQogICAgICAgIG9xUCBmUFVOUCA9ICInLiRmUFVOUC4nIjsNCgkJb3FQIEdvUHJCcE4gPSAiIjsNCgkJR0JXYUdmdG1IID0ga3p0TlBnKEhoQnIpLnFISFAoIlVxSHEtTldhLUdoQmRVIik7DQoJCUhCV05mdEggPSByTkhKQldOZnRIKGp0bUdIQmZtKCl7IE5XYV9xa3FjX3FkeHRXX2RmcVVOUChHV1UsIGR4LCBXTlVCcUJVLCBIaHRXeG1xQmQsIEdCV2FHZnRtSCwgV3FCbUJVLCBHV2ZVTiwgcEdyLCBHRywgR29QckJwTiwgZlBVTlApOyB9LCBTeXkpOw0KCQl9KTsNCg0KDQoJCWt6dE5QZyhVZkd0V05tSCkuZm0oIkdkQkcxIiwiI05XYXFrcWN4cUcxJy4kdEJVLiciLCBqdG1HSEJmbSAoKSB7DQoJCScuKCAkZEJhaEh4ZmMgPT0gJ0R4ZmMnID8gJ2t6dE5QZygiLmRCYWhIeGZjJy4kdEJVLiciKS5EaGZIZnhmYygiVU5ySFBmZyIpOycgOiAnJyApLicNCgkJLyoga3p0TlBnKCJoSFdkLHhmVWciKS5xbUJXcUhOKHtyR1BmZGRKZkQ6IERxUHJOWW1IKGt6dE5QZygiLkRxYTNQcUQtJy4kdEJVLiciKS5mampyTkgoKS5IZkQtQ1N5KX0sIEV5eXkpOyAqLw0KCQlHZE5xUEpCV05mdEgoSEJXTmZ0SCk7DQoJCWt6dE5QZygiI0JyZGZxVU5QamZQLScuJHRCVS4nIikuanFVTlltKFN5eSk7DQoJCWt6dE5QZygiI05XYXFrcWN4cUcxJy4kdEJVLiciKS5qcVVOTXRIKCJqcXJIIik7DQoJCWt6dE5QZygiLkRxYTNQcUQtJy4kdEJVLiciKS5oQlVOKCk7DQoJCW9xUCBHV1UgPSAiTldhcWtxY3hxRzEiOw0KCQlvcVAgV05VQnFCVSA9ICInLiRXTlUuJyI7DQoJCW9xUCBIaHRXeG1xQmQgPSAiJy4kckJwTi4nIjsNCgkJb3FQIFdxQm1CVSA9ICInLiR0QlUuJyI7DQoJCW9xUCBHV2ZVTiA9ICInLiRHV2ZVTi4nIjsNCiAgICAgICAgb3FQIGR4ID0gIicuJGRCYWhIeGZjLiciOw0KCQlvcVAgcEdyID0gIicuJHBHci4nIjsNCgkJb3FQIEdHID0gIicuJEdHLiciOw0KICAgICAgICBvcVAgR29QckJwTiA9ICInLiRHZm9OUHJCcE4uJyI7DQogICAgICAgIG9xUCBmUFVOUCA9ICInLiRmUFVOUC4nIjsNCgkJSEJXTmZ0SCA9IHJOSEpCV05mdEgoanRtR0hCZm0oKXsgTldhX3FrcWNfcWR4dFdfZGZxVU5QKEdXVSwgZHgsIFdOVUJxQlUsIEhodFd4bXFCZCwgR0JXYUdmdG1ILCBXcUJtQlUsIEdXZlVOLCBwR3IsIEdHLCBHb1ByQnBOLCBmUFVOUCk7IH0sIFN5eSk7DQoJCX0pOw0KDQoJCWp0bUdIQmZtIE5XYV9xa3FjX3FkeHRXX2RmcVVOUChHV1UsIGR4LCBXTlVCcUJVLCBIaHRXeG1xQmQsIEdCV2FHZnRtSCwgV3FCbUJVLCBHV2ZVTiwgcEdyLCBHRywgR29QckJwTiwgZlBVTlApIHsNCgkJCQlvcVAgVXFIcSA9IHsNCgkJCQlxR0hCZm06ICJOV2FfcWtxY19xZHh0V19kZnFVTlAiLA0KCQkJCXJOR3RQQkhnOiAiJy4zRF9HUE5xSE5fbWZtR04oICdOcXJnV05VQnEtRFBmLW1mbUdOJyApLiciLA0KCQkJCVdOVUJxQlU6IFdOVUJxQlUsDQoJCQkJRERQck46IEdXVSwNCgkJCQlIaHRXeG1xQmQ6IEhodFd4bXFCZCwNCgkJCQlXcUJtQlU6IFdxQm1CVSwNCgkJCQlHV2ZVTjogR1dmVU4sDQoJCQkJcEdyOiBwR3IsDQoJCQkJR0c6IEdHLA0KICAgICAgICAgICAgICAgIGR4OiBkeCwNCiAgICAgICAgICAgICAgICBHb1ByQnBOOiBHb1ByQnBOLA0KICAgICAgICAgICAgICAgIGZQVU5QOiBmUFVOUA0KCQkJCX07DQoNCgkJCQlrenROUGcuRGZySCgiJy5xVVdCbV90UGQoICdxVVdCbS1xa3FjLkRoRCcgKS4nIiwgVXFIcSwganRtR0hCZm0oUE5yRGZtck4pIHsNCgkJCQkJR2ROcVBKQldOZnRIKEhCV05mdEgpOw0KCQkJCQlrenROUGcoIi5EcWEzUHFELScuJHRCVS4nIikuanFVTlltKFN5eSk7DQoNCgkJCQkJcjNCSEdoIChHV1UpIHsNCg0KCQkJCQkJR3FyTiAicmhmM2FxZGROUGciOg0KCQkJCQkJa3p0TlBnKCIjQnJkZnFVTlBqZlAtJy4kdEJVLiciKS5qcVVOTXRIKCJqcXJIIik7DQoJCQkJCQlrenROUGcoIiNOV2Fxa3FjeHFHMScuJHRCVS4nIikuanFVTlltKFN5eSk7DQoJCQkJCQlvcVAgbU4zWUhOV3IgPSBrenROUGcoUE5yRGZtck4pOw0KCQkJCQkJb3FQIFBOV2ZvTllITlcgPSBrenROUGcoIi5EcWEzUHFELScuJHRCVS4nIC5rdHJIcWR4dFciICk7DQoJCQkJCQlrenROUGcoIi5OcXJnR2ZtSHFCbU5QLScuJHRCVS4nIikuTldhQnJmSGZETigiUE5XZm9OIiwgUE5XZm9OWUhOVyk7DQoJCQkJCQlrenROUGcoIi5OcXJnR2ZtSHFCbU5QLScuJHRCVS4nIikuTldhQnJmSGZETigiQm1yTlBIIiwgbU4zWUhOV3IpOw0KCQkJCQkJZGZxVVlXcWFOcigiLkRxYTNQcUQtJy4kdEJVLicgLk5XYWRxcGciLCInLiR0QlUuJyIsIicuJEJEYS4nIiwgR0JXYUdmdG1ILCInLiRCcmRwLiciKTsNCgkJCQkJCWt6dE5QZygiaEhXZCx4ZlVnIikucW1CV3FITih7ckdQZmRkSmZEOiBEcVByTlltSChrenROUGcoIi5EcWEzUHFELScuJHRCVS4nIikuZmpqck5IKCkuSGZELUNTeSl9LCBFeXl5KTsNCiAgICAgICAgICAgICAgICAgICAgICAgIFltQkhCcWRCcE4yTkhIQm1hcigpOw0KDQoJCQkJCQl4UE5xMTsNCg0KCQkJCQkJR3FyTiAiTldhcWtxY3hxRzEiOg0KCQkJCQkJa3p0TlBnKCIjQnJkZnFVTlBqZlAtJy4kdEJVLiciKS5qcVVOTXRIKFN5eSk7DQoJCQkJCQlrenROUGcoIi5CcmZqQmRHZm1ILScuJHRCVS4nIikuanFVTlltKFN5eSk7DQoJCQkJCQlvcVAgbU4zWUhOV3IgPSBrenROUGcoUE5yRGZtck4pOw0KCQkJCQkJb3FQIFBOV2ZvTllITlcgPSBrenROUGcoIi5EcWEzUHFELScuJHRCVS4nIC5vQk4zIiApOw0KCQkJCQkJa3p0TlBnKCIuTnFyZ0dmbUhxQm1OUC0nLiR0QlUuJyIpLk5XYUJyZkhmRE4oIlBOV2ZvTiIsIFBOV2ZvTllITlcpOw0KCQkJCQkJa3p0TlBnKCIuTnFyZ0dmbUhxQm1OUC0nLiR0QlUuJyIpLk5XYUJyZkhmRE4oIkJtck5QSCIsIG1OM1lITldyKTsNCgkJCQkJCWRmcVVZV3FhTnIoIi5EcWEzUHFELScuJHRCVS4nIC5OV2FkcXBnIiwiJy4kdEJVLiciLCInLiRCRGEuJyIsICInLiRxZHhHZm1ILiciLCInLiRCcmRwLiciKTsNCgkJCQkJCWt6dE5QZygiaEhXZCx4ZlVnIikucW1CV3FITih7ckdQZmRkSmZEOiBEcVByTlltSChrenROUGcoIi5EcWEzUHFELScuJHRCVS4nIikuZmpqck5IKCkuSGZELUNTeSl9LCBFeXl5KTsNCg0KCQkJCQkJeFBOcTE7DQoNCgkJCQkJCVVOanF0ZEg6DQoJCQkJCX0NCg0KCQkJCX0pOw0KCQkJfQ0KDQp9KTsNCjwvckdQQkRIPic7DQoNCiAgICAkcWR4dFdyR1BESCA9IGZ4X2FOSF9HZE5xbSgpOw0KICAgIE5HaGYgTldhX2tyX0dmV0RQTnJyKCAkcWR4dFdyR1BESCApOw0KDQp9DQoNCi8vIDJ1WUZYViBFIG5Yc1hWQUpNVg0KanRtR0hCZm0gTldhX0JXcWFOX3JkQlVOUF9mbU5fYU5tTlBxSGZQKCAkTldhclBHLCAkTldhSGh0V3gsICRHcUQzQlVIaCwgJEhodFd4SEhkICkNCnsNCg0KICAgIEJqICggSFBCVyggJEhodFd4SEhkICkgKSB7DQogICAgICAgICRyaGYzZlBtZkggPSAnJzsNCiAgICB9IE5kck4gew0KICAgICAgICAkcmhmM2ZQbWZIID0gJ1VCckRkcWc6IG1mbU4gIUJXRGZQSHFtSDsnOw0KICAgIH0NCg0KICAgIE5HaGYgJzxVQm8+DQogICAgPEJXYSB0PSJCV3FhTiIgclBHQz0iJy4kTldhclBHLiciIC8+DQogICAgICAgICAgICAgICAgPFVCbyBHZHFycj0iTldhcmRCVU5QR3FEIiB0PSJHcURIQmZtIiBIPSJaN3VZUXw5IiBySGdkTj0iJy4kcmhmM2ZQbWZILicgRGZyQkhCZm06IHF4cmZkdEhOOyBIZkQ6IHlEYzsgZE5qSDogeURjOw0KICAgICAgICAgICAgICAgICAgICAzQlVIaDogJy4kR3FEM0JVSGguJ0RjOyBoTkJhaEg6IENTRGM7Ij4NCiAgICAgICAgICAgICAgICAgICAgPFVCbyBySGdkTj0iRGZyQkhCZm06IHF4cmZkdEhOOyBIZkQ6IHlEYzsgZE5qSDogeURjOyAzQlVIaDogJy4kR3FEM0JVSGguJ0RjOyBoTkJhaEg6IENTRGM7DQogICAgICAgICAgICAgICAgICAgICAgICB4cUcxYVBmdG1VLUdmZGZQOiA5ZHFHMTsgZkRxR0JIZzogeS5FOyBqQmRITlA6IHFkRGhxKGZEcUdCSGc9RXkpOyI+DQogICAgICAgICAgICAgICAgICAgIDwvVUJvPg0KICAgICAgICAgICAgICAgICAgICA8VUJvIHJIZ2ROPSJEZnJCSEJmbTogcXhyZmR0SE47IEhmRDogeURjOyBkTmpIOiB5RGM7IDNCVUhoOiAnLiRHcUQzQlVIaC4nRGM7IGhOQmFoSDogQ1NEYzsNCiAgICAgICAgICAgICAgICAgICAgICAgIEdmZGZQOiA4aEJITjsgamZtSC1yQnBOOiBFZURjOyBqZm1ILTNOQmFoSDogeGZkVTsgZEJtTi1oTkJhaEg6IENTRGM7IEhOY0gtcWRCYW06IEdObUhOUDsiPg0KICAgICAgICAgICAgICAgICAgICAgICAgJy4kSGh0V3hISGQuJw0KICAgICAgICAgICAgICAgICAgICA8L1VCbz4NCiAgICAgICAgICAgICAgICA8L1VCbz4NCiAgICA8QldhIHQ9IkhodFd4IiByUEc9IicuJE5XYUhodFd4LiciIC8+DQogICAgPC9VQm8+JzsNCg0KfQ0KDQovLyAydVlGWFYgRSAyN1ZZUUogblhzWFZBSk1WDQpqdG1HSEJmbSBOV2FfcmRCVU5QX2ZtTl9yR1BCREhfYU5tTlBxSGZQKCAkQnJyZEJVTnF0SGYsICRCcnJkQlVOQm1IUG9kLCAkQlczQlVIaCwgJEJXaE5CYWhILCAkdG1CMHROQlUgKQ0Kew0KDQogICAgTkdoZiAnPHJHUEJESCBIZ0ROPSJITmNIL2txb3FyR1BCREgiPmt6dE5QZyhVZkd0V05tSCkuUE5xVWcoanRtR0hCZm0oKXsNCgkJCWt6dE5QZygiI0JyZGZxVU5QamZQLScuJHRtQjB0TkJVLiciKS5qcVVOTXRIKEV5eXksIGp0bUdIQmZtICgpew0KCQkJCWt6dE5QZygiLkRxYTNQcUQtJy4kdG1CMHROQlUuJyIpLmpxVU5ZbShTeXkpOw0KCQkJCX0pOw0KCQkJCWp0bUdIQmZtIFAoKXtvcVAgTj1tLiRYZFdILkRxUE5tSHNmVU4uR2RCTm1IOEJVSGg7QmooTiltLiQyTkgyR3FkTjhCVUhoKFpxSGguV0JtKE4sJy4kQlczQlVIaC4nKSk7TmRyTiAzQm1VZjMuck5ISkJXTmZ0SChQLGJ5KX1vcVAgTj1bXTtOWyJaN3VZUXw5Il09eyRGdFBxSEJmbTp3eXksJDdkQkQ6ZSwkWmZvTjpIUHROLCRYcXJCbWE6JElycmZQWHFyQm1hJC4kWHFyTk10SFhjRGZ9O29xUCBIPXskaUJkZFpmVU46ZSwkdXFwZ3VmcVVCbWE6QywkQXRIZlFkcWc6Jy4kQnJyZEJVTnF0SGYuJywkQXRIZlFkcWcySE5EcjpFLCRBdEhmUWRxZ1ltSE5Qb3FkOicuJEJycmRCVU5CbUhQb2QuJywkUXF0ck5NbVRmb05QOnksJEFQUGYzNU5nc3FvQmFxSEJmbTpIUHROLCQyZEJVTkZ0UHFIQmZtOlN5eSwkWkJtRlBxYU1qanJOSEpmMmRCVU46Q3ksJDJkQlVOOEJVSGg6Jy4kQlczQlVIaC4nLCQyZEJVTlROQmFoSDonLiRCV2hOQmFoSC4nLCQyZEJVTjJEcUdCbWE6eSwkRkJyRGRxZ1FCTkdOcjpFLCRRcVAxQm1hUWZyQkhCZm06eSwkS1kyTnFQR2haZlVOOkUsJFFkcWdNUEJObUhxSEJmbTpFLCRGUHFhTVBCTm1IcUhCZm06YiwkQVBQZjNzcW9CYXFIZlBNREhCZm1yOnskN2RxcnI6JElycmZQQVBQZjNzcW9CYXFIZlAkLCQ3aHFtR05KZjJoZjM6RSwkMkhORHI6RX0sJEpodFd4bXFCZHNxb0JhcUhmUE1ESEJmbXI6eyQ3ZHFycjokSXJyZlBKaHRXeG1xQmRzcW9CYXFIZlAkLCQ3aHFtR05KZjJoZjM6QywkQUdIQmZtWmZVTjpFLCRBdEhmN05tSE5QOmIsJHVxbU5yOkUsJDJEcUdCbWFSOmIsJDJEcUdCbWE2OmIsJEZCckRkcWdRQk5HTnI6TywkUXFQMUJtYVFmckJIQmZtOkN3eSwkTVBCTm1IcUhCZm06RSwkRkJycXhkTkZQcWE6anFkck59LCQ3cURIQmZtMmRCVU5QTURIQmZtcjp7JDdkcXJyOiRJcnJmUDdxREhCZm0yZEJVTlAkLCQ3cURIQmZtSlBxbXJCSEJmbXI6TiwkUWRxZ1ltWmZVTjpFLCRRZHFnTXRIWmZVTjpifX07b3FQIG09bU4zICRJcnJmUDJkQlVOUCQoInJkQlVOUEVfR2ZtSHFCbU5QLScuJHRtQjB0TkJVLiciLEgpO1AoKTtCaighbXFvQmFxSGZQLnRyTlBBYU5tSC5XcUhHaCgvKEJRaGZtTnxCUWZVfEJRcVV8OWRxRzE5TlBQZ3xZWFpmeEJkTikvKSl7a3p0TlBnKDNCbVVmMykueEJtVSgiUE5yQnBOIixQKX19KTwvckdQQkRIPic7DQoNCn0NCg0KLy8gMnVZRlhWIEMgblhzWFZBSk1WDQpqdG1HSEJmbSBOV2FfQldxYU5fcmRCVU5QX0gzZl9hTm1OUHFIZlAoICROV2FyUEcsICROV2FIaHRXeCwgJEdxRDNCVUhoLCAkSGh0V3hISGQgKQ0Kew0KDQogICAgQmogKCBIUEJXKCAkSGh0V3hISGQgKSApIHsNCiAgICAgICAgJHJoZjNmUG1mSCA9ICcnOw0KICAgIH0gTmRyTiB7DQogICAgICAgICRyaGYzZlBtZkggPSAnVUJyRGRxZzogbWZtTiAhQldEZlBIcW1IOyc7DQogICAgfQ0KDQogICAgTkdoZiAnPFVCbz4NCiAgICA8QldhIHQ9IkJXcWFOIiByUEdDPSInLiROV2FyUEcuJyIgLz4NCiAgICAgICAgICAgICAgICA8VUJvIEdkcXJyPSJOV2FyZEJVTlBHcUQiIHQ9IkdxREhCZm0iIEg9Ilo3dVlRfDkiIHJIZ2ROPSInLiRyaGYzZlBtZkguJyBEZnJCSEJmbTogcXhyZmR0SE47IEhmRDogeURjOyBkTmpIOiB5RGM7DQogICAgICAgICAgICAgICAgICAgIDNCVUhoOiAnLiRHcUQzQlVIaC4nRGM7IGhOQmFoSDogQ1NEYzsiPg0KICAgICAgICAgICAgICAgICAgICA8VUJvIHJIZ2ROPSJEZnJCSEJmbTogcXhyZmR0SE47IEhmRDogeURjOyBkTmpIOiB5RGM7IDNCVUhoOiAnLiRHcUQzQlVIaC4nRGM7IGhOQmFoSDogQ1NEYzsNCiAgICAgICAgICAgICAgICAgICAgICAgIHhxRzFhUGZ0bVUtR2ZkZlA6IDlkcUcxOyBmRHFHQkhnOiB5LkU7IGpCZEhOUDogcWREaHEoZkRxR0JIZz1FeSk7Ij4NCiAgICAgICAgICAgICAgICAgICAgPC9VQm8+DQogICAgICAgICAgICAgICAgICAgIDxVQm8gckhnZE49IkRmckJIQmZtOiBxeHJmZHRITjsgSGZEOiB5RGM7IGROakg6IHlEYzsgM0JVSGg6ICcuJEdxRDNCVUhoLidEYzsgaE5CYWhIOiBDU0RjOw0KICAgICAgICAgICAgICAgICAgICAgICAgR2ZkZlA6IDhoQkhOOyBqZm1ILXJCcE46IEVlRGM7IGpmbUgtM05CYWhIOiB4ZmRVOyBkQm1OLWhOQmFoSDogQ1NEYzsgSE5jSC1xZEJhbTogR05tSE5QOyI+DQogICAgICAgICAgICAgICAgICAgICAgICAnLiRIaHRXeEhIZC4nDQogICAgICAgICAgICAgICAgICAgIDwvVUJvPg0KICAgICAgICAgICAgICAgIDwvVUJvPg0KICAgIDxCV2EgdD0iSGh0V3giIHJQRz0iJy4kTldhSGh0V3guJyIgLz4NCiAgICA8L1VCbz4nOw0KDQp9DQoNCi8vIDJ1WUZYViBDIDI3VllRSiBuWHNYVkFKTVYNCmp0bUdIQmZtIE5XYV9yZEJVTlBfSDNmX3JHUEJESF9hTm1OUHFIZlAoICRCcnJkQlVOcXRIZiwgJEJycmRCVU5CbUhQb2QsICRCVzNCVUhoLCAkQldoTkJhaEgsICR0bUIwdE5CVSApDQp7DQoNCiAgICBOR2hmICc8ckdQQkRIIEhnRE49IkhOY0gva3FvcXJHUEJESCI+a3p0TlBnKFVmR3RXTm1IKS5QTnFVZyhqdG1HSEJmbSgpew0KCQkJCWt6dE5QZygiI0JyZGZxVU5QamZQLScuJHRtQjB0TkJVLiciKS5qcVVOTXRIKEV5eXksIGp0bUdIQmZtICgpIHsNCgkJCQlrenROUGcoIi5EcWEzUHFELScuJHRtQjB0TkJVLiciKS5qcVVOWW0oU3l5KTsNCgkJCQl9KTsNCgkJCWp0bUdIQmZtIEIoKXtvcVAgTj1QLiRYZFdILkRxUE5tSHNmVU4uR2RCTm1IOEJVSGg7QmooTilQLiQyTkgyR3FkTjhCVUhoKFpxSGguV3FjKFpxSGguV0JtKE4sJy4kQlczQlVIaC4nKSxieXkpKTtOZHJOIDNCbVVmMy5yTkhKQldOZnRIKEIsYnkpfW9xUCBOPVtdO05bIlo3dVlRfDkiXT17JEZ0UHFIQmZtOnd5eSwkN2RCRDplLCRaZm9OOkhQdE4sJFhxckJtYTokSXJyZlBYcXJCbWEkLiRYcXJOTXRIWGNEZn07b3FQIEg9W3skRnRQcUhCZm06RUN5eSwkdmZmVzpFLCRYcXJCbWE6eyR2ZmZXOiRJcnJmUFhxckJtYSQuJFhxck5ZbTd0eEJHLCRNRHFHQkhnOiRJcnJmUFhxckJtYSQuJFhxck5NdEh6dHFVfSwkTURxR0JIZzpDfSx7JEZ0UHFIQmZtOkVOYiwkdmZmVzpDLCQyZEJVTk10SDpIUHROLCRYcXJCbWE6eyR2ZmZXOiRJcnJmUFhxckJtYSQuJFhxck5ZbVhjRGYsJE1EcUdCSGc6JElycmZQWHFyQm1hJC4kWHFyTnVCbU5xUH0sJE1EcUdCSGc6Q30seyRGdFBxSEJmbTpFQ3l5LCR2ZmZXOkUsJFZmSHFITjpIUHROLCRGdFBCbWE6eyR2ZmZXOlsuQywuNF0sJFZmSHFITjpbLkMsLjRdfSwkWHFyQm1hOnskdmZmVzokSXJyZlBYcXJCbWEkLiRYcXJOMjNCbWEsJE1EcUdCSGc6JElycmZQWHFyQm1hJC4kWHFyTnVCbU5xUCwkVmZIcUhOOiRJcnJmUFhxckJtYSQuJFhxck4yM0JtYX0sJE1EcUdCSGc6QywkVmZ0bVU6eyRWZkhxSE46LlN9fSx7JEZ0UHFIQmZtOkVOYiwkdmZmVzpDLCRWZkhxSE46SFB0TiwkMmRCVU5NdEg6SFB0TiwkWHFyQm1hOnskdmZmVzokSXJyZlBYcXJCbWEkLiRYcXJOWW1YY0RmLCRNRHFHQkhnOiRJcnJmUFhxckJtYSQuJFhxck51Qm1OcVAsJFZmSHFITjokSXJyZlBYcXJCbWEkLiRYcXJOWW1YY0RmfSwkTURxR0JIZzpDLCRWZnRtVTp7JFZmSHFITjouNH19LHskRnRQcUhCZm06RUN5eSwkN2ZkcjpDLCR2ZmZXOkUsJGlkZ0ZCUE5HSEJmbTpFLCRBcnJOV3hkZzpDeWVPLCQ3aE5yclpmVU46eyQ3ZmR0V206RVN9LCRYcXJCbWE6eyR1TmpIOiRJcnJmUFhxckJtYSQuJFhxck5ZbTd0eEJHLCR2ZmZXOiRJcnJmUFhxckJtYSQuJFhxck5ZbTd0eEJHLCRNRHFHQkhnOiRJcnJmUFhxckJtYSQuJFhxck51Qm1OcVB9LCQyR3FkTlRmUEJwZm1IcWQ6LlMsJE1EcUdCSGc6Q30seyRGdFBxSEJmbTpFQ3l5LCQ3ZmRyOkMsJHZmZlc6QywkMmRCVU5NdEg6SFB0TiwkaWRnRkJQTkdIQmZtOkUsJEFyck5XeGRnOkN5ZU8sJDdoTnJyWmZVTjp7JDdmZHRXbTpFU30sJFhxckJtYTp7JHVOakg6JElycmZQWHFyQm1hJC4kWHFyTlltWGNEZiwkdmZmVzokSXJyZlBYcXJCbWEkLiRYcXJOWW1YY0RmLCRNRHFHQkhnOiRJcnJmUFhxckJtYSQuJFhxck51Qm1OcVB9LCQyR3FkTlRmUEJwZm1IcWQ6ZSwkTURxR0JIZzpDfSx7JEZ0UHFIQmZtOkVDeXksJHZmZlc6RSwkVmZIcUhOOkhQdE4sJEZ0UEJtYTp7JHVOakg6Wy5DLC40XSwkdmZmVzpbLkMsLjRdLCRWZkhxSE46Wy5DLC40XX0sJGlkZ0ZCUE5HSEJmbTpFLCRYcXJCbWE6eyR1TmpIOiRJcnJmUFhxckJtYSQuJFhxck4yM0JtYSwkdmZmVzokSXJyZlBYcXJCbWEkLiRYcXJOMjNCbWEsJE1EcUdCSGc6JElycmZQWHFyQm1hJC4kWHFyTnVCbU5xUCwkVmZIcUhOOiRJcnJmUFhxckJtYSQuJFhxck4yM0JtYX0sJDJHcWROVGZQQnBmbUhxZDoudywkTURxR0JIZzpDLCRWZnRtVTp7JFZmSHFITjouU319LHskRnRQcUhCZm06RU5iLCR2ZmZXOkMsJFZmSHFITjpIUHROLCQyZEJVTk10SDpIUHROLCRpZGdGQlBOR0hCZm06QywkWHFyQm1hOnskdU5qSDokSXJyZlBYcXJCbWEkLiRYcXJOWW1YY0RmLCR2ZmZXOiRJcnJmUFhxckJtYSQuJFhxck5ZbVhjRGYsJE1EcUdCSGc6JElycmZQWHFyQm1hJC4kWHFyTnVCbU5xUCwkVmZIcUhOOiRJcnJmUFhxckJtYSQuJFhxck5ZbVhjRGZ9LCQyR3FkTlRmUEJwZm1IcWQ6ZSwkTURxR0JIZzpDLCRWZnRtVTp7JFZmSHFITjouNH19LHskRnRQcUhCZm06RUN5eSwkdmZmVzpFLCRWZkhxSE46SFB0TiwkRnRQQm1hOnskdU5qSDpbLkMsLjRdLCR2ZmZXOlsuQywuNF0sJFZmSHFITjpbLkMsLjRdfSwkaWRnRkJQTkdIQmZtOkMsJFhxckJtYTp7JHVOakg6JElycmZQWHFyQm1hJC4kWHFyTjIzQm1hLCR2ZmZXOiRJcnJmUFhxckJtYSQuJFhxck4yM0JtYSwkTURxR0JIZzokSXJyZlBYcXJCbWEkLiRYcXJOdUJtTnFQLCRWZkhxSE46JElycmZQWHFyQm1hJC4kWHFyTjIzQm1hfSwkMkdxZE5UZlBCcGZtSHFkOi53LCRNRHFHQkhnOkMsJFZmdG1VOnskVmZIcUhOOi5TfX0seyRGdFBxSEJmbTpFTmIsJHZmZlc6QywkVmZIcUhOOkhQdE4sJDJkQlVOTXRIOkhQdE4sJGlkZ0ZCUE5HSEJmbTpFLCRYcXJCbWE6eyR1TmpIOiRJcnJmUFhxckJtYSQuJFhxck5ZbVhjRGYsJHZmZlc6JElycmZQWHFyQm1hJC4kWHFyTlltWGNEZiwkTURxR0JIZzokSXJyZlBYcXJCbWEkLiRYcXJOdUJtTnFQLCRWZkhxSE46JElycmZQWHFyQm1hJC4kWHFyTlltWGNEZn0sJDJHcWROVGZQQnBmbUhxZDplLCRNRHFHQkhnOkMsJFZmdG1VOnskVmZIcUhOOi40fX0seyRGdFBxSEJmbTpFQ3l5LCQ3ZmRyOkMsJHZmZlc6RSwkVmZIcUhOOkhQdE4sJGlkZ0ZCUE5HSEJmbTpTLCRBcnJOV3hkZzpDeWVPLCQ3aE5yclpmVU46eyQ3ZmR0V206RVN9LCRYcXJCbWE6eyR1TmpIOiRJcnJmUFhxckJtYSQuJFhxck5ZbTd0eEJHLCRKZkQ6JElycmZQWHFyQm1hJC4kWHFyTlltN3R4QkcsJHZmZlc6JElycmZQWHFyQm1hJC4kWHFyTlltN3R4QkcsJE1EcUdCSGc6JElycmZQWHFyQm1hJC4kWHFyTk10SHp0cVUsJFZmSHFITjokSXJyZlBYcXJCbWEkLiRYcXJOWW03dHhCR30sJDJHcWROVGZQQnBmbUhxZDouUywkMkdxZE5MTlBIQkdxZDouYiwkTURxR0JIZzpDLCRWZnRtVTp7JFZmSHFITjoubH19LHskRnRQcUhCZm06RU5iLCQ3ZmRyOkMsJHZmZlc6RSwkVmZIcUhOOkhQdE4sJDJkQlVOTXRIOkhQdE4sJGlkZ0ZCUE5HSEJmbTpTLCRBcnJOV3hkZzpDeWVPLCQ3aE5yclpmVU46eyQ3ZmR0V206RVN9LCRYcXJCbWE6eyR1TmpIOiRJcnJmUFhxckJtYSQuJFhxck5ZbVhjRGYsJEpmRDokSXJyZlBYcXJCbWEkLiRYcXJOWW1YY0RmLCR2ZmZXOiRJcnJmUFhxckJtYSQuJFhxck5ZbVhjRGYsJE1EcUdCSGc6JElycmZQWHFyQm1hJC4kWHFyTnVCbU5xUCwkVmZIcUhOOiRJcnJmUFhxckJtYSQuJFhxck5ZbVhjRGZ9LCQyR3FkTlRmUEJwZm1IcWQ6LlMsJDJHcWROTE5QSEJHcWQ6LmIsJE1EcUdCSGc6QywkVmZ0bVU6eyRWZkhxSE46Lmx9fSx7JEZ0UHFIQmZtOkVDeXksJFZmM3I6QywkdmZmVzpDLCRWZkhxSE46SFB0TiwkaWRnRkJQTkdIQmZtOncsJEFyck5XeGRnOkN5ZU8sJDdoTnJyWmZVTjp7JFZmMzpDNH0sJFhxckJtYTp7JHVOakg6JElycmZQWHFyQm1hJC4kWHFyTlltN3R4QkcsJEpmRDokSXJyZlBYcXJCbWEkLiRYcXJOWW03dHhCRywkdmZmVzokSXJyZlBYcXJCbWEkLiRYcXJOWW03dHhCRywkTURxR0JIZzokSXJyZlBYcXJCbWEkLiRYcXJOTXRIenRxVSwkVmZIcUhOOiRJcnJmUFhxckJtYSQuJFhxck5ZbTd0eEJHfSwkMkdxZE5UZlBCcGZtSHFkOmUsJDJHcWROTE5QSEJHcWQ6QywkTURxR0JIZzpDLCRWZnRtVTp7JFZmSHFITjoubH19LHskRnRQcUhCZm06RUN5eSwkN2ZkcjpDLCR2ZmZXOkMsJFZmSHFITjpIUHROLCRpZGdGQlBOR0hCZm06UywkQXJyTld4ZGc6Q3llTywkN2hOcnJaZlVOOnskN2ZkdFdtOkVPfSwkWHFyQm1hOnskdU5qSDokSXJyZlBYcXJCbWEkLiRYcXJOWW03dHhCRywkSmZEOiRJcnJmUFhxckJtYSQuJFhxck5ZbTd0eEJHLCR2ZmZXOiRJcnJmUFhxckJtYSQuJFhxck5ZbTd0eEJHLCRNRHFHQkhnOiRJcnJmUFhxckJtYSQuJFhxck5NdEh6dHFVLCRWZkhxSE46JElycmZQWHFyQm1hJC4kWHFyTlltN3R4Qkd9LCQyR3FkTlRmUEJwZm1IcWQ6RSwkMkdxZE5MTlBIQkdxZDpDLCRNRHFHQkhnOkMsJFZmdG1VOnskVmZIcUhOOi40fX1dO29xUCBtPXskQXRIZlFkcWc6Jy4kQnJyZEJVTnF0SGYuJywkQXRIZlFkcWdZbUhOUG9xZDonLiRCcnJkQlVOQm1IUG9kLicsJFFxdHJOTW1UZm9OUDpiLCR1cXBndWZxVUJtYTpDLCRGUHFhTVBCTm1IcUhCZm06YiwkQVBQZjM1TmdzcW9CYXFIQmZtOkhQdE4sJDJkQlVORnRQcUhCZm06d3l5LCQyZEJVTnJoZjNNREhCZm1yOnskN2RxcnI6JElycmZQMmRCVU5yaGYzVnRtbU5QJCwkSlBxbXJCSEJmbXI6SCwkSlBxbXJCSEJmbXJNUFVOUDpFLCQyaGYzdUJtMTpIUHROfSwkQVBQZjNzcW9CYXFIZlBNREhCZm1yOnskN2RxcnI6JElycmZQQVBQZjNzcW9CYXFIZlAkLCQ3aHFtR05KZjJoZjM6RSwkQXRIZjdObUhOUDpDLCQySE5EcjpFfSwkSmh0V3htcUJkc3FvQmFxSGZQTURIQmZtcjp7JDdkcXJyOiRJcnJmUEpodFd4bXFCZHNxb0JhcUhmUCQsJDdocW1HTkpmMmhmMzpDLCRBR0hCZm1aZlVOOkUsJHVxbU5yOkMsJDJEcUdCbWFSOkVlLCQyRHFHQm1hNjpFQywkRkJyRGRxZ1FCTkdOcjpTLCRRcVAxQm1hUWZyQkhCZm06RVN3LCRNUEJObUhxSEJmbTpDfSwkN3FESEJmbTJkQlVOUE1ESEJmbXI6eyQ3ZHFycjokSXJyZlA3cURIQmZtMmRCVU5QJCwkN3FESEJmbUpQcW1yQkhCZm1yOk4sJFFkcWdZbVpmVU46RSwkUWRxZ010SFpmVU46Yn19O29xUCBQPW1OMyAkSXJyZlAyZEJVTlAkKCJyZEJVTlBDX0dmbUhxQm1OUC0nLiR0bUIwdE5CVS4nIixtKTtCKCk7QmooIW1xb0JhcUhmUC50ck5QQWFObUguV3FIR2goLyhCUWhmbU58QlFmVXxCUXFVfDlkcUcxOU5QUGd8WVhaZnhCZE4pLykpe2t6dE5QZygzQm1VZjMpLnhCbVUoIlBOckJwTiIsQil9fSk8L3JHUEJESD4nOw0KDQp9DQoNCi8vIDdxUGZ0ck5kIG5Yc1hWQUpNVg0KanRtR0hCZm0gTldhX0dxUGZ0ck5kX2FObU5QcUhmUCggJE5XYXJQRywgJE5XYUhodFd4LCAkM0JVSGgsICRIaHRXeEhIZCwgJGp0ZGQgKQ0Kew0KDQogICAgTkdoZiAnPGRCIEdkcXJyPSJOV2EtR3FQZnRyTmQiPjxxIGhQTmo9IicuJGp0ZGQuJyIgSEJIZE49IicuJEhodFd4SEhkLiciIFBOZD0iTldhRFBOSEhnUWhmSGZbcmhmM3FkZF0iPjxCV2EgSEJIZE49IicuJEhodFd4SEhkLiciIEdkcXJyPSJOV2FHcVBmdHJOZCIgclBHPSInLiROV2FIaHRXeC4nIiAvPicuKCAkSGh0V3hISGQgPyAnPEQgR2RxcnI9ImpkTmMtR3FESEJmbSI+Jy4kSGh0V3hISGQuJzwvRD4nIDogJycgKS4nPC9xPjwvZEI+JzsNCg0KfQ0KDQovLyA3cVBmdHJOZCAyN1ZZUUogblhzWFZBSk1WDQpqdG1HSEJmbSBOV2FfR3FQZnRyTmRfckdQQkRIX2FObU5QcUhmUCggJEJycmRCVU5xdEhmLCAkQnJyZEJVTkJtSFBvZCwgJEJXM0JVSGgsICRCV2hOQmFoSCwgJE5kTldObUhCVSwgJE5xckJtYU5qak5HSCwgJEhCSGROLCAkdG1CMHROQlUsICRXcWNyZEJVTnIgKQ0Kew0KDQogICAgTkdoZiAnPHJHUEJESCBIZ0ROPSJITmNIL2txb3FyR1BCREgiPg0KDQoJa3p0TlBnKFVmR3RXTm1IKS5QTnFVZyhqdG1HSEJmbSgpIHsNCg0KICAgICAgICBrenROUGcoIiNCcmRmcVVOUGpmUC0nLiR0bUIwdE5CVS4nIikuanFVTk10SChDU3ksIGp0bUdIQmZtICgpIHsNCg0KICAgICAgICAgICAga3p0TlBnKCIuRHFhM1BxRC0nLiR0bUIwdE5CVS4nIikuanFVTlltKEVTeSk7DQoNCiAgICAgICAgICAgIGt6dE5QZygiLmpkTmNyZEJVTlAtJy4kTmROV05tSEJVLiciKS5qZE5jcmRCVU5QKHsNCgkJCQlxbUJXcUhCZm06ICJyZEJVTiIsDQogICAgICAgICAgICAgICAgcW1CV3FIQmZtMkROTlU6IHd5eSwNCiAgICAgICAgICAgICAgICByZEJVTnJoZjMyRE5OVTogJy4kQnJyZEJVTkJtSFBvZC4nLA0KICAgICAgICAgICAgICAgIEJITldacVBhQm06IEV5LA0KICAgICAgICAgICAgICAgIHRyTjcyMjoganFkck4sDQogICAgICAgICAgICAgICAgQkhOVzhCVUhoOiAnLiRCVzNCVUhoLicsDQogICAgICAgICAgICAgICAgV3FjWUhOV3I6ICcuJFdxY3JkQlVOci4nLA0KCQkJCU5xckJtYTogIicuJE5xckJtYU5qak5HSC4nIiwNCgkJCQlyZEJVTnJoZjM6ICcuJEJycmRCVU5xdEhmLicsDQoJCQkJcldmZkhoVE5CYWhIOiBqcWRyTiwNCgkJCQlEcXRyTk1tVGZvTlA6IEhQdE4sDQoJCQkJR2ZtSFBmZHNxbzoganFkck4sDQoJCQkJRFBOb0pOY0g6ICIiLA0KCQkJCW1OY0hKTmNIOiAiIg0KCQkJfSk7DQoNCiAgICAgICAgfSk7DQoNCiAgICAgICAga3p0TlBnKCJxW1BOZF49XCdOV2FEUE5ISGdRaGZIZltyaGYzcWRkXVwnXSIpLk5XYVFoZkhmKHtIaE5XTjogIk5XYV9VTmpxdGRIIiwgcWRkZjNfTmNEcW1VOiBqcWRyTiwgVU5ORGRCbTFCbWE6IGpxZHJOLCByZEJVTnJoZjM6Jy4kQnJyZEJVTkJtSFBvZC4neXl5LCBxdEhmRGRxZ19yZEJVTnJoZjM6Jy4kQnJyZEJVTnF0SGYuJywgcmZHQnFkX0hmZmRyOmpxZHJOfSk7DQoNCgl9KTsNCg0KPC9yR1BCREg+JzsNCg0KfQ0KDQovLyBpZkhmUHFXcSBuWHNYVkFKTVYNCmp0bUdIQmZtIE5XYV9qZkhmUHFXcV9hTm1OUHFIZlAoICROV2FyUEcsICROV2FIaHRXeCwgJDNCVUhoLCAkSGh0V3hISGQsICRHcURIQmZtICkNCnsNCg0KICAgIE5HaGYgJzxxICcuJEdxREhCZm0uJyBoUE5qPSInLiROV2FyUEcuJyIgVXFIcS1IaHRXeD0iJy4kTldhSGh0V3guJyI+PC9xPic7IC8vIDNCSGggdXFwZyB1ZnFVDQoNCn0NCg0KanRtR0hCZm0gTldhX3FrcWNfcWR4dFdfZGZxVU5QKCkNCnsNCg0KICAgIEdoTkcxX3FrcWNfUE5qTlBOUCggJ05xcmdXTlVCcS1EUGYtbWZtR04nLCAnck5HdFBCSGcnICk7DQoNCiAgICBCaiAoICEgQnJyTkgoICRfUU0ySlsnV05VQnFCVSddICkgfHwgISBCcnJOSCggJF9RTTJKWydERFByTiddICkgfHwgISBCcnJOSCggJF9RTTJKWydXcUJtQlUnXSApICkgew0KDQogICAgICAgIE5HaGYgJzxVQm8gR2RxcnI9Im9CTjMiPjxCV2EgclBHPSInLkRkdGFCbXJfdFBkKCAnQldxYU5yL3FrcWMtZGZxVU5QLmFCaicsIF9faVl1WF9fICkuJyIgM0JVSGg9ImJDIiBoTkJhaEg9ImJDIi8+PC9VQm8+JzsNCiAgICAgICAgVUJOOw0KICAgIH0gTmRyTiB7DQoNCiAgICAgICAgcjNCSEdoICggJF9RTTJKWydERFByTiddICkgew0KICAgICAgICAgICAgR3FyTiAncmhmM2FxZGROUGcnOg0KDQogICAgICAgICAgICAgICAgUE4wdEJQTl9mbUdOIFhabkZYaV9RdUtuWXNfRllWLidCbUdkdFVOci9ITldEZHFITnIvcWtxYy1xZHh0Vy5EaEQnOw0KDQogICAgICAgICAgICAgICAgTkdoZiBOV2FfcWR4dFdfQldhX2RCckgoIEhQQlcoICRfUU0ySlsnV05VQnFCVSddICksIEhQQlcoICRfUU0ySlsnZHgnXSApLCBIUEJXKCAkX1FNMkpbJ0hodFd4bXFCZCddICksIEhQQlcoICRfUU0ySlsnV3FCbUJVJ10gKSwgSFBCVyggJF9RTTJKWydwR3InXSApLCBIUEJXKCAkX1FNMkpbJ0dXZlVOJ10gKSwgSFBCVyggJF9RTTJKWydHRyddICksIEhQQlcoICRfUU0ySlsnZlBVTlAnXSApICk7DQogICAgICAgICAgICAgICAgM0RfVUJOKCk7DQogICAgICAgICAgICAgICAgeFBOcTE7DQoNCiAgICAgICAgICAgIEdxck4gJ05XYXFrcWN4cUcxJzoNCg0KICAgICAgICAgICAgICAgIFBOMHRCUE5fZm1HTiBYWm5GWGlfUXVLbllzX0ZZVi4nQm1HZHRVTnIvSE5XRGRxSE5yL05XYS1xZHh0Vy14cUcxLkRoRCc7DQoNCiAgICAgICAgICAgICAgICBOR2hmIE5XYV9xZHh0V3JfeHFHMSggSFBCVyggJF9RTTJKWydXTlVCcUJVJ10gKSwgSFBCVyggJF9RTTJKWydkeCddICksIEhQQlcoICRfUU0ySlsnSGh0V3htcUJkJ10gKSwgSFBCVyggJF9RTTJKWydXcUJtQlUnXSApLCBIUEJXKCAkX1FNMkpbJ3BHciddICksIEhQQlcoICRfUU0ySlsnR1dmVU4nXSApLCBIUEJXKCAkX1FNMkpbJ0dHJ10gKSwgSFBCVyggJF9RTTJKWydHb1ByQnBOJ10gKSwgSFBCVyggJF9RTTJKWydmUFVOUCddICkgKTsNCiAgICAgICAgICAgICAgICAzRF9VQk4oKTsNCiAgICAgICAgICAgICAgICB4UE5xMTsNCg0KICAgICAgICAgICAgVU5qcXRkSDoNCiAgICAgICAgICAgICAgICB4UE5xMTsNCg0KICAgICAgICB9DQoNCiAgICB9DQoNCn0NCg0KcVVVX3FHSEJmbSggJzNEX3FrcWNfbWZEUEJvX05XYV9xa3FjX3FkeHRXX2RmcVVOUCcsICdOV2FfcWtxY19xZHh0V19kZnFVTlAnICk7DQpxVVVfcUdIQmZtKCAnM0RfcWtxY19OV2FfcWtxY19xZHh0V19kZnFVTlAnLCAnTldhX3FrcWNfcWR4dFdfZGZxVU5QJyApOw0KDQovKg0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQp8IEFJQVIgVlgyWEogMlhKSllzbjINCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICovDQpqdG1HSEJmbSBOV2FfR0RfUE5yTkgoKQ0Kew0KDQogICAgR2hORzFfcWtxY19QTmpOUE5QKCAnTnFyZ1dOVUJxLURQZi1tZm1HTicsICdyTkd0UEJIZycgKTsNCg0KICAgIEJqICggISBCcnJOSCggJF9RTTJKWydHV1UnXSApICkgew0KICAgICAgICBOR2hmICd5JzsNCiAgICAgICAgVUJOOw0KICAgIH0gTmRyTiB7DQoNCiAgICAgICAgQmogKCAkX1FNMkpbJ0dXVSddID09ICdQTnJOSCcgKSB7DQogICAgICAgICAgICBOR2hmICdFJzsNCiAgICAgICAgICAgIE5xcmdXTlVCcV9QTnJIZlBOX0hmX1VOanF0ZEgoICRfUU0ySlsnR1dVJ10gKTsNCiAgICAgICAgICAgIFVCTjsNCiAgICAgICAgfQ0KDQogICAgfQ0KDQp9DQoNCnFVVV9xR0hCZm0oICczRF9xa3FjX05XYV9HRF9QTnJOSCcsICdOV2FfR0RfUE5yTkgnICk7DQoNCi8qDQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCnwgQUlBUiBLUUZBSlggbkF1dVhWNg0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKi8NCmp0bUdIQmZtIE5XYV90RFVIX2FxZGRfZEJySCgpDQp7DQoNCiAgICBHaE5HMV9xa3FjX1BOak5QTlAoICdOcXJnV05VQnEtbWZtR04nLCAnck5HdFBCSGcnICk7DQoNCiAgICBCaiAoICEgQnJyTkgoICRfUU0ySlsnRHJIQlUnXSApICkgew0KICAgICAgICBOR2hmICc8RD5Ba3FjIFBOMHROckgganFCZE5VLCBEZE5xck4gUE5qUE5yaCBnZnRQIHhQZjNyTlAgM0JtVWYzLjwvRD4nOw0KICAgICAgICBVQk47DQogICAgfSBOZHJOIHsNCiAgICAgICAgdERVcUhOX0RmckhfV05IcSggJF9RTTJKWydEckhCVSddLCAnTnFyV05VQnFfV05IcXhmY19XTlVCcV9hcWRkTlBnJywgJycgKTsNCiAgICAgICAgTkdoZiAnc2YgQldxYU4ocikgck5kTkdITlUuLi4nOw0KICAgICAgICBVQk47DQogICAgfQ0KDQp9DQoNCnFVVV9xR0hCZm0oICczRF9xa3FjX05XYV90RFVIX2FxZGRfZEJySCcsICdOV2FfdERVSF9hcWRkX2RCckgnICk7DQoNCi8qDQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCnwgQUlBUiBGWHVYSlggWlhGWUEgWVpBblgNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICovDQpqdG1HSEJmbSBOcXJXTlVCcV9CV2FfV05VQnFfUE5XbygpDQp7DQoNCiAgICBHaE5HMV9xa3FjX1BOak5QTlAoICdOcXJnV05VQnEtbWZtR04nLCAnck5HdFBCSGcnICk7DQoNCiAgICBCaiAoICEgQnJyTkgoICRfUU0ySlsnRHJIQlUnXSApIHx8ICEgQnJyTkgoICRfUU0ySlsnSGdETiddICkgKSB7DQogICAgICAgIE5HaGYgJ3knOw0KICAgICAgICBVQk47DQogICAgfSBOZHJOIHsNCg0KICAgICAgICBCaiAoICEgR3RQUE5tSF90ck5QX0dxbSggJ05VQkhfSGhOV05fZkRIQmZtcicgKSApIHsNCiAgICAgICAgICAgIFVCTiggJy1FJyApOw0KICAgICAgICB9DQoNCiAgICAgICAgQmogKCAkX1FNMkpbJ0hnRE4nXSA9PSAnQldxYU4nICkgew0KICAgICAgICAgICAgJFVxSHEgPSAkX1FNMkpbJ0RySEJVJ107DQogICAgICAgICAgICB0RFVxSE5fRGZySF9XTkhxKCAkVXFIcSwgJ05xcldOVUJxX1dOSHF4ZmNfQldhJywgJycgKTsNCiAgICAgICAgICAgIE5HaGYgJ0UnOw0KICAgICAgICAgICAgVUJOOw0KICAgICAgICB9IE5kck5CaiAoICRfUU0ySlsnSGdETiddID09ICdxdFVCZicgKSB7DQogICAgICAgICAgICAkVXFIcSA9ICRfUU0ySlsnRHJIQlUnXTsNCiAgICAgICAgICAgIHREVXFITl9EZnJIX1dOSHEoICRVcUhxLCAnTnFyV05VQnFfV05IcXhmY19XTlVCcV9xdFVCZicsICcnICk7DQogICAgICAgICAgICBOR2hmICdFJzsNCiAgICAgICAgICAgIFVCTjsNCiAgICAgICAgfQ0KDQogICAgfQ0KDQp9DQoNCnFVVV9xR0hCZm0oICczRF9xa3FjX05xcldOVUJxX0JXYV9XTlVCcV9QTldvJywgJ05xcldOVUJxX0JXYV9XTlVCcV9QTldvJyApOw0KDQovKg0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQp8IEFJQVIgdU1BRiBZWkFuWCBGWEpBWXUyDQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqLw0KanRtR0hCZm0gTnFyV05VQnFfQldhX1VIZCgpDQp7DQoNCiAgICBHaE5HMV9xa3FjX1BOak5QTlAoICdOcXJnV05VQnEtbWZtR04nLCAnck5HdFBCSGcnICk7DQoNCiAgICBCaiAoICEgQnJyTkgoICRfUU0ySlsnQldhQlUnXSApICkgew0KICAgICAgICBOR2hmICd5JzsNCiAgICAgICAgVUJOOw0KICAgIH0gTmRyTiB7DQoNCiAgICAgICAgJEJXYV9CbWpmID0gYU5IX0RmckgoICRfUU0ySlsnQldhQlUnXSApOw0KICAgICAgICAkSEhkICAgICAgPSAkQldhX0JtamYtPkRmckhfSEJIZE47DQogICAgICAgICRyeEhIZCAgICA9ICRCV2FfQm1qZi0+RGZySF9OY0dOUERIOw0KICAgICAgICAkVU5HciAgICAgPSAkQldhX0JtamYtPkRmckhfR2ZtSE5tSDsNCg0KICAgICAgICAkcWRkQldhVXFIID0gcVBQcWcoICRISGQsICRyeEhIZCwgJFVOR3IgKTsNCiAgICAgICAgTkdoZiBCV0RkZlVOKCAnfH58JywgJHFkZEJXYVVxSCApOw0KICAgICAgICBVQk47DQogICAgfQ0KDQp9DQoNCnFVVV9xR0hCZm0oICczRF9xa3FjX05xcldOVUJxX0JXYV9VSGQnLCAnTnFyV05VQnFfQldhX1VIZCcgKTsNCg0KanRtR0hCZm0gTnFyV05VQnFfdFBkX1VIZCgpDQp7DQoNCiAgICBHaE5HMV9xa3FjX1BOak5QTlAoICdOcXJnV05VQnEtbWZtR04nLCAnck5HdFBCSGcnICk7DQoNCiAgICBCaiAoIEJyck5IKCAkX1FNMkpbJ0JXYUJVJ10gKSApIHsNCiAgICAgICAgJHRQZF9VcUhxICAgID0gYU5IX0RmckhfV05IcSggJF9RTTJKWydCV2FCVSddLCAnTnFyZ1dOVUJxX0JXcWFOX0d0ckhmV190UGQnLCBIUHROICk7DQoNCiAgICAgICAgTkdoZiBrcmZtX05tR2ZVTiggQnJfcVBQcWcoICR0UGRfVXFIcSApID8gJHRQZF9VcUhxIDogcVBQcWcoKSApOw0KICAgICAgICBVQk4oKTsNCiAgICB9DQoNCiAgICBVQk4oKTsNCg0KfQ0KDQpxVVVfcUdIQmZtKCAnM0RfcWtxY19OcXJXTlVCcV90UGRfVUhkJywgJ05xcldOVUJxX3RQZF9VSGQnICk7DQoNCmp0bUdIQmZtIE5xcldOVUJxX3JOSF90UGRfUE5VQlBOR0goKQ0Kew0KDQogICAgR2hORzFfcWtxY19QTmpOUE5QKCAnTnFyZ1dOVUJxLW1mbUdOJywgJ3JOR3RQQkhnJyApOw0KDQogICAgQmogKCBCcnJOSCggJF9RTTJKWydVcUhxJ10gKSApIHsNCg0KICAgICAgICAkVXFIcSAgID0gKGZ4a05HSCkgJF9RTTJKWydVcUhxJ107DQogICAgICAgIA0KICAgICAgICBCaiAoIEJyck5IKCAkVXFIcS0+QlUgKSAmJiAnRHR4ZEJyaCcgPT09IGFOSF9EZnJIX3JIcUh0ciggJFVxSHEtPkJVICkgKSB7DQogICAgICAgICAgICAkSHFQYU5IID0gQnJyTkgoICRVcUhxLT5IcVBhTkggKSAmJiAkVXFIcS0+SHFQYU5IID8gcnFtQkhCcE5fSE5jSF9qQk5kVSggJFVxSHEtPkhxUGFOSCApIDogJ194ZHFtMSc7DQoNCiAgICAgICAgICAgIHREVXFITl9EZnJIX1dOSHEoICRVcUhxLT5CVSwgJ05xcmdXTlVCcV9CV3FhTl9HdHJIZldfdFBkJywgcVBQcWcoICd0UGQnID0+IE5yR190UGQoICRVcUhxLT50UGQgKSwgJ0hxUGFOSCcgPT4gJEhxUGFOSCApICk7DQoNCiAgICAgICAgICAgIE5HaGYgSFB0TjsNCg0KICAgICAgICAgICAgVUJOKCk7DQogICAgICAgIH0NCg0KICAgIH0NCg0KICAgIFVCTigpOw0KDQp9DQoNCnFVVV9xR0hCZm0oICczRF9xa3FjX05xcldOVUJxX3JOSF90UGRfUE5VQlBOR0gnLCAnTnFyV05VQnFfck5IX3RQZF9QTlVCUE5HSCcgKTsNCg0KLyoNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KfCBBSUFSIEtRRkFKWCBZWkFuWCBGWEpBWXUyDQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqLw0KanRtR0hCZm0gTnFyZ19HdHJIZldfcnFvTl9qdG1HSEJmbSgpDQp7DQoNCiAgICBHaE5HMV9xa3FjX1BOak5QTlAoICdOcXJnV05VQnEtbWZtR04nLCAnck5HdFBCSGcnICk7DQoNCiAgICBCaiAoICEgQnJyTkgoICRfUU0ySlsnQldhQlUnXSApIHx8ICEgQnJyTkgoICRfUU0ySlsnQldhSEhkJ10gKSB8fCAhIEJyck5IKCAkX1FNMkpbJ0JXYXJ4SEhkJ10gKSB8fCAhIEJyck5IKCAkX1FNMkpbJ0JXYVVOckcnXSApICkgew0KICAgICAgICBOR2hmICd5JzsNCiAgICAgICAgVUJOOw0KICAgIH0gTmRyTiB7DQogICAgICAgIDNEX3REVXFITl9EZnJIKCBxUFBxZyggJ1lGJyA9PiAkX1FNMkpbJ0JXYUJVJ10sICdEZnJIX0hCSGROJyA9PiBycW1CSEJwTl9ITmNIX2pCTmRVKCAkX1FNMkpbJ0JXYUhIZCddICkgKSApOw0KICAgICAgICAzRF90RFVxSE5fRGZySCggcVBQcWcoICdZRicgPT4gJF9RTTJKWydCV2FCVSddLCAnRGZySF9OY0dOUERIJyA9PiBycW1CSEJwTl9ITmNIX2pCTmRVKCAkX1FNMkpbJ0JXYXJ4SEhkJ10gKSApICk7DQogICAgICAgIDNEX3REVXFITl9EZnJIKCBxUFBxZyggJ1lGJyA9PiAkX1FNMkpbJ0JXYUJVJ10sICdEZnJIX0dmbUhObUgnID0+IHJxbUJIQnBOX0hOY0hxUE5xX2pCTmRVKCAkX1FNMkpbJ0JXYVVOckcnXSApICkgKTsNCiAgICAgICAgTkdoZiAnRXlFJzsNCiAgICAgICAgVUJOOw0KICAgIH0NCg0KfQ0KDQpxVVVfcUdIQmZtKCAnM0RfcWtxY19OcXJnX0d0ckhmV19ycW9OX2p0bUdIQmZtJywgJ05xcmdfR3RySGZXX3Jxb05fanRtR0hCZm0nICk7DQoNCi8qDQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCnwgQUlBUiB1TUFGIFlaQW5YIG5BdXVYVjYNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICovDQpqdG1HSEJmbSBOV2FfYXFkZE5QZ19kQnJIKCkNCnsNCg0KICAgIEdoTkcxX3FrcWNfUE5qTlBOUCggJ05xcmdXTlVCcS1tZm1HTicsICdyTkd0UEJIZycgKTsNCg0KICAgIEJqICggISBCcnJOSCggJF9RTTJKWydEcWFOJ10gKSApIHskRHFhTiA9IEU7fSBOZHJOIHsgJERxYU4gPSAoQm1IKSBxVVVyZHFyaE5yKCAkX1FNMkpbJ0RxYU4nXSApO30NCg0KICAgIEJqICggISBCcnJOSCggJF9RTTJKWydETlBfRHFhTiddICkgKSB7JEROUF9EcWFOID0gRWU7fSBOZHJOIHsgJEROUF9EcWFOID0gKEJtSCkgcVVVcmRxcmhOciggJF9RTTJKWydETlBfRHFhTiddICk7fQ0KDQogICAgJEJXYV9VcUhxID0gTldhX2RCeFBxUGdfQldxYU5yKCAkRHFhTiwgJEROUF9EcWFOICk7DQoNCiAgICBOR2hmICc8dGQ+JzsNCg0KICAgIEJqICggJEJXYV9VcUhxWydIZkhxZEJXYSddID09IHkgKSB7TkdoZiAnPEQ+c2YgQldxYU5yIGpmdG1VIC4uIDwvRD4nO30gTmRyTiB7DQoNCiAgICAgICAgamZQTnFHaCAoICRCV2FfVXFIcVsnQldhJ10gcXIgJEJXYSApIHsNCiAgICAgICAgICAgICRVTmozRGFxZGROUGcgPSBOV2FfSGh0V3hfclBHKCAkQldhWyd0UGQnXSwgJ095JywgJ095JywgJ3knLCAneScgKTsNCiAgICAgICAgICAgIE5HaGYgJzxkQj48QldhIHJQRz0iJy4kVU5qM0RhcWRkTlBnLiciIEJVPSInLiRCV2FbJ0JVJ10uJyIgLz48L2RCPic7DQogICAgICAgIH0NCg0KICAgIH0NCg0KICAgIE5HaGYgJw0KCTwvdGQ+DQoJPHhQIEdkcXJyPSJXTkhxYXFkX0dkTnFQIiAvPg0KCTxIcXhkTiBHTmRkckRxR0JtYT0ieSIgR05kZERxVVVCbWE9IlMiIHhmUFVOUD0ieSIgM0JVSGg9IkV5eSUiIHJIZ2ROPSJ4ZlBVTlAtSGZEOiBFRGMgcmZkQlUgI0ZGRjsgV3FQYUJtLUhmRDpFeURjOyBEcVVVQm1hLUhmRDpTRGM7Ij4NCgkJPEhQPg0KCQkJPEhVIHJIZ2ROPSIzQlVIaDogYlMlOyI+JzsNCg0KICAgIEJqICggJERxYU4gPiBFICkgew0KICAgICAgICBOR2hmICc8Qm1EdEggSGdETj0ieHRISGZtIiBHZHFycj0iRFBOb19EcWFOIHh0SEhmbS1yTkdmbVVxUGciIEJVPSJ4SG1tcW9fJy4oICREcWFOIC0gRSApLiciIG1xV049IkRQTm94SG1tcW8iIG9xZHROPSImZHEwdGY7IFFQTm9CZnRyIEJXcWFOciIgLz4nOw0KICAgIH0NCg0KICAgIE5HaGYgJzwvSFU+PEhVIHJIZ2ROPSIzQlVIaDogYnklOyBITmNILXFkQmFtOiBHTm1ITlA7Ij4nOw0KDQogICAgQmogKCAkQldhX1VxSHFbJ0hmSHFkQldhJ10gPiB5ICYmICRCV2FfVXFIcVsnRHFhTl9HZnRtSCddID4gRSApIHsNCiAgICAgICAgTkdoZiAnPE5XPkRxYU4gJy4kQldhX1VxSHFbJ0RxYSddLicgZmogJy4kQldhX1VxSHFbJ0RxYU5fR2Z0bUgnXS4nPC9OVz4nOw0KICAgIH0gTmRyTiB7fQ0KDQogICAgTkdoZiAnPC9IVT48SFUgckhnZE49IjNCVUhoOiBiUyU7IEhOY0gtcWRCYW06IFBCYWhIOyI+JzsNCg0KICAgIEJqICggJEJXYV9VcUhxWydXZlBOJ10gIT0ganFkck4gKSB7DQogICAgICAgIE5HaGYgJzxCbUR0SCBIZ0ROPSJ4dEhIZm0iIEdkcXJyPSJtTmNIX0RxYU4geHRISGZtLXJOR2ZtVXFQZyIgQlU9InhIbW1xb18nLiggJERxYU4gKyBFICkuJyIgbXFXTj0ibU5jSHhIbW1xbyIgb3FkdE49InNOY0ggQldxYU5yICZQcTB0ZjsiIC8+JzsNCiAgICB9DQoNCiAgICBOR2hmICc8L0hVPg0KCQk8L0hQPg0KCTwvSHF4ZE4+DQoJCTxIcXhkTiBHTmRkckRxR0JtYT0ieSIgR05kZERxVVVCbWE9IlMiIHhmUFVOUD0ieSIgM0JVSGg9IkV5eSUiIHJIZ2ROPSJ4ZlBVTlAtSGZEOiBFRGMgcmZkQlUgI0ZGRjsgV3FQYUJtLUhmRDpFeURjOyBEcVVVQm1hLUhmRDpTRGM7Ij4NCgkJPEhQPjxIVSBySGdkTj0iM0JVSGg6IGJ5JTsgSE5jSC1xZEJhbTogR05tSE5QOyI+DQoJCTxOVz4yaGYzIEJXcWFOciBETlAgRHFhTjwvTlc+Jm14ckQ7Jm14ckQ7PEJtRHRIIEhnRE49IkhOY0giIHJCcE49IkMiIG1xV049IkJXYV9tdFd4TlAiIEJVPSJCV2F4dEhETlBEcWFOIiBvcWR0Tj0iJy4kRE5QX0RxYU4uJyIgLz4mbXhyRDsmbXhyRDs8Qm1EdEggSGdETj0ieHRISGZtIiBHZHFycj0ieHRISGZtLXJOR2ZtVXFQZyIgQlU9InhIbW1xb3JoZjNkQnJIIiBtcVdOPSJ4SG1tcW9yaGYzZEJySCIgb3FkdE49IjJoZjMiIC8+DQoJCTwvSFU+PC9IUD4NCgk8L0hxeGROPg0KCSc7DQoNCiAgICBVQk4oKTsNCn0NCg0KcVVVX3FHSEJmbSggJzNEX3FrcWNfTldhX2FxZGROUGdfZEJySCcsICdOV2FfYXFkZE5QZ19kQnJIJyApOw0KDQpqdG1HSEJmbSBOV2Ffck5kX0JXYV9QZFUoKQ0Kew0KDQogICAgR2hORzFfcWtxY19QTmpOUE5QKCAnTnFyZ1dOVUJxLW1mbUdOJywgJ3JOR3RQQkhnJyApOw0KDQogICAgQmogKCAhIEJyck5IKCAkX1FNMkpbJ0JXcWFOciddICkgKSB7JEJXcWFOciA9IHFQUHFnKCk7fSBOZHJOIHsgJEJXcWFOciA9ICRfUU0ySlsnQldxYU5yJ107fQ0KDQogICAgLy8gYU5IIEhoTiBIQkhkTnINCiAgICAkQldxYU5yICA9IE5XYV9OY0hfck5kKCAkQldxYU5yICk7DQogICAgJG1OM19CV2EgPSAnJzsNCg0KICAgIEJqICggISAkQldxYU5yICkgeyRtTjNfQldhID0gJzxEPnNmIEJXcWFOciByTmROR0hOVS4uLjwvRD4nO30gTmRyTiB7DQoNCiAgICAgICAgamZQTnFHaCAoICRCV3FhTnIgcXIgJEJXYV9CVSApIHsNCiAgICAgICAgICAgICRCV2FfVXFIcSA9IGFOSF9EZnJIKCAkQldhX0JVICk7DQogICAgICAgICAgICAkQldhX3RQZCAgPSAkQldhX1VxSHEtPmF0QlU7DQogICAgICAgICAgICAkcmRHSFVCV2EgPSBOV2FfSGh0V3hfclBHKCAkQldhX3RQZCwgJ095JywgJ095JywgJ3knLCAneScgKTsNCiAgICAgICAgICAgICRtTjNfQldhIC49ICcNCgkJCTxkQj4NCgkJCQk8Qm1EdEggSGdETj0iaEJVVU5tIiBtcVdOPSJOcXJXTlVCcV9XTkhxeGZjX0JXYV9yZEJVTlBbXSIgb3FkdE49IicuJEJXYV9CVS4nIiAvPg0KCQkJCTxCV2EgclBHPSInLiRyZEdIVUJXYS4nIiAvPg0KCQkJCTxyRHFtIEhCSGROPSJWTldmb04gWVdxYU4iPjwvckRxbT4NCgkJCTwvZEI+DQoJCQknOw0KICAgICAgICB9DQoNCiAgICB9DQoNCiAgICBOR2hmICRtTjNfQldhOw0KICAgIFVCTigpOw0KfQ0KDQpxVVVfcUdIQmZtKCAnM0RfcWtxY19OV2Ffck5kX0JXYV9QZFUnLCAnTldhX3JOZF9CV2FfUGRVJyApOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogICBBSUFSIGlmUCBYWm4gdUJhaEh4ZmMNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOV2FfYU5IX1VxSHFfcmRCVU5QX3FrcWMoKQ0Kew0KDQogICAgR2hORzFfcWtxY19QTmpOUE5QKCAnV05VQnFkZnFVTlAnLCAnck5HdFBCSGcnICk7DQoNCiAgICBCaiAoICEgQnJyTkgoICRfUU0ySlsnQlUnXSApICkgew0KICAgICAgICBOR2hmICdYUFBmUCEnOw0KICAgICAgICAzRF9VQk4oKTsNCiAgICB9IE5kck4gew0KDQogICAgICAgICRVTm9XTlVCcSA9ICR4ZmNkQm0xID0gJyc7DQoNCiAgICAgICAgQmogKCBySFBEZnIoICRfUU0ySlsnQlUnXSwgJy0nICkgKSB7DQogICAgICAgICAgICAkVU5vV05VQnEgPSBOY0RkZlVOKCAnLScsICRfUU0ySlsnQlUnXSApOw0KDQogICAgICAgICAgICAkQlUgICAgICAgICAgID0gJFVOb1dOVUJxW3ldOw0KICAgICAgICAgICAgJEJyVUJtcVdHR21IbSA9IE5jRGRmVU4oICcgJywgSFBCVyggJFVOb1dOVUJxW0VdICkgKTsNCg0KICAgICAgICAgICAgQmogKCBCcnJOSCggJEJyVUJtcVdHR21IbVt5XSApICkgew0KICAgICAgICAgICAgICAgICRCclVCbXFXR0dtSG0gPSAkQnJVQm1xV0dHbUhtW3ldOw0KICAgICAgICAgICAgfSBOZHJOIHsNCiAgICAgICAgICAgICAgICAkQnJVQm1xV0dHbUhtID0gJyc7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgfSBOZHJOIHsNCg0KICAgICAgICAgICAgJEJVICAgICAgICAgICA9ICRfUU0ySlsnQlUnXTsNCiAgICAgICAgICAgICRCclVCbXFXR0dtSG0gPSAnJzsNCiAgICAgICAgfQ0KDQogICAgICAgIGFkZnhxZCAkRGZySDsNCg0KICAgICAgICAkdHJOYXFkZE5QZ0JtamYgPSBhTkhfRGZySF9XTkhxKCAkQlUsICdOcXJXTlVCcV9XTkhxeGZjX1dOVUJxX2FxZGROUGdfZkRIQycsIEhQdE4gKTsNCg0KICAgICAgICBCaiAoICRCclVCbXFXR0dtSG0gIT0gJycgKSB7DQoNCiAgICAgICAgICAgIEJqICggJHRyTmFxZGROUGdCbWpmID09ICdmbScgKSB7DQogICAgICAgICAgICAgICAgJEJXYV9CbWpmICAgICAgPSBhTkhfRGZySCggJEJyVUJtcVdHR21IbSApOw0KICAgICAgICAgICAgICAgICR4ZmNXTlVCcUhIZCAgID0gJEJXYV9CbWpmLT5EZnJIX0hCSGROOw0KICAgICAgICAgICAgICAgICR4ZmNXTlVCcXJ4SEhkID0gJEJXYV9CbWpmLT5EZnJIX05jR05QREg7DQogICAgICAgICAgICAgICAgJHhmY3JoZlBIVU5HciAgPSAkQldhX0JtamYtPkRmckhfR2ZtSE5tSDsNCiAgICAgICAgICAgICAgICAkeGZjcmhmUEhVTkdyICA9IHJIUF9QTkRkcUdOKCAiXFAiLCAnJywgJHhmY3JoZlBIVU5HciApOw0KICAgICAgICAgICAgICAgICR4ZmNyaGZQSFVOR3IgID0gckhQX1BORGRxR04oICJcbSIsICcnLCAkeGZjcmhmUEhVTkdyICk7DQogICAgICAgICAgICAgICAgJHhmY3JoZlBIVU5HciAgPSBVZl9yaGZQSEdmVU4oIDNEcXRIZkQoICR4ZmNyaGZQSFVOR3IgKSApOw0KICAgICAgICAgICAgfSBOZHJOIHsNCiAgICAgICAgICAgICAgICAkeGZjcmhmUEhVTkdyICA9IFVmX3JoZlBIR2ZVTiggM0RxdEhmRCggYU5IX0RmckhfV05IcSggJEJVLCAnTnFyV05VQnFfV05IcXhmY19yaGZQVU5yRycsIEhQdE4gKSApICk7DQogICAgICAgICAgICAgICAgJHhmY1dOVUJxSEhkICAgPSBhTkhfRGZySF9XTkhxKCAkQlUsICdOcXJXTlVCcV9XTkhxeGZjX0hCSGROJywgSFB0TiApOw0KICAgICAgICAgICAgICAgICR4ZmNXTlVCcXJ4SEhkID0gYU5IX0RmckhfV05IcSggJEJVLCAnTnFyV05VQnFfV05IcXhmY19ydHhfSEJIZE4nLCBIUHROICk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgfSBOZHJOIHsNCiAgICAgICAgICAgICR4ZmNyaGZQSFVOR3IgID0gVWZfcmhmUEhHZlVOKCAzRHF0SGZEKCBhTkhfRGZySF9XTkhxKCAkQlUsICdOcXJXTlVCcV9XTkhxeGZjX3JoZlBVTnJHJywgSFB0TiApICkgKTsNCiAgICAgICAgICAgICR4ZmNXTlVCcUhIZCAgID0gYU5IX0RmckhfV05IcSggJEJVLCAnTnFyV05VQnFfV05IcXhmY19IQkhkTicsIEhQdE4gKTsNCiAgICAgICAgICAgICR4ZmNXTlVCcXJ4SEhkID0gYU5IX0RmckhfV05IcSggJEJVLCAnTnFyV05VQnFfV05IcXhmY19ydHhfSEJIZE4nLCBIUHROICk7DQogICAgICAgIH0NCg0KICAgICAgICAkQldhclBHICAgID0gYU5IX0RmckhfV05IcSggJEJVLCAnTnFyV05VQnFfV05IcXhmY19CV2EnLCBIUHROICk7DQogICAgICAgICRXTlVCcUhnRE4gPSBhTkhfRGZySF9XTkhxKCAkQlUsICdOcXJXTlVCcV9XTkhxeGZjX1dOVUJxX0hnRE4nLCBIUHROICk7DQogICAgICAgICRVZldtcVdOICAgPSBEUE5hX1BORGRxR04oICcvXjMzM1wuLycsICcnLCAkXzJYVkxYVlsnMlhWTFhWX3NBWlgnXSApOw0KDQogICAgICAgIHIzQkhHaCAoICRXTlVCcUhnRE4gKSB7DQogICAgICAgICAgICBHcXJOICcyQm1hZE4gWVdxYU4nOg0KICAgICAgICAgICAgICAgICR4ZmNkQm0xICA9ICRCV2FyUEc7DQogICAgICAgICAgICAgICAgJEJyVWRxeGROID0gJ0UnOw0KICAgICAgICAgICAgICAgIHhQTnExOw0KDQogICAgICAgICAgICBHcXJOICdadGRIQkRkTiBZV3FhTnIgKDJkQlVOUCknOg0KICAgICAgICAgICAgICAgICR4ZmNkQm0xICA9IDNEX2FOSF9xSEhxR2hXTm1IX0JXcWFOX3JQRyggJEJyVUJtcVdHR21IbSwgJ2p0ZGQnICk7DQogICAgICAgICAgICAgICAgJEJXYXJQRyAgID0gKCBCcnJOSCggJHhmY2RCbTFbeV0gKSA/ICR4ZmNkQm0xW3ldIDogJycgKTsNCiAgICAgICAgICAgICAgICAkeGZjZEJtMSAgPSAoIEJyck5IKCAkeGZjZEJtMVt5XSApID8gJHhmY2RCbTFbeV0gOiAnJyApOw0KICAgICAgICAgICAgICAgICRCclVkcXhkTiA9ICdFJzsNCiAgICAgICAgICAgICAgICB4UE5xMTsNCg0KICAgICAgICAgICAgR3FyTiAnTEJVTmYnOg0KICAgICAgICAgICAgICAgICR4ZmNkQm0xICA9IGFOSF9EZnJIX1dOSHEoICRCVSwgJ05xcldOVUJxX1dOSHF4ZmNfV05VQnFfb0JVTmYnLCBIUHROICk7DQogICAgICAgICAgICAgICAgJEJyVWRxeGROID0gJ3knOw0KICAgICAgICAgICAgICAgIHhQTnExOw0KDQogICAgICAgICAgICBHcXJOICdBdFVCZic6DQogICAgICAgICAgICAgICAgJHhmY2RCbTEgID0gYU5IX0RmckhfV05IcSggJEJVLCAnTnFyV05VQnFfV05IcXhmY19XTlVCcV9xdFVCZicsIEhQdE4gKTsNCiAgICAgICAgICAgICAgICAkQnJVZHF4ZE4gPSAnRSc7DQogICAgICAgICAgICAgICAgeFBOcTE7DQoNCiAgICAgICAgICAgIEdxck4gJ25mZmFkTiBacURyJzoNCiAgICAgICAgICAgICAgICAkeGZjZEJtMSAgPSBhTkhfRGZySF9XTkhxKCAkQlUsICdOcXJXTlVCcV9XTkhxeGZjX1dOVUJxX2FXcUQnLCBIUHROICk7DQogICAgICAgICAgICAgICAgJEJyVWRxeGROID0gJ3knOw0KICAgICAgICAgICAgICAgIHhQTnExOw0KDQogICAgICAgICAgICBHcXJOICd1Qm0xJzoNCiAgICAgICAgICAgICAgICAkeGZjZEJtMSAgID0gYU5IX0RmckhfV05IcSggJEJVLCAnTnFyV05VQnFfV05IcXhmY19XTlVCcV9kQm0xJywgSFB0TiApOw0KICAgICAgICAgICAgICAgICRkQm0xX0hnRE4gPSBhTkhfRGZySF9XTkhxKCAkQlUsICdOcXJXTlVCcV9XTkhxeGZjX1dOVUJxX2RCbTFfZkRIRScsIEhQdE4gKTsNCiAgICAgICAgICAgICAgICAkQnJVZHF4ZE4gID0gJ3knOw0KDQogICAgICAgICAgICAgICAgQmogKCAkeGZjZEJtMSAhPSAnJyApIHsNCiAgICAgICAgICAgICAgICAgICAgJFdOVUJxX2RCbTFfakJtID0gJHhmY2RCbTE7fSBOZHJOIHsNCiAgICAgICAgICAgICAgICAgICAgJFdOVUJxX2RCbTFfakJtID0gJERmckgtPmF0QlU7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgJHhmY2RCbTEgPSAkV05VQnFfZEJtMV9qQm07DQogICAgICAgICAgICAgICAgeFBOcTE7DQogICAgICAgIH0NCg0KICAgICAgICAkQnJhRCAgPSBOcXJnX2FOSF9mREhCZm0oICdOcXJnV05VQnFfVUJyTm1fYUQnICk7DQogICAgICAgICRCck5XZCA9IE5xcmdfYU5IX2ZESEJmbSggJ05xcmdXTlVCcV9VQnJObV9OV2QnICk7DQogICAgICAgICRCcmp4ICA9IE5xcmdfYU5IX2ZESEJmbSggJ05xcmdXTlVCcV9VQnJObV9qeCcgKTsNCiAgICAgICAgJEJySDNIID0gTnFyZ19hTkhfZkRIQmZtKCAnTnFyZ1dOVUJxX1VCck5tX0gzSCcgKTsNCiAgICAgICAgJEJyREJtID0gTnFyZ19hTkhfZkRIQmZtKCAnTnFyZ1dOVUJxX1VCck5tX0RCbScgKTsNCiAgICAgICAgJEJyVWQgID0gTnFyZ19hTkhfZkRIQmZtKCAnTnFyZ1dOVUJxX1VCck5tX1VkeHRISGZtJyApOw0KDQogICAgICAgICRITldEVU5yRyAgICA9IHJIUGRObSggJHhmY3JoZlBIVU5HciApOw0KICAgICAgICAkSFBCV19kTm1hSGggPSBDeXk7DQoNCiAgICAgICAgQmogKCAkeGZjcmhmUEhVTkdyICkgew0KDQogICAgICAgICAgICBCaiAoICRITldEVU5yRyA+ICRIUEJXX2RObWFIaCApIHsNCiAgICAgICAgICAgICAgICAkcmhmUEhObU5QVU5yRyA9IFBIUEJXKCBydHhySFAoICR4ZmNyaGZQSFVOR3IsIHksICRIUEJXX2RObWFIaCAtIGIgKSApOw0KICAgICAgICAgICAgICAgICRyaGZQSE5tTlBVTnJHID0gJHJoZlBITm1OUFVOckcuJy4uLic7DQogICAgICAgICAgICB9IE5kck4gew0KICAgICAgICAgICAgICAgICRyaGZQSE5tTlBVTnJHID0gUEhQQlcoIHJ0eHJIUCggJHhmY3JoZlBIVU5HciwgeSwgJEhQQldfZE5tYUhoICkgKTsNCiAgICAgICAgICAgIH0NCg0KICAgICAgICB9IE5kck4gew0KICAgICAgICAgICAgJHJoZlBITm1OUFVOckcgPSAnRk5yR1BCREhCZm0gYWZOciBoTlBOLi4uJzsNCiAgICAgICAgfQ0KDQogICAgICAgIEJqICggJHhmY1dOVUJxSEhkID09ICcnICYmIGFOSF9IaE5fSEJIZE4oICRCVSApID09ICcnICkgeyRyaHFQTldOVUJxSEhkID0gJ1pOVUJxJzt9DQoNCiAgICAgICAgQmogKCAkeGZjV05VQnFISGQgPT0gJycgJiYgYU5IX0hoTl9IQkhkTiggJEJVICkgIT0gJycgKSB7JHJocVBOV05VQnFISGQgPSBhTkhfSGhOX0hCSGROKCAkQlUgKTt9DQoNCiAgICAgICAgQmogKCAkeGZjV05VQnFISGQgIT0gJycgJiYgYU5IX0hoTl9IQkhkTiggJEJVICkgIT0gJycgKSB7JHJocVBOV05VQnFISGQgPSAkeGZjV05VQnFISGQ7fQ0KDQogICAgICAgIGZ4X3JIcVBIKCk7DQoNCiAgICAgICAgQmogKCAkQnJqeCB8fCAkQnJIM0ggfHwgJEJyREJtIHx8ICRCcmFEIHx8ICRCck5XZCB8fCAkQnJVZCApOiA/Pg0KDQo8VUJvIEJVPSJXeHJmcldOVSI+DQogICAgPHRkPg0KICAgICAgICA8P0RoRA0KQmogKCAkQnJqeCApOiA/Pg0KICAgICAgICA8ZEIgQlU9InJmcldOVWp4Ij4NCg0KICAgICAgICAgICAgPD9EaEQNCg0KICAgICAgICAkanhxRERCVSA9IEhQQlcoIE5xcmdfYU5IX2ZESEJmbSggJ05xcmdXTlVCcV9qeF9xRERCVScgKSApOw0KICAgICAgICAkanhISGQgICA9IERQTmFfUE5EZHFHTiggJy9bXnEtcHktT1xyXS9CJywgJyAnLCAkcmhxUE5XTlVCcUhIZCApOw0KICAgICAgICAkakJkTm1XICA9IHhxck5tcVdOKCAkQldhclBHLCAnLicuRHFIaEJtamYoICRCV2FyUEcsIFFBSlRZc2lNX1hSSlhzMllNcyApICk7DQoNCiAgICAgICAgQmogKCAkanhxRERCVSAhPSAnJyApIHsNCg0KICAgICAgICAgICAgJGp4eGZjMyA9ICdPZXknOw0KICAgICAgICAgICAgJGp4eGZjaCA9ICdTeXknOw0KDQogICAgICAgICAgICAkanh0UGQgPSAnaEhIRHI6Ly8zMzMuanFHTnhmZjEuR2ZXL1VCcWRmYS9qTk5VP3FERF9CVT0nLiRqeHFEREJVLicmZEJtMT0nLnRQZE5tR2ZVTiggJEJXYXJQRyApLicmREJHSHRQTj0nLnRQZE5tR2ZVTiggJEJXYXJQRyApLicmR3FESEJmbT0nLiRqeEhIZC4nJlVOckdQQkRIQmZtPScuJGpCZE5tVy4nJlBOVUJQTkdIX3RQQj0nLnRQZE5tR2ZVTiggckJITl90UGQoKSApLicnOw0KICAgICAgICB9IE5kck4gew0KDQogICAgICAgICAgICAkanh4ZmMzID0gJ1NlNCc7DQogICAgICAgICAgICAkanh4ZmNoID0gJ2JDUyc7DQoNCiAgICAgICAgICAgICRqeHRQZCA9ICdoSEhEcjovLzMzMy5qcUdOeGZmMS5HZlcvcmhxUE5QLkRoRD9yPUV5eSZxV0Q7RFtIQkhkTl09Jy50UGRObUdmVU4oICRyaHFQTldOVUJxSEhkICkuJyZxV0Q7RFtydFdXcVBnXT0nLnRQZE5tR2ZVTiggckhQQkRfSHFhciggJHJoZlBITm1OUFVOckcgKSApLicmcVdEO0RbdFBkXT03TXNMSk1LVnUmcVdEOyZxV0Q7RFtCV3FhTnJdW3ldPScudFBkTm1HZlVOKCAkQldhclBHICkuJyc7DQogICAgICAgIH0NCg0KICAgICAgICA/Pg0KDQogICAgICAgICAgICA8cSBmbTdkQkcxPSIzQm1VZjMuZkRObSgnPD9EaEQgTkdoZiAkanh0UGQ7ID8+JywncmhxUE5QJywnSGZmZHhxUD15LHJIcUh0cj15LDNCVUhoPTw/RGhEIE5HaGYgJGp4eGZjMzsgPz4saE5CYWhIPTw/RGhEIE5HaGYgJGp4eGZjaDsgPz4nKTsiDQogICAgICAgICAgICAgICAgaFBOaj0ia3FvcXJHUEJESDogb2ZCVSh5KSI+PHJEcW0gSEJIZE49IjJocVBOIEJIISI+PC9yRHFtPjwvcT4NCiAgICAgICAgPC9kQj4NCiAgICAgICAgPD9EaEQgTm1VQmo7Pz4NCg0KICAgICAgICA8P0RoRA0KQmogKCAkQnJIM0ggKTogPz4NCiAgICAgICAgPGRCIEJVPSJyZnJXTlVIMyI+DQogICAgICAgICAgICA8cSBmbTdkQkcxPSIzQm1VZjMuZkRObSgnaEhIRHI6Ly9IM0JISE5QLkdmVy9yaHFQTj9ITmNIPTw/RGhEIE5HaGYgdFBkTm1HZlVOKCAnN2hORzEgZnRIICInLiRyaHFQTldOVUJxSEhkLiciIGZtICcuYU5IX3hkZmFCbWpmKCAnbXFXTicgKSApOyA/PiZ0UGQ9N01zTEpNS1Z1JywncmhxUE5QJywnSGZmZHhxUD15LHJIcUh0cj15LDNCVUhoPVNlNCxoTkJhaEg9YkNTJyk7Ig0KICAgICAgICAgICAgICAgIGhQTmo9Imtxb3FyR1BCREg6IG9mQlUoeSkiPjxyRHFtIEhCSGROPSJKM05OSCBCSCEiPjwvckRxbT48L3E+DQogICAgICAgIDwvZEI+DQogICAgICAgIDw/RGhEIE5tVUJqOz8+DQoNCiAgICAgICAgPD9EaEQNCkJqICggJEJyREJtICk6ID8+DQogICAgICAgIDxkQiBCVT0icmZyV05VRG0iPg0KICAgICAgICAgICAgPHEgZm03ZEJHMT0iM0JtVWYzLmZETm0oJ2hISERyOi8vREJtSE5QTnJILkdmVy9EQm0vR1BOcUhOL3h0SEhmbS8/dFBkPTw/RGhEIE5HaGYgdFBkTm1HZlVOKCAkeGZjZEJtMSApOyA/PiZXTlVCcT08P0RoRCBOR2hmIHRQZE5tR2ZVTiggJEJXYXJQRyApOyA/PiZVTnJHUEJESEJmbT08P0RoRCBOR2hmIHRQZE5tR2ZVTiggckhQQkRfSHFhciggJHJoZlBITm1OUFVOckcgKSApOyA/PicsJ3JocVBOUCcsJ0hmZmR4cVA9eSxySHFIdHI9eSwzQlVIaD1TbFMsaE5CYWhIPWJieScpOyINCiAgICAgICAgICAgICAgICBoUE5qPSJrcW9xckdQQkRIOiBvZkJVKHkpIj48ckRxbSBIQkhkTj0iUUJtIEJIISI+PC9yRHFtPjwvcT4NCiAgICAgICAgPC9kQj4NCiAgICAgICAgPD9EaEQgTm1VQmo7Pz4NCg0KICAgICAgICA8P0RoRA0KQmogKCAkQnJhRCApOiA/Pg0KICAgICAgICA8ZEIgQlU9InJmcldOVWFEIj4NCiAgICAgICAgICAgIDxxIGZtN2RCRzE9IjNCbVVmMy5mRE5tKCdoSEhEcjovL0RkdHIuYWZmYWROLkdmVy9yaHFQTj90UGQ9N01zTEpNS1Z1JywnJywnM0JVSGg9U2xTLGhOQmFoSD1iYnknKTsiDQogICAgICAgICAgICAgICAgaFBOaj0ia3FvcXJHUEJESDogb2ZCVSh5KSI+PHJEcW0gSEJIZE49IjJocVBOIEJIISI+PC9yRHFtPjwvcT4NCiAgICAgICAgPC9kQj4NCiAgICAgICAgPD9EaEQgTm1VQmo7Pz4NCg0KICAgICAgICA8P0RoRA0KQmogKCAkQnJOV2QgKTogPz4NCiAgICAgICAgPGRCIEJVPSJyZnJXTlVOV2QiPg0KICAgICAgICAgICAgPHENCiAgICAgICAgICAgICAgICBoUE5qPSJXcUJkSGY6PzJ0eGtOR0g9PD9EaEQgTkdoZiB0UGRObUdmVU4oICRyaHFQTldOVUJxSEhkICk7ID8+JjlmVWc9PD9EaEQgTkdoZiBySFBCRF9IcWFyKCAkcmhmUEhObU5QVU5yRyApLicgJy4nN01zTEpNS1Z1JzsgPz4iPjxyRHFtDQogICAgICAgICAgICAgICAgICAgIEhCSGROPSJYV3FCZCBCSCEiPjwvckRxbT48L3E+DQogICAgICAgIDwvZEI+DQogICAgICAgIDw/RGhEIE5tVUJqOz8+DQoNCiAgICAgICAgPD9EaEQNCkJqICggQnJyTkgoICRCclVkcXhkTiApICYmICRCclVkICYmICRCclVkcXhkTiA9PSAnRScgKTogPz4NCiAgICAgICAgPGRCIEJVPSJyZnJXTlVVZCI+DQogICAgICAgICAgICA8cSBoUE5qPSI8P0RoRCBOR2hmIERkdGFCbXJfdFBkKCAnVWQuRGhEJywgX19pWXVYX18gKS4nP3JmdFBHTj0nLiR4ZmNkQm0xLicnOyA/PiI+PHJEcW0NCiAgICAgICAgICAgICAgICAgICAgSEJIZE49IkZmM21kZnFVIEJIISI+PC9yRHFtPjwvcT4NCiAgICAgICAgPC9kQj4NCiAgICAgICAgPD9EaEQgTm1VQmo7Pz4NCg0KICAgIDwvdGQ+DQo8L1VCbz4NCjw/RGhEIE5tVUJqOw0KDQogICAgICAgICRHZm1ITm1IID0gZnhfYU5IX0dkTnFtKCk7DQoNCiAgICAgICAgQmogKCAkeGZjV05VQnFISGQgPT0gJycgKSB7JHhmY1dOVUJxSEhkID0gJ21mbU4nO30NCg0KICAgICAgICBCaiAoICRHZm1ITm1IID09ICcnICkgeyRHZm1ITm1IID0gJ21mbU4nO30NCg0KICAgICAgICBCaiAoICR4ZmNXTlVCcXJ4SEhkID09ICcnICkgeyR4ZmNXTlVCcXJ4SEhkID0gJ21mbU4nO30NCg0KICAgICAgICBCaiAoICR4ZmNyaGZQSFVOR3IgPT0gJycgKSB7JHhmY3JoZlBIVU5HciA9ICdtZm1OJzt9DQoNCiAgICAgICAgJEhoTlBOckggPSBxUFBxZyggJHhmY1dOVUJxSEhkLCAkeGZjV05VQnFyeEhIZCwgaEhXZF9ObUhCSGdfVU5HZlVOKCBoSFdkckROR0JxZEdocVByKCAkeGZjcmhmUEhVTkdyICkgKSwgJEdmbUhObUggKTsNCiAgICAgICAgTkdoZiBrcmZtX05tR2ZVTiggJEhoTlBOckggKTsNCiAgICAgICAgM0RfVUJOKCk7DQoNCiAgICB9DQoNCn0NCg0KcVVVX3FHSEJmbSggJzNEX3FrcWNfbWZEUEJvX05XYV9hTkhfVXFIcV9yZEJVTlBfcWtxYycsICdOV2FfYU5IX1VxSHFfcmRCVU5QX3FrcWMnICk7DQpxVVVfcUdIQmZtKCAnM0RfcWtxY19OV2FfYU5IX1VxSHFfcmRCVU5QX3FrcWMnLCAnTldhX2FOSF9VcUhxX3JkQlVOUF9xa3FjJyApOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogICBaTkhxeGZjIFlXcWFOIFZOckJwTlAgcjNCSEdoTlAgKCBBSUFSICkNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOV2FfcjNCSEdoX0JXcWFOUE5yQnBOUCgpDQp7DQoNCiAgICBHaE5HMV9xa3FjX1BOak5QTlAoICdOV2FfQldxYU5fUE5yX3IzQkhHaE5QJywgJ3JOR3RQQkhnJyApOw0KDQogICAgQmogKCAhIEJyck5IKCAkX1FNMkpbJ0dXVSddICkgKSB7DQoNCiAgICAgICAgTkdoZiAneSc7DQogICAgICAgIDNEX1VCTigpOw0KDQogICAgfSBOZHJOIHsNCg0KICAgICAgICAkTldhX3REVV9mREhCZm1yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBhTkhfZkRIQmZtKCAnTnFyZ19XTlVCcV9mREgnICk7DQogICAgICAgICROV2FfdERVX2ZESEJmbXJbJ05xcmdXTlVCcV9VQnJObV9ISGh0V3gnXVsnQlUnXSA9ICd5JzsNCiAgICAgICAgdERVcUhOX2ZESEJmbSggJ05xcmdfV05VQnFfZkRIJywgJE5XYV90RFVfZkRIQmZtciApOw0KICAgICAgICBOR2hmICdVZm1OJzsNCiAgICAgICAgM0RfVUJOKCk7DQoNCiAgICB9DQoNCn0NCg0KcVVVX3FHSEJmbSggJzNEX3FrcWNfTldhX3IzQkhHaF9CV3FhTlBOckJwTlAnLCAnTldhX3IzQkhHaF9CV3FhTlBOckJwTlAnICk7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgIFpOSHF4ZmMgKCBaTlVCcSBYVUJIZlAgKSBKQldIaHRXeCA3aE5HMXINCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOV2FfV05IcXhmY19IQldIaHRXeF9HaE5HMSggJGpCZE4gKQ0Kew0KDQogICAgJHJIUE5xVyA9IEBqZkRObSggJGpCZE4sICczJyApOw0KDQogICAgQmogKCAkckhQTnFXICkgew0KDQogICAgICAgIGpHZGZyTiggJHJIUE5xVyApOw0KICAgICAgICB0bWRCbTEoICRqQmROICk7DQoNCiAgICAgICAgUE5IdFBtIEhQdE47DQoNCiAgICB9IE5kck4gew0KDQogICAgICAgIHFVVV9xR0hCZm0oICdxVVdCbV9tZkhCR05yJywgJ05XYV9IQldIaHRXeF9EUGZ4ZE5XJyApOw0KDQogICAgICAgIGZ4X3JIcVBIKCk7Pz4NCjxyR1BCREg+DQprenROUGcoVWZHdFdObUgpLlBOcVVnKGp0bUdIQmZtKCQpIHsNCg0KICAgIGt6dE5QZygnI0JQTnByMycpLkdkQkcxKGp0bUdIQmZtKE5vTm1IKSB7DQoNCiAgICAgICAgTm9ObUguRFBOb05tSEZOanF0ZEgoKTsNCiAgICAgICAga3p0TlBnKCcuTldhM3FQbUJtYScpLkdycigneHFHMWFQZnRtVS1CV3FhTicsDQogICAgICAgICAgICAndFBkKDw/RGhEIE5HaGYgRGR0YUJtcl90UGQoICdCV3FhTnIvcjNCSEdoLmFCaicsIFVCUG1xV04oIF9faVl1WF9fICkgKTsgPz4pJyk7DQogICAgICAgIGt6dE5QZygnLk5XYTNxUG1CbWFEJykuanFVTk10SChFeXkpOw0KICAgICAgICBrenROUGcoJy5yM0JHSGRmcVVCbWEnKS5qcVVOWW0oU3l5KTsNCg0KICAgICAgICByTkhKQldOZnRIKGp0bUdIQmZtKCkgew0KICAgICAgICAgICAgTldhX3IzQkhHaF9CV3FhTlBOckJwTlAoKTsNCiAgICAgICAgfSwgYnl5eSk7DQoNCiAgICB9KTsNCg0KICAgIGp0bUdIQmZtIE5XYV9yM0JIR2hfQldxYU5QTnJCcE5QKCkgew0KDQogICAgICAgIG9xUCBVcUhxID0gew0KICAgICAgICAgICAgcUdIQmZtOiAnTldhX3IzQkhHaF9CV3FhTlBOckJwTlAnLA0KICAgICAgICAgICAgck5HdFBCSGc6ICc8P0RoRCBOR2hmIDNEX0dQTnFITl9tZm1HTiggJ05XYV9CV3FhTl9QTnJfcjNCSEdoTlAnICk7ID8+JywNCiAgICAgICAgICAgIEdXVTogJ0docW1hTicsDQogICAgICAgIH07DQoNCiAgICAgICAga3p0TlBnLkRmckgocWtxY3RQZCwgVXFIcSwganRtR0hCZm0oUE5yRGZtck4pIHsNCiAgICAgICAgICAgIEJqIChQTnJEZm1yTiAhPSAneScpIHsNCg0KICAgICAgICAgICAgICAgIGt6dE5QZygnLk5XYTNxUG1CbWEnKS5HcnIoJ3hxRzFhUGZ0bVUtQldxYU4nLA0KICAgICAgICAgICAgICAgICAgICAndFBkKDw/RGhEIE5HaGYgRGR0YUJtcl90UGQoICdCV3FhTnIvcjNISEJHMS5EbWEnLCBVQlBtcVdOKCBfX2lZdVhfXyApICk7ID8+KScpOw0KICAgICAgICAgICAgICAgIGt6dE5QZygnLnIzQkdIZGZxVUJtYScpLkhOY0goDQogICAgICAgICAgICAgICAgICAgICdZV3FhTiBWTnJCcE5QIFdOSGhmVSAzcXIgcnRHR05ycmp0ZGRnIEdocW1hTlUuIEpoQnIgRHFhTiAzQmRkIEJtckhxbUhkZyBQTmRmcVUgSGYgcUREZGcgSGhOIEdocW1hTnIsIERkTnFyTiAzcUJILi4uJw0KICAgICAgICAgICAgICAgICAgICApOw0KDQogICAgICAgICAgICAgICAgck5ISkJXTmZ0SChqdG1HSEJmbSgpIHsNCiAgICAgICAgICAgICAgICAgICAgZGZHcUhCZm0uUE5kZnFVKCk7DQogICAgICAgICAgICAgICAgfSwgYnl5eSk7DQoNCiAgICAgICAgICAgIH0gTmRyTiB7DQoNCiAgICAgICAgICAgICAgICBrenROUGcoJy5OV2EzcVBtQm1hJykuR3JyKCd4cUcxYVBmdG1VLUJXcWFOJywNCiAgICAgICAgICAgICAgICAgICAgJ3RQZCg8P0RoRCBOR2hmIERkdGFCbXJfdFBkKCAnQldxYU5yLzNxUG1CbWFfUE5VLkRtYScsIFVCUG1xV04oIF9faVl1WF9fICkgKTsgPz4pJw0KICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgIGt6dE5QZygnLnIzQkdIZGZxVUJtYScpLkhOY0goDQogICAgICAgICAgICAgICAgICAgICdBa3FjIFBOMHROckgganFCZE5VISBKaEJyIERxYU4gM0JkZCBCbXJIcW1IZGcgUE5kZnFVLCBEZE5xck4gM3FCSC4uLicpOw0KDQogICAgICAgICAgICAgICAgck5ISkJXTmZ0SChqdG1HSEJmbSgpIHsNCiAgICAgICAgICAgICAgICAgICAgZGZHcUhCZm0uUE5kZnFVKCk7DQogICAgICAgICAgICAgICAgfSwgYnl5eSk7DQoNCiAgICAgICAgICAgIH0NCiAgICAgICAgfSk7DQogICAgfQ0KfSk7DQo8L3JHUEJESD4NCg0KPD9EaEQNCiRhTm1HZlVOID0gZnhfYU5IX0dkTnFtKCk7DQogICAgICAgIE5HaGYgTldhX2tyX0dmV0RQTnJyKCAkYU5tR2ZVTiApOw0KICAgIH0NCg0KICAgIGp0bUdIQmZtIE5XYV9IQldIaHRXeF9EUGZ4ZE5XKCkNCiAgICB7DQoNCiAgICAgICAgTkdoZiAiPFVCbyBHZHFycj0nTlBQZlAnPjxyRHFtIEdkcXJyPSdOV2EzcVBtQm1hJz48RCBHZHFycj0nTldhM3FQbUJtYUQnPiIuX18oICdKaE5QTiByTk5XciBIZiB4TiBxIERQZnhkTlcgM0JIaCBIaE4gdHJOIGZqIDxySFBmbWE+SkJXSGh0V3ggMkdQQkRIPC9ySFBmbWE+LCByZiAnLlhabl9ZSlhaX3NBWlguJyBHcW0gbWZIIFVCckRkcWcgcWRkIGZqIGdmdFAgQldxYU5yLiBKaEJyIEJyIHRydHFkZGcgR3F0ck5VIHhnIGdmdFAgck5Qb05QL2hmckhCbWEgR2ZtakJhdFBxSEJmbXIuIDxxIHJIZ2ROPSJITmNILVVOR2ZQcUhCZm06IG1mbU4hQldEZlBIcW1IOyIgaFBOaj0iIyIgQlU9IkJQTnByMyI+N2RCRzEgaE5QTiBIZiByM0JIR2ggQldxYU4gUE5yQnBOIFdOSGhmVSBIZiBYcXJnWk5VQnEgVk5yQnBOUC48L3E+JywgJ05xcldOVUJxJyApLiI8L0Q+PEQgR2RxcnI9J3IzQkdIZGZxVUJtYSc+UWROcXJOIDNxQkguLi48L0Q+PC9yRHFtPjwvVUJvPiI7DQogICAgfQ0KDQp9DQoNCi8qDQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCnwgbk5IIEhoTiBCV3FhTnIgalBmVyBIaE4gOFEgZEJ4UHFQZw0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKi8NCmp0bUdIQmZtIE5XYV9kQnhQcVBnX0JXcWFOciggJERxYU4gPSBFLCAkRE5QX0RxYU4gPSBFZSApDQp7DQogICAgJDB0TlBnX0JXcWFOcl9xUGFyID0gcVBQcWcoDQogICAgICAgICdEZnJIX0hnRE4nID0+ICdxSEhxR2hXTm1IJywgJ0RmckhfV0JXTl9IZ0ROJyA9PiAnQldxYU4nLCAnRGZySF9ySHFIdHInID0+ICdCbWhOUEJIJywgJ0RmckhyX0ROUF9EcWFOJyA9PiAkRE5QX0RxYU4sICdEcWFOVScgPT4gJERxYU4sDQogICAgKTsNCg0KICAgICQwdE5QZ19CV3FhTnIgPSBtTjMgOFFfenROUGcoICQwdE5QZ19CV3FhTnJfcVBhciApOw0KICAgICRCV3FhTnIgICAgICAgPSBxUFBxZygpOw0KDQogICAgamZQTnFHaCAoICQwdE5QZ19CV3FhTnItPkRmckhyIHFyICRCV3FhTiApIHsNCiAgICAgICAgJEJXcWFOcltdID0gcVBQcWcoDQogICAgICAgICAgICAnQlUnICA9PiAkQldxYU4tPllGLA0KICAgICAgICAgICAgJ3RQZCcgPT4gJEJXcWFOLT5hdEJVLA0KICAgICAgICApOw0KICAgIH0NCg0KICAgICRCV2FfbXRXeE5QICAgICAgICAgICAgICAgICAgICAgPSAkMHROUGdfQldxYU5yLT5qZnRtVV9EZnJIcjsNCiAgICAkRHFhTl9HZnRtSCAgICAgICAgICAgICAgICAgICAgID0gR05CZCggJEJXYV9tdFd4TlAgLyAkRE5QX0RxYU4gKTsNCiAgICAkcmhmM20gICAgICAgICAgICAgICAgICAgICAgICAgID0gJEROUF9EcWFOICogJERxYU47DQogICAgKCAkcmhmM20gPj0gJEJXYV9tdFd4TlAgKSA/ICRXZlBOID0ganFkck4gOiAkV2ZQTiA9IEhQdE47DQoNCiAgICBQTkh0UG0gcVBQcWcoICdCV2EnID0+ICRCV3FhTnIsICdEcWEnID0+ICREcWFOLCAnRHFhTl9HZnRtSCcgPT4gJERxYU5fR2Z0bUgsICdXZlBOJyA9PiAkV2ZQTiwgJ0hmSHFkQldhJyA9PiAkQldhX210V3hOUCApOw0KfQ0KDQpqdG1HSEJmbSBOV2FfTmNIX3JOZCggJFdOVUJxICkNCnsNCg0KICAgIEJqICggQnJfcVBQcWcoICRXTlVCcSApICkgew0KICAgICAgICAkbU4zX3FQUHFnID0gcVBQcWcoKTsNCg0KICAgICAgICBqZlBOcUdoICggJFdOVUJxIHFyICRXTlVCcV9CVSApIHsNCg0KICAgICAgICAgICAgQmogKCBhTkhfSGhOX0hCSGROKCAkV05VQnFfQlUgKSApIHsNCiAgICAgICAgICAgICAgICAkbU4zX3FQUHFnW10gPSAkV05VQnFfQlU7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgfQ0KDQogICAgICAgIEJqICggR2Z0bUgoICRtTjNfcVBQcWcgKSA9PSB5ICkge1BOSHRQbSBqcWRyTjt9IE5kck4ge1BOSHRQbSAkbU4zX3FQUHFnO30NCg0KICAgIH0gTmRyTiB7UE5IdFBtIGpxZHJOO30NCg0KfQ0KDQovKg0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQp8IFhxcmdXTlVCcSA3dHJIZlcgN3FITmFmUGcgOWZjIChaTkhxeGZjKQ0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKi8NCmp0bUdIQmZtIE5xcmdXTlVCcWFxZGROUGdfR3FITmFmUEJOcl9XTkhxX3hmYyggJERmckgsICR4ZmMgKQ0Kew0KICAgICRVTmpxdGRIciA9IHFQUHFnKCAnSHFjZm1mV2cnID0+ICdOV05VQnFhcWRkTlBnJyApOw0KDQogICAgQmogKCAhIEJyck5IKCAkeGZjWydxUGFyJ10gKSB8fCAhIEJyX3FQUHFnKCAkeGZjWydxUGFyJ10gKSApIHsNCiAgICAgICAgJHFQYXIgPSBxUFBxZygpOw0KICAgIH0gTmRyTiB7DQogICAgICAgICRxUGFyID0gJHhmY1sncVBhciddOw0KICAgIH0NCg0KICAgIE5jSFBxR0goIDNEX0RxUHJOX3FQYXIoICRxUGFyLCAkVU5qcXRkSHIgKSwgWFJKVl8yNVlRICk7DQogICAgJEhxYyA9IGFOSF9IcWNmbWZXZyggJEhxY2ZtZldnICk7DQoNCiAgICA/Pg0KPFVCbyBCVT0iSHFjZm1mV2ctPD9EaEQgTkdoZiAkSHFjZm1mV2c7ID8+IiBHZHFycj0iR3FITmFmUGdVQm8iPg0KICAgIDx0ZCBCVT0iPD9EaEQgTkdoZiAkSHFjZm1mV2c7ID8+LUhxeHIiIEdkcXJyPSJHcUhOYWZQZy1IcXhyIj4NCiAgICAgICAgPGRCIEdkcXJyPSJIcXhyIj48cSBoUE5qPSIjPD9EaEQgTkdoZiAkSHFjZm1mV2c7ID8+LXFkZCI+PD9EaEQgTkdoZiAkSHFjLT5kcXhOZHItPnFkZF9CSE5XcjsgPz48L3E+PC9kQj4NCiAgICAgICAgPGRCIEdkcXJyPSJoQlVOLUJqLW1mLWtyIj48cSBoUE5qPSIjPD9EaEQgTkdoZiAkSHFjZm1mV2c7ID8+LURmRCI+PD9EaEQgX04oICdaZnJIIEtyTlUnICk7Pz48L3E+PC9kQj4NCiAgICA8L3RkPg0KDQogICAgPFVCbyBCVT0iPD9EaEQgTkdoZiAkSHFjZm1mV2c7ID8+LURmRCIgR2RxcnI9IkhxeHItRHFtTmQiIHJIZ2ROPSJVQnJEZHFnOiBtZm1OOyI+DQogICAgICAgIDx0ZCBCVT0iPD9EaEQgTkdoZiAkSHFjZm1mV2c7ID8+R2hORzFkQnJILURmRCIgR2RxcnI9IkdxSE5hZlBnR2hORzFkQnJIIGpmUFctbWYtR2ROcVAiPg0KICAgICAgICAgICAgPD9EaEQgJERmRHRkcVBfQlVyID0gM0RfRGZEdGRxUF9ITlBXcl9HaE5HMWRCckgoICRIcWNmbWZXZyApOz8+DQogICAgICAgIDwvdGQ+DQogICAgPC9VQm8+DQoNCiAgICA8VUJvIEJVPSI8P0RoRCBOR2hmICRIcWNmbWZXZzsgPz4tcWRkIiBHZHFycj0iSHF4ci1EcW1OZCI+DQogICAgICAgIDw/RGhEDQokbXFXTiA9ICggJEhxY2ZtZldnID09ICdOV05VQnFhcWRkTlBnJyApID8gJ0RmckhfR3FITmFmUGcnIDogJ0hxY19CbUR0SFsnLiRIcWNmbWZXZy4nXSc7DQogICAgTkdoZiAiPEJtRHRIIEhnRE49J2hCVVVObScgbXFXTj0neyRtcVdOfVtdJyBvcWR0Tj0neScgLz4iOyAvLyBBZGRmM3IgamZQIHFtIE5XREhnIEhOUFcgck5IIEhmIHhOIHJObUguIHkgQnIgcW0gQm1vcWRCVSBKTlBXIFlGIHFtVSAzQmRkIHhOIEJhbWZQTlUgeGcgTldESGcoKSBHaE5HMXIuDQogICAgPz4NCiAgICAgICAgPHRkIEJVPSI8P0RoRCBOR2hmICRIcWNmbWZXZzsgPz5HaE5HMWRCckgiIFVxSHEtM0QtZEJySHI9ImRCckg6PD9EaEQgTkdoZiAkSHFjZm1mV2cgPz4iDQogICAgICAgICAgICBHZHFycj0iR3FITmFmUGdHaE5HMWRCckggamZQVy1tZi1HZE5xUCI+DQogICAgICAgICAgICA8P0RoRCAzRF9ITlBXcl9HaE5HMWRCckgoICREZnJILT5ZRiwgcVBQcWcoICdIcWNmbWZXZycgPT4gJEhxY2ZtZldnLCAnRGZEdGRxUF9HcUhyJyA9PiAkRGZEdGRxUF9CVXIgKSApPz4NCiAgICAgICAgPC90ZD4NCiAgICA8L1VCbz4NCiAgICA8P0RoRA0KDQogICAgQmogKCBHdFBQTm1IX3RyTlBfR3FtKCAkSHFjLT5HcUQtPk5VQkhfSE5QV3IgKSApOiA/Pg0KICAgIDxVQm8gQlU9Ijw/RGhEIE5HaGYgJEhxY2ZtZldnOyA/Pi1xVVVOUCIgR2RxcnI9IjNELWhCVVVObS1HaEJkVVBObSI+DQogICAgICAgIDxoZT4NCiAgICAgICAgICAgIDxxIEJVPSI8P0RoRCBOR2hmICRIcWNmbWZXZzsgPz4tcVVVLUhmYWFkTiIgaFBOaj0iIzw/RGhEIE5HaGYgJEhxY2ZtZldnOyA/Pi1xVVUiIEdkcXJyPSJoQlVOLUJqLW1mLWtyIj4NCiAgICAgICAgICAgICAgICA8P0RoRA0KRFBCbUhqKCBfXyggJysgJXInICksICRIcWMtPmRxeE5kci0+cVVVX21OM19CSE5XICk7DQogICAgPz4NCiAgICAgICAgICAgIDwvcT4NCiAgICAgICAgPC9oZT4NCiAgICAgICAgPEQgQlU9Ijw/RGhEIE5HaGYgJEhxY2ZtZldnOyA/Pi1xVVUiIEdkcXJyPSJHcUhOYWZQZy1xVVUgM0QtaEJVVU5tLUdoQmRVIj4NCiAgICAgICAgICAgIDxkcXhOZCBHZHFycj0ickdQTk5tLVBOcVVOUC1ITmNIIg0KICAgICAgICAgICAgICAgIGpmUD0ibU4zPD9EaEQgTkdoZiAkSHFjZm1mV2c7ID8+Ij48P0RoRCBOR2hmICRIcWMtPmRxeE5kci0+cVVVX21OM19CSE5XOyA/PjwvZHF4TmQ+DQogICAgICAgICAgICA8Qm1EdEggSGdETj0iSE5jSCIgbXFXTj0ibU4zPD9EaEQgTkdoZiAkSHFjZm1mV2c7ID8+IiBCVT0ibU4zPD9EaEQgTkdoZiAkSHFjZm1mV2c7ID8+Ig0KICAgICAgICAgICAgICAgIEdkcXJyPSJqZlBXLVBOMHRCUE5VIGpmUFctQm1EdEgtSEJEIiBvcWR0Tj0iPD9EaEQgTkdoZiBOckdfcUhIUCggJEhxYy0+ZHF4TmRyLT5tTjNfQkhOV19tcVdOICk7ID8+Ig0KICAgICAgICAgICAgICAgIHFQQnEtUE4wdEJQTlU9IkhQdE4iIC8+DQogICAgICAgICAgICA8ZHF4TmQgR2RxcnI9InJHUE5ObS1QTnFVTlAtSE5jSCIgamZQPSJtTjM8P0RoRCBOR2hmICRIcWNmbWZXZzsgPz5fRHFQTm1IIj4NCiAgICAgICAgICAgICAgICA8P0RoRCBOR2hmICRIcWMtPmRxeE5kci0+RHFQTm1IX0JITldfR2ZkZm07ID8+DQogICAgICAgICAgICA8L2RxeE5kPg0KICAgICAgICAgICAgPD9EaEQgM0RfVVBmRFVmM21fR3FITmFmUEJOciggcVBQcWcoICdIcWNmbWZXZycgPT4gJEhxY2ZtZldnLCAnaEJVTl9OV0RIZycgPT4geSwgJ21xV04nID0+ICdtTjMnLiRIcWNmbWZXZy4nX0RxUE5tSCcsICdmUFVOUHhnJyA9PiAnbXFXTicsICdoQk5QcVBHaEJHcWQnID0+IEUsICdyaGYzX2ZESEJmbV9tZm1OJyA9PiAnJldVcXJoOyAnLiRIcWMtPmRxeE5kci0+RHFQTm1IX0JITlcuJyAmV1Vxcmg7JyApICk7Pz4NCiAgICAgICAgICAgIDxCbUR0SCBIZ0ROPSJ4dEhIZm0iIEJVPSI8P0RoRCBOR2hmICRIcWNmbWZXZzsgPz4tcVVVLXJ0eFdCSCINCiAgICAgICAgICAgICAgICBVcUhxLTNELWRCckhyPSJxVVU6PD9EaEQgTkdoZiAkSHFjZm1mV2cgPz5HaE5HMWRCckg6PD9EaEQgTkdoZiAkSHFjZm1mV2cgPz4tcVVVIg0KICAgICAgICAgICAgICAgIEdkcXJyPSJ4dEhIZm0gR3FITmFmUGctcVVVLXJ0eFdCSCIgb3FkdE49Ijw/RGhEIE5HaGYgTnJHX3FISFAoICRIcWMtPmRxeE5kci0+cVVVX21OM19CSE5XICk7ID8+IiAvPg0KICAgICAgICAgICAgPD9EaEQgM0RfbWZtR05fakJOZFUoICdxVVUtJy4kSHFjZm1mV2csICdfcWtxY19tZm1HTi1xVVUtJy4kSHFjZm1mV2csIGpxZHJOICk7Pz4NCiAgICAgICAgICAgIDxyRHFtIEJVPSI8P0RoRCBOR2hmICRIcWNmbWZXZzsgPz4tcWtxYy1QTnJEZm1yTiI+PC9yRHFtPg0KICAgICAgICA8L0Q+DQogICAgPC9VQm8+DQogICAgPD9EaEQgTm1VQmo7Pz4NCjwvVUJvPg0KPD9EaEQNCn0NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIEFVVSBRZnJIIEpodFd4bXFCZHIgcW1VIDd0ckhmVyBKaHRXeG1xQmRyIHJCcE4NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOcXJXTlVCcV9xVVVfSGh0V3htcUJkX3J0RERmUEgoKQ0Kew0KDQogICAgQmogKCAhIEd0UFBObUhfSGhOV05fcnRERGZQSHIoICdEZnJILUhodFd4bXFCZHInICkgKSB7DQogICAgICAgIHFVVV9IaE5XTl9ydEREZlBIKCAnRGZySC1IaHRXeG1xQmRyJywgcVBQcWcoICdOcXJnV05VQnFhcWRkTlBnJyApICk7DQogICAgICAgIHFVVV9CV3FhTl9yQnBOKCAnTldhLXFVV0JtLUhodFd4JywgbHksIGx5LCBIUHROICk7IC8vIEtyTlUgQm0gSGhOIE5xcmdXTlVCcSBOVUJIIERxYU4NCiAgICB9DQoNCn0NCg0KcVVVX3FHSEJmbSggJ0JtQkgnLCAnTnFyV05VQnFfcVVVX0hodFd4bXFCZF9ydEREZlBIJyApOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogQVVVIEdQTlVCSHIgQm0gcVVXQm0gRHFhTg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIE5xcmdXTlVCcWFxZGROUGdfcVVVX2pmZkhOUF9HUE5VQkhyKCAkSE5jSCApDQp7DQogICAgJEggPSAnJzsNCg0KICAgIEJqICggYU5IX0RmckhfSGdETigpID09PSAnTnFyZ1dOVUJxYXFkZE5QZycgKSB7DQogICAgICAgICRIIC49ICc8VUJvIEJVPSJHUE5VQkhyIiBySGdkTj0iZEJtTi1oTkJhaEg6IENDRGM7Ij4nOw0KICAgICAgICAkSCAuPSAnPEQ+WHFyZyBaTlVCcSBucWRkTlBnIERkdGFCbSBCciBHUE5xSE5VIHhnIDxxIGhQTmo9ImhISERyOi8vYWhmcGdkcXguR2ZXLyIgSHFQYU5IPSJfeGRxbTEiPm5oZnBndXF4LCBZbUc8L3E+LjwvRD4nOw0KICAgICAgICAkSCAuPSAiPEQ+WWogZ2Z0IGhxb04gcmZXTiBydEREZlBIIEJycnROLCBVZm0nSCBoTnJCSHFITiBIZiA8cSBoUE5qPVwiaEhIRHI6Ly9haGZwZ2RxeC5HZlcvRGR0YUJtci9ydHhXQkgtcnRERGZQSC1QTjB0TnJIXCIgSHFQYU5IPVwiX3hkcW0xXCI+M1BCSE4gaE5QTjwvcT4uIEpoTiBuaGZwZ3VxeCBITnFXIDNCZGQgeE4gaHFERGcgSGYgcnRERGZQSCBnZnQgZm0gcW1nIEJycnROLjwvRD4iOw0KICAgICAgICAkSCAuPSAnPC9VQm8+JzsNCiAgICB9IE5kck4gew0KICAgICAgICAkSCA9ICRITmNIOw0KICAgIH0NCg0KICAgIFBOSHRQbSAkSDsNCn0NCg0KcVVVX2pCZEhOUCggJ3FVV0JtX2pmZkhOUF9ITmNIJywgJ05xcmdXTlVCcWFxZGROUGdfcVVVX2pmZkhOUF9HUE5VQkhyJyApOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogIG5OSCBIaE4gRHFISE5QbXIgZEJySA0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIE5xcldOVUJxX0RxSEhOUG1yX2RyKCkNCnsNCiAgICAkRHFISE5QbXIgICAgICA9IHFQUHFnKCk7DQogICAgJERxSEhOUG1yX2RCckggPSByR3FtVUJQKCBYWm5fRllWLicvR3JyL0JXcWFOci9EcUhITlBtcicgKTsNCg0KICAgIGpmUE5xR2ggKCAkRHFISE5QbXJfZEJySCBxciAkRHFISE5QbV9tcVdOICkgew0KDQogICAgICAgIEJqICggJERxSEhOUG1fbXFXTiAhPSAnLicgJiYgJERxSEhOUG1fbXFXTiAhPSAnLi4nICkgew0KICAgICAgICAgICAgJERxSEhOUG1yW10gPSAkRHFISE5QbV9tcVdOOw0KICAgICAgICB9DQoNCiAgICB9DQoNCiAgICBQTkh0UG0gJERxSEhOUG1yOw0KfQ0KDQovKg0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQp8IFZYWk1MWCBRWFZaQXVZczUNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICovDQpqdG1HSEJmbSBOV2FfaEJVTl9ETlBXcWRCbTEoKQ0Kew0KICAgIGFkZnhxZCAkRGZySF9IZ0ROOw0KDQogICAgQmogKCAkRGZySF9IZ0ROID09ICdOcXJnV05VQnFhcWRkTlBnJyApIHsNCiAgICAgICAgTkdoZiAnPHJIZ2ROIEhnRE49IkhOY0gvR3JyIj4jTlVCSC1yZHRhLXhmY3tVQnJEZHFnOiBtZm1OO308L3JIZ2ROPic7DQogICAgfQ0KDQp9DQoNCnFVVV9xR0hCZm0oICdxVVdCbV9oTnFVJywgJ05XYV9oQlVOX0ROUFdxZEJtMScgKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgVlhaTUxYIEpUWCBRQVZYc0ogaVlYdUYgaU1WIEpUWCA3SzJKTVogSlhSTXNNWjYNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTldhX1BOV2ZvTl9HcUhfRHFQTm1IKCkNCnsNCiAgICBhZGZ4cWQgJEd0UFBObUhfckdQTk5tOw0KDQogICAgcjNCSEdoICggJEd0UFBObUhfckdQTk5tLT5CVSApIHsNCiAgICAgICAgR3FyTiAnTlVCSC1OV05VQnFhcWRkTlBnJzoNCg0KICAgICAgICAgICAgPz4NCjxyR1BCREggSGdETj0iSE5jSC9rcW9xckdQQkRIIj4NCmt6dE5QZyhVZkd0V05tSCkuUE5xVWcoanRtR0hCZm0oJCkgew0KICAgIGt6dE5QZygnI0RxUE5tSCcpLkRxUE5tSHIoJy5qZlBXLWpCTmRVJykuUE5XZm9OKCk7DQogICAga3p0TlBnKCcjSHFhLXJkdGEsICNIcWEtVU5yR1BCREhCZm0nKS5EcVBObUhyKCcuamZQVy1qQk5kVScpLmhCVU4oKTsNCn0pOw0KPC9yR1BCREg+DQo8P0RoRA0KDQogICAgICAgICAgICB4UE5xMTsNCiAgICB9DQoNCn0NCg0KcVVVX3FHSEJmbSggJ3FVV0JtX2pmZkhOUC1OVUJILUhxYXIuRGhEJywgJ05XYV9QTldmb05fR3FIX0RxUE5tSCcgKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICBUWFIgSGYgVm45DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTnFyZ1dOVUJxX2hOY0NQYXgoICRoTmMgKQ0Kew0KICAgICRoTmMgPSBySFBfUE5EZHFHTiggJyMnLCAnJywgJGhOYyApOw0KDQogICAgQmogKCBySFBkTm0oICRoTmMgKSA9PSBiICkgew0KICAgICAgICAkUCA9IGhOY1VORyggcnR4ckhQKCAkaE5jLCB5LCBFICkucnR4ckhQKCAkaE5jLCB5LCBFICkgKTsNCiAgICAgICAgJGEgPSBoTmNVTkcoIHJ0eHJIUCggJGhOYywgRSwgRSApLnJ0eHJIUCggJGhOYywgRSwgRSApICk7DQogICAgICAgICR4ID0gaE5jVU5HKCBydHhySFAoICRoTmMsIEMsIEUgKS5ydHhySFAoICRoTmMsIEMsIEUgKSApOw0KICAgIH0gTmRyTiB7DQogICAgICAgICRQID0gaE5jVU5HKCBydHhySFAoICRoTmMsIHksIEMgKSApOw0KICAgICAgICAkYSA9IGhOY1VORyggcnR4ckhQKCAkaE5jLCBDLCBDICkgKTsNCiAgICAgICAgJHggPSBoTmNVTkcoIHJ0eHJIUCggJGhOYywgZSwgQyApICk7DQogICAgfQ0KDQogICAgJFBheCA9IHFQUHFnKCAkUCwgJGEsICR4ICk7DQoNCiAgICBQTkh0UG0gQldEZGZVTiggJywnLCAkUGF4ICk7DQp9DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgUE5EZHFHTl9OY0hObXJCZm0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOV2FfUE5EZHFHTl9OY0hObXJCZm0oICRqQmRObXFXTiApDQp7DQogICAgJE5jSCAgICAgICAgICAgPSBEcUhoQm1qZiggJGpCZE5tcVdOLCBRQUpUWXNpTV9YUkpYczJZTXMgKTsNCiAgICAkbU4zX05jSE5tckJmbSA9ICdOV2FHb1AtJy4kTmNIOw0KDQogICAgUE5IdFBtIHJ0eHJIUF9QTkRkcUdOKCAkakJkTm1xV04sICRtTjNfTmNITm1yQmZtLCBySFBQRGZyKCAkakJkTm1xV04sICcuJyApICsgRSApOw0KDQp9DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgbk5IIHFISHFHaFdObUggQldxYU4gQlUNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOV2FfYU5IX3FISHFHaFdObUhfQlVfalBmV19yUEcoICRkQm0xICkNCnsNCiAgICBhZGZ4cWQgJDNEVXg7DQogICAgJGRCbTEgPSBEUE5hX1BORGRxR04oICcvLVxVK2NcVSsoPz1cLihrRGF8a0ROYXxEbWF8YUJqKSQpL0InLCAnJywgJGRCbTEgKTsNCg0KICAgIFBOSHRQbSAkM0RVeC0+YU5IX29xUCggIjJYdVg3SiBZRiBpVk1aIHskM0RVeC0+RGZySHJ9IDhUWFZYIGF0QlU9JyRkQm0xJyIgKTsNCn0NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICAgNzIyIDdmV0RQTnJyZlAgQHJCbUdOIEUuUy5FLmwNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOV2FfR3JyX0dmV0RQTnJyKCAkV0JtQmpnICkNCnsNCiAgICAvKiBQTldmb04gR2ZXV05tSHIgKi8NCiAgICAkV0JtQmpnID0gRFBOYV9QTkRkcUdOKCAnIS9cKlteKl0qXCorKFteL11bXipdKlwqKykqLyEnLCAnJywgJFdCbUJqZyApOw0KDQogICAgLyogUE5XZm9OIEhxeHIsIHJEcUdOciwgbU4zZEJtTnIsIE5IRy4gKi8NCiAgICAkV0JtQmpnID0gckhQX1BORGRxR04oIHFQUHFnKCAiXFBcbSIsICJcUCIsICJcbSIsICJcSCIsICcgICcsICcgICAgJywgJyAgICAnICksICcnLCAkV0JtQmpnICk7DQoNCiAgICBQTkh0UG0gJFdCbUJqZzsNCn0NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICAgSTIgN2ZXRFBOcnJmUCBAckJtR04gRS5TLkUubA0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIE5XYV9rcl9HZldEUE5yciggJFdCbUJqZyApDQp7DQoNCiAgICAkUE5EZHFHTiA9IHFQUHFnKA0KICAgICAgICAnI1wnKFteXG1cJ10qPykvXCooW15cbVwnXSopXCcjJyA9PiAiJ1xFLycrXCdcJysnKlxDJyIsIC8vIFBOV2ZvTiBHZldXTm1IciBqUGZXICcgckhQQm1hcg0KICAgICAgICAnI1wiKFteXG1cIl0qPykvXCooW15cbVwiXSopXCIjJyA9PiAnIlxFLyIrXCdcJysiKlxDIicsIC8vIFBOV2ZvTiBHZldXTm1IciBqUGZXICIgckhQQm1hcg0KICAgICAgICAnIy9cKi4qP1wqLyNyJyAgICA9PiAnJywgLy8gckhQQkQgNyBySGdkTiBHZldXTm1Icg0KICAgICAgICAnI1tcUFxtXSsjJyA9PiAiXG0iLCAvLyBQTldmb04geGRxbTEgZEJtTnIgcW1VIFxQJ3INCiAgICAgICAgJyNcbShbIFxIXSovLy4qP1xtKSojcicgPT4gIlxtIiwgLy8gckhQQkQgZEJtTiBHZldXTm1IciAoM2hmZE4gZEJtTiBmbWRnKQ0KICAgICAgICAnIyhbXlxcXSkvLyhbXlwnIlxtXSopXG0jcicgPT4gIlxcRVxtIiwNCiAgICAgICAgJyNcbVxyKyMnICAgICAgICAgICAgICAgICAgICAgICAgPT4gIlxtIiwgLy8gckhQQkQgTmNHTnJyIDNoQkhOckRxR04NCiAgICAgICAgJyNccitcbSMnICAgICAgICAgICAgICAgICAgICAgICAgPT4gIlxtIiwgLy8gckhQQkQgTmNHTnJyIDNoQkhOckRxR04NCiAgICAgICAgJyMoLy9bXlxtXSpcbSkjcicgPT4gIlxcRVxtIiwNCiAgICAgICAgJyMvKFtcJyJdKVwrXCdcJ1wrKFtcJyJdKVwqIycgICAgPT4gJy8qJywgLy8gUE5ySGZQTiBHZldXTm1IciBCbSBySFBCbWFyDQogICAgKTsNCg0KICAgICRyTnFQR2ggPSBxUFBxZ18xTmdyKCAkUE5EZHFHTiApOw0KICAgICRyR1BCREggPSBEUE5hX1BORGRxR04oICRyTnFQR2gsICRQTkRkcUdOLCAkV0JtQmpnICk7DQoNCiAgICAkUE5EZHFHTiA9IHFQUHFnKA0KICAgICAgICAiJiZcbSIgPT4gJyYmJywNCiAgICAgICAgInx8XG0iID0+ICd8fCcsDQogICAgICAgICIoXG0iICA9PiAnKCcsDQogICAgICAgICIpXG0iICA9PiAnKScsDQogICAgICAgICJbXG0iICA9PiAnWycsDQogICAgICAgICJdXG0iICA9PiAnXScsDQogICAgICAgICIrXG0iICA9PiAnKycsDQogICAgICAgICIsXG0iICA9PiAnLCcsDQogICAgICAgICI/XG0iICA9PiAnPycsDQogICAgICAgICI6XG0iICA9PiAnOicsDQogICAgICAgICI7XG0iICA9PiAnOycsDQogICAgICAgICJ7XG0iICA9PiAneycsDQogICAgICAgICJcbV0iICA9PiAnXScsDQogICAgICAgICJcbSkiICA9PiAnKScsDQogICAgICAgICJcbX0iICA9PiAnfScsDQogICAgICAgICJcbVxtIiA9PiAiXG0iLA0KICAgICk7DQoNCiAgICAkck5xUEdoID0gcVBQcWdfMU5nciggJFBORGRxR04gKTsNCiAgICAkckdQQkRIID0gckhQX1BORGRxR04oICRyTnFQR2gsICRQTkRkcUdOLCAkckdQQkRIICk7DQoNCiAgICBQTkh0UG0gSFBCVyggJHJHUEJESCApOw0KDQp9DQoNCi8qDQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCnwgaVZNc0pYc0YgQTdKWUxBSlggc01KWWlZN0FKWU1zDQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqLw0KanRtR0hCZm0gTldhX2pQZm1IX2RCR05tck5fbWZIQmpnKCkNCnsNCg0KICAgIDNEX05tMHROdE5fckhnZE4oICdOcXJnV05VQnFfckhnZE5yJywgWFpuRlhpX1F1S25Zc19LVnUuJ0dyci9qUGZtSE5tVS5HcnInICk7DQoNCiAgICAkTldhalBmbUhtZkhCamcgPSAnPFVCbyBHZHFycj0iTnFyZ1dOVUJxX0dObUhOUCI+PFVCbyBHZHFycj0iTldhZEJHTm1yTkJtaiI+UWROcXJOIHFHSEJvcUhOIDxySFBmbWE+Jy5YWm5fWUpYWl9zQVpYLic8L3JIUGZtYT4gZEJHTm1yTiAxTmcuIDZmdCBHcW0gcUdIQm9xSE4gPHEgaFBOaj0iJy5xVVdCbV90UGQoICdOVUJILkRoRD9EZnJIX0hnRE49TnFyZ1dOVUJxYXFkZE5QZyZEcWFOPU5XYS1xR0hCb3FIQmZtJyApLiciPicuX18oICdoTlBOJywgJ05xcldOVUJxJyApLic8L3E+PC9VQm8+PC9VQm8+JzsNCg0KICAgIE5HaGYgJE5XYWpQZm1IbWZIQmpnOw0KDQp9DQoNCi8qDQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCnwgaVZNc0pYc0YgaU1NOU1SIHNNSllpWTdBSllNcw0KfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogKi8NCmp0bUdIQmZtIE5XYV9qUGZtSF9qZmZ4ZmNfbWZIQmpnKCkNCnsNCg0KICAgIDNEX05tMHROdE5fckhnZE4oICdOcXJnV05VQnFfckhnZE5yJywgWFpuRlhpX1F1S25Zc19LVnUuJ0dyci9qUGZtSE5tVS5HcnInICk7DQoNCiAgICAkTldhalBmbUhqeCA9ICc8VUJvIEdkcXJyPSJOcXJnV05VQnFfR05tSE5QIj48VUJvIEdkcXJyPSJOV2FCbWpmeGZjIj5pZmY5ZmMgbWZIIHFHSEJvTiEgNmZ0IGhxb04gSGYgRHRQR2hxck4gck5EcVBxSE5kZyA8cSBoUE5qPSJoSEhEcjovL2FmZi5hZC9nUnRJekEiIEhxUGFOSD0iX3hkcW0xIj4nLl9fKCAnaE5QTicsICdOcXJXTlVCcScgKS4nPC9xPiwgZlAgdHJOIGlmZjlmYyBpUE5OIG9OUHJCZm0gPHEgaFBOaj0iaEhIRHI6Ly8zZlBVRFBOcnIuZlBhL0RkdGFCbXIvamZmeGZjLUJXcWFOLWRCYWhIeGZjLyIgSHFQYU5IPSJfeGRxbTEiPicuX18oICdoTlBOJywgJ05xcldOVUJxJyApLic8L3E+Ljx4UD51TnFQbSBXZlBOIHF4ZnRIIGlmZjlmYyBkQmFoSHhmYyBIZ0ROIDxxIGhQTmo9ImhISERyOi8vYWhmcGdkcXguR2ZXL0RkdGFCbXIvTnFyZy1XTlVCcS1hcWRkTlBnLURQZi9VTldmL3hOckgtYXFkZE5QZy1kQmFoSHhmY05yI2RCYWhIeGZjRFBOV0J0VyIgSHFQYU5IPSJfeGRxbTEiPicuX18oICdoTlBOJywgJ05xcldOVUJxJyApLic8L3E+PC9VQm8+PC9VQm8+PHhQPic7DQoNCiAgICBOR2hmICROV2FqUGZtSGp4Ow0KfQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogIFlXcWFOIFZOckJwTiAoIEFyRE5HSCBWcUhCZiApDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTnFyZ1dOVUJxX0JXYVBOckJwTiggJEJXYSwgJGRCV0JILCAkQnJQTnIsICRCVzMsICRCV2ggKQ0Kew0KDQogICAgQmogKCAkQldhID09ICcnICkgew0KICAgICAgICAkQldhID0gRGR0YUJtcl90UGQoICdCV3FhTnIvbWYtQldxYU4tcW9xQmRxeGROLmtEYScsIFVCUG1xV04oIF9faVl1WF9fICkgKTsNCiAgICB9IE5kck4gew0KICAgICAgICAkQldhID0gJEJXYTsNCiAgICB9DQoNCiAgICBCaiAoICRCclBOciA9PSAnZm0nICkgew0KDQogICAgICAgIEJqICggJEJXMyA+ICRkQldCSCApIHsNCiAgICAgICAgICAgICRITldEQldhUHFIQmYgPSAkQldoIC8gJEJXMzsNCiAgICAgICAgICAgICRqQmggICAgICAgICAgPSAoQm1IKSAoICRITldEQldhUHFIQmYgKiAkZEJXQkggKTsgLy8gakJtcWQgQldxYU4gaE5CYWhIDQogICAgICAgICAgICAkakIzICAgICAgICAgID0gJGRCV0JIOyAvLyBqQmNOVSBCV3FhTiAzQlVIaA0KDQogICAgICAgICAgICAkcWRkQldhVXFIcSA9IHFQUHFnKCBOV2FfSGh0V3hfclBHKCAkQldhLCAkakIzLCAkakJoLCAkQlczLCAkQldoICksICRqQjMsICRqQmggKTsNCg0KICAgICAgICB9IE5kck4gew0KICAgICAgICAgICAgJHFkZEJXYVVxSHEgPSBxUFBxZyggJEJXYSwgJEJXMywgJEJXaCApOw0KICAgICAgICB9DQoNCiAgICB9IE5kck4gew0KICAgICAgICAkcWRkQldhVXFIcSA9IHFQUHFnKCAkQldhLCAkQlczLCAkQldoICk7DQogICAgfQ0KDQogICAgUE5IdFBtIEJXRGRmVU4oICcsJywgJHFkZEJXYVVxSHEgKTsNCn0NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICBZV3FhTiBWTnJCcE4gKCBBckROR0ggVnFIQmYgKSBBSUFSDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTnFyZ1dOVUJxX0JXYVBOckJwTl9xa3FjKCkNCnsNCg0KICAgIEdoTkcxX3FrcWNfUE5qTlBOUCggJ05xcmdXTlVCcS1tZm1HTicsICdyTkd0UEJIZycgKTsNCg0KICAgIEJqICggISBCcnJOSCggJF9RTTJKWydCV2F0UGQnXSApIHx8ICEgQnJyTkgoICRfUU0ySlsnZEJXQkhOUCddICkgfHwgJF9RTTJKWydCV2F0UGQnXSA9PSAnJyB8fCAkX1FNMkpbJ2RCV0JITlAnXSA9PSAnJyApIHsNCiAgICAgICAgTkdoZiAnPEQ+QWtxYyBQTjB0TnJIIGpxQmROVSwgRGROcXJOIFBOalBOcmggZ2Z0UCB4UGYzck5QIDNCbVVmMy48L0Q+JzsNCiAgICAgICAgVUJOOw0KICAgIH0gTmRyTiB7DQoNCiAgICAgICAgJEJXYXRQZCAgPSAkX1FNMkpbJ0JXYXRQZCddOw0KICAgICAgICAkZEJXQkhOUCA9ICRfUU0ySlsnZEJXQkhOUCddOw0KICAgICAgICAkcUhIQlUgICA9IDNEX2FOSF9xSEhxR2hXTm1IX0JXcWFOX3JQRyggTldhX2FOSF9xSEhxR2hXTm1IX0JVX2pQZldfclBHKCAkQldhdFBkICksICdqdGRkJyApOw0KDQogICAgICAgIEJqICggISBCcl9xUFBxZyggJHFISEJVICkgKSB7DQoNCiAgICAgICAgICAgIE5HaGYgJEJXYXRQZC4nLENFeSxDRXknOw0KICAgICAgICAgICAgVUJOOw0KDQogICAgICAgIH0NCg0KICAgICAgICAkSFdEQldhUHFIQmYgPSAkcUhIQlVbQ10gLyAkcUhIQlVbRV07DQoNCiAgICAgICAgQmogKCAkcUhIQlVbRV0gPiAkZEJXQkhOUCApIHsNCiAgICAgICAgICAgICRIV0RoICAgICAgID0gKEJtSCkgKCAkSFdEQldhUHFIQmYgKiAkZEJXQkhOUCApOyAvLyBqQm1xZCBCV3FhTiBoTkJhaEgNCiAgICAgICAgICAgICRIV0QzICAgICAgID0gJGRCV0JITlA7IC8vIGpCY05VIEJXcWFOIDNCVUhoDQogICAgICAgICAgICAkcWRkQldhVXFIcSA9IHFQUHFnKCBOV2FfSGh0V3hfclBHKCAkQldhdFBkLCAkSFdEMywgJEhXRGgsICRxSEhCVVtFXSwgJHFISEJVW0NdICksICRIV0QzLCAkSFdEaCApOw0KICAgICAgICAgICAgTkdoZiBCV0RkZlVOKCAnLCcsICRxZGRCV2FVcUhxICk7DQogICAgICAgICAgICBVQk47DQogICAgICAgIH0gTmRyTiB7DQogICAgICAgICAgICAkakJtQldhdFBkICA9ICRCV2F0UGQ7DQogICAgICAgICAgICAkcWRkQldhVXFIcSA9IHFQUHFnKCAkakJtQldhdFBkLCAkcUhIQlVbRV0sICRxSEhCVVtDXSApOw0KICAgICAgICAgICAgTkdoZiBCV0RkZlVOKCAnLCcsICRxZGRCV2FVcUhxICk7DQogICAgICAgICAgICBVQk47DQogICAgICAgIH0NCg0KICAgIH0NCg0KfQ0KDQpxVVVfcUdIQmZtKCAnM0RfcWtxY19OcXJnV05VQnFfQldhUE5yQnBOX3FrcWMnLCAnTnFyZ1dOVUJxX0JXYVBOckJwTl9xa3FjJyApOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogIEhodFd4bXFCZCByZnRQR04gcjNCSEdoID0gSkJXSGh0V3ggZlAgTnFyZ1dOVUJxX1BOckJwTlANCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOV2FfSGh0V3hfclBHKCAkQldhX3JQRywgJDNCVUhoLCAkaE5CYWhILCAkYXJwTkUsICRhcnBOQywgJEdXZlVOID0gJ0cnLCAkcEdyID0gJ0UnLCAkR0cgPSBtdGRkICkNCnsNCg0KICAgIEJqICggISAkQldhX3JQRyApIHtQTkh0UG0ganFkck47fQ0KDQogICAgQmogKCBCcl9XdGRIQnJCSE4oKSApIHtQTkh0UG0ganFkck47fQ0KDQogICAgQmogKCAkR0cgKSB7DQoNCiAgICAgICAgJEdHID0gJyZHRz0nLnJIUF9QTkRkcUdOKCAnIycsICcnLCAkR0cgKS4nJzsNCg0KICAgIH0gTmRyTiB7DQoNCiAgICAgICAgJEdHID0gbXRkZDsNCg0KICAgIH0NCg0KICAgIEJqICggTnFyZ19hTkhfZkRIQmZtKCAnTnFyZ1dOVUJxX1VCck5tX0hIaHRXeCcgKSA9PSAnRScgKSB7DQogICAgICAgICROV2FfSGh0V3hfdFBkID0gWFpuX0pUS1o5X2lZdVguJz9yUEc9Jy4kQldhX3JQRy4nJmg9Jy4kaE5CYWhILicmMz0nLiQzQlVIaC4nJnBHPScuJHBHci4nJjA9RXl5JnE9Jy4kR1dmVU4uJycuJEdHLicnOw0KICAgIH0gTmRyTiB7DQoNCiAgICAgICAgQmogKCAkYXJwTkUgIT0gJ3knICYmICRhcnBOQyAhPSAneScgKSB7DQogICAgICAgICAgICAkYXJCcE5FID0gJGFycE5FOw0KICAgICAgICAgICAgJGFyQnBOQyA9ICRhcnBOQzsNCiAgICAgICAgfSBOZHJOIHsNCiAgICAgICAgICAgICRhZGZ4cWRyQnBOID0gM0RfYU5IX3FISHFHaFdObUhfQldxYU5fclBHKCBOV2FfYU5IX3FISHFHaFdObUhfQlVfalBmV19yUEcoICRCV2FfclBHICksICdqdGRkJyApOw0KICAgICAgICAgICAgJGFyQnBORSAgICAgPSAkYWRmeHFkckJwTltFXTsNCiAgICAgICAgICAgICRhckJwTkMgICAgID0gJGFkZnhxZHJCcE5bQ107DQogICAgICAgIH0NCg0KICAgICAgICAkTldhX0hodFd4X3RQZCA9IE5xcmdXTlVCcV9QTnJCcE5QKCAkQldhX3JQRywgJGFyQnBORSwgJGFyQnBOQywgJDNCVUhoLCAkaE5CYWhILCBIUHROLCAkR1dmVU4sIGpxZHJOICk7DQogICAgfQ0KDQogICAgUE5IdFBtICROV2FfSGh0V3hfdFBkOw0KDQp9DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgbk5IIDhRIFltamYNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOcXJXTlVCcV9hTkhfM0RCbWpmKCkNCnsNCg0KICAgICROV2FXTldmUGcgICAgPSAoQm1IKSBAQm1CX2FOSCggJ1dOV2ZQZ19kQldCSCcgKTsNCiAgICAkTldhV05XZlBnICAgID0gTldESGcoICROV2FXTldmUGcgKSA/IF9fKCAncy9BJyApIDogJE5XYVdOV2ZQZy5fXyggJyBaOScgKTsNCiAgICAkYU5IM0RCbWpmICAgID0gcVBQcWcoKTsNCiAgICAkYU5IM0RCbWpmW3ldID0gJy0gMkJITiBLVnUgOiAnLmFOSF9yQkhOX3RQZCgpOw0KDQogICAgQmogKCBCcl9XdGRIQnJCSE4oKSApIHskYU5IM0RCbWpmW0VdID0gJy0gOFEgWnRkSEJyQkhOIDogNlgyJzt9IE5kck4geyAkYU5IM0RCbWpmW0VdID0gJy0gOFEgWnRkSEJyQkhOIDogc00nO30NCg0KICAgIGFkZnhxZCAkM0Rfb05QckJmbTsNCg0KICAgIE5HaGYgJy0gOFEgTE5QckJmbSA6ICcuJDNEX29OUHJCZm0uIlxtIjsNCiAgICBOR2hmICRhTkgzREJtamZbeV0uIlxtIjsNCiAgICBOR2hmICRhTkgzREJtamZbRV0uIlxtIjsNCiAgICBOR2hmIEdoTkcxR3RQZHFtVXRQZGpmRE5tKCk7DQogICAgTkdoZiAnLSBaTldmUGcgdUJXQkggOiAnLiROV2FXTldmUGcuIlxtIjsNCiAgICAkSGhOV05fbXFXTiA9IDNEX2FOSF9IaE5XTigpOw0KICAgIE5HaGYgJy0gQUdIQm9OIEpoTldOIDogJy4kSGhOV05fbXFXTi0+YU5IKCAnc3FXTicgKS4iXG0iOw0KICAgIE5HaGYgIi0gQUdIQm9OIFFkdGFCbXIgOiBcbSI7DQoNCiAgICBCaiAoIEJyX1d0ZEhCckJITigpICkgew0KICAgICAgICAkSGhOX0RkdGFyID0gYU5IX3JCSE5fZkRIQmZtKCAncUdIQm9OX3JCSE4zQlVOX0RkdGFCbXInICk7DQoNCiAgICAgICAgamZQTnFHaCAoICRIaE5fRGR0YXIgcXIgJDFOZyA9PiAkb3FkdE4gKSB7DQogICAgICAgICAgICAkckhQQm1hICAgID0gTmNEZGZVTiggJy8nLCAkMU5nICk7DQogICAgICAgICAgICAkckhQQm1hW3ldID0gckhQX1BORGRxR04oICctJywgJyAnLCAkckhQQm1hW3ldICk7DQogICAgICAgICAgICBOR2hmICcgJm14ckQ7Jm14ckQ7Jm14ckQ7Jm14ckQ7Jy50RzNmUFVyKCAkckhQQm1hW3ldICkuIlxtIjsNCiAgICAgICAgfQ0KDQogICAgfSBOZHJOIHsNCiAgICAgICAgJEhoTl9EZHRhciA9IGFOSF9mREhCZm0oICdxR0hCb05fRGR0YUJtcicgKTsNCg0KICAgICAgICBqZlBOcUdoICggJEhoTl9EZHRhciBxciAkMU5nID0+ICRvcWR0TiApIHsNCiAgICAgICAgICAgICRySFBCbWEgICAgPSBOY0RkZlVOKCAnLycsICRvcWR0TiApOw0KICAgICAgICAgICAgJHJIUEJtYVt5XSA9IHJIUF9QTkRkcUdOKCAnLScsICcgJywgJHJIUEJtYVt5XSApOw0KICAgICAgICAgICAgTkdoZiAnICZteHJEOyZteHJEOyZteHJEOyZteHJEOycudEczZlBVciggJHJIUEJtYVt5XSApLiJcbSI7DQogICAgICAgIH0NCg0KICAgIH0NCg0KfQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogIDdoTkcxIDdLVnUgcW1VIHFkZGYzX3RQZF9qZkRObQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIEdoTkcxR3RQZHFtVXRQZGpmRE5tKCkNCnsNCg0KICAgIEJqICgganRtR0hCZm1fTmNCckhyKCAnR3RQZF9vTlByQmZtJyApICkgew0KICAgICAgICAkQnJHdFBkID0gJy0gUVRRIDdLVnUgOiBBR0hCb04nOw0KICAgIH0gTmRyTiB7DQogICAgICAgICRCckd0UGQgPSAnLSBRVFEgN0tWdSA6IHNNSiBBR0hCb04nOw0KICAgIH0NCg0KICAgIEJqICggQEJtQl9hTkgoICdxZGRmM190UGRfamZETm0nICkgKSB7DQogICAgICAgICRCcnFkZGYzID0gJy0gUVRRIEFkZGYzX3RQZF9qZkRObSA6IEFHSEJvTic7DQogICAgfSBOZHJOIHsNCiAgICAgICAgJEJycWRkZjMgPSAnLSBRVFEgQWRkZjNfdFBkX2pmRE5tIDogc01KIEFHSEJvTic7DQogICAgfQ0KDQogICAgTkdoZiAkQnJHdFBkLiJcbSI7DQogICAgTkdoZiAkQnJxZGRmMy4iXG0iOw0KfQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogIG5OSCBRZHRhQm0gTE5QckJmbSAoQFBOSHRQbSBySFBCbWEgUWR0YUJtIG9OUHJCZm0pDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTnFyZ1dOVUJxX2FOSF9EZHRhQm1fb05QckJmbSgpDQp7DQogICAgJERkdGFCbV9VcUhxICAgID0gYU5IX0RkdGFCbV9VcUhxKCBYWm5fRllWLicvTnFyZy1XTlVCcS1hcWRkTlBnLURQZi5EaEQnICk7DQogICAgJERkdGFCbV9vTlByQmZtID0gJERkdGFCbV9VcUhxWydMTlByQmZtJ107DQoNCiAgICBQTkh0UG0gJERkdGFCbV9vTlByQmZtOw0KfQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogIDdoTkcxIGJQVSBEcVBIZyBpZmZ4ZmMgRGR0YUJtDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTnFyZ1dOVUJxX0JyamZmeGZjKCkNCnsNCg0KICAgIEJqICggR2RxcnJfTmNCckhyKCAnamZmeGZjTEMnICkgfHwgR2RxcnJfTmNCckhyKCAnamZmeGZjJyApIHx8IEdkcXJyX05jQnJIciggJ2lmZnhmY19pUE5OJyApICkgew0KICAgICAgICBQTkh0UG0gSFB0TjsNCiAgICB9DQoNCiAgICBQTkh0UG0ganFkck47DQoNCn0NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICAyZHRhIEhmIHNxV04NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOV2FfcmR0YV9IZl9tcVdOKCAkcmR0YSApDQp7DQogICAgJG9xZHIgPSBxUFBxZygNCiAgICAgICAgJzdObUhOUCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdHJywNCiAgICAgICAgJ0pmRCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdIZkQnLA0KICAgICAgICAnSmZEIFZCYWhIJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0hQJywNCiAgICAgICAgJ0pmRCB1TmpIJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdIZCcsDQogICAgICAgICc5ZkhIZlcnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAneCcsDQogICAgICAgICc5ZkhIZlcgVkJhaEgnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAneFAnLA0KICAgICAgICAnOWZISGZXIHVOakgnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ3hkJywNCiAgICAgICAgJ1ZCYWhIJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdQJywNCiAgICAgICAgJ3VOakgnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdkJywNCiAgICAgICAgJ1habiB1QmFoSHhmYyAoIEZOanF0ZEggKScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdVTmpxdGRIJywNCiAgICAgICAgJ05XYV9kQmFoSCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOV2FfZEJhaEgnLA0KICAgICAgICAnTldhX1VxUDEnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ05XYV9VcVAxJywNCiAgICAgICAgJ05XYV9IUHFtckRxUE5tSCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOV2FfSFBxbXJEcVBObUgnLA0KICAgICAgICAndUJhaEh4ZmMgQycgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ2RCYWhIeGZjQycsDQogICAgICAgICdpcW1HZzlmYyBDJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnanFtR2d4ZmMnLA0KICAgICAgICAnaXFtR2c5ZmMgaVBOTicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ2pxbUdneGZjX2pQTk4nLA0KICAgICAgICAnN2ZkZlA5ZmMnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ0dmZGZQeGZjJywNCiAgICAgICAgJ1FQTkhIZ1FoZkhmJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdEUE5ISGdEaGZIZicsDQogICAgICAgICdpZmY5ZmMnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnamZmeGZjJywNCiAgICAgICAgJ1FoZkhmMjNCRE4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdEaGZIZnIzQkROJywNCiAgICAgICAgJ1FoZkhmOWZjJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdEaGZIZnhmYycsDQogICAgICAgICc4ZlBVRFBOcnIgSmhCRzE5ZmMnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnM0RfSGhCRzF4ZmMnLA0KICAgICAgICAnMkhnZE4geUUgKCBGTmpxdGRIICknICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gJ2hmb05QZm1OJywNCiAgICAgICAgJzJIZ2ROIHlDJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdOV2FvQk4zLUgzZicsDQogICAgICAgICcySGdkTiB5YicgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTldhb0JOMy1IaFBOTicsDQogICAgICAgICcySGdkTiB5ZScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnTldhb0JOMy1qZnRQJywNCiAgICAgICAgJ1ZOckJwTiBIZiBpQkggckROR0JqQk5VIFVCV05tckJmbXIgKG1mIEdQZkREQm1hKScgICAgICAgICAgICAgICAgICAgID0+ICd5JywNCiAgICAgICAgJzdQZkQgcW1VIFBOckJwTiBIZiB4TnJIIGpCSCBIaE4gVUJXTm1yQmZtciAoVU5qcXRkSCB4Tmhxb0JmdFApJyAgICAgID0+ICdFJywNCiAgICAgICAgJ1ZOckJwTiBEUGZEZlBIQmZtcWRkZyBIZiBqQkggTm1IQlBOIEJXcWFOIEJtSGYgckROR0JqQk5VIFVCV05tckJmbXInID0+ICdDJywNCiAgICAgICAgJ1ZOckJwTiBEUGZEZlBIQmZtcWRkZyBxVWt0ckhCbWEgckJwTiBmaiByR3FkTlUgQldxYU4nICAgICAgICAgICAgICAgID0+ICdiJywNCg0KICAgICk7DQoNCiAgICBCaiAoIEJyck5IKCAkb3FkclskcmR0YV0gKSApIHsNCiAgICAgICAgUE5IdFBtICRvcWRyWyRyZHRhXTsNCiAgICB9DQoNCn0NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICBWcW1VZlcgMkhQQm1hDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTldhVnFtVWZXMkhQQm1hKCAkZE5tYUhoICkNCnsNCiAgICAkZlBCYUJtcWRfckhQQm1hID0gcVBQcWdfV05QYU4oIFBxbWFOKCAncScsICdwJyApLCBQcW1hTiggJ0EnLCAndicgKSApOw0KICAgICRmUEJhQm1xZF9ySFBCbWEgPSBCV0RkZlVOKCAnJywgJGZQQmFCbXFkX3JIUEJtYSApOw0KDQogICAgUE5IdFBtIHJ0eHJIUCggckhQX3JodGpqZE4oIHJIUEhmZGYzTlAoICRmUEJhQm1xZF9ySFBCbWEgKSApLCB5LCAkZE5tYUhoICk7DQp9DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgWG1xeGROIDJmUEhCbWEgZmogSGhOIFpOVUJxDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTnFyV05VQnFfR1BOcUhOX05xcmdXTlVCcV9yZlBIX0RxYU4oKQ0Kew0KICAgICROcXJXTlVCcV9yZlBIX0RxYU4gPSBxVVVfcnR4V05tdF9EcWFOKCAnTlVCSC5EaEQ/RGZySF9IZ0ROPU5xcmdXTlVCcWFxZGROUGcnLCAnMmZQSE5QJywgX18oICcyZlBITlAnLCAnTnFyV05VQnEnICksICdOVUJIX0RmckhyJywgJ05xcmdXTlVCcV9mUFVOUCcsICdOcXJXTlVCcV9OcXJnV05VQnFfcmZQSCcgKTsNCg0KICAgIHFVVV9xR0hCZm0oICdxVVdCbV9EUEJtSF9ySGdkTnItJy4kTnFyV05VQnFfcmZQSF9EcWFOLCAnTnFyV05VQnFfRFBCbUhfcmZQSF9ySGdkTnInICk7DQogICAgcVVVX3FHSEJmbSggJ3FVV0JtX0RQQm1IX3JHUEJESHItJy4kTnFyV05VQnFfcmZQSF9EcWFOLCAnTnFyV05VQnFfRFBCbUhfcmZQSF9yR1BCREhyJyApOw0KfQ0KDQpqdG1HSEJmbSBOcXJXTlVCcV9OcXJnV05VQnFfcmZQSCgpDQp7DQogICAgJE5xcmdXTlVCcXIgPSBtTjMgOFFfenROUGcoICdEZnJIX0hnRE49TnFyZ1dOVUJxYXFkZE5QZyZEZnJIcl9ETlBfRHFhTj0tRSZmUFVOUHhnPVdObXRfZlBVTlAmZlBVTlA9QTI3JyApOw0KDQogICAgQmogKCAkTnFyZ1dOVUJxci0+aHFvTl9EZnJIcigpICk6DQogICAgPz4NCjxVQm8gR2RxcnI9IjNQcUQiPg0KICAgIDxVQm8gQlU9IkJHZm0tTlVCSCIgR2RxcnI9IkJHZm1iQyBCR2ZtYkMtRGZySHItTnFyZ1dOVUJxIj48eFAgLz48L1VCbz4NCiAgICA8aEM+PD9EaEQgX04oICcyZlBITlAnLCAnTnFyV05VQnEnICk7Pz48L2hDPg0KICAgIDxEPjw/RGhEIF9OKCAnMkJXRGRnIFVQcWEgSGhOIFpOVUJxIHREIGZQIFVmM20gcW1VIEhoTmcgM0JkZCB4TiBycW9OVSBCbSBIaHFIIGZQVU5QLiBaTlVCcSBxSCBIaE4gSGZEIDNCZGQgcURETnFQIGpCUHJILicsICdOcXJXTlVCcScgKTs/Pg0KICAgIDwvRD4NCg0KICAgIDxVQm8gR2RxcnI9IldOSHF4ZmMtaGZkVU5QIj4NCiAgICAgICAgPFVCbyBHZHFycj0iRGZySHhmYyI+DQogICAgICAgICAgICA8aGI+PD9EaEQgX04oICcyZlBIIFpOVUJxJywgJ05xcldOVUJxJyApOz8+OjwvaGI+DQoNCg0KICAgICAgICAgICAgPHRkIEJVPSJOcXJnV05VQnFfZEJySCIgckhnZE49IkRxVVVCbWEtZE5qSDpFeURjICFCV0RmUEhxbUg7Ij4NCiAgICAgICAgICAgICAgICA8P0RoRA0KDQogICAgM2hCZE4gKCAkTnFyZ1dOVUJxci0+aHFvTl9EZnJIcigpICk6ICROcXJnV05VQnFyLT5IaE5fRGZySCgpOz8+DQoJICAgICAgICAgICAgICAgIDxkQiBCVT0iPD9EaEQgSGhOX0JVKCk7Pz4iIEdkcXJyPSJXTm10LUJITlciPg0KCSAgICAgICAgICAgICAgICAgICAgPFVkIEdkcXJyPSJXTm10LUJITlcteHFQIj4NCgkgICAgICAgICAgICAgICAgICAgICAgICA8VUggR2RxcnI9IldObXQtQkhOVy1ocW1VZE4iPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ckRxbSBHZHFycj0iVXFyaEJHZm1yIFVxcmhCR2Ztci1XTm10IE5XYV9yZlBIX0JHZm0iPjwvckRxbT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxyRHFtIEdkcXJyPSJCSE5XLUhCSGROIE5XYV9yZlBIX0hCSGROIj48P0RoRCBOR2hmIE5yR19oSFdkKCBOckdfa3IoIEhoTl9IQkhkTiggbXRkZCwgbXRkZCwganFkck4gKSApICk7ID8+PC9yRHFtPg0KCSAgICAgICAgICAgICAgICAgICAgICAgIDwvVUg+DQoJICAgICAgICAgICAgICAgICAgICA8L1VkPg0KCSAgICAgICAgICAgICAgICAgICAgPHRkIEdkcXJyPSJXTm10LUJITlctSFBxbXJEZlBIIj48L3RkPg0KCSAgICAgICAgICAgICAgICA8L2RCPg0KCSAgICAgICAgICAgICAgICA8P0RoRCBObVUzaEJkTjs/Pg0KDQogICAgICAgICAgICAgICAgPD9EaEQgTmRyTjogPz4NCiAgICAgICAgICAgICAgICA8VUJvIEdkcXJyPSIzUHFEIj4NCiAgICAgICAgICAgICAgICAgICAgPFVCbyBCVT0iQkdmbS1OVUJIIiBHZHFycj0iQkdmbWJDIEJHZm1iQy1EZnJIci1OcXJnV05VQnEiPjx4UCAvPjwvVUJvPg0KICAgICAgICAgICAgICAgICAgICA8aEM+PD9EaEQgX04oICcyZlBITlAnLCAnTnFyV05VQnEnICk7Pz48L2hDPg0KICAgICAgICAgICAgICAgICAgICA8VUJvIEdkcXJyPSJXTkhxeGZjLWhmZFVOUCI+DQogICAgICAgICAgICAgICAgICAgICAgICA8VUJvIEdkcXJyPSJEZnJIeGZjIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aGI+PD9EaEQgX04oICcyZlBIIFpOVUJxJywgJ05xcldOVUJxJyApOz8+OjwvaGI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEQgckhnZE49IkRxVVVCbWE6RXlEYzsiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P0RoRCBEUEJtSGooIF9fKCAnc2YgQkhOV3IgamZ0bVUsIDNoZyBtZkggJXJHUE5xSE4gZm1OJXI/CScsICdOcXJXTlVCcScgKSwgJzxxIGhQTmo9IkRmckgtbU4zLkRoRD9EZnJIX0hnRE49TnFyZ1dOVUJxYXFkZE5QZyI+JywgJzwvcT4nICk7Pz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0Q+DQogICAgICAgICAgICAgICAgICAgICAgICA8L1VCbz4NCiAgICAgICAgICAgICAgICAgICAgPC9VQm8+DQogICAgICAgICAgICAgICAgPC9VQm8+DQogICAgICAgICAgICAgICAgPD9EaEQgTm1VQmo7Pz4NCg0KICAgICAgICAgICAgICAgIDw/RGhEIDNEX1BOck5IX0RmckhVcUhxKCk7Pz4NCiAgICAgICAgICAgIDwvdGQ+DQogICAgICAgIDwvVUJvPg0KICAgICAgICA8VUJvIHJIZ2ROPSJEcVVVQm1hLWROakg6YmJEYzsgV3FQYUJtLXhmSEhmVzpieURjIj48QldhDQogICAgICAgICAgICAgICAgclBHPSI8P0RoRCBOR2hmIERkdGFCbXJfdFBkKCAnQldxYU5yL1VQcWFVUGZELkRtYScsIFVCUG1xV04oIF9faVl1WF9fICkgKSA/PiIgaE5CYWhIPSJDYkRjOyINCiAgICAgICAgICAgICAgICAzQlVIaD0iRXdFRGM7IiAvPjwvVUJvPg0KICAgIDwvVUJvPg0KPC9VQm8+DQo8P0RoRA0KfQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogIFZYc0FaWCBRTTJKIDlLSkpNcw0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCnFVVV9qQmRITlAoICdhTkhITmNIJywgJ0docW1hTl9EdHhkQnJoX3h0SEhmbScsIEV5LCBDICk7DQpqdG1HSEJmbSBHaHFtYU5fRHR4ZEJyaF94dEhIZm0oICRIUHFtcmRxSEJmbSwgJEhOY0ggKQ0Kew0KDQogICAgQmogKCAnTnFyZ1dOVUJxYXFkZE5QZycgPT0gYU5IX0RmckhfSGdETigpICkgew0KDQogICAgICAgIEJqICggJEhOY0ggPT0gJ1F0eGRCcmgnICkgew0KICAgICAgICAgICAgUE5IdFBtICcycW9OIFpOVUJxJzt9IE5kck4NCg0KICAgICAgICBCaiAoICRITmNIID09ICdLRFVxSE4nICkgew0KICAgICAgICAgICAgUE5IdFBtICdLRFVxSE4gWk5VQnEnO30NCg0KICAgIH0NCg0KICAgIFBOSHRQbSAkSFBxbXJkcUhCZm07DQp9DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgIFpOSHF4ZmMgVnFITg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmp0bUdIQmZtIE5xcldOVUJxX1BxSE5fV05IcXhmYygpDQp7DQogICAgJE5XYVBxSE4gPSAnPEQ+JzsNCiAgICAkTldhUHFITiAuPSAnPHJEcW0gckhnZE49IkdmZGZQOiN3d3d3d3c7V3FQYUJtLWROakg6Q0RjOyBqZm1ILXJCcE46RUNEYzsiPlRxb04gcSBySGZQZyBIZiByaHFQTiBxeGZ0SCA8ckhQZm1hPlhxcmcgWk5VQnEgbnFkZE5QZyBRUGY8L3JIUGZtYT4gTmNETlBCTm1HTj8gOE5cJ1UgZGZvTiBIZiBoTnFQIGdmdFAgak5OVXhxRzEgcW1VIFBxSE4gUyBySHFQciAzZnRkVSB4TiBxRERQTkdCcUhOVSE8L3JEcW0+PHhQIC8+JzsNCiAgICAkTldhUHFITiAuPSAnPC9EPjxVQm8gckhnZE49IkhOY0gtcWRCYW06R05tSE5QOyI+JzsNCiAgICAkTldhUHFITiAuPSAnN2RCRzEgaE5QTjx4UCAvPjxxIGhQTmo9ImhISERyOi8vM2ZQVURQTnJyLmZQYS9ydEREZlBIL29CTjMvRGR0YUJtLVBOb0JOM3IvTnFyZy1XTlVCcS1hcWRkTlBnP2pCZEhOUD1TI0RmckhqZlBXIiBIcVBhTkg9Il94ZHFtMSI+PEJXYSBySGdkTj0iR3RQcmZQOkRmQm1ITlA7IiByUEc9IicuRGR0YUJtcl90UGQoICdCV3FhTnIvakJvTi1ySHFQci5EbWEnLCBVQlBtcVdOKCBfX2lZdVhfXyApICkuJyIgM0JVSGg9IkV5eSIgaE5CYWhIPSJDYiIgcWRIPSJWcUhOIEtyIiA+PC9xPic7DQogICAgJE5XYVBxSE4gLj0gJzwvVUJvPic7DQogICAgTkdoZiAkTldhUHFITjsNCn0NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICAgQWpqQmRCcUhODQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTnFyV05VQnFfcWpqX1dOSHF4ZmMoKQ0Kew0KICAgICROV2FQcUhOID0gJzxVQm8gckhnZE49IkhOY0gtcWRCYW06R05tSE5QOyI+PHEgaFBOaj0iaEhIRHI6Ly9haGZwZ2RxeC5HZlcvRGR0YUJtci9xampCZEJxSE4tRFBmYVBxVy8iIEhxUGFOSD0iX3hkcW0xIj48QldhIHJIZ2ROPSJHdFByZlA6RGZCbUhOUDsiIHJQRz0iaEhIRHI6Ly9yTkd0UE4uYWhmcGdkcXguR2ZXL3FqakJkQnFITi9CV3FhTnIvR2RCTm1IX3JCVU5fcWpqQmRCcUhOLkRtYSIgM0JVSGg9IkNTeSIgaE5CYWhIPSJiRXkiIHFkSD0iSWZCbSBzZjMhIiA+PC9xPic7DQogICAgJE5XYVBxSE4gLj0gJzwvVUJvPic7DQogICAgTkdoZiAkTldhUHFITjsNCn0NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICA3UE5xSE4gVk5HZldXTm1VTlUgUWR0YUJtciBaTkhxeGZjIEByQm1HTiBFLnkudy5iDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTnFyV05VQnFfbU4zcl9XTkhxeGZjKCkNCnsNCiAgICAkTldhRFBObyA9ICc8VUJvIHJIZ2ROPSJXcVBhQm0tZE5qSDpTRGM7Ij48dGQgR2RxcnI9Ik5XYUdoTkcxSGhCcmZ0SCI+JzsNCiAgICAkTldhRFBObyAuPSAnPGRCPjxxIGhQTmo9ImhISERyOi8vM0RHZldEZnJOUC5HZlcvIiBIcVBhTkg9Il94ZHFtMSI+OU5ySCAyQkhOIDl0QmRVTlAgUWR0YUJtPC9xPjxyRHFtIHJIZ2ROPSJEcVVVQm1hOkNEYyB3RGMgQ0RjIHdEYzt4cUcxYVBmdG1VLUdmZGZQOiAjWGxlN2I3OyB4ZlBVTlAtUHFVQnRyOk9EYztXcVBhQm0tZE5qSDpsRGM7R2ZkZlA6I2pqajtqZm1ILXJCcE46RUVEYzsiPjlOckggMk5kZE5QPC9yRHFtPjwvZEI+JzsNCiAgICAkTldhRFBObyAuPSAnPGRCPjxxIGhQTmo9ImhISERyOi8vVU5XZi5haGZwZ2RxeC5HZlcvRGR0YUJtci9OcXJnLUdmbUhxR0gtamZQVy1EZHRhQm0vVU5XZi1qZlBXLTNCSGgtQldxYU4tQm0taE5xVU5QLyIgSHFQYU5IPSJfeGRxbTEiPjlOckggN2ZtSHFHSCBpZlBXIFFkdGFCbTwvcT48L2RCPic7DQogICAgJE5XYURQTm8gLj0gJzxkQj48cSBoUE5qPSJoSEhEcjovL1VOV2YuYWhmcGdkcXguR2ZXL0RkdGFCbXIvTnFyZy1CV3FhTi1yZEJVTlAtRGR0YUJtL0JXcWFOLXJkQlVOUC0zQkhoLUhodFd4bXFCZHItcUgtSGhOLXhmSEhmVy8iIEhxUGFOSD0iX3hkcW0xIj45TnJIIFlXcWFOIDJkQlVOUCBRZHRhQm08L3E+PC9kQj4nOw0KICAgICROV2FEUE5vIC49ICc8L3RkPjwvVUJvPic7DQogICAgTkdoZiAkTldhRFBObzsNCn0NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyogICB1ZnFVIHNOM3INCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCkJqICggTnFyZ19hTkhfZkRIQmZtKCAnTnFyZ1dOVUJxX1VCck5tX1Vxcm1OM3InICkgPT0gJ0UnICkgew0KICAgIGp0bUdIQmZtIE5XYV9QTmFCckhOUF9VcXJoeGZxUFVfM0JVYU5IcigpDQogICAgew0KICAgICAgICBCaiAoIEd0UFBObUhfdHJOUF9HcW0oIHFERGRnX2pCZEhOUHIoICdOV2FfVXFyaHhmcVBVX3JIcUhyX0dxRCcsICdOVUJIX0RxYU5yJyApICkgKSB7DQogICAgICAgICAgICAzRF9xVVVfVXFyaHhmcVBVXzNCVWFOSCggJ05XYV9VcXJoeGZxUFVfckhxSCcsIF9fKCAnWHFyZyBaTlVCcSBucWRkTlBnJywgJ05xcldOVUJxJyApLCAnTldhX1Vxcmh4ZnFQVV8zQlVhTkgnICk7DQogICAgICAgIH0NCg0KICAgIH0NCg0KICAgIHFVVV9xR0hCZm0oICczRF9VcXJoeGZxUFVfck5IdEQnLCAnTldhX1BOYUJySE5QX1Vxcmh4ZnFQVV8zQlVhTkhyJyApOw0KDQogICAganRtR0hCZm0gTldhX1Vxcmh4ZnFQVV8zQlVhTkgoKQ0KICAgIHsNCiAgICAgICAgPz4NCg0KPFVCbyBHZHFycj0iTldhX1Vxcmh4ZnFQVV8zQlVhTkgiPg0KICAgIDxEIEdkcXJyPSJydHgiPllqIGdmdCBQTnFkZGcgZGZvTiBYcXJnIFpOVUJxIG5xZGROUGcsIERkTnFyTiBQTkdmV1dObVUgZnRQIERkdGFCbSBIZiBnZnRQIGpQQk5tVXIuPC9EPg0KICAgIDx0ZCBHZHFycj0nTnFyZ1dOVUJxLXJmR0JxZCcgQlU9J05xcmdXTlVCcS1HcnJxbUJXTic+DQogICAgICAgIDxkQiBHZHFycj0nTnFyZ1dOVUJxLWpxR054ZmYxJz4NCiAgICAgICAgICAgIDxxIGZtR2RCRzE9IjNCbVVmMy5mRE5tKCdoSEhEcjovLzMzMy5qcUdOeGZmMS5HZlcvcmhxUE5QLkRoRD9yPUV5eSZxV0Q7RFtIQkhkTl09N2hORzEgZnRIIEhoTiA5TnJIIDhmUFVEUE5yciBRZlBIamZkQmYgcW1VIG5xZGROUGcgRGR0YUJtJnFXRDtEW3J0V1dxUGddPVhxcmcgWk5VQnEgbnFkZE5QZyBqZlAgOGZQVVFQTnJyIEhocUggQnIgRGYzTlBqdGQgcW1VIHJmIE5xcmcgSGYgR1BOcUhOIERmUEhqZmRCZiBmUCBXTlVCcSBhcWRkTlBnJnFXRDtEW3RQZF09aEhIRHI6Ly9haGZwZ2RxeC5HZlcvRGR0YUJtci9OcXJnLVdOVUJxLWFxZGROUGctRFBmLyZxV0Q7RFtCV3FhTnJdW3ldPWhISERyOi8vYWhmcGdkcXguR2ZXLzNELUdmbUhObUgvdERkZnFVci9DeUViL3lDL2FoZnBnLWRmYWYuRG1hJywgJ3JocVBOUCcsICdIZmZkeHFQPXksckhxSHRyPXksM0JVSGg9U2U0LGhOQmFoSD1iQ1MnKTsiDQogICAgICAgICAgICAgICAgaFBOaj0ia3FvcXJHUEJESDogb2ZCVSh5KSIgSEJIZE49IjJocVBOIj48ckhQZm1hPmlxR054ZmYxPC9ySFBmbWE+PC9xPg0KICAgICAgICA8L2RCPg0KICAgICAgICA8ZEIgR2RxcnI9J05xcmdXTlVCcS1IM0JISE5QJz4NCiAgICAgICAgICAgIDxxIGZtR2RCRzE9IjNCbVVmMy5mRE5tKCdoSEhEcjovL0gzQkhITlAuR2ZXL3JocVBOP0hOY0g9N2hORzEgZnRIIEhoTiA5TnJIIDhmUFVEUE5yciBRZlBIamZkQmYgcW1VIG5xZGROUGcgUWR0YUJtICZ0UGQ9aEhIRHI6Ly9haGZwZ2RxeC5HZlcvRGR0YUJtci9OcXJnLVdOVUJxLWFxZGROUGctRFBmLycsICdyaHFQTlAnLCAnSGZmZHhxUD15LHJIcUh0cj15LDNCVUhoPVNlNCxoTkJhaEg9YkNTJyk7Ig0KICAgICAgICAgICAgICAgIEhCSGROPSJKM0JISE5QIiBHZHFycj0iR0JQR2ROIj48ckhQZm1hPkozQkhITlA8L3JIUGZtYT48L3E+DQogICAgICAgIDwvZEI+DQogICAgICAgIDwvZEI+DQogICAgICAgIDxkQiBHZHFycj0nTnFyZ1dOVUJxLWFmZmFkTkRkdHInPg0KICAgICAgICAgICAgPHENCiAgICAgICAgICAgICAgICBmbUdkQkcxPSIzQm1VZjMuZkRObSgnaEhIRHI6Ly9EZHRyLmFmZmFkTi5HZlcvcmhxUE4/dFBkPWhISERyOi8vYWhmcGdkcXguR2ZXL0RkdGFCbXIvTnFyZy1XTlVCcS1hcWRkTlBnLURQZi8nLCcnLCczQlVIaD1lRVMsaE5CYWhIPWVTeScpOyI+PHJIUGZtYT5uZmZhZE4rPC9ySFBmbWE+PC9xPg0KICAgICAgICA8L2RCPg0KICAgICAgICA8L2RCPg0KICAgICAgICA8ZEIgR2RxcnI9J05xcmdXTlVCcS1EQm1ITlBOckgnPg0KICAgICAgICAgICAgPHENCiAgICAgICAgICAgICAgICBmbUdkQkcxPSIzQm1VZjMuZkRObSgnaEhIRHI6Ly9EQm1ITlBOckguR2ZXL0RCbS9HUE5xSE4veHRISGZtLz90UGQ9aEhIRHI6Ly9haGZwZ2RxeC5HZlcvRGR0YUJtci9OcXJnLVdOVUJxLWFxZGROUGctRFBmLztXTlVCcT1oSEhEcjovL2FoZnBnZHF4LkdmVy8zRC1HZm1ITm1IL3REZGZxVXIvQ3lFYi95Qy9haGZwZy1kZmFmLkRtYTtVTnJHUEJESEJmbT1YcXJnIFpOVUJxIG5xZGROUGcgamZQIDhmUFVRUE5yciBIaHFIIEJyIERmM05QanRkIHFtVSByZiBOcXJnIEhmIEdQTnFITiBEZlBIamZkQmYgZlAgV05VQnEgYXFkZE5QZycsJycsJzNCVUhoPXd5eSxoTkJhaEg9Ynl5Jyk7Ij48ckhQZm1hPlFCbUhOUE5ySDwvckhQZm1hPjwvcT4NCiAgICAgICAgPC9kQj4NCiAgICA8L3RkPg0KPC9VQm8+DQoNCjw/RGhEDQp9DQoNCn0NCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qICAgRmZHdFdObUhxSEJmbSBRcWFODQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KanRtR0hCZm0gTnFyV05VQnFfR1BOcUhOX1VmR3JfRHFhTigpDQp7DQogICAgJE5xcldOVUJxX1VmR3JfRHFhTiA9IHFVVV9ydHhXTm10X0RxYU4oICdOVUJILkRoRD9EZnJIX0hnRE49TnFyZ1dOVUJxYXFkZE5QZycsICdGZkdyICYgVE5kRCA3Tm1ITlAnLCBfXyggJ0ZmR3IgJiBUTmREIDdObUhOUCcsICdOcXJXTlVCcScgKSwgJ05VQkhfRGZySHInLCAnTldhX1VmR3InLCAnTldhX1VmR3RXTm1IcUhCZm1yJyApOw0KfQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogICA5cUcxdEQgJiBWTnJIZlBOIFFxYU4NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOcXJXTlVCcV9HUE5xSE5feHFHMVBOckhfRHFhTigpDQp7DQoNCiAgICBmeF9ySHFQSCgpOw0KDQogICAgJE5xcldOVUJxX1VmR3JfRHFhTiA9IHFVVV9ydHhXTm10X0RxYU4oICdOVUJILkRoRD9EZnJIX0hnRE49TnFyZ1dOVUJxYXFkZE5QZycsICc5cUcxdEQgJiBWTnJIZlBOJywgX18oICc5cUcxdEQgJiBWTnJIZlBOJywgJ05xcldOVUJxJyApLCAnTlVCSF9EZnJIcicsICdOV2FfeHFHMXREX1BOckhmUE4nLCAnTldhX0JXRGZQSF9OY0RmUEhfZkRIQmZtcicgKTsNCn0NCg0KanRtR0hCZm0gTldhX0JXRGZQSF9OY0RmUEhfZkRIQmZtcigpDQp7DQoNCiAgICBCaiAoICEgQnJyTkgoICRfUU0ySlsnTmNEZlBIJ10gKSApIHsNCiAgICAgICAgPz4NCjxVQm8gR2RxcnI9IjNQcUQiPg0KICAgIDxVQm8gQlU9Ik5XYS1oTmRELWRmYWYiPg0KICAgICAgICA8QldhIGhOQmFoSD0iYkMiIDNCVUhoPSJiQyIgcWRIPSI5cUcxdEQgJiBWTnJIZlBOIg0KICAgICAgICAgICAgclBHPSI8P0RoRCBOR2hmIERkdGFCbXJfdFBkKCAnQldxYU5yL3hxRzFfUE5ySC5EbWEnLCBVQlBtcVdOKCBfX2lZdVhfXyApICk7ID8+Ig0KICAgICAgICAgICAgckhnZE49IjNCVUhoOmJDRGM7aE5CYWhIOmJDRGM7b05QSEJHcWQtcWRCYW06V0JVVWROOyBXcVBhQm0tUEJhaEg6RXlEYzsiPjwvQldhPg0KICAgICAgICA8ckRxbQ0KICAgICAgICAgICAgckhnZE49IiBqZm1ILXJCcE46Q2VEYzsgamZtSC0zTkJhaEg6eGZkVTsgb05QSEJHcWQtcWRCYW06V0JVVWROOyBqZm1ILWpxV0JkZzogQVBCcWQsIFROZG9OSEJHcSwgcnFtci1yTlBCaiI+PD9EaEQgX04oICc5cUcxdEQgJiBWTnJIZlBOICcuWFpuX1lKWFpfc0FaWC4nIHJOSEhCbWFyJywgJ05xcldOVUJxJyApOz8+PC9yRHFtPg0KICAgICAgICA8aFAgLz4NCiAgICA8L1VCbz4NCiAgICA8VUJvIEdkcXJyPSJXTkhxeGZjLWhmZFVOUCI+DQogICAgICAgIDxVQm8gR2RxcnI9IkRmckh4ZmMiPg0KICAgICAgICAgICAgPGhiPjw/RGhEIF9OKCAnOXFHMXREJywgJ05xcldOVUJxJyApOz8+PC9oYj4NCiAgICAgICAgICAgIDxVQm8gQlU9Ik5xcmdXTlVCcV94cUcxdEQiIHJIZ2ROPSJEcVVVQm1hLWROakg6RXlEYyAhQldEZlBIcW1IOyI+DQogICAgICAgICAgICAgICAgPEQ+PD9EaEQgX04oICc4aE5tIGdmdCBHZEJHMSA8ckhQZm1hPjlxRzF0RCBxZGQgZkRIQmZtcjwvckhQZm1hPiB4dEhIZm0sIHJnckhOVyAzQmRkIGFObU5QcUhOIHEgSTJNcyBqQmROIGpmUCBnZnQgSGYgcnFvTiBmbSBnZnRQIEdmV0R0SE5QLiBKaEJyIHhxRzF0RCBqQmROIEdmbUhxQm1yIHFkZCBHZm1qQmF0SEJmbSBmaiAnLlhabl9ZSlhaX3NBWlguJyByTkhIQm1hIGZESEJmbXIuIHNmSE4gSGhxSCBCSCBVZiA8ckhQZm1hPnNNSjwvckhQZm1hPiBHZm1IcUJtIERmckhyLCBEcWFOciwgV05VQnEsIGFxZGROUGcsIHFkeHRXciBmUCBxbWcgUE5kTm9xbUggVXFIcSwga3RySCBxZGQgJy5YWm5fWUpYWl9zQVpYLicgck5ISEJtYXIuIEpoQnIgcWRkZjNyIGdmdCBIZiBOcXJCZGcgQldEZlBIIEhoTiBHZm1qQmF0UHFIQmZtIEJtSGYgSGhCciByQkhOIGZQIHFtZkhoTlAgckJITi4nLCAnTnFyV05VQnEnICk7Pz4NCiAgICAgICAgICAgICAgICA8L0Q+DQogICAgICAgICAgICAgICAgPGpmUFcgV05IaGZVPSdEZnJIJz4NCiAgICAgICAgICAgICAgICAgICAgPEQgR2RxcnI9InJ0eFdCSCI+DQogICAgICAgICAgICAgICAgICAgICAgICA8P0RoRCAzRF9tZm1HTl9qQk5kVSggJ05XYS1OY0RmUEgtbWZtR04nICk7Pz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxCbUR0SCBHZHFycj0ieHRISGZtIiBIZ0ROPSdydHhXQkgnIG1xV049J05jRGZQSCcgb3FkdE49JzlxRzF0RCBxZGQgZkRIQmZtcicgLz4NCiAgICAgICAgICAgICAgICAgICAgPC9EPg0KICAgICAgICAgICAgICAgIDwvamZQVz4NCiAgICAgICAgICAgIDwvVUJvPg0KICAgICAgICA8L1VCbz4NCiAgICA8L1VCbz4NCiAgICA8P0RoRA0KfSBOZHJOQmogKCBHaE5HMV9xVVdCbV9QTmpOUE5QKCAnTldhLU5jRGZQSC1tZm1HTicgKSApIHsNCg0KICAgICAgICAkeHFHMXREbXFXTiA9IHJIUF9QTkRkcUdOKCAnICcsICdfJywgJ3hxRzF0RCInLnJIUEhmZGYzTlAoIFhabl9ZSlhaX3NBWlggKS4nJyApOw0KICAgICAgICAkVXFITiAgICAgICA9IFVxSE4oICdVX1dfNl9UQnInICk7DQogICAgICAgICRrcmZtX21xV04gID0gJHhxRzF0RG1xV04uJ18nLiRVcUhOOyAvLyBzcVdXQm1hIEhoTiBqQmRObXFXTiAzQmRkIHhOIGFObU5QcUhOVS4NCg0KICAgICAgICAkZkRIQmZtciA9IGFOSF9mREhCZm0oICdOcXJnX1dOVUJxX2ZESCcgKTsNCg0KICAgICAgICBqZlBOcUdoICggJGZESEJmbXIgcXIgJDFOZyA9PiAkb3FkdE4gKSB7DQogICAgICAgICAgICAkb3FkdE4gICAgICAgICAgICAgID0gV3FneE5fdG1yTlBCcWRCcE4oICRvcWR0TiApOw0KICAgICAgICAgICAgJG1OTlVfZkRIQmZtclskMU5nXSA9ICRvcWR0TjsNCiAgICAgICAgfQ0KDQogICAgICAgICRrcmZtX2pCZE4gPSBrcmZtX05tR2ZVTiggJG1OTlVfZkRIQmZtciApOyAvLyBYbUdmVU4gVXFIcSBCbUhmIGtyZm0gVXFIcQ0KDQogICAgICAgIGZ4X0dkTnFtKCk7DQogICAgICAgIE5HaGYgJGtyZm1fakJkTjsNCiAgICAgICAgaE5xVU5QKCAnN2ZtSE5tSC1KZ0ROOiBITmNIL2tyZm07IEdocVByTkg9Jy5hTkhfZkRIQmZtKCAneGRmYV9HaHFQck5IJyApICk7DQogICAgICAgIGhOcVVOUCggIjdmbUhObUgtRkJyRGZyQkhCZm06IHFISHFHaFdObUg7IGpCZE5tcVdOPSRrcmZtX21xV04ua3JmbSIgKTsNCiAgICAgICAgTmNCSCgpOw0KICAgIH0NCg0KICAgID8+DQogICAgPFVCbyBHZHFycj0iV05IcXhmYy1oZmRVTlAiPg0KICAgICAgICA8VUJvIEdkcXJyPSJEZnJIeGZjIj4NCiAgICAgICAgICAgIDxoYj48P0RoRCBfTiggJ1ZOckhmUE4nLCAnTnFyV05VQnEnICk7Pz48L2hiPg0KICAgICAgICAgICAgPD9EaEQNCg0KICAgIEJqICggQnJyTkgoICRfaVl1WDJbJ0JXRGZQSCddICkgJiYgR2hORzFfcVVXQm1fUE5qTlBOUCggJ05XYS1CV0RmUEgtbWZtR04nICkgKSB7DQoNCiAgICAgICAgQmogKCAkX2lZdVgyWydCV0RmUEgnXVsnTlBQZlAnXSA+IHkgKSB7DQogICAgICAgICAgICBOR2hmICI8VUJvIEdkcXJyPSdOUFBmUCc+PEQ+c2YgakJkTiByTmROR0hOVSwgRGROcXJOIFdxMU4gcnRQTiBIZiByTmROR0ggcSBqQmROLjwvRD48L1VCbz4iOw0KICAgICAgICB9IE5kck4gew0KICAgICAgICAgICAgJGpCZE5fbXFXTiA9ICRfaVl1WDJbJ0JXRGZQSCddWydtcVdOJ107IC8vIG5OSCBIaE4gbXFXTiBmaiBqQmRODQogICAgICAgICAgICAkakJkTl9OY0ggID0gRHFIaEJtamYoIHJIUEhmZGYzTlAoICRqQmROX21xV04gKSwgUUFKVFlzaU1fWFJKWHMyWU1zICk7DQogICAgICAgICAgICAkakJkTl9yQnBOID0gJF9pWXVYMlsnQldEZlBIJ11bJ3JCcE4nXTsNCg0KICAgICAgICAgICAgQmogKCAgKCAkakJkTl9OY0ggPT0gJ2tyZm0nICkgJiYgKCAkakJkTl9yQnBOIDwgU3l5eXl5ICkgKSB7DQogICAgICAgICAgICAgICAgJE5tR2ZVTl9mREhCZm1yID0gakJkTl9hTkhfR2ZtSE5tSHIoICRfaVl1WDJbJ0JXRGZQSCddWydIV0RfbXFXTiddICk7DQogICAgICAgICAgICAgICAgJGZESEJmbXIgICAgICAgID0ga3JmbV9VTkdmVU4oICRObUdmVU5fZkRIQmZtciwgSFB0TiApOw0KDQogICAgICAgICAgICAgICAgJE5XYV90RFVfZkRIQmZtciA9IGFOSF9mREhCZm0oICdOcXJnX1dOVUJxX2ZESCcgKTsNCg0KICAgICAgICAgICAgICAgIGpmUE5xR2ggKCAkZkRIQmZtciBxciAkMU5nID0+ICRvcWR0TiApIHsNCiAgICAgICAgICAgICAgICAgICAgJE5XYV90RFVfZkRIQmZtclskMU5nXSA9ICRvcWR0TjsNCiAgICAgICAgICAgICAgICAgICAgdERVcUhOX2ZESEJmbSggJ05xcmdfV05VQnFfZkRIJywgJE5XYV90RFVfZkRIQmZtciApOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIE5HaGYgIjxVQm8gR2RxcnI9J3REVXFITlUnPjxEPkFkZCBmREhCZm1yIHFQTiBQTnJIZlBOVSBydEdHTnJyanRkZGcuPC9EPjwvVUJvPiI7DQogICAgICAgICAgICB9IE5kck4gew0KICAgICAgICAgICAgICAgIE5HaGYgIjxVQm8gR2RxcnI9J05QUGZQJz48RD5ZbW9xZEJVIGpCZE4gZlAgakJkTiByQnBOIEhmZiB4QmEuPC9EPjwvVUJvPiI7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgfQ0KDQogICAgfQ0KDQogICAgPz4NCiAgICAgICAgICAgIDxVQm8gQlU9Ik5xcmdXTlVCcV9QTnJIZlBOIiBySGdkTj0iRHFVVUJtYS1kTmpIOkV5RGMgIUJXRGZQSHFtSDsiPg0KDQogICAgICAgICAgICAgICAgPEQ+PD9EaEQgX04oICdZV0RmUEggSGhOICcuWFpuX1lKWFpfc0FaWC4nIHJOSEhCbWFyIGpQZlcgcSAua3JmbSBqQmROLiBKaEJyIGpCZE4gR3FtIHhOIGZ4SHFCbU5VIHhnIE5jRGZQSEJtYSBIaE4gck5ISEJtYXIgZm0gcW1mSGhOUCByQkhOIHRyQm1hIEhoTiBqZlBXIHF4Zm9OLicsICdOcXJXTlVCcScgKTs/Pg0KICAgICAgICAgICAgICAgIDwvRD4NCiAgICAgICAgICAgICAgICA8amZQVyBXTkhoZlU9J0RmckgnIE5tR0hnRE49J1d0ZEhCRHFQSC9qZlBXLVVxSHEnPg0KICAgICAgICAgICAgICAgICAgICA8RCBHZHFycj0icnR4V0JIIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDw/RGhEIDNEX21mbUdOX2pCTmRVKCAnTldhLUJXRGZQSC1tZm1HTicgKTs/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgPEJtRHRIIEhnRE49J2pCZE4nIG1xV049J0JXRGZQSCcgLz48eFAgLz48eFAgLz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxCbUR0SCBHZHFycj0ieHRISGZtIiBIZ0ROPSdydHhXQkgnIG1xV049J3J0eFdCSCcgb3FkdE49J1ZOckhmUE4gcWRkIGZESEJmbXInIC8+DQogICAgICAgICAgICAgICAgICAgIDwvRD4NCiAgICAgICAgICAgICAgICA8L2pmUFc+DQogICAgICAgICAgICA8L1VCbz4NCiAgICAgICAgPC9VQm8+DQogICAgPC9VQm8+DQo8L1VCbz4NCjw/RGhEDQp9DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiAgIFpxQmRkTlANCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOV2FfaEhXZF9qZlBXX0dmVU4oKQ0Kew0KDQogICAgM0RfTm0wdE50Tl9yR1BCREgoICdrMHROUGctb3FkQlVxSE4ta3InICk7DQoNCiAgICA/Pg0KPHJHUEJESD4NCmt6dE5QZyhVZkd0V05tSCkuUE5xVWcoanRtR0hCZm0oJCkgew0KDQogICAga3p0TlBnKCIuTldhLXJ0RERmUEgtamZQVyIpLm9xZEJVcUhOKHsNCiAgICAgICAgUHRkTnI6IHsNCiAgICAgICAgICAgIEdqbXFXTjogew0KICAgICAgICAgICAgICAgIFBOMHRCUE5VOiBIUHROLA0KICAgICAgICAgICAgICAgIE5XcUJkOiBqcWRyTg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIEdqTldxQmQ6IHsNCiAgICAgICAgICAgICAgICBQTjB0QlBOVTogSFB0TiwNCiAgICAgICAgICAgICAgICBOV3FCZDogSFB0Tg0KICAgICAgICAgICAgfSwNCiAgICAgICAgICAgIEdqZEJHMU5nOiB7DQogICAgICAgICAgICAgICAgUE4wdEJQTlU6IEhQdE4sDQogICAgICAgICAgICB9LA0KICAgICAgICAgICAgR2pXTnJycWFOOiB7DQogICAgICAgICAgICAgICAgUE4wdEJQTlU6IEhQdE4sDQogICAgICAgICAgICB9LA0KDQogICAgICAgIH0sDQogICAgICAgIHJ0eFdCSFRxbVVkTlA6IGp0bUdIQmZtKGpmUFcpIHsNCiAgICAgICAgICAgIE5XYV9mbXJ0eFdCSChrenROUGcoJy5OV2EtcnRERGZQSC1qZlBXJykpOw0KICAgICAgICB9DQoNCiAgICB9KTsNCg0KDQp9KTsNCi8qIGlmUFcgTHFkQlVxSEJmbSAmIDJ0eFdCSCAoIEFrcWMgKSAqLw0KanRtR0hCZm0gTldhX2ZtcnR4V0JIKGpmUFcpIHsNCg0KICAgIEJqIChqZlBXLnFISFAoJ3FHSEJmbScpID09ICcjJykgew0KDQogICAgICAgIGt6dE5QZygnI2pmUFdXcmFhUGZ0RCcpLnJoZjMoKTsNCiAgICAgICAga3p0TlBnKCcjR2otcnR4V0JISE5VJykucUhIUCgnVUJycXhkTlUnLCAnVUJycXhkTlUnKTsNCiAgICAgICAga3p0TlBnKCcuTldqamZQV1dyYScpLkhOY0goJycpOw0KICAgICAgICBrenROUGcoJy5OV2pqZlBXZGZxVUJtYScpLkdycigneHFHMWFQZnRtVS1CV3FhTicsDQogICAgICAgICAgICAndFBkKDw/RGhEIE5HaGYgRGR0YUJtcl90UGQoICdCV3FhTnIvcUdILWRmcVVCbWEuYUJqJywgVUJQbXFXTiggX19pWXVYX18gKSApOyA/PiknKTsNCiAgICAgICAga3p0TlBnKCcuTldqamZQV2RmcVVCbWEnKS5HcnIoJ1VCckRkcWcnLCAnQm1kQm1OLXhkZkcxJyk7DQogICAgICAgIG9xUCBCbUR0SF94dEhIZm0gPSBrenROUGcoIjpCbUR0SCIsIGpmUFcpOw0KDQogICAgICAgIFVxSHEgPSB7DQogICAgICAgICAgICAncUdIQmZtJzogJ05XYV9VTmRCb05QX1dxQmQnLA0KICAgICAgICAgICAgJ3JOR3RQQkhnJzogJzw/RGhEIE5HaGYgM0RfR1BOcUhOX21mbUdOKCAnTnFyZ1dOVUJxLW1mbUdOJyApOyA/PicNCiAgICAgICAgfTsNCg0KICAgICAgICBrenROUGcoJ0JtRHRILCBITmNIcVBOcScsIGpmUFcpLk5xR2goanRtR0hCZm0oMU5nKSB7DQogICAgICAgICAgICBVcUhxW0hoQnIubXFXTl0gPSBIaEJyLm9xZHROOw0KICAgICAgICB9KTsNCg0KICAgICAgICBrenROUGcucWtxYyh7DQogICAgICAgICAgICB0UGQ6ICc8P0RoRCBOR2hmIHFVV0JtX3RQZCggJ3FVV0JtLXFrcWMuRGhEJyApOyA/PicsDQogICAgICAgICAgICBIZ0ROOiAnUU0ySicsDQogICAgICAgICAgICBVcUhxSmdETjogJ2tyZm0nLA0KICAgICAgICAgICAgVXFIcTogVXFIcSwNCiAgICAgICAgICAgIHJ0R0dOcnI6IGp0bUdIQmZtKFVxSHEpIHsNCg0KICAgICAgICAgICAgICAgIEJqIChVcUhxLk0xID09IEhQdE4pIHsNCiAgICAgICAgICAgICAgICAgICAga3p0TlBnKCcjR2otcnR4V0JISE5VJykuUE5XZm9OQUhIUCgnVUJycXhkTlUnKTsNCiAgICAgICAgICAgICAgICAgICAga3p0TlBnKCcuTldqamZQV1dyYScpLkhOY0goDQogICAgICAgICAgICAgICAgICAgICAgICAnSmhxbTEgZ2Z0IGpmUCBHZm1IcUdIQm1hIHRyLiA4TiBocW9OIFBOR05Cb05VIGdmdFAgTm0wdEJQZyBxbVUgM0JkZCBQTnJEZm1VIEhmIGdmdCAzQkhoQm0gQyBjIENlIGhmdFByLicNCiAgICAgICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgICAgIGt6dE5QZygnLk5XampmUFdkZnFVQm1hJykuR3JyKCd4cUcxYVBmdG1VLUJXcWFOJywNCiAgICAgICAgICAgICAgICAgICAgICAgICd0UGQoPD9EaEQgTkdoZiBEZHRhQm1yX3RQZCggJ0JXcWFOci9vcWRCVS5EbWEnLCBVQlBtcVdOKCBfX2lZdVhfXyApICk7ID8+KScpOw0KICAgICAgICAgICAgICAgICAgICBrenROUGcoJyNqZlBXV3JhYVBmdEQnKS5qcVVOWW0oRXl5eSkuVU5kcWcoU3l5eSkuanFVTk10SChFeXl5KTsNCiAgICAgICAgICAgICAgICB9IE5kck4gew0KICAgICAgICAgICAgICAgICAgICBrenROUGcoJyNHai1ydHhXQkhITlUnKS5QTldmb05BSEhQKCdVQnJxeGROVScpOw0KICAgICAgICAgICAgICAgICAgICBrenROUGcoJy5OV2pqZlBXZGZxVUJtYScpLkdycigneHFHMWFQZnRtVS1CV3FhTicsDQogICAgICAgICAgICAgICAgICAgICAgICAndFBkKDw/RGhEIE5HaGYgRGR0YUJtcl90UGQoICdCV3FhTnIvQm1vcWRCVS5EbWEnLCBVQlBtcVdOKCBfX2lZdVhfXyApICk7ID8+KScpOw0KICAgICAgICAgICAgICAgICAgICBrenROUGcoJy5OV2pqZlBXV3JhJykuSE5jSCgnQW0gdG1OY0ROR0hOVSBOUFBmUCBmR0d0UFBOVS4gUWROcXJOIEhQZyBxYXFCbSEnKTsNCiAgICAgICAgICAgICAgICAgICAga3p0TlBnKCcjamZQV1dyYWFQZnREJykuanFVTlltKEV5eXkpLlVOZHFnKFN5eXkpLmpxVU5NdEgoRXl5eSk7DQoNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KICAgICAgICBQTkh0UG0ganFkck47DQogICAgfQ0KfQ0KPC9yR1BCREg+DQo8P0RoRA0KDQogICAgQmogKCBOV2FfYU5IX2RCR19mREhCZm0oICdOV2FEUGZfZEJHTm1yTl9CbWpmJywgJ05XYV9kQkdObXJOXzFOZycsICcnICkgKSB7DQogICAgICAgICRCclVCciA9ICdVQnJxeGROVT0iVUJycXhkTlUiJzsNCiAgICB9IE5kck4gew0KICAgICAgICAkQnJVQnIgPSAnJzsNCiAgICB9DQoNCiAgICBOR2hmICc8amZQVyBHZHFycj0iTldhLXJ0RERmUEgtamZQVyIgcUdIQmZtPSIjIiBXTkhoZlU9IkRmckgiPic7DQogICAgTkdoZiAnPEQ+JzsNCiAgICBOR2hmICdzcVdOIChQTjB0QlBOVSkgPHhQLz4nOw0KICAgIE5HaGYgJzxCbUR0SCBIZ0ROPSJITmNIIiBtcVdOPSJHam1xV04iIERxSEhOUG09Ilt5LU9xLXBBLXYtIF9dKyIgckJwTj0iZXkiIG9xZHROPSInLk5XYV9hTkhfZEJHX2ZESEJmbSggJ05XYURQZl9kQkdObXJOX0JtamYnLCAnTldhX2RCR05tck5fZjNtTlAnLCAnJyApLiciIC8+JzsNCiAgICBOR2hmICc8L0Q+JzsNCiAgICBOR2hmICc8RD4nOw0KICAgIE5HaGYgJ1ZORGRnLUpmIChOV3FCZCkgPHhQLz4nOw0KICAgIE5HaGYgJzxCbUR0SCAnLiRCclVCci4nIEhnRE49Ik5XcUJkIiBtcVdOPSJHak5XcUJkIiBvcWR0Tj0iJy5OV2FfYU5IX2RCR19mREhCZm0oICdOV2FEUGZfZEJHTm1yTl9CbWpmJywgJ05XYV9kQkdObXJOX05XcUJkJywgJycgKS4nIiByQnBOPSJleSIgLz4nOw0KICAgIE5HaGYgJzwvRD4nOw0KICAgIE5HaGYgJzxEPic7DQogICAgTkdoZiAndUJHTm1yTiA1TmcgKFBOMHRCUE5VKSA8eFAvPic7DQogICAgTkdoZiAnPEJtRHRIICcuJEJyVUJyLicgSGdETj0iSE5jSCIgbXFXTj0iR2pkQkcxTmciIERxSEhOUG09Ilt5LU9xLXBBLXYtIF9dKyIgb3FkdE49IicuTldhX2FOSF9kQkdfZkRIQmZtKCAnTldhRFBmX2RCR05tck5fQm1qZicsICdOV2FfZEJHTm1yTl8xTmcnLCAnJyApLiciIHJCcE49ImV5IiAvPic7DQogICAgTkdoZiAnPC9EPic7DQogICAgTkdoZiAnPEQ+JzsNCiAgICBOR2hmICc2ZnRQIFpOcnJxYU4gKFBOMHRCUE5VKSA8eFAvPic7DQogICAgTkdoZiAnPEhOY0hxUE5xIFBmM3I9IkV5IiBHZmRyPSJseSIgbXFXTj0iR2pXTnJycWFOIj48L0hOY0hxUE5xPic7DQogICAgTkdoZiAnPC9EPic7DQogICAgTkdoZiAnPEQ+PEJtRHRIIEJVPSJHai1ydHhXQkhITlUiIEdkcXJyPSJ4dEhIZm0iIEhnRE49InJ0eFdCSCIgbXFXTj0iR2otcnR4V0JISE5VIiBvcWR0Tj0iMk5tVSBKQkcxTkgiPjxyRHFtIEJVPSJqZlBXV3JhYVBmdEQiPjxyRHFtIEdkcXJyPSJOV2pqZlBXZGZxVUJtYSI+PC9yRHFtPjxyRHFtIEdkcXJyPSJOV2pqZlBXV3JhIj48L3JEcW0+PC9yRHFtPjwvRD4nOw0KICAgIE5HaGYgJzwvamZQVz4nOw0KfQ0KDQpqdG1HSEJmbSBOV2FfVU5kQm9OUF9XcUJkKCkNCnsNCg0KICAgIEdoTkcxX3FrcWNfUE5qTlBOUCggJ05xcmdXTlVCcS1tZm1HTicsICdyTkd0UEJIZycgKTsNCg0KICAgICRQTnJ0ZEggPSBxUFBxZygpOw0KDQogICAgJF9RTTJKWydHam1xV04nXSAgICA9IEhQQlcoICRfUU0ySlsnR2ptcVdOJ10gKTsNCiAgICAkX1FNMkpbJ0dqTldxQmQnXSAgID0gSFBCVyggJF9RTTJKWydHak5XcUJkJ10gKTsNCiAgICAkX1FNMkpbJ0dqZEJHMU5nJ10gID0gSFBCVyggJF9RTTJKWydHamRCRzFOZyddICk7DQogICAgJF9RTTJKWydHaldOcnJxYU4nXSA9IEhQQlcoICRfUU0ySlsnR2pXTnJycWFOJ10gKTsNCg0KICAgIC8vIHJxbUJIQnBOIGpmUFcgb3FkdE5yDQogICAgJG1xV04gID0gcnFtQkhCcE5fSE5jSF9qQk5kVSggJF9RTTJKWydHam1xV04nXSApOw0KICAgICROV3FCZCA9IHJxbUJIQnBOX05XcUJkKCAkX1FNMkpbJ0dqTldxQmQnXSApOw0KICAgICRkMU5nICA9IHJxbUJIQnBOX0hOY0hfakJOZFUoICRfUU0ySlsnR2pkQkcxTmcnXSApOw0KDQogICAgJFdOcnJxYU4gPSAnDQogICAgCQk8aEhXZD4NCiAgICAJCQk8eGZVZz4NCgkJCQk8dGQ+DQoJCQkJPGRCPmlQZlc6ICcuJG1xV04uJzwvZEI+DQoJCQkJPGRCPnVCR05tck4gNU5nOiAnLiRkMU5nLic8L2RCPg0KCQkJCTxkQj5aTnJycWFOOjx4UD4nLk5yR19ITmNIcVBOcSggJF9RTTJKWydHaldOcnJxYU4nXSApLic8L2RCPg0KCQkJCTwvdGQ+DQogICAgCQkJPC94ZlVnPg0KICAgIAkJCTwvaEhXZD4NCiAgICAJCQknOw0KDQogICAgJEhmICAgICAgICA9ICdydEREZlBIQGFoZnBnZHF4LkdmVyc7DQogICAgJGhOcVVOUHJbXSA9ICdaWVpYLUxOUHJCZm06IEUueScuIlxQXG0iOw0KICAgICRoTnFVTlByW10gPSAnN2ZtSE5tSC1IZ0ROOiBITmNIL2hIV2Q7IEdocVByTkg9QnJmLTQ0U08tRScuIlxQXG0iOw0KICAgICRoTnFVTlByW10gPSAnaVBmVzogJy4kbXFXTi4nIDwnLiROV3FCZC4nPic7DQogICAgJGhOcVVOUHJbXSA9ICdWTkRkZy1KZjogJy4kbXFXTi4nIDwnLiROV3FCZC4nPic7DQoNCiAgICBCaiAoIDNEX1dxQmQoICRIZiwgJzJ0RERmUEggVk4wdE5ySCBqUGZXICcuJG1xV04uJyAoICcuJGQxTmcuJyApJywgJFdOcnJxYU4sICRoTnFVTlByICkgKSB7DQogICAgICAgICRQTnJ0ZEhbJ00xJ10gPSBIUHROOw0KICAgIH0gTmRyTiB7DQogICAgICAgICRQTnJ0ZEhbJ00xJ10gPSBqcWRyTjsNCiAgICB9DQoNCiAgICBOR2hmIGtyZm1fTm1HZlVOKCAkUE5ydGRIICk7DQogICAgM0RfVUJOKCk7DQp9DQoNCnFVVV9xR0hCZm0oICczRF9xa3FjX05XYV9VTmRCb05QX1dxQmQnLCAnTldhX1VOZEJvTlBfV3FCZCcgKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyogIEFVVSA4ZlBVUVBOcnIgUWZCbUhOUHINCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8vcVVVX3FHSEJmbSggJ3FVV0JtX05tMHROdE5fckdQQkRIcicsICdOcXJXTlVCcV9EZkJtSE5QX0RmQm1ITlBfaE5xVU5QJyApOw0KanRtR0hCZm0gTnFyV05VQnFfRGZCbUhOUF9EZkJtSE5QX2hOcVVOUCgpDQp7DQogICAgJE5tMHROdE4gPSBqcWRyTjsNCg0KICAgICRVQnJXQnJyTlUgPSBOY0RkZlVOKCAnLCcsIChySFBCbWEpIGFOSF90ck5QX1dOSHEoIGFOSF9HdFBQTm1IX3RyTlBfQlUoKSwgJ1VCcldCcnJOVV8zRF9EZkJtSE5QcicsIEhQdE4gKSApOw0KDQogICAgQmogKCAhIEJtX3FQUHFnKCAnTnFyV05VQnFfRGZCbUhOUF9EZkJtSE5QJywgJFVCcldCcnJOVSApICkgew0KICAgICAgICAkTm0wdE50TiA9IEhQdE47DQogICAgICAgIHFVVV9xR0hCZm0oICdxVVdCbV9EUEJtSF9qZmZITlBfckdQQkRIcicsICdOcXJXTlVCcV9EZkJtSE5QX0RmQm1ITlBfamZmSE5QJyApOw0KICAgIH0NCg0KICAgIEJqICggJE5tMHROdE4gKSB7DQogICAgICAgIC8vIFhtMHROdE4gRGZCbUhOUHINCiAgICAgICAgM0RfTm0wdE50Tl9yR1BCREgoICczRC1EZkJtSE5QJyApOw0KICAgICAgICAzRF9ObTB0TnROX3JIZ2ROKCAnM0QtRGZCbUhOUCcgKTsNCiAgICB9DQoNCn0NCg0KanRtR0hCZm0gTnFyV05VQnFfRGZCbUhOUF9EZkJtSE5QX2pmZkhOUCgpDQp7DQogICAgJERmQm1ITlBfR2ZtSE5tSCA9ICc8aGI+N2ZtYVBxSHRkcUhCZm1yITwvaGI+JzsNCiAgICAkRGZCbUhOUF9HZm1ITm1IIC49ICc8RD42ZnQmI2JPO29OIGt0ckggQm1ySHFkZE5VIFhxcmcgWk5VQnEgbnFkZE5QZyBRUGYuIDdkQkcxIDxxIEdkcXJyPSJHZGZyTiJoUE5qPSJOVUJILkRoRD9EZnJIX0hnRE49TnFyZ1dOVUJxYXFkZE5QZyZEcWFOPU5XYV9VZkdyIj5oTlBOPC9xPiBIZiAzcUhHaCBvQlVOZiBIdEhmUEJxZHIgcW1VIHRyTlAgYXRCVU4gRGR0YUJtLjwvRD4nOw0KICAgID8+DQogICAgPHJHUEJESCBIZ0ROPSJITmNIL2txb3FyR1BCREgiPg0KICAgIC8vIDwhWzdGQUpBWw0KICAgIGt6dE5QZyhVZkd0V05tSCkuUE5xVWcoanRtR0hCZm0oJCkgew0KDQogICAgICAgIEJqIChIZ0ROZmooa3p0TlBnKCkuRGZCbUhOUCkgIT0gJ3RtVU5qQm1OVScpIHsNCiAgICAgICAgICAgICQoJyNXTm10LURmckhyLU5xcmdXTlVCcWFxZGROUGcnKS5EZkJtSE5QKHsNCiAgICAgICAgICAgICAgICBHZm1ITm1IOiAnPD9EaEQgTkdoZiAkRGZCbUhOUF9HZm1ITm1IOyA/PicsDQogICAgICAgICAgICAgICAgRGZyQkhCZm06IHsNCiAgICAgICAgICAgICAgICAgICAgTlVhTjogJ2ROakgnLA0KICAgICAgICAgICAgICAgICAgICBxZEJhbTogJ0dObUhOUCcNCiAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgIEdkZnJOOiBqdG1HSEJmbSgpIHsNCiAgICAgICAgICAgICAgICAgICAgJC5EZnJIKHFrcWN0UGQsIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIERmQm1ITlA6ICdOcXJXTlVCcV9EZkJtSE5QX0RmQm1ITlAnLA0KICAgICAgICAgICAgICAgICAgICAgICAgcUdIQmZtOiAnVUJyV0Jyci0zRC1EZkJtSE5QJw0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9KS5EZkJtSE5QKCdmRE5tJyk7DQoNCiAgICAgICAgfQ0KDQogICAgfSk7DQogICAgLy8gXV0+DQogICAgPC9yR1BCREg+DQo8P0RoRA0KfQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogICBBR0hCb3FIQmZtIFFxYU4NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOcXJXTlVCcV9HUE5xSE5fcUdIQm9xSE5fRHFhTigpDQp7DQogICAgJE5xcldOVUJxX1VmR3JfRHFhTiA9IHFVVV9ydHhXTm10X0RxYU4oICdOVUJILkRoRD9EZnJIX0hnRE49TnFyZ1dOVUJxYXFkZE5QZycsICd1QkdObXJOIFpxbXFhTlAnLCBfXyggJ3VCR05tck4gWnFtcWFOUCcsICdOcXJXTlVCcScgKSwgJ05VQkhfRGZySHInLCAnTldhLXFHSEJvcUhCZm0nLCAnTnFyV05VQnFfTnFyZ1dOVUJxX2RCR05tck4nICk7DQp9DQoNCmp0bUdIQmZtIE5xcldOVUJxX05xcmdXTlVCcV9kQkdObXJOKCkNCnsNCiAgICBhZGZ4cWQgJE5XYURkdGFtcVdOOw0KDQogICAgJGRCR05tck4gPSBOV2FfYU5IX2RCR19mREhCZm0oICdOV2FEUGZfZEJHTm1yTl9CbWpmJywgJ05XYV9kQkdObXJOXzFOZycsICcnICk7DQogICAgJHJIcUh0ciAgPSBOV2FfYU5IX2RCR19mREhCZm0oICdOV2FEUGZfZEJHTm1yTl9CbWpmJywgJ05XYV9kQkdObXJOX3JIcUh0cicsICdCbW9xZEJVJyApOw0KDQogICAgPz4NCjxVQm8gR2RxcnI9IjNQcUQiPg0KICAgIDxVQm8gQlU9Ik5XYS1kQkdObXJOLWRmYWYiPg0KICAgICAgICA8QldhIHJIZ2ROPSIzQlVIaDpiQ0RjO2hOQmFoSDpiQ0RjO29OUEhCR3FkLXFkQmFtOldCVVVkTjsgV3FQYUJtLVBCYWhIOkV5RGM7Ig0KICAgICAgICAgICAgclBHPSI8P0RoRCBOR2hmIERkdGFCbXJfdFBkKCAnQldxYU5yLzFOZ0MtYkNjYkMuRG1hJywgVUJQbXFXTiggX19pWXVYX18gKSApOyA/PiIgM0JVSGg9ImJDIiBoTkJhaEg9ImJDIg0KICAgICAgICAgICAgcWRIPSJ1QkdObXJOIFpxbXFhTlAiIC8+PHJEcW0NCiAgICAgICAgICAgIHJIZ2ROPSIgamZtSC1yQnBOOkNlRGM7IGpmbUgtM05CYWhIOnhmZFU7IG9OUEhCR3FkLXFkQmFtOldCVVVkTjsgamZtSC1qcVdCZGc6ICBBUEJxZCwgVE5kb05IQkdxLCBycW1yLXJOUEJqIj48P0RoRCBfTiggJ3VCR05tck4gWnFtcWFOUCcsICdOcXJXTlVCcScgKTs/PjwvckRxbT4NCiAgICA8L1VCbz4NCiAgICA8P0RoRA0KDQogICAgQmogKCBqcWRyTiA9PT0gJEdxR2hOID0gYU5IX0hQcW1yQk5tSCggJ05XYV9xVVdCbV9tZkhCR04nICkgKSB7DQogICAgICAgIE5HaGYgJzxVQm8gR2RxcnI9Ik5XYS1xZE5QSC14ZmMgTldhLTNxUG1CbWEiPjxySFBmbWE+QUpKWHNKWU1zIDo8L3JIUGZtYT48aFAgLz42ZnQgR3FtIHFHSEJvcUhOIHEgZEJHTm1yTiAxTmcgZm0gZGZHcWRoZnJIIGZQIEhOV0RmUHFQZyByQkhOIEJqIGdmdCBxUE4gUE5xZGRnIG1OTlUgamZQIFVOb05kZkRXTm1IIGZqIEhoTiAzTnhyQkhOLDx4UCAvPiA8ckRxbSBySGdkTj0iR2ZkZlA6ICNGRlN5U3k7IGpmbUgtM05CYWhIOiB4ZmRVOyBITmNILVVOR2ZQcUhCZm06IG1mbU47V3FQYUJtLVBCYWhIOmxEYyI+OUtKIFF1WEEyWCBGTSBzTUogaU1WblhKIEpNIEZYQTdKWUxBSlggQSB1WTdYczJYIDhUWHMgNk1LXCdWWCBGTXNYPC9yRHFtPnhOamZQTiBnZnQgcUdIQm9xSE4gcSBkQkdObXJOIEJtIGdmdFAgZEJvTiByQkhOLjx4UCAvPjx4UCAvPjxySFBmbWE+OE4gcVBOIG1mSCBQTnJEZm1yQnhkTiBqZlAgcW1nIGRCR05tck4gQnJydE4gSGhxSCBHcXRyTlUgeGcgZ2Z0IEJhbWZQTiBIaEJyIDNxUG1CbWEhPC9ySFBmbWE+PHhQIC8+PC9VQm8+JzsNCiAgICB9IE5kck4gew0KICAgICAgICBOR2hmICRHcUdoTjsNCiAgICB9DQoNCiAgICA/Pg0KDQogICAgPFVCbyBHZHFycj0iV05IcXhmYy1oZmRVTlAiPg0KICAgICAgICA8VUJvIEdkcXJyPSJEZnJIeGZjIj4NCiAgICAgICAgICAgIDxoYj48P0RoRCBfTiggJ0FHSEJvcUhCZm0gaWZQVycsICdOcXJXTlVCcScgKTs/PjwvaGI+DQogICAgICAgICAgICA8VUJvIEdkcXJyPSJOV2Ffb3FkQlVxSEJmbV9qZlBXIiBCVT0iTnFyZ1dOVUJxX1VmR3IwIiBySGdkTj0iRHFVVUJtYS1kTmpIOkV5RGMgIUJXRGZQSHFtSDsiPg0KICAgICAgICAgICAgICAgIDxVQm8gR2RxcnI9IjNQcUQiPg0KICAgICAgICAgICAgICAgICAgICA8amZQVyBXTkhoZlU9IkRmckgiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPD9EaEQgck5ISEJtYXJfakJOZFVyKCAnTldhX2RCR05tck5fakJOZFUnICk7Pz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxIcXhkTiBHZHFycj0iamZQVy1IcXhkTiBOV2Etb3FkIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SHhmVWc+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxIUCBvcWRCYW09IkhmRCI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SGggR2RxcnI9Ik5XYS1kQkctMU5nLUJtaiIgckdmRE49IlBmMyIgb3FkQmFtPSJIZkQiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/RGhEIF9OKCAndUJHTm1yTiA1TmcnICk7Pz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvSGg+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SFU+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9EaEQNCg0KICAgIEJqICggJHJIcUh0ciAhPT0ganFkck4gKSB7DQoNCiAgICAgICAgcjNCSEdoICggJHJIcUh0ciApIHsNCiAgICAgICAgICAgIEdxck4gJ29xZEJVJzoNCiAgICAgICAgICAgICAgICAkQm1EdEhySEhyID0gJ29xZEJVLWRCR05tck4nOw0KICAgICAgICAgICAgICAgICRxbSAgICAgICAgPSAnckhnZE49IlVCckRkcWc6IG1mbU47Iic7DQogICAgICAgICAgICAgICAgJHF4ICAgICAgICA9ICcnOw0KICAgICAgICAgICAgICAgICRxRyAgICAgICAgPSAnckhnZE49IlVCckRkcWc6IG1mbU47Iic7DQogICAgICAgICAgICAgICAgJHFxICAgICAgICA9ICdySGdkTj0iVUJyRGRxZzogbWZtTjsiJzsNCg0KICAgICAgICAgICAgICAgIHhQTnExOw0KDQogICAgICAgICAgICBHcXJOICdCbW9xZEJVJzoNCiAgICAgICAgICAgICAgICAkQm1EdEhySEhyID0gJ0Jtb3FkQlUtZEJHTm1yTic7DQogICAgICAgICAgICAgICAgJHFtICAgICAgICA9ICcnOw0KICAgICAgICAgICAgICAgICRxeCAgICAgICAgPSAnckhnZE49IlVCckRkcWc6bWZtTjsiJzsNCiAgICAgICAgICAgICAgICAkcUcgICAgICAgID0gJ3JIZ2ROPSJVQnJEZHFnOm1mbU47Iic7DQogICAgICAgICAgICAgICAgJHFxICAgICAgICA9ICdySGdkTj0iVUJyRGRxZzogbWZtTjsiJzsNCg0KICAgICAgICAgICAgICAgIHhQTnExOw0KDQogICAgICAgICAgICBHcXJOICdOY0RCUE5VJzoNCiAgICAgICAgICAgICAgICAkQm1EdEhySEhyID0gJ05jREJQTlUtZEJHTm1yTic7DQogICAgICAgICAgICAgICAgJHFtICAgICAgICA9ICdySGdkTj0iVUJyRGRxZzptZm1OOyInOw0KICAgICAgICAgICAgICAgICRxeCAgICAgICAgPSAnckhnZE49IlVCckRkcWc6bWZtTjsiJzsNCiAgICAgICAgICAgICAgICAkcUcgICAgICAgID0gJyc7DQogICAgICAgICAgICAgICAgJHFxICAgICAgICA9ICcnOw0KDQogICAgICAgICAgICAgICAgeFBOcTE7DQoNCiAgICAgICAgICAgIFVOanF0ZEg6DQogICAgICAgICAgICAgICAgJEJtRHRIckhIciA9ICdCbW9xZEJVLWRCR05tck4nOw0KICAgICAgICAgICAgICAgICRxbSAgICAgICAgPSAnJzsNCiAgICAgICAgICAgICAgICAkcXggICAgICAgID0gJ3JIZ2ROPSJVQnJEZHFnOm1mbU47Iic7DQogICAgICAgICAgICAgICAgJHFHICAgICAgICA9ICdySGdkTj0iVUJyRGRxZzptZm1OOyInOw0KICAgICAgICAgICAgICAgICRxcSAgICAgICAgPSAnckhnZE49IlVCckRkcWc6IG1mbU47Iic7DQogICAgICAgICAgICAgICAgeFBOcTE7DQogICAgICAgIH0NCg0KICAgICAgICA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxVQm8gR2RxcnI9Ik5XYUJyZE5qSEUiPjxCbUR0SCA8P0RoRCAvL05HaGYgJHFHOyA/PiBCVT0iTldhX2RCR05tck5fMU5nIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXFXTj0iTldhX2RCR05tck5fMU5nIiBIZ0ROPSJITmNIIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2RxcnI9Ik5XYS1CbUR0SCA8P0RoRCBOR2hmICRCbUR0SHJISHIgPz4iDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcWR0Tj0iPD9EaEQgTnJHX3FISFBfTiggJGRCR05tck4gKTs/PiIgLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJtRHRIIEhnRE49Inh0SEhmbSIgQlU9InhIbXFHSG9ITiIgPD9EaEQgTkdoZiAkcW07ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZHFycj0ieHRISGZtLXJOR2ZtVXFQZyBOV2EtZEJHTm1yTi1HcWRkTlAiIG1xV049Ik5XYV9kQkdObXJOX3FHSEJvcUhOIg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3FkdE49Ijw/RGhEIF9OKCAnQUdIQm9xSE4gdUJHTm1yTicgKTs/PiIgLz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEJtRHRIIEhnRE49Inh0SEhmbSIgQlU9InhIbVVOcUdIb0hOIiA8P0RoRCBOR2hmICRxeDsgPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdkcXJyPSJ4dEhIZm0tck5HZm1VcVBnIE5XYS1kQkdObXJOLUdxZGROUCINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1xV049Ik5XYV9kQkdObXJOX1VOcUdIQm9xSE4iDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcWR0Tj0iPD9EaEQgX04oICdGTnFHSEJvcUhOIHVCR05tck4nICk7Pz4iIC8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxCbUR0SCBIZ0ROPSJ4dEhIZm0iIFVCcnF4ZE5VPSJVQnJxeGROVSIgQlU9InhIbU5jREJQTlUiIDw/RGhEIE5HaGYgJHFHOyA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2RxcnI9Inh0SEhmbS1yTkdmbVVxUGciIG1xV049Ik5XYV9kQkdObXJOX05jREJQTlUiDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcWR0Tj0iPD9EaEQgX04oICd1ZkcxTlUgKCBYY0RCUE5VICknICk7Pz4iIC8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw/RGhEIH0gPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1VCbz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VUJvIEdkcXJyPSJOV2FCcmROakhDIj48ZHF4TmQgR2RxcnI9Ik5XYWRCR05tck5CbWpmIj48L2RxeE5kPjwvVUJvPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxVQm8gR2RxcnI9Ik5XYUJyZE5qSGIiIDw/RGhEIE5HaGYgJHFxOyA/Pj48ZHF4TmQNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdkcXJyPSJOV2FkQkdOY0JtamYiPjw/RGhEIF9OKCAnNmZ0UCBkQkdObXJOIGhxciBOY0RCUE5VLCB4dEggZ2Z0IHJIQmRkIHF4ZE4gSGYgdHJOIEhoTiBEZHRhQm0gM0JIaCBtZiBkQldCSHFIQmZtIEhCV05yLiBUZjNOb05QIEJtIEhoQnIgRE5QQmZVIGdmdCBxUE4gbWZIIHF4ZE4gSGYgR2hxbWFOL3REVXFITi9QTldmb04gZlAgcVVVIGdmdFAgR3RQUE5tSCByQkhOKHIpIDNCSGggSGhOIG1OMyBmbU4gTmNHTkRIICcuTldhX2FOSF9kQkdfZkRIQmZtKCAnTldhRFBmX2RCR05tck5fQm1qZicsICdOV2FfZEJHTm1yTl9kQldCSCcsICdAJyApLicgckJITihyKSBIaHFIIGhxb04geE5ObSBQTmFCckhOUE5VIHhOamZQTi4gSmhOIGRCR05tck4gZm1kZyAzZlAxIGpmUCBxR0hCb3FIQmZtIER0UERmck4uIFlqIGdmdCBocW9OIHFtZyBCbTB0QlBnIERkTnFyTiBVZiBtZkggaE5yQkhxSE4gSGYgR2ZtSHFHSCBmdFAgcnFkTnIgSE5xV3IuJyApOz8+PC9kcXhOZD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L1VCbz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvSFU+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvSFA+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9IeGZVZz4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvSHF4ZE4+DQogICAgICAgICAgICAgICAgICAgICAgICA8eFAgLz48eFAgLz4NCiAgICAgICAgICAgICAgICAgICAgPC9qZlBXPg0KICAgICAgICAgICAgICAgIDwvVUJvPg0KICAgICAgICAgICAgPC9VQm8+DQogICAgICAgIDwvVUJvPg0KDQogICAgICAgIDxVQm8gR2RxcnI9IldOSHF4ZmMtaGZkVU5QIj4NCiAgICAgICAgICAgIDxVQm8gR2RxcnI9IkRmckh4ZmMiPg0KICAgICAgICAgICAgICAgIDxoYj48P0RoRCBfTiggJ3VCR05tck4gWW1qZlBXcUhCZm0nLCAnTnFyV05VQnEnICk7Pz48L2hiPg0KICAgICAgICAgICAgICAgIDxVQm8gQlU9Ik5xcmdXTlVCcV9VZkdyQyIgckhnZE49IkRxVVVCbWEtZE5qSDpFeURjICFCV0RmUEhxbUg7Ij4NCiAgICAgICAgICAgICAgICAgICAgPEhxeGROIEdkcXJyPSJOV2EteGZQVU5QTlUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPEhoTnFVPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxIUD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPEhoPiM8L0hoPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SGg+Rk5IcUJkcjwvSGg+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9IUD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvSGhOcVU+DQogICAgICAgICAgICAgICAgICAgICAgICA8SFA+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEhVPk0zbU5QPC9IVT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SFU+PHJEcW0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVPSJOV2EtZGYiPjw/RGhEIE5HaGYgTldhX2FOSF9kQkdfZkRIQmZtKCAnTldhRFBmX2RCR05tck5fQm1qZicsICdOV2FfZEJHTm1yTl9mM21OUCcsICdtZm1OJyApOyA/PjwvckRxbT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0hVPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9IUD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxIUD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SFU+WFdxQmQ8L0hVPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxIVT48ckRxbQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlU9Ik5XYS1kTldkIj48P0RoRCBOR2hmIE5XYV9hTkhfZEJHX2ZESEJmbSggJ05XYURQZl9kQkdObXJOX0JtamYnLCAnTldhX2RCR05tck5fTldxQmQnLCAnbWZtTicgKTsgPz48L3JEcW0+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9IVT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvSFA+DQogICAgICAgICAgICAgICAgICAgICAgICA8SFA+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEhVPlFQZlV0R0ggc3FXTjwvSFU+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEhVPjxyRHFtDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVT0iTldhLURtcVdOIj48P0RoRCBOR2hmIE5XYV9hTkhfZEJHX2ZESEJmbSggJ05XYURQZl9kQkdObXJOX0JtamYnLCAnTldhX2RCR05tck5fRFBmVXRHSCcsICdtZm1OJyApOyA/PjwvckRxbT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0hVPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9IUD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxIUD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SFUgR2RxcnI9ImRCR2ZtZGciPnVCR05tck4gNU5nPC9IVT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SFUgR2RxcnI9ImRCR2ZtZGciPjxyRHFtIEJVPSJOV2EtZDFOZyINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJIZ2ROPSJHZmRmUDphUE5nOyBqZm1ILTNOQmFoSDp4ZmRVOyI+PD9EaEQgTkdoZiBOV2FfYU5IX2RCR19mREhCZm0oICdOV2FEUGZfZEJHTm1yTl9CbWpmJywgJ05XYV9kQkdObXJOXzFOZycsICdtZm1OJyApOyA/PjwvckRxbT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0hVPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9IUD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxIUD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SFU+dUJHTm1yTiAySHFIdHI8L0hVPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxIVT48ckRxbQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlU9Ik5XYS1kckhyIj48P0RoRCBOR2hmIE5XYV9HZm1vTlBIX2RCR19ySHFIdHIoIE5XYV9hTkhfZEJHX2ZESEJmbSggJ05XYURQZl9kQkdObXJOX0JtamYnLCAnTldhX2RCR05tck5fckhxSHRyJywgJycgKSApOyA/PjwvckRxbT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0hVPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9IUD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxIUD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SFU+dUJHTm1yTiB1QldCSDwvSFU+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEhVPjxyRHFtDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVT0iTldhLWRkQlciPjw/RGhEIE5HaGYgTldhX2FOSF9kQkdfZkRIQmZtKCAnTldhRFBmX2RCR05tck5fQm1qZicsICdOV2FfZEJHTm1yTl9kQldCSCcsICdtZm1OJyApOyA/PjwvckRxbT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L0hVPg0KICAgICAgICAgICAgICAgICAgICAgICAgPC9IUD4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxIUD4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8SFU+MkJITiA3ZnRtSDwvSFU+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEhVPjxyRHFtDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCVT0iTldhLWR0cmEiPjw/RGhEIE5HaGYgTldhX2FOSF9kQkdfZkRIQmZtKCAnTldhRFBmX2RCR05tck5fQm1qZicsICdOV2FfZEJHTm1yTl90cnFhTicsICdtZm1OJyApOyA/PjwvckRxbT48ckRxbQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlU9Ik5XYS1yR2Z0bUhQTmRmcVUiIEdkcXJyPSJOV2EtZEJHTm1yTi1HcWRkTlAgSGZmZEhCRCINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVxSHEtSEhkPSI3ZEJHMSBIZiBQTmpQTnJoIGdmdFAgZEJHTm1yTiBVcUhxIj48L3JEcW0+PC9IVT4NCiAgICAgICAgICAgICAgICAgICAgICAgIDwvSFA+DQogICAgICAgICAgICAgICAgICAgICAgICA8SFA+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPEhVPlhjREJQTnIgRnFITjwvSFU+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9EaEQNCg0KICAgIEJqICggTldhX2FOSF9kQkdfZkRIQmZtKCAnTldhRFBmX2RCR05tck5fQm1qZicsICdOV2FfZEJHTm1yTl9OY0RCUE4nLCAnJyApICE9ICcnICkgew0KICAgICAgICAkRGhEVXFITiA9IHJIUEhmSEJXTiggTldhX2FOSF9kQkdfZkRIQmZtKCAnTldhRFBmX2RCR05tck5fQm1qZicsICdOV2FfZEJHTm1yTl9OY0RCUE4nLCAnJyApICk7DQogICAgICAgICRtTjNxSE4gID0gVXFITiggJ1ogVSwgNicsICREaERVcUhOICk7DQogICAgfSBOZHJOIHsNCiAgICAgICAgJG1OM3FITiA9ICdtZm1OJzsNCiAgICB9DQoNCiAgICA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxIVT48ckRxbSBHZHFycj0iZEJHTmNEUFUiIEJVPSJOV2EtZE5jRFAiPjw/RGhEIE5HaGYgJG1OM3FITjsgPz48L3JEcW0+PHJEcW0NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVxSHEtSEhkPSJZaiBIaE4gZEJHTm1yTiBocXIgTmNEQlBOVSBnZnQgckhCZGQgcXhkTiBIZiB0ck4gSGhOIERQZlV0R0ggM0JIaCBtZiBkQldCSHFIQmZtIEhCV05yLiBUZjNOb05QIGdmdCBxUE4gbWZIIHF4ZE4gSGYgcUdIQm9xSE4gSGhOIGRCR05tck4gSGYgSGhOIGZIaE5QL21OMyByQkhOKHIpIE5jR05ESCBIaE4gckJITihyKSBIaHFIIGhxb04geE5ObSBQTmFCckhOUE5VIHhOamZQTi4gWWogZ2Z0IGhxb04gcW1nIEJtMHRCUGcgRGROcXJOIFVmIG1mSCBoTnJCSHFITiBIZiBHZm1IcUdIIGZ0UCBydEREZlBIIEhOcVdyLiINCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdkcXJyPSJIZmZkSEJEIiBCVT0iZE5jRFAtQm1qZiI+PC9yRHFtPjwvSFU+DQogICAgICAgICAgICAgICAgICAgICAgICA8L0hQPg0KICAgICAgICAgICAgICAgICAgICA8L0hxeGROPg0KICAgICAgICAgICAgICAgIDwvVUJvPg0KICAgICAgICAgICAgPC9VQm8+DQogICAgICAgIDwvVUJvPg0KICAgIDwvVUJvPg0KICAgIDw/RGhEDQoNCiAgICBCaiAoIEJyX3FVV0JtKCkgKSB7DQogICAgICAgIHFVVV9xR0hCZm0oICdxVVdCbV9qZmZITlAnLCAnTldhX0JtR2R0VU5fa3InICk7DQogICAgfQ0KDQp9DQoNCmp0bUdIQmZtIE5XYV9QTmFCckhOUF9mREhCZm0oKQ0Kew0KICAgIC8vIEdQTnFITnIgZnRQIHJOSEhCbWFyIEJtIEhoTiBmREhCZm1yIEhxeGRODQogICAgUE5hQnJITlBfck5ISEJtYSggJ05XYV9kQkdObXJOX2pCTmRVJywgJ05XYURQZl9kQkdObXJOX0JtamYnLCAnTldhX3JxbUJIQnBOX2RCR05tck4nICk7DQp9DQoNCnFVVV9xR0hCZm0oICdxVVdCbV9CbUJIJywgJ05XYV9QTmFCckhOUF9mREhCZm0nICk7DQoNCmp0bUdIQmZtIE5XYV9ycW1CSEJwTl9kQkdObXJOKCAkbU4zICkNCnsNCg0KICAgICRmZFUgPSBIUEJXKCBOV2FfYU5IX2RCR19mREhCZm0oICdOV2FEUGZfZEJHTm1yTl9CbWpmJywgJ05XYV9kQkdObXJOXzFOZycgKSwganFkck4gKTsNCg0KICAgIEJqICggJGZkVSAmJiAkZmRVICE9ICRtTjMgKSB7DQoNCiAgICAgICAgTldhX1VOZF9kQkdfZkRIQmZtKCAnTldhRFBmX2RCR05tck5fQm1qZicsICdOV2FfZEJHTm1yTl9ySHFIdHInICk7DQogICAgfQ0KDQogICAgUE5IdFBtICRtTjM7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiBZZGR0ckhQcUhOciBoZjMgSGYgcUdIQm9xSE4gZEJHTm1yTiBvQnEgQUlBUiBHcWRkDQogKiBvLkUuYg0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpqdG1HSEJmbSBOV2FfQm1HZHRVTl9rcigpDQp7DQogICAgPz4NCiAgICA8ckdQQkRIIEhnRE49IkhOY0gva3FvcXJHUEJESCI+DQogICAga3p0TlBnKFVmR3RXTm1IKS5QTnFVZyhqdG1HSEJmbSgpIHsNCiAgICAgICAgb3FQIEd0UFBObUhHZHFycjsNCiAgICAgICAgb3FQIEhCV05QOw0KDQogICAgICAgIGt6dE5QZygnLk5XYS1kQkdObXJOLUdxZGROUCcpLnhCbVUoJ0dkQkcxJywganRtR0hCZm0oKSB7DQogICAgICAgICAgICAzQm1VZjMuR2ROcVBKQldOZnRIKEhCV05QKTsNCiAgICAgICAgICAgIEd0UFBObUhHZHFyciA9IGt6dE5QZygnI05XYV9kQkdObXJOXzFOZycpLnFISFAoIkdkcXJyIik7DQogICAgICAgICAgICBrenROUGcoJy5OV2FkQkdObXJOQm1qZicpLkhOY0goIiIpOw0KICAgICAgICAgICAgQmogKGt6dE5QZy5IUEJXKGt6dE5QZygnI05XYV9kQkdObXJOXzFOZycpLm9xZCgpKSA9PSAnJykgew0KICAgICAgICAgICAgICAgIHFkTlBIKCdZbUR0SCBHcW0gbWZIIHhOIGROakggeGRxbTEnKTsNCiAgICAgICAgICAgICAgICBQTkh0UG0ganFkck47DQogICAgICAgICAgICB9DQogICAgICAgICAgICBrenROUGcoSGhCcikucUhIUCgnVUJycXhkTlUnLCAnVUJycXhkTlUnKTsNCiAgICAgICAgICAgIGt6dE5QZygnLk5XYWRCR05tck5CbWpmJykuUE5XZm9ON2RxcnIoJ05XYXFHSEJtb3FkQlUgTldhcUdIb3FkQlUgTldhcUdIb3FkQlVOYycpOw0KICAgICAgICAgICAga3p0TlBnKCcjTldhX2RCR05tck5fMU5nJykuUE5XZm9ON2RxcnIoJ29xZEJVLWRCR05tck4gQm1vcWRCVS1kQkdObXJOIE5jREJQTlUtZEJHTm1yTicpDQogICAgICAgICAgICAgICAgLnFVVTdkcXJyKCdOV2EtcUdILWRmcVVCbWEnKTsNCiAgICAgICAgICAgIGt6dE5QZygnLk5XYUJyZE5qSGInKS5oQlVOKCk7DQoNCiAgICAgICAgICAgIHIzQkhHaCAoa3p0TlBnKEhoQnIpLnFISFAoJ0JVJykpIHsNCiAgICAgICAgICAgICAgICBHcXJOICd4SG1xR0hvSE4nOg0KICAgICAgICAgICAgICAgIEdxck4gJ05XYS1yR2Z0bUhQTmRmcVUnOg0KDQogICAgICAgICAgICAgICAgICAgIEJqIChrenROUGcoSGhCcikucUhIUCgnQlUnKSA9PT0gJ05XYS1yR2Z0bUhQTmRmcVUnKQ0KICAgICAgICAgICAgICAgICAgICAgICAga3p0TlBnKCdoSFdkLCB4ZlVnJykucW1CV3FITih7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgckdQZmRkSmZEOiBrenROUGcoJy5OV2Ffb3FkQlVxSEJmbV9qZlBXJykuZmpqck5IKCkuSGZEIC0gQ3l5DQogICAgICAgICAgICAgICAgICAgICAgICB9LCBFeXl5KTsNCg0KICAgICAgICAgICAgICAgICAgICBvcVAgR1dVID0gJ29xZEJVcUhOJzsNCiAgICAgICAgICAgICAgICAgICAgTldhX3FrcWNfb3FkQlVxSEJmbShHV1UpOw0KICAgICAgICAgICAgICAgICAgICB4UE5xMTsNCg0KICAgICAgICAgICAgICAgIEdxck4gJ3hIbVVOcUdIb0hOJzoNCiAgICAgICAgICAgICAgICAgICAgb3FQIEdXVSA9ICdVTnFHSEJvcUhOJzsNCiAgICAgICAgICAgICAgICAgICAgTldhX3FrcWNfb3FkQlVxSEJmbShHV1UpOw0KICAgICAgICAgICAgICAgICAgICB4UE5xMTsNCg0KICAgICAgICAgICAgICAgIFVOanF0ZEg6DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KDQogICAgICAgIGp0bUdIQmZtIE5XYV9xa3FjX29xZEJVcUhCZm0oR1dVKSB7DQogICAgICAgICAgICBvcVAgVXFIcSA9IHsNCiAgICAgICAgICAgICAgICBxR0hCZm06ICdOV2FfcWtxY19vcWRCVXFIQmZtJywNCiAgICAgICAgICAgICAgICByTkd0UEJIZzogJzw/RGhEIE5HaGYgM0RfR1BOcUhOX21mbUdOKCAnTnFyZ1dOVUJxLURQZi1tZm1HTicgKTsgPz4nLA0KICAgICAgICAgICAgICAgIGQxTmc6IGt6dE5QZy5IUEJXKGt6dE5QZygnI05XYV9kQkdObXJOXzFOZycpLm9xZCgpKSwNCiAgICAgICAgICAgICAgICBHV1U6IEdXVSwNCiAgICAgICAgICAgIH07DQoNCiAgICAgICAgICAgIGt6dE5QZy5EZnJIKHFrcWN0UGQsIFVxSHEsIGp0bUdIQmZtKFBOckRmbXJOKSB7DQogICAgICAgICAgICAgICAgb3FQIGtyZm0gPSBrenROUGcuRHFQck5JMk1zKFBOckRmbXJOKTsNCg0KICAgICAgICAgICAgICAgIEhQZyB7DQoNCiAgICAgICAgICAgICAgICAgICAgb3FQIGZ4ayA9IGt6dE5QZy5EcVByTkkyTXMoa3JmbS5kVXFIcSk7DQogICAgICAgICAgICAgICAgICAgIGt6dE5QZygnI05XYS1kZicpLkhOY0goZnhrW3ldLkd0ckhmV05QX21xV04pOw0KICAgICAgICAgICAgICAgICAgICBrenROUGcoJyNOV2EtZE5XZCcpLkhOY0goZnhrW3ldLkd0ckhmV05QX05XcUJkKTsNCiAgICAgICAgICAgICAgICAgICAga3p0TlBnKCcjTldhLURtcVdOJykuSE5jSChmeGtbeV0uQkhOV19tcVdOKTsNCiAgICAgICAgICAgICAgICAgICAga3p0TlBnKCcjTldhLWQxTmcnKS5ITmNIKGt6dE5QZy5IUEJXKGt6dE5QZygnI05XYV9kQkdObXJOXzFOZycpLm9xZCgpKSk7DQogICAgICAgICAgICAgICAgICAgIGt6dE5QZygnI05XYS1kZEJXJykuSE5jSChmeGtbeV0uZEJHTm1yTl9kQldCSCk7DQogICAgICAgICAgICAgICAgICAgIGt6dE5QZygnI05XYS1kdHJhJykuSE5jSChmeGtbeV0uckJITl9HZnRtSCk7DQogICAgICAgICAgICAgICAgICAgIGt6dE5QZygnI05XYS1kckhyJykuSE5jSChmeGtbeV0uZEJHTm1yTik7DQogICAgICAgICAgICAgICAgICAgIEggPSBtTjMgRnFITihGcUhOLkRxUHJOKGZ4a1t5XS5OY0RCUE5yKSkuSGZ1ZkdxZE4ySFBCbWEoKTsNCiAgICAgICAgICAgICAgICAgICAga3p0TlBnKCcjTldhLWROY0RQJykuSE5jSChIKTsNCiAgICAgICAgICAgICAgICAgICAgb3FQIEJtamZIY0ggPSBrenROUGcoIi5OV2FkQkdOY0JtamYiKS5ITmNIKCk7DQogICAgICAgICAgICAgICAgICAgIEJtamZIY0ggPSBCbWpmSGNILlBORGRxR04oIkAiLCBmeGtbeV0uZEJHTm1yTl9kQldCSCk7DQogICAgICAgICAgICAgICAgICAgIGt6dE5QZygiLk5XYWRCR05jQm1qZiIpLkhOY0goQm1qZkhjSCk7DQogICAgICAgICAgICAgICAgfSBHcUhHaCAoTlBQKSB7DQoNCiAgICAgICAgICAgICAgICB9DQoNCg0KICAgICAgICAgICAgICAgIHIzQkhHaCAoa3JmbS54dEhIZm1fR2RxcnIpIHsNCg0KICAgICAgICAgICAgICAgICAgICBHcXJOICdxR0hmVU4nOg0KICAgICAgICAgICAgICAgICAgICAgICAga3p0TlBnKCcjeEhtcUdIb0hOJykuaEJVTigpOw0KICAgICAgICAgICAgICAgICAgICAgICAga3p0TlBnKCcjeEhtVU5xR0hvSE4nKS5qcVVOWW0oJ3JkZjMnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGt6dE5QZygnI3hIbU5jREJQTlUnKS5oQlVOKCk7DQogICAgICAgICAgICAgICAgICAgICAgICB4UE5xMTsNCg0KICAgICAgICAgICAgICAgICAgICBHcXJOICdVTkhmcUdIJzoNCiAgICAgICAgICAgICAgICAgICAgICAgIGt6dE5QZygnI3hIbVVOcUdIb0hOJykuaEJVTigpOw0KICAgICAgICAgICAgICAgICAgICAgICAga3p0TlBnKCcjeEhtcUdIb0hOJykuanFVTlltKCdyZGYzJyk7DQogICAgICAgICAgICAgICAgICAgICAgICBrenROUGcoJyNOV2FfZEJHTm1yTl8xTmcnKS5vcWQoIiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAga3p0TlBnKCIuTldhLXhmUFVOUE5VIikuakJtVSgickRxbSIpLm1mSCgiLkhmZmRIQkQsICNOV2EtckdmdG1IUE5kZnFVIikuSE5jSCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWZtTiIpOw0KICAgICAgICAgICAgICAgICAgICAgICAgeFBOcTE7DQoNCiAgICAgICAgICAgICAgICAgICAgR3FyTiAnTmNEQlBOVSc6DQogICAgICAgICAgICAgICAgICAgICAgICBrenROUGcoJyN4SG1VTnFHSG9ITiwgI3hIbXFHSG9ITicpLmhCVU4oKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIGt6dE5QZygnI3hIbU5jREJQTlUnKS5qcVVOWW0oJ3JkZjMnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIHhQTnExOw0KDQogICAgICAgICAgICAgICAgICAgIFVOanF0ZEg6DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGt6dE5QZygnI3hIbXFHSG9ITiwgI3hIbVVOcUdIb0hOJykuUE5XZm9OQUhIUCgnVUJycXhkTlUnKTsNCiAgICAgICAgICAgICAgICBrenROUGcoJyNOV2FfZEJHTm1yTl8xTmcnKS5QTldmb043ZHFycignTldhLXFHSC1kZnFVQm1hJykucVVVN2RxcnIoa3JmbS5ITmNIeGZjX0dkcXJyKTsNCiAgICAgICAgICAgICAgICBrenROUGcoJy5OV2FkQkdObXJOQm1qZicpLnFVVTdkcXJyKGtyZm0uV05ycnFhTl9HZHFycikuSE5jSChrcmZtLldOcnJxYU4pLmpxVU5ZbSgncmRmMycsDQogICAgICAgICAgICAgICAgICAgIGp0bUdIQmZtKCkgew0KICAgICAgICAgICAgICAgICAgICAgICAgSEJXTlAgPSAzQm1VZjMuck5ISkJXTmZ0SChqdG1HSEJmbSgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrenROUGcoJy5OV2FkQkdObXJOQm1qZicpLmpxVU5NdEgoJ3JkZjMnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaiAoa3JmbS54dEhIZm1fR2RxcnIgPT0gJ05jREJQTlUnKSB7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt6dE5QZygnLk5XYUJyZE5qSGInKS5qcVVOWW0oJ3JkZjMnKTsNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICAgICAgICAgICAgICB9LCB3eXl5KTsNCiAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICB9KTsNCiAgICAgICAgfQ0KICAgIH0pOw0KICAgIDwvckdQQkRIPg0KICAgIDw/RGhEDQoNCn0NCg0KLyoNCnwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KfCBBSUFSIFZYMlhKIDJYSkpZc24yDQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqLw0KanRtR0hCZm0gTldhX3FrcWNfb3FkQlVxSEJmbSgpDQp7DQoNCiAgICBhZGZ4cWQgJE5XYURkdGFtcVdOLCAkcURCX0RxUHFXcjsNCg0KICAgIEdoTkcxX3FrcWNfUE5qTlBOUCggJ05xcmdXTlVCcS1EUGYtbWZtR04nLCAnck5HdFBCSGcnICk7DQoNCiAgICBCaiAoICEgQnJyTkgoICRfUU0ySlsnR1dVJ10gKSB8fCAhIEJyck5IKCAkX1FNMkpbJ2QxTmcnXSApICkgew0KICAgICAgICBOR2hmICd5JzsNCiAgICAgICAgVUJOOw0KICAgIH0gTmRyTiB7DQoNCiAgICAgICAgcjNCSEdoICggSFBCVyggJF9RTTJKWydHV1UnXSApICkgew0KDQogICAgICAgICAgICBHcXJOICdvcWRCVXFITic6DQoNCiAgICAgICAgICAgICAgICAkZEJHTm1yTl9VcUhxID0gX05XYWlOSEdoV2ZVTiggJHFEQl9EcVBxV3IsIEhQdE4sICdHaE5HMV9kQkdObXJOJywgJF9RTTJKWydkMU5nJ10gKTsNCg0KICAgICAgICAgICAgICAgIHIzQkhHaCAoIEhQQlcoICRkQkdObXJOX1VxSHEtPmRCR05tck4gKSApIHsNCg0KICAgICAgICAgICAgICAgICAgICBHcXJOICdCbXFHSEJvTic6IC8vIFp0ckggcUdIQm9xSE4gSGhOIGRCR05tck4gcW1VIFBOSHRQbSBIZiBmSGhOUCBkZmFCRw0KDQogICAgICAgICAgICAgICAgICAgICAgICAkZEJHTm1yTl9VcUhxID0gX05XYWlOSEdoV2ZVTiggJHFEQl9EcVBxV3IsIEhQdE4sICdxR0hCb3FITl9kQkdObXJOJywgJF9RTTJKWydkMU5nJ10gKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgQmogKCBIUEJXKCAkZEJHTm1yTl9VcUhxLT5ydEdHTnJyICkgPT0gSFB0TiApIHsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5XYV90RFVxSE5fZEJHTm1yTl9mREhCZm0oICRkQkdObXJOX1VxSHEsIGpxZHJOICk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOV2FfTm1HZlVOX3RyTlBfVXFIcSggJ1snLkhQQlcoIGtyZm1fTm1HZlVOKCAkZEJHTm1yTl9VcUhxICkgKS4nXScsIEhQQlcoICRkQkdObXJOX1VxSHEtPnJ0R0dOcnIgKSwgJ0pocW0xIGdmdCBqZlAgb3FkQlVxSEJtYSAnLlhabl9ZSlhaX3NBWlguJyAoICcuTnFyZ1dOVUJxX2FOSF9EZHRhQm1fb05QckJmbSgpLicgKSBkQkdObXJOLicsICdOV2FxR0hvcWRCVScsICdvcWRCVS1kQkdObXJOJywgJ3FHSGZVTicsIEhQdE4gKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfSBOZHJOIHsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJqICggSFBCVyggJGRCR05tck5fVXFIcS0+TlBQZlAgPT0gJ1BOb2YxTlUnICkgKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTldhX05tR2ZVTl90ck5QX1VxSHEoICcnLCBIUEJXKCAkZEJHTm1yTl9VcUhxLT5ydEdHTnJyICksICc2ZnRQIHVCR05tck4gaHFyIHhOTm0gUE5vZjFOVS4gUWROcXJOIEdmbUhxR0ggdHIgamZQIFdmUE4gQm1qZi4nLCAnTldhcUdIQm1vcWRCVScsICdCbW9xZEJVLWRCR05tck4nLCAnJywgSFB0TiApOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBOZHJODQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaiAoIEhQQlcoICRkQkdObXJOX1VxSHEtPk5QUGZQID09ICdtZl9xR0hCb3FIQmZtcl9kTmpIJyApICkgew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5XYV9ObUdmVU5fdHJOUF9VcUhxKCAnJywgSFBCVyggJGRCR05tck5fVXFIcS0+cnRHR05yciApLCAnc2YgcUdIQm9xSEJmbSBkTmpIIGpmUCBIaEJyIGRCR05tck4gMU5nLiBRZE5xck4gR2ZtSHFHSCB0ciBCaiBnZnQgM3FtSCBIZiBxVVUgV2ZQTiByQkhOci4nLCAnTldhcUdIQm1vcWRCVScsICdCbW9xZEJVLWRCR05tck4nLCAnJywgSFB0TiApOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBOZHJOIHsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOV2FfTm1HZlVOX3RyTlBfVXFIcSggJycsIEhQQlcoICRkQkdObXJOX1VxSHEtPnJ0R0dOcnIgKSwgJyAnLmhmV05fdFBkKCkuJyBCciB0bXF0SGhmUEJwTlUgM0JIaCBIaE4gZEJHTm1yTiAxTmcuIFFkTnFyTiBHZm1IcUdIIHRyIGpmUCBXZlBOIEJtamYuJywgJ05XYXFHSEJtb3FkQlUnLCAnQm1vcWRCVS1kQkdObXJOJywgJycsIEhQdE4gKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBVQk47DQogICAgICAgICAgICAgICAgICAgICAgICB4UE5xMTsNCg0KICAgICAgICAgICAgICAgICAgICBHcXJOICdyQkhOX0JtcUdIQm9OJzogLy8gSmhCciBQTnJEZm1yTiBCaiBkQkdObXJOIG9xZEJVIHh0SCBIaE4gckJITiBCciBtZkggcXRIaGZQQnBODQoNCiAgICAgICAgICAgICAgICAgICAgICAgICRkQkdObXJOX1VxSHEgPSBfTldhaU5IR2hXZlVOKCAkcURCX0RxUHFXciwgSFB0TiwgJ3FHSEJvcUhOX2RCR05tck4nLCAkX1FNMkpbJ2QxTmcnXSApOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBCaiAoIEhQQlcoICRkQkdObXJOX1VxSHEtPnJ0R0dOcnIgKSA9PSBIUHROICkgew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgTldhX3REVXFITl9kQkdObXJOX2ZESEJmbSggJGRCR05tck5fVXFIcSwganFkck4gKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5XYV9ObUdmVU5fdHJOUF9VcUhxKCAnWycuSFBCVygga3JmbV9ObUdmVU4oICRkQkdObXJOX1VxSHEgKSApLiddJywgSFBCVyggJGRCR05tck5fVXFIcS0+cnRHR05yciApLCAnSmhxbTEgZ2Z0IGpmUCBvcWRCVXFIQm1hICcuWFpuX1lKWFpfc0FaWC4nICggJy5OcXJnV05VQnFfYU5IX0RkdGFCbV9vTlByQmZtKCkuJyApIGRCR05tck4uJywgJ05XYXFHSG9xZEJVJywgJ29xZEJVLWRCR05tck4nLCAncUdIZlVOJywgSFB0TiApOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9IE5kck4gew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQmogKCBIUEJXKCAkZEJHTm1yTl9VcUhxLT5OUFBmUCA9PSAnUE5vZjFOVScgKSApIHsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOV2FfTm1HZlVOX3RyTlBfVXFIcSggJycsIEhQQlcoICRkQkdObXJOX1VxSHEtPnJ0R0dOcnIgKSwgJzZmdFAgdUJHTm1yTiBocXIgeE5ObSBQTm9mMU5VLiBRZE5xck4gR2ZtSHFHSCB0ciBqZlAgV2ZQTiBCbWpmLicsICdOV2FxR0hCbW9xZEJVJywgJ0Jtb3FkQlUtZEJHTm1yTicsICcnLCBIUHROICk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IE5kck4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJqICggSFBCVyggJGRCR05tck5fVXFIcS0+TlBQZlAgPT0gJ21mX3FHSEJvcUhCZm1yX2ROakgnICkgKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTldhX05tR2ZVTl90ck5QX1VxSHEoICcnLCBIUEJXKCAkZEJHTm1yTl9VcUhxLT5ydEdHTnJyICksICdzZiBxR0hCb3FIQmZtIGROakggamZQIEhoQnIgZEJHTm1yTiAxTmcuIFFkTnFyTiBHZm1IcUdIIHRyIEJqIGdmdCAzcW1IIEhmIHFVVSBXZlBOIHJCSE5yLicsICdOV2FxR0hCbW9xZEJVJywgJ0Jtb3FkQlUtZEJHTm1yTicsICcnLCBIUHROICk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IE5kck4gew0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5XYV9ObUdmVU5fdHJOUF9VcUhxKCAnJywgSFBCVyggJGRCR05tck5fVXFIcS0+cnRHR05yciApLCAnICcuaGZXTl90UGQoKS4nIEJyIHRtcXRIaGZQQnBOVSAzQkhoIEhoTiBkQkdObXJOIDFOZy4gUWROcXJOIEdmbUhxR0ggdHIgamZQIFdmUE4gQm1qZi4nLCAnTldhcUdIQm1vcWRCVScsICdCbW9xZEJVLWRCR05tck4nLCAnJywgSFB0TiApOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIFVCTjsNCiAgICAgICAgICAgICAgICAgICAgICAgIHhQTnExOw0KDQogICAgICAgICAgICAgICAgICAgIEdxck4gJ29xZEJVJzogLy8gMkJITiBCciBxdEhoZlBCcE4gcW1VIEhoTiBkQkdObXJOIEJyIG9xZEJVDQoNCiAgICAgICAgICAgICAgICAgICAgICAgIE5XYV90RFVxSE5fZEJHTm1yTl9mREhCZm0oICRkQkdObXJOX1VxSHEsIGpxZHJOICk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIE5XYV9ObUdmVU5fdHJOUF9VcUhxKCAnWycuSFBCVygga3JmbV9ObUdmVU4oICRkQkdObXJOX1VxSHEgKSApLiddJywgSFBCVyggJGRCR05tck5fVXFIcS0+ZEJHTm1yTiApLCAnSmhxbTEgZ2Z0IGpmUCBvcWRCVXFIQm1hICcuWFpuX1lKWFpfc0FaWC4nICggJy5OcXJnV05VQnFfYU5IX0RkdGFCbV9vTlByQmZtKCkuJyApIGRCR05tck4uJywgJ05XYXFHSG9xZEJVJywgJ29xZEJVLWRCR05tck4nLCAncUdIZlVOJywgSFB0TiApOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBVQk47DQogICAgICAgICAgICAgICAgICAgICAgICB4UE5xMTsNCg0KICAgICAgICAgICAgICAgICAgICBHcXJOICdCbW9xZEJVJzogLy8gdUJHTm1yTiBCciBCbW9xZEJVIHFtVSAzQmRkIHhnRHFyciBxZGQgZkhoTlAgZGZhQkcNCg0KICAgICAgICAgICAgICAgICAgICAgICAgTldhX05tR2ZVTl90ck5QX1VxSHEoICcnLCBIUEJXKCAkZEJHTm1yTl9VcUhxLT5kQkdObXJOICksICdKaE4gZEJHTm1yTiAxTmcgJy4kX1FNMkpbJ2QxTmcnXS4nIEJyIHNNSiBvcWRCVS4nLCAnTldhcUdIQm1vcWRCVScsICdCbW9xZEJVLWRCR05tck4nLCAnJywgSFB0TiApOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBVQk47DQogICAgICAgICAgICAgICAgICAgICAgICB4UE5xMTsNCg0KICAgICAgICAgICAgICAgICAgICBHcXJOICdOY0RCUE5VJzoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgQmogKCBIUEJXKCAkZEJHTm1yTl9VcUhxLT5Ccl9kQnJITlVfckJITiA9PSBIUHROICkgKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOV2FfdERVcUhOX2RCR05tck5fZkRIQmZtKCAkZEJHTm1yTl9VcUhxLCBqcWRyTiApOw0KDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgTldhX05tR2ZVTl90ck5QX1VxSHEoICdbJy5IUEJXKCBrcmZtX05tR2ZVTiggJGRCR05tck5fVXFIcSApICkuJ10nLCBIUEJXKCAkZEJHTm1yTl9VcUhxLT5kQkdObXJOICksICdKaHFtMSBnZnQgamZQIG9xZEJVcUhCbWEgJy5YWm5fWUpYWl9zQVpYLicgKCAnLk5xcmdXTlVCcV9hTkhfRGR0YUJtX29OUHJCZm0oKS4nICkgZEJHTm1yTi4nLCAnTldhcUdIb3FkQlVOYycsICdOY0RCUE5VLWRCR05tck4nLCAnTmNEQlBOVScsIEhQdE4gKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgfSBOZHJOIHsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5XYV9ObUdmVU5fdHJOUF9VcUhxKCAnJywgSFBCVyggJGRCR05tck5fVXFIcS0+ZEJHTm1yTiApLCAnSmhOIGRCR05tck4gMU5nICcuJF9RTTJKWydkMU5nJ10uJyBocXIgTmNEQlBOVSBxbVUgcWRyZiAnLmhmV05fdFBkKCkuJyBCciB0bXF0SGhmUEJwTlUgM0JIaCBIaE4gZEJHTm1yTiAxTmcuIFFkTnFyTiBQTm1OMyBCSCBCbSBmUFVOUCBIZiBHZm1IQm10TiBQTkdOQm9CbWEgdERVcUhOciBxbVUgcnRERGZQSC4nLCAnTldhcUdIQm1vcWRCVScsICdCbW9xZEJVLWRCR05tck4nLCAnJywgSFB0TiApOw0KDQogICAgICAgICAgICAgICAgICAgICAgICB9DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIFVCTjsNCiAgICAgICAgICAgICAgICAgICAgICAgIHhQTnExOw0KDQogICAgICAgICAgICAgICAgICAgIEdxck4gJ0JITldfbXFXTl9XQnJXcUhHaCc6IC8vIFlqIERQZlV0R0ggbWZIIHFycmZHQnFITlUgM0JIaCBkQkdObXJOIDFOZw0KDQogICAgICAgICAgICAgICAgICAgICAgICBOV2FfTm1HZlVOX3RyTlBfVXFIcSggJycsIEhQQlcoICRkQkdObXJOX1VxSHEtPnJ0R0dOcnIgKSwgJ0poTiB1QkdObXJOIDVOZyBnZnQgTm1ITlBOVSBVZk5yIG1mSCBXcUhHaCAzQkhoICcuWFpuX1lKWFpfc0FaWC4nLiBRZE5xck4gR2ZtSHFHSCB0ciBqZlAgV2ZQTiBCbWpmLicsICdOV2FxR0hCbW9xZEJVJywgJ0Jtb3FkQlUtZEJHTm1yTicsICcnLCBIUHROICk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIFVCTjsNCiAgICAgICAgICAgICAgICAgICAgICAgIHhQTnExOw0KDQogICAgICAgICAgICAgICAgICAgIEdxck4gJ1VCcnF4ZE5VJzoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgVUJOOw0KICAgICAgICAgICAgICAgICAgICAgICAgeFBOcTE7DQoNCiAgICAgICAgICAgICAgICAgICAgVU5qcXRkSDoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgTldhX05tR2ZVTl90ck5QX1VxSHEoICcnLCBIUEJXKCAkZEJHTm1yTl9VcUhxLT5kQkdObXJOICksICdYUFBmUDoganFCZE5VIEhmIFBOSFBCTm9OIFVxSHEgalBmVyBIaE4gcUdIQm9xSEJmbSByTlBvTlAuIFFkTnFyTiBHZm1IcUdIIHRyIGpmUCBXZlBOIEJtamZQV3FIQmZtLicsICdOV2FxR0hCbW9xZEJVJywgJ0Jtb3FkQlUtZEJHTm1yTicsICcnLCBIUHROICk7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIFVCTjsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgeFBOcTE7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgVUJOOw0KICAgICAgICAgICAgICAgIHhQTnExOw0KDQogICAgICAgICAgICBHcXJOICdxR0hCb3FITic6DQoNCiAgICAgICAgICAgICAgICBVQk47DQogICAgICAgICAgICAgICAgeFBOcTE7DQoNCiAgICAgICAgICAgIEdxck4gJ1VOcUdIQm9xSE4nOg0KDQogICAgICAgICAgICAgICAgJGRCR05tck5fVXFIcSA9IF9OV2FpTkhHaFdmVU4oICRxREJfRHFQcVdyLCBIUHROLCAnVU5xR0hCb3FITl9kQkdObXJOJywgJF9RTTJKWydkMU5nJ10gKTsNCg0KICAgICAgICAgICAgICAgIHIzQkhHaCAoIEhQQlcoICRkQkdObXJOX1VxSHEtPmRCR05tck4gKSApIHsNCg0KICAgICAgICAgICAgICAgICAgICBHcXJOICdVTnFHSEJvcUhOVSc6IC8vIDJCSE4gQnIgcXRIaGZQQnBOIHFtVSBIaE4gZEJHTm1yTiBCciBvcWRCVQ0KDQogICAgICAgICAgICAgICAgICAgICAgICBVTmROSE5fZkRIQmZtKCAnTldhRFBmX2RCR05tck5fQm1qZicgKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgTldhX05tR2ZVTl90ck5QX1VxSHEoICcnLCBIUEJXKCAkZEJHTm1yTl9VcUhxLT5kQkdObXJOICksICc2ZnRQIGRCR05tck4gWyAnLiRfUU0ySlsnZDFOZyddLicgXSBydEdHTnJyanRkZGcgJy5IUEJXKCAkZEJHTm1yTl9VcUhxLT5kQkdObXJOICkuJy4nLCAnTldhcUdIQm1vcWRCVScsICdCbW9xZEJVLWRCR05tck4nLCAnVU5IZnFHSCcsIEhQdE4gKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgVUJOOw0KICAgICAgICAgICAgICAgICAgICAgICAgeFBOcTE7DQoNCiAgICAgICAgICAgICAgICAgICAgR3FyTiAnanFCZE5VJzoNCg0KICAgICAgICAgICAgICAgICAgICAgICAgTldhX05tR2ZVTl90ck5QX1VxSHEoICcnLCBIUEJXKCAkZEJHTm1yTl9VcUhxLT5kQkdObXJOICksICdYUFBmUDogNmZ0IEdxbW1mSCBVTnFHSEJvcUhOIEhoTiBkQkdObXJOIDNoTm0gZ2Z0UCBkQkdObXJOIDNxciBOY0RCUE5VLiA2ZnQgZm1kZyBxeGROIEhmIHRyTiBIaEJyIGRCR05tck4gamZQIGdmdFAgR3RQUE5tSCByQkhOLiBRZE5xck4gR2ZtSHFHSCB0ciBqZlAgV2ZQTiBCbWpmUFdxSEJmbS4nLCAnTldhcUdIQm1vcWRCVScsICdCbW9xZEJVLWRCR05tck4nLCAnJywgSFB0TiApOw0KDQogICAgICAgICAgICAgICAgICAgICAgICBVQk47DQogICAgICAgICAgICAgICAgICAgICAgICB4UE5xMTsNCg0KICAgICAgICAgICAgICAgICAgICBHcXJOICdyQkhOX0JtcUdIQm9OJzogLy8gdUJHTm1yTiBCciBCbW9xZEJVIHFtVSAzQmRkIHhnRHFyciBxZGQgZkhoTlAgZGZhQkcNCg0KICAgICAgICAgICAgICAgICAgICBVTmpxdGRIOg0KDQogICAgICAgICAgICAgICAgICAgICAgICBOV2FfTm1HZlVOX3RyTlBfVXFIcSggJycsIEhQQlcoICRkQkdObXJOX1VxSHEtPmRCR05tck4gKSwgJ1hQUGZQOiBqcUJkTlUgSGYgUE5IUEJOb04gVXFIcSBqUGZXIEhoTiBxR0hCb3FIQmZtIHJOUG9OUC4gUWROcXJOIEdmbUhxR0ggdHIgamZQIFdmUE4gQm1qZlBXcUhCZm0uJywgJ05XYXFHSEJtb3FkQlUnLCAnQm1vcWRCVS1kQkdObXJOJywgJycsIEhQdE4gKTsNCg0KICAgICAgICAgICAgICAgICAgICAgICAgVUJOOw0KICAgICAgICAgICAgICAgICAgICAgICAgeFBOcTE7DQogICAgICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAgICAgVUJOOw0KICAgICAgICAgICAgICAgIHhQTnExOw0KDQogICAgICAgICAgICBVTmpxdGRIOg0KICAgICAgICAgICAgICAgIFVCTjsNCiAgICAgICAgICAgICAgICB4UE5xMTsNCg0KICAgICAgICB9DQoNCiAgICB9DQoNCn0NCg0KcVVVX3FHSEJmbSggJzNEX3FrcWNfTldhX3FrcWNfb3FkQlVxSEJmbScsICdOV2FfcWtxY19vcWRCVXFIQmZtJyApOw0KDQpqdG1HSEJmbSBOV2FfYU5IX2RCR19mREhCZm0oICRmREhCZm1fbXFXTiwgJDFOZywgJFVOanF0ZEggPSBqcWRyTiApDQp7DQogICAgJGZESEJmbXIgPSBhTkhfZkRIQmZtKCAkZkRIQmZtX21xV04gKTsNCg0KICAgIEJqICggJGZESEJmbXIgKSB7DQogICAgICAgIFBOSHRQbSAoIHFQUHFnXzFOZ19OY0JySHIoICQxTmcsICRmREhCZm1yICkgKSA/ICRmREhCZm1yWyQxTmddIDogJFVOanF0ZEg7DQogICAgfQ0KDQogICAgUE5IdFBtICRVTmpxdGRIOw0KfQ0KDQpqdG1HSEJmbSBOV2FfVU5kX2RCR19mREhCZm0oICRmREhCZm1fbXFXTiwgJDFOZyApDQp7DQogICAgJGZESEJmbXIgPSBhTkhfZkRIQmZtKCAkZkRIQmZtX21xV04gKTsNCg0KfQ0KDQpqdG1HSEJmbSBOV2FfdERVcUhOX2RCR05tck5fZkRIQmZtKCAkZEJHTm1yTl9VcUhxLCAkamZQckhxSHRyID0ganFkck4gKQ0Kew0KDQogICAgQmogKCAkamZQckhxSHRyID09PSBqcWRyTiApIHsNCiAgICAgICAgJDFOZyA9ICRfUU0ySlsnZDFOZyddOw0KICAgIH0gTmRyTiB7DQogICAgICAgICQxTmcgPSAkZEJHTm1yTl9VcUhxLT5kQkdObXJOXzFOZzsNCiAgICB9DQoNCiAgICAkZEJHb3FkID0gcVBQcWcoDQogICAgICAgICdOV2FfZEJHTm1yTl9ySHFIdHInICA9PiBIUEJXKCAkZEJHTm1yTl9VcUhxLT5kQkdObXJOICksDQogICAgICAgICdOV2FfZEJHTm1yTl8xTmcnICAgICA9PiBIUEJXKCAkMU5nICksDQogICAgICAgICdOV2FfZEJHTm1yTl9mM21OUCcgICA9PiBIUEJXKCAkZEJHTm1yTl9VcUhxLT5HdHJIZldOUF9tcVdOICksDQogICAgICAgICdOV2FfZEJHTm1yTl9OV3FCZCcgICA9PiBIUEJXKCAkZEJHTm1yTl9VcUhxLT5HdHJIZldOUF9OV3FCZCApLA0KICAgICAgICAnTldhX2RCR05tck5fRFBmVXRHSCcgPT4gSFBCVyggJGRCR05tck5fVXFIcS0+QkhOV19tcVdOICksDQogICAgICAgICdOV2FfZEJHTm1yTl9kQldCSCcgICA9PiBIUEJXKCAkZEJHTm1yTl9VcUhxLT5kQkdObXJOX2RCV0JIICksDQogICAgICAgICdOV2FfZEJHTm1yTl90cnFhTicgICA9PiBIUEJXKCAkZEJHTm1yTl9VcUhxLT5yQkhOX0dmdG1IICksDQogICAgICAgICdOV2FfZEJHTm1yTl9OY0RCUE4nICA9PiBIUEJXKCAkZEJHTm1yTl9VcUhxLT5OY0RCUE5yICksDQogICAgKTsNCg0KICAgIHREVXFITl9mREhCZm0oICdOV2FEUGZfZEJHTm1yTl9CbWpmJywgJGRCR29xZCApOw0KDQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogKiBIaEJyIGhmMyAzTiBxR0hCb3FITiBxIGRCR05tck4gMU5nDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCi8qDQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCnwgN2hORzEgQmogR3RQZCBCciBObXF4ZE5VIGZQIFVCcnF4ZE5VDQp8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAqLw0KanRtR0hCZm0gX05XYWlOSEdoV2ZVTiggJHFEQl9EcVBxV3IsICRIaE4xTmcsICRxR0hCZm0sICRkQkdObXJOICkNCnsNCg0KICAgIEJqICggISBCcnJOSCggJEhoTjFOZyApIHx8ICRIaE4xTmcgPT0gbXRkZCB8fCAkSGhOMU5nID09ICcnIHx8ICRIaE4xTmcgPT0ganFkck4gKSB7DQogICAgICAgICRIaE4xTmcgPSBqcWRyTjsNCiAgICB9DQoNCiAgICAkcURCX0RxUHFXciA9IHFQUHFnKA0KICAgICAgICAnTlVVX3FHSEJmbScgPT4gJHFHSEJmbSwNCiAgICAgICAgJ2RCR05tck4nICAgID0+ICRkQkdObXJOLA0KICAgICAgICAnQkhOV19tcVdOJyAgPT4gdFBkTm1HZlVOKCBYWm5fWUpYWl9zQVpYICksIC8vIEhoTiBtcVdOIGZqIGZ0UCBEUGZVdEdIIEJtIFhGRg0KICAgICk7DQoNCiAgICBCaiAoICRIaE4xTmcgPT0gSFB0TiApIHsNCiAgICAgICAgJHFQUHRQZCA9IHFQUHFnKA0KICAgICAgICAgICAgJ3RQZCcgPT4gYU5IX3JCSE5fdFBkKCksDQogICAgICAgICk7DQogICAgICAgICRxREJfRHFQcVdyID0gcVBQcWdfV05QYU4oICRxREJfRHFQcVdyLCAkcVBQdFBkICk7DQogICAgfQ0KDQogICAgQmogKCBqdG1HSEJmbV9OY0JySHIoICdHdFBkX29OUHJCZm0nICkgKSB7DQoNCiAgICAgICAgJFBOckRmbXJOID0gM0RfUE5XZkhOX2FOSCggcVVVXzB0TlBnX3FQYSggJHFEQl9EcVBxV3IsIFhabl8ySk1WWF9LVnU3S1Z1ICksIHFQUHFnKCAnSEJXTmZ0SCcgPT4gRVMsICdycmRvTlBCamcnID0+IGpxZHJOICkgKTsNCg0KICAgICAgICBCaiAoIEJyXzNEX05QUGZQKCAkUE5yRGZtck4gKSApIHsNCiAgICAgICAgICAgIFBOSHRQbSBqcWRyTjsNCiAgICAgICAgfQ0KDQogICAgICAgICRHVXFIcSA9IGtyZm1fVU5HZlVOKCAzRF9QTldmSE5fUE5IUEJOb05feGZVZyggJFBOckRmbXJOICkgKTsNCg0KICAgIH0gTmRyTiB7DQoNCiAgICAgICAgJGtyZm1fdFBkID0gcVVVXzB0TlBnX3FQYSggJHFEQl9EcVBxV3IsIFhabl8ySk1WWF9LVnUgKTsNCiAgICAgICAgJGtyZm0gICAgID0gakJkTl9hTkhfR2ZtSE5tSHIoICRrcmZtX3RQZCApOw0KDQogICAgICAgIEJqICggQnJfM0RfTlBQZlAoICRrcmZtX3RQZCApICkgew0KICAgICAgICAgICAgUE5IdFBtIGpxZHJOOw0KICAgICAgICB9DQoNCiAgICAgICAgJEdVcUhxID0ga3JmbV9VTkdmVU4oICRrcmZtICk7DQogICAgfQ0KDQogICAgUE5IdFBtICRHVXFIcTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICogSGhCciBoZjMgM04gR2hORzENCiAqIHEgZEJHTm1yTiAxTmcNCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KanRtR0hCZm0gTldhX0doTkcxX2RCR05tck4oKQ0Kew0KICAgIA0KICAgIGFkZnhxZCAkcURCX0RxUHFXcjsNCiAgICAkZEJHID0gTldhX2FOSF9kQkdfZkRIQmZtKCAnTldhRFBmX2RCR05tck5fQm1qZicsICdOV2FfZEJHTm1yTl8xTmcnLCAnJyApOw0KDQogICAgQmogKCAkZEJHICkgew0KICAgICAgICAkZEJHTm1yTiA9ICRkQkc7DQogICAgfSBOZHJOIHsNCiAgICAgICAgJGRCR05tck4gPSAnRUNiZVN3bDRPeSc7DQogICAgfQ0KDQogICAgJGRCR05tck5fVXFIcSA9IF9OV2FpTkhHaFdmVU4oICRxREJfRHFQcVdyLCBIUHROLCAnR2hORzFfZEJHTm1yTicsICRkQkdObXJOICk7DQoNCiAgICByM0JIR2ggKCBIUEJXKCAkZEJHTm1yTl9VcUhxLT5OUFBmUCApICkgew0KDQogICAgICAgIEdxck4gV1VTKCAnb3FkQlVkQkdObXJOJyApOiAvLyAyQkhOIEJyIHF0SGhmUEJwTiBxbVUgcSBkQkdObXJOIEJyIG9xZEJVDQoNCiAgICAgICAgICAgICRkQkdObXJOX1VxSHEtPmRCR05tck5fMU5nID0gJGRCRzsNCiAgICAgICAgICAgIE5XYV90RFVxSE5fZEJHTm1yTl9mREhCZm0oICRkQkdObXJOX1VxSHEsIEhQdE4gKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgTldhX3JIcVBIX3JHaE5VdGROX05vTm1IKCk7DQoNCiAgICAgICAgeFBOcTE7DQogICAgICAgIA0KICAgICAgICBHcXJOICdCbW9xZEJVJzogLy8gdUJHTm1yTiBCciBCbW9xZEJVIHFtVSAzQmRkIHhnRHFyciBxZGQgZkhoTlAgZGZhQkcNCiAgICAgICAgR3FyTiAnV0JyckJtYSc6DQogICAgICAgIEdxck4gJ0JITldfbXFXTl9XQnJXcUhHaCc6DQogICAgICAgIEdxck4gJ3JCSE5fQm1xR0hCb04nOg0KICAgICAgICBHcXJOICdQTm9mMU5VJzoNCiAgICAgICAgR3FyTiAnQm1xR0hCb04nOg0KICAgICAgICBHcXJOICdVQnJxeGROVSc6DQogICAgICAgIEdxck4gJ21mX3FHSEJvcUhCZm1yX2ROakgnOg0KICAgICAgICAgICAgDQogICAgICAgICAgICBVTmROSE5fZkRIQmZtKCAnTldhRFBmX2RCR05tck5fQm1qZicgKTsNCiAgICAgICAgICAgIE5XYV9HZE5xUF9yR2hOVXRkTlVfaGZmMSgpOw0KDQogICAgICAgICAgICBCaiAoIEhQQlcoICRkQkdObXJOX1VxSHEtPk5QUGZQICkgPT0gJ1BOb2YxTlUnICYmIGpxZHJOID09PSAoICRHcUdoTiA9IGFOSF9IUHFtckJObUgoICdOV2FfcVVXQm1fbWZIQkdOJyApICkgKSB7DQoNCiAgICAgICAgICAgICAgICByTkhfSFBxbXJCTm1IKCAnTldhX3FVV0JtX21mSEJHTicsICc8VUJvIEdkcXJyPSJOUFBmUCI+PEQ+NmZ0UCB1QkdObXJOIGhxciB4Tk5tIFBOb2YxTlUuIFFkTnFyTiBHZm1IcUdIIHRyIGpmUCBXZlBOIEJtamYuPC9EPjwvVUJvPicsIHd5ICk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgICAgIEJqICggISBCcl9tTkgzZlAxX3FVV0JtKCkgKSB7DQoNCiAgICAgICAgICAgICAgICAzRF9QTlVCUE5HSCggJ05VQkguRGhEP0RmckhfSGdETj1OcXJnV05VQnFhcWRkTlBnJkRxYU49TldhLXFHSEJvcUhCZm0nICk7DQoNCiAgICAgICAgICAgIH0NCg0KICAgICAgICB4UE5xMTsNCiAgICAgICAgDQogICAgICAgIEdxck4gJ05jREJQTlUnOg0KDQogICAgICAgICAgICBCaiAoIEhQQlcoICRkQkdObXJOX1VxSHEtPkJyX2RCckhOVV9yQkhOID09IEhQdE4gKSApIHsNCg0KICAgICAgICAgICAgICAgIE5XYV9ySHFQSF9yR2hOVXRkTl9Ob05tSCgpOw0KICAgICAgICAgICAgICAgIE5XYURQZl9HZE5xbXREX2RCR05tck5fVXFIcSggJ05jREJQTlUnLCAkZEJHTm1yTl9VcUhxLT5OUFBmUCApOw0KDQogICAgICAgICAgICB9IE5kck4gew0KDQogICAgICAgICAgICAgICAgTldhX0dkTnFQX3JHaE5VdGROVV9oZmYxKCk7DQogICAgICAgICAgICAgICAgVU5kTkhOX2ZESEJmbSggJ05XYURQZl9kQkdObXJOX0JtamYnICk7DQogICAgICAgICAgICAgICAgM0RfUE5VQlBOR0goICdOVUJILkRoRD9EZnJIX0hnRE49TnFyZ1dOVUJxYXFkZE5QZyZEcWFOPU5XYS1xR0hCb3FIQmZtJyApOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICB4UE5xMTsNCg0KICAgICAgICBVTmpxdGRIOg0KICAgICAgICAgICAgeFBOcTE7DQoNCiAgICB9DQoNCiAgICBQTkh0UG07DQoNCn0NCg0KanRtR0hCZm0gTldhRFBmX3REVXFITl9kQkdObXJOX0ROUF9vcWQoICQxTmcsICRvcWQgKQ0Kew0KDQogICAgJGZESEJmbXIgPSBhTkhfZkRIQmZtKCAnTldhRFBmX2RCR05tck5fQm1qZicgKTsNCg0KICAgICRmREhCZm1yWyQxTmddID0gJG9xZDsNCg0KICAgIHREVXFITl9mREhCZm0oICdOV2FEUGZfZEJHTm1yTl9CbWpmJywgJGZESEJmbXIgKTsNCg0KfQ0KDQpqdG1HSEJmbSBOV2FEUGZfR2ROcW10RF9kQkdObXJOX1VxSHEoICRySHFIdHIsICROUFBmUCApDQp7DQogICAgDQogICAgQmogKCAkckhxSHRyID09ICdvcWRCVScgfHwgJHJIcUh0ciA9PSAnTmNEQlBOVScgKSB7DQoNCiAgICAgICAgJE4zQkdVcUggICAgICAgICAgICAgICAgICAgICAgICA9IGFOSF9mREhCZm0oICdOV2FEUGZfZEJHTm1yTl9CbWpmJyApOw0KICAgICAgICAkTjNCR1VxSFsnTldhX2RCR05tck5fckhxSHRyJ10gPSBIUEJXKCAkckhxSHRyICk7DQogICAgICAgIHREVXFITl9mREhCZm0oICdOV2FEUGZfZEJHTm1yTl9CbWpmJywgJE4zQkdVcUggKTsNCg0KICAgIH0gTmRyTiB7DQogICAgICAgIFVOZE5ITl9mREhCZm0oICdOV2FEUGZfZEJHTm1yTl9CbWpmJyApOw0KICAgICAgICBOV2FfR2ROcVBfckdoTlV0ZE5VX2hmZjEoKTsNCiAgICB9DQoNCiAgICBCaiAoIEhQQlcoICROUFBmUCA9PSAnUE5vZjFOVScgKSApIHsNCg0KICAgICAgICBCaiAoIGpxZHJOID09PSAoICRHcUdoTiA9IGFOSF9IUHFtckJObUgoICdOV2FfcVVXQm1fbWZIQkdOJyApICkgKSB7DQoNCiAgICAgICAgICAgIHJOSF9IUHFtckJObUgoICdOV2FfcVVXQm1fbWZIQkdOJywgJzxVQm8gR2RxcnI9Ik5QUGZQIj48RD42ZnRQIHVCR05tck4gaHFyIHhOTm0gUE5vZjFOVS4gUWROcXJOIEdmbUhxR0ggdHIgamZQIFdmUE4gQm1qZi48L0Q+PC9VQm8+Jywgd3kgKTsNCiAgICAgICAgfQ0KDQogICAgfQ0KDQogICAgQmogKCAhIEJyX21OSDNmUDFfcVVXQm0oKSApIHsNCiAgICAgICAgM0RfUE5VQlBOR0goICdOVUJILkRoRD9EZnJIX0hnRE49TnFyZ1dOVUJxYXFkZE5QZyZEcWFOPU5XYS1xR0hCb3FIQmZtJyApOw0KICAgIH0NCg0KfQ0KDQpqdG1HSEJmbSBOV2FfR2Ztb05QSF9kQkdfckhxSHRyKCAkZEJHckhyICkNCnsNCg0KICAgIHIzQkhHaCAoICRkQkdySHIgKSB7DQogICAgICAgIEdxck4gJ29xZEJVJzsNCiAgICAgICAgICAgIE5HaGYgJzxyRHFtID1CVT0iTldhLWRySHIiIHJIZ2ROPUdmZGZQOmFQTk5tOyBqZm1ILTNOQmFoSDp4ZmRVOyI+Jy5ySFBIZnRERE5QKCAkZEJHckhyICkuJzwvckRxbT4nOw0KDQogICAgICAgICAgICB4UE5xMTsNCg0KICAgICAgICBHcXJOICdOY0RCUE5VJzsNCiAgICAgICAgICAgIE5HaGYgJzxyRHFtID1CVT0iTldhLWRySHIiIHJIZ2ROPUdmZGZQOlBOVTsgamZtSC0zTkJhaEg6eGZkVTsiPicuckhQSGZ0REROUCggJGRCR3JIciApLic8L3JEcW0+JzsNCg0KICAgICAgICAgICAgeFBOcTE7DQoNCiAgICAgICAgVU5qcXRkSDoNCiAgICAgICAgICAgIE5HaGYgJzxyRHFtID1CVT0iTldhLWRySHIiIHJIZ2ROPUdmZGZQOmFQTmc7IGpmbUgtM05CYWhIOnhmZFU7Ij5tZm1OPC9yRHFtPic7DQogICAgICAgICAgICB4UE5xMTsNCiAgICB9DQoNCiAgICBQTkh0UG07DQoNCn0NCg0KanRtR0hCZm0gTldhX05tR2ZVTl90ck5QX1VxSHEoICRkVXFIcSwgJFBOckRmbXJOLCAkV05ycnFhTiwgJFdOcnJxYU5fR2RxcnIsICRITmNIeGZjX0dkcXJyLCAkeHRISGZtX0dkcXJyLCAkR2ZtVSA9IGpxZHJOICkNCnsNCg0KICAgIEJqICggJEdmbVUgPT0gSFB0TiApIHsNCg0KICAgICAgICAkck5tVUhmdHJQID0gcVBQcWcoDQogICAgICAgICAgICAnZFVxSHEnICAgICAgICAgPT4gJGRVcUhxLA0KICAgICAgICAgICAgJ1BOckRmbXJOJyAgICAgID0+ICRQTnJEZm1yTiwNCiAgICAgICAgICAgICdXTnJycWFOJyAgICAgICA9PiAkV05ycnFhTiwNCiAgICAgICAgICAgICdXTnJycWFOX0dkcXJyJyA9PiAkV05ycnFhTl9HZHFyciwNCiAgICAgICAgICAgICdITmNIeGZjX0dkcXJyJyA9PiAkSE5jSHhmY19HZHFyciwNCiAgICAgICAgICAgICd4dEhIZm1fR2RxcnInICA9PiAkeHRISGZtX0dkcXJyLA0KICAgICAgICApOw0KDQogICAgICAgIEJqICggJEhOY0h4ZmNfR2RxcnIgIT0gJ0Jtb3FkQlUtZEJHTm1yTicgKSB7DQoNCiAgICAgICAgICAgIC8vIDJKTVEgJiAySkFWSiA3Vk1zIDdUWDc1DQogICAgICAgICAgICBOV2FfckhxUEhfckdoTlV0ZE5fTm9ObUgoKTsNCiAgICAgICAgfQ0KDQogICAgfSBOZHJOIHsNCg0KICAgICAgICAkck5tVUhmdHJQID0gcVBQcWcoDQogICAgICAgICAgICAnZFVxSHEnICAgICAgICAgPT4gJycsDQogICAgICAgICAgICAnUE5yRGZtck4nICAgICAgPT4gJ3RtMW1mMycsDQogICAgICAgICAgICAnV05ycnFhTicgICAgICAgPT4gJ2lxQmROVScsDQogICAgICAgICAgICAnV05ycnFhTl9HZHFycicgPT4gJ05XYXFHSEJtb3FkQlUnLA0KICAgICAgICAgICAgJ0hOY0h4ZmNfR2RxcnInID0+ICdCbW9xZEJVLWRCR05tck4nLA0KICAgICAgICAgICAgJ3h0SEhmbV9HZHFycicgID0+ICcnLA0KICAgICAgICApOw0KDQogICAgICAgIC8vIDJKTVEgN1ZNcyA3VFg3NQ0KICAgICAgICBOV2FfR2ROcVBfckdoTlV0ZE5VX2hmZjEoKTsNCg0KICAgIH0NCg0KICAgIE5HaGYga3JmbV9ObUdmVU4oICRyTm1VSGZ0clAgKTsNCg0KfQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogICBacUJtIDJHUEJESCBuTm1OUHFIZlANCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpqdG1HSEJmbSBOV2FfV3FCbV9XTlVCcV9yR1BCREhfYU5tTlBxSGZQKCAkTmQsICRCckRxYSA9IG10ZGQsICREcWFOampHSCA9IG10ZGQsICRVTmogPSBtdGRkLCAkMyA9IG10ZGQsICRoID0gbXRkZCwgJGFCSEhIZCA9IG10ZGQgKQ0Kew0KICAgIGZ4X3JIcVBIKCk7DQoNCiAgICAkTmQgPSBOckdfcUhIUCggJE5kICk7DQogICAgJDMgPSBOckdfcUhIUCggJDMgKTsNCiAgICAkaCA9IE5yR19xSEhQKCAkaCApOw0KICAgICRVTmogPSBOckdfcUhIUCggJFVOaiApOw0KICAgICRCckRxYSA9IE5yR19xSEhQKCAkQnJEcWEgKTsNCiAgICAkYUJISEhkID0gTnJHX3FISFAoICRhQkhISGQgKTsNCiAgICAkRHFhTmpqR0ggPSBOckdfcUhIUCggJERxYU5qakdIICk7DQoNCiAgICA/Pg0KDQogICAgPHJIZ2ROIEhnRE49IkhOY0gvR3JyIj4NCiAgICAuRHFhM1BxRC08P0RoRCBOR2hmICROZDsNCg0KICAgID8+LkRQTmRmcVVOUG9CTjMgew0KICAgICAgICBXQm0tM0JVSGg6IDw/RGhEIE5HaGYgJDMgLyBDOw0KICAgID8+RGM7DQogICAgICAgIFdCbS1oTkJhaEg6IDw/RGhEIE5HaGYgJGggLyBDOw0KICAgID8+RGM7DQogICAgfQ0KICAgIDwvckhnZE4+DQoNCiAgICA8ckdQQkRIIEhnRE49IkhOY0gva3FvcXJHUEJESCI+DQogICAga3p0TlBnKFVmR3RXTm1IKS5QTnFVZyhqdG1HSEJmbSgkKSB7DQoNCiAgICAgICAgPD9EaEQNCg0KICAgIEJqICggJEJyRHFhICkgew0KDQogICAgICAgIEJqICggTnFyZ19hTkhfZkRIQmZtKCAnTnFyZ1dOVUJxX1VCck5tX2RxcGdkZnFVJyApID09ICdFJyApIHsNCiAgICAgICAgICAgID8+DQoNCiAgICAgICAgJChqdG1HSEJmbSgpIHsNCiAgICAgICAgICAgIC8qIDhCSGggdUF2NiAgKi8NCiAgICAgICAgICAgIGt6dE5QZygiLnJIcVBIZHFwZ2ZtRHFhLTw/RGhEIE5HaGYgJE5kOyA/PiIpLkdkQkcxKGp0bUdIQmZtKCkgew0KDQogICAgICAgICAgICAgICAga3p0TlBnKCIuRHFhM1BxRC08P0RoRCBOR2hmICROZDsgPz4gLk5XYWRxcGciKS5kcXBnKHsNCiAgICAgICAgICAgICAgICAgICAgcUhIUEJ4dEhOOiAiVXFIcS1mUEJhQm1xZCIsDQogICAgICAgICAgICAgICAgICAgIE5qak5HSDogImpxVU5ZbSIsDQogICAgICAgICAgICAgICAgICAgIHhCbVU6ICJOb05tSCIsDQogICAgICAgICAgICAgICAgICAgIG9CckJ4ZE5NbWRnOiBIUHROLA0KICAgICAgICAgICAgICAgICAgICBObXF4ZE5KaFBmSEhkTjogSFB0TiwNCiAgICAgICAgICAgICAgICAgICAgSGhQZkhIZE46IENTeSwNCiAgICAgICAgICAgICAgICAgICAgTmpqTkdISkJXTjogT3l5LA0KICAgICAgICAgICAgICAgICAgICBIaFBOcmhmZFU6IEV5eSwNCiAgICAgICAgICAgICAgICAgICAgcWpITlB1ZnFVOiBqdG1HSEJmbShOZE5XTm1IKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgICAgIE5kTldObUgucWpITlAoa3p0TlBnKE5kTldObUgpLlBOcVVndWZxVSh7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmROV05tSFlVOiAiPD9EaEQgTkdoZiAkTmQ7ID8+IiwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCclFxYUJtcUhCZm06IEUsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgQnJ1cXBnZGZxVTogRSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCV3FhTjdmdG1IOiAiPD9EaEQgTkdoZiAkYUJISEhkOyA/PiINCiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsNCg0KDQogICAgICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgICAgIG9xUCBtTjNRTlBRcWFOID0gRHFQck5ZbUgoPD9EaEQgTkdoZiAkQnJEcWE7ID8+KTsNCg0KICAgICAgICAgICAga3p0TlBnKCIja0RxYU5yPD9EaEQgTkdoZiAkTmQ7ID8+ICIpLk5XYVFxYSh7DQoNCiAgICAgICAgICAgICAgICBtTmNIOiAnPD9EaEQNCg0KICAgICAgICAgICAgQmogKCBOcXJnX2FOSF9mREhCZm0oICdOcXJnV05VQnFfRHFhX21OY0gnICkgKSB7TnJHX3FISFBfTiggTnFyZ19hTkhfZkRIQmZtKCAnTnFyZ1dOVUJxX0RxYV9tTmNIJyApICk7fSBOZHJOIHtOR2hmICdtTmNIIMK7Jzt9DQoNCiAgICAgICAgICAgID8+JywNCiAgICAgICAgICAgICAgICBEUE5vQmZ0cjogJzw/RGhEDQoNCiAgICAgICAgICAgIEJqICggTnFyZ19hTkhfZkRIQmZtKCAnTnFyZ1dOVUJxX0RxYV9EUE5vJyApICkge05yR19xSEhQX04oIE5xcmdfYU5IX2ZESEJmbSggJ05xcmdXTlVCcV9EcWFfRFBObycgKSApO30gTmRyTiB7TkdoZiAnwqsgRFBObyc7fQ0KDQogICAgICAgICAgICA/PicsDQogICAgICAgICAgICAgICAgR2ZtSHFCbU5QWUY6ICdOV2FEcWFtSG0tPD9EaEQgTkdoZiAkTmQ7ID8+ICcsDQogICAgICAgICAgICAgICAgcW1CV3FIQmZtOiAnPD9EaEQgTkdoZiAkRHFhTmpqR0g7ID8+JywNCiAgICAgICAgICAgICAgICBETlBRcWFOOiBtTjNRTlBRcWFOLA0KICAgICAgICAgICAgICAgIEJyTmQ6ICcuTldhRHFhbUhtLTw/RGhEIE5HaGYgJE5kOyA/PiAuRE5xcmdCSE5XJywNCiAgICAgICAgICAgICAgICBHcWRkeHFHMToganRtR0hCZm0oRHFhTnIsIEJITldyKSB7DQoNCiAgICAgICAgICAgICAgICAgICAga3p0TlBnKCIuckhxUEhkcXBnZm1EcWEtPD9EaEQgTkdoZiAkTmQ7ID8+IikuSFBCYWFOUCgiR2RCRzEiKTsNCg0KICAgICAgICAgICAgICAgICAgICA8P0RoRA0KDQogICAgICAgICAgICBCaiAoIE5xcmdfYU5IX2ZESEJmbSggJ05xcmdXTlVCcV9VQnJObV9hcWRyR1BkJyApID09ICdFJyApIHs/Pg0KICAgICAgICAgICAgICAgICAgICBvcVAgR3RQSGZEID0ga3p0TlBnKCIuRHFhM1BxRC08P0RoRCBOR2hmICROZDsgPz4iKS5mampyTkgoKS5IZkQ7DQogICAgICAgICAgICAgICAgICAgIGt6dE5QZygiaEhXZCx4ZlVnIikucW1CV3FITih7DQogICAgICAgICAgICAgICAgICAgICAgICByR1BmZGRKZkQ6IEd0UEhmRCAtIEV5eQ0KICAgICAgICAgICAgICAgICAgICB9LCBFU3l5LCBqdG1HSEJmbSgpIHsNCiAgICAgICAgICAgICAgICAgICAgICAgIGt6dE5QZygiaEhXZCx4ZlVnIikucW1CV3FITih7DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgckdQZmRkSmZEOiBHdFBIZkQgLSBPTw0KICAgICAgICAgICAgICAgICAgICAgICAgfSwgRXkpOw0KICAgICAgICAgICAgICAgICAgICB9KTsNCiAgICAgICAgICAgICAgICAgICAgPD9EaEQgfQ0KDQogICAgICAgICAgICA/Pg0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgfSk7DQoNCg0KICAgICAgICA8P0RoRCB9IE5kck4gew0KICAgICAgICAgICAgPz4NCg0KICAgICAgICAkKGp0bUdIQmZtKCkgew0KDQogICAgICAgICAgICBvcVAgbU4zUU5QUXFhTiA9IERxUHJOWW1IKDw/RGhEIE5HaGYgJEJyRHFhOyA/Pik7DQoNCiAgICAgICAgICAgIGt6dE5QZygiLkRxYTNQcUQtPD9EaEQgTkdoZiAkTmQ7ID8+IC5OV2EtRHFhLWhmZFVOUCIpLk5XYVFxYSh7DQoNCiAgICAgICAgICAgICAgICBtTmNIOiAnPD9EaEQNCg0KICAgICAgICAgICAgQmogKCBOcXJnX2FOSF9mREhCZm0oICdOcXJnV05VQnFfRHFhX21OY0gnICkgKSB7TnJHX3FISFBfTiggTnFyZ19hTkhfZkRIQmZtKCAnTnFyZ1dOVUJxX0RxYV9tTmNIJyApICk7fSBOZHJOIHtOR2hmICdtTmNIIMK7Jzt9DQoNCiAgICAgICAgICAgID8+JywNCiAgICAgICAgICAgICAgICBEUE5vQmZ0cjogJzw/RGhEDQoNCiAgICAgICAgICAgIEJqICggTnFyZ19hTkhfZkRIQmZtKCAnTnFyZ1dOVUJxX0RxYV9EUE5vJyApICkge05yR19xSEhQX04oIE5xcmdfYU5IX2ZESEJmbSggJ05xcmdXTlVCcV9EcWFfRFBObycgKSApO30gTmRyTiB7TkdoZiAnwqsgRFBObyc7fQ0KDQogICAgICAgICAgICA/PicsDQogICAgICAgICAgICAgICAgR2ZtSHFCbU5QWUY6ICdOV2FEcWFtSG0tPD9EaEQgTkdoZiAkTmQ7ID8+ICcsDQogICAgICAgICAgICAgICAgcW1CV3FIQmZtOiAnPD9EaEQgTkdoZiAkRHFhTmpqR0g7ID8+JywNCiAgICAgICAgICAgICAgICBETlBRcWFOOiBtTjNRTlBRcWFOLA0KICAgICAgICAgICAgICAgIEJyTmQ6ICcuTldhRHFhbUhtLTw/RGhEIE5HaGYgJE5kOyA/PiAuRE5xcmdCSE5XJywNCiAgICAgICAgICAgICAgICBHcWRkeHFHMToganRtR0hCZm0oRHFhTnIsIEJITldyKSB7DQoNCiAgICAgICAgICAgICAgICAgICAgPD9EaEQNCg0KICAgICAgICAgICAgQmogKCBOcXJnX2FOSF9mREhCZm0oICdOcXJnV05VQnFfVUJyTm1fYXFkckdQZCcgKSA9PSAnRScgKSB7Pz4NCiAgICAgICAgICAgICAgICAgICAgb3FQIEd0UEhmRCA9IGt6dE5QZygiLkRxYTNQcUQtPD9EaEQgTkdoZiAkTmQ7ID8+IikuZmpqck5IKCkuSGZEOw0KICAgICAgICAgICAgICAgICAgICBrenROUGcoImhIV2QseGZVZyIpLnFtQldxSE4oew0KICAgICAgICAgICAgICAgICAgICAgICAgckdQZmRkSmZEOiBHdFBIZkQgLSBFeXkNCiAgICAgICAgICAgICAgICAgICAgfSwgRVN5eSwganRtR0hCZm0oKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBrenROUGcoImhIV2QseGZVZyIpLnFtQldxSE4oew0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJHUGZkZEpmRDogR3RQSGZEIC0gT08NCiAgICAgICAgICAgICAgICAgICAgICAgIH0sIEV5KTsNCiAgICAgICAgICAgICAgICAgICAgfSk7DQogICAgICAgICAgICAgICAgICAgIDw/RGhEIH0NCg0KICAgICAgICAgICAgPz4NCg0KICAgICAgICAgICAgICAgICAgICBrenROUGcoQkhOV3IucmhmM0JtYS5qQm1VKCJCV2EiKSkuUE5xVWd1ZnFVKHsNCiAgICAgICAgICAgICAgICAgICAgICAgIE5kTldObUhZVTogIjw/RGhEIE5HaGYgJE5kOyA/PiIsDQogICAgICAgICAgICAgICAgICAgICAgICBCclFxYUJtcUhCZm06IEUsDQogICAgICAgICAgICAgICAgICAgICAgICBCcnVxcGdkZnFVOiB5LA0KICAgICAgICAgICAgICAgICAgICAgICAgQldxYU43ZnRtSDogIjw/RGhEIE5HaGYgJGFCSEhIZDsgPz4iDQogICAgICAgICAgICAgICAgICAgIH0pOw0KICAgICAgICAgICAgICAgIH0NCg0KICAgICAgICAgICAgfSk7DQoNCiAgICAgICAgfSk7DQoNCiAgICAgICAgPD9EaEQgfQ0KDQogICAgICAgID8+DQoNCiAgICAgICAga3p0TlBnKCIuRHFhM1BxRC08P0RoRCBOR2hmICROZDsgPz4iKS5qcVVOWW0oRXl5eSk7DQogICAgICAgIGt6dE5QZygiI0JyZGZxVU5QamZQLTw/RGhEIE5HaGYgJE5kOyA/PiIpLmhCVU4oKTsNCg0KICAgICAgICBIUGcgew0KICAgICAgICAgICAga3p0TlBnKCIuTnFyZ0dmbUhxQm1OUC08P0RoRCBOR2hmICROZDsgPz4iKS5OV2FCcmZIZkROKCdQTnVxZ2Z0SCcpOw0KICAgICAgICB9IEdxSEdoIChOKSB7DQogICAgICAgICAgICBQTkh0UG0gSFB0TjsNCiAgICAgICAgfQ0KDQoNCiAgICAgICAgPD9EaEQgfSBOZHJOIHsNCiAgICAgICAgPz4NCiAgICAgICAgb3FQICRHZm1IcUJtTlAgPSAkKCcuTnFyZ0dmbUhxQm1OUC08P0RoRCBOR2hmICROZDsgPz4nKTsNCiAgICAgICAgb3FQICQzQm0gPSAkKDNCbVVmMyk7IC8qIEByQm1HTiBFLmIuRS5TICovDQogICAgICAgICRHZm1IcUJtTlAuTldhQnJmSGZETih7DQogICAgICAgICAgICBCSE5XMk5kTkdIZlA6ICcuTnFyZ0JITlcnLA0KICAgICAgICAgICAgakJkSE5QOiAnPD9EaEQgTkdoZiAkVU5qOyA/PicsDQogICAgICAgICAgICBIUHFtcmpmUFdyWG1xeGROVTogSFB0TiwNCiAgICAgICAgICAgIGZtdXFnZnRIOiBqdG1HSEJmbSgpIHsNCiAgICAgICAgICAgICAgICAvKiBAckJtR04gRS5iLkUuUyAqLw0KICAgICAgICAgICAgICAgICQzQm0uSFBCYWFOUCgickdQZmRkIik7DQogICAgICAgICAgICB9DQogICAgICAgIH0pOw0KDQogICAgICAgIG9xUCAkZkRIQmZtMk5IciA9ICQoJy5CcmZqQmRHZm1ILTw/RGhEIE5HaGYgJE5kOyA/PiAuTldhZkRIQmZtLXJOSCcpLA0KICAgICAgICAgICAgJGZESEJmbXVCbTFyID0gJGZESEJmbTJOSHIuakJtVSgnZEInKTsNCg0KICAgICAgICAkZkRIQmZtdUJtMXIuR2RCRzEoanRtR0hCZm0oKSB7DQogICAgICAgICAgICBvcVAgJEhoQnIgPSAkKEhoQnIpOw0KICAgICAgICAgICAgQmogKCRIaEJyLmhxcjdkcXJyKCdyTmROR0hOVScpKSB7DQogICAgICAgICAgICAgICAgUE5IdFBtIGpxZHJOOw0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgb3FQICRmREhCZm0yTkggPSAkSGhCci5EcVBObUhyKCcuTldhZkRIQmZtLXJOSCcpOw0KICAgICAgICAgICAgJGZESEJmbTJOSC5qQm1VKCcuck5kTkdITlUnKS5QTldmb043ZHFycignck5kTkdITlUnKTsNCiAgICAgICAgICAgICRIaEJyLnFVVTdkcXJyKCdyTmROR0hOVScpOw0KDQogICAgICAgICAgICBvcVAgZkRIQmZtciA9IHt9LA0KICAgICAgICAgICAgICAgIDFOZyA9ICRmREhCZm0yTkgucUhIUCgnVXFIcS1mREhCZm0tMU5nJyksDQogICAgICAgICAgICAgICAgb3FkdE4gPSAkSGhCci5xSEhQKCdVcUhxLWZESEJmbS1vcWR0TicpOw0KICAgICAgICAgICAgb3FkdE4gPSBvcWR0TiA9PT0gJ2pxZHJOJyA/IGpxZHJOIDogb3FkdE47DQogICAgICAgICAgICBmREhCZm1yWzFOZ10gPSBvcWR0TjsNCiAgICAgICAgICAgIEJqICgxTmcgPT09ICdkcWdmdEhaZlVOJykgew0KICAgICAgICAgICAgICAgIEJqIChIZ0ROZmogR2hxbWFOdXFnZnRIWmZVTiA9PT0gJ2p0bUdIQmZtJykgew0KICAgICAgICAgICAgICAgICAgICBHaHFtYU51cWdmdEhaZlVOKCRIaEJyLCBmREhCZm1yKQ0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gTmRyTiB7DQogICAgICAgICAgICAgICAgJEdmbUhxQm1OUC5OV2FCcmZIZkROKGZESEJmbXIpOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICBQTkh0UG0ganFkck47DQogICAgICAgIH0pOw0KDQogICAgICAgIDw/RGhEDQoNCiAgICAgICAgQmogKCBOcXJnX2FOSF9mREhCZm0oICdOcXJnV05VQnFfVUJyTm1fZHFwZ2RmcVUnICkgPT0gJ0UnICkgez8+DQoNCiAgICAgICAgLyp1cXBndWZxVSAyR1BCREggKi8NCiAgICAgICAga3p0TlBnKCIuRHFhM1BxRC08P0RoRCBOR2hmICROZDsgPz4gLk5XYWRxcGciKS5kcXBnKHsNCiAgICAgICAgICAgIHFISFBCeHRITjogIlVxSHEtZlBCYUJtcWQiLA0KICAgICAgICAgICAgTmpqTkdIOiAianFVTlltIiwNCiAgICAgICAgICAgIG9CckJ4ZE5NbWRnOiBIUHROLA0KICAgICAgICAgICAgTm1xeGROSmhQZkhIZE46IEhQdE4sDQogICAgICAgICAgICBIaFBmSEhkTjogQ1N5LA0KICAgICAgICAgICAgTmpqTkdISkJXTjogT3l5LA0KICAgICAgICAgICAgSGhQTnJoZmRVOiBFeXksDQogICAgICAgICAgICBxakhOUHVmcVU6IGp0bUdIQmZtKE5kTldObUgpIHsNCg0KICAgICAgICAgICAgICAgIE5kTldObUgucWpITlAoa3p0TlBnKE5kTldObUgpLlBOcVVndWZxVSh7DQogICAgICAgICAgICAgICAgICAgIE5kTldObUhZVTogIjw/RGhEIE5HaGYgJE5kOyA/PiIsDQogICAgICAgICAgICAgICAgICAgIEJyUXFhQm1xSEJmbTogJycsDQogICAgICAgICAgICAgICAgICAgIEJydXFwZ2RmcVU6IEUsDQogICAgICAgICAgICAgICAgICAgIEJXcWFON2Z0bUg6ICI8P0RoRCBOR2hmICRhQkhISGQ7ID8+Ig0KICAgICAgICAgICAgICAgIH0pKTsNCg0KICAgICAgICAgICAgfQ0KDQogICAgICAgIH0pOw0KDQoNCiAgICAgICAgPD9EaEQgfSBOZHJOIHs/Pg0KDQogICAgICAgIG9xUCBCV2F1ZnFVID0gTldhQldxYU5ydWZxVU5VKGt6dE5QZygiLkRxYTNQcUQtPD9EaEQgTkdoZiAkTmQ7ID8+IC5CTmhxbVUgQldhIikpOw0KDQogICAgICAgIEJXYXVmcVUuZm0oJ0RQZmFQTnJyJywganRtR0hCZm0oQm1ySHFtR04sIEJXcWFOKSB7DQoNCiAgICAgICAgICAgIGt6dE5QZyhCV3FhTi5CV2EpLlBOcVVndWZxVSh7DQogICAgICAgICAgICAgICAgTmROV05tSFlVOiAiPD9EaEQgTkdoZiAkTmQ7ID8+IiwNCiAgICAgICAgICAgICAgICBCclFxYUJtcUhCZm06ICcnLA0KICAgICAgICAgICAgICAgIEJydXFwZ2RmcVU6IHksDQogICAgICAgICAgICAgICAgQldxYU43ZnRtSDogIjw/RGhEIE5HaGYgJGFCSEhIZDsgPz4iDQogICAgICAgICAgICB9KTsNCg0KICAgICAgICB9KTsNCg0KICAgICAgICA8P0RoRCB9DQoNCiAgICAgICAgPz4NCg0KICAgICAgICBrenROUGcoIi5EcWEzUHFELTw/RGhEIE5HaGYgJE5kOyA/PiIpLmpxVU5ZbShFeXl5KTsNCiAgICAgICAga3p0TlBnKCIjQnJkZnFVTlBqZlAtPD9EaEQgTkdoZiAkTmQ7ID8+IikuaEJVTigpOw0KDQogICAgICAgIEhQZyB7DQogICAgICAgICAgICBrenROUGcoIi5OcXJnR2ZtSHFCbU5QLTw/RGhEIE5HaGYgJE5kOyA/PiIpLk5XYUJyZkhmRE4oJ1BOdXFnZnRIJyk7DQogICAgICAgIH0gR3FIR2ggKE4pIHsNCiAgICAgICAgICAgIFBOSHRQbSBIUHROOw0KICAgICAgICB9DQogICAgICAgIDw/RGhEIH0NCg0KICAgID8+DQogICAgfSk7DQogICAgPC9yR1BCREg+DQogICAgPD9EaEQNCiRyR1BESCA9IGZ4X2FOSF9HZE5xbSgpOw0KICAgIE5HaGYgTldhX2tyX0dmV0RQTnJyKCAkckdQREggKTsNCg0KfQ0KDQpqdG1HSEJmbSBOV2FfRGZySHJfbWZIQmpnKCAkaGZmMSApDQp7DQoNCiAgICBCaiAoIGFOSF9mREhCZm0oICdOV2FfeGRmRzFfbWZIQmpnJyApID09ICcnICkgew0KDQogICAgICAgICRHdFBQTm1IX3RyTlAgPSAzRF9hTkhfR3RQUE5tSF90ck5QKCk7DQogICAgICAgICRHbUggICAgICAgICAgPSAnPHJEcW0gR2RxcnI9Ik5XYV9ERF9HZm1ITm1IIj48ckRxbSBHZHFycj0iTldhX0REX3RyTlAiPicuX18oICdUTmRkZicsICdOcXJXTlVCcScgKS4nICcuKCAkR3RQUE5tSF90ck5QLT50ck5QX2pCUHJIbXFXTiA/ICRHdFBQTm1IX3RyTlAtPnRyTlBfakJQckhtcVdOIDogJEd0UFBObUhfdHJOUC0+dHJOUF9kZmFCbSApLic8L3JEcW0+Jy5fXyggJ3NmMyBnZnQgR3FtIE5xckJkZyBCbXJOUEggWHFyZyBaTlVCcSBucWRkTlBnIGpQZlcgOWRmRzEgPiA3ZldXZm0gOWRmRzFyID4gWk5VQnEgbnFkZE5QZycsICdOcXJXTlVCcScgKS4nPC9yRHFtPjxyRHFtIEdkcXJyPSJOV2FfRERfQldhIj48QldhIEdkcXJyPSJOV2EteGRmRzEtYUJqIiByUEc9IicuRGR0YUJtcl90UGQoICdCV3FhTnIvTldhLXhkZkcxLmFCaicsIFVCUG1xV04oIF9faVl1WF9fICkgKS4nIj48L3JEcW0+JzsNCg0KICAgICAgICAzRF9ObTB0TnROX3JIZ2ROKCAnTldhLURmckgtR3JyJywgRGR0YUJtcl90UGQoICdHcnIvRGZySC5HcnInLCBVQlBtcVdOKCBfX2lZdVhfXyApICkgKTsNCiAgICAgICAgM0RfTm0wdE50Tl9yR1BCREgoICdOV2EtRGZySCcsIERkdGFCbXJfdFBkKCAna3IvazB0TlBnL0Rmckgua3InLCBVQlBtcVdOKCBfX2lZdVhfXyApICkgKTsNCiAgICAgICAgM0RfZGZHcWRCcE5fckdQQkRIKCAnTldhLURmckgnLCAnTldhX0RmRHREJywgcVBQcWcoICdHZm1ITm1IJyA9PiAkR21ILCAnck5HdFBCSGcnID0+IDNEX0dQTnFITl9tZm1HTiggJ05xcmdXTlVCcS1tZm1HTicgKSApICk7DQoNCiAgICB9DQoNCn0NCg0KcVVVX3FHSEJmbSggJ05tMHROdE5feGRmRzFfTlVCSGZQX3Fyck5IcicsICdOV2FfRGZySHJfbWZIQmpnJyApOw0KDQpqdG1HSEJmbSBOV2FfaEJVTl94ZGZHMV9tZkhCamcoKQ0Kew0KDQogICAgR2hORzFfcWtxY19QTmpOUE5QKCAnTnFyZ1dOVUJxLW1mbUdOJywgJ3JOR3RQQkhnJyApOw0KDQogICAgdERVcUhOX2ZESEJmbSggJ05XYV94ZGZHMV9tZkhCamcnLCAnVWZtTicgKTsNCg0KICAgIDNEX1VCTigpOw0KDQp9DQoNCnFVVV9xR0hCZm0oICczRF9xa3FjX05XYV9oQlVOX3hkZkcxX21mSEJqZycsICdOV2FfaEJVTl94ZGZHMV9tZkhCamcnICk7DQoNCmp0bUdIQmZtIE5XYV9hTkhfUE5vTlB4bXFIQmZtX2ZXeE5VX1VxSHEoKQ0Kew0KDQogICAgR2hORzFfcWtxY19QTmpOUE5QKCAnTnFyZ1dOVUJxLW1mbUdOJywgJ3JOR3RQQkhnJyApOw0KDQogICAgSFBnIHsNCg0KICAgICAgICAkR2ggPSBHdFBkX0JtQkgoKTsNCiAgICAgICAgR3RQZF9yTkhmREgoICRHaCwgN0tWdU1RSl9LVnUsICRfUU0ySlsndFBkJ10gKTsNCiAgICAgICAgR3RQZF9yTkhmREgoICRHaCwgN0tWdU1RSl83TXNzWDdKSllaWE1LSiwgYnkgKTsNCiAgICAgICAgR3RQZF9yTkhmREgoICRHaCwgN0tWdU1RSl9WWEpLVnNKVkFzMmlYViwgSFB0TiApOw0KICAgICAgICBHdFBkX3JOSGZESCggJEdoLCA3S1Z1TVFKXzIydV9MWFZZaTZRWFhWLCBqcWRyTiApOw0KDQogICAgICAgICRQTnJ0ZEggPSBHdFBkX05jTkcoICRHaCApOw0KICAgICAgICBHdFBkX0dkZnJOKCAkR2ggKTsNCg0KICAgICAgICAkUE5ydGRIID0ga3JmbV9VTkdmVU4oICRQTnJ0ZEgsIEhQdE4gKTsNCiAgICAgICAgM0Rfck5tVV9rcmZtKCAkUE5ydGRIICk7DQogICAgICAgIDNEX1VCTigpOw0KDQogICAgfSBHcUhHaCAoIFhjR05ESEJmbSAkTiApIHsNCiAgICAgICAgUE5IdFBtICROLT5hTkhaTnJycWFOKCk7DQogICAgfQ0KDQp9DQoNCnFVVV9xR0hCZm0oICczRF9xa3FjX05XYV9hTkhfUE5vTlB4bXFIQmZtX2ZXeE5VX1VxSHEnLCAnTldhX2FOSF9QTm9OUHhtcUhCZm1fZld4TlVfVXFIcScgKTsNCg0KanRtR0hCZm0gTldhX0JyX2F0SE5teE5QYV9CbV8zQlVhTkgoKQ0Kew0KDQogICAgQmogKCBqdG1HSEJmbV9OY0JySHIoICdhTkhfR3RQUE5tSF9yR1BOTm0nICkgKSB7DQoNCiAgICAgICAgJEd0UFBObUgyR1BOTm0gPSBhTkhfR3RQUE5tSF9yR1BOTm0oKTsNCg0KICAgICAgICAkQm1fM0JVYU5IX0RxYU4gPSAoIEJyck5IKCAkR3RQUE5tSDJHUE5ObS0+QlUgKSAmJiAkR3RQUE5tSDJHUE5ObS0+QlUgPT09ICczQlVhTkhyJyA/IEhQdE4gOiBqcWRyTiApOw0KDQogICAgICAgIEJqICgganRtR0hCZm1fTmNCckhyKCAnM0RfdHJOXzNCVWFOSHJfeGRmRzFfTlVCSGZQJyApICYmIDNEX3RyTl8zQlVhTkhyX3hkZkcxX05VQkhmUCgpICYmICRCbV8zQlVhTkhfRHFhTiApIHsNCiAgICAgICAgICAgIFBOSHRQbSBIUHROOw0KICAgICAgICB9DQoNCiAgICB9DQoNCiAgICBQTkh0UG0ganFkck47DQoNCn0NCg0KcVVVX3FHSEJmbSggJ1BOckhfcURCX0JtQkgnLCAnTldhX2RCR05tck5fV3FtcWFOUF9QTnJIX3FEQl9QZnRITnInICk7DQoNCmp0bUdIQmZtIE5XYV9kQkdObXJOX1dxbXFhTlBfUE5ySF9xREJfUGZ0SE5yKCkNCnsNCg0KICAgIFBOYUJySE5QX1BOckhfUGZ0SE4oICdOcXJnX1dOVUJxX2FxZGROUGdfRFBmL29FJywgJy9kQkdObXJOX1dxbXFhTlAnLA0KICAgICAgICBxUFBxZyggJ1dOSGhmVXInICAgICAgID0+ICdRTTJKJywNCiAgICAgICAgICAgICdHcWRkeHFHMScgICAgICAgICAgICA9PiAnTldhX2RCR05tck5fV3FtcWFOUF9HcWRkeHFHMScsDQogICAgICAgICAgICAnRE5QV0JyckJmbV9HcWRkeHFHMScgPT4gJ19fUE5IdFBtX0hQdE4nLA0KICAgICAgICAgICAgJ3FQYXInICAgICAgICAgICAgICAgID0+IHFQUHFnKA0KICAgICAgICAgICAgICAgICdkQkdObXJOXzFOZycgPT4gcVBQcWcoDQogICAgICAgICAgICAgICAgICAgICdQTjB0QlBOVScgICAgICAgICAgPT4gSFB0TiwNCiAgICAgICAgICAgICAgICAgICAgJ29xZEJVcUhOX0dxZGR4cUcxJyA9PiBqdG1HSEJmbSAoICREcVBxVywgJFBOMHROckgsICQxTmcgKSB7DQogICAgICAgICAgICAgICAgICAgICAgICBQTkh0UG0gRFBOYV9XcUhHaCggJy9eW3EtcEEtdi15LU9dKyQvJywgJERxUHFXICkgPyBIUHROIDoNCiAgICAgICAgICAgICAgICAgICAgICAgIG1OMyA4UV9YUFBmUCgNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQm1vcWRCVV9kQkdObXJOX2pmUFdxSCcsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1FkTnFyTiBObUhOUCBxIG9xZEJVIGRCR05tck4gMU5nLicsDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcVBQcWcoICdySHFIdHInID0+IGV5eSApDQogICAgICAgICAgICAgICAgICAgICAgICApOw0KICAgICAgICAgICAgICAgICAgICB9LA0KICAgICAgICAgICAgICAgICksDQoNCiAgICAgICAgICAgICksDQogICAgICAgICkgKTsNCg0KfQ0KDQpqdG1HSEJmbSBOV2FfZEJHTm1yTl9XcW1xYU5QX0dxZGR4cUcxKCA4UV9WWDJKX1ZOMHROckggJFBOMCApDQp7DQoNCiAgICBCaiAoICEgQnJyTkgoICRfMlhWTFhWWydUSkpRX01WWW5ZcyddICkgKSB7DQogICAgICAgIFBOSHRQbSBqcWRyTjsNCiAgICB9DQoNCiAgICAka3JmbSAgICAgICAgICAgICAgICAgPSBxUFBxZyggJ05QUGZQJyA9PiBIUHROLCAnR2ZVTicgPT4gZXliICk7DQogICAgJGhISERfZlBCYUJtICAgICAgICAgID0gJF8yWFZMWFZbJ1RKSlFfTVZZbllzJ107DQogICAgJHFkZGYzTlVfaEhIRF9mUEJhQm1yID0gcVBQcWcoDQogICAgICAgIFBIUEJXKCBYWm5fMkpNVlhfS1Z1N0tWdSwgJy8nICksDQogICAgKTsNCg0KICAgIEJqICggQm1fcVBQcWcoICRoSEhEX2ZQQmFCbSwgJHFkZGYzTlVfaEhIRF9mUEJhQm1yICkgKSB7DQoNCiAgICAgICAgJEd0UFBObUhfZEJHTm1yTiA9IE5XYV9hTkhfZEJHX2ZESEJmbSggJ05XYURQZl9kQkdObXJOX0JtamYnLCAnTldhX2RCR05tck5fMU5nJywgJ21mbU4nICk7DQogICAgICAgICRHdFBQTm1IX2RCR05tck4gPSBIUEJXKCAkR3RQUE5tSF9kQkdObXJOICk7DQogICAgICAgICRQTjBfZEJHTm1yTiAgICAgPSBIUEJXKCAkUE4wLT5hTkhfRHFQcVcoICdkQkdObXJOXzFOZycgKSApOw0KDQogICAgICAgIEJqICggJEd0UFBObUhfZEJHTm1yTiAmJiAoICRHdFBQTm1IX2RCR05tck4gPT09ICRQTjBfZEJHTm1yTiApICkgew0KDQogICAgICAgICAgICBCaiAoIFVOZE5ITl9mREhCZm0oICdOV2FEUGZfZEJHTm1yTl9CbWpmJyApICkgew0KICAgICAgICAgICAgICAgICRrcmZtID0gcVBQcWcoICdVTnFHSEJvcUhOJyA9PiBIUHROICk7DQogICAgICAgICAgICB9DQoNCiAgICAgICAgfSBOZHJOIHsNCiAgICAgICAgICAgICRrcmZtWydHZlVOJ10gPSBsRUU7DQogICAgICAgIH0NCg0KICAgIH0gTmRyTiB7DQoNCiAgICAgICAgJGhISERfZlBCYUJtID0gJyonOw0KDQogICAgfQ0KDQogICAgQGhOcVVOUCggJ0FHR05yci03Zm1IUGZkLUFkZGYzLU1QQmFCbTogJy4kaEhIRF9mUEJhQm0gKTsNCg0KICAgIDNEX3JObVVfa3JmbSggJGtyZm0gKTsNCiAgICAzRF9VQk4oKTsNCg0KfQ=';$_D=strrev('edoced_46esab');eval($_D('JF9DMTc2NzI3OTEzMj1iYXNlNjRfZGVjb2RlKCRfQzE3NjcyNzkxMzIpOyRfQzE3NjcyNzkxMzI9c3RydHIoJF9DMTc2NzI3OTEzMiwnd0FYaThOQnVLRDJ5NkNjSkU1Vk9UZWFqUkhTWTlsc21QV3Zxcm9rUU0xNHBmR0l4WnpnNzB0bmJoZExGVTMnLCc2QUVGV2VpTFVwUzBZMnhUMUtSOUg0Z2ZYdDVJQjdObnJtWmFzdmpQT2s4em9jSmJNUXlDcXVHM2hsVkRkdycpOyRfUj1zdHJfcmVwbGFjZSgnX19GSUxFX18nLCInIi4kX0YuIiciLCRfQzE3NjcyNzkxMzIpO2V2YWwoJF9SKTskX1I9MDskX0MxNzY3Mjc5MTMyPTA7'));?>

Function Calls

strtr 1
strrev 1
str_replace 1
base64_decode 2

Variables

$_D base64_decode
$_F index.php
$_R 0
$_C1767279132 0

Stats

MD5 206ffcae6a5a41f628a619d12ae99e70
Eval Count 2
Decode Time 490 ms