Jonathan Doklovic avatar Jonathan Doklovic committed a09e3a9

updating sdk installer

Comments (0)

Files changed (362)

ap3-setup-config.sh

+#!/bin/sh
+PRG="${0}"
+while [ -h "${PRG}" ] ; do
+  ls=`ls -ld "${PRG}"`
+  link=`expr "${ls}" : '.*-> \(.*\)$'`
+  if expr "${link}" : '/.*' > /dev/null; then
+    PRG="${link}"
+  else
+    PRG=`dirname "${PRG}"`/"${link}"
+  fi
+done
+PRGDIR=`dirname "${PRG}"`
+MYDIR=`cd "${PRGDIR}" && pwd -P`
+
+AP3_CONFIG_DIR=`cd ~ && pwd -P`/.ap3
+rm -rf $AP3_CONFIG_DIR
+mkdir -p $AP3_CONFIG_DIR
+
+NOW=`date +%Y%m%d`
+UPDATE_FILE="${AP3_CONFIG_DIR}/.last_master_update"
+touch ${UPDATE_FILE}
+echo "${NOW}" > ${UPDATE_FILE};
+
+git clone --recursive https://bitbucket.org/atlassian/ap3-sdk-templates.git $AP3_CONFIG_DIR/templates
+
+#!/bin/sh
+
+has_required_version()
+{
+    if [ -z "$JAVA7_EXISTS" ] ; then
+        if [ `expr $2 \>= $1` -lt 1 ] ; then
+            # version is less than required
+            echo "0"
+        else
+            JAVA7_EXISTS="true"
+            echo "1"
+        fi
+    else
+        echo "1"
+    fi
+}
+
+get_mac_java7()
+{
+    echo `ls -d /Library/Java/JavaVirtualMachines/*1.7.*/ 2>/dev/null | head -n 1`
+}
+
+get_java_home_version()
+{
+    TMP_VERSION=`eval $JAVA_HOME/bin/java -version 2>&1`       
+    TMP_VERSION=`expr "$TMP_VERSION" : '.*"\(1.[0-9\.]*\)["_]'`
+    echo $TMP_VERSION
+}
+
+REQUIRED_JAVA_VERSION=1.7.0
+REQUIRED_GIT_VERSION=1.6.5
+
+####################################################
+# Determine the location of JAVA_HOME              #
+# This was modified from the mvn command licensed  #
+# under the Apache-2.0 license                     #
+# http://www.apache.org/licenses/LICENSE-2.0       #
+####################################################
+# OS specific support.  $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+  CYGWIN*) cygwin=true ;;
+  MINGW*) mingw=true;;
+  Darwin*) darwin=true 
+           if [ -n "$JAVA_HOME" ] ; then
+             JAVA_VERSION=`get_java_home_version`       
+             HAS_JAVA7=`has_required_version "$REQUIRED_JAVA_VERSION" "$JAVA_VERSION"`
+             if [ $HAS_JAVA7 -gt 0 ] ; then
+                JAVACMD="$JAVA_HOME/bin/java"
+             else
+                MAC_JAVA7_HOME=`get_mac_java7`
+             fi
+           else
+            MAC_JAVA7_HOME=`get_mac_java7`
+           fi
+           
+           if [ -n "$MAC_JAVA7_HOME" ] ; then
+            JAVA_HOME="$MAC_JAVA7_HOME/Contents/Home"
+           fi
+           ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+  if [ -r /etc/gentoo-release ] ; then
+    JAVA_HOME=`java-config --jre-home`
+  fi
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Migwn, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+fi
+
+if [ -n $JAVA_HOME ] ; then
+    JAVA_VERSION=`get_java_home_version`
+    HAS_JAVA7=`has_required_version "$REQUIRED_JAVA_VERSION" "$JAVA_VERSION"`
+    
+    if [ $HAS_JAVA7 -lt 1 ] ; then
+        unset JAVA_HOME
+    fi
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+  javaExecutable="`which javac`"
+  if [ -n "$javaExecutable" -a ! "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+    # readlink(1) is not available as standard on Solaris 10.
+    readLink=`which readlink`
+    if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+      javaExecutable="`readlink -f \"$javaExecutable\"`"
+      javaHome="`dirname \"$javaExecutable\"`"
+      javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+      JAVA_HOME="$javaHome"
+      export JAVA_HOME
+    fi
+  fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+  if [ -n "$JAVA_HOME"  ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+      # IBM's JDK on AIX uses strange locations for the executables
+      JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+      JAVACMD="$JAVA_HOME/bin/java"
+    fi
+  else
+    JAVACMD="`which java`"
+  fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+  echo "Error: JAVA_HOME is not defined correctly."
+  echo "  We cannot execute $JAVACMD"
+  exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+  echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+fi
+
+#################################################
+# Determine the if we have required jdk version #
+#################################################
+JDK_VERSION=`eval $JAVACMD -version 2>&1`       
+JDK_VERSION=`expr "$JDK_VERSION" : '.*"\(1.[0-9\.]*\)["_]'`
+HAS_JAVA7=`has_required_version "$REQUIRED_JAVA_VERSION" "$JDK_VERSION"`
+
+if [ ! $HAS_JAVA7 -gt 0 ] ; then
+    echo "JAVA CMD version $REQUIRED_JAVA_VERSION is required but found version $JDK_VERSION, aborting..."
+    if $darwin ; then
+        echo "You can install java 7 for use with the AP3 SDK by simply running the oracle JDK installer from:"
+        echo "http://www.oracle.com/technetwork/java/javase/downloads/index.html"
+    else
+        echo "Ubuntu users can install java 7 by doing:"
+        echo "sudo add-apt-repository ppa:webupd8team/java"
+        echo "sudo apt-get update"
+        echo "sudo apt-get install oracle-java7-installer"
+    fi
+    exit 1;
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+  JAVA_CMD=`command -v java`
+  if [ ! -z "$JAVA_CMD" ] ; then
+    javaHome="`dirname \"$JAVA_CMD\"`"
+    javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+    JAVA_HOME="$javaHome"
+  fi
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+    echo "JAVA is required but was not found, aborting..."
+    if $darwin ; then
+        echo "You can install java 7 for use with the AP3 SDK by simply running the oracle JDK installer from:"
+        echo "http://www.oracle.com/technetwork/java/javase/downloads/index.html"
+    else
+        echo "Ubuntu users can install java 7 by doing:"
+        echo "sudo add-apt-repository ppa:webupd8team/java"
+        echo "sudo apt-get update"
+        echo "sudo apt-get install oracle-java7-installer"
+    fi
+    exit 1;
+fi
+
+JAVA_VERSION=`eval $JAVA_HOME/bin/java -version 2>&1`       
+JAVA_VERSION=`expr "$JAVA_VERSION" : '.*"\(1.[0-9\.]*\)["_]'`
+
+HAS_JAVA7=`has_required_version "$REQUIRED_JAVA_VERSION" "$JAVA_VERSION"`
+if [ ! $HAS_JAVA7 ] ; then
+    echo "JAVA_HOME version $REQUIRED_JAVA_VERSION is required but found version $JDK_VERSION, aborting..."
+    if $darwin ; then
+        echo "You can install java 7 for use with the AP3 SDK by simply running the oracle JDK installer from:"
+        echo "http://www.oracle.com/technetwork/java/javase/downloads/index.html"
+    else
+        echo "Ubuntu users can install java 7 by doing:"
+        echo "sudo add-apt-repository ppa:webupd8team/java"
+        echo "sudo apt-get update"
+        echo "sudo apt-get install oracle-java7-installer"
+    fi
+    exit 1;
+fi
+
+#################################################
+# Determine the if we have required git version #
+#################################################
+GIT_CMD=`command -v git`
+if [ -z "$GIT_CMD" ] ; then
+  echo "GIT is required but was not found, aborting..."
+  exit 1;
+fi
+
+GIT_VERSION=`eval $GIT_CMD --version 2>&1`    
+GIT_VERSION=`$GIT_VERSION | cut -d ' ' -f 3`
+
+HAS_GIT=`has_required_version "$REQUIRED_GIT_VERSION" "$GIT_VERSION"`
+if [ ! $HAS_GIT ] ; then
+    echo "GIT version $REQUIRED_GIT_VERSION is required but found version $GIT_VERSION, aborting..."
+    exit 1;
+fi
+#!/bin/sh
+
+AP3_HOME=${HOME}/.ap3-sdk
+rm -rf ${AP3_HOME}
+git clone https://bitbucket.org/atlassian/ap3-sdk-bin.git ${AP3_HOME}
+
+BINDIR=${AP3_HOME}/bin
+
+chmod +x ${BINDIR}/ap3
+
+case "`uname`" in
+  Darwin*) darwin=true 
+           echo "we need to make symlinks which require sudo access..."
+           sudo rm /usr/local/bin/ap3 2>/dev/null
+           sudo mkdir -p /usr/local/bin 2>/dev/null
+           sudo ln -s ${BINDIR}/ap3 /usr/local/bin/ap3
+           ;;
+  *)
+           echo "we need to make symlinks which require sudo access..."
+           sudo rm /usr/local/bin/ap3 2>/dev/null
+           sudo mkdir -p /usr/local/bin 2>/dev/null
+           sudo ln -s ${BINDIR}/ap3 /usr/local/bin/ap3
+           ;;
+esac
+
+
+
+. ${AP3_HOME}/ap3-setup-env.sh
+. ${AP3_HOME}/ap3-setup-config.sh
+
+BASHIT_ALIASES=${HOME}/.bash_it/aliases
+BASHIT_COMPLETE=${HOME}/.bash_it/completion
+
+if [ -x "$BASHIT_ALIASES" ] ; then
+    echo "found bash-it, copying aliases..."
+    rm -f $BASHIT_ALIASES/enabled/ap3.aliases.bash
+    rm -f $BASHIT_ALIASES/available/ap3.aliases.bash
+    cp $AP3_HOME/ap3.aliases.bash $BASHIT_ALIASES/available/
+    chmod +x $BASHIT_ALIASES/available/ap3.aliases.bash
+    ln -s $BASHIT_ALIASES/available/ap3.aliases.bash $BASHIT_ALIASES/enabled/ap3.aliases.bash
+    BASHIT_ENABLED=true
+fi
+
+if [ -x "$BASHIT_COMPLETE" ] ; then
+    echo "found bash-it, copying completions..."
+    rm -f $BASHIT_COMPLETE/enabled/ap3.completion.bash
+    rm -f $BASHIT_COMPLETE/available/ap3.completion.bash
+    cp $AP3_HOME/ap3.completion.bash $BASHIT_COMPLETE/available/
+    chmod +x $BASHIT_COMPLETE/available/ap3.completion.bash
+    ln -s $BASHIT_COMPLETE/available/ap3.completion.bash $BASHIT_COMPLETE/enabled/ap3.completion.bash
+    BASHIT_ENABLED=true
+fi
+
+echo "AP3 setup complete!"
+echo "run 'ap3' or 'ap3 help' to see what's possible"
+if [ $BASHIT_ENABLED ];then
+    echo "bash-it plugins installed. restart your shell and type 'ap3-help' to see aliases"
+fi
+${BINDIR}/ap3 help
+cite 'about-alias'
+about-alias 'common ap3 abbreviations'
+
+# Aliases
+alias ap3d='export AP3_OPTS="-Xdebug -Xnoagent -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"'
+alias ap3dx='export AP3_OPTS='
+alias ap3c='ap3 config'
+alias ap3cg='ap3 config -g'
+alias ap3n='ap3 new'
+alias ap3ns='ap3 new servlet-kit'
+alias ap3nr='ap3 new ringo-kit'
+alias ap3i='ap3 init'
+alias ap3ir='ap3 init ringo-kit'
+alias ap3is='ap3 init servlet-kit'
+alias ap3sp3='ap3 start p3'
+alias ap3sj='ap3 start jira'
+alias ap3sc='ap3 start confluence'
+
+function ap3-help() {
+  echo "AP3 Custom Aliases Usage"
+  echo
+  echo "  ap3d	  = debug opts on for debugging SDK"
+  echo "  ap3dx   = debug opts off for debugging SDK"
+  echo "  ap3c 	  = ap3 config"
+  echo "  ap3cg   = ap3 config -g"
+  echo "  ap3n	  = ap3 new"
+  echo "  ap3ns   = ap3 new servlet-kit"
+  echo "  ap3nr	  = ap3 new ringo-kit"
+  echo "  ap3i	  = ap3 init"
+  echo "  ap3is   = ap3 init servlet-kit"
+  echo "  ap3ir	  = ap3 init ringo-kit"
+  echo "  ap3sp3  = ap3 start p3"
+  echo "  ap3sj  = ap3 start jira"
+  echo "  ap3sc  = ap3 start confluence"
+  echo
+}
+

ap3.completion.bash

+#!/usr/bin/bash
+#
+# Atlassian AP3 SDK completion
+# ============================
+# Bash completion support for [ap3](https://bitbucket.org/atlassian/ap3-sdk-bin)
+#
+# loosely based on the git-flow completion script:
+# Copyright (c) 2010 [Justin Hileman](http://justinhileman.com)
+# Distributed under the [MIT License](http://creativecommons.org/licenses/MIT/)
+#
+case "$COMP_WORDBREAKS" in
+*:*) : great ;;
+*)   COMP_WORDBREAKS="$COMP_WORDBREAKS:"
+esac
+
+_ap3()
+{
+	local cur words cword prev
+	_get_comp_words_by_ref -n =: cur words cword prev
+
+	local commands="$(_list_ap3_commands)"
+
+	local subcommand="$(__ap3_find_subcommand "$commands")"
+	if [ -z "$subcommand" ]; then
+		__ap3comp "$commands"
+		return
+	fi
+
+	case "$subcommand" in
+	config)
+		_ap3_config
+		return
+		;;
+	new)
+		_ap3_new
+		return
+		;;
+	start)
+		_ap3_start
+		return
+		;;
+	help)
+		_ap3_help
+		return
+		;;
+	*)
+		COMPREPLY=()
+		;;
+	esac
+}
+
+############
+# Commands #
+############
+_ap3_help ()
+{
+	__ap3comp "$(_list_ap3_commands)"
+}
+
+_ap3_config ()
+{
+	__ap3comp "bitbucket servlet-kit"
+}
+
+_ap3_new ()
+{
+	__ap3comp "ringo-kit servlet-kit"
+}
+
+_ap3_start ()
+{
+	__ap3comp "confluence jira p3"
+}
+
+############
+# Helpers  #
+############
+__ap3_find_subcommand()
+{
+	local word subcommand c=1
+	while [ $c -lt $cword ]; do
+		word="${words[c]}"
+		for subcommand in $1; do
+			if [ "$subcommand" = "$word" ]; then
+				echo "$subcommand"
+				return
+			fi
+		done
+		c=$((++c))
+	done
+}
+
+__ap3comp ()
+{
+	local cur_="$cur"
+
+	if [ $# -gt 2 ]; then
+		cur_="$3"
+	fi
+	case "$cur_" in
+	--*=)
+		COMPREPLY=()
+		;;
+	*)
+		local IFS=$'\n'
+		COMPREPLY=($(compgen -P "${2-}" \
+			-W "$(__ap3comp_1 "${1-}" "${4-}")" \
+			-- "$cur_"))
+		;;
+	esac
+}
+
+__ap3comp_1 ()
+{
+	local c IFS=' '$'\t'$'\n'
+	for c in $1; do
+		case "$c$2" in
+		--*=*) printf %s$'\n' "$c$2" ;;
+		*.)    printf %s$'\n' "$c$2" ;;
+		*)     printf %s$'\n' "$c$2" ;;
+		esac
+	done
+}
+
+_get_comp_words_by_ref ()
+{
+	while [ $# -gt 0 ]; do
+		case "$1" in
+		cur)
+			cur=${COMP_WORDS[COMP_CWORD]}
+			;;
+		prev)
+			prev=${COMP_WORDS[COMP_CWORD-1]}
+			;;
+		words)
+			words=("${COMP_WORDS[@]}")
+			;;
+		cword)
+			cword=$COMP_CWORD
+			;;
+		-n)
+			# assume COMP_WORDBREAKS is already set sanely
+			shift
+			;;
+		esac
+		shift
+	done
+}
+
+_list_ap3_commands ()
+{
+	local subcommands="bash-it config help init new start"
+	local i IFS=" "$'\n'
+	for i in $subcommands
+	do
+		case $i in
+		*--*)             : helper pattern;;
+		*) echo $i;;
+		esac
+	done
+}
+
+complete -F _ap3 ap3
+#!/bin/sh
+
+update_ap3()
+{
+    echo "${NOW}" > ${UPDATE_FILE};
+    CUR_DIR=$PWD;
+    cd  ${AP3_HOME};
+    git checkout -q $1
+    git pull -q origin $1;
+    cd ${CUR_DIR}
+}
+
+REQUIRED_JAVA_VERSION=1.7.0
+
+########################################
+# Determine the location of the script #
+########################################
+
+# resolve symbolic links
+PRG="${0}"
+
+while [ -h "${PRG}" ] ; do
+  ls=`ls -ld "${PRG}"`
+  link=`expr "${ls}" : '.*-> \(.*\)$'`
+  if expr "${link}" : '/.*' > /dev/null; then
+    PRG="${link}"
+  else
+    PRG=`dirname "${PRG}"`/"${link}"
+  fi
+done
+
+PRGDIR=`dirname "${PRG}"`
+
+##############################################
+# Identify ATLAS_HOME relative to script #
+##############################################
+
+AP3_HOME=`cd "${PRGDIR}" && pwd -P`
+AP3_HOME=`dirname "${AP3_HOME}"`
+export AP3_HOME
+AP3_VERSION="0.2-SNAPSHOT"
+export AP3_VERSION
+AP3_CLI_JAR="${AP3_HOME}"/bin/ap3-bootstrap-"${AP3_VERSION}".jar
+AP3_CONFIG_DIR="${HOME}/.ap3/"
+# Check that target executable exists
+if [ ! -x "${AP3_CLI_JAR}" ]; then
+  echo "Cannot find ${AP3_CLI_JAR}"
+  echo "This file is needed to run this program"
+  exit 1
+fi
+
+. ${AP3_HOME}/ap3-setup-env.sh
+
+#####################
+# Check for updates #
+#####################
+NOW=`date +%Y%m%d`
+
+CURDIR=`pwd`
+
+cd $AP3_HOME
+
+CURRENT_BRANCH=`git rev-parse --abbrev-ref HEAD`
+
+cd $CURDIR
+
+if [ $CURRENT_BRANCH = "master" -o $CURRENT_BRANCH = "develop" ] ; then
+    UPDATE_FILE="${AP3_CONFIG_DIR}/.last_${CURRENT_BRANCH}_update"
+    touch ${UPDATE_FILE}
+    LAST_UPDATE=`cat ${UPDATE_FILE}`
+else
+    UPDATED=true;
+fi
+
+for arg
+do
+  case "$arg" in
+    -u|--update) 
+        echo "updating AP3..." ;
+        UPDATED=true;
+        update_ap3 "master"
+        break ;;
+    -ud|--update-develop) 
+        echo "updating AP3..." ;
+        UPDATED=true;
+        update_ap3 "develop"
+        break ;;
+  esac
+done
+
+if [ ! $UPDATED ];then
+    if [ -z $CURRENT_BRANCH ] ; then
+        $CURRENT_BRANCH="master"
+    fi
+    
+    if [ -n "$LAST_UPDATE" ]; then
+        if $darwin ; then
+            last_date=`date -j -f "%Y%m%d" "$LAST_UPDATE" "+%Y%m%d"`;
+        else
+            last_date=`date --date="$LAST_UPDATE" +"%Y%m%d"`;
+        fi
+        if [ $NOW -gt $last_date ];then
+            echo "updating AP3..." ;
+            UPDATED=true;
+            update_ap3 $CURRENT_BRANCH
+        fi
+    else
+        echo "updating AP3..." ;
+        UPDATED=true;
+        update_ap3 $CURRENT_BRANCH
+    fi
+fi
+
+if [ $# -gt 0 ] ; then
+    if [ $1 = "shit" ] ; then
+      clear
+      for f in ${AP3_HOME}/kk/*.txt
+      do 
+        clear
+        cat $f
+        sleep 0.01
+      done
+      clear
+      exit 0
+    fi
+fi
+
+#################   
+#  Execute AP3  #
+#################
+
+echo "starting the AP3..."
+exec "$JAVACMD" \
+  $AP3_OPTS -DAP3_HOME=${AP3_HOME} -Dlog4j.configuration=file:///${AP3_HOME}/log4j.properties -Dap3.javacmd="$JAVACMD"\
+  -jar ${AP3_CLI_JAR} "$@"
+  
Add a comment to this file

bin/ap3-bootstrap-0.2-SNAPSHOT.jar

Binary file added.

+tgz
+ .,,,;;;::::::cccccccccclllllllllllllllcccclc:,;:cccccccccccccccc:::::::::::::::;;;;,,,,,,,. 
+ ,ccccllooodddddxxxxxxxxxxkkkkkkkkkkkkxxxxxxxdlodxxxxxxxxxxxddddddddddoooooooooollllcccccc:. 
+ ,ccllloooddddxxxxxxxxxxxxxxkkkkkkkkkkkkxxxc,cldxxxxxxxxxxxddddddddddddddddooooooolllllllll' 
+ lkkkkkkkkxkOOOOOkkkkkkkkkkkkkkkkkkkxxxxxxd:'ldddddddddooooooooodooooldddddddl,lddddddddddd; 
+ lxxxxxxxldOOOkkkkxxkkkkOkkkkkkkxxxxxddddoooc:cllllllllcccccllllllccc:ccllllll;.clcccccclll' 
+ coolc:;:,ooolccooolllcccooolcccc::ccc::;;;;lc:;;,'''',;;;;;,,,;:;;,,,''',,,'.. .,,,''''.,,. 
+ ,::;,...'l:;,.'ccc:::;,'clcc:::;'.:c:::;;,.cc::;,,'..::;;;,,''';;,,''...','... .''..... ..  
+ .,,,,''.,;;;;,;;;;;;;;;;;;;;;;;;;;;;;;;,,,'','''''...'''.......'..........................  
+ .'.'..';cc,.:c,'cooooooodddddddddooddddd:,';cccoocc::c:;looolcc::clccc,..:;.;:c:;''''',,,'. 
+ ';ccloooooo.ldl,:lxxxxxxxxkkkkkkkkkkkkkkxll;:lodoc:;::c:ldddll;,,;;:c;;;:l;'llllllccc:;;:;. 
+ ,cclllooood;;dd;do:lxxxxxxxxkkkkkkkkxxxxxdlo::llc:;;;;:::ooooo:;;,,.'cl;::.:ccllllllcccc:;. 
+ :ooddddddddl.cd:lddocodxxxxxxxdxdddddoc;;:lol:coc::cccccccllllc:;,;clll;l;'llollllllcc:::;. 
+ .''',,;;::cc'.c::ooddocoxxxxxddolllodc;,,,;coccllcccccloolooool;;lllcc;;:.,;,,,,,''''...''. 
+ ,cccllllloooc.:o,looooolclddl:cccclllc,,,,,:lc:ccccccclclclll::cllllcc;c,'cccccccc:::;;;;;. 
+ ,cccllllooooo,;o:cdddddddoodddxodxxdo:,,,,,;cclooooooooodxdlcododooool:l.;lllllccc:::;;;;;. 
+ ,cccclllloooo:'cl;dddddddxdollodddxdxd;,,,;:codddxddddddxolodxxddoooocc;.llcccccccc::;;;;;. 
+ ,ccccllloooooo';o;ldddddxxxxdc;:odddolc;,,:ccllldddddddocoddxxxddoooo:l.;ccccccccc:::;;;;,. 
+ ,ccccclllllooo;':::dddddxxxdc,..',;:c:;,,,;:c:cccclooolc:loodxddoooolc;.ccccccccc:::;;;;;;. 
+ ,cccccclllllool'.:,odddddo;........,;,,,,,;;lccllllcccl::clloodddooocl.'cccc:::::;;;;;;;;,. 
+ ,::cccccclllllo,.,':ooodl'..........,:;;;;;:lllooollolc:c:::clodddooc;.cccc::::;;;;;;;,,,,. 
+ ':::ccccclllloo:;.;'looc:..'.....'...'',;;;::cllllllllcclclo::ldddoo:.,lccc::::;;;;;;,,,,,. 
+ '::::cccccllllll,;.':ll,''....      ....'';::ccllllllcccclooo:codooc;.llcc::::;;;;;;,,,,,'. 
+ ':::::ccccclllll,'..'l:.,...   ...........,:cloodoooolllllollc:lool:;;lccc::::;;;;;,,,,,,'. 
+ ';;::::cccccllllc.:..cc.  ...'',,,,,,,;::cloddxxxxxxddddoolc::;clol,'cccc::::;;;;;,,,,''''. 
+ ';;:::::ccccccccl,c,.,:......,;:::::;::cloodxxxxkkkkkxxxxxxoc:::;o,';lcc::::;;;;;,,,,,',''. 
+ '::;:::::cccccccc:.:..,;'';:;,''.'',;;clooddxxxxkkkkkkkkkkxxxxol;,.';c::::;;;;;;,,,,''''''. 
+ '::;;;::::,,,,,;,,..,.;:c;......;cllcccccclloddxxxxxxxxxxxkkxkkxdc,'c::;;;,;;;;,,,,'''''''. 
+ '::;;;::,.        .':c;.. .';;;,;'. '....',:clooolllllllodxxxxkkkxxd:''....';:::::,'''.''.. 
+ ';;;;:c,.        'cc'. .;ccc.  ..    .. .',,;::c:;:;;;,,;,'':oxxkkkkxo:,,'''',;',;,''...... 
+ .,;;;,.        'll'..'c;... .        '...,,',,,:'..........   .;oxxkkkxl;,,,,,,,,,''....... 
+ .,,,'        .lo, .;:'       ..      ;l,  ....;o....  ,'.        .cdxkkxd:;,,;;;,;,''...... 
+ .,,,;,..    .dl..,c.          :;      .       ..     ..           .'lxkkkxllooooddl'....... 
+ .,,,,,'..  .o;.'l;..           .       ..'',,,,'..                   'lxkkx:'''''''.......  
+ .'''',,.   c..;l.    .       ..,;:;....,,,,;:::::cc:::::;'.      ,    .:dxko    ..........  
+ .....'''. .' 'c.             ..,;:;''''''',,,',,;,'',,,;:cc,     ,.     :odd'.  ..........  
+ .,,,;;;::::::cccccccccclllllllllllllllcllclc:,,:cccccccccccccccc::::::::::::::::;;;;,,,,,,. 
+ ,ccccloooodddddxxxxxxxxxxxkkkkkkkkkkkxxxxxxxdlcdxxxxxxxxxxddddddddddddoooooooooolllcccccc:. 
+ ,cclllooodddddxxxxxxxxxxxxxkkkkkkkkkkkkxxxc,clcdxxxxxxxxxdxddddddddddddddddoooooollllllllc' 
+ lkkkkkkkkxkOOOOOkkkkkkkkkkkkkkkkkkkxxxxxxd:'lddddddddoooooooooodoodoloddddddl,lddddddddddd; 
+ lxxxxxxxldOOOkkkkxxkkkkOkkkkkkkxxxxxddddoooc:cllllclllcccccllllllccc:ccllllll,.clcccccclll' 
+ :oolc:;:,odolc:ooolllcccooolccc:::ccc::;;;;lc:;;,''.',;;;;;,,,;:;;,,,''';,,'.. .,,,''''.,,. 
+ ,::;,...'l:;,.'ccc:::;,.clcc::;,..;::;:;;,.cc::;,,'..::;;;,,''';;,,''...','... .''..... ..  
+ .,,,,''.,;;;;,;;;;;;;;;;;;;;;;;,,,,,,,,,,,''''''''...'''.......'..........................  
+ .'.'..';::,.:c,'cooooooodddddddddooddddd:,';ccloocc::c:;looollc:cllclc,..:;.;:c:;'','',,,,. 
+ ';ccllllloo.ldc,:ldxxxxxxxxxxxkkkkkkkkkkxll::lodoc::::l:cdddol:;;::cc;;::l;'lllllcccc:;;:;. 
+ ,cclllllooo;,dd;do:cdxxxxxxxxxxxkxxxxxxxddlo::llc::::::::oooooc:;;;.,ll;::.:clllllllcccc:;. 
+ :ooddddddddl.cd:lddocldxxxxxxxxxxddddoc;;:lolccolccllcclccllllcc:;;clll;l:'oooolllllcc:::;. 
+ ..''',;;::cc'.c::ooodocoxxxxxdoolllldc,''',cocclllllllloolooool::lloll::c';::;;;;,,''...''. 
+ ,cccllllloooc.:l'loollocclddl:cllllcc;'...':lc::cllllllclclllcccllllll;l:'lllllllcc::;;;;;. 
+ ,cccllllooooo,;o;cdddddddoldddxxxddoo;'''',;::lodddddooodxdllododooool:l':lllllllcc::;;;;;. 
+ ,cccclllloooo:'cl;dddddddxdollodddoodd;,,,;:cldddxxdddddxolodxxdddooocc:,lllllllccc::;;;;;. 
+ ,ccccclllloooo';o;lddddddddxdc;:oodddoc:;,clcllldxxddddocodddxxddoooo:l';lllcccccc::;;;;;,. 
+ ,ccccccllllooo;';::oddddddxdc,..;clooc::;::ccccllllooolc:loooxddoooolc;.ccccccccc:::;;;;;;. 
+ ,ccccccllllllol'.:,oddoddo;......,;cl:::::clollolllllll::cllloodoooocl.,cccc:::::;;;;;;;;,. 
+ ,:::ccccccllllo,.'';ooodl'.......'',:lcccllloooooollolc:c::;;cloooooc;.cccc:::::;;;;;;;;,,. 
+ ':::ccccccllllo:;.,'looc;..'.....;,,;::cllcllllllllllolllclo:,cooool:.,lccc::::;;;;;,,,,,,. 
+ '::::cccccllllll,;.':ll,','...  ...',:::::clcccclloodxxxddooo,;ooloc;.lccc::::;;;;;,,,,,,,. 
+ ':::::ccccclllll,'..'l:.,. ..  ....'',,;;;::cccclodkkOOkkkxol;'cllc;,;lccc::::;;;;;,,,,,,,. 
+ ';;:::::ccccllllc.:..cc.  ...',;;;;;;;::clooodddddxkOO0OOkxl;,.;coc,'ccc:::::;;;;;;,,,,,,'. 
+ ';;;:::::cccccccl,:,.':.'. .';::cc::;;::clooodddxxkkOOOOOkxdl:;;:l;';lc:::::;;;;;,,,,,,,''. 
+ ':;;;:::::ccccccc:.:..';'';:;,'...',,;;:clooddddxxkkkkkkkkkxxxol,,.';::::;;;;;;;,,,,,,,,''. 
+ '::;;;;:::,,,,,,,,..,.;:c;......;clccc:;,,,,,;;clllodxxxxxxkxkkxdl,':;;;,,,,;;,,,,,,,'''''. 
+ '::;;;::,.        ..:c;.. .';;;,,'. '.    ......'..';;::codxxxkkkxxd:'''...';:;:::,,,,''''. 
+ ';;;;:c,.        'cc'. .;lcc.  ..    .. ...................';ldxxkkkxo:,,'''',;',;,,'''''.. 
+ .,;;;;.        'll'..'c;... .        '...'... .'.      ....   .,ldxkkkxl;,,,,,,,,,','''''.. 
+ .,,,'        .lo, .;:'   .   ..      ;l,  .   .l      ''.        .:dxkkxd:;,,;;;,;,'''''... 
+ .,,,;,..    .dl..,c.          ;:      .       ..      .           .'cdkkkxolooodddo'''..... 
+ .,,,,,'..  .o;.'l;..           .       ..'',,,,'..                   'ldkkx:''...'''......  
+ .'''',,.   c..;l.    .        .,::;....,,,,;::::ccc:::::;,.      ,    .:oxko.   ..........  
+ .....'''. .' 'c.             .',;:;''''''',,,',,;,.',,,;::c,     ,.     ;ldd,.  ..........  
+ .,,,,;;;:::::cccccccccclllllllllllllllcllclc:,.,cccccccccccccc:::::::::::::::::;;;;,,,,,,,. 
+ ,::ccccloooddddxxxxxxxxxxkkkkkkkkkkkkxxxxxxxdc;cddxxxxxxxxdddddddddooooooooooooolllcccccc:. 
+ ,ccccclloooddddxxxxxxxxxxxxkkkkkkkkxxxkxxxc,cl:lxxxxxxxxxdddddddddddddddddooooooolllllllll' 
+ lkkkkkkkkxkOOOOkkkkkkkkkkkkkkkkkkkxxxxxxxd:'ldddddddoddoooooooooooooloddddddl,lddddddddddd; 
+ lxxxxxxxldOOOkkkkxxkkkkkkkkkkkkxxxxxddddoooc:cllllllllcccccllllllccc:ccllllll,.clcccccclll' 
+ :oolc:;:,oollc:ooollccccloolcc::;;cc::;;,,;cc:;;,''.',;:;;;,,,;:;;,,'''',,,'.. .,,,''''.,,. 
+ ,::;,...'l:;'.'cc:::;;,.ccc::;,'..;::;;;,'.cc:;;,''..::;;;,,''';;,,''...','... .''..... ..  
+ .,,,,''.,,,,,,,;;;;;;;;,;;;;;;,,,,,,,,,''''''''''....'''......''..........................  
+ .'....';::,.::''clllllllllooooooollooooo:,';ccclocc::c:;looollcccllclc,..:;.;:::,'','',,,,. 
+ .,::cclllll.coc':coooddddddddxxxxxxxxxxxxll;:lldoc::::l:ldddolccccccc:;::l;'lllcccccc:;;:;. 
+ ':::cccllll;,lo,ol;coddddddddxxxxxxxxxxxddlo::llc:::::cc:ooooocc:::.;ll;:c.:llllllcccccc:;. 
+ :oooddddddol.cd:lddocldxdxxxxxxxxddddol:::lolccolcccllclccllllccc;:loll;o:'oooolllllccc:::. 
+ ...'',,;;;:c..c::ooddocoxxxxxdooollodl;,,,;coc:lolllllooolooool::oooll::c';::;;;,,'''...''. 
+ ,ccccccccccl:.;c'llllllcclddl:llollooc;,,,,:l:;:cllccccllllloccllollll;l;'ccccccc:::;;;;;;. 
+ ,ccccccccclll';l;:oooooddolddooooddddc:;;;;;::coddoooooodxdolodddooool:l.;lcccccc:::;;;;;;. 
+ ,ccclllllllll;':c;oooooddddollooodxxxdcc::cllodxxddoodddxooodxxddoooo:c:'lccccccc:::;;;;;;. 
+ ,cccccllllllll',l,looooodddxdc;codxxkdolllooooooddoooooocodddxxddoooo;l.;ccccccc::::;;;;;;. 
+ ,ccccccllllloo;.;;;looooodddc'..;:codolllooooooolllloolc;:lloxddooool:;.ccccc::::::;;;;;;;. 
+ ,cccccccclllllc'.:'llllooo:.......,:cccllllooooolllllll:;;::clodoooocc.'ccc::::::;;;;;;;;;. 
+ ,::ccccccclllll'.'.;lllol'..........;c:clllloooooollolc::;,'';coooooc;.:ccc:::::;;;;;;;;;,. 
+ ':::::cccclllll;;.,.lllc:..'.....,...;:cllclllllllllllccc:cl'.;cllll:.,ccc:::::;;;;;;;;;;,. 
+ ':::::ccccclllll,;..:ll,','...     ..,;:::clccccccccc:;;:;:cc..llcl:,.lccc::::;;;;;;;,,,,,. 
+ ';:::::cccccclll,'..'l:.,. .  .........',;:::ccc:::::;'',,;','.;cc:;',lcc:::::;;;;;;,,,,,,. 
+ ';;;:::::cccccclc.:..cc.  ...',,,,;;;;::clllooooooolccc:,''....,:lc'.ccc:::::;;;;;;;,,,,,'. 
+ ';;;;:::::ccccccl,:,.,c.....';:::::;;;:ccloooodddddddooooooc,'.,cl;',lc:::::;;;;;;;,,,,,,'. 
+ '::;;;;;::::ccccc:.:..';'';:;,'....,,,;:cloooddddxxxxxdxxxxxxdo:;:.';::::;;;;;;;;;;,,,,,,'. 
+ '::;;;;;;;,,,,,,,,....;:c;.. ...;:ccc:;,'''',,:colloodxxxxxxxkkxdc,'c;;;;,,;;;;;;;;,,,,,,'. 
+ '::;;;;:,.        ..:c;.  .';;;,,'. ..      ...';'',,',,:odxxxkkkxxd:''.....;;;:;;;,,,''''. 
+ ';;,,;c,.        'cc'. .;ccc.  ..    .  .......',.........',:oxxxkkkxo:,,'''',;',;,,,'''''. 
+ .,;;;;.        'll'..'c;... .        '...'.....;........'...  .,ldxkkkxl;,,,,,,;,,','''''.. 
+ .,,,'        .lo, .;:'   .   ..      ;l,  .   'l......;;....     .:dxkkxd:;,,;;;,;,'''''... 
+ .''';,..    .dl..,c.          ;:      .       ..     .'.          .'cdkkkxolooooddl'''..... 
+ ...',,'..  .o;.'l;..           .       ..'',,,,'..                   'ldxkx:''''.'''......  
+ ...'',,.   c..;l.    .        .,;:;....,,,,;::::ccc::cc:;,.      ,    .:oxko.   ..........  
+ .....'''. .' 'c.             .',;:;''''''',,,',,;;',,;;;:cc,     ,.     ;ldd,.  ..........  
+ .,,,,;;;::::::cccccccccllllllllllllllllllclc:,.':ccccccccccccc::::::::::::::::::;;;;,,,,,,. 
+ ,::cccllooooddddxxxxxxxxxxkkkkkkkkkkkxxxxxxxdc;:ddxxxxxxxxdddddddddooooooooooooolllcccccc:. 
+ ,ccccclloooddddxxxxxxxxxxxxkkkkkkkkxxxxxxxc,cl:cxxxxxxxxxdxdddddddddddddddoooooooollllllll' 
+ lxkkkkkkkxkOOOOkkkkkkkkkkkkkkkkkkkxxxxxxxd:'lddddddddddooooooooooodoldddddddl,lddddddddddd; 
+ lxxxxxxxldOOOkkkkxxkkkkOkkkkkkkxxxxxddddoooc:cllllllllcccccllllllccc:clllllll,.cllccccllll' 
+ :oolc:;:,oollc:ooollccccooolcc::;;cc::;;;;;cc:;;,''.',;:;;;;,,;:;;,,,''';,,'.. ',,,''''.,,. 
+ ,::;,...'l:;'.'ccc::;;,.ccc::;,'..;:;;;;,'.cc::;,''..::;;;,,''';;,,''...','... .''..... ... 
+ ',,,,''.,,,;,,,;;;;;;;;,;;;;;;;,,,,,,,,'''''''''''...'''......''..........................  
+ .'.'..';::'.::'':lllllllllooooooollooooo:;';cccllc:;:c:;looolccccclccc,..:;.;::;,.'''',,,,. 
+ .,::cclllll.coc';coooddddddddxxxxxxxxxxxdll;:lodoc::::l:ldddolcccccll:;::l;'lllccccc::;;:;. 
+ ':::cclllll;,lo,ol;cddddddddxxxxxxxxxxxxddlo::llc:::::cc:ooooocc:::.;oo;:c.cllllllcccccc:;. 
+ :oooddddddol.cd:lddlclddxxxxxxxxxddddol::clolccoc:ccllclccllllccc;:cooo;o:'ooooolllllccc::. 
+ ...'',,;;::c..c::ooddocoxxxxxddddooodl;,,;:coc:llcccclloooooool::ooollc:c';::;;,,''''...... 
+ ,::::::ccccl:.;c'llllllc:lodlloooooooc;;,;;cl:;;:c:::ccclllllccllollll;l;'ccccccc:::;;;;;;. 
+ ,:cccccclllll';l,coooooddlldddoddddddc::::::cclllllllloodxdolodddooool;l.;lcccccc::::;;;:;. 
+ ,ccccccclllll;'cc;oooooddddoloddddxxxdlccclllodxxoooooddxdlodxxdddooo:::'lccccccc::::;:;;;. 
+ ,cccccclllllll',l,looooodddxdc:codddxdollloooooodxoooooocodddxxddoooo;l.;ccccccc::::;;;;;;. 
+ ,cccccclllllll,.;;;looooodddl,..;:coolllloooooolllllolc:,:llodddooool:;.ccccc:::::::;;;;;;. 
+ ,cccccccclllllc'.:'llllooo:'.....';cccccllllolllllllllc;;;::cloooooo:c.'ccc:::::::::;;;;;;. 
+ ,:::cccccclllll'.'.;lllol'..........;c:ccccclllllllllc:;;,,'';cooooo:;.:ccc::::::::;;;;;;;. 
+ ':::cccccclllll;;.,.lllc;..'.....,..';::c:::::::::cccc::c:cc'.;cllll:.'ccc:::::::;;;;;;;;,. 
+ ':::::ccccclllll,;..:ll,,,'...     ..',,,,;;,,,;;::cllccc:clc.,llcl:,.lccc:::::::;;;;;;;,,. 
+ ';:::::cccclllll,'..'l;.,. ..  ...........'''',,;:codolllcc::,.:ccc;',lcc::::::::;;;;;;,,,. 
+ ';;;::::ccccllllc.:..cc.  ...',,,,,,,;;::cccllooooddxxxdolc;,'.;:lc'.cccc::::::::;;;;;,,,,. 
+ ,;;;;::::cccccccl,c,.,c.....';:::::;;;:ccloooodddxxxkkkkxxdo:;',cl;',lcc:::::::;;;;;;,,,,,. 
+ ':;;;;::::ccccccc:.:..,;'';:;,'....,,,;:cloooodddxxxkkkkkkkxxxo:,:.';ccc:::::::;;;;;,,,,,,. 
+ '::;;;;:::,,,;;,,;..'.;:c;......,:ccc:;;,'',,;:loooddxxxxxxkxkkxdc,'c:::;;;;;;;;;;;,,,,,,'. 
+ '::;;;::,.        ..:c;.. .';;;,,'. ..     ....':;;;;;;;codxxxkkkxxd:''.....;;;;;;,,,,''''. 
+ ';;;;;c,.        'cc'. .;ccc.  ..    .  .......',.........',:oxxxkkkxo:,,'''',;',;,,,'''''. 
+ .,;;;;.        'll'..'c;... .        '...'.....;............  .,odxkkkxl;,,,,,,,,,','''''.. 
+ .,,,'        .lo, .;:'   .   ..      ;l,  ..  'l.    .,,....     .:dxkkxd:;,,;;;,;,'''''... 
+ .',,;,..    .dl..,c.          ;;      .       ..     ...          .'ldkkkxolooooddl'''..... 
+ ..'''''..  .o;.'l;..           .       ..'',,,,'..                   'lxkkx:''''.'''......  
+ ...'',,.   c..;l.    .        .,;:;....,,,,;::::ccc::cc:;,.      ,    .:dxko    ..........  
+ .....'''. .' 'c.             .',;:;''''''',,,,,;;;',,;;::cc,     ,.     :odd,.  ..........  
+ .,,,,;;;;::::::ccccccccccclllllllllllllllclc:,.':cccccccccccccc:::::::::::::::::;;;;,,,,,,. 
+ ,::cclllloooodddddddddddxxxxxxkkkxxxxxxxxxxxdc;:ddxxxxxxxxddddddddddddoooooooooollllccccc:. 
+ ,ccccllloooooddddddddddddxxxxxxxxxxxxxxxxxc,cl:lxxxxxxxxxdddddddddddddddddoooooooolllllllc' 
+ lxkkkkkkkxkkOOkkkkkkkkkkkkkkkkkkkkxxxxxxxd:'ldddddddddddoooooooddodoodddddddl,lddddddddddd; 
+ lxxxxxxxldOOOkkkkxxkkkkkkkkkkkkxxxxxddddoooc:clllllllllcccllllllllcc:clllllll,.clcccccllll' 
+ :oolc:;:,oollc:ooolllcccooolccc:;;ccc:;;;;;lc:;;,''.',;:;;;;,,;:;;,,,''';,,'.. ',,,''''.,,. 
+ ,::;,...'l:;'.'ccc::;;,.clcc:;;'..;::;;;,'.cc:;;,''..::;;;,,''';;,,''...','... .''..... ... 
+ .,,,,''.,,,;,,,;;;;;;;;,;;;;;;;,,,,,,,,''''','''''...''''.....'''.........................  
+ .'....';::'.::''cllllooooooooooooooodddo:;';cccllc:;:c::looollccllllll,..:;.;:c:;'''..,,''. 
+ .,:ccllllll.coc':codddddxxxxxxxxkkkkkkkxxll;;lodl:;;;:lcldddooccclcll::c:l;'llllllccc:;::;. 
+ ':ccclllooo;,oo,ol;codddxxxxxxxxxxxxxxxxddll,,lc;,,,;;:ccoooooc:;:;.;oo;cc.:llllllllcccc:;. 
+ :ooddddddddl.cd:lddlcldxxxxxxxxxxddddol::cllc;:c;,;::::lccllllc::;;looo;o:'ooooolllllccc::. 
+ ..'',,;::::c..c::ooddocoxxxxxxdxxddddl;,,;:lo:;cc::::cloooooool::looooc:l.;:;;,,,,,'''..... 
+ ,:::ccccclll:.;c'llllllcclddolxxxdoooc;,,;:ll:;::c::::::ccccc::clololl;l;'cccccccccc::::::. 
+ ,:cccclllllll';l,coodddddooxdxxxxddxdc:;;::cclddollllooodxdolododooool;l.;llllccccccc:::::. 
+ ,:cccccclllll;'cc;oodddddddolodxxkkkxdlc:cllloxxxdooooddxdlodxxdddooo::;.llllccccccc::::::. 
+ ,:ccccccllllll';l,looddddxxxdc:cdddollllcloooooodxdooodocdddxxxdddooo;l.,lllccccccc::::::;. 
+ ,:::ccccclllll,.;;:oooodddddl,..,:clolllllllllllllllolcc;loodxxddoool:,.ccllccccc::::::::;. 
+ ,::::cccccclllc'.:,loooooo:......';cccccllllolllllllccc;;;:clloddooo:c.'cccccccccc::::::;;. 
+ ,:cccccccccclll'.'.;llloc'..........:cclllloooooolcccl:,,,'.,;cooooo:;.ccccccccccc:::::;;;. 
+ ,:cccccccccccll;;.,.lllc;........,..';:cllccccccc:c:cl:;:;:c..;coool:.'llccccccccc:::;;;;;. 
+ ':cccclllllllllc,,..;ll,',.... .....';;;:::c::;;;:;;:;',,,:lc.'llll:,.llllccccccc:::;;;;;;. 
+ '::cccclllllllll,'..'c,.,. .....',,,,,,;;;;;;;;,,,,,,'..''',;..:ccc;',llllcccccc:::;;;;;;,. 
+ ';::ccccllllllllc.:..c:.  ..',;:cclccclllloooooooolcccc:,''....;coc'.cllllccccc:::::;;;;,,. 
+ ,:::::ccccllllllo,c,.,:.....,:ccllollllloodddddddxxxddddddol:;;;lo;',olllcccc::::::;;;;,,,. 
+ ,::::::ccccllllll:.:..';'';::;;;;;::cccclooddddddxxxxxxxxxxxxxol:;',:lllcccc:::::;;;;,,,,,. 
+ ':::::::::;;;;;;;;..,.;:c;'....';loollc:;;;;;;:clllodxxxxxkkxkkxdc,'lccc::::::;;;;;;,,,,,'. 
+ ':::;;::,.        ..:c;.. .';;;,;,'.,.     .....'.....',:odxxxkkkxxd:''.....;;;;;;;,,,''''. 
+ ';;:::c,.        'cc'. .;ccc.  ..   ..  ...    ..       ...,:oxxxkkkxo:,,'''',;',;,,,'''''. 
+ .;;;;;.        'll'..'c;... .        '...'...  '        .     .;odxkkkxl;,,,,,,,,',,'''''.. 
+ .,,,'        .lo, .;:'   .   .       ;l'  .   'l      ''.        'cdxkkxd:;,,;;;,;,'''''... 
+ .''';,..    .dl..,c.          ;;      ..      ..     ..           .'lxkkkxolooooool''c;.... 
+ ...''''..  .o;.'l;..           .       ..'',,,'...                   ,oxkkx:'''''''.......  
+ ...''''.   c..;l.    .        .,;:;....,,,,;::::ccc::cc:;'.      ,    .:dxkl     .........  
+ ......''. .' 'c.             .',;:;'''',,,,,;,,;:;',;;;:ccl'     ,.    .:odd,.  .... .....  
+ .'',,,;;;;;;:::::::::ccccccccllllllllllllclc:,.,cccccccccccccccc::::::::::::::::;;;;,,,,,,. 
+ ,::::cclllllooodddddddddddxxxxxkkxxxxxxxxxxxdc;cddxxxxxxddddddddddddddoooooooooollllccccc:. 
+ ,::cccllloooooodddddddddddxxxxxxxxxxxxxxxxc,cl:lxxxxxxxxxdxdddddddddddddddoooooooollllllll' 
+ lxkkkkkkkxkkkkkkkkkkkkkkkkkkkkkkkkxxxxxxxd:'cdddddddddddooodddddddddodddddddl,lddddddddddd; 
+ lxxxxxxxldOOOkkkkxxkkkkOkkkkkkkxxxxxddddoooc:cllllllllllcclllllllllc:clllllll;.clllcccllll' 
+ :oolc:;:,ddolc:ooolllcccooolcc::;;ccc::;;;;cc::;,''.',;:;;;;;;;:;;,,,''';,,''. ',,,''''.,,. 
+ ,::;,...'l:;'..ccc:::;,.clc::;;'..;::;;;,'.cc::;,,'..::;;;,,''';;,,''...','... .''..... ... 
+ .,,,,''.,,,,,,,;;;;;;;;,;;;;;;;,,,,,,,,,'''','''''...''''....''''.........................  
+ .'.'..';::,.;:,'cllllooooooooooooooodddo:,',cccllc:;:c::looollclllllll;..::.;:::;''''.,,''. 
+ .;:ccllllll.coc':codddddxxxxxxxxkkkkkkkxxll;;lodl:;;;:lcldddooccclccl::c;o:'llllllccc:;::;. 
+ ':ccllllllo;,oo,ol:codddxxxxxxxxxxxkxxxxddll,,lc;,,,;;:ccoooooc:;:;.,oo:cc.:lllllllllccc:;. 
+ :ooddddddddo.cdclddocldxxxxxxxxxxxdddol::cllc;:c:;;::::cccllllc:;;;cooo;o:'ooooolllllccc::. 
+ ...'',;;:::c'.c::ooddocoxxxxxxdxxddddl:;;;cloc;llccc:cllolooool;;looooc;c';:;,,,,,,'''..... 
+ ,:::ccccclllc.;l'llllllcclddolxxddoooc:;;:cooc:ccc::::::ccccc:::loooll;c;.cccccccccc::::::. 
+ ,:ccccllllllo';l;:oodddddooxdxxxxxxxdc:::cccloddollllooodxdllododooool;l.;llllcccccc::::::. 
+ ,:cccccclllll;'cc;oodddddxxolodxxkkkxdlcccolloxxxdooodddxdlodxxdddooo:::.llllccccccc::::::. 
+ ,:ccccccllllll',l;looddddxxxdl:ldddollllcloooooodxdooodocodddxxdddooo;l.,lllccccccc::::::;. 
+ ,:::ccccclllll,.;;:oooodddddl;.';:clolllllllllllllllolcc;coooxxdddool:;.clllccccc::::::::;. 
+ ,::::cccccllllc'.:,loooooo:......';cccccccclolllllllccc;;;:ccloddooo:c.'cccccccccc::::::;;. 
+ ,:::::cccccclll'.'.;llloc'..........;cccccclolloolclll:,;,,',;cooooo:;.:cccccccccc:::::;;;. 
+ ':::cccccccccll;;.,.cllc;........,..';;::c::ccccccccllc:c;cc'.;coool:.'llcccccccc::::;;;;;. 
+ ':::cccccccclllc,;..;cc,''.... ......,,,,;;:;;;::::ccc::::clc.'lllo:,.cllcccccccc:::;;;;;;. 
+ '::::cccccclllll,'...c;.,. .. ............',,,;;;::cc:;;::;;:'.:ccc;',olllcccccc:::;;;;;;,. 
+ ';::ccccccllllllc.:..::.  ...,,;::::::::ccllooooddoooool:;;,,..;:oc'.clllcccccc:::::;;;;,,. 
+ ,::::ccccclllllll,c,.,:.....';:cclllccccllooddddxxxxxxxxdddo:;;;co;',llllcccc:::::;;;;,,,,. 
+ '::::::ccccllclll:.:..';'';::,,,',,;:;:cloodddddxxxxxxxxxxxxxxol;:',:lllccc::::::;;;;,,,,,. 
+ ':::::::::;;;;;;;;..,.;:c;'....';clllc::;,,,;;:cooodxxxxxxkkxkkxdc,'lccc::::::;;;;;,,,,,,'. 
+ ':::::::,.        ..:c;.. .';;;,;,..'.      ....,.',,,;;coxxxxkkkxxd:''.....;;;;;;,,,'''''. 
+ ';::::c,.        'cc'. .;ccc.  ..   ..   ..    ........ ...,:oxxxkkkxo:,,'''',;',;,,''''''. 
+ .,;;;;.        'll'..'c:... .        ....'.    '        .     .;odxkkkxc;,,,,,,,,''''''''.. 
+ .',,'        .lo, .;:'   .   .       ;l'  .   .c      ''.        'cdxkkxd:;,,;;;,;,'''''... 
+ .'',;,..    .dl..,c.          ;;      ..      ..     ..           .'lxkkkxolooooool'':,.... 
+ ..''''...  .o;.'l;..           .       ...',,,'...                   ,oxkkx:,''''''.......  
+ ...''''.   c'.;l.    .        .,;:;....,,,,;::::ccc::cc:;'.      ,    .:dxkl     .........  
+ .....'''. .' ,c.             .',;:;'''',,,,;;,,;;;',;;;:ccl'     ,.    .:odd,.  .... .....  
+ .',,,,;;;;;;:::::::::ccccccclllllllllllllclc:,.,cccccccccccccccc::::::::::::::::;;;;,,,,,,. 
+ ,::::ccllllloodddodddddddxxxxxxxxxxxxxxxxxxxdl;cddxxxxxxddddddddddddddoooooooooollllccccc:. 
+ ,::cccllloooooodddddddddddxxxxxxxxxxxxxxxxc,cl:lxxxxxxxxxdxdddddddddddddddoooooooollllllll' 
+ lxkkkkkkkxkOOkkkkkkkkkkkkkkkkkkkkkxxxxxxxd:'cdddddddddddooodddddddddodddddddl,lddddddddddd; 
+ lxxxxxxxldOOOkkkkxxkkkkkkkkkkkxxxxxxddddoooc:cllllllllllcclllllllllc:clllllll;.clllcccllll' 
+ coolc:;:,ddolc:ooolllcccooolcc::;:ccc::;;;;cc::;,''.',;:;;;;;;;:;;;,,,'';;,''. .,,,''''',,. 
+ ,::;,...'l:;'..ccc::;;,'clc:::;'..;::;;;,'.cc::;,,'..::;;;,,''';;,,''...''.... .''..... ... 
+ .;,,,''.,;,,,,,;;;;;;;;,;;;;;;;,,,,,,,,,''''''''''...''''....''''.........................  
+ .'....';::,.;:''cllllloooooooooooooodddo:,',cccllc:;:c::looollclllllll;..:;.;:c:;'''..,,''. 
+ ',:ccllllll.coc':codddddxxxxxxxxkkkkkkkxxll;;lodl:;;;:lcldddooccclccl::c:l:'lllllllcc::::;. 
+ ':ccllllllo;,lo,ol:cddddxxxxxxxxxxxkxxxxddll,,lc;,,,;;;ccoooooc:;:;.,oo:cc.:lllllllllccc:;. 
+ :odddddddddo.cdclddocldxxxxxxxxxxddddol::cllc;:c;;;::::cccllllc:;;;cooo;o:'ooooolllllccc::. 
+ ...'',;;:::c'.c::ooddocoxxxxxxxxxddddl:;;;clo::llccc:cllolooool;;looooc;c';:;,,,,,,'''..... 
+ ,::cccccclll:.;l'llllllcclddooxxxdoooc:;;:cooc:ccc::::::ccccc:::loooll;c;.ccccccccccc:::::. 
+ ,:ccccclllllo';l;:oodddddooxdxxxxxxxdc:::cccloddollllooodxdllododooool;l.;llllcccccc::::::. 
+ ,:cccccclllll;'cc;oodddddxxolodxxkkkxdlcccolloxxxdooodddxdlodxxdddooo:::.llllccccccc:::::;. 
+ ,:ccccccllllll',l;looddddxxxdl:ldddolollcloooooodxdooooocoddxxxdddooo;l.,lllccccccc::::::;. 
+ ,:::ccccclllll,.;;:oooodddddl;.';:clolllllllllllllllolcc;coooxxdddool;;.clllcccccc:::::::;. 
+ ,::::cccccllllc'.:,llooooo:......';cccccccclollllllcccc;;;:ccloddooocc.'cccccccccc::::::;;. 
+ ,:::::cccccclll'.'.;llloc'..........;cccccclolloolclllc;;,,',;cooooo:;.:cccccccccc:::::;;;. 
+ ,::::ccccccccll;;.,.cllc;........,..';;:::::ccccccccllc:c;cc'.;coool:.'llcccccccc::::;;;;;. 
+ ':::cccccccclllc,;..;cl,''.... ......,,,,;;:;;;::::ccc::::cll.'lllo:,.cllcccccccc:::;;;;;;. 
+ ';:::cccccclllll,'...c;.,. .. ...'.......'',,,;;:::cc:;;::;;:'.:ccc;',olllcccccc:::;;;;;;,. 
+ ';:::cccccllllllc.:..::.  ...,,;::::::::ccloooooddoooool:;;,'..;:oc'.clllcccccc::::;;;;;,,. 
+ ,:::::cccclllllll,c,.,:.....';:cclllccccllodddddxxxxxxxxdddo:;;;co;',olllcccc:::::;;;;,,,,. 
+ '::::::ccccllclll:.:..';'';::,,,,,,;:::cllodddddxxxxxxxxxkxxxxdl;;',;lllccc::::::;;;;,,,,,. 
+ ':::::::::;;;;;;;;..,.;:c;'.....;clllc::;,,,;;:cooodxxxxxxkkxkkxdc,'lccc::::::;;;;;,,,,,,'. 
+ ':::::::,.        ..:c;.. .';;;;;,..'.      ....,'',,,;;coxxxxkkkxxd:''.....;;;;;;,,,'''''. 
+ ';::::c,.        'cc'. .;ccc.  ..   ..   ..    ........ ...,:oxxxkkkxo:,,'''',;',;,,,'''''. 
+ .,;;;;.        'll'..'c;... .        ....'.    '        .     .;odxkkkxc,,,,,,,;,''''''''.. 
+ .',,'        .co, .;:'   .   .       ;l'  .   'c      ''.        'cdxkkxd:;,,;;;,;,'''''... 
+ .''';,..    .dl..,c.          ;;      .       ..     ..           .'lxkkkxolooooool'':,.... 
+ ..'''''..  .o;.'l;..           .       ..'',,,'...                   ,oxkkx:'''''''.......  
+ ...''''.   c..;l.    .        .,;:;....,,,,;::::ccc::cc:;'.      '    .cdxko     .........  
+ ......''. .' ,c.             .',;:;'''',',,;;,,;:;',;;;:ccl'     ,.    .:odd,.  .... .....  
+ .'''',,,;;;;;;;;;:::;:::::cccclllllllllllccc:,';ccccccccccccccccc:::::::::::::::;;;;,,,,,,. 
+ ';;;;::cllllllllooooooodddddxxxxkkkkkxxxxxxxxl:oddxxxxxxddddddddddddddoooooooooollllccccc:. 
+ ';::::ccclllooooooooooddddddxxkkkkkkxxxxxxl;clcdxxxxxxxxxdddddddddddddddooooooooolllllcccc' 
+ lxxkkkkkkxkkkkkkkkkkkkkkkkkkkkkkkkxxxxxxxd:.cdddddddddddooodddddddddodddddddl,lddddddddddd; 
+ lxxxxxxxodOOOkkkkxxkkkkOkkkkkkkxxxxxddddoooc:cllllllllllcclllllllllc:clllllll;.clllcclllll' 
+ coolc:;c,ddolccoooollcccooolcccc::ccc::;;;;lc::;,'''';;::;;;;;;:;;;,,,'',;,''. .,,,''''.,,. 
+ ,::;,...'lc;,..cccc::;,'clccc:;;'.;::;;;,'.cc::;,,'..::;;;,,''';;,,''...','... .''..... ... 
+ ',,,,''.';,,,,,;;;;;;;;;;::::;;;;,,,,,,,,,',,,'''''..,'''''''''''''.......................  
+ .'....';;:,.;:,':llllllloooooooooloooooo:,.,cccclc;,;::;cllllc:ccclccc;..:;.,;:;,..'..',''. 
+ .,::cclllll.coc':codddddxxxxxxxxkkkkkkkxxll;;lodlc:;;:c:ldddol;,;:ccl:;c;o:'lllllllcc:;::;. 
+ '::cccllllo;,oo;ol:cddddxxxxxxxxxxxkxxxxxdooc:ol:;;;;;;::oddoo:;,,,.'oo::l':lllllllllccc:;. 
+ :odddddddddo.cdclddolodxxxxxxxxxxxdddolc:codollolcccc::c::cccc:;,,;cooo;o:.ooooolllllccccc. 
+ ...'',,;;::c'.cc:ooddocoxxxxxxddxddddl:;;:codlloolcccclllllooo:,,cloooc;l';:;,,,,,,'''..... 
+ ,:::::cccccl:.;l'llloooccoddoldddooooc;;;;coollcccccccc:cc::c;;;:lllll,c;.ccccccccccc:::::. 
+ ,:cccccllllll';l;coddddddooxdxxxxxxkdc;;;ccllodolloooooodddlcloooooooo,o',llllcccccc::::::. 
+ ,:cccccccllll;'cc;ooodddddxoloxxkkxxdoc::cooldxxxdddddddxdlodxxdddooo:;:.lllllccccc::::::;. 
+ ,:ccccccclllll';o,looddddddxdl:cdollclllcloooddddxdodddoloddxxxdddooo,l',lllcccccc::::::;;. 
+ ,:::ccccccllll,.;;:oooooddddl;..,:cllccclllooooooooooolc:coloxxdddool;;.clllcccccc:::::;;;. 
+ ,::::cccccllllc'.;,llloooo;.......,cc:cccclloooooooolll:;;c:cloddooocc.'llllcccccc::::;;;;. 
+ '::::::ccccccll'.'.;llllc...........;ccccccloooooolool:;,'..';cooooo:;.:lcccccccc:::::;;;;. 
+ ':::::::cccccll;;.,.cllc;........,...,;:::::ccc:ccclolc::,:c..;coool:.'llccccccc::::;;;;;,. 
+ ';;:::::cccccclc,,..;cc,',.... ......',,,,;;,;;;::::::;;;,:lc.'lllo:,.cllccccc:::::;;;,,,,. 
+ ';;;::::cccccccl,'...c,.'. ..  ............'',,,,,;;;;'',,,,,..:ccc;',olllccc:::::;;;;,,,'. 
+ ';;:::::ccccccccc.;..::.  ...',;;;;;,,,;;:cclloooolcccc;,......,:oc'.clllcccc::::;;;;;,,''. 
+ ,::::::::cccccccl,c'.,:.....';::cccc::::cllooddddddddddddooc,,',co;',ollcccc::::;;;;,,,,''. 
+ ':::::::::ccccccc;.:..,;'';::;,,'',,,,;:clloodddddxxxxxxxxxxxdo,::.,:lllccc::::;;;;,,,,,,'. 
+ ':::::::::;;;;;;;;.',.;:c;'.....,:llcc:;,,,,,;:clllodxxxxxkkxkkxdc;'lccc:::::;;;;;,,,,,,,'. 
+ ':::::::,.        ..:c;.. ..;;;;;,..'.         ......',;cdxxxxkkkxxo:''.....;;;;;;,,,'''''. 
+ ';::::c,.        'cc,. .;ccc.  ..   ..         ..       ..',coxxxkkkxl;,''''',;',;,,''''''. 
+ .,;;;;.        'll,..'c:'....        .. ...    .        .     .:oxxkkkdc,,,,,,,,,,'''''''.. 
+ .,,,'        .lo, .;:,   .   .       :l'  .   .c      .'.       .'ldxkkxo:;,,;;;,,,'''....  
+ .,,,;,..    .dl..,c'          :;      '.      ..     ..           .,oxkkkdllloooool''...... 
+ .','''...  .o;.'l;'.           .       ...'''''..                    ,oxkkx:,,,,,,,.......  
+ ..'''''.  .c..;l.    .        .';;,....,,,,;::::ccc::::;,..      '    .cdxkl     .........  
+ ......''. .' ,c.             .',;:;'''',,,,;;,,;;;',;;;:ccc.     ;.    .:odd'.   ..         
+ .'''',,,;;;;;;;;::::::::::cccclllllllllllllc:,';ccccccccccccccccccc:::::::::::::;;;;,,,,,,. 
+ ';;;;:cclllllollooooooooddddxxxxkkkkkxxxxxxxxl:oddxxxxxxddddddddddddddoooooooooollllccccc:. 
+ ';:::cccllllooooooooooodddddxxkkkkkkxxkxxxl;clcdxxxxxxxxxdxdddddddddddddooooooooollllllccc' 
+ lxxkkkkkkxkkkkkkkkkkkkkkkkkkkkkkkkxxxxxxxd:.cdddddddddddodddddddddddodddddddl,lddddddddddd; 
+ lxxxxxxxldOOkkkkkkxkkkkOkkkkkkkxxxxxddddoooc:cllllllllllcllllllllllc:clllllll;.clllcclllll' 
+ :oolc:;c,ddolccodoollllcooollccc::ccc::;;;:lc::;,,''';;::;;;;;;::;;,,,'';;,''. .,,,',''',,. 
+ ,::;,...'lc;,..ccc:::;,'clccc:;;'.;::;;;,'.:c::;,,'..::;;;,,''';;,,''...','... .''..... ... 
+ ';,,,''.,;;;,,,;;;;;;;;;;::::;;;;,,,,;,,,,',,,,'''''.,'''''''''''''.......................  
+ .'....';;:,.;:,':llllllloooooooooooooooo:,.,cccllc:;;::;cllllc:::clccc;..:;.,;:;,..'..''''. 
+ .,:ccccllll.coc':codddddxxxxxxxxkkkkkkkxxll;:lodlc:;;:l:ldddol;,;::clc;c;o:'lllllllcc:;::;. 
+ ':cccclllll;,oo;ol;cddddxxxxxxxxxxxkxxxxxdooccolc:;;;;:::oddoo;,',,.'oo::c':lllllllllccc:;. 
+ :ooddddddddo.cdclddolodxxxxxxxxxxxxddolcccodollolcccc::c::ccc::,'',cooo;o:.oooollllllcccc:. 
+ ...'',,;;;:c'.cc:ooddocoxxxxxxddxddddl:;;:codlloollccclllllooo:,,cloooc;l',:;,,,,,,'''..... 
+ ,:::::cccccc:.;c'llloooccoddoldddooooc;,,;coollclcccccc:cc::c;;;:lllll,c;.c:ccccccccc:::::. 
+ ,::ccccclllll';l;coddddddooxdxxxxxkkd:;,;:cllooooloooooodddlcloooooooo,l.;lllllccccc::::::. 
+ ,:cccccccllll;'cc;oooddddddoldxxkkxxdoc::cooldxxxdoddddxxdlldxxdddooo:;:.lllllccccc:::::;;. 
+ ,:ccccccclllll';l,looddddddxdc:cdolccllccloooddddxdddddoldddxxxdddooo;l.,llllccccc:::::;;;. 
+ ,:::ccccccllll,';;:oooooddddl,..,::llccccllooooooooooolc:loooxxdddool;;.cllllccccc:::::;;;. 
+ ,::::cccccclll:'.:'llloooo;.......,:c:cccclloooooooolll:;;cccloddooocc.'llllcccccc:::;;;;;. 
+ ,::::::ccccccll'.'.;llllc'..........;ccccccloloooolool:;,'..';cooooo:;.:lcccccccc:::;;;;;;. 
+ ':::::::cccccll;;.,.cllc;........,...,;::c:::c::ccclllc::,::..;coool:.'lllcccccc::::;;;;,,. 
+ ';;:::::cccccclc,,..;cc'',.... ......',,,,;;,;;;;;::::,;;,:lc.'lllo:,.clllcccc:::::;;;,,,,. 
+ ';;;::::cccccccl,'..'c,.'. ..  ............'',,,,,;;;;'',,',,..:ccc;',ollcccc:::::;;;;,,''. 
+ ';;;:::::ccccccc:.;..::.  ...',;;;;;,,,;;:cclloooolcccc;,'.....;:oc'.clllcccc::::;;;;;,,''. 
+ ,::::::::cccccccl,c'.,:.....';::c:cc::::cllooddddddddddddooc,,',co;',lllcccc::::;;;;,,,,''. 
+ ':::::::::ccccccc;.:..';'';::;,,'',,;,;:ccloddddddxxxxxxxxxxxdo,::.':lllccc::::;;;;,,,,,,'. 
+ ':::::::::;;;;;;;;.''.;:c:'.....,:llcc:;,,,,;;:clllddxxxxkkkxkkxdc;'llcc::::;;;;;;,,,,,,''. 
+ ':::::::;.        ..:c;.. ..;;;;;,..'.       ...'....',:ldxxxxkkxxxo:''.....;;;;;;,,,'''''. 
+ ';::::c;.        'cc,. .,ccc.  ..   ..        ......... ..';cdxxxkkkxl;,''''',;',;,,''''''. 
+ .;;;;;.        'll,..'c:'....        .. ...    ..      ....   .:oxxkkkdc,,,,,,,,,,''''''..  
+ .,,,'        .co, .;:,.  .   .       :l'  .   'c      ''.       .'cdxkkxo:;,,;;;',,''''...  
+ .,,,;,..    .dl..,c'          :,      ..      ..     ..           .,lxkkkxllloooool'......  
+ .',''....  .o;.'l;..           .       ...'''''..                    ,oxkkx:,,,,,,,.......  
+ ..''''..  .c..;l.    .       ..';;,....,,,,;::::ccc::::;,..      '    .cdxkl     ........   
+ .......'  .' 'c.             ..,;:;''.','',;;,,;;;',;;;:ccc.     ;.    .:odd'.   ..         
+ .''''',,,,,,;;;;;;;;;:::cccllllllllllllllllc:;,:cccccccccccccccccccc::::::::::::;;;;,,,,,,. 
+ ';;;;;::ccccclllllllooooddxxxxxkkkxxxxxxxxxxxlodddxxddddddddddddddddddooooooooooolllccccc:. 
+ ';::::ccccllllooooooooddddxxxkkkkkkkxxkkxxl;cloxxxxddxxdddddddddddddddddoooooooooollllcccc' 
+ lxkkkkkkkxkkkkkkkkkkkkkkkkkkkkkkkkxxxxxxxdc'cdddddddddddddddddddddddodddddddo,lddddddddddd; 
+ lxxxxxxxodOOOkkkkkxkkkkOkkkkkkxxxxxxddddoooc:cllllllllllcllllllllllc:clllllll:.cllllllllll' 
+ coolc::c,ddolc:oooollcccooolccc::;ccc::;;;;cc::;,,''';;:::;;;;;::;;,,,'';;,''. .,,,''''',,. 
+ ,::;,...'lc;,..cccc::;,'clcc::;,..;::;;;;,.:c::;;,'..::;;;,,,'';;,,''...'''... .''..... ... 
+ ',,,,''.,;;;,,;;;;;;;;;;;;;;;;;,,,,,,,,,,,'','''''''.,'''''''''''''.......................  
+ ......',::,.;:,':llllllooooooooooooooodo:;',cccllc:;:c:,cllllc:::clcll;..::.;:::;''''.',,'. 
+ .,::ccccccl':oc,:codddddxxxxxxxxkkkkkkkkxll::lodoc:;;:c::dddll,'';;:l::c;o:'lllllllcc:;;:;. 
+ '::ccccllll;,lo;ol:cddddxxxxxxxxxxkkxxxxxdooc:llc:::;;;:,loooo;,',,.'oo::c':lllllllllccc:;. 
+ ;ooddddddddo.cdclddolldxxxxxxxxxxxxxdol::clooccolcccc::c;:cc:c;,'',cooo;oc.ooooolllllccc::. 
+ ...'',,;;;::'.cc:ooddoloxxxxxxddxddddc;'',:cocclllccccllllllooc,,:lollc;c',;;,,,,,,''.....  
+ ,:::ccccccllc.,l'lloooolclddoldddooxo:,..',clcccccccccc:cc::c::;:cclcc,c;.cccccccccc::::;,. 
+ ':::cccccllll,;l;:oddddddoodxxxxxxxxo;''',,;:lollllllooodxdlcooodooooo,o',lllllcccc::::;;,. 
+ ,:::cccccclll:':l;oooddddddoldxxxxxddl;;,;cl:oddooooooddxdlodxxdddoooc;:.lllllccccc::;;;;,. 
+ ,::cccccccllll',l;cooodddddxdc::oolccc::;:lllooooooooooocodddxxdddooo;l',llllcccc:::;;;;;;. 
+ ,:::ccccccclll;.,;;oooooddddl,..,::llc:::::cccclllllllc::coooxxdddooo;:.clllcccc:::;;;;;;;. 
+ ,:::::ccccccccc'.;'llloooo:'......,cc::::;::llcllllllc:;,;ccllodoooocc..lllccccc:::;;;,,,,. 
+ ':::::::ccccccc,...,llloc,.........':cccc::cocclllccll:,,''.';cooooo::.:lcccccc::::;,,,,,,. 
+ ';:::::::cccccc;,.,.cclc;........,'.,;:cc:::::;::cllllc::;:l,.;loooo:.'llccccc:::::;;,,,,'. 
+ ';;;:::::ccccccc';..,cc,''.... .....';;;:;;:;;;::cllcc;;::cll.'loooc;.cllcccc:::::;;;,''''. 
+ ';;;;::::ccccccc,....:,.'. ..  .....''',,,;;;::cclllll:;::::l;.:cll:,,olccc:::::::;;;,''... 
+ ';;;;:::::ccccccc.:..;;.  ...',,;;;::::cclloodddxxdddddolc:;;,.;lol,.:llccc::::::;;;;,,'... 
+ ';;;;:::::ccccccc,:,.';.....';::ccccccclloodddxxxxkkxxxxxxdocc:;coc,,olccc::::::;;;;,,''... 
+ ':;::::::::ccc::c:.;..';'';:;,''.'',;;:clodddxxxxxkkkkkkkkkxxxdl:c,,;lccc::::;;;;;;,,'''... 
+ '::::::cc:;;;,,,,,..,.;:c;......;cllcc:::::cllooddddxxxxxkkkkkkxdo;'cc::;;;;;;;;;;;,,'..... 
+ ';;;;:cc;.        ..:c;.. .';;;,;,. ..  ...,,;;:c::::::cloxxxxkkkxxd:''.....,;;;;;,,''....  
+ ',;;;:c,.        'cc,. .;ccc'  ..    .   ....'',,'''''..',,;coxxkkkkxo:,''''',;,,;,''''...  
+ .,,,;;.        'll,..'c:... .        '.........,'......''.... .;ldxkkkxl;,,,,,,,,,'.......  
+ .''''        .lo,..;:,       ..      ,l,  .   .l. ....,;'...     .:dxkkxd:;,,;;;,;,.......  
+ ....,,'.    .dl..,c.          ;:      ..      ..     ...           'cdxkkxolooooool.......  
+ .........  .o;.'l;..           .       ..'',,,'...                   'ldkkx:'''''''.......  
+  ......   .c..;l.    .        .,;:;...',,,,;::::ccc:::::;'.      '    .:dxko.               
+   ......  .' ,c.             .',;:;''.',,,,,;',;;;'',;;;:cl,     ,.     ;odd,.              
+ .'''''',,,,,,;;;;;;;;;:::ccclllllllllllllllc:;,::ccccccccccccccccccc:::::::::::::;;;;,,,,,. 
+ ';;;;;::ccccccllllllooooddxxxkkkkkkkkxxxxxxxxlodddddddddddddddddddddddoooooooooollllccccc:. 
+ '::::::cccllllllooooooddddxxxkkkkkkkxxkkxxl,cldxxxddddddddddddddddddddddoooooooooollllllll' 
+ lkkkkkkkkxkkkkkkkkkkkkkkkkkkkkkkkkxxxxxxxdc'cdddddddddddddddddddddddooddddddo,cddddddddddd; 
+ lxxxxxxxldOOOkkkkkxkkkkkkkkkkkxxxxxxddddoooc:clllllllllllllllllllllc:clllllll:.clllcccllll' 
+ coolc::c,ddolccoooollcccloolcc::;;cc:::;;;;cc::;,,''';;:::;;;;;::;;,,''',,,''. .,,,''''',,. 
+ ,::;,...'lc;,.'cccc::;,':lcc::;,..;::;;;;'.:c::;;,'..::;;;,,,'';;,,''...','... .''..... ... 
+ ',,,,''.';;;,,;;;;;;;;;;;;;;;;,,,',,,,,,''''''''''''.''''''''''''''.......................  
+ ......',;:,.;:,':llllooooooodddoooooddddc;,,lllooc:;:::,looolc:::colll;..::.;:c:;'','',,,'. 
+ .,:::cccccc.:lc':codddddxxxxxxxxkkkkkkkkxll:;lodoc:;;:c;:dddll,'';;:c::c;o:'lllllllcc:;;:;. 
+ ':::ccccccl;,lo;ol:codddxxxxxxxxxxxkxxxxddooc:llc:;;;;;:,loooo;''',.,lo::c':lllllllllccc:;. 
+ ;ooddddddddo.cdccddocodxxxxxxxxxxxxxdoc:;:looccoccccc::c;;:::c;,'',cooo;oc.ooooollllcc::::. 
+ ..''',,;;;::'.cc:doddoloxxxxxxdddddxxc,..';coc:lllccccllllllloc,,cllllc;c',;;,,,,,,''.....  
+ '::::cccccccc.,c'looooolclddoldddodxo;'...'cc:::cccccccccc::c::;:cclll,c;.ccccccccc::::;,.. 
+ ,::::ccccclll,;l;:oodddddoldxxxxxxxxo;...'';;clccclllooodxdlcododooooo,o.,lllllcccc::;;;;'. 
+ ,::::ccccccll:':l;ooodddddxoodxxxxxddl;,';cl:odollooooddxdlodxxdddoooc;:.clllllcccc:;;;;;,. 
+ ,:::ccccccclll',l;cooooddddxdc::oolc:c:;;:lllooolllllooo:oddxxxdddooo;l',llllcccc:::;;;;;,. 
+ ,:::ccccccccll;.,;;oooooddddc,..,::ll::;:::cccccccccl:;,':oooxxdddooo::.clllcccc:::;;;;;;;. 
+ ,::::::cccccccc'.;'llloooo:'.....';cc::::;::lcclcccc::;..'::lloddooocc..lllcccc::::;,,,,,,. 
+ ,::::::::cccccc,...,llloc,.......'';cllcccccolclooccll;......;coooooc:.:lccccc:::::;,,,,,,. 
+ ';::::::::ccccc;,.'.:clc:.......':;;:lloollclcccccllll:;:;:l,.;looooc.'llccccc:::::;;,''''. 
+ ';;;:::::ccccccc';..,cc'',.... ..',;:lllllllcccccccccc;;:;cll..loooc;.cllcccc::::::;;,''''. 
+ ';;;;:::::cccccc,....:,.'. ..  ..,;;::ccclllcccccccc:;,,;;::l;.:llc:,,olccc:::::::;;;,'.... 
+ ';;;;:::::cccccc:.:..;;.  ...,,;::cclllooodddddddddoooolc::;;,.;lol,':llcc:::::::;;;;,'...  
+ ';;;;;;::::cccc:c,:,..;.....';:cccllclooddddxxxxxxxxxxxxxxddlcc:loc,,occc::::::::;;;,,'...  
+ ';:::cccc::cc::::;.;..';'';::,''.'';:cloddddxxxxxkkkkxxxkkxxxxdlcc,,;lc:::::::::;;;,,'....  
+ '::ccccllc;,,,,,,,..,.;:c;.. ..';clccccccccccclloooodxxxxxkkxkkxdo;'c::;;;;;;;;;;;,,,.....  
+ ';;;::cc;.        ..:c;.. .';;;;,'. ......'''''';'.'''',:odxxxkkkxxd:''.....,;;;;;,'''....  
+ .,,,;:c,.        ,cc,. .;ccc.   .    ..  ........       ..',:oxxkkkkxo:,''''',;,,;''''....  
+ .'',,;.        'll,..':;... .        '.....    .       ...... .,ldxkkkxl,,'',,,,,,........  
+ .....        .lo,..;:'       ..      ,l,  .   .c      ',....     .:oxkkkd:;,,;;;,;,.......  
+ ....,;..    .dl..,c.          ;:      .       ..      .            .cxxkkxolooooodl.......  
+ .........  .o;.,l;..                   ..'',,,'...                   .ldkkx:'''...........  
+  ......    c'.;l.    .        .,::;....,,,,;::::ccc::cc:;,.      ,    .;oxko.               
+      ...  .' ,c.             .',;:;'''',,,,;;,,;;;'',;;;:cl;     ,.     ,ldd,.              
+ .'''''',,,,,,,;;;;;;;:::cccllllllllllllllllc;;;::cccccccccc::::::::::::::::::::;;;;;,,,,,,. 
+ ';;;;;::::ccccclllllloodddxxxkkkkkkkxxxxxxxxdldddddddddddddddooooooooooooooooollllllcccc::. 
+ ';::::::ccclllllooooodddddxxxkkkkxxxxxkxxxc,codddddddddddddddddddddddooooooolooooolllllllc' 
+ lxkkkkkkkxkOOOOkOkkkkkkkkkkkkkkkkkxxxxxxxd:'ldddddddddddddddddddddddloddddodo,cddddddddddd; 
+ lxxxxxxxlxOOOkkkkkxkkkkkkkkkkkxxxxxxdddooooc:cllllllllllllllllllllcc:ccllllll;.:ccccccllll' 
+ :oolc:;:,odolc:oooollcccloolcc::;;cc::;;;;;cc::;,,'.';;:::;;;,;:;;,,,''',,,'.. .,,,''''.,,. 
+ ;c:;,...'lc;,.'cccc::;,'clc:::;,..,::;:;;,':c::;;,,..:::;;;,,'';;,,''...','... .''..... ... 
+ ',,,,''.,;;;,,;;;;;;;;;;;;;;;;;,,,,,,,,,,,,,,,,'''''',''''''''''''........................  
+ ...'..';;;,.;:,':llllooooooddddddoodddddc;,;llloolc::cc;oooollc::colll;..c:.;cc:;'',..''..  
+ .,:::cccccc.:lc'::oodddddxxxxxxxkkkkkkkkxll::lodolc:::lccdddll,',;;:c::c;o:'llllllcc:;,''.. 
+ '::::cccccl;,lo;ol:coddddxxxxxxxxxxxxxxxddooc:oolcccccclcooooo;,',,.,lo;:c.:llllllllc::;,,. 
+ ;ooddddddddo.cdclddollxxxxxxxxxxxxxxxoc:;:looccollllllllcccccc:;',,cooo;o:'oooolllllccc:::. 
+ .'',,,;;;:::..c::ooddocoxxxxxdddxxxkxc;'',:cocclolllllololloooc,;cllll:;:.,;,,'',''''.....  
+ ';;::::::ccc:.,c'lllllolclddooxxkkxxo:,'',;olcccclllcllcccccl:::clclll,c;.cccccc:::;;;;'..  
+ ';;::::::cccc,;l;:looooodooddxxxxkxxd:,,,;;ccllllloooooddxdlcoddddoooo;l.;ccccc:;;;;;;;,..  
+ ';;::::::cccc;':c;loooooddddodxddxdddo::;cllcdddooooddddxolodxxdddooo:::.cccccc:;,,,,,,,'.  
+ ';;:::::cccccc',l;cooooodddxxl::lcc:ccc::cllooddoooooooo:odddxxdddooo;c.,lccccc:;,,,,,,,'.  
+ ';;:::::::cccc,.,;;oooooddddl;.',;;cc:;;::ccllloooooolcc;:oooxxdddool:;.cllcccc::,,''',,,.  
+ ';;;:::::::::c:'.;'llloooo:'......,::;;;;;:cllllooolll:;,,:clloddooocc..lcccccc::;,'.''','. 
+ ,:;;;;;;::::::c'...,llllc,.......'.';ccc:::clllloollll:,;,,,,:looooo:;.:ccccccc::;,'..''''. 
+ ';:::;;;:::::::;,.'.:clc:..'.....,..';:::::::::::cccll::c:cl;':ooooo:.'lcccccc::;;,'...'''. 
+ ';::::::::::::::,;..,cc,',....   ....,,,,;;;,,,;;:ccllcccclll,,ooooc,.cccccccc::;,,'....''. 
+ ':::::::cc::::::'....:,.,. .. ............',,,;;::cloooolllcc,'ccll;,,lcccc:::::;,,'.....'. 
+ ':ccccccccc::::::.;..;;.  ..',,;;;,;,,;::ccllooddddddxxxdol:;;.;col,.:ccccc:::;;;;'........ 
+ ';:ccccccclc:::::':,..;.'...';::::::;;;::clloodddxxxkkkkxxxdcc:;lo;.,lccc:::;;;;;;,........ 
+ .,;::ccc:cclc::::;.;..';'';:;,'....,,,;:clloodddxxxkkkkkkkxxxxdc::.';c::::;;;;,,,,,'......  
+ .,,;::cc:;,;,,,,''..'.;cc;.. ..';cccc:;,''...';:looodxxxxxkxxkkxdl,'c;;,,,,,,,''',,,'.....  
+ ..'',;::,.        ..:c;.  .';;;;,'. ..         .,'',,,,,codxxxkkkxxd:'......,;;;;;'''.....  
+  ....;c'.        ,cc,. .;ccc'  ..    .   .     ............';ldxkkkkxo:,''''',;',;'......   
+  ....'.        'll'..,c;... .        '.....    '.      .....  .,ldxkkkxl;''',,,,,,........  
+   ...        .lo,..;:'       ..      ,l'  .   .l      ,,.        .:oxkkkdc;,,;;;,;,.......  
+    .','.    .dl..,c.          ;:      .       ..     ..            .cdxkkxolooooddl.......  
+    ..''..  .o;.'l;..                   ..',,,,,'..                   .cdkkx:'.............  
+     ...   .c..;l.    .        .,:::...',,,,;::::ccc::ccc:,.      ,.    ;oxkd.               
+      ...  '' ,c.             ..',:;'''',,,,;;,,;;;'',,;;:cc;     '.     ,ldd,.              
+ .'''''',,,,,,,;;;;;;;:::cccllllllllllllllllc;;;::cccccccccc::::::::::::::::::::;;;;;,,,,,,. 
+ ';;;;;::::ccccclllllloodddxxxkkkkkkkxxxxxxxxdldddddddddddddddooooooooooooooooollllllcccc::. 
+ ';::::::ccclllllooooodddddxxxkkkxxxxxxkxxxc,codddddddddddddddddddddddooooooolooooolllllllc' 
+ lxkkkkkkkxkOOOOkOkkkkkkkkkkkkkkkkkxxxxxxxd:'ldddddddddddddddddddddddloddddodo,cddddddddddd; 
+ lxxxxxxxlxOOOkkkkkxkkkkkkkkkkkxxxxxxdddooooc:cllllllllllllllllllllcc:ccllllll;.:ccccccllll' 
+ :oolc:;:,odolc:oooollcccloolcc::;;cc::;;;;;cc::;,,'.';;:::;;;,;:;;,,,''',,''.. .,,,''''.,,. 
+ ;c:;,...'lc;,.'cccc::;,'clc:::;,..,::;:;;,':c::;;,,..:::;;;,,'';;,,''...','... .''..... ... 
+ ',,,,''.,;,;,,;;;;;;;;;;;;;;;;;,,,,,,,,,,,,,,,,'''''',''''''''''''........................  
+ ...'..';;;,.;:,':llllooooooddddddoodddddc;,;llloolc:ccc;oooollc::colll;..c:.;cc:;'',..''..  
+ .,:::cccccc.:lc'::oodddddxxxxxxxkkkkkkkkxll::lodolc:::lccdddll,',;;:c::c;o:'llllllcc:;,''.. 
+ '::::cccccl;,lo;ol:coddddxxxxxxxxxxxxxxxddooc:oolcccccclcooooo;,',,.,lo;:c.:llllllllc::;,,. 
+ ;ooddddddddo.cdclddollxxxxxxxxxxxxxxxoc:;:looccollllllllcccccc:;',,cooo;o:'oooolllllccc:::. 
+ .'',,,;;;:::..c::ooddocoxxxxxdddxxxkxc;'',:cocclolllllololloooc,;lllll:;:.,;,,'',''''.....  
+ ';;::::::ccc:.,c'lllllolclddooxxkkxxo:,'',;olcccclllcllcccccl:::clclll,c;.cccccc:::;;;;'..  
+ ';;::::::cccc,;l;:looooodooddxxxxkxxd:,,,;;ccllllloooooddxdlcoddddoooo;l.;ccccc:;;;;;;;,..  
+ ';;::::::cccc;':c;loooooddddodxddxdddl::;cllcdddooooddddxolodxxdddooo:::.cccccc:;,,,,,,,'.  
+ ';;:::::cccccc',l;cooooodddxxl::lcc:ccc::cllooddoooooooo:odddxxdddooo;c.,lccccc:;,,,,,,,'.  
+ ';;:::::::cccc,.,;;oooooddddl;.',;;cc:;;::ccllloooooolcc;:oooxxdddool:;.cllcccc::,,''',,,.  
+ ';;;:::::::::c:'.;'llloooo:'......,::;;;;;:cllllooolll:;,,:clloddooocc..lcccccc::;,'.''','. 
+ ,:;;;;;;::::::c'...,llllc,.......'.';ccc:::clllloollll:,;,,,,:looooo:;.:ccccccc::;,'..''''. 
+ ';:::;;;:::::::;,.'.:clc:..'.....,..';:::::::::::cccll::c:cl;':loooo:.'lcccccc::;;,'...'''. 
+ ';::::::::::::::,;..,cc,',....   ....,,,,;;;,,,;;:ccllcccclll,,ooooc,.cccccccc::;,,'....''. 
+ ':::::::cc::::::'....:,.,. .. ............',,,;;::cloooolllcc,'ccll;,,lcccc:::::;,,'.....'. 
+ ':ccccccccc::::::.;..;;.  ..',,;;;,;,,;::ccllooddddddxxxdol:;;.;col,.:ccccc:::;;;;'........ 
+ ';:ccccccclc:::::':,..;.'...';::::::;;;::clloodddxxxkkkkxxxdcc:;lo;.,lccc:::;;;;;;,........ 
+ .,;::ccc:cclc::::;.;..';'';:;,'....,,,;:clloodddxxxkkkkkkkxxxxdc::.';c::::;;;;,,,,,'......  
+ .,,;::cc:;,;,,,,''..'.;cc;.. ..';cccc:;,''...';:looodxxxxxkxxkkxdl,'c;;,,,,,,,''',,,'.....  
+ ..'',;::,.        ..:c;.  .';;;;,'. ..         .,'',,,,,codxxxkkkxxd:'......,;;;;;'''.....  
+  ....;c'.        ,cc,. .;ccc'  ..    .   .     ............';ldxkkkkxo:,''''',;',;'......   
+  ....'.        'll'..,c;... .        '.....    '.      .....  .,ldxkkkxl;,'',,,,,,........  
+   ...        .lo,..;:'       ..      ,l'  .   .l      ,,.        .:oxkkkdc;,,;;;,;,.......  
+    .','.    .dl..,c.          ;:      .       ..      .            .cdxkkxolooooddl.......  
+    ..''..  .o;.'l;..                   ..',,,,,'..                   .cdkkx:'.............  
+     ...   .c..;l.    .        .,:::...',,,,;::::ccc::ccc:,.      ,.    ;oxkd.               
+      ...  '' ,c.             ..',:;'''',,,,;;,,;;;'',,;;:cc;     '.     ,ldd,.              
+ .'''''',,,,,,,;;;;;;;:::cccllllllllllllllllc;;;::cccccccccc:::::::::::::::::::::;;;,,,,,,,. 
+ ';;;;;::::cccccllllllooddxxxxkkkkkkkxxxxxxxxdldddddddddddddddooooooooooooooooolllllccccc::. 
+ ';::::cccclllllloooooddddxxxxkkkxxxxxxkxxxc,codddddddddddddddddddddddoooooooloooollllllllc' 
+ lxkkkkkkkxkOOOOkOkkOkkkkkkkkkkkkkkxxxxxxxd:'loddddddddddddddddddddddloddddodo,cddddddddddd; 
+ lxxxxxxxlxOOOkkkkkxkkkkkkkkkkkxxxxxxddddoooc::llllllllllllllllllllcc:clllllll;.:ccccccllll' 
+ :oolc:;:,odolc:oooollcccloolccc:;;cc:::;;;;cc:;;,''.';;:::;;;;;:;;,,'''',,''.. .,,,''''.,,. 
+ ;c:;,...'l:;,.'cccc::;,'clcc::;,..;:::::;,'cc::;;,,..::::;;;,'';;,,''...','... .''..... ... 
+ ',,,,''.,;;;,,;;;;;;;;;;;;;;;;;;,,,,;;;;;;,;,,,,,,,'',,,,,,''''''''.......................  
+ ...'..';;;,.;:,':lllloooooddddddddddddxdc:;:loodolc:clc:oddoolcc:colol;..::.;cc:;'''......  
+ .,;:::ccccc.:lc'::ooodddddxxxxxxxkkkkkkkxooccoddolcc:clccdddll;,,;;:c::c;o:'llllcccc;'..... 
+ '::::cccccl;,lo;ol::oddddddxxxxxxxxxxxxxddoolcoollccclllcoddoo:,,,;.,oo;:c.:llllllllc:;;;,. 
+ ;ooddddddddo.cdclddollxxxxxxxxxxxxxxxol::cooocloolllllllccllcc:;,,;cooo;o:'ooooollllcccc::. 
+ .'',,;;;::::..c::ooddocoxxxxxddxxxxxdc;,,;clolclolllllooooooool;;lllll:;:.,;,,'',''''.....  
+ ';;::::::ccc:.,c'lclllolclddooxkkxxxo:,'',;olcccclllcllllllllcccclclll;c;.cccc::;;;;;;,...  
+ ';;::::::cccc,;l;:looooodoodxxxxxxxxo;,',;;ccllllloooooddxdoloddddoooo;l.;ccccc;;;;;;;,...  
+ ';;::::::cccc;':c;oooooodddooddddddddl::;:llldddooooddddxdlodxxdddooo:::.lccccc:;,,,,,,'..  
+ ';;:::::cccccc',l;looooodddxdc;:c::;:c::;clloooodooooool:odddxxdddooo;c.,lccccc:;,,,,,,,..  
+ ';;::::::ccccc,.,;;oooooddddc,..'''::;;;;:cclllooooool:;':looxxdddool:;.clllccc:;,'''',,'.  
+ ';;;::::::::cc:'.;'llloooo;........;,,,,;;:cllllllllc:;...;:lloddooocc..llccccc::;,'.''','. 
+ ,:;;;;;;::::::c'.'.,llllc'.... .....'::::::colllooclcc,......;looooo:;.:ccccccc::;,'..''''. 
+ ,cccc::::::::::;,.'.:clc;...... .'...,::::::::::::c:::,,;,:l'.;loooo:.'lcccccc::;,'...''''. 
+ ,ccclccccc::::::,;..,cc,',....      .',,;;;;,,,;,,;;;;',;,:lc.'ooloc,.clcccccc::;'....''''. 
+ ,ccclllclll:::::'....:,.,. ..  ..........'',,,,,,,,,;;'',;::;..:cll;,,lccccc::::;'.....'''. 
+ ':cccccccllc:::::.;..;;.  ..',,;;;,;,,;::ccllllooolccllc:;;'.'.;col,.:cccc:::;;;;,'........ 
+ ';::cc:;;:lc:::::':,..;.'...';::::::;;:::clloooodddddddddddo::;;lo:.,lcc::;;;,,,,;,........ 
+ .,;;::c:;;cc:::::;.;..';'';:;,''...,,,;:cloooodddddxdxxxxxxxxxd:::.';c;;:;;,,,''',,'......  
+ ..',;::c:;;;,,,,''..'.;:c;.. ..';:ccc:;;'''''',:llclodxxxxkxxkkxdl,':;;,,,'''''',,,,'.....  
+  ...,;::,.        .':c;.  .';;;;,'. ..         .,..'''',:ldxxxkkkxxd:'......,;;;;;'''.....  
+  ....,c'         ,cc,. .;ccc'  ..    .   ..    ............',ldxkkkkxo:,''''',;,,;'.......  
+  ....'.        'll'..,c;'.. .        '.....    '. .........   .,ldxkkkxl;,'',,,,,,........  
+   ...        .lo,..;:'       ..      ,l'  .   .l      ,,.        .:oxkkkdc;,,;;;,;,........ 
+    .',..    .ol..,c.          ;:      .       ..     ..            .cdxkkxolooooddl.......  
+    ..'''.  .o;.'l;..           .       ..',,,,,'..                   .ldkkx:''.......   ..  
+     ....  .c..;l.    .        .,;:;...',,,,;::::ccc::cc:;,.      ,.   .;oxkd.            .  
+     ..... '' ,c.             ..',:;'''',,,,;;,,;;;'',,;;:cc;     '.     ;ldd,.              
+ .''''',,,,,,,,;;;;;:::cccclllllllllllllllllc;;:::ccccccccccccccc:::::::::::::::::;;;,,,,,,. 
+ ';;;;::::cccccclllloodddxxxxxxkkkkkkxxxxxxxxdoddddddddddddddddddddoooooooooooooollllcccc::. 
+ ';;::::ccccllllloooooddxxxxxxkkkxxxxxxkxxxl:lodxxxddddddddddddddddddddddddoooooooolllccccc' 
+ lxxkkkkkkxkkkkkkkkkkkkkkkkkkkkkkkkxxxxxxxdc,odddddddddddddddddddddddodddddddl,ldddddddxxxd; 
+ lxxxxxxklxOOOkkkkkxkkkkkkkkkkkxxxxxddddddooc:cllllllollllllllooollllcllllllll;.cllllllllll, 
+ :oolc:;c,ddolccoooollcccooolccc:::ccc:::;;:cc:::;;,,,;:::::::::cc::;;,,,;;,,'. .,,,,,,'',;. 
+ ;c:;,...'lc;,.'cccc::;,'clc:::;,..;::;:;;,'cc::;;;,''::::::;;,,::;;,,''.,,'... .,'..... ... 
+ ',,,,''.,;,;,,,;;;;;;;;;;;;;;;;,,,,,;;;,,,,,,,,,,,,,',,,,,,,,,,,,'''''....................  
+ ......',;;'.;:'':llllllllooooooooooodddo:;';llloolc::c:;loooolcccclcll;..::.;:::,'........  
+ .,;::cccccc.:l:';coooddddddxxxxxxxxxkkkkxll::oddolc:::c:cdddlc,',;;:c::c;o:'lllcccc;'.....  
+ ':::::ccccc,,ll;ol:coodddddxxxxxxxxxxxxxddooccoolc:::::::oddoo;'',,.'lo;:c.:lllllllc;;;;,'. 
+ ;ooodddddddl.cdclddolodxxxxxxxxxxxxxxol::loolclollllllcc::cccc:;,,,cloo;o:'ooooolllllcccc:. 
+ .,,,;;;:::::..c:cooddoloxxxxxxxxxxxxxc:;;;clolcoolllllllolooooc;;cllllc;c',;;,,,,,'''.....  
+ ';;::::::ccc:.,c'llllloccldxxdddddxxoc;;;;:olcccllllccc:::ccc::cclllll,c;.cc::;;;;;;;'....  
+ ';;::::::cccl';l;coooooodolodddooddxd:,,,::ccllllloooooodxdocoddddoooo;l.;llcc;;,;;;;,....  
+ ';;::::::cccc;,cc;oooooodddooooooddddo::;cllcddxdooodddxxdlodxxdddooo:::.lllcc:,,,,,,,'...  
+ ';::::::cccccc';l,looooooddxdc;:lc:::c::;:lllooodooooool;odddxxddoooo;l.,lllcc:;,',,,,,'..  
+ ,::::::::ccccc,.;;:oooooddddc,..'',::;,,;;::cccccclllc:;.,cclxxdooool;;.cllcc::;,''',,,,'.  
+ ;ccccc::::cccc:'.;'llloooo;.......';,','',,;lcccccc::::...',;:looooo::..llccc:;,'''',,,,''. 
+ ;ccccllc::::::c'.'.;llool,..........,;:;;;;;c;ccllcclc,.......;loooo;;.:ccccc:,'''''',,,''. 
+ ,cccccllc::::::,;.'.cllc:..'.'...,...,;;;;,,'','',;,,;'',',c. ':oool;.'lcccc::;''''''',,'.. 
+ ,ccc:cclc:::::::,,..;cc;,,'...      .''....'.......'''....,:c..lllo:'.cc:::::::,''....'''.  
+ ,:ccc::clc::::::'...':;.,. .. ........................ ...'... ;;cc,',c:;;;;;;::,.........  
+ .;:cc:::ccc::::::.;..;:.  ..',;;;;;;,;;;:cccllllllc::cc;'....  ':oc..:::;;;,,,;;;'........  
+ .,;:ccccclc::::::':,.';.....,;::ccc:::cccllooooddddddddddool;;,,cl;.,c:;;;;,,,,;;,'.......  
+ ..,;:cccclc::::::;.;..,;',;:;,''.'',;;::cloooddddddddxxxxxxxxxd:::.';:;;;;,,,,,,,,,'......  
+ ...,;::cc:;,,,,,',..'.;cc;.. ..';clcc:;,'''.'',:ccclodxxxxkxxkkxdl,':;;,,''''''''',,......  
+ ...',;::;.        ..:c;.. .';;;;,'. ..         ........';ldxxxkkkxxd:''.....,:;:::'''.....  
+  ....;c'         ,cc,. .;ccc'  ..    .   .     ..       ...';ldxkkkkxo:,''''',;,,;'...''..  
+ .....,.        'll'..,c:'.. .        '.....    '        ...   .,ldxkkkxl;,,,,,,;;,....''..  
+ .....        .lo,..;:'       ..      ,l,  .   .l      ',.        .:oxkkkdc;,;;;;,;,.......  
+ ...';,..    .dl..,c.          ;:      .       ..     ..            .cdxkkxolooodddo.......  
+ ..',,,,'.  .o;.,l;..           .       ..',,,,,'..                   .lxkkx:''............  
+ ..''''..  .c..;l.    .        .,::;...',,,,;::::clcccccc;,.      ,.   .;oxkd.      ...      
+  ......'. '' ,c.             .',;:;''',,,,,,;,,;;;',,;;;:cc;     '.     ;ldd,.              
+ .''''',,,,,,,,;;;;;::::ccclllllllllllllllllc:;::cccccccccccccccccccccc::c:::::::::;;,,,,,,. 
+ ';;;;::::ccccccllllooodddxxxxxkkkkkkxxxxxxxxdoxxxxxxxxxxxxxxxxxxdddddddddddooooolllcc:::::. 
+ ';:::::ccccllllloooooodddxxxxkkkkkkkxxkxxxl;ldxxxxxxxxxxxxxxxxxxxdddddddddddoooooolccccccc' 
+ lxkkkkkkkxkkOkkkkkkkkkkkkkkkkkkkkkxxxxxxxdc,ldddddddddddddddddddddddodddddddo,lddddxxxddxd; 
+ lxxxxxxklxOOOkkkkkxkkkkkkkkkkkxxxxxdddddoooc:clllllllllllllllooollllclllollll:.cllllllllll, 
+ :oolc:;c,ddolccoooollcccooolccc:::ccc:::;;;cc::;;,''';:::::;;;:c::;;,,,,;;,,'. .,;,,,,'',;. 
+ ;c:;,...'lc;,.'cccc::;,'clcc::;,..;::;:;;,'cc::;;,'..::::;;;,,,:;;,,''..,,'... .,'..... ... 
+ ',,,,''.,;;;,,;;;;;;;;;;;;;;;;;,,,,,;;;,,,,,,,,,''''',,,,'''',,,'''''.....................  
+ ......';;;,.;:,':lllloooooooooooooodddddc;,;llloolc::c:;oooollc::lllll;..::.;:c:;'........  
+ .,;:::ccccc.:l:,::oooddddddxxxxxxxxxxkkkxll::oddollcc:c:cdddll'.',;:c::c;o:'lllccc;,'.....  
+ '::::cccccl;,ll;ol::oddddddxxxxxxxxxxxxxddooccoolcccc:::;ooooo;'.',.,lo;:c.:llllllc:;;;;;,. 
+ ;ooddddddddo.cdclddollxxxxxxxxxxxxxxxolcclodolldollllccc;:cccc:;'',cloo;o:'oooooolllllccc:. 
+ .,,,,;;;::::'.c::ooddocoxxxxxxxxxxxxxc:;;;clollooollllololllllc,,cllllc;c',;;,,,,,''......  
+ ';;::::::ccc:.,c'lllllolcldxxxxxdddxo:;,,;:olcccllllccc:::::c:::clllll;c;.cc:;;;;;;;,.....  
+ ';;::::::cccc,;l;:oooooddollxxddddxxd:;,,::ccclolllooooddxxocoddddoooo,o.;llc:;,,,;;,'....  
+ ,:::::::ccccl;'cc;oooooodddoloddxddddo::;:ll:oxxxooodddxxdlodxxdddooo:;:.lllc:;,,,;;,,'.... 
+ ;clllc::cccccc';l;looooodddxdc::llc:cc::;:lllollddlloool;odddxxdddooo,c.,llc:;;;,;;;;,,,,'. 
+ ;cccllc:cccccl,',;:oooooddddc,..,;;cc;,,,;;:ccc::::cc:;,.'::cxxddoool;;.cllc;,,,,,,;;,,'''. 
+ ;cccllc:ccccccc,.:,loooooo;.......';,'''''',lccc::::;;,...'.''cooooo::..lccc:,''',,,,,,'''. 
+ ,c:;:cc:::ccccc,''';loool,..........';;;;;,;c;cllc:clc,.... ..'loooo;;.:ccccc;'''''',,'.... 
+ ,cc:;:cc:::cccc;;.,'lllc:..'''...'. .',,,,'''''..',,,,..,.,c. .;oool;.'c:;;:c:;''''''''...  
+ ,:c::cllc:::ccc:,;..;cl,,,'...       ....... .............':c..clcl:'.c:;;;;:::,''........  
+ ';ccccllc::::c::'...':;.,. ..  .....       ........... ...'..  ,;c:'''c;;;;;;::;'.........  
+ .,:cccccc::::::::.;..;;'  ..',,;;;;;,,;;::ccclllllc:;:c:'...   ';oc..::;;;;;;;;;,'........  
+ .';;:ccc:::::::::,:,.';.'...';::ccc:::cccllooooddddddddddooo;;',co;.,c:;;;,,,'',;,'.......  
+ ..',:ccc:::::::::;.;..';,,;::,''.'',;;::llooddddddxxxxxxxxxxxxd;::.';:;;;;;,,,,,'',,,'....  
+ ..';::ccc;,,,,,,''..'.;cc;.. ..';clcc:;,''....';c::codxxxkkxxkkxxo,':;;,,,'.','''.',,,....  
+ ..,;;::;;.        .':c;.. .';:;;,'. ..          . .....';ldxxxkkkxxd:''.....,:::::',,'....  
+ .',;;::,.        ,cc,. .;lcc'  ..    .   .      .       ....;ldxkkkkxo:,''''',;,,:,'''....  
+ .,,;;;.        ,ol'..,c:... .        '.....    '        ...   .,ldxkkkxl;,,,,,,;;,'.''....  
+ .,,,'        .lo,..;:'       ..      ,l,  .   .l      ',.        .:oxkkkd:;,;;;;,;,......   
+ .,'',;'.    .dl..,c.          ;:      .       ..     ..            .cdxkkxolooodddo....     
+ .''.',,'.  .o;.,l;..           .       ..',,,,,'..                   .lxkkx:'''..'..        
+ ........  .c..;l.    .        .,::;...',,,;::::cclcccccc:,.      ,.   .;oxkd.               
+  ........ '' ,c.             .'',:;''',,,,;;;,,;;;,,,;;;:cc;     '.     ;ldd,.              
+ .'''''',,,,,,,,;;;;;;:::cccllllllllllllllllc:;::cccccccccccccccccccccc::c::::::;,''''',,''. 
+ ';;;;;:::::cccccllllloooddxxxxxxkkkkxxxxxxxxdoxxxxxxxxxxxxxxxxxxdddddddddddooolc:;;,,,;;;,. 
+ ';:::::ccccclllloooooooooddxxxkkkkkkxxkxxxl,cdxxxxxxxxxxxxxxxxxxxddddddddddooolc::::;;;:::. 
+ lxkkkkkkkxkOOOOkOkkkkkkkkkkkkkkkkkxxxxxxxdc,loddddddddddddddddddddddodddddddo,lddddddddddd; 
+ lxxxxxxxldOOOkkkkkxkkkkkkkkkkkxxxxxxddddoooc::lllllllllllllllooolllccclllllll:.cllllllllll, 
+ :oolc:;c,ddolc:oooollcccloolccc::;cc:::;;;;cc::;;,''';;::::;;;;c::;;,,'';;,,'. .,;,,,,'',;. 
+ ;c:;,...'lc;,.'cccc::;,'clcc::;,..;:::::;,'cc::;;,'..::::;;;,,,:;;,,''..','... .,'......... 
+ ',,,,''.,;;;,,;;;;;;;;;;;;;;;;;,,,,,;;;,,,,,,,,,''''.,,,''''',,''''''.....................  
+ ......';;;,.;:,':llllloooooodddoooodddddc:,;loooollc:c:;ooooolc::cllll;..:;.;:::,.........  
+ .,;:::ccccc':lc,::oooddddddxxxxxxxxxxkkkxooc:odddolc:::;:dddll'.',;;c::c;l;.ccccc:,''.....  
+ '::::cccccl:'ll;ol::oddddddxxxxxxxxxxxxxdxdoccodlccc:;;;,loool,'.',.,lo::c.:lllllc::::;;;,. 
+ ;loodddddddo.:dclddolldxxxxxxxxxxxxxxoc::codolldollllc:c;;ccc:;,'',cloo;o:'oooooollllccc::. 
+ .',,,;;;::::'.c::oodddcoxxxxxdddxddod:,..';loccooollclllolllll:',cllllc;c',;,,,,,,''......  
+ ,:::::::cccc:.,c'lllooolclddooxxdoool:'...,lc:;;:cccccc:::::c;;;:lllll;c:.c:;;;;;;;;,''...  
+ ,lll:::cccccl,;c::oooooddoldxkkxxddxd,...,,:;lodlcllloodxkxocoddddoooo;o',c:;;;;;::;;;,;,,. 
+ ,cllc::cccccc:,cc;ooooooddddodxxdddooo;,';ll:oxxxolloddxxoloxkkdddooo:;:.c:;;,,;;;:;,,,,,'. 
+ ':clc::ccccccc,;l;looooodddxdc,;c::;::;;,;llllllodccclll;odddkkdddooo,c.,lc;,,,,,;;;,'''''. 
+ ,;:clccccccccl;',;:ooooooddoc'....'::,''',,;:;::;;;:c;,'.';,:dxdoooll;;.clc:;,',,,,,'...... 
+ ;c:cllc:ccccccc,.:,loooool;...   ..''.'....,c;::;;;;,;'. .....coooll;:..:ccc;,''''''....... 
+ ;cccllc:::ccccc,''',llool'....  ..  .;;;,,',:;:clc;cl:'........lolll;;.;::cc:,''''........  
+ ,cccclc::::cccc:;.,.cclc:...... ... .',,,,''.''..',,;'..'.,l' .,lllc;.'::;;::;''..........  
+ ,:cccc::::::cccc,;..,cc,','...       ....... .............':c..cl:l;'.:;;;;;;:;'..........  
+ .;:ccc:::::::c::,....:;.'. ..  ....        ....... ...  ..'..  ,;c;'''c;;;;,,;;,''........  
+ .;:cccc::::::::::.:..;;'  ..',,;;;;;,,;;::ccllllolc::cc:'...   ':l:..:::;;;;;,,,;;;'......  
+ .;:cccc::::::::::,:,..:.'...';::ccc::::ccloooooddddddddddddo;,.,cl;.,c::;;;,,''',;;,......  
+ '::cccllccc::::::;.,..';,,;::,''.'';;;:clooddddddxxxxxxxkkkkkxo:cc.';:::;;;,,''',;;,......  
+ '::ccclllc;,,,,'''..,.;cc;.. ..';clccc;,'.....';c::cldxxxkkkkkkkxo,':;;,,,'''.'',;;,'.....  
+ ':::cc:;;.        .':c;.. .';:;,;'. ..          . .....';oxxkkkkkkxxc'''''.';c::::;,'.....  
+ .;:::c:,.        ,cc,. .;lcc'  ..    .   .      .       ....;lxkkkkkkdc;;,,,,;:;;:;,......  
+ .,;;;;.        'll,..,c:'.. .        ''....    '.       ...   .,ldxkkkxo:;;;;;;;:;,.......  
+ .''''        .cd;..;c,   .   ..      ,o;  .   .l      ',.        .:dxkkkxl::::cc;:;.......  
+ ....;;'.    .dl..,l'          ,c      ..      ..     ..           .'lxkkkkdlodddddo......   
+ ....,;,'.  .o:.,l;'..          ..     ..',;:::;,..                   .lxkkkc',''','.....    
+ .....''.   c'.:o.    ..      .';cc:,'',:::clllloooolllllc;.      ,.   .:dxkd. ........      
+  .....''. .,.,l.  .          .,;:c:;;;;;:::ccccccc::cccllll:     ,'     ;odd:.....          
+ ,ccccccllllllllllllllllllllllloooooooooooooooolllllllllllllllccccccccc::::::::::::::;;;;;,. 
+ cdxxxxxxxxxxxxxxxxkkkkkkkkkkkkkkkkkOOOOOOOOOOkkkkkkkkkkkkkxxxxxxxxdddddddddoooooooollllllc' 
+ :dddddddddddddddxxxxxxxxxkkkkkkkkkkkOOOOOOOOkkkkkkkkkkkkkkkkkxxxxxxxddddddddoooooooooooool, 
+ :oddddddddddddddxxxxxxxxxxkkkkkkkkkkOOOOOOOOOOOkkkkkkkkkkkkkkkkkkkxxxxxxxddddddddddddddddd, 
+ :ddddddddddxxxxxxxxxxxxkkkkkkkkkkkOOOOOOOOOOOOOOOOOOOkkkkkkkkkkkkkkkxxxxxxxxxxxxxxxddddddd; 
+ cddxxxxxxxxxxxxxxxxxxxkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkkxxxxxxxxxxxxdddddddd; 
+ cdxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkxxxxxxxxxdddddddddddddd, 
+ cdddxxxxxxxxxxxxxxxxxkkkkkkkkkkkOOkdlcccc:;,,,;:odkOOOOOOOOkkkkkkkxxxxxxddddddddddoooooooo, 
+ cdddddddddddddddddddddddxxxxxxxxc'.................',:ldxxxxxxxxxddddddooooooollllllllllll' 
+ ;ccccccccccccccccccccccllllllll'.........................:loooooollllllcccccccccclcccccc::. 
+ ,::::::::::::::ccccclllooooollc.............  ......     ..:ccccc::::::cl::::::::::::::::;. 
+ ,::::cc::::::::::::ccccclllccc:............    ....       ..;cccc::::::lo:;;,,,,,,,,,;;;;;. 
+ '::::;;;,,,,,,,,,,,;:::::;::::;..  ....  ..   .....    ..... ':::;;;;;;;;,'''',,'',''''','. 
+ .,;;::;;;;;,''',',,,;;;,:,,;::;.  ..      .   ......   ....   .;;,,,,,,,''''''''....''''''. 
+ .',,;,,;,,''''''.'''',,,,,,,;c::'  ...        ..   ... .       .';;;,,,;,''',,,'''......... 
+ ..,';;','';;cc,;,''....''','''...                   ........     ':;;;,:;',,';,,,'';,,,,',. 
+ .'',,;,.'',;:;',,''',...',,'....         ..           .......     ;ddl'::',,'''''.';;;,,,,. 
+ ,,'....'',,.,''...';;...,,.              .,.   .        ...       .,;,'cc;,;c:ccc;,ccccccc. 
+ .,,..'......,''.;;col:,...       ......'.......                 ...':',cl:;;c:::c;;llooooo, 
+ ..'',,:lc,.,.'.'ldodcol.       ................              ......'',cdOo'.':cc;:c::;;;;;. 
+ ,'':lc:,,,co;','oxxxll,  ..................                   .. .,;,,coOd,,,;:c;cdddlc;,:. 
+ ,;;::;',,,ol:;;:oxkkl................     .                    ..,','.olkxl;;,,''cccc;:;'c' 
+ ,c;;;,,,,,::;'.:oxkd'..............       ..        .         .;,,,....okkx'';''.,;'c:,,::. 
+ .,'',,,,:odoo;.:oxd'...'........'..       ..                 .,,;:,'...dkkx,,'..';:,c;..;;. 
+ ..'...';cxxxd:,cdl...','........'..         .  ...         ...,,ldc,.;;codx:'',.''';,'..';. 
+ ;;.';:c:cdxxlldxl'..,;,'';,.....'....   .......             ..:lddd:...'ccl:.';;:,',,...':. 
+ ,;'.,;;:;,:cllxl,,,;;;,,:::;,''',.....  ,:;'...   .,;'.      ..cddd:....,cc::c:cl:,,c,..''. 
+ ':;,;,.'::::;;c;;;;::,;cccc::;,',.....  .::::;;;..,clc.........':ddl....,cc,'cccc, .',''... 
+ .;clc:'';cc;,:::::cl:,:cllccc::;,,,,;;,,,;cccccc:'.,:ld,.........ldl....,cc,.;;,,.  ..',,.. 
+ .;c:;;;;;c,;cccc:clc;,:ccc::::cc;;:cc:;;;;clooolc:'.;:lk:.    ...cd:....,cc: ...:,  ..'.... 
+ ..'','..;;::::::ccc;,;::::::cclolldolc:;cc:loooool:..;'.       .,o;.....'cco:.  ;c.  .. ..  
+ ....'''..',,;;::cc;,,::::cloxxxxdddodd:;:c:looooll:.           .';'.....,cldo....:'.......  
+ '....',...;coxkkkkxkxdxxxdxddoolllllc:::::::cc::c:::::;:' ..',,..,;,....,lloo.....'''.....  
+ '....',..';coxkOOOO0000OOkxol:;,,,,,,.;,;:::loooodooollc:;,;;;;'.,;,.,:::lodxo..''... .':c. 
+ ...;,,...'',;loddxxkkkkxxdoc;'........'''',,:clloddddolc:;,,',;'.';,..:::cclo,;ll:,;'...:d. 
+ ,ccccccllllllllllllllllllllllloooooooooooooooolllllllllllllllccccccccc::::::::::::::;;;;;,. 
+ cdxxxxxxxxxxxxxxxxkkkkkkkkkkkkkkkkkOOOOOOOOOOkkkkkkkkkkkkkxxxxxxxxdddddddddoooooooollllllc' 
+ :dddddddddddddddxxxxxxxxxxkkkkkkkkkkOOOOOOOOkkkkkkkkkkkkkkkkkxxxxxxxddddddddoooooooooooool, 
+ :oddddddddddddddxxxxxxxxxxkkkkkkkkkkOOOOOOOOOOOkkkkkkkkkkkkkkkkkkkxxxxxxxddddddddddddddddd, 
+ :ddddddddddxxxxxxxxxxxxkkkkkkkkkkkOOOOOOOOOOOOOOOOOOOkkkkkkkkkkkkkkkxxxxxxxxxxxxxxxddddddd; 
+ cddxxxxxxxxxxxxxxxxxxxkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkkxxxxxxxxxxxxdddddddd; 
+ cdxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkxxxxxxxxxdddddddddddddd, 
+ cdddxxxxxxxxxxxxxxxxxkkkkkkkkkkkOOkdlcccc:;,,,;:odkOOOOOOOOkkkkkkkxxxxxxddddddddddoooooooo, 
+ cdddddddddddddddddddddddxxxxxxxxc'.................',:ldxxxxxxxxxddddddooooooollllllllllll' 
+ ;ccccccccccccccccccccccllllllll'.........................:loooooollllllcccccccccclcccccc::. 
+ ,::::::::::::::ccccclllooooollc.............  ......     ..:ccccc::::::cl::::::::::::::::;. 
+ ,::::cc::::::::::::ccccclllccc:............    ....       ..;cccc::::::lo:;;,,,,,,,,,;;;;;. 
+ '::::;;;,,,,,,,,,,,;:::::;::::;..  ....  ..   .....    ..... ':::;;;;;;;;,'''',,'',''''','. 
+ .,;;::;;;;;,''',',,,;;;,:,,;::;.  ..      .   ......   ....   .;;,,,,,,,''''''''....''''''. 
+ .',,;,,;,,''''''.'''',,,,,,,;c::'  ...        ..   ... .       .';;;,,,;,''',,,'''......... 
+ ..,';;','';;cc,;,''....''','''...                   ........     ':;;;,:;',,';,,,'';,,,,',. 
+ .'',,;,.'',;:;',,''',...',,'....         ..           .......     ;ddl'::',,'''''.';;;,,,,. 
+ ,,'....'',,.,''...';;...,,.              .,.   .        ...       .,;,'cc;,;c:ccc;,ccccccc. 
+ .,,..'......,''.;;col:,...       ......'.......                 ...':',cl:;;c:::c;;llooooo, 
+ ..'',,:lc,.,.'.'ldodcol.       ................              ......'',cdOo'.':cc;:c::;;;;;. 
+ ,'':lc:,,,co;','oxxxll,  ..................                   .. .,;,,coOd,,,;:c;cdddlc;,:. 
+ ,;;::;',,,ol:;;:oxkkl................     .                    ..,','.olkxl;;,,''cccc;:;'c' 
+ ,c;;;,,,,,::;'.:oxkd'..............       ..        .         .;,,,....okkx'';''.,;'c:,,::. 
+ .,'',,,,:odoo;.:oxd'...'........'..       ..                 .,,;:,'...dkkx,,'..';:,c;..;;. 
+ ..'...';cxxxd:,cdl...','........'..         .  ...         ...,,ldc,.;;codx:'',.''';,'..';. 
+ ;;.';:c:cdxxlldxl'..,;,'';,.....'....   .......             ..:lddd:...'ccl:.';;:,',,...':. 
+ ,;'.,;;:;,:cllxl,,,;;;,,:::;,''',.....  ,:;'...   .,;'.      ..cddd:....,cc::c:cl:,,c,..''. 
+ ':;,;,.'::::;;c;;;;::,;cccc::;,',.....  .::::;;;..,clc.........':ddl....,cc,'cccc, .',''... 
+ .;clc:'';cc;,:::::cl:,:cllccc::;,,,,;;,,,;cccccc:'.,:ld,.........ldl....,cc,.;;,,.  ..',,.. 
+ .;c:;;;;;c,;cccc:clc;,:ccc::::cc;;:cc:;;;;clooolc:'.;:lk:.    ...cd:....,cc: ...:,  ..'.... 
+ ..'','..;;::::::ccc;,;::::::cclolldolc:;cc:loooool:..;'.       .,o;.....'cco:.  ;c.  .. ..  
+ ....'''..',,;;::cc;,,::::cloxxxxdddodd:;:c:looooll:.           .';'.....,cldo....:'.......  
+ '....',...;coxkkkkxkxdxxxdxddoolllllc:::::::cc::c:::::;:' ..',,..,;,....,lloo.....'''.....  
+ '....',..';coxkOOOO0000OOkxol:;,,,,,,.;,;:::loooodooollc:;,;;;;'.,;,.,:::lodxo..''... .':c. 
+ ...;,,...'',;loddxxkkkkxxdoc;'........'''',,:clloddddolc:;,,',;'.';,..:::cclo,;ll:,;'...:d. 
+ ;cccllllllllllllllllllllllllloooooooooooooooooooooolllllllllllllccccccccc::::::::::::;;;;,. 
+ cdxxxxxxxxxkkkkkkkkkkkkkkkkkkkkkkOOOOOOOOOOOOOOOOOkkkkkkkkkkkkkxxxxxxdddddddoooooooolllllc' 
+ coddddddddddddxxxxxxxxxxkkkkkkkkkkkOOOOOOOOOOOOOOkkkkkkkkkkkkkkxxxxxxddddddddodooooooooool, 
+ coddddddddddddddxxxxxxxxxxkkkkkkkkOOOOOOOOOOOOOOOkkkkkkkkkkkkkkkkkxxxxxxxxdddddddddddddddd, 
+ :ddddddddxxxxxxxxxxxxxxkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOkkkkkkkkkkkkkkkxxxxxxxxxxxxxxxddddddd; 
+ cddxxxxxxxxxxxxxxxxxxxkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkkxxxxxxxxxxxxdddddddd; 
+ cdxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkxxxxxxxxxdddddddddddddd, 
+ cdddxxxxxxxxxxxxxxxxxxxkkkkkkkkkOOkdlcccc:;,,,;:odkOOOOOOOOkkkkkkkxxxxxxddddddddddoooooooo, 
+ cddddddddddddddddddddxxxxxxxxxxxc,.................',:ldxxxxxxxxxddddddooooooollllllllllll' 
+ ;ccccccccccccccccccccllllllllll'.........................:ooooooollllllcccccccccclcccccc::. 
+ ,::::::::::::::ccccclllooooollc.............  ......     ..cccccc:::::l::::::::::::::::::;. 
+ ,::::cccc:cccc::::ccccclllllccc............    ....       ..;ccccc::::lc:;,,,,,,,,,,,;;;;;. 
+ ':::::;;;;;,,,,,,,;;::::::::::;..  ....  ..   .....    ......'cc:;;;;;;;,'',,''''',''','''. 
+ ',;:::;:;;;,,,',,,,;;:;;:,;;::,.  ..      .   ......   ...... .;;,,,,,,,''''''''...'''''''. 
+ .',,;;;;;,,,,'''.'''',,,,,,,:c::.  ...        ..   .....       .,;;;,,,;,'''''''''......... 
+ .',';,','';;cc,;,''...''',,''....                   ........    .';;;;,:;',,';,,,'';,',,''. 
+ .'',,:,..',;:;';;''''...'',''...         ..           ........   .;odl.;;',,'''''.';;;;,,,. 
+ ,,,....',,,.,''...';,'..;;.              .;.            ....      .;:,'cc;,;c::cc,,ccc::::. 
+ .;,..'....'',''.;;col:,.'.       ......'.......                   ..:.,cl:;;cc:cc;;looodoo, 
+ .''',,;cc'.,.'.'looocol.       ................              ......',,coOo'',;:c;:c::;;;::. 
+ ,'':occ;;,cd;'''oxxxcl;. ..................                   .. .',,,coOd,,,;:c;cddolc;;:. 
+ ,;;cc;',;;ol:;;:oxkkl.................                 .        .,','.llkxc;;,,''cccc;c,'c' 
+ ,l;;;,',,,cc;'':oxkx,..............       ..        . .       .,,,,...'okkx'';''.,;'c;,;:c. 
+ .,',;,,,:odll,.:dxd'...'...........       ..                 .,,;;,'...dkkx,',..';c,c:..;;. 
+ ......';cxxxdc,cdl'..','........'..         .  ...         ...,,cd:,.;;lddx;',,.'',;,'..',. 
+ ;;.',;::ldxxlldxl'..,;,'';' ....'....    ........           ..:lddd:...'ccl:.';;;,',,...':. 
+ ,;..,;;:;;:cllxl,,,;;;,':::;,''',.....   ,;'...    .,.       ..lddd:....,cc::cccl:,,c'..',. 
+ ':;,;,.':::::;c;;;;::,;ccc:::;,',.....   .::;;,,. ,cl:.........'cddl....,cc,'ccc:,..,;''..  
+ ';:cc:'';cl;,:::::cl:':cccccc::;,,,,;,''';:ccccc:..,:oo.........'odl....,cc'.::;;.  .'',,.. 
+ .;lc:;;;;c,;ccc::clc;,:ccc::::cc;;::::;;;;cloollc;'.::ok:.    ...cd:....,cc; ...:,  ..'.... 
+ .''','.':;:c::::ccc:,;:::::::clolloolc:;cc:loooool;..;,,.      .,o:.....,ccl;.  ;c.  .. ..  
+ ...',''..',,,;::cc;',::::ccldxxxxddodo;;:c:lddooooc.           .':'.....,cldo.. ':'.......  
+ '....',..';loxkkxxdxdddxddxddddolllllc::::::cc:cc::;;;;;.  ..,,..,;,....,llol.....'''.....  
+ '....',.'';cdxkO0OO0000OOkxolc:,,,,;,.;;;::cooooddooollc;;,;;;;'.,;'.,:::lodxo....... .';c. 
+ ...;,,...',,:lodxxkkkkkxxdoc:''.......'''',,;cccoodddool:;,,,,;'.';'..:::cclo;;cc:',....:x. 
+ ;cllllllllllllllllllllllloooooooooooooooooooooooooooolllllllllllccccccccc:::::::::::::;;;,. 
+ cxxkkkkkkkkkkkkkkkkkkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkkkxxxxxxdddddddddooooooollllc' 
+ cdxxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkkOOOOOOOOOOOOOOOkkkkkkkkkkkkkkxxxxxxddddddddddooooooooool, 
+ cddddddddddddxxxxxxxxxxxxxkkkkkkkOOOOOOOOOOOOOOOOkkkkkkkkkkkkkkkkkxxxxxxxxdddddddddddddddd, 
+ cddddxxxxxxxxxxxxxxxxxxkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkkkkkkxxxxxxxxxxxxxxxddddddd; 
+ cxxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkxxxxxxxxxxxxdddddddd; 
+ cxxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkxxxxxxxxxdddddddddddddd, 
+ cxxxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkOOxolllcc:;;;:coxkOOOOOOOkkkkkkkkxxxxxxddddddddddoooooooo, 
+ cdddddddddddddddddxxxxxxxxxxxxxxo,.................,;coxkkkxxxxxxxdddddoooooooolllllllllll' 
+ ;llllllllccccccccccllllllllllll,........................':oooooooolllllcccccccccccccccc:::. 
+ ,:::::ccccccc::ccccllllooooolll.............  .......   ...clcccc::::l::::::::cc:::::::::;. 
+ ,::ccccccccccc::cccccllllllllcc............    ...        .':cccc:::cdl:;;,,,,,,,,,,,;;;;;. 
+ ,:::::;;;;;;;,,,,,,;;:::::::::;..  ....  ..   .....    ......;cc::;;;:;,,'',,','',,'''''''. 
+ ';;:::;:;;;,,,',,,,;;::;:,;;;;;.  ..      .   .....   ........,;;,,,,,,,''''''''...'''''''. 
+ .',,;;;:;,,,,'''.'''',,,,,,,:c::'  ...        ..   .. ....     .;;;;,,,;,'''''''''......... 
+ .',,;;,,'';;cc,,,',''.''',,''....                   ......      .,;;;;,:;',,',,,,'','',,''. 
+ .'',,:,''.,;:;,;;''''...'',''...         ..          ........    .lddl.:;',,'''''.,;;;;,,,. 
+ ,,,.'.'',,,',''...';;'..;;.              .;.   .       ......     .;:,'cc;,;:::cc,,ccc::::. 
+ .;,..'....'',''.;;:ol:,.'.       ......'........                  .':.,cc:;;lc:cc;;looodoo, 
+ .',',,;cc'.,.'.'loodcol.       ................               .....',,coOo'',;:c;:c::;;:::. 
+ ,'':occ;;,cd,'''oxxxll:. ..................                  .....,,,,coOd,,,;:c;cddolc;;:. 
+ ,;;cc;,,;;ol:;;:oxkkl................                  .        .'','.llkxc;;,,''cccc;c,'c' 
+ ,l;;;,,,,,:c;'':oxkx,..............       ..        ....       ',,,...'okkx'';''.,;'c;,;:c. 
+ .,,,;;,,:odll,.;dxd,...'...........       ..                 .',;;,'...dkkx,',..';c,c:..;;. 
+ ..'...';cxxxx:,cdo'..','........'..         .  ...          ..,,co:,.;;ldxx;',,.'',;,'..',. 
+ ,;',,;::ldxxlloxl'..,;,'',' ....'....    ...''  ..       .....:cddd:...'clo:.';;;,',,...':. 
+ ,;..,:::;;ccclxl,,,;;;,,:::;,''',.....   ';'....    ...      ..lddd:....,cc::cccl:,,c'..',. 
+ ':;,;,.':::::;c;;;;::,,ccc:::;,''.....   .;;'...  .'c:.    ....'cddl....,cc,'cccc,..,;''..  
+ '::cc:'';cc;':::::cl:,:cccccc::;,''.......:ccc::;..,:oo.........'odl....,cc'.::;;.  .'',,.. 
+ .;lc::;;;c,;ccc::clc;,:ccc::::cc;;:::::;;;clollll;'.::ox:.    ...cd:....,cc: ...:,  ..'.... 
+ .''','.':;:c::::ccc:,;:::::::clolloolc::cc:loooool;.':,,.      .,o:.....,ccl;.  ;c.  .. ..  
+ ...',,'..',,,;::cc;,,:::::cldxxxxddooo:;:c:lodddooc.           .,:'.....,cldo.. 'c'.......  
+ '....',..':lodxxxxdddddxddxddddolllolc::::::cc:cc::;;;,;.  ..',..,;,....,llol.....'''.....  
+ '....',..';cdxkO0OO0000OOkxolc:,,,,;,.;;;:ccooooddooollc;;,;;;,..,;,.,:;:lodxo...'... .':c. 
+ ...;,,...',,:lodxkkkkkkxddoc:''.......'''',,;:clloddddolc;,',,;'.';'..:c:cclo:;cc:'''..':d. 
+ ;cllllllllllllllllllllllloooooooooooooooooooooooooooolllllllllllcccccccccc::::::::::::;;;,. 
+ cxxkkkkkkkkkkkkkkkkkkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkkkxxxxxxddddddddddoooooollllc' 
+ cdxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkkkOOOOOOOOOOOOOOOkkkkkkkkkkkkkkxxxxxxddddddddddooooooooool, 
+ cddddddddddddxxxxxxxxxxxxxkkkkkkkOOOOOOOOOOOOOOOOkkkkkkkkkkkkkkkkkxxxxxxxxdddddddddddddddd, 
+ cddddxxxxxxxxxxxxxxxxxxkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkkkkkkxxxxxxxxxxxxxxxddddddd; 
+ cxxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkxxxxxxxxxxxxxxdddddd; 
+ cxxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkxxxxxxxxxdddddddddddddd, 
+ cxxxxxxxxxxxxxxxxxxxxxxkkkkkkkkkOOkxolllcc:;;;:cdxkOOOOOOOkkkkkkkkxxxxxdddddddddddoooooooo, 
+ cdddddddddddddddddxxxxxxxxxxxxxxo,................',:coxkkkkxxxxxxddddddoooooollllllllllll' 
+ ;lllllllcccccccccccllllllllllll,........................':oooooooolllllcccccccccccccccc:::. 
+ ,::::cccccccc:ccccclllloollollc.............  .......   ..'clcccc:::l::::::::::::::::::::;. 
+ ,:cccccccccccc::ccccllllllllllc............    ...        .'ccccc::col::;,,,,,,,,,,,,;;;;;. 
+ ,:c::::;;;;;;,,,,,,;::::::::::;..  ....  ..   .....    ......;cc::;;::;;,'',,','',,,'','''. 
+ ';;:::;:;;;,,,',,,,;;::;:;;;;;,.  ..      .   .....   ........,;;,,,,,,,''''''''...'''''''. 
+ .',,;;;:;,,,,'''.'''',,,,,,,:c:;.  ...        ..   .. .......  .;;;;,,,;,'''''''''......... 
+ .',,;;,,'';;cc,,,',''.''',,''....                   ......      .;;;;;,:;',,',,,,'','',,''. 
+ .'',,:,''',;:;,;;''''...'',''...         ..          ........    .lddl.:;',,'''''.,;;;;,,,. 
+ ,,,.'.'',,,',''...';;'..;;.              .;.           ......     .;:,'cc;,;:::cc,,ccc::::. 
+ .;;..'....'',''.;;:ol:,.'.       ......'........                  .':.,cc:;;lc:cc;;looodoo, 
+ .',',,;cc'.,.'.'loodcol.       ................               .....',,coOo'',;:c;:c::;;:::. 
+ ,'':occ;;,cd,'''oxxxll;. ..................                  .....',,,coOd,,,;:c;cddolc;;:. 
+ ,;;cc;,,;;ol:;;:oxkkl.................                 .        .,,,'.llkxc;;,,''clcl;c,'c' 
+ ,l;;;,,,,,:c;'':oxkx,..............       ..        . ..       ',,,...'okkx'';''.,;'c:,;:c. 
+ .,,,;;,,:odll,.;dxd'...'...........       ..                 .',;;,'...dkkx,',..':c,c:..;;. 
+ ..'...';cxxxx:,cdo'..','........'..         .   .           ..,,lo:,.;;ldxx;',,''',;,'..',. 
+ ,;.,;;::ldxxlloxl'..,;;'',' ....'....     ..''. ...         ..:lddd:...'clo:.';;;,',,...':. 
+ ,;..,:::;;ccclxl,,,;;:,,:::;,''',.....   .;,'''..     ...    ..lddd:....,cc::cccl:,,c'..',. 
+ ':;,;,.':::::;c;;;;::,,cccc::;,''.....    ,;'...   .;:.     ...'cddl....,cc,'cccc,..,;''..  
+ '::cc:'';cc;':::::ll:,ccccccc:;;,''...    ,:::;;,..;:oo.........'odl....,cc'.::;;.  .'','.. 
+ .;lc:;;:;l,;ccc::clc;,:ccc::::cc;;::::;;;;cllllll;'.:;ox:.    ...cd:....,cc: ...:,  ..'.... 
+ .''','.':;:c::::ccc:,;::::::cclolloolc::cc:loooool;..;,'.      .,o;.....,ccl;.  ;c.  .. ..  
+ ...',,'..',,,;::cc;,,:::::codxxxxddooo:;:c:lddodolc.           .,:'.....,cldo...':'.......  
+ '....',...;loxkkxxdxdddxddxddddolllllc::::::cc:cc::;;;;;. ...',..,;,....,llol.....'''.....  
+ '....',.'';cdxkO0OO0000OOkxolc:,,,,;,.;;;::cooooddoooolc;;;;;;;'.,;,.,:::lodxo...'... .':c. 
+ ...;,,...',,:lodxkkkkkkxddoc:''.......'''',,:cclloddddol:;,',,;'.';,..:c:cclo:;cc:','..':d. 
+ ;cllllllllllllllllllllllloooooooooooooooooooooooooooolllllllllllccccccccccc::::::::::::;;,. 
+ cxxkkkkkkkkkkkkkkkkkkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkkkxxxxxxxdddddddddoooooollllc' 
+ cdxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkkOOOOOOOOOOOOOOOOkkkkkkkkkkkkkkxxxxxxxddddddddoooooooooool, 
+ cddddddddddddxxxxxxxxxxxxkkkkkkkkOOOOOOOOOOOOOOOOOkkkkkkkkkkkkkkkkxxxxxxxxdddddddddddddddd, 
+ cddddxxxxxxxxxxxxxxxxxkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkkkkkkxxxxxxxxxxxxxxxddddddd; 
+ cxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkxxxxxxxxxxxxxxdddddd; 
+ cxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkxxxxxxxxxdddddddddddddd, 
+ cxxxxxxxxxxxxxxxxxxxxxxkkkkkkkkkOOOxolllcc:;;;:cdxkOOOOOOOOkkkkkkkxxxxxdddddddddddoooooooo, 
+ cdddddddddddddddddxxxxxxxxxxxxxxl,................',:loxkkkkxxxxxxddddddoooooollllllllllll' 
+ ;lllllllcccccccccccllllllllllll,........................'cooooooollllllcccccccccccccccc:::. 
+ ,::::ccccccc::ccccclllloollollc......................   ..'clccccc:c::::::::::c::::::::::;. 
+ ,:ccccccccccc:::ccccllllllllllc............    ...        .'cccccccdl::;;,,,,,,,,,,,,;;;;;. 
+ ,::::::;;;;;;,,,,,,;::::::::::;..  ....  ..   ......   ...  .:cc:;;::;;;,'',,''''',''','''. 
+ ';;:::;:;;;,,,',,;,;;::;:;;::;,.  ..      .   .....   ........,;;,,,,,,,''''''''...'''''''. 
+ .',;;;;:;,,,,'''''''',,,,,,,:c::.  ...        ..   .. .......  ';;;;,,,;,'''''''''......... 
+ .';';;,,'';;c:,,,,,''.''',,'''...   .               ......      .;;;;;,c;',,,,,,,'','','''. 
+ .'',,:,''',;:;,;;''''...'','''..        ...          ........    .oddl.:;''''''''.,;;;;,',. 
+ ,,'''.'',,,',''...';,'..;;.              .:.   .       ......     .;:,'cc;;;:::::,,:::::::. 
+ .;,..'....'',''.;,col:,.'.       ..............                   .':.,cc;;;lcccc;;oooddoo, 
+ .',',,;cc'.'.'''loodcoc.       ................               .....',;coOo'',::c;::::;;:::. 
+ ,'':occ;;,cd,'',dxxkco;. .............'....                  .....',,;coOd,',;:c;cddolc;;;. 
+ ,;;cc;,,;;dl:,;:okkkc.................                 ..       .',,''lokxc;;,,,,llll;c,'c' 
+ ,l:;;,,;,,cc;''cokkx,..............       ..        . ..       .,,,...,oxkd'';''.;;'c;,;:c' 
+ .;,,;;,,:ooll,.:dkd'...'...........        .                  ',;;,....xkkd,''..':c,l;..;;. 
+ ......';cxxxx:,cdo'..','........'..        ..                .,,co;,.;;odxd;';,''',:,'..';. 
+ ;,',,;::lxxxlloxl'..,;,'',' ....'....     . ''  ...         .':lddo;...,clo:.';;;,',,...';. 
+ ,;..,;::;;ccllxl,,';::,,:::;,''''.....   .;;,,,...     ...  ..'oddd:....;cc::cccl:;,c'..,,. 
+ ,:;,;'.,:;:::;c;;;;::,,cccc::;,''.....    ';'...    .'..    ...,cddc....,cc,,ccc:,..,;',..  
+ '::cc;.';cl;,:::::cl:,ccccccc:;,''....    .::;,''..;coc... .....,odl....,cc'.::;,.  .'','.. 
+ .:lc:;;;:c,;ccc::clc;,cccc::::cc;;;;:;,,',:lllllc;'.::dx:.   ....ld;....,cc;....:'  ..'.... 
+ .''','.':;:c::::ccc:,;::::::cclolooolc::cccloooool;.':,,.      .;o:.....,ccl,.  :c. ... ..  
+ ...',,...',,,;::cc;,,:::::cldxxxxododo;;:l:oddddooc.           .;:'.....,cldl...,c'.......  
+ .....',..':lodxxxddxdoddddxdxddolololl:::::cccc:c:;;;;,,.  ..',..,;,....,lldl.....'''.....  
+ '....''.'';ldxkO0OO0000OOkxolc;,,,,;,';;;:ccodddddooolcc;;,:;;;..,;'.,:;:lodxc...'... ''::  
+ ...;',...'',:lodxkkkkkkxddoc:,'.......''',,,:cclooddddolc;,,,;:..,;'..:ccclod:;cc:'''...:d. 
+ ;cllllllllllllllllllllllloooooooooooooooooooooooooooooollllllllllcccccccccc::::::::::::;;,. 
+ cxxkkkkkkkkkkkkkkkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkxxxxxxxxddddddddddoooollllc' 
+ cdxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkOOOOOOOOOOOOOOOOOkkkkkkkkkkkkkkxxxxxxxddddddddddoooooooool, 
+ cddddddddddddxxxxxxxxxxxkkkkkkkkOOOOOOOOOOOOOOOOOOkkkkkkkkkkkkkkkkxxxxxxxxdddddddddddddddd, 
+ cddddxxxxxxxxxxxxxxxxxkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkkkxxxxxxxxxxxxxxxddddddd; 
+ cxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkxxxxxxxxxxxxxxdddddd; 
+ cxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkxxxxxxxxxdddddddddddddd, 
+ cxxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkOOOkdooolc::::clxkOOOOOOOOOkkkkkkkxxxxxdddddddddddoooooooo, 
+ cddddddddddddddddxxxxxxxxxxxxxxxo;'...............,;cldkkkkkkxxxxxxxddddoooooooollllllllll' 
+ ;lllllllcccccccccccllllllllooll,........................,lodooooooollllcccccccccccccccc:::. 
+ ,:::::cccccc::ccccclllllllloll:...........................;llllcccl::::::::::::::::::::::;. 
+ ,:cccccccc:::c:cccccllllllllllc............   ....        .;cccccldcc:;;;,,,,,,,,,;,;;:;;;. 
+ ,:ccc::;;;;;;,,,,;;;::::::::::;..  ..... ..   .....    .....'cccc:c:;;;;,'',,''''',''','''. 
+ ';::::;:;;;,,,',,;,;:::::;;;;;,.  ..      .  ......  ....... .;;;,,,,,,,''''''''...'''''''. 
+ .',;;;;:;,,,,'''.'''',,,,,,,cc:;. .... .      ..  ..  ....    .,;;;;,,,;,'''''''''......... 
+ .';,:;,,'';,c:,,,,'''.'',;,'''...   ..              ......      ,;;;;;,c;',,,,,,,'',''''''. 
+ .',,,:,''.;::;,;;''''...'','''..        ...         ........    .:dooc.:;''''''''.,;;;;,,,. 
+ ','''.'',,'','...',;,'..;;.              .:.   .      .......    .,:c,'cc;;;:;;::',::::;;;. 
+ .;,..'...''',''';,coc:'.'.       .....''........        .         .,:.,cc;;;lccll;:oooddoo, 
+ .',',,;c:..'.'''olodco:.       ......'''.......                 ...',,cokl,',::c,::::;::c:' 
+ '',:occ;;,co''''dxxkco;. .............'.....                ......,,';coOo'',;:c;cddolc;;;. 
+ ,;;cl;,,,;ol:,,:dxkkc'.................                .        .',;''ookxc;;,,',llll:c,'c' 
+ ;c:;;',;,,cc;''cdkkx,..............       .         . ..       ',,,...;oxko'';,'';;,c;;;:c' 
+ .;,;:,,,:oolc,.:dkd'...'...........       ..         ..       ,,;;,....xkkd'''..':c,l;.';;. 
+ .'....';lxxxx;,cdo'..','........'..        ..               ..,,co;'.;;odxo;';,''';:;'..';. 
+ ,,',,;::lxxxlloxl'..,;,'',.  ...'....     . ''.....         .':lddo;...,clo:.';,;,',,...';. 
+ ,,..;:::;;ccllxl,,';:;,,:::;,'.''.....   ';,,;'..     ....  ..'oddd:....;cc::cccl:;,c...,;. 
+ ,:;,;'.,;;::c:c;;;;::,,cccc::;,,''....   .;,....   .,,.     ...,lddc....;cc';cccc,..,;',..  
+ '::cc;.';cc,,:::;:cl:,ccccccc:,,''....    ;::,'''..;cd:..  .....,odl....;cc..:::;.  .,'''.. 
+ .:lc:;;;:c,;ccc::clc;,cclc:c:ccc;;;;;;,',,clolllc;''::dx:.   ....od;....;cc;....:.  .''.... 
+ .',','.,c;:c::::ccc;,;::::::ccllcodolc::cccooooool;.,:,;.      .;d:.....,ccl'. .:c. ... ..  
+ ...','....,,,;::cc;';:::::cldxxkxddodo::clcodddddoc.           .;:'.....,cldc.  ,c........  
+ .....,,..':lodxxddodooddddxdxddoooooll:::::cccccc:;;;,,,.  ..''..;;,....;lldc.....'''.....  
+ '....,'..';ldxOO0OO0000OOkxolc;,,,;;'';;;::coodddddoool:,,,:;;;..;:'.;;;:lodxc...''.. ''c:  
+ ...;',...',;cldxkkkkkkkxddoc:,'.......',,,;;:cclooddddolc;,,,;:..,;'.'cccclod:;cc:.....'co  
+ ;cllllllllllllllllllllllooooooooooooooooooooooooooooooolllllllllllccccccccc::::::::::::;;,. 
+ cxxkkkkkkkkkkkkkkkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkxxxxxxxdddddddddddooollllc' 
+ cdxxxxxxxxxxxxxxxxxxxkkkkkkkkkkkOOOOOOOOOOOOOOOOOkkkkkkkkkkkkkkxxxxxxxddddddddddoooooooool, 
+ cddddddddddddxxxxxxxxxxxkkkkkkkkOOOOOOOOOOOOOOOOOOkkkkkkkkkkkkkkkkxxxxxxxxdddddddddddddddd, 
+ cddddxxxxxxxxxxxxxxxxxkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkkkxxxxxxxxxxxxxxxddddddd; 
+ cxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkkkxxxxxxxxxxxxxxdddddd; 
+ cxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOOkkkkkkkxxxxxxxxxdddddddddddddd, 
+ cxxxxxxxxxxxxxxxxxxxxxkkkkkkkkkkOOOkdooolc::::clxkOOOOOOOOOkkkkkkkxxxxxdddddddddddoooooooo, 
+ cddddddddddddddddxxxxxxxxxxxxxxxo;'...............,;cldkkkkkkxxxxxxxddddoooooooollllllllll' 
+ ;lllllllcccccccccccllllllllooll,........................,lodooooooollllcccccccccccccccc:::. 
+ ,:::::cccccc::ccccclllllllloll:...........................;llllcccl::::::::::::::::::::::;. 
+ ,:cccccccc:::c:cccccllllllllllc............   ....        .;cccccldlc:;;;,,,,,,,,,;,;;:;;;. 
+ ,:ccc::;;;;;;,,,,;;;::::::::::;..  ..... ..   .....    .....'cccc:c:;;;;,'',,''''',''','''. 
+ ';::::;:;;;,,,',,;,;:::::;;;;;,.  ..      .  ......  ....... .;;;,,,,,,,''''''''...'''''''. 
+ .',;;;;:;,,,,'''.'''',,,,,,,cc:;. .... .      ..  ..  ....    .,;;;;,,,;,'''''''''......... 
+ .';,:;,,'';,c:,,,,'''.'',;,'''...   ..              ......      ,;;;;;,c;',,,,,,,'',''''''. 
+ .',,,:,''.;::;,;;''''...'','''..        ...         ........    .:dooc.:;''''''''.,;;;;,,,. 
+ ','''.'',,'','...',;,'..;;.              .:.   .      .......    .,:c,'cc;;;:;;::',::::;;;. 
+ .;,..'...''',''';,coc:'.'.       .....''........        .         .,:.,cc;;;lccll;:oooddoo, 
+ .',',,;c:..'.'''olodco:.       ......'''.......                 ...',,cokl,',::c,::::;::c:' 
+ '',:occ;;,co''',dxxkco;. .............'.....                ......,,';coOo'',;:c;cddolc;;;. 
+ ,;;cl;,,,;ol:,;:dxkkc'.................                .        .,,;,'ookxc;;,,',llll:c,'c' 
+ ;c:;;',;,,cc;''cdkkx,..............       .         . ..       ',,,...;oxko'';,'';;,c;;;:c' 
+ .;,;:,,,coolc,.:dkd'...'...........       ..         ..       ,,;:,....xkkd'''..':c,l;.';;. 
+ .'....';lxxxx;,cdo'..','........'..        ..               ..,,co;'.;;odxo;';,''';:;'..';. 
+ ,,',,;::lxxxlloxl'..,;,'',.  ...'....     . ''.....         .':lddo;...,clo:.';,;,',,...';. 
+ ,,..;::c;;ccloxl,,';:;,,:::;,'.''.....   ';,,;'..     ....  ..'oddd:....;cc::cccl:;,c...,;. 
+ ,:;,;'.,;;:c::c;;;;::,,cccc::;,,''....   .;,....   .,,.     ...,lddc....;cc';cccc,..,;',..  
+ '::cc;.';cc,,:::;:cl:,ccccccc:,,''....    ;::,'''..;cd:..  .....,odl....;cc..:::;.  .,'''.. 
+ .:lc:;;;:c,;ccc::clc;,cclc:c:ccc;;;;;;,',,clolllc;''::dx:.   ....od;....;cc;....:.  .''.... 
+ .',','.,c;:c::::ccc;,;::::::ccllcodolc::cccooooool;.,:,;.      .;d:.....,ccl'. .:c. ... ..  
+ ...','....,,,;::cc;';:::::cldxxkxddodo::clcodddddoc.           .;:'.....,cldc.  ,c........  
+ .....,,..':lodxxddodooddddxdxddoooooll:::::clcccc:;;;,,,.  ..''..;;,....;lldc.....'''.....  
+ '....,'..';ldxOO0OO0000OOkxolc;,,,;;'';;;::coddddddoool:,,,:;;;..;:'.;;;:lodxc...''.. ''c:  
+ ...;',...',;cloxkkkkkkkxddoc:,'.......',,,;;:cclooddddolc;,,,;:..,;'.'cccclod:;cc:.....'co  
+ ;clllllllllll',llc'.,clc'..:oooooooooooooooooc..,looc'.,',clllllllllccccccc::::::::::::;;,. 
+ cxxxl;,:dkkkl,od:',cdo:',cxkOOOOOOOOOOOOOOOOOOxl,,lxxdc,'.cxkkkxxolodxxddddddddddoooollllc' 
+ cdd:.   ,odl'.'.':c;'':oxkkkkkkkOOOOOOOOOOOOOOOkko:,:oxdc''lxkxd,...;odddddddddooooooooool, 
+ cdl.    .,;....''..,ldxxkkkkkkkkOOOOOOOOOOOOOOOOOOkxo:;ldx:.;oo;.  ..cdddddddddddddddddddd, 
+ coc.         ...,coxxxkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOkxc;;;....    ..:dxxxxxxxxxxxxddddddd; 
+ cdc.        .'cdxxxxxkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOkd:..       .;oxxxxxxxxxxxxddddddd; 
+ cd:       .:odxxxxxxxkkkkkkkkkOOOOOOOOOOOOOOOOOOOOOOOOOOOOkxl'.     .,odxxxxdddddddddddddd, 
+ cd:      .cdxxxxxxxxxxkkkkkkkkkOOOOOxdooolc::cllxkOOOOOOOOOkkd'      'ldddddddddddoooooooo, 
+ cd;     .;oddddxxxxxxxxxxxxxxxxkd:,...............,:coxkkkkkkx;      'looooooooollllllllll' 
+ ;c,    .:cccccclllclllllloooooo;........................;lddool,.    .:ccccccccccccccc::::. 
+ ,:,.. .;ccccccccccclllllllloll:...........................;llllc;.   .;::::::::::::::::::;. 
+ ,cccccclcccc:cccccccllllllllllc............   ....        .;cclldl;,;;;;;,,,,,,,,;;,;;;;;;. 
+ ,:cclccc:;;;;,,;;;;;::::::::::;..  ..... ..   .....  .......,clllolc::;;,'',,''''',''','''. 
+ ';:::c::;;;,,,,,,;,;:::::;;;;;,.  ..      .  ......  .........::;;;;,,,,''''''''...'''''''. 
+ .',;::::;,,,,'''''''',,,,,,;cc:;. ....        ..  ... ....    .,::::;,,;,'''''''''......... 
+ .';,:;,;'';,::,,,',..'',,;,'''...   ..             ........    .,::;;;,c;',,',,,,'',''''''. 
+ .',,;:,''.;:c;,;;''',...'','''..        ...         ........    .cdddc.:;''''''''.,;;;;,,,. 
+ ','''''',,'','...',;,'..;;.              .:.          .......    .;cl,'cc;;;:;;::',::::;;;. 
+ .;;..'...''',''',,coc:'.'.       ....'''........        ..        .,:.,cc;;;lccll;:oooddoo, 
+ .',',,;c:..'.'''olodco:.       ......'''.......                 ...',,cokl,',::c,::::;::cc' 
+ '',:occ;;,cd''',dxxkco:. .............'......               ......,,';coOo'',;:c;cddolc;;;. 
+ ,,;cl;,,;;ol:,,:dxkkc'.................                .        .,,;,'ookxc;;,,',llll:c,'c' 
+ ;c:;;,,;,,cc;',cdkkx,..............       .         . ..       ',,,...;oxko'';,'';;,c;;;:c' 
+ .;,;:;,,:oocc,.:dkx,...'...........       ..         ..       ,;::,....xkkd'''..'::,l;.':;. 
+ ......';cxxxx;,cdo'...,'........'..        ..               ..,,co;,.;;dxxd;';,''';:;'..';. 
+ ;,',,;::lxxdlloxl'..';,'',. ....'....    .. '' ....         .':cdxd;...,clo:..;,,,',,...';. 
+ ;,..;:cc;;clllxl,,',;:,,:::;''.''.....   ';;;;,....   ..... ..'oddd:....;cc::cccl:;,c...,;. 
+ ';;,;'.,;;;:c:c;;;;::,,:ccc::;,,''....   .;''...   .,'..   ....,lddc....;cc,;cccc,..,:.,..  
+ ';:cc;.';cc,,:::;:cl:,ccccccc:,,''....    ':;'.....;cd:.    ....,odl....;cc'.:::;.  .,'''.. 
+ .:lc::;;;l;,cc:::clc;,cclc:c::cl;;;;;;,''';loooll;.'::dd;.   ....ld;....;cc;....:'  .''.'.. 
+ .,,','.,c;:c::::ccc:,;::::::ccllcldolc::cccodddooo;.,c;;.      .,d:.....,ccl,. .:c. ... ..  
+ ...','....,,,;::cc;,,:::::clddxxxddodo::clcoddddddc.           .;:'.....,cldl.  ,c........  
+ .....,,..':lodxxddodooodddxdxxdooooollc::c:clcccc:;,,,,,.  ..''..;:,....;lldl.....'''.....  
+ '....,'.',;cdxkO0OO0000OOkxolc:,,,;;,';;:cccoddddddooolc,;,:;;;..;:'',;;:lodxc...''.. '':;  
+ ...;',...',;codxkkkkkkkxddoc:,'...'...,,,,;;:cclloooddoll;,,,;:..,;'.'cc:ccod:,:c;.....':o. 
+ ;cllllllllllooooooooooooooo;;oooooc.                  ...'.:llllllllllllccccc:::::::::::;,. 
+ cxkkkkkkkkkkkkkkkkOOOOOOOOd;dOOOOOk:.....           .,.;dx::dkkkkkkkxxxxxxdddddddoooooollc' 
+ cddxxxxxxxxxxxxxkkkkkkkkkx;ckkkOko,'lo:.'.      ..'''.:xOkx:cxkkkkkkxxxxxxdddddddooooooooo, 
+ cddddddxxxxxxxxxkkkkkkkkxc;xkkxl,'cxOkd;.;::::;'.;xkko,,okkx:okkkkkkkkkkxxxxdddddddddddddd, 
+ cddxxxxxxxxxxxxxkkkkkkkko;dkko;,lxOxl;:oO000000Od:;cxOko;:oxo;dkkkkkkkkkkkxxxxxxxxxxdddddd; 
+ cxxxxxxxxxxxxxxkkkkkkkkd;oxo;:dkko::ok000000000000kdccokOxl:lc;