Skip to content

Commit

Permalink
.
Browse files Browse the repository at this point in the history
  • Loading branch information
traversc committed Jun 10, 2024
1 parent 68d3f04 commit 54d5790
Show file tree
Hide file tree
Showing 21 changed files with 823 additions and 48 deletions.
88 changes: 46 additions & 42 deletions configure
Original file line number Diff line number Diff line change
Expand Up @@ -2793,47 +2793,6 @@ RELEASE=`echo $VERSION_STRING | cut -d. -f3`
echo $(($MAJOR*100000+$MINOR*100+$RELEASE))
}

########################################################
#### Compiler specific flags

# Check if simple C++ program using atomic header can compile using AC_COMPILE_IFELSE

cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <atomic>
#include <cstdint>
std::atomic<std::uint64_t> x1{0};
std::atomic<std::uint8_t> x2{0};
std::atomic<char*> x3{nullptr};
std::atomic<bool> x4{false};
int main() {
x1.fetch_add(1);
x2.fetch_add(1);
char temp = 'a';
x3.store(&temp);
x4.store(true);
return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"
then :
NEED_LIBATOMIC="no"
else case e in #(
e) NEED_LIBATOMIC="yes" ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext

if test xx$NEED_LIBATOMIC = "xxyes"; then
echo "Requires -latomic flag"
COMPILER_SPECIFIC_LIBS="-latomic"
else
echo "Does not require -latomic flag"
COMPILER_SPECIFIC_LIBS=""
fi

########################################################
#### Compile ZSTD checks

Expand Down Expand Up @@ -2890,6 +2849,51 @@ else
TBB_FLAG="-DRCPP_PARALLEL_USE_TBB=0"
fi

########################################################
#### Check if -latomic flag is needed, only necessary if using TBB

if test xx$using_tbb = "xxtrue"; then
# Check if simple C++ program using atomic header can compile using AC_COMPILE_IFELSE

cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
#include <atomic>
#include <cstdint>
std::atomic<std::uint64_t> x1{0};
std::atomic<std::uint8_t> x2{0};
std::atomic<char*> x3{nullptr};
std::atomic<bool> x4{false};
int main() {
x1.fetch_add(1);
x2.fetch_add(1);
char temp = 'a';
x3.store(&temp);
x4.store(true);
return 0;
}
_ACEOF
if ac_fn_cxx_try_compile "$LINENO"
then :
NEED_LIBATOMIC="no"
else case e in #(
e) NEED_LIBATOMIC="yes" ;;
esac
fi
rm -f core conftest.err conftest.$ac_objext conftest.beam conftest.$ac_ext

if test xx$NEED_LIBATOMIC = "xxyes"; then
echo "Requires -latomic flag"
COMPILER_SPECIFIC_LIBS="-latomic"
else
echo "Does not require -latomic flag"
COMPILER_SPECIFIC_LIBS=""
fi
else
COMPILER_SPECIFIC_LIBS=""
fi

########################################################
#### Compile SIMD checks

Expand All @@ -2909,7 +2913,7 @@ fi
QSBLOCKSIZE=""

if test xx$with_qsblocksize != "xx"; then
echo "Using blocksize ${QSBLOCKSIZE}"
echo "Using blocksize ${with_qsblocksize}"
QSBLOCKSIZE=-DQS2_BLOCKSIZE_TESTING_ONLY_DO_NOT_USE=${with_qsblocksize}
fi

Expand Down
57 changes: 52 additions & 5 deletions inst/benchmarks/plot_benchmark_results.R
Original file line number Diff line number Diff line change
Expand Up @@ -7,18 +7,16 @@ library(this.path)
library(stringplus)
set_string_ops("&", "|")


PLATFORM <- "mac"
algo_subset <- c("qs-legacy", "qs2", "qdata")
for(DATASET in c("enwik8", "gaia", "mnist", "tcell")) {
df <- fread("~/GoogleDrive/qs2/inst/benchmarks/results/ubuntu_serialization_benchmarks_%s.csv" | DATASET) %>%
df <- fread("%s/results/%s_serialization_benchmarks_%s.csv" | c(this.dir(), PLATFORM, DATASET)) %>%
filter(algo %in% algo_subset)
df$algo <- factor(df$algo, levels = algo_subset)

dfs <- df %>% group_by(algo, nthreads, compress_level) %>%
summarize(file_size = unique(file_size), save_time = median(save_time), read_time = median(read_time))

filter(dfs, sapply(file_size, length) > 1) %>% as.data.frame

g1 <- ggplot(df, aes(x = file_size, y = save_time, color = algo, shape = factor(nthreads))) +
geom_point() +
geom_line(data = dfs, aes(lty = factor(nthreads))) +
Expand Down Expand Up @@ -47,6 +45,55 @@ g2 <- ggplot(df, aes(x = save_time, y = read_time, color = algo, shape = factor(

g <- g1 + g2 + patchwork::plot_layout(guides = "collect")

ggsave(g, file = "%s/plots/%s_benchmark_plot.png" | c(this.dir(), DATASET), width = 8, height = 3.75)
ggsave(g, file = "%s/plots/%s_%s_benchmark_plot.png" | c(this.dir(), PLATFORM, DATASET), width = 8, height = 3.75)

}

################################################################################
# total across 4 datasets
df <- lapply(c("enwik8", "gaia", "mnist", "tcell"), function(DATASET) {
fread("%s/results/%s_serialization_benchmarks_%s.csv" | c(this.dir(), PLATFORM, DATASET)) %>%
filter(algo %in% algo_subset) %>%
mutate(dataset = DATASET)
}) %>% rbindlist
df$algo <- factor(df$algo, levels = algo_subset)

df <- df %>%
group_by(algo, nthreads, compress_level, rep) %>%
summarize(file_size = sum(file_size), save_time = sum(save_time), read_time = sum(read_time))

dfs <- df %>%
group_by(algo, nthreads, compress_level) %>%
summarize(file_size = unique(file_size), save_time = median(save_time), read_time = median(read_time))


g1 <- ggplot(df, aes(x = file_size, y = save_time, color = algo, shape = factor(nthreads))) +
geom_point() +
geom_line(data = dfs, aes(lty = factor(nthreads))) +
# scale_x_log10() +
scale_y_log10() +
scale_color_manual(values = palette.colors(palette = "Okabe-Ito")) +
labs(color = "Format", lty = "Threads", pch = "Threads",
x = "File Size (MB)", y = "Save Time (s)") +
theme_bw(base_size=11) +
guides(color = guide_legend(order = 1),
pch = guide_legend(order = 2),
lty = guide_legend(order = 2))


g2 <- ggplot(df, aes(x = save_time, y = read_time, color = algo, shape = factor(nthreads))) +
geom_point() +
geom_line(data = dfs, aes(lty = factor(nthreads))) +
scale_x_log10() + scale_y_log10() +
scale_color_manual(values = palette.colors(palette = "Okabe-Ito")) +
labs(color = "Format", lty = "Threads", pch = "Threads",
y = "Read Time (s)", x = "Save Time (s)") +
theme_bw(base_size=11) +
guides(color = guide_legend(order = 1),
pch = guide_legend(order = 2),
lty = guide_legend(order = 2))

g <- g1 + g2 + patchwork::plot_layout(guides = "collect")

ggsave(g, file = "%s/plots/%s_combined_benchmark_plot.png" | c(this.dir(), PLATFORM), width = 8, height = 3.75)

Binary file removed inst/benchmarks/plots/enwik8_benchmark_plot.png
Binary file not shown.
Binary file removed inst/benchmarks/plots/gaia_benchmark_plot.png
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file removed inst/benchmarks/plots/mnist_benchmark_plot.png
Binary file not shown.
Binary file removed inst/benchmarks/plots/tcell_benchmark_plot.png
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
181 changes: 181 additions & 0 deletions inst/benchmarks/results/mac_serialization_benchmarks_enwik8.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,181 @@
algo,compress_level,nthreads,rep,save_time,read_time,file_size
qdata,3,4,2,0.218180179595947,0.920108079910278,35.8806943893433
qs-legacy,7,1,3,1.66920113563538,0.975362062454224,33.9900665283203
qdata,11,1,3,3.17094302177429,0.981371879577637,32.992488861084
qs-legacy,9,1,3,1.96937203407288,0.964427947998047,33.7422189712524
qs2,9,1,3,2.2372670173645,1.02592086791992,33.8121643066406
qdata,1,4,3,0.140744209289551,0.908569097518921,40.5108032226563
qs-legacy,7,4,2,0.665509939193726,0.969509840011597,33.9900665283203
qs2,3,4,5,0.23112416267395,0.929660081863403,36.735668182373
qdata,1,4,5,0.143319129943848,0.916823148727417,40.5108032226563
qs2,5,4,5,0.393964052200317,0.923666954040527,35.3520374298096
qdata,7,4,2,0.608901977539063,0.923305988311768,33.4590539932251
qs2,7,1,1,1.77460908889771,1.04013204574585,34.1244297027588
qdata,9,4,3,0.729050159454346,0.922981023788452,33.1589050292969
qdata,7,1,5,1.5693302154541,0.995135068893433,33.4590539932251
qs2,11,1,1,3.36194896697998,1.00719714164734,33.6027097702026
qdata,7,4,5,0.57516622543335,0.918521881103516,33.4590539932251
qdata,11,1,5,3.19080805778503,1.01104688644409,32.992488861084
qs-legacy,11,4,5,1.15806412696838,0.972970962524414,33.6047334671021
qs2,3,1,3,0.748267889022827,1.01729989051819,36.735668182373
qs2,7,4,3,0.603024005889893,0.932165145874023,34.1244297027588
qs2,11,1,4,3.43799185752869,1.02130699157715,33.6027097702026
qs-legacy,7,4,1,0.658999919891357,0.969995021820068,33.9900665283203
qs-legacy,5,4,4,0.42157506942749,0.987696170806885,34.931432723999
qdata,11,4,5,1.30510592460632,0.928042888641357,32.992488861084
qdata,7,1,1,1.65986084938049,0.9896399974823,33.4590539932251
qs-legacy,1,4,1,0.139781951904297,0.9719078540802,40.5963258743286
qs2,9,4,5,0.756778955459595,0.924296855926514,33.8121643066406
qs-legacy,7,4,5,0.642716884613037,0.971292018890381,33.9900665283203
qs-legacy,11,1,5,2.6232898235321,0.993521213531494,33.6047334671021
qdata,1,1,5,0.442862987518311,1.00880694389343,40.5108032226563
qs-legacy,9,1,2,2.1741509437561,0.973517179489136,33.7422189712524
qs-legacy,5,1,4,1.12675404548645,1.18350505828857,34.931432723999
qs2,11,1,3,3.44373798370361,1.01490211486816,33.6027097702026
qs2,5,4,4,0.395595073699951,0.924275875091553,35.3520374298096
qs-legacy,7,1,5,1.72590589523315,0.980098962783813,33.9900665283203
qdata,1,1,4,0.487936019897461,1.02848696708679,40.5108032226563
qdata,7,4,1,0.582828044891357,0.935718059539795,33.4590539932251
qs-legacy,5,4,5,0.408643960952759,0.968690156936646,34.931432723999
qs2,11,4,2,1.39893007278442,0.951234102249146,33.6027097702026
qdata,1,1,2,0.469209909439087,0.990387916564941,40.5108032226563
qdata,3,4,5,0.249212980270386,0.934927940368652,35.8806943893433
qs2,9,4,1,0.764551162719727,0.921451091766357,33.8121643066406
qdata,9,1,1,2.17393803596497,0.991391897201538,33.1589050292969
qs-legacy,9,4,1,0.767686128616333,0.982846975326538,33.7422189712524
qs2,1,1,3,0.553164005279541,1.00831604003906,41.5029220581055
qdata,7,4,4,0.576091051101685,0.927416086196899,33.4590539932251
qs2,1,4,4,0.152478933334351,0.928745031356812,41.5029220581055
qs-legacy,9,1,1,1.94528198242188,1.01645994186401,33.7422189712524
qs-legacy,11,4,4,1.18209290504456,0.978740930557251,33.6047334671021
qs-legacy,9,4,3,0.762059926986694,0.972508907318115,33.7422189712524
qdata,9,1,3,2.15405201911926,0.990767002105713,33.1589050292969
qs-legacy,1,1,2,0.441058874130249,1.00203609466553,40.5963258743286
qs-legacy,3,4,4,0.247656106948853,0.986696004867554,36.216139793396
qdata,7,1,3,1.64061999320984,1.00061893463135,33.4590539932251
qs2,1,4,1,0.152202129364014,0.929331064224243,41.5029220581055
qs-legacy,9,1,4,1.97670102119446,0.975831985473633,33.7422189712524
qs-legacy,9,1,5,1.95155787467957,0.976623058319092,33.7422189712524
qs-legacy,11,4,1,1.14159989356995,0.966847896575928,33.6047334671021
qdata,1,4,1,0.14001202583313,0.923097133636475,40.5108032226563
qs2,5,4,1,0.393970966339111,0.924370050430298,35.3520374298096
qdata,9,1,5,2.12500691413879,1.05019617080688,33.1589050292969
qdata,5,1,4,1.12527513504028,1.0418529510498,34.5112924575806
qdata,11,4,3,1.33813905715942,0.929855108261108,32.992488861084
qdata,3,4,1,0.225500106811523,0.919832944869995,35.8806943893433
qs-legacy,5,4,1,0.413792133331299,1.00252294540405,34.931432723999
qs2,3,4,2,0.234230041503906,0.921794891357422,36.735668182373
qs-legacy,1,4,2,0.139997005462646,0.989223957061768,40.5963258743286
qdata,5,1,5,1.07970714569092,1.00178003311157,34.5112924575806
qdata,3,1,4,0.689329862594605,1.00757193565369,35.8806943893433
qs-legacy,11,1,4,2.64494895935059,1.02183794975281,33.6047334671021
qs-legacy,7,4,4,0.637389898300171,0.970676898956299,33.9900665283203
qs2,1,1,1,0.489444017410278,1.06297993659973,41.5029220581055
qs2,7,4,5,0.610751152038574,0.931798934936523,34.1244297027588
qdata,11,4,4,1.33432602882385,0.955682992935181,32.992488861084
qs2,7,4,1,0.617357969284058,0.921568870544434,34.1244297027588
qdata,1,4,2,0.141404867172241,0.923961162567139,40.5108032226563
qs2,9,1,1,2.30394005775452,1.00606894493103,33.8121643066406
qs-legacy,9,4,5,0.775880813598633,0.970836162567139,33.7422189712524
qs-legacy,1,1,1,0.416102886199951,0.976650953292847,40.5963258743286
qs2,3,4,4,0.228637933731079,0.949862003326416,36.735668182373
qs2,3,4,3,0.230727910995483,0.92956805229187,36.735668182373
qs2,3,1,2,0.753386974334717,1.06122803688049,36.735668182373
qdata,5,1,3,1.09429597854614,1.0095272064209,34.5112924575806
qs-legacy,1,1,4,0.433292865753174,0.975621938705444,40.5963258743286
qs2,5,1,1,1.16068196296692,1.02248287200928,35.3520374298096
qs-legacy,5,1,1,1.04505181312561,1.0166609287262,34.931432723999
qdata,5,1,1,1.05780291557312,1.00861597061157,34.5112924575806
qdata,9,4,1,0.740909099578857,0.926774024963379,33.1589050292969
qs2,7,4,4,0.604793071746826,0.930402994155884,34.1244297027588
qs-legacy,7,1,4,1.68970799446106,0.985357999801636,33.9900665283203
qs-legacy,11,1,2,2.62518286705017,0.98632287979126,33.6047334671021
qdata,3,4,4,0.219121932983398,1.03751397132874,35.8806943893433
qdata,5,4,3,0.439361095428467,1.03325796127319,34.5112924575806
qs-legacy,3,4,3,0.282451868057251,0.970804929733276,36.216139793396
qs2,5,1,2,1.15880012512207,1.01839804649353,35.3520374298096
qs2,1,4,2,0.151521921157837,0.935590028762817,41.5029220581055
qdata,1,1,3,0.448063135147095,0.986173868179321,40.5108032226563
qdata,7,1,4,1.67981100082397,1.00332880020142,33.4590539932251
qdata,5,4,1,0.379070043563843,0.924031972885132,34.5112924575806
qdata,3,1,3,0.729329824447632,0.998731851577759,35.8806943893433
qs2,11,1,5,3.44166898727417,1.00454711914062,33.6027097702026
qdata,5,4,4,0.379226922988892,0.916393995285034,34.5112924575806
qs-legacy,5,1,3,1.08338904380798,0.982345104217529,34.931432723999
qs2,7,1,4,1.71839714050293,1.03905701637268,34.1244297027588
qs2,5,4,3,0.392080068588257,0.933168888092041,35.3520374298096
qdata,5,1,2,1.08088397979736,1.02697610855103,34.5112924575806
qs-legacy,5,1,5,1.05624318122864,0.997048139572144,34.931432723999
qdata,3,4,3,0.241533994674683,0.985894918441772,35.8806943893433
qs2,3,1,4,0.744220018386841,1.01184797286987,36.735668182373
qs-legacy,3,4,5,0.248114109039307,0.973035097122192,36.216139793396
qdata,5,4,2,0.374050140380859,0.924262046813965,34.5112924575806
qdata,5,4,5,0.37542986869812,0.925734043121338,34.5112924575806
qs2,1,1,4,0.551736116409302,1.04864096641541,41.5029220581055
qs-legacy,11,1,1,2.60514187812805,0.97241997718811,33.6047334671021
qs2,9,4,3,0.779651165008545,0.919161796569824,33.8121643066406
qs-legacy,7,1,1,1.69791412353516,1.0160768032074,33.9900665283203
qs2,5,1,3,1.14140605926514,1.04013800621033,35.3520374298096
qdata,9,1,4,2.11513805389404,0.987239122390747,33.1589050292969
qs-legacy,3,1,2,0.737931966781616,1.01202297210693,36.216139793396
qdata,3,1,1,0.704370975494385,0.992788076400757,35.8806943893433
qs2,7,1,5,1.74576187133789,1.04564189910889,34.1244297027588
qs-legacy,5,1,2,1.07217812538147,0.983603000640869,34.931432723999
qdata,7,4,3,0.574303150177002,0.922248125076294,33.4590539932251
qs-legacy,11,4,3,1.16578388214111,0.97283411026001,33.6047334671021
qdata,1,4,4,0.141328811645508,0.936491012573242,40.5108032226563
qs-legacy,3,4,2,0.268156051635742,0.975234985351562,36.216139793396
qs-legacy,5,4,3,0.406721830368042,0.983253002166748,34.931432723999
qdata,1,1,1,0.442702054977417,1.01000118255615,40.5108032226563
qs2,1,1,2,0.525396108627319,1.03437280654907,41.5029220581055
qs-legacy,1,1,3,0.410515069961548,0.980029821395874,40.5963258743286
qs2,3,1,1,0.75125002861023,1.02489185333252,36.735668182373
qs2,9,1,2,2.31736016273499,1.00208377838135,33.8121643066406
qs2,11,1,2,3.46639204025269,1.00016093254089,33.6027097702026
qdata,3,1,2,0.707552909851074,1.03097701072693,35.8806943893433
qs-legacy,3,4,1,0.249958992004395,0.968402862548828,36.216139793396
qs2,1,4,3,0.15383505821228,0.927824974060059,41.5029220581055
qs2,5,1,5,1.12769818305969,1.02034783363342,35.3520374298096
qs-legacy,1,1,5,0.461658954620361,0.986208915710449,40.5963258743286
qs2,11,4,3,1.42824506759644,0.933089971542358,33.6027097702026
qs-legacy,3,1,1,0.703191041946411,0.990522861480713,36.216139793396
qdata,9,4,2,0.73697304725647,0.914204835891724,33.1589050292969
qs2,9,1,5,2.26861810684204,1.02428507804871,33.8121643066406
qdata,9,1,2,2.1456151008606,1.00054597854614,33.1589050292969
qs2,9,4,4,0.792716979980469,0.925738096237183,33.8121643066406
qs2,9,1,4,2.29820799827576,1.00989699363708,33.8121643066406
qdata,3,1,5,0.709341049194336,0.994704961776733,35.8806943893433
qs-legacy,3,1,4,0.735026836395264,0.988207817077637,36.216139793396
qs-legacy,7,4,3,0.634902000427246,0.976668119430542,33.9900665283203
qs-legacy,1,4,4,0.137341022491455,0.966152906417847,40.5963258743286
qs2,9,4,2,0.773356914520264,0.92550802230835,33.8121643066406
qs2,11,4,1,1.39377379417419,0.94209098815918,33.6027097702026
qs-legacy,11,1,3,2.62378001213074,0.984808921813965,33.6047334671021
qs2,11,4,4,1.38745093345642,0.933555841445923,33.6027097702026
qs2,3,4,1,0.23214602470398,0.931024074554443,36.735668182373
qs2,5,1,4,1.14905190467834,1.01380705833435,35.3520374298096
qdata,11,4,2,1.37630796432495,0.917328119277954,32.992488861084
qs-legacy,3,1,3,0.700824975967407,0.985602140426636,36.216139793396
qdata,11,1,4,3.18123602867126,0.995751857757568,32.992488861084
qs2,7,4,2,0.614078998565674,0.927385091781616,34.1244297027588
qdata,9,4,4,0.738654136657715,0.919358015060425,33.1589050292969
qdata,9,4,5,0.741617918014526,0.919745922088623,33.1589050292969
qs2,3,1,5,0.781960010528565,1.02844285964966,36.735668182373
qs-legacy,1,4,5,0.138340950012207,0.988760232925415,40.5963258743286
qs2,5,4,2,0.401787996292114,0.92563796043396,35.3520374298096
qdata,11,1,1,3.16906809806824,1.04905796051025,32.992488861084
qs2,7,1,2,1.70500493049622,1.00720500946045,34.1244297027588
qs-legacy,3,1,5,0.733918905258179,0.984554052352905,36.216139793396
qdata,11,4,1,1.34861087799072,0.915460824966431,32.992488861084
qdata,7,1,2,1.68989109992981,1.06257510185242,33.4590539932251
qs-legacy,11,4,2,1.17677307128906,0.979152917861938,33.6047334671021
qs-legacy,1,4,3,0.161080121994019,0.963012933731079,40.5963258743286
qs2,1,1,5,0.49570894241333,1.02060580253601,41.5029220581055
qs2,7,1,3,1.76231098175049,1.05130505561829,34.1244297027588
qs-legacy,5,4,2,0.420216083526611,0.972036838531494,34.931432723999
qs-legacy,7,1,2,1.58663892745972,1.04003500938416,33.9900665283203
qs2,1,4,5,0.155627965927124,0.936048030853271,41.5029220581055
qdata,11,1,2,3.18193507194519,0.988783121109009,32.992488861084
qs-legacy,9,4,4,0.773175001144409,0.966431856155396,33.7422189712524
qs-legacy,9,4,2,0.766278982162476,0.969651937484741,33.7422189712524
qs2,11,4,5,1.39238905906677,0.926629066467285,33.6027097702026
Loading

0 comments on commit 54d5790

Please sign in to comment.