We will show how the influence statistics in RSiena behave. We assume that ego is connected to all alters.


Functions

First, we define some functions:


Centering behavior variables

fcentering <- function(actors) {
    centered <- actors - mean(actors)
    return(centered)
}


Calculating similarity scores

\[ sim^z_{ij} = 1 - \frac{|z_i - z_j|}{r_V} \]

fsimij <- function(actors, min, max) {
    # rv <- max(actors) - min(actors)
    rv <- max - min
    mat1 <- matrix(actors, nrow = length(actors), ncol = length(actors), byrow = TRUE)
    mat2 <- t(mat1)
    simij <- 1 - (abs(mat1 - mat2)/rv)
    return(simij)
}


linear shape

flinear <- function(ego, alters, ...) {
    actors <- c(ego, alters)  #define the network
    beh_centered <- fcentring(actors)  #center behavior scores

    statistic <- beh_centered[1]  #the actual statistic

    return(statistic)
}

quadratic shape

fquad <- function(ego, alters, ...) {
    actors <- c(ego, alters)  #define the network
    beh_centered <- fcentring(actors)  #center behavior scores

    statistic <- (beh_centered[1])^2  #the actual statistic

    return(statistic)
}


The average similarity effect (avSim)

\[ s^{beh}_{i5}(x,z) = x^{-1}_{i+}\sum_j x_{ij}(sim^z_{ij} - \widehat{sim^z}) \]

favSim <- function(ego, alters, min, max) {
    actors <- c(ego, alters)  #define the network
    beh_centered <- fcentering(actors)  #center behavior scores
    simij <- fsimij(beh_centered, min, max)  #calculate the similarity scores
    diag(simij) <- NA
    msimij <- mean(simij, na.rm = TRUE)  #calculate the mean similarity score. only calculate mean on non-diagonal cells??!!
    simij_c <- simij - msimij  #center the similarity scores

    statistic <- sum(simij_c[1, ], na.rm = TRUE)/length(alters)  #the actual statistic

    return(statistic)
}
favSim2 <- function(ego, alters, min, max) {
    actors <- c(ego, alters)  #define the network
    beh_centered <- fcentring(actors)  #center behavior scores
    simij <- fsimij(beh_centered, min, max)  #calculate the similarity scores
    diag(simij) <- NA
    # msimij <- mean(simij, na.rm=TRUE) #calculate the mean similarity score. only calculate mean
    # on non-diagonal cells??!!
    simij_c <- simij  # - msimij #center the similarity scores

    statistic <- sum(simij_c[1, ], na.rm = TRUE)/length(alters)  #the actual statistic

    return(statistic)
}


The average attraction towards higher effect (avAttHigher)

\[ s^{beh}_{i23}(x,z) = x^{-1}_{i+}\sum_j x_{ij} (\, I \{ (z_j)>z_i \} sim^z_{ij} + I \{ (z_j ) \le z_i \} )\,\]

favAttHigher <- function(ego, alters, min, max) {
    actors <- c(ego, alters)
    beh_centered <- fcentering(actors)
    simij <- fsimij(beh_centered, min, max)
    diag(simij) <- NA

    simijH <- simij[1, ]
    simijH[beh_centered <= beh_centered[1]] <- 1
    simijH[1] <- NA
    statistic <- sum(simijH, na.rm = TRUE)/length(alters)

    return(statistic)
}


The average attraction towards higher alters effect (avAttLower)

\[ s^{beh}_{i24}(x,z) = x^{-1}_{i+}\sum_j x_{ij} (\, I \{ (z_j)<z_i \} sim^z_{ij} + I \{ (z_j ) \ge z_i \} )\,\]

favAttLower <- function(ego, alters, min, max) {
    actors <- c(ego, alters)
    beh_centered <- fcentering(actors)
    simij <- fsimij(beh_centered, min, max)
    diag(simij) <- NA

    simijL <- simij[1, ]
    simijL[beh_centered >= beh_centered[1]] <- 1
    simijL[1] <- NA
    statistic <- sum(simijL, na.rm = TRUE)/length(alters)

    return(statistic)
}


Average alter effect (avAlt)

\[ s^{beh}_{i27}(x,z) = z_i(\textstyle \sum_jx_{ij}z_j)/(\textstyle \sum_jx_{ij}) \]

favAlt <- function(ego, alters, ...) {
    actors <- c(ego, alters)
    beh_centered <- fcentering(actors)

    statistic <- beh_centered[1] * (sum(beh_centered[-1], na.rm = TRUE)/length(alters))

    return(statistic)
}


Average attraction mean (AttMean)

We are attracted to the mean of our alters!

(behaves approximately similar to avAlt, different shape.)

\[ s^{beh}_{i}(x,z) = 1 - \frac{\lvert(z_i - x^{-1}_{i+}\sum_j x_{ij}z_j)\rvert}{r_Z} \]

fAttMean <- function(ego, alters, min, max, ...) {
    rv <- max - min
    actors <- c(ego, alters)
    beh_centered <- fcentring(actors)

    statistic <- 1 - abs(beh_centered[1] - (sum(beh_centered[-1], na.rm = TRUE)/length(alters)))/rv  #thus we strive for a highest local similarity score!

    return(statistic)
}


Make plot of statistic values

finluenceplot <- function(alters, min, max, fun, params, results = TRUE, plot = TRUE) {
    # check correct number of parameters are given
    if (length(fun) != length(params))
        stop("Please provide one (and only one) parameter for each of the behavioral effects!")

    # calculuate value of evaluation function
    s <- NA
    for (i in min:max) {
        s[i] <- 0
        for (j in 1:length(fun)) {
            s[i] <- s[i] + params[j] * fun[[j]](i, alters, min, max)
        }
    }

    # calculate the probabilities
    p <- NA
    for (i in min:max) {
        p[i] <- exp(s[i])/sum(exp(s))
    }

    # calculate the probabilities of choice set
    p2 <- NA
    for (i in min:max) {
        if (i == min) {
            p2[i] <- exp(s[i])/sum(exp(s[i]) + exp(s[i + 1]))
        } else if (i == max) {
            p2[i] <- exp(s[i])/sum(exp(s[i]) + exp(s[i - 1]))
        } else {
            p2[i] <- exp(s[i])/sum(exp(s[i]) + exp(s[i - 1]) + exp(s[i + 1]))
        }
    }

    # calculate the probability ratio
    r <- NA
    for (i in min:max) {
        r[i] <- p[i]/p[1]
    }

    # some simple plots
    if (plot) {
        name <- deparse(substitute(fun))
        name <- stringr::str_sub(as.character(name), 6, -2)
        par(mfrow = c(2, 2))
        plot(y = s, x = min:max, xlab = "ego behavioral score", ylab = name, type = "b")
        mtext("EVALUATION", line = 1)
        mtext(paste("alters:", paste0(alters, collapse = ",")))
        plot(y = p, x = min:max, xlab = "ego behavioral score", ylab = name, ylim = c(0, 1), type = "b")
        mtext("PROBABILITIES", line = 1)
        mtext(paste("alters:", paste0(alters, collapse = ",")))
        plot(y = p2, x = min:max, xlab = "ego behavioral score", ylab = name, ylim = c(0, 1), type = "b")
        mtext("PROBABILITIES_choice_set", line = 1)
        mtext(paste("alters:", paste0(alters, collapse = ",")))
        plot(y = r, x = min:max, xlab = "ego behavioral score", ylab = name, type = "b")
        mtext("RATIOS", line = 1)
        mtext(paste("alters:", paste0(alters, collapse = ",")))
    }

    # return results for more fancy plotting
    if (results) {
        x <- min:max
        df <- data.frame(x, s, p, p2, r)
        return(df)
    }

}


Examples

alters1 <- rep(c(3, 3, 3, 3, 3, 3), 1)

finluenceplot(alters = alters1, min = 1, max = 6, list(flinear, fquad), params = c(0.1, -1))

finluenceplot(alters = alters1, min = 1, max = 6, list(favSim), params = c(1))

finluenceplot(alters = alters1, min = 1, max = 6, list(favAlt), params = c(1))

finluenceplot(alters = alters1, min = 1, max = 6, list(fAttMean), params = c(1))

finluenceplot(alters = alters1, min = 1, max = 6, list(favAttHigher), params = c(1))

finluenceplot(alters = alters1, min = 1, max = 6, list(favAttLower), params = c(1))

finluenceplot(alters = alters1, min = 1, max = 6, fun = list(favAttLower, favAttHigher), params = c(1,
    1))

finluenceplot(alters = alters1, min = 1, max = 6, list(fAttMean, favAttHigher), params = c(1, 1))

#>   x          s           p         p2           r
#> 1 1 -3.1102041 0.021521281 0.09197159  1.00000000
#> 2 2 -0.8204082 0.212477940 0.29649713  9.87292259
#> 3 3  0.0000000 0.482628079 0.50946830 22.42562059
#> 4 4 -0.6489796 0.252211177 0.32961799 11.71915274
#> 5 5 -2.7673469 0.030322785 0.10700672  1.40896747
#> 6 6 -6.3551020 0.000838739 0.02691585  0.03897254
#>   x          s         p        p2         r
#> 1 1 -0.2857143 0.1537345 0.4643463 1.0000000
#> 2 2 -0.1428571 0.1773428 0.3310773 1.1535650
#> 3 3  0.0000000 0.2045764 0.3657971 1.3307122
#> 4 4 -0.1428571 0.1773428 0.3310773 1.1535650
#> 5 5 -0.2857143 0.1537345 0.3310773 1.0000000
#> 6 6 -0.4285714 0.1332691 0.4643463 0.8668779
#>   x          s         p        p2         r
#> 1 1 -0.4897959 0.1416047 0.4091822 1.0000000
#> 2 2 -0.1224490 0.2044628 0.3542543 1.4438988
#> 3 3  0.0000000 0.2310965 0.3610757 1.6319831
#> 4 4 -0.1224490 0.2044628 0.3542543 1.4438988
#> 5 5 -0.4897959 0.1416047 0.3348927 1.0000000
#> 6 6 -1.1020408 0.0767685 0.3515473 0.5421325
#>   x   s         p        p2         r
#> 1 1 0.6 0.1480744 0.4501660 1.0000000
#> 2 2 0.8 0.1808585 0.3289329 1.2214028
#> 3 3 1.0 0.2209011 0.3791525 1.4918247
#> 4 4 0.8 0.1808585 0.3289329 1.2214028
#> 5 5 0.6 0.1480744 0.3289329 1.0000000
#> 6 6 0.4 0.1212331 0.4501660 0.8187308
#>   x   s         p        p2        r
#> 1 1 0.6 0.1221195 0.4501660 1.000000
#> 2 2 0.8 0.1491571 0.3289329 1.221403
#> 3 3 1.0 0.1821809 0.3547696 1.491825
#> 4 4 1.0 0.1821809 0.3333333 1.491825
#> 5 5 1.0 0.1821809 0.3333333 1.491825
#> 6 6 1.0 0.1821809 0.5000000 1.491825
#>   x   s         p        p2         r
#> 1 1 1.0 0.1984969 0.5000000 1.0000000
#> 2 2 1.0 0.1984969 0.3333333 1.0000000
#> 3 3 1.0 0.1984969 0.3547696 1.0000000
#> 4 4 0.8 0.1625155 0.3289329 0.8187308
#> 5 5 0.6 0.1330564 0.3289329 0.6703200
#> 6 6 0.4 0.1089374 0.4501660 0.5488116
#>   x   s         p        p2         r
#> 1 1 1.6 0.1480744 0.4501660 1.0000000
#> 2 2 1.8 0.1808585 0.3289329 1.2214028
#> 3 3 2.0 0.2209011 0.3791525 1.4918247
#> 4 4 1.8 0.1808585 0.3289329 1.2214028
#> 5 5 1.6 0.1480744 0.3289329 1.0000000
#> 6 6 1.4 0.1212331 0.4501660 0.8187308
#>   x   s         p        p2        r
#> 1 1 1.2 0.1080764 0.4013123 1.000000
#> 2 2 1.6 0.1612311 0.3162411 1.491825
#> 3 3 2.0 0.2405285 0.4017596 2.225541
#> 4 4 1.8 0.1969281 0.3289329 1.822119
#> 5 5 1.6 0.1612311 0.3289329 1.491825
#> 6 6 1.4 0.1320048 0.4501660 1.221403
alters1 <- rep(c(1, 1, 1, 5, 5, 5), 1)
finluenceplot(alters = alters1, min = 1, max = 6, list(favSim), params = c(1))

finluenceplot(alters = alters1, min = 1, max = 6, list(favAlt), params = c(1))

finluenceplot(alters = alters1, min = 1, max = 6, list(fAttMean), params = c(1))

finluenceplot(alters = alters1, min = 1, max = 6, fun = list(favAttLower, favAttHigher), params = c(1,
    0))

finluenceplot(alters = alters1, min = 1, max = 6, fun = list(favAttLower, favAttHigher), params = c(0,
    1))

finluenceplot(alters = alters1, min = 1, max = 6, fun = list(favAttLower, favAttHigher), params = c(1,
    3))

finluenceplot(alters = alters1, min = 1, max = 6, fun = list(favAttLower, favAttHigher), params = c(1,
    -1))

finluenceplot(alters = alters1, min = 1, max = 6, fun = list(favAttLower, favAttHigher), params = c(-1,
    1))

finluenceplot(alters = alters1, min = 1, max = 6, fun = list(flinear, favAttLower, favAttHigher), params = c(1,
    -1, 1))
finluenceplot(alters = alters1, min = 1, max = 6, fun = list(flinear, favAttLower, favAttHigher), params = c(1,
    -1, 1))

finluenceplot(alters = alters1, min = 1, max = 6, fun = list(flinear), params = c(1))

#>   x           s         p        p2         r
#> 1 1  0.05714286 0.1704484 0.5000000 1.0000000
#> 2 2  0.05714286 0.1704484 0.3333333 1.0000000
#> 3 3  0.05714286 0.1704484 0.3333333 1.0000000
#> 4 4  0.05714286 0.1704484 0.3333333 1.0000000
#> 5 5  0.05714286 0.1704484 0.3488115 1.0000000
#> 6 6 -0.08571429 0.1477580 0.4643463 0.8668779
#>   x          s         p        p2         r
#> 1 1 -0.4897959 0.1416047 0.4091822 1.0000000
#> 2 2 -0.1224490 0.2044628 0.3542543 1.4438988
#> 3 3  0.0000000 0.2310965 0.3610757 1.6319831
#> 4 4 -0.1224490 0.2044628 0.3542543 1.4438988
#> 5 5 -0.4897959 0.1416047 0.3348927 1.0000000
#> 6 6 -1.1020408 0.0767685 0.3515473 0.5421325
#>   x   s         p        p2         r
#> 1 1 0.6 0.1480744 0.4501660 1.0000000
#> 2 2 0.8 0.1808585 0.3289329 1.2214028
#> 3 3 1.0 0.2209011 0.3791525 1.4918247
#> 4 4 0.8 0.1808585 0.3289329 1.2214028
#> 5 5 0.6 0.1480744 0.3289329 1.0000000
#> 6 6 0.4 0.1212331 0.4501660 0.8187308
#>   x   s         p        p2         r
#> 1 1 1.0 0.2135147 0.5249792 1.0000000
#> 2 2 0.9 0.1931961 0.3322250 0.9048374
#> 3 3 0.8 0.1748111 0.3322250 0.8187308
#> 4 4 0.7 0.1581756 0.3322250 0.7408182
#> 5 5 0.6 0.1431232 0.3420088 0.6703200
#> 6 6 0.4 0.1171794 0.4501660 0.5488116
#>   x   s         p        p2        r
#> 1 1 0.6 0.1305469 0.4750208 1.000000
#> 2 2 0.7 0.1442766 0.3322250 1.105171
#> 3 3 0.8 0.1594504 0.3322250 1.221403
#> 4 4 0.9 0.1762199 0.3322250 1.349859
#> 5 5 1.0 0.1947531 0.3442533 1.491825
#> 6 6 1.0 0.1947531 0.5000000 1.491825
#>   x   s         p        p2        r
#> 1 1 2.8 0.1043514 0.4501660 1.000000
#> 2 2 3.0 0.1274551 0.3289329 1.221403
#> 3 3 3.2 0.1556740 0.3289329 1.491825
#> 4 4 3.4 0.1901406 0.3289329 1.822119
#> 5 5 3.6 0.2322383 0.3791525 2.225541
#> 6 6 3.4 0.1901406 0.4501660 1.822119
#>   x    s          p        p2         r
#> 1 1  0.4 0.25939861 0.5498340 1.0000000
#> 2 2  0.2 0.21237762 0.3289329 0.8187308
#> 3 3  0.0 0.17388009 0.3289329 0.6703200
#> 4 4 -0.2 0.14236097 0.3289329 0.5488116
#> 5 5 -0.4 0.11655531 0.3289329 0.4493290
#> 6 6 -0.6 0.09542741 0.4501660 0.3678794
#>   x    s          p        p2        r
#> 1 1 -0.4 0.09542741 0.4501660 1.000000
#> 2 2 -0.2 0.11655531 0.3289329 1.221403
#> 3 3  0.0 0.14236097 0.3289329 1.491825
#> 4 4  0.2 0.17388009 0.3289329 1.822119
#> 5 5  0.4 0.21237762 0.3289329 2.225541
#> 6 6  0.6 0.25939861 0.5498340 2.718282
#>   x         s           p        p2          r
#> 1 1 -2.114286 0.003309969 0.2578558   1.000000
#> 2 2 -1.057143 0.009526540 0.2366537   2.878136
#> 3 3  0.000000 0.027418678 0.2366537   8.283667
#> 4 4  1.057143 0.078914683 0.2366537  23.841519
#> 5 5  2.114286 0.227127190 0.2366537  68.619135
#> 6 6  3.171429 0.653702940 0.7421442 197.495201
#>   x         s           p        p2          r
#> 1 1 -2.114286 0.003309969 0.2578558   1.000000
#> 2 2 -1.057143 0.009526540 0.2366537   2.878136
#> 3 3  0.000000 0.027418678 0.2366537   8.283667
#> 4 4  1.057143 0.078914683 0.2366537  23.841519
#> 5 5  2.114286 0.227127190 0.2366537  68.619135
#> 6 6  3.171429 0.653702940 0.7421442 197.495201
#>   x          s           p        p2         r
#> 1 1 -1.7142857 0.007969358 0.2979366  1.000000
#> 2 2 -0.8571429 0.018779143 0.2644949  2.356418
#> 3 3  0.0000000 0.044251518 0.2644949  5.552708
#> 4 4  0.8571429 0.104275094 0.2644949 13.084503
#> 5 5  1.7142857 0.245715754 0.2644949 30.832565
#> 6 6  2.5714286 0.579009134 0.7020634 72.654424
alters1 <- rep(c(1, 2, 2), 100)
finluenceplot(alters = alters1, min = 1, max = 6, list(favSim), params = c(1))

finluenceplot(alters = alters1, min = 1, max = 6, list(favAlt), params = c(1))

finluenceplot(alters = alters1, min = 1, max = 6, list(fAttMean), params = c(1))

finluenceplot(alters = alters1, min = 1, max = 6, fun = list(favAttLower, favAttHigher), params = c(1,
    0))

finluenceplot(alters = alters1, min = 1, max = 6, fun = list(favAttLower, favAttHigher), params = c(0,
    1))

finluenceplot(alters = alters1, min = 1, max = 6, fun = list(favAttLower, favAttHigher), params = c(1,
    1))

finluenceplot(alters = alters1, min = 1, max = 6, fun = list(favAttLower, favAttHigher), params = c(1,
    -1))

finluenceplot(alters = alters1, min = 1, max = 6, fun = list(favAttLower, favAttHigher), params = c(-1,
    1))

#>   x           s         p        p2         r
#> 1 1 -0.04385382 0.2112416 0.4834501 1.0000000
#> 2 2  0.02236988 0.2257045 0.3628788 1.0684657
#> 3 3 -0.17630122 0.1850369 0.3289906 0.8759490
#> 4 4 -0.37497231 0.1516969 0.3289906 0.7181201
#> 5 5 -0.57364341 0.1243640 0.3289906 0.5887288
#> 6 6 -0.77231451 0.1019561 0.4504950 0.4826514
#>   x             s         p        p2         r
#> 1 1 -0.0014716541 0.1698751 0.4997241 1.0000000
#> 2 2 -0.0003679135 0.1700628 0.3340690 1.0011043
#> 3 3 -0.0058866164 0.1691268 0.3340609 0.9955948
#> 4 4 -0.0180277628 0.1670858 0.3340430 0.9835802
#> 5 5 -0.0367913526 0.1639799 0.3340154 0.9652968
#> 6 6 -0.0621773858 0.1598695 0.4936538 0.9411001
#>   x         s         p        p2         r
#> 1 1 0.8666667 0.2115240 0.4833395 1.0000000
#> 2 2 0.9333333 0.2261063 0.3630769 1.0689391
#> 3 3 0.7333333 0.1851202 0.3289329 0.8751733
#> 4 4 0.5333333 0.1515636 0.3289329 0.7165313
#> 5 5 0.3333333 0.1240898 0.3289329 0.5866462
#> 6 6 0.1333333 0.1015961 0.4501660 0.4803053
#>   x         s          p        p2         r
#> 1 1 1.0000000 0.23461556 0.5166605 1.0000000
#> 2 2 0.9333333 0.21948449 0.3463000 0.9355070
#> 3 3 0.7333333 0.17969871 0.3289329 0.7659283
#> 4 4 0.5333333 0.14712486 0.3289329 0.6270891
#> 5 5 0.3333333 0.12045564 0.3289329 0.5134171
#> 6 6 0.1333333 0.09862074 0.4501660 0.4203504
#>   x         s         p        p2        r
#> 1 1 0.8666667 0.1489613 0.4667160 1.000000
#> 2 2 1.0000000 0.1702077 0.3478051 1.142631
#> 3 3 1.0000000 0.1702077 0.3333333 1.142631
#> 4 4 1.0000000 0.1702077 0.3333333 1.142631
#> 5 5 1.0000000 0.1702077 0.3333333 1.142631
#> 6 6 1.0000000 0.1702077 0.5000000 1.142631
#>   x        s         p        p2         r
#> 1 1 1.866667 0.2115240 0.4833395 1.0000000
#> 2 2 1.933333 0.2261063 0.3630769 1.0689391
#> 3 3 1.733333 0.1851202 0.3289329 0.8751733
#> 4 4 1.533333 0.1515636 0.3289329 0.7165313
#> 5 5 1.333333 0.1240898 0.3289329 0.5866462
#> 6 6 1.133333 0.1015961 0.4501660 0.4803053
#>   x           s          p        p2         r
#> 1 1  0.13333333 0.25939861 0.5498340 1.0000000
#> 2 2 -0.06666667 0.21237762 0.3289329 0.8187308
#> 3 3 -0.26666667 0.17388009 0.3289329 0.6703200
#> 4 4 -0.46666667 0.14236097 0.3289329 0.5488116
#> 5 5 -0.66666667 0.11655531 0.3289329 0.4493290
#> 6 6 -0.86666667 0.09542741 0.4501660 0.3678794
#>   x           s          p        p2        r
#> 1 1 -0.13333333 0.09542741 0.4501660 1.000000
#> 2 2  0.06666667 0.11655531 0.3289329 1.221403
#> 3 3  0.26666667 0.14236097 0.3289329 1.491825
#> 4 4  0.46666667 0.17388009 0.3289329 1.822119
#> 5 5  0.66666667 0.21237762 0.3289329 2.225541
#> 6 6  0.86666667 0.25939861 0.5498340 2.718282


Results model strava

alters1 <- rep(c(2, 2, 2, 5, 5, 5))
alters2 <- rep(c(3.5, 3.5, 3.5, 3.5, 3.5, 3.5))
# club1
finluenceplot(alters = alters1, min = 1, max = 6, results = FALSE, fun = list(flinear, fquad, favAttHigher,
    favAttLower), params = c(-0.15, -0.002, 2.0027, 6.0905))

finluenceplot(alters = alters2, min = 1, max = 6, results = FALSE, fun = list(flinear, fquad, favAttHigher,
    favAttLower), params = c(-0.15, -0.002, 2.0027, 6.0905))

# club2
finluenceplot(alters = alters1, min = 1, max = 6, results = FALSE, fun = list(flinear, fquad, favAttHigher,
    favAttLower), params = c(-0.24, 0.0075, 3.3213, 5.0047))

finluenceplot(alters = alters2, min = 1, max = 6, results = FALSE, fun = list(flinear, fquad, favAttHigher,
    favAttLower), params = c(-0.24, 0.0075, 3.3213, 5.0047))

# club3
finluenceplot(alters = alters1, min = 1, max = 6, results = FALSE, fun = list(flinear, fquad, favAttHigher,
    favAttLower), params = c(-0.2085, 0.021, 3.7703, 2.1283))

finluenceplot(alters = alters2, min = 1, max = 6, results = FALSE, fun = list(flinear, fquad, favAttHigher,
    favAttLower), params = c(-0.2085, 0.021, 3.7703, 2.1283))

# club4
finluenceplot(alters = alters1, min = 1, max = 6, results = FALSE, fun = list(flinear, fquad, favAttHigher,
    favAttLower), params = c(-1.3313, 0.0192, 2.5493, 4.4952))

finluenceplot(alters = alters2, min = 1, max = 6, results = FALSE, fun = list(flinear, fquad, favAttHigher,
    favAttLower), params = c(-1.3313, 0.0192, 2.5493, 4.4952))

# club5
finluenceplot(alters = alters1, min = 1, max = 6, results = FALSE, fun = list(flinear, fquad, favAttHigher,
    favAttLower), params = c(0.1021, 0.0743, 1.1736, 8.5486))

finluenceplot(alters = alters2, min = 1, max = 6, results = FALSE, fun = list(flinear, fquad, favAttHigher,
    favAttLower), params = c(0.1021, 0.0743, 1.1736, 8.5486))

LS0tDQp0aXRsZTogIkluZmx1ZW5jZSBvcGVyYXRpb25hbGl6YXRpb25zIg0KYmlibGlvZ3JhcGh5OiByZWZlcmVuY2VzLmJpYg0KZGF0ZTogIkxhc3QgY29tcGlsZWQgb24gYHIgZm9ybWF0KFN5cy50aW1lKCksICclQiwgJVknKWAiDQpvdXRwdXQ6IA0KICBodG1sX2RvY3VtZW50Og0KICAgIGNzczogdHdlYWtzLmNzcw0KICAgIHRvYzogIGZhbHNlDQogICAgdG9jX2Zsb2F0OiB0cnVlDQogICAgbnVtYmVyX3NlY3Rpb25zOiBmYWxzZQ0KICAgIGNvZGVfZm9sZGluZzogc2hvdw0KICAgIGNvZGVfZG93bmxvYWQ6IHllcw0KLS0tDQoNCmBgYHtyLCBnbG9iYWxzZXR0aW5ncywgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0naGlkZSd9DQpsaWJyYXJ5KGtuaXRyKQ0Kb3B0c19jaHVuayRzZXQodGlkeS5vcHRzPWxpc3Qod2lkdGguY3V0b2ZmPTEwMCksdGlkeT1UUlVFLCB3YXJuaW5nID0gRkFMU0UsIHJlc3VsdHM9ImhvbGQiLCBtZXNzYWdlID0gRkFMU0UsY29tbWVudCA9ICIjPiIsIGNhY2hlPVRSVUUsIGNsYXNzLnNvdXJjZT1jKCJ0ZXN0IiksIGNsYXNzLm91dHB1dD1jKCJ0ZXN0MiIpKQ0Kb3B0aW9ucyh3aWR0aCA9IDEwMCkNCnJnbDo6c2V0dXBLbml0cigpDQoNCmNvbG9yaXplIDwtIGZ1bmN0aW9uKHgsIGNvbG9yKSB7c3ByaW50ZigiPHNwYW4gc3R5bGU9J2NvbG9yOiAlczsnPiVzPC9zcGFuPiIsIGNvbG9yLCB4KSB9DQoNCmBgYA0KDQpgYGB7ciBrbGlwcHksIGVjaG89RkFMU0UsIGluY2x1ZGU9VFJVRX0NCmtsaXBweTo6a2xpcHB5KHBvc2l0aW9uID0gYygndG9wJywgJ3JpZ2h0JykpDQoja2xpcHB5OjprbGlwcHkoY29sb3IgPSAnZGFya3JlZCcpDQoja2xpcHB5OjprbGlwcHkodG9vbHRpcF9tZXNzYWdlID0gJ0NsaWNrIHRvIGNvcHknLCB0b29sdGlwX3N1Y2Nlc3MgPSAnRG9uZScpDQpgYGANCg0KLS0tLSAgDQoNCg0KV2Ugd2lsbCBzaG93IGhvdyB0aGUgaW5mbHVlbmNlIHN0YXRpc3RpY3MgaW4gUlNpZW5hIGJlaGF2ZS4gDQpXZSBhc3N1bWUgdGhhdCBlZ28gaXMgY29ubmVjdGVkIHRvIGFsbCBhbHRlcnMuIA0KDQo8YnI+DQoNCiMjIEZ1bmN0aW9ucw0KDQpGaXJzdCwgd2UgZGVmaW5lIHNvbWUgZnVuY3Rpb25zOg0KDQo8YnI+DQoNCiMjIyBDZW50ZXJpbmcgYmVoYXZpb3IgdmFyaWFibGVzDQpgYGB7cn0NCmZjZW50ZXJpbmcgPC0gZnVuY3Rpb24oYWN0b3JzKXsNCmNlbnRlcmVkIDwtIGFjdG9ycyAtIG1lYW4oYWN0b3JzKQ0KcmV0dXJuKGNlbnRlcmVkKQ0KfQ0KYGBgDQoNCjxicj4gDQoNCiMjIyBDYWxjdWxhdGluZyBzaW1pbGFyaXR5IHNjb3Jlcw0KDQokJCBzaW1eel97aWp9ID0gMSAtIFxmcmFje3x6X2kgLSB6X2p8fXtyX1Z9ICQkDQpgYGB7cn0NCmZzaW1paiA8LSBmdW5jdGlvbihhY3RvcnMsIG1pbiwgbWF4KXsNCiNydiA8LSBtYXgoYWN0b3JzKSAtIG1pbihhY3RvcnMpDQpydiA8LSBtYXggLSBtaW4NCm1hdDEgPC0gbWF0cml4KGFjdG9ycywgbnJvdz1sZW5ndGgoYWN0b3JzKSwgbmNvbD1sZW5ndGgoYWN0b3JzKSwgYnlyb3c9VFJVRSkNCm1hdDIgPC0gdChtYXQxKQ0Kc2ltaWogPC0gMSAtICggYWJzKG1hdDEtbWF0MikgLyBydikNCnJldHVybihzaW1paikNCn0NCmBgYA0KDQo8YnI+IA0KDQojIyMgbGluZWFyIHNoYXBlDQoNCmBgYHtyfQ0KDQpmbGluZWFyIDwtIGZ1bmN0aW9uKGVnbywgYWx0ZXJzLCAuLi4pIHsNCiAgYWN0b3JzIDwtIGMoZWdvLGFsdGVycykgI2RlZmluZSB0aGUgbmV0d29yaw0KICBiZWhfY2VudGVyZWQgPC0gZmNlbnRyaW5nKGFjdG9ycykgI2NlbnRlciBiZWhhdmlvciBzY29yZXMNCiAgDQogIHN0YXRpc3RpYyA8LSBiZWhfY2VudGVyZWRbMV0gI3RoZSBhY3R1YWwgc3RhdGlzdGljDQogIA0KICByZXR1cm4oc3RhdGlzdGljKQ0KfQ0KYGBgDQoNCiMjIyBxdWFkcmF0aWMgc2hhcGUNCg0KYGBge3J9DQoNCmZxdWFkIDwtIGZ1bmN0aW9uKGVnbywgYWx0ZXJzLCAuLi4pIHsNCiAgYWN0b3JzIDwtIGMoZWdvLGFsdGVycykgI2RlZmluZSB0aGUgbmV0d29yaw0KICBiZWhfY2VudGVyZWQgPC0gZmNlbnRyaW5nKGFjdG9ycykgI2NlbnRlciBiZWhhdmlvciBzY29yZXMNCiAgDQogIHN0YXRpc3RpYyA8LSAoYmVoX2NlbnRlcmVkWzFdKV4yICN0aGUgYWN0dWFsIHN0YXRpc3RpYw0KICANCiAgcmV0dXJuKHN0YXRpc3RpYykNCn0NCmBgYA0KDQo8YnI+DQoNCg0KIyMjIFRoZSBhdmVyYWdlIHNpbWlsYXJpdHkgZWZmZWN0IChhdlNpbSkNCg0KJCQgc157YmVofV97aTV9KHgseikgPSB4XnstMX1fe2krfVxzdW1faiB4X3tpan0oc2ltXnpfe2lqfSAtIFx3aWRlaGF0e3NpbV56fSkgJCQNCmBgYHtyfQ0KZmF2U2ltIDwtIGZ1bmN0aW9uKGVnbywgYWx0ZXJzLCBtaW4sIG1heCkgew0KICBhY3RvcnMgPC0gYyhlZ28sYWx0ZXJzKSAjZGVmaW5lIHRoZSBuZXR3b3JrDQogIGJlaF9jZW50ZXJlZCA8LSBmY2VudGVyaW5nKGFjdG9ycykgI2NlbnRlciBiZWhhdmlvciBzY29yZXMNCiAgc2ltaWogPC0gZnNpbWlqKGJlaF9jZW50ZXJlZCwgbWluLCBtYXgpICNjYWxjdWxhdGUgdGhlIHNpbWlsYXJpdHkgc2NvcmVzDQogIGRpYWcoc2ltaWopIDwtIE5BDQogIG1zaW1paiA8LSBtZWFuKHNpbWlqLCBuYS5ybT1UUlVFKSAjY2FsY3VsYXRlIHRoZSBtZWFuIHNpbWlsYXJpdHkgc2NvcmUuIG9ubHkgY2FsY3VsYXRlIG1lYW4gb24gbm9uLWRpYWdvbmFsIGNlbGxzPz8hIQ0KICBzaW1pal9jIDwtIHNpbWlqIC0gbXNpbWlqICNjZW50ZXIgdGhlIHNpbWlsYXJpdHkgc2NvcmVzDQogIA0KICBzdGF0aXN0aWMgPC0gc3VtKHNpbWlqX2NbMSxdLCBuYS5ybSA9IFRSVUUpIC8gbGVuZ3RoKGFsdGVycykgI3RoZSBhY3R1YWwgc3RhdGlzdGljDQogIA0KICByZXR1cm4oc3RhdGlzdGljKQ0KfQ0KYGBgDQpgYGB7cn0NCmZhdlNpbTIgPC0gZnVuY3Rpb24oZWdvLCBhbHRlcnMsIG1pbiwgbWF4KSB7DQogIGFjdG9ycyA8LSBjKGVnbyxhbHRlcnMpICNkZWZpbmUgdGhlIG5ldHdvcmsNCiAgYmVoX2NlbnRlcmVkIDwtIGZjZW50cmluZyhhY3RvcnMpICNjZW50ZXIgYmVoYXZpb3Igc2NvcmVzDQogIHNpbWlqIDwtIGZzaW1paihiZWhfY2VudGVyZWQsIG1pbiwgbWF4KSAjY2FsY3VsYXRlIHRoZSBzaW1pbGFyaXR5IHNjb3Jlcw0KICBkaWFnKHNpbWlqKSA8LSBOQQ0KICAjbXNpbWlqIDwtIG1lYW4oc2ltaWosIG5hLnJtPVRSVUUpICNjYWxjdWxhdGUgdGhlIG1lYW4gc2ltaWxhcml0eSBzY29yZS4gb25seSBjYWxjdWxhdGUgbWVhbiBvbiBub24tZGlhZ29uYWwgY2VsbHM/PyEhDQogIHNpbWlqX2MgPC0gc2ltaWogIyAtIG1zaW1paiAjY2VudGVyIHRoZSBzaW1pbGFyaXR5IHNjb3Jlcw0KICANCiAgc3RhdGlzdGljIDwtIHN1bShzaW1pal9jWzEsXSwgbmEucm0gPSBUUlVFKSAvIGxlbmd0aChhbHRlcnMpICN0aGUgYWN0dWFsIHN0YXRpc3RpYw0KICANCiAgcmV0dXJuKHN0YXRpc3RpYykNCn0NCmBgYA0KDQo8YnI+IA0KDQoNCiMjIyBUaGUgYXZlcmFnZSBhdHRyYWN0aW9uIHRvd2FyZHMgaGlnaGVyIGVmZmVjdCAoYXZBdHRIaWdoZXIpDQoNCiQkIHNee2JlaH1fe2kyM30oeCx6KSA9IHheey0xfV97aSt9XHN1bV9qIHhfe2lqfSAoXCwgSSBceyAoel9qKT56X2kgXH0gc2ltXnpfe2lqfSArIEkgXHsgKHpfaiApIFxsZSB6X2kgXH0gKVwsJCQNCmBgYHtyfQ0KZmF2QXR0SGlnaGVyIDwtIGZ1bmN0aW9uKGVnbywgYWx0ZXJzLCBtaW4sIG1heCkgew0KICBhY3RvcnMgPC0gYyhlZ28sYWx0ZXJzKQ0KICBiZWhfY2VudGVyZWQgPC0gZmNlbnRlcmluZyhhY3RvcnMpDQogIHNpbWlqIDwtIGZzaW1paihiZWhfY2VudGVyZWQsIG1pbiwgbWF4KQ0KICBkaWFnKHNpbWlqKSA8LSBOQQ0KICANCiAgc2ltaWpIIDwtIHNpbWlqWzEsXQ0KICBzaW1pakhbYmVoX2NlbnRlcmVkIDw9IGJlaF9jZW50ZXJlZFsxXV0gPC0gMQ0KICBzaW1pakhbMV0gPC0gTkENCiAgc3RhdGlzdGljIDwtIHN1bShzaW1pakgsIG5hLnJtID0gVFJVRSkgLyBsZW5ndGgoYWx0ZXJzKQ0KICANCiANCiAgcmV0dXJuKHN0YXRpc3RpYykNCn0NCmBgYA0KDQo8YnI+IA0KDQojIyMgVGhlIGF2ZXJhZ2UgYXR0cmFjdGlvbiB0b3dhcmRzIGhpZ2hlciBhbHRlcnMgZWZmZWN0IChhdkF0dExvd2VyKQ0KDQokJCBzXntiZWh9X3tpMjR9KHgseikgPSB4XnstMX1fe2krfVxzdW1faiB4X3tpan0gKFwsIEkgXHsgKHpfaik8el9pIFx9IHNpbV56X3tpan0gKyBJIFx7ICh6X2ogKSBcZ2Ugel9pIFx9IClcLCQkDQpgYGB7cn0NCmZhdkF0dExvd2VyIDwtIGZ1bmN0aW9uKGVnbywgYWx0ZXJzLCBtaW4sIG1heCkgew0KICBhY3RvcnMgPC0gYyhlZ28sYWx0ZXJzKQ0KICBiZWhfY2VudGVyZWQgPC0gZmNlbnRlcmluZyhhY3RvcnMpDQogIHNpbWlqIDwtIGZzaW1paihiZWhfY2VudGVyZWQsIG1pbiwgbWF4KQ0KICBkaWFnKHNpbWlqKSA8LSBOQQ0KICANCiAgc2ltaWpMIDwtIHNpbWlqWzEsXQ0KICBzaW1pakxbYmVoX2NlbnRlcmVkID49IGJlaF9jZW50ZXJlZFsxXV0gPC0gMQ0KICBzaW1pakxbMV0gPC0gTkENCiAgc3RhdGlzdGljIDwtIHN1bShzaW1pakwsIG5hLnJtID0gVFJVRSkgLyBsZW5ndGgoYWx0ZXJzKQ0KICANCiANCiAgcmV0dXJuKHN0YXRpc3RpYykNCn0NCmBgYA0KDQo8YnI+IA0KDQoNCiMjIyBBdmVyYWdlIGFsdGVyIGVmZmVjdCAoYXZBbHQpDQoNCiQkIHNee2JlaH1fe2kyN30oeCx6KSA9IHpfaShcdGV4dHN0eWxlIFxzdW1fanhfe2lqfXpfaikvKFx0ZXh0c3R5bGUgXHN1bV9qeF97aWp9KSAkJCANCg0KYGBge3J9DQpmYXZBbHQgPC0gZnVuY3Rpb24oZWdvLCBhbHRlcnMsIC4uLikgew0KICBhY3RvcnMgPC0gYyhlZ28sYWx0ZXJzKQ0KICBiZWhfY2VudGVyZWQgPC0gZmNlbnRlcmluZyhhY3RvcnMpDQogIA0KICBzdGF0aXN0aWMgPC0gYmVoX2NlbnRlcmVkWzFdICogKHN1bShiZWhfY2VudGVyZWRbLTFdLCBuYS5ybSA9IFRSVUUpIC8gbGVuZ3RoKGFsdGVycykpDQogIA0KIA0KICByZXR1cm4oc3RhdGlzdGljKQ0KfQ0KYGBgDQoNCjxicj4gDQoNCg0KIyMjIEF2ZXJhZ2UgYXR0cmFjdGlvbiBtZWFuIChBdHRNZWFuKQ0KDQpXZSBhcmUgYXR0cmFjdGVkIHRvIHRoZSBtZWFuIG9mIG91ciBhbHRlcnMhIA0KDQooYmVoYXZlcyBhcHByb3hpbWF0ZWx5IHNpbWlsYXIgdG8gYXZBbHQsIGRpZmZlcmVudCBzaGFwZS4pDQoNCiQkIHNee2JlaH1fe2l9KHgseikgPSAxIC0gXGZyYWN7XGx2ZXJ0KHpfaSAtIHheey0xfV97aSt9XHN1bV9qIHhfe2lqfXpfailccnZlcnR9e3JfWn0gICQkDQoNCmBgYHtyfQ0KZkF0dE1lYW4gPC0gZnVuY3Rpb24oZWdvLCBhbHRlcnMsIG1pbiwgbWF4LCAuLi4pIHsNCiAgcnYgPC0gbWF4IC0gbWluDQogIGFjdG9ycyA8LSBjKGVnbyxhbHRlcnMpDQogIGJlaF9jZW50ZXJlZCA8LSBmY2VudHJpbmcoYWN0b3JzKQ0KICANCiAgc3RhdGlzdGljIDwtIDEgLSAgYWJzKGJlaF9jZW50ZXJlZFsxXSAtIChzdW0oYmVoX2NlbnRlcmVkWy0xXSwgbmEucm0gPSBUUlVFKSAvIGxlbmd0aChhbHRlcnMpKSkvcnYgI3RodXMgd2Ugc3RyaXZlIGZvciBhIGhpZ2hlc3QgbG9jYWwgc2ltaWxhcml0eSBzY29yZSENCiAgDQogDQogIHJldHVybihzdGF0aXN0aWMpDQp9DQpgYGANCg0KPGJyPg0KDQojIyBNYWtlIHBsb3Qgb2Ygc3RhdGlzdGljIHZhbHVlcyB7LnRhYnNldCAudGFic2V0LWZhZGV9DQoNCmBgYHtyfQ0KDQpmaW5sdWVuY2VwbG90IDwtIGZ1bmN0aW9uKGFsdGVycywgbWluLCBtYXgsIGZ1biwgcGFyYW1zLCByZXN1bHRzPVRSVUUsIHBsb3Q9VFJVRSkgew0KICAjY2hlY2sgY29ycmVjdCBudW1iZXIgb2YgcGFyYW1ldGVycyBhcmUgZ2l2ZW4NCiAgIGlmIChsZW5ndGgoZnVuKSAhPSBsZW5ndGgocGFyYW1zKSkgc3RvcCgiUGxlYXNlIHByb3ZpZGUgb25lIChhbmQgb25seSBvbmUpIHBhcmFtZXRlciBmb3IgZWFjaCBvZiB0aGUgYmVoYXZpb3JhbCBlZmZlY3RzISIpDQogIA0KICAjY2FsY3VsdWF0ZSB2YWx1ZSBvZiBldmFsdWF0aW9uIGZ1bmN0aW9uDQogIHMgPC0gTkENCiAgZm9yIChpIGluIG1pbjptYXgpIHsNCiAgICBzW2ldIDwtIDANCiAgICBmb3IgKGogaW4gMTpsZW5ndGgoZnVuKSkgew0KICAgICAgc1tpXSA8LSBzW2ldICsgcGFyYW1zW2pdKmZ1bltbal1dKGksIGFsdGVycywgbWluLCBtYXgpICAgICAgDQogICAgfQ0KICB9DQogIA0KICAjY2FsY3VsYXRlIHRoZSBwcm9iYWJpbGl0aWVzICANCiAgcCA8LSBOQQ0KICBmb3IgKGkgaW4gbWluOm1heCkgew0KICAgIHBbaV0gPC0gZXhwKHNbaV0pIC8gc3VtKGV4cChzKSkNCiAgfQ0KICANCiAgI2NhbGN1bGF0ZSB0aGUgcHJvYmFiaWxpdGllcyBvZiBjaG9pY2Ugc2V0ICANCiAgcDIgPC0gTkENCiAgZm9yIChpIGluIG1pbjptYXgpIHsNCiAgICBpZiAoaT09bWluKSB7IA0KICAgICAgcDJbaV0gPC0gZXhwKHNbaV0pIC8gc3VtKGV4cChzW2ldKSArIGV4cChzW2kgKyAxXSkpIA0KICAgIH0gZWxzZSBpZiAoaT09bWF4KSB7IA0KICAgICAgcDJbaV0gPC0gZXhwKHNbaV0pIC8gc3VtKGV4cChzW2ldKSArIGV4cChzW2kgLSAxXSkpDQogICAgfSBlbHNlIHsNCiAgICAgIHAyW2ldIDwtIGV4cChzW2ldKSAvIHN1bShleHAoc1tpXSkgKyBleHAoc1tpIC0gMV0pICsgZXhwKHNbaSArIDFdKSkNCiAgICB9DQogIH0NCiAgDQogICNjYWxjdWxhdGUgdGhlIHByb2JhYmlsaXR5IHJhdGlvICANCiAgciA8LSBOQQ0KICBmb3IgKGkgaW4gbWluOm1heCkgew0KICAgIHJbaV0gPC0gcFtpXSAvIHBbMV0NCiAgfQ0KICANCiAgI3NvbWUgc2ltcGxlIHBsb3RzDQogIGlmIChwbG90KSB7IA0KICAgICAgbmFtZSA8LSBkZXBhcnNlKHN1YnN0aXR1dGUoZnVuKSkNCiAgICAgIG5hbWUgPC0gc3RyaW5ncjo6c3RyX3N1Yihhcy5jaGFyYWN0ZXIobmFtZSksIDYsIC0yKQ0KICAgICAgcGFyKG1mcm93PWMoMiwyKSkNCiAgICAgIHBsb3QoeT1zLCB4PW1pbjptYXgsIHhsYWI9ImVnbyBiZWhhdmlvcmFsIHNjb3JlIiwgeWxhYj1uYW1lLCB0eXBlPSJiIikNCiAgICAgIG10ZXh0KCJFVkFMVUFUSU9OIiwgbGluZT0xKQ0KICAgICAgbXRleHQocGFzdGUoImFsdGVyczoiLCBwYXN0ZTAoYWx0ZXJzLCBjb2xsYXBzZT0iLCIpKSkNCiAgICAgIHBsb3QoeT1wLCB4PW1pbjptYXgsIHhsYWI9ImVnbyBiZWhhdmlvcmFsIHNjb3JlIiwgeWxhYj1uYW1lLCB5bGltPWMoMCwxKSwgdHlwZT0iYiIpDQogICAgICBtdGV4dCgiUFJPQkFCSUxJVElFUyIsIGxpbmU9MSkNCiAgICAgIG10ZXh0KHBhc3RlKCJhbHRlcnM6IiwgcGFzdGUwKGFsdGVycywgY29sbGFwc2U9IiwiKSkpDQogICAgICBwbG90KHk9cDIsIHg9bWluOm1heCwgeGxhYj0iZWdvIGJlaGF2aW9yYWwgc2NvcmUiLCB5bGFiPW5hbWUsIHlsaW09YygwLDEpLCB0eXBlPSJiIikNCiAgICAgIG10ZXh0KCJQUk9CQUJJTElUSUVTX2Nob2ljZV9zZXQiLCBsaW5lPTEpDQogICAgICBtdGV4dChwYXN0ZSgiYWx0ZXJzOiIsIHBhc3RlMChhbHRlcnMsIGNvbGxhcHNlPSIsIikpKQ0KICAgICAgcGxvdCh5PXIsIHg9bWluOm1heCwgeGxhYj0iZWdvIGJlaGF2aW9yYWwgc2NvcmUiLCB5bGFiPW5hbWUsIHR5cGU9ImIiKQ0KICAgICAgbXRleHQoIlJBVElPUyIsIGxpbmU9MSkNCiAgICAgIG10ZXh0KHBhc3RlKCJhbHRlcnM6IiwgcGFzdGUwKGFsdGVycywgY29sbGFwc2U9IiwiKSkpDQogIH0NCiAgDQogICNyZXR1cm4gcmVzdWx0cyBmb3IgbW9yZSBmYW5jeSBwbG90dGluZw0KICBpZiAocmVzdWx0cykgew0KICAgIHggPC0gbWluOm1heA0KICAgIGRmIDwtIGRhdGEuZnJhbWUoeCwgcywgcCxwMiwgcikNCiAgICByZXR1cm4oZGYpDQogIH0NCiAgDQp9DQpgYGANCg0KPGJyPg0KDQojIyBFeGFtcGxlcw0KDQpgYGB7cn0NCmFsdGVyczEgPC0gcmVwKGMoMywzLDMsMywzLDMpLDEpDQoNCmZpbmx1ZW5jZXBsb3QoYWx0ZXJzPWFsdGVyczEsIG1pbj0xLCBtYXg9NiwgbGlzdChmbGluZWFyLCBmcXVhZCksIHBhcmFtcz1jKC4xLC0xKSkNCg0KZmlubHVlbmNlcGxvdChhbHRlcnM9YWx0ZXJzMSwgbWluPTEsIG1heD02LCBsaXN0KGZhdlNpbSksIHBhcmFtcz1jKDEpKQ0KZmlubHVlbmNlcGxvdChhbHRlcnM9YWx0ZXJzMSwgbWluPTEsIG1heD02LCBsaXN0KGZhdkFsdCksIHBhcmFtcz1jKDEpKQ0KZmlubHVlbmNlcGxvdChhbHRlcnM9YWx0ZXJzMSwgbWluPTEsIG1heD02LCBsaXN0KGZBdHRNZWFuKSwgcGFyYW1zPWMoMSkpDQpmaW5sdWVuY2VwbG90KGFsdGVycz1hbHRlcnMxLCBtaW49MSwgbWF4PTYsIGxpc3QoZmF2QXR0SGlnaGVyKSwgcGFyYW1zPWMoMSkpDQpmaW5sdWVuY2VwbG90KGFsdGVycz1hbHRlcnMxLCBtaW49MSwgbWF4PTYsIGxpc3QoZmF2QXR0TG93ZXIpLCBwYXJhbXM9YygxKSkNCmZpbmx1ZW5jZXBsb3QoYWx0ZXJzPWFsdGVyczEsIG1pbj0xLCBtYXg9NiwgZnVuPWxpc3QoZmF2QXR0TG93ZXIsIGZhdkF0dEhpZ2hlciksIHBhcmFtcz1jKDEsMSkpDQpmaW5sdWVuY2VwbG90KGFsdGVycz1hbHRlcnMxLCBtaW49MSwgbWF4PTYsIGxpc3QoZkF0dE1lYW4sIGZhdkF0dEhpZ2hlciksIHBhcmFtcz1jKDEsMSkpDQoNCg0KYGBgDQoNCmBgYHtyfQ0KYWx0ZXJzMSA8LSByZXAoYygxLDEsMSw1LDUsNSksIDEpDQpmaW5sdWVuY2VwbG90KGFsdGVycz1hbHRlcnMxLCBtaW49MSwgbWF4PTYsIGxpc3QoZmF2U2ltKSwgcGFyYW1zPWMoMSkpDQpmaW5sdWVuY2VwbG90KGFsdGVycz1hbHRlcnMxLCBtaW49MSwgbWF4PTYsIGxpc3QoZmF2QWx0KSwgcGFyYW1zPWMoMSkpDQpmaW5sdWVuY2VwbG90KGFsdGVycz1hbHRlcnMxLCBtaW49MSwgbWF4PTYsIGxpc3QoZkF0dE1lYW4pLCBwYXJhbXM9YygxKSkNCmZpbmx1ZW5jZXBsb3QoYWx0ZXJzPWFsdGVyczEsIG1pbj0xLCBtYXg9NiwgZnVuPWxpc3QoZmF2QXR0TG93ZXIsIGZhdkF0dEhpZ2hlciksIHBhcmFtcz1jKDEsMCkpDQpmaW5sdWVuY2VwbG90KGFsdGVycz1hbHRlcnMxLCBtaW49MSwgbWF4PTYsIGZ1bj1saXN0KGZhdkF0dExvd2VyLCBmYXZBdHRIaWdoZXIpLCBwYXJhbXM9YygwLDEpKQ0KDQpmaW5sdWVuY2VwbG90KGFsdGVycz1hbHRlcnMxLCBtaW49MSwgbWF4PTYsIGZ1bj1saXN0KGZhdkF0dExvd2VyLCBmYXZBdHRIaWdoZXIpLCBwYXJhbXM9YygxLDMpKQ0KDQpmaW5sdWVuY2VwbG90KGFsdGVycz1hbHRlcnMxLCBtaW49MSwgbWF4PTYsIGZ1bj1saXN0KGZhdkF0dExvd2VyLCBmYXZBdHRIaWdoZXIpLCBwYXJhbXM9YygxLC0xKSkNCmZpbmx1ZW5jZXBsb3QoYWx0ZXJzPWFsdGVyczEsIG1pbj0xLCBtYXg9NiwgZnVuPWxpc3QoZmF2QXR0TG93ZXIsIGZhdkF0dEhpZ2hlciksIHBhcmFtcz1jKC0xLDEpKQ0KZmlubHVlbmNlcGxvdChhbHRlcnM9YWx0ZXJzMSwgbWluPTEsIG1heD02LCBmdW49bGlzdChmbGluZWFyLCBmYXZBdHRMb3dlciwgZmF2QXR0SGlnaGVyKSwgcGFyYW1zPWMoMSwtMSwxKSkNCmZpbmx1ZW5jZXBsb3QoYWx0ZXJzPWFsdGVyczEsIG1pbj0xLCBtYXg9NiwgZnVuPWxpc3QoZmxpbmVhciwgZmF2QXR0TG93ZXIsIGZhdkF0dEhpZ2hlciksIHBhcmFtcz1jKDEsLTEsMSkpDQpmaW5sdWVuY2VwbG90KGFsdGVycz1hbHRlcnMxLCBtaW49MSwgbWF4PTYsIGZ1bj1saXN0KGZsaW5lYXIpLCBwYXJhbXM9YygxKSkNCg0KYGBgDQoNCg0KYGBge3J9DQoNCmFsdGVyczEgPC0gcmVwKGMoMSwyLDIpLCAxMDApDQpmaW5sdWVuY2VwbG90KGFsdGVycz1hbHRlcnMxLCBtaW49MSwgbWF4PTYsIGxpc3QoZmF2U2ltKSwgcGFyYW1zPWMoMSkpDQpmaW5sdWVuY2VwbG90KGFsdGVycz1hbHRlcnMxLCBtaW49MSwgbWF4PTYsIGxpc3QoZmF2QWx0KSwgcGFyYW1zPWMoMSkpDQpmaW5sdWVuY2VwbG90KGFsdGVycz1hbHRlcnMxLCBtaW49MSwgbWF4PTYsIGxpc3QoZkF0dE1lYW4pLCBwYXJhbXM9YygxKSkNCmZpbmx1ZW5jZXBsb3QoYWx0ZXJzPWFsdGVyczEsIG1pbj0xLCBtYXg9NiwgZnVuPWxpc3QoZmF2QXR0TG93ZXIsIGZhdkF0dEhpZ2hlciksIHBhcmFtcz1jKDEsMCkpDQpmaW5sdWVuY2VwbG90KGFsdGVycz1hbHRlcnMxLCBtaW49MSwgbWF4PTYsIGZ1bj1saXN0KGZhdkF0dExvd2VyLCBmYXZBdHRIaWdoZXIpLCBwYXJhbXM9YygwLDEpKQ0KZmlubHVlbmNlcGxvdChhbHRlcnM9YWx0ZXJzMSwgbWluPTEsIG1heD02LCBmdW49bGlzdChmYXZBdHRMb3dlciwgZmF2QXR0SGlnaGVyKSwgcGFyYW1zPWMoMSwxKSkNCmZpbmx1ZW5jZXBsb3QoYWx0ZXJzPWFsdGVyczEsIG1pbj0xLCBtYXg9NiwgZnVuPWxpc3QoZmF2QXR0TG93ZXIsIGZhdkF0dEhpZ2hlciksIHBhcmFtcz1jKDEsLTEpKQ0KZmlubHVlbmNlcGxvdChhbHRlcnM9YWx0ZXJzMSwgbWluPTEsIG1heD02LCBmdW49bGlzdChmYXZBdHRMb3dlciwgZmF2QXR0SGlnaGVyKSwgcGFyYW1zPWMoLTEsMSkpDQoNCmBgYA0KDQo8YnI+DQoNCiMjIFJlc3VsdHMgbW9kZWwgc3RyYXZhDQoNCmBgYHtyfQ0KYWx0ZXJzMSA8LSByZXAoYygyLCAyLCAyLCA1LCA1LCA1KSkNCmFsdGVyczIgPC0gcmVwKGMoMy41LCAzLjUsIDMuNSwgMy41LCAzLjUsIDMuNSkpDQpgYGAgDQoNCmBgYHtyfQ0KIyBjbHViMQ0KZmlubHVlbmNlcGxvdChhbHRlcnMgPSBhbHRlcnMxLCBtaW4gPSAxLCBtYXggPSA2LCByZXN1bHRzID0gRkFMU0UsIGZ1biA9IGxpc3QoZmxpbmVhciwgZnF1YWQsIGZhdkF0dEhpZ2hlciwNCiAgICBmYXZBdHRMb3dlciksIHBhcmFtcyA9IGMoLTAuMTUsIC0wLjAwMiwgMi4wMDI3LCA2LjA5MDUpKQ0KDQoNCmZpbmx1ZW5jZXBsb3QoYWx0ZXJzID0gYWx0ZXJzMiwgbWluID0gMSwgbWF4ID0gNiwgcmVzdWx0cyA9IEZBTFNFLCBmdW4gPSBsaXN0KGZsaW5lYXIsIGZxdWFkLCBmYXZBdHRIaWdoZXIsDQogICAgZmF2QXR0TG93ZXIpLCBwYXJhbXMgPSBjKC0wLjE1LCAtMC4wMDIsIDIuMDAyNywgNi4wOTA1KSkNCg0KIyBjbHViMg0KZmlubHVlbmNlcGxvdChhbHRlcnMgPSBhbHRlcnMxLCBtaW4gPSAxLCBtYXggPSA2LCByZXN1bHRzID0gRkFMU0UsIGZ1biA9IGxpc3QoZmxpbmVhciwgZnF1YWQsIGZhdkF0dEhpZ2hlciwNCiAgICBmYXZBdHRMb3dlciksIHBhcmFtcyA9IGMoLTAuMjQsIDAuMDA3NSwgMy4zMjEzLCA1LjAwNDcpKQ0KDQoNCmZpbmx1ZW5jZXBsb3QoYWx0ZXJzID0gYWx0ZXJzMiwgbWluID0gMSwgbWF4ID0gNiwgcmVzdWx0cyA9IEZBTFNFLCBmdW4gPSBsaXN0KGZsaW5lYXIsIGZxdWFkLCBmYXZBdHRIaWdoZXIsDQogICAgZmF2QXR0TG93ZXIpLCBwYXJhbXMgPSBjKC0wLjI0LCAwLjAwNzUsIDMuMzIxMywgNS4wMDQ3KSkNCg0KDQojIGNsdWIzDQpmaW5sdWVuY2VwbG90KGFsdGVycyA9IGFsdGVyczEsIG1pbiA9IDEsIG1heCA9IDYsIHJlc3VsdHMgPSBGQUxTRSwgZnVuID0gbGlzdChmbGluZWFyLCBmcXVhZCwgZmF2QXR0SGlnaGVyLA0KICAgIGZhdkF0dExvd2VyKSwgcGFyYW1zID0gYygtMC4yMDg1LCAwLjAyMSwgMy43NzAzLCAyLjEyODMpKQ0KDQoNCmZpbmx1ZW5jZXBsb3QoYWx0ZXJzID0gYWx0ZXJzMiwgbWluID0gMSwgbWF4ID0gNiwgcmVzdWx0cyA9IEZBTFNFLCBmdW4gPSBsaXN0KGZsaW5lYXIsIGZxdWFkLCBmYXZBdHRIaWdoZXIsDQogICAgZmF2QXR0TG93ZXIpLCBwYXJhbXMgPSBjKC0wLjIwODUsIDAuMDIxLCAzLjc3MDMsIDIuMTI4MykpDQoNCg0KIyBjbHViNA0KZmlubHVlbmNlcGxvdChhbHRlcnMgPSBhbHRlcnMxLCBtaW4gPSAxLCBtYXggPSA2LCByZXN1bHRzID0gRkFMU0UsIGZ1biA9IGxpc3QoZmxpbmVhciwgZnF1YWQsIGZhdkF0dEhpZ2hlciwNCiAgICBmYXZBdHRMb3dlciksIHBhcmFtcyA9IGMoLTEuMzMxMywgMC4wMTkyLCAyLjU0OTMsIDQuNDk1MikpDQoNCg0KZmlubHVlbmNlcGxvdChhbHRlcnMgPSBhbHRlcnMyLCBtaW4gPSAxLCBtYXggPSA2LCByZXN1bHRzID0gRkFMU0UsIGZ1biA9IGxpc3QoZmxpbmVhciwgZnF1YWQsIGZhdkF0dEhpZ2hlciwNCiAgICBmYXZBdHRMb3dlciksIHBhcmFtcyA9IGMoLTEuMzMxMywgMC4wMTkyLCAyLjU0OTMsIDQuNDk1MikpDQoNCg0KIyBjbHViNQ0KZmlubHVlbmNlcGxvdChhbHRlcnMgPSBhbHRlcnMxLCBtaW4gPSAxLCBtYXggPSA2LCByZXN1bHRzID0gRkFMU0UsIGZ1biA9IGxpc3QoZmxpbmVhciwgZnF1YWQsIGZhdkF0dEhpZ2hlciwNCiAgICBmYXZBdHRMb3dlciksIHBhcmFtcyA9IGMoMC4xMDIxLCAwLjA3NDMsIDEuMTczNiwgOC41NDg2KSkNCg0KDQpmaW5sdWVuY2VwbG90KGFsdGVycyA9IGFsdGVyczIsIG1pbiA9IDEsIG1heCA9IDYsIHJlc3VsdHMgPSBGQUxTRSwgZnVuID0gbGlzdChmbGluZWFyLCBmcXVhZCwgZmF2QXR0SGlnaGVyLA0KICAgIGZhdkF0dExvd2VyKSwgcGFyYW1zID0gYygwLjEwMjEsIDAuMDc0MywgMS4xNzM2LCA4LjU0ODYpKQ0KYGBgDQo=


Copyright © 2021 Rob Franken