tstRTList.cpp revision c80170800394cbf2746e3136b41886c2d11617ae
f86f2dc613a22ee06add9b878197922466df641bvboxsync/* $Id$ */
f86f2dc613a22ee06add9b878197922466df641bvboxsync/** @file
f86f2dc613a22ee06add9b878197922466df641bvboxsync * IPRT Testcase - List interface.
f86f2dc613a22ee06add9b878197922466df641bvboxsync */
f86f2dc613a22ee06add9b878197922466df641bvboxsync
f86f2dc613a22ee06add9b878197922466df641bvboxsync/*
40c9dcdf4b9d1c60dc67fa671b7a689b3c0f84d4vboxsync * Copyright (C) 2010 Oracle Corporation
f86f2dc613a22ee06add9b878197922466df641bvboxsync *
f86f2dc613a22ee06add9b878197922466df641bvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
f86f2dc613a22ee06add9b878197922466df641bvboxsync * available from http://www.virtualbox.org. This file is free software;
f86f2dc613a22ee06add9b878197922466df641bvboxsync * you can redistribute it and/or modify it under the terms of the GNU
f86f2dc613a22ee06add9b878197922466df641bvboxsync * General Public License (GPL) as published by the Free Software
f86f2dc613a22ee06add9b878197922466df641bvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
f86f2dc613a22ee06add9b878197922466df641bvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
f86f2dc613a22ee06add9b878197922466df641bvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
f86f2dc613a22ee06add9b878197922466df641bvboxsync *
f86f2dc613a22ee06add9b878197922466df641bvboxsync * The contents of this file may alternatively be used under the terms
f86f2dc613a22ee06add9b878197922466df641bvboxsync * of the Common Development and Distribution License Version 1.0
f86f2dc613a22ee06add9b878197922466df641bvboxsync * (CDDL) only, as it comes in the "COPYING.CDDL" file of the
f86f2dc613a22ee06add9b878197922466df641bvboxsync * VirtualBox OSE distribution, in which case the provisions of the
f86f2dc613a22ee06add9b878197922466df641bvboxsync * CDDL are applicable instead of those of the GPL.
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync *
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync * You may elect to license modified versions of this file under the
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync * terms and conditions of either the GPL or the CDDL or both.
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync */
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync/*******************************************************************************
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync* Header Files *
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync*******************************************************************************/
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync#include <iprt/list.h>
40c9dcdf4b9d1c60dc67fa671b7a689b3c0f84d4vboxsync
40c9dcdf4b9d1c60dc67fa671b7a689b3c0f84d4vboxsync#include <iprt/err.h>
40c9dcdf4b9d1c60dc67fa671b7a689b3c0f84d4vboxsync#include <iprt/mem.h>
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync#include <iprt/string.h>
f86f2dc613a22ee06add9b878197922466df641bvboxsync#include <iprt/test.h>
f86f2dc613a22ee06add9b878197922466df641bvboxsync
f86f2dc613a22ee06add9b878197922466df641bvboxsync
f86f2dc613a22ee06add9b878197922466df641bvboxsync/*******************************************************************************
f86f2dc613a22ee06add9b878197922466df641bvboxsync* Structures and Typedefs *
f86f2dc613a22ee06add9b878197922466df641bvboxsync*******************************************************************************/
f86f2dc613a22ee06add9b878197922466df641bvboxsynctypedef struct LISTELEM
f86f2dc613a22ee06add9b878197922466df641bvboxsync{
f86f2dc613a22ee06add9b878197922466df641bvboxsync /** Test data */
ccc948c886b751603889a67909fbd4a5fcaeac85vboxsync unsigned idx;
f86f2dc613a22ee06add9b878197922466df641bvboxsync /** Node */
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync RTLISTNODE Node;
ccc948c886b751603889a67909fbd4a5fcaeac85vboxsync} LISTELEM, *PLISTELEM;
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync
2a047f0d7ee5964456dbc4dec9925031482588abvboxsyncstatic void tstRTListOrder(RTTEST hTest, PRTLISTNODE pList, unsigned cElements,
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync unsigned idxFirst, unsigned idxLast, unsigned idxStep)
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync{
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync RTTEST_CHECK(hTest, RTListIsEmpty(pList) == false);
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync RTTEST_CHECK(hTest, RTListGetFirst(pList, LISTELEM, Node) != NULL);
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync RTTEST_CHECK(hTest, RTListGetLast(pList, LISTELEM, Node) != NULL);
97dc19418e21b4b87280756668cf171a4332e498vboxsync if (cElements > 1)
f86f2dc613a22ee06add9b878197922466df641bvboxsync RTTEST_CHECK(hTest, RTListGetLast(pList, LISTELEM, Node) != RTListGetFirst(pList, LISTELEM, Node));
40c9dcdf4b9d1c60dc67fa671b7a689b3c0f84d4vboxsync else
f86f2dc613a22ee06add9b878197922466df641bvboxsync RTTEST_CHECK(hTest, RTListGetLast(pList, LISTELEM, Node) == RTListGetFirst(pList, LISTELEM, Node));
f86f2dc613a22ee06add9b878197922466df641bvboxsync
f86f2dc613a22ee06add9b878197922466df641bvboxsync /* Check that the order is right. */
f86f2dc613a22ee06add9b878197922466df641bvboxsync PLISTELEM pNode = RTListGetFirst(pList, LISTELEM, Node);
f86f2dc613a22ee06add9b878197922466df641bvboxsync for (unsigned i = idxFirst; i < idxLast; i += idxStep)
f86f2dc613a22ee06add9b878197922466df641bvboxsync {
f86f2dc613a22ee06add9b878197922466df641bvboxsync RTTEST_CHECK(hTest, pNode->idx == i);
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync pNode = RTListNodeGetNext(&pNode->Node, LISTELEM, Node);
8300beb17e7c288655895d07bfdc58a01f618218vboxsync }
8300beb17e7c288655895d07bfdc58a01f618218vboxsync
8300beb17e7c288655895d07bfdc58a01f618218vboxsync RTTEST_CHECK(hTest, pNode->idx == idxLast);
8300beb17e7c288655895d07bfdc58a01f618218vboxsync RTTEST_CHECK(hTest, RTListGetLast(pList, LISTELEM, Node) == pNode);
8300beb17e7c288655895d07bfdc58a01f618218vboxsync RTTEST_CHECK(hTest, RTListNodeIsLast(pList, &pNode->Node) == true);
8300beb17e7c288655895d07bfdc58a01f618218vboxsync
8300beb17e7c288655895d07bfdc58a01f618218vboxsync /* Check reverse order */
8300beb17e7c288655895d07bfdc58a01f618218vboxsync pNode = RTListGetLast(pList, LISTELEM, Node);
8300beb17e7c288655895d07bfdc58a01f618218vboxsync for (unsigned i = idxLast; i > idxFirst; i -= idxStep)
8300beb17e7c288655895d07bfdc58a01f618218vboxsync {
8300beb17e7c288655895d07bfdc58a01f618218vboxsync RTTEST_CHECK(hTest, pNode->idx == i);
8300beb17e7c288655895d07bfdc58a01f618218vboxsync pNode = RTListNodeGetPrev(&pNode->Node, LISTELEM, Node);
8300beb17e7c288655895d07bfdc58a01f618218vboxsync }
8300beb17e7c288655895d07bfdc58a01f618218vboxsync
8300beb17e7c288655895d07bfdc58a01f618218vboxsync RTTEST_CHECK(hTest, pNode->idx == idxFirst);
f86f2dc613a22ee06add9b878197922466df641bvboxsync RTTEST_CHECK(hTest, RTListGetFirst(pList, LISTELEM, Node) == pNode);
f86f2dc613a22ee06add9b878197922466df641bvboxsync RTTEST_CHECK(hTest, RTListNodeIsFirst(pList, &pNode->Node) == true);
f86f2dc613a22ee06add9b878197922466df641bvboxsync
f86f2dc613a22ee06add9b878197922466df641bvboxsync /* The list enumeration. */
f86f2dc613a22ee06add9b878197922466df641bvboxsync unsigned idx = idxFirst;
f86f2dc613a22ee06add9b878197922466df641bvboxsync RTListForEach(pList, pNode, LISTELEM, Node)
f86f2dc613a22ee06add9b878197922466df641bvboxsync {
f86f2dc613a22ee06add9b878197922466df641bvboxsync RTTEST_CHECK_RETV(hTest, idx == pNode->idx);
f86f2dc613a22ee06add9b878197922466df641bvboxsync idx += idxStep;
f86f2dc613a22ee06add9b878197922466df641bvboxsync }
8300beb17e7c288655895d07bfdc58a01f618218vboxsync RTTEST_CHECK_MSG_RETV(hTest, idx == idxLast + idxStep || (idx == idxFirst && idxFirst == idxLast),
f86f2dc613a22ee06add9b878197922466df641bvboxsync (hTest, "idx=%u idxFirst=%u idxLast=%u idxStep=%u\n", idx, idxFirst, idxLast, idxStep));
f86f2dc613a22ee06add9b878197922466df641bvboxsync
f86f2dc613a22ee06add9b878197922466df641bvboxsync idx = idxLast;
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync RTListForEachReverse(pList, pNode, LISTELEM, Node)
f86f2dc613a22ee06add9b878197922466df641bvboxsync {
ccc948c886b751603889a67909fbd4a5fcaeac85vboxsync RTTEST_CHECK_RETV(hTest, idx == pNode->idx);
f86f2dc613a22ee06add9b878197922466df641bvboxsync idx -= idxStep;
8300beb17e7c288655895d07bfdc58a01f618218vboxsync }
f86f2dc613a22ee06add9b878197922466df641bvboxsync RTTEST_CHECK_MSG_RETV(hTest, idx == idxFirst - idxStep || (idx == idxLast && idxFirst == idxLast),
f86f2dc613a22ee06add9b878197922466df641bvboxsync (hTest, "idx=%u idxFirst=%u idxLast idxStep=%u\n", idx, idxFirst, idxLast, idxStep));
8300beb17e7c288655895d07bfdc58a01f618218vboxsync}
f86f2dc613a22ee06add9b878197922466df641bvboxsync
8300beb17e7c288655895d07bfdc58a01f618218vboxsyncstatic void tstRTListCreate(RTTEST hTest, unsigned cElements)
f86f2dc613a22ee06add9b878197922466df641bvboxsync{
8300beb17e7c288655895d07bfdc58a01f618218vboxsync RTTestISubF("Creating and moving - %u elements", cElements);
ccc948c886b751603889a67909fbd4a5fcaeac85vboxsync Assert(cElements > 0);
8300beb17e7c288655895d07bfdc58a01f618218vboxsync
8300beb17e7c288655895d07bfdc58a01f618218vboxsync RTLISTNODE ListHead;
8300beb17e7c288655895d07bfdc58a01f618218vboxsync
f86f2dc613a22ee06add9b878197922466df641bvboxsync RTListInit(&ListHead);
f86f2dc613a22ee06add9b878197922466df641bvboxsync RTTEST_CHECK(hTest, RTListIsEmpty(&ListHead) == true);
f86f2dc613a22ee06add9b878197922466df641bvboxsync RTTEST_CHECK(hTest, RTListGetFirst(&ListHead, LISTELEM, Node) == NULL);
8300beb17e7c288655895d07bfdc58a01f618218vboxsync RTTEST_CHECK(hTest, RTListGetLast(&ListHead, LISTELEM, Node) == NULL);
8300beb17e7c288655895d07bfdc58a01f618218vboxsync
8300beb17e7c288655895d07bfdc58a01f618218vboxsync /* Create the list */
8300beb17e7c288655895d07bfdc58a01f618218vboxsync for (unsigned i = 0; i< cElements; i++)
8300beb17e7c288655895d07bfdc58a01f618218vboxsync {
8300beb17e7c288655895d07bfdc58a01f618218vboxsync PLISTELEM pNode = (PLISTELEM)RTMemAlloc(sizeof(LISTELEM));
8300beb17e7c288655895d07bfdc58a01f618218vboxsync
8300beb17e7c288655895d07bfdc58a01f618218vboxsync pNode->idx = i;
8300beb17e7c288655895d07bfdc58a01f618218vboxsync pNode->Node.pPrev = NULL;
f86f2dc613a22ee06add9b878197922466df641bvboxsync pNode->Node.pNext = NULL;
8300beb17e7c288655895d07bfdc58a01f618218vboxsync RTListAppend(&ListHead, &pNode->Node);
8300beb17e7c288655895d07bfdc58a01f618218vboxsync }
8300beb17e7c288655895d07bfdc58a01f618218vboxsync
8300beb17e7c288655895d07bfdc58a01f618218vboxsync tstRTListOrder(hTest, &ListHead, cElements, 0, cElements-1, 1);
8300beb17e7c288655895d07bfdc58a01f618218vboxsync
8300beb17e7c288655895d07bfdc58a01f618218vboxsync /* Move the list to a new one. */
8300beb17e7c288655895d07bfdc58a01f618218vboxsync RTLISTNODE ListHeadNew;
f86f2dc613a22ee06add9b878197922466df641bvboxsync
f86f2dc613a22ee06add9b878197922466df641bvboxsync RTListInit(&ListHeadNew);
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync RTListMove(&ListHeadNew, &ListHead);
8300beb17e7c288655895d07bfdc58a01f618218vboxsync
8300beb17e7c288655895d07bfdc58a01f618218vboxsync RTTEST_CHECK(hTest, RTListIsEmpty(&ListHead) == true);
8300beb17e7c288655895d07bfdc58a01f618218vboxsync RTTEST_CHECK(hTest, RTListGetFirst(&ListHead, LISTELEM, Node) == NULL);
8300beb17e7c288655895d07bfdc58a01f618218vboxsync RTTEST_CHECK(hTest, RTListGetLast(&ListHead, LISTELEM, Node) == NULL);
8300beb17e7c288655895d07bfdc58a01f618218vboxsync
8300beb17e7c288655895d07bfdc58a01f618218vboxsync tstRTListOrder(hTest, &ListHeadNew, cElements, 0, cElements-1, 1);
8300beb17e7c288655895d07bfdc58a01f618218vboxsync
8300beb17e7c288655895d07bfdc58a01f618218vboxsync /*
8300beb17e7c288655895d07bfdc58a01f618218vboxsync * Safe iteration w/ removal.
8300beb17e7c288655895d07bfdc58a01f618218vboxsync */
f86f2dc613a22ee06add9b878197922466df641bvboxsync RTTestISubF("Safe iteration w/ removal - %u elements", cElements);
8300beb17e7c288655895d07bfdc58a01f618218vboxsync
8300beb17e7c288655895d07bfdc58a01f618218vboxsync /* Move it element by element. */
8300beb17e7c288655895d07bfdc58a01f618218vboxsync PLISTELEM pNode, pSafe;
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync RTListForEachSafe(&ListHeadNew, pNode, pSafe, LISTELEM, Node)
8300beb17e7c288655895d07bfdc58a01f618218vboxsync {
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync RTListNodeRemove(&pNode->Node);
8300beb17e7c288655895d07bfdc58a01f618218vboxsync RTListAppend(&ListHead, &pNode->Node);
8300beb17e7c288655895d07bfdc58a01f618218vboxsync }
8300beb17e7c288655895d07bfdc58a01f618218vboxsync RTTESTI_CHECK(RTListIsEmpty(&ListHeadNew) == true);
8300beb17e7c288655895d07bfdc58a01f618218vboxsync tstRTListOrder(hTest, &ListHead, cElements, 0, cElements-1, 1);
8300beb17e7c288655895d07bfdc58a01f618218vboxsync
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync /* And the other way. */
8300beb17e7c288655895d07bfdc58a01f618218vboxsync RTListForEachReverseSafe(&ListHead, pNode, pSafe, LISTELEM, Node)
8300beb17e7c288655895d07bfdc58a01f618218vboxsync {
8300beb17e7c288655895d07bfdc58a01f618218vboxsync RTListNodeRemove(&pNode->Node);
8300beb17e7c288655895d07bfdc58a01f618218vboxsync RTListPrepend(&ListHeadNew, &pNode->Node);
8300beb17e7c288655895d07bfdc58a01f618218vboxsync }
f86f2dc613a22ee06add9b878197922466df641bvboxsync RTTESTI_CHECK(RTListIsEmpty(&ListHead) == true);
f86f2dc613a22ee06add9b878197922466df641bvboxsync tstRTListOrder(hTest, &ListHeadNew, cElements, 0, cElements-1, 1);
f86f2dc613a22ee06add9b878197922466df641bvboxsync
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync /*
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync * Remove elements now.
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync */
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync if (cElements > 1)
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync {
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync /* Remove every second */
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync RTTestISubF("Remove every second node - %u elements", cElements);
f86f2dc613a22ee06add9b878197922466df641bvboxsync
f86f2dc613a22ee06add9b878197922466df641bvboxsync pNode = RTListGetFirst(&ListHeadNew, LISTELEM, Node);
f86f2dc613a22ee06add9b878197922466df641bvboxsync for (unsigned i = 0; i < cElements; i++)
f86f2dc613a22ee06add9b878197922466df641bvboxsync {
f86f2dc613a22ee06add9b878197922466df641bvboxsync PLISTELEM pNext = RTListNodeGetNext(&pNode->Node, LISTELEM, Node);
f86f2dc613a22ee06add9b878197922466df641bvboxsync
f86f2dc613a22ee06add9b878197922466df641bvboxsync if (!(pNode->idx % 2))
f86f2dc613a22ee06add9b878197922466df641bvboxsync {
f86f2dc613a22ee06add9b878197922466df641bvboxsync RTListNodeRemove(&pNode->Node);
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync RTMemFree(pNode);
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync }
f86f2dc613a22ee06add9b878197922466df641bvboxsync
f86f2dc613a22ee06add9b878197922466df641bvboxsync pNode = pNext;
f86f2dc613a22ee06add9b878197922466df641bvboxsync }
f86f2dc613a22ee06add9b878197922466df641bvboxsync
f86f2dc613a22ee06add9b878197922466df641bvboxsync bool fElementsEven = (cElements % 2) == 0;
f86f2dc613a22ee06add9b878197922466df641bvboxsync unsigned idxEnd = fElementsEven ? cElements - 1 : cElements - 2;
f86f2dc613a22ee06add9b878197922466df641bvboxsync
f86f2dc613a22ee06add9b878197922466df641bvboxsync cElements /= 2;
f86f2dc613a22ee06add9b878197922466df641bvboxsync tstRTListOrder(hTest, &ListHeadNew, cElements, 1, idxEnd, 2);
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync }
f86f2dc613a22ee06add9b878197922466df641bvboxsync
f86f2dc613a22ee06add9b878197922466df641bvboxsync /* Remove the rest now. */
f86f2dc613a22ee06add9b878197922466df641bvboxsync RTTestISubF("Remove all nodes - %u elements", cElements);
f86f2dc613a22ee06add9b878197922466df641bvboxsync pNode = RTListGetFirst(&ListHeadNew, LISTELEM, Node);
f86f2dc613a22ee06add9b878197922466df641bvboxsync for (unsigned i = 0; i < cElements; i++)
f86f2dc613a22ee06add9b878197922466df641bvboxsync {
f86f2dc613a22ee06add9b878197922466df641bvboxsync PLISTELEM pNext = RTListNodeGetNext(&pNode->Node, LISTELEM, Node);
f86f2dc613a22ee06add9b878197922466df641bvboxsync
f86f2dc613a22ee06add9b878197922466df641bvboxsync RTListNodeRemove(&pNode->Node);
f86f2dc613a22ee06add9b878197922466df641bvboxsync RTMemFree(pNode);
f86f2dc613a22ee06add9b878197922466df641bvboxsync pNode = pNext;
f86f2dc613a22ee06add9b878197922466df641bvboxsync }
f86f2dc613a22ee06add9b878197922466df641bvboxsync
f86f2dc613a22ee06add9b878197922466df641bvboxsync /* List should be empty again */
f86f2dc613a22ee06add9b878197922466df641bvboxsync RTTEST_CHECK(hTest, RTListIsEmpty(&ListHeadNew) == true);
f86f2dc613a22ee06add9b878197922466df641bvboxsync RTTEST_CHECK(hTest, RTListGetFirst(&ListHeadNew, LISTELEM, Node) == NULL);
f86f2dc613a22ee06add9b878197922466df641bvboxsync RTTEST_CHECK(hTest, RTListGetLast(&ListHeadNew, LISTELEM, Node) == NULL);
f86f2dc613a22ee06add9b878197922466df641bvboxsync}
f86f2dc613a22ee06add9b878197922466df641bvboxsync
f86f2dc613a22ee06add9b878197922466df641bvboxsyncint main()
f86f2dc613a22ee06add9b878197922466df641bvboxsync{
f86f2dc613a22ee06add9b878197922466df641bvboxsync RTTEST hTest;
f86f2dc613a22ee06add9b878197922466df641bvboxsync int rc = RTTestInitAndCreate("tstRTList", &hTest);
f86f2dc613a22ee06add9b878197922466df641bvboxsync if (rc)
f86f2dc613a22ee06add9b878197922466df641bvboxsync return rc;
f86f2dc613a22ee06add9b878197922466df641bvboxsync RTTestBanner(hTest);
8300beb17e7c288655895d07bfdc58a01f618218vboxsync
f86f2dc613a22ee06add9b878197922466df641bvboxsync tstRTListCreate(hTest, 1);
f86f2dc613a22ee06add9b878197922466df641bvboxsync tstRTListCreate(hTest, 2);
2a047f0d7ee5964456dbc4dec9925031482588abvboxsync tstRTListCreate(hTest, 3);
f86f2dc613a22ee06add9b878197922466df641bvboxsync tstRTListCreate(hTest, 99);
f86f2dc613a22ee06add9b878197922466df641bvboxsync tstRTListCreate(hTest, 100);
f86f2dc613a22ee06add9b878197922466df641bvboxsync tstRTListCreate(hTest, 101);
f86f2dc613a22ee06add9b878197922466df641bvboxsync
f86f2dc613a22ee06add9b878197922466df641bvboxsync /*
f86f2dc613a22ee06add9b878197922466df641bvboxsync * Summary.
f86f2dc613a22ee06add9b878197922466df641bvboxsync */
f86f2dc613a22ee06add9b878197922466df641bvboxsync return RTTestSummaryAndDestroy(hTest);
f86f2dc613a22ee06add9b878197922466df641bvboxsync}
f86f2dc613a22ee06add9b878197922466df641bvboxsync
f86f2dc613a22ee06add9b878197922466df641bvboxsync