Java Code Examples for com.gemstone.gemfire.cache.Region#localDestroyRegion()

The following examples show how to use com.gemstone.gemfire.cache.Region#localDestroyRegion() . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: Bug40299DUnitTest.java    From gemfirexd-oss with Apache License 2.0 6 votes vote down vote up
/**
 * This method destroys the Region
 * 
 * @return CacheSerializableRunnable
 */
private CacheSerializableRunnable destroyRegion()
{
  SerializableRunnable destroyR = new CacheSerializableRunnable("destroyRegion") {
    public void run2()
    {
      try {
        assertTrue("Cache is found as null ", cache != null);

        Region rgn = cache.getRegion(regionName);          
        rgn.localDestroyRegion();
        cache.close();
      }
      catch (Exception ex) {

      }
    }
  };
  return (CacheSerializableRunnable)destroyR;
}
 
Example 2
Source File: DestroyRegionMessage.java    From gemfirexd-oss with Apache License 2.0 6 votes vote down vote up
@Override
public void process(DistributionManager dm) {
  Region r = getRegion(dm.getSystem());
  if (r != null) {
    try {
      if (action == ExpirationAction.LOCAL_DESTROY) {
        r.localDestroyRegion();
      } else if (action == ExpirationAction.DESTROY) {
        r.destroyRegion();
      } else if (action == ExpirationAction.INVALIDATE) {
        r.invalidateRegion();
      } else if (action == ExpirationAction.LOCAL_INVALIDATE) {
        r.localInvalidateRegion();
      }
    } catch (Exception e) {
      dm.getLoggerI18n().warning(
          LocalizedStrings.DestroRegionMessage_FAILED_ATTEMPT_TO_DESTROY_OR_INVALIDATE_REGION_0_FROM_CONSOLE_AT_1,
          new Object[] {r.getFullPath(), this.getSender()});
    }
  }
}
 
Example 3
Source File: MemberInfoWithStatsMBeanGFEValidationDUnitTest.java    From gemfirexd-oss with Apache License 2.0 6 votes vote down vote up
@SuppressWarnings("rawtypes")
public static void  destroyWanQueues() {
  try{
    Cache cache = com.gemstone.gemfire.cache.CacheFactory.getAnyInstance();
    for (Iterator i = cache.getGatewayHubs().iterator(); i.hasNext();) {
      GatewayHub hub = (GatewayHub) i.next();
      for (Iterator i1 = hub.getGateways().iterator(); i1.hasNext();) {
        Gateway gateway = (Gateway) i1.next();
        String rq= new StringBuffer(gateway.getGatewayHubId()).append('_').append(gateway.getId()).append("_EVENT_QUEUE").toString();
        Region wbcl = cache.getRegion(rq);
        if(wbcl != null) {
          wbcl.localDestroyRegion();
        }         
      }  
    }
    Set<Region<?, ?>> rootRegions = cache.rootRegions();
    if (rootRegions != null) {
      for (Region<?, ?> region : rootRegions) {
        region.clear();
      }
    }
  } catch (CancelException cce) {
    //Ignore
  }
}
 
Example 4
Source File: CacheXml65Test.java    From gemfirexd-oss with Apache License 2.0 6 votes vote down vote up
/**
 * Make sure you can create a persistent partitioned region from xml.
 */
public void testPersistentPartition() throws CacheException {
  CacheCreation cache = new CacheCreation();
  RegionAttributesCreation attrs = new RegionAttributesCreation(cache);
  attrs.setDataPolicy(DataPolicy.PERSISTENT_PARTITION);
  
  cache.createRegion("parRoot", attrs);
  
  Region r = cache.getRegion("parRoot");
  assertEquals(DataPolicy.PERSISTENT_PARTITION, r.getAttributes().getDataPolicy());
  
  testXml(cache);
  
  Cache c = getCache();
  assertNotNull(c);

  Region region = c.getRegion("parRoot");
  assertNotNull(region);

  assertEquals(DataPolicy.PERSISTENT_PARTITION, region.getAttributes().getDataPolicy());
  // since CacheTestCase remoteTearDown does not destroy PartitionedRegion
  region.localDestroyRegion();
}
 
Example 5
Source File: CacheXml65Test.java    From gemfirexd-oss with Apache License 2.0 6 votes vote down vote up
/**
 * Make sure you can create a persistent partitioned region from xml.
 */
public void testPersistentPartition() throws CacheException {
  CacheCreation cache = new CacheCreation();
  RegionAttributesCreation attrs = new RegionAttributesCreation(cache);
  attrs.setDataPolicy(DataPolicy.PERSISTENT_PARTITION);
  
  cache.createRegion("parRoot", attrs);
  
  Region r = cache.getRegion("parRoot");
  assertEquals(DataPolicy.PERSISTENT_PARTITION, r.getAttributes().getDataPolicy());
  
  testXml(cache);
  
  Cache c = getCache();
  assertNotNull(c);

  Region region = c.getRegion("parRoot");
  assertNotNull(region);

  assertEquals(DataPolicy.PERSISTENT_PARTITION, region.getAttributes().getDataPolicy());
  // since CacheTestCase remoteTearDown does not destroy PartitionedRegion
  region.localDestroyRegion();
}
 
Example 6
Source File: Bug37377DUnitTest.java    From gemfirexd-oss with Apache License 2.0 6 votes vote down vote up
/**
 * This method destroys the Region
 * 
 * @return CacheSerializableRunnable
 */
private CacheSerializableRunnable destroyRegion()
{
  SerializableRunnable puts = new CacheSerializableRunnable("destroyRegion") {
    public void run2()
    {
      try {
        assertTrue("Cache is found as null ", cache != null);

        Region rgn = cache.getRegion(regionName);
        rgn.localDestroyRegion();
        cache.close();
      }
      catch (Exception ex) {

      }
    }
  };
  return (CacheSerializableRunnable)puts;
}
 
Example 7
Source File: Bug37377DUnitTest.java    From gemfirexd-oss with Apache License 2.0 6 votes vote down vote up
/**
 * This method destroys the Region
 * 
 * @return CacheSerializableRunnable
 */
private CacheSerializableRunnable destroyRegion()
{
  SerializableRunnable puts = new CacheSerializableRunnable("destroyRegion") {
    public void run2()
    {
      try {
        assertTrue("Cache is found as null ", cache != null);

        Region rgn = cache.getRegion(regionName);
        rgn.localDestroyRegion();
        cache.close();
      }
      catch (Exception ex) {

      }
    }
  };
  return (CacheSerializableRunnable)puts;
}
 
Example 8
Source File: PersistentPartitionedRegionTestBase.java    From gemfirexd-oss with Apache License 2.0 5 votes vote down vote up
protected void localDestroyPR(VM vm0) {
  SerializableRunnable destroyPR = new SerializableRunnable("destroy pr") {

    public void run() {
      Cache cache = getCache();
      Region region = cache.getRegion(PR_REGION_NAME);
      region.localDestroyRegion();
    }
  };
  vm0.invoke(destroyPR);
}
 
Example 9
Source File: CacheXml75Test.java    From gemfirexd-oss with Apache License 2.0 5 votes vote down vote up
@SuppressWarnings("rawtypes")
public void testEnableOffHeapMemory() {
  try {
    System.setProperty("gemfire."+DistributionConfig.OFF_HEAP_MEMORY_SIZE_NAME, "1m");
    
    final String regionName = "testEnableOffHeapMemory";
    
    final CacheCreation cache = new CacheCreation();
    final RegionAttributesCreation attrs = new RegionAttributesCreation(cache);
    attrs.setEnableOffHeapMemory(true);
    assertEquals(true, attrs.getEnableOffHeapMemory());
    
    final Region regionBefore = cache.createRegion(regionName, attrs);
    assertNotNull(regionBefore);
    assertEquals(true, regionBefore.getAttributes().getEnableOffHeapMemory());

    testXml(cache);
    
    final Cache c = getCache();
    assertNotNull(c);

    final Region regionAfter = c.getRegion(regionName);
    assertNotNull(regionAfter);
    assertEquals(true, regionAfter.getAttributes().getEnableOffHeapMemory());
    assertEquals(true, ((LocalRegion)regionAfter).getEnableOffHeapMemory());
    regionAfter.localDestroyRegion();
  } finally {
    System.clearProperty("gemfire."+DistributionConfig.OFF_HEAP_MEMORY_SIZE_NAME);
  }
}
 
Example 10
Source File: WANTestBase.java    From gemfirexd-oss with Apache License 2.0 5 votes vote down vote up
public static void localDestroyRegion(String regionName) {
  ExpectedException exp = addExpectedException(PRLocallyDestroyedException.class
      .getName());
  try {
    Region r = cache.getRegion(Region.SEPARATOR + regionName);
    assertNotNull(r);
    r.localDestroyRegion();
  } finally {
    exp.remove();
  }
}
 
Example 11
Source File: LIFOEvictionAlgoMemoryEnabledRegionJUnitTest.java    From gemfirexd-oss with Apache License 2.0 5 votes vote down vote up
public void tearDown() throws Exception {
  super.tearDown();
  assertNotNull(cache);
  Region rgn = cache.getRegion(Region.SEPARATOR + regionName);
  assertNotNull(rgn);
  rgn.localDestroyRegion();
  cache.close();
   
}
 
Example 12
Source File: GemFireStore.java    From gemfirexd-oss with Apache License 2.0 5 votes vote down vote up
/**
 * Delete a Schema in the store in given transaction context.
 * 
 * @param schemaName
 *          the name of the schema
 * @param tc
 *          the {@link TransactionManager} for this operation
 */
public void dropSchemaRegion(String schemaName, TransactionController tc)
    throws StandardException {
  boolean locked = false;
  final GemFireTransaction tran = (GemFireTransaction)tc;
  LockingPolicy locking = null;
  if (!tran.skipLocks(schemaName, null)) {
    locking = new GFContainerLocking(
        new DefaultGfxdLockable(schemaName, null), false, null);
    // take distributed write lock before destroy
    // the lock will be released when transaction ends
    locked = locking.lockContainer(tran, null, true, true);
  }
  Region<?, ?> region = this.gemFireCache.getRegion(schemaName);
  if (region == null || region.isDestroyed()) {
    // [sumedh] Should we throw an exception here?
    // A genuine case should be caught at the derby level
    // while other case where it can arise is receiving a GfxdDDLMessage
    // for a region destruction that has already been replayed using
    // the hidden _DDL_STMTS_REGION.
    /*
    throw new RegionDestroyedException(
        "dropSchemaRegion: region for schema '" + schemaName
            + "' already destroyed", '/' + schemaName);
    */
    final LogWriterI18n logger = this.gemFireCache.getLoggerI18n();
    if (logger.fineEnabled()) {
      logger.fine("dropSchemaRegion: region [/" + schemaName
          + "] for schema '" + schemaName + "' already destroyed");
    }
    if (locked) {
      locking.unlockContainer(tran, null);
    }
  }
  else {
    // Do not distribute region destruction to other caches since the
    // distribution is already handled by GfxdDDLMessages.
    region.localDestroyRegion();
  }
}
 
Example 13
Source File: GemFireStore.java    From gemfirexd-oss with Apache License 2.0 5 votes vote down vote up
/**
 * Delete a Schema in the store in given transaction context.
 * 
 * @param schemaName
 *          the name of the schema
 * @param tc
 *          the {@link TransactionManager} for this operation
 */
public void dropSchemaRegion(String schemaName, TransactionController tc)
    throws StandardException {
  boolean locked = false;
  final GemFireTransaction tran = (GemFireTransaction)tc;
  LockingPolicy locking = null;
  if (!tran.skipLocks(schemaName, null)) {
    locking = new GFContainerLocking(
        new DefaultGfxdLockable(schemaName, null), false, null);
    // take distributed write lock before destroy
    // the lock will be released when transaction ends
    locked = locking.lockContainer(tran, null, true, true);
  }
  Region<?, ?> region = this.gemFireCache.getRegion(schemaName);
  if (region == null || region.isDestroyed()) {
    // [sumedh] Should we throw an exception here?
    // A genuine case should be caught at the derby level
    // while other case where it can arise is receiving a GfxdDDLMessage
    // for a region destruction that has already been replayed using
    // the hidden _DDL_STMTS_REGION.
    /*
    throw new RegionDestroyedException(
        "dropSchemaRegion: region for schema '" + schemaName
            + "' already destroyed", '/' + schemaName);
    */
    final LogWriterI18n logger = this.gemFireCache.getLoggerI18n();
    if (logger.fineEnabled()) {
      logger.fine("dropSchemaRegion: region [/" + schemaName
          + "] for schema '" + schemaName + "' already destroyed");
    }
    if (locked) {
      locking.unlockContainer(tran, null);
    }
  }
  else {
    // Do not distribute region destruction to other caches since the
    // distribution is already handled by GfxdDDLMessages.
    region.localDestroyRegion();
  }
}
 
Example 14
Source File: PartitionedRegionAsSubRegionDUnitTest.java    From gemfirexd-oss with Apache License 2.0 5 votes vote down vote up
public void run2() throws CacheException
{
  Cache cache = getCache();
  Region parentRegion = cache.getRegion(Region.SEPARATOR + parentRegionName
      + Region.SEPARATOR + childRegionName);
  parentRegion.localDestroyRegion();
}
 
Example 15
Source File: WANTestBase.java    From gemfirexd-oss with Apache License 2.0 5 votes vote down vote up
public static void localDestroyRegion(String regionName) {
  ExpectedException exp = addExpectedException(PRLocallyDestroyedException.class
      .getName());
  try {
    Region r = cache.getRegion(Region.SEPARATOR + regionName);
    assertNotNull(r);
    r.localDestroyRegion();
  } finally {
    exp.remove();
  }
}
 
Example 16
Source File: LIFOEvictionAlgoEnabledRegionJUnitTest.java    From gemfirexd-oss with Apache License 2.0 5 votes vote down vote up
public void tearDown() throws Exception {
  super.tearDown();
  assertNotNull(cache);
  Region rgn = cache.getRegion(Region.SEPARATOR + regionName);
  assertNotNull(rgn);
  rgn.localDestroyRegion();
  cache.close();
   
}
 
Example 17
Source File: CacheXml65Test.java    From gemfirexd-oss with Apache License 2.0 4 votes vote down vote up
public void testGatewayHub65ForDefaultDS() {
    CacheCreation cache = new CacheCreation();
    int HUB_PORT = AvailablePort.getRandomAvailablePort(AvailablePort.SOCKET);
    int PORT1 = AvailablePort.getRandomAvailablePort(AvailablePort.SOCKET);
    int PORT2 = AvailablePort.getRandomAvailablePort(AvailablePort.SOCKET);
    // Create GatewayHub
    GatewayHub hub = cache.setGatewayHub("US", HUB_PORT);
    hub.setSocketBufferSize(65536);
    hub.setMaximumTimeBetweenPings(30000);

    // Create Gateway and Endpoints
    Gateway gateway = hub.addGateway("EU");
    gateway.setSocketBufferSize(65536);
    gateway.addEndpoint("EU-1", DistributedTestCase.getIPLiteral(), PORT1);
    gateway.addEndpoint("EU-2", DistributedTestCase.getIPLiteral(), PORT2);


    // Create GatewayQueueAttributes
    GatewayQueueAttributes queueAttributes = gateway.getQueueAttributes();

    // don't specify overflowdir and diskstore name in queueAttributes
    queueAttributes.setMaximumQueueMemory(200);
    queueAttributes.setBatchSize(500);
    queueAttributes.setBatchTimeInterval(100);
    queueAttributes.setBatchConflation(true);
    queueAttributes.setEnablePersistence(true);
    // Create cache
    testXml(cache);
    // Test the GatewayHub creation
    Cache c = getCache();
    List hubs = c.getGatewayHubs();
    GatewayHub createdHub = (GatewayHub)hubs.get(0);
    assertTrue(createdHub != null);
    
    try {
      createdHub.start();
    } catch (IOException e) {
      // TODO Auto-generated catch block
      fail("Unexpected exception", e);
    }

    // Test the created GatewayHub
    assertEquals("US", createdHub.getId());
    assertEquals(HUB_PORT, createdHub.getPort());
    assertEquals(65536, createdHub.getSocketBufferSize());
    //assertEquals(30000, createdHub.getMaximumTimeBetweenPings());

    // Test the created Gateway
    Gateway createdGateway = createdHub.getGateways().get(0);
    assertNotNull(createdGateway);

    assertEquals("EU", createdGateway.getId());
    assertEquals(65536, createdGateway.getSocketBufferSize());

    // Test the endpoints
    List endpoints = createdGateway.getEndpoints();
    assertEquals(2, endpoints.size());
    for (Iterator i = endpoints.iterator(); i.hasNext(); ) {
      Gateway.Endpoint endpoint = (Gateway.Endpoint) i.next();
      if (endpoint.getId().equals("EU-1")) {
        assertEquals(DistributedTestCase.getIPLiteral(), endpoint.getHost());
        assertEquals(PORT1, endpoint.getPort());
      } else if (endpoint.getId().equals("EU-2")) {
        assertEquals(DistributedTestCase.getIPLiteral(), endpoint.getHost());
        assertEquals(PORT2, endpoint.getPort());
      } else {
        fail("Expected an endpoint with id EU-1 or EU-2 but got one with id " + endpoint.getId());
      }
    }

    // Test the queue attributes
    GatewayQueueAttributes createdQueueAttributes = createdGateway.getQueueAttributes();
    assertEquals(null, createdQueueAttributes.getDiskStoreName());
    File curDir = new File(".").getAbsoluteFile();
    File lockFile = new File(curDir, "DRLK_IF" + GemFireCacheImpl.DEFAULT_DS_NAME +".lk");
    assertTrue(lockFile.exists());
//    assertEquals(overflowDirectory.getAbsolutePath(), ds1.getDiskDirs()[0].getAbsolutePath());
    assertEquals(200, createdQueueAttributes.getMaximumQueueMemory());
    assertEquals(500, createdQueueAttributes.getBatchSize());
    assertEquals(100, createdQueueAttributes.getBatchTimeInterval());
    assertEquals(true, createdQueueAttributes.getBatchConflation());
    assertEquals(true, createdQueueAttributes.getEnablePersistence());    
    //Asif: Destroy the secret region used by High availability RegionQueue
    String rq= new StringBuffer(createdGateway.getGatewayHubId()).append('_').append(createdGateway.getId()).append("_EVENT_QUEUE").toString();
    Region wbcl = c.getRegion(rq);
    if(wbcl != null) {
      wbcl.localDestroyRegion();
    }
  }
 
Example 18
Source File: RegionWithHDFSBasicDUnitTest.java    From gemfirexd-oss with Apache License 2.0 4 votes vote down vote up
/**
 * Test that we can locally destroy a member, without
 * causing problems with the data in HDFS
 * @throws InterruptedException
 * 
 *  DISABLED until issues with PR primary failover are resolved - bug 47793.
 *  The line validate(vm1, uniqueName, numEntries) failing because new
 *  oplogs are not detected when the primary switches.
 */
public void DISABLED_testLocalDestroy() throws InterruptedException {
  Host host = Host.getHost(0);
  VM vm0 = host.getVM(0);
  VM vm1 = host.getVM(1);
  int numEntries = 200;
  
  
  final String folderPath = tmpDir +  "/testLocalDestroy";
  final String uniqueName = "testLocalDestroy";
  
  createServerRegion(vm0, 7, 31, 40, folderPath, 
      uniqueName, 1, false, true);
  createServerRegion(vm1, 7, 31, 40, folderPath, 
      uniqueName, 1, false, true);
  
  
  doPuts(vm0, uniqueName, numEntries);
  
  //Make sure some files have been written to hdfs and wait for
  //the queue to drain.
  verifyDataInHDFS(vm0, uniqueName, true, true, true, numEntries);
  
  validate(vm0, uniqueName, numEntries);
  
  SerializableCallable localDestroy = new SerializableCallable("local destroy") {
    public Object call() throws Exception {
      Region r = getRootRegion(uniqueName);
      r.localDestroyRegion();
      return null;
    }
  };
  
  vm0.invoke(localDestroy);
  
  verifyNoQOrPR(vm0);
  
  validate(vm1, uniqueName, numEntries);
  
  vm1.invoke(localDestroy);
  
  verifyNoQOrPR(vm1);
  
  closeCache(vm0);
  closeCache(vm1);
  
  //Restart vm0 and see if the data is still available from HDFS
  createServerRegion(vm0, 7, 31, 40, folderPath, 
      uniqueName, 1, false, true);
  
  validate(vm0, uniqueName, numEntries);
}
 
Example 19
Source File: CacheXml70Test.java    From gemfirexd-oss with Apache License 2.0 4 votes vote down vote up
/** make sure we can create regions with concurrencyChecksEnabled=true */
public void testConcurrencyChecksEnabled() throws CacheException {
  CacheCreation cache = new CacheCreation();
  RegionAttributesCreation attrs = new RegionAttributesCreation(cache);
  attrs.setScope(Scope.DISTRIBUTED_ACK);
  attrs.setDataPolicy(DataPolicy.REPLICATE);
  attrs.setConcurrencyChecksEnabled(true);
  cache.createRegion("replicated", attrs);
  
  attrs = new RegionAttributesCreation(cache);
  attrs.setDataPolicy(DataPolicy.PARTITION);
  attrs.setConcurrencyChecksEnabled(true);
  cache.createRegion("partitioned", attrs);
  
  attrs = new RegionAttributesCreation(cache);
  attrs.setScope(Scope.DISTRIBUTED_ACK);
  attrs.setDataPolicy(DataPolicy.EMPTY);
  attrs.setConcurrencyChecksEnabled(true);
  cache.createRegion("empty", attrs);
  
  attrs = new RegionAttributesCreation(cache);
  attrs.setScope(Scope.DISTRIBUTED_ACK);
  attrs.setConcurrencyChecksEnabled(true);
  cache.createRegion("normal", attrs);
  
  testXml(cache);
  
  Cache c = getCache();
  assertNotNull(c);

  Region region = c.getRegion("replicated");
  assertNotNull(region);
  assertTrue("expected concurrency checks to be enabled", region.getAttributes().getConcurrencyChecksEnabled());
  region.localDestroyRegion();

  region = c.getRegion("partitioned");
  assertNotNull(region);
  assertTrue("expected concurrency checks to be enabled", region.getAttributes().getConcurrencyChecksEnabled());
  region.localDestroyRegion();

  region = c.getRegion("empty");
  assertNotNull(region);
  assertTrue("expected concurrency checks to be enabled", region.getAttributes().getConcurrencyChecksEnabled());
  region.localDestroyRegion();

  region = c.getRegion("normal");
  assertNotNull(region);
  assertTrue("expected concurrency checks to be enabled", region.getAttributes().getConcurrencyChecksEnabled());
  region.localDestroyRegion();
}
 
Example 20
Source File: RegionWithHDFSBasicDUnitTest.java    From gemfirexd-oss with Apache License 2.0 4 votes vote down vote up
/**
 * Test that we can locally destroy a member, without
 * causing problems with the data in HDFS
 * @throws InterruptedException
 * 
 *  DISABLED until issues with PR primary failover are resolved - bug 47793.
 *  The line validate(vm1, uniqueName, numEntries) failing because new
 *  oplogs are not detected when the primary switches.
 */
public void DISABLED_testLocalDestroy() throws InterruptedException {
  Host host = Host.getHost(0);
  VM vm0 = host.getVM(0);
  VM vm1 = host.getVM(1);
  int numEntries = 200;
  
  
  final String folderPath = tmpDir +  "/testLocalDestroy";
  final String uniqueName = "testLocalDestroy";
  
  createServerRegion(vm0, 7, 31, 40, folderPath, 
      uniqueName, 1, false, true);
  createServerRegion(vm1, 7, 31, 40, folderPath, 
      uniqueName, 1, false, true);
  
  
  doPuts(vm0, uniqueName, numEntries);
  
  //Make sure some files have been written to hdfs and wait for
  //the queue to drain.
  verifyDataInHDFS(vm0, uniqueName, true, true, true, numEntries);
  
  validate(vm0, uniqueName, numEntries);
  
  SerializableCallable localDestroy = new SerializableCallable("local destroy") {
    public Object call() throws Exception {
      Region r = getRootRegion(uniqueName);
      r.localDestroyRegion();
      return null;
    }
  };
  
  vm0.invoke(localDestroy);
  
  verifyNoQOrPR(vm0);
  
  validate(vm1, uniqueName, numEntries);
  
  vm1.invoke(localDestroy);
  
  verifyNoQOrPR(vm1);
  
  closeCache(vm0);
  closeCache(vm1);
  
  //Restart vm0 and see if the data is still available from HDFS
  createServerRegion(vm0, 7, 31, 40, folderPath, 
      uniqueName, 1, false, true);
  
  validate(vm0, uniqueName, numEntries);
}