{{ $currentNode := . }}

{{ $debug := (slice) }}

{{ $pPath := "" }}
{{ range $p := .Site.RegularPages }}
 {{ $pPath = printf "/%s" $p.File }}
 {{ $pageDir := "" }}
 {{ with $p.File }}
  {{ $pageDir = (substr .Dir 0 -1)}}
 {{ end }}

 {{ $gp := $.GetPage $pPath }}
 {{ $gpPath := printf "/%s" $gp.File }}
 {{ range $k, $v := $gp.Params }}
  {{ with in $k "has_" }}
   {{ $s := index (split $k "has_") 1 }}
   {{ range $sin,$plur := $currentNode.Site.Data.sandpointsnamegraph }}
    {{ if eq $s $plur }}
     {{ range index $gp.Params $k }}
      {{ $cp := $.GetPage (printf "/%s/%s" $sin .) }}
      {{ $cpPath := printf "/%s" $cp.File }}
      {{ range $kcp, $vcp := $cp.Params }}
       {{ with in $kcp "has_" }}
        {{ $scp := index (split $kcp "has_") 1 }}
        {{ range $sincp,$plurcp := $currentNode.Site.Data.sandpointsnamegraph }}
         {{ if eq $scp $plurcp }}

          {{ $.Scratch.SetInMap $gpPath "depth" "core" }}
          {{ $.Scratch.SetInMap $gpPath "child_depth" "mantle" }}
          {{ $.Scratch.SetInMap $gpPath "has" $s }}

          {{ with $gp.File }}
           {{ $core := substr .Dir 0 -1 }}
           {{ $.Scratch.SetInMap $gpPath "core" $core }}
           {{ $.Scratch.SetInMap $cpPath "core" $core }}
          {{ end }}

          {{ with $cp.File }}
           {{ $mantle := substr .Dir 0 -1 }}
           {{ $.Scratch.SetInMap $gpPath "mantle" $mantle }}
           {{ $.Scratch.SetInMap $cpPath "mantle" $mantle }}
          {{ end }}

          {{ with $.Scratch.Get $gpPath }}
           {{ if .has_children }}
               {{ $hasChildren := index . "has_children" | append $cp }}
               {{ $.Scratch.SetInMap $gpPath "has_children" (uniq $hasChildren) }}
           {{ else }}
               {{ $.Scratch.SetInMap $gpPath "has_children" (slice $cp) }}
           {{ end }}
          {{ end }}

          {{ $.Scratch.SetInMap $cpPath "depth" "mantle" }}
          {{ $.Scratch.SetInMap $cpPath "child_depth" "crust" }}
          {{ $.Scratch.SetInMap $cpPath "plural" $plur }}
          {{ $.Scratch.SetInMap $cpPath "has" $scp }}

          {{ range index $cp.Params $kcp }}
           {{ $gcp := $.GetPage (printf "/%s/%s" $sincp .) }}
           {{ $gcpPath := printf "/%s" $gcp.File }}

           {{ with $.Scratch.Get $cpPath }}
            {{ if .has_children }}
                {{ $hasGChildren := index . "has_children" | append $gcp }}
                {{ $.Scratch.SetInMap $cpPath "has_children" (uniq $hasGChildren) }}
            {{ else }}
                {{ $.Scratch.SetInMap $cpPath "has_children" (slice $gcp) }}
            {{ end }}

            {{ if .is_in }}
             {{ $isincore := index . "is_in" | append $gp}}
             {{ $.Scratch.SetInMap $cpPath "is_in" (uniq $isincore) }}
            {{ else }}
             {{ $.Scratch.SetInMap $cpPath "is_in" (slice $gp) }}
            {{ end }}
           {{ end }}

           {{ $.Scratch.SetInMap $gcpPath "depth" "crust" }}
           {{ $.Scratch.SetInMap $gcpPath "plural" $plurcp }}
           {{ $.Scratch.SetInMap $gcpPath "in" (slice $sin $plur) }}

           {{ with $gcp.File }}
            {{ $crust := substr .Dir 0 -1 }}
            {{ $.Scratch.SetInMap $gpPath "crust" $crust }}
            {{ $.Scratch.SetInMap $cpPath "crust" $crust }}
            {{ $.Scratch.SetInMap $gcpPath "crust" $crust }}
           {{ end }}

           {{ with $.Scratch.Get $gcpPath }}
            {{ if .is_in }}
             {{ $isinmantle := index . "is_in" | append $cp}}
             {{ $.Scratch.SetInMap $gcpPath "is_in" (uniq $isinmantle) }}
            {{ else }}
             {{ $.Scratch.SetInMap $gcpPath "is_in" (slice $cp) }}
            {{ end }}
           {{ end }}
          {{ end }}
         {{ end }}
        {{ end }}
       {{ end }}
      {{ end }}
     {{ end }}
    {{ end }}
   {{ end }}
  {{ end }}
 {{ end }}

{{ $.Scratch.SetInMap $pPath "debug" (printf "%#v" $debug) }}
{{ end }}

{{ return $.Scratch }}
