@Override
  public void run() {
    if ((GBDOptions.secureMode() && proxy.isLocal()) || !proxy.isAvailable()) return;

    final ProcessStatus psSigs =
        new ProcessStatus(ExecutionContext.bookInfo.getPagesInfo().getPages().size());

    ExecutorService sigPool = Executors.newCachedThreadPool();
    sigPool.submit(
        () ->
            ExecutionContext.bookInfo
                .getPagesInfo()
                .getPages()
                .parallelStream()
                .forEach(
                    page -> {
                      psSigs.inc();
                      getSig(page);
                    }));

    sigPool.shutdown();
    try {
      sigPool.awaitTermination(100, TimeUnit.MINUTES);
    } catch (InterruptedException e) {
    }

    psSigs.finish();
  }
  private boolean getSig(PageInfo page) {
    if (!proxy.isAvailable()) return false;

    if (page.dataProcessed.get()
        || page.getSig() != null
        || page.sigChecked.get()
        || page.loadingStarted.get()) return false;

    boolean sigFound = false;
    String rqUrl =
        ExecutionContext.baseUrl
            + ImageExtractor.PAGES_REQUEST_TEMPLATE.replace(
                ImageExtractor.RQ_PG_PLACEHOLDER, page.getPid());

    try {
      HttpResponse resp = getContent(rqUrl, proxy, true);
      if (resp == null) {
        logger.info(String.format(SIG_ERROR_TEMPLATE, rqUrl, proxy.toString()));
        return false;
      }

      String respStr = IOUtils.toString(resp.getContent());
      PagesInfo framePages = Mapper.objectMapper.readValue(respStr, PagesInfo.class);

      PageInfo[] pages = framePages.getPagesArray();
      for (PageInfo framePage : pages)
        if (framePage.getOrder() >= page.getOrder() && framePage.getSrc() != null) {
          PageInfo _page =
              ExecutionContext.bookInfo.getPagesInfo().getPageByPid(framePage.getPid());

          if (_page.dataProcessed.get() || _page.getSig() != null || _page.sigChecked.get())
            continue;

          String _frameSrc = framePage.getSrc();
          if (_frameSrc != null) _page.setSrc(_frameSrc);

          if (_page.getSig() != null) {
            if (_page.getPid().equals(page.getPid())) sigFound = true;
            _page.sigChecked.set(true);

            proxy.promoteProxy();

            // Если есть возможность - пытаемся грузить страницу сразу
            Pools.imgExecutor.execute(new PageImgProcessor(_page, proxy));
          }

          if (_page.getSrc() != null && _page.getSig() == null)
            logger.finest(String.format(SIG_WRONG_FORMAT, _page.getSrc()));
        }
    } catch (JsonParseException
        | JsonMappingException
        | SocketTimeoutException
        | SocketException
        | NoHttpResponseException ce) {
      if (!proxy.isLocal()) {
        proxy.registerFailure();
        logger.info(String.format("Proxy %s failed!", proxy.toString()));
      }

      ce.printStackTrace();
    } catch (Exception ex) {
      ex.printStackTrace();
    }

    return sigFound;
  }