Skip to content

Commit

Permalink
version 2.0.0
Browse files Browse the repository at this point in the history
  • Loading branch information
config-i1 authored and cran-robot committed Jul 2, 2017
1 parent 4073f88 commit a197924
Show file tree
Hide file tree
Showing 70 changed files with 3,457 additions and 2,611 deletions.
8 changes: 4 additions & 4 deletions DESCRIPTION
@@ -1,8 +1,8 @@
Package: smooth
Type: Package
Title: Forecasting Using Smoothing Functions
Version: 1.9.9
Date: 2017-05-03
Version: 2.0.0
Date: 2017-07-03
Authors@R: person("Ivan", "Svetunkov", email = "ivan@svetunkov.ru", role = c("aut", "cre"),
comment="Research Associate at Lancaster Centre for Forecasting, UK")
URL: https://github.com/config-i1/smooth
Expand All @@ -19,9 +19,9 @@ Suggests: Mcomp, numDeriv, testthat, knitr, rmarkdown
VignetteBuilder: knitr
RoxygenNote: 6.0.1
NeedsCompilation: yes
Packaged: 2017-05-02 22:22:47 UTC; config
Packaged: 2017-07-02 14:17:43 UTC; isvetunkov
Author: Ivan Svetunkov [aut, cre] (Research Associate at Lancaster Centre for
Forecasting, UK)
Maintainer: Ivan Svetunkov <ivan@svetunkov.ru>
Repository: CRAN
Date/Publication: 2017-05-03 06:50:01 UTC
Date/Publication: 2017-07-02 22:54:47 UTC
129 changes: 69 additions & 60 deletions MD5
@@ -1,95 +1,104 @@
4e6016c7ef29a89463aa75df56bb421f *DESCRIPTION
8173c09a91eb0f9cb742f1ff90e2f2f8 *NAMESPACE
5ff166109361ff0e7fadc42599e4c0db *NEWS
bdc79ba64052c301cb3d35e0af9d7125 *R/RcppExports.R
acfca4f7e0104746ccc8dcd7a23810fd *R/autoces.R
0addd07d70283ac5c87b5a9f65660370 *R/autossarima.R
ab14c2b2991799e3694204077e0bda38 *R/ces.R
cb28f674e3fdc29d98e7342766c50518 *R/error-measures.R
89dee7290b86c95a7bbb502fdad6f239 *R/es.R
6f63299c54e8e9d1ce1653695649920c *R/ges.R
ca6b5f42e1593ad2af03e93336197fc6 *DESCRIPTION
10a13f9faa7c05f308c4572cc7e9244b *NAMESPACE
e61543665bb76774d3b72fb385693fd9 *NEWS
f7b062d0d35d72c639622b0d6df5ddbd *R/RcppExports.R
e49cb4a22358c470ae50e92da3a14fb5 *R/autoces.R
d72a410a78bf3121eb6e91e73c52bd49 *R/autossarima.R
fc9a38139f66d8da35f9df5539fb4286 *R/ces.R
79ff178c70723cc5074bf567de55b722 *R/error-measures.R
b7ee94fc7c8930053082306848f4490a *R/es.R
bcc4118389d8392522bcfb9925aab59e *R/ges.R
a83f3701b914bfbf0fe6fbae7bbfb8c1 *R/graphmaker.R
85598e78063b227f2bd2d455f488334a *R/iss.R
43d1fb0499df1084d88dc0e18a12218a *R/methods.R
a782e18c9afeaf79d5852b9bdb233213 *R/iss.R
74912a53f19959a2359c71c49e4675c2 *R/methods.R
271cfd4148c277c7e436fdb2b475ef8b *R/simces.R
fad14e8de960fa244368338814b3f953 *R/simes.R
8979cd3937742fd0f9dde333d39905df *R/simes.R
4665a66ee8941e025775c00efe162017 *R/simges.R
669334132a434d6c77a9aed62bf37dd1 *R/simssarima.R
fa937caf348dae8ef56c56a7be3da961 *R/sma.R
81d415c7d16241e8c7d946ceb7db9010 *R/smooth-package.R
eb21fb57d1bd19a1d0c6a9f8509d9a26 *R/simssarima.R
7dd94f182a1534acfe60c86d90c3d186 *R/sma.R
5af5ffdfda5aa9dc7974ef219a92fe50 *R/smooth-package.R
fdf3aa6c13b2e0ce92639964dac5b191 *R/sowhat.R
0472c36270707474ec097d2c3133f209 *R/ssarima.R
bb9fdbb33ad3070e300c9b0da8d2e0fb *R/ssfunctions.R
4a2b17976462a49c3cc56cf822344c2c *R/ssarima.R
98b811e76b22081033faa71626d12056 *R/ssfunctions.R
7696390e6b97f0caeb592f571df87a98 *R/stepwise.R
b0efb65efe69f53751b542d2157d5331 *R/ves.R
e3556cd213e6282192313de9ec1b9f41 *R/vssFunctions.R
c6145f20dc392d2af65b7802dec5ded1 *R/xregExpander.R
2f9ce644d462d72f541a678706cb30dd *R/ves.R
1014dd801927cecea17336d8268895d7 *R/vmethods.R
1b023e8cc40c6b5bc8e488e5df5c526d *R/vssFunctions.R
c58f454b349697e6e79542446ca5a724 *R/xregExpander.R
2e38a1f2a7a77516a7acc9b0e010ce98 *R/zzz.R
19b98249a13ac88bdbfda47fb4781e02 *README.md
bdf8541b91e5dd916f11977679401ed5 *build/vignette.rds
3edfbe7920d7ee9312555f13efcf0456 *README.md
57d0feb1b229173d649c3f3f105b14ba *build/vignette.rds
591eab0cf00c0d5ad99fd1208bf8be3c *inst/doc/ces.R
3ff7db648de173fe3f2fb724a1bf5ad0 *inst/doc/ces.Rmd
14c3c04298386304db5d53e62115cf77 *inst/doc/ces.html
d29436397b00ad2731de8e335be7ad5b *inst/doc/es.R
8228746492e985ecb597a7c7048a7f1f *inst/doc/es.Rmd
b7aa9362b0bdeb34e42b1a0a1024ada2 *inst/doc/es.html
1ceeb5bf5e782cc865cceea1e1b4b4f4 *inst/doc/ces.Rmd
a7a900dcb3df93942edd7808ea8fdf69 *inst/doc/ces.html
028a5612f646b111e59c5c948416f6a7 *inst/doc/es.R
fab5dbb5604e213befe58a2386f7c0d3 *inst/doc/es.Rmd
bd0b087138a18b3949469831707e7ae3 *inst/doc/es.html
45d9763c4f7f91e6848c0440ad7e34e5 *inst/doc/ges.R
78564d21b17ab88ef7756a729df871be *inst/doc/ges.Rmd
46ea29942f724d719dc4c8758709f90c *inst/doc/ges.html
6ab6f287c6bb69b625aa89fd3802afd0 *inst/doc/ges.html
9b8f200ccd568f192ef3fbeec3f87211 *inst/doc/simulate.R
9f409e06de30e3359863c72502aa0eff *inst/doc/simulate.Rmd
5ac18b0f2afa08a2c4bbfa0acf16327e *inst/doc/simulate.html
6d8c901b19ab3773a24a0e0094bbacc8 *inst/doc/simulate.html
8e1c32f63e2ea5a8e5eb85b9bf31b1db *inst/doc/sma.R
804cfc08be879eed3f5cbb12c762aec6 *inst/doc/sma.Rmd
00da61b7bdd72e02aebfb5ab095f6120 *inst/doc/sma.html
a2cb1d397a0258d449763bfb68326f4b *inst/doc/sma.Rmd
948529769d06ad1fea88164c951e4d9f *inst/doc/sma.html
f2be0cff7be52faff06f2a377333a8c6 *inst/doc/smooth-Documentation.pdf
ab7560c1647929fa67f92f931009917d *inst/doc/smooth.R
edfabdfa6915c1cebcc71a17081e9f2b *inst/doc/smooth.Rmd
916bdd1b5fc73d9bcc156c9c45c42f35 *inst/doc/smooth.html
7a491bc604533bc48bed0da975448283 *inst/doc/smooth.Rmd
7edd052714e15be4c32c4234d4575b18 *inst/doc/smooth.html
15077f51d5e9e430a006f8eb59d90c13 *inst/doc/ssarima.R
8946a173184348b1603b7bf3f65d02e3 *inst/doc/ssarima.Rmd
d5e84bbb0eec6b10133a1b611e97a5cd *inst/doc/ssarima.html
c1aac4b4cc62acbf3bb1ae6bb82bd63f *man/AICc.Rd
3f3e63e50f7160339b2ecd26524b3298 *man/auto.ces.Rd
a44e2137a90b1e25856e327d7643203d *man/auto.ssarima.Rd
517c7be9d57411b9961d3e086b5526fd *man/ces.Rd
5409f129b5ae093817e2411c239602e0 *inst/doc/ssarima.Rmd
f66d2119465f7286a4a8bfa2ff45a2ce *inst/doc/ssarima.html
64312868d316dd4ba7384cec044050d1 *inst/doc/ves.R
3841e3e81d8b01ed2bb2dac7da3eb1c4 *inst/doc/ves.Rmd
f9064ceafa4d5f5a8b5f3806d2ebdea7 *inst/doc/ves.html
7d8a8d6a70f77e6f3cb66b9c2808601e *man/AICc.Rd
3285192f694f94954ef00b4d12bc0b8d *man/auto.ces.Rd
eac7debd12a183f2752eda61ccb525f5 *man/auto.ssarima.Rd
d7e96547716a5949592b1c4a773c4c49 *man/ces.Rd
f2980ab4bae86dbbcf112cf78e64663a *man/error-measures.Rd
fd32fbd6e3a9da7747d4083279a793ba *man/es.Rd
8663c86bdb644929c230a2137ac4d24e *man/forecast.smooth.Rd
52c6f3b0d86fa14381aafc8e082dff8e *man/ges.Rd
fa5840a39ec60e90f1df983810fbe4f7 *man/es.Rd
f3ed0b0c8141601ade33960b4adaf625 *man/forecast.smooth.Rd
008afcb2a0cc0119e01798d630fb30cc *man/ges.Rd
0d25e71373378df35dcb7bc9b2c3a215 *man/graphmaker.Rd
3639c7d4ce4e4a34cf963a692d1504de *man/hm.Rd
fe05c03b6d24710e415feca32a0900d8 *man/iss.Rd
5cf2528ea9af3fa9cd374442a2aad76b *man/orders.Rd
470e6ac94b8a33f071cd87aa7ccdc94b *man/pls.Rd
034115189321738ff07671ce1e6e64d6 *man/iss.Rd
eeffa0723dbcc729e797a36122b1e4e7 *man/nParam.Rd
b7ef9364decbb0181a92397896288e63 *man/orders.Rd
3349dc71b4d2a2b5ec35543e4e2b94b7 *man/pls.Rd
7926b5560a3bd34b373a1f1d7430a606 *man/pointLik.Rd
005bd8faf1042fb6a768fdeca19e0d02 *man/reexports.Rd
960a0e50f2ed6ce45681fcf797c958d3 *man/sim.ces.Rd
cc84d044f2eaf1c463550cd8dee6612a *man/sim.es.Rd
f8e3f01d807d15441fe1138fab8e2182 *man/sim.es.Rd
330c515e913eed547384af5688179050 *man/sim.ges.Rd
4973617c62e6bd0b4c8bcb3374fe7ef7 *man/sim.ssarima.Rd
c10d9a92f400cce5669787fbc825b913 *man/sma.Rd
6eb0a4dda212bc99393fdb242febf9ea *man/smooth.Rd
ca83f08fb21fa722b045584b9ef7ae10 *man/sma.Rd
89e767b00261aa6f349511c2c38a7b3e *man/smooth.Rd
43c220a1c003d0dbf0deb9abee04c8a5 *man/sowhat.Rd
d24a5110fd657d54d70653f9acedd5a2 *man/ssarima.Rd
eb6486830346616d2761543c461cdbfe *man/ssarima.Rd
731ca80b5424794abf9c17ec7a1612da *man/stepwise.Rd
cf5772ceff1086bb864767a6a805127b *man/ves.Rd
612e49a7cb2d268d537b2393d9d91075 *man/ves.Rd
037b2c68c2d119c33ea1ae400bf7dbe0 *man/xregExpander.Rd
9859afefaf6500832d7469cadbbb28c8 *src/Makevars
a6850c2998c396b505104b800670480e *src/Makevars.win
a4080be9b1333e2e2887e889eb59e4c2 *src/RcppExports.cpp
995be07b9831b3bf1e0d1745463b1e3c *src/RcppExports.cpp
9fb0915a4e7ffe192150808e5e890c69 *src/registerDynamicSymbol.c
03648d08022ddc5fd3d09891a9215c99 *src/ssgeneralfun.cpp
ed0c1f70d626afc9df76157d36f44b21 *src/ssgeneralfun.cpp
43ce084a9895aa52735c4e427cca2779 *src/vssGeneral.cpp
4e0f43b23ba7abbb29b225614e88f276 *tests/testthat.R
b8cb94b5355e771a3f6415f5b349c059 *tests/testthat/test_ces.R
7a0bfbd362e48936424dbdd248638552 *tests/testthat/test_es.R
6ef30227e3a2c04345912c0a73858cd6 *tests/testthat/test_es.R
a19ef0fe56d3676306870de9d229232b *tests/testthat/test_ges.R
1bf5531edb45c6a04df9a12eef032a63 *tests/testthat/test_iss.R
2e692854ad815da62cc381b7e53fdba5 *tests/testthat/test_iss.R
44a29130669ac4b28e2e61d497576101 *tests/testthat/test_simulate.R
d168343e2d2c516102191e5f0e48cb44 *tests/testthat/test_ssarima.R
3ff7db648de173fe3f2fb724a1bf5ad0 *vignettes/ces.Rmd
8228746492e985ecb597a7c7048a7f1f *vignettes/es.Rmd
3baf7d9a5ca4424a2d0983c038f49981 *tests/testthat/test_ves.R
1ceeb5bf5e782cc865cceea1e1b4b4f4 *vignettes/ces.Rmd
fab5dbb5604e213befe58a2386f7c0d3 *vignettes/es.Rmd
78564d21b17ab88ef7756a729df871be *vignettes/ges.Rmd
9f409e06de30e3359863c72502aa0eff *vignettes/simulate.Rmd
804cfc08be879eed3f5cbb12c762aec6 *vignettes/sma.Rmd
edfabdfa6915c1cebcc71a17081e9f2b *vignettes/smooth.Rmd
8946a173184348b1603b7bf3f65d02e3 *vignettes/ssarima.Rmd
a2cb1d397a0258d449763bfb68326f4b *vignettes/sma.Rmd
7a491bc604533bc48bed0da975448283 *vignettes/smooth.Rmd
5409f129b5ae093817e2411c239602e0 *vignettes/ssarima.Rmd
3841e3e81d8b01ed2bb2dac7da3eb1c4 *vignettes/ves.Rmd
23 changes: 21 additions & 2 deletions NAMESPACE
Expand Up @@ -2,6 +2,7 @@

S3method(AICc,default)
S3method(coef,smooth)
S3method(coef,vsmooth)
S3method(fitted,smooth)
S3method(forecast,smooth)
S3method(getResponse,smooth)
Expand All @@ -11,24 +12,33 @@ S3method(lags,default)
S3method(logLik,iss)
S3method(logLik,smooth)
S3method(logLik,smooth.sim)
S3method(model.type,default)
S3method(modelType,default)
S3method(modelType,vsmooth)
S3method(nParam,default)
S3method(nobs,iss)
S3method(nobs,smooth)
S3method(nobs,smooth.sim)
S3method(nobs,vsmooth)
S3method(orders,Arima)
S3method(orders,default)
S3method(plot,iss)
S3method(plot,smooth)
S3method(plot,smooth.forecast)
S3method(plot,smooth.sim)
S3method(pointLik,default)
S3method(pointLik,smooth)
S3method(print,iss)
S3method(print,smooth)
S3method(print,smooth.forecast)
S3method(print,smooth.sim)
S3method(print,vsmooth)
S3method(sigma,smooth)
S3method(sigma,vsmooth)
S3method(simulate,smooth)
S3method(summary,iss)
S3method(summary,smooth)
S3method(summary,smooth.forecast)
S3method(summary,vsmooth)
export(AICc)
export(MAPE)
export(MASE)
Expand All @@ -49,8 +59,11 @@ export(hm)
export(iss)
export(lags)
export(model.type)
export(modelType)
export(nParam)
export(orders)
export(pls)
export(pointLik)
export(sCE)
export(sMSE)
export(sPIS)
Expand All @@ -62,6 +75,7 @@ export(sma)
export(sowhat)
export(ssarima)
export(stepwise)
export(ves)
export(xregExpander)
import(Rcpp)
import(zoo)
Expand All @@ -80,11 +94,14 @@ importFrom(stats,AIC)
importFrom(stats,BIC)
importFrom(stats,as.formula)
importFrom(stats,coef)
importFrom(stats,coefficients)
importFrom(stats,cor)
importFrom(stats,cov)
importFrom(stats,dbeta)
importFrom(stats,decompose)
importFrom(stats,deltat)
importFrom(stats,dlnorm)
importFrom(stats,dnorm)
importFrom(stats,end)
importFrom(stats,frequency)
importFrom(stats,is.ts)
Expand All @@ -107,10 +124,12 @@ importFrom(stats,rlnorm)
importFrom(stats,rnorm)
importFrom(stats,rt)
importFrom(stats,runif)
importFrom(stats,sigma)
importFrom(stats,simulate)
importFrom(stats,start)
importFrom(stats,time)
importFrom(stats,ts)
importFrom(stats,var)
importFrom(stats,window)
importFrom(utils,packageVersion)
useDynLib(smooth, .registration=TRUE)
useDynLib(smooth)
27 changes: 27 additions & 0 deletions NEWS
@@ -1,3 +1,30 @@
smooth v2.0.0 (Release data: 2017-07-01)
==============

Changes:
* New function - ves(). Currently the basic features of all the pure additive and pure multiplicative models are implemented. No prediction intervals, no intermittence, no automatic model selection.
* New parameter - imodel, which determines the type of model for probability in case of iSS models. Can also accept models previously estimated using iss() function.
* Point forecasts in case of simulated data are now based on the simulation rather than analytical expression.
* Max order of SMA is now equal to obsInSample.
* Introduced a hidden parameter, rounded, which determines whether the rounded up value of demand sizes is assumed in the model. This influences the cost function and leads to a different results in case of intermittent model.
* If cumulative==TRUE, then we now return cumulative holdout values as well.
* New method pointLik() for smooth class. It returns the vector of log-likelihoods for each separate observation.
* Better integration of sim.es() objects and es() function. Now you can do something like this to fit the "true" model: x <- sim.es("MNN"); es(x$data,model=x).
* es() now also returns transition matrix.
* Optimised C++ code, which should result in the growth of computational speed for ~25%.
* es() now returns PLS value in the accuracy for all the types of models.

Bugfixes:
* simulator function in Rcpp did not cover the cases, when level could become negative. This is now fixed.
* ssarima() now checks if the number of observations is enough for the model and stops if it is not.
* es() didn't work in some cases of seasonal models, when number of in-sample observations was less than twice frequency of data. The seasonal model should not be used there in the first place.
* getResponse() function now returns the in-sample actuals.
* exists() functions in the code would look into the parent environments. Now they don't.
* sim.ssarima() returned state vector with wrong names in case of constant.
* When coef() was applied to es() objects, the initialSeason parameters were not returned because of the old name of the variable.
* Corrected a problem with initials of iETSX models.


smooth v1.9.9 (Release data: 2017-05-03)
==============

Expand Down
16 changes: 14 additions & 2 deletions R/RcppExports.R
Expand Up @@ -45,7 +45,19 @@ costfuncARIMA <- function(ARorders, MAorders, Iorders, ARIMAlags, nComp, AR, MA,
.Call('smooth_costfuncARIMA', PACKAGE = 'smooth', ARorders, MAorders, Iorders, ARIMAlags, nComp, AR, MA, constant, Cvalues, matvt, matF, matw, yt, vecg, h, modellags, Etype, Ttype, Stype, multisteps, CFt, normalizer, fittertype, nexovars, matxt, matat, matFX, vecgX, ot, estimAR, estimMA, requireConst, estimConst, estimxreg, gowild, estimFX, estimgX, estiminitX, bounds)
}

simulatorwrap <- function(arrvt, materrors, matot, matF, matw, matg, Etype, Ttype, Stype, modellags) {
.Call('smooth_simulatorwrap', PACKAGE = 'smooth', arrvt, materrors, matot, matF, matw, matg, Etype, Ttype, Stype, modellags)
simulatorwrap <- function(arrvt, matErrors, matot, matF, matw, matg, Etype, Ttype, Stype, modellags) {
.Call('smooth_simulatorwrap', PACKAGE = 'smooth', arrvt, matErrors, matot, matF, matw, matg, Etype, Ttype, Stype, modellags)
}

vFitterWrap <- function(yt, matvt, matF, matw, matG, modellags, Etype, Ttype, Stype, ot) {
.Call('smooth_vFitterWrap', PACKAGE = 'smooth', yt, matvt, matF, matw, matG, modellags, Etype, Ttype, Stype, ot)
}

vForecasterWrap <- function(matvt, matF, matw, series, h, Etype, Ttype, Stype, modellags) {
.Call('smooth_vForecasterWrap', PACKAGE = 'smooth', matvt, matF, matw, series, h, Etype, Ttype, Stype, modellags)
}

vOptimiserWrap <- function(yt, matvt, matF, matw, matG, modellags, Etype, Ttype, Stype, cfType, normalizer, bounds, ot) {
.Call('smooth_vOptimiserWrap', PACKAGE = 'smooth', yt, matvt, matF, matw, matG, modellags, Etype, Ttype, Stype, cfType, normalizer, bounds, ot)
}

20 changes: 5 additions & 15 deletions R/autoces.R
Expand Up @@ -59,7 +59,7 @@ auto.ces <- function(data, models=c("none","simple","full"),
cfType=c("MSE","MAE","HAM","GMSTFE","MSTFE","MSEh","TFL"),
h=10, holdout=FALSE, cumulative=FALSE,
intervals=c("none","parametric","semiparametric","nonparametric"), level=0.95,
intermittent=c("none","auto","fixed","croston","tsb","sba"),
intermittent=c("none","auto","fixed","croston","tsb","sba"), imodel="MNN",
bounds=c("admissible","none"),
silent=c("none","all","graph","legend","output"),
xreg=NULL, xregDo=c("use","select"), initialX=NULL,
Expand All @@ -79,7 +79,7 @@ auto.ces <- function(data, models=c("none","simple","full"),

##### Set environment for ssInput and make all the checks #####
environment(ssAutoInput) <- environment();
ssAutoInput(modelType="ces",ParentEnvironment=environment());
ssAutoInput("auto.ces",ParentEnvironment=environment());

# If the pool of models is wrong, fall back to default
if(length(models)!=1){
Expand All @@ -96,16 +96,6 @@ auto.ces <- function(data, models=c("none","simple","full"),
models <- substr(models,1,1);

datafreq <- frequency(data);
# if(any(is.na(data))){
# if(silentText==FALSE){
# message("Data contains NAs. These observations will be excluded.")
# }
# datanew <- data[!is.na(data)];
# if(is.ts(data)){
# datanew <- ts(datanew,start=start(data),frequency=datafreq);
# }
# data <- datanew;
# }

# Define maximum needed number of parameters
if(any(models=="n")){
Expand Down Expand Up @@ -159,7 +149,7 @@ auto.ces <- function(data, models=c("none","simple","full"),
cfType=cfType,
h=h, holdout=holdout,cumulative=cumulative,
intervals=intervals, level=level,
intermittent=intermittent,
intermittent=intermittent, imodel=imodel,
bounds=bounds, silent=silent,
xreg=xreg, xregDo=xregDo, initialX=initialX,
updateX=updateX, persistenceX=persistenceX, transitionX=transitionX, FI=FI);
Expand Down Expand Up @@ -200,7 +190,7 @@ auto.ces <- function(data, models=c("none","simple","full"),
cfType=cfType,
h=h, holdout=holdout,cumulative=cumulative,
intervals=intervals, level=level,
intermittent=intermittent,
intermittent=intermittent, imodel=imodel,
bounds=bounds, silent=TRUE,
xreg=xreg, xregDo=xregDo, initialX=initialX,
updateX=updateX, persistenceX=persistenceX, transitionX=transitionX, FI=FI);
Expand Down Expand Up @@ -241,7 +231,7 @@ auto.ces <- function(data, models=c("none","simple","full"),
}
else{
graphmaker(actuals=data,forecast=y.for.new,fitted=y.fit,
level=level,legend=!silentLegend,main=modelname,cumulative=cumulative);
legend=!silentLegend,main=modelname,cumulative=cumulative);
}
}

Expand Down

0 comments on commit a197924

Please sign in to comment.