[
  {
    "path": ".gitignore",
    "content": "# Data files and directories common\ndata/\nbuild/\ndist/\n*log.txt\n*.pth\n*.h5\n\n\n# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# Distribution / packaging\n.Python\nenv/\n\n# Installer logs\npip-log.txt\npip-delete-this-directory.txt\n\n# VS Studio Code\n.vscode\n\n# PyCharm\n.idea/\n\n# Dropbox\n.dropbox.attr\n\n# Jupyter Notebook\n.ipynb_checkpoints\n\n# pyenv\n.python-version\n\n# dotenv\n.env\n\n# virtualenv\n.venv\nvenv/\nENV/\n"
  },
  {
    "path": "DenseFusion/LICENSE",
    "content": "MIT License\n\nCopyright (c) 2019 Jeremy Wang\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE."
  },
  {
    "path": "DenseFusion/README.md",
    "content": "# DenseFusion\nBased on the work of [Chen Wang](https://github.com/j96w/DenseFusion) <br />\nModified by Dinh-Cuong Hoang\n\n## Requirements\n\n* Python 3.5\n* PyTorch 1.0\n* torchvision 0.2.2.post3\n* PIL\n* scipy\n* numpy\n* pyyaml\n* logging\n* cffi\n* matplotlib\n* Cython\n* CUDA 9.0/10.0\n\n```bash\n$ pip3 --no-cache-dir install numpy scipy pyyaml cffi pyyaml matplotlib Cython Pillow\n$ pip3 install https://download.pytorch.org/whl/cu100/torch-1.0.1.post2-cp35-cp35m-linux_x86_64.whl\n$ pip3 install torchvision==0.2.2.post3\n```\n\n## Train\n1. To train\n   ```bash\n   sh /experiments/scripts/train_warehouse.sh\n   ```\n"
  },
  {
    "path": "DenseFusion/datasets/warehouse/dataset.py",
    "content": "import torch.utils.data as data\nfrom PIL import Image\nimport os\nimport os.path\nimport torch\nimport numpy as np\nimport torchvision.transforms as transforms\nimport argparse\nimport time\nimport random\nfrom lib.transformations import quaternion_from_euler, euler_matrix, random_quaternion, quaternion_matrix\nimport numpy.ma as ma\nimport copy\nimport scipy.misc\nimport scipy.io as scio\n\n\nclass PoseDataset(data.Dataset):\n    def __init__(self, mode, num_pt, add_noise, root, noise_trans, refine):\n        if mode == 'train':\n            self.path = 'datasets/warehouse/dataset_config/train_data_list.txt'\n        elif mode == 'test':\n            self.path = 'datasets/warehouse/dataset_config/test_data_list.txt'\n        self.num_pt = num_pt\n        self.root = root\n        self.add_noise = add_noise\n        self.noise_trans = noise_trans\n\n        self.list = []\n        self.real = []\n        self.syn = []\n        input_file = open(self.path)\n        while 1:\n            input_line = input_file.readline()\n            if not input_line:\n                break\n            if input_line[-1:] == '\\n':\n                input_line = input_line[:-1]\n            if input_line[:5] == 'data/':\n                self.real.append(input_line)\n            else:\n                self.syn.append(input_line)\n            self.list.append(input_line)\n        input_file.close()\n\n        self.length = len(self.list)\n        self.len_real = len(self.real)\n        self.len_syn = len(self.syn)\n\n        class_file = open('datasets/warehouse/dataset_config/classes.txt')\n        class_id = 1\n        self.cld = {}\n        while 1:\n            class_input = class_file.readline()\n            if not class_input:\n                break\n\n            input_file = open('{0}/models/{1}/points.xyz'.format(self.root, class_input[:-1]))\n            self.cld[class_id] = []\n            while 1:\n                input_line = input_file.readline()\n                if not input_line:\n                    break\n                input_line = input_line[:-1].split(' ')\n                self.cld[class_id].append([float(input_line[0]), float(input_line[1]), float(input_line[2])])\n            self.cld[class_id] = np.array(self.cld[class_id])\n            input_file.close()\n            \n            class_id += 1\n\n        self.cam_cx_1 = 319.0000\n        self.cam_cy_1 = 237.0000\n        self.cam_fx_1 = 580.000\n        self.cam_fy_1 = 580.000\n\n        self.cam_cx_2 = 319.0000\n        self.cam_cy_2 = 237.0000\n        self.cam_fx_2 = 580.000\n        self.cam_fy_2 = 580.000\n\n        self.xmap = np.array([[j for i in range(640)] for j in range(480)])\n        self.ymap = np.array([[i for i in range(640)] for j in range(480)])\n        \n        self.trancolor = transforms.ColorJitter(0.2, 0.2, 0.2, 0.05)\n        self.noise_img_loc = 0.0\n        self.noise_img_scale = 7.0\n        self.minimum_num_pt = 50\n        self.norm = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])\n        #self.symmetry_obj_idx = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]\n        self.symmetry_obj_idx = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13]\n        self.num_pt_mesh_small = 500\n        self.num_pt_mesh_large = 2600\n        self.refine = refine\n        self.front_num = 2\n\n        print(len(self.list))\n\n    def __getitem__(self, index):\n        img = Image.open('{0}/{1}-color.png'.format(self.root, self.list[index]))\n        depth = np.array(Image.open('{0}/{1}-depth.png'.format(self.root, self.list[index])))\n        label = np.array(Image.open('{0}/{1}-label.png'.format(self.root, self.list[index])))\n        meta = scio.loadmat('{0}/{1}-meta.mat'.format(self.root, self.list[index]))\n\n        if self.list[index][:8] != 'data_syn' and int(self.list[index][5:9]) >= 60:\n            cam_cx = self.cam_cx_2\n            cam_cy = self.cam_cy_2\n            cam_fx = self.cam_fx_2\n            cam_fy = self.cam_fy_2\n        else:\n            cam_cx = self.cam_cx_1\n            cam_cy = self.cam_cy_1\n            cam_fx = self.cam_fx_1\n            cam_fy = self.cam_fy_1\n\n        mask_back = ma.getmaskarray(ma.masked_equal(label, 0))\n\n        add_front = False\n        \n        #Cuong We dont have synthetic data\n        if len(self.syn) > 0:\n            if self.add_noise:\n                for k in range(5):\n                    seed = random.choice(self.syn)\n                    front = np.array(self.trancolor(Image.open('{0}/{1}-color.png'.format(self.root, seed)).convert(\"RGB\")))\n                    front = np.transpose(front, (2, 0, 1))\n                    f_label = np.array(Image.open('{0}/{1}-label.png'.format(self.root, seed)))\n                    front_label = np.unique(f_label).tolist()[1:]\n                    if len(front_label) < self.front_num:\n                        continue\n                    front_label = random.sample(front_label, self.front_num)\n                    for f_i in front_label:\n                        mk = ma.getmaskarray(ma.masked_not_equal(f_label, f_i))\n                        if f_i == front_label[0]:\n                            mask_front = mk\n                        else:\n                            mask_front = mask_front * mk\n                    t_label = label * mask_front\n                    if len(t_label.nonzero()[0]) > 1000:\n                        label = t_label\n                        add_front = True\n                        break\n\n        obj = meta['cls_indexes'].flatten().astype(np.int32)\n\n        while 1:\n            idx = np.random.randint(0, len(obj))\n            mask_depth = ma.getmaskarray(ma.masked_not_equal(depth, 0))\n            mask_label = ma.getmaskarray(ma.masked_equal(label, obj[idx]))\n            mask = mask_label * mask_depth\n            if len(mask.nonzero()[0]) > self.minimum_num_pt:\n                break\n\n        if self.add_noise:\n            img = self.trancolor(img)\n\n        rmin, rmax, cmin, cmax = get_bbox(mask_label)\n        img = np.transpose(np.array(img)[:, :, :3], (2, 0, 1))[:, rmin:rmax, cmin:cmax]\n\n        if self.list[index][:8] == 'data_syn':\n            seed = random.choice(self.real)\n            back = np.array(self.trancolor(Image.open('{0}/{1}-color.png'.format(self.root, seed)).convert(\"RGB\")))\n            back = np.transpose(back, (2, 0, 1))[:, rmin:rmax, cmin:cmax]\n            img_masked = back * mask_back[rmin:rmax, cmin:cmax] + img\n        else:\n            img_masked = img\n\n        if self.add_noise and add_front:\n            img_masked = img_masked * mask_front[rmin:rmax, cmin:cmax] + front[:, rmin:rmax, cmin:cmax] * ~(mask_front[rmin:rmax, cmin:cmax])\n\n        if self.list[index][:8] == 'data_syn':\n            img_masked = img_masked + np.random.normal(loc=0.0, scale=7.0, size=img_masked.shape)\n\n        # p_img = np.transpose(img_masked, (1, 2, 0))\n        # scipy.misc.imsave('temp/{0}_input.png'.format(index), p_img)\n        # scipy.misc.imsave('temp/{0}_label.png'.format(index), mask[rmin:rmax, cmin:cmax].astype(np.int32))\n\n        target_r = meta['poses'][:, :, idx][:, 0:3]\n        target_t = np.array([meta['poses'][:, :, idx][:, 3:4].flatten()])\n        add_t = np.array([random.uniform(-self.noise_trans, self.noise_trans) for i in range(3)])\n\n        choose = mask[rmin:rmax, cmin:cmax].flatten().nonzero()[0]\n        if len(choose) > self.num_pt:\n            c_mask = np.zeros(len(choose), dtype=int)\n            c_mask[:self.num_pt] = 1\n            np.random.shuffle(c_mask)\n            choose = choose[c_mask.nonzero()]\n        else:\n            choose = np.pad(choose, (0, self.num_pt - len(choose)), 'wrap')\n        \n        depth_masked = depth[rmin:rmax, cmin:cmax].flatten()[choose][:, np.newaxis].astype(np.float32)\n        xmap_masked = self.xmap[rmin:rmax, cmin:cmax].flatten()[choose][:, np.newaxis].astype(np.float32)\n        ymap_masked = self.ymap[rmin:rmax, cmin:cmax].flatten()[choose][:, np.newaxis].astype(np.float32)\n        choose = np.array([choose])\n\n        cam_scale = meta['factor_depth'][0][0]\n        pt2 = depth_masked / cam_scale\n        pt0 = (ymap_masked - cam_cx) * pt2 / cam_fx\n        pt1 = (xmap_masked - cam_cy) * pt2 / cam_fy\n        cloud = np.concatenate((pt0, pt1, pt2), axis=1)\n        if self.add_noise:\n            cloud = np.add(cloud, add_t)\n\n        # fw = open('temp/{0}_cld.xyz'.format(index), 'w')\n        # for it in cloud:\n        #    fw.write('{0} {1} {2}\\n'.format(it[0], it[1], it[2]))\n        # fw.close()\n\n        dellist = [j for j in range(0, len(self.cld[obj[idx]]))]\n        if self.refine:\n            dellist = random.sample(dellist, len(self.cld[obj[idx]]) - self.num_pt_mesh_large)\n        else:\n            dellist = random.sample(dellist, len(self.cld[obj[idx]]) - self.num_pt_mesh_small)\n        model_points = np.delete(self.cld[obj[idx]], dellist, axis=0)\n\n        # fw = open('temp/{0}_model_points.xyz'.format(index), 'w')\n        # for it in model_points:\n        #    fw.write('{0} {1} {2}\\n'.format(it[0], it[1], it[2]))\n        # fw.close()\n\n        target = np.dot(model_points, target_r.T)\n        if self.add_noise:\n            target = np.add(target, target_t + add_t)\n        else:\n            target = np.add(target, target_t)\n        \n        # fw = open('temp/{0}_tar.xyz'.format(index), 'w')\n        # for it in target:\n        #    fw.write('{0} {1} {2}\\n'.format(it[0], it[1], it[2]))\n        # fw.close()\n        \n        return torch.from_numpy(cloud.astype(np.float32)), \\\n               torch.LongTensor(choose.astype(np.int32)), \\\n               self.norm(torch.from_numpy(img_masked.astype(np.float32))), \\\n               torch.from_numpy(target.astype(np.float32)), \\\n               torch.from_numpy(model_points.astype(np.float32)), \\\n               torch.LongTensor([int(obj[idx]) - 1])\n\n    def __len__(self):\n        return self.length\n\n    def get_sym_list(self):\n        return self.symmetry_obj_idx\n\n    def get_num_points_mesh(self):\n        if self.refine:\n            return self.num_pt_mesh_large\n        else:\n            return self.num_pt_mesh_small\n\n\nborder_list = [-1, 40, 80, 120, 160, 200, 240, 280, 320, 360, 400, 440, 480, 520, 560, 600, 640, 680]\nimg_width = 480\nimg_length = 640\n\ndef get_bbox(label):\n    rows = np.any(label, axis=1)\n    cols = np.any(label, axis=0)\n    rmin, rmax = np.where(rows)[0][[0, -1]]\n    cmin, cmax = np.where(cols)[0][[0, -1]]\n    rmax += 1\n    cmax += 1\n    r_b = rmax - rmin\n    for tt in range(len(border_list)):\n        if r_b > border_list[tt] and r_b < border_list[tt + 1]:\n            r_b = border_list[tt + 1]\n            break\n    c_b = cmax - cmin\n    for tt in range(len(border_list)):\n        if c_b > border_list[tt] and c_b < border_list[tt + 1]:\n            c_b = border_list[tt + 1]\n            break\n    center = [int((rmin + rmax) / 2), int((cmin + cmax) / 2)]\n    rmin = center[0] - int(r_b / 2)\n    rmax = center[0] + int(r_b / 2)\n    cmin = center[1] - int(c_b / 2)\n    cmax = center[1] + int(c_b / 2)\n    if rmin < 0:\n        delt = -rmin\n        rmin = 0\n        rmax += delt\n    if cmin < 0:\n        delt = -cmin\n        cmin = 0\n        cmax += delt\n    if rmax > img_width:\n        delt = rmax - img_width\n        rmax = img_width\n        rmin -= delt\n    if cmax > img_length:\n        delt = cmax - img_length\n        cmax = img_length\n        cmin -= delt\n    return rmin, rmax, cmin, cmax\n"
  },
  {
    "path": "DenseFusion/datasets/warehouse/dataset_config/classes.txt",
    "content": "pallet_free\nhalf_pallet_free\npallet_occluded\nhalf_pallet_occluded\njacky\nfrasvaf\nonos\npauluns\nrisi_frutti\nskansk\nsotstark\ntomatpure\nsmall_jacky\n"
  },
  {
    "path": "DenseFusion/datasets/warehouse/dataset_config/split_data.py",
    "content": "import glob\n\nf_test = open(\"test_data_list.txt\", 'w')\nf_train = open(\"train_data_list.txt\", 'w')\n\ntest = ['0003', '0011', '0017', '0025', '0039']\nval = ['0010','0018', '0026', '0027', '0028', '0029', '0030', '0031', '0032',]\n\nfor i in range(0, 40):\n    seq = 10000 + i\n    seq_str = str(seq)[1:]\n    data_dir = 'data/' + seq_str + '/'\n    label_path = '/media/aass/783de628-b7ff-4217-8c96-7f3764de70d9/Warehouse_Dataset/' + data_dir\n    label_addrs = glob.glob(label_path + '*-label.png')\n    if seq_str in val:\n        continue\n    if seq_str in test:\n        for j in range(0, len(label_addrs)):\n            img_index = 1000000 + j + 1\n            img_index_str = str(img_index)[1:]\n            img_dir = data_dir + img_index_str \n            f_test.write(img_dir)\n            f_test.write('\\n')\n    else:\n        for j in range(0, len(label_addrs)):\n            img_index = 1000000 + j +1\n            img_index_str = str(img_index)[1:]\n            img_dir = data_dir + img_index_str \n            f_train.write(img_dir)\n            f_train.write('\\n')\n"
  },
  {
    "path": "DenseFusion/datasets/warehouse/dataset_config/test_data_list.txt",
    "content": "data/0003/000001\ndata/0003/000002\ndata/0003/000003\ndata/0003/000004\ndata/0003/000005\ndata/0003/000006\ndata/0003/000007\ndata/0003/000008\ndata/0003/000009\ndata/0003/000010\ndata/0003/000011\ndata/0003/000012\ndata/0003/000013\ndata/0003/000014\ndata/0003/000015\ndata/0003/000016\ndata/0003/000017\ndata/0003/000018\ndata/0003/000019\ndata/0003/000020\ndata/0003/000021\ndata/0003/000022\ndata/0003/000023\ndata/0003/000024\ndata/0003/000025\ndata/0003/000026\ndata/0003/000027\ndata/0003/000028\ndata/0003/000029\ndata/0003/000030\ndata/0003/000031\ndata/0003/000032\ndata/0003/000033\ndata/0003/000034\ndata/0003/000035\ndata/0003/000036\ndata/0003/000037\ndata/0003/000038\ndata/0003/000039\ndata/0003/000040\ndata/0003/000041\ndata/0003/000042\ndata/0003/000043\ndata/0003/000044\ndata/0003/000045\ndata/0003/000046\ndata/0003/000047\ndata/0003/000048\ndata/0003/000049\ndata/0003/000050\ndata/0003/000051\ndata/0003/000052\ndata/0003/000053\ndata/0003/000054\ndata/0003/000055\ndata/0003/000056\ndata/0003/000057\ndata/0003/000058\ndata/0003/000059\ndata/0003/000060\ndata/0003/000061\ndata/0003/000062\ndata/0003/000063\ndata/0003/000064\ndata/0003/000065\ndata/0003/000066\ndata/0003/000067\ndata/0003/000068\ndata/0003/000069\ndata/0003/000070\ndata/0003/000071\ndata/0003/000072\ndata/0003/000073\ndata/0003/000074\ndata/0003/000075\ndata/0003/000076\ndata/0003/000077\ndata/0003/000078\ndata/0003/000079\ndata/0003/000080\ndata/0003/000081\ndata/0003/000082\ndata/0003/000083\ndata/0003/000084\ndata/0003/000085\ndata/0003/000086\ndata/0003/000087\ndata/0003/000088\ndata/0003/000089\ndata/0003/000090\ndata/0003/000091\ndata/0003/000092\ndata/0003/000093\ndata/0003/000094\ndata/0003/000095\ndata/0003/000096\ndata/0003/000097\ndata/0003/000098\ndata/0003/000099\ndata/0003/000100\ndata/0003/000101\ndata/0003/000102\ndata/0003/000103\ndata/0003/000104\ndata/0003/000105\ndata/0003/000106\ndata/0003/000107\ndata/0003/000108\ndata/0003/000109\ndata/0003/000110\ndata/0003/000111\ndata/0003/000112\ndata/0003/000113\ndata/0003/000114\ndata/0003/000115\ndata/0003/000116\ndata/0003/000117\ndata/0003/000118\ndata/0003/000119\ndata/0003/000120\ndata/0003/000121\ndata/0003/000122\ndata/0003/000123\ndata/0003/000124\ndata/0003/000125\ndata/0003/000126\ndata/0003/000127\ndata/0003/000128\ndata/0003/000129\ndata/0003/000130\ndata/0003/000131\ndata/0003/000132\ndata/0003/000133\ndata/0003/000134\ndata/0003/000135\ndata/0003/000136\ndata/0003/000137\ndata/0003/000138\ndata/0003/000139\ndata/0003/000140\ndata/0003/000141\ndata/0003/000142\ndata/0003/000143\ndata/0003/000144\ndata/0003/000145\ndata/0003/000146\ndata/0003/000147\ndata/0003/000148\ndata/0003/000149\ndata/0003/000150\ndata/0003/000151\ndata/0003/000152\ndata/0003/000153\ndata/0003/000154\ndata/0003/000155\ndata/0003/000156\ndata/0003/000157\ndata/0003/000158\ndata/0003/000159\ndata/0003/000160\ndata/0003/000161\ndata/0003/000162\ndata/0003/000163\ndata/0003/000164\ndata/0003/000165\ndata/0003/000166\ndata/0003/000167\ndata/0003/000168\ndata/0003/000169\ndata/0003/000170\ndata/0003/000171\ndata/0003/000172\ndata/0003/000173\ndata/0003/000174\ndata/0003/000175\ndata/0003/000176\ndata/0003/000177\ndata/0003/000178\ndata/0003/000179\ndata/0003/000180\ndata/0003/000181\ndata/0003/000182\ndata/0003/000183\ndata/0003/000184\ndata/0003/000185\ndata/0003/000186\ndata/0003/000187\ndata/0003/000188\ndata/0003/000189\ndata/0003/000190\ndata/0003/000191\ndata/0003/000192\ndata/0003/000193\ndata/0003/000194\ndata/0003/000195\ndata/0003/000196\ndata/0003/000197\ndata/0003/000198\ndata/0003/000199\ndata/0003/000200\ndata/0003/000201\ndata/0003/000202\ndata/0003/000203\ndata/0003/000204\ndata/0003/000205\ndata/0003/000206\ndata/0003/000207\ndata/0003/000208\ndata/0003/000209\ndata/0003/000210\ndata/0003/000211\ndata/0003/000212\ndata/0003/000213\ndata/0003/000214\ndata/0003/000215\ndata/0003/000216\ndata/0003/000217\ndata/0003/000218\ndata/0003/000219\ndata/0003/000220\ndata/0003/000221\ndata/0003/000222\ndata/0003/000223\ndata/0003/000224\ndata/0003/000225\ndata/0003/000226\ndata/0003/000227\ndata/0003/000228\ndata/0003/000229\ndata/0003/000230\ndata/0003/000231\ndata/0003/000232\ndata/0003/000233\ndata/0003/000234\ndata/0003/000235\ndata/0003/000236\ndata/0003/000237\ndata/0003/000238\ndata/0003/000239\ndata/0003/000240\ndata/0003/000241\ndata/0003/000242\ndata/0003/000243\ndata/0003/000244\ndata/0003/000245\ndata/0003/000246\ndata/0003/000247\ndata/0003/000248\ndata/0003/000249\ndata/0003/000250\ndata/0003/000251\ndata/0003/000252\ndata/0003/000253\ndata/0003/000254\ndata/0003/000255\ndata/0003/000256\ndata/0003/000257\ndata/0003/000258\ndata/0003/000259\ndata/0003/000260\ndata/0003/000261\ndata/0003/000262\ndata/0003/000263\ndata/0003/000264\ndata/0003/000265\ndata/0003/000266\ndata/0003/000267\ndata/0003/000268\ndata/0003/000269\ndata/0003/000270\ndata/0003/000271\ndata/0003/000272\ndata/0003/000273\ndata/0003/000274\ndata/0003/000275\ndata/0003/000276\ndata/0003/000277\ndata/0003/000278\ndata/0003/000279\ndata/0003/000280\ndata/0003/000281\ndata/0003/000282\ndata/0003/000283\ndata/0003/000284\ndata/0003/000285\ndata/0003/000286\ndata/0003/000287\ndata/0003/000288\ndata/0003/000289\ndata/0003/000290\ndata/0003/000291\ndata/0003/000292\ndata/0003/000293\ndata/0003/000294\ndata/0003/000295\ndata/0003/000296\ndata/0003/000297\ndata/0003/000298\ndata/0003/000299\ndata/0003/000300\ndata/0003/000301\ndata/0003/000302\ndata/0003/000303\ndata/0003/000304\ndata/0003/000305\ndata/0003/000306\ndata/0003/000307\ndata/0003/000308\ndata/0003/000309\ndata/0003/000310\ndata/0003/000311\ndata/0003/000312\ndata/0003/000313\ndata/0003/000314\ndata/0003/000315\ndata/0003/000316\ndata/0003/000317\ndata/0003/000318\ndata/0003/000319\ndata/0003/000320\ndata/0003/000321\ndata/0003/000322\ndata/0003/000323\ndata/0003/000324\ndata/0003/000325\ndata/0003/000326\ndata/0003/000327\ndata/0003/000328\ndata/0003/000329\ndata/0003/000330\ndata/0003/000331\ndata/0003/000332\ndata/0003/000333\ndata/0003/000334\ndata/0003/000335\ndata/0003/000336\ndata/0003/000337\ndata/0003/000338\ndata/0003/000339\ndata/0003/000340\ndata/0003/000341\ndata/0003/000342\ndata/0003/000343\ndata/0003/000344\ndata/0003/000345\ndata/0003/000346\ndata/0003/000347\ndata/0003/000348\ndata/0003/000349\ndata/0003/000350\ndata/0003/000351\ndata/0003/000352\ndata/0003/000353\ndata/0003/000354\ndata/0003/000355\ndata/0003/000356\ndata/0003/000357\ndata/0003/000358\ndata/0003/000359\ndata/0003/000360\ndata/0003/000361\ndata/0003/000362\ndata/0003/000363\ndata/0003/000364\ndata/0003/000365\ndata/0003/000366\ndata/0003/000367\ndata/0003/000368\ndata/0003/000369\ndata/0003/000370\ndata/0003/000371\ndata/0003/000372\ndata/0003/000373\ndata/0003/000374\ndata/0003/000375\ndata/0003/000376\ndata/0003/000377\ndata/0003/000378\ndata/0003/000379\ndata/0003/000380\ndata/0003/000381\ndata/0003/000382\ndata/0003/000383\ndata/0003/000384\ndata/0003/000385\ndata/0003/000386\ndata/0003/000387\ndata/0003/000388\ndata/0003/000389\ndata/0003/000390\ndata/0003/000391\ndata/0003/000392\ndata/0003/000393\ndata/0003/000394\ndata/0003/000395\ndata/0003/000396\ndata/0003/000397\ndata/0003/000398\ndata/0003/000399\ndata/0003/000400\ndata/0003/000401\ndata/0003/000402\ndata/0003/000403\ndata/0003/000404\ndata/0003/000405\ndata/0003/000406\ndata/0003/000407\ndata/0003/000408\ndata/0003/000409\ndata/0003/000410\ndata/0003/000411\ndata/0003/000412\ndata/0003/000413\ndata/0003/000414\ndata/0003/000415\ndata/0003/000416\ndata/0003/000417\ndata/0003/000418\ndata/0003/000419\ndata/0003/000420\ndata/0003/000421\ndata/0003/000422\ndata/0003/000423\ndata/0003/000424\ndata/0003/000425\ndata/0003/000426\ndata/0003/000427\ndata/0003/000428\ndata/0003/000429\ndata/0003/000430\ndata/0003/000431\ndata/0003/000432\ndata/0003/000433\ndata/0003/000434\ndata/0003/000435\ndata/0003/000436\ndata/0003/000437\ndata/0003/000438\ndata/0003/000439\ndata/0003/000440\ndata/0003/000441\ndata/0003/000442\ndata/0003/000443\ndata/0003/000444\ndata/0003/000445\ndata/0003/000446\ndata/0003/000447\ndata/0003/000448\ndata/0003/000449\ndata/0003/000450\ndata/0003/000451\ndata/0003/000452\ndata/0003/000453\ndata/0003/000454\ndata/0003/000455\ndata/0003/000456\ndata/0003/000457\ndata/0003/000458\ndata/0003/000459\ndata/0003/000460\ndata/0003/000461\ndata/0003/000462\ndata/0003/000463\ndata/0003/000464\ndata/0003/000465\ndata/0003/000466\ndata/0003/000467\ndata/0003/000468\ndata/0003/000469\ndata/0003/000470\ndata/0003/000471\ndata/0003/000472\ndata/0003/000473\ndata/0003/000474\ndata/0003/000475\ndata/0003/000476\ndata/0003/000477\ndata/0003/000478\ndata/0003/000479\ndata/0003/000480\ndata/0003/000481\ndata/0003/000482\ndata/0003/000483\ndata/0003/000484\ndata/0003/000485\ndata/0003/000486\ndata/0003/000487\ndata/0003/000488\ndata/0003/000489\ndata/0003/000490\ndata/0003/000491\ndata/0003/000492\ndata/0003/000493\ndata/0003/000494\ndata/0003/000495\ndata/0003/000496\ndata/0003/000497\ndata/0003/000498\ndata/0003/000499\ndata/0003/000500\ndata/0003/000501\ndata/0003/000502\ndata/0003/000503\ndata/0003/000504\ndata/0003/000505\ndata/0003/000506\ndata/0003/000507\ndata/0003/000508\ndata/0003/000509\ndata/0003/000510\ndata/0003/000511\ndata/0003/000512\ndata/0003/000513\ndata/0003/000514\ndata/0003/000515\ndata/0003/000516\ndata/0003/000517\ndata/0003/000518\ndata/0003/000519\ndata/0003/000520\ndata/0003/000521\ndata/0003/000522\ndata/0003/000523\ndata/0003/000524\ndata/0003/000525\ndata/0003/000526\ndata/0003/000527\ndata/0003/000528\ndata/0003/000529\ndata/0003/000530\ndata/0003/000531\ndata/0003/000532\ndata/0003/000533\ndata/0003/000534\ndata/0003/000535\ndata/0003/000536\ndata/0003/000537\ndata/0003/000538\ndata/0003/000539\ndata/0003/000540\ndata/0003/000541\ndata/0003/000542\ndata/0003/000543\ndata/0003/000544\ndata/0003/000545\ndata/0003/000546\ndata/0003/000547\ndata/0003/000548\ndata/0003/000549\ndata/0003/000550\ndata/0003/000551\ndata/0003/000552\ndata/0003/000553\ndata/0003/000554\ndata/0003/000555\ndata/0003/000556\ndata/0003/000557\ndata/0003/000558\ndata/0003/000559\ndata/0003/000560\ndata/0003/000561\ndata/0003/000562\ndata/0003/000563\ndata/0003/000564\ndata/0003/000565\ndata/0003/000566\ndata/0003/000567\ndata/0003/000568\ndata/0003/000569\ndata/0003/000570\ndata/0003/000571\ndata/0003/000572\ndata/0003/000573\ndata/0003/000574\ndata/0003/000575\ndata/0003/000576\ndata/0003/000577\ndata/0003/000578\ndata/0003/000579\ndata/0003/000580\ndata/0003/000581\ndata/0003/000582\ndata/0003/000583\ndata/0003/000584\ndata/0003/000585\ndata/0003/000586\ndata/0003/000587\ndata/0003/000588\ndata/0003/000589\ndata/0003/000590\ndata/0003/000591\ndata/0003/000592\ndata/0003/000593\ndata/0003/000594\ndata/0003/000595\ndata/0003/000596\ndata/0003/000597\ndata/0003/000598\ndata/0003/000599\ndata/0003/000600\ndata/0003/000601\ndata/0003/000602\ndata/0003/000603\ndata/0003/000604\ndata/0003/000605\ndata/0003/000606\ndata/0003/000607\ndata/0003/000608\ndata/0003/000609\ndata/0003/000610\ndata/0003/000611\ndata/0003/000612\ndata/0003/000613\ndata/0003/000614\ndata/0003/000615\ndata/0003/000616\ndata/0003/000617\ndata/0003/000618\ndata/0003/000619\ndata/0003/000620\ndata/0003/000621\ndata/0003/000622\ndata/0003/000623\ndata/0003/000624\ndata/0003/000625\ndata/0003/000626\ndata/0003/000627\ndata/0003/000628\ndata/0003/000629\ndata/0003/000630\ndata/0003/000631\ndata/0003/000632\ndata/0003/000633\ndata/0003/000634\ndata/0003/000635\ndata/0003/000636\ndata/0003/000637\ndata/0003/000638\ndata/0003/000639\ndata/0003/000640\ndata/0003/000641\ndata/0003/000642\ndata/0003/000643\ndata/0003/000644\ndata/0003/000645\ndata/0003/000646\ndata/0003/000647\ndata/0003/000648\ndata/0003/000649\ndata/0003/000650\ndata/0003/000651\ndata/0003/000652\ndata/0003/000653\ndata/0003/000654\ndata/0003/000655\ndata/0003/000656\ndata/0003/000657\ndata/0003/000658\ndata/0003/000659\ndata/0003/000660\ndata/0003/000661\ndata/0003/000662\ndata/0003/000663\ndata/0003/000664\ndata/0003/000665\ndata/0003/000666\ndata/0003/000667\ndata/0003/000668\ndata/0003/000669\ndata/0003/000670\ndata/0003/000671\ndata/0003/000672\ndata/0003/000673\ndata/0003/000674\ndata/0003/000675\ndata/0003/000676\ndata/0003/000677\ndata/0003/000678\ndata/0003/000679\ndata/0003/000680\ndata/0003/000681\ndata/0003/000682\ndata/0003/000683\ndata/0003/000684\ndata/0003/000685\ndata/0003/000686\ndata/0003/000687\ndata/0003/000688\ndata/0003/000689\ndata/0003/000690\ndata/0003/000691\ndata/0003/000692\ndata/0003/000693\ndata/0003/000694\ndata/0003/000695\ndata/0003/000696\ndata/0003/000697\ndata/0003/000698\ndata/0003/000699\ndata/0003/000700\ndata/0003/000701\ndata/0003/000702\ndata/0003/000703\ndata/0003/000704\ndata/0003/000705\ndata/0003/000706\ndata/0003/000707\ndata/0003/000708\ndata/0003/000709\ndata/0003/000710\ndata/0003/000711\ndata/0003/000712\ndata/0003/000713\ndata/0003/000714\ndata/0003/000715\ndata/0003/000716\ndata/0003/000717\ndata/0003/000718\ndata/0003/000719\ndata/0003/000720\ndata/0003/000721\ndata/0003/000722\ndata/0003/000723\ndata/0003/000724\ndata/0003/000725\ndata/0003/000726\ndata/0003/000727\ndata/0003/000728\ndata/0003/000729\ndata/0003/000730\ndata/0003/000731\ndata/0003/000732\ndata/0003/000733\ndata/0003/000734\ndata/0003/000735\ndata/0003/000736\ndata/0003/000737\ndata/0003/000738\ndata/0003/000739\ndata/0003/000740\ndata/0003/000741\ndata/0003/000742\ndata/0003/000743\ndata/0003/000744\ndata/0003/000745\ndata/0003/000746\ndata/0003/000747\ndata/0003/000748\ndata/0003/000749\ndata/0003/000750\ndata/0003/000751\ndata/0003/000752\ndata/0003/000753\ndata/0003/000754\ndata/0003/000755\ndata/0003/000756\ndata/0003/000757\ndata/0003/000758\ndata/0003/000759\ndata/0003/000760\ndata/0003/000761\ndata/0003/000762\ndata/0003/000763\ndata/0003/000764\ndata/0003/000765\ndata/0003/000766\ndata/0003/000767\ndata/0003/000768\ndata/0003/000769\ndata/0003/000770\ndata/0003/000771\ndata/0003/000772\ndata/0003/000773\ndata/0003/000774\ndata/0003/000775\ndata/0003/000776\ndata/0003/000777\ndata/0003/000778\ndata/0003/000779\ndata/0003/000780\ndata/0003/000781\ndata/0003/000782\ndata/0003/000783\ndata/0003/000784\ndata/0003/000785\ndata/0003/000786\ndata/0003/000787\ndata/0003/000788\ndata/0003/000789\ndata/0003/000790\ndata/0003/000791\ndata/0003/000792\ndata/0003/000793\ndata/0003/000794\ndata/0003/000795\ndata/0003/000796\ndata/0003/000797\ndata/0003/000798\ndata/0003/000799\ndata/0003/000800\ndata/0003/000801\ndata/0003/000802\ndata/0003/000803\ndata/0003/000804\ndata/0003/000805\ndata/0003/000806\ndata/0003/000807\ndata/0003/000808\ndata/0003/000809\ndata/0003/000810\ndata/0003/000811\ndata/0003/000812\ndata/0003/000813\ndata/0003/000814\ndata/0003/000815\ndata/0003/000816\ndata/0003/000817\ndata/0003/000818\ndata/0003/000819\ndata/0003/000820\ndata/0003/000821\ndata/0003/000822\ndata/0003/000823\ndata/0003/000824\ndata/0003/000825\ndata/0003/000826\ndata/0003/000827\ndata/0003/000828\ndata/0003/000829\ndata/0003/000830\ndata/0003/000831\ndata/0003/000832\ndata/0003/000833\ndata/0003/000834\ndata/0003/000835\ndata/0003/000836\ndata/0003/000837\ndata/0003/000838\ndata/0003/000839\ndata/0003/000840\ndata/0003/000841\ndata/0003/000842\ndata/0003/000843\ndata/0003/000844\ndata/0003/000845\ndata/0003/000846\ndata/0003/000847\ndata/0003/000848\ndata/0003/000849\ndata/0003/000850\ndata/0003/000851\ndata/0003/000852\ndata/0003/000853\ndata/0003/000854\ndata/0003/000855\ndata/0003/000856\ndata/0003/000857\ndata/0003/000858\ndata/0003/000859\ndata/0003/000860\ndata/0003/000861\ndata/0003/000862\ndata/0003/000863\ndata/0003/000864\ndata/0003/000865\ndata/0003/000866\ndata/0003/000867\ndata/0003/000868\ndata/0003/000869\ndata/0003/000870\ndata/0003/000871\ndata/0003/000872\ndata/0003/000873\ndata/0003/000874\ndata/0003/000875\ndata/0003/000876\ndata/0003/000877\ndata/0003/000878\ndata/0003/000879\ndata/0003/000880\ndata/0003/000881\ndata/0003/000882\ndata/0003/000883\ndata/0003/000884\ndata/0003/000885\ndata/0003/000886\ndata/0003/000887\ndata/0003/000888\ndata/0003/000889\ndata/0003/000890\ndata/0003/000891\ndata/0003/000892\ndata/0003/000893\ndata/0003/000894\ndata/0003/000895\ndata/0003/000896\ndata/0003/000897\ndata/0003/000898\ndata/0003/000899\ndata/0003/000900\ndata/0003/000901\ndata/0003/000902\ndata/0003/000903\ndata/0003/000904\ndata/0003/000905\ndata/0003/000906\ndata/0003/000907\ndata/0003/000908\ndata/0003/000909\ndata/0003/000910\ndata/0003/000911\ndata/0003/000912\ndata/0003/000913\ndata/0003/000914\ndata/0003/000915\ndata/0003/000916\ndata/0003/000917\ndata/0003/000918\ndata/0003/000919\ndata/0003/000920\ndata/0003/000921\ndata/0003/000922\ndata/0003/000923\ndata/0003/000924\ndata/0003/000925\ndata/0003/000926\ndata/0003/000927\ndata/0003/000928\ndata/0003/000929\ndata/0003/000930\ndata/0003/000931\ndata/0003/000932\ndata/0003/000933\ndata/0003/000934\ndata/0003/000935\ndata/0003/000936\ndata/0003/000937\ndata/0003/000938\ndata/0003/000939\ndata/0003/000940\ndata/0003/000941\ndata/0003/000942\ndata/0003/000943\ndata/0003/000944\ndata/0003/000945\ndata/0003/000946\ndata/0003/000947\ndata/0003/000948\ndata/0003/000949\ndata/0003/000950\ndata/0003/000951\ndata/0003/000952\ndata/0003/000953\ndata/0003/000954\ndata/0003/000955\ndata/0003/000956\ndata/0003/000957\ndata/0003/000958\ndata/0003/000959\ndata/0003/000960\ndata/0003/000961\ndata/0003/000962\ndata/0003/000963\ndata/0003/000964\ndata/0003/000965\ndata/0003/000966\ndata/0003/000967\ndata/0003/000968\ndata/0003/000969\ndata/0003/000970\ndata/0003/000971\ndata/0003/000972\ndata/0003/000973\ndata/0003/000974\ndata/0003/000975\ndata/0003/000976\ndata/0003/000977\ndata/0003/000978\ndata/0003/000979\ndata/0003/000980\ndata/0003/000981\ndata/0003/000982\ndata/0003/000983\ndata/0003/000984\ndata/0003/000985\ndata/0003/000986\ndata/0003/000987\ndata/0003/000988\ndata/0003/000989\ndata/0003/000990\ndata/0003/000991\ndata/0003/000992\ndata/0003/000993\ndata/0003/000994\ndata/0003/000995\ndata/0003/000996\ndata/0003/000997\ndata/0003/000998\ndata/0003/000999\ndata/0003/001000\ndata/0003/001001\ndata/0003/001002\ndata/0003/001003\ndata/0003/001004\ndata/0003/001005\ndata/0003/001006\ndata/0003/001007\ndata/0003/001008\ndata/0003/001009\ndata/0003/001010\ndata/0003/001011\ndata/0003/001012\ndata/0003/001013\ndata/0003/001014\ndata/0003/001015\ndata/0003/001016\ndata/0003/001017\ndata/0003/001018\ndata/0003/001019\ndata/0003/001020\ndata/0003/001021\ndata/0003/001022\ndata/0003/001023\ndata/0003/001024\ndata/0003/001025\ndata/0003/001026\ndata/0003/001027\ndata/0003/001028\ndata/0003/001029\ndata/0003/001030\ndata/0003/001031\ndata/0003/001032\ndata/0003/001033\ndata/0003/001034\ndata/0003/001035\ndata/0003/001036\ndata/0003/001037\ndata/0003/001038\ndata/0003/001039\ndata/0003/001040\ndata/0003/001041\ndata/0003/001042\ndata/0003/001043\ndata/0003/001044\ndata/0003/001045\ndata/0003/001046\ndata/0003/001047\ndata/0003/001048\ndata/0003/001049\ndata/0003/001050\ndata/0003/001051\ndata/0003/001052\ndata/0003/001053\ndata/0003/001054\ndata/0003/001055\ndata/0003/001056\ndata/0003/001057\ndata/0003/001058\ndata/0003/001059\ndata/0003/001060\ndata/0003/001061\ndata/0003/001062\ndata/0003/001063\ndata/0003/001064\ndata/0003/001065\ndata/0003/001066\ndata/0003/001067\ndata/0003/001068\ndata/0003/001069\ndata/0003/001070\ndata/0003/001071\ndata/0003/001072\ndata/0003/001073\ndata/0003/001074\ndata/0003/001075\ndata/0003/001076\ndata/0003/001077\ndata/0003/001078\ndata/0003/001079\ndata/0003/001080\ndata/0003/001081\ndata/0003/001082\ndata/0003/001083\ndata/0003/001084\ndata/0003/001085\ndata/0003/001086\ndata/0003/001087\ndata/0003/001088\ndata/0003/001089\ndata/0003/001090\ndata/0003/001091\ndata/0003/001092\ndata/0003/001093\ndata/0003/001094\ndata/0003/001095\ndata/0003/001096\ndata/0003/001097\ndata/0003/001098\ndata/0003/001099\ndata/0003/001100\ndata/0003/001101\ndata/0003/001102\ndata/0003/001103\ndata/0003/001104\ndata/0003/001105\ndata/0003/001106\ndata/0003/001107\ndata/0003/001108\ndata/0003/001109\ndata/0003/001110\ndata/0003/001111\ndata/0003/001112\ndata/0003/001113\ndata/0003/001114\ndata/0003/001115\ndata/0003/001116\ndata/0003/001117\ndata/0003/001118\ndata/0003/001119\ndata/0003/001120\ndata/0003/001121\ndata/0003/001122\ndata/0003/001123\ndata/0003/001124\ndata/0003/001125\ndata/0003/001126\ndata/0003/001127\ndata/0003/001128\ndata/0003/001129\ndata/0003/001130\ndata/0003/001131\ndata/0003/001132\ndata/0003/001133\ndata/0003/001134\ndata/0003/001135\ndata/0003/001136\ndata/0003/001137\ndata/0003/001138\ndata/0003/001139\ndata/0003/001140\ndata/0003/001141\ndata/0003/001142\ndata/0003/001143\ndata/0003/001144\ndata/0003/001145\ndata/0003/001146\ndata/0003/001147\ndata/0003/001148\ndata/0003/001149\ndata/0003/001150\ndata/0003/001151\ndata/0003/001152\ndata/0003/001153\ndata/0003/001154\ndata/0003/001155\ndata/0003/001156\ndata/0003/001157\ndata/0003/001158\ndata/0003/001159\ndata/0003/001160\ndata/0003/001161\ndata/0003/001162\ndata/0003/001163\ndata/0003/001164\ndata/0003/001165\ndata/0003/001166\ndata/0003/001167\ndata/0003/001168\ndata/0003/001169\ndata/0003/001170\ndata/0003/001171\ndata/0003/001172\ndata/0003/001173\ndata/0003/001174\ndata/0003/001175\ndata/0003/001176\ndata/0003/001177\ndata/0003/001178\ndata/0003/001179\ndata/0003/001180\ndata/0003/001181\ndata/0003/001182\ndata/0003/001183\ndata/0003/001184\ndata/0003/001185\ndata/0003/001186\ndata/0003/001187\ndata/0003/001188\ndata/0003/001189\ndata/0003/001190\ndata/0003/001191\ndata/0003/001192\ndata/0003/001193\ndata/0003/001194\ndata/0003/001195\ndata/0003/001196\ndata/0003/001197\ndata/0003/001198\ndata/0003/001199\ndata/0003/001200\ndata/0003/001201\ndata/0003/001202\ndata/0003/001203\ndata/0003/001204\ndata/0003/001205\ndata/0003/001206\ndata/0003/001207\ndata/0003/001208\ndata/0003/001209\ndata/0003/001210\ndata/0003/001211\ndata/0003/001212\ndata/0003/001213\ndata/0003/001214\ndata/0003/001215\ndata/0003/001216\ndata/0003/001217\ndata/0003/001218\ndata/0003/001219\ndata/0003/001220\ndata/0003/001221\ndata/0003/001222\ndata/0003/001223\ndata/0003/001224\ndata/0003/001225\ndata/0003/001226\ndata/0003/001227\ndata/0003/001228\ndata/0003/001229\ndata/0003/001230\ndata/0003/001231\ndata/0003/001232\ndata/0003/001233\ndata/0003/001234\ndata/0003/001235\ndata/0003/001236\ndata/0003/001237\ndata/0003/001238\ndata/0003/001239\ndata/0003/001240\ndata/0003/001241\ndata/0003/001242\ndata/0003/001243\ndata/0003/001244\ndata/0003/001245\ndata/0003/001246\ndata/0003/001247\ndata/0003/001248\ndata/0003/001249\ndata/0003/001250\ndata/0003/001251\ndata/0003/001252\ndata/0003/001253\ndata/0003/001254\ndata/0003/001255\ndata/0003/001256\ndata/0003/001257\ndata/0003/001258\ndata/0003/001259\ndata/0003/001260\ndata/0003/001261\ndata/0003/001262\ndata/0003/001263\ndata/0003/001264\ndata/0003/001265\ndata/0003/001266\ndata/0003/001267\ndata/0003/001268\ndata/0003/001269\ndata/0003/001270\ndata/0003/001271\ndata/0003/001272\ndata/0003/001273\ndata/0003/001274\ndata/0003/001275\ndata/0003/001276\ndata/0003/001277\ndata/0003/001278\ndata/0003/001279\ndata/0003/001280\ndata/0003/001281\ndata/0003/001282\ndata/0003/001283\ndata/0003/001284\ndata/0003/001285\ndata/0003/001286\ndata/0003/001287\ndata/0003/001288\ndata/0003/001289\ndata/0003/001290\ndata/0003/001291\ndata/0003/001292\ndata/0003/001293\ndata/0003/001294\ndata/0003/001295\ndata/0003/001296\ndata/0003/001297\ndata/0003/001298\ndata/0003/001299\ndata/0003/001300\ndata/0003/001301\ndata/0003/001302\ndata/0003/001303\ndata/0003/001304\ndata/0003/001305\ndata/0003/001306\ndata/0003/001307\ndata/0003/001308\ndata/0003/001309\ndata/0003/001310\ndata/0003/001311\ndata/0003/001312\ndata/0003/001313\ndata/0003/001314\ndata/0003/001315\ndata/0003/001316\ndata/0003/001317\ndata/0003/001318\ndata/0003/001319\ndata/0003/001320\ndata/0003/001321\ndata/0003/001322\ndata/0003/001323\ndata/0003/001324\ndata/0003/001325\ndata/0003/001326\ndata/0003/001327\ndata/0003/001328\ndata/0003/001329\ndata/0003/001330\ndata/0003/001331\ndata/0003/001332\ndata/0003/001333\ndata/0003/001334\ndata/0003/001335\ndata/0003/001336\ndata/0003/001337\ndata/0003/001338\ndata/0003/001339\ndata/0003/001340\ndata/0003/001341\ndata/0003/001342\ndata/0003/001343\ndata/0003/001344\ndata/0003/001345\ndata/0003/001346\ndata/0003/001347\ndata/0003/001348\ndata/0003/001349\ndata/0003/001350\ndata/0003/001351\ndata/0003/001352\ndata/0003/001353\ndata/0003/001354\ndata/0003/001355\ndata/0003/001356\ndata/0003/001357\ndata/0003/001358\ndata/0003/001359\ndata/0003/001360\ndata/0003/001361\ndata/0003/001362\ndata/0003/001363\ndata/0003/001364\ndata/0003/001365\ndata/0003/001366\ndata/0003/001367\ndata/0003/001368\ndata/0003/001369\ndata/0003/001370\ndata/0003/001371\ndata/0003/001372\ndata/0003/001373\ndata/0003/001374\ndata/0003/001375\ndata/0003/001376\ndata/0003/001377\ndata/0003/001378\ndata/0003/001379\ndata/0003/001380\ndata/0003/001381\ndata/0003/001382\ndata/0003/001383\ndata/0003/001384\ndata/0003/001385\ndata/0003/001386\ndata/0003/001387\ndata/0003/001388\ndata/0003/001389\ndata/0003/001390\ndata/0003/001391\ndata/0003/001392\ndata/0003/001393\ndata/0003/001394\ndata/0003/001395\ndata/0003/001396\ndata/0003/001397\ndata/0003/001398\ndata/0003/001399\ndata/0003/001400\ndata/0003/001401\ndata/0003/001402\ndata/0003/001403\ndata/0003/001404\ndata/0003/001405\ndata/0003/001406\ndata/0003/001407\ndata/0003/001408\ndata/0003/001409\ndata/0003/001410\ndata/0003/001411\ndata/0003/001412\ndata/0003/001413\ndata/0003/001414\ndata/0003/001415\ndata/0003/001416\ndata/0003/001417\ndata/0003/001418\ndata/0003/001419\ndata/0003/001420\ndata/0003/001421\ndata/0003/001422\ndata/0003/001423\ndata/0003/001424\ndata/0003/001425\ndata/0003/001426\ndata/0003/001427\ndata/0003/001428\ndata/0003/001429\ndata/0003/001430\ndata/0003/001431\ndata/0003/001432\ndata/0003/001433\ndata/0003/001434\ndata/0003/001435\ndata/0003/001436\ndata/0003/001437\ndata/0003/001438\ndata/0003/001439\ndata/0003/001440\ndata/0003/001441\ndata/0003/001442\ndata/0003/001443\ndata/0003/001444\ndata/0003/001445\ndata/0003/001446\ndata/0003/001447\ndata/0003/001448\ndata/0003/001449\ndata/0003/001450\ndata/0003/001451\ndata/0003/001452\ndata/0003/001453\ndata/0003/001454\ndata/0003/001455\ndata/0003/001456\ndata/0003/001457\ndata/0003/001458\ndata/0003/001459\ndata/0003/001460\ndata/0003/001461\ndata/0003/001462\ndata/0003/001463\ndata/0003/001464\ndata/0003/001465\ndata/0003/001466\ndata/0003/001467\ndata/0003/001468\ndata/0003/001469\ndata/0003/001470\ndata/0003/001471\ndata/0003/001472\ndata/0003/001473\ndata/0003/001474\ndata/0003/001475\ndata/0003/001476\ndata/0003/001477\ndata/0003/001478\ndata/0003/001479\ndata/0003/001480\ndata/0003/001481\ndata/0003/001482\ndata/0003/001483\ndata/0003/001484\ndata/0003/001485\ndata/0003/001486\ndata/0003/001487\ndata/0003/001488\ndata/0003/001489\ndata/0003/001490\ndata/0003/001491\ndata/0003/001492\ndata/0003/001493\ndata/0003/001494\ndata/0003/001495\ndata/0003/001496\ndata/0003/001497\ndata/0003/001498\ndata/0003/001499\ndata/0003/001500\ndata/0003/001501\ndata/0003/001502\ndata/0003/001503\ndata/0003/001504\ndata/0003/001505\ndata/0003/001506\ndata/0003/001507\ndata/0003/001508\ndata/0003/001509\ndata/0003/001510\ndata/0003/001511\ndata/0003/001512\ndata/0003/001513\ndata/0003/001514\ndata/0003/001515\ndata/0003/001516\ndata/0003/001517\ndata/0003/001518\ndata/0003/001519\ndata/0003/001520\ndata/0003/001521\ndata/0003/001522\ndata/0003/001523\ndata/0003/001524\ndata/0003/001525\ndata/0003/001526\ndata/0003/001527\ndata/0003/001528\ndata/0003/001529\ndata/0003/001530\ndata/0003/001531\ndata/0003/001532\ndata/0003/001533\ndata/0003/001534\ndata/0003/001535\ndata/0003/001536\ndata/0003/001537\ndata/0003/001538\ndata/0003/001539\ndata/0003/001540\ndata/0003/001541\ndata/0003/001542\ndata/0003/001543\ndata/0003/001544\ndata/0003/001545\ndata/0003/001546\ndata/0003/001547\ndata/0003/001548\ndata/0003/001549\ndata/0003/001550\ndata/0003/001551\ndata/0003/001552\ndata/0003/001553\ndata/0003/001554\ndata/0003/001555\ndata/0003/001556\ndata/0003/001557\ndata/0003/001558\ndata/0003/001559\ndata/0003/001560\ndata/0003/001561\ndata/0003/001562\ndata/0003/001563\ndata/0003/001564\ndata/0003/001565\ndata/0003/001566\ndata/0003/001567\ndata/0003/001568\ndata/0003/001569\ndata/0003/001570\ndata/0003/001571\ndata/0003/001572\ndata/0003/001573\ndata/0003/001574\ndata/0003/001575\ndata/0003/001576\ndata/0003/001577\ndata/0003/001578\ndata/0003/001579\ndata/0003/001580\ndata/0003/001581\ndata/0003/001582\ndata/0003/001583\ndata/0003/001584\ndata/0003/001585\ndata/0003/001586\ndata/0003/001587\ndata/0003/001588\ndata/0003/001589\ndata/0003/001590\ndata/0003/001591\ndata/0003/001592\ndata/0003/001593\ndata/0003/001594\ndata/0003/001595\ndata/0003/001596\ndata/0003/001597\ndata/0003/001598\ndata/0003/001599\ndata/0003/001600\ndata/0003/001601\ndata/0003/001602\ndata/0003/001603\ndata/0003/001604\ndata/0003/001605\ndata/0003/001606\ndata/0003/001607\ndata/0003/001608\ndata/0003/001609\ndata/0003/001610\ndata/0003/001611\ndata/0003/001612\ndata/0003/001613\ndata/0003/001614\ndata/0003/001615\ndata/0003/001616\ndata/0003/001617\ndata/0003/001618\ndata/0003/001619\ndata/0003/001620\ndata/0003/001621\ndata/0003/001622\ndata/0003/001623\ndata/0003/001624\ndata/0003/001625\ndata/0003/001626\ndata/0003/001627\ndata/0011/000001\ndata/0011/000002\ndata/0011/000003\ndata/0011/000004\ndata/0011/000005\ndata/0011/000006\ndata/0011/000007\ndata/0011/000008\ndata/0011/000009\ndata/0011/000010\ndata/0011/000011\ndata/0011/000012\ndata/0011/000013\ndata/0011/000014\ndata/0011/000015\ndata/0011/000016\ndata/0011/000017\ndata/0011/000018\ndata/0011/000019\ndata/0011/000020\ndata/0011/000021\ndata/0011/000022\ndata/0011/000023\ndata/0011/000024\ndata/0011/000025\ndata/0011/000026\ndata/0011/000027\ndata/0011/000028\ndata/0011/000029\ndata/0011/000030\ndata/0011/000031\ndata/0011/000032\ndata/0011/000033\ndata/0011/000034\ndata/0011/000035\ndata/0011/000036\ndata/0011/000037\ndata/0011/000038\ndata/0011/000039\ndata/0011/000040\ndata/0011/000041\ndata/0011/000042\ndata/0011/000043\ndata/0011/000044\ndata/0011/000045\ndata/0011/000046\ndata/0011/000047\ndata/0011/000048\ndata/0011/000049\ndata/0011/000050\ndata/0011/000051\ndata/0011/000052\ndata/0011/000053\ndata/0011/000054\ndata/0011/000055\ndata/0011/000056\ndata/0011/000057\ndata/0011/000058\ndata/0011/000059\ndata/0011/000060\ndata/0011/000061\ndata/0011/000062\ndata/0011/000063\ndata/0011/000064\ndata/0011/000065\ndata/0011/000066\ndata/0011/000067\ndata/0011/000068\ndata/0011/000069\ndata/0011/000070\ndata/0011/000071\ndata/0011/000072\ndata/0011/000073\ndata/0011/000074\ndata/0011/000075\ndata/0011/000076\ndata/0011/000077\ndata/0011/000078\ndata/0011/000079\ndata/0011/000080\ndata/0011/000081\ndata/0011/000082\ndata/0011/000083\ndata/0011/000084\ndata/0011/000085\ndata/0011/000086\ndata/0011/000087\ndata/0011/000088\ndata/0011/000089\ndata/0011/000090\ndata/0011/000091\ndata/0011/000092\ndata/0011/000093\ndata/0011/000094\ndata/0011/000095\ndata/0011/000096\ndata/0011/000097\ndata/0011/000098\ndata/0011/000099\ndata/0011/000100\ndata/0011/000101\ndata/0011/000102\ndata/0011/000103\ndata/0011/000104\ndata/0011/000105\ndata/0011/000106\ndata/0011/000107\ndata/0011/000108\ndata/0011/000109\ndata/0011/000110\ndata/0011/000111\ndata/0011/000112\ndata/0011/000113\ndata/0011/000114\ndata/0011/000115\ndata/0011/000116\ndata/0011/000117\ndata/0011/000118\ndata/0011/000119\ndata/0011/000120\ndata/0011/000121\ndata/0011/000122\ndata/0011/000123\ndata/0011/000124\ndata/0011/000125\ndata/0011/000126\ndata/0011/000127\ndata/0011/000128\ndata/0011/000129\ndata/0011/000130\ndata/0011/000131\ndata/0011/000132\ndata/0011/000133\ndata/0011/000134\ndata/0011/000135\ndata/0011/000136\ndata/0011/000137\ndata/0011/000138\ndata/0011/000139\ndata/0011/000140\ndata/0011/000141\ndata/0011/000142\ndata/0011/000143\ndata/0011/000144\ndata/0011/000145\ndata/0011/000146\ndata/0011/000147\ndata/0011/000148\ndata/0011/000149\ndata/0011/000150\ndata/0011/000151\ndata/0011/000152\ndata/0011/000153\ndata/0011/000154\ndata/0011/000155\ndata/0011/000156\ndata/0011/000157\ndata/0011/000158\ndata/0011/000159\ndata/0011/000160\ndata/0011/000161\ndata/0011/000162\ndata/0011/000163\ndata/0011/000164\ndata/0011/000165\ndata/0011/000166\ndata/0011/000167\ndata/0011/000168\ndata/0011/000169\ndata/0011/000170\ndata/0011/000171\ndata/0011/000172\ndata/0011/000173\ndata/0011/000174\ndata/0011/000175\ndata/0011/000176\ndata/0011/000177\ndata/0011/000178\ndata/0011/000179\ndata/0011/000180\ndata/0011/000181\ndata/0011/000182\ndata/0011/000183\ndata/0011/000184\ndata/0011/000185\ndata/0011/000186\ndata/0011/000187\ndata/0011/000188\ndata/0011/000189\ndata/0011/000190\ndata/0011/000191\ndata/0011/000192\ndata/0011/000193\ndata/0011/000194\ndata/0011/000195\ndata/0011/000196\ndata/0011/000197\ndata/0011/000198\ndata/0011/000199\ndata/0011/000200\ndata/0011/000201\ndata/0011/000202\ndata/0011/000203\ndata/0011/000204\ndata/0011/000205\ndata/0011/000206\ndata/0011/000207\ndata/0011/000208\ndata/0011/000209\ndata/0011/000210\ndata/0011/000211\ndata/0011/000212\ndata/0011/000213\ndata/0011/000214\ndata/0011/000215\ndata/0011/000216\ndata/0011/000217\ndata/0011/000218\ndata/0011/000219\ndata/0011/000220\ndata/0011/000221\ndata/0011/000222\ndata/0011/000223\ndata/0011/000224\ndata/0011/000225\ndata/0011/000226\ndata/0011/000227\ndata/0011/000228\ndata/0011/000229\ndata/0011/000230\ndata/0011/000231\ndata/0011/000232\ndata/0011/000233\ndata/0011/000234\ndata/0011/000235\ndata/0011/000236\ndata/0011/000237\ndata/0011/000238\ndata/0011/000239\ndata/0011/000240\ndata/0011/000241\ndata/0011/000242\ndata/0011/000243\ndata/0011/000244\ndata/0011/000245\ndata/0011/000246\ndata/0011/000247\ndata/0011/000248\ndata/0011/000249\ndata/0011/000250\ndata/0011/000251\ndata/0011/000252\ndata/0011/000253\ndata/0011/000254\ndata/0011/000255\ndata/0011/000256\ndata/0011/000257\ndata/0011/000258\ndata/0011/000259\ndata/0011/000260\ndata/0011/000261\ndata/0011/000262\ndata/0011/000263\ndata/0011/000264\ndata/0011/000265\ndata/0011/000266\ndata/0011/000267\ndata/0011/000268\ndata/0011/000269\ndata/0011/000270\ndata/0011/000271\ndata/0011/000272\ndata/0011/000273\ndata/0011/000274\ndata/0011/000275\ndata/0011/000276\ndata/0011/000277\ndata/0011/000278\ndata/0011/000279\ndata/0011/000280\ndata/0011/000281\ndata/0011/000282\ndata/0011/000283\ndata/0011/000284\ndata/0011/000285\ndata/0011/000286\ndata/0011/000287\ndata/0011/000288\ndata/0011/000289\ndata/0011/000290\ndata/0011/000291\ndata/0011/000292\ndata/0011/000293\ndata/0011/000294\ndata/0011/000295\ndata/0011/000296\ndata/0011/000297\ndata/0011/000298\ndata/0011/000299\ndata/0011/000300\ndata/0011/000301\ndata/0011/000302\ndata/0011/000303\ndata/0011/000304\ndata/0011/000305\ndata/0011/000306\ndata/0011/000307\ndata/0011/000308\ndata/0011/000309\ndata/0011/000310\ndata/0011/000311\ndata/0011/000312\ndata/0011/000313\ndata/0011/000314\ndata/0011/000315\ndata/0011/000316\ndata/0011/000317\ndata/0011/000318\ndata/0011/000319\ndata/0011/000320\ndata/0011/000321\ndata/0011/000322\ndata/0011/000323\ndata/0011/000324\ndata/0011/000325\ndata/0011/000326\ndata/0011/000327\ndata/0011/000328\ndata/0011/000329\ndata/0011/000330\ndata/0011/000331\ndata/0011/000332\ndata/0011/000333\ndata/0011/000334\ndata/0011/000335\ndata/0011/000336\ndata/0011/000337\ndata/0011/000338\ndata/0011/000339\ndata/0011/000340\ndata/0011/000341\ndata/0011/000342\ndata/0011/000343\ndata/0011/000344\ndata/0011/000345\ndata/0011/000346\ndata/0011/000347\ndata/0011/000348\ndata/0011/000349\ndata/0011/000350\ndata/0011/000351\ndata/0011/000352\ndata/0011/000353\ndata/0011/000354\ndata/0011/000355\ndata/0011/000356\ndata/0011/000357\ndata/0011/000358\ndata/0011/000359\ndata/0011/000360\ndata/0011/000361\ndata/0011/000362\ndata/0011/000363\ndata/0011/000364\ndata/0011/000365\ndata/0011/000366\ndata/0011/000367\ndata/0011/000368\ndata/0011/000369\ndata/0011/000370\ndata/0011/000371\ndata/0011/000372\ndata/0011/000373\ndata/0011/000374\ndata/0011/000375\ndata/0011/000376\ndata/0011/000377\ndata/0011/000378\ndata/0011/000379\ndata/0011/000380\ndata/0011/000381\ndata/0011/000382\ndata/0011/000383\ndata/0011/000384\ndata/0011/000385\ndata/0011/000386\ndata/0011/000387\ndata/0011/000388\ndata/0011/000389\ndata/0011/000390\ndata/0011/000391\ndata/0011/000392\ndata/0011/000393\ndata/0011/000394\ndata/0011/000395\ndata/0011/000396\ndata/0011/000397\ndata/0011/000398\ndata/0011/000399\ndata/0011/000400\ndata/0011/000401\ndata/0011/000402\ndata/0011/000403\ndata/0011/000404\ndata/0011/000405\ndata/0011/000406\ndata/0011/000407\ndata/0011/000408\ndata/0011/000409\ndata/0011/000410\ndata/0011/000411\ndata/0011/000412\ndata/0011/000413\ndata/0011/000414\ndata/0011/000415\ndata/0011/000416\ndata/0011/000417\ndata/0011/000418\ndata/0011/000419\ndata/0011/000420\ndata/0011/000421\ndata/0011/000422\ndata/0011/000423\ndata/0011/000424\ndata/0011/000425\ndata/0011/000426\ndata/0011/000427\ndata/0011/000428\ndata/0011/000429\ndata/0011/000430\ndata/0011/000431\ndata/0011/000432\ndata/0011/000433\ndata/0011/000434\ndata/0011/000435\ndata/0011/000436\ndata/0011/000437\ndata/0011/000438\ndata/0011/000439\ndata/0011/000440\ndata/0011/000441\ndata/0011/000442\ndata/0011/000443\ndata/0011/000444\ndata/0011/000445\ndata/0011/000446\ndata/0011/000447\ndata/0011/000448\ndata/0011/000449\ndata/0011/000450\ndata/0011/000451\ndata/0011/000452\ndata/0011/000453\ndata/0011/000454\ndata/0011/000455\ndata/0011/000456\ndata/0011/000457\ndata/0011/000458\ndata/0011/000459\ndata/0011/000460\ndata/0011/000461\ndata/0011/000462\ndata/0011/000463\ndata/0011/000464\ndata/0011/000465\ndata/0011/000466\ndata/0011/000467\ndata/0011/000468\ndata/0011/000469\ndata/0011/000470\ndata/0011/000471\ndata/0011/000472\ndata/0011/000473\ndata/0011/000474\ndata/0011/000475\ndata/0011/000476\ndata/0011/000477\ndata/0011/000478\ndata/0011/000479\ndata/0011/000480\ndata/0011/000481\ndata/0011/000482\ndata/0011/000483\ndata/0011/000484\ndata/0011/000485\ndata/0011/000486\ndata/0011/000487\ndata/0011/000488\ndata/0011/000489\ndata/0011/000490\ndata/0011/000491\ndata/0011/000492\ndata/0011/000493\ndata/0011/000494\ndata/0011/000495\ndata/0011/000496\ndata/0011/000497\ndata/0011/000498\ndata/0011/000499\ndata/0011/000500\ndata/0011/000501\ndata/0011/000502\ndata/0011/000503\ndata/0011/000504\ndata/0011/000505\ndata/0011/000506\ndata/0011/000507\ndata/0011/000508\ndata/0011/000509\ndata/0011/000510\ndata/0011/000511\ndata/0011/000512\ndata/0011/000513\ndata/0011/000514\ndata/0011/000515\ndata/0011/000516\ndata/0011/000517\ndata/0011/000518\ndata/0011/000519\ndata/0011/000520\ndata/0011/000521\ndata/0011/000522\ndata/0011/000523\ndata/0011/000524\ndata/0011/000525\ndata/0011/000526\ndata/0011/000527\ndata/0011/000528\ndata/0011/000529\ndata/0011/000530\ndata/0011/000531\ndata/0011/000532\ndata/0011/000533\ndata/0011/000534\ndata/0011/000535\ndata/0011/000536\ndata/0011/000537\ndata/0011/000538\ndata/0011/000539\ndata/0011/000540\ndata/0011/000541\ndata/0011/000542\ndata/0011/000543\ndata/0011/000544\ndata/0011/000545\ndata/0011/000546\ndata/0011/000547\ndata/0011/000548\ndata/0011/000549\ndata/0011/000550\ndata/0011/000551\ndata/0011/000552\ndata/0011/000553\ndata/0011/000554\ndata/0011/000555\ndata/0011/000556\ndata/0011/000557\ndata/0011/000558\ndata/0011/000559\ndata/0011/000560\ndata/0011/000561\ndata/0011/000562\ndata/0011/000563\ndata/0011/000564\ndata/0011/000565\ndata/0011/000566\ndata/0011/000567\ndata/0011/000568\ndata/0011/000569\ndata/0011/000570\ndata/0011/000571\ndata/0011/000572\ndata/0011/000573\ndata/0011/000574\ndata/0011/000575\ndata/0011/000576\ndata/0011/000577\ndata/0011/000578\ndata/0011/000579\ndata/0011/000580\ndata/0011/000581\ndata/0011/000582\ndata/0011/000583\ndata/0011/000584\ndata/0011/000585\ndata/0011/000586\ndata/0011/000587\ndata/0011/000588\ndata/0011/000589\ndata/0011/000590\ndata/0011/000591\ndata/0011/000592\ndata/0011/000593\ndata/0011/000594\ndata/0011/000595\ndata/0011/000596\ndata/0011/000597\ndata/0011/000598\ndata/0011/000599\ndata/0011/000600\ndata/0011/000601\ndata/0011/000602\ndata/0011/000603\ndata/0011/000604\ndata/0011/000605\ndata/0011/000606\ndata/0011/000607\ndata/0011/000608\ndata/0011/000609\ndata/0011/000610\ndata/0011/000611\ndata/0011/000612\ndata/0011/000613\ndata/0011/000614\ndata/0011/000615\ndata/0011/000616\ndata/0011/000617\ndata/0011/000618\ndata/0011/000619\ndata/0011/000620\ndata/0011/000621\ndata/0011/000622\ndata/0011/000623\ndata/0011/000624\ndata/0011/000625\ndata/0011/000626\ndata/0011/000627\ndata/0011/000628\ndata/0011/000629\ndata/0011/000630\ndata/0011/000631\ndata/0011/000632\ndata/0011/000633\ndata/0011/000634\ndata/0011/000635\ndata/0011/000636\ndata/0011/000637\ndata/0011/000638\ndata/0011/000639\ndata/0011/000640\ndata/0011/000641\ndata/0011/000642\ndata/0011/000643\ndata/0011/000644\ndata/0011/000645\ndata/0011/000646\ndata/0011/000647\ndata/0011/000648\ndata/0011/000649\ndata/0011/000650\ndata/0011/000651\ndata/0011/000652\ndata/0011/000653\ndata/0011/000654\ndata/0011/000655\ndata/0011/000656\ndata/0011/000657\ndata/0011/000658\ndata/0011/000659\ndata/0011/000660\ndata/0011/000661\ndata/0011/000662\ndata/0011/000663\ndata/0011/000664\ndata/0011/000665\ndata/0011/000666\ndata/0011/000667\ndata/0011/000668\ndata/0011/000669\ndata/0011/000670\ndata/0011/000671\ndata/0011/000672\ndata/0011/000673\ndata/0011/000674\ndata/0011/000675\ndata/0011/000676\ndata/0011/000677\ndata/0011/000678\ndata/0011/000679\ndata/0011/000680\ndata/0011/000681\ndata/0011/000682\ndata/0011/000683\ndata/0011/000684\ndata/0011/000685\ndata/0011/000686\ndata/0011/000687\ndata/0011/000688\ndata/0011/000689\ndata/0011/000690\ndata/0011/000691\ndata/0011/000692\ndata/0011/000693\ndata/0011/000694\ndata/0011/000695\ndata/0011/000696\ndata/0011/000697\ndata/0011/000698\ndata/0011/000699\ndata/0011/000700\ndata/0011/000701\ndata/0011/000702\ndata/0011/000703\ndata/0011/000704\ndata/0011/000705\ndata/0011/000706\ndata/0011/000707\ndata/0011/000708\ndata/0011/000709\ndata/0011/000710\ndata/0011/000711\ndata/0011/000712\ndata/0011/000713\ndata/0011/000714\ndata/0011/000715\ndata/0011/000716\ndata/0011/000717\ndata/0011/000718\ndata/0011/000719\ndata/0011/000720\ndata/0011/000721\ndata/0011/000722\ndata/0011/000723\ndata/0011/000724\ndata/0011/000725\ndata/0011/000726\ndata/0011/000727\ndata/0011/000728\ndata/0011/000729\ndata/0011/000730\ndata/0011/000731\ndata/0011/000732\ndata/0011/000733\ndata/0011/000734\ndata/0011/000735\ndata/0011/000736\ndata/0011/000737\ndata/0011/000738\ndata/0011/000739\ndata/0011/000740\ndata/0011/000741\ndata/0011/000742\ndata/0011/000743\ndata/0011/000744\ndata/0011/000745\ndata/0011/000746\ndata/0011/000747\ndata/0011/000748\ndata/0011/000749\ndata/0011/000750\ndata/0011/000751\ndata/0011/000752\ndata/0011/000753\ndata/0011/000754\ndata/0011/000755\ndata/0011/000756\ndata/0011/000757\ndata/0011/000758\ndata/0011/000759\ndata/0011/000760\ndata/0011/000761\ndata/0011/000762\ndata/0011/000763\ndata/0011/000764\ndata/0011/000765\ndata/0011/000766\ndata/0011/000767\ndata/0011/000768\ndata/0011/000769\ndata/0011/000770\ndata/0011/000771\ndata/0011/000772\ndata/0011/000773\ndata/0011/000774\ndata/0011/000775\ndata/0011/000776\ndata/0011/000777\ndata/0011/000778\ndata/0011/000779\ndata/0011/000780\ndata/0011/000781\ndata/0011/000782\ndata/0011/000783\ndata/0011/000784\ndata/0011/000785\ndata/0011/000786\ndata/0011/000787\ndata/0011/000788\ndata/0011/000789\ndata/0011/000790\ndata/0011/000791\ndata/0011/000792\ndata/0011/000793\ndata/0011/000794\ndata/0011/000795\ndata/0011/000796\ndata/0011/000797\ndata/0011/000798\ndata/0011/000799\ndata/0011/000800\ndata/0011/000801\ndata/0011/000802\ndata/0011/000803\ndata/0011/000804\ndata/0011/000805\ndata/0011/000806\ndata/0011/000807\ndata/0011/000808\ndata/0011/000809\ndata/0011/000810\ndata/0011/000811\ndata/0011/000812\ndata/0011/000813\ndata/0011/000814\ndata/0011/000815\ndata/0011/000816\ndata/0011/000817\ndata/0011/000818\ndata/0011/000819\ndata/0011/000820\ndata/0011/000821\ndata/0011/000822\ndata/0011/000823\ndata/0011/000824\ndata/0011/000825\ndata/0011/000826\ndata/0011/000827\ndata/0011/000828\ndata/0011/000829\ndata/0011/000830\ndata/0011/000831\ndata/0011/000832\ndata/0011/000833\ndata/0011/000834\ndata/0011/000835\ndata/0011/000836\ndata/0011/000837\ndata/0011/000838\ndata/0011/000839\ndata/0011/000840\ndata/0011/000841\ndata/0011/000842\ndata/0011/000843\ndata/0011/000844\ndata/0011/000845\ndata/0011/000846\ndata/0011/000847\ndata/0011/000848\ndata/0017/000001\ndata/0017/000002\ndata/0017/000003\ndata/0017/000004\ndata/0017/000005\ndata/0017/000006\ndata/0017/000007\ndata/0017/000008\ndata/0017/000009\ndata/0017/000010\ndata/0017/000011\ndata/0017/000012\ndata/0017/000013\ndata/0017/000014\ndata/0017/000015\ndata/0017/000016\ndata/0017/000017\ndata/0017/000018\ndata/0017/000019\ndata/0017/000020\ndata/0017/000021\ndata/0017/000022\ndata/0017/000023\ndata/0017/000024\ndata/0017/000025\ndata/0017/000026\ndata/0017/000027\ndata/0017/000028\ndata/0017/000029\ndata/0017/000030\ndata/0017/000031\ndata/0017/000032\ndata/0017/000033\ndata/0017/000034\ndata/0017/000035\ndata/0017/000036\ndata/0017/000037\ndata/0017/000038\ndata/0017/000039\ndata/0017/000040\ndata/0017/000041\ndata/0017/000042\ndata/0017/000043\ndata/0017/000044\ndata/0017/000045\ndata/0017/000046\ndata/0017/000047\ndata/0017/000048\ndata/0017/000049\ndata/0017/000050\ndata/0017/000051\ndata/0017/000052\ndata/0017/000053\ndata/0017/000054\ndata/0017/000055\ndata/0017/000056\ndata/0017/000057\ndata/0017/000058\ndata/0017/000059\ndata/0017/000060\ndata/0017/000061\ndata/0017/000062\ndata/0017/000063\ndata/0017/000064\ndata/0017/000065\ndata/0017/000066\ndata/0017/000067\ndata/0017/000068\ndata/0017/000069\ndata/0017/000070\ndata/0017/000071\ndata/0017/000072\ndata/0017/000073\ndata/0017/000074\ndata/0017/000075\ndata/0017/000076\ndata/0017/000077\ndata/0017/000078\ndata/0017/000079\ndata/0017/000080\ndata/0017/000081\ndata/0017/000082\ndata/0017/000083\ndata/0017/000084\ndata/0017/000085\ndata/0017/000086\ndata/0017/000087\ndata/0017/000088\ndata/0017/000089\ndata/0017/000090\ndata/0017/000091\ndata/0017/000092\ndata/0017/000093\ndata/0017/000094\ndata/0017/000095\ndata/0017/000096\ndata/0017/000097\ndata/0017/000098\ndata/0017/000099\ndata/0017/000100\ndata/0017/000101\ndata/0017/000102\ndata/0017/000103\ndata/0017/000104\ndata/0017/000105\ndata/0017/000106\ndata/0017/000107\ndata/0017/000108\ndata/0017/000109\ndata/0017/000110\ndata/0017/000111\ndata/0017/000112\ndata/0017/000113\ndata/0017/000114\ndata/0017/000115\ndata/0017/000116\ndata/0017/000117\ndata/0017/000118\ndata/0017/000119\ndata/0017/000120\ndata/0017/000121\ndata/0017/000122\ndata/0017/000123\ndata/0017/000124\ndata/0017/000125\ndata/0017/000126\ndata/0017/000127\ndata/0017/000128\ndata/0017/000129\ndata/0017/000130\ndata/0017/000131\ndata/0017/000132\ndata/0017/000133\ndata/0017/000134\ndata/0017/000135\ndata/0017/000136\ndata/0017/000137\ndata/0017/000138\ndata/0017/000139\ndata/0017/000140\ndata/0017/000141\ndata/0017/000142\ndata/0017/000143\ndata/0017/000144\ndata/0017/000145\ndata/0017/000146\ndata/0017/000147\ndata/0017/000148\ndata/0017/000149\ndata/0017/000150\ndata/0017/000151\ndata/0017/000152\ndata/0017/000153\ndata/0017/000154\ndata/0017/000155\ndata/0017/000156\ndata/0017/000157\ndata/0017/000158\ndata/0017/000159\ndata/0017/000160\ndata/0017/000161\ndata/0017/000162\ndata/0017/000163\ndata/0017/000164\ndata/0017/000165\ndata/0017/000166\ndata/0017/000167\ndata/0017/000168\ndata/0017/000169\ndata/0017/000170\ndata/0017/000171\ndata/0017/000172\ndata/0017/000173\ndata/0017/000174\ndata/0017/000175\ndata/0017/000176\ndata/0017/000177\ndata/0017/000178\ndata/0017/000179\ndata/0017/000180\ndata/0017/000181\ndata/0017/000182\ndata/0017/000183\ndata/0017/000184\ndata/0017/000185\ndata/0017/000186\ndata/0017/000187\ndata/0017/000188\ndata/0017/000189\ndata/0017/000190\ndata/0017/000191\ndata/0017/000192\ndata/0017/000193\ndata/0017/000194\ndata/0017/000195\ndata/0017/000196\ndata/0017/000197\ndata/0017/000198\ndata/0017/000199\ndata/0017/000200\ndata/0017/000201\ndata/0017/000202\ndata/0017/000203\ndata/0017/000204\ndata/0017/000205\ndata/0017/000206\ndata/0017/000207\ndata/0017/000208\ndata/0017/000209\ndata/0017/000210\ndata/0017/000211\ndata/0017/000212\ndata/0017/000213\ndata/0017/000214\ndata/0017/000215\ndata/0017/000216\ndata/0017/000217\ndata/0017/000218\ndata/0017/000219\ndata/0017/000220\ndata/0017/000221\ndata/0017/000222\ndata/0017/000223\ndata/0017/000224\ndata/0017/000225\ndata/0017/000226\ndata/0017/000227\ndata/0017/000228\ndata/0017/000229\ndata/0017/000230\ndata/0017/000231\ndata/0017/000232\ndata/0017/000233\ndata/0017/000234\ndata/0017/000235\ndata/0017/000236\ndata/0017/000237\ndata/0017/000238\ndata/0017/000239\ndata/0017/000240\ndata/0017/000241\ndata/0017/000242\ndata/0017/000243\ndata/0017/000244\ndata/0017/000245\ndata/0017/000246\ndata/0017/000247\ndata/0017/000248\ndata/0017/000249\ndata/0017/000250\ndata/0017/000251\ndata/0017/000252\ndata/0017/000253\ndata/0017/000254\ndata/0017/000255\ndata/0017/000256\ndata/0017/000257\ndata/0017/000258\ndata/0017/000259\ndata/0017/000260\ndata/0017/000261\ndata/0017/000262\ndata/0017/000263\ndata/0017/000264\ndata/0017/000265\ndata/0017/000266\ndata/0017/000267\ndata/0017/000268\ndata/0017/000269\ndata/0017/000270\ndata/0017/000271\ndata/0017/000272\ndata/0017/000273\ndata/0017/000274\ndata/0017/000275\ndata/0017/000276\ndata/0017/000277\ndata/0017/000278\ndata/0017/000279\ndata/0017/000280\ndata/0017/000281\ndata/0017/000282\ndata/0017/000283\ndata/0017/000284\ndata/0017/000285\ndata/0017/000286\ndata/0017/000287\ndata/0017/000288\ndata/0017/000289\ndata/0017/000290\ndata/0017/000291\ndata/0017/000292\ndata/0017/000293\ndata/0017/000294\ndata/0017/000295\ndata/0017/000296\ndata/0017/000297\ndata/0017/000298\ndata/0017/000299\ndata/0017/000300\ndata/0017/000301\ndata/0017/000302\ndata/0017/000303\ndata/0017/000304\ndata/0017/000305\ndata/0017/000306\ndata/0017/000307\ndata/0017/000308\ndata/0017/000309\ndata/0017/000310\ndata/0017/000311\ndata/0017/000312\ndata/0017/000313\ndata/0017/000314\ndata/0017/000315\ndata/0017/000316\ndata/0017/000317\ndata/0017/000318\ndata/0017/000319\ndata/0017/000320\ndata/0017/000321\ndata/0017/000322\ndata/0017/000323\ndata/0017/000324\ndata/0017/000325\ndata/0017/000326\ndata/0017/000327\ndata/0017/000328\ndata/0017/000329\ndata/0017/000330\ndata/0017/000331\ndata/0017/000332\ndata/0017/000333\ndata/0017/000334\ndata/0017/000335\ndata/0017/000336\ndata/0017/000337\ndata/0017/000338\ndata/0017/000339\ndata/0017/000340\ndata/0017/000341\ndata/0017/000342\ndata/0017/000343\ndata/0017/000344\ndata/0017/000345\ndata/0017/000346\ndata/0017/000347\ndata/0017/000348\ndata/0017/000349\ndata/0017/000350\ndata/0017/000351\ndata/0017/000352\ndata/0017/000353\ndata/0017/000354\ndata/0017/000355\ndata/0017/000356\ndata/0017/000357\ndata/0017/000358\ndata/0017/000359\ndata/0017/000360\ndata/0017/000361\ndata/0017/000362\ndata/0017/000363\ndata/0017/000364\ndata/0017/000365\ndata/0017/000366\ndata/0017/000367\ndata/0017/000368\ndata/0017/000369\ndata/0017/000370\ndata/0017/000371\ndata/0017/000372\ndata/0017/000373\ndata/0017/000374\ndata/0017/000375\ndata/0017/000376\ndata/0017/000377\ndata/0017/000378\ndata/0017/000379\ndata/0017/000380\ndata/0017/000381\ndata/0017/000382\ndata/0017/000383\ndata/0017/000384\ndata/0017/000385\ndata/0017/000386\ndata/0017/000387\ndata/0017/000388\ndata/0017/000389\ndata/0017/000390\ndata/0017/000391\ndata/0017/000392\ndata/0017/000393\ndata/0017/000394\ndata/0017/000395\ndata/0017/000396\ndata/0017/000397\ndata/0017/000398\ndata/0017/000399\ndata/0017/000400\ndata/0017/000401\ndata/0017/000402\ndata/0017/000403\ndata/0017/000404\ndata/0017/000405\ndata/0017/000406\ndata/0017/000407\ndata/0017/000408\ndata/0017/000409\ndata/0017/000410\ndata/0017/000411\ndata/0017/000412\ndata/0017/000413\ndata/0017/000414\ndata/0017/000415\ndata/0017/000416\ndata/0017/000417\ndata/0017/000418\ndata/0017/000419\ndata/0017/000420\ndata/0017/000421\ndata/0017/000422\ndata/0017/000423\ndata/0017/000424\ndata/0017/000425\ndata/0017/000426\ndata/0017/000427\ndata/0017/000428\ndata/0017/000429\ndata/0017/000430\ndata/0017/000431\ndata/0017/000432\ndata/0017/000433\ndata/0017/000434\ndata/0017/000435\ndata/0017/000436\ndata/0017/000437\ndata/0017/000438\ndata/0017/000439\ndata/0017/000440\ndata/0017/000441\ndata/0017/000442\ndata/0017/000443\ndata/0017/000444\ndata/0017/000445\ndata/0017/000446\ndata/0017/000447\ndata/0017/000448\ndata/0017/000449\ndata/0017/000450\ndata/0017/000451\ndata/0017/000452\ndata/0017/000453\ndata/0017/000454\ndata/0017/000455\ndata/0017/000456\ndata/0017/000457\ndata/0017/000458\ndata/0017/000459\ndata/0017/000460\ndata/0017/000461\ndata/0017/000462\ndata/0017/000463\ndata/0017/000464\ndata/0017/000465\ndata/0017/000466\ndata/0017/000467\ndata/0017/000468\ndata/0017/000469\ndata/0017/000470\ndata/0017/000471\ndata/0017/000472\ndata/0017/000473\ndata/0017/000474\ndata/0017/000475\ndata/0017/000476\ndata/0017/000477\ndata/0017/000478\ndata/0017/000479\ndata/0017/000480\ndata/0017/000481\ndata/0017/000482\ndata/0017/000483\ndata/0017/000484\ndata/0017/000485\ndata/0017/000486\ndata/0017/000487\ndata/0017/000488\ndata/0017/000489\ndata/0017/000490\ndata/0017/000491\ndata/0017/000492\ndata/0017/000493\ndata/0017/000494\ndata/0017/000495\ndata/0017/000496\ndata/0017/000497\ndata/0017/000498\ndata/0017/000499\ndata/0017/000500\ndata/0017/000501\ndata/0017/000502\ndata/0017/000503\ndata/0017/000504\ndata/0017/000505\ndata/0017/000506\ndata/0017/000507\ndata/0017/000508\ndata/0017/000509\ndata/0017/000510\ndata/0017/000511\ndata/0017/000512\ndata/0017/000513\ndata/0017/000514\ndata/0017/000515\ndata/0017/000516\ndata/0017/000517\ndata/0017/000518\ndata/0017/000519\ndata/0017/000520\ndata/0017/000521\ndata/0017/000522\ndata/0017/000523\ndata/0017/000524\ndata/0017/000525\ndata/0017/000526\ndata/0017/000527\ndata/0017/000528\ndata/0017/000529\ndata/0017/000530\ndata/0017/000531\ndata/0017/000532\ndata/0017/000533\ndata/0017/000534\ndata/0017/000535\ndata/0017/000536\ndata/0017/000537\ndata/0017/000538\ndata/0017/000539\ndata/0017/000540\ndata/0017/000541\ndata/0017/000542\ndata/0017/000543\ndata/0017/000544\ndata/0017/000545\ndata/0017/000546\ndata/0017/000547\ndata/0017/000548\ndata/0017/000549\ndata/0017/000550\ndata/0017/000551\ndata/0017/000552\ndata/0017/000553\ndata/0017/000554\ndata/0017/000555\ndata/0017/000556\ndata/0017/000557\ndata/0017/000558\ndata/0017/000559\ndata/0017/000560\ndata/0017/000561\ndata/0017/000562\ndata/0017/000563\ndata/0017/000564\ndata/0017/000565\ndata/0017/000566\ndata/0017/000567\ndata/0017/000568\ndata/0017/000569\ndata/0017/000570\ndata/0017/000571\ndata/0017/000572\ndata/0017/000573\ndata/0017/000574\ndata/0017/000575\ndata/0017/000576\ndata/0017/000577\ndata/0017/000578\ndata/0017/000579\ndata/0017/000580\ndata/0017/000581\ndata/0017/000582\ndata/0017/000583\ndata/0017/000584\ndata/0017/000585\ndata/0017/000586\ndata/0017/000587\ndata/0017/000588\ndata/0017/000589\ndata/0017/000590\ndata/0017/000591\ndata/0017/000592\ndata/0017/000593\ndata/0017/000594\ndata/0017/000595\ndata/0017/000596\ndata/0017/000597\ndata/0017/000598\ndata/0017/000599\ndata/0017/000600\ndata/0017/000601\ndata/0017/000602\ndata/0017/000603\ndata/0017/000604\ndata/0017/000605\ndata/0017/000606\ndata/0017/000607\ndata/0017/000608\ndata/0017/000609\ndata/0017/000610\ndata/0017/000611\ndata/0017/000612\ndata/0017/000613\ndata/0017/000614\ndata/0017/000615\ndata/0017/000616\ndata/0017/000617\ndata/0017/000618\ndata/0017/000619\ndata/0017/000620\ndata/0017/000621\ndata/0017/000622\ndata/0017/000623\ndata/0017/000624\ndata/0017/000625\ndata/0017/000626\ndata/0017/000627\ndata/0017/000628\ndata/0017/000629\ndata/0017/000630\ndata/0017/000631\ndata/0017/000632\ndata/0017/000633\ndata/0017/000634\ndata/0017/000635\ndata/0017/000636\ndata/0017/000637\ndata/0017/000638\ndata/0017/000639\ndata/0017/000640\ndata/0017/000641\ndata/0017/000642\ndata/0017/000643\ndata/0017/000644\ndata/0017/000645\ndata/0017/000646\ndata/0017/000647\ndata/0017/000648\ndata/0017/000649\ndata/0017/000650\ndata/0017/000651\ndata/0017/000652\ndata/0017/000653\ndata/0017/000654\ndata/0017/000655\ndata/0017/000656\ndata/0017/000657\ndata/0017/000658\ndata/0017/000659\ndata/0017/000660\ndata/0017/000661\ndata/0017/000662\ndata/0017/000663\ndata/0017/000664\ndata/0017/000665\ndata/0017/000666\ndata/0017/000667\ndata/0017/000668\ndata/0017/000669\ndata/0017/000670\ndata/0017/000671\ndata/0017/000672\ndata/0017/000673\ndata/0017/000674\ndata/0017/000675\ndata/0017/000676\ndata/0017/000677\ndata/0017/000678\ndata/0017/000679\ndata/0017/000680\ndata/0017/000681\ndata/0017/000682\ndata/0017/000683\ndata/0017/000684\ndata/0017/000685\ndata/0017/000686\ndata/0017/000687\ndata/0017/000688\ndata/0017/000689\ndata/0017/000690\ndata/0017/000691\ndata/0017/000692\ndata/0017/000693\ndata/0017/000694\ndata/0017/000695\ndata/0017/000696\ndata/0017/000697\ndata/0017/000698\ndata/0017/000699\ndata/0017/000700\ndata/0017/000701\ndata/0017/000702\ndata/0017/000703\ndata/0017/000704\ndata/0017/000705\ndata/0017/000706\ndata/0017/000707\ndata/0017/000708\ndata/0017/000709\ndata/0017/000710\ndata/0017/000711\ndata/0017/000712\ndata/0017/000713\ndata/0017/000714\ndata/0017/000715\ndata/0017/000716\ndata/0017/000717\ndata/0017/000718\ndata/0017/000719\ndata/0017/000720\ndata/0017/000721\ndata/0017/000722\ndata/0017/000723\ndata/0017/000724\ndata/0017/000725\ndata/0017/000726\ndata/0017/000727\ndata/0017/000728\ndata/0017/000729\ndata/0017/000730\ndata/0017/000731\ndata/0017/000732\ndata/0017/000733\ndata/0017/000734\ndata/0017/000735\ndata/0017/000736\ndata/0017/000737\ndata/0017/000738\ndata/0017/000739\ndata/0017/000740\ndata/0017/000741\ndata/0017/000742\ndata/0017/000743\ndata/0017/000744\ndata/0017/000745\ndata/0017/000746\ndata/0017/000747\ndata/0017/000748\ndata/0017/000749\ndata/0017/000750\ndata/0025/000001\ndata/0025/000002\ndata/0025/000003\ndata/0025/000004\ndata/0025/000005\ndata/0025/000006\ndata/0025/000007\ndata/0025/000008\ndata/0025/000009\ndata/0025/000010\ndata/0025/000011\ndata/0025/000012\ndata/0025/000013\ndata/0025/000014\ndata/0025/000015\ndata/0025/000016\ndata/0025/000017\ndata/0025/000018\ndata/0025/000019\ndata/0025/000020\ndata/0025/000021\ndata/0025/000022\ndata/0025/000023\ndata/0025/000024\ndata/0025/000025\ndata/0025/000026\ndata/0025/000027\ndata/0025/000028\ndata/0025/000029\ndata/0025/000030\ndata/0025/000031\ndata/0025/000032\ndata/0025/000033\ndata/0025/000034\ndata/0025/000035\ndata/0025/000036\ndata/0025/000037\ndata/0025/000038\ndata/0025/000039\ndata/0025/000040\ndata/0025/000041\ndata/0025/000042\ndata/0025/000043\ndata/0025/000044\ndata/0025/000045\ndata/0025/000046\ndata/0025/000047\ndata/0025/000048\ndata/0025/000049\ndata/0025/000050\ndata/0025/000051\ndata/0025/000052\ndata/0025/000053\ndata/0025/000054\ndata/0025/000055\ndata/0025/000056\ndata/0025/000057\ndata/0025/000058\ndata/0025/000059\ndata/0025/000060\ndata/0025/000061\ndata/0025/000062\ndata/0025/000063\ndata/0025/000064\ndata/0025/000065\ndata/0025/000066\ndata/0025/000067\ndata/0025/000068\ndata/0025/000069\ndata/0025/000070\ndata/0025/000071\ndata/0025/000072\ndata/0025/000073\ndata/0025/000074\ndata/0025/000075\ndata/0025/000076\ndata/0025/000077\ndata/0025/000078\ndata/0025/000079\ndata/0025/000080\ndata/0025/000081\ndata/0025/000082\ndata/0025/000083\ndata/0025/000084\ndata/0025/000085\ndata/0025/000086\ndata/0025/000087\ndata/0025/000088\ndata/0025/000089\ndata/0025/000090\ndata/0025/000091\ndata/0025/000092\ndata/0025/000093\ndata/0025/000094\ndata/0025/000095\ndata/0025/000096\ndata/0025/000097\ndata/0025/000098\ndata/0025/000099\ndata/0025/000100\ndata/0025/000101\ndata/0025/000102\ndata/0025/000103\ndata/0025/000104\ndata/0025/000105\ndata/0025/000106\ndata/0025/000107\ndata/0025/000108\ndata/0025/000109\ndata/0025/000110\ndata/0025/000111\ndata/0025/000112\ndata/0025/000113\ndata/0025/000114\ndata/0025/000115\ndata/0025/000116\ndata/0025/000117\ndata/0025/000118\ndata/0025/000119\ndata/0025/000120\ndata/0025/000121\ndata/0025/000122\ndata/0025/000123\ndata/0025/000124\ndata/0025/000125\ndata/0025/000126\ndata/0025/000127\ndata/0025/000128\ndata/0025/000129\ndata/0025/000130\ndata/0025/000131\ndata/0025/000132\ndata/0025/000133\ndata/0025/000134\ndata/0025/000135\ndata/0025/000136\ndata/0025/000137\ndata/0025/000138\ndata/0025/000139\ndata/0025/000140\ndata/0025/000141\ndata/0025/000142\ndata/0025/000143\ndata/0025/000144\ndata/0025/000145\ndata/0025/000146\ndata/0025/000147\ndata/0025/000148\ndata/0025/000149\ndata/0025/000150\ndata/0025/000151\ndata/0025/000152\ndata/0025/000153\ndata/0025/000154\ndata/0025/000155\ndata/0025/000156\ndata/0025/000157\ndata/0025/000158\ndata/0025/000159\ndata/0025/000160\ndata/0025/000161\ndata/0025/000162\ndata/0025/000163\ndata/0025/000164\ndata/0025/000165\ndata/0025/000166\ndata/0025/000167\ndata/0025/000168\ndata/0025/000169\ndata/0025/000170\ndata/0025/000171\ndata/0025/000172\ndata/0025/000173\ndata/0025/000174\ndata/0025/000175\ndata/0025/000176\ndata/0025/000177\ndata/0025/000178\ndata/0025/000179\ndata/0025/000180\ndata/0025/000181\ndata/0025/000182\ndata/0025/000183\ndata/0025/000184\ndata/0025/000185\ndata/0025/000186\ndata/0025/000187\ndata/0025/000188\ndata/0025/000189\ndata/0025/000190\ndata/0025/000191\ndata/0025/000192\ndata/0025/000193\ndata/0025/000194\ndata/0025/000195\ndata/0025/000196\ndata/0025/000197\ndata/0025/000198\ndata/0025/000199\ndata/0025/000200\ndata/0025/000201\ndata/0025/000202\ndata/0025/000203\ndata/0025/000204\ndata/0025/000205\ndata/0025/000206\ndata/0025/000207\ndata/0025/000208\ndata/0025/000209\ndata/0025/000210\ndata/0025/000211\ndata/0025/000212\ndata/0025/000213\ndata/0025/000214\ndata/0025/000215\ndata/0025/000216\ndata/0025/000217\ndata/0025/000218\ndata/0025/000219\ndata/0025/000220\ndata/0025/000221\ndata/0025/000222\ndata/0025/000223\ndata/0025/000224\ndata/0025/000225\ndata/0025/000226\ndata/0025/000227\ndata/0025/000228\ndata/0025/000229\ndata/0025/000230\ndata/0025/000231\ndata/0025/000232\ndata/0025/000233\ndata/0025/000234\ndata/0025/000235\ndata/0025/000236\ndata/0025/000237\ndata/0025/000238\ndata/0025/000239\ndata/0025/000240\ndata/0025/000241\ndata/0025/000242\ndata/0025/000243\ndata/0025/000244\ndata/0025/000245\ndata/0025/000246\ndata/0025/000247\ndata/0025/000248\ndata/0025/000249\ndata/0025/000250\ndata/0025/000251\ndata/0025/000252\ndata/0025/000253\ndata/0025/000254\ndata/0025/000255\ndata/0025/000256\ndata/0025/000257\ndata/0025/000258\ndata/0025/000259\ndata/0025/000260\ndata/0025/000261\ndata/0025/000262\ndata/0025/000263\ndata/0025/000264\ndata/0025/000265\ndata/0025/000266\ndata/0025/000267\ndata/0025/000268\ndata/0025/000269\ndata/0025/000270\ndata/0025/000271\ndata/0025/000272\ndata/0025/000273\ndata/0025/000274\ndata/0025/000275\ndata/0025/000276\ndata/0025/000277\ndata/0025/000278\ndata/0025/000279\ndata/0025/000280\ndata/0025/000281\ndata/0025/000282\ndata/0025/000283\ndata/0025/000284\ndata/0025/000285\ndata/0025/000286\ndata/0025/000287\ndata/0025/000288\ndata/0025/000289\ndata/0025/000290\ndata/0025/000291\ndata/0025/000292\ndata/0025/000293\ndata/0025/000294\ndata/0025/000295\ndata/0025/000296\ndata/0025/000297\ndata/0025/000298\ndata/0025/000299\ndata/0025/000300\ndata/0025/000301\ndata/0025/000302\ndata/0025/000303\ndata/0025/000304\ndata/0025/000305\ndata/0025/000306\ndata/0025/000307\ndata/0025/000308\ndata/0025/000309\ndata/0025/000310\ndata/0025/000311\ndata/0025/000312\ndata/0025/000313\ndata/0025/000314\ndata/0025/000315\ndata/0025/000316\ndata/0025/000317\ndata/0025/000318\ndata/0025/000319\ndata/0025/000320\ndata/0025/000321\ndata/0025/000322\ndata/0025/000323\ndata/0025/000324\ndata/0025/000325\ndata/0025/000326\ndata/0025/000327\ndata/0025/000328\ndata/0025/000329\ndata/0025/000330\ndata/0025/000331\ndata/0025/000332\ndata/0025/000333\ndata/0025/000334\ndata/0025/000335\ndata/0025/000336\ndata/0025/000337\ndata/0025/000338\ndata/0025/000339\ndata/0025/000340\ndata/0025/000341\ndata/0025/000342\ndata/0025/000343\ndata/0025/000344\ndata/0025/000345\ndata/0025/000346\ndata/0025/000347\ndata/0025/000348\ndata/0025/000349\ndata/0025/000350\ndata/0025/000351\ndata/0025/000352\ndata/0025/000353\ndata/0025/000354\ndata/0025/000355\ndata/0025/000356\ndata/0025/000357\ndata/0025/000358\ndata/0025/000359\ndata/0025/000360\ndata/0025/000361\ndata/0025/000362\ndata/0025/000363\ndata/0025/000364\ndata/0025/000365\ndata/0025/000366\ndata/0025/000367\ndata/0025/000368\ndata/0025/000369\ndata/0025/000370\ndata/0025/000371\ndata/0025/000372\ndata/0025/000373\ndata/0025/000374\ndata/0025/000375\ndata/0025/000376\ndata/0025/000377\ndata/0025/000378\ndata/0025/000379\ndata/0025/000380\ndata/0025/000381\ndata/0025/000382\ndata/0025/000383\ndata/0025/000384\ndata/0025/000385\ndata/0025/000386\ndata/0025/000387\ndata/0025/000388\ndata/0025/000389\ndata/0025/000390\ndata/0025/000391\ndata/0025/000392\ndata/0025/000393\ndata/0025/000394\ndata/0025/000395\ndata/0025/000396\ndata/0025/000397\ndata/0025/000398\ndata/0025/000399\ndata/0025/000400\ndata/0025/000401\ndata/0025/000402\ndata/0025/000403\ndata/0025/000404\ndata/0025/000405\ndata/0025/000406\ndata/0025/000407\ndata/0025/000408\ndata/0025/000409\ndata/0025/000410\ndata/0025/000411\ndata/0025/000412\ndata/0025/000413\ndata/0025/000414\ndata/0025/000415\ndata/0025/000416\ndata/0025/000417\ndata/0025/000418\ndata/0025/000419\ndata/0025/000420\ndata/0025/000421\ndata/0025/000422\ndata/0025/000423\ndata/0025/000424\ndata/0025/000425\ndata/0025/000426\ndata/0025/000427\ndata/0025/000428\ndata/0025/000429\ndata/0025/000430\ndata/0025/000431\ndata/0025/000432\ndata/0025/000433\ndata/0025/000434\ndata/0025/000435\ndata/0025/000436\ndata/0025/000437\ndata/0025/000438\ndata/0025/000439\ndata/0025/000440\ndata/0025/000441\ndata/0025/000442\ndata/0025/000443\ndata/0025/000444\ndata/0025/000445\ndata/0025/000446\ndata/0025/000447\ndata/0025/000448\ndata/0025/000449\ndata/0025/000450\ndata/0025/000451\ndata/0025/000452\ndata/0025/000453\ndata/0025/000454\ndata/0025/000455\ndata/0025/000456\ndata/0025/000457\ndata/0025/000458\ndata/0025/000459\ndata/0025/000460\ndata/0025/000461\ndata/0025/000462\ndata/0025/000463\ndata/0025/000464\ndata/0025/000465\ndata/0025/000466\ndata/0025/000467\ndata/0025/000468\ndata/0025/000469\ndata/0025/000470\ndata/0025/000471\ndata/0025/000472\ndata/0025/000473\ndata/0025/000474\ndata/0025/000475\ndata/0025/000476\ndata/0025/000477\ndata/0025/000478\ndata/0025/000479\ndata/0025/000480\ndata/0025/000481\ndata/0025/000482\ndata/0025/000483\ndata/0025/000484\ndata/0025/000485\ndata/0025/000486\ndata/0025/000487\ndata/0025/000488\ndata/0025/000489\ndata/0025/000490\ndata/0025/000491\ndata/0025/000492\ndata/0025/000493\ndata/0025/000494\ndata/0025/000495\ndata/0025/000496\ndata/0025/000497\ndata/0025/000498\ndata/0025/000499\ndata/0025/000500\ndata/0025/000501\ndata/0025/000502\ndata/0025/000503\ndata/0025/000504\ndata/0025/000505\ndata/0025/000506\ndata/0025/000507\ndata/0025/000508\ndata/0025/000509\ndata/0025/000510\ndata/0025/000511\ndata/0025/000512\ndata/0025/000513\ndata/0025/000514\ndata/0025/000515\ndata/0025/000516\ndata/0025/000517\ndata/0025/000518\ndata/0025/000519\ndata/0025/000520\ndata/0025/000521\ndata/0025/000522\ndata/0025/000523\ndata/0025/000524\ndata/0025/000525\ndata/0025/000526\ndata/0025/000527\ndata/0025/000528\ndata/0025/000529\ndata/0025/000530\ndata/0025/000531\ndata/0025/000532\ndata/0025/000533\ndata/0025/000534\ndata/0025/000535\ndata/0025/000536\ndata/0025/000537\ndata/0025/000538\ndata/0025/000539\ndata/0025/000540\ndata/0025/000541\ndata/0025/000542\ndata/0025/000543\ndata/0025/000544\ndata/0025/000545\ndata/0025/000546\ndata/0025/000547\ndata/0025/000548\ndata/0025/000549\ndata/0025/000550\ndata/0025/000551\ndata/0025/000552\ndata/0025/000553\ndata/0025/000554\ndata/0025/000555\ndata/0025/000556\ndata/0025/000557\ndata/0025/000558\ndata/0025/000559\ndata/0025/000560\ndata/0025/000561\ndata/0025/000562\ndata/0025/000563\ndata/0025/000564\ndata/0025/000565\ndata/0025/000566\ndata/0025/000567\ndata/0025/000568\ndata/0025/000569\ndata/0025/000570\ndata/0025/000571\ndata/0025/000572\ndata/0025/000573\ndata/0025/000574\ndata/0025/000575\ndata/0025/000576\ndata/0025/000577\ndata/0025/000578\ndata/0025/000579\ndata/0025/000580\ndata/0025/000581\ndata/0025/000582\ndata/0025/000583\ndata/0025/000584\ndata/0025/000585\ndata/0025/000586\ndata/0025/000587\ndata/0025/000588\ndata/0025/000589\ndata/0025/000590\ndata/0025/000591\ndata/0025/000592\ndata/0025/000593\ndata/0025/000594\ndata/0025/000595\ndata/0025/000596\ndata/0025/000597\ndata/0025/000598\ndata/0025/000599\ndata/0025/000600\ndata/0025/000601\ndata/0025/000602\ndata/0025/000603\ndata/0025/000604\ndata/0025/000605\ndata/0025/000606\ndata/0025/000607\ndata/0025/000608\ndata/0025/000609\ndata/0025/000610\ndata/0025/000611\ndata/0025/000612\ndata/0025/000613\ndata/0025/000614\ndata/0025/000615\ndata/0025/000616\ndata/0025/000617\ndata/0025/000618\ndata/0025/000619\ndata/0025/000620\ndata/0025/000621\ndata/0025/000622\ndata/0025/000623\ndata/0025/000624\ndata/0025/000625\ndata/0025/000626\ndata/0025/000627\ndata/0025/000628\ndata/0025/000629\ndata/0025/000630\ndata/0025/000631\ndata/0025/000632\ndata/0025/000633\ndata/0025/000634\ndata/0025/000635\ndata/0025/000636\ndata/0025/000637\ndata/0025/000638\ndata/0025/000639\ndata/0025/000640\ndata/0025/000641\ndata/0025/000642\ndata/0025/000643\ndata/0025/000644\ndata/0025/000645\ndata/0025/000646\ndata/0025/000647\ndata/0025/000648\ndata/0025/000649\ndata/0025/000650\ndata/0025/000651\ndata/0025/000652\ndata/0025/000653\ndata/0025/000654\ndata/0025/000655\ndata/0025/000656\ndata/0025/000657\ndata/0025/000658\ndata/0025/000659\ndata/0025/000660\ndata/0025/000661\ndata/0025/000662\ndata/0025/000663\ndata/0025/000664\ndata/0025/000665\ndata/0025/000666\ndata/0025/000667\ndata/0025/000668\ndata/0025/000669\ndata/0025/000670\ndata/0025/000671\ndata/0025/000672\ndata/0025/000673\ndata/0025/000674\ndata/0025/000675\ndata/0025/000676\ndata/0025/000677\ndata/0025/000678\ndata/0025/000679\ndata/0025/000680\ndata/0025/000681\ndata/0025/000682\ndata/0025/000683\ndata/0025/000684\ndata/0025/000685\ndata/0025/000686\ndata/0025/000687\ndata/0025/000688\ndata/0025/000689\ndata/0025/000690\ndata/0025/000691\ndata/0025/000692\ndata/0025/000693\ndata/0025/000694\ndata/0025/000695\ndata/0025/000696\ndata/0025/000697\ndata/0025/000698\ndata/0025/000699\ndata/0025/000700\ndata/0025/000701\ndata/0025/000702\ndata/0025/000703\ndata/0025/000704\ndata/0025/000705\ndata/0025/000706\ndata/0025/000707\ndata/0025/000708\ndata/0025/000709\ndata/0025/000710\ndata/0025/000711\ndata/0025/000712\ndata/0025/000713\ndata/0025/000714\ndata/0025/000715\ndata/0025/000716\ndata/0025/000717\ndata/0025/000718\ndata/0025/000719\ndata/0025/000720\ndata/0025/000721\ndata/0025/000722\ndata/0025/000723\ndata/0025/000724\ndata/0025/000725\ndata/0025/000726\ndata/0025/000727\ndata/0025/000728\ndata/0025/000729\ndata/0025/000730\ndata/0025/000731\ndata/0025/000732\ndata/0025/000733\ndata/0025/000734\ndata/0025/000735\ndata/0025/000736\ndata/0025/000737\ndata/0025/000738\ndata/0025/000739\ndata/0025/000740\ndata/0025/000741\ndata/0025/000742\ndata/0025/000743\ndata/0025/000744\ndata/0025/000745\ndata/0025/000746\ndata/0025/000747\ndata/0025/000748\ndata/0025/000749\ndata/0025/000750\ndata/0025/000751\ndata/0025/000752\ndata/0025/000753\ndata/0025/000754\ndata/0025/000755\ndata/0025/000756\ndata/0025/000757\ndata/0025/000758\ndata/0025/000759\ndata/0025/000760\ndata/0025/000761\ndata/0025/000762\ndata/0025/000763\ndata/0025/000764\ndata/0025/000765\ndata/0025/000766\ndata/0025/000767\ndata/0025/000768\ndata/0025/000769\ndata/0025/000770\ndata/0025/000771\ndata/0025/000772\ndata/0025/000773\ndata/0025/000774\ndata/0025/000775\ndata/0025/000776\ndata/0025/000777\ndata/0025/000778\ndata/0025/000779\ndata/0025/000780\ndata/0025/000781\ndata/0025/000782\ndata/0025/000783\ndata/0025/000784\ndata/0025/000785\ndata/0025/000786\ndata/0025/000787\ndata/0025/000788\ndata/0025/000789\ndata/0025/000790\ndata/0025/000791\ndata/0025/000792\ndata/0025/000793\ndata/0025/000794\ndata/0025/000795\ndata/0025/000796\ndata/0025/000797\ndata/0025/000798\ndata/0025/000799\ndata/0025/000800\ndata/0025/000801\ndata/0025/000802\ndata/0025/000803\ndata/0025/000804\ndata/0025/000805\ndata/0025/000806\ndata/0025/000807\ndata/0025/000808\ndata/0025/000809\ndata/0025/000810\ndata/0025/000811\ndata/0025/000812\ndata/0025/000813\ndata/0025/000814\ndata/0025/000815\ndata/0025/000816\ndata/0025/000817\ndata/0025/000818\ndata/0025/000819\ndata/0025/000820\ndata/0025/000821\ndata/0025/000822\ndata/0025/000823\ndata/0025/000824\ndata/0025/000825\ndata/0025/000826\ndata/0025/000827\ndata/0025/000828\ndata/0025/000829\ndata/0025/000830\ndata/0025/000831\ndata/0025/000832\ndata/0025/000833\ndata/0025/000834\ndata/0025/000835\ndata/0025/000836\ndata/0025/000837\ndata/0025/000838\ndata/0025/000839\ndata/0025/000840\ndata/0025/000841\ndata/0025/000842\ndata/0025/000843\ndata/0025/000844\ndata/0025/000845\ndata/0025/000846\ndata/0025/000847\ndata/0025/000848\ndata/0025/000849\ndata/0025/000850\ndata/0025/000851\ndata/0025/000852\ndata/0025/000853\ndata/0025/000854\ndata/0025/000855\ndata/0025/000856\ndata/0025/000857\ndata/0025/000858\ndata/0025/000859\ndata/0025/000860\ndata/0025/000861\ndata/0025/000862\ndata/0025/000863\ndata/0025/000864\ndata/0025/000865\ndata/0025/000866\ndata/0025/000867\ndata/0025/000868\ndata/0025/000869\ndata/0025/000870\ndata/0025/000871\ndata/0025/000872\ndata/0025/000873\ndata/0025/000874\ndata/0025/000875\ndata/0025/000876\ndata/0025/000877\ndata/0025/000878\ndata/0025/000879\ndata/0025/000880\ndata/0025/000881\ndata/0025/000882\ndata/0025/000883\ndata/0025/000884\ndata/0025/000885\ndata/0025/000886\ndata/0025/000887\ndata/0025/000888\ndata/0025/000889\ndata/0025/000890\ndata/0025/000891\ndata/0025/000892\ndata/0025/000893\ndata/0025/000894\ndata/0025/000895\ndata/0025/000896\ndata/0025/000897\ndata/0025/000898\ndata/0025/000899\ndata/0025/000900\ndata/0025/000901\ndata/0025/000902\ndata/0025/000903\ndata/0025/000904\ndata/0025/000905\ndata/0025/000906\ndata/0025/000907\ndata/0025/000908\ndata/0025/000909\ndata/0025/000910\ndata/0025/000911\ndata/0025/000912\ndata/0025/000913\ndata/0025/000914\ndata/0025/000915\ndata/0025/000916\ndata/0025/000917\ndata/0025/000918\ndata/0025/000919\ndata/0025/000920\ndata/0025/000921\ndata/0025/000922\ndata/0025/000923\ndata/0025/000924\ndata/0025/000925\ndata/0025/000926\ndata/0025/000927\ndata/0025/000928\ndata/0025/000929\ndata/0025/000930\ndata/0025/000931\ndata/0025/000932\ndata/0025/000933\ndata/0025/000934\ndata/0025/000935\ndata/0025/000936\ndata/0025/000937\ndata/0025/000938\ndata/0025/000939\ndata/0025/000940\ndata/0025/000941\ndata/0025/000942\ndata/0025/000943\ndata/0025/000944\ndata/0025/000945\ndata/0025/000946\ndata/0025/000947\ndata/0025/000948\ndata/0025/000949\ndata/0025/000950\ndata/0025/000951\ndata/0025/000952\ndata/0025/000953\ndata/0025/000954\ndata/0025/000955\ndata/0025/000956\ndata/0025/000957\ndata/0025/000958\ndata/0025/000959\ndata/0025/000960\ndata/0025/000961\ndata/0025/000962\ndata/0025/000963\ndata/0025/000964\ndata/0025/000965\ndata/0025/000966\ndata/0025/000967\ndata/0025/000968\ndata/0025/000969\ndata/0025/000970\ndata/0025/000971\ndata/0025/000972\ndata/0025/000973\ndata/0025/000974\ndata/0025/000975\ndata/0025/000976\ndata/0025/000977\ndata/0025/000978\ndata/0025/000979\ndata/0025/000980\ndata/0025/000981\ndata/0025/000982\ndata/0025/000983\ndata/0025/000984\ndata/0025/000985\ndata/0025/000986\ndata/0025/000987\ndata/0025/000988\ndata/0025/000989\ndata/0025/000990\ndata/0025/000991\ndata/0025/000992\ndata/0025/000993\ndata/0025/000994\ndata/0025/000995\ndata/0025/000996\ndata/0025/000997\ndata/0025/000998\ndata/0025/000999\ndata/0025/001000\ndata/0025/001001\ndata/0025/001002\ndata/0025/001003\ndata/0025/001004\ndata/0025/001005\ndata/0025/001006\ndata/0025/001007\ndata/0025/001008\ndata/0025/001009\ndata/0025/001010\ndata/0025/001011\ndata/0025/001012\ndata/0025/001013\ndata/0025/001014\ndata/0025/001015\ndata/0025/001016\ndata/0025/001017\ndata/0025/001018\ndata/0025/001019\ndata/0025/001020\ndata/0025/001021\ndata/0025/001022\ndata/0025/001023\ndata/0025/001024\ndata/0025/001025\ndata/0025/001026\ndata/0025/001027\ndata/0025/001028\ndata/0025/001029\ndata/0025/001030\ndata/0025/001031\ndata/0025/001032\ndata/0025/001033\ndata/0025/001034\ndata/0025/001035\ndata/0025/001036\ndata/0025/001037\ndata/0025/001038\ndata/0025/001039\ndata/0025/001040\ndata/0025/001041\ndata/0025/001042\ndata/0025/001043\ndata/0025/001044\ndata/0025/001045\ndata/0025/001046\ndata/0025/001047\ndata/0025/001048\ndata/0025/001049\ndata/0025/001050\ndata/0025/001051\ndata/0025/001052\ndata/0025/001053\ndata/0025/001054\ndata/0025/001055\ndata/0025/001056\ndata/0025/001057\ndata/0025/001058\ndata/0025/001059\ndata/0025/001060\ndata/0025/001061\ndata/0025/001062\ndata/0025/001063\ndata/0025/001064\ndata/0025/001065\ndata/0025/001066\ndata/0025/001067\ndata/0025/001068\ndata/0025/001069\ndata/0025/001070\ndata/0025/001071\ndata/0025/001072\ndata/0025/001073\ndata/0025/001074\ndata/0025/001075\ndata/0025/001076\ndata/0025/001077\ndata/0025/001078\ndata/0025/001079\ndata/0025/001080\ndata/0025/001081\ndata/0025/001082\ndata/0025/001083\ndata/0025/001084\ndata/0025/001085\ndata/0025/001086\ndata/0025/001087\ndata/0025/001088\ndata/0025/001089\ndata/0025/001090\ndata/0025/001091\ndata/0025/001092\ndata/0025/001093\ndata/0025/001094\ndata/0025/001095\ndata/0025/001096\ndata/0025/001097\ndata/0025/001098\ndata/0025/001099\ndata/0025/001100\ndata/0025/001101\ndata/0025/001102\ndata/0025/001103\ndata/0025/001104\ndata/0025/001105\ndata/0025/001106\ndata/0025/001107\ndata/0025/001108\ndata/0025/001109\ndata/0025/001110\ndata/0025/001111\ndata/0025/001112\ndata/0025/001113\ndata/0025/001114\ndata/0025/001115\ndata/0025/001116\ndata/0025/001117\ndata/0025/001118\ndata/0025/001119\ndata/0025/001120\ndata/0025/001121\ndata/0025/001122\ndata/0025/001123\ndata/0025/001124\ndata/0025/001125\ndata/0025/001126\ndata/0025/001127\ndata/0025/001128\ndata/0025/001129\ndata/0025/001130\ndata/0025/001131\ndata/0025/001132\ndata/0025/001133\ndata/0025/001134\ndata/0025/001135\ndata/0025/001136\ndata/0025/001137\ndata/0025/001138\ndata/0025/001139\ndata/0025/001140\ndata/0025/001141\ndata/0025/001142\ndata/0025/001143\ndata/0025/001144\ndata/0025/001145\ndata/0025/001146\ndata/0025/001147\ndata/0025/001148\ndata/0025/001149\ndata/0025/001150\ndata/0025/001151\ndata/0025/001152\ndata/0025/001153\ndata/0025/001154\ndata/0025/001155\ndata/0025/001156\ndata/0025/001157\ndata/0025/001158\ndata/0025/001159\ndata/0025/001160\ndata/0025/001161\ndata/0025/001162\ndata/0025/001163\ndata/0025/001164\ndata/0025/001165\ndata/0025/001166\ndata/0025/001167\ndata/0025/001168\ndata/0025/001169\ndata/0025/001170\ndata/0025/001171\ndata/0025/001172\ndata/0025/001173\ndata/0025/001174\ndata/0025/001175\ndata/0025/001176\ndata/0025/001177\ndata/0025/001178\ndata/0025/001179\ndata/0025/001180\ndata/0025/001181\ndata/0025/001182\ndata/0025/001183\ndata/0025/001184\ndata/0025/001185\ndata/0025/001186\ndata/0025/001187\ndata/0025/001188\ndata/0025/001189\ndata/0025/001190\ndata/0025/001191\ndata/0025/001192\ndata/0025/001193\ndata/0025/001194\ndata/0025/001195\ndata/0025/001196\ndata/0025/001197\ndata/0025/001198\ndata/0025/001199\ndata/0025/001200\ndata/0025/001201\ndata/0025/001202\ndata/0025/001203\ndata/0025/001204\ndata/0025/001205\ndata/0025/001206\ndata/0025/001207\ndata/0025/001208\ndata/0025/001209\ndata/0025/001210\ndata/0025/001211\ndata/0025/001212\ndata/0025/001213\ndata/0025/001214\ndata/0025/001215\ndata/0025/001216\ndata/0025/001217\ndata/0025/001218\ndata/0025/001219\ndata/0025/001220\ndata/0025/001221\ndata/0025/001222\ndata/0025/001223\ndata/0025/001224\ndata/0025/001225\ndata/0025/001226\ndata/0025/001227\ndata/0025/001228\ndata/0025/001229\ndata/0025/001230\ndata/0025/001231\ndata/0025/001232\ndata/0025/001233\ndata/0025/001234\ndata/0025/001235\ndata/0025/001236\ndata/0025/001237\ndata/0025/001238\ndata/0025/001239\ndata/0025/001240\ndata/0025/001241\ndata/0025/001242\ndata/0025/001243\ndata/0025/001244\ndata/0025/001245\ndata/0025/001246\ndata/0025/001247\ndata/0025/001248\ndata/0025/001249\ndata/0025/001250\ndata/0025/001251\ndata/0025/001252\ndata/0025/001253\ndata/0025/001254\ndata/0025/001255\ndata/0025/001256\ndata/0025/001257\ndata/0025/001258\ndata/0025/001259\ndata/0025/001260\ndata/0025/001261\ndata/0025/001262\ndata/0025/001263\ndata/0025/001264\ndata/0025/001265\ndata/0025/001266\ndata/0025/001267\ndata/0025/001268\ndata/0025/001269\ndata/0025/001270\ndata/0025/001271\ndata/0025/001272\ndata/0025/001273\ndata/0025/001274\ndata/0025/001275\ndata/0025/001276\ndata/0025/001277\ndata/0025/001278\ndata/0025/001279\ndata/0025/001280\ndata/0025/001281\ndata/0025/001282\ndata/0025/001283\ndata/0025/001284\ndata/0025/001285\ndata/0025/001286\ndata/0025/001287\ndata/0025/001288\ndata/0025/001289\ndata/0025/001290\ndata/0025/001291\ndata/0025/001292\ndata/0025/001293\ndata/0025/001294\ndata/0025/001295\ndata/0025/001296\ndata/0025/001297\ndata/0025/001298\ndata/0025/001299\ndata/0025/001300\ndata/0025/001301\ndata/0025/001302\ndata/0025/001303\ndata/0025/001304\ndata/0025/001305\ndata/0025/001306\ndata/0025/001307\ndata/0025/001308\ndata/0025/001309\ndata/0025/001310\ndata/0025/001311\ndata/0025/001312\ndata/0025/001313\ndata/0025/001314\ndata/0025/001315\ndata/0025/001316\ndata/0025/001317\ndata/0025/001318\ndata/0025/001319\ndata/0025/001320\ndata/0025/001321\ndata/0025/001322\ndata/0025/001323\ndata/0025/001324\ndata/0025/001325\ndata/0025/001326\ndata/0025/001327\ndata/0025/001328\ndata/0025/001329\ndata/0025/001330\ndata/0025/001331\ndata/0025/001332\ndata/0025/001333\ndata/0025/001334\ndata/0025/001335\ndata/0025/001336\ndata/0025/001337\ndata/0025/001338\ndata/0025/001339\ndata/0025/001340\ndata/0025/001341\ndata/0025/001342\ndata/0025/001343\ndata/0025/001344\ndata/0025/001345\ndata/0025/001346\ndata/0025/001347\ndata/0025/001348\ndata/0025/001349\ndata/0025/001350\ndata/0025/001351\ndata/0025/001352\ndata/0025/001353\ndata/0025/001354\ndata/0025/001355\ndata/0025/001356\ndata/0025/001357\ndata/0025/001358\ndata/0025/001359\ndata/0025/001360\ndata/0025/001361\ndata/0025/001362\ndata/0025/001363\ndata/0025/001364\ndata/0025/001365\ndata/0025/001366\ndata/0025/001367\ndata/0025/001368\ndata/0025/001369\ndata/0025/001370\ndata/0025/001371\ndata/0025/001372\ndata/0025/001373\ndata/0025/001374\ndata/0025/001375\ndata/0025/001376\ndata/0025/001377\ndata/0025/001378\ndata/0025/001379\ndata/0025/001380\ndata/0025/001381\ndata/0025/001382\ndata/0025/001383\ndata/0025/001384\ndata/0025/001385\ndata/0025/001386\ndata/0025/001387\ndata/0025/001388\ndata/0025/001389\ndata/0025/001390\ndata/0025/001391\ndata/0025/001392\ndata/0025/001393\ndata/0025/001394\ndata/0025/001395\ndata/0025/001396\ndata/0025/001397\ndata/0025/001398\ndata/0025/001399\ndata/0025/001400\ndata/0025/001401\ndata/0025/001402\ndata/0025/001403\ndata/0025/001404\ndata/0025/001405\ndata/0025/001406\ndata/0025/001407\ndata/0025/001408\ndata/0025/001409\ndata/0025/001410\ndata/0025/001411\ndata/0025/001412\ndata/0025/001413\ndata/0025/001414\ndata/0025/001415\ndata/0025/001416\ndata/0025/001417\ndata/0025/001418\ndata/0025/001419\ndata/0025/001420\ndata/0025/001421\ndata/0025/001422\ndata/0025/001423\ndata/0025/001424\ndata/0025/001425\ndata/0025/001426\ndata/0025/001427\ndata/0025/001428\ndata/0025/001429\ndata/0025/001430\ndata/0025/001431\ndata/0025/001432\ndata/0025/001433\ndata/0025/001434\ndata/0025/001435\ndata/0025/001436\ndata/0025/001437\ndata/0025/001438\ndata/0025/001439\ndata/0025/001440\ndata/0025/001441\ndata/0025/001442\ndata/0025/001443\ndata/0025/001444\ndata/0025/001445\ndata/0025/001446\ndata/0025/001447\ndata/0025/001448\ndata/0025/001449\ndata/0025/001450\ndata/0025/001451\ndata/0025/001452\ndata/0025/001453\ndata/0025/001454\ndata/0025/001455\ndata/0025/001456\ndata/0025/001457\ndata/0025/001458\ndata/0025/001459\ndata/0025/001460\ndata/0025/001461\ndata/0025/001462\ndata/0025/001463\ndata/0025/001464\ndata/0025/001465\ndata/0025/001466\ndata/0025/001467\ndata/0025/001468\ndata/0025/001469\ndata/0025/001470\ndata/0025/001471\ndata/0025/001472\ndata/0025/001473\ndata/0025/001474\ndata/0025/001475\ndata/0025/001476\ndata/0025/001477\ndata/0025/001478\ndata/0025/001479\ndata/0025/001480\ndata/0025/001481\ndata/0025/001482\ndata/0025/001483\ndata/0025/001484\ndata/0025/001485\ndata/0025/001486\ndata/0025/001487\ndata/0025/001488\ndata/0025/001489\ndata/0025/001490\ndata/0025/001491\ndata/0025/001492\ndata/0025/001493\ndata/0025/001494\ndata/0025/001495\ndata/0039/000001\ndata/0039/000002\ndata/0039/000003\ndata/0039/000004\ndata/0039/000005\ndata/0039/000006\ndata/0039/000007\ndata/0039/000008\ndata/0039/000009\ndata/0039/000010\ndata/0039/000011\ndata/0039/000012\ndata/0039/000013\ndata/0039/000014\ndata/0039/000015\ndata/0039/000016\ndata/0039/000017\ndata/0039/000018\ndata/0039/000019\ndata/0039/000020\ndata/0039/000021\ndata/0039/000022\ndata/0039/000023\ndata/0039/000024\ndata/0039/000025\ndata/0039/000026\ndata/0039/000027\ndata/0039/000028\ndata/0039/000029\ndata/0039/000030\ndata/0039/000031\ndata/0039/000032\ndata/0039/000033\ndata/0039/000034\ndata/0039/000035\ndata/0039/000036\ndata/0039/000037\ndata/0039/000038\ndata/0039/000039\ndata/0039/000040\ndata/0039/000041\ndata/0039/000042\ndata/0039/000043\ndata/0039/000044\ndata/0039/000045\ndata/0039/000046\ndata/0039/000047\ndata/0039/000048\ndata/0039/000049\ndata/0039/000050\ndata/0039/000051\ndata/0039/000052\ndata/0039/000053\ndata/0039/000054\ndata/0039/000055\ndata/0039/000056\ndata/0039/000057\ndata/0039/000058\ndata/0039/000059\ndata/0039/000060\ndata/0039/000061\ndata/0039/000062\ndata/0039/000063\ndata/0039/000064\ndata/0039/000065\ndata/0039/000066\ndata/0039/000067\ndata/0039/000068\ndata/0039/000069\ndata/0039/000070\ndata/0039/000071\ndata/0039/000072\ndata/0039/000073\ndata/0039/000074\ndata/0039/000075\ndata/0039/000076\ndata/0039/000077\ndata/0039/000078\ndata/0039/000079\ndata/0039/000080\ndata/0039/000081\ndata/0039/000082\ndata/0039/000083\ndata/0039/000084\ndata/0039/000085\ndata/0039/000086\ndata/0039/000087\ndata/0039/000088\ndata/0039/000089\ndata/0039/000090\ndata/0039/000091\ndata/0039/000092\ndata/0039/000093\ndata/0039/000094\ndata/0039/000095\ndata/0039/000096\ndata/0039/000097\ndata/0039/000098\ndata/0039/000099\ndata/0039/000100\ndata/0039/000101\ndata/0039/000102\ndata/0039/000103\ndata/0039/000104\ndata/0039/000105\ndata/0039/000106\ndata/0039/000107\ndata/0039/000108\ndata/0039/000109\ndata/0039/000110\ndata/0039/000111\ndata/0039/000112\ndata/0039/000113\ndata/0039/000114\ndata/0039/000115\ndata/0039/000116\ndata/0039/000117\ndata/0039/000118\ndata/0039/000119\ndata/0039/000120\ndata/0039/000121\ndata/0039/000122\ndata/0039/000123\ndata/0039/000124\ndata/0039/000125\ndata/0039/000126\ndata/0039/000127\ndata/0039/000128\ndata/0039/000129\ndata/0039/000130\ndata/0039/000131\ndata/0039/000132\ndata/0039/000133\ndata/0039/000134\ndata/0039/000135\ndata/0039/000136\ndata/0039/000137\ndata/0039/000138\ndata/0039/000139\ndata/0039/000140\ndata/0039/000141\ndata/0039/000142\ndata/0039/000143\ndata/0039/000144\ndata/0039/000145\ndata/0039/000146\ndata/0039/000147\ndata/0039/000148\ndata/0039/000149\ndata/0039/000150\ndata/0039/000151\ndata/0039/000152\ndata/0039/000153\ndata/0039/000154\ndata/0039/000155\ndata/0039/000156\ndata/0039/000157\ndata/0039/000158\ndata/0039/000159\ndata/0039/000160\ndata/0039/000161\ndata/0039/000162\ndata/0039/000163\ndata/0039/000164\ndata/0039/000165\ndata/0039/000166\ndata/0039/000167\ndata/0039/000168\ndata/0039/000169\ndata/0039/000170\ndata/0039/000171\ndata/0039/000172\ndata/0039/000173\ndata/0039/000174\ndata/0039/000175\ndata/0039/000176\ndata/0039/000177\ndata/0039/000178\ndata/0039/000179\ndata/0039/000180\ndata/0039/000181\ndata/0039/000182\ndata/0039/000183\ndata/0039/000184\ndata/0039/000185\ndata/0039/000186\ndata/0039/000187\ndata/0039/000188\ndata/0039/000189\ndata/0039/000190\ndata/0039/000191\ndata/0039/000192\ndata/0039/000193\ndata/0039/000194\ndata/0039/000195\ndata/0039/000196\ndata/0039/000197\ndata/0039/000198\ndata/0039/000199\ndata/0039/000200\ndata/0039/000201\ndata/0039/000202\ndata/0039/000203\ndata/0039/000204\ndata/0039/000205\ndata/0039/000206\ndata/0039/000207\ndata/0039/000208\ndata/0039/000209\ndata/0039/000210\ndata/0039/000211\ndata/0039/000212\ndata/0039/000213\ndata/0039/000214\ndata/0039/000215\ndata/0039/000216\ndata/0039/000217\ndata/0039/000218\ndata/0039/000219\ndata/0039/000220\ndata/0039/000221\ndata/0039/000222\ndata/0039/000223\ndata/0039/000224\ndata/0039/000225\ndata/0039/000226\ndata/0039/000227\ndata/0039/000228\ndata/0039/000229\ndata/0039/000230\ndata/0039/000231\ndata/0039/000232\ndata/0039/000233\ndata/0039/000234\ndata/0039/000235\ndata/0039/000236\ndata/0039/000237\ndata/0039/000238\ndata/0039/000239\ndata/0039/000240\ndata/0039/000241\ndata/0039/000242\ndata/0039/000243\ndata/0039/000244\ndata/0039/000245\ndata/0039/000246\ndata/0039/000247\ndata/0039/000248\ndata/0039/000249\ndata/0039/000250\ndata/0039/000251\ndata/0039/000252\ndata/0039/000253\ndata/0039/000254\ndata/0039/000255\ndata/0039/000256\ndata/0039/000257\ndata/0039/000258\ndata/0039/000259\ndata/0039/000260\ndata/0039/000261\ndata/0039/000262\ndata/0039/000263\ndata/0039/000264\ndata/0039/000265\ndata/0039/000266\ndata/0039/000267\ndata/0039/000268\ndata/0039/000269\ndata/0039/000270\ndata/0039/000271\ndata/0039/000272\ndata/0039/000273\ndata/0039/000274\ndata/0039/000275\ndata/0039/000276\ndata/0039/000277\ndata/0039/000278\ndata/0039/000279\ndata/0039/000280\ndata/0039/000281\ndata/0039/000282\ndata/0039/000283\ndata/0039/000284\ndata/0039/000285\ndata/0039/000286\ndata/0039/000287\ndata/0039/000288\ndata/0039/000289\ndata/0039/000290\ndata/0039/000291\ndata/0039/000292\ndata/0039/000293\ndata/0039/000294\ndata/0039/000295\ndata/0039/000296\ndata/0039/000297\ndata/0039/000298\ndata/0039/000299\ndata/0039/000300\ndata/0039/000301\ndata/0039/000302\ndata/0039/000303\ndata/0039/000304\ndata/0039/000305\ndata/0039/000306\ndata/0039/000307\ndata/0039/000308\ndata/0039/000309\ndata/0039/000310\ndata/0039/000311\ndata/0039/000312\ndata/0039/000313\ndata/0039/000314\ndata/0039/000315\ndata/0039/000316\ndata/0039/000317\ndata/0039/000318\ndata/0039/000319\ndata/0039/000320\ndata/0039/000321\ndata/0039/000322\ndata/0039/000323\ndata/0039/000324\ndata/0039/000325\ndata/0039/000326\ndata/0039/000327\ndata/0039/000328\ndata/0039/000329\ndata/0039/000330\ndata/0039/000331\ndata/0039/000332\ndata/0039/000333\ndata/0039/000334\ndata/0039/000335\ndata/0039/000336\ndata/0039/000337\ndata/0039/000338\ndata/0039/000339\ndata/0039/000340\ndata/0039/000341\ndata/0039/000342\ndata/0039/000343\ndata/0039/000344\ndata/0039/000345\ndata/0039/000346\ndata/0039/000347\ndata/0039/000348\ndata/0039/000349\ndata/0039/000350\ndata/0039/000351\ndata/0039/000352\ndata/0039/000353\ndata/0039/000354\ndata/0039/000355\ndata/0039/000356\ndata/0039/000357\ndata/0039/000358\ndata/0039/000359\ndata/0039/000360\ndata/0039/000361\ndata/0039/000362\ndata/0039/000363\ndata/0039/000364\ndata/0039/000365\ndata/0039/000366\ndata/0039/000367\ndata/0039/000368\ndata/0039/000369\ndata/0039/000370\ndata/0039/000371\ndata/0039/000372\ndata/0039/000373\ndata/0039/000374\ndata/0039/000375\ndata/0039/000376\ndata/0039/000377\ndata/0039/000378\ndata/0039/000379\ndata/0039/000380\ndata/0039/000381\ndata/0039/000382\ndata/0039/000383\ndata/0039/000384\ndata/0039/000385\ndata/0039/000386\ndata/0039/000387\ndata/0039/000388\ndata/0039/000389\ndata/0039/000390\ndata/0039/000391\ndata/0039/000392\ndata/0039/000393\ndata/0039/000394\ndata/0039/000395\ndata/0039/000396\ndata/0039/000397\ndata/0039/000398\ndata/0039/000399\ndata/0039/000400\ndata/0039/000401\ndata/0039/000402\ndata/0039/000403\ndata/0039/000404\ndata/0039/000405\ndata/0039/000406\ndata/0039/000407\ndata/0039/000408\ndata/0039/000409\ndata/0039/000410\ndata/0039/000411\ndata/0039/000412\ndata/0039/000413\ndata/0039/000414\ndata/0039/000415\ndata/0039/000416\ndata/0039/000417\ndata/0039/000418\ndata/0039/000419\ndata/0039/000420\ndata/0039/000421\ndata/0039/000422\ndata/0039/000423\ndata/0039/000424\ndata/0039/000425\ndata/0039/000426\ndata/0039/000427\ndata/0039/000428\ndata/0039/000429\ndata/0039/000430\ndata/0039/000431\ndata/0039/000432\ndata/0039/000433\ndata/0039/000434\ndata/0039/000435\ndata/0039/000436\ndata/0039/000437\ndata/0039/000438\ndata/0039/000439\ndata/0039/000440\ndata/0039/000441\ndata/0039/000442\ndata/0039/000443\ndata/0039/000444\ndata/0039/000445\ndata/0039/000446\ndata/0039/000447\ndata/0039/000448\ndata/0039/000449\ndata/0039/000450\ndata/0039/000451\ndata/0039/000452\ndata/0039/000453\ndata/0039/000454\ndata/0039/000455\ndata/0039/000456\ndata/0039/000457\ndata/0039/000458\ndata/0039/000459\ndata/0039/000460\ndata/0039/000461\ndata/0039/000462\ndata/0039/000463\ndata/0039/000464\ndata/0039/000465\ndata/0039/000466\ndata/0039/000467\ndata/0039/000468\ndata/0039/000469\ndata/0039/000470\ndata/0039/000471\ndata/0039/000472\ndata/0039/000473\ndata/0039/000474\ndata/0039/000475\ndata/0039/000476\ndata/0039/000477\ndata/0039/000478\ndata/0039/000479\ndata/0039/000480\ndata/0039/000481\ndata/0039/000482\ndata/0039/000483\ndata/0039/000484\ndata/0039/000485\ndata/0039/000486\ndata/0039/000487\ndata/0039/000488\ndata/0039/000489\ndata/0039/000490\ndata/0039/000491\ndata/0039/000492\ndata/0039/000493\ndata/0039/000494\ndata/0039/000495\ndata/0039/000496\ndata/0039/000497\ndata/0039/000498\ndata/0039/000499\ndata/0039/000500\ndata/0039/000501\ndata/0039/000502\ndata/0039/000503\ndata/0039/000504\ndata/0039/000505\ndata/0039/000506\ndata/0039/000507\ndata/0039/000508\ndata/0039/000509\ndata/0039/000510\ndata/0039/000511\ndata/0039/000512\ndata/0039/000513\ndata/0039/000514\ndata/0039/000515\ndata/0039/000516\ndata/0039/000517\ndata/0039/000518\ndata/0039/000519\ndata/0039/000520\ndata/0039/000521\ndata/0039/000522\ndata/0039/000523\ndata/0039/000524\ndata/0039/000525\ndata/0039/000526\ndata/0039/000527\ndata/0039/000528\ndata/0039/000529\ndata/0039/000530\ndata/0039/000531\ndata/0039/000532\ndata/0039/000533\ndata/0039/000534\ndata/0039/000535\ndata/0039/000536\ndata/0039/000537\ndata/0039/000538\ndata/0039/000539\ndata/0039/000540\ndata/0039/000541\ndata/0039/000542\ndata/0039/000543\ndata/0039/000544\ndata/0039/000545\ndata/0039/000546\ndata/0039/000547\ndata/0039/000548\ndata/0039/000549\ndata/0039/000550\ndata/0039/000551\ndata/0039/000552\ndata/0039/000553\ndata/0039/000554\ndata/0039/000555\ndata/0039/000556\ndata/0039/000557\ndata/0039/000558\ndata/0039/000559\ndata/0039/000560\ndata/0039/000561\ndata/0039/000562\ndata/0039/000563\ndata/0039/000564\ndata/0039/000565\ndata/0039/000566\ndata/0039/000567\ndata/0039/000568\ndata/0039/000569\ndata/0039/000570\ndata/0039/000571\ndata/0039/000572\ndata/0039/000573\ndata/0039/000574\ndata/0039/000575\ndata/0039/000576\ndata/0039/000577\ndata/0039/000578\ndata/0039/000579\ndata/0039/000580\ndata/0039/000581\ndata/0039/000582\ndata/0039/000583\ndata/0039/000584\ndata/0039/000585\ndata/0039/000586\ndata/0039/000587\ndata/0039/000588\ndata/0039/000589\ndata/0039/000590\ndata/0039/000591\ndata/0039/000592\ndata/0039/000593\ndata/0039/000594\ndata/0039/000595\ndata/0039/000596\ndata/0039/000597\ndata/0039/000598\ndata/0039/000599\ndata/0039/000600\ndata/0039/000601\ndata/0039/000602\ndata/0039/000603\ndata/0039/000604\ndata/0039/000605\ndata/0039/000606\ndata/0039/000607\ndata/0039/000608\ndata/0039/000609\ndata/0039/000610\ndata/0039/000611\ndata/0039/000612\ndata/0039/000613\ndata/0039/000614\ndata/0039/000615\ndata/0039/000616\ndata/0039/000617\ndata/0039/000618\ndata/0039/000619\ndata/0039/000620\ndata/0039/000621\ndata/0039/000622\ndata/0039/000623\ndata/0039/000624\ndata/0039/000625\ndata/0039/000626\ndata/0039/000627\ndata/0039/000628\ndata/0039/000629\ndata/0039/000630\ndata/0039/000631\ndata/0039/000632\ndata/0039/000633\ndata/0039/000634\ndata/0039/000635\ndata/0039/000636\ndata/0039/000637\ndata/0039/000638\ndata/0039/000639\ndata/0039/000640\ndata/0039/000641\ndata/0039/000642\ndata/0039/000643\ndata/0039/000644\ndata/0039/000645\ndata/0039/000646\ndata/0039/000647\ndata/0039/000648\ndata/0039/000649\ndata/0039/000650\ndata/0039/000651\ndata/0039/000652\ndata/0039/000653\ndata/0039/000654\ndata/0039/000655\ndata/0039/000656\ndata/0039/000657\ndata/0039/000658\ndata/0039/000659\ndata/0039/000660\ndata/0039/000661\ndata/0039/000662\ndata/0039/000663\ndata/0039/000664\ndata/0039/000665\ndata/0039/000666\ndata/0039/000667\ndata/0039/000668\ndata/0039/000669\ndata/0039/000670\ndata/0039/000671\ndata/0039/000672\ndata/0039/000673\ndata/0039/000674\ndata/0039/000675\ndata/0039/000676\ndata/0039/000677\ndata/0039/000678\ndata/0039/000679\ndata/0039/000680\ndata/0039/000681\ndata/0039/000682\ndata/0039/000683\ndata/0039/000684\ndata/0039/000685\ndata/0039/000686\ndata/0039/000687\ndata/0039/000688\ndata/0039/000689\ndata/0039/000690\ndata/0039/000691\ndata/0039/000692\ndata/0039/000693\ndata/0039/000694\ndata/0039/000695\ndata/0039/000696\ndata/0039/000697\ndata/0039/000698\ndata/0039/000699\ndata/0039/000700\ndata/0039/000701\ndata/0039/000702\ndata/0039/000703\ndata/0039/000704\ndata/0039/000705\ndata/0039/000706\ndata/0039/000707\ndata/0039/000708\ndata/0039/000709\ndata/0039/000710\ndata/0039/000711\ndata/0039/000712\ndata/0039/000713\ndata/0039/000714\ndata/0039/000715\ndata/0039/000716\ndata/0039/000717\ndata/0039/000718\ndata/0039/000719\ndata/0039/000720\ndata/0039/000721\ndata/0039/000722\ndata/0039/000723\ndata/0039/000724\ndata/0039/000725\ndata/0039/000726\ndata/0039/000727\ndata/0039/000728\ndata/0039/000729\ndata/0039/000730\ndata/0039/000731\ndata/0039/000732\ndata/0039/000733\ndata/0039/000734\ndata/0039/000735\ndata/0039/000736\ndata/0039/000737\ndata/0039/000738\ndata/0039/000739\ndata/0039/000740\ndata/0039/000741\ndata/0039/000742\ndata/0039/000743\ndata/0039/000744\ndata/0039/000745\ndata/0039/000746\ndata/0039/000747\ndata/0039/000748\ndata/0039/000749\ndata/0039/000750\ndata/0039/000751\ndata/0039/000752\ndata/0039/000753\ndata/0039/000754\ndata/0039/000755\ndata/0039/000756\ndata/0039/000757\ndata/0039/000758\ndata/0039/000759\ndata/0039/000760\ndata/0039/000761\ndata/0039/000762\ndata/0039/000763\ndata/0039/000764\ndata/0039/000765\ndata/0039/000766\ndata/0039/000767\ndata/0039/000768\ndata/0039/000769\ndata/0039/000770\ndata/0039/000771\ndata/0039/000772\ndata/0039/000773\ndata/0039/000774\ndata/0039/000775\ndata/0039/000776\ndata/0039/000777\ndata/0039/000778\ndata/0039/000779\ndata/0039/000780\ndata/0039/000781\ndata/0039/000782\ndata/0039/000783\ndata/0039/000784\ndata/0039/000785\ndata/0039/000786\ndata/0039/000787\ndata/0039/000788\ndata/0039/000789\ndata/0039/000790\ndata/0039/000791\ndata/0039/000792\ndata/0039/000793\ndata/0039/000794\ndata/0039/000795\ndata/0039/000796\ndata/0039/000797\ndata/0039/000798\ndata/0039/000799\ndata/0039/000800\ndata/0039/000801\ndata/0039/000802\ndata/0039/000803\ndata/0039/000804\ndata/0039/000805\ndata/0039/000806\ndata/0039/000807\ndata/0039/000808\ndata/0039/000809\ndata/0039/000810\ndata/0039/000811\ndata/0039/000812\ndata/0039/000813\ndata/0039/000814\ndata/0039/000815\ndata/0039/000816\ndata/0039/000817\ndata/0039/000818\ndata/0039/000819\ndata/0039/000820\ndata/0039/000821\ndata/0039/000822\ndata/0039/000823\ndata/0039/000824\ndata/0039/000825\ndata/0039/000826\ndata/0039/000827\ndata/0039/000828\ndata/0039/000829\ndata/0039/000830\ndata/0039/000831\ndata/0039/000832\ndata/0039/000833\ndata/0039/000834\ndata/0039/000835\ndata/0039/000836\ndata/0039/000837\ndata/0039/000838\ndata/0039/000839\ndata/0039/000840\ndata/0039/000841\ndata/0039/000842\ndata/0039/000843\ndata/0039/000844\ndata/0039/000845\ndata/0039/000846\ndata/0039/000847\ndata/0039/000848\ndata/0039/000849\ndata/0039/000850\ndata/0039/000851\ndata/0039/000852\ndata/0039/000853\ndata/0039/000854\ndata/0039/000855\ndata/0039/000856\ndata/0039/000857\ndata/0039/000858\ndata/0039/000859\ndata/0039/000860\ndata/0039/000861\ndata/0039/000862\ndata/0039/000863\ndata/0039/000864\ndata/0039/000865\ndata/0039/000866\ndata/0039/000867\ndata/0039/000868\ndata/0039/000869\ndata/0039/000870\ndata/0039/000871\ndata/0039/000872\ndata/0039/000873\ndata/0039/000874\ndata/0039/000875\ndata/0039/000876\ndata/0039/000877\ndata/0039/000878\ndata/0039/000879\ndata/0039/000880\ndata/0039/000881\ndata/0039/000882\ndata/0039/000883\ndata/0039/000884\ndata/0039/000885\ndata/0039/000886\ndata/0039/000887\ndata/0039/000888\ndata/0039/000889\ndata/0039/000890\ndata/0039/000891\ndata/0039/000892\ndata/0039/000893\ndata/0039/000894\ndata/0039/000895\ndata/0039/000896\ndata/0039/000897\ndata/0039/000898\ndata/0039/000899\ndata/0039/000900\ndata/0039/000901\ndata/0039/000902\ndata/0039/000903\ndata/0039/000904\ndata/0039/000905\ndata/0039/000906\ndata/0039/000907\ndata/0039/000908\ndata/0039/000909\ndata/0039/000910\ndata/0039/000911\ndata/0039/000912\ndata/0039/000913\ndata/0039/000914\ndata/0039/000915\ndata/0039/000916\ndata/0039/000917\ndata/0039/000918\ndata/0039/000919\ndata/0039/000920\ndata/0039/000921\ndata/0039/000922\ndata/0039/000923\ndata/0039/000924\ndata/0039/000925\ndata/0039/000926\ndata/0039/000927\ndata/0039/000928\ndata/0039/000929\ndata/0039/000930\ndata/0039/000931\ndata/0039/000932\ndata/0039/000933\ndata/0039/000934\ndata/0039/000935\ndata/0039/000936\ndata/0039/000937\ndata/0039/000938\ndata/0039/000939\ndata/0039/000940\ndata/0039/000941\ndata/0039/000942\ndata/0039/000943\ndata/0039/000944\ndata/0039/000945\ndata/0039/000946\ndata/0039/000947\ndata/0039/000948\ndata/0039/000949\ndata/0039/000950\ndata/0039/000951\ndata/0039/000952\ndata/0039/000953\ndata/0039/000954\ndata/0039/000955\ndata/0039/000956\ndata/0039/000957\ndata/0039/000958\ndata/0039/000959\ndata/0039/000960\ndata/0039/000961\ndata/0039/000962\ndata/0039/000963\ndata/0039/000964\ndata/0039/000965\ndata/0039/000966\ndata/0039/000967\ndata/0039/000968\ndata/0039/000969\ndata/0039/000970\ndata/0039/000971\ndata/0039/000972\ndata/0039/000973\ndata/0039/000974\ndata/0039/000975\ndata/0039/000976\ndata/0039/000977\ndata/0039/000978\ndata/0039/000979\ndata/0039/000980\ndata/0039/000981\ndata/0039/000982\ndata/0039/000983\ndata/0039/000984\ndata/0039/000985\ndata/0039/000986\ndata/0039/000987\ndata/0039/000988\ndata/0039/000989\ndata/0039/000990\ndata/0039/000991\ndata/0039/000992\ndata/0039/000993\ndata/0039/000994\ndata/0039/000995\ndata/0039/000996\ndata/0039/000997\ndata/0039/000998\ndata/0039/000999\ndata/0039/001000\ndata/0039/001001\ndata/0039/001002\ndata/0039/001003\ndata/0039/001004\ndata/0039/001005\ndata/0039/001006\ndata/0039/001007\ndata/0039/001008\ndata/0039/001009\ndata/0039/001010\ndata/0039/001011\ndata/0039/001012\ndata/0039/001013\ndata/0039/001014\ndata/0039/001015\ndata/0039/001016\ndata/0039/001017\ndata/0039/001018\ndata/0039/001019\ndata/0039/001020\ndata/0039/001021\ndata/0039/001022\ndata/0039/001023\ndata/0039/001024\ndata/0039/001025\ndata/0039/001026\ndata/0039/001027\ndata/0039/001028\ndata/0039/001029\ndata/0039/001030\ndata/0039/001031\ndata/0039/001032\ndata/0039/001033\ndata/0039/001034\ndata/0039/001035\ndata/0039/001036\ndata/0039/001037\ndata/0039/001038\ndata/0039/001039\ndata/0039/001040\ndata/0039/001041\ndata/0039/001042\ndata/0039/001043\ndata/0039/001044\ndata/0039/001045\ndata/0039/001046\ndata/0039/001047\ndata/0039/001048\ndata/0039/001049\ndata/0039/001050\ndata/0039/001051\ndata/0039/001052\ndata/0039/001053\ndata/0039/001054\ndata/0039/001055\ndata/0039/001056\ndata/0039/001057\ndata/0039/001058\ndata/0039/001059\ndata/0039/001060\ndata/0039/001061\ndata/0039/001062\ndata/0039/001063\ndata/0039/001064\ndata/0039/001065\ndata/0039/001066\ndata/0039/001067\ndata/0039/001068\ndata/0039/001069\ndata/0039/001070\ndata/0039/001071\ndata/0039/001072\ndata/0039/001073\ndata/0039/001074\ndata/0039/001075\ndata/0039/001076\ndata/0039/001077\ndata/0039/001078\ndata/0039/001079\ndata/0039/001080\ndata/0039/001081\ndata/0039/001082\ndata/0039/001083\ndata/0039/001084\ndata/0039/001085\ndata/0039/001086\ndata/0039/001087\ndata/0039/001088\ndata/0039/001089\ndata/0039/001090\ndata/0039/001091\n"
  },
  {
    "path": "DenseFusion/datasets/warehouse/dataset_config/train_data_list.txt",
    "content": "data/0000/000001\ndata/0000/000002\ndata/0000/000003\ndata/0000/000004\ndata/0000/000005\ndata/0000/000006\ndata/0000/000007\ndata/0000/000008\ndata/0000/000009\ndata/0000/000010\ndata/0000/000011\ndata/0000/000012\ndata/0000/000013\ndata/0000/000014\ndata/0000/000015\ndata/0000/000016\ndata/0000/000017\ndata/0000/000018\ndata/0000/000019\ndata/0000/000020\ndata/0000/000021\ndata/0000/000022\ndata/0000/000023\ndata/0000/000024\ndata/0000/000025\ndata/0000/000026\ndata/0000/000027\ndata/0000/000028\ndata/0000/000029\ndata/0000/000030\ndata/0000/000031\ndata/0000/000032\ndata/0000/000033\ndata/0000/000034\ndata/0000/000035\ndata/0000/000036\ndata/0000/000037\ndata/0000/000038\ndata/0000/000039\ndata/0000/000040\ndata/0000/000041\ndata/0000/000042\ndata/0000/000043\ndata/0000/000044\ndata/0000/000045\ndata/0000/000046\ndata/0000/000047\ndata/0000/000048\ndata/0000/000049\ndata/0000/000050\ndata/0000/000051\ndata/0000/000052\ndata/0000/000053\ndata/0000/000054\ndata/0000/000055\ndata/0000/000056\ndata/0000/000057\ndata/0000/000058\ndata/0000/000059\ndata/0000/000060\ndata/0000/000061\ndata/0000/000062\ndata/0000/000063\ndata/0000/000064\ndata/0000/000065\ndata/0000/000066\ndata/0000/000067\ndata/0000/000068\ndata/0000/000069\ndata/0000/000070\ndata/0000/000071\ndata/0000/000072\ndata/0000/000073\ndata/0000/000074\ndata/0000/000075\ndata/0000/000076\ndata/0000/000077\ndata/0000/000078\ndata/0000/000079\ndata/0000/000080\ndata/0000/000081\ndata/0000/000082\ndata/0000/000083\ndata/0000/000084\ndata/0000/000085\ndata/0000/000086\ndata/0000/000087\ndata/0000/000088\ndata/0000/000089\ndata/0000/000090\ndata/0000/000091\ndata/0000/000092\ndata/0000/000093\ndata/0000/000094\ndata/0000/000095\ndata/0000/000096\ndata/0000/000097\ndata/0000/000098\ndata/0000/000099\ndata/0000/000100\ndata/0000/000101\ndata/0000/000102\ndata/0000/000103\ndata/0000/000104\ndata/0000/000105\ndata/0000/000106\ndata/0000/000107\ndata/0000/000108\ndata/0000/000109\ndata/0000/000110\ndata/0000/000111\ndata/0000/000112\ndata/0000/000113\ndata/0000/000114\ndata/0000/000115\ndata/0000/000116\ndata/0000/000117\ndata/0000/000118\ndata/0000/000119\ndata/0000/000120\ndata/0000/000121\ndata/0000/000122\ndata/0000/000123\ndata/0000/000124\ndata/0000/000125\ndata/0000/000126\ndata/0000/000127\ndata/0000/000128\ndata/0000/000129\ndata/0000/000130\ndata/0000/000131\ndata/0000/000132\ndata/0000/000133\ndata/0000/000134\ndata/0000/000135\ndata/0000/000136\ndata/0000/000137\ndata/0000/000138\ndata/0000/000139\ndata/0000/000140\ndata/0000/000141\ndata/0000/000142\ndata/0000/000143\ndata/0000/000144\ndata/0000/000145\ndata/0000/000146\ndata/0000/000147\ndata/0000/000148\ndata/0000/000149\ndata/0000/000150\ndata/0000/000151\ndata/0000/000152\ndata/0000/000153\ndata/0000/000154\ndata/0000/000155\ndata/0000/000156\ndata/0000/000157\ndata/0000/000158\ndata/0000/000159\ndata/0000/000160\ndata/0000/000161\ndata/0000/000162\ndata/0000/000163\ndata/0000/000164\ndata/0000/000165\ndata/0000/000166\ndata/0000/000167\ndata/0000/000168\ndata/0000/000169\ndata/0000/000170\ndata/0000/000171\ndata/0000/000172\ndata/0000/000173\ndata/0000/000174\ndata/0000/000175\ndata/0000/000176\ndata/0000/000177\ndata/0000/000178\ndata/0000/000179\ndata/0000/000180\ndata/0000/000181\ndata/0000/000182\ndata/0000/000183\ndata/0000/000184\ndata/0000/000185\ndata/0000/000186\ndata/0000/000187\ndata/0000/000188\ndata/0000/000189\ndata/0000/000190\ndata/0000/000191\ndata/0000/000192\ndata/0000/000193\ndata/0000/000194\ndata/0000/000195\ndata/0000/000196\ndata/0000/000197\ndata/0000/000198\ndata/0000/000199\ndata/0000/000200\ndata/0000/000201\ndata/0000/000202\ndata/0000/000203\ndata/0000/000204\ndata/0000/000205\ndata/0000/000206\ndata/0000/000207\ndata/0000/000208\ndata/0000/000209\ndata/0000/000210\ndata/0000/000211\ndata/0000/000212\ndata/0000/000213\ndata/0000/000214\ndata/0000/000215\ndata/0000/000216\ndata/0000/000217\ndata/0000/000218\ndata/0000/000219\ndata/0000/000220\ndata/0000/000221\ndata/0000/000222\ndata/0000/000223\ndata/0000/000224\ndata/0000/000225\ndata/0000/000226\ndata/0000/000227\ndata/0000/000228\ndata/0000/000229\ndata/0000/000230\ndata/0000/000231\ndata/0000/000232\ndata/0000/000233\ndata/0000/000234\ndata/0000/000235\ndata/0000/000236\ndata/0000/000237\ndata/0000/000238\ndata/0000/000239\ndata/0000/000240\ndata/0000/000241\ndata/0000/000242\ndata/0000/000243\ndata/0000/000244\ndata/0000/000245\ndata/0000/000246\ndata/0000/000247\ndata/0000/000248\ndata/0000/000249\ndata/0000/000250\ndata/0000/000251\ndata/0000/000252\ndata/0000/000253\ndata/0000/000254\ndata/0000/000255\ndata/0000/000256\ndata/0000/000257\ndata/0000/000258\ndata/0000/000259\ndata/0000/000260\ndata/0000/000261\ndata/0000/000262\ndata/0000/000263\ndata/0000/000264\ndata/0000/000265\ndata/0000/000266\ndata/0000/000267\ndata/0000/000268\ndata/0000/000269\ndata/0000/000270\ndata/0000/000271\ndata/0000/000272\ndata/0000/000273\ndata/0000/000274\ndata/0000/000275\ndata/0000/000276\ndata/0000/000277\ndata/0000/000278\ndata/0000/000279\ndata/0000/000280\ndata/0000/000281\ndata/0000/000282\ndata/0000/000283\ndata/0000/000284\ndata/0000/000285\ndata/0000/000286\ndata/0000/000287\ndata/0000/000288\ndata/0000/000289\ndata/0000/000290\ndata/0000/000291\ndata/0000/000292\ndata/0000/000293\ndata/0000/000294\ndata/0000/000295\ndata/0000/000296\ndata/0000/000297\ndata/0000/000298\ndata/0000/000299\ndata/0000/000300\ndata/0000/000301\ndata/0000/000302\ndata/0000/000303\ndata/0000/000304\ndata/0000/000305\ndata/0000/000306\ndata/0000/000307\ndata/0000/000308\ndata/0000/000309\ndata/0000/000310\ndata/0000/000311\ndata/0000/000312\ndata/0000/000313\ndata/0000/000314\ndata/0000/000315\ndata/0000/000316\ndata/0000/000317\ndata/0000/000318\ndata/0000/000319\ndata/0000/000320\ndata/0000/000321\ndata/0000/000322\ndata/0000/000323\ndata/0000/000324\ndata/0000/000325\ndata/0000/000326\ndata/0000/000327\ndata/0000/000328\ndata/0000/000329\ndata/0000/000330\ndata/0000/000331\ndata/0000/000332\ndata/0000/000333\ndata/0000/000334\ndata/0000/000335\ndata/0000/000336\ndata/0000/000337\ndata/0000/000338\ndata/0000/000339\ndata/0000/000340\ndata/0000/000341\ndata/0000/000342\ndata/0000/000343\ndata/0000/000344\ndata/0000/000345\ndata/0000/000346\ndata/0000/000347\ndata/0000/000348\ndata/0000/000349\ndata/0000/000350\ndata/0000/000351\ndata/0000/000352\ndata/0000/000353\ndata/0000/000354\ndata/0000/000355\ndata/0000/000356\ndata/0000/000357\ndata/0000/000358\ndata/0000/000359\ndata/0000/000360\ndata/0000/000361\ndata/0000/000362\ndata/0000/000363\ndata/0000/000364\ndata/0000/000365\ndata/0000/000366\ndata/0000/000367\ndata/0000/000368\ndata/0000/000369\ndata/0000/000370\ndata/0000/000371\ndata/0000/000372\ndata/0000/000373\ndata/0000/000374\ndata/0000/000375\ndata/0000/000376\ndata/0000/000377\ndata/0000/000378\ndata/0000/000379\ndata/0000/000380\ndata/0000/000381\ndata/0000/000382\ndata/0000/000383\ndata/0000/000384\ndata/0000/000385\ndata/0000/000386\ndata/0000/000387\ndata/0000/000388\ndata/0000/000389\ndata/0000/000390\ndata/0000/000391\ndata/0000/000392\ndata/0000/000393\ndata/0000/000394\ndata/0000/000395\ndata/0000/000396\ndata/0000/000397\ndata/0000/000398\ndata/0000/000399\ndata/0000/000400\ndata/0000/000401\ndata/0000/000402\ndata/0000/000403\ndata/0000/000404\ndata/0000/000405\ndata/0000/000406\ndata/0000/000407\ndata/0000/000408\ndata/0000/000409\ndata/0000/000410\ndata/0000/000411\ndata/0000/000412\ndata/0000/000413\ndata/0000/000414\ndata/0000/000415\ndata/0000/000416\ndata/0000/000417\ndata/0000/000418\ndata/0000/000419\ndata/0000/000420\ndata/0000/000421\ndata/0000/000422\ndata/0000/000423\ndata/0000/000424\ndata/0000/000425\ndata/0000/000426\ndata/0000/000427\ndata/0000/000428\ndata/0000/000429\ndata/0000/000430\ndata/0000/000431\ndata/0000/000432\ndata/0000/000433\ndata/0000/000434\ndata/0000/000435\ndata/0000/000436\ndata/0000/000437\ndata/0000/000438\ndata/0000/000439\ndata/0000/000440\ndata/0000/000441\ndata/0000/000442\ndata/0000/000443\ndata/0000/000444\ndata/0000/000445\ndata/0000/000446\ndata/0000/000447\ndata/0000/000448\ndata/0000/000449\ndata/0000/000450\ndata/0000/000451\ndata/0000/000452\ndata/0000/000453\ndata/0000/000454\ndata/0000/000455\ndata/0000/000456\ndata/0000/000457\ndata/0000/000458\ndata/0000/000459\ndata/0000/000460\ndata/0000/000461\ndata/0000/000462\ndata/0000/000463\ndata/0000/000464\ndata/0000/000465\ndata/0000/000466\ndata/0000/000467\ndata/0000/000468\ndata/0000/000469\ndata/0000/000470\ndata/0000/000471\ndata/0000/000472\ndata/0000/000473\ndata/0000/000474\ndata/0000/000475\ndata/0000/000476\ndata/0000/000477\ndata/0000/000478\ndata/0000/000479\ndata/0000/000480\ndata/0000/000481\ndata/0000/000482\ndata/0000/000483\ndata/0000/000484\ndata/0000/000485\ndata/0000/000486\ndata/0000/000487\ndata/0000/000488\ndata/0000/000489\ndata/0000/000490\ndata/0000/000491\ndata/0000/000492\ndata/0000/000493\ndata/0000/000494\ndata/0000/000495\ndata/0000/000496\ndata/0000/000497\ndata/0000/000498\ndata/0000/000499\ndata/0000/000500\ndata/0000/000501\ndata/0000/000502\ndata/0000/000503\ndata/0000/000504\ndata/0000/000505\ndata/0000/000506\ndata/0000/000507\ndata/0000/000508\ndata/0000/000509\ndata/0000/000510\ndata/0000/000511\ndata/0000/000512\ndata/0000/000513\ndata/0000/000514\ndata/0000/000515\ndata/0000/000516\ndata/0000/000517\ndata/0000/000518\ndata/0000/000519\ndata/0000/000520\ndata/0000/000521\ndata/0000/000522\ndata/0000/000523\ndata/0000/000524\ndata/0000/000525\ndata/0000/000526\ndata/0000/000527\ndata/0000/000528\ndata/0000/000529\ndata/0000/000530\ndata/0000/000531\ndata/0000/000532\ndata/0000/000533\ndata/0000/000534\ndata/0000/000535\ndata/0000/000536\ndata/0000/000537\ndata/0000/000538\ndata/0000/000539\ndata/0000/000540\ndata/0000/000541\ndata/0000/000542\ndata/0000/000543\ndata/0000/000544\ndata/0000/000545\ndata/0000/000546\ndata/0000/000547\ndata/0000/000548\ndata/0000/000549\ndata/0000/000550\ndata/0000/000551\ndata/0000/000552\ndata/0000/000553\ndata/0000/000554\ndata/0000/000555\ndata/0000/000556\ndata/0000/000557\ndata/0000/000558\ndata/0000/000559\ndata/0000/000560\ndata/0000/000561\ndata/0000/000562\ndata/0000/000563\ndata/0000/000564\ndata/0000/000565\ndata/0000/000566\ndata/0000/000567\ndata/0000/000568\ndata/0000/000569\ndata/0000/000570\ndata/0000/000571\ndata/0000/000572\ndata/0000/000573\ndata/0000/000574\ndata/0000/000575\ndata/0000/000576\ndata/0000/000577\ndata/0000/000578\ndata/0000/000579\ndata/0000/000580\ndata/0000/000581\ndata/0000/000582\ndata/0000/000583\ndata/0000/000584\ndata/0000/000585\ndata/0000/000586\ndata/0000/000587\ndata/0000/000588\ndata/0000/000589\ndata/0000/000590\ndata/0000/000591\ndata/0000/000592\ndata/0000/000593\ndata/0000/000594\ndata/0000/000595\ndata/0000/000596\ndata/0000/000597\ndata/0000/000598\ndata/0000/000599\ndata/0000/000600\ndata/0000/000601\ndata/0000/000602\ndata/0000/000603\ndata/0000/000604\ndata/0000/000605\ndata/0000/000606\ndata/0000/000607\ndata/0000/000608\ndata/0000/000609\ndata/0000/000610\ndata/0000/000611\ndata/0000/000612\ndata/0000/000613\ndata/0000/000614\ndata/0000/000615\ndata/0000/000616\ndata/0000/000617\ndata/0000/000618\ndata/0000/000619\ndata/0000/000620\ndata/0000/000621\ndata/0000/000622\ndata/0000/000623\ndata/0000/000624\ndata/0000/000625\ndata/0000/000626\ndata/0000/000627\ndata/0000/000628\ndata/0000/000629\ndata/0000/000630\ndata/0000/000631\ndata/0000/000632\ndata/0000/000633\ndata/0000/000634\ndata/0000/000635\ndata/0000/000636\ndata/0000/000637\ndata/0000/000638\ndata/0000/000639\ndata/0000/000640\ndata/0000/000641\ndata/0000/000642\ndata/0000/000643\ndata/0000/000644\ndata/0000/000645\ndata/0000/000646\ndata/0000/000647\ndata/0000/000648\ndata/0000/000649\ndata/0000/000650\ndata/0000/000651\ndata/0000/000652\ndata/0000/000653\ndata/0000/000654\ndata/0000/000655\ndata/0000/000656\ndata/0000/000657\ndata/0000/000658\ndata/0000/000659\ndata/0000/000660\ndata/0000/000661\ndata/0000/000662\ndata/0000/000663\ndata/0000/000664\ndata/0000/000665\ndata/0000/000666\ndata/0000/000667\ndata/0000/000668\ndata/0000/000669\ndata/0000/000670\ndata/0000/000671\ndata/0000/000672\ndata/0000/000673\ndata/0000/000674\ndata/0000/000675\ndata/0000/000676\ndata/0000/000677\ndata/0000/000678\ndata/0000/000679\ndata/0000/000680\ndata/0000/000681\ndata/0000/000682\ndata/0000/000683\ndata/0000/000684\ndata/0000/000685\ndata/0000/000686\ndata/0000/000687\ndata/0000/000688\ndata/0000/000689\ndata/0000/000690\ndata/0000/000691\ndata/0000/000692\ndata/0000/000693\ndata/0000/000694\ndata/0000/000695\ndata/0000/000696\ndata/0000/000697\ndata/0000/000698\ndata/0000/000699\ndata/0000/000700\ndata/0000/000701\ndata/0000/000702\ndata/0000/000703\ndata/0000/000704\ndata/0000/000705\ndata/0000/000706\ndata/0000/000707\ndata/0000/000708\ndata/0000/000709\ndata/0000/000710\ndata/0000/000711\ndata/0000/000712\ndata/0000/000713\ndata/0000/000714\ndata/0000/000715\ndata/0000/000716\ndata/0000/000717\ndata/0000/000718\ndata/0000/000719\ndata/0000/000720\ndata/0000/000721\ndata/0000/000722\ndata/0000/000723\ndata/0000/000724\ndata/0000/000725\ndata/0000/000726\ndata/0000/000727\ndata/0000/000728\ndata/0000/000729\ndata/0000/000730\ndata/0000/000731\ndata/0000/000732\ndata/0000/000733\ndata/0000/000734\ndata/0000/000735\ndata/0000/000736\ndata/0000/000737\ndata/0000/000738\ndata/0000/000739\ndata/0000/000740\ndata/0000/000741\ndata/0000/000742\ndata/0000/000743\ndata/0000/000744\ndata/0000/000745\ndata/0000/000746\ndata/0000/000747\ndata/0000/000748\ndata/0000/000749\ndata/0000/000750\ndata/0000/000751\ndata/0000/000752\ndata/0000/000753\ndata/0000/000754\ndata/0000/000755\ndata/0000/000756\ndata/0000/000757\ndata/0000/000758\ndata/0000/000759\ndata/0000/000760\ndata/0000/000761\ndata/0000/000762\ndata/0000/000763\ndata/0000/000764\ndata/0000/000765\ndata/0000/000766\ndata/0000/000767\ndata/0000/000768\ndata/0000/000769\ndata/0000/000770\ndata/0000/000771\ndata/0000/000772\ndata/0000/000773\ndata/0000/000774\ndata/0000/000775\ndata/0000/000776\ndata/0000/000777\ndata/0000/000778\ndata/0000/000779\ndata/0000/000780\ndata/0000/000781\ndata/0000/000782\ndata/0000/000783\ndata/0000/000784\ndata/0000/000785\ndata/0000/000786\ndata/0000/000787\ndata/0000/000788\ndata/0000/000789\ndata/0000/000790\ndata/0000/000791\ndata/0000/000792\ndata/0000/000793\ndata/0000/000794\ndata/0000/000795\ndata/0000/000796\ndata/0000/000797\ndata/0000/000798\ndata/0000/000799\ndata/0000/000800\ndata/0000/000801\ndata/0000/000802\ndata/0000/000803\ndata/0000/000804\ndata/0000/000805\ndata/0000/000806\ndata/0000/000807\ndata/0000/000808\ndata/0000/000809\ndata/0000/000810\ndata/0000/000811\ndata/0000/000812\ndata/0000/000813\ndata/0000/000814\ndata/0000/000815\ndata/0000/000816\ndata/0000/000817\ndata/0000/000818\ndata/0000/000819\ndata/0000/000820\ndata/0000/000821\ndata/0000/000822\ndata/0000/000823\ndata/0000/000824\ndata/0000/000825\ndata/0000/000826\ndata/0000/000827\ndata/0000/000828\ndata/0000/000829\ndata/0000/000830\ndata/0000/000831\ndata/0000/000832\ndata/0000/000833\ndata/0000/000834\ndata/0000/000835\ndata/0000/000836\ndata/0000/000837\ndata/0000/000838\ndata/0000/000839\ndata/0000/000840\ndata/0000/000841\ndata/0000/000842\ndata/0000/000843\ndata/0000/000844\ndata/0000/000845\ndata/0000/000846\ndata/0000/000847\ndata/0000/000848\ndata/0000/000849\ndata/0000/000850\ndata/0000/000851\ndata/0000/000852\ndata/0000/000853\ndata/0000/000854\ndata/0000/000855\ndata/0000/000856\ndata/0000/000857\ndata/0000/000858\ndata/0000/000859\ndata/0000/000860\ndata/0000/000861\ndata/0000/000862\ndata/0000/000863\ndata/0000/000864\ndata/0000/000865\ndata/0000/000866\ndata/0000/000867\ndata/0000/000868\ndata/0000/000869\ndata/0000/000870\ndata/0000/000871\ndata/0000/000872\ndata/0000/000873\ndata/0000/000874\ndata/0000/000875\ndata/0000/000876\ndata/0000/000877\ndata/0000/000878\ndata/0000/000879\ndata/0000/000880\ndata/0000/000881\ndata/0000/000882\ndata/0000/000883\ndata/0000/000884\ndata/0000/000885\ndata/0000/000886\ndata/0000/000887\ndata/0000/000888\ndata/0000/000889\ndata/0000/000890\ndata/0000/000891\ndata/0000/000892\ndata/0000/000893\ndata/0000/000894\ndata/0000/000895\ndata/0000/000896\ndata/0000/000897\ndata/0000/000898\ndata/0000/000899\ndata/0000/000900\ndata/0000/000901\ndata/0000/000902\ndata/0000/000903\ndata/0000/000904\ndata/0000/000905\ndata/0000/000906\ndata/0000/000907\ndata/0000/000908\ndata/0000/000909\ndata/0000/000910\ndata/0000/000911\ndata/0000/000912\ndata/0000/000913\ndata/0000/000914\ndata/0000/000915\ndata/0000/000916\ndata/0000/000917\ndata/0000/000918\ndata/0000/000919\ndata/0000/000920\ndata/0000/000921\ndata/0000/000922\ndata/0000/000923\ndata/0000/000924\ndata/0000/000925\ndata/0000/000926\ndata/0000/000927\ndata/0000/000928\ndata/0000/000929\ndata/0000/000930\ndata/0000/000931\ndata/0000/000932\ndata/0000/000933\ndata/0000/000934\ndata/0000/000935\ndata/0000/000936\ndata/0000/000937\ndata/0000/000938\ndata/0000/000939\ndata/0000/000940\ndata/0000/000941\ndata/0000/000942\ndata/0000/000943\ndata/0000/000944\ndata/0000/000945\ndata/0000/000946\ndata/0000/000947\ndata/0000/000948\ndata/0000/000949\ndata/0000/000950\ndata/0000/000951\ndata/0000/000952\ndata/0000/000953\ndata/0000/000954\ndata/0000/000955\ndata/0000/000956\ndata/0000/000957\ndata/0000/000958\ndata/0000/000959\ndata/0000/000960\ndata/0000/000961\ndata/0000/000962\ndata/0000/000963\ndata/0000/000964\ndata/0000/000965\ndata/0000/000966\ndata/0000/000967\ndata/0000/000968\ndata/0000/000969\ndata/0000/000970\ndata/0000/000971\ndata/0000/000972\ndata/0000/000973\ndata/0000/000974\ndata/0000/000975\ndata/0000/000976\ndata/0000/000977\ndata/0000/000978\ndata/0000/000979\ndata/0000/000980\ndata/0000/000981\ndata/0000/000982\ndata/0000/000983\ndata/0000/000984\ndata/0000/000985\ndata/0000/000986\ndata/0000/000987\ndata/0000/000988\ndata/0000/000989\ndata/0000/000990\ndata/0000/000991\ndata/0000/000992\ndata/0000/000993\ndata/0000/000994\ndata/0000/000995\ndata/0000/000996\ndata/0000/000997\ndata/0000/000998\ndata/0000/000999\ndata/0000/001000\ndata/0000/001001\ndata/0000/001002\ndata/0000/001003\ndata/0000/001004\ndata/0000/001005\ndata/0000/001006\ndata/0000/001007\ndata/0000/001008\ndata/0000/001009\ndata/0000/001010\ndata/0000/001011\ndata/0000/001012\ndata/0000/001013\ndata/0000/001014\ndata/0000/001015\ndata/0000/001016\ndata/0000/001017\ndata/0000/001018\ndata/0000/001019\ndata/0000/001020\ndata/0000/001021\ndata/0000/001022\ndata/0000/001023\ndata/0000/001024\ndata/0000/001025\ndata/0000/001026\ndata/0000/001027\ndata/0000/001028\ndata/0000/001029\ndata/0000/001030\ndata/0000/001031\ndata/0000/001032\ndata/0000/001033\ndata/0000/001034\ndata/0000/001035\ndata/0000/001036\ndata/0000/001037\ndata/0000/001038\ndata/0000/001039\ndata/0000/001040\ndata/0000/001041\ndata/0000/001042\ndata/0000/001043\ndata/0000/001044\ndata/0000/001045\ndata/0000/001046\ndata/0000/001047\ndata/0000/001048\ndata/0000/001049\ndata/0000/001050\ndata/0000/001051\ndata/0000/001052\ndata/0000/001053\ndata/0000/001054\ndata/0000/001055\ndata/0000/001056\ndata/0000/001057\ndata/0000/001058\ndata/0000/001059\ndata/0000/001060\ndata/0000/001061\ndata/0000/001062\ndata/0000/001063\ndata/0000/001064\ndata/0000/001065\ndata/0000/001066\ndata/0000/001067\ndata/0000/001068\ndata/0000/001069\ndata/0000/001070\ndata/0000/001071\ndata/0000/001072\ndata/0000/001073\ndata/0000/001074\ndata/0000/001075\ndata/0000/001076\ndata/0000/001077\ndata/0000/001078\ndata/0000/001079\ndata/0000/001080\ndata/0000/001081\ndata/0000/001082\ndata/0000/001083\ndata/0000/001084\ndata/0000/001085\ndata/0000/001086\ndata/0000/001087\ndata/0000/001088\ndata/0000/001089\ndata/0000/001090\ndata/0000/001091\ndata/0000/001092\ndata/0000/001093\ndata/0000/001094\ndata/0000/001095\ndata/0000/001096\ndata/0000/001097\ndata/0000/001098\ndata/0000/001099\ndata/0000/001100\ndata/0000/001101\ndata/0000/001102\ndata/0000/001103\ndata/0000/001104\ndata/0000/001105\ndata/0000/001106\ndata/0000/001107\ndata/0000/001108\ndata/0000/001109\ndata/0000/001110\ndata/0000/001111\ndata/0000/001112\ndata/0000/001113\ndata/0000/001114\ndata/0000/001115\ndata/0000/001116\ndata/0000/001117\ndata/0000/001118\ndata/0000/001119\ndata/0000/001120\ndata/0000/001121\ndata/0000/001122\ndata/0000/001123\ndata/0000/001124\ndata/0000/001125\ndata/0000/001126\ndata/0000/001127\ndata/0000/001128\ndata/0000/001129\ndata/0000/001130\ndata/0000/001131\ndata/0000/001132\ndata/0000/001133\ndata/0000/001134\ndata/0000/001135\ndata/0000/001136\ndata/0000/001137\ndata/0000/001138\ndata/0000/001139\ndata/0000/001140\ndata/0000/001141\ndata/0000/001142\ndata/0000/001143\ndata/0000/001144\ndata/0000/001145\ndata/0000/001146\ndata/0000/001147\ndata/0000/001148\ndata/0000/001149\ndata/0000/001150\ndata/0000/001151\ndata/0000/001152\ndata/0000/001153\ndata/0000/001154\ndata/0000/001155\ndata/0000/001156\ndata/0000/001157\ndata/0000/001158\ndata/0000/001159\ndata/0000/001160\ndata/0000/001161\ndata/0000/001162\ndata/0000/001163\ndata/0000/001164\ndata/0000/001165\ndata/0000/001166\ndata/0000/001167\ndata/0000/001168\ndata/0000/001169\ndata/0000/001170\ndata/0000/001171\ndata/0000/001172\ndata/0000/001173\ndata/0001/000001\ndata/0001/000002\ndata/0001/000003\ndata/0001/000004\ndata/0001/000005\ndata/0001/000006\ndata/0001/000007\ndata/0001/000008\ndata/0001/000009\ndata/0001/000010\ndata/0001/000011\ndata/0001/000012\ndata/0001/000013\ndata/0001/000014\ndata/0001/000015\ndata/0001/000016\ndata/0001/000017\ndata/0001/000018\ndata/0001/000019\ndata/0001/000020\ndata/0001/000021\ndata/0001/000022\ndata/0001/000023\ndata/0001/000024\ndata/0001/000025\ndata/0001/000026\ndata/0001/000027\ndata/0001/000028\ndata/0001/000029\ndata/0001/000030\ndata/0001/000031\ndata/0001/000032\ndata/0001/000033\ndata/0001/000034\ndata/0001/000035\ndata/0001/000036\ndata/0001/000037\ndata/0001/000038\ndata/0001/000039\ndata/0001/000040\ndata/0001/000041\ndata/0001/000042\ndata/0001/000043\ndata/0001/000044\ndata/0001/000045\ndata/0001/000046\ndata/0001/000047\ndata/0001/000048\ndata/0001/000049\ndata/0001/000050\ndata/0001/000051\ndata/0001/000052\ndata/0001/000053\ndata/0001/000054\ndata/0001/000055\ndata/0001/000056\ndata/0001/000057\ndata/0001/000058\ndata/0001/000059\ndata/0001/000060\ndata/0001/000061\ndata/0001/000062\ndata/0001/000063\ndata/0001/000064\ndata/0001/000065\ndata/0001/000066\ndata/0001/000067\ndata/0001/000068\ndata/0001/000069\ndata/0001/000070\ndata/0001/000071\ndata/0001/000072\ndata/0001/000073\ndata/0001/000074\ndata/0001/000075\ndata/0001/000076\ndata/0001/000077\ndata/0001/000078\ndata/0001/000079\ndata/0001/000080\ndata/0001/000081\ndata/0001/000082\ndata/0001/000083\ndata/0001/000084\ndata/0001/000085\ndata/0001/000086\ndata/0001/000087\ndata/0001/000088\ndata/0001/000089\ndata/0001/000090\ndata/0001/000091\ndata/0001/000092\ndata/0001/000093\ndata/0001/000094\ndata/0001/000095\ndata/0001/000096\ndata/0001/000097\ndata/0001/000098\ndata/0001/000099\ndata/0001/000100\ndata/0001/000101\ndata/0001/000102\ndata/0001/000103\ndata/0001/000104\ndata/0001/000105\ndata/0001/000106\ndata/0001/000107\ndata/0001/000108\ndata/0001/000109\ndata/0001/000110\ndata/0001/000111\ndata/0001/000112\ndata/0001/000113\ndata/0001/000114\ndata/0001/000115\ndata/0001/000116\ndata/0001/000117\ndata/0001/000118\ndata/0001/000119\ndata/0001/000120\ndata/0001/000121\ndata/0001/000122\ndata/0001/000123\ndata/0001/000124\ndata/0001/000125\ndata/0001/000126\ndata/0001/000127\ndata/0001/000128\ndata/0001/000129\ndata/0001/000130\ndata/0001/000131\ndata/0001/000132\ndata/0001/000133\ndata/0001/000134\ndata/0001/000135\ndata/0001/000136\ndata/0001/000137\ndata/0001/000138\ndata/0001/000139\ndata/0001/000140\ndata/0001/000141\ndata/0001/000142\ndata/0001/000143\ndata/0001/000144\ndata/0001/000145\ndata/0001/000146\ndata/0001/000147\ndata/0001/000148\ndata/0001/000149\ndata/0001/000150\ndata/0001/000151\ndata/0001/000152\ndata/0001/000153\ndata/0001/000154\ndata/0001/000155\ndata/0001/000156\ndata/0001/000157\ndata/0001/000158\ndata/0001/000159\ndata/0001/000160\ndata/0001/000161\ndata/0001/000162\ndata/0001/000163\ndata/0001/000164\ndata/0001/000165\ndata/0001/000166\ndata/0001/000167\ndata/0001/000168\ndata/0001/000169\ndata/0001/000170\ndata/0001/000171\ndata/0001/000172\ndata/0001/000173\ndata/0001/000174\ndata/0001/000175\ndata/0001/000176\ndata/0001/000177\ndata/0001/000178\ndata/0001/000179\ndata/0001/000180\ndata/0001/000181\ndata/0001/000182\ndata/0001/000183\ndata/0001/000184\ndata/0001/000185\ndata/0001/000186\ndata/0001/000187\ndata/0001/000188\ndata/0001/000189\ndata/0001/000190\ndata/0001/000191\ndata/0001/000192\ndata/0001/000193\ndata/0001/000194\ndata/0001/000195\ndata/0001/000196\ndata/0001/000197\ndata/0001/000198\ndata/0001/000199\ndata/0001/000200\ndata/0001/000201\ndata/0001/000202\ndata/0001/000203\ndata/0001/000204\ndata/0001/000205\ndata/0001/000206\ndata/0001/000207\ndata/0001/000208\ndata/0001/000209\ndata/0001/000210\ndata/0001/000211\ndata/0001/000212\ndata/0001/000213\ndata/0001/000214\ndata/0001/000215\ndata/0001/000216\ndata/0001/000217\ndata/0001/000218\ndata/0001/000219\ndata/0001/000220\ndata/0001/000221\ndata/0001/000222\ndata/0001/000223\ndata/0001/000224\ndata/0001/000225\ndata/0001/000226\ndata/0001/000227\ndata/0001/000228\ndata/0001/000229\ndata/0001/000230\ndata/0001/000231\ndata/0001/000232\ndata/0001/000233\ndata/0001/000234\ndata/0001/000235\ndata/0001/000236\ndata/0001/000237\ndata/0001/000238\ndata/0001/000239\ndata/0001/000240\ndata/0001/000241\ndata/0001/000242\ndata/0001/000243\ndata/0001/000244\ndata/0001/000245\ndata/0001/000246\ndata/0001/000247\ndata/0001/000248\ndata/0001/000249\ndata/0001/000250\ndata/0001/000251\ndata/0001/000252\ndata/0001/000253\ndata/0001/000254\ndata/0001/000255\ndata/0001/000256\ndata/0001/000257\ndata/0001/000258\ndata/0001/000259\ndata/0001/000260\ndata/0001/000261\ndata/0001/000262\ndata/0001/000263\ndata/0001/000264\ndata/0001/000265\ndata/0001/000266\ndata/0001/000267\ndata/0001/000268\ndata/0001/000269\ndata/0001/000270\ndata/0001/000271\ndata/0001/000272\ndata/0001/000273\ndata/0001/000274\ndata/0001/000275\ndata/0001/000276\ndata/0001/000277\ndata/0001/000278\ndata/0001/000279\ndata/0001/000280\ndata/0001/000281\ndata/0001/000282\ndata/0001/000283\ndata/0001/000284\ndata/0001/000285\ndata/0001/000286\ndata/0001/000287\ndata/0001/000288\ndata/0001/000289\ndata/0001/000290\ndata/0001/000291\ndata/0001/000292\ndata/0001/000293\ndata/0001/000294\ndata/0001/000295\ndata/0001/000296\ndata/0001/000297\ndata/0001/000298\ndata/0001/000299\ndata/0001/000300\ndata/0001/000301\ndata/0001/000302\ndata/0001/000303\ndata/0001/000304\ndata/0001/000305\ndata/0001/000306\ndata/0001/000307\ndata/0001/000308\ndata/0001/000309\ndata/0001/000310\ndata/0001/000311\ndata/0001/000312\ndata/0001/000313\ndata/0001/000314\ndata/0001/000315\ndata/0001/000316\ndata/0001/000317\ndata/0001/000318\ndata/0001/000319\ndata/0001/000320\ndata/0001/000321\ndata/0001/000322\ndata/0001/000323\ndata/0001/000324\ndata/0001/000325\ndata/0001/000326\ndata/0001/000327\ndata/0001/000328\ndata/0001/000329\ndata/0001/000330\ndata/0001/000331\ndata/0001/000332\ndata/0001/000333\ndata/0001/000334\ndata/0001/000335\ndata/0001/000336\ndata/0001/000337\ndata/0001/000338\ndata/0001/000339\ndata/0001/000340\ndata/0001/000341\ndata/0001/000342\ndata/0001/000343\ndata/0001/000344\ndata/0001/000345\ndata/0001/000346\ndata/0001/000347\ndata/0001/000348\ndata/0001/000349\ndata/0001/000350\ndata/0001/000351\ndata/0001/000352\ndata/0001/000353\ndata/0001/000354\ndata/0001/000355\ndata/0001/000356\ndata/0001/000357\ndata/0001/000358\ndata/0001/000359\ndata/0001/000360\ndata/0001/000361\ndata/0001/000362\ndata/0001/000363\ndata/0001/000364\ndata/0001/000365\ndata/0001/000366\ndata/0001/000367\ndata/0001/000368\ndata/0001/000369\ndata/0001/000370\ndata/0001/000371\ndata/0001/000372\ndata/0001/000373\ndata/0001/000374\ndata/0001/000375\ndata/0001/000376\ndata/0001/000377\ndata/0001/000378\ndata/0001/000379\ndata/0001/000380\ndata/0001/000381\ndata/0001/000382\ndata/0001/000383\ndata/0001/000384\ndata/0001/000385\ndata/0001/000386\ndata/0001/000387\ndata/0001/000388\ndata/0001/000389\ndata/0001/000390\ndata/0001/000391\ndata/0001/000392\ndata/0001/000393\ndata/0001/000394\ndata/0001/000395\ndata/0001/000396\ndata/0001/000397\ndata/0001/000398\ndata/0001/000399\ndata/0001/000400\ndata/0001/000401\ndata/0001/000402\ndata/0001/000403\ndata/0001/000404\ndata/0001/000405\ndata/0001/000406\ndata/0001/000407\ndata/0001/000408\ndata/0001/000409\ndata/0001/000410\ndata/0001/000411\ndata/0001/000412\ndata/0001/000413\ndata/0001/000414\ndata/0001/000415\ndata/0001/000416\ndata/0001/000417\ndata/0001/000418\ndata/0001/000419\ndata/0001/000420\ndata/0001/000421\ndata/0001/000422\ndata/0001/000423\ndata/0001/000424\ndata/0001/000425\ndata/0001/000426\ndata/0001/000427\ndata/0001/000428\ndata/0001/000429\ndata/0001/000430\ndata/0001/000431\ndata/0001/000432\ndata/0001/000433\ndata/0001/000434\ndata/0001/000435\ndata/0001/000436\ndata/0001/000437\ndata/0001/000438\ndata/0001/000439\ndata/0001/000440\ndata/0001/000441\ndata/0001/000442\ndata/0001/000443\ndata/0001/000444\ndata/0001/000445\ndata/0001/000446\ndata/0001/000447\ndata/0001/000448\ndata/0001/000449\ndata/0001/000450\ndata/0001/000451\ndata/0001/000452\ndata/0001/000453\ndata/0001/000454\ndata/0001/000455\ndata/0001/000456\ndata/0001/000457\ndata/0001/000458\ndata/0001/000459\ndata/0001/000460\ndata/0001/000461\ndata/0001/000462\ndata/0001/000463\ndata/0001/000464\ndata/0001/000465\ndata/0001/000466\ndata/0001/000467\ndata/0001/000468\ndata/0001/000469\ndata/0001/000470\ndata/0001/000471\ndata/0001/000472\ndata/0001/000473\ndata/0001/000474\ndata/0001/000475\ndata/0001/000476\ndata/0001/000477\ndata/0001/000478\ndata/0001/000479\ndata/0001/000480\ndata/0001/000481\ndata/0001/000482\ndata/0001/000483\ndata/0001/000484\ndata/0001/000485\ndata/0001/000486\ndata/0001/000487\ndata/0001/000488\ndata/0001/000489\ndata/0001/000490\ndata/0001/000491\ndata/0001/000492\ndata/0001/000493\ndata/0001/000494\ndata/0001/000495\ndata/0001/000496\ndata/0001/000497\ndata/0001/000498\ndata/0001/000499\ndata/0001/000500\ndata/0001/000501\ndata/0001/000502\ndata/0001/000503\ndata/0001/000504\ndata/0001/000505\ndata/0001/000506\ndata/0001/000507\ndata/0001/000508\ndata/0001/000509\ndata/0001/000510\ndata/0001/000511\ndata/0001/000512\ndata/0001/000513\ndata/0001/000514\ndata/0001/000515\ndata/0001/000516\ndata/0001/000517\ndata/0001/000518\ndata/0001/000519\ndata/0001/000520\ndata/0001/000521\ndata/0001/000522\ndata/0001/000523\ndata/0001/000524\ndata/0001/000525\ndata/0001/000526\ndata/0001/000527\ndata/0001/000528\ndata/0001/000529\ndata/0001/000530\ndata/0001/000531\ndata/0001/000532\ndata/0001/000533\ndata/0001/000534\ndata/0001/000535\ndata/0001/000536\ndata/0001/000537\ndata/0001/000538\ndata/0001/000539\ndata/0001/000540\ndata/0001/000541\ndata/0001/000542\ndata/0001/000543\ndata/0001/000544\ndata/0001/000545\ndata/0001/000546\ndata/0001/000547\ndata/0001/000548\ndata/0001/000549\ndata/0001/000550\ndata/0001/000551\ndata/0001/000552\ndata/0001/000553\ndata/0001/000554\ndata/0001/000555\ndata/0001/000556\ndata/0001/000557\ndata/0001/000558\ndata/0001/000559\ndata/0001/000560\ndata/0001/000561\ndata/0001/000562\ndata/0001/000563\ndata/0001/000564\ndata/0001/000565\ndata/0001/000566\ndata/0001/000567\ndata/0001/000568\ndata/0001/000569\ndata/0001/000570\ndata/0001/000571\ndata/0001/000572\ndata/0001/000573\ndata/0001/000574\ndata/0001/000575\ndata/0001/000576\ndata/0001/000577\ndata/0001/000578\ndata/0001/000579\ndata/0001/000580\ndata/0001/000581\ndata/0001/000582\ndata/0001/000583\ndata/0001/000584\ndata/0001/000585\ndata/0001/000586\ndata/0001/000587\ndata/0001/000588\ndata/0001/000589\ndata/0001/000590\ndata/0001/000591\ndata/0001/000592\ndata/0001/000593\ndata/0001/000594\ndata/0001/000595\ndata/0001/000596\ndata/0001/000597\ndata/0001/000598\ndata/0001/000599\ndata/0001/000600\ndata/0001/000601\ndata/0001/000602\ndata/0001/000603\ndata/0001/000604\ndata/0001/000605\ndata/0001/000606\ndata/0001/000607\ndata/0001/000608\ndata/0001/000609\ndata/0001/000610\ndata/0001/000611\ndata/0001/000612\ndata/0001/000613\ndata/0001/000614\ndata/0001/000615\ndata/0001/000616\ndata/0001/000617\ndata/0001/000618\ndata/0001/000619\ndata/0001/000620\ndata/0001/000621\ndata/0001/000622\ndata/0001/000623\ndata/0001/000624\ndata/0001/000625\ndata/0001/000626\ndata/0001/000627\ndata/0001/000628\ndata/0001/000629\ndata/0001/000630\ndata/0001/000631\ndata/0001/000632\ndata/0001/000633\ndata/0001/000634\ndata/0001/000635\ndata/0001/000636\ndata/0001/000637\ndata/0001/000638\ndata/0001/000639\ndata/0001/000640\ndata/0001/000641\ndata/0001/000642\ndata/0001/000643\ndata/0001/000644\ndata/0001/000645\ndata/0001/000646\ndata/0001/000647\ndata/0001/000648\ndata/0001/000649\ndata/0001/000650\ndata/0001/000651\ndata/0001/000652\ndata/0001/000653\ndata/0001/000654\ndata/0001/000655\ndata/0001/000656\ndata/0001/000657\ndata/0001/000658\ndata/0001/000659\ndata/0001/000660\ndata/0001/000661\ndata/0001/000662\ndata/0001/000663\ndata/0001/000664\ndata/0001/000665\ndata/0001/000666\ndata/0001/000667\ndata/0001/000668\ndata/0001/000669\ndata/0001/000670\ndata/0001/000671\ndata/0001/000672\ndata/0001/000673\ndata/0001/000674\ndata/0001/000675\ndata/0001/000676\ndata/0001/000677\ndata/0001/000678\ndata/0001/000679\ndata/0001/000680\ndata/0001/000681\ndata/0001/000682\ndata/0001/000683\ndata/0001/000684\ndata/0001/000685\ndata/0001/000686\ndata/0001/000687\ndata/0001/000688\ndata/0001/000689\ndata/0001/000690\ndata/0001/000691\ndata/0001/000692\ndata/0001/000693\ndata/0001/000694\ndata/0001/000695\ndata/0001/000696\ndata/0001/000697\ndata/0001/000698\ndata/0001/000699\ndata/0001/000700\ndata/0001/000701\ndata/0001/000702\ndata/0001/000703\ndata/0001/000704\ndata/0001/000705\ndata/0001/000706\ndata/0001/000707\ndata/0001/000708\ndata/0001/000709\ndata/0001/000710\ndata/0001/000711\ndata/0001/000712\ndata/0001/000713\ndata/0001/000714\ndata/0001/000715\ndata/0001/000716\ndata/0001/000717\ndata/0001/000718\ndata/0001/000719\ndata/0001/000720\ndata/0001/000721\ndata/0001/000722\ndata/0001/000723\ndata/0001/000724\ndata/0001/000725\ndata/0001/000726\ndata/0001/000727\ndata/0001/000728\ndata/0001/000729\ndata/0001/000730\ndata/0001/000731\ndata/0001/000732\ndata/0001/000733\ndata/0001/000734\ndata/0001/000735\ndata/0001/000736\ndata/0001/000737\ndata/0001/000738\ndata/0001/000739\ndata/0001/000740\ndata/0001/000741\ndata/0001/000742\ndata/0001/000743\ndata/0001/000744\ndata/0001/000745\ndata/0001/000746\ndata/0001/000747\ndata/0001/000748\ndata/0001/000749\ndata/0001/000750\ndata/0001/000751\ndata/0001/000752\ndata/0001/000753\ndata/0001/000754\ndata/0001/000755\ndata/0001/000756\ndata/0001/000757\ndata/0001/000758\ndata/0001/000759\ndata/0001/000760\ndata/0001/000761\ndata/0001/000762\ndata/0001/000763\ndata/0001/000764\ndata/0001/000765\ndata/0001/000766\ndata/0001/000767\ndata/0001/000768\ndata/0001/000769\ndata/0001/000770\ndata/0001/000771\ndata/0001/000772\ndata/0001/000773\ndata/0001/000774\ndata/0001/000775\ndata/0001/000776\ndata/0001/000777\ndata/0001/000778\ndata/0001/000779\ndata/0001/000780\ndata/0001/000781\ndata/0001/000782\ndata/0001/000783\ndata/0001/000784\ndata/0001/000785\ndata/0001/000786\ndata/0001/000787\ndata/0001/000788\ndata/0001/000789\ndata/0001/000790\ndata/0001/000791\ndata/0001/000792\ndata/0001/000793\ndata/0001/000794\ndata/0001/000795\ndata/0001/000796\ndata/0001/000797\ndata/0001/000798\ndata/0001/000799\ndata/0001/000800\ndata/0001/000801\ndata/0001/000802\ndata/0001/000803\ndata/0001/000804\ndata/0001/000805\ndata/0001/000806\ndata/0001/000807\ndata/0001/000808\ndata/0001/000809\ndata/0001/000810\ndata/0001/000811\ndata/0001/000812\ndata/0001/000813\ndata/0001/000814\ndata/0001/000815\ndata/0001/000816\ndata/0001/000817\ndata/0001/000818\ndata/0001/000819\ndata/0001/000820\ndata/0001/000821\ndata/0001/000822\ndata/0001/000823\ndata/0001/000824\ndata/0001/000825\ndata/0001/000826\ndata/0001/000827\ndata/0001/000828\ndata/0001/000829\ndata/0001/000830\ndata/0001/000831\ndata/0001/000832\ndata/0001/000833\ndata/0001/000834\ndata/0001/000835\ndata/0001/000836\ndata/0001/000837\ndata/0001/000838\ndata/0001/000839\ndata/0001/000840\ndata/0001/000841\ndata/0001/000842\ndata/0001/000843\ndata/0001/000844\ndata/0001/000845\ndata/0001/000846\ndata/0001/000847\ndata/0001/000848\ndata/0001/000849\ndata/0001/000850\ndata/0001/000851\ndata/0001/000852\ndata/0001/000853\ndata/0001/000854\ndata/0001/000855\ndata/0001/000856\ndata/0001/000857\ndata/0001/000858\ndata/0001/000859\ndata/0001/000860\ndata/0001/000861\ndata/0001/000862\ndata/0001/000863\ndata/0001/000864\ndata/0001/000865\ndata/0001/000866\ndata/0001/000867\ndata/0001/000868\ndata/0001/000869\ndata/0001/000870\ndata/0001/000871\ndata/0001/000872\ndata/0001/000873\ndata/0001/000874\ndata/0001/000875\ndata/0001/000876\ndata/0001/000877\ndata/0001/000878\ndata/0001/000879\ndata/0001/000880\ndata/0001/000881\ndata/0001/000882\ndata/0001/000883\ndata/0001/000884\ndata/0001/000885\ndata/0001/000886\ndata/0001/000887\ndata/0001/000888\ndata/0001/000889\ndata/0001/000890\ndata/0001/000891\ndata/0001/000892\ndata/0001/000893\ndata/0001/000894\ndata/0001/000895\ndata/0001/000896\ndata/0001/000897\ndata/0001/000898\ndata/0001/000899\ndata/0001/000900\ndata/0001/000901\ndata/0001/000902\ndata/0001/000903\ndata/0001/000904\ndata/0001/000905\ndata/0001/000906\ndata/0001/000907\ndata/0001/000908\ndata/0001/000909\ndata/0001/000910\ndata/0001/000911\ndata/0001/000912\ndata/0001/000913\ndata/0001/000914\ndata/0001/000915\ndata/0001/000916\ndata/0001/000917\ndata/0001/000918\ndata/0001/000919\ndata/0001/000920\ndata/0001/000921\ndata/0001/000922\ndata/0001/000923\ndata/0001/000924\ndata/0001/000925\ndata/0001/000926\ndata/0001/000927\ndata/0001/000928\ndata/0001/000929\ndata/0001/000930\ndata/0001/000931\ndata/0001/000932\ndata/0001/000933\ndata/0001/000934\ndata/0001/000935\ndata/0001/000936\ndata/0001/000937\ndata/0001/000938\ndata/0001/000939\ndata/0001/000940\ndata/0001/000941\ndata/0001/000942\ndata/0001/000943\ndata/0001/000944\ndata/0001/000945\ndata/0001/000946\ndata/0001/000947\ndata/0001/000948\ndata/0001/000949\ndata/0001/000950\ndata/0001/000951\ndata/0001/000952\ndata/0001/000953\ndata/0001/000954\ndata/0001/000955\ndata/0001/000956\ndata/0001/000957\ndata/0001/000958\ndata/0001/000959\ndata/0001/000960\ndata/0001/000961\ndata/0001/000962\ndata/0001/000963\ndata/0001/000964\ndata/0001/000965\ndata/0001/000966\ndata/0001/000967\ndata/0001/000968\ndata/0001/000969\ndata/0001/000970\ndata/0001/000971\ndata/0001/000972\ndata/0001/000973\ndata/0001/000974\ndata/0001/000975\ndata/0001/000976\ndata/0001/000977\ndata/0001/000978\ndata/0001/000979\ndata/0001/000980\ndata/0001/000981\ndata/0001/000982\ndata/0001/000983\ndata/0001/000984\ndata/0001/000985\ndata/0001/000986\ndata/0001/000987\ndata/0001/000988\ndata/0001/000989\ndata/0001/000990\ndata/0001/000991\ndata/0001/000992\ndata/0001/000993\ndata/0001/000994\ndata/0001/000995\ndata/0002/000001\ndata/0002/000002\ndata/0002/000003\ndata/0002/000004\ndata/0002/000005\ndata/0002/000006\ndata/0002/000007\ndata/0002/000008\ndata/0002/000009\ndata/0002/000010\ndata/0002/000011\ndata/0002/000012\ndata/0002/000013\ndata/0002/000014\ndata/0002/000015\ndata/0002/000016\ndata/0002/000017\ndata/0002/000018\ndata/0002/000019\ndata/0002/000020\ndata/0002/000021\ndata/0002/000022\ndata/0002/000023\ndata/0002/000024\ndata/0002/000025\ndata/0002/000026\ndata/0002/000027\ndata/0002/000028\ndata/0002/000029\ndata/0002/000030\ndata/0002/000031\ndata/0002/000032\ndata/0002/000033\ndata/0002/000034\ndata/0002/000035\ndata/0002/000036\ndata/0002/000037\ndata/0002/000038\ndata/0002/000039\ndata/0002/000040\ndata/0002/000041\ndata/0002/000042\ndata/0002/000043\ndata/0002/000044\ndata/0002/000045\ndata/0002/000046\ndata/0002/000047\ndata/0002/000048\ndata/0002/000049\ndata/0002/000050\ndata/0002/000051\ndata/0002/000052\ndata/0002/000053\ndata/0002/000054\ndata/0002/000055\ndata/0002/000056\ndata/0002/000057\ndata/0002/000058\ndata/0002/000059\ndata/0002/000060\ndata/0002/000061\ndata/0002/000062\ndata/0002/000063\ndata/0002/000064\ndata/0002/000065\ndata/0002/000066\ndata/0002/000067\ndata/0002/000068\ndata/0002/000069\ndata/0002/000070\ndata/0002/000071\ndata/0002/000072\ndata/0002/000073\ndata/0002/000074\ndata/0002/000075\ndata/0002/000076\ndata/0002/000077\ndata/0002/000078\ndata/0002/000079\ndata/0002/000080\ndata/0002/000081\ndata/0002/000082\ndata/0002/000083\ndata/0002/000084\ndata/0002/000085\ndata/0002/000086\ndata/0002/000087\ndata/0002/000088\ndata/0002/000089\ndata/0002/000090\ndata/0002/000091\ndata/0002/000092\ndata/0002/000093\ndata/0002/000094\ndata/0002/000095\ndata/0002/000096\ndata/0002/000097\ndata/0002/000098\ndata/0002/000099\ndata/0002/000100\ndata/0002/000101\ndata/0002/000102\ndata/0002/000103\ndata/0002/000104\ndata/0002/000105\ndata/0002/000106\ndata/0002/000107\ndata/0002/000108\ndata/0002/000109\ndata/0002/000110\ndata/0002/000111\ndata/0002/000112\ndata/0002/000113\ndata/0002/000114\ndata/0002/000115\ndata/0002/000116\ndata/0002/000117\ndata/0002/000118\ndata/0002/000119\ndata/0002/000120\ndata/0002/000121\ndata/0002/000122\ndata/0002/000123\ndata/0002/000124\ndata/0002/000125\ndata/0002/000126\ndata/0002/000127\ndata/0002/000128\ndata/0002/000129\ndata/0002/000130\ndata/0002/000131\ndata/0002/000132\ndata/0002/000133\ndata/0002/000134\ndata/0002/000135\ndata/0002/000136\ndata/0002/000137\ndata/0002/000138\ndata/0002/000139\ndata/0002/000140\ndata/0002/000141\ndata/0002/000142\ndata/0002/000143\ndata/0002/000144\ndata/0002/000145\ndata/0002/000146\ndata/0002/000147\ndata/0002/000148\ndata/0002/000149\ndata/0002/000150\ndata/0002/000151\ndata/0002/000152\ndata/0002/000153\ndata/0002/000154\ndata/0002/000155\ndata/0002/000156\ndata/0002/000157\ndata/0002/000158\ndata/0002/000159\ndata/0002/000160\ndata/0002/000161\ndata/0002/000162\ndata/0002/000163\ndata/0002/000164\ndata/0002/000165\ndata/0002/000166\ndata/0002/000167\ndata/0002/000168\ndata/0002/000169\ndata/0002/000170\ndata/0002/000171\ndata/0002/000172\ndata/0002/000173\ndata/0002/000174\ndata/0002/000175\ndata/0002/000176\ndata/0002/000177\ndata/0002/000178\ndata/0002/000179\ndata/0002/000180\ndata/0002/000181\ndata/0002/000182\ndata/0002/000183\ndata/0002/000184\ndata/0002/000185\ndata/0002/000186\ndata/0002/000187\ndata/0002/000188\ndata/0002/000189\ndata/0002/000190\ndata/0002/000191\ndata/0002/000192\ndata/0002/000193\ndata/0002/000194\ndata/0002/000195\ndata/0002/000196\ndata/0002/000197\ndata/0002/000198\ndata/0002/000199\ndata/0002/000200\ndata/0002/000201\ndata/0002/000202\ndata/0002/000203\ndata/0002/000204\ndata/0002/000205\ndata/0002/000206\ndata/0002/000207\ndata/0002/000208\ndata/0002/000209\ndata/0002/000210\ndata/0002/000211\ndata/0002/000212\ndata/0002/000213\ndata/0002/000214\ndata/0002/000215\ndata/0002/000216\ndata/0002/000217\ndata/0002/000218\ndata/0002/000219\ndata/0002/000220\ndata/0002/000221\ndata/0002/000222\ndata/0002/000223\ndata/0002/000224\ndata/0002/000225\ndata/0002/000226\ndata/0002/000227\ndata/0002/000228\ndata/0002/000229\ndata/0002/000230\ndata/0002/000231\ndata/0002/000232\ndata/0002/000233\ndata/0002/000234\ndata/0002/000235\ndata/0002/000236\ndata/0002/000237\ndata/0002/000238\ndata/0002/000239\ndata/0002/000240\ndata/0002/000241\ndata/0002/000242\ndata/0002/000243\ndata/0002/000244\ndata/0002/000245\ndata/0002/000246\ndata/0002/000247\ndata/0002/000248\ndata/0002/000249\ndata/0002/000250\ndata/0002/000251\ndata/0002/000252\ndata/0002/000253\ndata/0002/000254\ndata/0002/000255\ndata/0002/000256\ndata/0002/000257\ndata/0002/000258\ndata/0002/000259\ndata/0002/000260\ndata/0002/000261\ndata/0002/000262\ndata/0002/000263\ndata/0002/000264\ndata/0002/000265\ndata/0002/000266\ndata/0002/000267\ndata/0002/000268\ndata/0002/000269\ndata/0002/000270\ndata/0002/000271\ndata/0002/000272\ndata/0002/000273\ndata/0002/000274\ndata/0002/000275\ndata/0002/000276\ndata/0002/000277\ndata/0002/000278\ndata/0002/000279\ndata/0002/000280\ndata/0002/000281\ndata/0002/000282\ndata/0002/000283\ndata/0002/000284\ndata/0002/000285\ndata/0002/000286\ndata/0002/000287\ndata/0002/000288\ndata/0002/000289\ndata/0002/000290\ndata/0002/000291\ndata/0002/000292\ndata/0002/000293\ndata/0002/000294\ndata/0002/000295\ndata/0002/000296\ndata/0002/000297\ndata/0002/000298\ndata/0002/000299\ndata/0002/000300\ndata/0002/000301\ndata/0002/000302\ndata/0002/000303\ndata/0002/000304\ndata/0002/000305\ndata/0002/000306\ndata/0002/000307\ndata/0002/000308\ndata/0002/000309\ndata/0002/000310\ndata/0002/000311\ndata/0002/000312\ndata/0002/000313\ndata/0002/000314\ndata/0002/000315\ndata/0002/000316\ndata/0002/000317\ndata/0002/000318\ndata/0002/000319\ndata/0002/000320\ndata/0002/000321\ndata/0002/000322\ndata/0002/000323\ndata/0002/000324\ndata/0002/000325\ndata/0002/000326\ndata/0002/000327\ndata/0002/000328\ndata/0002/000329\ndata/0002/000330\ndata/0002/000331\ndata/0002/000332\ndata/0002/000333\ndata/0002/000334\ndata/0002/000335\ndata/0002/000336\ndata/0002/000337\ndata/0002/000338\ndata/0002/000339\ndata/0002/000340\ndata/0002/000341\ndata/0002/000342\ndata/0002/000343\ndata/0002/000344\ndata/0002/000345\ndata/0002/000346\ndata/0002/000347\ndata/0002/000348\ndata/0002/000349\ndata/0002/000350\ndata/0002/000351\ndata/0002/000352\ndata/0002/000353\ndata/0002/000354\ndata/0002/000355\ndata/0002/000356\ndata/0002/000357\ndata/0002/000358\ndata/0002/000359\ndata/0002/000360\ndata/0002/000361\ndata/0002/000362\ndata/0002/000363\ndata/0002/000364\ndata/0002/000365\ndata/0002/000366\ndata/0002/000367\ndata/0002/000368\ndata/0002/000369\ndata/0002/000370\ndata/0002/000371\ndata/0002/000372\ndata/0002/000373\ndata/0002/000374\ndata/0002/000375\ndata/0002/000376\ndata/0002/000377\ndata/0002/000378\ndata/0002/000379\ndata/0002/000380\ndata/0002/000381\ndata/0002/000382\ndata/0002/000383\ndata/0002/000384\ndata/0002/000385\ndata/0002/000386\ndata/0002/000387\ndata/0002/000388\ndata/0002/000389\ndata/0002/000390\ndata/0002/000391\ndata/0002/000392\ndata/0002/000393\ndata/0002/000394\ndata/0002/000395\ndata/0002/000396\ndata/0002/000397\ndata/0002/000398\ndata/0002/000399\ndata/0002/000400\ndata/0002/000401\ndata/0002/000402\ndata/0002/000403\ndata/0002/000404\ndata/0002/000405\ndata/0002/000406\ndata/0002/000407\ndata/0002/000408\ndata/0002/000409\ndata/0002/000410\ndata/0002/000411\ndata/0002/000412\ndata/0002/000413\ndata/0002/000414\ndata/0002/000415\ndata/0002/000416\ndata/0002/000417\ndata/0002/000418\ndata/0002/000419\ndata/0002/000420\ndata/0002/000421\ndata/0002/000422\ndata/0002/000423\ndata/0002/000424\ndata/0002/000425\ndata/0002/000426\ndata/0002/000427\ndata/0002/000428\ndata/0002/000429\ndata/0002/000430\ndata/0002/000431\ndata/0002/000432\ndata/0002/000433\ndata/0002/000434\ndata/0002/000435\ndata/0002/000436\ndata/0002/000437\ndata/0002/000438\ndata/0002/000439\ndata/0002/000440\ndata/0002/000441\ndata/0002/000442\ndata/0002/000443\ndata/0002/000444\ndata/0002/000445\ndata/0002/000446\ndata/0002/000447\ndata/0002/000448\ndata/0002/000449\ndata/0002/000450\ndata/0002/000451\ndata/0002/000452\ndata/0002/000453\ndata/0002/000454\ndata/0002/000455\ndata/0002/000456\ndata/0002/000457\ndata/0002/000458\ndata/0002/000459\ndata/0002/000460\ndata/0002/000461\ndata/0002/000462\ndata/0002/000463\ndata/0002/000464\ndata/0002/000465\ndata/0002/000466\ndata/0002/000467\ndata/0002/000468\ndata/0002/000469\ndata/0002/000470\ndata/0002/000471\ndata/0002/000472\ndata/0002/000473\ndata/0002/000474\ndata/0002/000475\ndata/0002/000476\ndata/0002/000477\ndata/0002/000478\ndata/0002/000479\ndata/0002/000480\ndata/0002/000481\ndata/0002/000482\ndata/0002/000483\ndata/0002/000484\ndata/0002/000485\ndata/0002/000486\ndata/0002/000487\ndata/0002/000488\ndata/0002/000489\ndata/0002/000490\ndata/0002/000491\ndata/0002/000492\ndata/0002/000493\ndata/0002/000494\ndata/0002/000495\ndata/0002/000496\ndata/0002/000497\ndata/0002/000498\ndata/0002/000499\ndata/0002/000500\ndata/0002/000501\ndata/0002/000502\ndata/0002/000503\ndata/0002/000504\ndata/0002/000505\ndata/0002/000506\ndata/0002/000507\ndata/0002/000508\ndata/0002/000509\ndata/0002/000510\ndata/0002/000511\ndata/0002/000512\ndata/0002/000513\ndata/0002/000514\ndata/0002/000515\ndata/0002/000516\ndata/0002/000517\ndata/0002/000518\ndata/0002/000519\ndata/0002/000520\ndata/0002/000521\ndata/0002/000522\ndata/0002/000523\ndata/0002/000524\ndata/0002/000525\ndata/0002/000526\ndata/0002/000527\ndata/0002/000528\ndata/0002/000529\ndata/0002/000530\ndata/0002/000531\ndata/0002/000532\ndata/0002/000533\ndata/0002/000534\ndata/0002/000535\ndata/0002/000536\ndata/0002/000537\ndata/0002/000538\ndata/0002/000539\ndata/0002/000540\ndata/0002/000541\ndata/0002/000542\ndata/0002/000543\ndata/0002/000544\ndata/0002/000545\ndata/0002/000546\ndata/0002/000547\ndata/0002/000548\ndata/0002/000549\ndata/0002/000550\ndata/0002/000551\ndata/0002/000552\ndata/0002/000553\ndata/0002/000554\ndata/0002/000555\ndata/0002/000556\ndata/0002/000557\ndata/0002/000558\ndata/0002/000559\ndata/0002/000560\ndata/0002/000561\ndata/0002/000562\ndata/0002/000563\ndata/0002/000564\ndata/0002/000565\ndata/0002/000566\ndata/0002/000567\ndata/0002/000568\ndata/0002/000569\ndata/0002/000570\ndata/0002/000571\ndata/0002/000572\ndata/0002/000573\ndata/0002/000574\ndata/0002/000575\ndata/0002/000576\ndata/0002/000577\ndata/0002/000578\ndata/0002/000579\ndata/0002/000580\ndata/0002/000581\ndata/0002/000582\ndata/0002/000583\ndata/0002/000584\ndata/0002/000585\ndata/0002/000586\ndata/0002/000587\ndata/0002/000588\ndata/0002/000589\ndata/0002/000590\ndata/0002/000591\ndata/0002/000592\ndata/0002/000593\ndata/0002/000594\ndata/0002/000595\ndata/0002/000596\ndata/0002/000597\ndata/0002/000598\ndata/0002/000599\ndata/0002/000600\ndata/0002/000601\ndata/0002/000602\ndata/0002/000603\ndata/0002/000604\ndata/0002/000605\ndata/0002/000606\ndata/0002/000607\ndata/0002/000608\ndata/0002/000609\ndata/0002/000610\ndata/0002/000611\ndata/0002/000612\ndata/0002/000613\ndata/0002/000614\ndata/0002/000615\ndata/0002/000616\ndata/0002/000617\ndata/0002/000618\ndata/0002/000619\ndata/0002/000620\ndata/0002/000621\ndata/0002/000622\ndata/0002/000623\ndata/0002/000624\ndata/0002/000625\ndata/0002/000626\ndata/0002/000627\ndata/0002/000628\ndata/0002/000629\ndata/0002/000630\ndata/0002/000631\ndata/0002/000632\ndata/0002/000633\ndata/0002/000634\ndata/0002/000635\ndata/0002/000636\ndata/0002/000637\ndata/0002/000638\ndata/0002/000639\ndata/0002/000640\ndata/0002/000641\ndata/0002/000642\ndata/0002/000643\ndata/0002/000644\ndata/0002/000645\ndata/0002/000646\ndata/0002/000647\ndata/0002/000648\ndata/0002/000649\ndata/0002/000650\ndata/0002/000651\ndata/0002/000652\ndata/0002/000653\ndata/0002/000654\ndata/0002/000655\ndata/0002/000656\ndata/0002/000657\ndata/0002/000658\ndata/0002/000659\ndata/0002/000660\ndata/0002/000661\ndata/0002/000662\ndata/0002/000663\ndata/0002/000664\ndata/0002/000665\ndata/0002/000666\ndata/0002/000667\ndata/0002/000668\ndata/0002/000669\ndata/0002/000670\ndata/0002/000671\ndata/0002/000672\ndata/0002/000673\ndata/0002/000674\ndata/0002/000675\ndata/0002/000676\ndata/0002/000677\ndata/0002/000678\ndata/0002/000679\ndata/0002/000680\ndata/0002/000681\ndata/0002/000682\ndata/0002/000683\ndata/0002/000684\ndata/0002/000685\ndata/0002/000686\ndata/0002/000687\ndata/0002/000688\ndata/0002/000689\ndata/0002/000690\ndata/0002/000691\ndata/0002/000692\ndata/0002/000693\ndata/0002/000694\ndata/0002/000695\ndata/0002/000696\ndata/0002/000697\ndata/0002/000698\ndata/0002/000699\ndata/0002/000700\ndata/0002/000701\ndata/0002/000702\ndata/0002/000703\ndata/0002/000704\ndata/0002/000705\ndata/0002/000706\ndata/0002/000707\ndata/0002/000708\ndata/0002/000709\ndata/0002/000710\ndata/0002/000711\ndata/0002/000712\ndata/0002/000713\ndata/0002/000714\ndata/0002/000715\ndata/0002/000716\ndata/0002/000717\ndata/0002/000718\ndata/0002/000719\ndata/0002/000720\ndata/0002/000721\ndata/0002/000722\ndata/0002/000723\ndata/0002/000724\ndata/0002/000725\ndata/0002/000726\ndata/0002/000727\ndata/0002/000728\ndata/0002/000729\ndata/0002/000730\ndata/0002/000731\ndata/0002/000732\ndata/0002/000733\ndata/0002/000734\ndata/0002/000735\ndata/0002/000736\ndata/0002/000737\ndata/0002/000738\ndata/0002/000739\ndata/0002/000740\ndata/0002/000741\ndata/0002/000742\ndata/0002/000743\ndata/0002/000744\ndata/0002/000745\ndata/0002/000746\ndata/0002/000747\ndata/0002/000748\ndata/0002/000749\ndata/0002/000750\ndata/0002/000751\ndata/0002/000752\ndata/0002/000753\ndata/0002/000754\ndata/0002/000755\ndata/0002/000756\ndata/0002/000757\ndata/0002/000758\ndata/0002/000759\ndata/0002/000760\ndata/0002/000761\ndata/0002/000762\ndata/0002/000763\ndata/0002/000764\ndata/0002/000765\ndata/0002/000766\ndata/0002/000767\ndata/0002/000768\ndata/0002/000769\ndata/0002/000770\ndata/0002/000771\ndata/0002/000772\ndata/0002/000773\ndata/0002/000774\ndata/0002/000775\ndata/0002/000776\ndata/0002/000777\ndata/0002/000778\ndata/0002/000779\ndata/0002/000780\ndata/0002/000781\ndata/0002/000782\ndata/0002/000783\ndata/0002/000784\ndata/0002/000785\ndata/0002/000786\ndata/0002/000787\ndata/0002/000788\ndata/0002/000789\ndata/0002/000790\ndata/0002/000791\ndata/0002/000792\ndata/0002/000793\ndata/0002/000794\ndata/0002/000795\ndata/0002/000796\ndata/0002/000797\ndata/0002/000798\ndata/0002/000799\ndata/0002/000800\ndata/0002/000801\ndata/0002/000802\ndata/0002/000803\ndata/0002/000804\ndata/0002/000805\ndata/0002/000806\ndata/0002/000807\ndata/0002/000808\ndata/0002/000809\ndata/0002/000810\ndata/0002/000811\ndata/0002/000812\ndata/0002/000813\ndata/0002/000814\ndata/0002/000815\ndata/0002/000816\ndata/0002/000817\ndata/0002/000818\ndata/0002/000819\ndata/0002/000820\ndata/0002/000821\ndata/0002/000822\ndata/0002/000823\ndata/0002/000824\ndata/0002/000825\ndata/0002/000826\ndata/0002/000827\ndata/0002/000828\ndata/0002/000829\ndata/0002/000830\ndata/0002/000831\ndata/0002/000832\ndata/0002/000833\ndata/0002/000834\ndata/0002/000835\ndata/0002/000836\ndata/0002/000837\ndata/0002/000838\ndata/0002/000839\ndata/0002/000840\ndata/0002/000841\ndata/0002/000842\ndata/0002/000843\ndata/0002/000844\ndata/0002/000845\ndata/0002/000846\ndata/0002/000847\ndata/0002/000848\ndata/0002/000849\ndata/0002/000850\ndata/0002/000851\ndata/0002/000852\ndata/0002/000853\ndata/0002/000854\ndata/0002/000855\ndata/0002/000856\ndata/0002/000857\ndata/0002/000858\ndata/0002/000859\ndata/0002/000860\ndata/0002/000861\ndata/0002/000862\ndata/0002/000863\ndata/0002/000864\ndata/0002/000865\ndata/0002/000866\ndata/0002/000867\ndata/0002/000868\ndata/0002/000869\ndata/0002/000870\ndata/0002/000871\ndata/0002/000872\ndata/0002/000873\ndata/0002/000874\ndata/0002/000875\ndata/0002/000876\ndata/0002/000877\ndata/0002/000878\ndata/0002/000879\ndata/0002/000880\ndata/0002/000881\ndata/0002/000882\ndata/0002/000883\ndata/0002/000884\ndata/0002/000885\ndata/0002/000886\ndata/0002/000887\ndata/0002/000888\ndata/0002/000889\ndata/0002/000890\ndata/0002/000891\ndata/0002/000892\ndata/0002/000893\ndata/0002/000894\ndata/0002/000895\ndata/0002/000896\ndata/0002/000897\ndata/0002/000898\ndata/0002/000899\ndata/0002/000900\ndata/0002/000901\ndata/0002/000902\ndata/0002/000903\ndata/0002/000904\ndata/0002/000905\ndata/0002/000906\ndata/0002/000907\ndata/0002/000908\ndata/0002/000909\ndata/0002/000910\ndata/0002/000911\ndata/0002/000912\ndata/0002/000913\ndata/0002/000914\ndata/0002/000915\ndata/0002/000916\ndata/0002/000917\ndata/0002/000918\ndata/0002/000919\ndata/0002/000920\ndata/0002/000921\ndata/0002/000922\ndata/0002/000923\ndata/0002/000924\ndata/0002/000925\ndata/0002/000926\ndata/0002/000927\ndata/0002/000928\ndata/0002/000929\ndata/0002/000930\ndata/0002/000931\ndata/0002/000932\ndata/0002/000933\ndata/0002/000934\ndata/0002/000935\ndata/0002/000936\ndata/0002/000937\ndata/0002/000938\ndata/0002/000939\ndata/0002/000940\ndata/0002/000941\ndata/0002/000942\ndata/0002/000943\ndata/0002/000944\ndata/0002/000945\ndata/0002/000946\ndata/0002/000947\ndata/0002/000948\ndata/0002/000949\ndata/0002/000950\ndata/0002/000951\ndata/0002/000952\ndata/0002/000953\ndata/0002/000954\ndata/0002/000955\ndata/0002/000956\ndata/0002/000957\ndata/0002/000958\ndata/0002/000959\ndata/0002/000960\ndata/0002/000961\ndata/0002/000962\ndata/0002/000963\ndata/0002/000964\ndata/0002/000965\ndata/0002/000966\ndata/0002/000967\ndata/0002/000968\ndata/0002/000969\ndata/0002/000970\ndata/0002/000971\ndata/0002/000972\ndata/0002/000973\ndata/0002/000974\ndata/0002/000975\ndata/0002/000976\ndata/0002/000977\ndata/0002/000978\ndata/0002/000979\ndata/0002/000980\ndata/0002/000981\ndata/0002/000982\ndata/0002/000983\ndata/0002/000984\ndata/0002/000985\ndata/0002/000986\ndata/0002/000987\ndata/0002/000988\ndata/0002/000989\ndata/0002/000990\ndata/0002/000991\ndata/0002/000992\ndata/0002/000993\ndata/0002/000994\ndata/0002/000995\ndata/0002/000996\ndata/0002/000997\ndata/0002/000998\ndata/0002/000999\ndata/0002/001000\ndata/0002/001001\ndata/0002/001002\ndata/0002/001003\ndata/0002/001004\ndata/0002/001005\ndata/0002/001006\ndata/0002/001007\ndata/0002/001008\ndata/0002/001009\ndata/0002/001010\ndata/0002/001011\ndata/0002/001012\ndata/0002/001013\ndata/0002/001014\ndata/0002/001015\ndata/0002/001016\ndata/0002/001017\ndata/0002/001018\ndata/0002/001019\ndata/0002/001020\ndata/0002/001021\ndata/0002/001022\ndata/0002/001023\ndata/0002/001024\ndata/0002/001025\ndata/0002/001026\ndata/0002/001027\ndata/0002/001028\ndata/0002/001029\ndata/0002/001030\ndata/0002/001031\ndata/0002/001032\ndata/0002/001033\ndata/0002/001034\ndata/0002/001035\ndata/0002/001036\ndata/0002/001037\ndata/0002/001038\ndata/0002/001039\ndata/0002/001040\ndata/0002/001041\ndata/0002/001042\ndata/0002/001043\ndata/0002/001044\ndata/0002/001045\ndata/0002/001046\ndata/0002/001047\ndata/0002/001048\ndata/0002/001049\ndata/0002/001050\ndata/0002/001051\ndata/0002/001052\ndata/0002/001053\ndata/0002/001054\ndata/0002/001055\ndata/0002/001056\ndata/0002/001057\ndata/0002/001058\ndata/0002/001059\ndata/0002/001060\ndata/0002/001061\ndata/0002/001062\ndata/0002/001063\ndata/0002/001064\ndata/0002/001065\ndata/0002/001066\ndata/0002/001067\ndata/0002/001068\ndata/0002/001069\ndata/0002/001070\ndata/0002/001071\ndata/0002/001072\ndata/0002/001073\ndata/0002/001074\ndata/0002/001075\ndata/0002/001076\ndata/0002/001077\ndata/0002/001078\ndata/0002/001079\ndata/0002/001080\ndata/0002/001081\ndata/0002/001082\ndata/0002/001083\ndata/0002/001084\ndata/0002/001085\ndata/0002/001086\ndata/0002/001087\ndata/0002/001088\ndata/0002/001089\ndata/0002/001090\ndata/0002/001091\ndata/0002/001092\ndata/0002/001093\ndata/0002/001094\ndata/0002/001095\ndata/0002/001096\ndata/0002/001097\ndata/0002/001098\ndata/0002/001099\ndata/0002/001100\ndata/0002/001101\ndata/0002/001102\ndata/0002/001103\ndata/0002/001104\ndata/0002/001105\ndata/0002/001106\ndata/0002/001107\ndata/0002/001108\ndata/0002/001109\ndata/0002/001110\ndata/0002/001111\ndata/0002/001112\ndata/0002/001113\ndata/0002/001114\ndata/0002/001115\ndata/0002/001116\ndata/0002/001117\ndata/0002/001118\ndata/0002/001119\ndata/0002/001120\ndata/0002/001121\ndata/0002/001122\ndata/0002/001123\ndata/0002/001124\ndata/0002/001125\ndata/0002/001126\ndata/0002/001127\ndata/0002/001128\ndata/0002/001129\ndata/0002/001130\ndata/0002/001131\ndata/0002/001132\ndata/0002/001133\ndata/0002/001134\ndata/0002/001135\ndata/0002/001136\ndata/0002/001137\ndata/0002/001138\ndata/0002/001139\ndata/0002/001140\ndata/0002/001141\ndata/0002/001142\ndata/0002/001143\ndata/0002/001144\ndata/0002/001145\ndata/0002/001146\ndata/0002/001147\ndata/0002/001148\ndata/0002/001149\ndata/0002/001150\ndata/0002/001151\ndata/0002/001152\ndata/0002/001153\ndata/0002/001154\ndata/0002/001155\ndata/0002/001156\ndata/0002/001157\ndata/0002/001158\ndata/0002/001159\ndata/0002/001160\ndata/0002/001161\ndata/0002/001162\ndata/0002/001163\ndata/0002/001164\ndata/0002/001165\ndata/0002/001166\ndata/0002/001167\ndata/0002/001168\ndata/0002/001169\ndata/0002/001170\ndata/0002/001171\ndata/0002/001172\ndata/0002/001173\ndata/0002/001174\ndata/0002/001175\ndata/0002/001176\ndata/0002/001177\ndata/0002/001178\ndata/0002/001179\ndata/0002/001180\ndata/0002/001181\ndata/0002/001182\ndata/0002/001183\ndata/0002/001184\ndata/0002/001185\ndata/0002/001186\ndata/0002/001187\ndata/0002/001188\ndata/0002/001189\ndata/0002/001190\ndata/0002/001191\ndata/0002/001192\ndata/0002/001193\ndata/0002/001194\ndata/0002/001195\ndata/0002/001196\ndata/0002/001197\ndata/0002/001198\ndata/0002/001199\ndata/0002/001200\ndata/0002/001201\ndata/0002/001202\ndata/0002/001203\ndata/0002/001204\ndata/0002/001205\ndata/0002/001206\ndata/0002/001207\ndata/0002/001208\ndata/0002/001209\ndata/0002/001210\ndata/0002/001211\ndata/0002/001212\ndata/0002/001213\ndata/0002/001214\ndata/0002/001215\ndata/0002/001216\ndata/0002/001217\ndata/0002/001218\ndata/0002/001219\ndata/0002/001220\ndata/0002/001221\ndata/0002/001222\ndata/0002/001223\ndata/0002/001224\ndata/0002/001225\ndata/0002/001226\ndata/0002/001227\ndata/0002/001228\ndata/0002/001229\ndata/0002/001230\ndata/0002/001231\ndata/0002/001232\ndata/0002/001233\ndata/0002/001234\ndata/0002/001235\ndata/0002/001236\ndata/0002/001237\ndata/0002/001238\ndata/0002/001239\ndata/0002/001240\ndata/0002/001241\ndata/0002/001242\ndata/0002/001243\ndata/0002/001244\ndata/0002/001245\ndata/0002/001246\ndata/0002/001247\ndata/0002/001248\ndata/0002/001249\ndata/0002/001250\ndata/0002/001251\ndata/0002/001252\ndata/0002/001253\ndata/0002/001254\ndata/0002/001255\ndata/0002/001256\ndata/0002/001257\ndata/0002/001258\ndata/0002/001259\ndata/0002/001260\ndata/0002/001261\ndata/0002/001262\ndata/0004/000001\ndata/0004/000002\ndata/0004/000003\ndata/0004/000004\ndata/0004/000005\ndata/0004/000006\ndata/0004/000007\ndata/0004/000008\ndata/0004/000009\ndata/0004/000010\ndata/0004/000011\ndata/0004/000012\ndata/0004/000013\ndata/0004/000014\ndata/0004/000015\ndata/0004/000016\ndata/0004/000017\ndata/0004/000018\ndata/0004/000019\ndata/0004/000020\ndata/0004/000021\ndata/0004/000022\ndata/0004/000023\ndata/0004/000024\ndata/0004/000025\ndata/0004/000026\ndata/0004/000027\ndata/0004/000028\ndata/0004/000029\ndata/0004/000030\ndata/0004/000031\ndata/0004/000032\ndata/0004/000033\ndata/0004/000034\ndata/0004/000035\ndata/0004/000036\ndata/0004/000037\ndata/0004/000038\ndata/0004/000039\ndata/0004/000040\ndata/0004/000041\ndata/0004/000042\ndata/0004/000043\ndata/0004/000044\ndata/0004/000045\ndata/0004/000046\ndata/0004/000047\ndata/0004/000048\ndata/0004/000049\ndata/0004/000050\ndata/0004/000051\ndata/0004/000052\ndata/0004/000053\ndata/0004/000054\ndata/0004/000055\ndata/0004/000056\ndata/0004/000057\ndata/0004/000058\ndata/0004/000059\ndata/0004/000060\ndata/0004/000061\ndata/0004/000062\ndata/0004/000063\ndata/0004/000064\ndata/0004/000065\ndata/0004/000066\ndata/0004/000067\ndata/0004/000068\ndata/0004/000069\ndata/0004/000070\ndata/0004/000071\ndata/0004/000072\ndata/0004/000073\ndata/0004/000074\ndata/0004/000075\ndata/0004/000076\ndata/0004/000077\ndata/0004/000078\ndata/0004/000079\ndata/0004/000080\ndata/0004/000081\ndata/0004/000082\ndata/0004/000083\ndata/0004/000084\ndata/0004/000085\ndata/0004/000086\ndata/0004/000087\ndata/0004/000088\ndata/0004/000089\ndata/0004/000090\ndata/0004/000091\ndata/0004/000092\ndata/0004/000093\ndata/0004/000094\ndata/0004/000095\ndata/0004/000096\ndata/0004/000097\ndata/0004/000098\ndata/0004/000099\ndata/0004/000100\ndata/0004/000101\ndata/0004/000102\ndata/0004/000103\ndata/0004/000104\ndata/0004/000105\ndata/0004/000106\ndata/0004/000107\ndata/0004/000108\ndata/0004/000109\ndata/0004/000110\ndata/0004/000111\ndata/0004/000112\ndata/0004/000113\ndata/0004/000114\ndata/0004/000115\ndata/0004/000116\ndata/0004/000117\ndata/0004/000118\ndata/0004/000119\ndata/0004/000120\ndata/0004/000121\ndata/0004/000122\ndata/0004/000123\ndata/0004/000124\ndata/0004/000125\ndata/0004/000126\ndata/0004/000127\ndata/0004/000128\ndata/0004/000129\ndata/0004/000130\ndata/0004/000131\ndata/0004/000132\ndata/0004/000133\ndata/0004/000134\ndata/0004/000135\ndata/0004/000136\ndata/0004/000137\ndata/0004/000138\ndata/0004/000139\ndata/0004/000140\ndata/0004/000141\ndata/0004/000142\ndata/0004/000143\ndata/0004/000144\ndata/0004/000145\ndata/0004/000146\ndata/0004/000147\ndata/0004/000148\ndata/0004/000149\ndata/0004/000150\ndata/0004/000151\ndata/0004/000152\ndata/0004/000153\ndata/0004/000154\ndata/0004/000155\ndata/0004/000156\ndata/0004/000157\ndata/0004/000158\ndata/0004/000159\ndata/0004/000160\ndata/0004/000161\ndata/0004/000162\ndata/0004/000163\ndata/0004/000164\ndata/0004/000165\ndata/0004/000166\ndata/0004/000167\ndata/0004/000168\ndata/0004/000169\ndata/0004/000170\ndata/0004/000171\ndata/0004/000172\ndata/0004/000173\ndata/0004/000174\ndata/0004/000175\ndata/0004/000176\ndata/0004/000177\ndata/0004/000178\ndata/0004/000179\ndata/0004/000180\ndata/0004/000181\ndata/0004/000182\ndata/0004/000183\ndata/0004/000184\ndata/0004/000185\ndata/0004/000186\ndata/0004/000187\ndata/0004/000188\ndata/0004/000189\ndata/0004/000190\ndata/0004/000191\ndata/0004/000192\ndata/0004/000193\ndata/0004/000194\ndata/0004/000195\ndata/0004/000196\ndata/0004/000197\ndata/0004/000198\ndata/0004/000199\ndata/0004/000200\ndata/0004/000201\ndata/0004/000202\ndata/0004/000203\ndata/0004/000204\ndata/0004/000205\ndata/0004/000206\ndata/0004/000207\ndata/0004/000208\ndata/0004/000209\ndata/0004/000210\ndata/0004/000211\ndata/0004/000212\ndata/0004/000213\ndata/0004/000214\ndata/0004/000215\ndata/0004/000216\ndata/0004/000217\ndata/0004/000218\ndata/0004/000219\ndata/0004/000220\ndata/0004/000221\ndata/0004/000222\ndata/0004/000223\ndata/0004/000224\ndata/0004/000225\ndata/0004/000226\ndata/0004/000227\ndata/0004/000228\ndata/0004/000229\ndata/0004/000230\ndata/0004/000231\ndata/0004/000232\ndata/0004/000233\ndata/0004/000234\ndata/0004/000235\ndata/0004/000236\ndata/0004/000237\ndata/0004/000238\ndata/0004/000239\ndata/0004/000240\ndata/0004/000241\ndata/0004/000242\ndata/0004/000243\ndata/0004/000244\ndata/0004/000245\ndata/0004/000246\ndata/0004/000247\ndata/0004/000248\ndata/0004/000249\ndata/0004/000250\ndata/0004/000251\ndata/0004/000252\ndata/0004/000253\ndata/0004/000254\ndata/0004/000255\ndata/0004/000256\ndata/0004/000257\ndata/0004/000258\ndata/0004/000259\ndata/0004/000260\ndata/0004/000261\ndata/0004/000262\ndata/0004/000263\ndata/0004/000264\ndata/0004/000265\ndata/0004/000266\ndata/0004/000267\ndata/0004/000268\ndata/0004/000269\ndata/0004/000270\ndata/0004/000271\ndata/0004/000272\ndata/0004/000273\ndata/0004/000274\ndata/0004/000275\ndata/0004/000276\ndata/0004/000277\ndata/0004/000278\ndata/0004/000279\ndata/0004/000280\ndata/0004/000281\ndata/0004/000282\ndata/0004/000283\ndata/0004/000284\ndata/0004/000285\ndata/0004/000286\ndata/0004/000287\ndata/0004/000288\ndata/0004/000289\ndata/0004/000290\ndata/0004/000291\ndata/0004/000292\ndata/0004/000293\ndata/0004/000294\ndata/0004/000295\ndata/0004/000296\ndata/0004/000297\ndata/0004/000298\ndata/0004/000299\ndata/0004/000300\ndata/0004/000301\ndata/0004/000302\ndata/0004/000303\ndata/0004/000304\ndata/0004/000305\ndata/0004/000306\ndata/0004/000307\ndata/0004/000308\ndata/0004/000309\ndata/0004/000310\ndata/0004/000311\ndata/0004/000312\ndata/0004/000313\ndata/0004/000314\ndata/0004/000315\ndata/0004/000316\ndata/0004/000317\ndata/0004/000318\ndata/0004/000319\ndata/0004/000320\ndata/0004/000321\ndata/0004/000322\ndata/0004/000323\ndata/0004/000324\ndata/0004/000325\ndata/0004/000326\ndata/0004/000327\ndata/0004/000328\ndata/0004/000329\ndata/0004/000330\ndata/0004/000331\ndata/0004/000332\ndata/0004/000333\ndata/0004/000334\ndata/0004/000335\ndata/0004/000336\ndata/0004/000337\ndata/0004/000338\ndata/0004/000339\ndata/0004/000340\ndata/0004/000341\ndata/0004/000342\ndata/0004/000343\ndata/0004/000344\ndata/0004/000345\ndata/0004/000346\ndata/0004/000347\ndata/0004/000348\ndata/0004/000349\ndata/0004/000350\ndata/0004/000351\ndata/0004/000352\ndata/0004/000353\ndata/0004/000354\ndata/0004/000355\ndata/0004/000356\ndata/0004/000357\ndata/0004/000358\ndata/0004/000359\ndata/0004/000360\ndata/0004/000361\ndata/0004/000362\ndata/0004/000363\ndata/0004/000364\ndata/0004/000365\ndata/0004/000366\ndata/0004/000367\ndata/0004/000368\ndata/0004/000369\ndata/0004/000370\ndata/0004/000371\ndata/0004/000372\ndata/0004/000373\ndata/0004/000374\ndata/0004/000375\ndata/0004/000376\ndata/0004/000377\ndata/0004/000378\ndata/0004/000379\ndata/0004/000380\ndata/0004/000381\ndata/0004/000382\ndata/0004/000383\ndata/0004/000384\ndata/0004/000385\ndata/0004/000386\ndata/0004/000387\ndata/0004/000388\ndata/0004/000389\ndata/0004/000390\ndata/0004/000391\ndata/0004/000392\ndata/0004/000393\ndata/0004/000394\ndata/0004/000395\ndata/0004/000396\ndata/0004/000397\ndata/0004/000398\ndata/0004/000399\ndata/0004/000400\ndata/0004/000401\ndata/0004/000402\ndata/0004/000403\ndata/0004/000404\ndata/0004/000405\ndata/0004/000406\ndata/0004/000407\ndata/0004/000408\ndata/0004/000409\ndata/0004/000410\ndata/0004/000411\ndata/0004/000412\ndata/0004/000413\ndata/0004/000414\ndata/0004/000415\ndata/0004/000416\ndata/0004/000417\ndata/0004/000418\ndata/0004/000419\ndata/0004/000420\ndata/0004/000421\ndata/0004/000422\ndata/0004/000423\ndata/0004/000424\ndata/0004/000425\ndata/0004/000426\ndata/0004/000427\ndata/0004/000428\ndata/0004/000429\ndata/0004/000430\ndata/0004/000431\ndata/0004/000432\ndata/0004/000433\ndata/0004/000434\ndata/0004/000435\ndata/0004/000436\ndata/0004/000437\ndata/0004/000438\ndata/0004/000439\ndata/0004/000440\ndata/0004/000441\ndata/0004/000442\ndata/0004/000443\ndata/0004/000444\ndata/0004/000445\ndata/0004/000446\ndata/0004/000447\ndata/0004/000448\ndata/0004/000449\ndata/0004/000450\ndata/0004/000451\ndata/0004/000452\ndata/0004/000453\ndata/0004/000454\ndata/0004/000455\ndata/0004/000456\ndata/0004/000457\ndata/0004/000458\ndata/0004/000459\ndata/0004/000460\ndata/0004/000461\ndata/0004/000462\ndata/0004/000463\ndata/0004/000464\ndata/0004/000465\ndata/0004/000466\ndata/0004/000467\ndata/0004/000468\ndata/0004/000469\ndata/0004/000470\ndata/0004/000471\ndata/0004/000472\ndata/0004/000473\ndata/0004/000474\ndata/0004/000475\ndata/0004/000476\ndata/0004/000477\ndata/0004/000478\ndata/0004/000479\ndata/0004/000480\ndata/0004/000481\ndata/0004/000482\ndata/0004/000483\ndata/0004/000484\ndata/0004/000485\ndata/0004/000486\ndata/0004/000487\ndata/0004/000488\ndata/0004/000489\ndata/0004/000490\ndata/0004/000491\ndata/0004/000492\ndata/0004/000493\ndata/0004/000494\ndata/0004/000495\ndata/0004/000496\ndata/0004/000497\ndata/0004/000498\ndata/0004/000499\ndata/0004/000500\ndata/0004/000501\ndata/0004/000502\ndata/0004/000503\ndata/0004/000504\ndata/0004/000505\ndata/0004/000506\ndata/0004/000507\ndata/0004/000508\ndata/0004/000509\ndata/0004/000510\ndata/0004/000511\ndata/0004/000512\ndata/0004/000513\ndata/0004/000514\ndata/0004/000515\ndata/0004/000516\ndata/0004/000517\ndata/0004/000518\ndata/0004/000519\ndata/0004/000520\ndata/0004/000521\ndata/0004/000522\ndata/0004/000523\ndata/0004/000524\ndata/0004/000525\ndata/0004/000526\ndata/0004/000527\ndata/0004/000528\ndata/0004/000529\ndata/0004/000530\ndata/0004/000531\ndata/0004/000532\ndata/0004/000533\ndata/0004/000534\ndata/0004/000535\ndata/0004/000536\ndata/0004/000537\ndata/0004/000538\ndata/0004/000539\ndata/0004/000540\ndata/0004/000541\ndata/0004/000542\ndata/0004/000543\ndata/0004/000544\ndata/0004/000545\ndata/0004/000546\ndata/0004/000547\ndata/0004/000548\ndata/0004/000549\ndata/0004/000550\ndata/0004/000551\ndata/0004/000552\ndata/0004/000553\ndata/0004/000554\ndata/0004/000555\ndata/0004/000556\ndata/0004/000557\ndata/0004/000558\ndata/0004/000559\ndata/0004/000560\ndata/0004/000561\ndata/0004/000562\ndata/0004/000563\ndata/0004/000564\ndata/0004/000565\ndata/0004/000566\ndata/0004/000567\ndata/0004/000568\ndata/0004/000569\ndata/0004/000570\ndata/0004/000571\ndata/0004/000572\ndata/0004/000573\ndata/0004/000574\ndata/0004/000575\ndata/0004/000576\ndata/0004/000577\ndata/0004/000578\ndata/0004/000579\ndata/0004/000580\ndata/0004/000581\ndata/0004/000582\ndata/0004/000583\ndata/0004/000584\ndata/0004/000585\ndata/0004/000586\ndata/0004/000587\ndata/0004/000588\ndata/0004/000589\ndata/0004/000590\ndata/0004/000591\ndata/0004/000592\ndata/0004/000593\ndata/0004/000594\ndata/0004/000595\ndata/0004/000596\ndata/0004/000597\ndata/0004/000598\ndata/0004/000599\ndata/0004/000600\ndata/0004/000601\ndata/0004/000602\ndata/0004/000603\ndata/0005/000001\ndata/0005/000002\ndata/0005/000003\ndata/0005/000004\ndata/0005/000005\ndata/0005/000006\ndata/0005/000007\ndata/0005/000008\ndata/0005/000009\ndata/0005/000010\ndata/0005/000011\ndata/0005/000012\ndata/0005/000013\ndata/0005/000014\ndata/0005/000015\ndata/0005/000016\ndata/0005/000017\ndata/0005/000018\ndata/0005/000019\ndata/0005/000020\ndata/0005/000021\ndata/0005/000022\ndata/0005/000023\ndata/0005/000024\ndata/0005/000025\ndata/0005/000026\ndata/0005/000027\ndata/0005/000028\ndata/0005/000029\ndata/0005/000030\ndata/0005/000031\ndata/0005/000032\ndata/0005/000033\ndata/0005/000034\ndata/0005/000035\ndata/0005/000036\ndata/0005/000037\ndata/0005/000038\ndata/0005/000039\ndata/0005/000040\ndata/0005/000041\ndata/0005/000042\ndata/0005/000043\ndata/0005/000044\ndata/0005/000045\ndata/0005/000046\ndata/0005/000047\ndata/0005/000048\ndata/0005/000049\ndata/0005/000050\ndata/0005/000051\ndata/0005/000052\ndata/0005/000053\ndata/0005/000054\ndata/0005/000055\ndata/0005/000056\ndata/0005/000057\ndata/0005/000058\ndata/0005/000059\ndata/0005/000060\ndata/0005/000061\ndata/0005/000062\ndata/0005/000063\ndata/0005/000064\ndata/0005/000065\ndata/0005/000066\ndata/0005/000067\ndata/0005/000068\ndata/0005/000069\ndata/0005/000070\ndata/0005/000071\ndata/0005/000072\ndata/0005/000073\ndata/0005/000074\ndata/0005/000075\ndata/0005/000076\ndata/0005/000077\ndata/0005/000078\ndata/0005/000079\ndata/0005/000080\ndata/0005/000081\ndata/0005/000082\ndata/0005/000083\ndata/0005/000084\ndata/0005/000085\ndata/0005/000086\ndata/0005/000087\ndata/0005/000088\ndata/0005/000089\ndata/0005/000090\ndata/0005/000091\ndata/0005/000092\ndata/0005/000093\ndata/0005/000094\ndata/0005/000095\ndata/0005/000096\ndata/0005/000097\ndata/0005/000098\ndata/0005/000099\ndata/0005/000100\ndata/0005/000101\ndata/0005/000102\ndata/0005/000103\ndata/0005/000104\ndata/0005/000105\ndata/0005/000106\ndata/0005/000107\ndata/0005/000108\ndata/0005/000109\ndata/0005/000110\ndata/0005/000111\ndata/0005/000112\ndata/0005/000113\ndata/0005/000114\ndata/0005/000115\ndata/0005/000116\ndata/0005/000117\ndata/0005/000118\ndata/0005/000119\ndata/0005/000120\ndata/0005/000121\ndata/0005/000122\ndata/0005/000123\ndata/0005/000124\ndata/0005/000125\ndata/0005/000126\ndata/0005/000127\ndata/0005/000128\ndata/0005/000129\ndata/0005/000130\ndata/0005/000131\ndata/0005/000132\ndata/0005/000133\ndata/0005/000134\ndata/0005/000135\ndata/0005/000136\ndata/0005/000137\ndata/0005/000138\ndata/0005/000139\ndata/0005/000140\ndata/0005/000141\ndata/0005/000142\ndata/0005/000143\ndata/0005/000144\ndata/0005/000145\ndata/0005/000146\ndata/0005/000147\ndata/0005/000148\ndata/0005/000149\ndata/0005/000150\ndata/0005/000151\ndata/0005/000152\ndata/0005/000153\ndata/0005/000154\ndata/0005/000155\ndata/0005/000156\ndata/0005/000157\ndata/0005/000158\ndata/0005/000159\ndata/0005/000160\ndata/0005/000161\ndata/0005/000162\ndata/0005/000163\ndata/0005/000164\ndata/0005/000165\ndata/0005/000166\ndata/0005/000167\ndata/0005/000168\ndata/0005/000169\ndata/0005/000170\ndata/0005/000171\ndata/0005/000172\ndata/0005/000173\ndata/0005/000174\ndata/0005/000175\ndata/0005/000176\ndata/0005/000177\ndata/0005/000178\ndata/0005/000179\ndata/0005/000180\ndata/0005/000181\ndata/0005/000182\ndata/0005/000183\ndata/0005/000184\ndata/0005/000185\ndata/0005/000186\ndata/0005/000187\ndata/0005/000188\ndata/0005/000189\ndata/0005/000190\ndata/0005/000191\ndata/0005/000192\ndata/0005/000193\ndata/0005/000194\ndata/0005/000195\ndata/0005/000196\ndata/0005/000197\ndata/0005/000198\ndata/0005/000199\ndata/0005/000200\ndata/0005/000201\ndata/0005/000202\ndata/0005/000203\ndata/0005/000204\ndata/0005/000205\ndata/0005/000206\ndata/0005/000207\ndata/0005/000208\ndata/0005/000209\ndata/0005/000210\ndata/0005/000211\ndata/0005/000212\ndata/0005/000213\ndata/0005/000214\ndata/0005/000215\ndata/0005/000216\ndata/0005/000217\ndata/0005/000218\ndata/0005/000219\ndata/0005/000220\ndata/0005/000221\ndata/0005/000222\ndata/0005/000223\ndata/0005/000224\ndata/0005/000225\ndata/0005/000226\ndata/0005/000227\ndata/0005/000228\ndata/0005/000229\ndata/0005/000230\ndata/0005/000231\ndata/0005/000232\ndata/0005/000233\ndata/0005/000234\ndata/0005/000235\ndata/0005/000236\ndata/0005/000237\ndata/0005/000238\ndata/0005/000239\ndata/0005/000240\ndata/0005/000241\ndata/0005/000242\ndata/0005/000243\ndata/0005/000244\ndata/0005/000245\ndata/0005/000246\ndata/0005/000247\ndata/0005/000248\ndata/0005/000249\ndata/0005/000250\ndata/0005/000251\ndata/0005/000252\ndata/0005/000253\ndata/0005/000254\ndata/0005/000255\ndata/0005/000256\ndata/0005/000257\ndata/0005/000258\ndata/0005/000259\ndata/0005/000260\ndata/0005/000261\ndata/0005/000262\ndata/0005/000263\ndata/0005/000264\ndata/0005/000265\ndata/0005/000266\ndata/0005/000267\ndata/0005/000268\ndata/0005/000269\ndata/0005/000270\ndata/0005/000271\ndata/0005/000272\ndata/0005/000273\ndata/0005/000274\ndata/0005/000275\ndata/0005/000276\ndata/0005/000277\ndata/0005/000278\ndata/0005/000279\ndata/0005/000280\ndata/0005/000281\ndata/0005/000282\ndata/0005/000283\ndata/0005/000284\ndata/0005/000285\ndata/0005/000286\ndata/0005/000287\ndata/0005/000288\ndata/0005/000289\ndata/0005/000290\ndata/0005/000291\ndata/0005/000292\ndata/0005/000293\ndata/0005/000294\ndata/0005/000295\ndata/0005/000296\ndata/0005/000297\ndata/0005/000298\ndata/0005/000299\ndata/0005/000300\ndata/0005/000301\ndata/0005/000302\ndata/0005/000303\ndata/0005/000304\ndata/0005/000305\ndata/0005/000306\ndata/0005/000307\ndata/0005/000308\ndata/0005/000309\ndata/0005/000310\ndata/0005/000311\ndata/0005/000312\ndata/0005/000313\ndata/0005/000314\ndata/0005/000315\ndata/0005/000316\ndata/0005/000317\ndata/0005/000318\ndata/0005/000319\ndata/0005/000320\ndata/0005/000321\ndata/0005/000322\ndata/0005/000323\ndata/0005/000324\ndata/0005/000325\ndata/0005/000326\ndata/0005/000327\ndata/0005/000328\ndata/0005/000329\ndata/0005/000330\ndata/0005/000331\ndata/0005/000332\ndata/0005/000333\ndata/0005/000334\ndata/0005/000335\ndata/0005/000336\ndata/0005/000337\ndata/0005/000338\ndata/0005/000339\ndata/0005/000340\ndata/0005/000341\ndata/0005/000342\ndata/0005/000343\ndata/0005/000344\ndata/0005/000345\ndata/0005/000346\ndata/0005/000347\ndata/0005/000348\ndata/0005/000349\ndata/0005/000350\ndata/0005/000351\ndata/0005/000352\ndata/0005/000353\ndata/0005/000354\ndata/0005/000355\ndata/0005/000356\ndata/0005/000357\ndata/0005/000358\ndata/0005/000359\ndata/0005/000360\ndata/0005/000361\ndata/0005/000362\ndata/0005/000363\ndata/0005/000364\ndata/0005/000365\ndata/0005/000366\ndata/0005/000367\ndata/0005/000368\ndata/0005/000369\ndata/0005/000370\ndata/0005/000371\ndata/0005/000372\ndata/0005/000373\ndata/0005/000374\ndata/0005/000375\ndata/0005/000376\ndata/0005/000377\ndata/0005/000378\ndata/0005/000379\ndata/0005/000380\ndata/0005/000381\ndata/0005/000382\ndata/0005/000383\ndata/0005/000384\ndata/0005/000385\ndata/0005/000386\ndata/0005/000387\ndata/0005/000388\ndata/0005/000389\ndata/0005/000390\ndata/0005/000391\ndata/0005/000392\ndata/0005/000393\ndata/0005/000394\ndata/0005/000395\ndata/0005/000396\ndata/0005/000397\ndata/0005/000398\ndata/0005/000399\ndata/0005/000400\ndata/0005/000401\ndata/0005/000402\ndata/0005/000403\ndata/0005/000404\ndata/0005/000405\ndata/0005/000406\ndata/0005/000407\ndata/0005/000408\ndata/0005/000409\ndata/0005/000410\ndata/0005/000411\ndata/0005/000412\ndata/0005/000413\ndata/0005/000414\ndata/0005/000415\ndata/0005/000416\ndata/0005/000417\ndata/0005/000418\ndata/0005/000419\ndata/0005/000420\ndata/0005/000421\ndata/0005/000422\ndata/0005/000423\ndata/0005/000424\ndata/0005/000425\ndata/0005/000426\ndata/0005/000427\ndata/0005/000428\ndata/0005/000429\ndata/0005/000430\ndata/0005/000431\ndata/0005/000432\ndata/0005/000433\ndata/0005/000434\ndata/0005/000435\ndata/0005/000436\ndata/0005/000437\ndata/0005/000438\ndata/0005/000439\ndata/0005/000440\ndata/0005/000441\ndata/0005/000442\ndata/0005/000443\ndata/0005/000444\ndata/0005/000445\ndata/0005/000446\ndata/0005/000447\ndata/0005/000448\ndata/0005/000449\ndata/0005/000450\ndata/0005/000451\ndata/0005/000452\ndata/0005/000453\ndata/0005/000454\ndata/0005/000455\ndata/0005/000456\ndata/0005/000457\ndata/0005/000458\ndata/0005/000459\ndata/0005/000460\ndata/0005/000461\ndata/0005/000462\ndata/0005/000463\ndata/0005/000464\ndata/0005/000465\ndata/0005/000466\ndata/0005/000467\ndata/0005/000468\ndata/0005/000469\ndata/0005/000470\ndata/0005/000471\ndata/0005/000472\ndata/0005/000473\ndata/0005/000474\ndata/0005/000475\ndata/0005/000476\ndata/0005/000477\ndata/0005/000478\ndata/0005/000479\ndata/0005/000480\ndata/0005/000481\ndata/0005/000482\ndata/0005/000483\ndata/0005/000484\ndata/0005/000485\ndata/0005/000486\ndata/0005/000487\ndata/0005/000488\ndata/0005/000489\ndata/0005/000490\ndata/0005/000491\ndata/0005/000492\ndata/0005/000493\ndata/0005/000494\ndata/0005/000495\ndata/0005/000496\ndata/0005/000497\ndata/0005/000498\ndata/0005/000499\ndata/0005/000500\ndata/0005/000501\ndata/0005/000502\ndata/0005/000503\ndata/0005/000504\ndata/0005/000505\ndata/0005/000506\ndata/0005/000507\ndata/0005/000508\ndata/0005/000509\ndata/0005/000510\ndata/0005/000511\ndata/0005/000512\ndata/0005/000513\ndata/0005/000514\ndata/0005/000515\ndata/0005/000516\ndata/0005/000517\ndata/0005/000518\ndata/0005/000519\ndata/0005/000520\ndata/0005/000521\ndata/0005/000522\ndata/0005/000523\ndata/0005/000524\ndata/0005/000525\ndata/0005/000526\ndata/0005/000527\ndata/0005/000528\ndata/0005/000529\ndata/0005/000530\ndata/0005/000531\ndata/0005/000532\ndata/0005/000533\ndata/0005/000534\ndata/0005/000535\ndata/0005/000536\ndata/0005/000537\ndata/0005/000538\ndata/0005/000539\ndata/0005/000540\ndata/0005/000541\ndata/0005/000542\ndata/0005/000543\ndata/0005/000544\ndata/0005/000545\ndata/0005/000546\ndata/0005/000547\ndata/0005/000548\ndata/0005/000549\ndata/0005/000550\ndata/0005/000551\ndata/0005/000552\ndata/0005/000553\ndata/0005/000554\ndata/0005/000555\ndata/0005/000556\ndata/0005/000557\ndata/0005/000558\ndata/0005/000559\ndata/0005/000560\ndata/0005/000561\ndata/0005/000562\ndata/0005/000563\ndata/0005/000564\ndata/0005/000565\ndata/0005/000566\ndata/0005/000567\ndata/0005/000568\ndata/0005/000569\ndata/0005/000570\ndata/0005/000571\ndata/0005/000572\ndata/0005/000573\ndata/0005/000574\ndata/0005/000575\ndata/0005/000576\ndata/0005/000577\ndata/0005/000578\ndata/0005/000579\ndata/0005/000580\ndata/0005/000581\ndata/0005/000582\ndata/0005/000583\ndata/0005/000584\ndata/0005/000585\ndata/0005/000586\ndata/0005/000587\ndata/0005/000588\ndata/0005/000589\ndata/0005/000590\ndata/0005/000591\ndata/0005/000592\ndata/0005/000593\ndata/0005/000594\ndata/0005/000595\ndata/0005/000596\ndata/0005/000597\ndata/0005/000598\ndata/0005/000599\ndata/0005/000600\ndata/0005/000601\ndata/0005/000602\ndata/0005/000603\ndata/0005/000604\ndata/0005/000605\ndata/0005/000606\ndata/0005/000607\ndata/0005/000608\ndata/0005/000609\ndata/0005/000610\ndata/0005/000611\ndata/0005/000612\ndata/0005/000613\ndata/0005/000614\ndata/0005/000615\ndata/0005/000616\ndata/0005/000617\ndata/0005/000618\ndata/0005/000619\ndata/0005/000620\ndata/0005/000621\ndata/0005/000622\ndata/0005/000623\ndata/0005/000624\ndata/0005/000625\ndata/0005/000626\ndata/0005/000627\ndata/0005/000628\ndata/0005/000629\ndata/0005/000630\ndata/0005/000631\ndata/0005/000632\ndata/0005/000633\ndata/0005/000634\ndata/0005/000635\ndata/0005/000636\ndata/0005/000637\ndata/0005/000638\ndata/0005/000639\ndata/0005/000640\ndata/0005/000641\ndata/0005/000642\ndata/0005/000643\ndata/0005/000644\ndata/0005/000645\ndata/0005/000646\ndata/0005/000647\ndata/0005/000648\ndata/0005/000649\ndata/0005/000650\ndata/0005/000651\ndata/0005/000652\ndata/0005/000653\ndata/0005/000654\ndata/0005/000655\ndata/0005/000656\ndata/0005/000657\ndata/0005/000658\ndata/0005/000659\ndata/0005/000660\ndata/0005/000661\ndata/0005/000662\ndata/0005/000663\ndata/0005/000664\ndata/0005/000665\ndata/0005/000666\ndata/0005/000667\ndata/0005/000668\ndata/0005/000669\ndata/0005/000670\ndata/0005/000671\ndata/0005/000672\ndata/0005/000673\ndata/0005/000674\ndata/0005/000675\ndata/0005/000676\ndata/0005/000677\ndata/0005/000678\ndata/0005/000679\ndata/0005/000680\ndata/0005/000681\ndata/0005/000682\ndata/0005/000683\ndata/0005/000684\ndata/0005/000685\ndata/0005/000686\ndata/0005/000687\ndata/0005/000688\ndata/0005/000689\ndata/0005/000690\ndata/0005/000691\ndata/0005/000692\ndata/0005/000693\ndata/0005/000694\ndata/0005/000695\ndata/0005/000696\ndata/0005/000697\ndata/0005/000698\ndata/0005/000699\ndata/0005/000700\ndata/0005/000701\ndata/0005/000702\ndata/0005/000703\ndata/0005/000704\ndata/0005/000705\ndata/0005/000706\ndata/0005/000707\ndata/0005/000708\ndata/0005/000709\ndata/0005/000710\ndata/0005/000711\ndata/0005/000712\ndata/0005/000713\ndata/0005/000714\ndata/0005/000715\ndata/0005/000716\ndata/0005/000717\ndata/0005/000718\ndata/0005/000719\ndata/0005/000720\ndata/0005/000721\ndata/0005/000722\ndata/0005/000723\ndata/0005/000724\ndata/0005/000725\ndata/0005/000726\ndata/0005/000727\ndata/0005/000728\ndata/0005/000729\ndata/0005/000730\ndata/0005/000731\ndata/0005/000732\ndata/0005/000733\ndata/0005/000734\ndata/0005/000735\ndata/0005/000736\ndata/0005/000737\ndata/0005/000738\ndata/0005/000739\ndata/0005/000740\ndata/0005/000741\ndata/0005/000742\ndata/0005/000743\ndata/0005/000744\ndata/0005/000745\ndata/0005/000746\ndata/0005/000747\ndata/0005/000748\ndata/0005/000749\ndata/0005/000750\ndata/0005/000751\ndata/0005/000752\ndata/0005/000753\ndata/0005/000754\ndata/0005/000755\ndata/0005/000756\ndata/0005/000757\ndata/0005/000758\ndata/0005/000759\ndata/0005/000760\ndata/0005/000761\ndata/0005/000762\ndata/0005/000763\ndata/0005/000764\ndata/0005/000765\ndata/0005/000766\ndata/0005/000767\ndata/0005/000768\ndata/0005/000769\ndata/0005/000770\ndata/0005/000771\ndata/0005/000772\ndata/0005/000773\ndata/0005/000774\ndata/0005/000775\ndata/0005/000776\ndata/0005/000777\ndata/0005/000778\ndata/0005/000779\ndata/0005/000780\ndata/0005/000781\ndata/0005/000782\ndata/0005/000783\ndata/0005/000784\ndata/0005/000785\ndata/0005/000786\ndata/0005/000787\ndata/0005/000788\ndata/0005/000789\ndata/0005/000790\ndata/0005/000791\ndata/0005/000792\ndata/0005/000793\ndata/0005/000794\ndata/0005/000795\ndata/0005/000796\ndata/0005/000797\ndata/0005/000798\ndata/0005/000799\ndata/0005/000800\ndata/0005/000801\ndata/0005/000802\ndata/0005/000803\ndata/0005/000804\ndata/0005/000805\ndata/0005/000806\ndata/0005/000807\ndata/0005/000808\ndata/0005/000809\ndata/0005/000810\ndata/0005/000811\ndata/0005/000812\ndata/0005/000813\ndata/0005/000814\ndata/0005/000815\ndata/0005/000816\ndata/0005/000817\ndata/0005/000818\ndata/0005/000819\ndata/0005/000820\ndata/0005/000821\ndata/0005/000822\ndata/0005/000823\ndata/0005/000824\ndata/0005/000825\ndata/0005/000826\ndata/0005/000827\ndata/0005/000828\ndata/0006/000001\ndata/0006/000002\ndata/0006/000003\ndata/0006/000004\ndata/0006/000005\ndata/0006/000006\ndata/0006/000007\ndata/0006/000008\ndata/0006/000009\ndata/0006/000010\ndata/0006/000011\ndata/0006/000012\ndata/0006/000013\ndata/0006/000014\ndata/0006/000015\ndata/0006/000016\ndata/0006/000017\ndata/0006/000018\ndata/0006/000019\ndata/0006/000020\ndata/0006/000021\ndata/0006/000022\ndata/0006/000023\ndata/0006/000024\ndata/0006/000025\ndata/0006/000026\ndata/0006/000027\ndata/0006/000028\ndata/0006/000029\ndata/0006/000030\ndata/0006/000031\ndata/0006/000032\ndata/0006/000033\ndata/0006/000034\ndata/0006/000035\ndata/0006/000036\ndata/0006/000037\ndata/0006/000038\ndata/0006/000039\ndata/0006/000040\ndata/0006/000041\ndata/0006/000042\ndata/0006/000043\ndata/0006/000044\ndata/0006/000045\ndata/0006/000046\ndata/0006/000047\ndata/0006/000048\ndata/0006/000049\ndata/0006/000050\ndata/0006/000051\ndata/0006/000052\ndata/0006/000053\ndata/0006/000054\ndata/0006/000055\ndata/0006/000056\ndata/0006/000057\ndata/0006/000058\ndata/0006/000059\ndata/0006/000060\ndata/0006/000061\ndata/0006/000062\ndata/0006/000063\ndata/0006/000064\ndata/0006/000065\ndata/0006/000066\ndata/0006/000067\ndata/0006/000068\ndata/0006/000069\ndata/0006/000070\ndata/0006/000071\ndata/0006/000072\ndata/0006/000073\ndata/0006/000074\ndata/0006/000075\ndata/0006/000076\ndata/0006/000077\ndata/0006/000078\ndata/0006/000079\ndata/0006/000080\ndata/0006/000081\ndata/0006/000082\ndata/0006/000083\ndata/0006/000084\ndata/0006/000085\ndata/0006/000086\ndata/0006/000087\ndata/0006/000088\ndata/0006/000089\ndata/0006/000090\ndata/0006/000091\ndata/0006/000092\ndata/0006/000093\ndata/0006/000094\ndata/0006/000095\ndata/0006/000096\ndata/0006/000097\ndata/0006/000098\ndata/0006/000099\ndata/0006/000100\ndata/0006/000101\ndata/0006/000102\ndata/0006/000103\ndata/0006/000104\ndata/0006/000105\ndata/0006/000106\ndata/0006/000107\ndata/0006/000108\ndata/0006/000109\ndata/0006/000110\ndata/0006/000111\ndata/0006/000112\ndata/0006/000113\ndata/0006/000114\ndata/0006/000115\ndata/0006/000116\ndata/0006/000117\ndata/0006/000118\ndata/0006/000119\ndata/0006/000120\ndata/0006/000121\ndata/0006/000122\ndata/0006/000123\ndata/0006/000124\ndata/0006/000125\ndata/0006/000126\ndata/0006/000127\ndata/0006/000128\ndata/0006/000129\ndata/0006/000130\ndata/0006/000131\ndata/0006/000132\ndata/0006/000133\ndata/0006/000134\ndata/0006/000135\ndata/0006/000136\ndata/0006/000137\ndata/0006/000138\ndata/0006/000139\ndata/0006/000140\ndata/0006/000141\ndata/0006/000142\ndata/0006/000143\ndata/0006/000144\ndata/0006/000145\ndata/0006/000146\ndata/0006/000147\ndata/0006/000148\ndata/0006/000149\ndata/0006/000150\ndata/0006/000151\ndata/0006/000152\ndata/0006/000153\ndata/0006/000154\ndata/0006/000155\ndata/0006/000156\ndata/0006/000157\ndata/0006/000158\ndata/0006/000159\ndata/0006/000160\ndata/0006/000161\ndata/0006/000162\ndata/0006/000163\ndata/0006/000164\ndata/0006/000165\ndata/0006/000166\ndata/0006/000167\ndata/0006/000168\ndata/0006/000169\ndata/0006/000170\ndata/0006/000171\ndata/0006/000172\ndata/0006/000173\ndata/0006/000174\ndata/0006/000175\ndata/0006/000176\ndata/0006/000177\ndata/0006/000178\ndata/0006/000179\ndata/0006/000180\ndata/0006/000181\ndata/0006/000182\ndata/0006/000183\ndata/0006/000184\ndata/0006/000185\ndata/0006/000186\ndata/0006/000187\ndata/0006/000188\ndata/0006/000189\ndata/0006/000190\ndata/0006/000191\ndata/0006/000192\ndata/0006/000193\ndata/0006/000194\ndata/0006/000195\ndata/0006/000196\ndata/0006/000197\ndata/0006/000198\ndata/0006/000199\ndata/0006/000200\ndata/0006/000201\ndata/0006/000202\ndata/0006/000203\ndata/0006/000204\ndata/0006/000205\ndata/0006/000206\ndata/0006/000207\ndata/0006/000208\ndata/0006/000209\ndata/0006/000210\ndata/0006/000211\ndata/0006/000212\ndata/0006/000213\ndata/0006/000214\ndata/0006/000215\ndata/0006/000216\ndata/0006/000217\ndata/0006/000218\ndata/0006/000219\ndata/0006/000220\ndata/0006/000221\ndata/0006/000222\ndata/0006/000223\ndata/0006/000224\ndata/0006/000225\ndata/0006/000226\ndata/0006/000227\ndata/0006/000228\ndata/0006/000229\ndata/0006/000230\ndata/0006/000231\ndata/0006/000232\ndata/0006/000233\ndata/0006/000234\ndata/0006/000235\ndata/0006/000236\ndata/0006/000237\ndata/0006/000238\ndata/0006/000239\ndata/0006/000240\ndata/0006/000241\ndata/0006/000242\ndata/0006/000243\ndata/0006/000244\ndata/0006/000245\ndata/0006/000246\ndata/0006/000247\ndata/0006/000248\ndata/0006/000249\ndata/0006/000250\ndata/0006/000251\ndata/0006/000252\ndata/0006/000253\ndata/0006/000254\ndata/0006/000255\ndata/0006/000256\ndata/0006/000257\ndata/0006/000258\ndata/0006/000259\ndata/0006/000260\ndata/0006/000261\ndata/0006/000262\ndata/0006/000263\ndata/0006/000264\ndata/0006/000265\ndata/0006/000266\ndata/0006/000267\ndata/0006/000268\ndata/0006/000269\ndata/0006/000270\ndata/0006/000271\ndata/0006/000272\ndata/0006/000273\ndata/0006/000274\ndata/0006/000275\ndata/0006/000276\ndata/0006/000277\ndata/0006/000278\ndata/0006/000279\ndata/0006/000280\ndata/0006/000281\ndata/0006/000282\ndata/0006/000283\ndata/0006/000284\ndata/0006/000285\ndata/0006/000286\ndata/0006/000287\ndata/0006/000288\ndata/0006/000289\ndata/0006/000290\ndata/0006/000291\ndata/0006/000292\ndata/0006/000293\ndata/0006/000294\ndata/0006/000295\ndata/0006/000296\ndata/0006/000297\ndata/0006/000298\ndata/0006/000299\ndata/0006/000300\ndata/0006/000301\ndata/0006/000302\ndata/0006/000303\ndata/0006/000304\ndata/0006/000305\ndata/0006/000306\ndata/0006/000307\ndata/0006/000308\ndata/0006/000309\ndata/0006/000310\ndata/0006/000311\ndata/0006/000312\ndata/0006/000313\ndata/0006/000314\ndata/0006/000315\ndata/0006/000316\ndata/0006/000317\ndata/0006/000318\ndata/0006/000319\ndata/0006/000320\ndata/0006/000321\ndata/0006/000322\ndata/0006/000323\ndata/0006/000324\ndata/0006/000325\ndata/0006/000326\ndata/0006/000327\ndata/0006/000328\ndata/0006/000329\ndata/0006/000330\ndata/0006/000331\ndata/0006/000332\ndata/0006/000333\ndata/0006/000334\ndata/0006/000335\ndata/0006/000336\ndata/0006/000337\ndata/0006/000338\ndata/0006/000339\ndata/0006/000340\ndata/0006/000341\ndata/0006/000342\ndata/0006/000343\ndata/0006/000344\ndata/0006/000345\ndata/0006/000346\ndata/0006/000347\ndata/0006/000348\ndata/0006/000349\ndata/0006/000350\ndata/0006/000351\ndata/0006/000352\ndata/0006/000353\ndata/0006/000354\ndata/0006/000355\ndata/0006/000356\ndata/0006/000357\ndata/0006/000358\ndata/0006/000359\ndata/0006/000360\ndata/0006/000361\ndata/0006/000362\ndata/0006/000363\ndata/0006/000364\ndata/0006/000365\ndata/0006/000366\ndata/0006/000367\ndata/0006/000368\ndata/0006/000369\ndata/0006/000370\ndata/0006/000371\ndata/0006/000372\ndata/0006/000373\ndata/0006/000374\ndata/0006/000375\ndata/0006/000376\ndata/0006/000377\ndata/0006/000378\ndata/0006/000379\ndata/0006/000380\ndata/0006/000381\ndata/0006/000382\ndata/0006/000383\ndata/0006/000384\ndata/0006/000385\ndata/0006/000386\ndata/0006/000387\ndata/0006/000388\ndata/0006/000389\ndata/0006/000390\ndata/0006/000391\ndata/0006/000392\ndata/0006/000393\ndata/0006/000394\ndata/0006/000395\ndata/0006/000396\ndata/0006/000397\ndata/0006/000398\ndata/0006/000399\ndata/0006/000400\ndata/0006/000401\ndata/0006/000402\ndata/0006/000403\ndata/0006/000404\ndata/0006/000405\ndata/0006/000406\ndata/0006/000407\ndata/0006/000408\ndata/0006/000409\ndata/0006/000410\ndata/0006/000411\ndata/0006/000412\ndata/0006/000413\ndata/0006/000414\ndata/0006/000415\ndata/0006/000416\ndata/0006/000417\ndata/0006/000418\ndata/0006/000419\ndata/0006/000420\ndata/0006/000421\ndata/0006/000422\ndata/0006/000423\ndata/0006/000424\ndata/0006/000425\ndata/0006/000426\ndata/0006/000427\ndata/0006/000428\ndata/0006/000429\ndata/0006/000430\ndata/0006/000431\ndata/0006/000432\ndata/0006/000433\ndata/0006/000434\ndata/0006/000435\ndata/0006/000436\ndata/0006/000437\ndata/0006/000438\ndata/0006/000439\ndata/0006/000440\ndata/0006/000441\ndata/0006/000442\ndata/0006/000443\ndata/0006/000444\ndata/0006/000445\ndata/0006/000446\ndata/0006/000447\ndata/0006/000448\ndata/0006/000449\ndata/0006/000450\ndata/0006/000451\ndata/0006/000452\ndata/0006/000453\ndata/0006/000454\ndata/0006/000455\ndata/0006/000456\ndata/0006/000457\ndata/0006/000458\ndata/0006/000459\ndata/0006/000460\ndata/0006/000461\ndata/0006/000462\ndata/0006/000463\ndata/0006/000464\ndata/0006/000465\ndata/0006/000466\ndata/0006/000467\ndata/0006/000468\ndata/0006/000469\ndata/0006/000470\ndata/0006/000471\ndata/0006/000472\ndata/0006/000473\ndata/0006/000474\ndata/0006/000475\ndata/0006/000476\ndata/0006/000477\ndata/0006/000478\ndata/0006/000479\ndata/0006/000480\ndata/0006/000481\ndata/0006/000482\ndata/0006/000483\ndata/0006/000484\ndata/0006/000485\ndata/0006/000486\ndata/0006/000487\ndata/0006/000488\ndata/0006/000489\ndata/0006/000490\ndata/0006/000491\ndata/0006/000492\ndata/0006/000493\ndata/0006/000494\ndata/0006/000495\ndata/0006/000496\ndata/0006/000497\ndata/0006/000498\ndata/0006/000499\ndata/0006/000500\ndata/0006/000501\ndata/0006/000502\ndata/0006/000503\ndata/0006/000504\ndata/0006/000505\ndata/0006/000506\ndata/0006/000507\ndata/0006/000508\ndata/0006/000509\ndata/0006/000510\ndata/0006/000511\ndata/0006/000512\ndata/0006/000513\ndata/0006/000514\ndata/0006/000515\ndata/0006/000516\ndata/0006/000517\ndata/0006/000518\ndata/0006/000519\ndata/0006/000520\ndata/0006/000521\ndata/0006/000522\ndata/0006/000523\ndata/0006/000524\ndata/0006/000525\ndata/0006/000526\ndata/0006/000527\ndata/0006/000528\ndata/0006/000529\ndata/0006/000530\ndata/0006/000531\ndata/0006/000532\ndata/0006/000533\ndata/0006/000534\ndata/0006/000535\ndata/0006/000536\ndata/0006/000537\ndata/0006/000538\ndata/0006/000539\ndata/0006/000540\ndata/0006/000541\ndata/0006/000542\ndata/0006/000543\ndata/0006/000544\ndata/0006/000545\ndata/0006/000546\ndata/0006/000547\ndata/0006/000548\ndata/0006/000549\ndata/0006/000550\ndata/0006/000551\ndata/0006/000552\ndata/0006/000553\ndata/0006/000554\ndata/0006/000555\ndata/0006/000556\ndata/0006/000557\ndata/0006/000558\ndata/0006/000559\ndata/0006/000560\ndata/0006/000561\ndata/0006/000562\ndata/0006/000563\ndata/0006/000564\ndata/0006/000565\ndata/0006/000566\ndata/0006/000567\ndata/0006/000568\ndata/0006/000569\ndata/0006/000570\ndata/0006/000571\ndata/0006/000572\ndata/0006/000573\ndata/0006/000574\ndata/0006/000575\ndata/0006/000576\ndata/0006/000577\ndata/0006/000578\ndata/0006/000579\ndata/0006/000580\ndata/0006/000581\ndata/0006/000582\ndata/0006/000583\ndata/0006/000584\ndata/0006/000585\ndata/0006/000586\ndata/0006/000587\ndata/0006/000588\ndata/0006/000589\ndata/0006/000590\ndata/0006/000591\ndata/0006/000592\ndata/0006/000593\ndata/0006/000594\ndata/0006/000595\ndata/0006/000596\ndata/0006/000597\ndata/0006/000598\ndata/0006/000599\ndata/0006/000600\ndata/0006/000601\ndata/0006/000602\ndata/0006/000603\ndata/0006/000604\ndata/0006/000605\ndata/0006/000606\ndata/0006/000607\ndata/0006/000608\ndata/0006/000609\ndata/0006/000610\ndata/0006/000611\ndata/0006/000612\ndata/0006/000613\ndata/0006/000614\ndata/0006/000615\ndata/0006/000616\ndata/0006/000617\ndata/0006/000618\ndata/0006/000619\ndata/0006/000620\ndata/0006/000621\ndata/0006/000622\ndata/0006/000623\ndata/0006/000624\ndata/0006/000625\ndata/0006/000626\ndata/0006/000627\ndata/0006/000628\ndata/0006/000629\ndata/0006/000630\ndata/0006/000631\ndata/0006/000632\ndata/0006/000633\ndata/0006/000634\ndata/0006/000635\ndata/0006/000636\ndata/0006/000637\ndata/0006/000638\ndata/0006/000639\ndata/0006/000640\ndata/0006/000641\ndata/0006/000642\ndata/0006/000643\ndata/0006/000644\ndata/0006/000645\ndata/0006/000646\ndata/0006/000647\ndata/0006/000648\ndata/0006/000649\ndata/0006/000650\ndata/0006/000651\ndata/0006/000652\ndata/0006/000653\ndata/0006/000654\ndata/0006/000655\ndata/0006/000656\ndata/0006/000657\ndata/0006/000658\ndata/0006/000659\ndata/0006/000660\ndata/0006/000661\ndata/0006/000662\ndata/0006/000663\ndata/0006/000664\ndata/0006/000665\ndata/0006/000666\ndata/0006/000667\ndata/0006/000668\ndata/0006/000669\ndata/0006/000670\ndata/0006/000671\ndata/0006/000672\ndata/0006/000673\ndata/0006/000674\ndata/0006/000675\ndata/0006/000676\ndata/0006/000677\ndata/0006/000678\ndata/0006/000679\ndata/0006/000680\ndata/0006/000681\ndata/0006/000682\ndata/0006/000683\ndata/0006/000684\ndata/0006/000685\ndata/0006/000686\ndata/0006/000687\ndata/0006/000688\ndata/0006/000689\ndata/0006/000690\ndata/0006/000691\ndata/0006/000692\ndata/0006/000693\ndata/0006/000694\ndata/0006/000695\ndata/0006/000696\ndata/0006/000697\ndata/0006/000698\ndata/0006/000699\ndata/0006/000700\ndata/0006/000701\ndata/0006/000702\ndata/0006/000703\ndata/0006/000704\ndata/0006/000705\ndata/0006/000706\ndata/0006/000707\ndata/0006/000708\ndata/0006/000709\ndata/0006/000710\ndata/0006/000711\ndata/0006/000712\ndata/0006/000713\ndata/0006/000714\ndata/0006/000715\ndata/0006/000716\ndata/0006/000717\ndata/0006/000718\ndata/0006/000719\ndata/0006/000720\ndata/0006/000721\ndata/0006/000722\ndata/0006/000723\ndata/0006/000724\ndata/0006/000725\ndata/0006/000726\ndata/0006/000727\ndata/0006/000728\ndata/0006/000729\ndata/0006/000730\ndata/0006/000731\ndata/0006/000732\ndata/0006/000733\ndata/0006/000734\ndata/0006/000735\ndata/0006/000736\ndata/0006/000737\ndata/0006/000738\ndata/0006/000739\ndata/0006/000740\ndata/0006/000741\ndata/0006/000742\ndata/0006/000743\ndata/0006/000744\ndata/0006/000745\ndata/0006/000746\ndata/0006/000747\ndata/0006/000748\ndata/0006/000749\ndata/0006/000750\ndata/0006/000751\ndata/0006/000752\ndata/0006/000753\ndata/0006/000754\ndata/0006/000755\ndata/0006/000756\ndata/0006/000757\ndata/0006/000758\ndata/0006/000759\ndata/0006/000760\ndata/0006/000761\ndata/0006/000762\ndata/0006/000763\ndata/0006/000764\ndata/0006/000765\ndata/0006/000766\ndata/0006/000767\ndata/0006/000768\ndata/0006/000769\ndata/0006/000770\ndata/0006/000771\ndata/0006/000772\ndata/0006/000773\ndata/0006/000774\ndata/0006/000775\ndata/0006/000776\ndata/0006/000777\ndata/0006/000778\ndata/0006/000779\ndata/0006/000780\ndata/0006/000781\ndata/0006/000782\ndata/0006/000783\ndata/0006/000784\ndata/0006/000785\ndata/0006/000786\ndata/0006/000787\ndata/0006/000788\ndata/0006/000789\ndata/0006/000790\ndata/0006/000791\ndata/0006/000792\ndata/0006/000793\ndata/0006/000794\ndata/0006/000795\ndata/0006/000796\ndata/0006/000797\ndata/0006/000798\ndata/0006/000799\ndata/0006/000800\ndata/0006/000801\ndata/0006/000802\ndata/0006/000803\ndata/0006/000804\ndata/0006/000805\ndata/0006/000806\ndata/0006/000807\ndata/0006/000808\ndata/0006/000809\ndata/0006/000810\ndata/0006/000811\ndata/0006/000812\ndata/0006/000813\ndata/0006/000814\ndata/0006/000815\ndata/0006/000816\ndata/0006/000817\ndata/0006/000818\ndata/0006/000819\ndata/0006/000820\ndata/0006/000821\ndata/0006/000822\ndata/0006/000823\ndata/0007/000001\ndata/0007/000002\ndata/0007/000003\ndata/0007/000004\ndata/0007/000005\ndata/0007/000006\ndata/0007/000007\ndata/0007/000008\ndata/0007/000009\ndata/0007/000010\ndata/0007/000011\ndata/0007/000012\ndata/0007/000013\ndata/0007/000014\ndata/0007/000015\ndata/0007/000016\ndata/0007/000017\ndata/0007/000018\ndata/0007/000019\ndata/0007/000020\ndata/0007/000021\ndata/0007/000022\ndata/0007/000023\ndata/0007/000024\ndata/0007/000025\ndata/0007/000026\ndata/0007/000027\ndata/0007/000028\ndata/0007/000029\ndata/0007/000030\ndata/0007/000031\ndata/0007/000032\ndata/0007/000033\ndata/0007/000034\ndata/0007/000035\ndata/0007/000036\ndata/0007/000037\ndata/0007/000038\ndata/0007/000039\ndata/0007/000040\ndata/0007/000041\ndata/0007/000042\ndata/0007/000043\ndata/0007/000044\ndata/0007/000045\ndata/0007/000046\ndata/0007/000047\ndata/0007/000048\ndata/0007/000049\ndata/0007/000050\ndata/0007/000051\ndata/0007/000052\ndata/0007/000053\ndata/0007/000054\ndata/0007/000055\ndata/0007/000056\ndata/0007/000057\ndata/0007/000058\ndata/0007/000059\ndata/0007/000060\ndata/0007/000061\ndata/0007/000062\ndata/0007/000063\ndata/0007/000064\ndata/0007/000065\ndata/0007/000066\ndata/0007/000067\ndata/0007/000068\ndata/0007/000069\ndata/0007/000070\ndata/0007/000071\ndata/0007/000072\ndata/0007/000073\ndata/0007/000074\ndata/0007/000075\ndata/0007/000076\ndata/0007/000077\ndata/0007/000078\ndata/0007/000079\ndata/0007/000080\ndata/0007/000081\ndata/0007/000082\ndata/0007/000083\ndata/0007/000084\ndata/0007/000085\ndata/0007/000086\ndata/0007/000087\ndata/0007/000088\ndata/0007/000089\ndata/0007/000090\ndata/0007/000091\ndata/0007/000092\ndata/0007/000093\ndata/0007/000094\ndata/0007/000095\ndata/0007/000096\ndata/0007/000097\ndata/0007/000098\ndata/0007/000099\ndata/0007/000100\ndata/0007/000101\ndata/0007/000102\ndata/0007/000103\ndata/0007/000104\ndata/0007/000105\ndata/0007/000106\ndata/0007/000107\ndata/0007/000108\ndata/0007/000109\ndata/0007/000110\ndata/0007/000111\ndata/0007/000112\ndata/0007/000113\ndata/0007/000114\ndata/0007/000115\ndata/0007/000116\ndata/0007/000117\ndata/0007/000118\ndata/0007/000119\ndata/0007/000120\ndata/0007/000121\ndata/0007/000122\ndata/0007/000123\ndata/0007/000124\ndata/0007/000125\ndata/0007/000126\ndata/0007/000127\ndata/0007/000128\ndata/0007/000129\ndata/0007/000130\ndata/0007/000131\ndata/0007/000132\ndata/0007/000133\ndata/0007/000134\ndata/0007/000135\ndata/0007/000136\ndata/0007/000137\ndata/0007/000138\ndata/0007/000139\ndata/0007/000140\ndata/0007/000141\ndata/0007/000142\ndata/0007/000143\ndata/0007/000144\ndata/0007/000145\ndata/0007/000146\ndata/0007/000147\ndata/0007/000148\ndata/0007/000149\ndata/0007/000150\ndata/0007/000151\ndata/0007/000152\ndata/0007/000153\ndata/0007/000154\ndata/0007/000155\ndata/0007/000156\ndata/0007/000157\ndata/0007/000158\ndata/0007/000159\ndata/0007/000160\ndata/0007/000161\ndata/0007/000162\ndata/0007/000163\ndata/0007/000164\ndata/0007/000165\ndata/0007/000166\ndata/0007/000167\ndata/0007/000168\ndata/0007/000169\ndata/0007/000170\ndata/0007/000171\ndata/0007/000172\ndata/0007/000173\ndata/0007/000174\ndata/0007/000175\ndata/0007/000176\ndata/0007/000177\ndata/0007/000178\ndata/0007/000179\ndata/0007/000180\ndata/0007/000181\ndata/0007/000182\ndata/0007/000183\ndata/0007/000184\ndata/0007/000185\ndata/0007/000186\ndata/0007/000187\ndata/0007/000188\ndata/0007/000189\ndata/0007/000190\ndata/0007/000191\ndata/0007/000192\ndata/0007/000193\ndata/0007/000194\ndata/0007/000195\ndata/0007/000196\ndata/0007/000197\ndata/0007/000198\ndata/0007/000199\ndata/0007/000200\ndata/0007/000201\ndata/0007/000202\ndata/0007/000203\ndata/0007/000204\ndata/0007/000205\ndata/0007/000206\ndata/0007/000207\ndata/0007/000208\ndata/0007/000209\ndata/0007/000210\ndata/0007/000211\ndata/0007/000212\ndata/0007/000213\ndata/0007/000214\ndata/0007/000215\ndata/0007/000216\ndata/0007/000217\ndata/0007/000218\ndata/0007/000219\ndata/0007/000220\ndata/0007/000221\ndata/0007/000222\ndata/0007/000223\ndata/0007/000224\ndata/0007/000225\ndata/0007/000226\ndata/0007/000227\ndata/0007/000228\ndata/0007/000229\ndata/0007/000230\ndata/0007/000231\ndata/0007/000232\ndata/0007/000233\ndata/0007/000234\ndata/0007/000235\ndata/0007/000236\ndata/0007/000237\ndata/0007/000238\ndata/0007/000239\ndata/0007/000240\ndata/0007/000241\ndata/0007/000242\ndata/0007/000243\ndata/0007/000244\ndata/0007/000245\ndata/0007/000246\ndata/0007/000247\ndata/0007/000248\ndata/0007/000249\ndata/0007/000250\ndata/0007/000251\ndata/0007/000252\ndata/0007/000253\ndata/0007/000254\ndata/0007/000255\ndata/0007/000256\ndata/0007/000257\ndata/0007/000258\ndata/0007/000259\ndata/0007/000260\ndata/0007/000261\ndata/0007/000262\ndata/0007/000263\ndata/0007/000264\ndata/0007/000265\ndata/0007/000266\ndata/0007/000267\ndata/0007/000268\ndata/0007/000269\ndata/0007/000270\ndata/0007/000271\ndata/0007/000272\ndata/0007/000273\ndata/0007/000274\ndata/0007/000275\ndata/0007/000276\ndata/0007/000277\ndata/0007/000278\ndata/0007/000279\ndata/0007/000280\ndata/0007/000281\ndata/0007/000282\ndata/0007/000283\ndata/0007/000284\ndata/0007/000285\ndata/0007/000286\ndata/0007/000287\ndata/0007/000288\ndata/0007/000289\ndata/0007/000290\ndata/0007/000291\ndata/0007/000292\ndata/0007/000293\ndata/0007/000294\ndata/0007/000295\ndata/0007/000296\ndata/0007/000297\ndata/0007/000298\ndata/0007/000299\ndata/0007/000300\ndata/0007/000301\ndata/0007/000302\ndata/0007/000303\ndata/0007/000304\ndata/0007/000305\ndata/0007/000306\ndata/0007/000307\ndata/0007/000308\ndata/0007/000309\ndata/0007/000310\ndata/0007/000311\ndata/0007/000312\ndata/0007/000313\ndata/0007/000314\ndata/0007/000315\ndata/0007/000316\ndata/0007/000317\ndata/0007/000318\ndata/0007/000319\ndata/0007/000320\ndata/0007/000321\ndata/0007/000322\ndata/0007/000323\ndata/0007/000324\ndata/0007/000325\ndata/0007/000326\ndata/0007/000327\ndata/0007/000328\ndata/0007/000329\ndata/0007/000330\ndata/0007/000331\ndata/0007/000332\ndata/0007/000333\ndata/0007/000334\ndata/0007/000335\ndata/0007/000336\ndata/0007/000337\ndata/0007/000338\ndata/0007/000339\ndata/0007/000340\ndata/0007/000341\ndata/0007/000342\ndata/0007/000343\ndata/0007/000344\ndata/0007/000345\ndata/0007/000346\ndata/0007/000347\ndata/0007/000348\ndata/0007/000349\ndata/0007/000350\ndata/0007/000351\ndata/0007/000352\ndata/0007/000353\ndata/0007/000354\ndata/0007/000355\ndata/0007/000356\ndata/0007/000357\ndata/0007/000358\ndata/0007/000359\ndata/0007/000360\ndata/0007/000361\ndata/0007/000362\ndata/0007/000363\ndata/0007/000364\ndata/0007/000365\ndata/0007/000366\ndata/0007/000367\ndata/0007/000368\ndata/0007/000369\ndata/0007/000370\ndata/0007/000371\ndata/0007/000372\ndata/0007/000373\ndata/0007/000374\ndata/0007/000375\ndata/0007/000376\ndata/0007/000377\ndata/0007/000378\ndata/0007/000379\ndata/0007/000380\ndata/0007/000381\ndata/0007/000382\ndata/0007/000383\ndata/0007/000384\ndata/0007/000385\ndata/0007/000386\ndata/0007/000387\ndata/0007/000388\ndata/0007/000389\ndata/0007/000390\ndata/0007/000391\ndata/0007/000392\ndata/0007/000393\ndata/0007/000394\ndata/0007/000395\ndata/0007/000396\ndata/0007/000397\ndata/0007/000398\ndata/0007/000399\ndata/0007/000400\ndata/0007/000401\ndata/0007/000402\ndata/0007/000403\ndata/0007/000404\ndata/0007/000405\ndata/0007/000406\ndata/0007/000407\ndata/0007/000408\ndata/0007/000409\ndata/0007/000410\ndata/0007/000411\ndata/0007/000412\ndata/0007/000413\ndata/0007/000414\ndata/0007/000415\ndata/0007/000416\ndata/0007/000417\ndata/0007/000418\ndata/0007/000419\ndata/0007/000420\ndata/0007/000421\ndata/0007/000422\ndata/0007/000423\ndata/0007/000424\ndata/0007/000425\ndata/0007/000426\ndata/0007/000427\ndata/0007/000428\ndata/0007/000429\ndata/0007/000430\ndata/0007/000431\ndata/0007/000432\ndata/0007/000433\ndata/0007/000434\ndata/0007/000435\ndata/0007/000436\ndata/0007/000437\ndata/0007/000438\ndata/0007/000439\ndata/0007/000440\ndata/0007/000441\ndata/0007/000442\ndata/0007/000443\ndata/0007/000444\ndata/0007/000445\ndata/0007/000446\ndata/0007/000447\ndata/0007/000448\ndata/0007/000449\ndata/0007/000450\ndata/0007/000451\ndata/0007/000452\ndata/0007/000453\ndata/0007/000454\ndata/0007/000455\ndata/0007/000456\ndata/0007/000457\ndata/0007/000458\ndata/0007/000459\ndata/0007/000460\ndata/0007/000461\ndata/0007/000462\ndata/0007/000463\ndata/0007/000464\ndata/0007/000465\ndata/0007/000466\ndata/0007/000467\ndata/0007/000468\ndata/0007/000469\ndata/0007/000470\ndata/0007/000471\ndata/0007/000472\ndata/0007/000473\ndata/0007/000474\ndata/0007/000475\ndata/0007/000476\ndata/0007/000477\ndata/0007/000478\ndata/0007/000479\ndata/0007/000480\ndata/0007/000481\ndata/0007/000482\ndata/0007/000483\ndata/0007/000484\ndata/0007/000485\ndata/0007/000486\ndata/0007/000487\ndata/0007/000488\ndata/0007/000489\ndata/0007/000490\ndata/0007/000491\ndata/0007/000492\ndata/0007/000493\ndata/0007/000494\ndata/0007/000495\ndata/0007/000496\ndata/0007/000497\ndata/0007/000498\ndata/0007/000499\ndata/0007/000500\ndata/0007/000501\ndata/0007/000502\ndata/0007/000503\ndata/0007/000504\ndata/0007/000505\ndata/0007/000506\ndata/0007/000507\ndata/0007/000508\ndata/0007/000509\ndata/0007/000510\ndata/0007/000511\ndata/0007/000512\ndata/0007/000513\ndata/0007/000514\ndata/0007/000515\ndata/0007/000516\ndata/0007/000517\ndata/0007/000518\ndata/0007/000519\ndata/0007/000520\ndata/0007/000521\ndata/0007/000522\ndata/0007/000523\ndata/0007/000524\ndata/0007/000525\ndata/0007/000526\ndata/0007/000527\ndata/0007/000528\ndata/0007/000529\ndata/0007/000530\ndata/0007/000531\ndata/0007/000532\ndata/0007/000533\ndata/0007/000534\ndata/0007/000535\ndata/0007/000536\ndata/0007/000537\ndata/0007/000538\ndata/0007/000539\ndata/0007/000540\ndata/0007/000541\ndata/0007/000542\ndata/0007/000543\ndata/0007/000544\ndata/0007/000545\ndata/0007/000546\ndata/0007/000547\ndata/0007/000548\ndata/0007/000549\ndata/0007/000550\ndata/0007/000551\ndata/0007/000552\ndata/0007/000553\ndata/0007/000554\ndata/0007/000555\ndata/0007/000556\ndata/0007/000557\ndata/0007/000558\ndata/0007/000559\ndata/0007/000560\ndata/0007/000561\ndata/0007/000562\ndata/0007/000563\ndata/0007/000564\ndata/0007/000565\ndata/0007/000566\ndata/0007/000567\ndata/0007/000568\ndata/0007/000569\ndata/0007/000570\ndata/0007/000571\ndata/0007/000572\ndata/0007/000573\ndata/0007/000574\ndata/0007/000575\ndata/0007/000576\ndata/0007/000577\ndata/0007/000578\ndata/0007/000579\ndata/0007/000580\ndata/0007/000581\ndata/0007/000582\ndata/0007/000583\ndata/0007/000584\ndata/0007/000585\ndata/0007/000586\ndata/0007/000587\ndata/0007/000588\ndata/0007/000589\ndata/0007/000590\ndata/0007/000591\ndata/0007/000592\ndata/0007/000593\ndata/0007/000594\ndata/0007/000595\ndata/0007/000596\ndata/0007/000597\ndata/0007/000598\ndata/0007/000599\ndata/0007/000600\ndata/0007/000601\ndata/0007/000602\ndata/0007/000603\ndata/0007/000604\ndata/0007/000605\ndata/0007/000606\ndata/0007/000607\ndata/0007/000608\ndata/0007/000609\ndata/0007/000610\ndata/0007/000611\ndata/0007/000612\ndata/0007/000613\ndata/0007/000614\ndata/0007/000615\ndata/0007/000616\ndata/0007/000617\ndata/0007/000618\ndata/0007/000619\ndata/0007/000620\ndata/0007/000621\ndata/0007/000622\ndata/0007/000623\ndata/0007/000624\ndata/0007/000625\ndata/0007/000626\ndata/0007/000627\ndata/0007/000628\ndata/0007/000629\ndata/0007/000630\ndata/0007/000631\ndata/0007/000632\ndata/0007/000633\ndata/0007/000634\ndata/0007/000635\ndata/0007/000636\ndata/0007/000637\ndata/0007/000638\ndata/0007/000639\ndata/0007/000640\ndata/0007/000641\ndata/0007/000642\ndata/0007/000643\ndata/0007/000644\ndata/0007/000645\ndata/0007/000646\ndata/0007/000647\ndata/0007/000648\ndata/0007/000649\ndata/0007/000650\ndata/0007/000651\ndata/0007/000652\ndata/0007/000653\ndata/0007/000654\ndata/0007/000655\ndata/0007/000656\ndata/0007/000657\ndata/0007/000658\ndata/0007/000659\ndata/0007/000660\ndata/0007/000661\ndata/0007/000662\ndata/0007/000663\ndata/0007/000664\ndata/0007/000665\ndata/0007/000666\ndata/0007/000667\ndata/0007/000668\ndata/0007/000669\ndata/0007/000670\ndata/0007/000671\ndata/0007/000672\ndata/0007/000673\ndata/0007/000674\ndata/0007/000675\ndata/0007/000676\ndata/0007/000677\ndata/0007/000678\ndata/0007/000679\ndata/0007/000680\ndata/0007/000681\ndata/0007/000682\ndata/0007/000683\ndata/0007/000684\ndata/0007/000685\ndata/0007/000686\ndata/0007/000687\ndata/0007/000688\ndata/0007/000689\ndata/0007/000690\ndata/0007/000691\ndata/0007/000692\ndata/0007/000693\ndata/0007/000694\ndata/0007/000695\ndata/0007/000696\ndata/0007/000697\ndata/0007/000698\ndata/0007/000699\ndata/0007/000700\ndata/0007/000701\ndata/0007/000702\ndata/0007/000703\ndata/0007/000704\ndata/0007/000705\ndata/0007/000706\ndata/0007/000707\ndata/0007/000708\ndata/0007/000709\ndata/0007/000710\ndata/0007/000711\ndata/0007/000712\ndata/0007/000713\ndata/0007/000714\ndata/0007/000715\ndata/0007/000716\ndata/0007/000717\ndata/0007/000718\ndata/0007/000719\ndata/0007/000720\ndata/0007/000721\ndata/0007/000722\ndata/0007/000723\ndata/0007/000724\ndata/0007/000725\ndata/0007/000726\ndata/0007/000727\ndata/0007/000728\ndata/0007/000729\ndata/0007/000730\ndata/0007/000731\ndata/0007/000732\ndata/0007/000733\ndata/0007/000734\ndata/0007/000735\ndata/0007/000736\ndata/0007/000737\ndata/0007/000738\ndata/0007/000739\ndata/0007/000740\ndata/0007/000741\ndata/0007/000742\ndata/0007/000743\ndata/0007/000744\ndata/0007/000745\ndata/0007/000746\ndata/0007/000747\ndata/0007/000748\ndata/0007/000749\ndata/0007/000750\ndata/0007/000751\ndata/0007/000752\ndata/0007/000753\ndata/0007/000754\ndata/0007/000755\ndata/0007/000756\ndata/0007/000757\ndata/0007/000758\ndata/0007/000759\ndata/0007/000760\ndata/0007/000761\ndata/0007/000762\ndata/0007/000763\ndata/0007/000764\ndata/0007/000765\ndata/0007/000766\ndata/0007/000767\ndata/0007/000768\ndata/0007/000769\ndata/0007/000770\ndata/0007/000771\ndata/0007/000772\ndata/0007/000773\ndata/0007/000774\ndata/0007/000775\ndata/0007/000776\ndata/0007/000777\ndata/0007/000778\ndata/0007/000779\ndata/0007/000780\ndata/0007/000781\ndata/0007/000782\ndata/0007/000783\ndata/0007/000784\ndata/0007/000785\ndata/0007/000786\ndata/0007/000787\ndata/0007/000788\ndata/0007/000789\ndata/0007/000790\ndata/0007/000791\ndata/0007/000792\ndata/0007/000793\ndata/0007/000794\ndata/0007/000795\ndata/0007/000796\ndata/0007/000797\ndata/0007/000798\ndata/0007/000799\ndata/0007/000800\ndata/0007/000801\ndata/0007/000802\ndata/0007/000803\ndata/0007/000804\ndata/0007/000805\ndata/0007/000806\ndata/0007/000807\ndata/0007/000808\ndata/0007/000809\ndata/0007/000810\ndata/0007/000811\ndata/0007/000812\ndata/0007/000813\ndata/0007/000814\ndata/0007/000815\ndata/0007/000816\ndata/0007/000817\ndata/0007/000818\ndata/0007/000819\ndata/0007/000820\ndata/0007/000821\ndata/0007/000822\ndata/0007/000823\ndata/0007/000824\ndata/0007/000825\ndata/0007/000826\ndata/0007/000827\ndata/0007/000828\ndata/0007/000829\ndata/0007/000830\ndata/0007/000831\ndata/0007/000832\ndata/0007/000833\ndata/0007/000834\ndata/0007/000835\ndata/0007/000836\ndata/0007/000837\ndata/0007/000838\ndata/0007/000839\ndata/0007/000840\ndata/0007/000841\ndata/0007/000842\ndata/0007/000843\ndata/0007/000844\ndata/0007/000845\ndata/0007/000846\ndata/0007/000847\ndata/0007/000848\ndata/0007/000849\ndata/0007/000850\ndata/0007/000851\ndata/0007/000852\ndata/0007/000853\ndata/0007/000854\ndata/0007/000855\ndata/0007/000856\ndata/0007/000857\ndata/0007/000858\ndata/0007/000859\ndata/0007/000860\ndata/0007/000861\ndata/0007/000862\ndata/0007/000863\ndata/0007/000864\ndata/0007/000865\ndata/0007/000866\ndata/0007/000867\ndata/0007/000868\ndata/0007/000869\ndata/0007/000870\ndata/0007/000871\ndata/0007/000872\ndata/0007/000873\ndata/0007/000874\ndata/0007/000875\ndata/0007/000876\ndata/0007/000877\ndata/0007/000878\ndata/0007/000879\ndata/0007/000880\ndata/0007/000881\ndata/0007/000882\ndata/0007/000883\ndata/0007/000884\ndata/0007/000885\ndata/0007/000886\ndata/0007/000887\ndata/0007/000888\ndata/0007/000889\ndata/0007/000890\ndata/0007/000891\ndata/0007/000892\ndata/0007/000893\ndata/0007/000894\ndata/0007/000895\ndata/0007/000896\ndata/0007/000897\ndata/0007/000898\ndata/0007/000899\ndata/0007/000900\ndata/0007/000901\ndata/0007/000902\ndata/0007/000903\ndata/0007/000904\ndata/0007/000905\ndata/0007/000906\ndata/0007/000907\ndata/0007/000908\ndata/0007/000909\ndata/0007/000910\ndata/0007/000911\ndata/0007/000912\ndata/0007/000913\ndata/0007/000914\ndata/0007/000915\ndata/0007/000916\ndata/0007/000917\ndata/0007/000918\ndata/0007/000919\ndata/0007/000920\ndata/0007/000921\ndata/0007/000922\ndata/0007/000923\ndata/0007/000924\ndata/0007/000925\ndata/0007/000926\ndata/0007/000927\ndata/0007/000928\ndata/0007/000929\ndata/0007/000930\ndata/0007/000931\ndata/0007/000932\ndata/0007/000933\ndata/0007/000934\ndata/0007/000935\ndata/0007/000936\ndata/0007/000937\ndata/0007/000938\ndata/0007/000939\ndata/0007/000940\ndata/0007/000941\ndata/0007/000942\ndata/0007/000943\ndata/0007/000944\ndata/0007/000945\ndata/0007/000946\ndata/0007/000947\ndata/0007/000948\ndata/0007/000949\ndata/0007/000950\ndata/0007/000951\ndata/0007/000952\ndata/0007/000953\ndata/0007/000954\ndata/0007/000955\ndata/0007/000956\ndata/0007/000957\ndata/0007/000958\ndata/0007/000959\ndata/0007/000960\ndata/0007/000961\ndata/0007/000962\ndata/0007/000963\ndata/0007/000964\ndata/0007/000965\ndata/0007/000966\ndata/0007/000967\ndata/0007/000968\ndata/0008/000001\ndata/0008/000002\ndata/0008/000003\ndata/0008/000004\ndata/0008/000005\ndata/0008/000006\ndata/0008/000007\ndata/0008/000008\ndata/0008/000009\ndata/0008/000010\ndata/0008/000011\ndata/0008/000012\ndata/0008/000013\ndata/0008/000014\ndata/0008/000015\ndata/0008/000016\ndata/0008/000017\ndata/0008/000018\ndata/0008/000019\ndata/0008/000020\ndata/0008/000021\ndata/0008/000022\ndata/0008/000023\ndata/0008/000024\ndata/0008/000025\ndata/0008/000026\ndata/0008/000027\ndata/0008/000028\ndata/0008/000029\ndata/0008/000030\ndata/0008/000031\ndata/0008/000032\ndata/0008/000033\ndata/0008/000034\ndata/0008/000035\ndata/0008/000036\ndata/0008/000037\ndata/0008/000038\ndata/0008/000039\ndata/0008/000040\ndata/0008/000041\ndata/0008/000042\ndata/0008/000043\ndata/0008/000044\ndata/0008/000045\ndata/0008/000046\ndata/0008/000047\ndata/0008/000048\ndata/0008/000049\ndata/0008/000050\ndata/0008/000051\ndata/0008/000052\ndata/0008/000053\ndata/0008/000054\ndata/0008/000055\ndata/0008/000056\ndata/0008/000057\ndata/0008/000058\ndata/0008/000059\ndata/0008/000060\ndata/0008/000061\ndata/0008/000062\ndata/0008/000063\ndata/0008/000064\ndata/0008/000065\ndata/0008/000066\ndata/0008/000067\ndata/0008/000068\ndata/0008/000069\ndata/0008/000070\ndata/0008/000071\ndata/0008/000072\ndata/0008/000073\ndata/0008/000074\ndata/0008/000075\ndata/0008/000076\ndata/0008/000077\ndata/0008/000078\ndata/0008/000079\ndata/0008/000080\ndata/0008/000081\ndata/0008/000082\ndata/0008/000083\ndata/0008/000084\ndata/0008/000085\ndata/0008/000086\ndata/0008/000087\ndata/0008/000088\ndata/0008/000089\ndata/0008/000090\ndata/0008/000091\ndata/0008/000092\ndata/0008/000093\ndata/0008/000094\ndata/0008/000095\ndata/0008/000096\ndata/0008/000097\ndata/0008/000098\ndata/0008/000099\ndata/0008/000100\ndata/0008/000101\ndata/0008/000102\ndata/0008/000103\ndata/0008/000104\ndata/0008/000105\ndata/0008/000106\ndata/0008/000107\ndata/0008/000108\ndata/0008/000109\ndata/0008/000110\ndata/0008/000111\ndata/0008/000112\ndata/0008/000113\ndata/0008/000114\ndata/0008/000115\ndata/0008/000116\ndata/0008/000117\ndata/0008/000118\ndata/0008/000119\ndata/0008/000120\ndata/0008/000121\ndata/0008/000122\ndata/0008/000123\ndata/0008/000124\ndata/0008/000125\ndata/0008/000126\ndata/0008/000127\ndata/0008/000128\ndata/0008/000129\ndata/0008/000130\ndata/0008/000131\ndata/0008/000132\ndata/0008/000133\ndata/0008/000134\ndata/0008/000135\ndata/0008/000136\ndata/0008/000137\ndata/0008/000138\ndata/0008/000139\ndata/0008/000140\ndata/0008/000141\ndata/0008/000142\ndata/0008/000143\ndata/0008/000144\ndata/0008/000145\ndata/0008/000146\ndata/0008/000147\ndata/0008/000148\ndata/0008/000149\ndata/0008/000150\ndata/0008/000151\ndata/0008/000152\ndata/0008/000153\ndata/0008/000154\ndata/0008/000155\ndata/0008/000156\ndata/0008/000157\ndata/0008/000158\ndata/0008/000159\ndata/0008/000160\ndata/0008/000161\ndata/0008/000162\ndata/0008/000163\ndata/0008/000164\ndata/0008/000165\ndata/0008/000166\ndata/0008/000167\ndata/0008/000168\ndata/0008/000169\ndata/0008/000170\ndata/0008/000171\ndata/0008/000172\ndata/0008/000173\ndata/0008/000174\ndata/0008/000175\ndata/0008/000176\ndata/0008/000177\ndata/0008/000178\ndata/0008/000179\ndata/0008/000180\ndata/0008/000181\ndata/0008/000182\ndata/0008/000183\ndata/0008/000184\ndata/0008/000185\ndata/0008/000186\ndata/0008/000187\ndata/0008/000188\ndata/0008/000189\ndata/0008/000190\ndata/0008/000191\ndata/0008/000192\ndata/0008/000193\ndata/0008/000194\ndata/0008/000195\ndata/0008/000196\ndata/0008/000197\ndata/0008/000198\ndata/0008/000199\ndata/0008/000200\ndata/0008/000201\ndata/0008/000202\ndata/0008/000203\ndata/0008/000204\ndata/0008/000205\ndata/0008/000206\ndata/0008/000207\ndata/0008/000208\ndata/0008/000209\ndata/0008/000210\ndata/0008/000211\ndata/0008/000212\ndata/0008/000213\ndata/0008/000214\ndata/0008/000215\ndata/0008/000216\ndata/0008/000217\ndata/0008/000218\ndata/0008/000219\ndata/0008/000220\ndata/0008/000221\ndata/0008/000222\ndata/0008/000223\ndata/0008/000224\ndata/0008/000225\ndata/0008/000226\ndata/0008/000227\ndata/0008/000228\ndata/0008/000229\ndata/0008/000230\ndata/0008/000231\ndata/0008/000232\ndata/0008/000233\ndata/0008/000234\ndata/0008/000235\ndata/0008/000236\ndata/0008/000237\ndata/0008/000238\ndata/0008/000239\ndata/0008/000240\ndata/0008/000241\ndata/0008/000242\ndata/0008/000243\ndata/0008/000244\ndata/0008/000245\ndata/0008/000246\ndata/0008/000247\ndata/0008/000248\ndata/0008/000249\ndata/0008/000250\ndata/0008/000251\ndata/0008/000252\ndata/0008/000253\ndata/0008/000254\ndata/0008/000255\ndata/0008/000256\ndata/0008/000257\ndata/0008/000258\ndata/0008/000259\ndata/0008/000260\ndata/0008/000261\ndata/0008/000262\ndata/0008/000263\ndata/0008/000264\ndata/0008/000265\ndata/0008/000266\ndata/0008/000267\ndata/0008/000268\ndata/0008/000269\ndata/0008/000270\ndata/0008/000271\ndata/0008/000272\ndata/0008/000273\ndata/0008/000274\ndata/0008/000275\ndata/0008/000276\ndata/0008/000277\ndata/0008/000278\ndata/0008/000279\ndata/0008/000280\ndata/0008/000281\ndata/0008/000282\ndata/0008/000283\ndata/0008/000284\ndata/0008/000285\ndata/0008/000286\ndata/0008/000287\ndata/0008/000288\ndata/0008/000289\ndata/0008/000290\ndata/0008/000291\ndata/0008/000292\ndata/0008/000293\ndata/0008/000294\ndata/0008/000295\ndata/0008/000296\ndata/0008/000297\ndata/0008/000298\ndata/0008/000299\ndata/0008/000300\ndata/0008/000301\ndata/0008/000302\ndata/0008/000303\ndata/0008/000304\ndata/0008/000305\ndata/0008/000306\ndata/0008/000307\ndata/0008/000308\ndata/0008/000309\ndata/0008/000310\ndata/0008/000311\ndata/0008/000312\ndata/0008/000313\ndata/0008/000314\ndata/0008/000315\ndata/0008/000316\ndata/0008/000317\ndata/0008/000318\ndata/0008/000319\ndata/0008/000320\ndata/0008/000321\ndata/0008/000322\ndata/0008/000323\ndata/0008/000324\ndata/0008/000325\ndata/0008/000326\ndata/0008/000327\ndata/0008/000328\ndata/0008/000329\ndata/0008/000330\ndata/0008/000331\ndata/0008/000332\ndata/0008/000333\ndata/0008/000334\ndata/0008/000335\ndata/0008/000336\ndata/0008/000337\ndata/0008/000338\ndata/0008/000339\ndata/0008/000340\ndata/0008/000341\ndata/0008/000342\ndata/0008/000343\ndata/0008/000344\ndata/0008/000345\ndata/0008/000346\ndata/0008/000347\ndata/0008/000348\ndata/0008/000349\ndata/0008/000350\ndata/0008/000351\ndata/0008/000352\ndata/0008/000353\ndata/0008/000354\ndata/0008/000355\ndata/0008/000356\ndata/0008/000357\ndata/0008/000358\ndata/0008/000359\ndata/0008/000360\ndata/0008/000361\ndata/0008/000362\ndata/0008/000363\ndata/0008/000364\ndata/0008/000365\ndata/0008/000366\ndata/0008/000367\ndata/0008/000368\ndata/0008/000369\ndata/0008/000370\ndata/0008/000371\ndata/0008/000372\ndata/0008/000373\ndata/0008/000374\ndata/0008/000375\ndata/0008/000376\ndata/0008/000377\ndata/0008/000378\ndata/0008/000379\ndata/0008/000380\ndata/0008/000381\ndata/0008/000382\ndata/0008/000383\ndata/0008/000384\ndata/0008/000385\ndata/0008/000386\ndata/0008/000387\ndata/0008/000388\ndata/0008/000389\ndata/0008/000390\ndata/0008/000391\ndata/0008/000392\ndata/0008/000393\ndata/0008/000394\ndata/0008/000395\ndata/0008/000396\ndata/0008/000397\ndata/0008/000398\ndata/0008/000399\ndata/0008/000400\ndata/0008/000401\ndata/0008/000402\ndata/0008/000403\ndata/0008/000404\ndata/0008/000405\ndata/0008/000406\ndata/0008/000407\ndata/0008/000408\ndata/0008/000409\ndata/0008/000410\ndata/0008/000411\ndata/0008/000412\ndata/0008/000413\ndata/0008/000414\ndata/0008/000415\ndata/0008/000416\ndata/0008/000417\ndata/0008/000418\ndata/0008/000419\ndata/0008/000420\ndata/0008/000421\ndata/0008/000422\ndata/0008/000423\ndata/0008/000424\ndata/0008/000425\ndata/0008/000426\ndata/0008/000427\ndata/0008/000428\ndata/0008/000429\ndata/0008/000430\ndata/0008/000431\ndata/0008/000432\ndata/0008/000433\ndata/0008/000434\ndata/0008/000435\ndata/0008/000436\ndata/0008/000437\ndata/0008/000438\ndata/0008/000439\ndata/0008/000440\ndata/0008/000441\ndata/0008/000442\ndata/0008/000443\ndata/0008/000444\ndata/0008/000445\ndata/0008/000446\ndata/0008/000447\ndata/0008/000448\ndata/0008/000449\ndata/0008/000450\ndata/0008/000451\ndata/0008/000452\ndata/0008/000453\ndata/0008/000454\ndata/0008/000455\ndata/0008/000456\ndata/0008/000457\ndata/0008/000458\ndata/0008/000459\ndata/0008/000460\ndata/0008/000461\ndata/0008/000462\ndata/0008/000463\ndata/0008/000464\ndata/0008/000465\ndata/0008/000466\ndata/0008/000467\ndata/0008/000468\ndata/0008/000469\ndata/0008/000470\ndata/0008/000471\ndata/0008/000472\ndata/0008/000473\ndata/0008/000474\ndata/0008/000475\ndata/0008/000476\ndata/0008/000477\ndata/0008/000478\ndata/0008/000479\ndata/0008/000480\ndata/0008/000481\ndata/0008/000482\ndata/0008/000483\ndata/0008/000484\ndata/0008/000485\ndata/0008/000486\ndata/0008/000487\ndata/0008/000488\ndata/0008/000489\ndata/0008/000490\ndata/0008/000491\ndata/0008/000492\ndata/0008/000493\ndata/0008/000494\ndata/0008/000495\ndata/0008/000496\ndata/0008/000497\ndata/0008/000498\ndata/0008/000499\ndata/0008/000500\ndata/0008/000501\ndata/0008/000502\ndata/0008/000503\ndata/0008/000504\ndata/0008/000505\ndata/0008/000506\ndata/0008/000507\ndata/0008/000508\ndata/0008/000509\ndata/0008/000510\ndata/0008/000511\ndata/0008/000512\ndata/0008/000513\ndata/0008/000514\ndata/0008/000515\ndata/0008/000516\ndata/0008/000517\ndata/0008/000518\ndata/0008/000519\ndata/0008/000520\ndata/0008/000521\ndata/0008/000522\ndata/0008/000523\ndata/0008/000524\ndata/0008/000525\ndata/0008/000526\ndata/0008/000527\ndata/0008/000528\ndata/0008/000529\ndata/0008/000530\ndata/0008/000531\ndata/0008/000532\ndata/0008/000533\ndata/0008/000534\ndata/0008/000535\ndata/0008/000536\ndata/0008/000537\ndata/0008/000538\ndata/0008/000539\ndata/0008/000540\ndata/0008/000541\ndata/0008/000542\ndata/0008/000543\ndata/0008/000544\ndata/0008/000545\ndata/0008/000546\ndata/0008/000547\ndata/0008/000548\ndata/0008/000549\ndata/0008/000550\ndata/0008/000551\ndata/0008/000552\ndata/0008/000553\ndata/0008/000554\ndata/0008/000555\ndata/0008/000556\ndata/0008/000557\ndata/0008/000558\ndata/0008/000559\ndata/0008/000560\ndata/0008/000561\ndata/0008/000562\ndata/0008/000563\ndata/0008/000564\ndata/0008/000565\ndata/0008/000566\ndata/0008/000567\ndata/0008/000568\ndata/0008/000569\ndata/0008/000570\ndata/0008/000571\ndata/0008/000572\ndata/0008/000573\ndata/0008/000574\ndata/0008/000575\ndata/0008/000576\ndata/0008/000577\ndata/0008/000578\ndata/0008/000579\ndata/0008/000580\ndata/0008/000581\ndata/0008/000582\ndata/0008/000583\ndata/0008/000584\ndata/0008/000585\ndata/0008/000586\ndata/0008/000587\ndata/0008/000588\ndata/0008/000589\ndata/0008/000590\ndata/0008/000591\ndata/0008/000592\ndata/0008/000593\ndata/0008/000594\ndata/0008/000595\ndata/0008/000596\ndata/0008/000597\ndata/0008/000598\ndata/0008/000599\ndata/0008/000600\ndata/0008/000601\ndata/0008/000602\ndata/0008/000603\ndata/0008/000604\ndata/0008/000605\ndata/0008/000606\ndata/0008/000607\ndata/0008/000608\ndata/0008/000609\ndata/0008/000610\ndata/0008/000611\ndata/0008/000612\ndata/0008/000613\ndata/0008/000614\ndata/0008/000615\ndata/0008/000616\ndata/0008/000617\ndata/0008/000618\ndata/0008/000619\ndata/0008/000620\ndata/0008/000621\ndata/0008/000622\ndata/0008/000623\ndata/0008/000624\ndata/0008/000625\ndata/0008/000626\ndata/0008/000627\ndata/0008/000628\ndata/0008/000629\ndata/0008/000630\ndata/0008/000631\ndata/0008/000632\ndata/0008/000633\ndata/0008/000634\ndata/0008/000635\ndata/0008/000636\ndata/0009/000001\ndata/0009/000002\ndata/0009/000003\ndata/0009/000004\ndata/0009/000005\ndata/0009/000006\ndata/0009/000007\ndata/0009/000008\ndata/0009/000009\ndata/0009/000010\ndata/0009/000011\ndata/0009/000012\ndata/0009/000013\ndata/0009/000014\ndata/0009/000015\ndata/0009/000016\ndata/0009/000017\ndata/0009/000018\ndata/0009/000019\ndata/0009/000020\ndata/0009/000021\ndata/0009/000022\ndata/0009/000023\ndata/0009/000024\ndata/0009/000025\ndata/0009/000026\ndata/0009/000027\ndata/0009/000028\ndata/0009/000029\ndata/0009/000030\ndata/0009/000031\ndata/0009/000032\ndata/0009/000033\ndata/0009/000034\ndata/0009/000035\ndata/0009/000036\ndata/0009/000037\ndata/0009/000038\ndata/0009/000039\ndata/0009/000040\ndata/0009/000041\ndata/0009/000042\ndata/0009/000043\ndata/0009/000044\ndata/0009/000045\ndata/0009/000046\ndata/0009/000047\ndata/0009/000048\ndata/0009/000049\ndata/0009/000050\ndata/0009/000051\ndata/0009/000052\ndata/0009/000053\ndata/0009/000054\ndata/0009/000055\ndata/0009/000056\ndata/0009/000057\ndata/0009/000058\ndata/0009/000059\ndata/0009/000060\ndata/0009/000061\ndata/0009/000062\ndata/0009/000063\ndata/0009/000064\ndata/0009/000065\ndata/0009/000066\ndata/0009/000067\ndata/0009/000068\ndata/0009/000069\ndata/0009/000070\ndata/0009/000071\ndata/0009/000072\ndata/0009/000073\ndata/0009/000074\ndata/0009/000075\ndata/0009/000076\ndata/0009/000077\ndata/0009/000078\ndata/0009/000079\ndata/0009/000080\ndata/0009/000081\ndata/0009/000082\ndata/0009/000083\ndata/0009/000084\ndata/0009/000085\ndata/0009/000086\ndata/0009/000087\ndata/0009/000088\ndata/0009/000089\ndata/0009/000090\ndata/0009/000091\ndata/0009/000092\ndata/0009/000093\ndata/0009/000094\ndata/0009/000095\ndata/0009/000096\ndata/0009/000097\ndata/0009/000098\ndata/0009/000099\ndata/0009/000100\ndata/0009/000101\ndata/0009/000102\ndata/0009/000103\ndata/0009/000104\ndata/0009/000105\ndata/0009/000106\ndata/0009/000107\ndata/0009/000108\ndata/0009/000109\ndata/0009/000110\ndata/0009/000111\ndata/0009/000112\ndata/0009/000113\ndata/0009/000114\ndata/0009/000115\ndata/0009/000116\ndata/0009/000117\ndata/0009/000118\ndata/0009/000119\ndata/0009/000120\ndata/0009/000121\ndata/0009/000122\ndata/0009/000123\ndata/0009/000124\ndata/0009/000125\ndata/0009/000126\ndata/0009/000127\ndata/0009/000128\ndata/0009/000129\ndata/0009/000130\ndata/0009/000131\ndata/0009/000132\ndata/0009/000133\ndata/0009/000134\ndata/0009/000135\ndata/0009/000136\ndata/0009/000137\ndata/0009/000138\ndata/0009/000139\ndata/0009/000140\ndata/0009/000141\ndata/0009/000142\ndata/0009/000143\ndata/0009/000144\ndata/0009/000145\ndata/0009/000146\ndata/0009/000147\ndata/0009/000148\ndata/0009/000149\ndata/0009/000150\ndata/0009/000151\ndata/0009/000152\ndata/0009/000153\ndata/0009/000154\ndata/0009/000155\ndata/0009/000156\ndata/0009/000157\ndata/0009/000158\ndata/0009/000159\ndata/0009/000160\ndata/0009/000161\ndata/0009/000162\ndata/0009/000163\ndata/0009/000164\ndata/0009/000165\ndata/0009/000166\ndata/0009/000167\ndata/0009/000168\ndata/0009/000169\ndata/0009/000170\ndata/0009/000171\ndata/0009/000172\ndata/0009/000173\ndata/0009/000174\ndata/0009/000175\ndata/0009/000176\ndata/0009/000177\ndata/0009/000178\ndata/0009/000179\ndata/0009/000180\ndata/0009/000181\ndata/0009/000182\ndata/0009/000183\ndata/0009/000184\ndata/0009/000185\ndata/0009/000186\ndata/0009/000187\ndata/0009/000188\ndata/0009/000189\ndata/0009/000190\ndata/0009/000191\ndata/0009/000192\ndata/0009/000193\ndata/0009/000194\ndata/0009/000195\ndata/0009/000196\ndata/0009/000197\ndata/0009/000198\ndata/0009/000199\ndata/0009/000200\ndata/0009/000201\ndata/0009/000202\ndata/0009/000203\ndata/0009/000204\ndata/0009/000205\ndata/0009/000206\ndata/0009/000207\ndata/0009/000208\ndata/0009/000209\ndata/0009/000210\ndata/0009/000211\ndata/0009/000212\ndata/0009/000213\ndata/0009/000214\ndata/0009/000215\ndata/0009/000216\ndata/0009/000217\ndata/0009/000218\ndata/0009/000219\ndata/0009/000220\ndata/0009/000221\ndata/0009/000222\ndata/0009/000223\ndata/0009/000224\ndata/0009/000225\ndata/0009/000226\ndata/0009/000227\ndata/0009/000228\ndata/0009/000229\ndata/0009/000230\ndata/0009/000231\ndata/0009/000232\ndata/0009/000233\ndata/0009/000234\ndata/0009/000235\ndata/0009/000236\ndata/0009/000237\ndata/0009/000238\ndata/0009/000239\ndata/0009/000240\ndata/0009/000241\ndata/0009/000242\ndata/0009/000243\ndata/0009/000244\ndata/0009/000245\ndata/0009/000246\ndata/0009/000247\ndata/0009/000248\ndata/0009/000249\ndata/0009/000250\ndata/0009/000251\ndata/0009/000252\ndata/0009/000253\ndata/0009/000254\ndata/0009/000255\ndata/0009/000256\ndata/0009/000257\ndata/0009/000258\ndata/0009/000259\ndata/0009/000260\ndata/0009/000261\ndata/0009/000262\ndata/0009/000263\ndata/0009/000264\ndata/0009/000265\ndata/0009/000266\ndata/0009/000267\ndata/0009/000268\ndata/0009/000269\ndata/0009/000270\ndata/0009/000271\ndata/0009/000272\ndata/0009/000273\ndata/0009/000274\ndata/0009/000275\ndata/0009/000276\ndata/0009/000277\ndata/0009/000278\ndata/0009/000279\ndata/0009/000280\ndata/0009/000281\ndata/0009/000282\ndata/0009/000283\ndata/0009/000284\ndata/0009/000285\ndata/0009/000286\ndata/0009/000287\ndata/0009/000288\ndata/0009/000289\ndata/0009/000290\ndata/0009/000291\ndata/0009/000292\ndata/0009/000293\ndata/0009/000294\ndata/0009/000295\ndata/0009/000296\ndata/0009/000297\ndata/0009/000298\ndata/0009/000299\ndata/0009/000300\ndata/0009/000301\ndata/0009/000302\ndata/0009/000303\ndata/0009/000304\ndata/0009/000305\ndata/0009/000306\ndata/0009/000307\ndata/0009/000308\ndata/0009/000309\ndata/0009/000310\ndata/0009/000311\ndata/0009/000312\ndata/0009/000313\ndata/0009/000314\ndata/0009/000315\ndata/0009/000316\ndata/0009/000317\ndata/0009/000318\ndata/0009/000319\ndata/0009/000320\ndata/0009/000321\ndata/0009/000322\ndata/0009/000323\ndata/0009/000324\ndata/0009/000325\ndata/0009/000326\ndata/0009/000327\ndata/0009/000328\ndata/0009/000329\ndata/0009/000330\ndata/0009/000331\ndata/0009/000332\ndata/0009/000333\ndata/0009/000334\ndata/0009/000335\ndata/0009/000336\ndata/0009/000337\ndata/0009/000338\ndata/0009/000339\ndata/0009/000340\ndata/0009/000341\ndata/0009/000342\ndata/0009/000343\ndata/0009/000344\ndata/0009/000345\ndata/0009/000346\ndata/0009/000347\ndata/0009/000348\ndata/0009/000349\ndata/0009/000350\ndata/0009/000351\ndata/0009/000352\ndata/0009/000353\ndata/0009/000354\ndata/0009/000355\ndata/0009/000356\ndata/0009/000357\ndata/0009/000358\ndata/0009/000359\ndata/0009/000360\ndata/0009/000361\ndata/0009/000362\ndata/0009/000363\ndata/0009/000364\ndata/0009/000365\ndata/0009/000366\ndata/0009/000367\ndata/0009/000368\ndata/0009/000369\ndata/0009/000370\ndata/0009/000371\ndata/0009/000372\ndata/0009/000373\ndata/0009/000374\ndata/0009/000375\ndata/0009/000376\ndata/0009/000377\ndata/0009/000378\ndata/0009/000379\ndata/0009/000380\ndata/0009/000381\ndata/0009/000382\ndata/0009/000383\ndata/0009/000384\ndata/0009/000385\ndata/0009/000386\ndata/0009/000387\ndata/0009/000388\ndata/0009/000389\ndata/0009/000390\ndata/0009/000391\ndata/0009/000392\ndata/0009/000393\ndata/0009/000394\ndata/0009/000395\ndata/0009/000396\ndata/0009/000397\ndata/0009/000398\ndata/0009/000399\ndata/0009/000400\ndata/0009/000401\ndata/0009/000402\ndata/0009/000403\ndata/0009/000404\ndata/0009/000405\ndata/0009/000406\ndata/0009/000407\ndata/0009/000408\ndata/0009/000409\ndata/0009/000410\ndata/0009/000411\ndata/0009/000412\ndata/0009/000413\ndata/0009/000414\ndata/0009/000415\ndata/0009/000416\ndata/0009/000417\ndata/0009/000418\ndata/0009/000419\ndata/0009/000420\ndata/0009/000421\ndata/0009/000422\ndata/0009/000423\ndata/0009/000424\ndata/0009/000425\ndata/0009/000426\ndata/0009/000427\ndata/0009/000428\ndata/0009/000429\ndata/0009/000430\ndata/0009/000431\ndata/0009/000432\ndata/0009/000433\ndata/0009/000434\ndata/0009/000435\ndata/0009/000436\ndata/0009/000437\ndata/0009/000438\ndata/0009/000439\ndata/0009/000440\ndata/0009/000441\ndata/0009/000442\ndata/0009/000443\ndata/0009/000444\ndata/0009/000445\ndata/0009/000446\ndata/0009/000447\ndata/0009/000448\ndata/0009/000449\ndata/0009/000450\ndata/0009/000451\ndata/0009/000452\ndata/0009/000453\ndata/0009/000454\ndata/0009/000455\ndata/0009/000456\ndata/0009/000457\ndata/0009/000458\ndata/0009/000459\ndata/0009/000460\ndata/0009/000461\ndata/0009/000462\ndata/0009/000463\ndata/0009/000464\ndata/0009/000465\ndata/0009/000466\ndata/0009/000467\ndata/0009/000468\ndata/0009/000469\ndata/0009/000470\ndata/0009/000471\ndata/0009/000472\ndata/0009/000473\ndata/0009/000474\ndata/0009/000475\ndata/0009/000476\ndata/0009/000477\ndata/0009/000478\ndata/0009/000479\ndata/0009/000480\ndata/0009/000481\ndata/0009/000482\ndata/0009/000483\ndata/0009/000484\ndata/0009/000485\ndata/0009/000486\ndata/0009/000487\ndata/0009/000488\ndata/0009/000489\ndata/0009/000490\ndata/0009/000491\ndata/0009/000492\ndata/0009/000493\ndata/0009/000494\ndata/0009/000495\ndata/0009/000496\ndata/0009/000497\ndata/0009/000498\ndata/0009/000499\ndata/0009/000500\ndata/0009/000501\ndata/0009/000502\ndata/0009/000503\ndata/0009/000504\ndata/0009/000505\ndata/0009/000506\ndata/0009/000507\ndata/0009/000508\ndata/0009/000509\ndata/0009/000510\ndata/0009/000511\ndata/0009/000512\ndata/0009/000513\ndata/0009/000514\ndata/0009/000515\ndata/0009/000516\ndata/0009/000517\ndata/0009/000518\ndata/0009/000519\ndata/0009/000520\ndata/0009/000521\ndata/0009/000522\ndata/0009/000523\ndata/0009/000524\ndata/0009/000525\ndata/0009/000526\ndata/0009/000527\ndata/0009/000528\ndata/0009/000529\ndata/0009/000530\ndata/0009/000531\ndata/0009/000532\ndata/0009/000533\ndata/0009/000534\ndata/0009/000535\ndata/0009/000536\ndata/0009/000537\ndata/0009/000538\ndata/0009/000539\ndata/0009/000540\ndata/0009/000541\ndata/0009/000542\ndata/0009/000543\ndata/0009/000544\ndata/0009/000545\ndata/0009/000546\ndata/0009/000547\ndata/0009/000548\ndata/0009/000549\ndata/0009/000550\ndata/0009/000551\ndata/0009/000552\ndata/0009/000553\ndata/0009/000554\ndata/0009/000555\ndata/0009/000556\ndata/0009/000557\ndata/0009/000558\ndata/0009/000559\ndata/0009/000560\ndata/0009/000561\ndata/0009/000562\ndata/0009/000563\ndata/0009/000564\ndata/0009/000565\ndata/0009/000566\ndata/0009/000567\ndata/0009/000568\ndata/0009/000569\ndata/0009/000570\ndata/0009/000571\ndata/0009/000572\ndata/0009/000573\ndata/0009/000574\ndata/0009/000575\ndata/0009/000576\ndata/0009/000577\ndata/0009/000578\ndata/0009/000579\ndata/0009/000580\ndata/0009/000581\ndata/0009/000582\ndata/0009/000583\ndata/0009/000584\ndata/0009/000585\ndata/0009/000586\ndata/0009/000587\ndata/0009/000588\ndata/0009/000589\ndata/0009/000590\ndata/0009/000591\ndata/0009/000592\ndata/0009/000593\ndata/0009/000594\ndata/0009/000595\ndata/0009/000596\ndata/0009/000597\ndata/0009/000598\ndata/0009/000599\ndata/0009/000600\ndata/0009/000601\ndata/0009/000602\ndata/0009/000603\ndata/0009/000604\ndata/0009/000605\ndata/0009/000606\ndata/0009/000607\ndata/0009/000608\ndata/0009/000609\ndata/0009/000610\ndata/0009/000611\ndata/0009/000612\ndata/0009/000613\ndata/0009/000614\ndata/0009/000615\ndata/0009/000616\ndata/0009/000617\ndata/0009/000618\ndata/0009/000619\ndata/0009/000620\ndata/0009/000621\ndata/0009/000622\ndata/0009/000623\ndata/0009/000624\ndata/0009/000625\ndata/0009/000626\ndata/0009/000627\ndata/0009/000628\ndata/0009/000629\ndata/0009/000630\ndata/0009/000631\ndata/0009/000632\ndata/0009/000633\ndata/0009/000634\ndata/0009/000635\ndata/0009/000636\ndata/0009/000637\ndata/0009/000638\ndata/0009/000639\ndata/0009/000640\ndata/0009/000641\ndata/0009/000642\ndata/0009/000643\ndata/0009/000644\ndata/0009/000645\ndata/0009/000646\ndata/0009/000647\ndata/0009/000648\ndata/0009/000649\ndata/0009/000650\ndata/0009/000651\ndata/0009/000652\ndata/0009/000653\ndata/0009/000654\ndata/0009/000655\ndata/0009/000656\ndata/0009/000657\ndata/0009/000658\ndata/0009/000659\ndata/0009/000660\ndata/0009/000661\ndata/0009/000662\ndata/0009/000663\ndata/0009/000664\ndata/0009/000665\ndata/0009/000666\ndata/0009/000667\ndata/0009/000668\ndata/0009/000669\ndata/0009/000670\ndata/0009/000671\ndata/0009/000672\ndata/0009/000673\ndata/0009/000674\ndata/0009/000675\ndata/0009/000676\ndata/0009/000677\ndata/0009/000678\ndata/0009/000679\ndata/0009/000680\ndata/0009/000681\ndata/0009/000682\ndata/0009/000683\ndata/0009/000684\ndata/0009/000685\ndata/0009/000686\ndata/0009/000687\ndata/0009/000688\ndata/0009/000689\ndata/0009/000690\ndata/0009/000691\ndata/0009/000692\ndata/0009/000693\ndata/0009/000694\ndata/0009/000695\ndata/0009/000696\ndata/0009/000697\ndata/0009/000698\ndata/0009/000699\ndata/0009/000700\ndata/0009/000701\ndata/0009/000702\ndata/0009/000703\ndata/0009/000704\ndata/0009/000705\ndata/0009/000706\ndata/0009/000707\ndata/0009/000708\ndata/0009/000709\ndata/0009/000710\ndata/0009/000711\ndata/0009/000712\ndata/0009/000713\ndata/0009/000714\ndata/0009/000715\ndata/0009/000716\ndata/0009/000717\ndata/0009/000718\ndata/0009/000719\ndata/0009/000720\ndata/0009/000721\ndata/0009/000722\ndata/0009/000723\ndata/0009/000724\ndata/0009/000725\ndata/0009/000726\ndata/0009/000727\ndata/0009/000728\ndata/0009/000729\ndata/0009/000730\ndata/0009/000731\ndata/0009/000732\ndata/0009/000733\ndata/0009/000734\ndata/0009/000735\ndata/0009/000736\ndata/0009/000737\ndata/0009/000738\ndata/0009/000739\ndata/0009/000740\ndata/0009/000741\ndata/0009/000742\ndata/0009/000743\ndata/0009/000744\ndata/0009/000745\ndata/0009/000746\ndata/0009/000747\ndata/0009/000748\ndata/0009/000749\ndata/0009/000750\ndata/0009/000751\ndata/0009/000752\ndata/0009/000753\ndata/0009/000754\ndata/0009/000755\ndata/0009/000756\ndata/0009/000757\ndata/0009/000758\ndata/0009/000759\ndata/0009/000760\ndata/0009/000761\ndata/0009/000762\ndata/0009/000763\ndata/0009/000764\ndata/0009/000765\ndata/0009/000766\ndata/0009/000767\ndata/0009/000768\ndata/0009/000769\ndata/0009/000770\ndata/0009/000771\ndata/0009/000772\ndata/0009/000773\ndata/0009/000774\ndata/0009/000775\ndata/0009/000776\ndata/0009/000777\ndata/0009/000778\ndata/0009/000779\ndata/0009/000780\ndata/0009/000781\ndata/0009/000782\ndata/0009/000783\ndata/0009/000784\ndata/0009/000785\ndata/0009/000786\ndata/0009/000787\ndata/0009/000788\ndata/0009/000789\ndata/0009/000790\ndata/0009/000791\ndata/0009/000792\ndata/0009/000793\ndata/0009/000794\ndata/0009/000795\ndata/0009/000796\ndata/0009/000797\ndata/0009/000798\ndata/0009/000799\ndata/0009/000800\ndata/0009/000801\ndata/0009/000802\ndata/0009/000803\ndata/0009/000804\ndata/0009/000805\ndata/0009/000806\ndata/0009/000807\ndata/0009/000808\ndata/0009/000809\ndata/0009/000810\ndata/0009/000811\ndata/0009/000812\ndata/0009/000813\ndata/0009/000814\ndata/0009/000815\ndata/0009/000816\ndata/0009/000817\ndata/0009/000818\ndata/0009/000819\ndata/0009/000820\ndata/0009/000821\ndata/0009/000822\ndata/0009/000823\ndata/0009/000824\ndata/0009/000825\ndata/0009/000826\ndata/0009/000827\ndata/0009/000828\ndata/0009/000829\ndata/0009/000830\ndata/0009/000831\ndata/0009/000832\ndata/0009/000833\ndata/0009/000834\ndata/0009/000835\ndata/0009/000836\ndata/0009/000837\ndata/0009/000838\ndata/0009/000839\ndata/0009/000840\ndata/0009/000841\ndata/0009/000842\ndata/0009/000843\ndata/0009/000844\ndata/0009/000845\ndata/0009/000846\ndata/0009/000847\ndata/0009/000848\ndata/0009/000849\ndata/0009/000850\ndata/0009/000851\ndata/0009/000852\ndata/0009/000853\ndata/0009/000854\ndata/0009/000855\ndata/0009/000856\ndata/0009/000857\ndata/0009/000858\ndata/0009/000859\ndata/0009/000860\ndata/0009/000861\ndata/0009/000862\ndata/0009/000863\ndata/0009/000864\ndata/0009/000865\ndata/0009/000866\ndata/0009/000867\ndata/0009/000868\ndata/0009/000869\ndata/0009/000870\ndata/0009/000871\ndata/0009/000872\ndata/0009/000873\ndata/0009/000874\ndata/0009/000875\ndata/0009/000876\ndata/0009/000877\ndata/0009/000878\ndata/0009/000879\ndata/0009/000880\ndata/0009/000881\ndata/0009/000882\ndata/0009/000883\ndata/0009/000884\ndata/0009/000885\ndata/0009/000886\ndata/0009/000887\ndata/0009/000888\ndata/0009/000889\ndata/0009/000890\ndata/0009/000891\ndata/0009/000892\ndata/0009/000893\ndata/0009/000894\ndata/0009/000895\ndata/0009/000896\ndata/0009/000897\ndata/0009/000898\ndata/0009/000899\ndata/0009/000900\ndata/0009/000901\ndata/0009/000902\ndata/0009/000903\ndata/0009/000904\ndata/0009/000905\ndata/0009/000906\ndata/0009/000907\ndata/0009/000908\ndata/0009/000909\ndata/0009/000910\ndata/0009/000911\ndata/0009/000912\ndata/0009/000913\ndata/0009/000914\ndata/0009/000915\ndata/0009/000916\ndata/0009/000917\ndata/0009/000918\ndata/0009/000919\ndata/0009/000920\ndata/0009/000921\ndata/0009/000922\ndata/0009/000923\ndata/0009/000924\ndata/0009/000925\ndata/0009/000926\ndata/0009/000927\ndata/0009/000928\ndata/0009/000929\ndata/0009/000930\ndata/0009/000931\ndata/0009/000932\ndata/0009/000933\ndata/0009/000934\ndata/0009/000935\ndata/0009/000936\ndata/0009/000937\ndata/0009/000938\ndata/0012/000001\ndata/0012/000002\ndata/0012/000003\ndata/0012/000004\ndata/0012/000005\ndata/0012/000006\ndata/0012/000007\ndata/0012/000008\ndata/0012/000009\ndata/0012/000010\ndata/0012/000011\ndata/0012/000012\ndata/0012/000013\ndata/0012/000014\ndata/0012/000015\ndata/0012/000016\ndata/0012/000017\ndata/0012/000018\ndata/0012/000019\ndata/0012/000020\ndata/0012/000021\ndata/0012/000022\ndata/0012/000023\ndata/0012/000024\ndata/0012/000025\ndata/0012/000026\ndata/0012/000027\ndata/0012/000028\ndata/0012/000029\ndata/0012/000030\ndata/0012/000031\ndata/0012/000032\ndata/0012/000033\ndata/0012/000034\ndata/0012/000035\ndata/0012/000036\ndata/0012/000037\ndata/0012/000038\ndata/0012/000039\ndata/0012/000040\ndata/0012/000041\ndata/0012/000042\ndata/0012/000043\ndata/0012/000044\ndata/0012/000045\ndata/0012/000046\ndata/0012/000047\ndata/0012/000048\ndata/0012/000049\ndata/0012/000050\ndata/0012/000051\ndata/0012/000052\ndata/0012/000053\ndata/0012/000054\ndata/0012/000055\ndata/0012/000056\ndata/0012/000057\ndata/0012/000058\ndata/0012/000059\ndata/0012/000060\ndata/0012/000061\ndata/0012/000062\ndata/0012/000063\ndata/0012/000064\ndata/0012/000065\ndata/0012/000066\ndata/0012/000067\ndata/0012/000068\ndata/0012/000069\ndata/0012/000070\ndata/0012/000071\ndata/0012/000072\ndata/0012/000073\ndata/0012/000074\ndata/0012/000075\ndata/0012/000076\ndata/0012/000077\ndata/0012/000078\ndata/0012/000079\ndata/0012/000080\ndata/0012/000081\ndata/0012/000082\ndata/0012/000083\ndata/0012/000084\ndata/0012/000085\ndata/0012/000086\ndata/0012/000087\ndata/0012/000088\ndata/0012/000089\ndata/0012/000090\ndata/0012/000091\ndata/0012/000092\ndata/0012/000093\ndata/0012/000094\ndata/0012/000095\ndata/0012/000096\ndata/0012/000097\ndata/0012/000098\ndata/0012/000099\ndata/0012/000100\ndata/0012/000101\ndata/0012/000102\ndata/0012/000103\ndata/0012/000104\ndata/0012/000105\ndata/0012/000106\ndata/0012/000107\ndata/0012/000108\ndata/0012/000109\ndata/0012/000110\ndata/0012/000111\ndata/0012/000112\ndata/0012/000113\ndata/0012/000114\ndata/0012/000115\ndata/0012/000116\ndata/0012/000117\ndata/0012/000118\ndata/0012/000119\ndata/0012/000120\ndata/0012/000121\ndata/0012/000122\ndata/0012/000123\ndata/0012/000124\ndata/0012/000125\ndata/0012/000126\ndata/0012/000127\ndata/0012/000128\ndata/0012/000129\ndata/0012/000130\ndata/0012/000131\ndata/0012/000132\ndata/0012/000133\ndata/0012/000134\ndata/0012/000135\ndata/0012/000136\ndata/0012/000137\ndata/0012/000138\ndata/0012/000139\ndata/0012/000140\ndata/0012/000141\ndata/0012/000142\ndata/0012/000143\ndata/0012/000144\ndata/0012/000145\ndata/0012/000146\ndata/0012/000147\ndata/0012/000148\ndata/0012/000149\ndata/0012/000150\ndata/0012/000151\ndata/0012/000152\ndata/0012/000153\ndata/0012/000154\ndata/0012/000155\ndata/0012/000156\ndata/0012/000157\ndata/0012/000158\ndata/0012/000159\ndata/0012/000160\ndata/0012/000161\ndata/0012/000162\ndata/0012/000163\ndata/0012/000164\ndata/0012/000165\ndata/0012/000166\ndata/0012/000167\ndata/0012/000168\ndata/0012/000169\ndata/0012/000170\ndata/0012/000171\ndata/0012/000172\ndata/0012/000173\ndata/0012/000174\ndata/0012/000175\ndata/0012/000176\ndata/0012/000177\ndata/0012/000178\ndata/0012/000179\ndata/0012/000180\ndata/0012/000181\ndata/0012/000182\ndata/0012/000183\ndata/0012/000184\ndata/0012/000185\ndata/0012/000186\ndata/0012/000187\ndata/0012/000188\ndata/0012/000189\ndata/0012/000190\ndata/0012/000191\ndata/0012/000192\ndata/0012/000193\ndata/0012/000194\ndata/0012/000195\ndata/0012/000196\ndata/0012/000197\ndata/0012/000198\ndata/0012/000199\ndata/0012/000200\ndata/0012/000201\ndata/0012/000202\ndata/0012/000203\ndata/0012/000204\ndata/0012/000205\ndata/0012/000206\ndata/0012/000207\ndata/0012/000208\ndata/0012/000209\ndata/0012/000210\ndata/0012/000211\ndata/0012/000212\ndata/0012/000213\ndata/0012/000214\ndata/0012/000215\ndata/0012/000216\ndata/0012/000217\ndata/0012/000218\ndata/0012/000219\ndata/0012/000220\ndata/0012/000221\ndata/0012/000222\ndata/0012/000223\ndata/0012/000224\ndata/0012/000225\ndata/0012/000226\ndata/0012/000227\ndata/0012/000228\ndata/0012/000229\ndata/0012/000230\ndata/0012/000231\ndata/0012/000232\ndata/0012/000233\ndata/0012/000234\ndata/0012/000235\ndata/0012/000236\ndata/0012/000237\ndata/0012/000238\ndata/0012/000239\ndata/0012/000240\ndata/0012/000241\ndata/0012/000242\ndata/0012/000243\ndata/0012/000244\ndata/0012/000245\ndata/0012/000246\ndata/0012/000247\ndata/0012/000248\ndata/0012/000249\ndata/0012/000250\ndata/0012/000251\ndata/0012/000252\ndata/0012/000253\ndata/0012/000254\ndata/0012/000255\ndata/0012/000256\ndata/0012/000257\ndata/0012/000258\ndata/0012/000259\ndata/0012/000260\ndata/0012/000261\ndata/0012/000262\ndata/0012/000263\ndata/0012/000264\ndata/0012/000265\ndata/0012/000266\ndata/0012/000267\ndata/0012/000268\ndata/0012/000269\ndata/0012/000270\ndata/0012/000271\ndata/0012/000272\ndata/0012/000273\ndata/0012/000274\ndata/0012/000275\ndata/0012/000276\ndata/0012/000277\ndata/0012/000278\ndata/0012/000279\ndata/0012/000280\ndata/0012/000281\ndata/0012/000282\ndata/0012/000283\ndata/0012/000284\ndata/0012/000285\ndata/0012/000286\ndata/0012/000287\ndata/0012/000288\ndata/0012/000289\ndata/0012/000290\ndata/0012/000291\ndata/0012/000292\ndata/0012/000293\ndata/0012/000294\ndata/0012/000295\ndata/0012/000296\ndata/0012/000297\ndata/0012/000298\ndata/0012/000299\ndata/0012/000300\ndata/0012/000301\ndata/0012/000302\ndata/0012/000303\ndata/0012/000304\ndata/0012/000305\ndata/0012/000306\ndata/0012/000307\ndata/0012/000308\ndata/0012/000309\ndata/0012/000310\ndata/0012/000311\ndata/0012/000312\ndata/0012/000313\ndata/0012/000314\ndata/0012/000315\ndata/0012/000316\ndata/0012/000317\ndata/0012/000318\ndata/0012/000319\ndata/0012/000320\ndata/0012/000321\ndata/0012/000322\ndata/0012/000323\ndata/0012/000324\ndata/0012/000325\ndata/0012/000326\ndata/0012/000327\ndata/0012/000328\ndata/0012/000329\ndata/0012/000330\ndata/0012/000331\ndata/0012/000332\ndata/0012/000333\ndata/0012/000334\ndata/0012/000335\ndata/0012/000336\ndata/0012/000337\ndata/0012/000338\ndata/0012/000339\ndata/0012/000340\ndata/0012/000341\ndata/0012/000342\ndata/0012/000343\ndata/0012/000344\ndata/0012/000345\ndata/0012/000346\ndata/0012/000347\ndata/0012/000348\ndata/0012/000349\ndata/0012/000350\ndata/0012/000351\ndata/0012/000352\ndata/0012/000353\ndata/0012/000354\ndata/0012/000355\ndata/0012/000356\ndata/0012/000357\ndata/0012/000358\ndata/0012/000359\ndata/0012/000360\ndata/0012/000361\ndata/0012/000362\ndata/0012/000363\ndata/0012/000364\ndata/0012/000365\ndata/0012/000366\ndata/0012/000367\ndata/0012/000368\ndata/0012/000369\ndata/0012/000370\ndata/0012/000371\ndata/0012/000372\ndata/0012/000373\ndata/0012/000374\ndata/0012/000375\ndata/0012/000376\ndata/0012/000377\ndata/0012/000378\ndata/0012/000379\ndata/0012/000380\ndata/0012/000381\ndata/0012/000382\ndata/0012/000383\ndata/0012/000384\ndata/0012/000385\ndata/0012/000386\ndata/0012/000387\ndata/0012/000388\ndata/0012/000389\ndata/0012/000390\ndata/0012/000391\ndata/0012/000392\ndata/0012/000393\ndata/0012/000394\ndata/0012/000395\ndata/0012/000396\ndata/0012/000397\ndata/0012/000398\ndata/0012/000399\ndata/0012/000400\ndata/0012/000401\ndata/0012/000402\ndata/0012/000403\ndata/0012/000404\ndata/0012/000405\ndata/0012/000406\ndata/0012/000407\ndata/0012/000408\ndata/0012/000409\ndata/0012/000410\ndata/0012/000411\ndata/0012/000412\ndata/0012/000413\ndata/0012/000414\ndata/0012/000415\ndata/0012/000416\ndata/0012/000417\ndata/0012/000418\ndata/0012/000419\ndata/0012/000420\ndata/0012/000421\ndata/0012/000422\ndata/0012/000423\ndata/0012/000424\ndata/0012/000425\ndata/0012/000426\ndata/0012/000427\ndata/0012/000428\ndata/0012/000429\ndata/0012/000430\ndata/0012/000431\ndata/0012/000432\ndata/0012/000433\ndata/0012/000434\ndata/0012/000435\ndata/0012/000436\ndata/0012/000437\ndata/0012/000438\ndata/0012/000439\ndata/0012/000440\ndata/0012/000441\ndata/0012/000442\ndata/0012/000443\ndata/0012/000444\ndata/0012/000445\ndata/0012/000446\ndata/0012/000447\ndata/0012/000448\ndata/0012/000449\ndata/0012/000450\ndata/0012/000451\ndata/0012/000452\ndata/0012/000453\ndata/0012/000454\ndata/0012/000455\ndata/0012/000456\ndata/0012/000457\ndata/0012/000458\ndata/0012/000459\ndata/0012/000460\ndata/0012/000461\ndata/0012/000462\ndata/0012/000463\ndata/0012/000464\ndata/0012/000465\ndata/0012/000466\ndata/0012/000467\ndata/0012/000468\ndata/0012/000469\ndata/0012/000470\ndata/0012/000471\ndata/0012/000472\ndata/0012/000473\ndata/0012/000474\ndata/0012/000475\ndata/0012/000476\ndata/0012/000477\ndata/0012/000478\ndata/0012/000479\ndata/0012/000480\ndata/0012/000481\ndata/0012/000482\ndata/0012/000483\ndata/0012/000484\ndata/0012/000485\ndata/0012/000486\ndata/0012/000487\ndata/0012/000488\ndata/0012/000489\ndata/0012/000490\ndata/0012/000491\ndata/0012/000492\ndata/0012/000493\ndata/0012/000494\ndata/0012/000495\ndata/0012/000496\ndata/0012/000497\ndata/0012/000498\ndata/0012/000499\ndata/0012/000500\ndata/0012/000501\ndata/0012/000502\ndata/0012/000503\ndata/0012/000504\ndata/0012/000505\ndata/0012/000506\ndata/0012/000507\ndata/0012/000508\ndata/0012/000509\ndata/0012/000510\ndata/0012/000511\ndata/0012/000512\ndata/0012/000513\ndata/0012/000514\ndata/0012/000515\ndata/0012/000516\ndata/0012/000517\ndata/0012/000518\ndata/0012/000519\ndata/0012/000520\ndata/0012/000521\ndata/0012/000522\ndata/0012/000523\ndata/0012/000524\ndata/0012/000525\ndata/0012/000526\ndata/0012/000527\ndata/0012/000528\ndata/0012/000529\ndata/0012/000530\ndata/0012/000531\ndata/0012/000532\ndata/0012/000533\ndata/0012/000534\ndata/0012/000535\ndata/0012/000536\ndata/0012/000537\ndata/0012/000538\ndata/0012/000539\ndata/0012/000540\ndata/0012/000541\ndata/0012/000542\ndata/0012/000543\ndata/0012/000544\ndata/0012/000545\ndata/0012/000546\ndata/0012/000547\ndata/0012/000548\ndata/0012/000549\ndata/0012/000550\ndata/0012/000551\ndata/0012/000552\ndata/0012/000553\ndata/0012/000554\ndata/0012/000555\ndata/0012/000556\ndata/0012/000557\ndata/0012/000558\ndata/0012/000559\ndata/0012/000560\ndata/0012/000561\ndata/0012/000562\ndata/0012/000563\ndata/0012/000564\ndata/0012/000565\ndata/0012/000566\ndata/0012/000567\ndata/0012/000568\ndata/0012/000569\ndata/0012/000570\ndata/0012/000571\ndata/0012/000572\ndata/0012/000573\ndata/0012/000574\ndata/0012/000575\ndata/0012/000576\ndata/0012/000577\ndata/0012/000578\ndata/0012/000579\ndata/0012/000580\ndata/0012/000581\ndata/0012/000582\ndata/0012/000583\ndata/0012/000584\ndata/0012/000585\ndata/0012/000586\ndata/0012/000587\ndata/0012/000588\ndata/0012/000589\ndata/0012/000590\ndata/0012/000591\ndata/0012/000592\ndata/0012/000593\ndata/0012/000594\ndata/0012/000595\ndata/0012/000596\ndata/0012/000597\ndata/0012/000598\ndata/0012/000599\ndata/0012/000600\ndata/0012/000601\ndata/0012/000602\ndata/0012/000603\ndata/0012/000604\ndata/0012/000605\ndata/0012/000606\ndata/0012/000607\ndata/0012/000608\ndata/0012/000609\ndata/0012/000610\ndata/0012/000611\ndata/0012/000612\ndata/0012/000613\ndata/0012/000614\ndata/0012/000615\ndata/0012/000616\ndata/0012/000617\ndata/0012/000618\ndata/0012/000619\ndata/0012/000620\ndata/0012/000621\ndata/0012/000622\ndata/0012/000623\ndata/0012/000624\ndata/0012/000625\ndata/0012/000626\ndata/0012/000627\ndata/0012/000628\ndata/0012/000629\ndata/0012/000630\ndata/0012/000631\ndata/0012/000632\ndata/0012/000633\ndata/0012/000634\ndata/0012/000635\ndata/0012/000636\ndata/0012/000637\ndata/0012/000638\ndata/0012/000639\ndata/0012/000640\ndata/0012/000641\ndata/0012/000642\ndata/0012/000643\ndata/0012/000644\ndata/0012/000645\ndata/0012/000646\ndata/0012/000647\ndata/0012/000648\ndata/0012/000649\ndata/0012/000650\ndata/0012/000651\ndata/0012/000652\ndata/0012/000653\ndata/0012/000654\ndata/0012/000655\ndata/0012/000656\ndata/0012/000657\ndata/0012/000658\ndata/0012/000659\ndata/0012/000660\ndata/0012/000661\ndata/0012/000662\ndata/0012/000663\ndata/0012/000664\ndata/0012/000665\ndata/0012/000666\ndata/0012/000667\ndata/0012/000668\ndata/0012/000669\ndata/0012/000670\ndata/0012/000671\ndata/0012/000672\ndata/0012/000673\ndata/0012/000674\ndata/0012/000675\ndata/0012/000676\ndata/0012/000677\ndata/0012/000678\ndata/0012/000679\ndata/0012/000680\ndata/0012/000681\ndata/0012/000682\ndata/0012/000683\ndata/0012/000684\ndata/0012/000685\ndata/0012/000686\ndata/0012/000687\ndata/0012/000688\ndata/0012/000689\ndata/0012/000690\ndata/0012/000691\ndata/0012/000692\ndata/0012/000693\ndata/0012/000694\ndata/0012/000695\ndata/0012/000696\ndata/0012/000697\ndata/0012/000698\ndata/0012/000699\ndata/0012/000700\ndata/0012/000701\ndata/0012/000702\ndata/0012/000703\ndata/0012/000704\ndata/0012/000705\ndata/0012/000706\ndata/0012/000707\ndata/0012/000708\ndata/0012/000709\ndata/0012/000710\ndata/0012/000711\ndata/0012/000712\ndata/0012/000713\ndata/0012/000714\ndata/0012/000715\ndata/0012/000716\ndata/0012/000717\ndata/0012/000718\ndata/0012/000719\ndata/0012/000720\ndata/0012/000721\ndata/0012/000722\ndata/0012/000723\ndata/0012/000724\ndata/0012/000725\ndata/0012/000726\ndata/0012/000727\ndata/0012/000728\ndata/0012/000729\ndata/0012/000730\ndata/0012/000731\ndata/0012/000732\ndata/0012/000733\ndata/0012/000734\ndata/0012/000735\ndata/0012/000736\ndata/0012/000737\ndata/0012/000738\ndata/0012/000739\ndata/0012/000740\ndata/0012/000741\ndata/0012/000742\ndata/0012/000743\ndata/0012/000744\ndata/0012/000745\ndata/0012/000746\ndata/0012/000747\ndata/0012/000748\ndata/0012/000749\ndata/0012/000750\ndata/0012/000751\ndata/0012/000752\ndata/0012/000753\ndata/0012/000754\ndata/0012/000755\ndata/0012/000756\ndata/0012/000757\ndata/0012/000758\ndata/0012/000759\ndata/0012/000760\ndata/0012/000761\ndata/0012/000762\ndata/0012/000763\ndata/0012/000764\ndata/0012/000765\ndata/0012/000766\ndata/0012/000767\ndata/0012/000768\ndata/0012/000769\ndata/0012/000770\ndata/0012/000771\ndata/0012/000772\ndata/0012/000773\ndata/0012/000774\ndata/0012/000775\ndata/0012/000776\ndata/0012/000777\ndata/0012/000778\ndata/0012/000779\ndata/0012/000780\ndata/0012/000781\ndata/0012/000782\ndata/0012/000783\ndata/0012/000784\ndata/0012/000785\ndata/0012/000786\ndata/0012/000787\ndata/0012/000788\ndata/0012/000789\ndata/0012/000790\ndata/0012/000791\ndata/0012/000792\ndata/0012/000793\ndata/0012/000794\ndata/0012/000795\ndata/0012/000796\ndata/0012/000797\ndata/0012/000798\ndata/0012/000799\ndata/0012/000800\ndata/0012/000801\ndata/0012/000802\ndata/0012/000803\ndata/0012/000804\ndata/0012/000805\ndata/0012/000806\ndata/0012/000807\ndata/0012/000808\ndata/0012/000809\ndata/0012/000810\ndata/0012/000811\ndata/0012/000812\ndata/0012/000813\ndata/0012/000814\ndata/0012/000815\ndata/0012/000816\ndata/0012/000817\ndata/0012/000818\ndata/0012/000819\ndata/0012/000820\ndata/0012/000821\ndata/0012/000822\ndata/0012/000823\ndata/0012/000824\ndata/0012/000825\ndata/0012/000826\ndata/0012/000827\ndata/0012/000828\ndata/0012/000829\ndata/0012/000830\ndata/0012/000831\ndata/0012/000832\ndata/0012/000833\ndata/0012/000834\ndata/0012/000835\ndata/0012/000836\ndata/0012/000837\ndata/0012/000838\ndata/0012/000839\ndata/0012/000840\ndata/0012/000841\ndata/0012/000842\ndata/0012/000843\ndata/0012/000844\ndata/0012/000845\ndata/0012/000846\ndata/0012/000847\ndata/0012/000848\ndata/0012/000849\ndata/0012/000850\ndata/0012/000851\ndata/0012/000852\ndata/0012/000853\ndata/0012/000854\ndata/0012/000855\ndata/0012/000856\ndata/0012/000857\ndata/0012/000858\ndata/0012/000859\ndata/0012/000860\ndata/0012/000861\ndata/0012/000862\ndata/0012/000863\ndata/0012/000864\ndata/0012/000865\ndata/0012/000866\ndata/0012/000867\ndata/0012/000868\ndata/0012/000869\ndata/0013/000001\ndata/0013/000002\ndata/0013/000003\ndata/0013/000004\ndata/0013/000005\ndata/0013/000006\ndata/0013/000007\ndata/0013/000008\ndata/0013/000009\ndata/0013/000010\ndata/0013/000011\ndata/0013/000012\ndata/0013/000013\ndata/0013/000014\ndata/0013/000015\ndata/0013/000016\ndata/0013/000017\ndata/0013/000018\ndata/0013/000019\ndata/0013/000020\ndata/0013/000021\ndata/0013/000022\ndata/0013/000023\ndata/0013/000024\ndata/0013/000025\ndata/0013/000026\ndata/0013/000027\ndata/0013/000028\ndata/0013/000029\ndata/0013/000030\ndata/0013/000031\ndata/0013/000032\ndata/0013/000033\ndata/0013/000034\ndata/0013/000035\ndata/0013/000036\ndata/0013/000037\ndata/0013/000038\ndata/0013/000039\ndata/0013/000040\ndata/0013/000041\ndata/0013/000042\ndata/0013/000043\ndata/0013/000044\ndata/0013/000045\ndata/0013/000046\ndata/0013/000047\ndata/0013/000048\ndata/0013/000049\ndata/0013/000050\ndata/0013/000051\ndata/0013/000052\ndata/0013/000053\ndata/0013/000054\ndata/0013/000055\ndata/0013/000056\ndata/0013/000057\ndata/0013/000058\ndata/0013/000059\ndata/0013/000060\ndata/0013/000061\ndata/0013/000062\ndata/0013/000063\ndata/0013/000064\ndata/0013/000065\ndata/0013/000066\ndata/0013/000067\ndata/0013/000068\ndata/0013/000069\ndata/0013/000070\ndata/0013/000071\ndata/0013/000072\ndata/0013/000073\ndata/0013/000074\ndata/0013/000075\ndata/0013/000076\ndata/0013/000077\ndata/0013/000078\ndata/0013/000079\ndata/0013/000080\ndata/0013/000081\ndata/0013/000082\ndata/0013/000083\ndata/0013/000084\ndata/0013/000085\ndata/0013/000086\ndata/0013/000087\ndata/0013/000088\ndata/0013/000089\ndata/0013/000090\ndata/0013/000091\ndata/0013/000092\ndata/0013/000093\ndata/0013/000094\ndata/0013/000095\ndata/0013/000096\ndata/0013/000097\ndata/0013/000098\ndata/0013/000099\ndata/0013/000100\ndata/0013/000101\ndata/0013/000102\ndata/0013/000103\ndata/0013/000104\ndata/0013/000105\ndata/0013/000106\ndata/0013/000107\ndata/0013/000108\ndata/0013/000109\ndata/0013/000110\ndata/0013/000111\ndata/0013/000112\ndata/0013/000113\ndata/0013/000114\ndata/0013/000115\ndata/0013/000116\ndata/0013/000117\ndata/0013/000118\ndata/0013/000119\ndata/0013/000120\ndata/0013/000121\ndata/0013/000122\ndata/0013/000123\ndata/0013/000124\ndata/0013/000125\ndata/0013/000126\ndata/0013/000127\ndata/0013/000128\ndata/0013/000129\ndata/0013/000130\ndata/0013/000131\ndata/0013/000132\ndata/0013/000133\ndata/0013/000134\ndata/0013/000135\ndata/0013/000136\ndata/0013/000137\ndata/0013/000138\ndata/0013/000139\ndata/0013/000140\ndata/0013/000141\ndata/0013/000142\ndata/0013/000143\ndata/0013/000144\ndata/0013/000145\ndata/0013/000146\ndata/0013/000147\ndata/0013/000148\ndata/0013/000149\ndata/0013/000150\ndata/0013/000151\ndata/0013/000152\ndata/0013/000153\ndata/0013/000154\ndata/0013/000155\ndata/0013/000156\ndata/0013/000157\ndata/0013/000158\ndata/0013/000159\ndata/0013/000160\ndata/0013/000161\ndata/0013/000162\ndata/0013/000163\ndata/0013/000164\ndata/0013/000165\ndata/0013/000166\ndata/0013/000167\ndata/0013/000168\ndata/0013/000169\ndata/0013/000170\ndata/0013/000171\ndata/0013/000172\ndata/0013/000173\ndata/0013/000174\ndata/0013/000175\ndata/0013/000176\ndata/0013/000177\ndata/0013/000178\ndata/0013/000179\ndata/0013/000180\ndata/0013/000181\ndata/0013/000182\ndata/0013/000183\ndata/0013/000184\ndata/0013/000185\ndata/0013/000186\ndata/0013/000187\ndata/0013/000188\ndata/0013/000189\ndata/0013/000190\ndata/0013/000191\ndata/0013/000192\ndata/0013/000193\ndata/0013/000194\ndata/0013/000195\ndata/0013/000196\ndata/0013/000197\ndata/0013/000198\ndata/0013/000199\ndata/0013/000200\ndata/0013/000201\ndata/0013/000202\ndata/0013/000203\ndata/0013/000204\ndata/0013/000205\ndata/0013/000206\ndata/0013/000207\ndata/0013/000208\ndata/0013/000209\ndata/0013/000210\ndata/0013/000211\ndata/0013/000212\ndata/0013/000213\ndata/0013/000214\ndata/0013/000215\ndata/0013/000216\ndata/0013/000217\ndata/0013/000218\ndata/0013/000219\ndata/0013/000220\ndata/0013/000221\ndata/0013/000222\ndata/0013/000223\ndata/0013/000224\ndata/0013/000225\ndata/0013/000226\ndata/0013/000227\ndata/0013/000228\ndata/0013/000229\ndata/0013/000230\ndata/0013/000231\ndata/0013/000232\ndata/0013/000233\ndata/0013/000234\ndata/0013/000235\ndata/0013/000236\ndata/0013/000237\ndata/0013/000238\ndata/0013/000239\ndata/0013/000240\ndata/0013/000241\ndata/0013/000242\ndata/0013/000243\ndata/0013/000244\ndata/0013/000245\ndata/0013/000246\ndata/0013/000247\ndata/0013/000248\ndata/0013/000249\ndata/0013/000250\ndata/0013/000251\ndata/0013/000252\ndata/0013/000253\ndata/0013/000254\ndata/0013/000255\ndata/0013/000256\ndata/0013/000257\ndata/0013/000258\ndata/0013/000259\ndata/0013/000260\ndata/0013/000261\ndata/0013/000262\ndata/0013/000263\ndata/0013/000264\ndata/0013/000265\ndata/0013/000266\ndata/0013/000267\ndata/0013/000268\ndata/0013/000269\ndata/0013/000270\ndata/0013/000271\ndata/0013/000272\ndata/0013/000273\ndata/0013/000274\ndata/0013/000275\ndata/0013/000276\ndata/0013/000277\ndata/0013/000278\ndata/0013/000279\ndata/0013/000280\ndata/0013/000281\ndata/0013/000282\ndata/0013/000283\ndata/0013/000284\ndata/0013/000285\ndata/0013/000286\ndata/0013/000287\ndata/0013/000288\ndata/0013/000289\ndata/0013/000290\ndata/0013/000291\ndata/0013/000292\ndata/0013/000293\ndata/0013/000294\ndata/0013/000295\ndata/0013/000296\ndata/0013/000297\ndata/0013/000298\ndata/0013/000299\ndata/0013/000300\ndata/0013/000301\ndata/0013/000302\ndata/0013/000303\ndata/0013/000304\ndata/0013/000305\ndata/0013/000306\ndata/0013/000307\ndata/0013/000308\ndata/0013/000309\ndata/0013/000310\ndata/0013/000311\ndata/0013/000312\ndata/0013/000313\ndata/0013/000314\ndata/0013/000315\ndata/0013/000316\ndata/0013/000317\ndata/0013/000318\ndata/0013/000319\ndata/0013/000320\ndata/0013/000321\ndata/0013/000322\ndata/0013/000323\ndata/0013/000324\ndata/0013/000325\ndata/0013/000326\ndata/0013/000327\ndata/0013/000328\ndata/0013/000329\ndata/0013/000330\ndata/0013/000331\ndata/0013/000332\ndata/0013/000333\ndata/0013/000334\ndata/0013/000335\ndata/0013/000336\ndata/0013/000337\ndata/0013/000338\ndata/0013/000339\ndata/0013/000340\ndata/0013/000341\ndata/0013/000342\ndata/0013/000343\ndata/0013/000344\ndata/0013/000345\ndata/0013/000346\ndata/0013/000347\ndata/0013/000348\ndata/0013/000349\ndata/0013/000350\ndata/0013/000351\ndata/0013/000352\ndata/0013/000353\ndata/0013/000354\ndata/0013/000355\ndata/0013/000356\ndata/0013/000357\ndata/0013/000358\ndata/0013/000359\ndata/0013/000360\ndata/0013/000361\ndata/0013/000362\ndata/0013/000363\ndata/0013/000364\ndata/0013/000365\ndata/0013/000366\ndata/0013/000367\ndata/0013/000368\ndata/0013/000369\ndata/0013/000370\ndata/0013/000371\ndata/0013/000372\ndata/0013/000373\ndata/0013/000374\ndata/0013/000375\ndata/0013/000376\ndata/0013/000377\ndata/0013/000378\ndata/0013/000379\ndata/0013/000380\ndata/0013/000381\ndata/0013/000382\ndata/0013/000383\ndata/0013/000384\ndata/0013/000385\ndata/0013/000386\ndata/0013/000387\ndata/0013/000388\ndata/0013/000389\ndata/0013/000390\ndata/0013/000391\ndata/0013/000392\ndata/0013/000393\ndata/0013/000394\ndata/0013/000395\ndata/0013/000396\ndata/0013/000397\ndata/0013/000398\ndata/0013/000399\ndata/0013/000400\ndata/0013/000401\ndata/0013/000402\ndata/0013/000403\ndata/0013/000404\ndata/0013/000405\ndata/0013/000406\ndata/0013/000407\ndata/0013/000408\ndata/0013/000409\ndata/0013/000410\ndata/0013/000411\ndata/0013/000412\ndata/0013/000413\ndata/0013/000414\ndata/0013/000415\ndata/0013/000416\ndata/0013/000417\ndata/0013/000418\ndata/0013/000419\ndata/0013/000420\ndata/0013/000421\ndata/0013/000422\ndata/0013/000423\ndata/0013/000424\ndata/0013/000425\ndata/0013/000426\ndata/0013/000427\ndata/0013/000428\ndata/0013/000429\ndata/0013/000430\ndata/0013/000431\ndata/0013/000432\ndata/0013/000433\ndata/0013/000434\ndata/0013/000435\ndata/0013/000436\ndata/0013/000437\ndata/0013/000438\ndata/0013/000439\ndata/0013/000440\ndata/0013/000441\ndata/0013/000442\ndata/0013/000443\ndata/0013/000444\ndata/0013/000445\ndata/0013/000446\ndata/0013/000447\ndata/0013/000448\ndata/0013/000449\ndata/0013/000450\ndata/0013/000451\ndata/0013/000452\ndata/0013/000453\ndata/0013/000454\ndata/0013/000455\ndata/0013/000456\ndata/0013/000457\ndata/0013/000458\ndata/0013/000459\ndata/0013/000460\ndata/0013/000461\ndata/0013/000462\ndata/0013/000463\ndata/0013/000464\ndata/0013/000465\ndata/0013/000466\ndata/0013/000467\ndata/0013/000468\ndata/0013/000469\ndata/0013/000470\ndata/0013/000471\ndata/0013/000472\ndata/0013/000473\ndata/0013/000474\ndata/0013/000475\ndata/0013/000476\ndata/0013/000477\ndata/0013/000478\ndata/0013/000479\ndata/0013/000480\ndata/0013/000481\ndata/0013/000482\ndata/0013/000483\ndata/0013/000484\ndata/0013/000485\ndata/0013/000486\ndata/0013/000487\ndata/0013/000488\ndata/0013/000489\ndata/0013/000490\ndata/0013/000491\ndata/0013/000492\ndata/0013/000493\ndata/0013/000494\ndata/0013/000495\ndata/0013/000496\ndata/0013/000497\ndata/0013/000498\ndata/0013/000499\ndata/0013/000500\ndata/0013/000501\ndata/0013/000502\ndata/0013/000503\ndata/0013/000504\ndata/0013/000505\ndata/0013/000506\ndata/0013/000507\ndata/0013/000508\ndata/0013/000509\ndata/0013/000510\ndata/0013/000511\ndata/0013/000512\ndata/0013/000513\ndata/0013/000514\ndata/0013/000515\ndata/0013/000516\ndata/0013/000517\ndata/0013/000518\ndata/0013/000519\ndata/0013/000520\ndata/0013/000521\ndata/0013/000522\ndata/0013/000523\ndata/0013/000524\ndata/0013/000525\ndata/0013/000526\ndata/0013/000527\ndata/0013/000528\ndata/0013/000529\ndata/0013/000530\ndata/0013/000531\ndata/0013/000532\ndata/0013/000533\ndata/0013/000534\ndata/0013/000535\ndata/0013/000536\ndata/0013/000537\ndata/0013/000538\ndata/0013/000539\ndata/0013/000540\ndata/0013/000541\ndata/0013/000542\ndata/0013/000543\ndata/0013/000544\ndata/0013/000545\ndata/0013/000546\ndata/0013/000547\ndata/0013/000548\ndata/0013/000549\ndata/0013/000550\ndata/0013/000551\ndata/0013/000552\ndata/0013/000553\ndata/0013/000554\ndata/0013/000555\ndata/0013/000556\ndata/0013/000557\ndata/0013/000558\ndata/0013/000559\ndata/0013/000560\ndata/0013/000561\ndata/0013/000562\ndata/0013/000563\ndata/0013/000564\ndata/0013/000565\ndata/0013/000566\ndata/0013/000567\ndata/0013/000568\ndata/0013/000569\ndata/0013/000570\ndata/0013/000571\ndata/0013/000572\ndata/0013/000573\ndata/0013/000574\ndata/0013/000575\ndata/0013/000576\ndata/0013/000577\ndata/0013/000578\ndata/0013/000579\ndata/0013/000580\ndata/0013/000581\ndata/0013/000582\ndata/0013/000583\ndata/0013/000584\ndata/0013/000585\ndata/0013/000586\ndata/0013/000587\ndata/0013/000588\ndata/0013/000589\ndata/0013/000590\ndata/0013/000591\ndata/0013/000592\ndata/0013/000593\ndata/0013/000594\ndata/0013/000595\ndata/0013/000596\ndata/0013/000597\ndata/0013/000598\ndata/0013/000599\ndata/0013/000600\ndata/0013/000601\ndata/0013/000602\ndata/0013/000603\ndata/0013/000604\ndata/0013/000605\ndata/0013/000606\ndata/0013/000607\ndata/0013/000608\ndata/0013/000609\ndata/0013/000610\ndata/0013/000611\ndata/0013/000612\ndata/0013/000613\ndata/0013/000614\ndata/0013/000615\ndata/0013/000616\ndata/0013/000617\ndata/0013/000618\ndata/0013/000619\ndata/0013/000620\ndata/0013/000621\ndata/0013/000622\ndata/0013/000623\ndata/0013/000624\ndata/0013/000625\ndata/0013/000626\ndata/0013/000627\ndata/0013/000628\ndata/0013/000629\ndata/0013/000630\ndata/0013/000631\ndata/0013/000632\ndata/0013/000633\ndata/0013/000634\ndata/0013/000635\ndata/0013/000636\ndata/0013/000637\ndata/0013/000638\ndata/0013/000639\ndata/0013/000640\ndata/0013/000641\ndata/0013/000642\ndata/0013/000643\ndata/0013/000644\ndata/0013/000645\ndata/0013/000646\ndata/0013/000647\ndata/0013/000648\ndata/0013/000649\ndata/0013/000650\ndata/0013/000651\ndata/0013/000652\ndata/0013/000653\ndata/0013/000654\ndata/0013/000655\ndata/0013/000656\ndata/0013/000657\ndata/0013/000658\ndata/0013/000659\ndata/0013/000660\ndata/0013/000661\ndata/0013/000662\ndata/0013/000663\ndata/0013/000664\ndata/0013/000665\ndata/0013/000666\ndata/0013/000667\ndata/0013/000668\ndata/0013/000669\ndata/0013/000670\ndata/0013/000671\ndata/0013/000672\ndata/0013/000673\ndata/0013/000674\ndata/0013/000675\ndata/0013/000676\ndata/0013/000677\ndata/0013/000678\ndata/0013/000679\ndata/0013/000680\ndata/0013/000681\ndata/0013/000682\ndata/0013/000683\ndata/0013/000684\ndata/0013/000685\ndata/0013/000686\ndata/0013/000687\ndata/0013/000688\ndata/0013/000689\ndata/0013/000690\ndata/0013/000691\ndata/0013/000692\ndata/0013/000693\ndata/0013/000694\ndata/0013/000695\ndata/0013/000696\ndata/0013/000697\ndata/0013/000698\ndata/0013/000699\ndata/0013/000700\ndata/0013/000701\ndata/0013/000702\ndata/0013/000703\ndata/0013/000704\ndata/0013/000705\ndata/0013/000706\ndata/0013/000707\ndata/0013/000708\ndata/0013/000709\ndata/0013/000710\ndata/0013/000711\ndata/0013/000712\ndata/0013/000713\ndata/0013/000714\ndata/0013/000715\ndata/0013/000716\ndata/0013/000717\ndata/0013/000718\ndata/0013/000719\ndata/0013/000720\ndata/0013/000721\ndata/0013/000722\ndata/0013/000723\ndata/0013/000724\ndata/0013/000725\ndata/0013/000726\ndata/0013/000727\ndata/0013/000728\ndata/0013/000729\ndata/0013/000730\ndata/0013/000731\ndata/0013/000732\ndata/0013/000733\ndata/0013/000734\ndata/0013/000735\ndata/0013/000736\ndata/0013/000737\ndata/0013/000738\ndata/0013/000739\ndata/0013/000740\ndata/0013/000741\ndata/0013/000742\ndata/0013/000743\ndata/0013/000744\ndata/0013/000745\ndata/0013/000746\ndata/0013/000747\ndata/0013/000748\ndata/0013/000749\ndata/0013/000750\ndata/0013/000751\ndata/0013/000752\ndata/0013/000753\ndata/0013/000754\ndata/0013/000755\ndata/0013/000756\ndata/0013/000757\ndata/0013/000758\ndata/0013/000759\ndata/0013/000760\ndata/0013/000761\ndata/0013/000762\ndata/0013/000763\ndata/0013/000764\ndata/0013/000765\ndata/0013/000766\ndata/0013/000767\ndata/0013/000768\ndata/0013/000769\ndata/0013/000770\ndata/0013/000771\ndata/0013/000772\ndata/0013/000773\ndata/0013/000774\ndata/0013/000775\ndata/0013/000776\ndata/0013/000777\ndata/0013/000778\ndata/0013/000779\ndata/0013/000780\ndata/0013/000781\ndata/0013/000782\ndata/0013/000783\ndata/0013/000784\ndata/0013/000785\ndata/0013/000786\ndata/0013/000787\ndata/0013/000788\ndata/0013/000789\ndata/0013/000790\ndata/0013/000791\ndata/0013/000792\ndata/0013/000793\ndata/0013/000794\ndata/0013/000795\ndata/0013/000796\ndata/0013/000797\ndata/0013/000798\ndata/0013/000799\ndata/0013/000800\ndata/0013/000801\ndata/0013/000802\ndata/0013/000803\ndata/0013/000804\ndata/0013/000805\ndata/0013/000806\ndata/0013/000807\ndata/0013/000808\ndata/0013/000809\ndata/0013/000810\ndata/0013/000811\ndata/0013/000812\ndata/0013/000813\ndata/0013/000814\ndata/0013/000815\ndata/0013/000816\ndata/0013/000817\ndata/0013/000818\ndata/0013/000819\ndata/0013/000820\ndata/0013/000821\ndata/0013/000822\ndata/0013/000823\ndata/0013/000824\ndata/0013/000825\ndata/0013/000826\ndata/0013/000827\ndata/0013/000828\ndata/0013/000829\ndata/0013/000830\ndata/0013/000831\ndata/0013/000832\ndata/0013/000833\ndata/0013/000834\ndata/0013/000835\ndata/0013/000836\ndata/0013/000837\ndata/0013/000838\ndata/0013/000839\ndata/0013/000840\ndata/0013/000841\ndata/0013/000842\ndata/0013/000843\ndata/0013/000844\ndata/0013/000845\ndata/0013/000846\ndata/0013/000847\ndata/0013/000848\ndata/0013/000849\ndata/0013/000850\ndata/0013/000851\ndata/0013/000852\ndata/0013/000853\ndata/0013/000854\ndata/0013/000855\ndata/0013/000856\ndata/0013/000857\ndata/0013/000858\ndata/0013/000859\ndata/0013/000860\ndata/0013/000861\ndata/0013/000862\ndata/0013/000863\ndata/0013/000864\ndata/0013/000865\ndata/0013/000866\ndata/0013/000867\ndata/0013/000868\ndata/0013/000869\ndata/0013/000870\ndata/0013/000871\ndata/0013/000872\ndata/0013/000873\ndata/0013/000874\ndata/0013/000875\ndata/0013/000876\ndata/0013/000877\ndata/0013/000878\ndata/0013/000879\ndata/0013/000880\ndata/0013/000881\ndata/0013/000882\ndata/0013/000883\ndata/0013/000884\ndata/0013/000885\ndata/0013/000886\ndata/0013/000887\ndata/0013/000888\ndata/0013/000889\ndata/0013/000890\ndata/0013/000891\ndata/0013/000892\ndata/0013/000893\ndata/0013/000894\ndata/0013/000895\ndata/0013/000896\ndata/0013/000897\ndata/0013/000898\ndata/0013/000899\ndata/0013/000900\ndata/0013/000901\ndata/0013/000902\ndata/0013/000903\ndata/0013/000904\ndata/0013/000905\ndata/0013/000906\ndata/0013/000907\ndata/0013/000908\ndata/0013/000909\ndata/0013/000910\ndata/0013/000911\ndata/0013/000912\ndata/0013/000913\ndata/0013/000914\ndata/0013/000915\ndata/0013/000916\ndata/0013/000917\ndata/0013/000918\ndata/0013/000919\ndata/0013/000920\ndata/0013/000921\ndata/0013/000922\ndata/0013/000923\ndata/0013/000924\ndata/0013/000925\ndata/0013/000926\ndata/0013/000927\ndata/0013/000928\ndata/0013/000929\ndata/0013/000930\ndata/0013/000931\ndata/0013/000932\ndata/0013/000933\ndata/0013/000934\ndata/0013/000935\ndata/0013/000936\ndata/0013/000937\ndata/0013/000938\ndata/0013/000939\ndata/0013/000940\ndata/0013/000941\ndata/0013/000942\ndata/0013/000943\ndata/0013/000944\ndata/0013/000945\ndata/0013/000946\ndata/0013/000947\ndata/0013/000948\ndata/0013/000949\ndata/0013/000950\ndata/0013/000951\ndata/0013/000952\ndata/0013/000953\ndata/0013/000954\ndata/0013/000955\ndata/0013/000956\ndata/0013/000957\ndata/0013/000958\ndata/0013/000959\ndata/0013/000960\ndata/0013/000961\ndata/0013/000962\ndata/0013/000963\ndata/0013/000964\ndata/0013/000965\ndata/0013/000966\ndata/0013/000967\ndata/0013/000968\ndata/0013/000969\ndata/0013/000970\ndata/0013/000971\ndata/0013/000972\ndata/0013/000973\ndata/0013/000974\ndata/0013/000975\ndata/0013/000976\ndata/0013/000977\ndata/0013/000978\ndata/0013/000979\ndata/0013/000980\ndata/0013/000981\ndata/0013/000982\ndata/0013/000983\ndata/0013/000984\ndata/0013/000985\ndata/0013/000986\ndata/0013/000987\ndata/0013/000988\ndata/0013/000989\ndata/0013/000990\ndata/0013/000991\ndata/0013/000992\ndata/0013/000993\ndata/0013/000994\ndata/0013/000995\ndata/0013/000996\ndata/0013/000997\ndata/0013/000998\ndata/0013/000999\ndata/0013/001000\ndata/0013/001001\ndata/0013/001002\ndata/0013/001003\ndata/0013/001004\ndata/0013/001005\ndata/0013/001006\ndata/0013/001007\ndata/0013/001008\ndata/0013/001009\ndata/0013/001010\ndata/0013/001011\ndata/0013/001012\ndata/0013/001013\ndata/0013/001014\ndata/0013/001015\ndata/0013/001016\ndata/0013/001017\ndata/0013/001018\ndata/0013/001019\ndata/0013/001020\ndata/0013/001021\ndata/0013/001022\ndata/0013/001023\ndata/0013/001024\ndata/0013/001025\ndata/0013/001026\ndata/0013/001027\ndata/0013/001028\ndata/0013/001029\ndata/0013/001030\ndata/0013/001031\ndata/0013/001032\ndata/0013/001033\ndata/0013/001034\ndata/0013/001035\ndata/0013/001036\ndata/0013/001037\ndata/0013/001038\ndata/0013/001039\ndata/0013/001040\ndata/0013/001041\ndata/0013/001042\ndata/0013/001043\ndata/0013/001044\ndata/0013/001045\ndata/0013/001046\ndata/0013/001047\ndata/0013/001048\ndata/0013/001049\ndata/0013/001050\ndata/0013/001051\ndata/0013/001052\ndata/0013/001053\ndata/0013/001054\ndata/0013/001055\ndata/0013/001056\ndata/0013/001057\ndata/0013/001058\ndata/0013/001059\ndata/0013/001060\ndata/0013/001061\ndata/0013/001062\ndata/0013/001063\ndata/0013/001064\ndata/0013/001065\ndata/0013/001066\ndata/0013/001067\ndata/0013/001068\ndata/0013/001069\ndata/0013/001070\ndata/0013/001071\ndata/0013/001072\ndata/0013/001073\ndata/0013/001074\ndata/0013/001075\ndata/0013/001076\ndata/0013/001077\ndata/0013/001078\ndata/0013/001079\ndata/0013/001080\ndata/0013/001081\ndata/0013/001082\ndata/0013/001083\ndata/0013/001084\ndata/0013/001085\ndata/0013/001086\ndata/0013/001087\ndata/0013/001088\ndata/0013/001089\ndata/0013/001090\ndata/0013/001091\ndata/0013/001092\ndata/0013/001093\ndata/0013/001094\ndata/0013/001095\ndata/0013/001096\ndata/0013/001097\ndata/0013/001098\ndata/0013/001099\ndata/0013/001100\ndata/0013/001101\ndata/0013/001102\ndata/0013/001103\ndata/0014/000001\ndata/0014/000002\ndata/0014/000003\ndata/0014/000004\ndata/0014/000005\ndata/0014/000006\ndata/0014/000007\ndata/0014/000008\ndata/0014/000009\ndata/0014/000010\ndata/0014/000011\ndata/0014/000012\ndata/0014/000013\ndata/0014/000014\ndata/0014/000015\ndata/0014/000016\ndata/0014/000017\ndata/0014/000018\ndata/0014/000019\ndata/0014/000020\ndata/0014/000021\ndata/0014/000022\ndata/0014/000023\ndata/0014/000024\ndata/0014/000025\ndata/0014/000026\ndata/0014/000027\ndata/0014/000028\ndata/0014/000029\ndata/0014/000030\ndata/0014/000031\ndata/0014/000032\ndata/0014/000033\ndata/0014/000034\ndata/0014/000035\ndata/0014/000036\ndata/0014/000037\ndata/0014/000038\ndata/0014/000039\ndata/0014/000040\ndata/0014/000041\ndata/0014/000042\ndata/0014/000043\ndata/0014/000044\ndata/0014/000045\ndata/0014/000046\ndata/0014/000047\ndata/0014/000048\ndata/0014/000049\ndata/0014/000050\ndata/0014/000051\ndata/0014/000052\ndata/0014/000053\ndata/0014/000054\ndata/0014/000055\ndata/0014/000056\ndata/0014/000057\ndata/0014/000058\ndata/0014/000059\ndata/0014/000060\ndata/0014/000061\ndata/0014/000062\ndata/0014/000063\ndata/0014/000064\ndata/0014/000065\ndata/0014/000066\ndata/0014/000067\ndata/0014/000068\ndata/0014/000069\ndata/0014/000070\ndata/0014/000071\ndata/0014/000072\ndata/0014/000073\ndata/0014/000074\ndata/0014/000075\ndata/0014/000076\ndata/0014/000077\ndata/0014/000078\ndata/0014/000079\ndata/0014/000080\ndata/0014/000081\ndata/0014/000082\ndata/0014/000083\ndata/0014/000084\ndata/0014/000085\ndata/0014/000086\ndata/0014/000087\ndata/0014/000088\ndata/0014/000089\ndata/0014/000090\ndata/0014/000091\ndata/0014/000092\ndata/0014/000093\ndata/0014/000094\ndata/0014/000095\ndata/0014/000096\ndata/0014/000097\ndata/0014/000098\ndata/0014/000099\ndata/0014/000100\ndata/0014/000101\ndata/0014/000102\ndata/0014/000103\ndata/0014/000104\ndata/0014/000105\ndata/0014/000106\ndata/0014/000107\ndata/0014/000108\ndata/0014/000109\ndata/0014/000110\ndata/0014/000111\ndata/0014/000112\ndata/0014/000113\ndata/0014/000114\ndata/0014/000115\ndata/0014/000116\ndata/0014/000117\ndata/0014/000118\ndata/0014/000119\ndata/0014/000120\ndata/0014/000121\ndata/0014/000122\ndata/0014/000123\ndata/0014/000124\ndata/0014/000125\ndata/0014/000126\ndata/0014/000127\ndata/0014/000128\ndata/0014/000129\ndata/0014/000130\ndata/0014/000131\ndata/0014/000132\ndata/0014/000133\ndata/0014/000134\ndata/0014/000135\ndata/0014/000136\ndata/0014/000137\ndata/0014/000138\ndata/0014/000139\ndata/0014/000140\ndata/0014/000141\ndata/0014/000142\ndata/0014/000143\ndata/0014/000144\ndata/0014/000145\ndata/0014/000146\ndata/0014/000147\ndata/0014/000148\ndata/0014/000149\ndata/0014/000150\ndata/0014/000151\ndata/0014/000152\ndata/0014/000153\ndata/0014/000154\ndata/0014/000155\ndata/0014/000156\ndata/0014/000157\ndata/0014/000158\ndata/0014/000159\ndata/0014/000160\ndata/0014/000161\ndata/0014/000162\ndata/0014/000163\ndata/0014/000164\ndata/0014/000165\ndata/0014/000166\ndata/0014/000167\ndata/0014/000168\ndata/0014/000169\ndata/0014/000170\ndata/0014/000171\ndata/0014/000172\ndata/0014/000173\ndata/0014/000174\ndata/0014/000175\ndata/0014/000176\ndata/0014/000177\ndata/0014/000178\ndata/0014/000179\ndata/0014/000180\ndata/0014/000181\ndata/0014/000182\ndata/0014/000183\ndata/0014/000184\ndata/0014/000185\ndata/0014/000186\ndata/0014/000187\ndata/0014/000188\ndata/0014/000189\ndata/0014/000190\ndata/0014/000191\ndata/0014/000192\ndata/0014/000193\ndata/0014/000194\ndata/0014/000195\ndata/0014/000196\ndata/0014/000197\ndata/0014/000198\ndata/0014/000199\ndata/0014/000200\ndata/0014/000201\ndata/0014/000202\ndata/0014/000203\ndata/0014/000204\ndata/0014/000205\ndata/0014/000206\ndata/0014/000207\ndata/0014/000208\ndata/0014/000209\ndata/0014/000210\ndata/0014/000211\ndata/0014/000212\ndata/0014/000213\ndata/0014/000214\ndata/0014/000215\ndata/0014/000216\ndata/0014/000217\ndata/0014/000218\ndata/0014/000219\ndata/0014/000220\ndata/0014/000221\ndata/0014/000222\ndata/0014/000223\ndata/0014/000224\ndata/0014/000225\ndata/0014/000226\ndata/0014/000227\ndata/0014/000228\ndata/0014/000229\ndata/0014/000230\ndata/0014/000231\ndata/0014/000232\ndata/0014/000233\ndata/0014/000234\ndata/0014/000235\ndata/0014/000236\ndata/0014/000237\ndata/0014/000238\ndata/0014/000239\ndata/0014/000240\ndata/0014/000241\ndata/0014/000242\ndata/0014/000243\ndata/0014/000244\ndata/0014/000245\ndata/0014/000246\ndata/0014/000247\ndata/0014/000248\ndata/0014/000249\ndata/0014/000250\ndata/0014/000251\ndata/0014/000252\ndata/0014/000253\ndata/0014/000254\ndata/0014/000255\ndata/0014/000256\ndata/0014/000257\ndata/0014/000258\ndata/0014/000259\ndata/0014/000260\ndata/0014/000261\ndata/0014/000262\ndata/0014/000263\ndata/0014/000264\ndata/0014/000265\ndata/0014/000266\ndata/0014/000267\ndata/0014/000268\ndata/0014/000269\ndata/0014/000270\ndata/0014/000271\ndata/0014/000272\ndata/0014/000273\ndata/0014/000274\ndata/0014/000275\ndata/0014/000276\ndata/0014/000277\ndata/0014/000278\ndata/0014/000279\ndata/0014/000280\ndata/0014/000281\ndata/0014/000282\ndata/0014/000283\ndata/0014/000284\ndata/0014/000285\ndata/0014/000286\ndata/0014/000287\ndata/0014/000288\ndata/0014/000289\ndata/0014/000290\ndata/0014/000291\ndata/0014/000292\ndata/0014/000293\ndata/0014/000294\ndata/0014/000295\ndata/0014/000296\ndata/0014/000297\ndata/0014/000298\ndata/0014/000299\ndata/0014/000300\ndata/0014/000301\ndata/0014/000302\ndata/0014/000303\ndata/0014/000304\ndata/0014/000305\ndata/0014/000306\ndata/0014/000307\ndata/0014/000308\ndata/0014/000309\ndata/0014/000310\ndata/0014/000311\ndata/0014/000312\ndata/0014/000313\ndata/0014/000314\ndata/0014/000315\ndata/0014/000316\ndata/0014/000317\ndata/0014/000318\ndata/0014/000319\ndata/0014/000320\ndata/0014/000321\ndata/0014/000322\ndata/0014/000323\ndata/0014/000324\ndata/0014/000325\ndata/0014/000326\ndata/0014/000327\ndata/0014/000328\ndata/0014/000329\ndata/0014/000330\ndata/0014/000331\ndata/0014/000332\ndata/0014/000333\ndata/0014/000334\ndata/0014/000335\ndata/0014/000336\ndata/0014/000337\ndata/0014/000338\ndata/0014/000339\ndata/0014/000340\ndata/0014/000341\ndata/0014/000342\ndata/0014/000343\ndata/0014/000344\ndata/0014/000345\ndata/0014/000346\ndata/0014/000347\ndata/0014/000348\ndata/0014/000349\ndata/0014/000350\ndata/0014/000351\ndata/0014/000352\ndata/0014/000353\ndata/0014/000354\ndata/0014/000355\ndata/0014/000356\ndata/0014/000357\ndata/0014/000358\ndata/0014/000359\ndata/0014/000360\ndata/0014/000361\ndata/0014/000362\ndata/0014/000363\ndata/0014/000364\ndata/0014/000365\ndata/0014/000366\ndata/0014/000367\ndata/0014/000368\ndata/0014/000369\ndata/0014/000370\ndata/0014/000371\ndata/0014/000372\ndata/0014/000373\ndata/0014/000374\ndata/0014/000375\ndata/0014/000376\ndata/0014/000377\ndata/0014/000378\ndata/0014/000379\ndata/0014/000380\ndata/0014/000381\ndata/0014/000382\ndata/0014/000383\ndata/0014/000384\ndata/0014/000385\ndata/0014/000386\ndata/0014/000387\ndata/0014/000388\ndata/0014/000389\ndata/0014/000390\ndata/0014/000391\ndata/0014/000392\ndata/0014/000393\ndata/0014/000394\ndata/0014/000395\ndata/0014/000396\ndata/0014/000397\ndata/0014/000398\ndata/0014/000399\ndata/0014/000400\ndata/0014/000401\ndata/0014/000402\ndata/0014/000403\ndata/0014/000404\ndata/0014/000405\ndata/0014/000406\ndata/0014/000407\ndata/0014/000408\ndata/0014/000409\ndata/0014/000410\ndata/0014/000411\ndata/0014/000412\ndata/0014/000413\ndata/0014/000414\ndata/0014/000415\ndata/0014/000416\ndata/0014/000417\ndata/0014/000418\ndata/0014/000419\ndata/0014/000420\ndata/0014/000421\ndata/0014/000422\ndata/0014/000423\ndata/0014/000424\ndata/0014/000425\ndata/0014/000426\ndata/0014/000427\ndata/0014/000428\ndata/0014/000429\ndata/0014/000430\ndata/0014/000431\ndata/0014/000432\ndata/0014/000433\ndata/0014/000434\ndata/0014/000435\ndata/0014/000436\ndata/0014/000437\ndata/0014/000438\ndata/0014/000439\ndata/0014/000440\ndata/0014/000441\ndata/0014/000442\ndata/0014/000443\ndata/0014/000444\ndata/0014/000445\ndata/0014/000446\ndata/0014/000447\ndata/0014/000448\ndata/0014/000449\ndata/0014/000450\ndata/0014/000451\ndata/0014/000452\ndata/0014/000453\ndata/0014/000454\ndata/0014/000455\ndata/0014/000456\ndata/0014/000457\ndata/0014/000458\ndata/0014/000459\ndata/0014/000460\ndata/0014/000461\ndata/0014/000462\ndata/0014/000463\ndata/0014/000464\ndata/0014/000465\ndata/0014/000466\ndata/0014/000467\ndata/0014/000468\ndata/0014/000469\ndata/0014/000470\ndata/0014/000471\ndata/0014/000472\ndata/0014/000473\ndata/0014/000474\ndata/0014/000475\ndata/0014/000476\ndata/0014/000477\ndata/0014/000478\ndata/0014/000479\ndata/0014/000480\ndata/0014/000481\ndata/0014/000482\ndata/0014/000483\ndata/0014/000484\ndata/0014/000485\ndata/0014/000486\ndata/0014/000487\ndata/0014/000488\ndata/0014/000489\ndata/0014/000490\ndata/0014/000491\ndata/0014/000492\ndata/0014/000493\ndata/0014/000494\ndata/0014/000495\ndata/0014/000496\ndata/0014/000497\ndata/0014/000498\ndata/0014/000499\ndata/0014/000500\ndata/0014/000501\ndata/0014/000502\ndata/0014/000503\ndata/0014/000504\ndata/0014/000505\ndata/0014/000506\ndata/0014/000507\ndata/0014/000508\ndata/0014/000509\ndata/0014/000510\ndata/0014/000511\ndata/0014/000512\ndata/0014/000513\ndata/0014/000514\ndata/0014/000515\ndata/0014/000516\ndata/0014/000517\ndata/0014/000518\ndata/0014/000519\ndata/0014/000520\ndata/0014/000521\ndata/0014/000522\ndata/0014/000523\ndata/0014/000524\ndata/0014/000525\ndata/0014/000526\ndata/0014/000527\ndata/0014/000528\ndata/0014/000529\ndata/0014/000530\ndata/0014/000531\ndata/0014/000532\ndata/0014/000533\ndata/0014/000534\ndata/0014/000535\ndata/0014/000536\ndata/0014/000537\ndata/0014/000538\ndata/0014/000539\ndata/0014/000540\ndata/0014/000541\ndata/0014/000542\ndata/0014/000543\ndata/0014/000544\ndata/0014/000545\ndata/0014/000546\ndata/0014/000547\ndata/0014/000548\ndata/0014/000549\ndata/0014/000550\ndata/0014/000551\ndata/0014/000552\ndata/0014/000553\ndata/0014/000554\ndata/0014/000555\ndata/0014/000556\ndata/0014/000557\ndata/0014/000558\ndata/0014/000559\ndata/0014/000560\ndata/0014/000561\ndata/0014/000562\ndata/0014/000563\ndata/0014/000564\ndata/0014/000565\ndata/0014/000566\ndata/0014/000567\ndata/0014/000568\ndata/0014/000569\ndata/0014/000570\ndata/0014/000571\ndata/0014/000572\ndata/0014/000573\ndata/0014/000574\ndata/0014/000575\ndata/0014/000576\ndata/0014/000577\ndata/0014/000578\ndata/0014/000579\ndata/0014/000580\ndata/0014/000581\ndata/0014/000582\ndata/0014/000583\ndata/0014/000584\ndata/0014/000585\ndata/0014/000586\ndata/0014/000587\ndata/0014/000588\ndata/0014/000589\ndata/0014/000590\ndata/0014/000591\ndata/0014/000592\ndata/0014/000593\ndata/0014/000594\ndata/0014/000595\ndata/0014/000596\ndata/0014/000597\ndata/0014/000598\ndata/0014/000599\ndata/0014/000600\ndata/0014/000601\ndata/0014/000602\ndata/0014/000603\ndata/0014/000604\ndata/0014/000605\ndata/0014/000606\ndata/0014/000607\ndata/0014/000608\ndata/0014/000609\ndata/0014/000610\ndata/0014/000611\ndata/0014/000612\ndata/0014/000613\ndata/0014/000614\ndata/0014/000615\ndata/0014/000616\ndata/0014/000617\ndata/0014/000618\ndata/0014/000619\ndata/0014/000620\ndata/0014/000621\ndata/0014/000622\ndata/0014/000623\ndata/0014/000624\ndata/0014/000625\ndata/0014/000626\ndata/0014/000627\ndata/0014/000628\ndata/0014/000629\ndata/0014/000630\ndata/0014/000631\ndata/0014/000632\ndata/0014/000633\ndata/0014/000634\ndata/0014/000635\ndata/0014/000636\ndata/0014/000637\ndata/0014/000638\ndata/0014/000639\ndata/0014/000640\ndata/0014/000641\ndata/0014/000642\ndata/0014/000643\ndata/0014/000644\ndata/0014/000645\ndata/0014/000646\ndata/0014/000647\ndata/0014/000648\ndata/0014/000649\ndata/0014/000650\ndata/0014/000651\ndata/0014/000652\ndata/0014/000653\ndata/0014/000654\ndata/0014/000655\ndata/0014/000656\ndata/0014/000657\ndata/0014/000658\ndata/0014/000659\ndata/0014/000660\ndata/0014/000661\ndata/0014/000662\ndata/0014/000663\ndata/0014/000664\ndata/0014/000665\ndata/0014/000666\ndata/0014/000667\ndata/0014/000668\ndata/0014/000669\ndata/0014/000670\ndata/0014/000671\ndata/0014/000672\ndata/0014/000673\ndata/0014/000674\ndata/0014/000675\ndata/0014/000676\ndata/0014/000677\ndata/0014/000678\ndata/0014/000679\ndata/0014/000680\ndata/0014/000681\ndata/0014/000682\ndata/0014/000683\ndata/0014/000684\ndata/0014/000685\ndata/0014/000686\ndata/0014/000687\ndata/0014/000688\ndata/0014/000689\ndata/0014/000690\ndata/0014/000691\ndata/0014/000692\ndata/0014/000693\ndata/0014/000694\ndata/0014/000695\ndata/0014/000696\ndata/0014/000697\ndata/0014/000698\ndata/0014/000699\ndata/0014/000700\ndata/0014/000701\ndata/0014/000702\ndata/0014/000703\ndata/0014/000704\ndata/0014/000705\ndata/0014/000706\ndata/0014/000707\ndata/0014/000708\ndata/0014/000709\ndata/0014/000710\ndata/0014/000711\ndata/0014/000712\ndata/0014/000713\ndata/0014/000714\ndata/0014/000715\ndata/0014/000716\ndata/0014/000717\ndata/0014/000718\ndata/0014/000719\ndata/0014/000720\ndata/0014/000721\ndata/0014/000722\ndata/0014/000723\ndata/0014/000724\ndata/0014/000725\ndata/0014/000726\ndata/0014/000727\ndata/0014/000728\ndata/0014/000729\ndata/0014/000730\ndata/0014/000731\ndata/0014/000732\ndata/0014/000733\ndata/0014/000734\ndata/0014/000735\ndata/0014/000736\ndata/0014/000737\ndata/0014/000738\ndata/0014/000739\ndata/0014/000740\ndata/0014/000741\ndata/0014/000742\ndata/0014/000743\ndata/0014/000744\ndata/0014/000745\ndata/0014/000746\ndata/0014/000747\ndata/0014/000748\ndata/0014/000749\ndata/0014/000750\ndata/0014/000751\ndata/0014/000752\ndata/0014/000753\ndata/0014/000754\ndata/0014/000755\ndata/0014/000756\ndata/0014/000757\ndata/0014/000758\ndata/0014/000759\ndata/0014/000760\ndata/0014/000761\ndata/0014/000762\ndata/0014/000763\ndata/0014/000764\ndata/0014/000765\ndata/0014/000766\ndata/0014/000767\ndata/0014/000768\ndata/0014/000769\ndata/0014/000770\ndata/0014/000771\ndata/0014/000772\ndata/0014/000773\ndata/0014/000774\ndata/0014/000775\ndata/0014/000776\ndata/0014/000777\ndata/0014/000778\ndata/0014/000779\ndata/0014/000780\ndata/0014/000781\ndata/0014/000782\ndata/0014/000783\ndata/0014/000784\ndata/0014/000785\ndata/0014/000786\ndata/0014/000787\ndata/0014/000788\ndata/0014/000789\ndata/0014/000790\ndata/0014/000791\ndata/0014/000792\ndata/0014/000793\ndata/0014/000794\ndata/0014/000795\ndata/0014/000796\ndata/0014/000797\ndata/0014/000798\ndata/0014/000799\ndata/0014/000800\ndata/0014/000801\ndata/0014/000802\ndata/0014/000803\ndata/0014/000804\ndata/0014/000805\ndata/0014/000806\ndata/0014/000807\ndata/0014/000808\ndata/0014/000809\ndata/0014/000810\ndata/0014/000811\ndata/0014/000812\ndata/0014/000813\ndata/0014/000814\ndata/0014/000815\ndata/0014/000816\ndata/0014/000817\ndata/0014/000818\ndata/0014/000819\ndata/0014/000820\ndata/0014/000821\ndata/0014/000822\ndata/0014/000823\ndata/0014/000824\ndata/0014/000825\ndata/0014/000826\ndata/0014/000827\ndata/0014/000828\ndata/0014/000829\ndata/0014/000830\ndata/0014/000831\ndata/0014/000832\ndata/0014/000833\ndata/0014/000834\ndata/0014/000835\ndata/0014/000836\ndata/0014/000837\ndata/0014/000838\ndata/0014/000839\ndata/0014/000840\ndata/0014/000841\ndata/0014/000842\ndata/0014/000843\ndata/0014/000844\ndata/0014/000845\ndata/0014/000846\ndata/0014/000847\ndata/0014/000848\ndata/0014/000849\ndata/0014/000850\ndata/0014/000851\ndata/0014/000852\ndata/0014/000853\ndata/0014/000854\ndata/0014/000855\ndata/0014/000856\ndata/0014/000857\ndata/0014/000858\ndata/0014/000859\ndata/0014/000860\ndata/0014/000861\ndata/0014/000862\ndata/0014/000863\ndata/0014/000864\ndata/0014/000865\ndata/0014/000866\ndata/0014/000867\ndata/0014/000868\ndata/0014/000869\ndata/0014/000870\ndata/0014/000871\ndata/0014/000872\ndata/0014/000873\ndata/0014/000874\ndata/0014/000875\ndata/0014/000876\ndata/0014/000877\ndata/0014/000878\ndata/0014/000879\ndata/0014/000880\ndata/0014/000881\ndata/0014/000882\ndata/0014/000883\ndata/0014/000884\ndata/0014/000885\ndata/0014/000886\ndata/0014/000887\ndata/0014/000888\ndata/0014/000889\ndata/0014/000890\ndata/0014/000891\ndata/0014/000892\ndata/0014/000893\ndata/0014/000894\ndata/0014/000895\ndata/0014/000896\ndata/0014/000897\ndata/0014/000898\ndata/0014/000899\ndata/0014/000900\ndata/0014/000901\ndata/0014/000902\ndata/0014/000903\ndata/0014/000904\ndata/0014/000905\ndata/0014/000906\ndata/0014/000907\ndata/0014/000908\ndata/0014/000909\ndata/0014/000910\ndata/0014/000911\ndata/0014/000912\ndata/0014/000913\ndata/0014/000914\ndata/0014/000915\ndata/0014/000916\ndata/0014/000917\ndata/0014/000918\ndata/0014/000919\ndata/0014/000920\ndata/0014/000921\ndata/0014/000922\ndata/0014/000923\ndata/0014/000924\ndata/0014/000925\ndata/0014/000926\ndata/0014/000927\ndata/0014/000928\ndata/0014/000929\ndata/0014/000930\ndata/0014/000931\ndata/0014/000932\ndata/0014/000933\ndata/0014/000934\ndata/0014/000935\ndata/0014/000936\ndata/0014/000937\ndata/0014/000938\ndata/0014/000939\ndata/0014/000940\ndata/0014/000941\ndata/0014/000942\ndata/0014/000943\ndata/0014/000944\ndata/0014/000945\ndata/0014/000946\ndata/0014/000947\ndata/0014/000948\ndata/0014/000949\ndata/0014/000950\ndata/0014/000951\ndata/0014/000952\ndata/0014/000953\ndata/0014/000954\ndata/0014/000955\ndata/0014/000956\ndata/0014/000957\ndata/0014/000958\ndata/0014/000959\ndata/0014/000960\ndata/0014/000961\ndata/0014/000962\ndata/0014/000963\ndata/0014/000964\ndata/0014/000965\ndata/0014/000966\ndata/0014/000967\ndata/0014/000968\ndata/0014/000969\ndata/0014/000970\ndata/0014/000971\ndata/0014/000972\ndata/0014/000973\ndata/0014/000974\ndata/0014/000975\ndata/0014/000976\ndata/0014/000977\ndata/0014/000978\ndata/0014/000979\ndata/0014/000980\ndata/0014/000981\ndata/0014/000982\ndata/0014/000983\ndata/0014/000984\ndata/0014/000985\ndata/0014/000986\ndata/0014/000987\ndata/0014/000988\ndata/0014/000989\ndata/0014/000990\ndata/0014/000991\ndata/0014/000992\ndata/0014/000993\ndata/0014/000994\ndata/0014/000995\ndata/0014/000996\ndata/0014/000997\ndata/0014/000998\ndata/0014/000999\ndata/0014/001000\ndata/0014/001001\ndata/0014/001002\ndata/0014/001003\ndata/0014/001004\ndata/0014/001005\ndata/0014/001006\ndata/0014/001007\ndata/0014/001008\ndata/0014/001009\ndata/0014/001010\ndata/0014/001011\ndata/0014/001012\ndata/0014/001013\ndata/0014/001014\ndata/0014/001015\ndata/0014/001016\ndata/0014/001017\ndata/0014/001018\ndata/0014/001019\ndata/0014/001020\ndata/0014/001021\ndata/0014/001022\ndata/0014/001023\ndata/0014/001024\ndata/0014/001025\ndata/0014/001026\ndata/0014/001027\ndata/0014/001028\ndata/0014/001029\ndata/0014/001030\ndata/0014/001031\ndata/0014/001032\ndata/0014/001033\ndata/0014/001034\ndata/0014/001035\ndata/0014/001036\ndata/0014/001037\ndata/0014/001038\ndata/0014/001039\ndata/0014/001040\ndata/0014/001041\ndata/0014/001042\ndata/0014/001043\ndata/0014/001044\ndata/0014/001045\ndata/0014/001046\ndata/0014/001047\ndata/0014/001048\ndata/0014/001049\ndata/0014/001050\ndata/0014/001051\ndata/0014/001052\ndata/0014/001053\ndata/0014/001054\ndata/0014/001055\ndata/0014/001056\ndata/0014/001057\ndata/0014/001058\ndata/0014/001059\ndata/0014/001060\ndata/0014/001061\ndata/0014/001062\ndata/0014/001063\ndata/0014/001064\ndata/0015/000001\ndata/0015/000002\ndata/0015/000003\ndata/0015/000004\ndata/0015/000005\ndata/0015/000006\ndata/0015/000007\ndata/0015/000008\ndata/0015/000009\ndata/0015/000010\ndata/0015/000011\ndata/0015/000012\ndata/0015/000013\ndata/0015/000014\ndata/0015/000015\ndata/0015/000016\ndata/0015/000017\ndata/0015/000018\ndata/0015/000019\ndata/0015/000020\ndata/0015/000021\ndata/0015/000022\ndata/0015/000023\ndata/0015/000024\ndata/0015/000025\ndata/0015/000026\ndata/0015/000027\ndata/0015/000028\ndata/0015/000029\ndata/0015/000030\ndata/0015/000031\ndata/0015/000032\ndata/0015/000033\ndata/0015/000034\ndata/0015/000035\ndata/0015/000036\ndata/0015/000037\ndata/0015/000038\ndata/0015/000039\ndata/0015/000040\ndata/0015/000041\ndata/0015/000042\ndata/0015/000043\ndata/0015/000044\ndata/0015/000045\ndata/0015/000046\ndata/0015/000047\ndata/0015/000048\ndata/0015/000049\ndata/0015/000050\ndata/0015/000051\ndata/0015/000052\ndata/0015/000053\ndata/0015/000054\ndata/0015/000055\ndata/0015/000056\ndata/0015/000057\ndata/0015/000058\ndata/0015/000059\ndata/0015/000060\ndata/0015/000061\ndata/0015/000062\ndata/0015/000063\ndata/0015/000064\ndata/0015/000065\ndata/0015/000066\ndata/0015/000067\ndata/0015/000068\ndata/0015/000069\ndata/0015/000070\ndata/0015/000071\ndata/0015/000072\ndata/0015/000073\ndata/0015/000074\ndata/0015/000075\ndata/0015/000076\ndata/0015/000077\ndata/0015/000078\ndata/0015/000079\ndata/0015/000080\ndata/0015/000081\ndata/0015/000082\ndata/0015/000083\ndata/0015/000084\ndata/0015/000085\ndata/0015/000086\ndata/0015/000087\ndata/0015/000088\ndata/0015/000089\ndata/0015/000090\ndata/0015/000091\ndata/0015/000092\ndata/0015/000093\ndata/0015/000094\ndata/0015/000095\ndata/0015/000096\ndata/0015/000097\ndata/0015/000098\ndata/0015/000099\ndata/0015/000100\ndata/0015/000101\ndata/0015/000102\ndata/0015/000103\ndata/0015/000104\ndata/0015/000105\ndata/0015/000106\ndata/0015/000107\ndata/0015/000108\ndata/0015/000109\ndata/0015/000110\ndata/0015/000111\ndata/0015/000112\ndata/0015/000113\ndata/0015/000114\ndata/0015/000115\ndata/0015/000116\ndata/0015/000117\ndata/0015/000118\ndata/0015/000119\ndata/0015/000120\ndata/0015/000121\ndata/0015/000122\ndata/0015/000123\ndata/0015/000124\ndata/0015/000125\ndata/0015/000126\ndata/0015/000127\ndata/0015/000128\ndata/0015/000129\ndata/0015/000130\ndata/0015/000131\ndata/0015/000132\ndata/0015/000133\ndata/0015/000134\ndata/0015/000135\ndata/0015/000136\ndata/0015/000137\ndata/0015/000138\ndata/0015/000139\ndata/0015/000140\ndata/0015/000141\ndata/0015/000142\ndata/0015/000143\ndata/0015/000144\ndata/0015/000145\ndata/0015/000146\ndata/0015/000147\ndata/0015/000148\ndata/0015/000149\ndata/0015/000150\ndata/0015/000151\ndata/0015/000152\ndata/0015/000153\ndata/0015/000154\ndata/0015/000155\ndata/0015/000156\ndata/0015/000157\ndata/0015/000158\ndata/0015/000159\ndata/0015/000160\ndata/0015/000161\ndata/0015/000162\ndata/0015/000163\ndata/0015/000164\ndata/0015/000165\ndata/0015/000166\ndata/0015/000167\ndata/0015/000168\ndata/0015/000169\ndata/0015/000170\ndata/0015/000171\ndata/0015/000172\ndata/0015/000173\ndata/0015/000174\ndata/0015/000175\ndata/0015/000176\ndata/0015/000177\ndata/0015/000178\ndata/0015/000179\ndata/0015/000180\ndata/0015/000181\ndata/0015/000182\ndata/0015/000183\ndata/0015/000184\ndata/0015/000185\ndata/0015/000186\ndata/0015/000187\ndata/0015/000188\ndata/0015/000189\ndata/0015/000190\ndata/0015/000191\ndata/0015/000192\ndata/0015/000193\ndata/0015/000194\ndata/0015/000195\ndata/0015/000196\ndata/0015/000197\ndata/0015/000198\ndata/0015/000199\ndata/0015/000200\ndata/0015/000201\ndata/0015/000202\ndata/0015/000203\ndata/0015/000204\ndata/0015/000205\ndata/0015/000206\ndata/0015/000207\ndata/0015/000208\ndata/0015/000209\ndata/0015/000210\ndata/0015/000211\ndata/0015/000212\ndata/0015/000213\ndata/0015/000214\ndata/0015/000215\ndata/0015/000216\ndata/0015/000217\ndata/0015/000218\ndata/0015/000219\ndata/0015/000220\ndata/0015/000221\ndata/0015/000222\ndata/0015/000223\ndata/0015/000224\ndata/0015/000225\ndata/0015/000226\ndata/0015/000227\ndata/0015/000228\ndata/0015/000229\ndata/0015/000230\ndata/0015/000231\ndata/0015/000232\ndata/0015/000233\ndata/0015/000234\ndata/0015/000235\ndata/0015/000236\ndata/0015/000237\ndata/0015/000238\ndata/0015/000239\ndata/0015/000240\ndata/0015/000241\ndata/0015/000242\ndata/0015/000243\ndata/0015/000244\ndata/0015/000245\ndata/0015/000246\ndata/0015/000247\ndata/0015/000248\ndata/0015/000249\ndata/0015/000250\ndata/0015/000251\ndata/0015/000252\ndata/0015/000253\ndata/0015/000254\ndata/0015/000255\ndata/0015/000256\ndata/0015/000257\ndata/0015/000258\ndata/0015/000259\ndata/0015/000260\ndata/0015/000261\ndata/0015/000262\ndata/0015/000263\ndata/0015/000264\ndata/0015/000265\ndata/0015/000266\ndata/0015/000267\ndata/0015/000268\ndata/0015/000269\ndata/0015/000270\ndata/0015/000271\ndata/0015/000272\ndata/0015/000273\ndata/0015/000274\ndata/0015/000275\ndata/0015/000276\ndata/0015/000277\ndata/0015/000278\ndata/0015/000279\ndata/0015/000280\ndata/0015/000281\ndata/0015/000282\ndata/0015/000283\ndata/0015/000284\ndata/0015/000285\ndata/0015/000286\ndata/0015/000287\ndata/0015/000288\ndata/0015/000289\ndata/0015/000290\ndata/0015/000291\ndata/0015/000292\ndata/0015/000293\ndata/0015/000294\ndata/0015/000295\ndata/0015/000296\ndata/0015/000297\ndata/0015/000298\ndata/0015/000299\ndata/0015/000300\ndata/0015/000301\ndata/0015/000302\ndata/0015/000303\ndata/0015/000304\ndata/0015/000305\ndata/0015/000306\ndata/0015/000307\ndata/0015/000308\ndata/0015/000309\ndata/0015/000310\ndata/0015/000311\ndata/0015/000312\ndata/0015/000313\ndata/0015/000314\ndata/0015/000315\ndata/0015/000316\ndata/0015/000317\ndata/0015/000318\ndata/0015/000319\ndata/0015/000320\ndata/0015/000321\ndata/0015/000322\ndata/0015/000323\ndata/0015/000324\ndata/0015/000325\ndata/0015/000326\ndata/0015/000327\ndata/0015/000328\ndata/0015/000329\ndata/0015/000330\ndata/0015/000331\ndata/0015/000332\ndata/0015/000333\ndata/0015/000334\ndata/0015/000335\ndata/0015/000336\ndata/0015/000337\ndata/0015/000338\ndata/0015/000339\ndata/0015/000340\ndata/0015/000341\ndata/0015/000342\ndata/0015/000343\ndata/0015/000344\ndata/0015/000345\ndata/0015/000346\ndata/0015/000347\ndata/0015/000348\ndata/0015/000349\ndata/0015/000350\ndata/0015/000351\ndata/0015/000352\ndata/0015/000353\ndata/0015/000354\ndata/0015/000355\ndata/0015/000356\ndata/0015/000357\ndata/0015/000358\ndata/0015/000359\ndata/0015/000360\ndata/0015/000361\ndata/0015/000362\ndata/0015/000363\ndata/0015/000364\ndata/0015/000365\ndata/0015/000366\ndata/0015/000367\ndata/0015/000368\ndata/0015/000369\ndata/0015/000370\ndata/0015/000371\ndata/0015/000372\ndata/0015/000373\ndata/0015/000374\ndata/0015/000375\ndata/0015/000376\ndata/0015/000377\ndata/0015/000378\ndata/0015/000379\ndata/0015/000380\ndata/0015/000381\ndata/0015/000382\ndata/0015/000383\ndata/0015/000384\ndata/0015/000385\ndata/0015/000386\ndata/0015/000387\ndata/0015/000388\ndata/0015/000389\ndata/0015/000390\ndata/0015/000391\ndata/0015/000392\ndata/0015/000393\ndata/0015/000394\ndata/0015/000395\ndata/0015/000396\ndata/0015/000397\ndata/0015/000398\ndata/0015/000399\ndata/0015/000400\ndata/0015/000401\ndata/0015/000402\ndata/0015/000403\ndata/0015/000404\ndata/0015/000405\ndata/0015/000406\ndata/0015/000407\ndata/0015/000408\ndata/0015/000409\ndata/0015/000410\ndata/0015/000411\ndata/0015/000412\ndata/0015/000413\ndata/0015/000414\ndata/0015/000415\ndata/0015/000416\ndata/0015/000417\ndata/0015/000418\ndata/0015/000419\ndata/0015/000420\ndata/0015/000421\ndata/0015/000422\ndata/0015/000423\ndata/0015/000424\ndata/0015/000425\ndata/0015/000426\ndata/0015/000427\ndata/0015/000428\ndata/0015/000429\ndata/0015/000430\ndata/0015/000431\ndata/0015/000432\ndata/0015/000433\ndata/0015/000434\ndata/0015/000435\ndata/0015/000436\ndata/0015/000437\ndata/0015/000438\ndata/0015/000439\ndata/0015/000440\ndata/0015/000441\ndata/0015/000442\ndata/0015/000443\ndata/0015/000444\ndata/0015/000445\ndata/0015/000446\ndata/0015/000447\ndata/0015/000448\ndata/0015/000449\ndata/0015/000450\ndata/0015/000451\ndata/0015/000452\ndata/0015/000453\ndata/0015/000454\ndata/0015/000455\ndata/0015/000456\ndata/0015/000457\ndata/0015/000458\ndata/0015/000459\ndata/0015/000460\ndata/0015/000461\ndata/0015/000462\ndata/0015/000463\ndata/0015/000464\ndata/0015/000465\ndata/0015/000466\ndata/0015/000467\ndata/0015/000468\ndata/0015/000469\ndata/0015/000470\ndata/0015/000471\ndata/0015/000472\ndata/0015/000473\ndata/0015/000474\ndata/0015/000475\ndata/0015/000476\ndata/0015/000477\ndata/0015/000478\ndata/0015/000479\ndata/0015/000480\ndata/0015/000481\ndata/0015/000482\ndata/0015/000483\ndata/0015/000484\ndata/0015/000485\ndata/0015/000486\ndata/0015/000487\ndata/0015/000488\ndata/0015/000489\ndata/0015/000490\ndata/0015/000491\ndata/0015/000492\ndata/0015/000493\ndata/0015/000494\ndata/0015/000495\ndata/0015/000496\ndata/0015/000497\ndata/0015/000498\ndata/0015/000499\ndata/0015/000500\ndata/0015/000501\ndata/0015/000502\ndata/0015/000503\ndata/0015/000504\ndata/0015/000505\ndata/0015/000506\ndata/0015/000507\ndata/0015/000508\ndata/0015/000509\ndata/0015/000510\ndata/0015/000511\ndata/0015/000512\ndata/0015/000513\ndata/0015/000514\ndata/0015/000515\ndata/0015/000516\ndata/0015/000517\ndata/0015/000518\ndata/0015/000519\ndata/0015/000520\ndata/0015/000521\ndata/0015/000522\ndata/0015/000523\ndata/0015/000524\ndata/0015/000525\ndata/0015/000526\ndata/0015/000527\ndata/0015/000528\ndata/0015/000529\ndata/0015/000530\ndata/0015/000531\ndata/0015/000532\ndata/0015/000533\ndata/0015/000534\ndata/0015/000535\ndata/0015/000536\ndata/0015/000537\ndata/0015/000538\ndata/0015/000539\ndata/0015/000540\ndata/0015/000541\ndata/0015/000542\ndata/0015/000543\ndata/0015/000544\ndata/0015/000545\ndata/0015/000546\ndata/0015/000547\ndata/0015/000548\ndata/0015/000549\ndata/0015/000550\ndata/0015/000551\ndata/0015/000552\ndata/0015/000553\ndata/0015/000554\ndata/0015/000555\ndata/0015/000556\ndata/0015/000557\ndata/0015/000558\ndata/0015/000559\ndata/0015/000560\ndata/0015/000561\ndata/0015/000562\ndata/0015/000563\ndata/0015/000564\ndata/0015/000565\ndata/0015/000566\ndata/0015/000567\ndata/0015/000568\ndata/0015/000569\ndata/0015/000570\ndata/0015/000571\ndata/0015/000572\ndata/0015/000573\ndata/0015/000574\ndata/0015/000575\ndata/0015/000576\ndata/0015/000577\ndata/0015/000578\ndata/0015/000579\ndata/0015/000580\ndata/0015/000581\ndata/0015/000582\ndata/0015/000583\ndata/0015/000584\ndata/0015/000585\ndata/0015/000586\ndata/0015/000587\ndata/0015/000588\ndata/0015/000589\ndata/0015/000590\ndata/0015/000591\ndata/0015/000592\ndata/0015/000593\ndata/0015/000594\ndata/0015/000595\ndata/0015/000596\ndata/0015/000597\ndata/0015/000598\ndata/0015/000599\ndata/0015/000600\ndata/0015/000601\ndata/0015/000602\ndata/0015/000603\ndata/0015/000604\ndata/0015/000605\ndata/0015/000606\ndata/0015/000607\ndata/0015/000608\ndata/0015/000609\ndata/0015/000610\ndata/0015/000611\ndata/0015/000612\ndata/0015/000613\ndata/0015/000614\ndata/0015/000615\ndata/0015/000616\ndata/0015/000617\ndata/0015/000618\ndata/0015/000619\ndata/0015/000620\ndata/0015/000621\ndata/0015/000622\ndata/0015/000623\ndata/0015/000624\ndata/0015/000625\ndata/0015/000626\ndata/0015/000627\ndata/0015/000628\ndata/0015/000629\ndata/0015/000630\ndata/0015/000631\ndata/0015/000632\ndata/0015/000633\ndata/0015/000634\ndata/0015/000635\ndata/0015/000636\ndata/0015/000637\ndata/0015/000638\ndata/0015/000639\ndata/0015/000640\ndata/0015/000641\ndata/0015/000642\ndata/0015/000643\ndata/0015/000644\ndata/0015/000645\ndata/0015/000646\ndata/0015/000647\ndata/0015/000648\ndata/0015/000649\ndata/0015/000650\ndata/0015/000651\ndata/0015/000652\ndata/0015/000653\ndata/0015/000654\ndata/0015/000655\ndata/0015/000656\ndata/0015/000657\ndata/0015/000658\ndata/0015/000659\ndata/0015/000660\ndata/0015/000661\ndata/0015/000662\ndata/0015/000663\ndata/0015/000664\ndata/0015/000665\ndata/0015/000666\ndata/0015/000667\ndata/0015/000668\ndata/0015/000669\ndata/0015/000670\ndata/0015/000671\ndata/0015/000672\ndata/0015/000673\ndata/0015/000674\ndata/0015/000675\ndata/0015/000676\ndata/0015/000677\ndata/0015/000678\ndata/0015/000679\ndata/0015/000680\ndata/0015/000681\ndata/0015/000682\ndata/0015/000683\ndata/0015/000684\ndata/0015/000685\ndata/0015/000686\ndata/0015/000687\ndata/0015/000688\ndata/0015/000689\ndata/0015/000690\ndata/0015/000691\ndata/0015/000692\ndata/0015/000693\ndata/0015/000694\ndata/0015/000695\ndata/0015/000696\ndata/0015/000697\ndata/0015/000698\ndata/0015/000699\ndata/0015/000700\ndata/0015/000701\ndata/0015/000702\ndata/0015/000703\ndata/0015/000704\ndata/0015/000705\ndata/0015/000706\ndata/0015/000707\ndata/0015/000708\ndata/0015/000709\ndata/0015/000710\ndata/0015/000711\ndata/0015/000712\ndata/0015/000713\ndata/0015/000714\ndata/0015/000715\ndata/0015/000716\ndata/0015/000717\ndata/0015/000718\ndata/0015/000719\ndata/0015/000720\ndata/0015/000721\ndata/0015/000722\ndata/0015/000723\ndata/0015/000724\ndata/0015/000725\ndata/0015/000726\ndata/0015/000727\ndata/0015/000728\ndata/0015/000729\ndata/0015/000730\ndata/0015/000731\ndata/0015/000732\ndata/0015/000733\ndata/0015/000734\ndata/0015/000735\ndata/0015/000736\ndata/0015/000737\ndata/0015/000738\ndata/0015/000739\ndata/0015/000740\ndata/0015/000741\ndata/0015/000742\ndata/0015/000743\ndata/0015/000744\ndata/0015/000745\ndata/0015/000746\ndata/0015/000747\ndata/0015/000748\ndata/0015/000749\ndata/0015/000750\ndata/0015/000751\ndata/0015/000752\ndata/0015/000753\ndata/0015/000754\ndata/0015/000755\ndata/0015/000756\ndata/0015/000757\ndata/0015/000758\ndata/0015/000759\ndata/0015/000760\ndata/0015/000761\ndata/0015/000762\ndata/0015/000763\ndata/0015/000764\ndata/0015/000765\ndata/0015/000766\ndata/0015/000767\ndata/0015/000768\ndata/0015/000769\ndata/0015/000770\ndata/0015/000771\ndata/0015/000772\ndata/0015/000773\ndata/0015/000774\ndata/0015/000775\ndata/0015/000776\ndata/0015/000777\ndata/0015/000778\ndata/0015/000779\ndata/0015/000780\ndata/0015/000781\ndata/0015/000782\ndata/0015/000783\ndata/0015/000784\ndata/0015/000785\ndata/0015/000786\ndata/0015/000787\ndata/0015/000788\ndata/0015/000789\ndata/0015/000790\ndata/0015/000791\ndata/0015/000792\ndata/0015/000793\ndata/0015/000794\ndata/0015/000795\ndata/0015/000796\ndata/0015/000797\ndata/0015/000798\ndata/0015/000799\ndata/0015/000800\ndata/0015/000801\ndata/0015/000802\ndata/0015/000803\ndata/0015/000804\ndata/0015/000805\ndata/0015/000806\ndata/0015/000807\ndata/0015/000808\ndata/0015/000809\ndata/0015/000810\ndata/0015/000811\ndata/0015/000812\ndata/0015/000813\ndata/0015/000814\ndata/0015/000815\ndata/0015/000816\ndata/0015/000817\ndata/0015/000818\ndata/0015/000819\ndata/0015/000820\ndata/0015/000821\ndata/0015/000822\ndata/0015/000823\ndata/0015/000824\ndata/0015/000825\ndata/0015/000826\ndata/0015/000827\ndata/0015/000828\ndata/0015/000829\ndata/0015/000830\ndata/0015/000831\ndata/0015/000832\ndata/0015/000833\ndata/0015/000834\ndata/0015/000835\ndata/0015/000836\ndata/0015/000837\ndata/0015/000838\ndata/0015/000839\ndata/0015/000840\ndata/0015/000841\ndata/0015/000842\ndata/0015/000843\ndata/0015/000844\ndata/0015/000845\ndata/0015/000846\ndata/0015/000847\ndata/0015/000848\ndata/0015/000849\ndata/0015/000850\ndata/0015/000851\ndata/0015/000852\ndata/0015/000853\ndata/0015/000854\ndata/0015/000855\ndata/0015/000856\ndata/0015/000857\ndata/0015/000858\ndata/0015/000859\ndata/0015/000860\ndata/0015/000861\ndata/0015/000862\ndata/0015/000863\ndata/0015/000864\ndata/0015/000865\ndata/0015/000866\ndata/0015/000867\ndata/0015/000868\ndata/0015/000869\ndata/0015/000870\ndata/0015/000871\ndata/0015/000872\ndata/0015/000873\ndata/0015/000874\ndata/0015/000875\ndata/0015/000876\ndata/0015/000877\ndata/0015/000878\ndata/0015/000879\ndata/0015/000880\ndata/0015/000881\ndata/0015/000882\ndata/0015/000883\ndata/0015/000884\ndata/0015/000885\ndata/0015/000886\ndata/0015/000887\ndata/0015/000888\ndata/0015/000889\ndata/0015/000890\ndata/0015/000891\ndata/0015/000892\ndata/0015/000893\ndata/0015/000894\ndata/0015/000895\ndata/0015/000896\ndata/0015/000897\ndata/0015/000898\ndata/0015/000899\ndata/0015/000900\ndata/0015/000901\ndata/0015/000902\ndata/0015/000903\ndata/0015/000904\ndata/0015/000905\ndata/0015/000906\ndata/0015/000907\ndata/0015/000908\ndata/0015/000909\ndata/0015/000910\ndata/0015/000911\ndata/0015/000912\ndata/0015/000913\ndata/0015/000914\ndata/0015/000915\ndata/0015/000916\ndata/0015/000917\ndata/0015/000918\ndata/0015/000919\ndata/0015/000920\ndata/0015/000921\ndata/0015/000922\ndata/0015/000923\ndata/0015/000924\ndata/0015/000925\ndata/0015/000926\ndata/0015/000927\ndata/0015/000928\ndata/0015/000929\ndata/0015/000930\ndata/0015/000931\ndata/0015/000932\ndata/0015/000933\ndata/0015/000934\ndata/0015/000935\ndata/0015/000936\ndata/0015/000937\ndata/0015/000938\ndata/0015/000939\ndata/0015/000940\ndata/0015/000941\ndata/0015/000942\ndata/0015/000943\ndata/0015/000944\ndata/0015/000945\ndata/0015/000946\ndata/0015/000947\ndata/0015/000948\ndata/0015/000949\ndata/0015/000950\ndata/0015/000951\ndata/0015/000952\ndata/0015/000953\ndata/0015/000954\ndata/0015/000955\ndata/0015/000956\ndata/0015/000957\ndata/0015/000958\ndata/0015/000959\ndata/0015/000960\ndata/0015/000961\ndata/0015/000962\ndata/0015/000963\ndata/0015/000964\ndata/0015/000965\ndata/0016/000001\ndata/0016/000002\ndata/0016/000003\ndata/0016/000004\ndata/0016/000005\ndata/0016/000006\ndata/0016/000007\ndata/0016/000008\ndata/0016/000009\ndata/0016/000010\ndata/0016/000011\ndata/0016/000012\ndata/0016/000013\ndata/0016/000014\ndata/0016/000015\ndata/0016/000016\ndata/0016/000017\ndata/0016/000018\ndata/0016/000019\ndata/0016/000020\ndata/0016/000021\ndata/0016/000022\ndata/0016/000023\ndata/0016/000024\ndata/0016/000025\ndata/0016/000026\ndata/0016/000027\ndata/0016/000028\ndata/0016/000029\ndata/0016/000030\ndata/0016/000031\ndata/0016/000032\ndata/0016/000033\ndata/0016/000034\ndata/0016/000035\ndata/0016/000036\ndata/0016/000037\ndata/0016/000038\ndata/0016/000039\ndata/0016/000040\ndata/0016/000041\ndata/0016/000042\ndata/0016/000043\ndata/0016/000044\ndata/0016/000045\ndata/0016/000046\ndata/0016/000047\ndata/0016/000048\ndata/0016/000049\ndata/0016/000050\ndata/0016/000051\ndata/0016/000052\ndata/0016/000053\ndata/0016/000054\ndata/0016/000055\ndata/0016/000056\ndata/0016/000057\ndata/0016/000058\ndata/0016/000059\ndata/0016/000060\ndata/0016/000061\ndata/0016/000062\ndata/0016/000063\ndata/0016/000064\ndata/0016/000065\ndata/0016/000066\ndata/0016/000067\ndata/0016/000068\ndata/0016/000069\ndata/0016/000070\ndata/0016/000071\ndata/0016/000072\ndata/0016/000073\ndata/0016/000074\ndata/0016/000075\ndata/0016/000076\ndata/0016/000077\ndata/0016/000078\ndata/0016/000079\ndata/0016/000080\ndata/0016/000081\ndata/0016/000082\ndata/0016/000083\ndata/0016/000084\ndata/0016/000085\ndata/0016/000086\ndata/0016/000087\ndata/0016/000088\ndata/0016/000089\ndata/0016/000090\ndata/0016/000091\ndata/0016/000092\ndata/0016/000093\ndata/0016/000094\ndata/0016/000095\ndata/0016/000096\ndata/0016/000097\ndata/0016/000098\ndata/0016/000099\ndata/0016/000100\ndata/0016/000101\ndata/0016/000102\ndata/0016/000103\ndata/0016/000104\ndata/0016/000105\ndata/0016/000106\ndata/0016/000107\ndata/0016/000108\ndata/0016/000109\ndata/0016/000110\ndata/0016/000111\ndata/0016/000112\ndata/0016/000113\ndata/0016/000114\ndata/0016/000115\ndata/0016/000116\ndata/0016/000117\ndata/0016/000118\ndata/0016/000119\ndata/0016/000120\ndata/0016/000121\ndata/0016/000122\ndata/0016/000123\ndata/0016/000124\ndata/0016/000125\ndata/0016/000126\ndata/0016/000127\ndata/0016/000128\ndata/0016/000129\ndata/0016/000130\ndata/0016/000131\ndata/0016/000132\ndata/0016/000133\ndata/0016/000134\ndata/0016/000135\ndata/0016/000136\ndata/0016/000137\ndata/0016/000138\ndata/0016/000139\ndata/0016/000140\ndata/0016/000141\ndata/0016/000142\ndata/0016/000143\ndata/0016/000144\ndata/0016/000145\ndata/0016/000146\ndata/0016/000147\ndata/0016/000148\ndata/0016/000149\ndata/0016/000150\ndata/0016/000151\ndata/0016/000152\ndata/0016/000153\ndata/0016/000154\ndata/0016/000155\ndata/0016/000156\ndata/0016/000157\ndata/0016/000158\ndata/0016/000159\ndata/0016/000160\ndata/0016/000161\ndata/0016/000162\ndata/0016/000163\ndata/0016/000164\ndata/0016/000165\ndata/0016/000166\ndata/0016/000167\ndata/0016/000168\ndata/0016/000169\ndata/0016/000170\ndata/0016/000171\ndata/0016/000172\ndata/0016/000173\ndata/0016/000174\ndata/0016/000175\ndata/0016/000176\ndata/0016/000177\ndata/0016/000178\ndata/0016/000179\ndata/0016/000180\ndata/0016/000181\ndata/0016/000182\ndata/0016/000183\ndata/0016/000184\ndata/0016/000185\ndata/0016/000186\ndata/0016/000187\ndata/0016/000188\ndata/0016/000189\ndata/0016/000190\ndata/0016/000191\ndata/0016/000192\ndata/0016/000193\ndata/0016/000194\ndata/0016/000195\ndata/0016/000196\ndata/0016/000197\ndata/0016/000198\ndata/0016/000199\ndata/0016/000200\ndata/0016/000201\ndata/0016/000202\ndata/0016/000203\ndata/0016/000204\ndata/0016/000205\ndata/0016/000206\ndata/0016/000207\ndata/0016/000208\ndata/0016/000209\ndata/0016/000210\ndata/0016/000211\ndata/0016/000212\ndata/0016/000213\ndata/0016/000214\ndata/0016/000215\ndata/0016/000216\ndata/0016/000217\ndata/0016/000218\ndata/0016/000219\ndata/0016/000220\ndata/0016/000221\ndata/0016/000222\ndata/0016/000223\ndata/0016/000224\ndata/0016/000225\ndata/0016/000226\ndata/0016/000227\ndata/0016/000228\ndata/0016/000229\ndata/0016/000230\ndata/0016/000231\ndata/0016/000232\ndata/0016/000233\ndata/0016/000234\ndata/0016/000235\ndata/0016/000236\ndata/0016/000237\ndata/0016/000238\ndata/0016/000239\ndata/0016/000240\ndata/0016/000241\ndata/0016/000242\ndata/0016/000243\ndata/0016/000244\ndata/0016/000245\ndata/0016/000246\ndata/0016/000247\ndata/0016/000248\ndata/0016/000249\ndata/0016/000250\ndata/0016/000251\ndata/0016/000252\ndata/0016/000253\ndata/0016/000254\ndata/0016/000255\ndata/0016/000256\ndata/0016/000257\ndata/0016/000258\ndata/0016/000259\ndata/0016/000260\ndata/0016/000261\ndata/0016/000262\ndata/0016/000263\ndata/0016/000264\ndata/0016/000265\ndata/0016/000266\ndata/0016/000267\ndata/0016/000268\ndata/0016/000269\ndata/0016/000270\ndata/0016/000271\ndata/0016/000272\ndata/0016/000273\ndata/0016/000274\ndata/0016/000275\ndata/0016/000276\ndata/0016/000277\ndata/0016/000278\ndata/0016/000279\ndata/0016/000280\ndata/0016/000281\ndata/0016/000282\ndata/0016/000283\ndata/0016/000284\ndata/0016/000285\ndata/0016/000286\ndata/0016/000287\ndata/0016/000288\ndata/0016/000289\ndata/0016/000290\ndata/0016/000291\ndata/0016/000292\ndata/0016/000293\ndata/0016/000294\ndata/0016/000295\ndata/0016/000296\ndata/0016/000297\ndata/0016/000298\ndata/0016/000299\ndata/0016/000300\ndata/0016/000301\ndata/0016/000302\ndata/0016/000303\ndata/0016/000304\ndata/0016/000305\ndata/0016/000306\ndata/0016/000307\ndata/0016/000308\ndata/0016/000309\ndata/0016/000310\ndata/0016/000311\ndata/0016/000312\ndata/0016/000313\ndata/0016/000314\ndata/0016/000315\ndata/0016/000316\ndata/0016/000317\ndata/0016/000318\ndata/0016/000319\ndata/0016/000320\ndata/0016/000321\ndata/0016/000322\ndata/0016/000323\ndata/0016/000324\ndata/0016/000325\ndata/0016/000326\ndata/0016/000327\ndata/0016/000328\ndata/0016/000329\ndata/0016/000330\ndata/0016/000331\ndata/0016/000332\ndata/0016/000333\ndata/0016/000334\ndata/0016/000335\ndata/0016/000336\ndata/0016/000337\ndata/0016/000338\ndata/0016/000339\ndata/0016/000340\ndata/0016/000341\ndata/0016/000342\ndata/0016/000343\ndata/0016/000344\ndata/0016/000345\ndata/0016/000346\ndata/0016/000347\ndata/0016/000348\ndata/0016/000349\ndata/0016/000350\ndata/0016/000351\ndata/0016/000352\ndata/0016/000353\ndata/0016/000354\ndata/0016/000355\ndata/0016/000356\ndata/0016/000357\ndata/0016/000358\ndata/0016/000359\ndata/0016/000360\ndata/0016/000361\ndata/0016/000362\ndata/0016/000363\ndata/0016/000364\ndata/0016/000365\ndata/0016/000366\ndata/0016/000367\ndata/0016/000368\ndata/0016/000369\ndata/0016/000370\ndata/0016/000371\ndata/0016/000372\ndata/0016/000373\ndata/0016/000374\ndata/0016/000375\ndata/0016/000376\ndata/0016/000377\ndata/0016/000378\ndata/0016/000379\ndata/0016/000380\ndata/0016/000381\ndata/0016/000382\ndata/0016/000383\ndata/0016/000384\ndata/0016/000385\ndata/0016/000386\ndata/0016/000387\ndata/0016/000388\ndata/0016/000389\ndata/0016/000390\ndata/0016/000391\ndata/0016/000392\ndata/0016/000393\ndata/0016/000394\ndata/0016/000395\ndata/0016/000396\ndata/0016/000397\ndata/0016/000398\ndata/0016/000399\ndata/0016/000400\ndata/0016/000401\ndata/0016/000402\ndata/0016/000403\ndata/0016/000404\ndata/0016/000405\ndata/0016/000406\ndata/0016/000407\ndata/0016/000408\ndata/0016/000409\ndata/0016/000410\ndata/0016/000411\ndata/0016/000412\ndata/0016/000413\ndata/0016/000414\ndata/0016/000415\ndata/0016/000416\ndata/0016/000417\ndata/0016/000418\ndata/0016/000419\ndata/0016/000420\ndata/0016/000421\ndata/0016/000422\ndata/0016/000423\ndata/0016/000424\ndata/0016/000425\ndata/0016/000426\ndata/0016/000427\ndata/0016/000428\ndata/0016/000429\ndata/0016/000430\ndata/0016/000431\ndata/0016/000432\ndata/0016/000433\ndata/0016/000434\ndata/0016/000435\ndata/0016/000436\ndata/0016/000437\ndata/0016/000438\ndata/0016/000439\ndata/0016/000440\ndata/0016/000441\ndata/0016/000442\ndata/0016/000443\ndata/0016/000444\ndata/0016/000445\ndata/0016/000446\ndata/0016/000447\ndata/0016/000448\ndata/0016/000449\ndata/0016/000450\ndata/0016/000451\ndata/0016/000452\ndata/0016/000453\ndata/0016/000454\ndata/0016/000455\ndata/0016/000456\ndata/0016/000457\ndata/0016/000458\ndata/0016/000459\ndata/0016/000460\ndata/0016/000461\ndata/0016/000462\ndata/0016/000463\ndata/0016/000464\ndata/0016/000465\ndata/0016/000466\ndata/0016/000467\ndata/0016/000468\ndata/0016/000469\ndata/0016/000470\ndata/0016/000471\ndata/0016/000472\ndata/0016/000473\ndata/0016/000474\ndata/0016/000475\ndata/0016/000476\ndata/0016/000477\ndata/0016/000478\ndata/0016/000479\ndata/0016/000480\ndata/0016/000481\ndata/0016/000482\ndata/0016/000483\ndata/0016/000484\ndata/0016/000485\ndata/0016/000486\ndata/0016/000487\ndata/0016/000488\ndata/0016/000489\ndata/0016/000490\ndata/0016/000491\ndata/0016/000492\ndata/0016/000493\ndata/0016/000494\ndata/0016/000495\ndata/0016/000496\ndata/0016/000497\ndata/0016/000498\ndata/0016/000499\ndata/0016/000500\ndata/0016/000501\ndata/0016/000502\ndata/0016/000503\ndata/0016/000504\ndata/0016/000505\ndata/0016/000506\ndata/0016/000507\ndata/0016/000508\ndata/0016/000509\ndata/0016/000510\ndata/0016/000511\ndata/0016/000512\ndata/0016/000513\ndata/0016/000514\ndata/0016/000515\ndata/0016/000516\ndata/0016/000517\ndata/0016/000518\ndata/0016/000519\ndata/0016/000520\ndata/0016/000521\ndata/0016/000522\ndata/0016/000523\ndata/0016/000524\ndata/0016/000525\ndata/0016/000526\ndata/0016/000527\ndata/0016/000528\ndata/0016/000529\ndata/0016/000530\ndata/0016/000531\ndata/0016/000532\ndata/0016/000533\ndata/0016/000534\ndata/0016/000535\ndata/0016/000536\ndata/0016/000537\ndata/0016/000538\ndata/0016/000539\ndata/0016/000540\ndata/0016/000541\ndata/0016/000542\ndata/0016/000543\ndata/0016/000544\ndata/0016/000545\ndata/0016/000546\ndata/0016/000547\ndata/0016/000548\ndata/0016/000549\ndata/0016/000550\ndata/0016/000551\ndata/0016/000552\ndata/0016/000553\ndata/0016/000554\ndata/0016/000555\ndata/0016/000556\ndata/0016/000557\ndata/0016/000558\ndata/0016/000559\ndata/0016/000560\ndata/0016/000561\ndata/0016/000562\ndata/0016/000563\ndata/0016/000564\ndata/0016/000565\ndata/0016/000566\ndata/0016/000567\ndata/0016/000568\ndata/0016/000569\ndata/0016/000570\ndata/0016/000571\ndata/0016/000572\ndata/0016/000573\ndata/0016/000574\ndata/0016/000575\ndata/0016/000576\ndata/0016/000577\ndata/0016/000578\ndata/0016/000579\ndata/0016/000580\ndata/0016/000581\ndata/0016/000582\ndata/0016/000583\ndata/0016/000584\ndata/0016/000585\ndata/0016/000586\ndata/0016/000587\ndata/0016/000588\ndata/0016/000589\ndata/0016/000590\ndata/0016/000591\ndata/0016/000592\ndata/0016/000593\ndata/0016/000594\ndata/0016/000595\ndata/0016/000596\ndata/0016/000597\ndata/0016/000598\ndata/0016/000599\ndata/0016/000600\ndata/0016/000601\ndata/0016/000602\ndata/0016/000603\ndata/0016/000604\ndata/0016/000605\ndata/0016/000606\ndata/0016/000607\ndata/0016/000608\ndata/0016/000609\ndata/0016/000610\ndata/0016/000611\ndata/0016/000612\ndata/0016/000613\ndata/0016/000614\ndata/0016/000615\ndata/0016/000616\ndata/0016/000617\ndata/0016/000618\ndata/0016/000619\ndata/0016/000620\ndata/0016/000621\ndata/0016/000622\ndata/0016/000623\ndata/0016/000624\ndata/0016/000625\ndata/0016/000626\ndata/0016/000627\ndata/0016/000628\ndata/0016/000629\ndata/0016/000630\ndata/0016/000631\ndata/0016/000632\ndata/0016/000633\ndata/0016/000634\ndata/0016/000635\ndata/0016/000636\ndata/0016/000637\ndata/0016/000638\ndata/0016/000639\ndata/0016/000640\ndata/0016/000641\ndata/0016/000642\ndata/0016/000643\ndata/0016/000644\ndata/0016/000645\ndata/0016/000646\ndata/0016/000647\ndata/0016/000648\ndata/0016/000649\ndata/0016/000650\ndata/0016/000651\ndata/0016/000652\ndata/0016/000653\ndata/0016/000654\ndata/0016/000655\ndata/0016/000656\ndata/0016/000657\ndata/0016/000658\ndata/0016/000659\ndata/0016/000660\ndata/0016/000661\ndata/0016/000662\ndata/0016/000663\ndata/0016/000664\ndata/0016/000665\ndata/0016/000666\ndata/0016/000667\ndata/0016/000668\ndata/0016/000669\ndata/0016/000670\ndata/0016/000671\ndata/0016/000672\ndata/0016/000673\ndata/0016/000674\ndata/0016/000675\ndata/0016/000676\ndata/0016/000677\ndata/0016/000678\ndata/0016/000679\ndata/0016/000680\ndata/0016/000681\ndata/0016/000682\ndata/0016/000683\ndata/0016/000684\ndata/0016/000685\ndata/0016/000686\ndata/0016/000687\ndata/0016/000688\ndata/0016/000689\ndata/0016/000690\ndata/0016/000691\ndata/0016/000692\ndata/0016/000693\ndata/0016/000694\ndata/0016/000695\ndata/0016/000696\ndata/0016/000697\ndata/0016/000698\ndata/0016/000699\ndata/0016/000700\ndata/0016/000701\ndata/0016/000702\ndata/0016/000703\ndata/0016/000704\ndata/0016/000705\ndata/0016/000706\ndata/0016/000707\ndata/0016/000708\ndata/0016/000709\ndata/0016/000710\ndata/0016/000711\ndata/0016/000712\ndata/0016/000713\ndata/0016/000714\ndata/0016/000715\ndata/0016/000716\ndata/0016/000717\ndata/0016/000718\ndata/0016/000719\ndata/0016/000720\ndata/0016/000721\ndata/0016/000722\ndata/0016/000723\ndata/0016/000724\ndata/0016/000725\ndata/0016/000726\ndata/0016/000727\ndata/0016/000728\ndata/0016/000729\ndata/0016/000730\ndata/0016/000731\ndata/0016/000732\ndata/0016/000733\ndata/0016/000734\ndata/0016/000735\ndata/0016/000736\ndata/0016/000737\ndata/0016/000738\ndata/0016/000739\ndata/0016/000740\ndata/0016/000741\ndata/0016/000742\ndata/0016/000743\ndata/0016/000744\ndata/0016/000745\ndata/0016/000746\ndata/0016/000747\ndata/0016/000748\ndata/0016/000749\ndata/0016/000750\ndata/0016/000751\ndata/0016/000752\ndata/0016/000753\ndata/0016/000754\ndata/0016/000755\ndata/0016/000756\ndata/0016/000757\ndata/0016/000758\ndata/0016/000759\ndata/0016/000760\ndata/0016/000761\ndata/0016/000762\ndata/0016/000763\ndata/0016/000764\ndata/0016/000765\ndata/0016/000766\ndata/0016/000767\ndata/0016/000768\ndata/0016/000769\ndata/0016/000770\ndata/0016/000771\ndata/0016/000772\ndata/0016/000773\ndata/0016/000774\ndata/0016/000775\ndata/0016/000776\ndata/0016/000777\ndata/0016/000778\ndata/0016/000779\ndata/0016/000780\ndata/0016/000781\ndata/0016/000782\ndata/0016/000783\ndata/0016/000784\ndata/0016/000785\ndata/0016/000786\ndata/0016/000787\ndata/0016/000788\ndata/0016/000789\ndata/0016/000790\ndata/0016/000791\ndata/0016/000792\ndata/0016/000793\ndata/0016/000794\ndata/0016/000795\ndata/0016/000796\ndata/0016/000797\ndata/0016/000798\ndata/0016/000799\ndata/0016/000800\ndata/0016/000801\ndata/0016/000802\ndata/0016/000803\ndata/0016/000804\ndata/0016/000805\ndata/0016/000806\ndata/0016/000807\ndata/0016/000808\ndata/0016/000809\ndata/0016/000810\ndata/0016/000811\ndata/0016/000812\ndata/0016/000813\ndata/0016/000814\ndata/0016/000815\ndata/0016/000816\ndata/0016/000817\ndata/0016/000818\ndata/0016/000819\ndata/0016/000820\ndata/0016/000821\ndata/0016/000822\ndata/0016/000823\ndata/0016/000824\ndata/0016/000825\ndata/0016/000826\ndata/0016/000827\ndata/0016/000828\ndata/0016/000829\ndata/0016/000830\ndata/0016/000831\ndata/0016/000832\ndata/0016/000833\ndata/0016/000834\ndata/0016/000835\ndata/0016/000836\ndata/0016/000837\ndata/0016/000838\ndata/0016/000839\ndata/0016/000840\ndata/0016/000841\ndata/0016/000842\ndata/0016/000843\ndata/0016/000844\ndata/0016/000845\ndata/0016/000846\ndata/0016/000847\ndata/0016/000848\ndata/0016/000849\ndata/0016/000850\ndata/0016/000851\ndata/0016/000852\ndata/0016/000853\ndata/0016/000854\ndata/0016/000855\ndata/0016/000856\ndata/0016/000857\ndata/0016/000858\ndata/0016/000859\ndata/0016/000860\ndata/0016/000861\ndata/0016/000862\ndata/0016/000863\ndata/0016/000864\ndata/0016/000865\ndata/0016/000866\ndata/0016/000867\ndata/0016/000868\ndata/0016/000869\ndata/0016/000870\ndata/0016/000871\ndata/0016/000872\ndata/0016/000873\ndata/0016/000874\ndata/0016/000875\ndata/0016/000876\ndata/0016/000877\ndata/0016/000878\ndata/0016/000879\ndata/0016/000880\ndata/0016/000881\ndata/0016/000882\ndata/0016/000883\ndata/0016/000884\ndata/0016/000885\ndata/0016/000886\ndata/0016/000887\ndata/0016/000888\ndata/0016/000889\ndata/0016/000890\ndata/0016/000891\ndata/0016/000892\ndata/0016/000893\ndata/0016/000894\ndata/0016/000895\ndata/0016/000896\ndata/0016/000897\ndata/0016/000898\ndata/0016/000899\ndata/0016/000900\ndata/0016/000901\ndata/0016/000902\ndata/0016/000903\ndata/0016/000904\ndata/0016/000905\ndata/0016/000906\ndata/0016/000907\ndata/0016/000908\ndata/0016/000909\ndata/0016/000910\ndata/0016/000911\ndata/0016/000912\ndata/0016/000913\ndata/0016/000914\ndata/0016/000915\ndata/0016/000916\ndata/0016/000917\ndata/0016/000918\ndata/0016/000919\ndata/0016/000920\ndata/0016/000921\ndata/0016/000922\ndata/0016/000923\ndata/0016/000924\ndata/0016/000925\ndata/0016/000926\ndata/0016/000927\ndata/0016/000928\ndata/0016/000929\ndata/0016/000930\ndata/0016/000931\ndata/0016/000932\ndata/0016/000933\ndata/0016/000934\ndata/0016/000935\ndata/0016/000936\ndata/0016/000937\ndata/0016/000938\ndata/0016/000939\ndata/0016/000940\ndata/0016/000941\ndata/0016/000942\ndata/0016/000943\ndata/0016/000944\ndata/0016/000945\ndata/0016/000946\ndata/0016/000947\ndata/0016/000948\ndata/0016/000949\ndata/0016/000950\ndata/0016/000951\ndata/0016/000952\ndata/0016/000953\ndata/0016/000954\ndata/0016/000955\ndata/0016/000956\ndata/0016/000957\ndata/0016/000958\ndata/0016/000959\ndata/0016/000960\ndata/0016/000961\ndata/0016/000962\ndata/0016/000963\ndata/0016/000964\ndata/0016/000965\ndata/0016/000966\ndata/0016/000967\ndata/0016/000968\ndata/0016/000969\ndata/0016/000970\ndata/0016/000971\ndata/0016/000972\ndata/0016/000973\ndata/0016/000974\ndata/0016/000975\ndata/0016/000976\ndata/0016/000977\ndata/0016/000978\ndata/0016/000979\ndata/0016/000980\ndata/0016/000981\ndata/0016/000982\ndata/0016/000983\ndata/0016/000984\ndata/0016/000985\ndata/0016/000986\ndata/0016/000987\ndata/0016/000988\ndata/0016/000989\ndata/0016/000990\ndata/0016/000991\ndata/0016/000992\ndata/0016/000993\ndata/0016/000994\ndata/0016/000995\ndata/0016/000996\ndata/0016/000997\ndata/0016/000998\ndata/0016/000999\ndata/0016/001000\ndata/0016/001001\ndata/0019/000001\ndata/0019/000002\ndata/0019/000003\ndata/0019/000004\ndata/0019/000005\ndata/0019/000006\ndata/0019/000007\ndata/0019/000008\ndata/0019/000009\ndata/0019/000010\ndata/0019/000011\ndata/0019/000012\ndata/0019/000013\ndata/0019/000014\ndata/0019/000015\ndata/0019/000016\ndata/0019/000017\ndata/0019/000018\ndata/0019/000019\ndata/0019/000020\ndata/0019/000021\ndata/0019/000022\ndata/0019/000023\ndata/0019/000024\ndata/0019/000025\ndata/0019/000026\ndata/0019/000027\ndata/0019/000028\ndata/0019/000029\ndata/0019/000030\ndata/0019/000031\ndata/0019/000032\ndata/0019/000033\ndata/0019/000034\ndata/0019/000035\ndata/0019/000036\ndata/0019/000037\ndata/0019/000038\ndata/0019/000039\ndata/0019/000040\ndata/0019/000041\ndata/0019/000042\ndata/0019/000043\ndata/0019/000044\ndata/0019/000045\ndata/0019/000046\ndata/0019/000047\ndata/0019/000048\ndata/0019/000049\ndata/0019/000050\ndata/0019/000051\ndata/0019/000052\ndata/0019/000053\ndata/0019/000054\ndata/0019/000055\ndata/0019/000056\ndata/0019/000057\ndata/0019/000058\ndata/0019/000059\ndata/0019/000060\ndata/0019/000061\ndata/0019/000062\ndata/0019/000063\ndata/0019/000064\ndata/0019/000065\ndata/0019/000066\ndata/0019/000067\ndata/0019/000068\ndata/0019/000069\ndata/0019/000070\ndata/0019/000071\ndata/0019/000072\ndata/0019/000073\ndata/0019/000074\ndata/0019/000075\ndata/0019/000076\ndata/0019/000077\ndata/0019/000078\ndata/0019/000079\ndata/0019/000080\ndata/0019/000081\ndata/0019/000082\ndata/0019/000083\ndata/0019/000084\ndata/0019/000085\ndata/0019/000086\ndata/0019/000087\ndata/0019/000088\ndata/0019/000089\ndata/0019/000090\ndata/0019/000091\ndata/0019/000092\ndata/0019/000093\ndata/0019/000094\ndata/0019/000095\ndata/0019/000096\ndata/0019/000097\ndata/0019/000098\ndata/0019/000099\ndata/0019/000100\ndata/0019/000101\ndata/0019/000102\ndata/0019/000103\ndata/0019/000104\ndata/0019/000105\ndata/0019/000106\ndata/0019/000107\ndata/0019/000108\ndata/0019/000109\ndata/0019/000110\ndata/0019/000111\ndata/0019/000112\ndata/0019/000113\ndata/0019/000114\ndata/0019/000115\ndata/0019/000116\ndata/0019/000117\ndata/0019/000118\ndata/0019/000119\ndata/0019/000120\ndata/0019/000121\ndata/0019/000122\ndata/0019/000123\ndata/0019/000124\ndata/0019/000125\ndata/0019/000126\ndata/0019/000127\ndata/0019/000128\ndata/0019/000129\ndata/0019/000130\ndata/0019/000131\ndata/0019/000132\ndata/0019/000133\ndata/0019/000134\ndata/0019/000135\ndata/0019/000136\ndata/0019/000137\ndata/0019/000138\ndata/0019/000139\ndata/0019/000140\ndata/0019/000141\ndata/0019/000142\ndata/0019/000143\ndata/0019/000144\ndata/0019/000145\ndata/0019/000146\ndata/0019/000147\ndata/0019/000148\ndata/0019/000149\ndata/0019/000150\ndata/0019/000151\ndata/0019/000152\ndata/0019/000153\ndata/0019/000154\ndata/0019/000155\ndata/0019/000156\ndata/0019/000157\ndata/0019/000158\ndata/0019/000159\ndata/0019/000160\ndata/0019/000161\ndata/0019/000162\ndata/0019/000163\ndata/0019/000164\ndata/0019/000165\ndata/0019/000166\ndata/0019/000167\ndata/0019/000168\ndata/0019/000169\ndata/0019/000170\ndata/0019/000171\ndata/0019/000172\ndata/0019/000173\ndata/0019/000174\ndata/0019/000175\ndata/0019/000176\ndata/0019/000177\ndata/0019/000178\ndata/0019/000179\ndata/0019/000180\ndata/0019/000181\ndata/0019/000182\ndata/0019/000183\ndata/0019/000184\ndata/0019/000185\ndata/0019/000186\ndata/0019/000187\ndata/0019/000188\ndata/0019/000189\ndata/0019/000190\ndata/0019/000191\ndata/0019/000192\ndata/0019/000193\ndata/0019/000194\ndata/0019/000195\ndata/0019/000196\ndata/0019/000197\ndata/0019/000198\ndata/0019/000199\ndata/0019/000200\ndata/0019/000201\ndata/0019/000202\ndata/0019/000203\ndata/0019/000204\ndata/0019/000205\ndata/0019/000206\ndata/0019/000207\ndata/0019/000208\ndata/0019/000209\ndata/0019/000210\ndata/0019/000211\ndata/0019/000212\ndata/0019/000213\ndata/0019/000214\ndata/0019/000215\ndata/0019/000216\ndata/0019/000217\ndata/0019/000218\ndata/0019/000219\ndata/0019/000220\ndata/0019/000221\ndata/0019/000222\ndata/0019/000223\ndata/0019/000224\ndata/0019/000225\ndata/0019/000226\ndata/0019/000227\ndata/0019/000228\ndata/0019/000229\ndata/0019/000230\ndata/0019/000231\ndata/0019/000232\ndata/0019/000233\ndata/0019/000234\ndata/0019/000235\ndata/0019/000236\ndata/0019/000237\ndata/0019/000238\ndata/0019/000239\ndata/0019/000240\ndata/0019/000241\ndata/0019/000242\ndata/0019/000243\ndata/0019/000244\ndata/0019/000245\ndata/0019/000246\ndata/0019/000247\ndata/0019/000248\ndata/0019/000249\ndata/0019/000250\ndata/0019/000251\ndata/0019/000252\ndata/0019/000253\ndata/0019/000254\ndata/0019/000255\ndata/0019/000256\ndata/0019/000257\ndata/0019/000258\ndata/0019/000259\ndata/0019/000260\ndata/0019/000261\ndata/0019/000262\ndata/0019/000263\ndata/0019/000264\ndata/0019/000265\ndata/0019/000266\ndata/0019/000267\ndata/0019/000268\ndata/0019/000269\ndata/0019/000270\ndata/0019/000271\ndata/0019/000272\ndata/0019/000273\ndata/0019/000274\ndata/0019/000275\ndata/0019/000276\ndata/0019/000277\ndata/0019/000278\ndata/0019/000279\ndata/0019/000280\ndata/0019/000281\ndata/0019/000282\ndata/0019/000283\ndata/0019/000284\ndata/0019/000285\ndata/0019/000286\ndata/0019/000287\ndata/0019/000288\ndata/0019/000289\ndata/0019/000290\ndata/0019/000291\ndata/0019/000292\ndata/0019/000293\ndata/0019/000294\ndata/0019/000295\ndata/0019/000296\ndata/0019/000297\ndata/0019/000298\ndata/0019/000299\ndata/0019/000300\ndata/0019/000301\ndata/0019/000302\ndata/0019/000303\ndata/0019/000304\ndata/0019/000305\ndata/0019/000306\ndata/0019/000307\ndata/0019/000308\ndata/0019/000309\ndata/0019/000310\ndata/0019/000311\ndata/0019/000312\ndata/0019/000313\ndata/0019/000314\ndata/0019/000315\ndata/0019/000316\ndata/0019/000317\ndata/0019/000318\ndata/0019/000319\ndata/0019/000320\ndata/0019/000321\ndata/0019/000322\ndata/0019/000323\ndata/0019/000324\ndata/0019/000325\ndata/0019/000326\ndata/0019/000327\ndata/0019/000328\ndata/0019/000329\ndata/0019/000330\ndata/0019/000331\ndata/0019/000332\ndata/0019/000333\ndata/0019/000334\ndata/0019/000335\ndata/0019/000336\ndata/0019/000337\ndata/0019/000338\ndata/0019/000339\ndata/0019/000340\ndata/0019/000341\ndata/0019/000342\ndata/0019/000343\ndata/0019/000344\ndata/0019/000345\ndata/0019/000346\ndata/0019/000347\ndata/0019/000348\ndata/0019/000349\ndata/0019/000350\ndata/0019/000351\ndata/0019/000352\ndata/0019/000353\ndata/0019/000354\ndata/0019/000355\ndata/0019/000356\ndata/0019/000357\ndata/0019/000358\ndata/0019/000359\ndata/0019/000360\ndata/0019/000361\ndata/0019/000362\ndata/0019/000363\ndata/0019/000364\ndata/0019/000365\ndata/0019/000366\ndata/0019/000367\ndata/0019/000368\ndata/0019/000369\ndata/0019/000370\ndata/0019/000371\ndata/0019/000372\ndata/0019/000373\ndata/0019/000374\ndata/0019/000375\ndata/0019/000376\ndata/0019/000377\ndata/0019/000378\ndata/0019/000379\ndata/0019/000380\ndata/0019/000381\ndata/0019/000382\ndata/0019/000383\ndata/0019/000384\ndata/0019/000385\ndata/0019/000386\ndata/0019/000387\ndata/0019/000388\ndata/0019/000389\ndata/0019/000390\ndata/0019/000391\ndata/0019/000392\ndata/0019/000393\ndata/0019/000394\ndata/0019/000395\ndata/0019/000396\ndata/0019/000397\ndata/0019/000398\ndata/0019/000399\ndata/0019/000400\ndata/0019/000401\ndata/0019/000402\ndata/0019/000403\ndata/0019/000404\ndata/0019/000405\ndata/0019/000406\ndata/0019/000407\ndata/0019/000408\ndata/0019/000409\ndata/0019/000410\ndata/0019/000411\ndata/0019/000412\ndata/0019/000413\ndata/0019/000414\ndata/0019/000415\ndata/0019/000416\ndata/0019/000417\ndata/0019/000418\ndata/0019/000419\ndata/0019/000420\ndata/0019/000421\ndata/0019/000422\ndata/0019/000423\ndata/0019/000424\ndata/0019/000425\ndata/0019/000426\ndata/0019/000427\ndata/0019/000428\ndata/0019/000429\ndata/0019/000430\ndata/0019/000431\ndata/0019/000432\ndata/0019/000433\ndata/0019/000434\ndata/0019/000435\ndata/0019/000436\ndata/0019/000437\ndata/0019/000438\ndata/0019/000439\ndata/0019/000440\ndata/0019/000441\ndata/0019/000442\ndata/0019/000443\ndata/0019/000444\ndata/0019/000445\ndata/0019/000446\ndata/0019/000447\ndata/0019/000448\ndata/0019/000449\ndata/0019/000450\ndata/0019/000451\ndata/0019/000452\ndata/0019/000453\ndata/0019/000454\ndata/0019/000455\ndata/0019/000456\ndata/0019/000457\ndata/0019/000458\ndata/0019/000459\ndata/0019/000460\ndata/0019/000461\ndata/0019/000462\ndata/0019/000463\ndata/0019/000464\ndata/0019/000465\ndata/0019/000466\ndata/0019/000467\ndata/0019/000468\ndata/0019/000469\ndata/0019/000470\ndata/0019/000471\ndata/0019/000472\ndata/0019/000473\ndata/0019/000474\ndata/0019/000475\ndata/0019/000476\ndata/0019/000477\ndata/0019/000478\ndata/0019/000479\ndata/0019/000480\ndata/0019/000481\ndata/0019/000482\ndata/0019/000483\ndata/0019/000484\ndata/0019/000485\ndata/0019/000486\ndata/0019/000487\ndata/0019/000488\ndata/0019/000489\ndata/0019/000490\ndata/0019/000491\ndata/0019/000492\ndata/0019/000493\ndata/0019/000494\ndata/0019/000495\ndata/0019/000496\ndata/0019/000497\ndata/0019/000498\ndata/0019/000499\ndata/0019/000500\ndata/0019/000501\ndata/0019/000502\ndata/0019/000503\ndata/0019/000504\ndata/0019/000505\ndata/0019/000506\ndata/0019/000507\ndata/0019/000508\ndata/0019/000509\ndata/0019/000510\ndata/0019/000511\ndata/0019/000512\ndata/0019/000513\ndata/0019/000514\ndata/0019/000515\ndata/0019/000516\ndata/0019/000517\ndata/0019/000518\ndata/0019/000519\ndata/0019/000520\ndata/0019/000521\ndata/0019/000522\ndata/0019/000523\ndata/0019/000524\ndata/0019/000525\ndata/0019/000526\ndata/0019/000527\ndata/0019/000528\ndata/0019/000529\ndata/0019/000530\ndata/0019/000531\ndata/0019/000532\ndata/0019/000533\ndata/0019/000534\ndata/0019/000535\ndata/0019/000536\ndata/0019/000537\ndata/0019/000538\ndata/0019/000539\ndata/0019/000540\ndata/0019/000541\ndata/0019/000542\ndata/0019/000543\ndata/0019/000544\ndata/0019/000545\ndata/0019/000546\ndata/0019/000547\ndata/0019/000548\ndata/0019/000549\ndata/0019/000550\ndata/0019/000551\ndata/0019/000552\ndata/0019/000553\ndata/0019/000554\ndata/0019/000555\ndata/0019/000556\ndata/0019/000557\ndata/0019/000558\ndata/0019/000559\ndata/0019/000560\ndata/0019/000561\ndata/0019/000562\ndata/0019/000563\ndata/0019/000564\ndata/0019/000565\ndata/0019/000566\ndata/0019/000567\ndata/0019/000568\ndata/0019/000569\ndata/0019/000570\ndata/0019/000571\ndata/0019/000572\ndata/0019/000573\ndata/0019/000574\ndata/0019/000575\ndata/0019/000576\ndata/0019/000577\ndata/0019/000578\ndata/0019/000579\ndata/0019/000580\ndata/0019/000581\ndata/0019/000582\ndata/0019/000583\ndata/0019/000584\ndata/0019/000585\ndata/0019/000586\ndata/0019/000587\ndata/0019/000588\ndata/0019/000589\ndata/0019/000590\ndata/0019/000591\ndata/0019/000592\ndata/0019/000593\ndata/0019/000594\ndata/0019/000595\ndata/0019/000596\ndata/0019/000597\ndata/0019/000598\ndata/0019/000599\ndata/0019/000600\ndata/0019/000601\ndata/0019/000602\ndata/0019/000603\ndata/0019/000604\ndata/0019/000605\ndata/0019/000606\ndata/0019/000607\ndata/0019/000608\ndata/0019/000609\ndata/0019/000610\ndata/0019/000611\ndata/0019/000612\ndata/0019/000613\ndata/0019/000614\ndata/0019/000615\ndata/0019/000616\ndata/0019/000617\ndata/0019/000618\ndata/0019/000619\ndata/0019/000620\ndata/0019/000621\ndata/0019/000622\ndata/0019/000623\ndata/0019/000624\ndata/0019/000625\ndata/0019/000626\ndata/0019/000627\ndata/0019/000628\ndata/0019/000629\ndata/0019/000630\ndata/0019/000631\ndata/0019/000632\ndata/0019/000633\ndata/0019/000634\ndata/0019/000635\ndata/0019/000636\ndata/0019/000637\ndata/0019/000638\ndata/0019/000639\ndata/0019/000640\ndata/0019/000641\ndata/0019/000642\ndata/0019/000643\ndata/0019/000644\ndata/0019/000645\ndata/0019/000646\ndata/0019/000647\ndata/0019/000648\ndata/0019/000649\ndata/0019/000650\ndata/0019/000651\ndata/0019/000652\ndata/0019/000653\ndata/0019/000654\ndata/0019/000655\ndata/0019/000656\ndata/0019/000657\ndata/0019/000658\ndata/0019/000659\ndata/0019/000660\ndata/0019/000661\ndata/0019/000662\ndata/0019/000663\ndata/0019/000664\ndata/0019/000665\ndata/0019/000666\ndata/0019/000667\ndata/0019/000668\ndata/0019/000669\ndata/0019/000670\ndata/0019/000671\ndata/0019/000672\ndata/0019/000673\ndata/0019/000674\ndata/0019/000675\ndata/0019/000676\ndata/0019/000677\ndata/0019/000678\ndata/0019/000679\ndata/0019/000680\ndata/0019/000681\ndata/0019/000682\ndata/0019/000683\ndata/0019/000684\ndata/0019/000685\ndata/0019/000686\ndata/0019/000687\ndata/0019/000688\ndata/0019/000689\ndata/0019/000690\ndata/0019/000691\ndata/0019/000692\ndata/0019/000693\ndata/0019/000694\ndata/0019/000695\ndata/0019/000696\ndata/0019/000697\ndata/0019/000698\ndata/0019/000699\ndata/0019/000700\ndata/0019/000701\ndata/0019/000702\ndata/0019/000703\ndata/0019/000704\ndata/0019/000705\ndata/0019/000706\ndata/0019/000707\ndata/0019/000708\ndata/0019/000709\ndata/0019/000710\ndata/0019/000711\ndata/0019/000712\ndata/0019/000713\ndata/0019/000714\ndata/0019/000715\ndata/0019/000716\ndata/0019/000717\ndata/0019/000718\ndata/0019/000719\ndata/0019/000720\ndata/0019/000721\ndata/0019/000722\ndata/0019/000723\ndata/0019/000724\ndata/0019/000725\ndata/0019/000726\ndata/0019/000727\ndata/0019/000728\ndata/0019/000729\ndata/0019/000730\ndata/0019/000731\ndata/0019/000732\ndata/0019/000733\ndata/0019/000734\ndata/0019/000735\ndata/0019/000736\ndata/0019/000737\ndata/0019/000738\ndata/0019/000739\ndata/0019/000740\ndata/0019/000741\ndata/0019/000742\ndata/0019/000743\ndata/0019/000744\ndata/0019/000745\ndata/0019/000746\ndata/0019/000747\ndata/0019/000748\ndata/0019/000749\ndata/0019/000750\ndata/0019/000751\ndata/0019/000752\ndata/0019/000753\ndata/0019/000754\ndata/0019/000755\ndata/0019/000756\ndata/0019/000757\ndata/0019/000758\ndata/0019/000759\ndata/0019/000760\ndata/0019/000761\ndata/0019/000762\ndata/0019/000763\ndata/0019/000764\ndata/0019/000765\ndata/0019/000766\ndata/0019/000767\ndata/0019/000768\ndata/0019/000769\ndata/0019/000770\ndata/0019/000771\ndata/0019/000772\ndata/0019/000773\ndata/0019/000774\ndata/0019/000775\ndata/0019/000776\ndata/0019/000777\ndata/0019/000778\ndata/0019/000779\ndata/0019/000780\ndata/0019/000781\ndata/0019/000782\ndata/0019/000783\ndata/0019/000784\ndata/0019/000785\ndata/0019/000786\ndata/0019/000787\ndata/0019/000788\ndata/0019/000789\ndata/0019/000790\ndata/0019/000791\ndata/0019/000792\ndata/0019/000793\ndata/0019/000794\ndata/0019/000795\ndata/0019/000796\ndata/0019/000797\ndata/0019/000798\ndata/0019/000799\ndata/0019/000800\ndata/0019/000801\ndata/0019/000802\ndata/0019/000803\ndata/0019/000804\ndata/0019/000805\ndata/0019/000806\ndata/0019/000807\ndata/0019/000808\ndata/0019/000809\ndata/0019/000810\ndata/0019/000811\ndata/0019/000812\ndata/0019/000813\ndata/0019/000814\ndata/0019/000815\ndata/0019/000816\ndata/0019/000817\ndata/0019/000818\ndata/0019/000819\ndata/0019/000820\ndata/0019/000821\ndata/0019/000822\ndata/0019/000823\ndata/0020/000001\ndata/0020/000002\ndata/0020/000003\ndata/0020/000004\ndata/0020/000005\ndata/0020/000006\ndata/0020/000007\ndata/0020/000008\ndata/0020/000009\ndata/0020/000010\ndata/0020/000011\ndata/0020/000012\ndata/0020/000013\ndata/0020/000014\ndata/0020/000015\ndata/0020/000016\ndata/0020/000017\ndata/0020/000018\ndata/0020/000019\ndata/0020/000020\ndata/0020/000021\ndata/0020/000022\ndata/0020/000023\ndata/0020/000024\ndata/0020/000025\ndata/0020/000026\ndata/0020/000027\ndata/0020/000028\ndata/0020/000029\ndata/0020/000030\ndata/0020/000031\ndata/0020/000032\ndata/0020/000033\ndata/0020/000034\ndata/0020/000035\ndata/0020/000036\ndata/0020/000037\ndata/0020/000038\ndata/0020/000039\ndata/0020/000040\ndata/0020/000041\ndata/0020/000042\ndata/0020/000043\ndata/0020/000044\ndata/0020/000045\ndata/0020/000046\ndata/0020/000047\ndata/0020/000048\ndata/0020/000049\ndata/0020/000050\ndata/0020/000051\ndata/0020/000052\ndata/0020/000053\ndata/0020/000054\ndata/0020/000055\ndata/0020/000056\ndata/0020/000057\ndata/0020/000058\ndata/0020/000059\ndata/0020/000060\ndata/0020/000061\ndata/0020/000062\ndata/0020/000063\ndata/0020/000064\ndata/0020/000065\ndata/0020/000066\ndata/0020/000067\ndata/0020/000068\ndata/0020/000069\ndata/0020/000070\ndata/0020/000071\ndata/0020/000072\ndata/0020/000073\ndata/0020/000074\ndata/0020/000075\ndata/0020/000076\ndata/0020/000077\ndata/0020/000078\ndata/0020/000079\ndata/0020/000080\ndata/0020/000081\ndata/0020/000082\ndata/0020/000083\ndata/0020/000084\ndata/0020/000085\ndata/0020/000086\ndata/0020/000087\ndata/0020/000088\ndata/0020/000089\ndata/0020/000090\ndata/0020/000091\ndata/0020/000092\ndata/0020/000093\ndata/0020/000094\ndata/0020/000095\ndata/0020/000096\ndata/0020/000097\ndata/0020/000098\ndata/0020/000099\ndata/0020/000100\ndata/0020/000101\ndata/0020/000102\ndata/0020/000103\ndata/0020/000104\ndata/0020/000105\ndata/0020/000106\ndata/0020/000107\ndata/0020/000108\ndata/0020/000109\ndata/0020/000110\ndata/0020/000111\ndata/0020/000112\ndata/0020/000113\ndata/0020/000114\ndata/0020/000115\ndata/0020/000116\ndata/0020/000117\ndata/0020/000118\ndata/0020/000119\ndata/0020/000120\ndata/0020/000121\ndata/0020/000122\ndata/0020/000123\ndata/0020/000124\ndata/0020/000125\ndata/0020/000126\ndata/0020/000127\ndata/0020/000128\ndata/0020/000129\ndata/0020/000130\ndata/0020/000131\ndata/0020/000132\ndata/0020/000133\ndata/0020/000134\ndata/0020/000135\ndata/0020/000136\ndata/0020/000137\ndata/0020/000138\ndata/0020/000139\ndata/0020/000140\ndata/0020/000141\ndata/0020/000142\ndata/0020/000143\ndata/0020/000144\ndata/0020/000145\ndata/0020/000146\ndata/0020/000147\ndata/0020/000148\ndata/0020/000149\ndata/0020/000150\ndata/0020/000151\ndata/0020/000152\ndata/0020/000153\ndata/0020/000154\ndata/0020/000155\ndata/0020/000156\ndata/0020/000157\ndata/0020/000158\ndata/0020/000159\ndata/0020/000160\ndata/0020/000161\ndata/0020/000162\ndata/0020/000163\ndata/0020/000164\ndata/0020/000165\ndata/0020/000166\ndata/0020/000167\ndata/0020/000168\ndata/0020/000169\ndata/0020/000170\ndata/0020/000171\ndata/0020/000172\ndata/0020/000173\ndata/0020/000174\ndata/0020/000175\ndata/0020/000176\ndata/0020/000177\ndata/0020/000178\ndata/0020/000179\ndata/0020/000180\ndata/0020/000181\ndata/0020/000182\ndata/0020/000183\ndata/0020/000184\ndata/0020/000185\ndata/0020/000186\ndata/0020/000187\ndata/0020/000188\ndata/0020/000189\ndata/0020/000190\ndata/0020/000191\ndata/0020/000192\ndata/0020/000193\ndata/0020/000194\ndata/0020/000195\ndata/0020/000196\ndata/0020/000197\ndata/0020/000198\ndata/0020/000199\ndata/0020/000200\ndata/0020/000201\ndata/0020/000202\ndata/0020/000203\ndata/0020/000204\ndata/0020/000205\ndata/0020/000206\ndata/0020/000207\ndata/0020/000208\ndata/0020/000209\ndata/0020/000210\ndata/0020/000211\ndata/0020/000212\ndata/0020/000213\ndata/0020/000214\ndata/0020/000215\ndata/0020/000216\ndata/0020/000217\ndata/0020/000218\ndata/0020/000219\ndata/0020/000220\ndata/0020/000221\ndata/0020/000222\ndata/0020/000223\ndata/0020/000224\ndata/0020/000225\ndata/0020/000226\ndata/0020/000227\ndata/0020/000228\ndata/0020/000229\ndata/0020/000230\ndata/0020/000231\ndata/0020/000232\ndata/0020/000233\ndata/0020/000234\ndata/0020/000235\ndata/0020/000236\ndata/0020/000237\ndata/0020/000238\ndata/0020/000239\ndata/0020/000240\ndata/0020/000241\ndata/0020/000242\ndata/0020/000243\ndata/0020/000244\ndata/0020/000245\ndata/0020/000246\ndata/0020/000247\ndata/0020/000248\ndata/0020/000249\ndata/0020/000250\ndata/0020/000251\ndata/0020/000252\ndata/0020/000253\ndata/0020/000254\ndata/0020/000255\ndata/0020/000256\ndata/0020/000257\ndata/0020/000258\ndata/0020/000259\ndata/0020/000260\ndata/0020/000261\ndata/0020/000262\ndata/0020/000263\ndata/0020/000264\ndata/0020/000265\ndata/0020/000266\ndata/0020/000267\ndata/0020/000268\ndata/0020/000269\ndata/0020/000270\ndata/0020/000271\ndata/0020/000272\ndata/0020/000273\ndata/0020/000274\ndata/0020/000275\ndata/0020/000276\ndata/0020/000277\ndata/0020/000278\ndata/0020/000279\ndata/0020/000280\ndata/0020/000281\ndata/0020/000282\ndata/0020/000283\ndata/0020/000284\ndata/0020/000285\ndata/0020/000286\ndata/0020/000287\ndata/0020/000288\ndata/0020/000289\ndata/0020/000290\ndata/0020/000291\ndata/0020/000292\ndata/0020/000293\ndata/0020/000294\ndata/0020/000295\ndata/0020/000296\ndata/0020/000297\ndata/0020/000298\ndata/0020/000299\ndata/0020/000300\ndata/0020/000301\ndata/0020/000302\ndata/0020/000303\ndata/0020/000304\ndata/0020/000305\ndata/0020/000306\ndata/0020/000307\ndata/0020/000308\ndata/0020/000309\ndata/0020/000310\ndata/0020/000311\ndata/0020/000312\ndata/0020/000313\ndata/0020/000314\ndata/0020/000315\ndata/0020/000316\ndata/0020/000317\ndata/0020/000318\ndata/0020/000319\ndata/0020/000320\ndata/0020/000321\ndata/0020/000322\ndata/0020/000323\ndata/0020/000324\ndata/0020/000325\ndata/0020/000326\ndata/0020/000327\ndata/0020/000328\ndata/0020/000329\ndata/0020/000330\ndata/0020/000331\ndata/0020/000332\ndata/0020/000333\ndata/0020/000334\ndata/0020/000335\ndata/0020/000336\ndata/0020/000337\ndata/0020/000338\ndata/0020/000339\ndata/0020/000340\ndata/0020/000341\ndata/0020/000342\ndata/0020/000343\ndata/0020/000344\ndata/0020/000345\ndata/0020/000346\ndata/0020/000347\ndata/0020/000348\ndata/0020/000349\ndata/0020/000350\ndata/0020/000351\ndata/0020/000352\ndata/0020/000353\ndata/0020/000354\ndata/0020/000355\ndata/0020/000356\ndata/0020/000357\ndata/0020/000358\ndata/0020/000359\ndata/0020/000360\ndata/0020/000361\ndata/0020/000362\ndata/0020/000363\ndata/0020/000364\ndata/0020/000365\ndata/0020/000366\ndata/0020/000367\ndata/0020/000368\ndata/0020/000369\ndata/0020/000370\ndata/0020/000371\ndata/0020/000372\ndata/0020/000373\ndata/0020/000374\ndata/0020/000375\ndata/0020/000376\ndata/0020/000377\ndata/0020/000378\ndata/0020/000379\ndata/0020/000380\ndata/0020/000381\ndata/0020/000382\ndata/0020/000383\ndata/0020/000384\ndata/0020/000385\ndata/0020/000386\ndata/0020/000387\ndata/0020/000388\ndata/0020/000389\ndata/0020/000390\ndata/0020/000391\ndata/0020/000392\ndata/0020/000393\ndata/0020/000394\ndata/0020/000395\ndata/0020/000396\ndata/0020/000397\ndata/0020/000398\ndata/0020/000399\ndata/0020/000400\ndata/0020/000401\ndata/0020/000402\ndata/0020/000403\ndata/0020/000404\ndata/0020/000405\ndata/0020/000406\ndata/0020/000407\ndata/0020/000408\ndata/0020/000409\ndata/0020/000410\ndata/0020/000411\ndata/0020/000412\ndata/0020/000413\ndata/0020/000414\ndata/0020/000415\ndata/0020/000416\ndata/0020/000417\ndata/0020/000418\ndata/0020/000419\ndata/0020/000420\ndata/0020/000421\ndata/0020/000422\ndata/0020/000423\ndata/0020/000424\ndata/0020/000425\ndata/0020/000426\ndata/0020/000427\ndata/0020/000428\ndata/0020/000429\ndata/0020/000430\ndata/0020/000431\ndata/0020/000432\ndata/0020/000433\ndata/0020/000434\ndata/0020/000435\ndata/0020/000436\ndata/0020/000437\ndata/0020/000438\ndata/0020/000439\ndata/0020/000440\ndata/0020/000441\ndata/0020/000442\ndata/0020/000443\ndata/0020/000444\ndata/0020/000445\ndata/0020/000446\ndata/0020/000447\ndata/0020/000448\ndata/0020/000449\ndata/0020/000450\ndata/0020/000451\ndata/0020/000452\ndata/0020/000453\ndata/0020/000454\ndata/0020/000455\ndata/0020/000456\ndata/0020/000457\ndata/0020/000458\ndata/0020/000459\ndata/0020/000460\ndata/0020/000461\ndata/0020/000462\ndata/0020/000463\ndata/0020/000464\ndata/0020/000465\ndata/0020/000466\ndata/0020/000467\ndata/0020/000468\ndata/0020/000469\ndata/0020/000470\ndata/0020/000471\ndata/0020/000472\ndata/0020/000473\ndata/0020/000474\ndata/0020/000475\ndata/0020/000476\ndata/0020/000477\ndata/0020/000478\ndata/0020/000479\ndata/0020/000480\ndata/0020/000481\ndata/0020/000482\ndata/0020/000483\ndata/0020/000484\ndata/0020/000485\ndata/0020/000486\ndata/0020/000487\ndata/0020/000488\ndata/0020/000489\ndata/0020/000490\ndata/0020/000491\ndata/0020/000492\ndata/0020/000493\ndata/0020/000494\ndata/0020/000495\ndata/0020/000496\ndata/0020/000497\ndata/0020/000498\ndata/0020/000499\ndata/0020/000500\ndata/0020/000501\ndata/0020/000502\ndata/0020/000503\ndata/0020/000504\ndata/0020/000505\ndata/0020/000506\ndata/0020/000507\ndata/0020/000508\ndata/0020/000509\ndata/0020/000510\ndata/0020/000511\ndata/0020/000512\ndata/0020/000513\ndata/0020/000514\ndata/0020/000515\ndata/0020/000516\ndata/0020/000517\ndata/0020/000518\ndata/0020/000519\ndata/0020/000520\ndata/0020/000521\ndata/0020/000522\ndata/0020/000523\ndata/0020/000524\ndata/0020/000525\ndata/0020/000526\ndata/0020/000527\ndata/0020/000528\ndata/0020/000529\ndata/0020/000530\ndata/0020/000531\ndata/0020/000532\ndata/0020/000533\ndata/0020/000534\ndata/0020/000535\ndata/0020/000536\ndata/0020/000537\ndata/0020/000538\ndata/0020/000539\ndata/0020/000540\ndata/0020/000541\ndata/0020/000542\ndata/0020/000543\ndata/0020/000544\ndata/0020/000545\ndata/0020/000546\ndata/0020/000547\ndata/0020/000548\ndata/0020/000549\ndata/0020/000550\ndata/0020/000551\ndata/0020/000552\ndata/0020/000553\ndata/0020/000554\ndata/0020/000555\ndata/0020/000556\ndata/0020/000557\ndata/0020/000558\ndata/0020/000559\ndata/0020/000560\ndata/0020/000561\ndata/0020/000562\ndata/0020/000563\ndata/0020/000564\ndata/0020/000565\ndata/0020/000566\ndata/0020/000567\ndata/0020/000568\ndata/0020/000569\ndata/0020/000570\ndata/0020/000571\ndata/0020/000572\ndata/0020/000573\ndata/0020/000574\ndata/0020/000575\ndata/0020/000576\ndata/0020/000577\ndata/0020/000578\ndata/0020/000579\ndata/0020/000580\ndata/0020/000581\ndata/0020/000582\ndata/0020/000583\ndata/0020/000584\ndata/0020/000585\ndata/0020/000586\ndata/0020/000587\ndata/0020/000588\ndata/0020/000589\ndata/0020/000590\ndata/0020/000591\ndata/0020/000592\ndata/0020/000593\ndata/0020/000594\ndata/0020/000595\ndata/0020/000596\ndata/0020/000597\ndata/0020/000598\ndata/0020/000599\ndata/0020/000600\ndata/0020/000601\ndata/0020/000602\ndata/0020/000603\ndata/0020/000604\ndata/0020/000605\ndata/0020/000606\ndata/0020/000607\ndata/0020/000608\ndata/0020/000609\ndata/0020/000610\ndata/0020/000611\ndata/0020/000612\ndata/0020/000613\ndata/0020/000614\ndata/0020/000615\ndata/0020/000616\ndata/0020/000617\ndata/0020/000618\ndata/0020/000619\ndata/0020/000620\ndata/0020/000621\ndata/0020/000622\ndata/0020/000623\ndata/0020/000624\ndata/0020/000625\ndata/0020/000626\ndata/0020/000627\ndata/0020/000628\ndata/0020/000629\ndata/0020/000630\ndata/0020/000631\ndata/0020/000632\ndata/0020/000633\ndata/0020/000634\ndata/0020/000635\ndata/0020/000636\ndata/0020/000637\ndata/0020/000638\ndata/0020/000639\ndata/0020/000640\ndata/0020/000641\ndata/0020/000642\ndata/0020/000643\ndata/0020/000644\ndata/0020/000645\ndata/0020/000646\ndata/0020/000647\ndata/0020/000648\ndata/0020/000649\ndata/0020/000650\ndata/0020/000651\ndata/0020/000652\ndata/0020/000653\ndata/0020/000654\ndata/0020/000655\ndata/0020/000656\ndata/0020/000657\ndata/0020/000658\ndata/0020/000659\ndata/0020/000660\ndata/0020/000661\ndata/0020/000662\ndata/0020/000663\ndata/0020/000664\ndata/0020/000665\ndata/0020/000666\ndata/0020/000667\ndata/0020/000668\ndata/0020/000669\ndata/0020/000670\ndata/0020/000671\ndata/0020/000672\ndata/0020/000673\ndata/0020/000674\ndata/0020/000675\ndata/0020/000676\ndata/0020/000677\ndata/0020/000678\ndata/0020/000679\ndata/0020/000680\ndata/0020/000681\ndata/0020/000682\ndata/0020/000683\ndata/0020/000684\ndata/0020/000685\ndata/0020/000686\ndata/0020/000687\ndata/0020/000688\ndata/0020/000689\ndata/0020/000690\ndata/0020/000691\ndata/0020/000692\ndata/0020/000693\ndata/0020/000694\ndata/0020/000695\ndata/0020/000696\ndata/0020/000697\ndata/0020/000698\ndata/0020/000699\ndata/0020/000700\ndata/0020/000701\ndata/0020/000702\ndata/0020/000703\ndata/0020/000704\ndata/0020/000705\ndata/0020/000706\ndata/0020/000707\ndata/0020/000708\ndata/0020/000709\ndata/0020/000710\ndata/0020/000711\ndata/0020/000712\ndata/0020/000713\ndata/0020/000714\ndata/0020/000715\ndata/0020/000716\ndata/0020/000717\ndata/0020/000718\ndata/0020/000719\ndata/0020/000720\ndata/0020/000721\ndata/0020/000722\ndata/0020/000723\ndata/0020/000724\ndata/0020/000725\ndata/0020/000726\ndata/0020/000727\ndata/0020/000728\ndata/0020/000729\ndata/0020/000730\ndata/0020/000731\ndata/0020/000732\ndata/0020/000733\ndata/0020/000734\ndata/0020/000735\ndata/0020/000736\ndata/0020/000737\ndata/0020/000738\ndata/0020/000739\ndata/0020/000740\ndata/0020/000741\ndata/0020/000742\ndata/0020/000743\ndata/0020/000744\ndata/0020/000745\ndata/0020/000746\ndata/0020/000747\ndata/0020/000748\ndata/0020/000749\ndata/0020/000750\ndata/0020/000751\ndata/0020/000752\ndata/0020/000753\ndata/0020/000754\ndata/0020/000755\ndata/0020/000756\ndata/0020/000757\ndata/0020/000758\ndata/0020/000759\ndata/0020/000760\ndata/0020/000761\ndata/0020/000762\ndata/0020/000763\ndata/0020/000764\ndata/0020/000765\ndata/0020/000766\ndata/0020/000767\ndata/0020/000768\ndata/0020/000769\ndata/0020/000770\ndata/0020/000771\ndata/0020/000772\ndata/0020/000773\ndata/0020/000774\ndata/0020/000775\ndata/0020/000776\ndata/0020/000777\ndata/0020/000778\ndata/0020/000779\ndata/0020/000780\ndata/0020/000781\ndata/0020/000782\ndata/0020/000783\ndata/0020/000784\ndata/0020/000785\ndata/0020/000786\ndata/0020/000787\ndata/0020/000788\ndata/0020/000789\ndata/0020/000790\ndata/0020/000791\ndata/0020/000792\ndata/0020/000793\ndata/0020/000794\ndata/0020/000795\ndata/0020/000796\ndata/0020/000797\ndata/0020/000798\ndata/0020/000799\ndata/0020/000800\ndata/0020/000801\ndata/0020/000802\ndata/0020/000803\ndata/0020/000804\ndata/0020/000805\ndata/0020/000806\ndata/0020/000807\ndata/0020/000808\ndata/0020/000809\ndata/0020/000810\ndata/0020/000811\ndata/0020/000812\ndata/0020/000813\ndata/0020/000814\ndata/0020/000815\ndata/0020/000816\ndata/0020/000817\ndata/0020/000818\ndata/0020/000819\ndata/0020/000820\ndata/0020/000821\ndata/0020/000822\ndata/0020/000823\ndata/0020/000824\ndata/0020/000825\ndata/0020/000826\ndata/0020/000827\ndata/0020/000828\ndata/0020/000829\ndata/0020/000830\ndata/0020/000831\ndata/0020/000832\ndata/0020/000833\ndata/0020/000834\ndata/0020/000835\ndata/0020/000836\ndata/0020/000837\ndata/0020/000838\ndata/0020/000839\ndata/0020/000840\ndata/0020/000841\ndata/0020/000842\ndata/0020/000843\ndata/0020/000844\ndata/0020/000845\ndata/0020/000846\ndata/0020/000847\ndata/0020/000848\ndata/0020/000849\ndata/0020/000850\ndata/0020/000851\ndata/0020/000852\ndata/0020/000853\ndata/0020/000854\ndata/0020/000855\ndata/0020/000856\ndata/0020/000857\ndata/0020/000858\ndata/0020/000859\ndata/0020/000860\ndata/0020/000861\ndata/0020/000862\ndata/0020/000863\ndata/0020/000864\ndata/0020/000865\ndata/0020/000866\ndata/0020/000867\ndata/0020/000868\ndata/0020/000869\ndata/0020/000870\ndata/0020/000871\ndata/0020/000872\ndata/0020/000873\ndata/0020/000874\ndata/0020/000875\ndata/0020/000876\ndata/0020/000877\ndata/0020/000878\ndata/0020/000879\ndata/0020/000880\ndata/0020/000881\ndata/0020/000882\ndata/0020/000883\ndata/0020/000884\ndata/0020/000885\ndata/0020/000886\ndata/0020/000887\ndata/0020/000888\ndata/0020/000889\ndata/0020/000890\ndata/0020/000891\ndata/0020/000892\ndata/0020/000893\ndata/0020/000894\ndata/0020/000895\ndata/0020/000896\ndata/0020/000897\ndata/0020/000898\ndata/0020/000899\ndata/0020/000900\ndata/0020/000901\ndata/0021/000001\ndata/0021/000002\ndata/0021/000003\ndata/0021/000004\ndata/0021/000005\ndata/0021/000006\ndata/0021/000007\ndata/0021/000008\ndata/0021/000009\ndata/0021/000010\ndata/0021/000011\ndata/0021/000012\ndata/0021/000013\ndata/0021/000014\ndata/0021/000015\ndata/0021/000016\ndata/0021/000017\ndata/0021/000018\ndata/0021/000019\ndata/0021/000020\ndata/0021/000021\ndata/0021/000022\ndata/0021/000023\ndata/0021/000024\ndata/0021/000025\ndata/0021/000026\ndata/0021/000027\ndata/0021/000028\ndata/0021/000029\ndata/0021/000030\ndata/0021/000031\ndata/0021/000032\ndata/0021/000033\ndata/0021/000034\ndata/0021/000035\ndata/0021/000036\ndata/0021/000037\ndata/0021/000038\ndata/0021/000039\ndata/0021/000040\ndata/0021/000041\ndata/0021/000042\ndata/0021/000043\ndata/0021/000044\ndata/0021/000045\ndata/0021/000046\ndata/0021/000047\ndata/0021/000048\ndata/0021/000049\ndata/0021/000050\ndata/0021/000051\ndata/0021/000052\ndata/0021/000053\ndata/0021/000054\ndata/0021/000055\ndata/0021/000056\ndata/0021/000057\ndata/0021/000058\ndata/0021/000059\ndata/0021/000060\ndata/0021/000061\ndata/0021/000062\ndata/0021/000063\ndata/0021/000064\ndata/0021/000065\ndata/0021/000066\ndata/0021/000067\ndata/0021/000068\ndata/0021/000069\ndata/0021/000070\ndata/0021/000071\ndata/0021/000072\ndata/0021/000073\ndata/0021/000074\ndata/0021/000075\ndata/0021/000076\ndata/0021/000077\ndata/0021/000078\ndata/0021/000079\ndata/0021/000080\ndata/0021/000081\ndata/0021/000082\ndata/0021/000083\ndata/0021/000084\ndata/0021/000085\ndata/0021/000086\ndata/0021/000087\ndata/0021/000088\ndata/0021/000089\ndata/0021/000090\ndata/0021/000091\ndata/0021/000092\ndata/0021/000093\ndata/0021/000094\ndata/0021/000095\ndata/0021/000096\ndata/0021/000097\ndata/0021/000098\ndata/0021/000099\ndata/0021/000100\ndata/0021/000101\ndata/0021/000102\ndata/0021/000103\ndata/0021/000104\ndata/0021/000105\ndata/0021/000106\ndata/0021/000107\ndata/0021/000108\ndata/0021/000109\ndata/0021/000110\ndata/0021/000111\ndata/0021/000112\ndata/0021/000113\ndata/0021/000114\ndata/0021/000115\ndata/0021/000116\ndata/0021/000117\ndata/0021/000118\ndata/0021/000119\ndata/0021/000120\ndata/0021/000121\ndata/0021/000122\ndata/0021/000123\ndata/0021/000124\ndata/0021/000125\ndata/0021/000126\ndata/0021/000127\ndata/0021/000128\ndata/0021/000129\ndata/0021/000130\ndata/0021/000131\ndata/0021/000132\ndata/0021/000133\ndata/0021/000134\ndata/0021/000135\ndata/0021/000136\ndata/0021/000137\ndata/0021/000138\ndata/0021/000139\ndata/0021/000140\ndata/0021/000141\ndata/0021/000142\ndata/0021/000143\ndata/0021/000144\ndata/0021/000145\ndata/0021/000146\ndata/0021/000147\ndata/0021/000148\ndata/0021/000149\ndata/0021/000150\ndata/0021/000151\ndata/0021/000152\ndata/0021/000153\ndata/0021/000154\ndata/0021/000155\ndata/0021/000156\ndata/0021/000157\ndata/0021/000158\ndata/0021/000159\ndata/0021/000160\ndata/0021/000161\ndata/0021/000162\ndata/0021/000163\ndata/0021/000164\ndata/0021/000165\ndata/0021/000166\ndata/0021/000167\ndata/0021/000168\ndata/0021/000169\ndata/0021/000170\ndata/0021/000171\ndata/0021/000172\ndata/0021/000173\ndata/0021/000174\ndata/0021/000175\ndata/0021/000176\ndata/0021/000177\ndata/0021/000178\ndata/0021/000179\ndata/0021/000180\ndata/0021/000181\ndata/0021/000182\ndata/0021/000183\ndata/0021/000184\ndata/0021/000185\ndata/0021/000186\ndata/0021/000187\ndata/0021/000188\ndata/0021/000189\ndata/0021/000190\ndata/0021/000191\ndata/0021/000192\ndata/0021/000193\ndata/0021/000194\ndata/0021/000195\ndata/0021/000196\ndata/0021/000197\ndata/0021/000198\ndata/0021/000199\ndata/0021/000200\ndata/0021/000201\ndata/0021/000202\ndata/0021/000203\ndata/0021/000204\ndata/0021/000205\ndata/0021/000206\ndata/0021/000207\ndata/0021/000208\ndata/0021/000209\ndata/0021/000210\ndata/0021/000211\ndata/0021/000212\ndata/0021/000213\ndata/0021/000214\ndata/0021/000215\ndata/0021/000216\ndata/0021/000217\ndata/0021/000218\ndata/0021/000219\ndata/0021/000220\ndata/0021/000221\ndata/0021/000222\ndata/0021/000223\ndata/0021/000224\ndata/0021/000225\ndata/0021/000226\ndata/0021/000227\ndata/0021/000228\ndata/0021/000229\ndata/0021/000230\ndata/0021/000231\ndata/0021/000232\ndata/0021/000233\ndata/0021/000234\ndata/0021/000235\ndata/0021/000236\ndata/0021/000237\ndata/0021/000238\ndata/0021/000239\ndata/0021/000240\ndata/0021/000241\ndata/0021/000242\ndata/0021/000243\ndata/0021/000244\ndata/0021/000245\ndata/0021/000246\ndata/0021/000247\ndata/0021/000248\ndata/0021/000249\ndata/0021/000250\ndata/0021/000251\ndata/0021/000252\ndata/0021/000253\ndata/0021/000254\ndata/0021/000255\ndata/0021/000256\ndata/0021/000257\ndata/0021/000258\ndata/0021/000259\ndata/0021/000260\ndata/0021/000261\ndata/0021/000262\ndata/0021/000263\ndata/0021/000264\ndata/0021/000265\ndata/0021/000266\ndata/0021/000267\ndata/0021/000268\ndata/0021/000269\ndata/0021/000270\ndata/0021/000271\ndata/0021/000272\ndata/0021/000273\ndata/0021/000274\ndata/0021/000275\ndata/0021/000276\ndata/0021/000277\ndata/0021/000278\ndata/0021/000279\ndata/0021/000280\ndata/0021/000281\ndata/0021/000282\ndata/0021/000283\ndata/0021/000284\ndata/0021/000285\ndata/0021/000286\ndata/0021/000287\ndata/0021/000288\ndata/0021/000289\ndata/0021/000290\ndata/0021/000291\ndata/0021/000292\ndata/0021/000293\ndata/0021/000294\ndata/0021/000295\ndata/0021/000296\ndata/0021/000297\ndata/0021/000298\ndata/0021/000299\ndata/0021/000300\ndata/0021/000301\ndata/0021/000302\ndata/0021/000303\ndata/0021/000304\ndata/0021/000305\ndata/0021/000306\ndata/0021/000307\ndata/0021/000308\ndata/0021/000309\ndata/0021/000310\ndata/0021/000311\ndata/0021/000312\ndata/0021/000313\ndata/0021/000314\ndata/0021/000315\ndata/0021/000316\ndata/0021/000317\ndata/0021/000318\ndata/0021/000319\ndata/0021/000320\ndata/0021/000321\ndata/0021/000322\ndata/0021/000323\ndata/0021/000324\ndata/0021/000325\ndata/0021/000326\ndata/0021/000327\ndata/0021/000328\ndata/0021/000329\ndata/0021/000330\ndata/0021/000331\ndata/0021/000332\ndata/0021/000333\ndata/0021/000334\ndata/0021/000335\ndata/0021/000336\ndata/0021/000337\ndata/0021/000338\ndata/0021/000339\ndata/0021/000340\ndata/0021/000341\ndata/0021/000342\ndata/0021/000343\ndata/0021/000344\ndata/0021/000345\ndata/0021/000346\ndata/0021/000347\ndata/0021/000348\ndata/0021/000349\ndata/0021/000350\ndata/0021/000351\ndata/0021/000352\ndata/0021/000353\ndata/0021/000354\ndata/0021/000355\ndata/0021/000356\ndata/0021/000357\ndata/0021/000358\ndata/0021/000359\ndata/0021/000360\ndata/0021/000361\ndata/0021/000362\ndata/0021/000363\ndata/0021/000364\ndata/0021/000365\ndata/0021/000366\ndata/0021/000367\ndata/0021/000368\ndata/0021/000369\ndata/0021/000370\ndata/0021/000371\ndata/0021/000372\ndata/0021/000373\ndata/0021/000374\ndata/0021/000375\ndata/0021/000376\ndata/0021/000377\ndata/0021/000378\ndata/0021/000379\ndata/0021/000380\ndata/0021/000381\ndata/0021/000382\ndata/0021/000383\ndata/0021/000384\ndata/0021/000385\ndata/0021/000386\ndata/0021/000387\ndata/0021/000388\ndata/0021/000389\ndata/0021/000390\ndata/0021/000391\ndata/0021/000392\ndata/0021/000393\ndata/0021/000394\ndata/0021/000395\ndata/0021/000396\ndata/0021/000397\ndata/0021/000398\ndata/0021/000399\ndata/0021/000400\ndata/0021/000401\ndata/0021/000402\ndata/0021/000403\ndata/0021/000404\ndata/0021/000405\ndata/0021/000406\ndata/0021/000407\ndata/0021/000408\ndata/0021/000409\ndata/0021/000410\ndata/0021/000411\ndata/0021/000412\ndata/0021/000413\ndata/0021/000414\ndata/0021/000415\ndata/0021/000416\ndata/0021/000417\ndata/0021/000418\ndata/0021/000419\ndata/0021/000420\ndata/0021/000421\ndata/0021/000422\ndata/0021/000423\ndata/0021/000424\ndata/0021/000425\ndata/0021/000426\ndata/0021/000427\ndata/0021/000428\ndata/0021/000429\ndata/0021/000430\ndata/0021/000431\ndata/0021/000432\ndata/0021/000433\ndata/0021/000434\ndata/0021/000435\ndata/0021/000436\ndata/0021/000437\ndata/0021/000438\ndata/0021/000439\ndata/0021/000440\ndata/0021/000441\ndata/0021/000442\ndata/0021/000443\ndata/0021/000444\ndata/0021/000445\ndata/0021/000446\ndata/0021/000447\ndata/0021/000448\ndata/0021/000449\ndata/0021/000450\ndata/0021/000451\ndata/0021/000452\ndata/0021/000453\ndata/0021/000454\ndata/0021/000455\ndata/0021/000456\ndata/0021/000457\ndata/0021/000458\ndata/0021/000459\ndata/0021/000460\ndata/0021/000461\ndata/0021/000462\ndata/0021/000463\ndata/0021/000464\ndata/0021/000465\ndata/0021/000466\ndata/0021/000467\ndata/0021/000468\ndata/0021/000469\ndata/0021/000470\ndata/0021/000471\ndata/0021/000472\ndata/0021/000473\ndata/0021/000474\ndata/0021/000475\ndata/0021/000476\ndata/0021/000477\ndata/0021/000478\ndata/0021/000479\ndata/0021/000480\ndata/0021/000481\ndata/0021/000482\ndata/0021/000483\ndata/0021/000484\ndata/0021/000485\ndata/0021/000486\ndata/0021/000487\ndata/0021/000488\ndata/0021/000489\ndata/0021/000490\ndata/0021/000491\ndata/0021/000492\ndata/0021/000493\ndata/0021/000494\ndata/0021/000495\ndata/0021/000496\ndata/0021/000497\ndata/0021/000498\ndata/0021/000499\ndata/0021/000500\ndata/0021/000501\ndata/0021/000502\ndata/0021/000503\ndata/0021/000504\ndata/0021/000505\ndata/0021/000506\ndata/0021/000507\ndata/0021/000508\ndata/0021/000509\ndata/0021/000510\ndata/0021/000511\ndata/0021/000512\ndata/0021/000513\ndata/0021/000514\ndata/0021/000515\ndata/0021/000516\ndata/0021/000517\ndata/0021/000518\ndata/0021/000519\ndata/0021/000520\ndata/0021/000521\ndata/0021/000522\ndata/0021/000523\ndata/0021/000524\ndata/0021/000525\ndata/0021/000526\ndata/0021/000527\ndata/0021/000528\ndata/0021/000529\ndata/0021/000530\ndata/0021/000531\ndata/0021/000532\ndata/0021/000533\ndata/0021/000534\ndata/0021/000535\ndata/0021/000536\ndata/0021/000537\ndata/0021/000538\ndata/0021/000539\ndata/0021/000540\ndata/0021/000541\ndata/0021/000542\ndata/0021/000543\ndata/0021/000544\ndata/0021/000545\ndata/0021/000546\ndata/0021/000547\ndata/0021/000548\ndata/0021/000549\ndata/0021/000550\ndata/0021/000551\ndata/0021/000552\ndata/0021/000553\ndata/0021/000554\ndata/0021/000555\ndata/0021/000556\ndata/0021/000557\ndata/0021/000558\ndata/0021/000559\ndata/0021/000560\ndata/0021/000561\ndata/0021/000562\ndata/0021/000563\ndata/0021/000564\ndata/0021/000565\ndata/0021/000566\ndata/0021/000567\ndata/0021/000568\ndata/0021/000569\ndata/0021/000570\ndata/0021/000571\ndata/0021/000572\ndata/0021/000573\ndata/0021/000574\ndata/0021/000575\ndata/0021/000576\ndata/0021/000577\ndata/0021/000578\ndata/0021/000579\ndata/0021/000580\ndata/0021/000581\ndata/0021/000582\ndata/0021/000583\ndata/0021/000584\ndata/0021/000585\ndata/0021/000586\ndata/0021/000587\ndata/0021/000588\ndata/0021/000589\ndata/0021/000590\ndata/0021/000591\ndata/0021/000592\ndata/0021/000593\ndata/0021/000594\ndata/0021/000595\ndata/0021/000596\ndata/0021/000597\ndata/0021/000598\ndata/0021/000599\ndata/0021/000600\ndata/0021/000601\ndata/0021/000602\ndata/0021/000603\ndata/0021/000604\ndata/0021/000605\ndata/0021/000606\ndata/0021/000607\ndata/0021/000608\ndata/0021/000609\ndata/0021/000610\ndata/0021/000611\ndata/0021/000612\ndata/0021/000613\ndata/0021/000614\ndata/0021/000615\ndata/0021/000616\ndata/0021/000617\ndata/0021/000618\ndata/0021/000619\ndata/0021/000620\ndata/0021/000621\ndata/0021/000622\ndata/0021/000623\ndata/0021/000624\ndata/0021/000625\ndata/0021/000626\ndata/0021/000627\ndata/0021/000628\ndata/0021/000629\ndata/0021/000630\ndata/0021/000631\ndata/0021/000632\ndata/0021/000633\ndata/0021/000634\ndata/0021/000635\ndata/0021/000636\ndata/0021/000637\ndata/0021/000638\ndata/0021/000639\ndata/0021/000640\ndata/0021/000641\ndata/0021/000642\ndata/0021/000643\ndata/0021/000644\ndata/0021/000645\ndata/0021/000646\ndata/0021/000647\ndata/0021/000648\ndata/0021/000649\ndata/0021/000650\ndata/0021/000651\ndata/0021/000652\ndata/0021/000653\ndata/0021/000654\ndata/0021/000655\ndata/0021/000656\ndata/0021/000657\ndata/0021/000658\ndata/0021/000659\ndata/0021/000660\ndata/0021/000661\ndata/0021/000662\ndata/0021/000663\ndata/0021/000664\ndata/0021/000665\ndata/0021/000666\ndata/0021/000667\ndata/0021/000668\ndata/0021/000669\ndata/0021/000670\ndata/0021/000671\ndata/0021/000672\ndata/0021/000673\ndata/0021/000674\ndata/0021/000675\ndata/0021/000676\ndata/0021/000677\ndata/0021/000678\ndata/0021/000679\ndata/0021/000680\ndata/0021/000681\ndata/0021/000682\ndata/0021/000683\ndata/0021/000684\ndata/0021/000685\ndata/0021/000686\ndata/0021/000687\ndata/0021/000688\ndata/0021/000689\ndata/0021/000690\ndata/0021/000691\ndata/0021/000692\ndata/0021/000693\ndata/0021/000694\ndata/0021/000695\ndata/0021/000696\ndata/0021/000697\ndata/0021/000698\ndata/0021/000699\ndata/0021/000700\ndata/0021/000701\ndata/0021/000702\ndata/0021/000703\ndata/0021/000704\ndata/0021/000705\ndata/0021/000706\ndata/0021/000707\ndata/0021/000708\ndata/0021/000709\ndata/0021/000710\ndata/0021/000711\ndata/0021/000712\ndata/0021/000713\ndata/0021/000714\ndata/0021/000715\ndata/0021/000716\ndata/0021/000717\ndata/0021/000718\ndata/0021/000719\ndata/0021/000720\ndata/0021/000721\ndata/0021/000722\ndata/0021/000723\ndata/0021/000724\ndata/0021/000725\ndata/0021/000726\ndata/0021/000727\ndata/0021/000728\ndata/0021/000729\ndata/0021/000730\ndata/0021/000731\ndata/0021/000732\ndata/0021/000733\ndata/0021/000734\ndata/0021/000735\ndata/0021/000736\ndata/0021/000737\ndata/0021/000738\ndata/0021/000739\ndata/0021/000740\ndata/0021/000741\ndata/0021/000742\ndata/0021/000743\ndata/0021/000744\ndata/0021/000745\ndata/0021/000746\ndata/0021/000747\ndata/0021/000748\ndata/0021/000749\ndata/0021/000750\ndata/0021/000751\ndata/0021/000752\ndata/0021/000753\ndata/0021/000754\ndata/0021/000755\ndata/0021/000756\ndata/0021/000757\ndata/0021/000758\ndata/0021/000759\ndata/0021/000760\ndata/0021/000761\ndata/0021/000762\ndata/0021/000763\ndata/0021/000764\ndata/0021/000765\ndata/0021/000766\ndata/0021/000767\ndata/0021/000768\ndata/0021/000769\ndata/0021/000770\ndata/0021/000771\ndata/0021/000772\ndata/0021/000773\ndata/0021/000774\ndata/0021/000775\ndata/0021/000776\ndata/0021/000777\ndata/0021/000778\ndata/0021/000779\ndata/0021/000780\ndata/0021/000781\ndata/0021/000782\ndata/0021/000783\ndata/0021/000784\ndata/0021/000785\ndata/0021/000786\ndata/0021/000787\ndata/0021/000788\ndata/0021/000789\ndata/0021/000790\ndata/0021/000791\ndata/0021/000792\ndata/0021/000793\ndata/0021/000794\ndata/0021/000795\ndata/0021/000796\ndata/0021/000797\ndata/0021/000798\ndata/0021/000799\ndata/0021/000800\ndata/0021/000801\ndata/0021/000802\ndata/0021/000803\ndata/0021/000804\ndata/0021/000805\ndata/0021/000806\ndata/0021/000807\ndata/0021/000808\ndata/0021/000809\ndata/0021/000810\ndata/0021/000811\ndata/0021/000812\ndata/0021/000813\ndata/0021/000814\ndata/0021/000815\ndata/0021/000816\ndata/0021/000817\ndata/0021/000818\ndata/0021/000819\ndata/0021/000820\ndata/0021/000821\ndata/0021/000822\ndata/0021/000823\ndata/0021/000824\ndata/0021/000825\ndata/0021/000826\ndata/0021/000827\ndata/0021/000828\ndata/0021/000829\ndata/0021/000830\ndata/0021/000831\ndata/0021/000832\ndata/0021/000833\ndata/0021/000834\ndata/0021/000835\ndata/0021/000836\ndata/0021/000837\ndata/0021/000838\ndata/0021/000839\ndata/0021/000840\ndata/0021/000841\ndata/0021/000842\ndata/0021/000843\ndata/0021/000844\ndata/0021/000845\ndata/0021/000846\ndata/0021/000847\ndata/0021/000848\ndata/0021/000849\ndata/0021/000850\ndata/0021/000851\ndata/0021/000852\ndata/0021/000853\ndata/0021/000854\ndata/0021/000855\ndata/0021/000856\ndata/0021/000857\ndata/0021/000858\ndata/0021/000859\ndata/0021/000860\ndata/0021/000861\ndata/0021/000862\ndata/0021/000863\ndata/0021/000864\ndata/0021/000865\ndata/0021/000866\ndata/0021/000867\ndata/0021/000868\ndata/0021/000869\ndata/0021/000870\ndata/0021/000871\ndata/0021/000872\ndata/0021/000873\ndata/0021/000874\ndata/0021/000875\ndata/0021/000876\ndata/0021/000877\ndata/0021/000878\ndata/0021/000879\ndata/0021/000880\ndata/0021/000881\ndata/0021/000882\ndata/0021/000883\ndata/0021/000884\ndata/0021/000885\ndata/0021/000886\ndata/0021/000887\ndata/0021/000888\ndata/0021/000889\ndata/0021/000890\ndata/0021/000891\ndata/0021/000892\ndata/0021/000893\ndata/0021/000894\ndata/0021/000895\ndata/0021/000896\ndata/0021/000897\ndata/0021/000898\ndata/0021/000899\ndata/0021/000900\ndata/0021/000901\ndata/0021/000902\ndata/0021/000903\ndata/0021/000904\ndata/0021/000905\ndata/0021/000906\ndata/0021/000907\ndata/0021/000908\ndata/0021/000909\ndata/0021/000910\ndata/0021/000911\ndata/0021/000912\ndata/0021/000913\ndata/0021/000914\ndata/0021/000915\ndata/0021/000916\ndata/0021/000917\ndata/0021/000918\ndata/0021/000919\ndata/0021/000920\ndata/0021/000921\ndata/0021/000922\ndata/0021/000923\ndata/0021/000924\ndata/0021/000925\ndata/0021/000926\ndata/0021/000927\ndata/0021/000928\ndata/0021/000929\ndata/0021/000930\ndata/0021/000931\ndata/0021/000932\ndata/0021/000933\ndata/0021/000934\ndata/0021/000935\ndata/0021/000936\ndata/0021/000937\ndata/0021/000938\ndata/0021/000939\ndata/0021/000940\ndata/0021/000941\ndata/0021/000942\ndata/0021/000943\ndata/0021/000944\ndata/0021/000945\ndata/0021/000946\ndata/0021/000947\ndata/0021/000948\ndata/0021/000949\ndata/0021/000950\ndata/0021/000951\ndata/0021/000952\ndata/0021/000953\ndata/0021/000954\ndata/0021/000955\ndata/0021/000956\ndata/0021/000957\ndata/0021/000958\ndata/0021/000959\ndata/0021/000960\ndata/0021/000961\ndata/0021/000962\ndata/0021/000963\ndata/0021/000964\ndata/0021/000965\ndata/0021/000966\ndata/0021/000967\ndata/0021/000968\ndata/0021/000969\ndata/0021/000970\ndata/0021/000971\ndata/0021/000972\ndata/0021/000973\ndata/0021/000974\ndata/0021/000975\ndata/0021/000976\ndata/0021/000977\ndata/0021/000978\ndata/0021/000979\ndata/0021/000980\ndata/0021/000981\ndata/0021/000982\ndata/0021/000983\ndata/0021/000984\ndata/0021/000985\ndata/0021/000986\ndata/0021/000987\ndata/0021/000988\ndata/0021/000989\ndata/0021/000990\ndata/0021/000991\ndata/0021/000992\ndata/0021/000993\ndata/0021/000994\ndata/0021/000995\ndata/0021/000996\ndata/0021/000997\ndata/0021/000998\ndata/0021/000999\ndata/0021/001000\ndata/0021/001001\ndata/0021/001002\ndata/0021/001003\ndata/0021/001004\ndata/0021/001005\ndata/0021/001006\ndata/0021/001007\ndata/0021/001008\ndata/0021/001009\ndata/0021/001010\ndata/0021/001011\ndata/0021/001012\ndata/0021/001013\ndata/0021/001014\ndata/0021/001015\ndata/0021/001016\ndata/0021/001017\ndata/0021/001018\ndata/0021/001019\ndata/0021/001020\ndata/0021/001021\ndata/0021/001022\ndata/0022/000001\ndata/0022/000002\ndata/0022/000003\ndata/0022/000004\ndata/0022/000005\ndata/0022/000006\ndata/0022/000007\ndata/0022/000008\ndata/0022/000009\ndata/0022/000010\ndata/0022/000011\ndata/0022/000012\ndata/0022/000013\ndata/0022/000014\ndata/0022/000015\ndata/0022/000016\ndata/0022/000017\ndata/0022/000018\ndata/0022/000019\ndata/0022/000020\ndata/0022/000021\ndata/0022/000022\ndata/0022/000023\ndata/0022/000024\ndata/0022/000025\ndata/0022/000026\ndata/0022/000027\ndata/0022/000028\ndata/0022/000029\ndata/0022/000030\ndata/0022/000031\ndata/0022/000032\ndata/0022/000033\ndata/0022/000034\ndata/0022/000035\ndata/0022/000036\ndata/0022/000037\ndata/0022/000038\ndata/0022/000039\ndata/0022/000040\ndata/0022/000041\ndata/0022/000042\ndata/0022/000043\ndata/0022/000044\ndata/0022/000045\ndata/0022/000046\ndata/0022/000047\ndata/0022/000048\ndata/0022/000049\ndata/0022/000050\ndata/0022/000051\ndata/0022/000052\ndata/0022/000053\ndata/0022/000054\ndata/0022/000055\ndata/0022/000056\ndata/0022/000057\ndata/0022/000058\ndata/0022/000059\ndata/0022/000060\ndata/0022/000061\ndata/0022/000062\ndata/0022/000063\ndata/0022/000064\ndata/0022/000065\ndata/0022/000066\ndata/0022/000067\ndata/0022/000068\ndata/0022/000069\ndata/0022/000070\ndata/0022/000071\ndata/0022/000072\ndata/0022/000073\ndata/0022/000074\ndata/0022/000075\ndata/0022/000076\ndata/0022/000077\ndata/0022/000078\ndata/0022/000079\ndata/0022/000080\ndata/0022/000081\ndata/0022/000082\ndata/0022/000083\ndata/0022/000084\ndata/0022/000085\ndata/0022/000086\ndata/0022/000087\ndata/0022/000088\ndata/0022/000089\ndata/0022/000090\ndata/0022/000091\ndata/0022/000092\ndata/0022/000093\ndata/0022/000094\ndata/0022/000095\ndata/0022/000096\ndata/0022/000097\ndata/0022/000098\ndata/0022/000099\ndata/0022/000100\ndata/0022/000101\ndata/0022/000102\ndata/0022/000103\ndata/0022/000104\ndata/0022/000105\ndata/0022/000106\ndata/0022/000107\ndata/0022/000108\ndata/0022/000109\ndata/0022/000110\ndata/0022/000111\ndata/0022/000112\ndata/0022/000113\ndata/0022/000114\ndata/0022/000115\ndata/0022/000116\ndata/0022/000117\ndata/0022/000118\ndata/0022/000119\ndata/0022/000120\ndata/0022/000121\ndata/0022/000122\ndata/0022/000123\ndata/0022/000124\ndata/0022/000125\ndata/0022/000126\ndata/0022/000127\ndata/0022/000128\ndata/0022/000129\ndata/0022/000130\ndata/0022/000131\ndata/0022/000132\ndata/0022/000133\ndata/0022/000134\ndata/0022/000135\ndata/0022/000136\ndata/0022/000137\ndata/0022/000138\ndata/0022/000139\ndata/0022/000140\ndata/0022/000141\ndata/0022/000142\ndata/0022/000143\ndata/0022/000144\ndata/0022/000145\ndata/0022/000146\ndata/0022/000147\ndata/0022/000148\ndata/0022/000149\ndata/0022/000150\ndata/0022/000151\ndata/0022/000152\ndata/0022/000153\ndata/0022/000154\ndata/0022/000155\ndata/0022/000156\ndata/0022/000157\ndata/0022/000158\ndata/0022/000159\ndata/0022/000160\ndata/0022/000161\ndata/0022/000162\ndata/0022/000163\ndata/0022/000164\ndata/0022/000165\ndata/0022/000166\ndata/0022/000167\ndata/0022/000168\ndata/0022/000169\ndata/0022/000170\ndata/0022/000171\ndata/0022/000172\ndata/0022/000173\ndata/0022/000174\ndata/0022/000175\ndata/0022/000176\ndata/0022/000177\ndata/0022/000178\ndata/0022/000179\ndata/0022/000180\ndata/0022/000181\ndata/0022/000182\ndata/0022/000183\ndata/0022/000184\ndata/0022/000185\ndata/0022/000186\ndata/0022/000187\ndata/0022/000188\ndata/0022/000189\ndata/0022/000190\ndata/0022/000191\ndata/0022/000192\ndata/0022/000193\ndata/0022/000194\ndata/0022/000195\ndata/0022/000196\ndata/0022/000197\ndata/0022/000198\ndata/0022/000199\ndata/0022/000200\ndata/0022/000201\ndata/0022/000202\ndata/0022/000203\ndata/0022/000204\ndata/0022/000205\ndata/0022/000206\ndata/0022/000207\ndata/0022/000208\ndata/0022/000209\ndata/0022/000210\ndata/0022/000211\ndata/0022/000212\ndata/0022/000213\ndata/0022/000214\ndata/0022/000215\ndata/0022/000216\ndata/0022/000217\ndata/0022/000218\ndata/0022/000219\ndata/0022/000220\ndata/0022/000221\ndata/0022/000222\ndata/0022/000223\ndata/0022/000224\ndata/0022/000225\ndata/0022/000226\ndata/0022/000227\ndata/0022/000228\ndata/0022/000229\ndata/0022/000230\ndata/0022/000231\ndata/0022/000232\ndata/0022/000233\ndata/0022/000234\ndata/0022/000235\ndata/0022/000236\ndata/0022/000237\ndata/0022/000238\ndata/0022/000239\ndata/0022/000240\ndata/0022/000241\ndata/0022/000242\ndata/0022/000243\ndata/0022/000244\ndata/0022/000245\ndata/0022/000246\ndata/0022/000247\ndata/0022/000248\ndata/0022/000249\ndata/0022/000250\ndata/0022/000251\ndata/0022/000252\ndata/0022/000253\ndata/0022/000254\ndata/0022/000255\ndata/0022/000256\ndata/0022/000257\ndata/0022/000258\ndata/0022/000259\ndata/0022/000260\ndata/0022/000261\ndata/0022/000262\ndata/0022/000263\ndata/0022/000264\ndata/0022/000265\ndata/0022/000266\ndata/0022/000267\ndata/0022/000268\ndata/0022/000269\ndata/0022/000270\ndata/0022/000271\ndata/0022/000272\ndata/0022/000273\ndata/0022/000274\ndata/0022/000275\ndata/0022/000276\ndata/0022/000277\ndata/0022/000278\ndata/0022/000279\ndata/0022/000280\ndata/0022/000281\ndata/0022/000282\ndata/0022/000283\ndata/0022/000284\ndata/0022/000285\ndata/0022/000286\ndata/0022/000287\ndata/0022/000288\ndata/0022/000289\ndata/0022/000290\ndata/0022/000291\ndata/0022/000292\ndata/0022/000293\ndata/0022/000294\ndata/0022/000295\ndata/0022/000296\ndata/0022/000297\ndata/0022/000298\ndata/0022/000299\ndata/0022/000300\ndata/0022/000301\ndata/0022/000302\ndata/0022/000303\ndata/0022/000304\ndata/0022/000305\ndata/0022/000306\ndata/0022/000307\ndata/0022/000308\ndata/0022/000309\ndata/0022/000310\ndata/0022/000311\ndata/0022/000312\ndata/0022/000313\ndata/0022/000314\ndata/0022/000315\ndata/0022/000316\ndata/0022/000317\ndata/0022/000318\ndata/0022/000319\ndata/0022/000320\ndata/0022/000321\ndata/0022/000322\ndata/0022/000323\ndata/0022/000324\ndata/0022/000325\ndata/0022/000326\ndata/0022/000327\ndata/0022/000328\ndata/0022/000329\ndata/0022/000330\ndata/0022/000331\ndata/0022/000332\ndata/0022/000333\ndata/0022/000334\ndata/0022/000335\ndata/0022/000336\ndata/0022/000337\ndata/0022/000338\ndata/0022/000339\ndata/0022/000340\ndata/0022/000341\ndata/0022/000342\ndata/0022/000343\ndata/0022/000344\ndata/0022/000345\ndata/0022/000346\ndata/0022/000347\ndata/0022/000348\ndata/0022/000349\ndata/0022/000350\ndata/0022/000351\ndata/0022/000352\ndata/0022/000353\ndata/0022/000354\ndata/0022/000355\ndata/0022/000356\ndata/0022/000357\ndata/0022/000358\ndata/0022/000359\ndata/0022/000360\ndata/0022/000361\ndata/0022/000362\ndata/0022/000363\ndata/0022/000364\ndata/0022/000365\ndata/0022/000366\ndata/0022/000367\ndata/0022/000368\ndata/0022/000369\ndata/0022/000370\ndata/0022/000371\ndata/0022/000372\ndata/0022/000373\ndata/0022/000374\ndata/0022/000375\ndata/0022/000376\ndata/0022/000377\ndata/0022/000378\ndata/0022/000379\ndata/0022/000380\ndata/0022/000381\ndata/0022/000382\ndata/0022/000383\ndata/0022/000384\ndata/0022/000385\ndata/0022/000386\ndata/0022/000387\ndata/0022/000388\ndata/0022/000389\ndata/0022/000390\ndata/0022/000391\ndata/0022/000392\ndata/0022/000393\ndata/0022/000394\ndata/0022/000395\ndata/0022/000396\ndata/0022/000397\ndata/0022/000398\ndata/0022/000399\ndata/0022/000400\ndata/0022/000401\ndata/0022/000402\ndata/0022/000403\ndata/0022/000404\ndata/0022/000405\ndata/0022/000406\ndata/0022/000407\ndata/0022/000408\ndata/0022/000409\ndata/0022/000410\ndata/0022/000411\ndata/0022/000412\ndata/0022/000413\ndata/0022/000414\ndata/0022/000415\ndata/0022/000416\ndata/0022/000417\ndata/0022/000418\ndata/0022/000419\ndata/0022/000420\ndata/0022/000421\ndata/0022/000422\ndata/0022/000423\ndata/0022/000424\ndata/0022/000425\ndata/0022/000426\ndata/0022/000427\ndata/0022/000428\ndata/0022/000429\ndata/0022/000430\ndata/0022/000431\ndata/0022/000432\ndata/0022/000433\ndata/0022/000434\ndata/0022/000435\ndata/0022/000436\ndata/0022/000437\ndata/0022/000438\ndata/0022/000439\ndata/0022/000440\ndata/0022/000441\ndata/0022/000442\ndata/0022/000443\ndata/0022/000444\ndata/0022/000445\ndata/0022/000446\ndata/0022/000447\ndata/0022/000448\ndata/0022/000449\ndata/0022/000450\ndata/0022/000451\ndata/0022/000452\ndata/0022/000453\ndata/0022/000454\ndata/0022/000455\ndata/0022/000456\ndata/0022/000457\ndata/0022/000458\ndata/0022/000459\ndata/0022/000460\ndata/0022/000461\ndata/0022/000462\ndata/0022/000463\ndata/0022/000464\ndata/0022/000465\ndata/0022/000466\ndata/0022/000467\ndata/0022/000468\ndata/0022/000469\ndata/0022/000470\ndata/0022/000471\ndata/0022/000472\ndata/0022/000473\ndata/0022/000474\ndata/0022/000475\ndata/0022/000476\ndata/0022/000477\ndata/0022/000478\ndata/0022/000479\ndata/0022/000480\ndata/0022/000481\ndata/0022/000482\ndata/0022/000483\ndata/0022/000484\ndata/0022/000485\ndata/0022/000486\ndata/0022/000487\ndata/0022/000488\ndata/0022/000489\ndata/0022/000490\ndata/0022/000491\ndata/0022/000492\ndata/0022/000493\ndata/0022/000494\ndata/0022/000495\ndata/0022/000496\ndata/0022/000497\ndata/0022/000498\ndata/0022/000499\ndata/0022/000500\ndata/0022/000501\ndata/0022/000502\ndata/0022/000503\ndata/0022/000504\ndata/0022/000505\ndata/0022/000506\ndata/0022/000507\ndata/0022/000508\ndata/0022/000509\ndata/0022/000510\ndata/0022/000511\ndata/0022/000512\ndata/0022/000513\ndata/0022/000514\ndata/0022/000515\ndata/0022/000516\ndata/0022/000517\ndata/0022/000518\ndata/0022/000519\ndata/0022/000520\ndata/0022/000521\ndata/0022/000522\ndata/0022/000523\ndata/0022/000524\ndata/0022/000525\ndata/0022/000526\ndata/0022/000527\ndata/0022/000528\ndata/0022/000529\ndata/0022/000530\ndata/0022/000531\ndata/0022/000532\ndata/0022/000533\ndata/0022/000534\ndata/0022/000535\ndata/0022/000536\ndata/0022/000537\ndata/0022/000538\ndata/0022/000539\ndata/0022/000540\ndata/0022/000541\ndata/0022/000542\ndata/0022/000543\ndata/0022/000544\ndata/0022/000545\ndata/0022/000546\ndata/0022/000547\ndata/0022/000548\ndata/0022/000549\ndata/0022/000550\ndata/0022/000551\ndata/0022/000552\ndata/0022/000553\ndata/0022/000554\ndata/0022/000555\ndata/0022/000556\ndata/0022/000557\ndata/0022/000558\ndata/0022/000559\ndata/0022/000560\ndata/0022/000561\ndata/0022/000562\ndata/0022/000563\ndata/0022/000564\ndata/0022/000565\ndata/0022/000566\ndata/0022/000567\ndata/0022/000568\ndata/0022/000569\ndata/0022/000570\ndata/0022/000571\ndata/0022/000572\ndata/0022/000573\ndata/0022/000574\ndata/0022/000575\ndata/0022/000576\ndata/0022/000577\ndata/0022/000578\ndata/0022/000579\ndata/0022/000580\ndata/0022/000581\ndata/0022/000582\ndata/0022/000583\ndata/0022/000584\ndata/0022/000585\ndata/0022/000586\ndata/0022/000587\ndata/0022/000588\ndata/0022/000589\ndata/0022/000590\ndata/0022/000591\ndata/0022/000592\ndata/0022/000593\ndata/0022/000594\ndata/0022/000595\ndata/0022/000596\ndata/0022/000597\ndata/0022/000598\ndata/0022/000599\ndata/0022/000600\ndata/0022/000601\ndata/0022/000602\ndata/0022/000603\ndata/0022/000604\ndata/0022/000605\ndata/0022/000606\ndata/0022/000607\ndata/0022/000608\ndata/0022/000609\ndata/0022/000610\ndata/0022/000611\ndata/0022/000612\ndata/0022/000613\ndata/0022/000614\ndata/0022/000615\ndata/0022/000616\ndata/0022/000617\ndata/0022/000618\ndata/0022/000619\ndata/0022/000620\ndata/0022/000621\ndata/0022/000622\ndata/0022/000623\ndata/0022/000624\ndata/0022/000625\ndata/0022/000626\ndata/0022/000627\ndata/0022/000628\ndata/0022/000629\ndata/0022/000630\ndata/0022/000631\ndata/0022/000632\ndata/0022/000633\ndata/0022/000634\ndata/0022/000635\ndata/0022/000636\ndata/0022/000637\ndata/0022/000638\ndata/0022/000639\ndata/0022/000640\ndata/0022/000641\ndata/0022/000642\ndata/0022/000643\ndata/0022/000644\ndata/0022/000645\ndata/0022/000646\ndata/0022/000647\ndata/0022/000648\ndata/0022/000649\ndata/0022/000650\ndata/0022/000651\ndata/0022/000652\ndata/0022/000653\ndata/0022/000654\ndata/0022/000655\ndata/0022/000656\ndata/0022/000657\ndata/0022/000658\ndata/0022/000659\ndata/0022/000660\ndata/0022/000661\ndata/0022/000662\ndata/0022/000663\ndata/0022/000664\ndata/0022/000665\ndata/0022/000666\ndata/0022/000667\ndata/0022/000668\ndata/0022/000669\ndata/0022/000670\ndata/0022/000671\ndata/0022/000672\ndata/0022/000673\ndata/0022/000674\ndata/0022/000675\ndata/0022/000676\ndata/0022/000677\ndata/0022/000678\ndata/0022/000679\ndata/0022/000680\ndata/0022/000681\ndata/0022/000682\ndata/0022/000683\ndata/0022/000684\ndata/0022/000685\ndata/0022/000686\ndata/0022/000687\ndata/0022/000688\ndata/0022/000689\ndata/0022/000690\ndata/0022/000691\ndata/0022/000692\ndata/0022/000693\ndata/0022/000694\ndata/0022/000695\ndata/0022/000696\ndata/0022/000697\ndata/0022/000698\ndata/0022/000699\ndata/0022/000700\ndata/0022/000701\ndata/0022/000702\ndata/0022/000703\ndata/0022/000704\ndata/0022/000705\ndata/0022/000706\ndata/0022/000707\ndata/0022/000708\ndata/0022/000709\ndata/0022/000710\ndata/0022/000711\ndata/0022/000712\ndata/0022/000713\ndata/0022/000714\ndata/0022/000715\ndata/0022/000716\ndata/0022/000717\ndata/0022/000718\ndata/0022/000719\ndata/0022/000720\ndata/0022/000721\ndata/0022/000722\ndata/0022/000723\ndata/0022/000724\ndata/0022/000725\ndata/0022/000726\ndata/0022/000727\ndata/0022/000728\ndata/0022/000729\ndata/0022/000730\ndata/0022/000731\ndata/0022/000732\ndata/0022/000733\ndata/0022/000734\ndata/0022/000735\ndata/0022/000736\ndata/0022/000737\ndata/0022/000738\ndata/0022/000739\ndata/0022/000740\ndata/0022/000741\ndata/0022/000742\ndata/0022/000743\ndata/0022/000744\ndata/0022/000745\ndata/0022/000746\ndata/0022/000747\ndata/0022/000748\ndata/0022/000749\ndata/0022/000750\ndata/0022/000751\ndata/0022/000752\ndata/0022/000753\ndata/0022/000754\ndata/0022/000755\ndata/0022/000756\ndata/0022/000757\ndata/0022/000758\ndata/0022/000759\ndata/0022/000760\ndata/0022/000761\ndata/0022/000762\ndata/0022/000763\ndata/0022/000764\ndata/0022/000765\ndata/0022/000766\ndata/0022/000767\ndata/0022/000768\ndata/0022/000769\ndata/0022/000770\ndata/0022/000771\ndata/0022/000772\ndata/0022/000773\ndata/0022/000774\ndata/0022/000775\ndata/0022/000776\ndata/0022/000777\ndata/0022/000778\ndata/0022/000779\ndata/0022/000780\ndata/0022/000781\ndata/0022/000782\ndata/0022/000783\ndata/0022/000784\ndata/0022/000785\ndata/0022/000786\ndata/0022/000787\ndata/0022/000788\ndata/0022/000789\ndata/0022/000790\ndata/0022/000791\ndata/0022/000792\ndata/0022/000793\ndata/0022/000794\ndata/0022/000795\ndata/0022/000796\ndata/0022/000797\ndata/0022/000798\ndata/0022/000799\ndata/0022/000800\ndata/0022/000801\ndata/0022/000802\ndata/0022/000803\ndata/0022/000804\ndata/0022/000805\ndata/0022/000806\ndata/0022/000807\ndata/0022/000808\ndata/0022/000809\ndata/0022/000810\ndata/0022/000811\ndata/0022/000812\ndata/0022/000813\ndata/0022/000814\ndata/0022/000815\ndata/0022/000816\ndata/0022/000817\ndata/0022/000818\ndata/0022/000819\ndata/0022/000820\ndata/0022/000821\ndata/0022/000822\ndata/0022/000823\ndata/0022/000824\ndata/0022/000825\ndata/0022/000826\ndata/0022/000827\ndata/0022/000828\ndata/0022/000829\ndata/0022/000830\ndata/0022/000831\ndata/0022/000832\ndata/0022/000833\ndata/0022/000834\ndata/0022/000835\ndata/0022/000836\ndata/0022/000837\ndata/0022/000838\ndata/0022/000839\ndata/0022/000840\ndata/0022/000841\ndata/0022/000842\ndata/0022/000843\ndata/0022/000844\ndata/0022/000845\ndata/0022/000846\ndata/0022/000847\ndata/0022/000848\ndata/0022/000849\ndata/0022/000850\ndata/0022/000851\ndata/0022/000852\ndata/0022/000853\ndata/0022/000854\ndata/0022/000855\ndata/0022/000856\ndata/0022/000857\ndata/0022/000858\ndata/0022/000859\ndata/0022/000860\ndata/0022/000861\ndata/0022/000862\ndata/0022/000863\ndata/0022/000864\ndata/0022/000865\ndata/0022/000866\ndata/0022/000867\ndata/0022/000868\ndata/0022/000869\ndata/0022/000870\ndata/0022/000871\ndata/0022/000872\ndata/0022/000873\ndata/0022/000874\ndata/0022/000875\ndata/0022/000876\ndata/0022/000877\ndata/0022/000878\ndata/0022/000879\ndata/0022/000880\ndata/0022/000881\ndata/0022/000882\ndata/0022/000883\ndata/0022/000884\ndata/0022/000885\ndata/0022/000886\ndata/0022/000887\ndata/0022/000888\ndata/0022/000889\ndata/0022/000890\ndata/0022/000891\ndata/0022/000892\ndata/0022/000893\ndata/0022/000894\ndata/0022/000895\ndata/0022/000896\ndata/0022/000897\ndata/0022/000898\ndata/0022/000899\ndata/0022/000900\ndata/0022/000901\ndata/0022/000902\ndata/0022/000903\ndata/0022/000904\ndata/0022/000905\ndata/0022/000906\ndata/0022/000907\ndata/0022/000908\ndata/0022/000909\ndata/0022/000910\ndata/0022/000911\ndata/0022/000912\ndata/0022/000913\ndata/0022/000914\ndata/0022/000915\ndata/0022/000916\ndata/0022/000917\ndata/0022/000918\ndata/0022/000919\ndata/0022/000920\ndata/0022/000921\ndata/0022/000922\ndata/0022/000923\ndata/0022/000924\ndata/0022/000925\ndata/0022/000926\ndata/0022/000927\ndata/0022/000928\ndata/0022/000929\ndata/0022/000930\ndata/0022/000931\ndata/0022/000932\ndata/0022/000933\ndata/0022/000934\ndata/0022/000935\ndata/0022/000936\ndata/0022/000937\ndata/0022/000938\ndata/0022/000939\ndata/0022/000940\ndata/0022/000941\ndata/0022/000942\ndata/0022/000943\ndata/0022/000944\ndata/0022/000945\ndata/0022/000946\ndata/0022/000947\ndata/0022/000948\ndata/0023/000001\ndata/0023/000002\ndata/0023/000003\ndata/0023/000004\ndata/0023/000005\ndata/0023/000006\ndata/0023/000007\ndata/0023/000008\ndata/0023/000009\ndata/0023/000010\ndata/0023/000011\ndata/0023/000012\ndata/0023/000013\ndata/0023/000014\ndata/0023/000015\ndata/0023/000016\ndata/0023/000017\ndata/0023/000018\ndata/0023/000019\ndata/0023/000020\ndata/0023/000021\ndata/0023/000022\ndata/0023/000023\ndata/0023/000024\ndata/0023/000025\ndata/0023/000026\ndata/0023/000027\ndata/0023/000028\ndata/0023/000029\ndata/0023/000030\ndata/0023/000031\ndata/0023/000032\ndata/0023/000033\ndata/0023/000034\ndata/0023/000035\ndata/0023/000036\ndata/0023/000037\ndata/0023/000038\ndata/0023/000039\ndata/0023/000040\ndata/0023/000041\ndata/0023/000042\ndata/0023/000043\ndata/0023/000044\ndata/0023/000045\ndata/0023/000046\ndata/0023/000047\ndata/0023/000048\ndata/0023/000049\ndata/0023/000050\ndata/0023/000051\ndata/0023/000052\ndata/0023/000053\ndata/0023/000054\ndata/0023/000055\ndata/0023/000056\ndata/0023/000057\ndata/0023/000058\ndata/0023/000059\ndata/0023/000060\ndata/0023/000061\ndata/0023/000062\ndata/0023/000063\ndata/0023/000064\ndata/0023/000065\ndata/0023/000066\ndata/0023/000067\ndata/0023/000068\ndata/0023/000069\ndata/0023/000070\ndata/0023/000071\ndata/0023/000072\ndata/0023/000073\ndata/0023/000074\ndata/0023/000075\ndata/0023/000076\ndata/0023/000077\ndata/0023/000078\ndata/0023/000079\ndata/0023/000080\ndata/0023/000081\ndata/0023/000082\ndata/0023/000083\ndata/0023/000084\ndata/0023/000085\ndata/0023/000086\ndata/0023/000087\ndata/0023/000088\ndata/0023/000089\ndata/0023/000090\ndata/0023/000091\ndata/0023/000092\ndata/0023/000093\ndata/0023/000094\ndata/0023/000095\ndata/0023/000096\ndata/0023/000097\ndata/0023/000098\ndata/0023/000099\ndata/0023/000100\ndata/0023/000101\ndata/0023/000102\ndata/0023/000103\ndata/0023/000104\ndata/0023/000105\ndata/0023/000106\ndata/0023/000107\ndata/0023/000108\ndata/0023/000109\ndata/0023/000110\ndata/0023/000111\ndata/0023/000112\ndata/0023/000113\ndata/0023/000114\ndata/0023/000115\ndata/0023/000116\ndata/0023/000117\ndata/0023/000118\ndata/0023/000119\ndata/0023/000120\ndata/0023/000121\ndata/0023/000122\ndata/0023/000123\ndata/0023/000124\ndata/0023/000125\ndata/0023/000126\ndata/0023/000127\ndata/0023/000128\ndata/0023/000129\ndata/0023/000130\ndata/0023/000131\ndata/0023/000132\ndata/0023/000133\ndata/0023/000134\ndata/0023/000135\ndata/0023/000136\ndata/0023/000137\ndata/0023/000138\ndata/0023/000139\ndata/0023/000140\ndata/0023/000141\ndata/0023/000142\ndata/0023/000143\ndata/0023/000144\ndata/0023/000145\ndata/0023/000146\ndata/0023/000147\ndata/0023/000148\ndata/0023/000149\ndata/0023/000150\ndata/0023/000151\ndata/0023/000152\ndata/0023/000153\ndata/0023/000154\ndata/0023/000155\ndata/0023/000156\ndata/0023/000157\ndata/0023/000158\ndata/0023/000159\ndata/0023/000160\ndata/0023/000161\ndata/0023/000162\ndata/0023/000163\ndata/0023/000164\ndata/0023/000165\ndata/0023/000166\ndata/0023/000167\ndata/0023/000168\ndata/0023/000169\ndata/0023/000170\ndata/0023/000171\ndata/0023/000172\ndata/0023/000173\ndata/0023/000174\ndata/0023/000175\ndata/0023/000176\ndata/0023/000177\ndata/0023/000178\ndata/0023/000179\ndata/0023/000180\ndata/0023/000181\ndata/0023/000182\ndata/0023/000183\ndata/0023/000184\ndata/0023/000185\ndata/0023/000186\ndata/0023/000187\ndata/0023/000188\ndata/0023/000189\ndata/0023/000190\ndata/0023/000191\ndata/0023/000192\ndata/0023/000193\ndata/0023/000194\ndata/0023/000195\ndata/0023/000196\ndata/0023/000197\ndata/0023/000198\ndata/0023/000199\ndata/0023/000200\ndata/0023/000201\ndata/0023/000202\ndata/0023/000203\ndata/0023/000204\ndata/0023/000205\ndata/0023/000206\ndata/0023/000207\ndata/0023/000208\ndata/0023/000209\ndata/0023/000210\ndata/0023/000211\ndata/0023/000212\ndata/0023/000213\ndata/0023/000214\ndata/0023/000215\ndata/0023/000216\ndata/0023/000217\ndata/0023/000218\ndata/0023/000219\ndata/0023/000220\ndata/0023/000221\ndata/0023/000222\ndata/0023/000223\ndata/0023/000224\ndata/0023/000225\ndata/0023/000226\ndata/0023/000227\ndata/0023/000228\ndata/0023/000229\ndata/0023/000230\ndata/0023/000231\ndata/0023/000232\ndata/0023/000233\ndata/0023/000234\ndata/0023/000235\ndata/0023/000236\ndata/0023/000237\ndata/0023/000238\ndata/0023/000239\ndata/0023/000240\ndata/0023/000241\ndata/0023/000242\ndata/0023/000243\ndata/0023/000244\ndata/0023/000245\ndata/0023/000246\ndata/0023/000247\ndata/0023/000248\ndata/0023/000249\ndata/0023/000250\ndata/0023/000251\ndata/0023/000252\ndata/0023/000253\ndata/0023/000254\ndata/0023/000255\ndata/0023/000256\ndata/0023/000257\ndata/0023/000258\ndata/0023/000259\ndata/0023/000260\ndata/0023/000261\ndata/0023/000262\ndata/0023/000263\ndata/0023/000264\ndata/0023/000265\ndata/0023/000266\ndata/0023/000267\ndata/0023/000268\ndata/0023/000269\ndata/0023/000270\ndata/0023/000271\ndata/0023/000272\ndata/0023/000273\ndata/0023/000274\ndata/0023/000275\ndata/0023/000276\ndata/0023/000277\ndata/0023/000278\ndata/0023/000279\ndata/0023/000280\ndata/0023/000281\ndata/0023/000282\ndata/0023/000283\ndata/0023/000284\ndata/0023/000285\ndata/0023/000286\ndata/0023/000287\ndata/0023/000288\ndata/0023/000289\ndata/0023/000290\ndata/0023/000291\ndata/0023/000292\ndata/0023/000293\ndata/0023/000294\ndata/0023/000295\ndata/0023/000296\ndata/0023/000297\ndata/0023/000298\ndata/0023/000299\ndata/0023/000300\ndata/0023/000301\ndata/0023/000302\ndata/0023/000303\ndata/0023/000304\ndata/0023/000305\ndata/0023/000306\ndata/0023/000307\ndata/0023/000308\ndata/0023/000309\ndata/0023/000310\ndata/0023/000311\ndata/0023/000312\ndata/0023/000313\ndata/0023/000314\ndata/0023/000315\ndata/0023/000316\ndata/0023/000317\ndata/0023/000318\ndata/0023/000319\ndata/0023/000320\ndata/0023/000321\ndata/0023/000322\ndata/0023/000323\ndata/0023/000324\ndata/0023/000325\ndata/0023/000326\ndata/0023/000327\ndata/0023/000328\ndata/0023/000329\ndata/0023/000330\ndata/0023/000331\ndata/0023/000332\ndata/0023/000333\ndata/0023/000334\ndata/0023/000335\ndata/0023/000336\ndata/0023/000337\ndata/0023/000338\ndata/0023/000339\ndata/0023/000340\ndata/0023/000341\ndata/0023/000342\ndata/0023/000343\ndata/0023/000344\ndata/0023/000345\ndata/0023/000346\ndata/0023/000347\ndata/0023/000348\ndata/0023/000349\ndata/0023/000350\ndata/0023/000351\ndata/0023/000352\ndata/0023/000353\ndata/0023/000354\ndata/0023/000355\ndata/0023/000356\ndata/0023/000357\ndata/0023/000358\ndata/0023/000359\ndata/0023/000360\ndata/0023/000361\ndata/0023/000362\ndata/0023/000363\ndata/0023/000364\ndata/0023/000365\ndata/0023/000366\ndata/0023/000367\ndata/0023/000368\ndata/0023/000369\ndata/0023/000370\ndata/0023/000371\ndata/0023/000372\ndata/0023/000373\ndata/0023/000374\ndata/0023/000375\ndata/0023/000376\ndata/0023/000377\ndata/0023/000378\ndata/0023/000379\ndata/0023/000380\ndata/0023/000381\ndata/0023/000382\ndata/0023/000383\ndata/0023/000384\ndata/0023/000385\ndata/0023/000386\ndata/0023/000387\ndata/0023/000388\ndata/0023/000389\ndata/0023/000390\ndata/0023/000391\ndata/0023/000392\ndata/0023/000393\ndata/0023/000394\ndata/0023/000395\ndata/0023/000396\ndata/0023/000397\ndata/0023/000398\ndata/0023/000399\ndata/0023/000400\ndata/0023/000401\ndata/0023/000402\ndata/0023/000403\ndata/0023/000404\ndata/0023/000405\ndata/0023/000406\ndata/0023/000407\ndata/0023/000408\ndata/0023/000409\ndata/0023/000410\ndata/0023/000411\ndata/0023/000412\ndata/0023/000413\ndata/0023/000414\ndata/0023/000415\ndata/0023/000416\ndata/0023/000417\ndata/0023/000418\ndata/0023/000419\ndata/0023/000420\ndata/0023/000421\ndata/0023/000422\ndata/0023/000423\ndata/0023/000424\ndata/0023/000425\ndata/0023/000426\ndata/0023/000427\ndata/0023/000428\ndata/0023/000429\ndata/0023/000430\ndata/0023/000431\ndata/0023/000432\ndata/0023/000433\ndata/0023/000434\ndata/0023/000435\ndata/0023/000436\ndata/0023/000437\ndata/0023/000438\ndata/0023/000439\ndata/0023/000440\ndata/0023/000441\ndata/0023/000442\ndata/0023/000443\ndata/0023/000444\ndata/0023/000445\ndata/0023/000446\ndata/0023/000447\ndata/0023/000448\ndata/0023/000449\ndata/0023/000450\ndata/0023/000451\ndata/0023/000452\ndata/0023/000453\ndata/0023/000454\ndata/0023/000455\ndata/0023/000456\ndata/0023/000457\ndata/0023/000458\ndata/0023/000459\ndata/0023/000460\ndata/0023/000461\ndata/0023/000462\ndata/0023/000463\ndata/0023/000464\ndata/0023/000465\ndata/0023/000466\ndata/0023/000467\ndata/0023/000468\ndata/0023/000469\ndata/0023/000470\ndata/0023/000471\ndata/0023/000472\ndata/0023/000473\ndata/0023/000474\ndata/0023/000475\ndata/0023/000476\ndata/0023/000477\ndata/0023/000478\ndata/0023/000479\ndata/0023/000480\ndata/0023/000481\ndata/0023/000482\ndata/0023/000483\ndata/0023/000484\ndata/0023/000485\ndata/0023/000486\ndata/0023/000487\ndata/0023/000488\ndata/0023/000489\ndata/0023/000490\ndata/0023/000491\ndata/0023/000492\ndata/0023/000493\ndata/0023/000494\ndata/0023/000495\ndata/0023/000496\ndata/0023/000497\ndata/0023/000498\ndata/0023/000499\ndata/0023/000500\ndata/0023/000501\ndata/0023/000502\ndata/0023/000503\ndata/0023/000504\ndata/0023/000505\ndata/0023/000506\ndata/0023/000507\ndata/0023/000508\ndata/0023/000509\ndata/0023/000510\ndata/0023/000511\ndata/0023/000512\ndata/0023/000513\ndata/0023/000514\ndata/0023/000515\ndata/0023/000516\ndata/0023/000517\ndata/0023/000518\ndata/0023/000519\ndata/0023/000520\ndata/0023/000521\ndata/0023/000522\ndata/0023/000523\ndata/0023/000524\ndata/0023/000525\ndata/0023/000526\ndata/0023/000527\ndata/0023/000528\ndata/0023/000529\ndata/0023/000530\ndata/0023/000531\ndata/0023/000532\ndata/0023/000533\ndata/0023/000534\ndata/0023/000535\ndata/0023/000536\ndata/0023/000537\ndata/0023/000538\ndata/0023/000539\ndata/0023/000540\ndata/0023/000541\ndata/0023/000542\ndata/0023/000543\ndata/0023/000544\ndata/0023/000545\ndata/0023/000546\ndata/0023/000547\ndata/0023/000548\ndata/0023/000549\ndata/0023/000550\ndata/0023/000551\ndata/0023/000552\ndata/0023/000553\ndata/0023/000554\ndata/0023/000555\ndata/0023/000556\ndata/0023/000557\ndata/0023/000558\ndata/0023/000559\ndata/0023/000560\ndata/0023/000561\ndata/0023/000562\ndata/0023/000563\ndata/0023/000564\ndata/0023/000565\ndata/0023/000566\ndata/0023/000567\ndata/0023/000568\ndata/0023/000569\ndata/0023/000570\ndata/0023/000571\ndata/0023/000572\ndata/0023/000573\ndata/0023/000574\ndata/0023/000575\ndata/0023/000576\ndata/0023/000577\ndata/0023/000578\ndata/0023/000579\ndata/0023/000580\ndata/0023/000581\ndata/0023/000582\ndata/0023/000583\ndata/0023/000584\ndata/0023/000585\ndata/0023/000586\ndata/0023/000587\ndata/0023/000588\ndata/0023/000589\ndata/0023/000590\ndata/0023/000591\ndata/0023/000592\ndata/0023/000593\ndata/0023/000594\ndata/0023/000595\ndata/0023/000596\ndata/0023/000597\ndata/0023/000598\ndata/0023/000599\ndata/0023/000600\ndata/0023/000601\ndata/0023/000602\ndata/0023/000603\ndata/0023/000604\ndata/0023/000605\ndata/0023/000606\ndata/0023/000607\ndata/0023/000608\ndata/0023/000609\ndata/0023/000610\ndata/0023/000611\ndata/0023/000612\ndata/0023/000613\ndata/0023/000614\ndata/0023/000615\ndata/0023/000616\ndata/0023/000617\ndata/0023/000618\ndata/0023/000619\ndata/0023/000620\ndata/0023/000621\ndata/0023/000622\ndata/0023/000623\ndata/0023/000624\ndata/0023/000625\ndata/0023/000626\ndata/0023/000627\ndata/0023/000628\ndata/0023/000629\ndata/0023/000630\ndata/0023/000631\ndata/0023/000632\ndata/0023/000633\ndata/0023/000634\ndata/0023/000635\ndata/0023/000636\ndata/0023/000637\ndata/0023/000638\ndata/0023/000639\ndata/0023/000640\ndata/0023/000641\ndata/0023/000642\ndata/0023/000643\ndata/0023/000644\ndata/0023/000645\ndata/0023/000646\ndata/0023/000647\ndata/0023/000648\ndata/0023/000649\ndata/0023/000650\ndata/0023/000651\ndata/0023/000652\ndata/0023/000653\ndata/0023/000654\ndata/0023/000655\ndata/0023/000656\ndata/0023/000657\ndata/0023/000658\ndata/0023/000659\ndata/0023/000660\ndata/0023/000661\ndata/0023/000662\ndata/0023/000663\ndata/0023/000664\ndata/0023/000665\ndata/0023/000666\ndata/0023/000667\ndata/0023/000668\ndata/0023/000669\ndata/0023/000670\ndata/0023/000671\ndata/0023/000672\ndata/0023/000673\ndata/0023/000674\ndata/0023/000675\ndata/0023/000676\ndata/0023/000677\ndata/0023/000678\ndata/0023/000679\ndata/0023/000680\ndata/0023/000681\ndata/0023/000682\ndata/0023/000683\ndata/0023/000684\ndata/0023/000685\ndata/0023/000686\ndata/0023/000687\ndata/0023/000688\ndata/0023/000689\ndata/0023/000690\ndata/0023/000691\ndata/0023/000692\ndata/0023/000693\ndata/0023/000694\ndata/0023/000695\ndata/0023/000696\ndata/0023/000697\ndata/0023/000698\ndata/0023/000699\ndata/0023/000700\ndata/0023/000701\ndata/0023/000702\ndata/0023/000703\ndata/0023/000704\ndata/0023/000705\ndata/0023/000706\ndata/0023/000707\ndata/0023/000708\ndata/0023/000709\ndata/0023/000710\ndata/0023/000711\ndata/0023/000712\ndata/0023/000713\ndata/0023/000714\ndata/0023/000715\ndata/0023/000716\ndata/0023/000717\ndata/0023/000718\ndata/0023/000719\ndata/0023/000720\ndata/0023/000721\ndata/0023/000722\ndata/0023/000723\ndata/0023/000724\ndata/0023/000725\ndata/0023/000726\ndata/0023/000727\ndata/0023/000728\ndata/0023/000729\ndata/0023/000730\ndata/0023/000731\ndata/0023/000732\ndata/0023/000733\ndata/0023/000734\ndata/0023/000735\ndata/0023/000736\ndata/0023/000737\ndata/0023/000738\ndata/0023/000739\ndata/0023/000740\ndata/0023/000741\ndata/0023/000742\ndata/0023/000743\ndata/0023/000744\ndata/0023/000745\ndata/0023/000746\ndata/0023/000747\ndata/0023/000748\ndata/0023/000749\ndata/0023/000750\ndata/0023/000751\ndata/0023/000752\ndata/0023/000753\ndata/0023/000754\ndata/0023/000755\ndata/0023/000756\ndata/0023/000757\ndata/0023/000758\ndata/0023/000759\ndata/0023/000760\ndata/0023/000761\ndata/0023/000762\ndata/0023/000763\ndata/0023/000764\ndata/0023/000765\ndata/0023/000766\ndata/0023/000767\ndata/0023/000768\ndata/0023/000769\ndata/0023/000770\ndata/0023/000771\ndata/0023/000772\ndata/0023/000773\ndata/0023/000774\ndata/0023/000775\ndata/0023/000776\ndata/0023/000777\ndata/0023/000778\ndata/0023/000779\ndata/0023/000780\ndata/0023/000781\ndata/0023/000782\ndata/0023/000783\ndata/0023/000784\ndata/0023/000785\ndata/0023/000786\ndata/0023/000787\ndata/0023/000788\ndata/0023/000789\ndata/0023/000790\ndata/0023/000791\ndata/0023/000792\ndata/0023/000793\ndata/0023/000794\ndata/0023/000795\ndata/0023/000796\ndata/0023/000797\ndata/0023/000798\ndata/0023/000799\ndata/0023/000800\ndata/0023/000801\ndata/0023/000802\ndata/0023/000803\ndata/0023/000804\ndata/0023/000805\ndata/0023/000806\ndata/0023/000807\ndata/0023/000808\ndata/0023/000809\ndata/0023/000810\ndata/0023/000811\ndata/0023/000812\ndata/0023/000813\ndata/0023/000814\ndata/0023/000815\ndata/0023/000816\ndata/0023/000817\ndata/0023/000818\ndata/0023/000819\ndata/0023/000820\ndata/0023/000821\ndata/0023/000822\ndata/0023/000823\ndata/0023/000824\ndata/0023/000825\ndata/0023/000826\ndata/0023/000827\ndata/0023/000828\ndata/0023/000829\ndata/0023/000830\ndata/0023/000831\ndata/0023/000832\ndata/0023/000833\ndata/0023/000834\ndata/0023/000835\ndata/0023/000836\ndata/0023/000837\ndata/0023/000838\ndata/0023/000839\ndata/0023/000840\ndata/0023/000841\ndata/0023/000842\ndata/0023/000843\ndata/0023/000844\ndata/0023/000845\ndata/0023/000846\ndata/0023/000847\ndata/0023/000848\ndata/0023/000849\ndata/0023/000850\ndata/0023/000851\ndata/0023/000852\ndata/0023/000853\ndata/0023/000854\ndata/0023/000855\ndata/0023/000856\ndata/0023/000857\ndata/0023/000858\ndata/0023/000859\ndata/0023/000860\ndata/0023/000861\ndata/0023/000862\ndata/0023/000863\ndata/0023/000864\ndata/0023/000865\ndata/0023/000866\ndata/0023/000867\ndata/0023/000868\ndata/0023/000869\ndata/0023/000870\ndata/0023/000871\ndata/0023/000872\ndata/0023/000873\ndata/0023/000874\ndata/0023/000875\ndata/0023/000876\ndata/0023/000877\ndata/0023/000878\ndata/0023/000879\ndata/0023/000880\ndata/0023/000881\ndata/0023/000882\ndata/0023/000883\ndata/0023/000884\ndata/0023/000885\ndata/0023/000886\ndata/0023/000887\ndata/0023/000888\ndata/0023/000889\ndata/0023/000890\ndata/0023/000891\ndata/0023/000892\ndata/0023/000893\ndata/0023/000894\ndata/0023/000895\ndata/0023/000896\ndata/0023/000897\ndata/0023/000898\ndata/0023/000899\ndata/0023/000900\ndata/0023/000901\ndata/0023/000902\ndata/0023/000903\ndata/0023/000904\ndata/0023/000905\ndata/0023/000906\ndata/0023/000907\ndata/0023/000908\ndata/0023/000909\ndata/0023/000910\ndata/0023/000911\ndata/0023/000912\ndata/0023/000913\ndata/0023/000914\ndata/0023/000915\ndata/0023/000916\ndata/0023/000917\ndata/0023/000918\ndata/0023/000919\ndata/0023/000920\ndata/0023/000921\ndata/0023/000922\ndata/0023/000923\ndata/0023/000924\ndata/0023/000925\ndata/0023/000926\ndata/0023/000927\ndata/0023/000928\ndata/0023/000929\ndata/0023/000930\ndata/0023/000931\ndata/0023/000932\ndata/0023/000933\ndata/0023/000934\ndata/0023/000935\ndata/0023/000936\ndata/0023/000937\ndata/0023/000938\ndata/0023/000939\ndata/0023/000940\ndata/0023/000941\ndata/0023/000942\ndata/0023/000943\ndata/0023/000944\ndata/0023/000945\ndata/0023/000946\ndata/0023/000947\ndata/0023/000948\ndata/0023/000949\ndata/0023/000950\ndata/0023/000951\ndata/0023/000952\ndata/0023/000953\ndata/0023/000954\ndata/0023/000955\ndata/0023/000956\ndata/0023/000957\ndata/0023/000958\ndata/0023/000959\ndata/0023/000960\ndata/0023/000961\ndata/0023/000962\ndata/0023/000963\ndata/0023/000964\ndata/0023/000965\ndata/0023/000966\ndata/0023/000967\ndata/0023/000968\ndata/0023/000969\ndata/0023/000970\ndata/0023/000971\ndata/0023/000972\ndata/0023/000973\ndata/0023/000974\ndata/0023/000975\ndata/0023/000976\ndata/0023/000977\ndata/0023/000978\ndata/0023/000979\ndata/0023/000980\ndata/0023/000981\ndata/0023/000982\ndata/0023/000983\ndata/0023/000984\ndata/0023/000985\ndata/0023/000986\ndata/0023/000987\ndata/0023/000988\ndata/0023/000989\ndata/0023/000990\ndata/0023/000991\ndata/0023/000992\ndata/0023/000993\ndata/0023/000994\ndata/0023/000995\ndata/0023/000996\ndata/0023/000997\ndata/0023/000998\ndata/0023/000999\ndata/0023/001000\ndata/0023/001001\ndata/0023/001002\ndata/0023/001003\ndata/0023/001004\ndata/0023/001005\ndata/0023/001006\ndata/0023/001007\ndata/0023/001008\ndata/0023/001009\ndata/0023/001010\ndata/0023/001011\ndata/0023/001012\ndata/0023/001013\ndata/0023/001014\ndata/0023/001015\ndata/0023/001016\ndata/0023/001017\ndata/0023/001018\ndata/0023/001019\ndata/0023/001020\ndata/0023/001021\ndata/0023/001022\ndata/0023/001023\ndata/0023/001024\ndata/0023/001025\ndata/0023/001026\ndata/0023/001027\ndata/0023/001028\ndata/0023/001029\ndata/0023/001030\ndata/0023/001031\ndata/0023/001032\ndata/0023/001033\ndata/0023/001034\ndata/0023/001035\ndata/0023/001036\ndata/0023/001037\ndata/0023/001038\ndata/0023/001039\ndata/0023/001040\ndata/0023/001041\ndata/0023/001042\ndata/0023/001043\ndata/0023/001044\ndata/0023/001045\ndata/0023/001046\ndata/0023/001047\ndata/0023/001048\ndata/0023/001049\ndata/0023/001050\ndata/0023/001051\ndata/0023/001052\ndata/0023/001053\ndata/0023/001054\ndata/0023/001055\ndata/0023/001056\ndata/0023/001057\ndata/0023/001058\ndata/0023/001059\ndata/0023/001060\ndata/0023/001061\ndata/0023/001062\ndata/0023/001063\ndata/0024/000001\ndata/0024/000002\ndata/0024/000003\ndata/0024/000004\ndata/0024/000005\ndata/0024/000006\ndata/0024/000007\ndata/0024/000008\ndata/0024/000009\ndata/0024/000010\ndata/0024/000011\ndata/0024/000012\ndata/0024/000013\ndata/0024/000014\ndata/0024/000015\ndata/0024/000016\ndata/0024/000017\ndata/0024/000018\ndata/0024/000019\ndata/0024/000020\ndata/0024/000021\ndata/0024/000022\ndata/0024/000023\ndata/0024/000024\ndata/0024/000025\ndata/0024/000026\ndata/0024/000027\ndata/0024/000028\ndata/0024/000029\ndata/0024/000030\ndata/0024/000031\ndata/0024/000032\ndata/0024/000033\ndata/0024/000034\ndata/0024/000035\ndata/0024/000036\ndata/0024/000037\ndata/0024/000038\ndata/0024/000039\ndata/0024/000040\ndata/0024/000041\ndata/0024/000042\ndata/0024/000043\ndata/0024/000044\ndata/0024/000045\ndata/0024/000046\ndata/0024/000047\ndata/0024/000048\ndata/0024/000049\ndata/0024/000050\ndata/0024/000051\ndata/0024/000052\ndata/0024/000053\ndata/0024/000054\ndata/0024/000055\ndata/0024/000056\ndata/0024/000057\ndata/0024/000058\ndata/0024/000059\ndata/0024/000060\ndata/0024/000061\ndata/0024/000062\ndata/0024/000063\ndata/0024/000064\ndata/0024/000065\ndata/0024/000066\ndata/0024/000067\ndata/0024/000068\ndata/0024/000069\ndata/0024/000070\ndata/0024/000071\ndata/0024/000072\ndata/0024/000073\ndata/0024/000074\ndata/0024/000075\ndata/0024/000076\ndata/0024/000077\ndata/0024/000078\ndata/0024/000079\ndata/0024/000080\ndata/0024/000081\ndata/0024/000082\ndata/0024/000083\ndata/0024/000084\ndata/0024/000085\ndata/0024/000086\ndata/0024/000087\ndata/0024/000088\ndata/0024/000089\ndata/0024/000090\ndata/0024/000091\ndata/0024/000092\ndata/0024/000093\ndata/0024/000094\ndata/0024/000095\ndata/0024/000096\ndata/0024/000097\ndata/0024/000098\ndata/0024/000099\ndata/0024/000100\ndata/0024/000101\ndata/0024/000102\ndata/0024/000103\ndata/0024/000104\ndata/0024/000105\ndata/0024/000106\ndata/0024/000107\ndata/0024/000108\ndata/0024/000109\ndata/0024/000110\ndata/0024/000111\ndata/0024/000112\ndata/0024/000113\ndata/0024/000114\ndata/0024/000115\ndata/0024/000116\ndata/0024/000117\ndata/0024/000118\ndata/0024/000119\ndata/0024/000120\ndata/0024/000121\ndata/0024/000122\ndata/0024/000123\ndata/0024/000124\ndata/0024/000125\ndata/0024/000126\ndata/0024/000127\ndata/0024/000128\ndata/0024/000129\ndata/0024/000130\ndata/0024/000131\ndata/0024/000132\ndata/0024/000133\ndata/0024/000134\ndata/0024/000135\ndata/0024/000136\ndata/0024/000137\ndata/0024/000138\ndata/0024/000139\ndata/0024/000140\ndata/0024/000141\ndata/0024/000142\ndata/0024/000143\ndata/0024/000144\ndata/0024/000145\ndata/0024/000146\ndata/0024/000147\ndata/0024/000148\ndata/0024/000149\ndata/0024/000150\ndata/0024/000151\ndata/0024/000152\ndata/0024/000153\ndata/0024/000154\ndata/0024/000155\ndata/0024/000156\ndata/0024/000157\ndata/0024/000158\ndata/0024/000159\ndata/0024/000160\ndata/0024/000161\ndata/0024/000162\ndata/0024/000163\ndata/0024/000164\ndata/0024/000165\ndata/0024/000166\ndata/0024/000167\ndata/0024/000168\ndata/0024/000169\ndata/0024/000170\ndata/0024/000171\ndata/0024/000172\ndata/0024/000173\ndata/0024/000174\ndata/0024/000175\ndata/0024/000176\ndata/0024/000177\ndata/0024/000178\ndata/0024/000179\ndata/0024/000180\ndata/0024/000181\ndata/0024/000182\ndata/0024/000183\ndata/0024/000184\ndata/0024/000185\ndata/0024/000186\ndata/0024/000187\ndata/0024/000188\ndata/0024/000189\ndata/0024/000190\ndata/0024/000191\ndata/0024/000192\ndata/0024/000193\ndata/0024/000194\ndata/0024/000195\ndata/0024/000196\ndata/0024/000197\ndata/0024/000198\ndata/0024/000199\ndata/0024/000200\ndata/0024/000201\ndata/0024/000202\ndata/0024/000203\ndata/0024/000204\ndata/0024/000205\ndata/0024/000206\ndata/0024/000207\ndata/0024/000208\ndata/0024/000209\ndata/0024/000210\ndata/0024/000211\ndata/0024/000212\ndata/0024/000213\ndata/0024/000214\ndata/0024/000215\ndata/0024/000216\ndata/0024/000217\ndata/0024/000218\ndata/0024/000219\ndata/0024/000220\ndata/0024/000221\ndata/0024/000222\ndata/0024/000223\ndata/0024/000224\ndata/0024/000225\ndata/0024/000226\ndata/0024/000227\ndata/0024/000228\ndata/0024/000229\ndata/0024/000230\ndata/0024/000231\ndata/0024/000232\ndata/0024/000233\ndata/0024/000234\ndata/0024/000235\ndata/0024/000236\ndata/0024/000237\ndata/0024/000238\ndata/0024/000239\ndata/0024/000240\ndata/0024/000241\ndata/0024/000242\ndata/0024/000243\ndata/0024/000244\ndata/0024/000245\ndata/0024/000246\ndata/0024/000247\ndata/0024/000248\ndata/0024/000249\ndata/0024/000250\ndata/0024/000251\ndata/0024/000252\ndata/0024/000253\ndata/0024/000254\ndata/0024/000255\ndata/0024/000256\ndata/0024/000257\ndata/0024/000258\ndata/0024/000259\ndata/0024/000260\ndata/0024/000261\ndata/0024/000262\ndata/0024/000263\ndata/0024/000264\ndata/0024/000265\ndata/0024/000266\ndata/0024/000267\ndata/0024/000268\ndata/0024/000269\ndata/0024/000270\ndata/0024/000271\ndata/0024/000272\ndata/0024/000273\ndata/0024/000274\ndata/0024/000275\ndata/0024/000276\ndata/0024/000277\ndata/0024/000278\ndata/0024/000279\ndata/0024/000280\ndata/0024/000281\ndata/0024/000282\ndata/0024/000283\ndata/0024/000284\ndata/0024/000285\ndata/0024/000286\ndata/0024/000287\ndata/0024/000288\ndata/0024/000289\ndata/0024/000290\ndata/0024/000291\ndata/0024/000292\ndata/0024/000293\ndata/0024/000294\ndata/0024/000295\ndata/0024/000296\ndata/0024/000297\ndata/0024/000298\ndata/0024/000299\ndata/0024/000300\ndata/0024/000301\ndata/0024/000302\ndata/0024/000303\ndata/0024/000304\ndata/0024/000305\ndata/0024/000306\ndata/0024/000307\ndata/0024/000308\ndata/0024/000309\ndata/0024/000310\ndata/0024/000311\ndata/0024/000312\ndata/0024/000313\ndata/0024/000314\ndata/0024/000315\ndata/0024/000316\ndata/0024/000317\ndata/0024/000318\ndata/0024/000319\ndata/0024/000320\ndata/0024/000321\ndata/0024/000322\ndata/0024/000323\ndata/0024/000324\ndata/0024/000325\ndata/0024/000326\ndata/0024/000327\ndata/0024/000328\ndata/0024/000329\ndata/0024/000330\ndata/0024/000331\ndata/0024/000332\ndata/0024/000333\ndata/0024/000334\ndata/0024/000335\ndata/0024/000336\ndata/0024/000337\ndata/0024/000338\ndata/0024/000339\ndata/0024/000340\ndata/0024/000341\ndata/0024/000342\ndata/0024/000343\ndata/0024/000344\ndata/0024/000345\ndata/0024/000346\ndata/0024/000347\ndata/0024/000348\ndata/0024/000349\ndata/0024/000350\ndata/0024/000351\ndata/0024/000352\ndata/0024/000353\ndata/0024/000354\ndata/0024/000355\ndata/0024/000356\ndata/0024/000357\ndata/0024/000358\ndata/0024/000359\ndata/0024/000360\ndata/0024/000361\ndata/0024/000362\ndata/0024/000363\ndata/0024/000364\ndata/0024/000365\ndata/0024/000366\ndata/0024/000367\ndata/0024/000368\ndata/0024/000369\ndata/0024/000370\ndata/0024/000371\ndata/0024/000372\ndata/0024/000373\ndata/0024/000374\ndata/0024/000375\ndata/0024/000376\ndata/0024/000377\ndata/0024/000378\ndata/0024/000379\ndata/0024/000380\ndata/0024/000381\ndata/0024/000382\ndata/0024/000383\ndata/0024/000384\ndata/0024/000385\ndata/0024/000386\ndata/0024/000387\ndata/0024/000388\ndata/0024/000389\ndata/0024/000390\ndata/0024/000391\ndata/0024/000392\ndata/0024/000393\ndata/0024/000394\ndata/0024/000395\ndata/0024/000396\ndata/0024/000397\ndata/0024/000398\ndata/0024/000399\ndata/0024/000400\ndata/0024/000401\ndata/0024/000402\ndata/0024/000403\ndata/0024/000404\ndata/0024/000405\ndata/0024/000406\ndata/0024/000407\ndata/0024/000408\ndata/0024/000409\ndata/0024/000410\ndata/0024/000411\ndata/0024/000412\ndata/0024/000413\ndata/0024/000414\ndata/0024/000415\ndata/0024/000416\ndata/0024/000417\ndata/0024/000418\ndata/0024/000419\ndata/0024/000420\ndata/0024/000421\ndata/0024/000422\ndata/0024/000423\ndata/0024/000424\ndata/0024/000425\ndata/0024/000426\ndata/0024/000427\ndata/0024/000428\ndata/0024/000429\ndata/0024/000430\ndata/0024/000431\ndata/0024/000432\ndata/0024/000433\ndata/0024/000434\ndata/0024/000435\ndata/0024/000436\ndata/0024/000437\ndata/0024/000438\ndata/0024/000439\ndata/0024/000440\ndata/0024/000441\ndata/0024/000442\ndata/0024/000443\ndata/0024/000444\ndata/0024/000445\ndata/0024/000446\ndata/0024/000447\ndata/0024/000448\ndata/0024/000449\ndata/0024/000450\ndata/0024/000451\ndata/0024/000452\ndata/0024/000453\ndata/0024/000454\ndata/0024/000455\ndata/0024/000456\ndata/0024/000457\ndata/0024/000458\ndata/0024/000459\ndata/0024/000460\ndata/0024/000461\ndata/0024/000462\ndata/0024/000463\ndata/0024/000464\ndata/0024/000465\ndata/0024/000466\ndata/0024/000467\ndata/0024/000468\ndata/0024/000469\ndata/0024/000470\ndata/0024/000471\ndata/0024/000472\ndata/0024/000473\ndata/0024/000474\ndata/0024/000475\ndata/0024/000476\ndata/0024/000477\ndata/0024/000478\ndata/0024/000479\ndata/0024/000480\ndata/0024/000481\ndata/0024/000482\ndata/0024/000483\ndata/0024/000484\ndata/0024/000485\ndata/0024/000486\ndata/0024/000487\ndata/0024/000488\ndata/0024/000489\ndata/0024/000490\ndata/0024/000491\ndata/0024/000492\ndata/0024/000493\ndata/0024/000494\ndata/0024/000495\ndata/0024/000496\ndata/0024/000497\ndata/0024/000498\ndata/0024/000499\ndata/0024/000500\ndata/0024/000501\ndata/0024/000502\ndata/0024/000503\ndata/0024/000504\ndata/0024/000505\ndata/0024/000506\ndata/0024/000507\ndata/0024/000508\ndata/0024/000509\ndata/0024/000510\ndata/0024/000511\ndata/0024/000512\ndata/0024/000513\ndata/0024/000514\ndata/0024/000515\ndata/0024/000516\ndata/0024/000517\ndata/0024/000518\ndata/0024/000519\ndata/0024/000520\ndata/0024/000521\ndata/0024/000522\ndata/0024/000523\ndata/0024/000524\ndata/0024/000525\ndata/0024/000526\ndata/0024/000527\ndata/0024/000528\ndata/0024/000529\ndata/0024/000530\ndata/0024/000531\ndata/0024/000532\ndata/0024/000533\ndata/0024/000534\ndata/0024/000535\ndata/0024/000536\ndata/0024/000537\ndata/0024/000538\ndata/0024/000539\ndata/0024/000540\ndata/0024/000541\ndata/0024/000542\ndata/0024/000543\ndata/0024/000544\ndata/0024/000545\ndata/0024/000546\ndata/0024/000547\ndata/0024/000548\ndata/0024/000549\ndata/0024/000550\ndata/0024/000551\ndata/0024/000552\ndata/0024/000553\ndata/0024/000554\ndata/0024/000555\ndata/0024/000556\ndata/0024/000557\ndata/0024/000558\ndata/0024/000559\ndata/0024/000560\ndata/0024/000561\ndata/0024/000562\ndata/0024/000563\ndata/0024/000564\ndata/0024/000565\ndata/0024/000566\ndata/0024/000567\ndata/0024/000568\ndata/0024/000569\ndata/0024/000570\ndata/0024/000571\ndata/0024/000572\ndata/0024/000573\ndata/0024/000574\ndata/0024/000575\ndata/0024/000576\ndata/0024/000577\ndata/0024/000578\ndata/0024/000579\ndata/0024/000580\ndata/0024/000581\ndata/0024/000582\ndata/0024/000583\ndata/0024/000584\ndata/0024/000585\ndata/0024/000586\ndata/0024/000587\ndata/0024/000588\ndata/0024/000589\ndata/0024/000590\ndata/0024/000591\ndata/0024/000592\ndata/0024/000593\ndata/0024/000594\ndata/0024/000595\ndata/0024/000596\ndata/0024/000597\ndata/0024/000598\ndata/0024/000599\ndata/0024/000600\ndata/0024/000601\ndata/0024/000602\ndata/0024/000603\ndata/0024/000604\ndata/0024/000605\ndata/0024/000606\ndata/0024/000607\ndata/0024/000608\ndata/0024/000609\ndata/0024/000610\ndata/0024/000611\ndata/0024/000612\ndata/0024/000613\ndata/0024/000614\ndata/0024/000615\ndata/0024/000616\ndata/0024/000617\ndata/0024/000618\ndata/0024/000619\ndata/0024/000620\ndata/0024/000621\ndata/0024/000622\ndata/0024/000623\ndata/0024/000624\ndata/0024/000625\ndata/0024/000626\ndata/0024/000627\ndata/0024/000628\ndata/0024/000629\ndata/0024/000630\ndata/0024/000631\ndata/0024/000632\ndata/0024/000633\ndata/0024/000634\ndata/0024/000635\ndata/0024/000636\ndata/0024/000637\ndata/0024/000638\ndata/0024/000639\ndata/0024/000640\ndata/0024/000641\ndata/0024/000642\ndata/0024/000643\ndata/0024/000644\ndata/0024/000645\ndata/0024/000646\ndata/0024/000647\ndata/0024/000648\ndata/0024/000649\ndata/0024/000650\ndata/0024/000651\ndata/0024/000652\ndata/0024/000653\ndata/0024/000654\ndata/0024/000655\ndata/0024/000656\ndata/0024/000657\ndata/0024/000658\ndata/0024/000659\ndata/0024/000660\ndata/0024/000661\ndata/0024/000662\ndata/0024/000663\ndata/0024/000664\ndata/0024/000665\ndata/0024/000666\ndata/0024/000667\ndata/0024/000668\ndata/0024/000669\ndata/0024/000670\ndata/0024/000671\ndata/0024/000672\ndata/0024/000673\ndata/0024/000674\ndata/0024/000675\ndata/0024/000676\ndata/0024/000677\ndata/0024/000678\ndata/0024/000679\ndata/0024/000680\ndata/0024/000681\ndata/0024/000682\ndata/0024/000683\ndata/0024/000684\ndata/0024/000685\ndata/0024/000686\ndata/0024/000687\ndata/0024/000688\ndata/0024/000689\ndata/0024/000690\ndata/0024/000691\ndata/0024/000692\ndata/0024/000693\ndata/0024/000694\ndata/0024/000695\ndata/0024/000696\ndata/0024/000697\ndata/0024/000698\ndata/0024/000699\ndata/0024/000700\ndata/0024/000701\ndata/0024/000702\ndata/0024/000703\ndata/0024/000704\ndata/0024/000705\ndata/0024/000706\ndata/0024/000707\ndata/0024/000708\ndata/0024/000709\ndata/0024/000710\ndata/0024/000711\ndata/0024/000712\ndata/0024/000713\ndata/0024/000714\ndata/0024/000715\ndata/0024/000716\ndata/0024/000717\ndata/0024/000718\ndata/0024/000719\ndata/0024/000720\ndata/0024/000721\ndata/0024/000722\ndata/0024/000723\ndata/0024/000724\ndata/0024/000725\ndata/0024/000726\ndata/0024/000727\ndata/0024/000728\ndata/0024/000729\ndata/0024/000730\ndata/0024/000731\ndata/0024/000732\ndata/0024/000733\ndata/0024/000734\ndata/0024/000735\ndata/0024/000736\ndata/0024/000737\ndata/0024/000738\ndata/0024/000739\ndata/0024/000740\ndata/0024/000741\ndata/0024/000742\ndata/0024/000743\ndata/0024/000744\ndata/0024/000745\ndata/0024/000746\ndata/0024/000747\ndata/0024/000748\ndata/0024/000749\ndata/0024/000750\ndata/0024/000751\ndata/0024/000752\ndata/0024/000753\ndata/0024/000754\ndata/0024/000755\ndata/0024/000756\ndata/0024/000757\ndata/0024/000758\ndata/0024/000759\ndata/0024/000760\ndata/0024/000761\ndata/0024/000762\ndata/0024/000763\ndata/0024/000764\ndata/0024/000765\ndata/0024/000766\ndata/0024/000767\ndata/0024/000768\ndata/0024/000769\ndata/0024/000770\ndata/0024/000771\ndata/0024/000772\ndata/0024/000773\ndata/0024/000774\ndata/0024/000775\ndata/0024/000776\ndata/0024/000777\ndata/0024/000778\ndata/0024/000779\ndata/0024/000780\ndata/0024/000781\ndata/0024/000782\ndata/0024/000783\ndata/0024/000784\ndata/0024/000785\ndata/0024/000786\ndata/0024/000787\ndata/0024/000788\ndata/0024/000789\ndata/0024/000790\ndata/0024/000791\ndata/0024/000792\ndata/0024/000793\ndata/0024/000794\ndata/0024/000795\ndata/0024/000796\ndata/0024/000797\ndata/0024/000798\ndata/0024/000799\ndata/0024/000800\ndata/0024/000801\ndata/0024/000802\ndata/0024/000803\ndata/0024/000804\ndata/0024/000805\ndata/0024/000806\ndata/0024/000807\ndata/0024/000808\ndata/0024/000809\ndata/0024/000810\ndata/0024/000811\ndata/0024/000812\ndata/0024/000813\ndata/0024/000814\ndata/0024/000815\ndata/0024/000816\ndata/0024/000817\ndata/0024/000818\ndata/0024/000819\ndata/0024/000820\ndata/0024/000821\ndata/0024/000822\ndata/0024/000823\ndata/0024/000824\ndata/0024/000825\ndata/0024/000826\ndata/0024/000827\ndata/0024/000828\ndata/0024/000829\ndata/0024/000830\ndata/0024/000831\ndata/0024/000832\ndata/0024/000833\ndata/0024/000834\ndata/0024/000835\ndata/0024/000836\ndata/0024/000837\ndata/0024/000838\ndata/0024/000839\ndata/0024/000840\ndata/0024/000841\ndata/0024/000842\ndata/0024/000843\ndata/0024/000844\ndata/0024/000845\ndata/0024/000846\ndata/0024/000847\ndata/0024/000848\ndata/0024/000849\ndata/0024/000850\ndata/0024/000851\ndata/0024/000852\ndata/0024/000853\ndata/0024/000854\ndata/0024/000855\ndata/0024/000856\ndata/0024/000857\ndata/0024/000858\ndata/0024/000859\ndata/0024/000860\ndata/0024/000861\ndata/0024/000862\ndata/0024/000863\ndata/0024/000864\ndata/0024/000865\ndata/0024/000866\ndata/0024/000867\ndata/0024/000868\ndata/0024/000869\ndata/0024/000870\ndata/0024/000871\ndata/0024/000872\ndata/0024/000873\ndata/0024/000874\ndata/0024/000875\ndata/0024/000876\ndata/0024/000877\ndata/0024/000878\ndata/0024/000879\ndata/0024/000880\ndata/0024/000881\ndata/0024/000882\ndata/0024/000883\ndata/0024/000884\ndata/0024/000885\ndata/0024/000886\ndata/0024/000887\ndata/0024/000888\ndata/0024/000889\ndata/0024/000890\ndata/0024/000891\ndata/0024/000892\ndata/0024/000893\ndata/0024/000894\ndata/0024/000895\ndata/0024/000896\ndata/0024/000897\ndata/0024/000898\ndata/0024/000899\ndata/0024/000900\ndata/0024/000901\ndata/0024/000902\ndata/0024/000903\ndata/0024/000904\ndata/0024/000905\ndata/0024/000906\ndata/0024/000907\ndata/0024/000908\ndata/0024/000909\ndata/0024/000910\ndata/0024/000911\ndata/0024/000912\ndata/0024/000913\ndata/0024/000914\ndata/0024/000915\ndata/0024/000916\ndata/0024/000917\ndata/0024/000918\ndata/0024/000919\ndata/0024/000920\ndata/0024/000921\ndata/0024/000922\ndata/0024/000923\ndata/0024/000924\ndata/0024/000925\ndata/0024/000926\ndata/0024/000927\ndata/0024/000928\ndata/0024/000929\ndata/0024/000930\ndata/0024/000931\ndata/0024/000932\ndata/0024/000933\ndata/0024/000934\ndata/0024/000935\ndata/0024/000936\ndata/0024/000937\ndata/0024/000938\ndata/0024/000939\ndata/0024/000940\ndata/0024/000941\ndata/0024/000942\ndata/0024/000943\ndata/0024/000944\ndata/0024/000945\ndata/0024/000946\ndata/0024/000947\ndata/0024/000948\ndata/0024/000949\ndata/0024/000950\ndata/0024/000951\ndata/0024/000952\ndata/0024/000953\ndata/0024/000954\ndata/0024/000955\ndata/0024/000956\ndata/0024/000957\ndata/0024/000958\ndata/0024/000959\ndata/0024/000960\ndata/0024/000961\ndata/0024/000962\ndata/0024/000963\ndata/0024/000964\ndata/0024/000965\ndata/0024/000966\ndata/0024/000967\ndata/0024/000968\ndata/0024/000969\ndata/0024/000970\ndata/0033/000001\ndata/0033/000002\ndata/0033/000003\ndata/0033/000004\ndata/0033/000005\ndata/0033/000006\ndata/0033/000007\ndata/0033/000008\ndata/0033/000009\ndata/0033/000010\ndata/0033/000011\ndata/0033/000012\ndata/0033/000013\ndata/0033/000014\ndata/0033/000015\ndata/0033/000016\ndata/0033/000017\ndata/0033/000018\ndata/0033/000019\ndata/0033/000020\ndata/0033/000021\ndata/0033/000022\ndata/0033/000023\ndata/0033/000024\ndata/0033/000025\ndata/0033/000026\ndata/0033/000027\ndata/0033/000028\ndata/0033/000029\ndata/0033/000030\ndata/0033/000031\ndata/0033/000032\ndata/0033/000033\ndata/0033/000034\ndata/0033/000035\ndata/0033/000036\ndata/0033/000037\ndata/0033/000038\ndata/0033/000039\ndata/0033/000040\ndata/0033/000041\ndata/0033/000042\ndata/0033/000043\ndata/0033/000044\ndata/0033/000045\ndata/0033/000046\ndata/0033/000047\ndata/0033/000048\ndata/0033/000049\ndata/0033/000050\ndata/0033/000051\ndata/0033/000052\ndata/0033/000053\ndata/0033/000054\ndata/0033/000055\ndata/0033/000056\ndata/0033/000057\ndata/0033/000058\ndata/0033/000059\ndata/0033/000060\ndata/0033/000061\ndata/0033/000062\ndata/0033/000063\ndata/0033/000064\ndata/0033/000065\ndata/0033/000066\ndata/0033/000067\ndata/0033/000068\ndata/0033/000069\ndata/0033/000070\ndata/0033/000071\ndata/0033/000072\ndata/0033/000073\ndata/0033/000074\ndata/0033/000075\ndata/0033/000076\ndata/0033/000077\ndata/0033/000078\ndata/0033/000079\ndata/0033/000080\ndata/0033/000081\ndata/0033/000082\ndata/0033/000083\ndata/0033/000084\ndata/0033/000085\ndata/0033/000086\ndata/0033/000087\ndata/0033/000088\ndata/0033/000089\ndata/0033/000090\ndata/0033/000091\ndata/0033/000092\ndata/0033/000093\ndata/0033/000094\ndata/0033/000095\ndata/0033/000096\ndata/0033/000097\ndata/0033/000098\ndata/0033/000099\ndata/0033/000100\ndata/0033/000101\ndata/0033/000102\ndata/0033/000103\ndata/0033/000104\ndata/0033/000105\ndata/0033/000106\ndata/0033/000107\ndata/0033/000108\ndata/0033/000109\ndata/0033/000110\ndata/0033/000111\ndata/0033/000112\ndata/0033/000113\ndata/0033/000114\ndata/0033/000115\ndata/0033/000116\ndata/0033/000117\ndata/0033/000118\ndata/0033/000119\ndata/0033/000120\ndata/0033/000121\ndata/0033/000122\ndata/0033/000123\ndata/0033/000124\ndata/0033/000125\ndata/0033/000126\ndata/0033/000127\ndata/0033/000128\ndata/0033/000129\ndata/0033/000130\ndata/0033/000131\ndata/0033/000132\ndata/0033/000133\ndata/0033/000134\ndata/0033/000135\ndata/0033/000136\ndata/0033/000137\ndata/0033/000138\ndata/0033/000139\ndata/0033/000140\ndata/0033/000141\ndata/0033/000142\ndata/0033/000143\ndata/0033/000144\ndata/0033/000145\ndata/0033/000146\ndata/0033/000147\ndata/0033/000148\ndata/0033/000149\ndata/0033/000150\ndata/0033/000151\ndata/0033/000152\ndata/0033/000153\ndata/0033/000154\ndata/0033/000155\ndata/0033/000156\ndata/0033/000157\ndata/0033/000158\ndata/0033/000159\ndata/0033/000160\ndata/0033/000161\ndata/0033/000162\ndata/0033/000163\ndata/0033/000164\ndata/0033/000165\ndata/0033/000166\ndata/0033/000167\ndata/0033/000168\ndata/0033/000169\ndata/0033/000170\ndata/0033/000171\ndata/0033/000172\ndata/0033/000173\ndata/0033/000174\ndata/0033/000175\ndata/0033/000176\ndata/0033/000177\ndata/0033/000178\ndata/0033/000179\ndata/0033/000180\ndata/0033/000181\ndata/0033/000182\ndata/0033/000183\ndata/0033/000184\ndata/0033/000185\ndata/0033/000186\ndata/0033/000187\ndata/0033/000188\ndata/0033/000189\ndata/0033/000190\ndata/0033/000191\ndata/0033/000192\ndata/0033/000193\ndata/0033/000194\ndata/0033/000195\ndata/0033/000196\ndata/0033/000197\ndata/0033/000198\ndata/0033/000199\ndata/0033/000200\ndata/0033/000201\ndata/0033/000202\ndata/0033/000203\ndata/0033/000204\ndata/0033/000205\ndata/0033/000206\ndata/0033/000207\ndata/0033/000208\ndata/0033/000209\ndata/0033/000210\ndata/0033/000211\ndata/0033/000212\ndata/0033/000213\ndata/0033/000214\ndata/0033/000215\ndata/0033/000216\ndata/0033/000217\ndata/0033/000218\ndata/0033/000219\ndata/0033/000220\ndata/0033/000221\ndata/0033/000222\ndata/0033/000223\ndata/0033/000224\ndata/0033/000225\ndata/0033/000226\ndata/0033/000227\ndata/0033/000228\ndata/0033/000229\ndata/0033/000230\ndata/0033/000231\ndata/0033/000232\ndata/0033/000233\ndata/0033/000234\ndata/0033/000235\ndata/0033/000236\ndata/0033/000237\ndata/0033/000238\ndata/0033/000239\ndata/0033/000240\ndata/0033/000241\ndata/0033/000242\ndata/0033/000243\ndata/0033/000244\ndata/0033/000245\ndata/0033/000246\ndata/0033/000247\ndata/0033/000248\ndata/0033/000249\ndata/0033/000250\ndata/0033/000251\ndata/0033/000252\ndata/0033/000253\ndata/0033/000254\ndata/0033/000255\ndata/0033/000256\ndata/0033/000257\ndata/0033/000258\ndata/0033/000259\ndata/0033/000260\ndata/0033/000261\ndata/0033/000262\ndata/0033/000263\ndata/0033/000264\ndata/0033/000265\ndata/0033/000266\ndata/0033/000267\ndata/0033/000268\ndata/0033/000269\ndata/0033/000270\ndata/0033/000271\ndata/0033/000272\ndata/0033/000273\ndata/0033/000274\ndata/0033/000275\ndata/0033/000276\ndata/0033/000277\ndata/0033/000278\ndata/0033/000279\ndata/0033/000280\ndata/0033/000281\ndata/0033/000282\ndata/0033/000283\ndata/0033/000284\ndata/0033/000285\ndata/0033/000286\ndata/0033/000287\ndata/0033/000288\ndata/0033/000289\ndata/0033/000290\ndata/0033/000291\ndata/0033/000292\ndata/0033/000293\ndata/0033/000294\ndata/0033/000295\ndata/0033/000296\ndata/0033/000297\ndata/0033/000298\ndata/0033/000299\ndata/0033/000300\ndata/0033/000301\ndata/0033/000302\ndata/0033/000303\ndata/0033/000304\ndata/0033/000305\ndata/0033/000306\ndata/0033/000307\ndata/0033/000308\ndata/0033/000309\ndata/0033/000310\ndata/0033/000311\ndata/0033/000312\ndata/0033/000313\ndata/0033/000314\ndata/0033/000315\ndata/0033/000316\ndata/0033/000317\ndata/0033/000318\ndata/0033/000319\ndata/0033/000320\ndata/0033/000321\ndata/0033/000322\ndata/0033/000323\ndata/0033/000324\ndata/0033/000325\ndata/0033/000326\ndata/0033/000327\ndata/0033/000328\ndata/0033/000329\ndata/0033/000330\ndata/0033/000331\ndata/0033/000332\ndata/0033/000333\ndata/0033/000334\ndata/0033/000335\ndata/0033/000336\ndata/0033/000337\ndata/0033/000338\ndata/0033/000339\ndata/0033/000340\ndata/0033/000341\ndata/0033/000342\ndata/0033/000343\ndata/0033/000344\ndata/0033/000345\ndata/0033/000346\ndata/0033/000347\ndata/0033/000348\ndata/0033/000349\ndata/0033/000350\ndata/0033/000351\ndata/0033/000352\ndata/0033/000353\ndata/0033/000354\ndata/0033/000355\ndata/0033/000356\ndata/0033/000357\ndata/0033/000358\ndata/0033/000359\ndata/0033/000360\ndata/0033/000361\ndata/0033/000362\ndata/0033/000363\ndata/0033/000364\ndata/0033/000365\ndata/0033/000366\ndata/0033/000367\ndata/0033/000368\ndata/0033/000369\ndata/0033/000370\ndata/0033/000371\ndata/0033/000372\ndata/0033/000373\ndata/0033/000374\ndata/0033/000375\ndata/0033/000376\ndata/0033/000377\ndata/0033/000378\ndata/0033/000379\ndata/0033/000380\ndata/0033/000381\ndata/0033/000382\ndata/0033/000383\ndata/0033/000384\ndata/0033/000385\ndata/0033/000386\ndata/0033/000387\ndata/0033/000388\ndata/0033/000389\ndata/0033/000390\ndata/0033/000391\ndata/0033/000392\ndata/0033/000393\ndata/0033/000394\ndata/0033/000395\ndata/0033/000396\ndata/0033/000397\ndata/0033/000398\ndata/0033/000399\ndata/0033/000400\ndata/0033/000401\ndata/0033/000402\ndata/0033/000403\ndata/0033/000404\ndata/0033/000405\ndata/0033/000406\ndata/0033/000407\ndata/0033/000408\ndata/0033/000409\ndata/0033/000410\ndata/0033/000411\ndata/0033/000412\ndata/0033/000413\ndata/0033/000414\ndata/0033/000415\ndata/0033/000416\ndata/0033/000417\ndata/0033/000418\ndata/0033/000419\ndata/0033/000420\ndata/0033/000421\ndata/0033/000422\ndata/0033/000423\ndata/0033/000424\ndata/0033/000425\ndata/0033/000426\ndata/0033/000427\ndata/0033/000428\ndata/0033/000429\ndata/0033/000430\ndata/0033/000431\ndata/0033/000432\ndata/0033/000433\ndata/0033/000434\ndata/0033/000435\ndata/0033/000436\ndata/0033/000437\ndata/0033/000438\ndata/0033/000439\ndata/0033/000440\ndata/0033/000441\ndata/0033/000442\ndata/0033/000443\ndata/0033/000444\ndata/0033/000445\ndata/0033/000446\ndata/0033/000447\ndata/0033/000448\ndata/0033/000449\ndata/0033/000450\ndata/0033/000451\ndata/0033/000452\ndata/0033/000453\ndata/0033/000454\ndata/0033/000455\ndata/0033/000456\ndata/0033/000457\ndata/0033/000458\ndata/0033/000459\ndata/0033/000460\ndata/0033/000461\ndata/0033/000462\ndata/0033/000463\ndata/0033/000464\ndata/0033/000465\ndata/0033/000466\ndata/0033/000467\ndata/0033/000468\ndata/0033/000469\ndata/0033/000470\ndata/0033/000471\ndata/0033/000472\ndata/0033/000473\ndata/0033/000474\ndata/0033/000475\ndata/0033/000476\ndata/0033/000477\ndata/0033/000478\ndata/0033/000479\ndata/0033/000480\ndata/0033/000481\ndata/0033/000482\ndata/0033/000483\ndata/0033/000484\ndata/0033/000485\ndata/0033/000486\ndata/0033/000487\ndata/0033/000488\ndata/0033/000489\ndata/0033/000490\ndata/0033/000491\ndata/0033/000492\ndata/0033/000493\ndata/0033/000494\ndata/0033/000495\ndata/0033/000496\ndata/0033/000497\ndata/0033/000498\ndata/0033/000499\ndata/0033/000500\ndata/0033/000501\ndata/0033/000502\ndata/0033/000503\ndata/0033/000504\ndata/0033/000505\ndata/0033/000506\ndata/0033/000507\ndata/0033/000508\ndata/0033/000509\ndata/0033/000510\ndata/0033/000511\ndata/0033/000512\ndata/0033/000513\ndata/0033/000514\ndata/0033/000515\ndata/0033/000516\ndata/0033/000517\ndata/0033/000518\ndata/0033/000519\ndata/0033/000520\ndata/0033/000521\ndata/0033/000522\ndata/0033/000523\ndata/0033/000524\ndata/0033/000525\ndata/0033/000526\ndata/0033/000527\ndata/0033/000528\ndata/0033/000529\ndata/0033/000530\ndata/0033/000531\ndata/0033/000532\ndata/0033/000533\ndata/0033/000534\ndata/0033/000535\ndata/0033/000536\ndata/0033/000537\ndata/0033/000538\ndata/0033/000539\ndata/0033/000540\ndata/0033/000541\ndata/0033/000542\ndata/0033/000543\ndata/0033/000544\ndata/0033/000545\ndata/0033/000546\ndata/0033/000547\ndata/0033/000548\ndata/0033/000549\ndata/0033/000550\ndata/0033/000551\ndata/0033/000552\ndata/0033/000553\ndata/0033/000554\ndata/0033/000555\ndata/0033/000556\ndata/0033/000557\ndata/0033/000558\ndata/0033/000559\ndata/0033/000560\ndata/0033/000561\ndata/0033/000562\ndata/0033/000563\ndata/0033/000564\ndata/0033/000565\ndata/0033/000566\ndata/0033/000567\ndata/0033/000568\ndata/0033/000569\ndata/0033/000570\ndata/0033/000571\ndata/0033/000572\ndata/0033/000573\ndata/0033/000574\ndata/0033/000575\ndata/0033/000576\ndata/0033/000577\ndata/0033/000578\ndata/0033/000579\ndata/0033/000580\ndata/0033/000581\ndata/0033/000582\ndata/0033/000583\ndata/0033/000584\ndata/0033/000585\ndata/0033/000586\ndata/0033/000587\ndata/0033/000588\ndata/0033/000589\ndata/0033/000590\ndata/0033/000591\ndata/0033/000592\ndata/0033/000593\ndata/0033/000594\ndata/0033/000595\ndata/0033/000596\ndata/0033/000597\ndata/0033/000598\ndata/0033/000599\ndata/0033/000600\ndata/0033/000601\ndata/0033/000602\ndata/0033/000603\ndata/0033/000604\ndata/0033/000605\ndata/0033/000606\ndata/0033/000607\ndata/0033/000608\ndata/0033/000609\ndata/0033/000610\ndata/0033/000611\ndata/0033/000612\ndata/0033/000613\ndata/0033/000614\ndata/0033/000615\ndata/0033/000616\ndata/0033/000617\ndata/0033/000618\ndata/0033/000619\ndata/0033/000620\ndata/0033/000621\ndata/0033/000622\ndata/0033/000623\ndata/0033/000624\ndata/0033/000625\ndata/0033/000626\ndata/0033/000627\ndata/0033/000628\ndata/0033/000629\ndata/0033/000630\ndata/0033/000631\ndata/0033/000632\ndata/0033/000633\ndata/0033/000634\ndata/0033/000635\ndata/0033/000636\ndata/0033/000637\ndata/0033/000638\ndata/0033/000639\ndata/0033/000640\ndata/0033/000641\ndata/0033/000642\ndata/0033/000643\ndata/0033/000644\ndata/0033/000645\ndata/0033/000646\ndata/0033/000647\ndata/0033/000648\ndata/0033/000649\ndata/0033/000650\ndata/0033/000651\ndata/0033/000652\ndata/0033/000653\ndata/0033/000654\ndata/0033/000655\ndata/0033/000656\ndata/0033/000657\ndata/0033/000658\ndata/0033/000659\ndata/0033/000660\ndata/0033/000661\ndata/0033/000662\ndata/0033/000663\ndata/0033/000664\ndata/0033/000665\ndata/0033/000666\ndata/0033/000667\ndata/0033/000668\ndata/0033/000669\ndata/0033/000670\ndata/0033/000671\ndata/0033/000672\ndata/0033/000673\ndata/0033/000674\ndata/0033/000675\ndata/0033/000676\ndata/0033/000677\ndata/0033/000678\ndata/0033/000679\ndata/0033/000680\ndata/0033/000681\ndata/0033/000682\ndata/0033/000683\ndata/0033/000684\ndata/0033/000685\ndata/0033/000686\ndata/0033/000687\ndata/0033/000688\ndata/0033/000689\ndata/0033/000690\ndata/0033/000691\ndata/0033/000692\ndata/0033/000693\ndata/0033/000694\ndata/0033/000695\ndata/0033/000696\ndata/0033/000697\ndata/0033/000698\ndata/0033/000699\ndata/0033/000700\ndata/0033/000701\ndata/0033/000702\ndata/0033/000703\ndata/0033/000704\ndata/0033/000705\ndata/0033/000706\ndata/0033/000707\ndata/0033/000708\ndata/0033/000709\ndata/0033/000710\ndata/0033/000711\ndata/0033/000712\ndata/0033/000713\ndata/0033/000714\ndata/0033/000715\ndata/0033/000716\ndata/0033/000717\ndata/0033/000718\ndata/0033/000719\ndata/0033/000720\ndata/0033/000721\ndata/0033/000722\ndata/0033/000723\ndata/0033/000724\ndata/0033/000725\ndata/0033/000726\ndata/0033/000727\ndata/0033/000728\ndata/0033/000729\ndata/0033/000730\ndata/0033/000731\ndata/0033/000732\ndata/0033/000733\ndata/0033/000734\ndata/0033/000735\ndata/0033/000736\ndata/0033/000737\ndata/0033/000738\ndata/0033/000739\ndata/0033/000740\ndata/0033/000741\ndata/0033/000742\ndata/0033/000743\ndata/0033/000744\ndata/0033/000745\ndata/0033/000746\ndata/0033/000747\ndata/0033/000748\ndata/0033/000749\ndata/0033/000750\ndata/0033/000751\ndata/0033/000752\ndata/0033/000753\ndata/0033/000754\ndata/0033/000755\ndata/0033/000756\ndata/0033/000757\ndata/0033/000758\ndata/0033/000759\ndata/0033/000760\ndata/0033/000761\ndata/0033/000762\ndata/0033/000763\ndata/0033/000764\ndata/0033/000765\ndata/0033/000766\ndata/0033/000767\ndata/0033/000768\ndata/0033/000769\ndata/0033/000770\ndata/0033/000771\ndata/0033/000772\ndata/0033/000773\ndata/0033/000774\ndata/0033/000775\ndata/0033/000776\ndata/0033/000777\ndata/0033/000778\ndata/0033/000779\ndata/0033/000780\ndata/0033/000781\ndata/0033/000782\ndata/0033/000783\ndata/0033/000784\ndata/0033/000785\ndata/0033/000786\ndata/0033/000787\ndata/0033/000788\ndata/0033/000789\ndata/0033/000790\ndata/0033/000791\ndata/0034/000001\ndata/0034/000002\ndata/0034/000003\ndata/0034/000004\ndata/0034/000005\ndata/0034/000006\ndata/0034/000007\ndata/0034/000008\ndata/0034/000009\ndata/0034/000010\ndata/0034/000011\ndata/0034/000012\ndata/0034/000013\ndata/0034/000014\ndata/0034/000015\ndata/0034/000016\ndata/0034/000017\ndata/0034/000018\ndata/0034/000019\ndata/0034/000020\ndata/0034/000021\ndata/0034/000022\ndata/0034/000023\ndata/0034/000024\ndata/0034/000025\ndata/0034/000026\ndata/0034/000027\ndata/0034/000028\ndata/0034/000029\ndata/0034/000030\ndata/0034/000031\ndata/0034/000032\ndata/0034/000033\ndata/0034/000034\ndata/0034/000035\ndata/0034/000036\ndata/0034/000037\ndata/0034/000038\ndata/0034/000039\ndata/0034/000040\ndata/0034/000041\ndata/0034/000042\ndata/0034/000043\ndata/0034/000044\ndata/0034/000045\ndata/0034/000046\ndata/0034/000047\ndata/0034/000048\ndata/0034/000049\ndata/0034/000050\ndata/0034/000051\ndata/0034/000052\ndata/0034/000053\ndata/0034/000054\ndata/0034/000055\ndata/0034/000056\ndata/0034/000057\ndata/0034/000058\ndata/0034/000059\ndata/0034/000060\ndata/0034/000061\ndata/0034/000062\ndata/0034/000063\ndata/0034/000064\ndata/0034/000065\ndata/0034/000066\ndata/0034/000067\ndata/0034/000068\ndata/0034/000069\ndata/0034/000070\ndata/0034/000071\ndata/0034/000072\ndata/0034/000073\ndata/0034/000074\ndata/0034/000075\ndata/0034/000076\ndata/0034/000077\ndata/0034/000078\ndata/0034/000079\ndata/0034/000080\ndata/0034/000081\ndata/0034/000082\ndata/0034/000083\ndata/0034/000084\ndata/0034/000085\ndata/0034/000086\ndata/0034/000087\ndata/0034/000088\ndata/0034/000089\ndata/0034/000090\ndata/0034/000091\ndata/0034/000092\ndata/0034/000093\ndata/0034/000094\ndata/0034/000095\ndata/0034/000096\ndata/0034/000097\ndata/0034/000098\ndata/0034/000099\ndata/0034/000100\ndata/0034/000101\ndata/0034/000102\ndata/0034/000103\ndata/0034/000104\ndata/0034/000105\ndata/0034/000106\ndata/0034/000107\ndata/0034/000108\ndata/0034/000109\ndata/0034/000110\ndata/0034/000111\ndata/0034/000112\ndata/0034/000113\ndata/0034/000114\ndata/0034/000115\ndata/0034/000116\ndata/0034/000117\ndata/0034/000118\ndata/0034/000119\ndata/0034/000120\ndata/0034/000121\ndata/0034/000122\ndata/0034/000123\ndata/0034/000124\ndata/0034/000125\ndata/0034/000126\ndata/0034/000127\ndata/0034/000128\ndata/0034/000129\ndata/0034/000130\ndata/0034/000131\ndata/0034/000132\ndata/0034/000133\ndata/0034/000134\ndata/0034/000135\ndata/0034/000136\ndata/0034/000137\ndata/0034/000138\ndata/0034/000139\ndata/0034/000140\ndata/0034/000141\ndata/0034/000142\ndata/0034/000143\ndata/0034/000144\ndata/0034/000145\ndata/0034/000146\ndata/0034/000147\ndata/0034/000148\ndata/0034/000149\ndata/0034/000150\ndata/0034/000151\ndata/0034/000152\ndata/0034/000153\ndata/0034/000154\ndata/0034/000155\ndata/0034/000156\ndata/0034/000157\ndata/0034/000158\ndata/0034/000159\ndata/0034/000160\ndata/0034/000161\ndata/0034/000162\ndata/0034/000163\ndata/0034/000164\ndata/0034/000165\ndata/0034/000166\ndata/0034/000167\ndata/0034/000168\ndata/0034/000169\ndata/0034/000170\ndata/0034/000171\ndata/0034/000172\ndata/0034/000173\ndata/0034/000174\ndata/0034/000175\ndata/0034/000176\ndata/0034/000177\ndata/0034/000178\ndata/0034/000179\ndata/0034/000180\ndata/0034/000181\ndata/0034/000182\ndata/0034/000183\ndata/0034/000184\ndata/0034/000185\ndata/0034/000186\ndata/0034/000187\ndata/0034/000188\ndata/0034/000189\ndata/0034/000190\ndata/0034/000191\ndata/0034/000192\ndata/0034/000193\ndata/0034/000194\ndata/0034/000195\ndata/0034/000196\ndata/0034/000197\ndata/0034/000198\ndata/0034/000199\ndata/0034/000200\ndata/0034/000201\ndata/0034/000202\ndata/0034/000203\ndata/0034/000204\ndata/0034/000205\ndata/0034/000206\ndata/0034/000207\ndata/0034/000208\ndata/0034/000209\ndata/0034/000210\ndata/0034/000211\ndata/0034/000212\ndata/0034/000213\ndata/0034/000214\ndata/0034/000215\ndata/0034/000216\ndata/0034/000217\ndata/0034/000218\ndata/0034/000219\ndata/0034/000220\ndata/0034/000221\ndata/0034/000222\ndata/0034/000223\ndata/0034/000224\ndata/0034/000225\ndata/0034/000226\ndata/0034/000227\ndata/0034/000228\ndata/0034/000229\ndata/0034/000230\ndata/0034/000231\ndata/0034/000232\ndata/0034/000233\ndata/0034/000234\ndata/0034/000235\ndata/0034/000236\ndata/0034/000237\ndata/0034/000238\ndata/0034/000239\ndata/0034/000240\ndata/0034/000241\ndata/0034/000242\ndata/0034/000243\ndata/0034/000244\ndata/0034/000245\ndata/0034/000246\ndata/0034/000247\ndata/0034/000248\ndata/0034/000249\ndata/0034/000250\ndata/0034/000251\ndata/0034/000252\ndata/0034/000253\ndata/0034/000254\ndata/0034/000255\ndata/0034/000256\ndata/0034/000257\ndata/0034/000258\ndata/0034/000259\ndata/0034/000260\ndata/0034/000261\ndata/0034/000262\ndata/0034/000263\ndata/0034/000264\ndata/0034/000265\ndata/0034/000266\ndata/0034/000267\ndata/0034/000268\ndata/0034/000269\ndata/0034/000270\ndata/0034/000271\ndata/0034/000272\ndata/0034/000273\ndata/0034/000274\ndata/0034/000275\ndata/0034/000276\ndata/0034/000277\ndata/0034/000278\ndata/0034/000279\ndata/0034/000280\ndata/0034/000281\ndata/0034/000282\ndata/0034/000283\ndata/0034/000284\ndata/0034/000285\ndata/0034/000286\ndata/0034/000287\ndata/0034/000288\ndata/0034/000289\ndata/0034/000290\ndata/0034/000291\ndata/0034/000292\ndata/0034/000293\ndata/0034/000294\ndata/0034/000295\ndata/0034/000296\ndata/0034/000297\ndata/0034/000298\ndata/0034/000299\ndata/0034/000300\ndata/0034/000301\ndata/0034/000302\ndata/0034/000303\ndata/0034/000304\ndata/0034/000305\ndata/0034/000306\ndata/0034/000307\ndata/0034/000308\ndata/0034/000309\ndata/0034/000310\ndata/0034/000311\ndata/0034/000312\ndata/0034/000313\ndata/0034/000314\ndata/0034/000315\ndata/0034/000316\ndata/0034/000317\ndata/0034/000318\ndata/0034/000319\ndata/0034/000320\ndata/0034/000321\ndata/0034/000322\ndata/0034/000323\ndata/0034/000324\ndata/0034/000325\ndata/0034/000326\ndata/0034/000327\ndata/0034/000328\ndata/0034/000329\ndata/0034/000330\ndata/0034/000331\ndata/0034/000332\ndata/0034/000333\ndata/0034/000334\ndata/0034/000335\ndata/0034/000336\ndata/0034/000337\ndata/0034/000338\ndata/0034/000339\ndata/0034/000340\ndata/0034/000341\ndata/0034/000342\ndata/0034/000343\ndata/0034/000344\ndata/0034/000345\ndata/0034/000346\ndata/0034/000347\ndata/0034/000348\ndata/0034/000349\ndata/0034/000350\ndata/0034/000351\ndata/0034/000352\ndata/0034/000353\ndata/0034/000354\ndata/0034/000355\ndata/0034/000356\ndata/0034/000357\ndata/0034/000358\ndata/0034/000359\ndata/0034/000360\ndata/0034/000361\ndata/0034/000362\ndata/0034/000363\ndata/0034/000364\ndata/0034/000365\ndata/0034/000366\ndata/0034/000367\ndata/0034/000368\ndata/0034/000369\ndata/0034/000370\ndata/0034/000371\ndata/0034/000372\ndata/0034/000373\ndata/0034/000374\ndata/0034/000375\ndata/0034/000376\ndata/0034/000377\ndata/0034/000378\ndata/0034/000379\ndata/0034/000380\ndata/0034/000381\ndata/0034/000382\ndata/0034/000383\ndata/0034/000384\ndata/0034/000385\ndata/0034/000386\ndata/0034/000387\ndata/0034/000388\ndata/0034/000389\ndata/0034/000390\ndata/0034/000391\ndata/0034/000392\ndata/0034/000393\ndata/0034/000394\ndata/0034/000395\ndata/0034/000396\ndata/0034/000397\ndata/0034/000398\ndata/0034/000399\ndata/0034/000400\ndata/0034/000401\ndata/0034/000402\ndata/0034/000403\ndata/0034/000404\ndata/0034/000405\ndata/0034/000406\ndata/0034/000407\ndata/0034/000408\ndata/0034/000409\ndata/0034/000410\ndata/0034/000411\ndata/0034/000412\ndata/0034/000413\ndata/0034/000414\ndata/0034/000415\ndata/0034/000416\ndata/0034/000417\ndata/0034/000418\ndata/0034/000419\ndata/0034/000420\ndata/0034/000421\ndata/0034/000422\ndata/0034/000423\ndata/0034/000424\ndata/0034/000425\ndata/0034/000426\ndata/0034/000427\ndata/0034/000428\ndata/0034/000429\ndata/0034/000430\ndata/0034/000431\ndata/0034/000432\ndata/0034/000433\ndata/0034/000434\ndata/0034/000435\ndata/0034/000436\ndata/0034/000437\ndata/0034/000438\ndata/0034/000439\ndata/0034/000440\ndata/0034/000441\ndata/0034/000442\ndata/0034/000443\ndata/0034/000444\ndata/0034/000445\ndata/0034/000446\ndata/0034/000447\ndata/0034/000448\ndata/0034/000449\ndata/0034/000450\ndata/0034/000451\ndata/0034/000452\ndata/0034/000453\ndata/0034/000454\ndata/0034/000455\ndata/0034/000456\ndata/0034/000457\ndata/0034/000458\ndata/0034/000459\ndata/0034/000460\ndata/0034/000461\ndata/0034/000462\ndata/0034/000463\ndata/0034/000464\ndata/0034/000465\ndata/0034/000466\ndata/0034/000467\ndata/0034/000468\ndata/0034/000469\ndata/0034/000470\ndata/0034/000471\ndata/0034/000472\ndata/0034/000473\ndata/0034/000474\ndata/0034/000475\ndata/0034/000476\ndata/0034/000477\ndata/0034/000478\ndata/0034/000479\ndata/0034/000480\ndata/0034/000481\ndata/0034/000482\ndata/0034/000483\ndata/0034/000484\ndata/0034/000485\ndata/0034/000486\ndata/0034/000487\ndata/0034/000488\ndata/0034/000489\ndata/0034/000490\ndata/0034/000491\ndata/0034/000492\ndata/0034/000493\ndata/0034/000494\ndata/0034/000495\ndata/0034/000496\ndata/0034/000497\ndata/0034/000498\ndata/0034/000499\ndata/0034/000500\ndata/0034/000501\ndata/0034/000502\ndata/0034/000503\ndata/0034/000504\ndata/0034/000505\ndata/0034/000506\ndata/0034/000507\ndata/0034/000508\ndata/0034/000509\ndata/0034/000510\ndata/0034/000511\ndata/0034/000512\ndata/0034/000513\ndata/0034/000514\ndata/0034/000515\ndata/0034/000516\ndata/0034/000517\ndata/0034/000518\ndata/0034/000519\ndata/0034/000520\ndata/0034/000521\ndata/0034/000522\ndata/0034/000523\ndata/0034/000524\ndata/0034/000525\ndata/0034/000526\ndata/0034/000527\ndata/0034/000528\ndata/0034/000529\ndata/0034/000530\ndata/0034/000531\ndata/0034/000532\ndata/0034/000533\ndata/0034/000534\ndata/0034/000535\ndata/0034/000536\ndata/0034/000537\ndata/0034/000538\ndata/0034/000539\ndata/0034/000540\ndata/0034/000541\ndata/0034/000542\ndata/0034/000543\ndata/0034/000544\ndata/0034/000545\ndata/0034/000546\ndata/0034/000547\ndata/0034/000548\ndata/0034/000549\ndata/0034/000550\ndata/0034/000551\ndata/0034/000552\ndata/0034/000553\ndata/0034/000554\ndata/0034/000555\ndata/0034/000556\ndata/0034/000557\ndata/0034/000558\ndata/0034/000559\ndata/0034/000560\ndata/0034/000561\ndata/0034/000562\ndata/0034/000563\ndata/0034/000564\ndata/0034/000565\ndata/0034/000566\ndata/0034/000567\ndata/0034/000568\ndata/0034/000569\ndata/0034/000570\ndata/0034/000571\ndata/0034/000572\ndata/0034/000573\ndata/0034/000574\ndata/0034/000575\ndata/0034/000576\ndata/0034/000577\ndata/0034/000578\ndata/0034/000579\ndata/0034/000580\ndata/0034/000581\ndata/0034/000582\ndata/0034/000583\ndata/0034/000584\ndata/0034/000585\ndata/0034/000586\ndata/0034/000587\ndata/0034/000588\ndata/0034/000589\ndata/0034/000590\ndata/0034/000591\ndata/0034/000592\ndata/0034/000593\ndata/0034/000594\ndata/0034/000595\ndata/0034/000596\ndata/0034/000597\ndata/0034/000598\ndata/0034/000599\ndata/0034/000600\ndata/0034/000601\ndata/0034/000602\ndata/0034/000603\ndata/0034/000604\ndata/0034/000605\ndata/0034/000606\ndata/0034/000607\ndata/0034/000608\ndata/0034/000609\ndata/0034/000610\ndata/0034/000611\ndata/0034/000612\ndata/0034/000613\ndata/0034/000614\ndata/0034/000615\ndata/0034/000616\ndata/0034/000617\ndata/0034/000618\ndata/0034/000619\ndata/0034/000620\ndata/0034/000621\ndata/0034/000622\ndata/0034/000623\ndata/0034/000624\ndata/0034/000625\ndata/0034/000626\ndata/0034/000627\ndata/0034/000628\ndata/0034/000629\ndata/0034/000630\ndata/0034/000631\ndata/0034/000632\ndata/0034/000633\ndata/0034/000634\ndata/0034/000635\ndata/0034/000636\ndata/0034/000637\ndata/0034/000638\ndata/0034/000639\ndata/0034/000640\ndata/0034/000641\ndata/0034/000642\ndata/0034/000643\ndata/0034/000644\ndata/0034/000645\ndata/0034/000646\ndata/0034/000647\ndata/0034/000648\ndata/0034/000649\ndata/0034/000650\ndata/0034/000651\ndata/0034/000652\ndata/0034/000653\ndata/0034/000654\ndata/0034/000655\ndata/0034/000656\ndata/0034/000657\ndata/0034/000658\ndata/0034/000659\ndata/0034/000660\ndata/0034/000661\ndata/0034/000662\ndata/0034/000663\ndata/0034/000664\ndata/0034/000665\ndata/0034/000666\ndata/0034/000667\ndata/0034/000668\ndata/0034/000669\ndata/0034/000670\ndata/0034/000671\ndata/0034/000672\ndata/0034/000673\ndata/0034/000674\ndata/0034/000675\ndata/0034/000676\ndata/0034/000677\ndata/0034/000678\ndata/0034/000679\ndata/0034/000680\ndata/0034/000681\ndata/0034/000682\ndata/0034/000683\ndata/0034/000684\ndata/0034/000685\ndata/0034/000686\ndata/0034/000687\ndata/0034/000688\ndata/0034/000689\ndata/0034/000690\ndata/0034/000691\ndata/0034/000692\ndata/0034/000693\ndata/0034/000694\ndata/0034/000695\ndata/0034/000696\ndata/0034/000697\ndata/0034/000698\ndata/0034/000699\ndata/0034/000700\ndata/0034/000701\ndata/0034/000702\ndata/0034/000703\ndata/0034/000704\ndata/0034/000705\ndata/0034/000706\ndata/0034/000707\ndata/0034/000708\ndata/0034/000709\ndata/0034/000710\ndata/0034/000711\ndata/0034/000712\ndata/0034/000713\ndata/0034/000714\ndata/0034/000715\ndata/0034/000716\ndata/0034/000717\ndata/0034/000718\ndata/0034/000719\ndata/0034/000720\ndata/0034/000721\ndata/0034/000722\ndata/0034/000723\ndata/0034/000724\ndata/0034/000725\ndata/0034/000726\ndata/0034/000727\ndata/0034/000728\ndata/0034/000729\ndata/0034/000730\ndata/0034/000731\ndata/0034/000732\ndata/0034/000733\ndata/0034/000734\ndata/0034/000735\ndata/0034/000736\ndata/0034/000737\ndata/0034/000738\ndata/0034/000739\ndata/0034/000740\ndata/0034/000741\ndata/0034/000742\ndata/0034/000743\ndata/0034/000744\ndata/0034/000745\ndata/0034/000746\ndata/0034/000747\ndata/0034/000748\ndata/0034/000749\ndata/0034/000750\ndata/0034/000751\ndata/0034/000752\ndata/0034/000753\ndata/0034/000754\ndata/0034/000755\ndata/0034/000756\ndata/0034/000757\ndata/0034/000758\ndata/0034/000759\ndata/0034/000760\ndata/0034/000761\ndata/0034/000762\ndata/0034/000763\ndata/0034/000764\ndata/0034/000765\ndata/0034/000766\ndata/0034/000767\ndata/0034/000768\ndata/0034/000769\ndata/0034/000770\ndata/0034/000771\ndata/0034/000772\ndata/0034/000773\ndata/0034/000774\ndata/0034/000775\ndata/0034/000776\ndata/0034/000777\ndata/0034/000778\ndata/0034/000779\ndata/0034/000780\ndata/0034/000781\ndata/0034/000782\ndata/0034/000783\ndata/0034/000784\ndata/0034/000785\ndata/0034/000786\ndata/0035/000001\ndata/0035/000002\ndata/0035/000003\ndata/0035/000004\ndata/0035/000005\ndata/0035/000006\ndata/0035/000007\ndata/0035/000008\ndata/0035/000009\ndata/0035/000010\ndata/0035/000011\ndata/0035/000012\ndata/0035/000013\ndata/0035/000014\ndata/0035/000015\ndata/0035/000016\ndata/0035/000017\ndata/0035/000018\ndata/0035/000019\ndata/0035/000020\ndata/0035/000021\ndata/0035/000022\ndata/0035/000023\ndata/0035/000024\ndata/0035/000025\ndata/0035/000026\ndata/0035/000027\ndata/0035/000028\ndata/0035/000029\ndata/0035/000030\ndata/0035/000031\ndata/0035/000032\ndata/0035/000033\ndata/0035/000034\ndata/0035/000035\ndata/0035/000036\ndata/0035/000037\ndata/0035/000038\ndata/0035/000039\ndata/0035/000040\ndata/0035/000041\ndata/0035/000042\ndata/0035/000043\ndata/0035/000044\ndata/0035/000045\ndata/0035/000046\ndata/0035/000047\ndata/0035/000048\ndata/0035/000049\ndata/0035/000050\ndata/0035/000051\ndata/0035/000052\ndata/0035/000053\ndata/0035/000054\ndata/0035/000055\ndata/0035/000056\ndata/0035/000057\ndata/0035/000058\ndata/0035/000059\ndata/0035/000060\ndata/0035/000061\ndata/0035/000062\ndata/0035/000063\ndata/0035/000064\ndata/0035/000065\ndata/0035/000066\ndata/0035/000067\ndata/0035/000068\ndata/0035/000069\ndata/0035/000070\ndata/0035/000071\ndata/0035/000072\ndata/0035/000073\ndata/0035/000074\ndata/0035/000075\ndata/0035/000076\ndata/0035/000077\ndata/0035/000078\ndata/0035/000079\ndata/0035/000080\ndata/0035/000081\ndata/0035/000082\ndata/0035/000083\ndata/0035/000084\ndata/0035/000085\ndata/0035/000086\ndata/0035/000087\ndata/0035/000088\ndata/0035/000089\ndata/0035/000090\ndata/0035/000091\ndata/0035/000092\ndata/0035/000093\ndata/0035/000094\ndata/0035/000095\ndata/0035/000096\ndata/0035/000097\ndata/0035/000098\ndata/0035/000099\ndata/0035/000100\ndata/0035/000101\ndata/0035/000102\ndata/0035/000103\ndata/0035/000104\ndata/0035/000105\ndata/0035/000106\ndata/0035/000107\ndata/0035/000108\ndata/0035/000109\ndata/0035/000110\ndata/0035/000111\ndata/0035/000112\ndata/0035/000113\ndata/0035/000114\ndata/0035/000115\ndata/0035/000116\ndata/0035/000117\ndata/0035/000118\ndata/0035/000119\ndata/0035/000120\ndata/0035/000121\ndata/0035/000122\ndata/0035/000123\ndata/0035/000124\ndata/0035/000125\ndata/0035/000126\ndata/0035/000127\ndata/0035/000128\ndata/0035/000129\ndata/0035/000130\ndata/0035/000131\ndata/0035/000132\ndata/0035/000133\ndata/0035/000134\ndata/0035/000135\ndata/0035/000136\ndata/0035/000137\ndata/0035/000138\ndata/0035/000139\ndata/0035/000140\ndata/0035/000141\ndata/0035/000142\ndata/0035/000143\ndata/0035/000144\ndata/0035/000145\ndata/0035/000146\ndata/0035/000147\ndata/0035/000148\ndata/0035/000149\ndata/0035/000150\ndata/0035/000151\ndata/0035/000152\ndata/0035/000153\ndata/0035/000154\ndata/0035/000155\ndata/0035/000156\ndata/0035/000157\ndata/0035/000158\ndata/0035/000159\ndata/0035/000160\ndata/0035/000161\ndata/0035/000162\ndata/0035/000163\ndata/0035/000164\ndata/0035/000165\ndata/0035/000166\ndata/0035/000167\ndata/0035/000168\ndata/0035/000169\ndata/0035/000170\ndata/0035/000171\ndata/0035/000172\ndata/0035/000173\ndata/0035/000174\ndata/0035/000175\ndata/0035/000176\ndata/0035/000177\ndata/0035/000178\ndata/0035/000179\ndata/0035/000180\ndata/0035/000181\ndata/0035/000182\ndata/0035/000183\ndata/0035/000184\ndata/0035/000185\ndata/0035/000186\ndata/0035/000187\ndata/0035/000188\ndata/0035/000189\ndata/0035/000190\ndata/0035/000191\ndata/0035/000192\ndata/0035/000193\ndata/0035/000194\ndata/0035/000195\ndata/0035/000196\ndata/0035/000197\ndata/0035/000198\ndata/0035/000199\ndata/0035/000200\ndata/0035/000201\ndata/0035/000202\ndata/0035/000203\ndata/0035/000204\ndata/0035/000205\ndata/0035/000206\ndata/0035/000207\ndata/0035/000208\ndata/0035/000209\ndata/0035/000210\ndata/0035/000211\ndata/0035/000212\ndata/0035/000213\ndata/0035/000214\ndata/0035/000215\ndata/0035/000216\ndata/0035/000217\ndata/0035/000218\ndata/0035/000219\ndata/0035/000220\ndata/0035/000221\ndata/0035/000222\ndata/0035/000223\ndata/0035/000224\ndata/0035/000225\ndata/0035/000226\ndata/0035/000227\ndata/0035/000228\ndata/0035/000229\ndata/0035/000230\ndata/0035/000231\ndata/0035/000232\ndata/0035/000233\ndata/0035/000234\ndata/0035/000235\ndata/0035/000236\ndata/0035/000237\ndata/0035/000238\ndata/0035/000239\ndata/0035/000240\ndata/0035/000241\ndata/0035/000242\ndata/0035/000243\ndata/0035/000244\ndata/0035/000245\ndata/0035/000246\ndata/0035/000247\ndata/0035/000248\ndata/0035/000249\ndata/0035/000250\ndata/0035/000251\ndata/0035/000252\ndata/0035/000253\ndata/0035/000254\ndata/0035/000255\ndata/0035/000256\ndata/0035/000257\ndata/0035/000258\ndata/0035/000259\ndata/0035/000260\ndata/0035/000261\ndata/0035/000262\ndata/0035/000263\ndata/0035/000264\ndata/0035/000265\ndata/0035/000266\ndata/0035/000267\ndata/0035/000268\ndata/0035/000269\ndata/0035/000270\ndata/0035/000271\ndata/0035/000272\ndata/0035/000273\ndata/0035/000274\ndata/0035/000275\ndata/0035/000276\ndata/0035/000277\ndata/0035/000278\ndata/0035/000279\ndata/0035/000280\ndata/0035/000281\ndata/0035/000282\ndata/0035/000283\ndata/0035/000284\ndata/0035/000285\ndata/0035/000286\ndata/0035/000287\ndata/0035/000288\ndata/0035/000289\ndata/0035/000290\ndata/0035/000291\ndata/0035/000292\ndata/0035/000293\ndata/0035/000294\ndata/0035/000295\ndata/0035/000296\ndata/0035/000297\ndata/0035/000298\ndata/0035/000299\ndata/0035/000300\ndata/0035/000301\ndata/0035/000302\ndata/0035/000303\ndata/0035/000304\ndata/0035/000305\ndata/0035/000306\ndata/0035/000307\ndata/0035/000308\ndata/0035/000309\ndata/0035/000310\ndata/0035/000311\ndata/0035/000312\ndata/0035/000313\ndata/0035/000314\ndata/0035/000315\ndata/0035/000316\ndata/0035/000317\ndata/0035/000318\ndata/0035/000319\ndata/0035/000320\ndata/0035/000321\ndata/0035/000322\ndata/0035/000323\ndata/0035/000324\ndata/0035/000325\ndata/0035/000326\ndata/0035/000327\ndata/0035/000328\ndata/0035/000329\ndata/0035/000330\ndata/0035/000331\ndata/0035/000332\ndata/0035/000333\ndata/0035/000334\ndata/0035/000335\ndata/0035/000336\ndata/0035/000337\ndata/0035/000338\ndata/0035/000339\ndata/0035/000340\ndata/0035/000341\ndata/0035/000342\ndata/0035/000343\ndata/0035/000344\ndata/0035/000345\ndata/0035/000346\ndata/0035/000347\ndata/0035/000348\ndata/0035/000349\ndata/0035/000350\ndata/0035/000351\ndata/0035/000352\ndata/0035/000353\ndata/0035/000354\ndata/0035/000355\ndata/0035/000356\ndata/0035/000357\ndata/0035/000358\ndata/0035/000359\ndata/0035/000360\ndata/0035/000361\ndata/0035/000362\ndata/0035/000363\ndata/0035/000364\ndata/0035/000365\ndata/0035/000366\ndata/0035/000367\ndata/0035/000368\ndata/0035/000369\ndata/0035/000370\ndata/0035/000371\ndata/0035/000372\ndata/0035/000373\ndata/0035/000374\ndata/0035/000375\ndata/0035/000376\ndata/0035/000377\ndata/0035/000378\ndata/0035/000379\ndata/0035/000380\ndata/0035/000381\ndata/0035/000382\ndata/0035/000383\ndata/0035/000384\ndata/0035/000385\ndata/0035/000386\ndata/0035/000387\ndata/0035/000388\ndata/0035/000389\ndata/0035/000390\ndata/0035/000391\ndata/0035/000392\ndata/0035/000393\ndata/0035/000394\ndata/0035/000395\ndata/0035/000396\ndata/0035/000397\ndata/0035/000398\ndata/0035/000399\ndata/0035/000400\ndata/0035/000401\ndata/0035/000402\ndata/0035/000403\ndata/0035/000404\ndata/0035/000405\ndata/0035/000406\ndata/0035/000407\ndata/0035/000408\ndata/0035/000409\ndata/0035/000410\ndata/0035/000411\ndata/0035/000412\ndata/0035/000413\ndata/0035/000414\ndata/0035/000415\ndata/0035/000416\ndata/0035/000417\ndata/0035/000418\ndata/0035/000419\ndata/0035/000420\ndata/0035/000421\ndata/0035/000422\ndata/0035/000423\ndata/0035/000424\ndata/0035/000425\ndata/0035/000426\ndata/0035/000427\ndata/0035/000428\ndata/0035/000429\ndata/0035/000430\ndata/0035/000431\ndata/0035/000432\ndata/0035/000433\ndata/0035/000434\ndata/0035/000435\ndata/0035/000436\ndata/0035/000437\ndata/0035/000438\ndata/0035/000439\ndata/0035/000440\ndata/0035/000441\ndata/0035/000442\ndata/0035/000443\ndata/0035/000444\ndata/0035/000445\ndata/0035/000446\ndata/0035/000447\ndata/0035/000448\ndata/0035/000449\ndata/0035/000450\ndata/0035/000451\ndata/0035/000452\ndata/0035/000453\ndata/0035/000454\ndata/0035/000455\ndata/0035/000456\ndata/0035/000457\ndata/0035/000458\ndata/0035/000459\ndata/0035/000460\ndata/0035/000461\ndata/0035/000462\ndata/0035/000463\ndata/0035/000464\ndata/0035/000465\ndata/0035/000466\ndata/0035/000467\ndata/0035/000468\ndata/0035/000469\ndata/0035/000470\ndata/0035/000471\ndata/0035/000472\ndata/0035/000473\ndata/0035/000474\ndata/0035/000475\ndata/0035/000476\ndata/0035/000477\ndata/0035/000478\ndata/0035/000479\ndata/0035/000480\ndata/0035/000481\ndata/0035/000482\ndata/0035/000483\ndata/0035/000484\ndata/0035/000485\ndata/0035/000486\ndata/0035/000487\ndata/0035/000488\ndata/0035/000489\ndata/0035/000490\ndata/0035/000491\ndata/0035/000492\ndata/0035/000493\ndata/0035/000494\ndata/0035/000495\ndata/0035/000496\ndata/0035/000497\ndata/0035/000498\ndata/0035/000499\ndata/0035/000500\ndata/0035/000501\ndata/0035/000502\ndata/0035/000503\ndata/0035/000504\ndata/0035/000505\ndata/0035/000506\ndata/0035/000507\ndata/0035/000508\ndata/0035/000509\ndata/0035/000510\ndata/0035/000511\ndata/0035/000512\ndata/0035/000513\ndata/0035/000514\ndata/0035/000515\ndata/0035/000516\ndata/0035/000517\ndata/0035/000518\ndata/0035/000519\ndata/0035/000520\ndata/0035/000521\ndata/0035/000522\ndata/0035/000523\ndata/0035/000524\ndata/0035/000525\ndata/0035/000526\ndata/0035/000527\ndata/0035/000528\ndata/0035/000529\ndata/0035/000530\ndata/0035/000531\ndata/0035/000532\ndata/0035/000533\ndata/0035/000534\ndata/0035/000535\ndata/0035/000536\ndata/0035/000537\ndata/0035/000538\ndata/0035/000539\ndata/0035/000540\ndata/0035/000541\ndata/0035/000542\ndata/0035/000543\ndata/0035/000544\ndata/0035/000545\ndata/0035/000546\ndata/0035/000547\ndata/0035/000548\ndata/0035/000549\ndata/0035/000550\ndata/0035/000551\ndata/0035/000552\ndata/0035/000553\ndata/0035/000554\ndata/0035/000555\ndata/0035/000556\ndata/0035/000557\ndata/0035/000558\ndata/0035/000559\ndata/0035/000560\ndata/0035/000561\ndata/0035/000562\ndata/0035/000563\ndata/0035/000564\ndata/0035/000565\ndata/0035/000566\ndata/0035/000567\ndata/0035/000568\ndata/0035/000569\ndata/0035/000570\ndata/0035/000571\ndata/0035/000572\ndata/0035/000573\ndata/0035/000574\ndata/0035/000575\ndata/0035/000576\ndata/0035/000577\ndata/0035/000578\ndata/0035/000579\ndata/0035/000580\ndata/0035/000581\ndata/0035/000582\ndata/0035/000583\ndata/0035/000584\ndata/0035/000585\ndata/0035/000586\ndata/0035/000587\ndata/0035/000588\ndata/0035/000589\ndata/0035/000590\ndata/0035/000591\ndata/0035/000592\ndata/0035/000593\ndata/0035/000594\ndata/0035/000595\ndata/0035/000596\ndata/0035/000597\ndata/0035/000598\ndata/0035/000599\ndata/0035/000600\ndata/0035/000601\ndata/0035/000602\ndata/0035/000603\ndata/0035/000604\ndata/0035/000605\ndata/0035/000606\ndata/0035/000607\ndata/0035/000608\ndata/0035/000609\ndata/0035/000610\ndata/0035/000611\ndata/0035/000612\ndata/0035/000613\ndata/0035/000614\ndata/0035/000615\ndata/0035/000616\ndata/0035/000617\ndata/0035/000618\ndata/0035/000619\ndata/0035/000620\ndata/0035/000621\ndata/0035/000622\ndata/0035/000623\ndata/0035/000624\ndata/0035/000625\ndata/0035/000626\ndata/0035/000627\ndata/0035/000628\ndata/0035/000629\ndata/0035/000630\ndata/0035/000631\ndata/0035/000632\ndata/0035/000633\ndata/0035/000634\ndata/0035/000635\ndata/0035/000636\ndata/0035/000637\ndata/0035/000638\ndata/0035/000639\ndata/0035/000640\ndata/0035/000641\ndata/0035/000642\ndata/0035/000643\ndata/0035/000644\ndata/0035/000645\ndata/0035/000646\ndata/0035/000647\ndata/0035/000648\ndata/0035/000649\ndata/0035/000650\ndata/0035/000651\ndata/0035/000652\ndata/0035/000653\ndata/0035/000654\ndata/0035/000655\ndata/0035/000656\ndata/0035/000657\ndata/0035/000658\ndata/0035/000659\ndata/0035/000660\ndata/0035/000661\ndata/0035/000662\ndata/0035/000663\ndata/0035/000664\ndata/0035/000665\ndata/0035/000666\ndata/0035/000667\ndata/0035/000668\ndata/0035/000669\ndata/0035/000670\ndata/0035/000671\ndata/0035/000672\ndata/0035/000673\ndata/0035/000674\ndata/0035/000675\ndata/0035/000676\ndata/0035/000677\ndata/0035/000678\ndata/0035/000679\ndata/0035/000680\ndata/0035/000681\ndata/0035/000682\ndata/0035/000683\ndata/0035/000684\ndata/0035/000685\ndata/0035/000686\ndata/0035/000687\ndata/0035/000688\ndata/0035/000689\ndata/0035/000690\ndata/0035/000691\ndata/0035/000692\ndata/0035/000693\ndata/0035/000694\ndata/0035/000695\ndata/0035/000696\ndata/0035/000697\ndata/0035/000698\ndata/0035/000699\ndata/0035/000700\ndata/0035/000701\ndata/0035/000702\ndata/0035/000703\ndata/0035/000704\ndata/0035/000705\ndata/0035/000706\ndata/0035/000707\ndata/0035/000708\ndata/0035/000709\ndata/0035/000710\ndata/0035/000711\ndata/0035/000712\ndata/0035/000713\ndata/0035/000714\ndata/0035/000715\ndata/0035/000716\ndata/0035/000717\ndata/0035/000718\ndata/0035/000719\ndata/0035/000720\ndata/0035/000721\ndata/0035/000722\ndata/0035/000723\ndata/0035/000724\ndata/0035/000725\ndata/0035/000726\ndata/0035/000727\ndata/0035/000728\ndata/0035/000729\ndata/0035/000730\ndata/0035/000731\ndata/0035/000732\ndata/0035/000733\ndata/0035/000734\ndata/0035/000735\ndata/0035/000736\ndata/0035/000737\ndata/0035/000738\ndata/0035/000739\ndata/0035/000740\ndata/0035/000741\ndata/0035/000742\ndata/0035/000743\ndata/0035/000744\ndata/0035/000745\ndata/0035/000746\ndata/0035/000747\ndata/0035/000748\ndata/0035/000749\ndata/0035/000750\ndata/0035/000751\ndata/0035/000752\ndata/0035/000753\ndata/0035/000754\ndata/0035/000755\ndata/0035/000756\ndata/0035/000757\ndata/0035/000758\ndata/0035/000759\ndata/0035/000760\ndata/0035/000761\ndata/0035/000762\ndata/0035/000763\ndata/0035/000764\ndata/0035/000765\ndata/0035/000766\ndata/0035/000767\ndata/0035/000768\ndata/0035/000769\ndata/0035/000770\ndata/0035/000771\ndata/0035/000772\ndata/0035/000773\ndata/0035/000774\ndata/0035/000775\ndata/0035/000776\ndata/0035/000777\ndata/0035/000778\ndata/0035/000779\ndata/0035/000780\ndata/0035/000781\ndata/0035/000782\ndata/0035/000783\ndata/0035/000784\ndata/0035/000785\ndata/0035/000786\ndata/0035/000787\ndata/0035/000788\ndata/0035/000789\ndata/0035/000790\ndata/0035/000791\ndata/0035/000792\ndata/0035/000793\ndata/0035/000794\ndata/0035/000795\ndata/0035/000796\ndata/0035/000797\ndata/0035/000798\ndata/0035/000799\ndata/0035/000800\ndata/0035/000801\ndata/0035/000802\ndata/0035/000803\ndata/0035/000804\ndata/0035/000805\ndata/0035/000806\ndata/0035/000807\ndata/0035/000808\ndata/0035/000809\ndata/0035/000810\ndata/0035/000811\ndata/0035/000812\ndata/0035/000813\ndata/0035/000814\ndata/0035/000815\ndata/0035/000816\ndata/0035/000817\ndata/0035/000818\ndata/0035/000819\ndata/0035/000820\ndata/0035/000821\ndata/0035/000822\ndata/0035/000823\ndata/0035/000824\ndata/0035/000825\ndata/0035/000826\ndata/0035/000827\ndata/0035/000828\ndata/0035/000829\ndata/0035/000830\ndata/0035/000831\ndata/0035/000832\ndata/0035/000833\ndata/0035/000834\ndata/0035/000835\ndata/0035/000836\ndata/0035/000837\ndata/0035/000838\ndata/0035/000839\ndata/0035/000840\ndata/0035/000841\ndata/0035/000842\ndata/0035/000843\ndata/0035/000844\ndata/0035/000845\ndata/0035/000846\ndata/0035/000847\ndata/0035/000848\ndata/0035/000849\ndata/0035/000850\ndata/0035/000851\ndata/0035/000852\ndata/0036/000001\ndata/0036/000002\ndata/0036/000003\ndata/0036/000004\ndata/0036/000005\ndata/0036/000006\ndata/0036/000007\ndata/0036/000008\ndata/0036/000009\ndata/0036/000010\ndata/0036/000011\ndata/0036/000012\ndata/0036/000013\ndata/0036/000014\ndata/0036/000015\ndata/0036/000016\ndata/0036/000017\ndata/0036/000018\ndata/0036/000019\ndata/0036/000020\ndata/0036/000021\ndata/0036/000022\ndata/0036/000023\ndata/0036/000024\ndata/0036/000025\ndata/0036/000026\ndata/0036/000027\ndata/0036/000028\ndata/0036/000029\ndata/0036/000030\ndata/0036/000031\ndata/0036/000032\ndata/0036/000033\ndata/0036/000034\ndata/0036/000035\ndata/0036/000036\ndata/0036/000037\ndata/0036/000038\ndata/0036/000039\ndata/0036/000040\ndata/0036/000041\ndata/0036/000042\ndata/0036/000043\ndata/0036/000044\ndata/0036/000045\ndata/0036/000046\ndata/0036/000047\ndata/0036/000048\ndata/0036/000049\ndata/0036/000050\ndata/0036/000051\ndata/0036/000052\ndata/0036/000053\ndata/0036/000054\ndata/0036/000055\ndata/0036/000056\ndata/0036/000057\ndata/0036/000058\ndata/0036/000059\ndata/0036/000060\ndata/0036/000061\ndata/0036/000062\ndata/0036/000063\ndata/0036/000064\ndata/0036/000065\ndata/0036/000066\ndata/0036/000067\ndata/0036/000068\ndata/0036/000069\ndata/0036/000070\ndata/0036/000071\ndata/0036/000072\ndata/0036/000073\ndata/0036/000074\ndata/0036/000075\ndata/0036/000076\ndata/0036/000077\ndata/0036/000078\ndata/0036/000079\ndata/0036/000080\ndata/0036/000081\ndata/0036/000082\ndata/0036/000083\ndata/0036/000084\ndata/0036/000085\ndata/0036/000086\ndata/0036/000087\ndata/0036/000088\ndata/0036/000089\ndata/0036/000090\ndata/0036/000091\ndata/0036/000092\ndata/0036/000093\ndata/0036/000094\ndata/0036/000095\ndata/0036/000096\ndata/0036/000097\ndata/0036/000098\ndata/0036/000099\ndata/0036/000100\ndata/0036/000101\ndata/0036/000102\ndata/0036/000103\ndata/0036/000104\ndata/0036/000105\ndata/0036/000106\ndata/0036/000107\ndata/0036/000108\ndata/0036/000109\ndata/0036/000110\ndata/0036/000111\ndata/0036/000112\ndata/0036/000113\ndata/0036/000114\ndata/0036/000115\ndata/0036/000116\ndata/0036/000117\ndata/0036/000118\ndata/0036/000119\ndata/0036/000120\ndata/0036/000121\ndata/0036/000122\ndata/0036/000123\ndata/0036/000124\ndata/0036/000125\ndata/0036/000126\ndata/0036/000127\ndata/0036/000128\ndata/0036/000129\ndata/0036/000130\ndata/0036/000131\ndata/0036/000132\ndata/0036/000133\ndata/0036/000134\ndata/0036/000135\ndata/0036/000136\ndata/0036/000137\ndata/0036/000138\ndata/0036/000139\ndata/0036/000140\ndata/0036/000141\ndata/0036/000142\ndata/0036/000143\ndata/0036/000144\ndata/0036/000145\ndata/0036/000146\ndata/0036/000147\ndata/0036/000148\ndata/0036/000149\ndata/0036/000150\ndata/0036/000151\ndata/0036/000152\ndata/0036/000153\ndata/0036/000154\ndata/0036/000155\ndata/0036/000156\ndata/0036/000157\ndata/0036/000158\ndata/0036/000159\ndata/0036/000160\ndata/0036/000161\ndata/0036/000162\ndata/0036/000163\ndata/0036/000164\ndata/0036/000165\ndata/0036/000166\ndata/0036/000167\ndata/0036/000168\ndata/0036/000169\ndata/0036/000170\ndata/0036/000171\ndata/0036/000172\ndata/0036/000173\ndata/0036/000174\ndata/0036/000175\ndata/0036/000176\ndata/0036/000177\ndata/0036/000178\ndata/0036/000179\ndata/0036/000180\ndata/0036/000181\ndata/0036/000182\ndata/0036/000183\ndata/0036/000184\ndata/0036/000185\ndata/0036/000186\ndata/0036/000187\ndata/0036/000188\ndata/0036/000189\ndata/0036/000190\ndata/0036/000191\ndata/0036/000192\ndata/0036/000193\ndata/0036/000194\ndata/0036/000195\ndata/0036/000196\ndata/0036/000197\ndata/0036/000198\ndata/0036/000199\ndata/0036/000200\ndata/0036/000201\ndata/0036/000202\ndata/0036/000203\ndata/0036/000204\ndata/0036/000205\ndata/0036/000206\ndata/0036/000207\ndata/0036/000208\ndata/0036/000209\ndata/0036/000210\ndata/0036/000211\ndata/0036/000212\ndata/0036/000213\ndata/0036/000214\ndata/0036/000215\ndata/0036/000216\ndata/0036/000217\ndata/0036/000218\ndata/0036/000219\ndata/0036/000220\ndata/0036/000221\ndata/0036/000222\ndata/0036/000223\ndata/0036/000224\ndata/0036/000225\ndata/0036/000226\ndata/0036/000227\ndata/0036/000228\ndata/0036/000229\ndata/0036/000230\ndata/0036/000231\ndata/0036/000232\ndata/0036/000233\ndata/0036/000234\ndata/0036/000235\ndata/0036/000236\ndata/0036/000237\ndata/0036/000238\ndata/0036/000239\ndata/0036/000240\ndata/0036/000241\ndata/0036/000242\ndata/0036/000243\ndata/0036/000244\ndata/0036/000245\ndata/0036/000246\ndata/0036/000247\ndata/0036/000248\ndata/0036/000249\ndata/0036/000250\ndata/0036/000251\ndata/0036/000252\ndata/0036/000253\ndata/0036/000254\ndata/0036/000255\ndata/0036/000256\ndata/0036/000257\ndata/0036/000258\ndata/0036/000259\ndata/0036/000260\ndata/0036/000261\ndata/0036/000262\ndata/0036/000263\ndata/0036/000264\ndata/0036/000265\ndata/0036/000266\ndata/0036/000267\ndata/0036/000268\ndata/0036/000269\ndata/0036/000270\ndata/0036/000271\ndata/0036/000272\ndata/0036/000273\ndata/0036/000274\ndata/0036/000275\ndata/0036/000276\ndata/0036/000277\ndata/0036/000278\ndata/0036/000279\ndata/0036/000280\ndata/0036/000281\ndata/0036/000282\ndata/0036/000283\ndata/0036/000284\ndata/0036/000285\ndata/0036/000286\ndata/0036/000287\ndata/0036/000288\ndata/0036/000289\ndata/0036/000290\ndata/0036/000291\ndata/0036/000292\ndata/0036/000293\ndata/0036/000294\ndata/0036/000295\ndata/0036/000296\ndata/0036/000297\ndata/0036/000298\ndata/0036/000299\ndata/0036/000300\ndata/0036/000301\ndata/0036/000302\ndata/0036/000303\ndata/0036/000304\ndata/0036/000305\ndata/0036/000306\ndata/0036/000307\ndata/0036/000308\ndata/0036/000309\ndata/0036/000310\ndata/0036/000311\ndata/0036/000312\ndata/0036/000313\ndata/0036/000314\ndata/0036/000315\ndata/0036/000316\ndata/0036/000317\ndata/0036/000318\ndata/0036/000319\ndata/0036/000320\ndata/0036/000321\ndata/0036/000322\ndata/0036/000323\ndata/0036/000324\ndata/0036/000325\ndata/0036/000326\ndata/0036/000327\ndata/0036/000328\ndata/0036/000329\ndata/0036/000330\ndata/0036/000331\ndata/0036/000332\ndata/0036/000333\ndata/0036/000334\ndata/0036/000335\ndata/0036/000336\ndata/0036/000337\ndata/0036/000338\ndata/0036/000339\ndata/0036/000340\ndata/0036/000341\ndata/0036/000342\ndata/0036/000343\ndata/0036/000344\ndata/0036/000345\ndata/0036/000346\ndata/0036/000347\ndata/0036/000348\ndata/0036/000349\ndata/0036/000350\ndata/0036/000351\ndata/0036/000352\ndata/0036/000353\ndata/0036/000354\ndata/0036/000355\ndata/0036/000356\ndata/0036/000357\ndata/0036/000358\ndata/0036/000359\ndata/0036/000360\ndata/0036/000361\ndata/0036/000362\ndata/0036/000363\ndata/0036/000364\ndata/0036/000365\ndata/0036/000366\ndata/0036/000367\ndata/0036/000368\ndata/0036/000369\ndata/0036/000370\ndata/0036/000371\ndata/0036/000372\ndata/0036/000373\ndata/0036/000374\ndata/0036/000375\ndata/0036/000376\ndata/0036/000377\ndata/0036/000378\ndata/0036/000379\ndata/0036/000380\ndata/0036/000381\ndata/0036/000382\ndata/0036/000383\ndata/0036/000384\ndata/0036/000385\ndata/0036/000386\ndata/0036/000387\ndata/0036/000388\ndata/0036/000389\ndata/0036/000390\ndata/0036/000391\ndata/0036/000392\ndata/0036/000393\ndata/0036/000394\ndata/0036/000395\ndata/0036/000396\ndata/0036/000397\ndata/0036/000398\ndata/0036/000399\ndata/0036/000400\ndata/0036/000401\ndata/0036/000402\ndata/0036/000403\ndata/0036/000404\ndata/0036/000405\ndata/0036/000406\ndata/0036/000407\ndata/0036/000408\ndata/0036/000409\ndata/0036/000410\ndata/0036/000411\ndata/0036/000412\ndata/0036/000413\ndata/0036/000414\ndata/0036/000415\ndata/0036/000416\ndata/0036/000417\ndata/0036/000418\ndata/0036/000419\ndata/0036/000420\ndata/0036/000421\ndata/0036/000422\ndata/0036/000423\ndata/0036/000424\ndata/0036/000425\ndata/0036/000426\ndata/0036/000427\ndata/0036/000428\ndata/0036/000429\ndata/0036/000430\ndata/0036/000431\ndata/0036/000432\ndata/0036/000433\ndata/0036/000434\ndata/0036/000435\ndata/0036/000436\ndata/0036/000437\ndata/0036/000438\ndata/0036/000439\ndata/0036/000440\ndata/0036/000441\ndata/0036/000442\ndata/0036/000443\ndata/0036/000444\ndata/0036/000445\ndata/0036/000446\ndata/0036/000447\ndata/0036/000448\ndata/0036/000449\ndata/0036/000450\ndata/0036/000451\ndata/0036/000452\ndata/0036/000453\ndata/0036/000454\ndata/0036/000455\ndata/0036/000456\ndata/0036/000457\ndata/0036/000458\ndata/0036/000459\ndata/0036/000460\ndata/0036/000461\ndata/0036/000462\ndata/0036/000463\ndata/0036/000464\ndata/0036/000465\ndata/0036/000466\ndata/0036/000467\ndata/0036/000468\ndata/0036/000469\ndata/0036/000470\ndata/0036/000471\ndata/0036/000472\ndata/0036/000473\ndata/0036/000474\ndata/0036/000475\ndata/0036/000476\ndata/0036/000477\ndata/0036/000478\ndata/0036/000479\ndata/0036/000480\ndata/0036/000481\ndata/0036/000482\ndata/0036/000483\ndata/0036/000484\ndata/0036/000485\ndata/0036/000486\ndata/0036/000487\ndata/0036/000488\ndata/0036/000489\ndata/0036/000490\ndata/0036/000491\ndata/0036/000492\ndata/0036/000493\ndata/0036/000494\ndata/0036/000495\ndata/0036/000496\ndata/0036/000497\ndata/0036/000498\ndata/0036/000499\ndata/0036/000500\ndata/0036/000501\ndata/0036/000502\ndata/0036/000503\ndata/0036/000504\ndata/0036/000505\ndata/0036/000506\ndata/0036/000507\ndata/0036/000508\ndata/0036/000509\ndata/0036/000510\ndata/0036/000511\ndata/0036/000512\ndata/0036/000513\ndata/0036/000514\ndata/0036/000515\ndata/0036/000516\ndata/0036/000517\ndata/0036/000518\ndata/0036/000519\ndata/0036/000520\ndata/0036/000521\ndata/0036/000522\ndata/0036/000523\ndata/0036/000524\ndata/0036/000525\ndata/0036/000526\ndata/0036/000527\ndata/0036/000528\ndata/0036/000529\ndata/0036/000530\ndata/0036/000531\ndata/0036/000532\ndata/0036/000533\ndata/0036/000534\ndata/0036/000535\ndata/0036/000536\ndata/0036/000537\ndata/0036/000538\ndata/0036/000539\ndata/0036/000540\ndata/0036/000541\ndata/0036/000542\ndata/0036/000543\ndata/0036/000544\ndata/0036/000545\ndata/0036/000546\ndata/0036/000547\ndata/0036/000548\ndata/0036/000549\ndata/0036/000550\ndata/0036/000551\ndata/0036/000552\ndata/0036/000553\ndata/0036/000554\ndata/0036/000555\ndata/0036/000556\ndata/0036/000557\ndata/0036/000558\ndata/0036/000559\ndata/0036/000560\ndata/0036/000561\ndata/0036/000562\ndata/0036/000563\ndata/0036/000564\ndata/0036/000565\ndata/0036/000566\ndata/0036/000567\ndata/0036/000568\ndata/0036/000569\ndata/0036/000570\ndata/0036/000571\ndata/0036/000572\ndata/0036/000573\ndata/0036/000574\ndata/0036/000575\ndata/0036/000576\ndata/0036/000577\ndata/0036/000578\ndata/0036/000579\ndata/0036/000580\ndata/0036/000581\ndata/0036/000582\ndata/0036/000583\ndata/0036/000584\ndata/0036/000585\ndata/0036/000586\ndata/0036/000587\ndata/0036/000588\ndata/0036/000589\ndata/0036/000590\ndata/0036/000591\ndata/0036/000592\ndata/0036/000593\ndata/0036/000594\ndata/0036/000595\ndata/0036/000596\ndata/0036/000597\ndata/0036/000598\ndata/0036/000599\ndata/0036/000600\ndata/0036/000601\ndata/0036/000602\ndata/0036/000603\ndata/0036/000604\ndata/0036/000605\ndata/0036/000606\ndata/0036/000607\ndata/0036/000608\ndata/0036/000609\ndata/0036/000610\ndata/0036/000611\ndata/0036/000612\ndata/0036/000613\ndata/0036/000614\ndata/0036/000615\ndata/0036/000616\ndata/0036/000617\ndata/0036/000618\ndata/0036/000619\ndata/0036/000620\ndata/0036/000621\ndata/0036/000622\ndata/0036/000623\ndata/0036/000624\ndata/0036/000625\ndata/0036/000626\ndata/0036/000627\ndata/0036/000628\ndata/0036/000629\ndata/0036/000630\ndata/0036/000631\ndata/0036/000632\ndata/0036/000633\ndata/0036/000634\ndata/0036/000635\ndata/0036/000636\ndata/0036/000637\ndata/0036/000638\ndata/0036/000639\ndata/0036/000640\ndata/0036/000641\ndata/0036/000642\ndata/0036/000643\ndata/0036/000644\ndata/0036/000645\ndata/0036/000646\ndata/0036/000647\ndata/0036/000648\ndata/0036/000649\ndata/0036/000650\ndata/0036/000651\ndata/0036/000652\ndata/0036/000653\ndata/0036/000654\ndata/0036/000655\ndata/0036/000656\ndata/0036/000657\ndata/0036/000658\ndata/0036/000659\ndata/0036/000660\ndata/0036/000661\ndata/0036/000662\ndata/0036/000663\ndata/0036/000664\ndata/0036/000665\ndata/0036/000666\ndata/0036/000667\ndata/0036/000668\ndata/0036/000669\ndata/0036/000670\ndata/0036/000671\ndata/0036/000672\ndata/0036/000673\ndata/0036/000674\ndata/0036/000675\ndata/0036/000676\ndata/0036/000677\ndata/0036/000678\ndata/0036/000679\ndata/0036/000680\ndata/0036/000681\ndata/0036/000682\ndata/0036/000683\ndata/0036/000684\ndata/0036/000685\ndata/0036/000686\ndata/0036/000687\ndata/0036/000688\ndata/0036/000689\ndata/0036/000690\ndata/0036/000691\ndata/0036/000692\ndata/0036/000693\ndata/0036/000694\ndata/0036/000695\ndata/0036/000696\ndata/0036/000697\ndata/0036/000698\ndata/0036/000699\ndata/0036/000700\ndata/0036/000701\ndata/0036/000702\ndata/0036/000703\ndata/0036/000704\ndata/0036/000705\ndata/0036/000706\ndata/0036/000707\ndata/0036/000708\ndata/0036/000709\ndata/0036/000710\ndata/0036/000711\ndata/0036/000712\ndata/0036/000713\ndata/0036/000714\ndata/0036/000715\ndata/0036/000716\ndata/0036/000717\ndata/0036/000718\ndata/0036/000719\ndata/0036/000720\ndata/0036/000721\ndata/0036/000722\ndata/0036/000723\ndata/0036/000724\ndata/0036/000725\ndata/0036/000726\ndata/0036/000727\ndata/0036/000728\ndata/0036/000729\ndata/0036/000730\ndata/0036/000731\ndata/0036/000732\ndata/0036/000733\ndata/0036/000734\ndata/0036/000735\ndata/0036/000736\ndata/0036/000737\ndata/0036/000738\ndata/0036/000739\ndata/0036/000740\ndata/0036/000741\ndata/0036/000742\ndata/0036/000743\ndata/0036/000744\ndata/0036/000745\ndata/0036/000746\ndata/0036/000747\ndata/0036/000748\ndata/0036/000749\ndata/0036/000750\ndata/0036/000751\ndata/0036/000752\ndata/0036/000753\ndata/0036/000754\ndata/0036/000755\ndata/0036/000756\ndata/0036/000757\ndata/0036/000758\ndata/0036/000759\ndata/0036/000760\ndata/0036/000761\ndata/0036/000762\ndata/0036/000763\ndata/0036/000764\ndata/0036/000765\ndata/0036/000766\ndata/0036/000767\ndata/0036/000768\ndata/0036/000769\ndata/0036/000770\ndata/0036/000771\ndata/0036/000772\ndata/0036/000773\ndata/0036/000774\ndata/0036/000775\ndata/0036/000776\ndata/0036/000777\ndata/0036/000778\ndata/0036/000779\ndata/0036/000780\ndata/0036/000781\ndata/0036/000782\ndata/0036/000783\ndata/0036/000784\ndata/0036/000785\ndata/0036/000786\ndata/0036/000787\ndata/0036/000788\ndata/0036/000789\ndata/0036/000790\ndata/0036/000791\ndata/0036/000792\ndata/0036/000793\ndata/0036/000794\ndata/0036/000795\ndata/0036/000796\ndata/0036/000797\ndata/0036/000798\ndata/0036/000799\ndata/0036/000800\ndata/0036/000801\ndata/0036/000802\ndata/0036/000803\ndata/0036/000804\ndata/0036/000805\ndata/0036/000806\ndata/0036/000807\ndata/0036/000808\ndata/0036/000809\ndata/0036/000810\ndata/0036/000811\ndata/0036/000812\ndata/0036/000813\ndata/0036/000814\ndata/0036/000815\ndata/0036/000816\ndata/0036/000817\ndata/0036/000818\ndata/0036/000819\ndata/0036/000820\ndata/0036/000821\ndata/0036/000822\ndata/0036/000823\ndata/0036/000824\ndata/0036/000825\ndata/0037/000001\ndata/0037/000002\ndata/0037/000003\ndata/0037/000004\ndata/0037/000005\ndata/0037/000006\ndata/0037/000007\ndata/0037/000008\ndata/0037/000009\ndata/0037/000010\ndata/0037/000011\ndata/0037/000012\ndata/0037/000013\ndata/0037/000014\ndata/0037/000015\ndata/0037/000016\ndata/0037/000017\ndata/0037/000018\ndata/0037/000019\ndata/0037/000020\ndata/0037/000021\ndata/0037/000022\ndata/0037/000023\ndata/0037/000024\ndata/0037/000025\ndata/0037/000026\ndata/0037/000027\ndata/0037/000028\ndata/0037/000029\ndata/0037/000030\ndata/0037/000031\ndata/0037/000032\ndata/0037/000033\ndata/0037/000034\ndata/0037/000035\ndata/0037/000036\ndata/0037/000037\ndata/0037/000038\ndata/0037/000039\ndata/0037/000040\ndata/0037/000041\ndata/0037/000042\ndata/0037/000043\ndata/0037/000044\ndata/0037/000045\ndata/0037/000046\ndata/0037/000047\ndata/0037/000048\ndata/0037/000049\ndata/0037/000050\ndata/0037/000051\ndata/0037/000052\ndata/0037/000053\ndata/0037/000054\ndata/0037/000055\ndata/0037/000056\ndata/0037/000057\ndata/0037/000058\ndata/0037/000059\ndata/0037/000060\ndata/0037/000061\ndata/0037/000062\ndata/0037/000063\ndata/0037/000064\ndata/0037/000065\ndata/0037/000066\ndata/0037/000067\ndata/0037/000068\ndata/0037/000069\ndata/0037/000070\ndata/0037/000071\ndata/0037/000072\ndata/0037/000073\ndata/0037/000074\ndata/0037/000075\ndata/0037/000076\ndata/0037/000077\ndata/0037/000078\ndata/0037/000079\ndata/0037/000080\ndata/0037/000081\ndata/0037/000082\ndata/0037/000083\ndata/0037/000084\ndata/0037/000085\ndata/0037/000086\ndata/0037/000087\ndata/0037/000088\ndata/0037/000089\ndata/0037/000090\ndata/0037/000091\ndata/0037/000092\ndata/0037/000093\ndata/0037/000094\ndata/0037/000095\ndata/0037/000096\ndata/0037/000097\ndata/0037/000098\ndata/0037/000099\ndata/0037/000100\ndata/0037/000101\ndata/0037/000102\ndata/0037/000103\ndata/0037/000104\ndata/0037/000105\ndata/0037/000106\ndata/0037/000107\ndata/0037/000108\ndata/0037/000109\ndata/0037/000110\ndata/0037/000111\ndata/0037/000112\ndata/0037/000113\ndata/0037/000114\ndata/0037/000115\ndata/0037/000116\ndata/0037/000117\ndata/0037/000118\ndata/0037/000119\ndata/0037/000120\ndata/0037/000121\ndata/0037/000122\ndata/0037/000123\ndata/0037/000124\ndata/0037/000125\ndata/0037/000126\ndata/0037/000127\ndata/0037/000128\ndata/0037/000129\ndata/0037/000130\ndata/0037/000131\ndata/0037/000132\ndata/0037/000133\ndata/0037/000134\ndata/0037/000135\ndata/0037/000136\ndata/0037/000137\ndata/0037/000138\ndata/0037/000139\ndata/0037/000140\ndata/0037/000141\ndata/0037/000142\ndata/0037/000143\ndata/0037/000144\ndata/0037/000145\ndata/0037/000146\ndata/0037/000147\ndata/0037/000148\ndata/0037/000149\ndata/0037/000150\ndata/0037/000151\ndata/0037/000152\ndata/0037/000153\ndata/0037/000154\ndata/0037/000155\ndata/0037/000156\ndata/0037/000157\ndata/0037/000158\ndata/0037/000159\ndata/0037/000160\ndata/0037/000161\ndata/0037/000162\ndata/0037/000163\ndata/0037/000164\ndata/0037/000165\ndata/0037/000166\ndata/0037/000167\ndata/0037/000168\ndata/0037/000169\ndata/0037/000170\ndata/0037/000171\ndata/0037/000172\ndata/0037/000173\ndata/0037/000174\ndata/0037/000175\ndata/0037/000176\ndata/0037/000177\ndata/0037/000178\ndata/0037/000179\ndata/0037/000180\ndata/0037/000181\ndata/0037/000182\ndata/0037/000183\ndata/0037/000184\ndata/0037/000185\ndata/0037/000186\ndata/0037/000187\ndata/0037/000188\ndata/0037/000189\ndata/0037/000190\ndata/0037/000191\ndata/0037/000192\ndata/0037/000193\ndata/0037/000194\ndata/0037/000195\ndata/0037/000196\ndata/0037/000197\ndata/0037/000198\ndata/0037/000199\ndata/0037/000200\ndata/0037/000201\ndata/0037/000202\ndata/0037/000203\ndata/0037/000204\ndata/0037/000205\ndata/0037/000206\ndata/0037/000207\ndata/0037/000208\ndata/0037/000209\ndata/0037/000210\ndata/0037/000211\ndata/0037/000212\ndata/0037/000213\ndata/0037/000214\ndata/0037/000215\ndata/0037/000216\ndata/0037/000217\ndata/0037/000218\ndata/0037/000219\ndata/0037/000220\ndata/0037/000221\ndata/0037/000222\ndata/0037/000223\ndata/0037/000224\ndata/0037/000225\ndata/0037/000226\ndata/0037/000227\ndata/0037/000228\ndata/0037/000229\ndata/0037/000230\ndata/0037/000231\ndata/0037/000232\ndata/0037/000233\ndata/0037/000234\ndata/0037/000235\ndata/0037/000236\ndata/0037/000237\ndata/0037/000238\ndata/0037/000239\ndata/0037/000240\ndata/0037/000241\ndata/0037/000242\ndata/0037/000243\ndata/0037/000244\ndata/0037/000245\ndata/0037/000246\ndata/0037/000247\ndata/0037/000248\ndata/0037/000249\ndata/0037/000250\ndata/0037/000251\ndata/0037/000252\ndata/0037/000253\ndata/0037/000254\ndata/0037/000255\ndata/0037/000256\ndata/0037/000257\ndata/0037/000258\ndata/0037/000259\ndata/0037/000260\ndata/0037/000261\ndata/0037/000262\ndata/0037/000263\ndata/0037/000264\ndata/0037/000265\ndata/0037/000266\ndata/0037/000267\ndata/0037/000268\ndata/0037/000269\ndata/0037/000270\ndata/0037/000271\ndata/0037/000272\ndata/0037/000273\ndata/0037/000274\ndata/0037/000275\ndata/0037/000276\ndata/0037/000277\ndata/0037/000278\ndata/0037/000279\ndata/0037/000280\ndata/0037/000281\ndata/0037/000282\ndata/0037/000283\ndata/0037/000284\ndata/0037/000285\ndata/0037/000286\ndata/0037/000287\ndata/0037/000288\ndata/0037/000289\ndata/0037/000290\ndata/0037/000291\ndata/0037/000292\ndata/0037/000293\ndata/0037/000294\ndata/0037/000295\ndata/0037/000296\ndata/0037/000297\ndata/0037/000298\ndata/0037/000299\ndata/0037/000300\ndata/0037/000301\ndata/0037/000302\ndata/0037/000303\ndata/0037/000304\ndata/0037/000305\ndata/0037/000306\ndata/0037/000307\ndata/0037/000308\ndata/0037/000309\ndata/0037/000310\ndata/0037/000311\ndata/0037/000312\ndata/0037/000313\ndata/0037/000314\ndata/0037/000315\ndata/0037/000316\ndata/0037/000317\ndata/0037/000318\ndata/0037/000319\ndata/0037/000320\ndata/0037/000321\ndata/0037/000322\ndata/0037/000323\ndata/0037/000324\ndata/0037/000325\ndata/0037/000326\ndata/0037/000327\ndata/0037/000328\ndata/0037/000329\ndata/0037/000330\ndata/0037/000331\ndata/0037/000332\ndata/0037/000333\ndata/0037/000334\ndata/0037/000335\ndata/0037/000336\ndata/0037/000337\ndata/0037/000338\ndata/0037/000339\ndata/0037/000340\ndata/0037/000341\ndata/0037/000342\ndata/0037/000343\ndata/0037/000344\ndata/0037/000345\ndata/0037/000346\ndata/0037/000347\ndata/0037/000348\ndata/0037/000349\ndata/0037/000350\ndata/0037/000351\ndata/0037/000352\ndata/0037/000353\ndata/0037/000354\ndata/0037/000355\ndata/0037/000356\ndata/0037/000357\ndata/0037/000358\ndata/0037/000359\ndata/0037/000360\ndata/0037/000361\ndata/0037/000362\ndata/0037/000363\ndata/0037/000364\ndata/0037/000365\ndata/0037/000366\ndata/0037/000367\ndata/0037/000368\ndata/0037/000369\ndata/0037/000370\ndata/0037/000371\ndata/0037/000372\ndata/0037/000373\ndata/0037/000374\ndata/0037/000375\ndata/0037/000376\ndata/0037/000377\ndata/0037/000378\ndata/0037/000379\ndata/0037/000380\ndata/0037/000381\ndata/0037/000382\ndata/0037/000383\ndata/0037/000384\ndata/0037/000385\ndata/0037/000386\ndata/0037/000387\ndata/0037/000388\ndata/0037/000389\ndata/0037/000390\ndata/0037/000391\ndata/0037/000392\ndata/0037/000393\ndata/0037/000394\ndata/0037/000395\ndata/0037/000396\ndata/0037/000397\ndata/0037/000398\ndata/0037/000399\ndata/0037/000400\ndata/0037/000401\ndata/0037/000402\ndata/0037/000403\ndata/0037/000404\ndata/0037/000405\ndata/0037/000406\ndata/0037/000407\ndata/0037/000408\ndata/0037/000409\ndata/0037/000410\ndata/0037/000411\ndata/0037/000412\ndata/0037/000413\ndata/0037/000414\ndata/0037/000415\ndata/0037/000416\ndata/0037/000417\ndata/0037/000418\ndata/0037/000419\ndata/0037/000420\ndata/0037/000421\ndata/0037/000422\ndata/0037/000423\ndata/0037/000424\ndata/0037/000425\ndata/0037/000426\ndata/0037/000427\ndata/0037/000428\ndata/0037/000429\ndata/0037/000430\ndata/0037/000431\ndata/0037/000432\ndata/0037/000433\ndata/0037/000434\ndata/0037/000435\ndata/0037/000436\ndata/0037/000437\ndata/0037/000438\ndata/0037/000439\ndata/0037/000440\ndata/0037/000441\ndata/0037/000442\ndata/0037/000443\ndata/0037/000444\ndata/0037/000445\ndata/0037/000446\ndata/0037/000447\ndata/0037/000448\ndata/0037/000449\ndata/0037/000450\ndata/0037/000451\ndata/0037/000452\ndata/0037/000453\ndata/0037/000454\ndata/0037/000455\ndata/0037/000456\ndata/0037/000457\ndata/0037/000458\ndata/0037/000459\ndata/0037/000460\ndata/0037/000461\ndata/0037/000462\ndata/0037/000463\ndata/0037/000464\ndata/0037/000465\ndata/0037/000466\ndata/0037/000467\ndata/0037/000468\ndata/0037/000469\ndata/0037/000470\ndata/0037/000471\ndata/0037/000472\ndata/0037/000473\ndata/0037/000474\ndata/0037/000475\ndata/0037/000476\ndata/0037/000477\ndata/0037/000478\ndata/0037/000479\ndata/0037/000480\ndata/0037/000481\ndata/0037/000482\ndata/0037/000483\ndata/0037/000484\ndata/0037/000485\ndata/0037/000486\ndata/0037/000487\ndata/0037/000488\ndata/0037/000489\ndata/0037/000490\ndata/0037/000491\ndata/0037/000492\ndata/0037/000493\ndata/0037/000494\ndata/0037/000495\ndata/0037/000496\ndata/0037/000497\ndata/0037/000498\ndata/0037/000499\ndata/0037/000500\ndata/0037/000501\ndata/0037/000502\ndata/0037/000503\ndata/0037/000504\ndata/0037/000505\ndata/0037/000506\ndata/0037/000507\ndata/0037/000508\ndata/0037/000509\ndata/0037/000510\ndata/0037/000511\ndata/0037/000512\ndata/0037/000513\ndata/0037/000514\ndata/0037/000515\ndata/0037/000516\ndata/0037/000517\ndata/0037/000518\ndata/0037/000519\ndata/0037/000520\ndata/0037/000521\ndata/0037/000522\ndata/0037/000523\ndata/0037/000524\ndata/0037/000525\ndata/0037/000526\ndata/0037/000527\ndata/0037/000528\ndata/0037/000529\ndata/0037/000530\ndata/0037/000531\ndata/0037/000532\ndata/0037/000533\ndata/0037/000534\ndata/0037/000535\ndata/0037/000536\ndata/0037/000537\ndata/0037/000538\ndata/0037/000539\ndata/0037/000540\ndata/0037/000541\ndata/0037/000542\ndata/0037/000543\ndata/0037/000544\ndata/0037/000545\ndata/0037/000546\ndata/0037/000547\ndata/0037/000548\ndata/0037/000549\ndata/0037/000550\ndata/0037/000551\ndata/0037/000552\ndata/0037/000553\ndata/0037/000554\ndata/0037/000555\ndata/0037/000556\ndata/0037/000557\ndata/0037/000558\ndata/0037/000559\ndata/0037/000560\ndata/0037/000561\ndata/0037/000562\ndata/0037/000563\ndata/0037/000564\ndata/0037/000565\ndata/0037/000566\ndata/0037/000567\ndata/0037/000568\ndata/0037/000569\ndata/0037/000570\ndata/0037/000571\ndata/0037/000572\ndata/0037/000573\ndata/0037/000574\ndata/0037/000575\ndata/0037/000576\ndata/0037/000577\ndata/0037/000578\ndata/0037/000579\ndata/0037/000580\ndata/0037/000581\ndata/0037/000582\ndata/0037/000583\ndata/0037/000584\ndata/0037/000585\ndata/0037/000586\ndata/0037/000587\ndata/0037/000588\ndata/0037/000589\ndata/0037/000590\ndata/0037/000591\ndata/0037/000592\ndata/0037/000593\ndata/0037/000594\ndata/0037/000595\ndata/0037/000596\ndata/0037/000597\ndata/0037/000598\ndata/0037/000599\ndata/0037/000600\ndata/0037/000601\ndata/0037/000602\ndata/0037/000603\ndata/0037/000604\ndata/0037/000605\ndata/0037/000606\ndata/0037/000607\ndata/0037/000608\ndata/0037/000609\ndata/0037/000610\ndata/0037/000611\ndata/0037/000612\ndata/0037/000613\ndata/0037/000614\ndata/0037/000615\ndata/0037/000616\ndata/0037/000617\ndata/0037/000618\ndata/0037/000619\ndata/0037/000620\ndata/0037/000621\ndata/0037/000622\ndata/0037/000623\ndata/0037/000624\ndata/0037/000625\ndata/0037/000626\ndata/0037/000627\ndata/0037/000628\ndata/0037/000629\ndata/0037/000630\ndata/0037/000631\ndata/0037/000632\ndata/0037/000633\ndata/0037/000634\ndata/0037/000635\ndata/0037/000636\ndata/0037/000637\ndata/0037/000638\ndata/0037/000639\ndata/0037/000640\ndata/0037/000641\ndata/0037/000642\ndata/0037/000643\ndata/0037/000644\ndata/0037/000645\ndata/0037/000646\ndata/0037/000647\ndata/0037/000648\ndata/0037/000649\ndata/0037/000650\ndata/0037/000651\ndata/0037/000652\ndata/0037/000653\ndata/0037/000654\ndata/0037/000655\ndata/0037/000656\ndata/0037/000657\ndata/0037/000658\ndata/0037/000659\ndata/0037/000660\ndata/0037/000661\ndata/0037/000662\ndata/0037/000663\ndata/0037/000664\ndata/0037/000665\ndata/0037/000666\ndata/0037/000667\ndata/0037/000668\ndata/0037/000669\ndata/0037/000670\ndata/0037/000671\ndata/0037/000672\ndata/0037/000673\ndata/0037/000674\ndata/0037/000675\ndata/0037/000676\ndata/0037/000677\ndata/0037/000678\ndata/0037/000679\ndata/0037/000680\ndata/0037/000681\ndata/0037/000682\ndata/0037/000683\ndata/0037/000684\ndata/0037/000685\ndata/0037/000686\ndata/0037/000687\ndata/0037/000688\ndata/0037/000689\ndata/0037/000690\ndata/0037/000691\ndata/0037/000692\ndata/0037/000693\ndata/0037/000694\ndata/0037/000695\ndata/0037/000696\ndata/0037/000697\ndata/0037/000698\ndata/0037/000699\ndata/0037/000700\ndata/0037/000701\ndata/0037/000702\ndata/0037/000703\ndata/0037/000704\ndata/0037/000705\ndata/0037/000706\ndata/0037/000707\ndata/0037/000708\ndata/0037/000709\ndata/0037/000710\ndata/0037/000711\ndata/0037/000712\ndata/0037/000713\ndata/0037/000714\ndata/0037/000715\ndata/0037/000716\ndata/0037/000717\ndata/0037/000718\ndata/0037/000719\ndata/0037/000720\ndata/0037/000721\ndata/0037/000722\ndata/0037/000723\ndata/0037/000724\ndata/0037/000725\ndata/0037/000726\ndata/0037/000727\ndata/0037/000728\ndata/0037/000729\ndata/0037/000730\ndata/0037/000731\ndata/0037/000732\ndata/0037/000733\ndata/0037/000734\ndata/0037/000735\ndata/0037/000736\ndata/0037/000737\ndata/0037/000738\ndata/0037/000739\ndata/0037/000740\ndata/0037/000741\ndata/0037/000742\ndata/0037/000743\ndata/0037/000744\ndata/0037/000745\ndata/0037/000746\ndata/0037/000747\ndata/0037/000748\ndata/0037/000749\ndata/0037/000750\ndata/0037/000751\ndata/0037/000752\ndata/0037/000753\ndata/0037/000754\ndata/0037/000755\ndata/0037/000756\ndata/0037/000757\ndata/0037/000758\ndata/0037/000759\ndata/0037/000760\ndata/0037/000761\ndata/0037/000762\ndata/0037/000763\ndata/0037/000764\ndata/0037/000765\ndata/0037/000766\ndata/0037/000767\ndata/0037/000768\ndata/0037/000769\ndata/0037/000770\ndata/0037/000771\ndata/0037/000772\ndata/0037/000773\ndata/0037/000774\ndata/0037/000775\ndata/0037/000776\ndata/0037/000777\ndata/0037/000778\ndata/0037/000779\ndata/0037/000780\ndata/0037/000781\ndata/0037/000782\ndata/0037/000783\ndata/0037/000784\ndata/0037/000785\ndata/0037/000786\ndata/0037/000787\ndata/0037/000788\ndata/0037/000789\ndata/0037/000790\ndata/0037/000791\ndata/0037/000792\ndata/0037/000793\ndata/0037/000794\ndata/0037/000795\ndata/0037/000796\ndata/0037/000797\ndata/0037/000798\ndata/0037/000799\ndata/0037/000800\ndata/0037/000801\ndata/0037/000802\ndata/0037/000803\ndata/0037/000804\ndata/0037/000805\ndata/0037/000806\ndata/0037/000807\ndata/0037/000808\ndata/0037/000809\ndata/0037/000810\ndata/0037/000811\ndata/0037/000812\ndata/0037/000813\ndata/0037/000814\ndata/0037/000815\ndata/0037/000816\ndata/0037/000817\ndata/0037/000818\ndata/0037/000819\ndata/0037/000820\ndata/0037/000821\ndata/0037/000822\ndata/0037/000823\ndata/0037/000824\ndata/0037/000825\ndata/0037/000826\ndata/0037/000827\ndata/0037/000828\ndata/0037/000829\ndata/0037/000830\ndata/0037/000831\ndata/0037/000832\ndata/0037/000833\ndata/0037/000834\ndata/0037/000835\ndata/0037/000836\ndata/0037/000837\ndata/0037/000838\ndata/0037/000839\ndata/0037/000840\ndata/0037/000841\ndata/0037/000842\ndata/0037/000843\ndata/0037/000844\ndata/0038/000001\ndata/0038/000002\ndata/0038/000003\ndata/0038/000004\ndata/0038/000005\ndata/0038/000006\ndata/0038/000007\ndata/0038/000008\ndata/0038/000009\ndata/0038/000010\ndata/0038/000011\ndata/0038/000012\ndata/0038/000013\ndata/0038/000014\ndata/0038/000015\ndata/0038/000016\ndata/0038/000017\ndata/0038/000018\ndata/0038/000019\ndata/0038/000020\ndata/0038/000021\ndata/0038/000022\ndata/0038/000023\ndata/0038/000024\ndata/0038/000025\ndata/0038/000026\ndata/0038/000027\ndata/0038/000028\ndata/0038/000029\ndata/0038/000030\ndata/0038/000031\ndata/0038/000032\ndata/0038/000033\ndata/0038/000034\ndata/0038/000035\ndata/0038/000036\ndata/0038/000037\ndata/0038/000038\ndata/0038/000039\ndata/0038/000040\ndata/0038/000041\ndata/0038/000042\ndata/0038/000043\ndata/0038/000044\ndata/0038/000045\ndata/0038/000046\ndata/0038/000047\ndata/0038/000048\ndata/0038/000049\ndata/0038/000050\ndata/0038/000051\ndata/0038/000052\ndata/0038/000053\ndata/0038/000054\ndata/0038/000055\ndata/0038/000056\ndata/0038/000057\ndata/0038/000058\ndata/0038/000059\ndata/0038/000060\ndata/0038/000061\ndata/0038/000062\ndata/0038/000063\ndata/0038/000064\ndata/0038/000065\ndata/0038/000066\ndata/0038/000067\ndata/0038/000068\ndata/0038/000069\ndata/0038/000070\ndata/0038/000071\ndata/0038/000072\ndata/0038/000073\ndata/0038/000074\ndata/0038/000075\ndata/0038/000076\ndata/0038/000077\ndata/0038/000078\ndata/0038/000079\ndata/0038/000080\ndata/0038/000081\ndata/0038/000082\ndata/0038/000083\ndata/0038/000084\ndata/0038/000085\ndata/0038/000086\ndata/0038/000087\ndata/0038/000088\ndata/0038/000089\ndata/0038/000090\ndata/0038/000091\ndata/0038/000092\ndata/0038/000093\ndata/0038/000094\ndata/0038/000095\ndata/0038/000096\ndata/0038/000097\ndata/0038/000098\ndata/0038/000099\ndata/0038/000100\ndata/0038/000101\ndata/0038/000102\ndata/0038/000103\ndata/0038/000104\ndata/0038/000105\ndata/0038/000106\ndata/0038/000107\ndata/0038/000108\ndata/0038/000109\ndata/0038/000110\ndata/0038/000111\ndata/0038/000112\ndata/0038/000113\ndata/0038/000114\ndata/0038/000115\ndata/0038/000116\ndata/0038/000117\ndata/0038/000118\ndata/0038/000119\ndata/0038/000120\ndata/0038/000121\ndata/0038/000122\ndata/0038/000123\ndata/0038/000124\ndata/0038/000125\ndata/0038/000126\ndata/0038/000127\ndata/0038/000128\ndata/0038/000129\ndata/0038/000130\ndata/0038/000131\ndata/0038/000132\ndata/0038/000133\ndata/0038/000134\ndata/0038/000135\ndata/0038/000136\ndata/0038/000137\ndata/0038/000138\ndata/0038/000139\ndata/0038/000140\ndata/0038/000141\ndata/0038/000142\ndata/0038/000143\ndata/0038/000144\ndata/0038/000145\ndata/0038/000146\ndata/0038/000147\ndata/0038/000148\ndata/0038/000149\ndata/0038/000150\ndata/0038/000151\ndata/0038/000152\ndata/0038/000153\ndata/0038/000154\ndata/0038/000155\ndata/0038/000156\ndata/0038/000157\ndata/0038/000158\ndata/0038/000159\ndata/0038/000160\ndata/0038/000161\ndata/0038/000162\ndata/0038/000163\ndata/0038/000164\ndata/0038/000165\ndata/0038/000166\ndata/0038/000167\ndata/0038/000168\ndata/0038/000169\ndata/0038/000170\ndata/0038/000171\ndata/0038/000172\ndata/0038/000173\ndata/0038/000174\ndata/0038/000175\ndata/0038/000176\ndata/0038/000177\ndata/0038/000178\ndata/0038/000179\ndata/0038/000180\ndata/0038/000181\ndata/0038/000182\ndata/0038/000183\ndata/0038/000184\ndata/0038/000185\ndata/0038/000186\ndata/0038/000187\ndata/0038/000188\ndata/0038/000189\ndata/0038/000190\ndata/0038/000191\ndata/0038/000192\ndata/0038/000193\ndata/0038/000194\ndata/0038/000195\ndata/0038/000196\ndata/0038/000197\ndata/0038/000198\ndata/0038/000199\ndata/0038/000200\ndata/0038/000201\ndata/0038/000202\ndata/0038/000203\ndata/0038/000204\ndata/0038/000205\ndata/0038/000206\ndata/0038/000207\ndata/0038/000208\ndata/0038/000209\ndata/0038/000210\ndata/0038/000211\ndata/0038/000212\ndata/0038/000213\ndata/0038/000214\ndata/0038/000215\ndata/0038/000216\ndata/0038/000217\ndata/0038/000218\ndata/0038/000219\ndata/0038/000220\ndata/0038/000221\ndata/0038/000222\ndata/0038/000223\ndata/0038/000224\ndata/0038/000225\ndata/0038/000226\ndata/0038/000227\ndata/0038/000228\ndata/0038/000229\ndata/0038/000230\ndata/0038/000231\ndata/0038/000232\ndata/0038/000233\ndata/0038/000234\ndata/0038/000235\ndata/0038/000236\ndata/0038/000237\ndata/0038/000238\ndata/0038/000239\ndata/0038/000240\ndata/0038/000241\ndata/0038/000242\ndata/0038/000243\ndata/0038/000244\ndata/0038/000245\ndata/0038/000246\ndata/0038/000247\ndata/0038/000248\ndata/0038/000249\ndata/0038/000250\ndata/0038/000251\ndata/0038/000252\ndata/0038/000253\ndata/0038/000254\ndata/0038/000255\ndata/0038/000256\ndata/0038/000257\ndata/0038/000258\ndata/0038/000259\ndata/0038/000260\ndata/0038/000261\ndata/0038/000262\ndata/0038/000263\ndata/0038/000264\ndata/0038/000265\ndata/0038/000266\ndata/0038/000267\ndata/0038/000268\ndata/0038/000269\ndata/0038/000270\ndata/0038/000271\ndata/0038/000272\ndata/0038/000273\ndata/0038/000274\ndata/0038/000275\ndata/0038/000276\ndata/0038/000277\ndata/0038/000278\ndata/0038/000279\ndata/0038/000280\ndata/0038/000281\ndata/0038/000282\ndata/0038/000283\ndata/0038/000284\ndata/0038/000285\ndata/0038/000286\ndata/0038/000287\ndata/0038/000288\ndata/0038/000289\ndata/0038/000290\ndata/0038/000291\ndata/0038/000292\ndata/0038/000293\ndata/0038/000294\ndata/0038/000295\ndata/0038/000296\ndata/0038/000297\ndata/0038/000298\ndata/0038/000299\ndata/0038/000300\ndata/0038/000301\ndata/0038/000302\ndata/0038/000303\ndata/0038/000304\ndata/0038/000305\ndata/0038/000306\ndata/0038/000307\ndata/0038/000308\ndata/0038/000309\ndata/0038/000310\ndata/0038/000311\ndata/0038/000312\ndata/0038/000313\ndata/0038/000314\ndata/0038/000315\ndata/0038/000316\ndata/0038/000317\ndata/0038/000318\ndata/0038/000319\ndata/0038/000320\ndata/0038/000321\ndata/0038/000322\ndata/0038/000323\ndata/0038/000324\ndata/0038/000325\ndata/0038/000326\ndata/0038/000327\ndata/0038/000328\ndata/0038/000329\ndata/0038/000330\ndata/0038/000331\ndata/0038/000332\ndata/0038/000333\ndata/0038/000334\ndata/0038/000335\ndata/0038/000336\ndata/0038/000337\ndata/0038/000338\ndata/0038/000339\ndata/0038/000340\ndata/0038/000341\ndata/0038/000342\ndata/0038/000343\ndata/0038/000344\ndata/0038/000345\ndata/0038/000346\ndata/0038/000347\ndata/0038/000348\ndata/0038/000349\ndata/0038/000350\ndata/0038/000351\ndata/0038/000352\ndata/0038/000353\ndata/0038/000354\ndata/0038/000355\ndata/0038/000356\ndata/0038/000357\ndata/0038/000358\ndata/0038/000359\ndata/0038/000360\ndata/0038/000361\ndata/0038/000362\ndata/0038/000363\ndata/0038/000364\ndata/0038/000365\ndata/0038/000366\ndata/0038/000367\ndata/0038/000368\ndata/0038/000369\ndata/0038/000370\ndata/0038/000371\ndata/0038/000372\ndata/0038/000373\ndata/0038/000374\ndata/0038/000375\ndata/0038/000376\ndata/0038/000377\ndata/0038/000378\ndata/0038/000379\ndata/0038/000380\ndata/0038/000381\ndata/0038/000382\ndata/0038/000383\ndata/0038/000384\ndata/0038/000385\ndata/0038/000386\ndata/0038/000387\ndata/0038/000388\ndata/0038/000389\ndata/0038/000390\ndata/0038/000391\ndata/0038/000392\ndata/0038/000393\ndata/0038/000394\ndata/0038/000395\ndata/0038/000396\ndata/0038/000397\ndata/0038/000398\ndata/0038/000399\ndata/0038/000400\ndata/0038/000401\ndata/0038/000402\ndata/0038/000403\ndata/0038/000404\ndata/0038/000405\ndata/0038/000406\ndata/0038/000407\ndata/0038/000408\ndata/0038/000409\ndata/0038/000410\ndata/0038/000411\ndata/0038/000412\ndata/0038/000413\ndata/0038/000414\ndata/0038/000415\ndata/0038/000416\ndata/0038/000417\ndata/0038/000418\ndata/0038/000419\ndata/0038/000420\ndata/0038/000421\ndata/0038/000422\ndata/0038/000423\ndata/0038/000424\ndata/0038/000425\ndata/0038/000426\ndata/0038/000427\ndata/0038/000428\ndata/0038/000429\ndata/0038/000430\ndata/0038/000431\ndata/0038/000432\ndata/0038/000433\ndata/0038/000434\ndata/0038/000435\ndata/0038/000436\ndata/0038/000437\ndata/0038/000438\ndata/0038/000439\ndata/0038/000440\ndata/0038/000441\ndata/0038/000442\ndata/0038/000443\ndata/0038/000444\ndata/0038/000445\ndata/0038/000446\ndata/0038/000447\ndata/0038/000448\ndata/0038/000449\ndata/0038/000450\ndata/0038/000451\ndata/0038/000452\ndata/0038/000453\ndata/0038/000454\ndata/0038/000455\ndata/0038/000456\ndata/0038/000457\ndata/0038/000458\ndata/0038/000459\ndata/0038/000460\ndata/0038/000461\ndata/0038/000462\ndata/0038/000463\ndata/0038/000464\ndata/0038/000465\ndata/0038/000466\ndata/0038/000467\ndata/0038/000468\ndata/0038/000469\ndata/0038/000470\ndata/0038/000471\ndata/0038/000472\ndata/0038/000473\ndata/0038/000474\ndata/0038/000475\ndata/0038/000476\ndata/0038/000477\ndata/0038/000478\ndata/0038/000479\ndata/0038/000480\ndata/0038/000481\ndata/0038/000482\ndata/0038/000483\ndata/0038/000484\ndata/0038/000485\ndata/0038/000486\ndata/0038/000487\ndata/0038/000488\ndata/0038/000489\ndata/0038/000490\ndata/0038/000491\ndata/0038/000492\ndata/0038/000493\ndata/0038/000494\ndata/0038/000495\ndata/0038/000496\ndata/0038/000497\ndata/0038/000498\ndata/0038/000499\ndata/0038/000500\ndata/0038/000501\ndata/0038/000502\ndata/0038/000503\ndata/0038/000504\ndata/0038/000505\ndata/0038/000506\ndata/0038/000507\ndata/0038/000508\ndata/0038/000509\ndata/0038/000510\ndata/0038/000511\ndata/0038/000512\ndata/0038/000513\ndata/0038/000514\ndata/0038/000515\ndata/0038/000516\ndata/0038/000517\ndata/0038/000518\ndata/0038/000519\ndata/0038/000520\ndata/0038/000521\ndata/0038/000522\ndata/0038/000523\ndata/0038/000524\ndata/0038/000525\ndata/0038/000526\ndata/0038/000527\ndata/0038/000528\ndata/0038/000529\ndata/0038/000530\ndata/0038/000531\ndata/0038/000532\ndata/0038/000533\ndata/0038/000534\ndata/0038/000535\ndata/0038/000536\ndata/0038/000537\ndata/0038/000538\ndata/0038/000539\ndata/0038/000540\ndata/0038/000541\ndata/0038/000542\ndata/0038/000543\ndata/0038/000544\ndata/0038/000545\ndata/0038/000546\ndata/0038/000547\ndata/0038/000548\ndata/0038/000549\ndata/0038/000550\ndata/0038/000551\ndata/0038/000552\ndata/0038/000553\ndata/0038/000554\ndata/0038/000555\ndata/0038/000556\ndata/0038/000557\ndata/0038/000558\ndata/0038/000559\ndata/0038/000560\ndata/0038/000561\ndata/0038/000562\ndata/0038/000563\ndata/0038/000564\ndata/0038/000565\ndata/0038/000566\ndata/0038/000567\ndata/0038/000568\ndata/0038/000569\ndata/0038/000570\ndata/0038/000571\ndata/0038/000572\ndata/0038/000573\ndata/0038/000574\ndata/0038/000575\ndata/0038/000576\ndata/0038/000577\ndata/0038/000578\ndata/0038/000579\ndata/0038/000580\ndata/0038/000581\ndata/0038/000582\ndata/0038/000583\ndata/0038/000584\ndata/0038/000585\ndata/0038/000586\ndata/0038/000587\ndata/0038/000588\ndata/0038/000589\ndata/0038/000590\ndata/0038/000591\ndata/0038/000592\ndata/0038/000593\ndata/0038/000594\ndata/0038/000595\ndata/0038/000596\ndata/0038/000597\ndata/0038/000598\ndata/0038/000599\ndata/0038/000600\ndata/0038/000601\ndata/0038/000602\ndata/0038/000603\ndata/0038/000604\ndata/0038/000605\ndata/0038/000606\ndata/0038/000607\ndata/0038/000608\ndata/0038/000609\ndata/0038/000610\ndata/0038/000611\ndata/0038/000612\ndata/0038/000613\ndata/0038/000614\ndata/0038/000615\ndata/0038/000616\ndata/0038/000617\ndata/0038/000618\ndata/0038/000619\ndata/0038/000620\ndata/0038/000621\ndata/0038/000622\ndata/0038/000623\ndata/0038/000624\ndata/0038/000625\ndata/0038/000626\ndata/0038/000627\ndata/0038/000628\ndata/0038/000629\ndata/0038/000630\ndata/0038/000631\ndata/0038/000632\ndata/0038/000633\ndata/0038/000634\ndata/0038/000635\ndata/0038/000636\ndata/0038/000637\ndata/0038/000638\ndata/0038/000639\ndata/0038/000640\ndata/0038/000641\ndata/0038/000642\ndata/0038/000643\ndata/0038/000644\ndata/0038/000645\ndata/0038/000646\ndata/0038/000647\ndata/0038/000648\ndata/0038/000649\ndata/0038/000650\ndata/0038/000651\ndata/0038/000652\ndata/0038/000653\ndata/0038/000654\ndata/0038/000655\ndata/0038/000656\ndata/0038/000657\ndata/0038/000658\ndata/0038/000659\ndata/0038/000660\ndata/0038/000661\ndata/0038/000662\ndata/0038/000663\ndata/0038/000664\ndata/0038/000665\ndata/0038/000666\ndata/0038/000667\ndata/0038/000668\ndata/0038/000669\ndata/0038/000670\ndata/0038/000671\ndata/0038/000672\ndata/0038/000673\ndata/0038/000674\ndata/0038/000675\ndata/0038/000676\ndata/0038/000677\ndata/0038/000678\ndata/0038/000679\ndata/0038/000680\ndata/0038/000681\ndata/0038/000682\ndata/0038/000683\ndata/0038/000684\ndata/0038/000685\ndata/0038/000686\ndata/0038/000687\ndata/0038/000688\ndata/0038/000689\ndata/0038/000690\ndata/0038/000691\ndata/0038/000692\ndata/0038/000693\ndata/0038/000694\ndata/0038/000695\ndata/0038/000696\ndata/0038/000697\ndata/0038/000698\ndata/0038/000699\ndata/0038/000700\ndata/0038/000701\ndata/0038/000702\ndata/0038/000703\ndata/0038/000704\ndata/0038/000705\ndata/0038/000706\ndata/0038/000707\ndata/0038/000708\ndata/0038/000709\ndata/0038/000710\ndata/0038/000711\ndata/0038/000712\ndata/0038/000713\ndata/0038/000714\ndata/0038/000715\ndata/0038/000716\ndata/0038/000717\ndata/0038/000718\ndata/0038/000719\ndata/0038/000720\ndata/0038/000721\ndata/0038/000722\ndata/0038/000723\ndata/0038/000724\ndata/0038/000725\ndata/0038/000726\ndata/0038/000727\ndata/0038/000728\ndata/0038/000729\ndata/0038/000730\ndata/0038/000731\ndata/0038/000732\ndata/0038/000733\ndata/0038/000734\ndata/0038/000735\ndata/0038/000736\ndata/0038/000737\ndata/0038/000738\ndata/0038/000739\ndata/0038/000740\ndata/0038/000741\ndata/0038/000742\ndata/0038/000743\ndata/0038/000744\ndata/0038/000745\ndata/0038/000746\ndata/0038/000747\ndata/0038/000748\ndata/0038/000749\ndata/0038/000750\ndata/0038/000751\ndata/0038/000752\ndata/0038/000753\ndata/0038/000754\ndata/0038/000755\ndata/0038/000756\ndata/0038/000757\ndata/0038/000758\ndata/0038/000759\ndata/0038/000760\ndata/0038/000761\ndata/0038/000762\ndata/0038/000763\ndata/0038/000764\ndata/0038/000765\ndata/0038/000766\ndata/0038/000767\ndata/0038/000768\ndata/0038/000769\ndata/0038/000770\ndata/0038/000771\ndata/0038/000772\ndata/0038/000773\ndata/0038/000774\ndata/0038/000775\ndata/0038/000776\ndata/0038/000777\ndata/0038/000778\ndata/0038/000779\ndata/0038/000780\ndata/0038/000781\ndata/0038/000782\ndata/0038/000783\ndata/0038/000784\ndata/0038/000785\ndata/0038/000786\ndata/0038/000787\ndata/0038/000788\ndata/0038/000789\ndata/0038/000790\ndata/0038/000791\ndata/0038/000792\ndata/0038/000793\ndata/0038/000794\ndata/0038/000795\ndata/0038/000796\ndata/0038/000797\ndata/0038/000798\ndata/0038/000799\ndata/0038/000800\ndata/0038/000801\ndata/0038/000802\ndata/0038/000803\ndata/0038/000804\ndata/0038/000805\ndata/0038/000806\ndata/0038/000807\ndata/0038/000808\ndata/0038/000809\ndata/0038/000810\ndata/0038/000811\ndata/0038/000812\ndata/0038/000813\ndata/0038/000814\ndata/0038/000815\ndata/0038/000816\ndata/0038/000817\ndata/0038/000818\ndata/0038/000819\ndata/0038/000820\ndata/0038/000821\ndata/0038/000822\ndata/0038/000823\ndata/0038/000824\ndata/0038/000825\ndata/0038/000826\ndata/0038/000827\ndata/0038/000828\ndata/0038/000829\ndata/0038/000830\ndata/0038/000831\ndata/0038/000832\ndata/0038/000833\ndata/0038/000834\ndata/0038/000835\ndata/0038/000836\ndata/0038/000837\ndata/0038/000838\ndata/0038/000839\ndata/0038/000840\ndata/0038/000841\ndata/0038/000842\ndata/0038/000843\ndata/0038/000844\ndata/0038/000845\ndata/0038/000846\ndata/0038/000847\ndata/0038/000848\ndata/0038/000849\ndata/0038/000850\ndata/0038/000851\ndata/0038/000852\ndata/0038/000853\ndata/0038/000854\ndata/0038/000855\ndata/0038/000856\ndata/0038/000857\ndata/0038/000858\ndata/0038/000859\ndata/0038/000860\ndata/0038/000861\ndata/0038/000862\ndata/0038/000863\ndata/0038/000864\ndata/0038/000865\ndata/0038/000866\ndata/0038/000867\ndata/0038/000868\ndata/0038/000869\ndata/0038/000870\ndata/0038/000871\ndata/0038/000872\ndata/0038/000873\ndata/0038/000874\ndata/0038/000875\ndata/0038/000876\ndata/0038/000877\ndata/0038/000878\ndata/0038/000879\ndata/0038/000880\ndata/0038/000881\ndata/0038/000882\ndata/0038/000883\ndata/0038/000884\ndata/0038/000885\ndata/0038/000886\ndata/0038/000887\ndata/0038/000888\ndata/0038/000889\ndata/0038/000890\ndata/0038/000891\ndata/0038/000892\ndata/0038/000893\ndata/0038/000894\ndata/0038/000895\ndata/0038/000896\ndata/0038/000897\ndata/0038/000898\ndata/0038/000899\ndata/0038/000900\ndata/0038/000901\ndata/0038/000902\ndata/0038/000903\ndata/0038/000904\ndata/0038/000905\ndata/0038/000906\ndata/0038/000907\ndata/0038/000908\ndata/0038/000909\ndata/0038/000910\ndata/0038/000911\ndata/0038/000912\ndata/0038/000913\ndata/0038/000914\ndata/0038/000915\ndata/0038/000916\ndata/0038/000917\ndata/0038/000918\ndata/0038/000919\ndata/0038/000920\ndata/0038/000921\ndata/0038/000922\ndata/0038/000923\ndata/0038/000924\ndata/0038/000925\ndata/0038/000926\ndata/0038/000927\ndata/0038/000928\ndata/0038/000929\ndata/0038/000930\ndata/0038/000931\ndata/0038/000932\ndata/0038/000933\ndata/0038/000934\ndata/0038/000935\ndata/0038/000936\ndata/0038/000937\ndata/0038/000938\ndata/0038/000939\ndata/0038/000940\ndata/0038/000941\ndata/0038/000942\ndata/0038/000943\ndata/0038/000944\ndata/0038/000945\ndata/0038/000946\ndata/0038/000947\ndata/0038/000948\ndata/0038/000949\ndata/0038/000950\ndata/0038/000951\ndata/0038/000952\ndata/0038/000953\ndata/0038/000954\ndata/0038/000955\ndata/0038/000956\ndata/0038/000957\ndata/0038/000958\ndata/0038/000959\ndata/0038/000960\ndata/0038/000961\ndata/0038/000962\ndata/0038/000963\ndata/0038/000964\ndata/0038/000965\ndata/0038/000966\ndata/0038/000967\ndata/0038/000968\ndata/0038/000969\ndata/0038/000970\ndata/0038/000971\ndata/0038/000972\ndata/0038/000973\ndata/0038/000974\ndata/0038/000975\ndata/0038/000976\ndata/0038/000977\ndata/0038/000978\ndata/0038/000979\ndata/0038/000980\ndata/0038/000981\ndata/0038/000982\ndata/0038/000983\ndata/0038/000984\ndata/0038/000985\ndata/0038/000986\ndata/0038/000987\ndata/0038/000988\ndata/0038/000989\ndata/0038/000990\ndata/0038/000991\ndata/0038/000992\ndata/0038/000993\ndata/0038/000994\ndata/0038/000995\ndata/0038/000996\ndata/0038/000997\ndata/0038/000998\ndata/0038/000999\ndata/0038/001000\ndata/0038/001001\ndata/0038/001002\ndata/0038/001003\ndata/0038/001004\ndata/0038/001005\ndata/0038/001006\ndata/0038/001007\ndata/0038/001008\ndata/0038/001009\ndata/0038/001010\ndata/0038/001011\ndata/0038/001012\ndata/0038/001013\ndata/0038/001014\ndata/0038/001015\ndata/0038/001016\ndata/0038/001017\ndata/0038/001018\ndata/0038/001019\ndata/0038/001020\ndata/0038/001021\ndata/0038/001022\ndata/0038/001023\ndata/0038/001024\ndata/0038/001025\ndata/0038/001026\ndata/0038/001027\ndata/0038/001028\ndata/0038/001029\ndata/0038/001030\ndata/0038/001031\ndata/0038/001032\ndata/0038/001033\ndata/0038/001034\ndata/0038/001035\ndata/0038/001036\ndata/0038/001037\ndata/0038/001038\ndata/0038/001039\ndata/0038/001040\ndata/0038/001041\ndata/0038/001042\ndata/0038/001043\ndata/0038/001044\ndata/0038/001045\ndata/0038/001046\ndata/0038/001047\ndata/0038/001048\ndata/0038/001049\ndata/0038/001050\ndata/0038/001051\ndata/0038/001052\ndata/0038/001053\ndata/0038/001054\ndata/0038/001055\ndata/0038/001056\ndata/0038/001057\ndata/0038/001058\ndata/0038/001059\ndata/0038/001060\ndata/0038/001061\ndata/0038/001062\ndata/0038/001063\ndata/0038/001064\ndata/0038/001065\ndata/0038/001066\ndata/0038/001067\ndata/0038/001068\ndata/0038/001069\ndata/0038/001070\ndata/0038/001071\ndata/0038/001072\ndata/0038/001073\ndata/0038/001074\ndata/0038/001075\ndata/0038/001076\ndata/0038/001077\ndata/0038/001078\ndata/0038/001079\ndata/0038/001080\ndata/0038/001081\ndata/0038/001082\ndata/0038/001083\ndata/0038/001084\ndata/0038/001085\ndata/0038/001086\ndata/0038/001087\ndata/0038/001088\ndata/0038/001089\ndata/0038/001090\ndata/0038/001091\ndata/0038/001092\ndata/0038/001093\ndata/0038/001094\ndata/0038/001095\ndata/0038/001096\ndata/0038/001097\ndata/0038/001098\ndata/0038/001099\ndata/0038/001100\ndata/0038/001101\ndata/0038/001102\ndata/0038/001103\ndata/0038/001104\ndata/0038/001105\ndata/0038/001106\ndata/0038/001107\ndata/0038/001108\ndata/0038/001109\ndata/0038/001110\ndata/0038/001111\ndata/0038/001112\ndata/0038/001113\ndata/0038/001114\ndata/0038/001115\ndata/0038/001116\ndata/0038/001117\ndata/0038/001118\ndata/0038/001119\ndata/0038/001120\ndata/0038/001121\ndata/0038/001122\ndata/0038/001123\ndata/0038/001124\ndata/0038/001125\ndata/0038/001126\ndata/0038/001127\ndata/0038/001128\ndata/0038/001129\ndata/0038/001130\ndata/0038/001131\ndata/0038/001132\ndata/0038/001133\ndata/0038/001134\ndata/0038/001135\ndata/0038/001136\ndata/0038/001137\ndata/0038/001138\ndata/0038/001139\ndata/0038/001140\ndata/0038/001141\ndata/0038/001142\ndata/0038/001143\ndata/0038/001144\ndata/0038/001145\ndata/0038/001146\ndata/0038/001147\ndata/0038/001148\ndata/0038/001149\ndata/0038/001150\ndata/0038/001151\ndata/0038/001152\ndata/0038/001153\ndata/0038/001154\ndata/0038/001155\ndata/0038/001156\ndata/0038/001157\ndata/0038/001158\ndata/0038/001159\ndata/0038/001160\ndata/0038/001161\ndata/0038/001162\ndata/0038/001163\ndata/0038/001164\ndata/0038/001165\ndata/0038/001166\ndata/0038/001167\ndata/0038/001168\ndata/0038/001169\ndata/0038/001170\ndata/0038/001171\ndata/0038/001172\ndata/0038/001173\ndata/0038/001174\ndata/0038/001175\ndata/0038/001176\ndata/0038/001177\ndata/0038/001178\ndata/0038/001179\ndata/0038/001180\ndata/0038/001181\ndata/0038/001182\ndata/0038/001183\ndata/0038/001184\ndata/0038/001185\ndata/0038/001186\ndata/0038/001187\ndata/0038/001188\ndata/0038/001189\ndata/0038/001190\ndata/0038/001191\ndata/0038/001192\ndata/0038/001193\ndata/0038/001194\n"
  },
  {
    "path": "DenseFusion/docker/Dockerfile",
    "content": "FROM nvidia/cuda:10.0-cudnn7-devel-ubuntu16.04\nMAINTAINER Dinh-Cuong Hoang\n\n# Supress warnings about missing front-end. As recommended at:\n# http://stackoverflow.com/questions/22466255/is-it-possibe-to-answer-dialog-questions-when-installing-under-docker\nARG DEBIAN_FRONTEND=noninteractive\n\n# Essentials: developer tools, build tools, OpenBLAS\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    apt-utils git curl vim unzip openssh-client wget \\\n    build-essential cmake \\\n    libopenblas-dev\n\n\n# Python 3.5\n# For convenience, alias (but don't sym-link) python & pip to python3 & pip3 as recommended in:\n# http://askubuntu.com/questions/351318/changing-symlink-python-to-python3-causes-problems\nRUN apt-get install -y --no-install-recommends python3.5 python3.5-dev python3-pip python3-tk && \\\n    pip3 install --no-cache-dir --upgrade pip setuptools && \\\n    echo \"alias python='python3'\" >> /root/.bash_aliases && \\\n    echo \"alias pip='pip3'\" >> /root/.bash_aliases\n# Pillow and it's dependencies\nRUN apt-get install -y --no-install-recommends libjpeg-dev zlib1g-dev && \\\n    pip3 --no-cache-dir install Pillow\n# Science libraries and other common packages\nRUN pip3 --no-cache-dir install \\\n    numpy scipy pyyaml cffi pyyaml matplotlib Cython requests\n\n# Jupyter Notebook\n# Allow access from outside the container, and skip trying to open a browser.\n# NOTE: disable authentication token for convenience. DON'T DO THIS ON A PUBLIC SERVER.\nRUN pip3 --no-cache-dir install jupyter && \\\n    mkdir /root/.jupyter && \\\n    echo \"c.NotebookApp.ip = '*'\" \\\n         \"\\nc.NotebookApp.open_browser = False\" \\\n         \"\\nc.NotebookApp.token = ''\" \\\n         > /root/.jupyter/jupyter_notebook_config.py\nEXPOSE 8888\n\n# Tensorflow 1.11 - GPU\nRUN pip3 install https://download.pytorch.org/whl/cu100/torch-1.0.1.post2-cp35-cp35m-linux_x86_64.whl\nRUN pip3 install torchvision==0.2.2.post3\n\n# Expose port for TensorBoard\nEXPOSE 6006\n"
  },
  {
    "path": "DenseFusion/docker/docker_build.sh",
    "content": "#!/bin/bash\n#\n# This script runs docker build to create the maskrcnn-gpu docker image.\n#\n\nset -exu\nsudo nvidia-docker build --tag densefusion-pytorch-1.0 ./\n"
  },
  {
    "path": "DenseFusion/docker/docker_run.sh",
    "content": "#!/bin/bash\n#\n# Usage:  ./docker_run.sh [/path/to/data]\n#\n# This script calls `nvidia-docker run` to start the labelfusion\n# container with an interactive bash session.  This script sets\n# the required environment variables and mounts the labelfusion\n# source directory as a volume in the docker container.  If the\n# path to a data directory is given then the data directory is\n# also mounted as a volume.\n#\n\nimage_name=hoangcuongbk80/densefusion-gpu:latest\n\nnvidia-docker run --name densefusion -it --rm -v /home/aass/Hoang-Cuong/Seg_SLAM/DenseFusion:/densefusion -v /media/aass/783de628-b7ff-4217-8c96-7f3764de70d9/Warehouse_Dataset:/warehouse_dataset densefusion-gpu /bin/bash\n\nnvidia-docker run --name densefusion -it --rm -v /home/cghg/DenseFusion:/densefusion -v /media/DiskStation/trsv/data/YCB_Video_Dataset:/YCB_Video_Dataset hoangcuongbk80/densefusion-pytorch-1.0 /bin/bash\n\n"
  },
  {
    "path": "DenseFusion/download.sh",
    "content": "# Download the datasets and checkpoints\n\nif [ ! -d datasets/ycb/YCB_Video_Dataset ];then\necho 'Downloading the YCB-Video Dataset'\nwget --load-cookies /tmp/cookies.txt \"https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1if4VoEXNx9W3XCn0Y7Fp15B4GpcYbyYi' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\\1\\n/p')&id=1if4VoEXNx9W3XCn0Y7Fp15B4GpcYbyYi\" -O YCB_Video_Dataset.zip && rm -rf /tmp/cookies.txt \\\n&& unzip YCB_Video_Dataset.zip \\\n&& mv YCB_Video_Dataset/ datasets/ycb/ \\\n&& rm YCB_Video_Dataset.zip\nfi\n\nif [ ! -d datasets/linemod/Linemod_preprocessed ];then\necho 'Downloading the preprocessed LineMOD dataset'\nwget --load-cookies /tmp/cookies.txt \"https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1YFUra533pxS_IHsb9tB87lLoxbcHYXt8' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\\1\\n/p')&id=1YFUra533pxS_IHsb9tB87lLoxbcHYXt8\" -O Linemod_preprocessed.zip && rm -rf /tmp/cookies.txt \\\n&& unzip Linemod_preprocessed.zip \\\n&& mv Linemod_preprocessed/ datasets/linemod/ \\\n&& rm Linemod_preprocessed.zip\nfi\n\nif [ ! -d trained_checkpoints ];then\necho 'Downloading the trained checkpoints...'\nwget --load-cookies /tmp/cookies.txt \"https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=1bQ9H-fyZplQoNt1qRwdIUX5_3_1pj6US' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\\1\\n/p')&id=1bQ9H-fyZplQoNt1qRwdIUX5_3_1pj6US\" -O trained_checkpoints.zip && rm -rf /tmp/cookies.txt \\\n&& unzip trained_checkpoints.zip -x \"__MACOSX/*\" \"*.DS_Store\" \"*.gitignore\" -d trained_checkpoints \\\n&& mv trained_checkpoints/trained*/ycb trained_checkpoints/ycb \\\n&& mv trained_checkpoints/trained*/linemod trained_checkpoints/linemod \\\n&& rm -r trained_checkpoints/trained*/ \\\n&& rm trained_checkpoints.zip\nfi\n\necho 'done'"
  },
  {
    "path": "DenseFusion/experiments/logs/warehouse/note",
    "content": ""
  },
  {
    "path": "DenseFusion/experiments/scripts/iliad.sh",
    "content": "#!/bin/bash\n\nset -x\nset -e\n\nexport PYTHONUNBUFFERED=\"True\"\nexport CUDA_VISIBLE_DEVICES=0\n\npython3 ./tools/iliad.py --dataset_root /home/aass/catkin_ws/src/Object-RPE/data/dataset/warehouse\\\n  --saved_root /home/aass/catkin_ws/src/Object-RPE/data\\\n  --model trained_checkpoints/warehouse/pose_model_54_0.019968815155302567.pth\\\n  --refine_model trained_checkpoints/warehouse/pose_refine_model_92_0.01590736784950592.pth"
  },
  {
    "path": "DenseFusion/experiments/scripts/train_warehouse.sh",
    "content": "#!/bin/bash\n\nset -x\nset -e\n\nexport PYTHONUNBUFFERED=\"True\"\nexport CUDA_VISIBLE_DEVICES=0\n\npython3 ./tools/train.py --dataset warehouse\\\n  --dataset_root /warehouse_dataset\n"
  },
  {
    "path": "DenseFusion/lib/extractors.py",
    "content": "from collections import OrderedDict\nimport math\nimport random\nimport torch\nimport torch.nn as nn\nimport torch.nn.functional as F\n\ndef load_weights_sequential(target, source_state):\n    new_dict = OrderedDict()\n    for (k1, v1), (k2, v2) in zip(target.state_dict().items(), source_state.items()):\n        new_dict[k1] = v2\n    target.load_state_dict(new_dict)\n\ndef conv3x3(in_planes, out_planes, stride=1, dilation=1):\n    return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride,\n                     padding=dilation, dilation=dilation, bias=False)\n\nclass BasicBlock(nn.Module):\n    expansion = 1\n\n    def __init__(self, inplanes, planes, stride=1, downsample=None, dilation=1):\n        super(BasicBlock, self).__init__()\n        self.conv1 = conv3x3(inplanes, planes, stride=stride, dilation=dilation)\n        self.relu = nn.ReLU(inplace=True)\n        self.conv2 = conv3x3(planes, planes, stride=1, dilation=dilation)\n        self.downsample = downsample\n        self.stride = stride\n\n    def forward(self, x):\n        residual = x\n\n        out = self.conv1(x)\n        out = self.relu(out)\n\n        out = self.conv2(out)\n\n        if self.downsample is not None:\n            residual = self.downsample(x)\n\n        out += residual\n        out = self.relu(out)\n\n        return out\n\n\nclass Bottleneck(nn.Module):\n    expansion = 4\n    def __init__(self, inplanes, planes, stride=1, downsample=None, dilation=1):\n        super(Bottleneck, self).__init__()\n        self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=1, bias=False)\n        self.conv2 = nn.Conv2d(planes, planes, kernel_size=3, stride=stride, dilation=dilation,\n                               padding=dilation, bias=False)\n        self.conv3 = nn.Conv2d(planes, planes * 4, kernel_size=1, bias=False)\n        self.relu = nn.ReLU(inplace=True)\n        self.downsample = downsample\n        self.stride = stride\n\n    def forward(self, x):\n        residual = x\n\n        out = self.conv1(x)\n        out = self.relu(out)\n\n        out = self.conv2(out)\n        out = self.relu(out)\n\n        out = self.conv3(out)\n\n        if self.downsample is not None:\n            residual = self.downsample(x)\n\n        out += residual\n        out = self.relu(out)\n\n        return out\n\n\nclass ResNet(nn.Module):\n    def __init__(self, block, layers=(3, 4, 23, 3)):\n        self.inplanes = 64\n        super(ResNet, self).__init__()\n        self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3,\n                               bias=False)\n        self.relu = nn.ReLU(inplace=True)\n        self.maxpool = nn.MaxPool2d(kernel_size=3, stride=2, padding=1)\n        self.layer1 = self._make_layer(block, 64, layers[0])\n        self.layer2 = self._make_layer(block, 128, layers[1], stride=2)\n        self.layer3 = self._make_layer(block, 256, layers[2], stride=1, dilation=2)\n        self.layer4 = self._make_layer(block, 512, layers[3], stride=1, dilation=4)\n\n        for m in self.modules():\n            if isinstance(m, nn.Conv2d):\n                n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels\n                m.weight.data.normal_(0, math.sqrt(2. / n))\n            elif isinstance(m, nn.BatchNorm2d):\n                m.weight.data.fill_(1)\n                m.bias.data.zero_()\n\n    def _make_layer(self, block, planes, blocks, stride=1, dilation=1):\n        downsample = None\n        if stride != 1 or self.inplanes != planes * block.expansion:\n            downsample = nn.Sequential(\n                nn.Conv2d(self.inplanes, planes * block.expansion,\n                          kernel_size=1, stride=stride, bias=False)\n            )\n\n        layers = [block(self.inplanes, planes, stride, downsample)]\n        self.inplanes = planes * block.expansion\n        for i in range(1, blocks):\n            layers.append(block(self.inplanes, planes, dilation=dilation))\n\n        return nn.Sequential(*layers)\n\n    def forward(self, x):\n        x = self.conv1(x)\n        x = self.relu(x)\n        x = self.maxpool(x)\n\n        x = self.layer1(x)\n        x = self.layer2(x)\n        x_3 = self.layer3(x)\n        x = self.layer4(x_3)\n\n        return x, x_3\n\n\ndef resnet18(pretrained=False):\n    model = ResNet(BasicBlock, [2, 2, 2, 2])\n    return model\n\ndef resnet34(pretrained=False):\n    model = ResNet(BasicBlock, [3, 4, 6, 3])\n    return model\n\ndef resnet50(pretrained=False):\n    model = ResNet(Bottleneck, [3, 4, 6, 3])\n    return model\n\ndef resnet101(pretrained=False):\n    model = ResNet(Bottleneck, [3, 4, 23, 3])\n    return model\n\ndef resnet152(pretrained=False):\n    model = ResNet(Bottleneck, [3, 8, 36, 3])\n    return model"
  },
  {
    "path": "DenseFusion/lib/knn/__init__.py",
    "content": "import unittest\nimport gc\nimport operator as op\nimport functools\nimport torch\nfrom torch.autograd import Variable, Function\nfrom lib.knn import knn_pytorch as knn_pytorch\n\nclass KNearestNeighbor(Function):\n  \"\"\" Compute k nearest neighbors for each query point.\n  \"\"\"\n  def __init__(self, k):\n    self.k = k\n\n  def forward(self, ref, query):\n    ref = ref.float().cuda()\n    query = query.float().cuda()\n\n    inds = torch.empty(query.shape[0], self.k, query.shape[2]).long().cuda()\n\n    knn_pytorch.knn(ref, query, inds)\n\n    return inds\n\n\nclass TestKNearestNeighbor(unittest.TestCase):\n\n  def test_forward(self):\n    knn = KNearestNeighbor(2)\n    while(1):\n        D, N, M = 128, 100, 1000\n        ref = Variable(torch.rand(2, D, N))\n        query = Variable(torch.rand(2, D, M))\n\n        inds = knn(ref, query)\n        for obj in gc.get_objects():\n            if torch.is_tensor(obj):\n                print(functools.reduce(op.mul, obj.size()) if len(obj.size()) > 0 else 0, type(obj), obj.size())\n        #ref = ref.cpu()\n        #query = query.cpu()\n        print(inds)\n\n\nif __name__ == '__main__':\n  unittest.main()\n"
  },
  {
    "path": "DenseFusion/lib/knn/knn_pytorch.egg-info/PKG-INFO",
    "content": "Metadata-Version: 1.0\nName: knn-pytorch\nVersion: 0.1\nSummary: KNN implement in Pytorch 1.0 including both cpu version and gpu version\nHome-page: https://github.com/foolyc/torchKNN\nAuthor: foolyc\nAuthor-email: UNKNOWN\nLicense: UNKNOWN\nDescription: UNKNOWN\nPlatform: UNKNOWN\n"
  },
  {
    "path": "DenseFusion/lib/knn/knn_pytorch.egg-info/SOURCES.txt",
    "content": "setup.py\n/densefusion/lib/knn/src/vision.cpp\n/densefusion/lib/knn/src/cpu/knn_cpu.cpp\n/densefusion/lib/knn/src/cuda/knn.cu\nknn_pytorch.egg-info/PKG-INFO\nknn_pytorch.egg-info/SOURCES.txt\nknn_pytorch.egg-info/dependency_links.txt\nknn_pytorch.egg-info/top_level.txt"
  },
  {
    "path": "DenseFusion/lib/knn/knn_pytorch.egg-info/dependency_links.txt",
    "content": "\n"
  },
  {
    "path": "DenseFusion/lib/knn/knn_pytorch.egg-info/top_level.txt",
    "content": "knn_pytorch\n"
  },
  {
    "path": "DenseFusion/lib/knn/knn_pytorch.py",
    "content": "def __bootstrap__():\n    global __bootstrap__, __loader__, __file__\n    import sys, pkg_resources, imp\n    __file__ = pkg_resources.resource_filename(__name__, 'knn_pytorch.cpython-35m-x86_64-linux-gnu.so')\n    __loader__ = None; del __bootstrap__, __loader__\n    imp.load_dynamic(__name__,__file__)\n__bootstrap__()\n"
  },
  {
    "path": "DenseFusion/lib/knn/setup.py",
    "content": "#!/usr/bin/env python\n\nimport glob\nimport os\n\nimport torch\nfrom setuptools import find_packages\nfrom setuptools import setup\nfrom torch.utils.cpp_extension import CUDA_HOME\nfrom torch.utils.cpp_extension import CppExtension\nfrom torch.utils.cpp_extension import CUDAExtension\n\nrequirements = [\"torch\", \"torchvision\"]\n\n\ndef get_extensions():\n    this_dir = os.path.dirname(os.path.abspath(__file__))\n    extensions_dir = os.path.join(this_dir, \"src\")\n\n    main_file = glob.glob(os.path.join(extensions_dir, \"*.cpp\"))\n    source_cpu = glob.glob(os.path.join(extensions_dir, \"cpu\", \"*.cpp\"))\n    source_cuda = glob.glob(os.path.join(extensions_dir, \"cuda\", \"*.cu\"))\n\n    sources = main_file + source_cpu\n    extension = CppExtension\n\n    extra_compile_args = {\"cxx\": []}\n    define_macros = []\n\n    if torch.cuda.is_available() and CUDA_HOME is not None:\n        extension = CUDAExtension\n        sources += source_cuda\n        define_macros += [(\"WITH_CUDA\", None)]\n        extra_compile_args[\"nvcc\"] = [\n            \"-DCUDA_HAS_FP16=1\",\n            \"-D__CUDA_NO_HALF_OPERATORS__\",\n            \"-D__CUDA_NO_HALF_CONVERSIONS__\",\n            \"-D__CUDA_NO_HALF2_OPERATORS__\",\n        ]\n\n    sources = [os.path.join(extensions_dir, s) for s in sources]\n\n    include_dirs = [extensions_dir]\n\n    ext_modules = [\n        extension(\n            \"knn_pytorch.knn_pytorch\",\n            sources,\n            include_dirs=include_dirs,\n            define_macros=define_macros,\n            extra_compile_args=extra_compile_args,\n        )\n    ]\n\n    return ext_modules\n\n\nsetup(\n    name=\"knn_pytorch\",\n    version=\"0.1\",\n    author=\"foolyc\",\n    url=\"https://github.com/foolyc/torchKNN\",\n    description=\"KNN implement in Pytorch 1.0 including both cpu version and gpu version\",\n    ext_modules=get_extensions(),\n    cmdclass={\"build_ext\": torch.utils.cpp_extension.BuildExtension},\n)\n"
  },
  {
    "path": "DenseFusion/lib/knn/src/cpu/knn_cpu.cpp",
    "content": "#include \"cpu/vision.h\"\n\n\nvoid knn_cpu(float* ref_dev, int ref_width, float* query_dev, int query_width,\n    int height, int k, float* dist_dev, long* ind_dev, long* ind_buf)\n{\n    // Compute all the distances\n    for(int query_idx = 0;query_idx<query_width;query_idx++)\n    {\n        for(int ref_idx = 0;ref_idx < ref_width;ref_idx++)\n        {\n            dist_dev[query_idx * ref_width + ref_idx] = 0;\n            for(int hi=0;hi<height;hi++)\n                dist_dev[query_idx * ref_width + ref_idx] += (ref_dev[hi * ref_width + ref_idx] - query_dev[hi * query_width + query_idx]) * (ref_dev[hi * ref_width + ref_idx] - query_dev[hi * query_width + query_idx]);\n        }\n    }\n\n    float temp_value;\n    long temp_idx;\n    // sort the distance and get the index\n    for(int query_idx = 0;query_idx<query_width;query_idx++)\n    {\n        for(int i = 0;i < ref_width;i++)\n        {\n            ind_buf[i] = i+1;\n        }\n        for(int i = 0;i < ref_width;i++)\n            for(int j = 0;j < ref_width - i - 1;j++)\n            {\n                if(dist_dev[query_idx * ref_width + j] > dist_dev[query_idx * ref_width + j + 1])\n                {\n                    temp_value = dist_dev[query_idx * ref_width + j];\n                    dist_dev[query_idx * ref_width + j] = dist_dev[query_idx * ref_width + j + 1];\n                    dist_dev[query_idx * ref_width + j + 1] = temp_value;\n                    temp_idx = ind_buf[j];\n                    ind_buf[j] = ind_buf[j + 1];\n                    ind_buf[j + 1] = temp_idx;\n                }\n\n            }\n\n        for(int i = 0;i < k;i++)\n            ind_dev[query_idx + i * query_width] = ind_buf[i];\n        #if DEBUG\n        for(int i = 0;i < ref_width;i++)\n            printf(\"%d, \", ind_buf[i]);\n        printf(\"\\n\");\n        #endif\n\n    }\n\n\n\n\n\n}"
  },
  {
    "path": "DenseFusion/lib/knn/src/cpu/vision.h",
    "content": "#pragma once\n#include <torch/extension.h>\n\nvoid knn_cpu(float* ref_dev, int ref_width,\n    float* query_dev, int query_width,\n    int height, int k, float* dist_dev, long* ind_dev, long* ind_buf);"
  },
  {
    "path": "DenseFusion/lib/knn/src/cuda/knn.cu",
    "content": "/** Modifed version of knn-CUDA from https://github.com/vincentfpgarcia/kNN-CUDA\n * The modifications are\n *      removed texture memory usage\n *      removed split query KNN computation\n *      added feature extraction with bilinear interpolation\n *\n * Last modified by Christopher B. Choy <chrischoy@ai.stanford.edu> 12/23/2016\n */\n\n// Includes\n#include <cstdio>\n#include \"cuda.h\"\n\n#define IDX2D(i, j, dj) (dj * i + j)\n#define IDX3D(i, j, k, dj, dk) (IDX2D(IDX2D(i, j, dj), k, dk))\n\n#define BLOCK 512\n#define MAX_STREAMS 512\n\n// Constants used by the program\n#define BLOCK_DIM                      16\n#define DEBUG                          0\n\n\n/**\n  * Computes the distance between two matrix A (reference points) and\n  * B (query points) containing respectively wA and wB points.\n  *\n  * @param A     pointer on the matrix A\n  * @param wA    width of the matrix A = number of points in A\n  * @param B     pointer on the matrix B\n  * @param wB    width of the matrix B = number of points in B\n  * @param dim   dimension of points = height of matrices A and B\n  * @param AB    pointer on the matrix containing the wA*wB distances computed\n  */\n__global__ void cuComputeDistanceGlobal( float* A, int wA,\n    float* B, int wB, int dim, float* AB){\n\n// Declaration of the shared memory arrays As and Bs used to store the sub-matrix of A and B\n__shared__ float shared_A[BLOCK_DIM][BLOCK_DIM];\n__shared__ float shared_B[BLOCK_DIM][BLOCK_DIM];\n\n\n  // Sub-matrix of A (begin, step, end) and Sub-matrix of B (begin, step)\n  __shared__ int begin_A;\n  __shared__ int begin_B;\n  __shared__ int step_A;\n  __shared__ int step_B;\n  __shared__ int end_A;\n\n  // Thread index\n  int tx = threadIdx.x;\n  int ty = threadIdx.y;\n\n  // Other variables\n  float tmp;\n  float ssd = 0;\n\n  // Loop parameters\n  begin_A = BLOCK_DIM * blockIdx.y;\n  begin_B = BLOCK_DIM * blockIdx.x;\n  step_A  = BLOCK_DIM * wA;\n  step_B  = BLOCK_DIM * wB;\n  end_A   = begin_A + (dim-1) * wA;\n\n    // Conditions\n  int cond0 = (begin_A + tx < wA); // used to write in shared memory\n  int cond1 = (begin_B + tx < wB); // used to write in shared memory & to computations and to write in output matrix\n  int cond2 = (begin_A + ty < wA); // used to computations and to write in output matrix\n\n  // Loop over all the sub-matrices of A and B required to compute the block sub-matrix\n  for (int a = begin_A, b = begin_B; a <= end_A; a += step_A, b += step_B) {\n    // Load the matrices from device memory to shared memory; each thread loads one element of each matrix\n    if (a/wA + ty < dim){\n      shared_A[ty][tx] = (cond0)? A[a + wA * ty + tx] : 0;\n      shared_B[ty][tx] = (cond1)? B[b + wB * ty + tx] : 0;\n    }\n    else{\n      shared_A[ty][tx] = 0;\n      shared_B[ty][tx] = 0;\n    }\n\n    // Synchronize to make sure the matrices are loaded\n    __syncthreads();\n\n    // Compute the difference between the two matrixes; each thread computes one element of the block sub-matrix\n    if (cond2 && cond1){\n      for (int k = 0; k < BLOCK_DIM; ++k){\n        tmp = shared_A[k][ty] - shared_B[k][tx];\n        ssd += tmp*tmp;\n      }\n    }\n\n    // Synchronize to make sure that the preceding computation is done before loading two new sub-matrices of A and B in the next iteration\n    __syncthreads();\n  }\n\n  // Write the block sub-matrix to device memory; each thread writes one element\n  if (cond2 && cond1)\n    AB[(begin_A + ty) * wB + begin_B + tx] = ssd;\n}\n\n\n/**\n  * Gathers k-th smallest distances for each column of the distance matrix in the top.\n  *\n  * @param dist        distance matrix\n  * @param ind         index matrix\n  * @param width       width of the distance matrix and of the index matrix\n  * @param height      height of the distance matrix and of the index matrix\n  * @param k           number of neighbors to consider\n  */\n__global__ void cuInsertionSort(float *dist, long *ind, int width, int height, int k){\n\n  // Variables\n  int l, i, j;\n  float *p_dist;\n  long  *p_ind;\n  float curr_dist, max_dist;\n  long  curr_row,  max_row;\n  unsigned int xIndex = blockIdx.x * blockDim.x + threadIdx.x;\n\n  if (xIndex<width){\n    // Pointer shift, initialization, and max value\n    p_dist   = dist + xIndex;\n    p_ind    = ind  + xIndex;\n    max_dist = p_dist[0];\n    p_ind[0] = 1;\n\n    // Part 1 : sort kth firt elementZ\n    for (l=1; l<k; l++){\n      curr_row  = l * width;\n      curr_dist = p_dist[curr_row];\n      if (curr_dist<max_dist){\n        i=l-1;\n        for (int a=0; a<l-1; a++){\n          if (p_dist[a*width]>curr_dist){\n            i=a;\n            break;\n          }\n        }\n        for (j=l; j>i; j--){\n          p_dist[j*width] = p_dist[(j-1)*width];\n          p_ind[j*width]   = p_ind[(j-1)*width];\n        }\n        p_dist[i*width] = curr_dist;\n        p_ind[i*width]   = l+1;\n      } else {\n        p_ind[l*width] = l+1;\n      }\n      max_dist = p_dist[curr_row];\n    }\n\n    // Part 2 : insert element in the k-th first lines\n    max_row = (k-1)*width;\n    for (l=k; l<height; l++){\n      curr_dist = p_dist[l*width];\n      if (curr_dist<max_dist){\n        i=k-1;\n        for (int a=0; a<k-1; a++){\n          if (p_dist[a*width]>curr_dist){\n            i=a;\n            break;\n          }\n        }\n        for (j=k-1; j>i; j--){\n          p_dist[j*width] = p_dist[(j-1)*width];\n          p_ind[j*width]   = p_ind[(j-1)*width];\n        }\n        p_dist[i*width] = curr_dist;\n        p_ind[i*width]   = l+1;\n        max_dist             = p_dist[max_row];\n      }\n    }\n  }\n}\n\n\n/**\n  * Computes the square root of the first line (width-th first element)\n  * of the distance matrix.\n  *\n  * @param dist    distance matrix\n  * @param width   width of the distance matrix\n  * @param k       number of neighbors to consider\n  */\n__global__ void cuParallelSqrt(float *dist, int width, int k){\n    unsigned int xIndex = blockIdx.x * blockDim.x + threadIdx.x;\n    unsigned int yIndex = blockIdx.y * blockDim.y + threadIdx.y;\n  if (xIndex<width && yIndex<k)\n    dist[yIndex*width + xIndex] = sqrt(dist[yIndex*width + xIndex]);\n}\n\n\n//-----------------------------------------------------------------------------------------------//\n//                                   K-th NEAREST NEIGHBORS                                      //\n//-----------------------------------------------------------------------------------------------//\n\n/**\n  * K nearest neighbor algorithm\n  * - Initialize CUDA\n  * - Allocate device memory\n  * - Copy point sets (reference and query points) from host to device memory\n  * - Compute the distances + indexes to the k nearest neighbors for each query point\n  * - Copy distances from device to host memory\n  *\n  * @param ref_host      reference points ; pointer to linear matrix\n  * @param ref_nb        number of reference points ; width of the matrix\n  * @param query_host    query points ; pointer to linear matrix\n  * @param query_nb      number of query points ; width of the matrix\n  * @param dim           dimension of points ; height of the matrices\n  * @param k             number of neighbor to consider\n  * @param dist_host     distances to k nearest neighbors ; pointer to linear matrix\n  * @param dist_host     indexes of the k nearest neighbors ; pointer to linear matrix\n  *\n  */\nvoid knn_device(float* ref_dev, int ref_nb, float* query_dev, int query_nb,\n    int dim, int k, float* dist_dev, long* ind_dev, cudaStream_t stream){\n\n  // Grids and threads\n  dim3 g_16x16(query_nb/16, ref_nb/16, 1);\n  dim3 t_16x16(16, 16, 1);\n  if (query_nb%16 != 0) g_16x16.x += 1;\n  if (ref_nb  %16 != 0) g_16x16.y += 1;\n  //\n  dim3 g_256x1(query_nb/256, 1, 1);\n  dim3 t_256x1(256, 1, 1);\n  if (query_nb%256 != 0) g_256x1.x += 1;\n\n  dim3 g_k_16x16(query_nb/16, k/16, 1);\n  dim3 t_k_16x16(16, 16, 1);\n  if (query_nb%16 != 0) g_k_16x16.x += 1;\n  if (k  %16 != 0) g_k_16x16.y += 1;\n\n  // Kernel 1: Compute all the distances\n  cuComputeDistanceGlobal<<<g_16x16, t_16x16, 0, stream>>>(ref_dev, ref_nb, query_dev, query_nb, dim, dist_dev);\n\n  // Kernel 2: Sort each column\n  cuInsertionSort<<<g_256x1, t_256x1, 0, stream>>>(dist_dev, ind_dev, query_nb, ref_nb, k);\n\n  // Kernel 3: Compute square root of k first elements\n  // cuParallelSqrt<<<g_k_16x16,t_k_16x16, 0, stream>>>(dist_dev, query_nb, k);\n\n#if DEBUG\n  unsigned int  size_of_float = sizeof(float);\n  unsigned long size_of_long  = sizeof(long);\n\n  float* dist_host = new float[query_nb * k];\n  long*  idx_host  = new long[query_nb * k];\n\n  // Memory copy of output from device to host\n  cudaMemcpy(&dist_host[0], dist_dev,\n      query_nb * k *size_of_float, cudaMemcpyDeviceToHost);\n\n  cudaMemcpy(&idx_host[0], ind_dev,\n      query_nb * k * size_of_long, cudaMemcpyDeviceToHost);\n\n  int i = 0;\n  for(i = 0; i < 100; i++){\n    printf(\"IDX[%d]: %d\\n\", i, (int)idx_host[i]);\n  }\n#endif\n}\n\n\n\n\n\n\n"
  },
  {
    "path": "DenseFusion/lib/knn/src/cuda/vision.h",
    "content": "#pragma once\n#include <torch/extension.h>\n#include <THC/THC.h>\n\nvoid knn_device(float* ref_dev, int ref_width,\n    float* query_dev, int query_width,\n    int height, int k, float* dist_dev, long* ind_dev, cudaStream_t stream);"
  },
  {
    "path": "DenseFusion/lib/knn/src/knn.h",
    "content": "#pragma once\n#include \"cpu/vision.h\"\n\n#ifdef WITH_CUDA\n#include \"cuda/vision.h\"\n#include <THC/THC.h>\nextern THCState *state;\n#endif\n\n\n\nint knn(at::Tensor& ref, at::Tensor& query, at::Tensor& idx)\n{\n\n    // TODO check dimensions\n    long batch, ref_nb, query_nb, dim, k;\n    batch = ref.size(0);\n    dim = ref.size(1);\n    k = idx.size(1);\n    ref_nb = ref.size(2);\n    query_nb = query.size(2);\n\n    float *ref_dev = ref.data<float>();\n    float *query_dev = query.data<float>();\n    long *idx_dev = idx.data<long>();\n\n\n\n\n  if (ref.type().is_cuda()) {\n#ifdef WITH_CUDA\n    // TODO raise error if not compiled with CUDA\n    float *dist_dev = (float*)THCudaMalloc(state, ref_nb * query_nb * sizeof(float));\n\n    for (int b = 0; b < batch; b++)\n    {\n    knn_device(ref_dev + b * dim * ref_nb, ref_nb, query_dev + b * dim * query_nb, query_nb, dim, k,\n      dist_dev, idx_dev + b * k * query_nb, THCState_getCurrentStream(state));\n    }\n    THCudaFree(state, dist_dev);\n    cudaError_t err = cudaGetLastError();\n    if (err != cudaSuccess)\n    {\n        printf(\"error in knn: %s\\n\", cudaGetErrorString(err));\n        THError(\"aborting\");\n    }\n    return 1;\n#else\n    AT_ERROR(\"Not compiled with GPU support\");\n#endif\n  }\n\n\n    float *dist_dev = (float*)malloc(ref_nb * query_nb * sizeof(float));\n    long *ind_buf = (long*)malloc(ref_nb * sizeof(long));\n    for (int b = 0; b < batch; b++) {\n    knn_cpu(ref_dev + b * dim * ref_nb, ref_nb, query_dev + b * dim * query_nb, query_nb, dim, k,\n      dist_dev, idx_dev + b * k * query_nb, ind_buf);\n    }\n\n    free(dist_dev);\n    free(ind_buf);\n\n    return 1;\n\n}\n"
  },
  {
    "path": "DenseFusion/lib/knn/src/vision.cpp",
    "content": "#include \"knn.h\"\n\nPYBIND11_MODULE(TORCH_EXTENSION_NAME, m) {\n  m.def(\"knn\", &knn, \"k-nearest neighbors\");\n}\n"
  },
  {
    "path": "DenseFusion/lib/loss.py",
    "content": "from torch.nn.modules.loss import _Loss\nfrom torch.autograd import Variable\nimport torch\nimport time\nimport numpy as np\nimport torch.nn as nn\nimport random\nimport torch.backends.cudnn as cudnn\nfrom lib.knn.__init__ import KNearestNeighbor\n\n\ndef loss_calculation(pred_r, pred_t, pred_c, target, model_points, idx, points, w, refine, num_point_mesh, sym_list):\n    knn = KNearestNeighbor(1)\n    bs, num_p, _ = pred_c.size()\n\n    pred_r = pred_r / (torch.norm(pred_r, dim=2).view(bs, num_p, 1))\n    \n    base = torch.cat(((1.0 - 2.0*(pred_r[:, :, 2]**2 + pred_r[:, :, 3]**2)).view(bs, num_p, 1),\\\n                      (2.0*pred_r[:, :, 1]*pred_r[:, :, 2] - 2.0*pred_r[:, :, 0]*pred_r[:, :, 3]).view(bs, num_p, 1), \\\n                      (2.0*pred_r[:, :, 0]*pred_r[:, :, 2] + 2.0*pred_r[:, :, 1]*pred_r[:, :, 3]).view(bs, num_p, 1), \\\n                      (2.0*pred_r[:, :, 1]*pred_r[:, :, 2] + 2.0*pred_r[:, :, 3]*pred_r[:, :, 0]).view(bs, num_p, 1), \\\n                      (1.0 - 2.0*(pred_r[:, :, 1]**2 + pred_r[:, :, 3]**2)).view(bs, num_p, 1), \\\n                      (-2.0*pred_r[:, :, 0]*pred_r[:, :, 1] + 2.0*pred_r[:, :, 2]*pred_r[:, :, 3]).view(bs, num_p, 1), \\\n                      (-2.0*pred_r[:, :, 0]*pred_r[:, :, 2] + 2.0*pred_r[:, :, 1]*pred_r[:, :, 3]).view(bs, num_p, 1), \\\n                      (2.0*pred_r[:, :, 0]*pred_r[:, :, 1] + 2.0*pred_r[:, :, 2]*pred_r[:, :, 3]).view(bs, num_p, 1), \\\n                      (1.0 - 2.0*(pred_r[:, :, 1]**2 + pred_r[:, :, 2]**2)).view(bs, num_p, 1)), dim=2).contiguous().view(bs * num_p, 3, 3)\n\n    ori_base = base\n    base = base.contiguous().transpose(2, 1).contiguous()\n    model_points = model_points.view(bs, 1, num_point_mesh, 3).repeat(1, num_p, 1, 1).view(bs * num_p, num_point_mesh, 3)\n    target = target.view(bs, 1, num_point_mesh, 3).repeat(1, num_p, 1, 1).view(bs * num_p, num_point_mesh, 3)\n    ori_target = target\n    pred_t = pred_t.contiguous().view(bs * num_p, 1, 3)\n    ori_t = pred_t\n    points = points.contiguous().view(bs * num_p, 1, 3)\n    pred_c = pred_c.contiguous().view(bs * num_p)\n\n    pred = torch.add(torch.bmm(model_points, base), points + pred_t)\n\n    if not refine:\n        if idx[0].item() in sym_list:\n            target = target[0].transpose(1, 0).contiguous().view(3, -1)\n            pred = pred.permute(2, 0, 1).contiguous().view(3, -1)\n            inds = knn(target.unsqueeze(0), pred.unsqueeze(0))\n            target = torch.index_select(target, 1, inds.view(-1).detach() - 1)\n            target = target.view(3, bs * num_p, num_point_mesh).permute(1, 2, 0).contiguous()\n            pred = pred.view(3, bs * num_p, num_point_mesh).permute(1, 2, 0).contiguous()\n\n    dis = torch.mean(torch.norm((pred - target), dim=2), dim=1)\n    loss = torch.mean((dis * pred_c - w * torch.log(pred_c)), dim=0)\n    \n\n    pred_c = pred_c.view(bs, num_p)\n    how_max, which_max = torch.max(pred_c, 1)\n    dis = dis.view(bs, num_p)\n\n\n    t = ori_t[which_max[0]] + points[which_max[0]]\n    points = points.view(1, bs * num_p, 3)\n\n    ori_base = ori_base[which_max[0]].view(1, 3, 3).contiguous()\n    ori_t = t.repeat(bs * num_p, 1).contiguous().view(1, bs * num_p, 3)\n    new_points = torch.bmm((points - ori_t), ori_base).contiguous()\n\n    new_target = ori_target[0].view(1, num_point_mesh, 3).contiguous()\n    ori_t = t.repeat(num_point_mesh, 1).contiguous().view(1, num_point_mesh, 3)\n    new_target = torch.bmm((new_target - ori_t), ori_base).contiguous()\n\n    # print('------------> ', dis[0][which_max[0]].item(), pred_c[0][which_max[0]].item(), idx[0].item())\n    del knn\n    return loss, dis[0][which_max[0]], new_points.detach(), new_target.detach()\n\n\nclass Loss(_Loss):\n\n    def __init__(self, num_points_mesh, sym_list):\n        super(Loss, self).__init__(True)\n        self.num_pt_mesh = num_points_mesh\n        self.sym_list = sym_list\n\n    def forward(self, pred_r, pred_t, pred_c, target, model_points, idx, points, w, refine):\n\n        return loss_calculation(pred_r, pred_t, pred_c, target, model_points, idx, points, w, refine, self.num_pt_mesh, self.sym_list)\n"
  },
  {
    "path": "DenseFusion/lib/loss_refiner.py",
    "content": "from torch.nn.modules.loss import _Loss\nfrom torch.autograd import Variable\nimport torch\nimport time\nimport numpy as np\nimport torch.nn as nn\nimport random\nimport torch.backends.cudnn as cudnn\nfrom lib.knn.__init__ import KNearestNeighbor\n\n\ndef loss_calculation(pred_r, pred_t, target, model_points, idx, points, num_point_mesh, sym_list):\n    knn = KNearestNeighbor(1)\n    pred_r = pred_r.view(1, 1, -1)\n    pred_t = pred_t.view(1, 1, -1)\n    bs, num_p, _ = pred_r.size()\n    num_input_points = len(points[0])\n\n    pred_r = pred_r / (torch.norm(pred_r, dim=2).view(bs, num_p, 1))\n    \n    base = torch.cat(((1.0 - 2.0*(pred_r[:, :, 2]**2 + pred_r[:, :, 3]**2)).view(bs, num_p, 1),\\\n                      (2.0*pred_r[:, :, 1]*pred_r[:, :, 2] - 2.0*pred_r[:, :, 0]*pred_r[:, :, 3]).view(bs, num_p, 1), \\\n                      (2.0*pred_r[:, :, 0]*pred_r[:, :, 2] + 2.0*pred_r[:, :, 1]*pred_r[:, :, 3]).view(bs, num_p, 1), \\\n                      (2.0*pred_r[:, :, 1]*pred_r[:, :, 2] + 2.0*pred_r[:, :, 3]*pred_r[:, :, 0]).view(bs, num_p, 1), \\\n                      (1.0 - 2.0*(pred_r[:, :, 1]**2 + pred_r[:, :, 3]**2)).view(bs, num_p, 1), \\\n                      (-2.0*pred_r[:, :, 0]*pred_r[:, :, 1] + 2.0*pred_r[:, :, 2]*pred_r[:, :, 3]).view(bs, num_p, 1), \\\n                      (-2.0*pred_r[:, :, 0]*pred_r[:, :, 2] + 2.0*pred_r[:, :, 1]*pred_r[:, :, 3]).view(bs, num_p, 1), \\\n                      (2.0*pred_r[:, :, 0]*pred_r[:, :, 1] + 2.0*pred_r[:, :, 2]*pred_r[:, :, 3]).view(bs, num_p, 1), \\\n                      (1.0 - 2.0*(pred_r[:, :, 1]**2 + pred_r[:, :, 2]**2)).view(bs, num_p, 1)), dim=2).contiguous().view(bs * num_p, 3, 3)\n    \n    ori_base = base\n    base = base.contiguous().transpose(2, 1).contiguous()\n    model_points = model_points.view(bs, 1, num_point_mesh, 3).repeat(1, num_p, 1, 1).view(bs * num_p, num_point_mesh, 3)\n    target = target.view(bs, 1, num_point_mesh, 3).repeat(1, num_p, 1, 1).view(bs * num_p, num_point_mesh, 3)\n    ori_target = target\n    pred_t = pred_t.contiguous().view(bs * num_p, 1, 3)\n    ori_t = pred_t\n\n    pred = torch.add(torch.bmm(model_points, base), pred_t)\n\n    if idx[0].item() in sym_list:\n        target = target[0].transpose(1, 0).contiguous().view(3, -1)\n        pred = pred.permute(2, 0, 1).contiguous().view(3, -1)\n        inds = knn(target.unsqueeze(0), pred.unsqueeze(0))\n        target = torch.index_select(target, 1, inds.view(-1).detach() - 1)\n        target = target.view(3, bs * num_p, num_point_mesh).permute(1, 2, 0).contiguous()\n        pred = pred.view(3, bs * num_p, num_point_mesh).permute(1, 2, 0).contiguous()\n\n    dis = torch.mean(torch.norm((pred - target), dim=2), dim=1)\n\n    t = ori_t[0]\n    points = points.view(1, num_input_points, 3)\n\n    ori_base = ori_base[0].view(1, 3, 3).contiguous()\n    ori_t = t.repeat(bs * num_input_points, 1).contiguous().view(1, bs * num_input_points, 3)\n    new_points = torch.bmm((points - ori_t), ori_base).contiguous()\n\n    new_target = ori_target[0].view(1, num_point_mesh, 3).contiguous()\n    ori_t = t.repeat(num_point_mesh, 1).contiguous().view(1, num_point_mesh, 3)\n    new_target = torch.bmm((new_target - ori_t), ori_base).contiguous()\n\n    # print('------------> ', dis.item(), idx[0].item())\n    del knn\n    return dis, new_points.detach(), new_target.detach()\n\n\nclass Loss_refine(_Loss):\n\n    def __init__(self, num_points_mesh, sym_list):\n        super(Loss_refine, self).__init__(True)\n        self.num_pt_mesh = num_points_mesh\n        self.sym_list = sym_list\n\n\n    def forward(self, pred_r, pred_t, target, model_points, idx, points):\n        return loss_calculation(pred_r, pred_t, target, model_points, idx, points, self.num_pt_mesh, self.sym_list)\n"
  },
  {
    "path": "DenseFusion/lib/network.py",
    "content": "import argparse\nimport os\nimport random\nimport torch\nimport torch.nn as nn\nimport torch.nn.parallel\nimport torch.backends.cudnn as cudnn\nimport torch.optim as optim\nimport torch.utils.data\nimport torchvision.transforms as transforms\nimport torchvision.utils as vutils\nfrom torch.autograd import Variable\nfrom PIL import Image\nimport numpy as np\nimport pdb\nimport torch.nn.functional as F\nfrom lib.pspnet import PSPNet\n\npsp_models = {\n    'resnet18': lambda: PSPNet(sizes=(1, 2, 3, 6), psp_size=512, deep_features_size=256, backend='resnet18'),\n    'resnet34': lambda: PSPNet(sizes=(1, 2, 3, 6), psp_size=512, deep_features_size=256, backend='resnet34'),\n    'resnet50': lambda: PSPNet(sizes=(1, 2, 3, 6), psp_size=2048, deep_features_size=1024, backend='resnet50'),\n    'resnet101': lambda: PSPNet(sizes=(1, 2, 3, 6), psp_size=2048, deep_features_size=1024, backend='resnet101'),\n    'resnet152': lambda: PSPNet(sizes=(1, 2, 3, 6), psp_size=2048, deep_features_size=1024, backend='resnet152')\n}\n\nclass ModifiedResnet(nn.Module):\n\n    def __init__(self, usegpu=True):\n        super(ModifiedResnet, self).__init__()\n\n        self.model = psp_models['resnet18'.lower()]()\n        self.model = nn.DataParallel(self.model)\n\n    def forward(self, x):\n        x = self.model(x)\n        return x\n\nclass PoseNetFeat(nn.Module):\n    def __init__(self, num_points):\n        super(PoseNetFeat, self).__init__()\n        self.conv1 = torch.nn.Conv1d(3, 64, 1)\n        self.conv2 = torch.nn.Conv1d(64, 128, 1)\n\n        self.e_conv1 = torch.nn.Conv1d(32, 64, 1)\n        self.e_conv2 = torch.nn.Conv1d(64, 128, 1)\n\n        self.conv5 = torch.nn.Conv1d(256, 512, 1)\n        self.conv6 = torch.nn.Conv1d(512, 1024, 1)\n\n        self.ap1 = torch.nn.AvgPool1d(num_points)\n        self.num_points = num_points\n    def forward(self, x, emb):\n        x = F.relu(self.conv1(x))\n        emb = F.relu(self.e_conv1(emb))\n        pointfeat_1 = torch.cat((x, emb), dim=1)\n\n        x = F.relu(self.conv2(x))\n        emb = F.relu(self.e_conv2(emb))\n        pointfeat_2 = torch.cat((x, emb), dim=1)\n\n        x = F.relu(self.conv5(pointfeat_2))\n        x = F.relu(self.conv6(x))\n\n        ap_x = self.ap1(x)\n\n        ap_x = ap_x.view(-1, 1024, 1).repeat(1, 1, self.num_points)\n        return torch.cat([pointfeat_1, pointfeat_2, ap_x], 1) #128 + 256 + 1024\n\nclass PoseNet(nn.Module):\n    def __init__(self, num_points, num_obj):\n        super(PoseNet, self).__init__()\n        self.num_points = num_points\n        self.cnn = ModifiedResnet()\n        self.feat = PoseNetFeat(num_points)\n        \n        self.conv1_r = torch.nn.Conv1d(1408, 640, 1)\n        self.conv1_t = torch.nn.Conv1d(1408, 640, 1)\n        self.conv1_c = torch.nn.Conv1d(1408, 640, 1)\n\n        self.conv2_r = torch.nn.Conv1d(640, 256, 1)\n        self.conv2_t = torch.nn.Conv1d(640, 256, 1)\n        self.conv2_c = torch.nn.Conv1d(640, 256, 1)\n\n        self.conv3_r = torch.nn.Conv1d(256, 128, 1)\n        self.conv3_t = torch.nn.Conv1d(256, 128, 1)\n        self.conv3_c = torch.nn.Conv1d(256, 128, 1)\n\n        self.conv4_r = torch.nn.Conv1d(128, num_obj*4, 1) #quaternion\n        self.conv4_t = torch.nn.Conv1d(128, num_obj*3, 1) #translation\n        self.conv4_c = torch.nn.Conv1d(128, num_obj*1, 1) #confidence\n\n        self.num_obj = num_obj\n\n    def forward(self, img, x, choose, obj):\n        out_img = self.cnn(img)\n        \n        bs, di, _, _ = out_img.size()\n\n        emb = out_img.view(bs, di, -1)\n        choose = choose.repeat(1, di, 1)\n        emb = torch.gather(emb, 2, choose).contiguous()\n        \n        x = x.transpose(2, 1).contiguous()\n        ap_x = self.feat(x, emb)\n\n        rx = F.relu(self.conv1_r(ap_x))\n        tx = F.relu(self.conv1_t(ap_x))\n        cx = F.relu(self.conv1_c(ap_x))      \n\n        rx = F.relu(self.conv2_r(rx))\n        tx = F.relu(self.conv2_t(tx))\n        cx = F.relu(self.conv2_c(cx))\n\n        rx = F.relu(self.conv3_r(rx))\n        tx = F.relu(self.conv3_t(tx))\n        cx = F.relu(self.conv3_c(cx))\n\n        rx = self.conv4_r(rx).view(bs, self.num_obj, 4, self.num_points)\n        tx = self.conv4_t(tx).view(bs, self.num_obj, 3, self.num_points)\n        cx = torch.sigmoid(self.conv4_c(cx)).view(bs, self.num_obj, 1, self.num_points)\n        \n        b = 0\n        out_rx = torch.index_select(rx[b], 0, obj[b])\n        out_tx = torch.index_select(tx[b], 0, obj[b])\n        out_cx = torch.index_select(cx[b], 0, obj[b])\n        \n        out_rx = out_rx.contiguous().transpose(2, 1).contiguous()\n        out_cx = out_cx.contiguous().transpose(2, 1).contiguous()\n        out_tx = out_tx.contiguous().transpose(2, 1).contiguous()\n        \n        return out_rx, out_tx, out_cx, emb.detach()\n \n\n\nclass PoseRefineNetFeat(nn.Module):\n    def __init__(self, num_points):\n        super(PoseRefineNetFeat, self).__init__()\n        self.conv1 = torch.nn.Conv1d(3, 64, 1)\n        self.conv2 = torch.nn.Conv1d(64, 128, 1)\n\n        self.e_conv1 = torch.nn.Conv1d(32, 64, 1)\n        self.e_conv2 = torch.nn.Conv1d(64, 128, 1)\n\n        self.conv5 = torch.nn.Conv1d(384, 512, 1)\n        self.conv6 = torch.nn.Conv1d(512, 1024, 1)\n\n        self.ap1 = torch.nn.AvgPool1d(num_points)\n        self.num_points = num_points\n\n    def forward(self, x, emb):\n        x = F.relu(self.conv1(x))\n        emb = F.relu(self.e_conv1(emb))\n        pointfeat_1 = torch.cat([x, emb], dim=1)\n\n        x = F.relu(self.conv2(x))\n        emb = F.relu(self.e_conv2(emb))\n        pointfeat_2 = torch.cat([x, emb], dim=1)\n\n        pointfeat_3 = torch.cat([pointfeat_1, pointfeat_2], dim=1)\n\n        x = F.relu(self.conv5(pointfeat_3))\n        x = F.relu(self.conv6(x))\n\n        ap_x = self.ap1(x)\n\n        ap_x = ap_x.view(-1, 1024)\n        return ap_x\n\nclass PoseRefineNet(nn.Module):\n    def __init__(self, num_points, num_obj):\n        super(PoseRefineNet, self).__init__()\n        self.num_points = num_points\n        self.feat = PoseRefineNetFeat(num_points)\n        \n        self.conv1_r = torch.nn.Linear(1024, 512)\n        self.conv1_t = torch.nn.Linear(1024, 512)\n\n        self.conv2_r = torch.nn.Linear(512, 128)\n        self.conv2_t = torch.nn.Linear(512, 128)\n\n        self.conv3_r = torch.nn.Linear(128, num_obj*4) #quaternion\n        self.conv3_t = torch.nn.Linear(128, num_obj*3) #translation\n\n        self.num_obj = num_obj\n\n    def forward(self, x, emb, obj):\n        bs = x.size()[0]\n        \n        x = x.transpose(2, 1).contiguous()\n        ap_x = self.feat(x, emb)\n\n        rx = F.relu(self.conv1_r(ap_x))\n        tx = F.relu(self.conv1_t(ap_x))   \n\n        rx = F.relu(self.conv2_r(rx))\n        tx = F.relu(self.conv2_t(tx))\n\n        rx = self.conv3_r(rx).view(bs, self.num_obj, 4)\n        tx = self.conv3_t(tx).view(bs, self.num_obj, 3)\n\n        b = 0\n        out_rx = torch.index_select(rx[b], 0, obj[b])\n        out_tx = torch.index_select(tx[b], 0, obj[b])\n\n        return out_rx, out_tx\n"
  },
  {
    "path": "DenseFusion/lib/pspnet.py",
    "content": "import torch\nfrom torch import nn\nfrom torch.nn import functional as F\nimport lib.extractors as extractors\n\n\nclass PSPModule(nn.Module):\n    def __init__(self, features, out_features=1024, sizes=(1, 2, 3, 6)):\n        super(PSPModule, self).__init__()\n        self.stages = []\n        self.stages = nn.ModuleList([self._make_stage(features, size) for size in sizes])\n        self.bottleneck = nn.Conv2d(features * (len(sizes) + 1), out_features, kernel_size=1)\n        self.relu = nn.ReLU()\n\n    def _make_stage(self, features, size):\n        prior = nn.AdaptiveAvgPool2d(output_size=(size, size))\n        conv = nn.Conv2d(features, features, kernel_size=1, bias=False)\n        return nn.Sequential(prior, conv)\n\n    def forward(self, feats):\n        h, w = feats.size(2), feats.size(3)\n        priors = [F.upsample(input=stage(feats), size=(h, w), mode='bilinear') for stage in self.stages] + [feats]\n        bottle = self.bottleneck(torch.cat(priors, 1))\n        return self.relu(bottle)\n\n\nclass PSPUpsample(nn.Module):\n    def __init__(self, in_channels, out_channels):\n        super(PSPUpsample, self).__init__()\n        self.conv = nn.Sequential(\n            nn.Upsample(scale_factor=2, mode='bilinear', align_corners=True),\n            nn.Conv2d(in_channels, out_channels, 3, padding=1),\n            nn.PReLU()\n        )\n\n    def forward(self, x):\n        return self.conv(x)\n\n\nclass PSPNet(nn.Module):\n    def __init__(self, n_classes=21, sizes=(1, 2, 3, 6), psp_size=2048, deep_features_size=1024, backend='resnet18',\n                 pretrained=False):\n        super(PSPNet, self).__init__()\n        self.feats = getattr(extractors, backend)(pretrained)\n        self.psp = PSPModule(psp_size, 1024, sizes)\n        self.drop_1 = nn.Dropout2d(p=0.3)\n\n        self.up_1 = PSPUpsample(1024, 256)\n        self.up_2 = PSPUpsample(256, 64)\n        self.up_3 = PSPUpsample(64, 64)\n\n        self.drop_2 = nn.Dropout2d(p=0.15)\n        self.final = nn.Sequential(\n            nn.Conv2d(64, 32, kernel_size=1),\n            nn.LogSoftmax()\n        )\n\n        self.classifier = nn.Sequential(\n            nn.Linear(deep_features_size, 256),\n            nn.ReLU(),\n            nn.Linear(256, n_classes)\n        )\n\n    def forward(self, x):\n        f, class_f = self.feats(x) \n        p = self.psp(f)\n        p = self.drop_1(p)\n\n        p = self.up_1(p)\n        p = self.drop_2(p)\n\n        p = self.up_2(p)\n        p = self.drop_2(p)\n\n        p = self.up_3(p)\n        \n        return self.final(p)\n"
  },
  {
    "path": "DenseFusion/lib/transformations.py",
    "content": "# -*- coding: utf-8 -*-\n# transformations.py\n\n# Copyright (c) 2006-2018, Christoph Gohlke\n# Copyright (c) 2006-2018, The Regents of the University of California\n# Produced at the Laboratory for Fluorescence Dynamics\n# All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without\n# modification, are permitted provided that the following conditions are met:\n#\n# * Redistributions of source code must retain the above copyright\n#   notice, this list of conditions and the following disclaimer.\n# * Redistributions in binary form must reproduce the above copyright\n#   notice, this list of conditions and the following disclaimer in the\n#   documentation and/or other materials provided with the distribution.\n# * Neither the name of the copyright holders nor the names of any\n#   contributors may be used to endorse or promote products derived\n#   from this software without specific prior written permission.\n#\n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n# ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE\n# LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n# CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n# POSSIBILITY OF SUCH DAMAGE.\n\n\"\"\"Homogeneous Transformation Matrices and Quaternions.\n\nA library for calculating 4x4 matrices for translating, rotating, reflecting,\nscaling, shearing, projecting, orthogonalizing, and superimposing arrays of\n3D homogeneous coordinates as well as for converting between rotation matrices,\nEuler angles, and quaternions. Also includes an Arcball control object and\nfunctions to decompose transformation matrices.\n\n:Author:\n  `Christoph Gohlke <https://www.lfd.uci.edu/~gohlke/>`_\n\n:Organization:\n  Laboratory for Fluorescence Dynamics, University of California, Irvine\n\n:Version: 2018.02.08\n\nRequirements\n------------\n* `CPython 2.7 or 3.6 <http://www.python.org>`_\n* `Numpy 1.13 <http://www.numpy.org>`_\n* `Transformations.c 2018.02.08 <https://www.lfd.uci.edu/~gohlke/>`_\n  (recommended for speedup of some functions)\n\nNotes\n-----\nThe API is not stable yet and is expected to change between revisions.\n\nThis Python code is not optimized for speed. Refer to the transformations.c\nmodule for a faster implementation of some functions.\n\nDocumentation in HTML format can be generated with epydoc.\n\nMatrices (M) can be inverted using numpy.linalg.inv(M), be concatenated using\nnumpy.dot(M0, M1), or transform homogeneous coordinate arrays (v) using\nnumpy.dot(M, v) for shape (4, \\*) column vectors, respectively\nnumpy.dot(v, M.T) for shape (\\*, 4) row vectors (\"array of points\").\n\nThis module follows the \"column vectors on the right\" and \"row major storage\"\n(C contiguous) conventions. The translation components are in the right column\nof the transformation matrix, i.e. M[:3, 3].\nThe transpose of the transformation matrices may have to be used to interface\nwith other graphics systems, e.g. with OpenGL's glMultMatrixd(). See also [16].\n\nCalculations are carried out with numpy.float64 precision.\n\nVector, point, quaternion, and matrix function arguments are expected to be\n\"array like\", i.e. tuple, list, or numpy arrays.\n\nReturn types are numpy arrays unless specified otherwise.\n\nAngles are in radians unless specified otherwise.\n\nQuaternions w+ix+jy+kz are represented as [w, x, y, z].\n\nA triple of Euler angles can be applied/interpreted in 24 ways, which can\nbe specified using a 4 character string or encoded 4-tuple:\n\n  *Axes 4-string*: e.g. 'sxyz' or 'ryxy'\n\n  - first character : rotations are applied to 's'tatic or 'r'otating frame\n  - remaining characters : successive rotation axis 'x', 'y', or 'z'\n\n  *Axes 4-tuple*: e.g. (0, 0, 0, 0) or (1, 1, 1, 1)\n\n  - inner axis: code of axis ('x':0, 'y':1, 'z':2) of rightmost matrix.\n  - parity : even (0) if inner axis 'x' is followed by 'y', 'y' is followed\n    by 'z', or 'z' is followed by 'x'. Otherwise odd (1).\n  - repetition : first and last axis are same (1) or different (0).\n  - frame : rotations are applied to static (0) or rotating (1) frame.\n\nOther Python packages and modules for 3D transformations and quaternions:\n\n* `Transforms3d <https://pypi.python.org/pypi/transforms3d>`_\n   includes most code of this module.\n* `Blender.mathutils <http://www.blender.org/api/blender_python_api>`_\n* `numpy-dtypes <https://github.com/numpy/numpy-dtypes>`_\n\nReferences\n----------\n(1)  Matrices and transformations. Ronald Goldman.\n     In \"Graphics Gems I\", pp 472-475. Morgan Kaufmann, 1990.\n(2)  More matrices and transformations: shear and pseudo-perspective.\n     Ronald Goldman. In \"Graphics Gems II\", pp 320-323. Morgan Kaufmann, 1991.\n(3)  Decomposing a matrix into simple transformations. Spencer Thomas.\n     In \"Graphics Gems II\", pp 320-323. Morgan Kaufmann, 1991.\n(4)  Recovering the data from the transformation matrix. Ronald Goldman.\n     In \"Graphics Gems II\", pp 324-331. Morgan Kaufmann, 1991.\n(5)  Euler angle conversion. Ken Shoemake.\n     In \"Graphics Gems IV\", pp 222-229. Morgan Kaufmann, 1994.\n(6)  Arcball rotation control. Ken Shoemake.\n     In \"Graphics Gems IV\", pp 175-192. Morgan Kaufmann, 1994.\n(7)  Representing attitude: Euler angles, unit quaternions, and rotation\n     vectors. James Diebel. 2006.\n(8)  A discussion of the solution for the best rotation to relate two sets\n     of vectors. W Kabsch. Acta Cryst. 1978. A34, 827-828.\n(9)  Closed-form solution of absolute orientation using unit quaternions.\n     BKP Horn. J Opt Soc Am A. 1987. 4(4):629-642.\n(10) Quaternions. Ken Shoemake.\n     http://www.sfu.ca/~jwa3/cmpt461/files/quatut.pdf\n(11) From quaternion to matrix and back. JMP van Waveren. 2005.\n     http://www.intel.com/cd/ids/developer/asmo-na/eng/293748.htm\n(12) Uniform random rotations. Ken Shoemake.\n     In \"Graphics Gems III\", pp 124-132. Morgan Kaufmann, 1992.\n(13) Quaternion in molecular modeling. CFF Karney.\n     J Mol Graph Mod, 25(5):595-604\n(14) New method for extracting the quaternion from a rotation matrix.\n     Itzhack Y Bar-Itzhack, J Guid Contr Dynam. 2000. 23(6): 1085-1087.\n(15) Multiple View Geometry in Computer Vision. Hartley and Zissermann.\n     Cambridge University Press; 2nd Ed. 2004. Chapter 4, Algorithm 4.7, p 130.\n(16) Column Vectors vs. Row Vectors.\n     http://steve.hollasch.net/cgindex/math/matrix/column-vec.html\n\nExamples\n--------\n>>> alpha, beta, gamma = 0.123, -1.234, 2.345\n>>> origin, xaxis, yaxis, zaxis = [0, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1]\n>>> I = identity_matrix()\n>>> Rx = rotation_matrix(alpha, xaxis)\n>>> Ry = rotation_matrix(beta, yaxis)\n>>> Rz = rotation_matrix(gamma, zaxis)\n>>> R = concatenate_matrices(Rx, Ry, Rz)\n>>> euler = euler_from_matrix(R, 'rxyz')\n>>> numpy.allclose([alpha, beta, gamma], euler)\nTrue\n>>> Re = euler_matrix(alpha, beta, gamma, 'rxyz')\n>>> is_same_transform(R, Re)\nTrue\n>>> al, be, ga = euler_from_matrix(Re, 'rxyz')\n>>> is_same_transform(Re, euler_matrix(al, be, ga, 'rxyz'))\nTrue\n>>> qx = quaternion_about_axis(alpha, xaxis)\n>>> qy = quaternion_about_axis(beta, yaxis)\n>>> qz = quaternion_about_axis(gamma, zaxis)\n>>> q = quaternion_multiply(qx, qy)\n>>> q = quaternion_multiply(q, qz)\n>>> Rq = quaternion_matrix(q)\n>>> is_same_transform(R, Rq)\nTrue\n>>> S = scale_matrix(1.23, origin)\n>>> T = translation_matrix([1, 2, 3])\n>>> Z = shear_matrix(beta, xaxis, origin, zaxis)\n>>> R = random_rotation_matrix(numpy.random.rand(3))\n>>> M = concatenate_matrices(T, R, Z, S)\n>>> scale, shear, angles, trans, persp = decompose_matrix(M)\n>>> numpy.allclose(scale, 1.23)\nTrue\n>>> numpy.allclose(trans, [1, 2, 3])\nTrue\n>>> numpy.allclose(shear, [0, math.tan(beta), 0])\nTrue\n>>> is_same_transform(R, euler_matrix(axes='sxyz', *angles))\nTrue\n>>> M1 = compose_matrix(scale, shear, angles, trans, persp)\n>>> is_same_transform(M, M1)\nTrue\n>>> v0, v1 = random_vector(3), random_vector(3)\n>>> M = rotation_matrix(angle_between_vectors(v0, v1), vector_product(v0, v1))\n>>> v2 = numpy.dot(v0, M[:3,:3].T)\n>>> numpy.allclose(unit_vector(v1), unit_vector(v2))\nTrue\n\n\"\"\"\n\nfrom __future__ import division, print_function\n\nimport math\n\nimport numpy\n\n__version__ = '2018.02.08'\n__docformat__ = 'restructuredtext en'\n__all__ = ()\n\n\ndef identity_matrix():\n    \"\"\"Return 4x4 identity/unit matrix.\n\n    >>> I = identity_matrix()\n    >>> numpy.allclose(I, numpy.dot(I, I))\n    True\n    >>> numpy.sum(I), numpy.trace(I)\n    (4.0, 4.0)\n    >>> numpy.allclose(I, numpy.identity(4))\n    True\n\n    \"\"\"\n    return numpy.identity(4)\n\n\ndef translation_matrix(direction):\n    \"\"\"Return matrix to translate by direction vector.\n\n    >>> v = numpy.random.random(3) - 0.5\n    >>> numpy.allclose(v, translation_matrix(v)[:3, 3])\n    True\n\n    \"\"\"\n    M = numpy.identity(4)\n    M[:3, 3] = direction[:3]\n    return M\n\n\ndef translation_from_matrix(matrix):\n    \"\"\"Return translation vector from translation matrix.\n\n    >>> v0 = numpy.random.random(3) - 0.5\n    >>> v1 = translation_from_matrix(translation_matrix(v0))\n    >>> numpy.allclose(v0, v1)\n    True\n\n    \"\"\"\n    return numpy.array(matrix, copy=False)[:3, 3].copy()\n\n\ndef reflection_matrix(point, normal):\n    \"\"\"Return matrix to mirror at plane defined by point and normal vector.\n\n    >>> v0 = numpy.random.random(4) - 0.5\n    >>> v0[3] = 1.\n    >>> v1 = numpy.random.random(3) - 0.5\n    >>> R = reflection_matrix(v0, v1)\n    >>> numpy.allclose(2, numpy.trace(R))\n    True\n    >>> numpy.allclose(v0, numpy.dot(R, v0))\n    True\n    >>> v2 = v0.copy()\n    >>> v2[:3] += v1\n    >>> v3 = v0.copy()\n    >>> v2[:3] -= v1\n    >>> numpy.allclose(v2, numpy.dot(R, v3))\n    True\n\n    \"\"\"\n    normal = unit_vector(normal[:3])\n    M = numpy.identity(4)\n    M[:3, :3] -= 2.0 * numpy.outer(normal, normal)\n    M[:3, 3] = (2.0 * numpy.dot(point[:3], normal)) * normal\n    return M\n\n\ndef reflection_from_matrix(matrix):\n    \"\"\"Return mirror plane point and normal vector from reflection matrix.\n\n    >>> v0 = numpy.random.random(3) - 0.5\n    >>> v1 = numpy.random.random(3) - 0.5\n    >>> M0 = reflection_matrix(v0, v1)\n    >>> point, normal = reflection_from_matrix(M0)\n    >>> M1 = reflection_matrix(point, normal)\n    >>> is_same_transform(M0, M1)\n    True\n\n    \"\"\"\n    M = numpy.array(matrix, dtype=numpy.float64, copy=False)\n    # normal: unit eigenvector corresponding to eigenvalue -1\n    w, V = numpy.linalg.eig(M[:3, :3])\n    i = numpy.where(abs(numpy.real(w) + 1.0) < 1e-8)[0]\n    if not len(i):\n        raise ValueError('no unit eigenvector corresponding to eigenvalue -1')\n    normal = numpy.real(V[:, i[0]]).squeeze()\n    # point: any unit eigenvector corresponding to eigenvalue 1\n    w, V = numpy.linalg.eig(M)\n    i = numpy.where(abs(numpy.real(w) - 1.0) < 1e-8)[0]\n    if not len(i):\n        raise ValueError('no unit eigenvector corresponding to eigenvalue 1')\n    point = numpy.real(V[:, i[-1]]).squeeze()\n    point /= point[3]\n    return point, normal\n\n\ndef rotation_matrix(angle, direction, point=None):\n    \"\"\"Return matrix to rotate about axis defined by point and direction.\n\n    >>> R = rotation_matrix(math.pi/2, [0, 0, 1], [1, 0, 0])\n    >>> numpy.allclose(numpy.dot(R, [0, 0, 0, 1]), [1, -1, 0, 1])\n    True\n    >>> angle = (random.random() - 0.5) * (2*math.pi)\n    >>> direc = numpy.random.random(3) - 0.5\n    >>> point = numpy.random.random(3) - 0.5\n    >>> R0 = rotation_matrix(angle, direc, point)\n    >>> R1 = rotation_matrix(angle-2*math.pi, direc, point)\n    >>> is_same_transform(R0, R1)\n    True\n    >>> R0 = rotation_matrix(angle, direc, point)\n    >>> R1 = rotation_matrix(-angle, -direc, point)\n    >>> is_same_transform(R0, R1)\n    True\n    >>> I = numpy.identity(4, numpy.float64)\n    >>> numpy.allclose(I, rotation_matrix(math.pi*2, direc))\n    True\n    >>> numpy.allclose(2, numpy.trace(rotation_matrix(math.pi/2,\n    ...                                               direc, point)))\n    True\n\n    \"\"\"\n    sina = math.sin(angle)\n    cosa = math.cos(angle)\n    direction = unit_vector(direction[:3])\n    # rotation matrix around unit vector\n    R = numpy.diag([cosa, cosa, cosa])\n    R += numpy.outer(direction, direction) * (1.0 - cosa)\n    direction *= sina\n    R += numpy.array([[ 0.0,         -direction[2],  direction[1]],\n                      [ direction[2], 0.0,          -direction[0]],\n                      [-direction[1], direction[0],  0.0]])\n    M = numpy.identity(4)\n    M[:3, :3] = R\n    if point is not None:\n        # rotation not around origin\n        point = numpy.array(point[:3], dtype=numpy.float64, copy=False)\n        M[:3, 3] = point - numpy.dot(R, point)\n    return M\n\n\ndef rotation_from_matrix(matrix):\n    \"\"\"Return rotation angle and axis from rotation matrix.\n\n    >>> angle = (random.random() - 0.5) * (2*math.pi)\n    >>> direc = numpy.random.random(3) - 0.5\n    >>> point = numpy.random.random(3) - 0.5\n    >>> R0 = rotation_matrix(angle, direc, point)\n    >>> angle, direc, point = rotation_from_matrix(R0)\n    >>> R1 = rotation_matrix(angle, direc, point)\n    >>> is_same_transform(R0, R1)\n    True\n\n    \"\"\"\n    R = numpy.array(matrix, dtype=numpy.float64, copy=False)\n    R33 = R[:3, :3]\n    # direction: unit eigenvector of R33 corresponding to eigenvalue of 1\n    w, W = numpy.linalg.eig(R33.T)\n    i = numpy.where(abs(numpy.real(w) - 1.0) < 1e-8)[0]\n    if not len(i):\n        raise ValueError('no unit eigenvector corresponding to eigenvalue 1')\n    direction = numpy.real(W[:, i[-1]]).squeeze()\n    # point: unit eigenvector of R33 corresponding to eigenvalue of 1\n    w, Q = numpy.linalg.eig(R)\n    i = numpy.where(abs(numpy.real(w) - 1.0) < 1e-8)[0]\n    if not len(i):\n        raise ValueError('no unit eigenvector corresponding to eigenvalue 1')\n    point = numpy.real(Q[:, i[-1]]).squeeze()\n    point /= point[3]\n    # rotation angle depending on direction\n    cosa = (numpy.trace(R33) - 1.0) / 2.0\n    if abs(direction[2]) > 1e-8:\n        sina = (R[1, 0] + (cosa-1.0)*direction[0]*direction[1]) / direction[2]\n    elif abs(direction[1]) > 1e-8:\n        sina = (R[0, 2] + (cosa-1.0)*direction[0]*direction[2]) / direction[1]\n    else:\n        sina = (R[2, 1] + (cosa-1.0)*direction[1]*direction[2]) / direction[0]\n    angle = math.atan2(sina, cosa)\n    return angle, direction, point\n\n\ndef scale_matrix(factor, origin=None, direction=None):\n    \"\"\"Return matrix to scale by factor around origin in direction.\n\n    Use factor -1 for point symmetry.\n\n    >>> v = (numpy.random.rand(4, 5) - 0.5) * 20\n    >>> v[3] = 1\n    >>> S = scale_matrix(-1.234)\n    >>> numpy.allclose(numpy.dot(S, v)[:3], -1.234*v[:3])\n    True\n    >>> factor = random.random() * 10 - 5\n    >>> origin = numpy.random.random(3) - 0.5\n    >>> direct = numpy.random.random(3) - 0.5\n    >>> S = scale_matrix(factor, origin)\n    >>> S = scale_matrix(factor, origin, direct)\n\n    \"\"\"\n    if direction is None:\n        # uniform scaling\n        M = numpy.diag([factor, factor, factor, 1.0])\n        if origin is not None:\n            M[:3, 3] = origin[:3]\n            M[:3, 3] *= 1.0 - factor\n    else:\n        # nonuniform scaling\n        direction = unit_vector(direction[:3])\n        factor = 1.0 - factor\n        M = numpy.identity(4)\n        M[:3, :3] -= factor * numpy.outer(direction, direction)\n        if origin is not None:\n            M[:3, 3] = (factor * numpy.dot(origin[:3], direction)) * direction\n    return M\n\n\ndef scale_from_matrix(matrix):\n    \"\"\"Return scaling factor, origin and direction from scaling matrix.\n\n    >>> factor = random.random() * 10 - 5\n    >>> origin = numpy.random.random(3) - 0.5\n    >>> direct = numpy.random.random(3) - 0.5\n    >>> S0 = scale_matrix(factor, origin)\n    >>> factor, origin, direction = scale_from_matrix(S0)\n    >>> S1 = scale_matrix(factor, origin, direction)\n    >>> is_same_transform(S0, S1)\n    True\n    >>> S0 = scale_matrix(factor, origin, direct)\n    >>> factor, origin, direction = scale_from_matrix(S0)\n    >>> S1 = scale_matrix(factor, origin, direction)\n    >>> is_same_transform(S0, S1)\n    True\n\n    \"\"\"\n    M = numpy.array(matrix, dtype=numpy.float64, copy=False)\n    M33 = M[:3, :3]\n    factor = numpy.trace(M33) - 2.0\n    try:\n        # direction: unit eigenvector corresponding to eigenvalue factor\n        w, V = numpy.linalg.eig(M33)\n        i = numpy.where(abs(numpy.real(w) - factor) < 1e-8)[0][0]\n        direction = numpy.real(V[:, i]).squeeze()\n        direction /= vector_norm(direction)\n    except IndexError:\n        # uniform scaling\n        factor = (factor + 2.0) / 3.0\n        direction = None\n    # origin: any eigenvector corresponding to eigenvalue 1\n    w, V = numpy.linalg.eig(M)\n    i = numpy.where(abs(numpy.real(w) - 1.0) < 1e-8)[0]\n    if not len(i):\n        raise ValueError('no eigenvector corresponding to eigenvalue 1')\n    origin = numpy.real(V[:, i[-1]]).squeeze()\n    origin /= origin[3]\n    return factor, origin, direction\n\n\ndef projection_matrix(point, normal, direction=None,\n                      perspective=None, pseudo=False):\n    \"\"\"Return matrix to project onto plane defined by point and normal.\n\n    Using either perspective point, projection direction, or none of both.\n\n    If pseudo is True, perspective projections will preserve relative depth\n    such that Perspective = dot(Orthogonal, PseudoPerspective).\n\n    >>> P = projection_matrix([0, 0, 0], [1, 0, 0])\n    >>> numpy.allclose(P[1:, 1:], numpy.identity(4)[1:, 1:])\n    True\n    >>> point = numpy.random.random(3) - 0.5\n    >>> normal = numpy.random.random(3) - 0.5\n    >>> direct = numpy.random.random(3) - 0.5\n    >>> persp = numpy.random.random(3) - 0.5\n    >>> P0 = projection_matrix(point, normal)\n    >>> P1 = projection_matrix(point, normal, direction=direct)\n    >>> P2 = projection_matrix(point, normal, perspective=persp)\n    >>> P3 = projection_matrix(point, normal, perspective=persp, pseudo=True)\n    >>> is_same_transform(P2, numpy.dot(P0, P3))\n    True\n    >>> P = projection_matrix([3, 0, 0], [1, 1, 0], [1, 0, 0])\n    >>> v0 = (numpy.random.rand(4, 5) - 0.5) * 20\n    >>> v0[3] = 1\n    >>> v1 = numpy.dot(P, v0)\n    >>> numpy.allclose(v1[1], v0[1])\n    True\n    >>> numpy.allclose(v1[0], 3-v1[1])\n    True\n\n    \"\"\"\n    M = numpy.identity(4)\n    point = numpy.array(point[:3], dtype=numpy.float64, copy=False)\n    normal = unit_vector(normal[:3])\n    if perspective is not None:\n        # perspective projection\n        perspective = numpy.array(perspective[:3], dtype=numpy.float64,\n                                  copy=False)\n        M[0, 0] = M[1, 1] = M[2, 2] = numpy.dot(perspective-point, normal)\n        M[:3, :3] -= numpy.outer(perspective, normal)\n        if pseudo:\n            # preserve relative depth\n            M[:3, :3] -= numpy.outer(normal, normal)\n            M[:3, 3] = numpy.dot(point, normal) * (perspective+normal)\n        else:\n            M[:3, 3] = numpy.dot(point, normal) * perspective\n        M[3, :3] = -normal\n        M[3, 3] = numpy.dot(perspective, normal)\n    elif direction is not None:\n        # parallel projection\n        direction = numpy.array(direction[:3], dtype=numpy.float64, copy=False)\n        scale = numpy.dot(direction, normal)\n        M[:3, :3] -= numpy.outer(direction, normal) / scale\n        M[:3, 3] = direction * (numpy.dot(point, normal) / scale)\n    else:\n        # orthogonal projection\n        M[:3, :3] -= numpy.outer(normal, normal)\n        M[:3, 3] = numpy.dot(point, normal) * normal\n    return M\n\n\ndef projection_from_matrix(matrix, pseudo=False):\n    \"\"\"Return projection plane and perspective point from projection matrix.\n\n    Return values are same as arguments for projection_matrix function:\n    point, normal, direction, perspective, and pseudo.\n\n    >>> point = numpy.random.random(3) - 0.5\n    >>> normal = numpy.random.random(3) - 0.5\n    >>> direct = numpy.random.random(3) - 0.5\n    >>> persp = numpy.random.random(3) - 0.5\n    >>> P0 = projection_matrix(point, normal)\n    >>> result = projection_from_matrix(P0)\n    >>> P1 = projection_matrix(*result)\n    >>> is_same_transform(P0, P1)\n    True\n    >>> P0 = projection_matrix(point, normal, direct)\n    >>> result = projection_from_matrix(P0)\n    >>> P1 = projection_matrix(*result)\n    >>> is_same_transform(P0, P1)\n    True\n    >>> P0 = projection_matrix(point, normal, perspective=persp, pseudo=False)\n    >>> result = projection_from_matrix(P0, pseudo=False)\n    >>> P1 = projection_matrix(*result)\n    >>> is_same_transform(P0, P1)\n    True\n    >>> P0 = projection_matrix(point, normal, perspective=persp, pseudo=True)\n    >>> result = projection_from_matrix(P0, pseudo=True)\n    >>> P1 = projection_matrix(*result)\n    >>> is_same_transform(P0, P1)\n    True\n\n    \"\"\"\n    M = numpy.array(matrix, dtype=numpy.float64, copy=False)\n    M33 = M[:3, :3]\n    w, V = numpy.linalg.eig(M)\n    i = numpy.where(abs(numpy.real(w) - 1.0) < 1e-8)[0]\n    if not pseudo and len(i):\n        # point: any eigenvector corresponding to eigenvalue 1\n        point = numpy.real(V[:, i[-1]]).squeeze()\n        point /= point[3]\n        # direction: unit eigenvector corresponding to eigenvalue 0\n        w, V = numpy.linalg.eig(M33)\n        i = numpy.where(abs(numpy.real(w)) < 1e-8)[0]\n        if not len(i):\n            raise ValueError('no eigenvector corresponding to eigenvalue 0')\n        direction = numpy.real(V[:, i[0]]).squeeze()\n        direction /= vector_norm(direction)\n        # normal: unit eigenvector of M33.T corresponding to eigenvalue 0\n        w, V = numpy.linalg.eig(M33.T)\n        i = numpy.where(abs(numpy.real(w)) < 1e-8)[0]\n        if len(i):\n            # parallel projection\n            normal = numpy.real(V[:, i[0]]).squeeze()\n            normal /= vector_norm(normal)\n            return point, normal, direction, None, False\n        else:\n            # orthogonal projection, where normal equals direction vector\n            return point, direction, None, None, False\n    else:\n        # perspective projection\n        i = numpy.where(abs(numpy.real(w)) > 1e-8)[0]\n        if not len(i):\n            raise ValueError(\n                'no eigenvector not corresponding to eigenvalue 0')\n        point = numpy.real(V[:, i[-1]]).squeeze()\n        point /= point[3]\n        normal = - M[3, :3]\n        perspective = M[:3, 3] / numpy.dot(point[:3], normal)\n        if pseudo:\n            perspective -= normal\n        return point, normal, None, perspective, pseudo\n\n\ndef clip_matrix(left, right, bottom, top, near, far, perspective=False):\n    \"\"\"Return matrix to obtain normalized device coordinates from frustum.\n\n    The frustum bounds are axis-aligned along x (left, right),\n    y (bottom, top) and z (near, far).\n\n    Normalized device coordinates are in range [-1, 1] if coordinates are\n    inside the frustum.\n\n    If perspective is True the frustum is a truncated pyramid with the\n    perspective point at origin and direction along z axis, otherwise an\n    orthographic canonical view volume (a box).\n\n    Homogeneous coordinates transformed by the perspective clip matrix\n    need to be dehomogenized (divided by w coordinate).\n\n    >>> frustum = numpy.random.rand(6)\n    >>> frustum[1] += frustum[0]\n    >>> frustum[3] += frustum[2]\n    >>> frustum[5] += frustum[4]\n    >>> M = clip_matrix(perspective=False, *frustum)\n    >>> numpy.dot(M, [frustum[0], frustum[2], frustum[4], 1])\n    array([-1., -1., -1.,  1.])\n    >>> numpy.dot(M, [frustum[1], frustum[3], frustum[5], 1])\n    array([ 1.,  1.,  1.,  1.])\n    >>> M = clip_matrix(perspective=True, *frustum)\n    >>> v = numpy.dot(M, [frustum[0], frustum[2], frustum[4], 1])\n    >>> v / v[3]\n    array([-1., -1., -1.,  1.])\n    >>> v = numpy.dot(M, [frustum[1], frustum[3], frustum[4], 1])\n    >>> v / v[3]\n    array([ 1.,  1., -1.,  1.])\n\n    \"\"\"\n    if left >= right or bottom >= top or near >= far:\n        raise ValueError('invalid frustum')\n    if perspective:\n        if near <= _EPS:\n            raise ValueError('invalid frustum: near <= 0')\n        t = 2.0 * near\n        M = [[t/(left-right), 0.0, (right+left)/(right-left), 0.0],\n             [0.0, t/(bottom-top), (top+bottom)/(top-bottom), 0.0],\n             [0.0, 0.0, (far+near)/(near-far), t*far/(far-near)],\n             [0.0, 0.0, -1.0, 0.0]]\n    else:\n        M = [[2.0/(right-left), 0.0, 0.0, (right+left)/(left-right)],\n             [0.0, 2.0/(top-bottom), 0.0, (top+bottom)/(bottom-top)],\n             [0.0, 0.0, 2.0/(far-near), (far+near)/(near-far)],\n             [0.0, 0.0, 0.0, 1.0]]\n    return numpy.array(M)\n\n\ndef shear_matrix(angle, direction, point, normal):\n    \"\"\"Return matrix to shear by angle along direction vector on shear plane.\n\n    The shear plane is defined by a point and normal vector. The direction\n    vector must be orthogonal to the plane's normal vector.\n\n    A point P is transformed by the shear matrix into P\" such that\n    the vector P-P\" is parallel to the direction vector and its extent is\n    given by the angle of P-P'-P\", where P' is the orthogonal projection\n    of P onto the shear plane.\n\n    >>> angle = (random.random() - 0.5) * 4*math.pi\n    >>> direct = numpy.random.random(3) - 0.5\n    >>> point = numpy.random.random(3) - 0.5\n    >>> normal = numpy.cross(direct, numpy.random.random(3))\n    >>> S = shear_matrix(angle, direct, point, normal)\n    >>> numpy.allclose(1, numpy.linalg.det(S))\n    True\n\n    \"\"\"\n    normal = unit_vector(normal[:3])\n    direction = unit_vector(direction[:3])\n    if abs(numpy.dot(normal, direction)) > 1e-6:\n        raise ValueError('direction and normal vectors are not orthogonal')\n    angle = math.tan(angle)\n    M = numpy.identity(4)\n    M[:3, :3] += angle * numpy.outer(direction, normal)\n    M[:3, 3] = -angle * numpy.dot(point[:3], normal) * direction\n    return M\n\n\ndef shear_from_matrix(matrix):\n    \"\"\"Return shear angle, direction and plane from shear matrix.\n\n    >>> angle = (random.random() - 0.5) * 4*math.pi\n    >>> direct = numpy.random.random(3) - 0.5\n    >>> point = numpy.random.random(3) - 0.5\n    >>> normal = numpy.cross(direct, numpy.random.random(3))\n    >>> S0 = shear_matrix(angle, direct, point, normal)\n    >>> angle, direct, point, normal = shear_from_matrix(S0)\n    >>> S1 = shear_matrix(angle, direct, point, normal)\n    >>> is_same_transform(S0, S1)\n    True\n\n    \"\"\"\n    M = numpy.array(matrix, dtype=numpy.float64, copy=False)\n    M33 = M[:3, :3]\n    # normal: cross independent eigenvectors corresponding to the eigenvalue 1\n    w, V = numpy.linalg.eig(M33)\n    i = numpy.where(abs(numpy.real(w) - 1.0) < 1e-4)[0]\n    if len(i) < 2:\n        raise ValueError('no two linear independent eigenvectors found %s' % w)\n    V = numpy.real(V[:, i]).squeeze().T\n    lenorm = -1.0\n    for i0, i1 in ((0, 1), (0, 2), (1, 2)):\n        n = numpy.cross(V[i0], V[i1])\n        w = vector_norm(n)\n        if w > lenorm:\n            lenorm = w\n            normal = n\n    normal /= lenorm\n    # direction and angle\n    direction = numpy.dot(M33 - numpy.identity(3), normal)\n    angle = vector_norm(direction)\n    direction /= angle\n    angle = math.atan(angle)\n    # point: eigenvector corresponding to eigenvalue 1\n    w, V = numpy.linalg.eig(M)\n    i = numpy.where(abs(numpy.real(w) - 1.0) < 1e-8)[0]\n    if not len(i):\n        raise ValueError('no eigenvector corresponding to eigenvalue 1')\n    point = numpy.real(V[:, i[-1]]).squeeze()\n    point /= point[3]\n    return angle, direction, point, normal\n\n\ndef decompose_matrix(matrix):\n    \"\"\"Return sequence of transformations from transformation matrix.\n\n    matrix : array_like\n        Non-degenerative homogeneous transformation matrix\n\n    Return tuple of:\n        scale : vector of 3 scaling factors\n        shear : list of shear factors for x-y, x-z, y-z axes\n        angles : list of Euler angles about static x, y, z axes\n        translate : translation vector along x, y, z axes\n        perspective : perspective partition of matrix\n\n    Raise ValueError if matrix is of wrong type or degenerative.\n\n    >>> T0 = translation_matrix([1, 2, 3])\n    >>> scale, shear, angles, trans, persp = decompose_matrix(T0)\n    >>> T1 = translation_matrix(trans)\n    >>> numpy.allclose(T0, T1)\n    True\n    >>> S = scale_matrix(0.123)\n    >>> scale, shear, angles, trans, persp = decompose_matrix(S)\n    >>> scale[0]\n    0.123\n    >>> R0 = euler_matrix(1, 2, 3)\n    >>> scale, shear, angles, trans, persp = decompose_matrix(R0)\n    >>> R1 = euler_matrix(*angles)\n    >>> numpy.allclose(R0, R1)\n    True\n\n    \"\"\"\n    M = numpy.array(matrix, dtype=numpy.float64, copy=True).T\n    if abs(M[3, 3]) < _EPS:\n        raise ValueError('M[3, 3] is zero')\n    M /= M[3, 3]\n    P = M.copy()\n    P[:, 3] = 0.0, 0.0, 0.0, 1.0\n    if not numpy.linalg.det(P):\n        raise ValueError('matrix is singular')\n\n    scale = numpy.zeros((3, ))\n    shear = [0.0, 0.0, 0.0]\n    angles = [0.0, 0.0, 0.0]\n\n    if any(abs(M[:3, 3]) > _EPS):\n        perspective = numpy.dot(M[:, 3], numpy.linalg.inv(P.T))\n        M[:, 3] = 0.0, 0.0, 0.0, 1.0\n    else:\n        perspective = numpy.array([0.0, 0.0, 0.0, 1.0])\n\n    translate = M[3, :3].copy()\n    M[3, :3] = 0.0\n\n    row = M[:3, :3].copy()\n    scale[0] = vector_norm(row[0])\n    row[0] /= scale[0]\n    shear[0] = numpy.dot(row[0], row[1])\n    row[1] -= row[0] * shear[0]\n    scale[1] = vector_norm(row[1])\n    row[1] /= scale[1]\n    shear[0] /= scale[1]\n    shear[1] = numpy.dot(row[0], row[2])\n    row[2] -= row[0] * shear[1]\n    shear[2] = numpy.dot(row[1], row[2])\n    row[2] -= row[1] * shear[2]\n    scale[2] = vector_norm(row[2])\n    row[2] /= scale[2]\n    shear[1:] /= scale[2]\n\n    if numpy.dot(row[0], numpy.cross(row[1], row[2])) < 0:\n        numpy.negative(scale, scale)\n        numpy.negative(row, row)\n\n    angles[1] = math.asin(-row[0, 2])\n    if math.cos(angles[1]):\n        angles[0] = math.atan2(row[1, 2], row[2, 2])\n        angles[2] = math.atan2(row[0, 1], row[0, 0])\n    else:\n        # angles[0] = math.atan2(row[1, 0], row[1, 1])\n        angles[0] = math.atan2(-row[2, 1], row[1, 1])\n        angles[2] = 0.0\n\n    return scale, shear, angles, translate, perspective\n\n\ndef compose_matrix(scale=None, shear=None, angles=None, translate=None,\n                   perspective=None):\n    \"\"\"Return transformation matrix from sequence of transformations.\n\n    This is the inverse of the decompose_matrix function.\n\n    Sequence of transformations:\n        scale : vector of 3 scaling factors\n        shear : list of shear factors for x-y, x-z, y-z axes\n        angles : list of Euler angles about static x, y, z axes\n        translate : translation vector along x, y, z axes\n        perspective : perspective partition of matrix\n\n    >>> scale = numpy.random.random(3) - 0.5\n    >>> shear = numpy.random.random(3) - 0.5\n    >>> angles = (numpy.random.random(3) - 0.5) * (2*math.pi)\n    >>> trans = numpy.random.random(3) - 0.5\n    >>> persp = numpy.random.random(4) - 0.5\n    >>> M0 = compose_matrix(scale, shear, angles, trans, persp)\n    >>> result = decompose_matrix(M0)\n    >>> M1 = compose_matrix(*result)\n    >>> is_same_transform(M0, M1)\n    True\n\n    \"\"\"\n    M = numpy.identity(4)\n    if perspective is not None:\n        P = numpy.identity(4)\n        P[3, :] = perspective[:4]\n        M = numpy.dot(M, P)\n    if translate is not None:\n        T = numpy.identity(4)\n        T[:3, 3] = translate[:3]\n        M = numpy.dot(M, T)\n    if angles is not None:\n        R = euler_matrix(angles[0], angles[1], angles[2], 'sxyz')\n        M = numpy.dot(M, R)\n    if shear is not None:\n        Z = numpy.identity(4)\n        Z[1, 2] = shear[2]\n        Z[0, 2] = shear[1]\n        Z[0, 1] = shear[0]\n        M = numpy.dot(M, Z)\n    if scale is not None:\n        S = numpy.identity(4)\n        S[0, 0] = scale[0]\n        S[1, 1] = scale[1]\n        S[2, 2] = scale[2]\n        M = numpy.dot(M, S)\n    M /= M[3, 3]\n    return M\n\n\ndef orthogonalization_matrix(lengths, angles):\n    \"\"\"Return orthogonalization matrix for crystallographic cell coordinates.\n\n    Angles are expected in degrees.\n\n    The de-orthogonalization matrix is the inverse.\n\n    >>> O = orthogonalization_matrix([10, 10, 10], [90, 90, 90])\n    >>> numpy.allclose(O[:3, :3], numpy.identity(3, float) * 10)\n    True\n    >>> O = orthogonalization_matrix([9.8, 12.0, 15.5], [87.2, 80.7, 69.7])\n    >>> numpy.allclose(numpy.sum(O), 43.063229)\n    True\n\n    \"\"\"\n    a, b, c = lengths\n    angles = numpy.radians(angles)\n    sina, sinb, _ = numpy.sin(angles)\n    cosa, cosb, cosg = numpy.cos(angles)\n    co = (cosa * cosb - cosg) / (sina * sinb)\n    return numpy.array([\n        [ a*sinb*math.sqrt(1.0-co*co),  0.0,    0.0, 0.0],\n        [-a*sinb*co,                    b*sina, 0.0, 0.0],\n        [ a*cosb,                       b*cosa, c,   0.0],\n        [ 0.0,                          0.0,    0.0, 1.0]])\n\n\ndef affine_matrix_from_points(v0, v1, shear=True, scale=True, usesvd=True):\n    \"\"\"Return affine transform matrix to register two point sets.\n\n    v0 and v1 are shape (ndims, \\*) arrays of at least ndims non-homogeneous\n    coordinates, where ndims is the dimensionality of the coordinate space.\n\n    If shear is False, a similarity transformation matrix is returned.\n    If also scale is False, a rigid/Euclidean transformation matrix\n    is returned.\n\n    By default the algorithm by Hartley and Zissermann [15] is used.\n    If usesvd is True, similarity and Euclidean transformation matrices\n    are calculated by minimizing the weighted sum of squared deviations\n    (RMSD) according to the algorithm by Kabsch [8].\n    Otherwise, and if ndims is 3, the quaternion based algorithm by Horn [9]\n    is used, which is slower when using this Python implementation.\n\n    The returned matrix performs rotation, translation and uniform scaling\n    (if specified).\n\n    >>> v0 = [[0, 1031, 1031, 0], [0, 0, 1600, 1600]]\n    >>> v1 = [[675, 826, 826, 677], [55, 52, 281, 277]]\n    >>> affine_matrix_from_points(v0, v1)\n    array([[   0.14549,    0.00062,  675.50008],\n           [   0.00048,    0.14094,   53.24971],\n           [   0.     ,    0.     ,    1.     ]])\n    >>> T = translation_matrix(numpy.random.random(3)-0.5)\n    >>> R = random_rotation_matrix(numpy.random.random(3))\n    >>> S = scale_matrix(random.random())\n    >>> M = concatenate_matrices(T, R, S)\n    >>> v0 = (numpy.random.rand(4, 100) - 0.5) * 20\n    >>> v0[3] = 1\n    >>> v1 = numpy.dot(M, v0)\n    >>> v0[:3] += numpy.random.normal(0, 1e-8, 300).reshape(3, -1)\n    >>> M = affine_matrix_from_points(v0[:3], v1[:3])\n    >>> numpy.allclose(v1, numpy.dot(M, v0))\n    True\n\n    More examples in superimposition_matrix()\n\n    \"\"\"\n    v0 = numpy.array(v0, dtype=numpy.float64, copy=True)\n    v1 = numpy.array(v1, dtype=numpy.float64, copy=True)\n\n    ndims = v0.shape[0]\n    if ndims < 2 or v0.shape[1] < ndims or v0.shape != v1.shape:\n        raise ValueError('input arrays are of wrong shape or type')\n\n    # move centroids to origin\n    t0 = -numpy.mean(v0, axis=1)\n    M0 = numpy.identity(ndims+1)\n    M0[:ndims, ndims] = t0\n    v0 += t0.reshape(ndims, 1)\n    t1 = -numpy.mean(v1, axis=1)\n    M1 = numpy.identity(ndims+1)\n    M1[:ndims, ndims] = t1\n    v1 += t1.reshape(ndims, 1)\n\n    if shear:\n        # Affine transformation\n        A = numpy.concatenate((v0, v1), axis=0)\n        u, s, vh = numpy.linalg.svd(A.T)\n        vh = vh[:ndims].T\n        B = vh[:ndims]\n        C = vh[ndims:2*ndims]\n        t = numpy.dot(C, numpy.linalg.pinv(B))\n        t = numpy.concatenate((t, numpy.zeros((ndims, 1))), axis=1)\n        M = numpy.vstack((t, ((0.0,)*ndims) + (1.0,)))\n    elif usesvd or ndims != 3:\n        # Rigid transformation via SVD of covariance matrix\n        u, s, vh = numpy.linalg.svd(numpy.dot(v1, v0.T))\n        # rotation matrix from SVD orthonormal bases\n        R = numpy.dot(u, vh)\n        if numpy.linalg.det(R) < 0.0:\n            # R does not constitute right handed system\n            R -= numpy.outer(u[:, ndims-1], vh[ndims-1, :]*2.0)\n            s[-1] *= -1.0\n        # homogeneous transformation matrix\n        M = numpy.identity(ndims+1)\n        M[:ndims, :ndims] = R\n    else:\n        # Rigid transformation matrix via quaternion\n        # compute symmetric matrix N\n        xx, yy, zz = numpy.sum(v0 * v1, axis=1)\n        xy, yz, zx = numpy.sum(v0 * numpy.roll(v1, -1, axis=0), axis=1)\n        xz, yx, zy = numpy.sum(v0 * numpy.roll(v1, -2, axis=0), axis=1)\n        N = [[xx+yy+zz, 0.0,      0.0,      0.0],\n             [yz-zy,    xx-yy-zz, 0.0,      0.0],\n             [zx-xz,    xy+yx,    yy-xx-zz, 0.0],\n             [xy-yx,    zx+xz,    yz+zy,    zz-xx-yy]]\n        # quaternion: eigenvector corresponding to most positive eigenvalue\n        w, V = numpy.linalg.eigh(N)\n        q = V[:, numpy.argmax(w)]\n        q /= vector_norm(q)  # unit quaternion\n        # homogeneous transformation matrix\n        M = quaternion_matrix(q)\n\n    if scale and not shear:\n        # Affine transformation; scale is ratio of RMS deviations from centroid\n        v0 *= v0\n        v1 *= v1\n        M[:ndims, :ndims] *= math.sqrt(numpy.sum(v1) / numpy.sum(v0))\n\n    # move centroids back\n    M = numpy.dot(numpy.linalg.inv(M1), numpy.dot(M, M0))\n    M /= M[ndims, ndims]\n    return M\n\n\ndef superimposition_matrix(v0, v1, scale=False, usesvd=True):\n    \"\"\"Return matrix to transform given 3D point set into second point set.\n\n    v0 and v1 are shape (3, \\*) or (4, \\*) arrays of at least 3 points.\n\n    The parameters scale and usesvd are explained in the more general\n    affine_matrix_from_points function.\n\n    The returned matrix is a similarity or Euclidean transformation matrix.\n    This function has a fast C implementation in transformations.c.\n\n    >>> v0 = numpy.random.rand(3, 10)\n    >>> M = superimposition_matrix(v0, v0)\n    >>> numpy.allclose(M, numpy.identity(4))\n    True\n    >>> R = random_rotation_matrix(numpy.random.random(3))\n    >>> v0 = [[1,0,0], [0,1,0], [0,0,1], [1,1,1]]\n    >>> v1 = numpy.dot(R, v0)\n    >>> M = superimposition_matrix(v0, v1)\n    >>> numpy.allclose(v1, numpy.dot(M, v0))\n    True\n    >>> v0 = (numpy.random.rand(4, 100) - 0.5) * 20\n    >>> v0[3] = 1\n    >>> v1 = numpy.dot(R, v0)\n    >>> M = superimposition_matrix(v0, v1)\n    >>> numpy.allclose(v1, numpy.dot(M, v0))\n    True\n    >>> S = scale_matrix(random.random())\n    >>> T = translation_matrix(numpy.random.random(3)-0.5)\n    >>> M = concatenate_matrices(T, R, S)\n    >>> v1 = numpy.dot(M, v0)\n    >>> v0[:3] += numpy.random.normal(0, 1e-9, 300).reshape(3, -1)\n    >>> M = superimposition_matrix(v0, v1, scale=True)\n    >>> numpy.allclose(v1, numpy.dot(M, v0))\n    True\n    >>> M = superimposition_matrix(v0, v1, scale=True, usesvd=False)\n    >>> numpy.allclose(v1, numpy.dot(M, v0))\n    True\n    >>> v = numpy.empty((4, 100, 3))\n    >>> v[:, :, 0] = v0\n    >>> M = superimposition_matrix(v0, v1, scale=True, usesvd=False)\n    >>> numpy.allclose(v1, numpy.dot(M, v[:, :, 0]))\n    True\n\n    \"\"\"\n    v0 = numpy.array(v0, dtype=numpy.float64, copy=False)[:3]\n    v1 = numpy.array(v1, dtype=numpy.float64, copy=False)[:3]\n    return affine_matrix_from_points(v0, v1, shear=False,\n                                     scale=scale, usesvd=usesvd)\n\n\ndef euler_matrix(ai, aj, ak, axes='sxyz'):\n    \"\"\"Return homogeneous rotation matrix from Euler angles and axis sequence.\n\n    ai, aj, ak : Euler's roll, pitch and yaw angles\n    axes : One of 24 axis sequences as string or encoded tuple\n\n    >>> R = euler_matrix(1, 2, 3, 'syxz')\n    >>> numpy.allclose(numpy.sum(R[0]), -1.34786452)\n    True\n    >>> R = euler_matrix(1, 2, 3, (0, 1, 0, 1))\n    >>> numpy.allclose(numpy.sum(R[0]), -0.383436184)\n    True\n    >>> ai, aj, ak = (4*math.pi) * (numpy.random.random(3) - 0.5)\n    >>> for axes in _AXES2TUPLE.keys():\n    ...    R = euler_matrix(ai, aj, ak, axes)\n    >>> for axes in _TUPLE2AXES.keys():\n    ...    R = euler_matrix(ai, aj, ak, axes)\n\n    \"\"\"\n    try:\n        firstaxis, parity, repetition, frame = _AXES2TUPLE[axes]\n    except (AttributeError, KeyError):\n        _TUPLE2AXES[axes]  # validation\n        firstaxis, parity, repetition, frame = axes\n\n    i = firstaxis\n    j = _NEXT_AXIS[i+parity]\n    k = _NEXT_AXIS[i-parity+1]\n\n    if frame:\n        ai, ak = ak, ai\n    if parity:\n        ai, aj, ak = -ai, -aj, -ak\n\n    si, sj, sk = math.sin(ai), math.sin(aj), math.sin(ak)\n    ci, cj, ck = math.cos(ai), math.cos(aj), math.cos(ak)\n    cc, cs = ci*ck, ci*sk\n    sc, ss = si*ck, si*sk\n\n    M = numpy.identity(4)\n    if repetition:\n        M[i, i] = cj\n        M[i, j] = sj*si\n        M[i, k] = sj*ci\n        M[j, i] = sj*sk\n        M[j, j] = -cj*ss+cc\n        M[j, k] = -cj*cs-sc\n        M[k, i] = -sj*ck\n        M[k, j] = cj*sc+cs\n        M[k, k] = cj*cc-ss\n    else:\n        M[i, i] = cj*ck\n        M[i, j] = sj*sc-cs\n        M[i, k] = sj*cc+ss\n        M[j, i] = cj*sk\n        M[j, j] = sj*ss+cc\n        M[j, k] = sj*cs-sc\n        M[k, i] = -sj\n        M[k, j] = cj*si\n        M[k, k] = cj*ci\n    return M\n\n\ndef euler_from_matrix(matrix, axes='sxyz'):\n    \"\"\"Return Euler angles from rotation matrix for specified axis sequence.\n\n    axes : One of 24 axis sequences as string or encoded tuple\n\n    Note that many Euler angle triplets can describe one matrix.\n\n    >>> R0 = euler_matrix(1, 2, 3, 'syxz')\n    >>> al, be, ga = euler_from_matrix(R0, 'syxz')\n    >>> R1 = euler_matrix(al, be, ga, 'syxz')\n    >>> numpy.allclose(R0, R1)\n    True\n    >>> angles = (4*math.pi) * (numpy.random.random(3) - 0.5)\n    >>> for axes in _AXES2TUPLE.keys():\n    ...    R0 = euler_matrix(axes=axes, *angles)\n    ...    R1 = euler_matrix(axes=axes, *euler_from_matrix(R0, axes))\n    ...    if not numpy.allclose(R0, R1): print(axes, \"failed\")\n\n    \"\"\"\n    try:\n        firstaxis, parity, repetition, frame = _AXES2TUPLE[axes.lower()]\n    except (AttributeError, KeyError):\n        _TUPLE2AXES[axes]  # validation\n        firstaxis, parity, repetition, frame = axes\n\n    i = firstaxis\n    j = _NEXT_AXIS[i+parity]\n    k = _NEXT_AXIS[i-parity+1]\n\n    M = numpy.array(matrix, dtype=numpy.float64, copy=False)[:3, :3]\n    if repetition:\n        sy = math.sqrt(M[i, j]*M[i, j] + M[i, k]*M[i, k])\n        if sy > _EPS:\n            ax = math.atan2( M[i, j],  M[i, k])\n            ay = math.atan2( sy,       M[i, i])\n            az = math.atan2( M[j, i], -M[k, i])\n        else:\n            ax = math.atan2(-M[j, k],  M[j, j])\n            ay = math.atan2( sy,       M[i, i])\n            az = 0.0\n    else:\n        cy = math.sqrt(M[i, i]*M[i, i] + M[j, i]*M[j, i])\n        if cy > _EPS:\n            ax = math.atan2( M[k, j],  M[k, k])\n            ay = math.atan2(-M[k, i],  cy)\n            az = math.atan2( M[j, i],  M[i, i])\n        else:\n            ax = math.atan2(-M[j, k],  M[j, j])\n            ay = math.atan2(-M[k, i],  cy)\n            az = 0.0\n\n    if parity:\n        ax, ay, az = -ax, -ay, -az\n    if frame:\n        ax, az = az, ax\n    return ax, ay, az\n\n\ndef euler_from_quaternion(quaternion, axes='sxyz'):\n    \"\"\"Return Euler angles from quaternion for specified axis sequence.\n\n    >>> angles = euler_from_quaternion([0.99810947, 0.06146124, 0, 0])\n    >>> numpy.allclose(angles, [0.123, 0, 0])\n    True\n\n    \"\"\"\n    return euler_from_matrix(quaternion_matrix(quaternion), axes)\n\n\ndef quaternion_from_euler(ai, aj, ak, axes='sxyz'):\n    \"\"\"Return quaternion from Euler angles and axis sequence.\n\n    ai, aj, ak : Euler's roll, pitch and yaw angles\n    axes : One of 24 axis sequences as string or encoded tuple\n\n    >>> q = quaternion_from_euler(1, 2, 3, 'ryxz')\n    >>> numpy.allclose(q, [0.435953, 0.310622, -0.718287, 0.444435])\n    True\n\n    \"\"\"\n    try:\n        firstaxis, parity, repetition, frame = _AXES2TUPLE[axes.lower()]\n    except (AttributeError, KeyError):\n        _TUPLE2AXES[axes]  # validation\n        firstaxis, parity, repetition, frame = axes\n\n    i = firstaxis + 1\n    j = _NEXT_AXIS[i+parity-1] + 1\n    k = _NEXT_AXIS[i-parity] + 1\n\n    if frame:\n        ai, ak = ak, ai\n    if parity:\n        aj = -aj\n\n    ai /= 2.0\n    aj /= 2.0\n    ak /= 2.0\n    ci = math.cos(ai)\n    si = math.sin(ai)\n    cj = math.cos(aj)\n    sj = math.sin(aj)\n    ck = math.cos(ak)\n    sk = math.sin(ak)\n    cc = ci*ck\n    cs = ci*sk\n    sc = si*ck\n    ss = si*sk\n\n    q = numpy.empty((4, ))\n    if repetition:\n        q[0] = cj*(cc - ss)\n        q[i] = cj*(cs + sc)\n        q[j] = sj*(cc + ss)\n        q[k] = sj*(cs - sc)\n    else:\n        q[0] = cj*cc + sj*ss\n        q[i] = cj*sc - sj*cs\n        q[j] = cj*ss + sj*cc\n        q[k] = cj*cs - sj*sc\n    if parity:\n        q[j] *= -1.0\n\n    return q\n\n\ndef quaternion_about_axis(angle, axis):\n    \"\"\"Return quaternion for rotation about axis.\n\n    >>> q = quaternion_about_axis(0.123, [1, 0, 0])\n    >>> numpy.allclose(q, [0.99810947, 0.06146124, 0, 0])\n    True\n\n    \"\"\"\n    q = numpy.array([0.0, axis[0], axis[1], axis[2]])\n    qlen = vector_norm(q)\n    if qlen > _EPS:\n        q *= math.sin(angle/2.0) / qlen\n    q[0] = math.cos(angle/2.0)\n    return q\n\n\ndef quaternion_matrix(quaternion):\n    \"\"\"Return homogeneous rotation matrix from quaternion.\n\n    >>> M = quaternion_matrix([0.99810947, 0.06146124, 0, 0])\n    >>> numpy.allclose(M, rotation_matrix(0.123, [1, 0, 0]))\n    True\n    >>> M = quaternion_matrix([1, 0, 0, 0])\n    >>> numpy.allclose(M, numpy.identity(4))\n    True\n    >>> M = quaternion_matrix([0, 1, 0, 0])\n    >>> numpy.allclose(M, numpy.diag([1, -1, -1, 1]))\n    True\n\n    \"\"\"\n    q = numpy.array(quaternion, dtype=numpy.float64, copy=True)\n    n = numpy.dot(q, q)\n    if n < _EPS:\n        return numpy.identity(4)\n    q *= math.sqrt(2.0 / n)\n    q = numpy.outer(q, q)\n    return numpy.array([\n        [1.0-q[2, 2]-q[3, 3],     q[1, 2]-q[3, 0],     q[1, 3]+q[2, 0], 0.0],\n        [    q[1, 2]+q[3, 0], 1.0-q[1, 1]-q[3, 3],     q[2, 3]-q[1, 0], 0.0],\n        [    q[1, 3]-q[2, 0],     q[2, 3]+q[1, 0], 1.0-q[1, 1]-q[2, 2], 0.0],\n        [                0.0,                 0.0,                 0.0, 1.0]])\n\n\ndef quaternion_from_matrix(matrix, isprecise=False):\n    \"\"\"Return quaternion from rotation matrix.\n\n    If isprecise is True, the input matrix is assumed to be a precise rotation\n    matrix and a faster algorithm is used.\n\n    >>> q = quaternion_from_matrix(numpy.identity(4), True)\n    >>> numpy.allclose(q, [1, 0, 0, 0])\n    True\n    >>> q = quaternion_from_matrix(numpy.diag([1, -1, -1, 1]))\n    >>> numpy.allclose(q, [0, 1, 0, 0]) or numpy.allclose(q, [0, -1, 0, 0])\n    True\n    >>> R = rotation_matrix(0.123, (1, 2, 3))\n    >>> q = quaternion_from_matrix(R, True)\n    >>> numpy.allclose(q, [0.9981095, 0.0164262, 0.0328524, 0.0492786])\n    True\n    >>> R = [[-0.545, 0.797, 0.260, 0], [0.733, 0.603, -0.313, 0],\n    ...      [-0.407, 0.021, -0.913, 0], [0, 0, 0, 1]]\n    >>> q = quaternion_from_matrix(R)\n    >>> numpy.allclose(q, [0.19069, 0.43736, 0.87485, -0.083611])\n    True\n    >>> R = [[0.395, 0.362, 0.843, 0], [-0.626, 0.796, -0.056, 0],\n    ...      [-0.677, -0.498, 0.529, 0], [0, 0, 0, 1]]\n    >>> q = quaternion_from_matrix(R)\n    >>> numpy.allclose(q, [0.82336615, -0.13610694, 0.46344705, -0.29792603])\n    True\n    >>> R = random_rotation_matrix()\n    >>> q = quaternion_from_matrix(R)\n    >>> is_same_transform(R, quaternion_matrix(q))\n    True\n    >>> is_same_quaternion(quaternion_from_matrix(R, isprecise=False),\n    ...                    quaternion_from_matrix(R, isprecise=True))\n    True\n    >>> R = euler_matrix(0.0, 0.0, numpy.pi/2.0)\n    >>> is_same_quaternion(quaternion_from_matrix(R, isprecise=False),\n    ...                    quaternion_from_matrix(R, isprecise=True))\n    True\n\n    \"\"\"\n    M = numpy.array(matrix, dtype=numpy.float64, copy=False)[:4, :4]\n    if isprecise:\n        q = numpy.empty((4, ))\n        t = numpy.trace(M)\n        if t > M[3, 3]:\n            q[0] = t\n            q[3] = M[1, 0] - M[0, 1]\n            q[2] = M[0, 2] - M[2, 0]\n            q[1] = M[2, 1] - M[1, 2]\n        else:\n            i, j, k = 0, 1, 2\n            if M[1, 1] > M[0, 0]:\n                i, j, k = 1, 2, 0\n            if M[2, 2] > M[i, i]:\n                i, j, k = 2, 0, 1\n            t = M[i, i] - (M[j, j] + M[k, k]) + M[3, 3]\n            q[i] = t\n            q[j] = M[i, j] + M[j, i]\n            q[k] = M[k, i] + M[i, k]\n            q[3] = M[k, j] - M[j, k]\n            q = q[[3, 0, 1, 2]]\n        q *= 0.5 / math.sqrt(t * M[3, 3])\n    else:\n        m00 = M[0, 0]\n        m01 = M[0, 1]\n        m02 = M[0, 2]\n        m10 = M[1, 0]\n        m11 = M[1, 1]\n        m12 = M[1, 2]\n        m20 = M[2, 0]\n        m21 = M[2, 1]\n        m22 = M[2, 2]\n        # symmetric matrix K\n        K = numpy.array([[m00-m11-m22, 0.0,         0.0,         0.0],\n                         [m01+m10,     m11-m00-m22, 0.0,         0.0],\n                         [m02+m20,     m12+m21,     m22-m00-m11, 0.0],\n                         [m21-m12,     m02-m20,     m10-m01,     m00+m11+m22]])\n        K /= 3.0\n        # quaternion is eigenvector of K that corresponds to largest eigenvalue\n        w, V = numpy.linalg.eigh(K)\n        q = V[[3, 0, 1, 2], numpy.argmax(w)]\n    if q[0] < 0.0:\n        numpy.negative(q, q)\n    return q\n\n\ndef quaternion_multiply(quaternion1, quaternion0):\n    \"\"\"Return multiplication of two quaternions.\n\n    >>> q = quaternion_multiply([4, 1, -2, 3], [8, -5, 6, 7])\n    >>> numpy.allclose(q, [28, -44, -14, 48])\n    True\n\n    \"\"\"\n    w0, x0, y0, z0 = quaternion0\n    w1, x1, y1, z1 = quaternion1\n    return numpy.array([\n        -x1*x0 - y1*y0 - z1*z0 + w1*w0,\n        x1*w0 + y1*z0 - z1*y0 + w1*x0,\n        -x1*z0 + y1*w0 + z1*x0 + w1*y0,\n        x1*y0 - y1*x0 + z1*w0 + w1*z0], dtype=numpy.float64)\n\n\ndef quaternion_conjugate(quaternion):\n    \"\"\"Return conjugate of quaternion.\n\n    >>> q0 = random_quaternion()\n    >>> q1 = quaternion_conjugate(q0)\n    >>> q1[0] == q0[0] and all(q1[1:] == -q0[1:])\n    True\n\n    \"\"\"\n    q = numpy.array(quaternion, dtype=numpy.float64, copy=True)\n    numpy.negative(q[1:], q[1:])\n    return q\n\n\ndef quaternion_inverse(quaternion):\n    \"\"\"Return inverse of quaternion.\n\n    >>> q0 = random_quaternion()\n    >>> q1 = quaternion_inverse(q0)\n    >>> numpy.allclose(quaternion_multiply(q0, q1), [1, 0, 0, 0])\n    True\n\n    \"\"\"\n    q = numpy.array(quaternion, dtype=numpy.float64, copy=True)\n    numpy.negative(q[1:], q[1:])\n    return q / numpy.dot(q, q)\n\n\ndef quaternion_real(quaternion):\n    \"\"\"Return real part of quaternion.\n\n    >>> quaternion_real([3, 0, 1, 2])\n    3.0\n\n    \"\"\"\n    return float(quaternion[0])\n\n\ndef quaternion_imag(quaternion):\n    \"\"\"Return imaginary part of quaternion.\n\n    >>> quaternion_imag([3, 0, 1, 2])\n    array([ 0.,  1.,  2.])\n\n    \"\"\"\n    return numpy.array(quaternion[1:4], dtype=numpy.float64, copy=True)\n\n\ndef quaternion_slerp(quat0, quat1, fraction, spin=0, shortestpath=True):\n    \"\"\"Return spherical linear interpolation between two quaternions.\n\n    >>> q0 = random_quaternion()\n    >>> q1 = random_quaternion()\n    >>> q = quaternion_slerp(q0, q1, 0)\n    >>> numpy.allclose(q, q0)\n    True\n    >>> q = quaternion_slerp(q0, q1, 1, 1)\n    >>> numpy.allclose(q, q1)\n    True\n    >>> q = quaternion_slerp(q0, q1, 0.5)\n    >>> angle = math.acos(numpy.dot(q0, q))\n    >>> numpy.allclose(2, math.acos(numpy.dot(q0, q1)) / angle) or \\\n        numpy.allclose(2, math.acos(-numpy.dot(q0, q1)) / angle)\n    True\n\n    \"\"\"\n    q0 = unit_vector(quat0[:4])\n    q1 = unit_vector(quat1[:4])\n    if fraction == 0.0:\n        return q0\n    elif fraction == 1.0:\n        return q1\n    d = numpy.dot(q0, q1)\n    if abs(abs(d) - 1.0) < _EPS:\n        return q0\n    if shortestpath and d < 0.0:\n        # invert rotation\n        d = -d\n        numpy.negative(q1, q1)\n    angle = math.acos(d) + spin * math.pi\n    if abs(angle) < _EPS:\n        return q0\n    isin = 1.0 / math.sin(angle)\n    q0 *= math.sin((1.0 - fraction) * angle) * isin\n    q1 *= math.sin(fraction * angle) * isin\n    q0 += q1\n    return q0\n\n\ndef random_quaternion(rand=None):\n    \"\"\"Return uniform random unit quaternion.\n\n    rand: array like or None\n        Three independent random variables that are uniformly distributed\n        between 0 and 1.\n\n    >>> q = random_quaternion()\n    >>> numpy.allclose(1, vector_norm(q))\n    True\n    >>> q = random_quaternion(numpy.random.random(3))\n    >>> len(q.shape), q.shape[0]==4\n    (1, True)\n\n    \"\"\"\n    if rand is None:\n        rand = numpy.random.rand(3)\n    else:\n        assert len(rand) == 3\n    r1 = numpy.sqrt(1.0 - rand[0])\n    r2 = numpy.sqrt(rand[0])\n    pi2 = math.pi * 2.0\n    t1 = pi2 * rand[1]\n    t2 = pi2 * rand[2]\n    return numpy.array([numpy.cos(t2)*r2, numpy.sin(t1)*r1,\n                        numpy.cos(t1)*r1, numpy.sin(t2)*r2])\n\n\ndef random_rotation_matrix(rand=None):\n    \"\"\"Return uniform random rotation matrix.\n\n    rand: array like\n        Three independent random variables that are uniformly distributed\n        between 0 and 1 for each returned quaternion.\n\n    >>> R = random_rotation_matrix()\n    >>> numpy.allclose(numpy.dot(R.T, R), numpy.identity(4))\n    True\n\n    \"\"\"\n    return quaternion_matrix(random_quaternion(rand))\n\n\nclass Arcball(object):\n    \"\"\"Virtual Trackball Control.\n\n    >>> ball = Arcball()\n    >>> ball = Arcball(initial=numpy.identity(4))\n    >>> ball.place([320, 320], 320)\n    >>> ball.down([500, 250])\n    >>> ball.drag([475, 275])\n    >>> R = ball.matrix()\n    >>> numpy.allclose(numpy.sum(R), 3.90583455)\n    True\n    >>> ball = Arcball(initial=[1, 0, 0, 0])\n    >>> ball.place([320, 320], 320)\n    >>> ball.setaxes([1, 1, 0], [-1, 1, 0])\n    >>> ball.constrain = True\n    >>> ball.down([400, 200])\n    >>> ball.drag([200, 400])\n    >>> R = ball.matrix()\n    >>> numpy.allclose(numpy.sum(R), 0.2055924)\n    True\n    >>> ball.next()\n\n    \"\"\"\n    def __init__(self, initial=None):\n        \"\"\"Initialize virtual trackball control.\n\n        initial : quaternion or rotation matrix\n\n        \"\"\"\n        self._axis = None\n        self._axes = None\n        self._radius = 1.0\n        self._center = [0.0, 0.0]\n        self._vdown = numpy.array([0.0, 0.0, 1.0])\n        self._constrain = False\n        if initial is None:\n            self._qdown = numpy.array([1.0, 0.0, 0.0, 0.0])\n        else:\n            initial = numpy.array(initial, dtype=numpy.float64)\n            if initial.shape == (4, 4):\n                self._qdown = quaternion_from_matrix(initial)\n            elif initial.shape == (4, ):\n                initial /= vector_norm(initial)\n                self._qdown = initial\n            else:\n                raise ValueError(\"initial not a quaternion or matrix\")\n        self._qnow = self._qpre = self._qdown\n\n    def place(self, center, radius):\n        \"\"\"Place Arcball, e.g. when window size changes.\n\n        center : sequence[2]\n            Window coordinates of trackball center.\n        radius : float\n            Radius of trackball in window coordinates.\n\n        \"\"\"\n        self._radius = float(radius)\n        self._center[0] = center[0]\n        self._center[1] = center[1]\n\n    def setaxes(self, *axes):\n        \"\"\"Set axes to constrain rotations.\"\"\"\n        if axes is None:\n            self._axes = None\n        else:\n            self._axes = [unit_vector(axis) for axis in axes]\n\n    @property\n    def constrain(self):\n        \"\"\"Return state of constrain to axis mode.\"\"\"\n        return self._constrain\n\n    @constrain.setter\n    def constrain(self, value):\n        \"\"\"Set state of constrain to axis mode.\"\"\"\n        self._constrain = bool(value)\n\n    def down(self, point):\n        \"\"\"Set initial cursor window coordinates and pick constrain-axis.\"\"\"\n        self._vdown = arcball_map_to_sphere(point, self._center, self._radius)\n        self._qdown = self._qpre = self._qnow\n        if self._constrain and self._axes is not None:\n            self._axis = arcball_nearest_axis(self._vdown, self._axes)\n            self._vdown = arcball_constrain_to_axis(self._vdown, self._axis)\n        else:\n            self._axis = None\n\n    def drag(self, point):\n        \"\"\"Update current cursor window coordinates.\"\"\"\n        vnow = arcball_map_to_sphere(point, self._center, self._radius)\n        if self._axis is not None:\n            vnow = arcball_constrain_to_axis(vnow, self._axis)\n        self._qpre = self._qnow\n        t = numpy.cross(self._vdown, vnow)\n        if numpy.dot(t, t) < _EPS:\n            self._qnow = self._qdown\n        else:\n            q = [numpy.dot(self._vdown, vnow), t[0], t[1], t[2]]\n            self._qnow = quaternion_multiply(q, self._qdown)\n\n    def next(self, acceleration=0.0):\n        \"\"\"Continue rotation in direction of last drag.\"\"\"\n        q = quaternion_slerp(self._qpre, self._qnow, 2.0+acceleration, False)\n        self._qpre, self._qnow = self._qnow, q\n\n    def matrix(self):\n        \"\"\"Return homogeneous rotation matrix.\"\"\"\n        return quaternion_matrix(self._qnow)\n\n\ndef arcball_map_to_sphere(point, center, radius):\n    \"\"\"Return unit sphere coordinates from window coordinates.\"\"\"\n    v0 = (point[0] - center[0]) / radius\n    v1 = (center[1] - point[1]) / radius\n    n = v0*v0 + v1*v1\n    if n > 1.0:\n        # position outside of sphere\n        n = math.sqrt(n)\n        return numpy.array([v0/n, v1/n, 0.0])\n    else:\n        return numpy.array([v0, v1, math.sqrt(1.0 - n)])\n\n\ndef arcball_constrain_to_axis(point, axis):\n    \"\"\"Return sphere point perpendicular to axis.\"\"\"\n    v = numpy.array(point, dtype=numpy.float64, copy=True)\n    a = numpy.array(axis, dtype=numpy.float64, copy=True)\n    v -= a * numpy.dot(a, v)  # on plane\n    n = vector_norm(v)\n    if n > _EPS:\n        if v[2] < 0.0:\n            numpy.negative(v, v)\n        v /= n\n        return v\n    if a[2] == 1.0:\n        return numpy.array([1.0, 0.0, 0.0])\n    return unit_vector([-a[1], a[0], 0.0])\n\n\ndef arcball_nearest_axis(point, axes):\n    \"\"\"Return axis, which arc is nearest to point.\"\"\"\n    point = numpy.array(point, dtype=numpy.float64, copy=False)\n    nearest = None\n    mx = -1.0\n    for axis in axes:\n        t = numpy.dot(arcball_constrain_to_axis(point, axis), point)\n        if t > mx:\n            nearest = axis\n            mx = t\n    return nearest\n\n\n# epsilon for testing whether a number is close to zero\n_EPS = numpy.finfo(float).eps * 4.0\n\n# axis sequences for Euler angles\n_NEXT_AXIS = [1, 2, 0, 1]\n\n# map axes strings to/from tuples of inner axis, parity, repetition, frame\n_AXES2TUPLE = {\n    'sxyz': (0, 0, 0, 0), 'sxyx': (0, 0, 1, 0), 'sxzy': (0, 1, 0, 0),\n    'sxzx': (0, 1, 1, 0), 'syzx': (1, 0, 0, 0), 'syzy': (1, 0, 1, 0),\n    'syxz': (1, 1, 0, 0), 'syxy': (1, 1, 1, 0), 'szxy': (2, 0, 0, 0),\n    'szxz': (2, 0, 1, 0), 'szyx': (2, 1, 0, 0), 'szyz': (2, 1, 1, 0),\n    'rzyx': (0, 0, 0, 1), 'rxyx': (0, 0, 1, 1), 'ryzx': (0, 1, 0, 1),\n    'rxzx': (0, 1, 1, 1), 'rxzy': (1, 0, 0, 1), 'ryzy': (1, 0, 1, 1),\n    'rzxy': (1, 1, 0, 1), 'ryxy': (1, 1, 1, 1), 'ryxz': (2, 0, 0, 1),\n    'rzxz': (2, 0, 1, 1), 'rxyz': (2, 1, 0, 1), 'rzyz': (2, 1, 1, 1)}\n\n_TUPLE2AXES = dict((v, k) for k, v in _AXES2TUPLE.items())\n\n\ndef vector_norm(data, axis=None, out=None):\n    \"\"\"Return length, i.e. Euclidean norm, of ndarray along axis.\n\n    >>> v = numpy.random.random(3)\n    >>> n = vector_norm(v)\n    >>> numpy.allclose(n, numpy.linalg.norm(v))\n    True\n    >>> v = numpy.random.rand(6, 5, 3)\n    >>> n = vector_norm(v, axis=-1)\n    >>> numpy.allclose(n, numpy.sqrt(numpy.sum(v*v, axis=2)))\n    True\n    >>> n = vector_norm(v, axis=1)\n    >>> numpy.allclose(n, numpy.sqrt(numpy.sum(v*v, axis=1)))\n    True\n    >>> v = numpy.random.rand(5, 4, 3)\n    >>> n = numpy.empty((5, 3))\n    >>> vector_norm(v, axis=1, out=n)\n    >>> numpy.allclose(n, numpy.sqrt(numpy.sum(v*v, axis=1)))\n    True\n    >>> vector_norm([])\n    0.0\n    >>> vector_norm([1])\n    1.0\n\n    \"\"\"\n    data = numpy.array(data, dtype=numpy.float64, copy=True)\n    if out is None:\n        if data.ndim == 1:\n            return math.sqrt(numpy.dot(data, data))\n        data *= data\n        out = numpy.atleast_1d(numpy.sum(data, axis=axis))\n        numpy.sqrt(out, out)\n        return out\n    else:\n        data *= data\n        numpy.sum(data, axis=axis, out=out)\n        numpy.sqrt(out, out)\n\n\ndef unit_vector(data, axis=None, out=None):\n    \"\"\"Return ndarray normalized by length, i.e. Euclidean norm, along axis.\n\n    >>> v0 = numpy.random.random(3)\n    >>> v1 = unit_vector(v0)\n    >>> numpy.allclose(v1, v0 / numpy.linalg.norm(v0))\n    True\n    >>> v0 = numpy.random.rand(5, 4, 3)\n    >>> v1 = unit_vector(v0, axis=-1)\n    >>> v2 = v0 / numpy.expand_dims(numpy.sqrt(numpy.sum(v0*v0, axis=2)), 2)\n    >>> numpy.allclose(v1, v2)\n    True\n    >>> v1 = unit_vector(v0, axis=1)\n    >>> v2 = v0 / numpy.expand_dims(numpy.sqrt(numpy.sum(v0*v0, axis=1)), 1)\n    >>> numpy.allclose(v1, v2)\n    True\n    >>> v1 = numpy.empty((5, 4, 3))\n    >>> unit_vector(v0, axis=1, out=v1)\n    >>> numpy.allclose(v1, v2)\n    True\n    >>> list(unit_vector([]))\n    []\n    >>> list(unit_vector([1]))\n    [1.0]\n\n    \"\"\"\n    if out is None:\n        data = numpy.array(data, dtype=numpy.float64, copy=True)\n        if data.ndim == 1:\n            data /= math.sqrt(numpy.dot(data, data))\n            return data\n    else:\n        if out is not data:\n            out[:] = numpy.array(data, copy=False)\n        data = out\n    length = numpy.atleast_1d(numpy.sum(data*data, axis))\n    numpy.sqrt(length, length)\n    if axis is not None:\n        length = numpy.expand_dims(length, axis)\n    data /= length\n    if out is None:\n        return data\n\n\ndef random_vector(size):\n    \"\"\"Return array of random doubles in the half-open interval [0.0, 1.0).\n\n    >>> v = random_vector(10000)\n    >>> numpy.all(v >= 0) and numpy.all(v < 1)\n    True\n    >>> v0 = random_vector(10)\n    >>> v1 = random_vector(10)\n    >>> numpy.any(v0 == v1)\n    False\n\n    \"\"\"\n    return numpy.random.random(size)\n\n\ndef vector_product(v0, v1, axis=0):\n    \"\"\"Return vector perpendicular to vectors.\n\n    >>> v = vector_product([2, 0, 0], [0, 3, 0])\n    >>> numpy.allclose(v, [0, 0, 6])\n    True\n    >>> v0 = [[2, 0, 0, 2], [0, 2, 0, 2], [0, 0, 2, 2]]\n    >>> v1 = [[3], [0], [0]]\n    >>> v = vector_product(v0, v1)\n    >>> numpy.allclose(v, [[0, 0, 0, 0], [0, 0, 6, 6], [0, -6, 0, -6]])\n    True\n    >>> v0 = [[2, 0, 0], [2, 0, 0], [0, 2, 0], [2, 0, 0]]\n    >>> v1 = [[0, 3, 0], [0, 0, 3], [0, 0, 3], [3, 3, 3]]\n    >>> v = vector_product(v0, v1, axis=1)\n    >>> numpy.allclose(v, [[0, 0, 6], [0, -6, 0], [6, 0, 0], [0, -6, 6]])\n    True\n\n    \"\"\"\n    return numpy.cross(v0, v1, axis=axis)\n\n\ndef angle_between_vectors(v0, v1, directed=True, axis=0):\n    \"\"\"Return angle between vectors.\n\n    If directed is False, the input vectors are interpreted as undirected axes,\n    i.e. the maximum angle is pi/2.\n\n    >>> a = angle_between_vectors([1, -2, 3], [-1, 2, -3])\n    >>> numpy.allclose(a, math.pi)\n    True\n    >>> a = angle_between_vectors([1, -2, 3], [-1, 2, -3], directed=False)\n    >>> numpy.allclose(a, 0)\n    True\n    >>> v0 = [[2, 0, 0, 2], [0, 2, 0, 2], [0, 0, 2, 2]]\n    >>> v1 = [[3], [0], [0]]\n    >>> a = angle_between_vectors(v0, v1)\n    >>> numpy.allclose(a, [0, 1.5708, 1.5708, 0.95532])\n    True\n    >>> v0 = [[2, 0, 0], [2, 0, 0], [0, 2, 0], [2, 0, 0]]\n    >>> v1 = [[0, 3, 0], [0, 0, 3], [0, 0, 3], [3, 3, 3]]\n    >>> a = angle_between_vectors(v0, v1, axis=1)\n    >>> numpy.allclose(a, [1.5708, 1.5708, 1.5708, 0.95532])\n    True\n\n    \"\"\"\n    v0 = numpy.array(v0, dtype=numpy.float64, copy=False)\n    v1 = numpy.array(v1, dtype=numpy.float64, copy=False)\n    dot = numpy.sum(v0 * v1, axis=axis)\n    dot /= vector_norm(v0, axis=axis) * vector_norm(v1, axis=axis)\n    dot = numpy.clip(dot, -1.0, 1.0)\n    return numpy.arccos(dot if directed else numpy.fabs(dot))\n\n\ndef inverse_matrix(matrix):\n    \"\"\"Return inverse of square transformation matrix.\n\n    >>> M0 = random_rotation_matrix()\n    >>> M1 = inverse_matrix(M0.T)\n    >>> numpy.allclose(M1, numpy.linalg.inv(M0.T))\n    True\n    >>> for size in range(1, 7):\n    ...     M0 = numpy.random.rand(size, size)\n    ...     M1 = inverse_matrix(M0)\n    ...     if not numpy.allclose(M1, numpy.linalg.inv(M0)): print(size)\n\n    \"\"\"\n    return numpy.linalg.inv(matrix)\n\n\ndef concatenate_matrices(*matrices):\n    \"\"\"Return concatenation of series of transformation matrices.\n\n    >>> M = numpy.random.rand(16).reshape((4, 4)) - 0.5\n    >>> numpy.allclose(M, concatenate_matrices(M))\n    True\n    >>> numpy.allclose(numpy.dot(M, M.T), concatenate_matrices(M, M.T))\n    True\n\n    \"\"\"\n    M = numpy.identity(4)\n    for i in matrices:\n        M = numpy.dot(M, i)\n    return M\n\n\ndef is_same_transform(matrix0, matrix1):\n    \"\"\"Return True if two matrices perform same transformation.\n\n    >>> is_same_transform(numpy.identity(4), numpy.identity(4))\n    True\n    >>> is_same_transform(numpy.identity(4), random_rotation_matrix())\n    False\n\n    \"\"\"\n    matrix0 = numpy.array(matrix0, dtype=numpy.float64, copy=True)\n    matrix0 /= matrix0[3, 3]\n    matrix1 = numpy.array(matrix1, dtype=numpy.float64, copy=True)\n    matrix1 /= matrix1[3, 3]\n    return numpy.allclose(matrix0, matrix1)\n\n\ndef is_same_quaternion(q0, q1):\n    \"\"\"Return True if two quaternions are equal.\"\"\"\n    q0 = numpy.array(q0)\n    q1 = numpy.array(q1)\n    return numpy.allclose(q0, q1) or numpy.allclose(q0, -q1)\n\n\ndef _import_module(name, package=None, warn=True, prefix='_py_', ignore='_'):\n    \"\"\"Try import all public attributes from module into global namespace.\n\n    Existing attributes with name clashes are renamed with prefix.\n    Attributes starting with underscore are ignored by default.\n\n    Return True on successful import.\n\n    \"\"\"\n    import warnings\n    from importlib import import_module\n    try:\n        if not package:\n            module = import_module(name)\n        else:\n            module = import_module('.' + name, package=package)\n    except ImportError:\n        if warn:\n            warnings.warn('failed to import module %s' % name)\n    else:\n        for attr in dir(module):\n            if ignore and attr.startswith(ignore):\n                continue\n            if prefix:\n                if attr in globals():\n                    globals()[prefix + attr] = globals()[attr]\n                elif warn:\n                    warnings.warn('no Python implementation of ' + attr)\n            globals()[attr] = getattr(module, attr)\n        return True\n\n\n_import_module('_transformations')\n\nif __name__ == '__main__':\n    import doctest\n    import random  # noqa: used in doctests\n    try:\n        numpy.set_printoptions(suppress=True, precision=5, legacy='1.13')\n    except TypeError:\n        numpy.set_printoptions(suppress=True, precision=5)\n    doctest.testmod()\n"
  },
  {
    "path": "DenseFusion/lib/utils.py",
    "content": "import logging\n\ndef setup_logger(logger_name, log_file, level=logging.INFO):\n    l = logging.getLogger(logger_name)\n    formatter = logging.Formatter('%(asctime)s : %(message)s')\n    fileHandler = logging.FileHandler(log_file, mode='w')\n    fileHandler.setFormatter(formatter)\n\n    l.setLevel(level)\n    l.addHandler(fileHandler)\n\n    streamHandler = logging.StreamHandler()\n    streamHandler.setFormatter(formatter)\n    l.addHandler(streamHandler)\n    return l"
  },
  {
    "path": "DenseFusion/note.txt",
    "content": "git checkout branch Pytorch-1.0 \n\n# Error: AttributeError: module 'lib.knn.knn_pytorch' has no attribute 'knn'\nSolution: rebuild and unzip egg ile then copy *so file and knn_pytorch.py to /densefusion/lib/knn\nroot@cfde89f97b76:/densefusion/lib/knn# python setup.py install\nroot@cfde89f97b76:/densefusion/lib/knn/dist# unzip knn_pytorch-0.1-py3.5-linux-x86_64.egg \n"
  },
  {
    "path": "DenseFusion/tools/_init_paths.py",
    "content": "import os\nimport sys\nsys.path.insert(0, os.getcwd())"
  },
  {
    "path": "DenseFusion/tools/iliad.py",
    "content": "import _init_paths\nimport argparse\nimport os\nimport copy\nimport random\nimport numpy as np\nfrom PIL import Image\nimport scipy.io as scio\nimport scipy.misc\nimport numpy.ma as ma\nimport math\nimport torch\nimport torch.nn as nn\nimport torch.nn.parallel\nimport torch.backends.cudnn as cudnn\nimport torch.optim as optim\nimport torch.utils.data\nimport torchvision.datasets as dset\nimport torchvision.transforms as transforms\nimport torchvision.utils as vutils\nimport torch.nn.functional as F\nfrom torch.autograd import Variable\nfrom lib.network import PoseNet, PoseRefineNet\nfrom lib.transformations import euler_matrix, quaternion_matrix, quaternion_from_matrix\n\nimport matplotlib.pyplot as plt\n\nparser = argparse.ArgumentParser()\nparser.add_argument('--dataset_root', type=str, default = '', help='dataset root dir')\nparser.add_argument('--saved_root', type=str, default = '', help='saved result root dir')\nparser.add_argument('--model', type=str, default = '',  help='resume PoseNet model')\nparser.add_argument('--refine_model', type=str, default = '',  help='resume PoseRefineNet model')\nparser.add_argument('--num_frames', type=int, default = 100,  help='number of frames')\nparser.add_argument('--num_keyframes', type=int, default = 10,  help='number of frames')\n\nopt = parser.parse_args()\n\nnorm = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225])\nborder_list = [-1, 40, 80, 120, 160, 200, 240, 280, 320, 360, 400, 440, 480, 520, 560, 600, 640, 680]\nxmap = np.array([[j for i in range(640)] for j in range(480)])\nymap = np.array([[i for i in range(640)] for j in range(480)])\ncam_cx = 319.0000\ncam_cy = 237.0000\ncam_fx = 580.000\ncam_fy = 580.000\ncam_scale = 1000.0\nnum_obj = 13\nimg_width = 480\nimg_length = 640\nnum_points = 1000\nnum_points_mesh = 500\niteration = 2\nbs = 1\ndataset_config_dir = opt.dataset_root + '/image_sets'\n\ndef get_bbox(label):\n    rows = np.any(label, axis=1)\n    cols = np.any(label, axis=0)\n    rmin, rmax = np.where(rows)[0][[0, -1]]\n    cmin, cmax = np.where(cols)[0][[0, -1]]\n    rmax += 1\n    cmax += 1\n    r_b = rmax - rmin\n    for tt in range(len(border_list)):\n        if r_b > border_list[tt] and r_b < border_list[tt + 1]:\n            r_b = border_list[tt + 1]\n            break\n    c_b = cmax - cmin\n    for tt in range(len(border_list)):\n        if c_b > border_list[tt] and c_b < border_list[tt + 1]:\n            c_b = border_list[tt + 1]\n            break\n    center = [int((rmin + rmax) / 2), int((cmin + cmax) / 2)]\n    rmin = center[0] - int(r_b / 2)\n    rmax = center[0] + int(r_b / 2)\n    cmin = center[1] - int(c_b / 2)\n    cmax = center[1] + int(c_b / 2)\n    if rmin < 0:\n        delt = -rmin\n        rmin = 0\n        rmax += delt\n    if cmin < 0:\n        delt = -cmin\n        cmin = 0\n        cmax += delt\n    if rmax > img_width:\n        delt = rmax - img_width\n        rmax = img_width\n        rmin -= delt\n    if cmax > img_length:\n        delt = cmax - img_length\n        cmax = img_length\n        cmin -= delt\n    return rmin, rmax, cmin, cmax\n\nestimator = PoseNet(num_points = num_points, num_obj = num_obj)\nestimator.cuda()\nestimator.load_state_dict(torch.load(opt.model))\nestimator.eval()\n\nrefiner = PoseRefineNet(num_points = num_points, num_obj = num_obj)\nrefiner.cuda()\nrefiner.load_state_dict(torch.load(opt.refine_model))\nrefiner.eval()\n\nclass_file = open('{0}/classes.txt'.format(dataset_config_dir))\nclass_id = 1\ncld = {}\nwhile 1:\n    class_input = class_file.readline()\n    if not class_input:\n        break\n    class_input = class_input[:-1]\n\n    input_file = open('{0}/models/{1}/points.xyz'.format(opt.dataset_root, class_input))\n    cld[class_id] = []\n    while 1:\n        input_line = input_file.readline()\n        if not input_line:\n            break\n        input_line = input_line[:-1]\n        input_line = input_line.split(' ')\n        cld[class_id].append([float(input_line[0]), float(input_line[1]), float(input_line[2])])\n    input_file.close()\n    cld[class_id] = np.array(cld[class_id])\n    class_id += 1\n\ndata_path = opt.saved_root\nincr = opt.num_frames//opt.num_keyframes\nfor now in range(0, opt.num_frames, incr):\n    num = 1000001 + now\n    str_num = str(num)[1:]\n    \n    file_name = 'mask/' + str_num + '-object_poses.txt' \n    saved_file = os.path.join(data_path, file_name)\n    f = open(saved_file , 'w')\n    \n    detected_classIDs = []\n    maskrcnn_result_dir = os.path.join(opt.saved_root, 'mask')\n    detected_idList = open('{0}/{1}-class_ids.txt'.format(maskrcnn_result_dir, str_num))\n    while 1:\n        id_str = detected_idList.readline()\n        if not id_str:\n            break\n        detected_classIDs.append(int(id_str))\n    detected_idList.close()\n\n    file_name = \"rgb/\" + str_num + \"-color.png\"\n    rgb_addr = os.path.join(data_path, file_name)\n    file_name = \"depth/\" + str_num + \"-depth.png\"\n    depth_addr = os.path.join(data_path, file_name)\n    file_name = \"mask/\" + str_num + \"-mask.png\"\n    mask_addr = os.path.join(data_path, file_name)\n\n    if os.path.isfile(rgb_addr) == False: \n            continue;\n    if os.path.isfile(depth_addr) == False: \n            continue;\n    if os.path.isfile(mask_addr) == False: \n            continue;\n\n    img = Image.open(rgb_addr)\n    depth = np.array(Image.open(depth_addr))\n    masks = np.array(Image.open(mask_addr))\n\n    my_result_wo_refine = []\n    my_result = []\n\n    for idx in range(len(detected_classIDs)):\n        itemid = detected_classIDs[idx]\n        maskid = idx + 1\n        try:\n            mask = ma.getmaskarray(ma.masked_equal(masks, maskid))\n            rmin, rmax, cmin, cmax = get_bbox(mask)\n\n            print('itemid: {0}\\n'.format(itemid))\n            print('rmin {0}, rmax {1}, cmin {2}, cmax {3}'.format(rmin, rmax, cmin, cmax))\n\n            mask_depth = ma.getmaskarray(ma.masked_not_equal(depth, 0))\n            mask_label = ma.getmaskarray(ma.masked_equal(masks, maskid))\n            mask = mask_label * mask_depth\n            choose = mask[rmin:rmax, cmin:cmax].flatten().nonzero()[0]\n\n            if len(choose) > num_points:\n                c_mask = np.zeros(len(choose), dtype=int)\n                c_mask[:num_points] = 1\n                np.random.shuffle(c_mask)\n                choose = choose[c_mask.nonzero()]\n            else:\n                choose = np.pad(choose, (0, num_points - len(choose)), 'wrap')\n\n            depth_masked = depth[rmin:rmax, cmin:cmax].flatten()[choose][:, np.newaxis].astype(np.float32)\n            xmap_masked = xmap[rmin:rmax, cmin:cmax].flatten()[choose][:, np.newaxis].astype(np.float32)\n            ymap_masked = ymap[rmin:rmax, cmin:cmax].flatten()[choose][:, np.newaxis].astype(np.float32)\n            choose = np.array([choose])\n\n            pt2 = depth_masked / cam_scale\n            pt0 = (ymap_masked - cam_cx) * pt2 / cam_fx\n            pt1 = (xmap_masked - cam_cy) * pt2 / cam_fy\n            cloud = np.concatenate((pt0, pt1, pt2), axis=1)\n\n            img_masked = np.array(img)[:, :, :3]  \n            img_masked = np.transpose(img_masked, (2, 0, 1))\n            img_masked = img_masked[:, rmin:rmax, cmin:cmax]\n\n            cloud = torch.from_numpy(cloud.astype(np.float32))\n            choose = torch.LongTensor(choose.astype(np.int32))\n            img_masked = norm(torch.from_numpy(img_masked.astype(np.float32)))\n            index = torch.LongTensor([itemid - 1])\n\n            cloud = Variable(cloud).cuda()\n            choose = Variable(choose).cuda()\n            img_masked = Variable(img_masked).cuda()\n            index = Variable(index).cuda()\n\n            cloud = cloud.view(1, num_points, 3)\n            img_masked = img_masked.view(1, 3, img_masked.size()[1], img_masked.size()[2])\n\n            pred_r, pred_t, pred_c, emb = estimator(img_masked, cloud, choose, index)\n            pred_r = pred_r / torch.norm(pred_r, dim=2).view(1, num_points, 1)\n\n            pred_c = pred_c.view(bs, num_points)\n            how_max, which_max = torch.max(pred_c, 1)\n            pred_t = pred_t.view(bs * num_points, 1, 3)\n            points = cloud.view(bs * num_points, 1, 3)\n\n            my_r = pred_r[0][which_max[0]].view(-1).cpu().data.numpy()\n            my_t = (points + pred_t)[which_max[0]].view(-1).cpu().data.numpy()\n            my_pred = np.append(my_r, my_t)\n            my_result_wo_refine.append(my_pred.tolist())\n\n            for ite in range(0, iteration):\n                T = Variable(torch.from_numpy(my_t.astype(np.float32))).cuda().view(1, 3).repeat(num_points, 1).contiguous().view(1, num_points, 3)\n                my_mat = quaternion_matrix(my_r)\n                R = Variable(torch.from_numpy(my_mat[:3, :3].astype(np.float32))).cuda().view(1, 3, 3)\n                my_mat[0:3, 3] = my_t\n                \n                new_cloud = torch.bmm((cloud - T), R).contiguous()\n                pred_r, pred_t = refiner(new_cloud, emb, index)\n                pred_r = pred_r.view(1, 1, -1)\n                pred_r = pred_r / (torch.norm(pred_r, dim=2).view(1, 1, 1))\n                my_r_2 = pred_r.view(-1).cpu().data.numpy()\n                my_t_2 = pred_t.view(-1).cpu().data.numpy()\n                my_mat_2 = quaternion_matrix(my_r_2)\n\n                my_mat_2[0:3, 3] = my_t_2\n\n                my_mat_final = np.dot(my_mat, my_mat_2)\n                my_r_final = copy.deepcopy(my_mat_final)\n                my_r_final[0:3, 3] = 0\n                my_r_final = quaternion_from_matrix(my_r_final, True)\n                my_t_final = np.array([my_mat_final[0][3], my_mat_final[1][3], my_mat_final[2][3]])\n\n                my_pred = np.append(my_r_final, my_t_final)\n                my_r = my_r_final\n                my_t = my_t_final\n\n            # Here 'my_pred' is the final pose estimation result after refinement ('my_r': quaternion, 'my_t': translation)\n\n            my_result.append(my_pred.tolist())\n\n            f.write(str(int(itemid)))\n            f.write(\"\\n\")\n            np.savetxt(f, my_pred, newline=' ', fmt=\"%.6f\")\n            f.write(\"\\n\")\n            print(my_pred)\n\n        except ZeroDivisionError:\n            print(\"PoseCNN Detector Lost {0} at No.{1} keyframe\".format(itemid, now))\n            my_result_wo_refine.append([0.0 for i in range(7)])\n            my_result.append([0.0 for i in range(7)])\n\n    f.close()\n\n''' \n    plt.subplot(2, 2, 1)\n    plt.title(\"rgb\")\n    plt.imshow(img)\n    plt.subplot(2, 2, 2)\n    plt.title(\"depth\")\n    plt.imshow(depth)\n    plt.subplot(2, 2, 3)\n    plt.title(\"mask\")\n    plt.imshow(masks)\n    plt.subplot(2, 2, 4)\n    plt.title(\"mask_label\")\n    plt.imshow(masks)\n    plt.show()\n '''"
  },
  {
    "path": "DenseFusion/tools/train.py",
    "content": "# --------------------------------------------------------\n# DenseFusion 6D Object Pose Estimation by Iterative Dense Fusion\n# Licensed under The MIT License [see LICENSE for details]\n# Written by Chen\n# --------------------------------------------------------\n\nimport _init_paths\nimport argparse\nimport os\nimport random\nimport time\nimport numpy as np\nimport torch\nimport torch.nn as nn\nimport torch.nn.parallel\nimport torch.backends.cudnn as cudnn\nimport torch.optim as optim\nimport torch.utils.data\nimport torchvision.datasets as dset\nimport torchvision.transforms as transforms\nimport torchvision.utils as vutils\nfrom torch.autograd import Variable\nfrom datasets.ycb.dataset import PoseDataset as PoseDataset_ycb\nfrom datasets.warehouse.dataset import PoseDataset as PoseDataset_warehouse\nfrom datasets.linemod.dataset import PoseDataset as PoseDataset_linemod\nfrom lib.network import PoseNet, PoseRefineNet\nfrom lib.loss import Loss\nfrom lib.loss_refiner import Loss_refine\nfrom lib.utils import setup_logger\n\nparser = argparse.ArgumentParser()\nparser.add_argument('--dataset', type=str, default = 'ycb', help='ycb or warehouse or linemod')\nparser.add_argument('--dataset_root', type=str, default = '', help='dataset root dir (''YCB_Video_Dataset'' or ''Warehouse_Dataset'' or ''Linemod_preprocessed'')')\nparser.add_argument('--batch_size', type=int, default = 8, help='batch size')\nparser.add_argument('--workers', type=int, default = 10, help='number of data loading workers')\nparser.add_argument('--lr', default=0.0001, help='learning rate')\nparser.add_argument('--lr_rate', default=0.3, help='learning rate decay rate')\nparser.add_argument('--w', default=0.015, help='learning rate')\nparser.add_argument('--w_rate', default=0.3, help='learning rate decay rate')\nparser.add_argument('--decay_margin', default=0.016, help='margin to decay lr & w')\nparser.add_argument('--refine_margin', default=0.013, help='margin to start the training of iterative refinement')\nparser.add_argument('--noise_trans', default=0.03, help='range of the random noise of translation added to the training data')\nparser.add_argument('--iteration', type=int, default = 2, help='number of refinement iterations')\nparser.add_argument('--nepoch', type=int, default=500, help='max number of epochs to train')\nparser.add_argument('--resume_posenet', type=str, default = '',  help='resume PoseNet model')\nparser.add_argument('--resume_refinenet', type=str, default = '',  help='resume PoseRefineNet model')\nparser.add_argument('--start_epoch', type=int, default = 1, help='which epoch to start')\nopt = parser.parse_args()\n\n\ndef main():\n    opt.manualSeed = random.randint(1, 100)\n    random.seed(opt.manualSeed)\n    torch.manual_seed(opt.manualSeed)\n\n    if opt.dataset == 'ycb':\n        opt.num_objects = 21 #number of object classes in the dataset\n        opt.num_points = 1000 #number of points on the input pointcloud\n        opt.outf = 'trained_models/ycb' #folder to save trained models\n        opt.log_dir = 'experiments/logs/ycb' #folder to save logs\n        opt.repeat_epoch = 1 #number of repeat times for one epoch training\n    elif opt.dataset == 'warehouse':\n        opt.num_objects = 13\n        opt.num_points = 1000\n        opt.outf = 'trained_models/warehouse'\n        opt.log_dir = 'experiments/logs/warehouse'\n        opt.repeat_epoch = 1\n    elif opt.dataset == 'linemod':\n        opt.num_objects = 13\n        opt.num_points = 500\n        opt.outf = 'trained_models/linemod'\n        opt.log_dir = 'experiments/logs/linemod'\n        opt.repeat_epoch = 20\n    else:\n        print('Unknown dataset')\n        return\n\n    estimator = PoseNet(num_points = opt.num_points, num_obj = opt.num_objects)\n    estimator.cuda()\n    refiner = PoseRefineNet(num_points = opt.num_points, num_obj = opt.num_objects)\n    refiner.cuda()\n\n    if opt.resume_posenet != '':\n        estimator.load_state_dict(torch.load('{0}/{1}'.format(opt.outf, opt.resume_posenet)))\n\n    if opt.resume_refinenet != '':\n        refiner.load_state_dict(torch.load('{0}/{1}'.format(opt.outf, opt.resume_refinenet)))\n        opt.refine_start = True\n        opt.decay_start = True\n        opt.lr *= opt.lr_rate\n        opt.w *= opt.w_rate\n        opt.batch_size = int(opt.batch_size / opt.iteration)\n        optimizer = optim.Adam(refiner.parameters(), lr=opt.lr)\n    else:\n        opt.refine_start = False\n        opt.decay_start = False\n        optimizer = optim.Adam(estimator.parameters(), lr=opt.lr)\n\n    if opt.dataset == 'ycb':\n        dataset = PoseDataset_ycb('train', opt.num_points, True, opt.dataset_root, opt.noise_trans, opt.refine_start)\n    elif opt.dataset == 'warehouse':\n        dataset = PoseDataset_warehouse('train', opt.num_points, True, opt.dataset_root, opt.noise_trans, opt.refine_start)\n    elif opt.dataset == 'linemod':\n        dataset = PoseDataset_linemod('train', opt.num_points, True, opt.dataset_root, opt.noise_trans, opt.refine_start)\n    dataloader = torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=True, num_workers=opt.workers)\n    if opt.dataset == 'ycb':\n        test_dataset = PoseDataset_ycb('test', opt.num_points, False, opt.dataset_root, 0.0, opt.refine_start)\n    elif opt.dataset == 'warehouse':\n        test_dataset = PoseDataset_warehouse('test', opt.num_points, False, opt.dataset_root, 0.0, opt.refine_start)\n    elif opt.dataset == 'linemod':\n        test_dataset = PoseDataset_linemod('test', opt.num_points, False, opt.dataset_root, 0.0, opt.refine_start)\n    testdataloader = torch.utils.data.DataLoader(test_dataset, batch_size=1, shuffle=False, num_workers=opt.workers)\n    \n    opt.sym_list = dataset.get_sym_list()\n    opt.num_points_mesh = dataset.get_num_points_mesh()\n\n    print('>>>>>>>>----------Dataset loaded!---------<<<<<<<<\\nlength of the training set: {0}\\nlength of the testing set: {1}\\nnumber of sample points on mesh: {2}\\nsymmetry object list: {3}'.format(len(dataset), len(test_dataset), opt.num_points_mesh, opt.sym_list))\n\n    criterion = Loss(opt.num_points_mesh, opt.sym_list)\n    criterion_refine = Loss_refine(opt.num_points_mesh, opt.sym_list)\n\n    best_test = np.Inf\n\n    if opt.start_epoch == 1:\n        for log in os.listdir(opt.log_dir):\n            os.remove(os.path.join(opt.log_dir, log))\n    st_time = time.time()\n\n    for epoch in range(opt.start_epoch, opt.nepoch):\n        logger = setup_logger('epoch%d' % epoch, os.path.join(opt.log_dir, 'epoch_%d_log.txt' % epoch))\n        logger.info('Train time {0}'.format(time.strftime(\"%Hh %Mm %Ss\", time.gmtime(time.time() - st_time)) + ', ' + 'Training started'))\n        train_count = 0\n        train_dis_avg = 0.0\n        if opt.refine_start:\n            estimator.eval()\n            refiner.train()\n        else:\n            estimator.train()\n        optimizer.zero_grad()\n\n        for rep in range(opt.repeat_epoch):\n            for i, data in enumerate(dataloader, 0):\n                points, choose, img, target, model_points, idx = data\n                points, choose, img, target, model_points, idx = Variable(points).cuda(), \\\n                                                                 Variable(choose).cuda(), \\\n                                                                 Variable(img).cuda(), \\\n                                                                 Variable(target).cuda(), \\\n                                                                 Variable(model_points).cuda(), \\\n                                                                 Variable(idx).cuda()\n                pred_r, pred_t, pred_c, emb = estimator(img, points, choose, idx)\n                loss, dis, new_points, new_target = criterion(pred_r, pred_t, pred_c, target, model_points, idx, points, opt.w, opt.refine_start)\n                \n                if opt.refine_start:\n                    for ite in range(0, opt.iteration):\n                        pred_r, pred_t = refiner(new_points, emb, idx)\n                        dis, new_points, new_target = criterion_refine(pred_r, pred_t, new_target, model_points, idx, new_points)\n                        dis.backward()\n                else:\n                    loss.backward()\n\n                train_dis_avg += dis.item()\n                train_count += 1\n\n                if train_count % opt.batch_size == 0:\n                    logger.info('Train time {0} Epoch {1} Batch {2} Frame {3} Avg_dis:{4}'.format(time.strftime(\"%Hh %Mm %Ss\", time.gmtime(time.time() - st_time)), epoch, int(train_count / opt.batch_size), train_count, train_dis_avg / opt.batch_size))\n                    optimizer.step()\n                    optimizer.zero_grad()\n                    train_dis_avg = 0\n\n                if train_count != 0 and train_count % 1000 == 0:\n                    if opt.refine_start:\n                        torch.save(refiner.state_dict(), '{0}/pose_refine_model_current.pth'.format(opt.outf))\n                    else:\n                        torch.save(estimator.state_dict(), '{0}/pose_model_current.pth'.format(opt.outf))\n\n        print('>>>>>>>>----------epoch {0} train finish---------<<<<<<<<'.format(epoch))\n\n\n        logger = setup_logger('epoch%d_test' % epoch, os.path.join(opt.log_dir, 'epoch_%d_test_log.txt' % epoch))\n        logger.info('Test time {0}'.format(time.strftime(\"%Hh %Mm %Ss\", time.gmtime(time.time() - st_time)) + ', ' + 'Testing started'))\n        test_dis = 0.0\n        test_count = 0\n        estimator.eval()\n        refiner.eval()\n\n        for j, data in enumerate(testdataloader, 0):\n            points, choose, img, target, model_points, idx = data\n            points, choose, img, target, model_points, idx = Variable(points).cuda(), \\\n                                                             Variable(choose).cuda(), \\\n                                                             Variable(img).cuda(), \\\n                                                             Variable(target).cuda(), \\\n                                                             Variable(model_points).cuda(), \\\n                                                             Variable(idx).cuda()\n            pred_r, pred_t, pred_c, emb = estimator(img, points, choose, idx)\n            _, dis, new_points, new_target = criterion(pred_r, pred_t, pred_c, target, model_points, idx, points, opt.w, opt.refine_start)\n\n            if opt.refine_start:\n                for ite in range(0, opt.iteration):\n                    pred_r, pred_t = refiner(new_points, emb, idx)\n                    dis, new_points, new_target = criterion_refine(pred_r, pred_t, new_target, model_points, idx, new_points)\n\n            test_dis += dis.item()\n            logger.info('Test time {0} Test Frame No.{1} dis:{2}'.format(time.strftime(\"%Hh %Mm %Ss\", time.gmtime(time.time() - st_time)), test_count, dis))\n\n            test_count += 1\n\n        test_dis = test_dis / test_count\n        logger.info('Test time {0} Epoch {1} TEST FINISH Avg dis: {2}'.format(time.strftime(\"%Hh %Mm %Ss\", time.gmtime(time.time() - st_time)), epoch, test_dis))\n        if test_dis <= best_test:\n            best_test = test_dis\n            if opt.refine_start:\n                torch.save(refiner.state_dict(), '{0}/pose_refine_model_{1}_{2}.pth'.format(opt.outf, epoch, test_dis))\n            else:\n                torch.save(estimator.state_dict(), '{0}/pose_model_{1}_{2}.pth'.format(opt.outf, epoch, test_dis))\n            print(epoch, '>>>>>>>>----------BEST TEST MODEL SAVED---------<<<<<<<<')\n\n        if best_test < opt.decay_margin and not opt.decay_start:\n            opt.decay_start = True\n            opt.lr *= opt.lr_rate\n            opt.w *= opt.w_rate\n            optimizer = optim.Adam(estimator.parameters(), lr=opt.lr)\n\n        if best_test < opt.refine_margin and not opt.refine_start:\n            opt.refine_start = True\n            opt.batch_size = int(opt.batch_size / opt.iteration)\n            optimizer = optim.Adam(refiner.parameters(), lr=opt.lr)\n\n            if opt.dataset == 'ycb':\n                dataset = PoseDataset_ycb('train', opt.num_points, True, opt.dataset_root, opt.noise_trans, opt.refine_start)\n            if opt.dataset == 'warehouse':\n                dataset = PoseDataset_warehouse('train', opt.num_points, True, opt.dataset_root, opt.noise_trans, opt.refine_start)\n            elif opt.dataset == 'linemod':\n                dataset = PoseDataset_linemod('train', opt.num_points, True, opt.dataset_root, opt.noise_trans, opt.refine_start)\n            dataloader = torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=True, num_workers=opt.workers)\n            if opt.dataset == 'ycb':\n                test_dataset = PoseDataset_ycb('test', opt.num_points, False, opt.dataset_root, 0.0, opt.refine_start)\n            if opt.dataset == 'warehouse':\n                test_dataset = PoseDataset_warehouse('test', opt.num_points, False, opt.dataset_root, 0.0, opt.refine_start)\n            elif opt.dataset == 'linemod':\n                test_dataset = PoseDataset_linemod('test', opt.num_points, False, opt.dataset_root, 0.0, opt.refine_start)\n            testdataloader = torch.utils.data.DataLoader(test_dataset, batch_size=1, shuffle=False, num_workers=opt.workers)\n            \n            opt.sym_list = dataset.get_sym_list()\n            opt.num_points_mesh = dataset.get_num_points_mesh()\n\n            print('>>>>>>>>----------Dataset loaded!---------<<<<<<<<\\nlength of the training set: {0}\\nlength of the testing set: {1}\\nnumber of sample points on mesh: {2}\\nsymmetry object list: {3}'.format(len(dataset), len(test_dataset), opt.num_points_mesh, opt.sym_list))\n\n            criterion = Loss(opt.num_points_mesh, opt.sym_list)\n            criterion_refine = Loss_refine(opt.num_points_mesh, opt.sym_list)\n\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "DenseFusion/trained_checkpoints/warehouse/note",
    "content": ""
  },
  {
    "path": "DenseFusion/trained_models/warehouse/note",
    "content": ""
  },
  {
    "path": "Mask_RCNN/LICENSE",
    "content": "Mask R-CNN\n\nThe MIT License (MIT)\n\nCopyright (c) 2017 Matterport, Inc.\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "Mask_RCNN/MANIFEST.in",
    "content": "include README.md\ninclude LICENSE\ninclude requirements.txt"
  },
  {
    "path": "Mask_RCNN/README.md",
    "content": "# Mask R-CNN for Object Detection and Segmentation\n\nThis is an implementation of instance segmentation used in [Object-RPE](https://sites.google.com/view/object-rpe). The original version is from [matterport](https://github.com/matterport/Mask_RCNN). The model generates bounding boxes and segmentation masks for each instance of an object in the image. It's based on Feature Pyramid Network (FPN) and a ResNet101 backbone.\n\n## Requirements\nPython 3.4, TensorFlow 1.3, Keras 2.0.8 and other common packages listed in `requirements.txt`.\n\n## Installation\n1. Install dependencies\n   ```bash\n   pip3 install -r requirements.txt\n   ```\n2. Run setup from the directory ~/catkin_ws/src/Object-RPE/Mask_RCNN\n    ```bash\n    sudo python3 setup.py install\n    ```\n## Train and evaluate model\n1. To train\n   ```bash\n   python3 train.py --dataset=/Warehouse_Dataset/data --weights==coco\n   ```\n2. To evaluate \n\n    ```bash\n    sudo python3 eval.py\n    ```\n    \nRead rgb and round-truth images from rgb/ and gt/ folders in .../Object-RPE/data, then save results in .../Object-RPE/data/mask\n"
  },
  {
    "path": "Mask_RCNN/dataset_format",
    "content": "{\n    \"34020010494_e5cb88e1c4_k.jpg1115004\":\n    {\n        \"fileref\":\"\",\n        \"size\":1115004,\n        \"filename\":\"34020010494_e5cb88e1c4_k.jpg\",\n        \"base64_img_data\":\"\",\n        \"file_attributes\":{},\n        \"regions\":\n        {\n            \"0\":\n            {\n                \"shape_attributes\":\n                {\n                    \"name\":\"polygon\",\n                    \"all_points_x\": [1020,1000,994,1003,1023,1050,1089,1134,1190,1265,1321,1361,1403,1428,1442,1445,1441,1427,1400,1361,1316,1269,1228,1198,1207,1210,1190,1177,1172,1174,1170,1153,1127,1104,1061,1032,1020],\n                    \"all_points_y\":[963,899,841,787,738,700,663,638,621,619,643,672,720,765,800,860,896,942,990,1035,1079,1112,1129,1134,1144,1153,1166,1166,1150,1136,1129,1122,1112,1084,1037,989,963]\n                },\n                \"region_attributes\":\n                {}\n            }\n        }\n    },\n\n    \"18849792632_aad23ad513_k.jpg522255\":\n    {\n        \"fileref\":\"\",\n        \"size\":522255,\n        \"filename\":\"18849792632_aad23ad513_k.jpg\",\n        \"base64_img_data\":\"\",\n        \"file_attributes\":{},\n        \"regions\":\n        {\n            \"0\":\n            {\n                \"shape_attributes\":\n                {\n                    \"name\":\"polygon\",\n                    \"all_points_x\":[618,657,688,707,741,760,779,791,820,836,844,860,868,871,871,868,864,854,840,824,809,795,778,759,741,719,699,677,664,641,623,606,601,582,567,554,535,534,543,560,579,597,618],\n                    \"all_points_y\":[385,370,365,365,373,382,390,404,432,451,472,507,541,561,589,612,635,668,698,727,752,764,784,807,804,803,805,811,796,772,754,735,729,704,682,648,593,530,483,446,420,401,385]\n                },\n                \"region_attributes\":\n                {}\n            },\n            \"1\":\n            {\n                \"shape_attributes\":\n                {\n                    \"name\":\"polygon\",\n                    \"all_points_x\":[942,960,979,990,1006,1008,1012,1013,984,959,933,906,879,858,844,831,825,816,806,795,811,826,842,856,869,871,863,854,840,865,891,917,942],\n                    \"all_points_y\":[480,494,515,531,563,581,597,619,623,630,642,657,683,715,742,780,805,792,780,765,748,723,694,661,616,564,521,490,466,457,458,464,480]\n                },\n                \"region_attributes\":\n                {}\n            },\n            \"2\":\n            {\n                \"shape_attributes\":\n                {\n                    \"name\":\"polygon\",\n                    \"all_points_x\":[1068,1087,1111,1126,1141,1150,1161,1161,1159,1149,1135,1122,1103,1081,1054,1024,996,976,960,941,924,912,903,905,898,903,906,906,903,892,881,863,845,830,823,823,828,837,848,873,894,923,953,988,1021,1046,1068],\n                    \"all_points_y\":[632,641,660,677,695,723,756,782,817,849,886,906,929,951,970,991,1006,1015,1029,1041,1047,1050,1054,1059,1064,1048,1028,996,960,928,905,877,856,844,838,821,796,764,734,692,667,647,632,622,619,623,632]\n                },\n                \"region_attributes\":\n                {}\n            },\n            \"3\":\n            {\n                \"shape_attributes\":\n                {\n                    \"name\":\"polygon\",\n                    \"all_points_x\":[651,667,686,719,737,751,766,783,797,808,827,846,861,876,890,903,906,907,898,884,867,852,831,814,798,782,766,753,749,750,751,751,746,740,735,732,732,731,719,707,689,674,657,638,617,598,584,569,564,566,573,586,604,626,651],\n                    \"all_points_y\":[826,817,809,803,803,805,810,816,821,827,842,856,874,897,926,956,999,1027,1061,1101,1128,1150,1172,1189,1202,1216,1227,1229,1231,1234,1241,1243,1245,1243,1242,1238,1232,1227,1224,1216,1204,1193,1182,1168,1142,1114,1085,1045,1001,948,922,890,861,842,826]\n                },\n                \"region_attributes\":\n                {}\n            },\n            \"4\":\n            {\n                \"shape_attributes\":\n                {\n                    \"name\":\"polygon\",\n                    \"all_points_x\":[1082,1093,1103,1113,1120,1122,1122,1118,1107,1093,1078,1061,1041,1017,986,959,938,922,906,877,861,845,830,830,824,823,817,813,813,821,817,811,807,809,809,807,805,825,842,860,881,891,896,906,906,912,936,964,972,992,1011,1023,1048,1066,1082],\n                    \"all_points_y\":[1026,1039,1054,1074,1101,1127,1147,1181,1206,1234,1251,1271,1288,1305,1319,1327,1334,1336,1342,1352,1359,1360,1357,1356,1358,1364,1363,1357,1348,1350,1343,1331,1313,1292,1268,1240,1200,1179,1161,1140,1105,1080,1064,1060,1054,1048,1044,1028,1021,1008,999,991,1000,1011,1026]\n                },\n                \"region_attributes\":\n                {}\n            },\n            \"5\":\n            {\n                \"shape_attributes\":\n                {\n                    \"name\":\"polygon\",\n                    \"all_points_x\":[803,791,781,775,750,737,726,705,705,706,700,694,693,693,694,688,678,667,660,650,644,637,627,614,600,609,625,639,651,665,678,688,694,700,707,710,710,721,725,735,739,737,732,725,718,710,722,731,731,734,741,748,751,749,756,771,790,798,805,808,807,807,811,815,822,813,812,816,817,813,803],\n                    \"all_points_y\":[1426,1453,1474,1483,1515,1532,1551,1558,1565,1572,1575,1574,1570,1564,1560,1558,1555,1553,1547,1538,1529,1523,1517,1508,1497,1496,1496,1494,1493,1492,1490,1486,1486,1486,1480,1474,1467,1445,1420,1377,1350,1322,1284,1257,1235,1219,1226,1226,1234,1240,1243,1246,1241,1232,1231,1239,1261,1275,1289,1297,1308,1318,1326,1342,1349,1349,1357,1363,1373,1394,1426]\n                },\n                \"region_attributes\":\n                {}\n            },\n            \"6\":\n            {\n                \"shape_attributes\":\n                {\n                    \"name\":\"polygon\",\n                    \"all_points_x\":[390,395,407,435,456,483,506,538,565,591,611,620,635,653,676,695,711,715,722,729,732,739,738,730,725,714,708,710,700,692,680,662,636,620,603,577,548,517,501,478,452,429,414,399,394,390,390],\n                    \"all_points_y\":[1282,1249,1207,1170,1151,1138,1130,1122,1126,1131,1139,1145,1165,1181,1196,1208,1218,1226,1243,1270,1292,1327,1365,1404,1425,1458,1472,1477,1487,1486,1491,1491,1495,1495,1496,1496,1490,1479,1469,1457,1437,1412,1389,1356,1336,1313,1282]\n                },\n                \"region_attributes\":\n                {}\n            },\n            \"7\":\n            {\n                \"shape_attributes\":\n                {\n                    \"name\":\"polygon\",\n                    \"all_points_x\":[417,401,386,377,367,361,357,355,355,366,375,393,409,427,447,472,493,503,516,530,550,568,575,582,587,581,571,571,557,540,512,492,471,451,433,417],\n                    \"all_points_y\":[1087,1073,1054,1037,1020,1002,976,954,926,938,952,972,983,994,1004,1016,1025,1034,1039,1048,1046,1044,1062,1078,1093,1104,1124,1126,1124,1122,1130,1134,1123,1113,1099,1087]\n                },\n                \"region_attributes\":\n                {}\n            },\n            \"8\":\n            {\n                \"shape_attributes\":\n                {\n                    \"name\":\"polygon\",\n                    \"all_points_x\":[309,312,320,335,349,367,386,408,431,464,488,534,554,569,581,592,603,618,622,629,634,640,633,622,604,590,573,566,566,566,564,567,569,558,533,516,503,489,466,443,425,404,392,376,363,352,338,320,307,307,309],\n                    \"all_points_y\":[754,744,717,693,675,659,649,640,638,637,643,663,677,688,704,719,734,762,776,794,814,830,838,846,859,885,921,949,966,982,1007,1027,1044,1045,1048,1041,1033,1024,1013,1004,994,981,969,955,936,924,898,861,808,775,754]\n                },\n                \"region_attributes\":\n                {}\n            },\n            \"9\":\n            {\n                \"shape_attributes\":\n                {\n                    \"name\":\"polygon\",\n                    \"all_points_x\":[467,478,492,508,522,534,533,535,536,546,556,570,585,602,620,670,678,641,633,623,612,600,583,567,537,499,479,462,461,467],\n                    \"all_points_y\":[610,586,562,543,531,522,539,564,595,622,656,685,708,729,752,802,810,830,805,778,750,731,707,687,665,648,639,636,628,610]\n                },\n                \"region_attributes\":\n                {}\n            }\n        }\n    }\n}"
  },
  {
    "path": "Mask_RCNN/docker/Dockerfile",
    "content": "FROM nvidia/cuda:9.0-cudnn7-devel-ubuntu16.04\nMAINTAINER Dinh-Cuong Hoang\n\n# Supress warnings about missing front-end. As recommended at:\n# http://stackoverflow.com/questions/22466255/is-it-possibe-to-answer-dialog-questions-when-installing-under-docker\nARG DEBIAN_FRONTEND=noninteractive\n\n# Essentials: developer tools, build tools, OpenBLAS\nRUN apt-get update && apt-get install -y --no-install-recommends \\\n    apt-utils git curl vim unzip openssh-client wget \\\n    build-essential cmake \\\n    libopenblas-dev\n\n\n# Python 3.5\n# For convenience, alias (but don't sym-link) python & pip to python3 & pip3 as recommended in:\n# http://askubuntu.com/questions/351318/changing-symlink-python-to-python3-causes-problems\nRUN apt-get install -y --no-install-recommends python3.5 python3.5-dev python3-pip python3-tk && \\\n    pip3 install --no-cache-dir --upgrade pip setuptools && \\\n    echo \"alias python='python3'\" >> /root/.bash_aliases && \\\n    echo \"alias pip='pip3'\" >> /root/.bash_aliases\n# Pillow and it's dependencies\nRUN apt-get install -y --no-install-recommends libjpeg-dev zlib1g-dev && \\\n    pip3 --no-cache-dir install Pillow\n# Science libraries and other common packages\nRUN pip3 --no-cache-dir install \\\n    numpy scipy sklearn scikit-image imgaug opencv-python IPython[all] matplotlib Cython requests\n\n# Jupyter Notebook\n# Allow access from outside the container, and skip trying to open a browser.\n# NOTE: disable authentication token for convenience. DON'T DO THIS ON A PUBLIC SERVER.\nRUN pip3 --no-cache-dir install jupyter && \\\n    mkdir /root/.jupyter && \\\n    echo \"c.NotebookApp.ip = '*'\" \\\n         \"\\nc.NotebookApp.open_browser = False\" \\\n         \"\\nc.NotebookApp.token = ''\" \\\n         > /root/.jupyter/jupyter_notebook_config.py\nEXPOSE 8888\n\n# Tensorflow 1.11 - GPU\nRUN pip3 install --no-cache-dir tensorflow-gpu==1.11\n\n# Expose port for TensorBoard\nEXPOSE 6006\n\n# Keras 2.1.5\nRUN pip3 install --no-cache-dir --upgrade h5py pydot_ng keras\n"
  },
  {
    "path": "Mask_RCNN/docker/docker_build.sh",
    "content": "#!/bin/bash\n#\n# This script runs docker build to create the maskrcnn-gpu docker image.\n#\n\nset -exu\nsudo nvidia-docker build --tag maskrcnn-gpu ./"
  },
  {
    "path": "Mask_RCNN/docker/docker_run.sh",
    "content": "#!/bin/bash\n#\n# Usage:  ./docker_run.sh [/path/to/data]\n#\n# This script calls `nvidia-docker run` to start the labelfusion\n# container with an interactive bash session.  This script sets\n# the required environment variables and mounts the labelfusion\n# source directory as a volume in the docker container.  If the\n# path to a data directory is given then the data directory is\n# also mounted as a volume.\n#\n\nimage_name=hoangcuongbk80/maskrcnn-gpu:latest\n\nsudo nvidia-docker run --name mask-rcnn -it --rm -v /home/aass/Hoang-Cuong/Mask_RCNN:/maskrcnn hoangcuongbk80/maskrcnn-gpu /bin/bash"
  },
  {
    "path": "Mask_RCNN/mask_rcnn.egg-info/PKG-INFO",
    "content": "Metadata-Version: 1.2\nName: mask-rcnn\nVersion: 2.1\nSummary: Mask R-CNN for object detection and instance segmentation\nHome-page: https://github.com/matterport/Mask_RCNN\nAuthor: Matterport\nAuthor-email: waleed.abdulla@gmail.com\nLicense: MIT\nDescription: This is an implementation of Mask R-CNN on Python 3, Keras, and TensorFlow. \n        The model generates bounding boxes and segmentation masks for each instance of an object in the image. \n        It's based on Feature Pyramid Network (FPN) and a ResNet101 backbone.\nKeywords: image instance segmentation object detection mask rcnn r-cnn tensorflow keras\nPlatform: UNKNOWN\nClassifier: Development Status :: 5 - Production/Stable\nClassifier: Environment :: Console\nClassifier: Intended Audience :: Developers\nClassifier: Intended Audience :: Information Technology\nClassifier: Intended Audience :: Education\nClassifier: Intended Audience :: Science/Research\nClassifier: License :: OSI Approved :: MIT License\nClassifier: Natural Language :: English\nClassifier: Operating System :: OS Independent\nClassifier: Topic :: Scientific/Engineering :: Artificial Intelligence\nClassifier: Topic :: Scientific/Engineering :: Image Recognition\nClassifier: Topic :: Scientific/Engineering :: Visualization\nClassifier: Topic :: Scientific/Engineering :: Image Segmentation\nClassifier: Programming Language :: Python :: 3.4\nClassifier: Programming Language :: Python :: 3.5\nClassifier: Programming Language :: Python :: 3.6\nRequires-Python: >=3.4\n"
  },
  {
    "path": "Mask_RCNN/mask_rcnn.egg-info/SOURCES.txt",
    "content": "LICENSE\nMANIFEST.in\nREADME.md\nrequirements.txt\nsetup.cfg\nsetup.py\nmask_rcnn.egg-info/PKG-INFO\nmask_rcnn.egg-info/SOURCES.txt\nmask_rcnn.egg-info/dependency_links.txt\nmask_rcnn.egg-info/top_level.txt\nmrcnn/__init__.py\nmrcnn/config.py\nmrcnn/model.py\nmrcnn/parallel_model.py\nmrcnn/utils.py\nmrcnn/visualize.py"
  },
  {
    "path": "Mask_RCNN/mask_rcnn.egg-info/dependency_links.txt",
    "content": "\n"
  },
  {
    "path": "Mask_RCNN/mask_rcnn.egg-info/top_level.txt",
    "content": "mrcnn\n"
  },
  {
    "path": "Mask_RCNN/mrcnn/__init__.py",
    "content": "\n"
  },
  {
    "path": "Mask_RCNN/mrcnn/config.py",
    "content": "\"\"\"\nMask R-CNN\nBase Configurations class.\n\nCopyright (c) 2017 Matterport, Inc.\nLicensed under the MIT License (see LICENSE for details)\nWritten by Waleed Abdulla\n\"\"\"\n\nimport numpy as np\n\n\n# Base Configuration Class\n# Don't use this class directly. Instead, sub-class it and override\n# the configurations you need to change.\n\nclass Config(object):\n    \"\"\"Base configuration class. For custom configurations, create a\n    sub-class that inherits from this one and override properties\n    that need to be changed.\n    \"\"\"\n    # Name the configurations. For example, 'COCO', 'Experiment 3', ...etc.\n    # Useful if your code needs to do things differently depending on which\n    # experiment is running.\n    NAME = None  # Override in sub-classes\n\n    # NUMBER OF GPUs to use. When using only a CPU, this needs to be set to 1.\n    GPU_COUNT = 1\n\n    # Number of images to train with on each GPU. A 12GB GPU can typically\n    # handle 2 images of 1024x1024px.\n    # Adjust based on your GPU memory and image sizes. Use the highest\n    # number that your GPU can handle for best performance.\n    IMAGES_PER_GPU = 2\n\n    # Number of training steps per epoch\n    # This doesn't need to match the size of the training set. Tensorboard\n    # updates are saved at the end of each epoch, so setting this to a\n    # smaller number means getting more frequent TensorBoard updates.\n    # Validation stats are also calculated at each epoch end and they\n    # might take a while, so don't set this too small to avoid spending\n    # a lot of time on validation stats.\n    STEPS_PER_EPOCH = 1000\n\n    # Number of validation steps to run at the end of every training epoch.\n    # A bigger number improves accuracy of validation stats, but slows\n    # down the training.\n    VALIDATION_STEPS = 50\n\n    # Backbone network architecture\n    # Supported values are: resnet50, resnet101.\n    # You can also provide a callable that should have the signature\n    # of model.resnet_graph. If you do so, you need to supply a callable\n    # to COMPUTE_BACKBONE_SHAPE as well\n    BACKBONE = \"resnet101\"\n\n    # Only useful if you supply a callable to BACKBONE. Should compute\n    # the shape of each layer of the FPN Pyramid.\n    # See model.compute_backbone_shapes\n    COMPUTE_BACKBONE_SHAPE = None\n\n    # The strides of each layer of the FPN Pyramid. These values\n    # are based on a Resnet101 backbone.\n    BACKBONE_STRIDES = [4, 8, 16, 32, 64]\n\n    # Size of the fully-connected layers in the classification graph\n    FPN_CLASSIF_FC_LAYERS_SIZE = 1024\n\n    # Size of the top-down layers used to build the feature pyramid\n    TOP_DOWN_PYRAMID_SIZE = 256\n\n    # Number of classification classes (including background)\n    NUM_CLASSES = 1  # Override in sub-classes 1\n\n    # Length of square anchor side in pixels\n    RPN_ANCHOR_SCALES = (32, 64, 128, 256, 512)\n\n    # Ratios of anchors at each cell (width/height)\n    # A value of 1 represents a square anchor, and 0.5 is a wide anchor\n    RPN_ANCHOR_RATIOS = [0.5, 1, 2]\n\n    # Anchor stride\n    # If 1 then anchors are created for each cell in the backbone feature map.\n    # If 2, then anchors are created for every other cell, and so on.\n    RPN_ANCHOR_STRIDE = 1\n\n    # Non-max suppression threshold to filter RPN proposals.\n    # You can increase this during training to generate more propsals.\n    RPN_NMS_THRESHOLD = 0.7\n\n    # How many anchors per image to use for RPN training\n    RPN_TRAIN_ANCHORS_PER_IMAGE = 256\n    \n    # ROIs kept after tf.nn.top_k and before non-maximum suppression\n    PRE_NMS_LIMIT = 6000\n\n    # ROIs kept after non-maximum suppression (training and inference)\n    POST_NMS_ROIS_TRAINING = 2000\n    POST_NMS_ROIS_INFERENCE = 1000\n\n    # If enabled, resizes instance masks to a smaller size to reduce\n    # memory load. Recommended when using high-resolution images.\n    USE_MINI_MASK = True\n    MINI_MASK_SHAPE = (56, 56)  # (height, width) of the mini-mask\n\n    # Input image resizing\n    # Generally, use the \"square\" resizing mode for training and predicting\n    # and it should work well in most cases. In this mode, images are scaled\n    # up such that the small side is = IMAGE_MIN_DIM, but ensuring that the\n    # scaling doesn't make the long side > IMAGE_MAX_DIM. Then the image is\n    # padded with zeros to make it a square so multiple images can be put\n    # in one batch.\n    # Available resizing modes:\n    # none:   No resizing or padding. Return the image unchanged.\n    # square: Resize and pad with zeros to get a square image\n    #         of size [max_dim, max_dim].\n    # pad64:  Pads width and height with zeros to make them multiples of 64.\n    #         If IMAGE_MIN_DIM or IMAGE_MIN_SCALE are not None, then it scales\n    #         up before padding. IMAGE_MAX_DIM is ignored in this mode.\n    #         The multiple of 64 is needed to ensure smooth scaling of feature\n    #         maps up and down the 6 levels of the FPN pyramid (2**6=64).\n    # crop:   Picks random crops from the image. First, scales the image based\n    #         on IMAGE_MIN_DIM and IMAGE_MIN_SCALE, then picks a random crop of\n    #         size IMAGE_MIN_DIM x IMAGE_MIN_DIM. Can be used in training only.\n    #         IMAGE_MAX_DIM is not used in this mode.\n    IMAGE_RESIZE_MODE = \"square\"\n    IMAGE_MIN_DIM = 800\n    IMAGE_MAX_DIM = 1024\n    # Minimum scaling ratio. Checked after MIN_IMAGE_DIM and can force further\n    # up scaling. For example, if set to 2 then images are scaled up to double\n    # the width and height, or more, even if MIN_IMAGE_DIM doesn't require it.\n    # Howver, in 'square' mode, it can be overruled by IMAGE_MAX_DIM.\n    IMAGE_MIN_SCALE = 0\n    # Number of color channels per image. RGB = 3, grayscale = 1, RGB-D = 4\n    # Changing this requires other changes in the code. See the WIKI for more\n    # details: https://github.com/matterport/Mask_RCNN/wiki\n    IMAGE_CHANNEL_COUNT = 3\n\n    # Image mean (RGB)\n    MEAN_PIXEL = np.array([123.7, 116.8, 103.9])\n\n    # Number of ROIs per image to feed to classifier/mask heads\n    # The Mask RCNN paper uses 512 but often the RPN doesn't generate\n    # enough positive proposals to fill this and keep a positive:negative\n    # ratio of 1:3. You can increase the number of proposals by adjusting\n    # the RPN NMS threshold.\n    TRAIN_ROIS_PER_IMAGE = 200\n\n    # Percent of positive ROIs used to train classifier/mask heads\n    ROI_POSITIVE_RATIO = 0.33\n\n    # Pooled ROIs\n    POOL_SIZE = 7\n    MASK_POOL_SIZE = 14\n\n    # Shape of output mask\n    # To change this you also need to change the neural network mask branch\n    MASK_SHAPE = [28, 28]\n\n    # Maximum number of ground truth instances to use in one image\n    MAX_GT_INSTANCES = 100\n\n    # Bounding box refinement standard deviation for RPN and final detections.\n    RPN_BBOX_STD_DEV = np.array([0.1, 0.1, 0.2, 0.2])\n    BBOX_STD_DEV = np.array([0.1, 0.1, 0.2, 0.2])\n\n    # Max number of final detections\n    DETECTION_MAX_INSTANCES = 100\n\n    # Minimum probability value to accept a detected instance\n    # ROIs below this threshold are skipped\n    DETECTION_MIN_CONFIDENCE = 0.7\n\n    # Non-maximum suppression threshold for detection\n    DETECTION_NMS_THRESHOLD = 0.3\n\n    # Learning rate and momentum\n    # The Mask RCNN paper uses lr=0.02, but on TensorFlow it causes\n    # weights to explode. Likely due to differences in optimizer\n    # implementation.\n    LEARNING_RATE = 0.001\n    LEARNING_MOMENTUM = 0.9\n\n    # Weight decay regularization\n    WEIGHT_DECAY = 0.0001\n\n    # Loss weights for more precise optimization.\n    # Can be used for R-CNN training setup.\n    LOSS_WEIGHTS = {\n        \"rpn_class_loss\": 1.,\n        \"rpn_bbox_loss\": 1.,\n        \"mrcnn_class_loss\": 1.,\n        \"mrcnn_bbox_loss\": 1.,\n        \"mrcnn_mask_loss\": 1.\n    }\n\n    # Use RPN ROIs or externally generated ROIs for training\n    # Keep this True for most situations. Set to False if you want to train\n    # the head branches on ROI generated by code rather than the ROIs from\n    # the RPN. For example, to debug the classifier head without having to\n    # train the RPN.\n    USE_RPN_ROIS = True\n\n    # Train or freeze batch normalization layers\n    #     None: Train BN layers. This is the normal mode\n    #     False: Freeze BN layers. Good when using a small batch size\n    #     True: (don't use). Set layer in training mode even when predicting\n    TRAIN_BN = False  # Defaulting to False since batch size is often small\n\n    # Gradient norm clipping\n    GRADIENT_CLIP_NORM = 5.0\n\n    def __init__(self):\n        \"\"\"Set values of computed attributes.\"\"\"\n        # Effective batch size\n        self.BATCH_SIZE = self.IMAGES_PER_GPU * self.GPU_COUNT\n\n        # Input image size\n        if self.IMAGE_RESIZE_MODE == \"crop\":\n            self.IMAGE_SHAPE = np.array([self.IMAGE_MIN_DIM, self.IMAGE_MIN_DIM,\n                self.IMAGE_CHANNEL_COUNT])\n        else:\n            self.IMAGE_SHAPE = np.array([self.IMAGE_MAX_DIM, self.IMAGE_MAX_DIM,\n                self.IMAGE_CHANNEL_COUNT])\n\n        # Image meta data length\n        # See compose_image_meta() for details\n        self.IMAGE_META_SIZE = 1 + 3 + 3 + 4 + 1 + self.NUM_CLASSES\n\n    def display(self):\n        \"\"\"Display Configuration values.\"\"\"\n        print(\"\\nConfigurations:\")\n        for a in dir(self):\n            if not a.startswith(\"__\") and not callable(getattr(self, a)):\n                print(\"{:30} {}\".format(a, getattr(self, a)))\n        print(\"\\n\")\n"
  },
  {
    "path": "Mask_RCNN/mrcnn/model.py",
    "content": "\"\"\"\nMask R-CNN\nThe main Mask R-CNN model implementation.\n\nCopyright (c) 2017 Matterport, Inc.\nLicensed under the MIT License (see LICENSE for details)\nWritten by Waleed Abdulla\n\"\"\"\n\nimport os\nimport random\nimport datetime\nimport re\nimport math\nimport logging\nfrom collections import OrderedDict\nimport multiprocessing\nimport numpy as np\nimport tensorflow as tf\nimport keras\nimport keras.backend as K\nimport keras.layers as KL\nimport keras.engine as KE\nimport keras.models as KM\n\nfrom mrcnn import utils\n\n# Requires TensorFlow 1.3+ and Keras 2.0.8+.\nfrom distutils.version import LooseVersion\nassert LooseVersion(tf.__version__) >= LooseVersion(\"1.3\")\nassert LooseVersion(keras.__version__) >= LooseVersion('2.0.8')\n\n\n############################################################\n#  Utility Functions\n############################################################\n\ndef log(text, array=None):\n    \"\"\"Prints a text message. And, optionally, if a Numpy array is provided it\n    prints it's shape, min, and max values.\n    \"\"\"\n    if array is not None:\n        text = text.ljust(25)\n        text += (\"shape: {:20}  min: {:10.5f}  max: {:10.5f}  {}\".format(\n            str(array.shape),\n            array.min() if array.size else \"\",\n            array.max() if array.size else \"\",\n            array.dtype))\n    print(text)\n\n\nclass BatchNorm(KL.BatchNormalization):\n    \"\"\"Extends the Keras BatchNormalization class to allow a central place\n    to make changes if needed.\n\n    Batch normalization has a negative effect on training if batches are small\n    so this layer is often frozen (via setting in Config class) and functions\n    as linear layer.\n    \"\"\"\n    def call(self, inputs, training=None):\n        \"\"\"\n        Note about training values:\n            None: Train BN layers. This is the normal mode\n            False: Freeze BN layers. Good when batch size is small\n            True: (don't use). Set layer in training mode even when making inferences\n        \"\"\"\n        return super(self.__class__, self).call(inputs, training=training)\n\n\ndef compute_backbone_shapes(config, image_shape):\n    \"\"\"Computes the width and height of each stage of the backbone network.\n\n    Returns:\n        [N, (height, width)]. Where N is the number of stages\n    \"\"\"\n    if callable(config.BACKBONE):\n        return config.COMPUTE_BACKBONE_SHAPE(image_shape)\n\n    # Currently supports ResNet only\n    assert config.BACKBONE in [\"resnet50\", \"resnet101\"]\n    return np.array(\n        [[int(math.ceil(image_shape[0] / stride)),\n            int(math.ceil(image_shape[1] / stride))]\n            for stride in config.BACKBONE_STRIDES])\n\n\n############################################################\n#  Resnet Graph\n############################################################\n\n# Code adopted from:\n# https://github.com/fchollet/deep-learning-models/blob/master/resnet50.py\n\ndef identity_block(input_tensor, kernel_size, filters, stage, block,\n                   use_bias=True, train_bn=True):\n    \"\"\"The identity_block is the block that has no conv layer at shortcut\n    # Arguments\n        input_tensor: input tensor\n        kernel_size: default 3, the kernel size of middle conv layer at main path\n        filters: list of integers, the nb_filters of 3 conv layer at main path\n        stage: integer, current stage label, used for generating layer names\n        block: 'a','b'..., current block label, used for generating layer names\n        use_bias: Boolean. To use or not use a bias in conv layers.\n        train_bn: Boolean. Train or freeze Batch Norm layers\n    \"\"\"\n    nb_filter1, nb_filter2, nb_filter3 = filters\n    conv_name_base = 'res' + str(stage) + block + '_branch'\n    bn_name_base = 'bn' + str(stage) + block + '_branch'\n\n    x = KL.Conv2D(nb_filter1, (1, 1), name=conv_name_base + '2a',\n                  use_bias=use_bias)(input_tensor)\n    x = BatchNorm(name=bn_name_base + '2a')(x, training=train_bn)\n    x = KL.Activation('relu')(x)\n\n    x = KL.Conv2D(nb_filter2, (kernel_size, kernel_size), padding='same',\n                  name=conv_name_base + '2b', use_bias=use_bias)(x)\n    x = BatchNorm(name=bn_name_base + '2b')(x, training=train_bn)\n    x = KL.Activation('relu')(x)\n\n    x = KL.Conv2D(nb_filter3, (1, 1), name=conv_name_base + '2c',\n                  use_bias=use_bias)(x)\n    x = BatchNorm(name=bn_name_base + '2c')(x, training=train_bn)\n\n    x = KL.Add()([x, input_tensor])\n    x = KL.Activation('relu', name='res' + str(stage) + block + '_out')(x)\n    return x\n\n\ndef conv_block(input_tensor, kernel_size, filters, stage, block,\n               strides=(2, 2), use_bias=True, train_bn=True):\n    \"\"\"conv_block is the block that has a conv layer at shortcut\n    # Arguments\n        input_tensor: input tensor\n        kernel_size: default 3, the kernel size of middle conv layer at main path\n        filters: list of integers, the nb_filters of 3 conv layer at main path\n        stage: integer, current stage label, used for generating layer names\n        block: 'a','b'..., current block label, used for generating layer names\n        use_bias: Boolean. To use or not use a bias in conv layers.\n        train_bn: Boolean. Train or freeze Batch Norm layers\n    Note that from stage 3, the first conv layer at main path is with subsample=(2,2)\n    And the shortcut should have subsample=(2,2) as well\n    \"\"\"\n    nb_filter1, nb_filter2, nb_filter3 = filters\n    conv_name_base = 'res' + str(stage) + block + '_branch'\n    bn_name_base = 'bn' + str(stage) + block + '_branch'\n\n    x = KL.Conv2D(nb_filter1, (1, 1), strides=strides,\n                  name=conv_name_base + '2a', use_bias=use_bias)(input_tensor)\n    x = BatchNorm(name=bn_name_base + '2a')(x, training=train_bn)\n    x = KL.Activation('relu')(x)\n\n    x = KL.Conv2D(nb_filter2, (kernel_size, kernel_size), padding='same',\n                  name=conv_name_base + '2b', use_bias=use_bias)(x)\n    x = BatchNorm(name=bn_name_base + '2b')(x, training=train_bn)\n    x = KL.Activation('relu')(x)\n\n    x = KL.Conv2D(nb_filter3, (1, 1), name=conv_name_base +\n                  '2c', use_bias=use_bias)(x)\n    x = BatchNorm(name=bn_name_base + '2c')(x, training=train_bn)\n\n    shortcut = KL.Conv2D(nb_filter3, (1, 1), strides=strides,\n                         name=conv_name_base + '1', use_bias=use_bias)(input_tensor)\n    shortcut = BatchNorm(name=bn_name_base + '1')(shortcut, training=train_bn)\n\n    x = KL.Add()([x, shortcut])\n    x = KL.Activation('relu', name='res' + str(stage) + block + '_out')(x)\n    return x\n\n\ndef resnet_graph(input_image, architecture, stage5=False, train_bn=True):\n    \"\"\"Build a ResNet graph.\n        architecture: Can be resnet50 or resnet101\n        stage5: Boolean. If False, stage5 of the network is not created\n        train_bn: Boolean. Train or freeze Batch Norm layers\n    \"\"\"\n    assert architecture in [\"resnet50\", \"resnet101\"]\n    # Stage 1\n    x = KL.ZeroPadding2D((3, 3))(input_image)\n    x = KL.Conv2D(64, (7, 7), strides=(2, 2), name='conv1', use_bias=True)(x)\n    x = BatchNorm(name='bn_conv1')(x, training=train_bn)\n    x = KL.Activation('relu')(x)\n    C1 = x = KL.MaxPooling2D((3, 3), strides=(2, 2), padding=\"same\")(x)\n    # Stage 2\n    x = conv_block(x, 3, [64, 64, 256], stage=2, block='a', strides=(1, 1), train_bn=train_bn)\n    x = identity_block(x, 3, [64, 64, 256], stage=2, block='b', train_bn=train_bn)\n    C2 = x = identity_block(x, 3, [64, 64, 256], stage=2, block='c', train_bn=train_bn)\n    # Stage 3\n    x = conv_block(x, 3, [128, 128, 512], stage=3, block='a', train_bn=train_bn)\n    x = identity_block(x, 3, [128, 128, 512], stage=3, block='b', train_bn=train_bn)\n    x = identity_block(x, 3, [128, 128, 512], stage=3, block='c', train_bn=train_bn)\n    C3 = x = identity_block(x, 3, [128, 128, 512], stage=3, block='d', train_bn=train_bn)\n    # Stage 4\n    x = conv_block(x, 3, [256, 256, 1024], stage=4, block='a', train_bn=train_bn)\n    block_count = {\"resnet50\": 5, \"resnet101\": 22}[architecture]\n    for i in range(block_count):\n        x = identity_block(x, 3, [256, 256, 1024], stage=4, block=chr(98 + i), train_bn=train_bn)\n    C4 = x\n    # Stage 5\n    if stage5:\n        x = conv_block(x, 3, [512, 512, 2048], stage=5, block='a', train_bn=train_bn)\n        x = identity_block(x, 3, [512, 512, 2048], stage=5, block='b', train_bn=train_bn)\n        C5 = x = identity_block(x, 3, [512, 512, 2048], stage=5, block='c', train_bn=train_bn)\n    else:\n        C5 = None\n    return [C1, C2, C3, C4, C5]\n\n\n############################################################\n#  Proposal Layer\n############################################################\n\ndef apply_box_deltas_graph(boxes, deltas):\n    \"\"\"Applies the given deltas to the given boxes.\n    boxes: [N, (y1, x1, y2, x2)] boxes to update\n    deltas: [N, (dy, dx, log(dh), log(dw))] refinements to apply\n    \"\"\"\n    # Convert to y, x, h, w\n    height = boxes[:, 2] - boxes[:, 0]\n    width = boxes[:, 3] - boxes[:, 1]\n    center_y = boxes[:, 0] + 0.5 * height\n    center_x = boxes[:, 1] + 0.5 * width\n    # Apply deltas\n    center_y += deltas[:, 0] * height\n    center_x += deltas[:, 1] * width\n    height *= tf.exp(deltas[:, 2])\n    width *= tf.exp(deltas[:, 3])\n    # Convert back to y1, x1, y2, x2\n    y1 = center_y - 0.5 * height\n    x1 = center_x - 0.5 * width\n    y2 = y1 + height\n    x2 = x1 + width\n    result = tf.stack([y1, x1, y2, x2], axis=1, name=\"apply_box_deltas_out\")\n    return result\n\n\ndef clip_boxes_graph(boxes, window):\n    \"\"\"\n    boxes: [N, (y1, x1, y2, x2)]\n    window: [4] in the form y1, x1, y2, x2\n    \"\"\"\n    # Split\n    wy1, wx1, wy2, wx2 = tf.split(window, 4)\n    y1, x1, y2, x2 = tf.split(boxes, 4, axis=1)\n    # Clip\n    y1 = tf.maximum(tf.minimum(y1, wy2), wy1)\n    x1 = tf.maximum(tf.minimum(x1, wx2), wx1)\n    y2 = tf.maximum(tf.minimum(y2, wy2), wy1)\n    x2 = tf.maximum(tf.minimum(x2, wx2), wx1)\n    clipped = tf.concat([y1, x1, y2, x2], axis=1, name=\"clipped_boxes\")\n    clipped.set_shape((clipped.shape[0], 4))\n    return clipped\n\n\nclass ProposalLayer(KE.Layer):\n    \"\"\"Receives anchor scores and selects a subset to pass as proposals\n    to the second stage. Filtering is done based on anchor scores and\n    non-max suppression to remove overlaps. It also applies bounding\n    box refinement deltas to anchors.\n\n    Inputs:\n        rpn_probs: [batch, num_anchors, (bg prob, fg prob)]\n        rpn_bbox: [batch, num_anchors, (dy, dx, log(dh), log(dw))]\n        anchors: [batch, num_anchors, (y1, x1, y2, x2)] anchors in normalized coordinates\n\n    Returns:\n        Proposals in normalized coordinates [batch, rois, (y1, x1, y2, x2)]\n    \"\"\"\n\n    def __init__(self, proposal_count, nms_threshold, config=None, **kwargs):\n        super(ProposalLayer, self).__init__(**kwargs)\n        self.config = config\n        self.proposal_count = proposal_count\n        self.nms_threshold = nms_threshold\n\n    def call(self, inputs):\n        # Box Scores. Use the foreground class confidence. [Batch, num_rois, 1]\n        scores = inputs[0][:, :, 1]\n        # Box deltas [batch, num_rois, 4]\n        deltas = inputs[1]\n        deltas = deltas * np.reshape(self.config.RPN_BBOX_STD_DEV, [1, 1, 4])\n        # Anchors\n        anchors = inputs[2]\n\n        # Improve performance by trimming to top anchors by score\n        # and doing the rest on the smaller subset.\n        pre_nms_limit = tf.minimum(self.config.PRE_NMS_LIMIT, tf.shape(anchors)[1])\n        ix = tf.nn.top_k(scores, pre_nms_limit, sorted=True,\n                         name=\"top_anchors\").indices\n        scores = utils.batch_slice([scores, ix], lambda x, y: tf.gather(x, y),\n                                   self.config.IMAGES_PER_GPU)\n        deltas = utils.batch_slice([deltas, ix], lambda x, y: tf.gather(x, y),\n                                   self.config.IMAGES_PER_GPU)\n        pre_nms_anchors = utils.batch_slice([anchors, ix], lambda a, x: tf.gather(a, x),\n                                    self.config.IMAGES_PER_GPU,\n                                    names=[\"pre_nms_anchors\"])\n\n        # Apply deltas to anchors to get refined anchors.\n        # [batch, N, (y1, x1, y2, x2)]\n        boxes = utils.batch_slice([pre_nms_anchors, deltas],\n                                  lambda x, y: apply_box_deltas_graph(x, y),\n                                  self.config.IMAGES_PER_GPU,\n                                  names=[\"refined_anchors\"])\n\n        # Clip to image boundaries. Since we're in normalized coordinates,\n        # clip to 0..1 range. [batch, N, (y1, x1, y2, x2)]\n        window = np.array([0, 0, 1, 1], dtype=np.float32)\n        boxes = utils.batch_slice(boxes,\n                                  lambda x: clip_boxes_graph(x, window),\n                                  self.config.IMAGES_PER_GPU,\n                                  names=[\"refined_anchors_clipped\"])\n\n        # Filter out small boxes\n        # According to Xinlei Chen's paper, this reduces detection accuracy\n        # for small objects, so we're skipping it.\n\n        # Non-max suppression\n        def nms(boxes, scores):\n            indices = tf.image.non_max_suppression(\n                boxes, scores, self.proposal_count,\n                self.nms_threshold, name=\"rpn_non_max_suppression\")\n            proposals = tf.gather(boxes, indices)\n            # Pad if needed\n            padding = tf.maximum(self.proposal_count - tf.shape(proposals)[0], 0)\n            proposals = tf.pad(proposals, [(0, padding), (0, 0)])\n            return proposals\n        proposals = utils.batch_slice([boxes, scores], nms,\n                                      self.config.IMAGES_PER_GPU)\n        return proposals\n\n    def compute_output_shape(self, input_shape):\n        return (None, self.proposal_count, 4)\n\n\n############################################################\n#  ROIAlign Layer\n############################################################\n\ndef log2_graph(x):\n    \"\"\"Implementation of Log2. TF doesn't have a native implementation.\"\"\"\n    return tf.log(x) / tf.log(2.0)\n\n\nclass PyramidROIAlign(KE.Layer):\n    \"\"\"Implements ROI Pooling on multiple levels of the feature pyramid.\n\n    Params:\n    - pool_shape: [pool_height, pool_width] of the output pooled regions. Usually [7, 7]\n\n    Inputs:\n    - boxes: [batch, num_boxes, (y1, x1, y2, x2)] in normalized\n             coordinates. Possibly padded with zeros if not enough\n             boxes to fill the array.\n    - image_meta: [batch, (meta data)] Image details. See compose_image_meta()\n    - feature_maps: List of feature maps from different levels of the pyramid.\n                    Each is [batch, height, width, channels]\n\n    Output:\n    Pooled regions in the shape: [batch, num_boxes, pool_height, pool_width, channels].\n    The width and height are those specific in the pool_shape in the layer\n    constructor.\n    \"\"\"\n\n    def __init__(self, pool_shape, **kwargs):\n        super(PyramidROIAlign, self).__init__(**kwargs)\n        self.pool_shape = tuple(pool_shape)\n\n    def call(self, inputs):\n        # Crop boxes [batch, num_boxes, (y1, x1, y2, x2)] in normalized coords\n        boxes = inputs[0]\n\n        # Image meta\n        # Holds details about the image. See compose_image_meta()\n        image_meta = inputs[1]\n\n        # Feature Maps. List of feature maps from different level of the\n        # feature pyramid. Each is [batch, height, width, channels]\n        feature_maps = inputs[2:]\n\n        # Assign each ROI to a level in the pyramid based on the ROI area.\n        y1, x1, y2, x2 = tf.split(boxes, 4, axis=2)\n        h = y2 - y1\n        w = x2 - x1\n        # Use shape of first image. Images in a batch must have the same size.\n        image_shape = parse_image_meta_graph(image_meta)['image_shape'][0]\n        # Equation 1 in the Feature Pyramid Networks paper. Account for\n        # the fact that our coordinates are normalized here.\n        # e.g. a 224x224 ROI (in pixels) maps to P4\n        image_area = tf.cast(image_shape[0] * image_shape[1], tf.float32)\n        roi_level = log2_graph(tf.sqrt(h * w) / (224.0 / tf.sqrt(image_area)))\n        roi_level = tf.minimum(5, tf.maximum(\n            2, 4 + tf.cast(tf.round(roi_level), tf.int32)))\n        roi_level = tf.squeeze(roi_level, 2)\n\n        # Loop through levels and apply ROI pooling to each. P2 to P5.\n        pooled = []\n        box_to_level = []\n        for i, level in enumerate(range(2, 6)):\n            ix = tf.where(tf.equal(roi_level, level))\n            level_boxes = tf.gather_nd(boxes, ix)\n\n            # Box indices for crop_and_resize.\n            box_indices = tf.cast(ix[:, 0], tf.int32)\n\n            # Keep track of which box is mapped to which level\n            box_to_level.append(ix)\n\n            # Stop gradient propogation to ROI proposals\n            level_boxes = tf.stop_gradient(level_boxes)\n            box_indices = tf.stop_gradient(box_indices)\n\n            # Crop and Resize\n            # From Mask R-CNN paper: \"We sample four regular locations, so\n            # that we can evaluate either max or average pooling. In fact,\n            # interpolating only a single value at each bin center (without\n            # pooling) is nearly as effective.\"\n            #\n            # Here we use the simplified approach of a single value per bin,\n            # which is how it's done in tf.crop_and_resize()\n            # Result: [batch * num_boxes, pool_height, pool_width, channels]\n            pooled.append(tf.image.crop_and_resize(\n                feature_maps[i], level_boxes, box_indices, self.pool_shape,\n                method=\"bilinear\"))\n\n        # Pack pooled features into one tensor\n        pooled = tf.concat(pooled, axis=0)\n\n        # Pack box_to_level mapping into one array and add another\n        # column representing the order of pooled boxes\n        box_to_level = tf.concat(box_to_level, axis=0)\n        box_range = tf.expand_dims(tf.range(tf.shape(box_to_level)[0]), 1)\n        box_to_level = tf.concat([tf.cast(box_to_level, tf.int32), box_range],\n                                 axis=1)\n\n        # Rearrange pooled features to match the order of the original boxes\n        # Sort box_to_level by batch then box index\n        # TF doesn't have a way to sort by two columns, so merge them and sort.\n        sorting_tensor = box_to_level[:, 0] * 100000 + box_to_level[:, 1]\n        ix = tf.nn.top_k(sorting_tensor, k=tf.shape(\n            box_to_level)[0]).indices[::-1]\n        ix = tf.gather(box_to_level[:, 2], ix)\n        pooled = tf.gather(pooled, ix)\n\n        # Re-add the batch dimension\n        shape = tf.concat([tf.shape(boxes)[:2], tf.shape(pooled)[1:]], axis=0)\n        pooled = tf.reshape(pooled, shape)\n        return pooled\n\n    def compute_output_shape(self, input_shape):\n        return input_shape[0][:2] + self.pool_shape + (input_shape[2][-1], )\n\n\n############################################################\n#  Detection Target Layer\n############################################################\n\ndef overlaps_graph(boxes1, boxes2):\n    \"\"\"Computes IoU overlaps between two sets of boxes.\n    boxes1, boxes2: [N, (y1, x1, y2, x2)].\n    \"\"\"\n    # 1. Tile boxes2 and repeat boxes1. This allows us to compare\n    # every boxes1 against every boxes2 without loops.\n    # TF doesn't have an equivalent to np.repeat() so simulate it\n    # using tf.tile() and tf.reshape.\n    b1 = tf.reshape(tf.tile(tf.expand_dims(boxes1, 1),\n                            [1, 1, tf.shape(boxes2)[0]]), [-1, 4])\n    b2 = tf.tile(boxes2, [tf.shape(boxes1)[0], 1])\n    # 2. Compute intersections\n    b1_y1, b1_x1, b1_y2, b1_x2 = tf.split(b1, 4, axis=1)\n    b2_y1, b2_x1, b2_y2, b2_x2 = tf.split(b2, 4, axis=1)\n    y1 = tf.maximum(b1_y1, b2_y1)\n    x1 = tf.maximum(b1_x1, b2_x1)\n    y2 = tf.minimum(b1_y2, b2_y2)\n    x2 = tf.minimum(b1_x2, b2_x2)\n    intersection = tf.maximum(x2 - x1, 0) * tf.maximum(y2 - y1, 0)\n    # 3. Compute unions\n    b1_area = (b1_y2 - b1_y1) * (b1_x2 - b1_x1)\n    b2_area = (b2_y2 - b2_y1) * (b2_x2 - b2_x1)\n    union = b1_area + b2_area - intersection\n    # 4. Compute IoU and reshape to [boxes1, boxes2]\n    iou = intersection / union\n    overlaps = tf.reshape(iou, [tf.shape(boxes1)[0], tf.shape(boxes2)[0]])\n    return overlaps\n\n\ndef detection_targets_graph(proposals, gt_class_ids, gt_boxes, gt_masks, config):\n    \"\"\"Generates detection targets for one image. Subsamples proposals and\n    generates target class IDs, bounding box deltas, and masks for each.\n\n    Inputs:\n    proposals: [POST_NMS_ROIS_TRAINING, (y1, x1, y2, x2)] in normalized coordinates. Might\n               be zero padded if there are not enough proposals.\n    gt_class_ids: [MAX_GT_INSTANCES] int class IDs\n    gt_boxes: [MAX_GT_INSTANCES, (y1, x1, y2, x2)] in normalized coordinates.\n    gt_masks: [height, width, MAX_GT_INSTANCES] of boolean type.\n\n    Returns: Target ROIs and corresponding class IDs, bounding box shifts,\n    and masks.\n    rois: [TRAIN_ROIS_PER_IMAGE, (y1, x1, y2, x2)] in normalized coordinates\n    class_ids: [TRAIN_ROIS_PER_IMAGE]. Integer class IDs. Zero padded.\n    deltas: [TRAIN_ROIS_PER_IMAGE, (dy, dx, log(dh), log(dw))]\n    masks: [TRAIN_ROIS_PER_IMAGE, height, width]. Masks cropped to bbox\n           boundaries and resized to neural network output size.\n\n    Note: Returned arrays might be zero padded if not enough target ROIs.\n    \"\"\"\n    # Assertions\n    asserts = [\n        tf.Assert(tf.greater(tf.shape(proposals)[0], 0), [proposals],\n                  name=\"roi_assertion\"),\n    ]\n    with tf.control_dependencies(asserts):\n        proposals = tf.identity(proposals)\n\n    # Remove zero padding\n    proposals, _ = trim_zeros_graph(proposals, name=\"trim_proposals\")\n    gt_boxes, non_zeros = trim_zeros_graph(gt_boxes, name=\"trim_gt_boxes\")\n    gt_class_ids = tf.boolean_mask(gt_class_ids, non_zeros,\n                                   name=\"trim_gt_class_ids\")\n    gt_masks = tf.gather(gt_masks, tf.where(non_zeros)[:, 0], axis=2,\n                         name=\"trim_gt_masks\")\n\n    # Handle COCO crowds\n    # A crowd box in COCO is a bounding box around several instances. Exclude\n    # them from training. A crowd box is given a negative class ID.\n    crowd_ix = tf.where(gt_class_ids < 0)[:, 0]\n    non_crowd_ix = tf.where(gt_class_ids > 0)[:, 0]\n    crowd_boxes = tf.gather(gt_boxes, crowd_ix)\n    crowd_masks = tf.gather(gt_masks, crowd_ix, axis=2)\n    gt_class_ids = tf.gather(gt_class_ids, non_crowd_ix)\n    gt_boxes = tf.gather(gt_boxes, non_crowd_ix)\n    gt_masks = tf.gather(gt_masks, non_crowd_ix, axis=2)\n\n    # Compute overlaps matrix [proposals, gt_boxes]\n    overlaps = overlaps_graph(proposals, gt_boxes)\n\n    # Compute overlaps with crowd boxes [proposals, crowd_boxes]\n    crowd_overlaps = overlaps_graph(proposals, crowd_boxes)\n    crowd_iou_max = tf.reduce_max(crowd_overlaps, axis=1)\n    no_crowd_bool = (crowd_iou_max < 0.001)\n\n    # Determine positive and negative ROIs\n    roi_iou_max = tf.reduce_max(overlaps, axis=1)\n    # 1. Positive ROIs are those with >= 0.5 IoU with a GT box\n    positive_roi_bool = (roi_iou_max >= 0.5)\n    positive_indices = tf.where(positive_roi_bool)[:, 0]\n    # 2. Negative ROIs are those with < 0.5 with every GT box. Skip crowds.\n    negative_indices = tf.where(tf.logical_and(roi_iou_max < 0.5, no_crowd_bool))[:, 0]\n\n    # Subsample ROIs. Aim for 33% positive\n    # Positive ROIs\n    positive_count = int(config.TRAIN_ROIS_PER_IMAGE *\n                         config.ROI_POSITIVE_RATIO)\n    positive_indices = tf.random_shuffle(positive_indices)[:positive_count]\n    positive_count = tf.shape(positive_indices)[0]\n    # Negative ROIs. Add enough to maintain positive:negative ratio.\n    r = 1.0 / config.ROI_POSITIVE_RATIO\n    negative_count = tf.cast(r * tf.cast(positive_count, tf.float32), tf.int32) - positive_count\n    negative_indices = tf.random_shuffle(negative_indices)[:negative_count]\n    # Gather selected ROIs\n    positive_rois = tf.gather(proposals, positive_indices)\n    negative_rois = tf.gather(proposals, negative_indices)\n\n    # Assign positive ROIs to GT boxes.\n    positive_overlaps = tf.gather(overlaps, positive_indices)\n    roi_gt_box_assignment = tf.cond(\n        tf.greater(tf.shape(positive_overlaps)[1], 0),\n        true_fn = lambda: tf.argmax(positive_overlaps, axis=1),\n        false_fn = lambda: tf.cast(tf.constant([]),tf.int64)\n    )\n    roi_gt_boxes = tf.gather(gt_boxes, roi_gt_box_assignment)\n    roi_gt_class_ids = tf.gather(gt_class_ids, roi_gt_box_assignment)\n\n    # Compute bbox refinement for positive ROIs\n    deltas = utils.box_refinement_graph(positive_rois, roi_gt_boxes)\n    deltas /= config.BBOX_STD_DEV\n\n    # Assign positive ROIs to GT masks\n    # Permute masks to [N, height, width, 1]\n    transposed_masks = tf.expand_dims(tf.transpose(gt_masks, [2, 0, 1]), -1)\n    # Pick the right mask for each ROI\n    roi_masks = tf.gather(transposed_masks, roi_gt_box_assignment)\n\n    # Compute mask targets\n    boxes = positive_rois\n    if config.USE_MINI_MASK:\n        # Transform ROI coordinates from normalized image space\n        # to normalized mini-mask space.\n        y1, x1, y2, x2 = tf.split(positive_rois, 4, axis=1)\n        gt_y1, gt_x1, gt_y2, gt_x2 = tf.split(roi_gt_boxes, 4, axis=1)\n        gt_h = gt_y2 - gt_y1\n        gt_w = gt_x2 - gt_x1\n        y1 = (y1 - gt_y1) / gt_h\n        x1 = (x1 - gt_x1) / gt_w\n        y2 = (y2 - gt_y1) / gt_h\n        x2 = (x2 - gt_x1) / gt_w\n        boxes = tf.concat([y1, x1, y2, x2], 1)\n    box_ids = tf.range(0, tf.shape(roi_masks)[0])\n    masks = tf.image.crop_and_resize(tf.cast(roi_masks, tf.float32), boxes,\n                                     box_ids,\n                                     config.MASK_SHAPE)\n    # Remove the extra dimension from masks.\n    masks = tf.squeeze(masks, axis=3)\n\n    # Threshold mask pixels at 0.5 to have GT masks be 0 or 1 to use with\n    # binary cross entropy loss.\n    masks = tf.round(masks)\n\n    # Append negative ROIs and pad bbox deltas and masks that\n    # are not used for negative ROIs with zeros.\n    rois = tf.concat([positive_rois, negative_rois], axis=0)\n    N = tf.shape(negative_rois)[0]\n    P = tf.maximum(config.TRAIN_ROIS_PER_IMAGE - tf.shape(rois)[0], 0)\n    rois = tf.pad(rois, [(0, P), (0, 0)])\n    roi_gt_boxes = tf.pad(roi_gt_boxes, [(0, N + P), (0, 0)])\n    roi_gt_class_ids = tf.pad(roi_gt_class_ids, [(0, N + P)])\n    deltas = tf.pad(deltas, [(0, N + P), (0, 0)])\n    masks = tf.pad(masks, [[0, N + P], (0, 0), (0, 0)])\n\n    return rois, roi_gt_class_ids, deltas, masks\n\n\nclass DetectionTargetLayer(KE.Layer):\n    \"\"\"Subsamples proposals and generates target box refinement, class_ids,\n    and masks for each.\n\n    Inputs:\n    proposals: [batch, N, (y1, x1, y2, x2)] in normalized coordinates. Might\n               be zero padded if there are not enough proposals.\n    gt_class_ids: [batch, MAX_GT_INSTANCES] Integer class IDs.\n    gt_boxes: [batch, MAX_GT_INSTANCES, (y1, x1, y2, x2)] in normalized\n              coordinates.\n    gt_masks: [batch, height, width, MAX_GT_INSTANCES] of boolean type\n\n    Returns: Target ROIs and corresponding class IDs, bounding box shifts,\n    and masks.\n    rois: [batch, TRAIN_ROIS_PER_IMAGE, (y1, x1, y2, x2)] in normalized\n          coordinates\n    target_class_ids: [batch, TRAIN_ROIS_PER_IMAGE]. Integer class IDs.\n    target_deltas: [batch, TRAIN_ROIS_PER_IMAGE, (dy, dx, log(dh), log(dw)]\n    target_mask: [batch, TRAIN_ROIS_PER_IMAGE, height, width]\n                 Masks cropped to bbox boundaries and resized to neural\n                 network output size.\n\n    Note: Returned arrays might be zero padded if not enough target ROIs.\n    \"\"\"\n\n    def __init__(self, config, **kwargs):\n        super(DetectionTargetLayer, self).__init__(**kwargs)\n        self.config = config\n\n    def call(self, inputs):\n        proposals = inputs[0]\n        gt_class_ids = inputs[1]\n        gt_boxes = inputs[2]\n        gt_masks = inputs[3]\n\n        # Slice the batch and run a graph for each slice\n        # TODO: Rename target_bbox to target_deltas for clarity\n        names = [\"rois\", \"target_class_ids\", \"target_bbox\", \"target_mask\"]\n        outputs = utils.batch_slice(\n            [proposals, gt_class_ids, gt_boxes, gt_masks],\n            lambda w, x, y, z: detection_targets_graph(\n                w, x, y, z, self.config),\n            self.config.IMAGES_PER_GPU, names=names)\n        return outputs\n\n    def compute_output_shape(self, input_shape):\n        return [\n            (None, self.config.TRAIN_ROIS_PER_IMAGE, 4),  # rois\n            (None, self.config.TRAIN_ROIS_PER_IMAGE),  # class_ids\n            (None, self.config.TRAIN_ROIS_PER_IMAGE, 4),  # deltas\n            (None, self.config.TRAIN_ROIS_PER_IMAGE, self.config.MASK_SHAPE[0],\n             self.config.MASK_SHAPE[1])  # masks\n        ]\n\n    def compute_mask(self, inputs, mask=None):\n        return [None, None, None, None]\n\n\n############################################################\n#  Detection Layer\n############################################################\n\ndef refine_detections_graph(rois, probs, deltas, window, config):\n    \"\"\"Refine classified proposals and filter overlaps and return final\n    detections.\n\n    Inputs:\n        rois: [N, (y1, x1, y2, x2)] in normalized coordinates\n        probs: [N, num_classes]. Class probabilities.\n        deltas: [N, num_classes, (dy, dx, log(dh), log(dw))]. Class-specific\n                bounding box deltas.\n        window: (y1, x1, y2, x2) in normalized coordinates. The part of the image\n            that contains the image excluding the padding.\n\n    Returns detections shaped: [num_detections, (y1, x1, y2, x2, class_id, score)] where\n        coordinates are normalized.\n    \"\"\"\n    # Class IDs per ROI\n    class_ids = tf.argmax(probs, axis=1, output_type=tf.int32)\n    # Class probability of the top class of each ROI\n    indices = tf.stack([tf.range(probs.shape[0]), class_ids], axis=1)\n    class_scores = tf.gather_nd(probs, indices)\n    # Class-specific bounding box deltas\n    deltas_specific = tf.gather_nd(deltas, indices)\n    # Apply bounding box deltas\n    # Shape: [boxes, (y1, x1, y2, x2)] in normalized coordinates\n    refined_rois = apply_box_deltas_graph(\n        rois, deltas_specific * config.BBOX_STD_DEV)\n    # Clip boxes to image window\n    refined_rois = clip_boxes_graph(refined_rois, window)\n\n    # TODO: Filter out boxes with zero area\n\n    # Filter out background boxes\n    keep = tf.where(class_ids > 0)[:, 0]\n    # Filter out low confidence boxes\n    if config.DETECTION_MIN_CONFIDENCE:\n        conf_keep = tf.where(class_scores >= config.DETECTION_MIN_CONFIDENCE)[:, 0]\n        keep = tf.sets.set_intersection(tf.expand_dims(keep, 0),\n                                        tf.expand_dims(conf_keep, 0))\n        keep = tf.sparse_tensor_to_dense(keep)[0]\n\n    # Apply per-class NMS\n    # 1. Prepare variables\n    pre_nms_class_ids = tf.gather(class_ids, keep)\n    pre_nms_scores = tf.gather(class_scores, keep)\n    pre_nms_rois = tf.gather(refined_rois,   keep)\n    unique_pre_nms_class_ids = tf.unique(pre_nms_class_ids)[0]\n\n    def nms_keep_map(class_id):\n        \"\"\"Apply Non-Maximum Suppression on ROIs of the given class.\"\"\"\n        # Indices of ROIs of the given class\n        ixs = tf.where(tf.equal(pre_nms_class_ids, class_id))[:, 0]\n        # Apply NMS\n        class_keep = tf.image.non_max_suppression(\n                tf.gather(pre_nms_rois, ixs),\n                tf.gather(pre_nms_scores, ixs),\n                max_output_size=config.DETECTION_MAX_INSTANCES,\n                iou_threshold=config.DETECTION_NMS_THRESHOLD)\n        # Map indices\n        class_keep = tf.gather(keep, tf.gather(ixs, class_keep))\n        # Pad with -1 so returned tensors have the same shape\n        gap = config.DETECTION_MAX_INSTANCES - tf.shape(class_keep)[0]\n        class_keep = tf.pad(class_keep, [(0, gap)],\n                            mode='CONSTANT', constant_values=-1)\n        # Set shape so map_fn() can infer result shape\n        class_keep.set_shape([config.DETECTION_MAX_INSTANCES])\n        return class_keep\n\n    # 2. Map over class IDs\n    nms_keep = tf.map_fn(nms_keep_map, unique_pre_nms_class_ids,\n                         dtype=tf.int64)\n    # 3. Merge results into one list, and remove -1 padding\n    nms_keep = tf.reshape(nms_keep, [-1])\n    nms_keep = tf.gather(nms_keep, tf.where(nms_keep > -1)[:, 0])\n    # 4. Compute intersection between keep and nms_keep\n    keep = tf.sets.set_intersection(tf.expand_dims(keep, 0),\n                                    tf.expand_dims(nms_keep, 0))\n    keep = tf.sparse_tensor_to_dense(keep)[0]\n    # Keep top detections\n    roi_count = config.DETECTION_MAX_INSTANCES\n    class_scores_keep = tf.gather(class_scores, keep)\n    num_keep = tf.minimum(tf.shape(class_scores_keep)[0], roi_count)\n    top_ids = tf.nn.top_k(class_scores_keep, k=num_keep, sorted=True)[1]\n    keep = tf.gather(keep, top_ids)\n\n    # Arrange output as [N, (y1, x1, y2, x2, class_id, score)]\n    # Coordinates are normalized.\n    detections = tf.concat([\n        tf.gather(refined_rois, keep),\n        tf.to_float(tf.gather(class_ids, keep))[..., tf.newaxis],\n        tf.gather(class_scores, keep)[..., tf.newaxis]\n        ], axis=1)\n\n    # Pad with zeros if detections < DETECTION_MAX_INSTANCES\n    gap = config.DETECTION_MAX_INSTANCES - tf.shape(detections)[0]\n    detections = tf.pad(detections, [(0, gap), (0, 0)], \"CONSTANT\")\n    return detections\n\n\nclass DetectionLayer(KE.Layer):\n    \"\"\"Takes classified proposal boxes and their bounding box deltas and\n    returns the final detection boxes.\n\n    Returns:\n    [batch, num_detections, (y1, x1, y2, x2, class_id, class_score)] where\n    coordinates are normalized.\n    \"\"\"\n\n    def __init__(self, config=None, **kwargs):\n        super(DetectionLayer, self).__init__(**kwargs)\n        self.config = config\n\n    def call(self, inputs):\n        rois = inputs[0]\n        mrcnn_class = inputs[1]\n        mrcnn_bbox = inputs[2]\n        image_meta = inputs[3]\n\n        # Get windows of images in normalized coordinates. Windows are the area\n        # in the image that excludes the padding.\n        # Use the shape of the first image in the batch to normalize the window\n        # because we know that all images get resized to the same size.\n        m = parse_image_meta_graph(image_meta)\n        image_shape = m['image_shape'][0]\n        window = norm_boxes_graph(m['window'], image_shape[:2])\n\n        # Run detection refinement graph on each item in the batch\n        detections_batch = utils.batch_slice(\n            [rois, mrcnn_class, mrcnn_bbox, window],\n            lambda x, y, w, z: refine_detections_graph(x, y, w, z, self.config),\n            self.config.IMAGES_PER_GPU)\n\n        # Reshape output\n        # [batch, num_detections, (y1, x1, y2, x2, class_id, class_score)] in\n        # normalized coordinates\n        return tf.reshape(\n            detections_batch,\n            [self.config.BATCH_SIZE, self.config.DETECTION_MAX_INSTANCES, 6])\n\n    def compute_output_shape(self, input_shape):\n        return (None, self.config.DETECTION_MAX_INSTANCES, 6)\n\n\n############################################################\n#  Region Proposal Network (RPN)\n############################################################\n\ndef rpn_graph(feature_map, anchors_per_location, anchor_stride):\n    \"\"\"Builds the computation graph of Region Proposal Network.\n\n    feature_map: backbone features [batch, height, width, depth]\n    anchors_per_location: number of anchors per pixel in the feature map\n    anchor_stride: Controls the density of anchors. Typically 1 (anchors for\n                   every pixel in the feature map), or 2 (every other pixel).\n\n    Returns:\n        rpn_class_logits: [batch, H * W * anchors_per_location, 2] Anchor classifier logits (before softmax)\n        rpn_probs: [batch, H * W * anchors_per_location, 2] Anchor classifier probabilities.\n        rpn_bbox: [batch, H * W * anchors_per_location, (dy, dx, log(dh), log(dw))] Deltas to be\n                  applied to anchors.\n    \"\"\"\n    # TODO: check if stride of 2 causes alignment issues if the feature map\n    # is not even.\n    # Shared convolutional base of the RPN\n    shared = KL.Conv2D(512, (3, 3), padding='same', activation='relu',\n                       strides=anchor_stride,\n                       name='rpn_conv_shared')(feature_map)\n\n    # Anchor Score. [batch, height, width, anchors per location * 2].\n    x = KL.Conv2D(2 * anchors_per_location, (1, 1), padding='valid',\n                  activation='linear', name='rpn_class_raw')(shared)\n\n    # Reshape to [batch, anchors, 2]\n    rpn_class_logits = KL.Lambda(\n        lambda t: tf.reshape(t, [tf.shape(t)[0], -1, 2]))(x)\n\n    # Softmax on last dimension of BG/FG.\n    rpn_probs = KL.Activation(\n        \"softmax\", name=\"rpn_class_xxx\")(rpn_class_logits)\n\n    # Bounding box refinement. [batch, H, W, anchors per location * depth]\n    # where depth is [x, y, log(w), log(h)]\n    x = KL.Conv2D(anchors_per_location * 4, (1, 1), padding=\"valid\",\n                  activation='linear', name='rpn_bbox_pred')(shared)\n\n    # Reshape to [batch, anchors, 4]\n    rpn_bbox = KL.Lambda(lambda t: tf.reshape(t, [tf.shape(t)[0], -1, 4]))(x)\n\n    return [rpn_class_logits, rpn_probs, rpn_bbox]\n\n\ndef build_rpn_model(anchor_stride, anchors_per_location, depth):\n    \"\"\"Builds a Keras model of the Region Proposal Network.\n    It wraps the RPN graph so it can be used multiple times with shared\n    weights.\n\n    anchors_per_location: number of anchors per pixel in the feature map\n    anchor_stride: Controls the density of anchors. Typically 1 (anchors for\n                   every pixel in the feature map), or 2 (every other pixel).\n    depth: Depth of the backbone feature map.\n\n    Returns a Keras Model object. The model outputs, when called, are:\n    rpn_class_logits: [batch, H * W * anchors_per_location, 2] Anchor classifier logits (before softmax)\n    rpn_probs: [batch, H * W * anchors_per_location, 2] Anchor classifier probabilities.\n    rpn_bbox: [batch, H * W * anchors_per_location, (dy, dx, log(dh), log(dw))] Deltas to be\n                applied to anchors.\n    \"\"\"\n    input_feature_map = KL.Input(shape=[None, None, depth],\n                                 name=\"input_rpn_feature_map\")\n    outputs = rpn_graph(input_feature_map, anchors_per_location, anchor_stride)\n    return KM.Model([input_feature_map], outputs, name=\"rpn_model\")\n\n\n############################################################\n#  Feature Pyramid Network Heads\n############################################################\n\ndef fpn_classifier_graph(rois, feature_maps, image_meta,\n                         pool_size, num_classes, train_bn=True,\n                         fc_layers_size=1024):\n    \"\"\"Builds the computation graph of the feature pyramid network classifier\n    and regressor heads.\n\n    rois: [batch, num_rois, (y1, x1, y2, x2)] Proposal boxes in normalized\n          coordinates.\n    feature_maps: List of feature maps from different layers of the pyramid,\n                  [P2, P3, P4, P5]. Each has a different resolution.\n    image_meta: [batch, (meta data)] Image details. See compose_image_meta()\n    pool_size: The width of the square feature map generated from ROI Pooling.\n    num_classes: number of classes, which determines the depth of the results\n    train_bn: Boolean. Train or freeze Batch Norm layers\n    fc_layers_size: Size of the 2 FC layers\n\n    Returns:\n        logits: [batch, num_rois, NUM_CLASSES] classifier logits (before softmax)\n        probs: [batch, num_rois, NUM_CLASSES] classifier probabilities\n        bbox_deltas: [batch, num_rois, NUM_CLASSES, (dy, dx, log(dh), log(dw))] Deltas to apply to\n                     proposal boxes\n    \"\"\"\n    # ROI Pooling\n    # Shape: [batch, num_rois, POOL_SIZE, POOL_SIZE, channels]\n    x = PyramidROIAlign([pool_size, pool_size],\n                        name=\"roi_align_classifier\")([rois, image_meta] + feature_maps)\n    # Two 1024 FC layers (implemented with Conv2D for consistency)\n    x = KL.TimeDistributed(KL.Conv2D(fc_layers_size, (pool_size, pool_size), padding=\"valid\"),\n                           name=\"mrcnn_class_conv1\")(x)\n    x = KL.TimeDistributed(BatchNorm(), name='mrcnn_class_bn1')(x, training=train_bn)\n    x = KL.Activation('relu')(x)\n    x = KL.TimeDistributed(KL.Conv2D(fc_layers_size, (1, 1)),\n                           name=\"mrcnn_class_conv2\")(x)\n    x = KL.TimeDistributed(BatchNorm(), name='mrcnn_class_bn2')(x, training=train_bn)\n    x = KL.Activation('relu')(x)\n\n    shared = KL.Lambda(lambda x: K.squeeze(K.squeeze(x, 3), 2),\n                       name=\"pool_squeeze\")(x)\n\n    # Classifier head\n    mrcnn_class_logits = KL.TimeDistributed(KL.Dense(num_classes),\n                                            name='mrcnn_class_logits')(shared)\n    mrcnn_probs = KL.TimeDistributed(KL.Activation(\"softmax\"),\n                                     name=\"mrcnn_class\")(mrcnn_class_logits)\n\n    # BBox head\n    # [batch, num_rois, NUM_CLASSES * (dy, dx, log(dh), log(dw))]\n    x = KL.TimeDistributed(KL.Dense(num_classes * 4, activation='linear'),\n                           name='mrcnn_bbox_fc')(shared)\n    # Reshape to [batch, num_rois, NUM_CLASSES, (dy, dx, log(dh), log(dw))]\n    s = K.int_shape(x)\n    mrcnn_bbox = KL.Reshape((s[1], num_classes, 4), name=\"mrcnn_bbox\")(x)\n\n    return mrcnn_class_logits, mrcnn_probs, mrcnn_bbox\n\n\ndef build_fpn_mask_graph(rois, feature_maps, image_meta,\n                         pool_size, num_classes, train_bn=True):\n    \"\"\"Builds the computation graph of the mask head of Feature Pyramid Network.\n\n    rois: [batch, num_rois, (y1, x1, y2, x2)] Proposal boxes in normalized\n          coordinates.\n    feature_maps: List of feature maps from different layers of the pyramid,\n                  [P2, P3, P4, P5]. Each has a different resolution.\n    image_meta: [batch, (meta data)] Image details. See compose_image_meta()\n    pool_size: The width of the square feature map generated from ROI Pooling.\n    num_classes: number of classes, which determines the depth of the results\n    train_bn: Boolean. Train or freeze Batch Norm layers\n\n    Returns: Masks [batch, num_rois, MASK_POOL_SIZE, MASK_POOL_SIZE, NUM_CLASSES]\n    \"\"\"\n    # ROI Pooling\n    # Shape: [batch, num_rois, MASK_POOL_SIZE, MASK_POOL_SIZE, channels]\n    x = PyramidROIAlign([pool_size, pool_size],\n                        name=\"roi_align_mask\")([rois, image_meta] + feature_maps)\n\n    # Conv layers\n    x = KL.TimeDistributed(KL.Conv2D(256, (3, 3), padding=\"same\"),\n                           name=\"mrcnn_mask_conv1\")(x)\n    x = KL.TimeDistributed(BatchNorm(),\n                           name='mrcnn_mask_bn1')(x, training=train_bn)\n    x = KL.Activation('relu')(x)\n\n    x = KL.TimeDistributed(KL.Conv2D(256, (3, 3), padding=\"same\"),\n                           name=\"mrcnn_mask_conv2\")(x)\n    x = KL.TimeDistributed(BatchNorm(),\n                           name='mrcnn_mask_bn2')(x, training=train_bn)\n    x = KL.Activation('relu')(x)\n\n    x = KL.TimeDistributed(KL.Conv2D(256, (3, 3), padding=\"same\"),\n                           name=\"mrcnn_mask_conv3\")(x)\n    x = KL.TimeDistributed(BatchNorm(),\n                           name='mrcnn_mask_bn3')(x, training=train_bn)\n    x = KL.Activation('relu')(x)\n\n    x = KL.TimeDistributed(KL.Conv2D(256, (3, 3), padding=\"same\"),\n                           name=\"mrcnn_mask_conv4\")(x)\n    x = KL.TimeDistributed(BatchNorm(),\n                           name='mrcnn_mask_bn4')(x, training=train_bn)\n    x = KL.Activation('relu')(x)\n\n    x = KL.TimeDistributed(KL.Conv2DTranspose(256, (2, 2), strides=2, activation=\"relu\"),\n                           name=\"mrcnn_mask_deconv\")(x)\n    x = KL.TimeDistributed(KL.Conv2D(num_classes, (1, 1), strides=1, activation=\"sigmoid\"),\n                           name=\"mrcnn_mask\")(x)\n    return x\n\n\n############################################################\n#  Loss Functions\n############################################################\n\ndef smooth_l1_loss(y_true, y_pred):\n    \"\"\"Implements Smooth-L1 loss.\n    y_true and y_pred are typically: [N, 4], but could be any shape.\n    \"\"\"\n    diff = K.abs(y_true - y_pred)\n    less_than_one = K.cast(K.less(diff, 1.0), \"float32\")\n    loss = (less_than_one * 0.5 * diff**2) + (1 - less_than_one) * (diff - 0.5)\n    return loss\n\n\ndef rpn_class_loss_graph(rpn_match, rpn_class_logits):\n    \"\"\"RPN anchor classifier loss.\n\n    rpn_match: [batch, anchors, 1]. Anchor match type. 1=positive,\n               -1=negative, 0=neutral anchor.\n    rpn_class_logits: [batch, anchors, 2]. RPN classifier logits for FG/BG.\n    \"\"\"\n    # Squeeze last dim to simplify\n    rpn_match = tf.squeeze(rpn_match, -1)\n    # Get anchor classes. Convert the -1/+1 match to 0/1 values.\n    anchor_class = K.cast(K.equal(rpn_match, 1), tf.int32)\n    # Positive and Negative anchors contribute to the loss,\n    # but neutral anchors (match value = 0) don't.\n    indices = tf.where(K.not_equal(rpn_match, 0))\n    # Pick rows that contribute to the loss and filter out the rest.\n    rpn_class_logits = tf.gather_nd(rpn_class_logits, indices)\n    anchor_class = tf.gather_nd(anchor_class, indices)\n    # Cross entropy loss\n    loss = K.sparse_categorical_crossentropy(target=anchor_class,\n                                             output=rpn_class_logits,\n                                             from_logits=True)\n    loss = K.switch(tf.size(loss) > 0, K.mean(loss), tf.constant(0.0))\n    return loss\n\n\ndef rpn_bbox_loss_graph(config, target_bbox, rpn_match, rpn_bbox):\n    \"\"\"Return the RPN bounding box loss graph.\n\n    config: the model config object.\n    target_bbox: [batch, max positive anchors, (dy, dx, log(dh), log(dw))].\n        Uses 0 padding to fill in unsed bbox deltas.\n    rpn_match: [batch, anchors, 1]. Anchor match type. 1=positive,\n               -1=negative, 0=neutral anchor.\n    rpn_bbox: [batch, anchors, (dy, dx, log(dh), log(dw))]\n    \"\"\"\n    # Positive anchors contribute to the loss, but negative and\n    # neutral anchors (match value of 0 or -1) don't.\n    rpn_match = K.squeeze(rpn_match, -1)\n    indices = tf.where(K.equal(rpn_match, 1))\n\n    # Pick bbox deltas that contribute to the loss\n    rpn_bbox = tf.gather_nd(rpn_bbox, indices)\n\n    # Trim target bounding box deltas to the same length as rpn_bbox.\n    batch_counts = K.sum(K.cast(K.equal(rpn_match, 1), tf.int32), axis=1)\n    target_bbox = batch_pack_graph(target_bbox, batch_counts,\n                                   config.IMAGES_PER_GPU)\n\n    loss = smooth_l1_loss(target_bbox, rpn_bbox)\n    \n    loss = K.switch(tf.size(loss) > 0, K.mean(loss), tf.constant(0.0))\n    return loss\n\n\ndef mrcnn_class_loss_graph(target_class_ids, pred_class_logits,\n                           active_class_ids):\n    \"\"\"Loss for the classifier head of Mask RCNN.\n\n    target_class_ids: [batch, num_rois]. Integer class IDs. Uses zero\n        padding to fill in the array.\n    pred_class_logits: [batch, num_rois, num_classes]\n    active_class_ids: [batch, num_classes]. Has a value of 1 for\n        classes that are in the dataset of the image, and 0\n        for classes that are not in the dataset.\n    \"\"\"\n    # During model building, Keras calls this function with\n    # target_class_ids of type float32. Unclear why. Cast it\n    # to int to get around it.\n    target_class_ids = tf.cast(target_class_ids, 'int64')\n\n    # Find predictions of classes that are not in the dataset.\n    pred_class_ids = tf.argmax(pred_class_logits, axis=2)\n    # TODO: Update this line to work with batch > 1. Right now it assumes all\n    #       images in a batch have the same active_class_ids\n    pred_active = tf.gather(active_class_ids[0], pred_class_ids)\n\n    # Loss\n    loss = tf.nn.sparse_softmax_cross_entropy_with_logits(\n        labels=target_class_ids, logits=pred_class_logits)\n\n    # Erase losses of predictions of classes that are not in the active\n    # classes of the image.\n    loss = loss * pred_active\n\n    # Computer loss mean. Use only predictions that contribute\n    # to the loss to get a correct mean.\n    loss = tf.reduce_sum(loss) / tf.reduce_sum(pred_active)\n    return loss\n\n\ndef mrcnn_bbox_loss_graph(target_bbox, target_class_ids, pred_bbox):\n    \"\"\"Loss for Mask R-CNN bounding box refinement.\n\n    target_bbox: [batch, num_rois, (dy, dx, log(dh), log(dw))]\n    target_class_ids: [batch, num_rois]. Integer class IDs.\n    pred_bbox: [batch, num_rois, num_classes, (dy, dx, log(dh), log(dw))]\n    \"\"\"\n    # Reshape to merge batch and roi dimensions for simplicity.\n    target_class_ids = K.reshape(target_class_ids, (-1,))\n    target_bbox = K.reshape(target_bbox, (-1, 4))\n    pred_bbox = K.reshape(pred_bbox, (-1, K.int_shape(pred_bbox)[2], 4))\n\n    # Only positive ROIs contribute to the loss. And only\n    # the right class_id of each ROI. Get their indices.\n    positive_roi_ix = tf.where(target_class_ids > 0)[:, 0]\n    positive_roi_class_ids = tf.cast(\n        tf.gather(target_class_ids, positive_roi_ix), tf.int64)\n    indices = tf.stack([positive_roi_ix, positive_roi_class_ids], axis=1)\n\n    # Gather the deltas (predicted and true) that contribute to loss\n    target_bbox = tf.gather(target_bbox, positive_roi_ix)\n    pred_bbox = tf.gather_nd(pred_bbox, indices)\n\n    # Smooth-L1 Loss\n    loss = K.switch(tf.size(target_bbox) > 0,\n                    smooth_l1_loss(y_true=target_bbox, y_pred=pred_bbox),\n                    tf.constant(0.0))\n    loss = K.mean(loss)\n    return loss\n\n\ndef mrcnn_mask_loss_graph(target_masks, target_class_ids, pred_masks):\n    \"\"\"Mask binary cross-entropy loss for the masks head.\n\n    target_masks: [batch, num_rois, height, width].\n        A float32 tensor of values 0 or 1. Uses zero padding to fill array.\n    target_class_ids: [batch, num_rois]. Integer class IDs. Zero padded.\n    pred_masks: [batch, proposals, height, width, num_classes] float32 tensor\n                with values from 0 to 1.\n    \"\"\"\n    # Reshape for simplicity. Merge first two dimensions into one.\n    target_class_ids = K.reshape(target_class_ids, (-1,))\n    mask_shape = tf.shape(target_masks)\n    target_masks = K.reshape(target_masks, (-1, mask_shape[2], mask_shape[3]))\n    pred_shape = tf.shape(pred_masks)\n    pred_masks = K.reshape(pred_masks,\n                           (-1, pred_shape[2], pred_shape[3], pred_shape[4]))\n    # Permute predicted masks to [N, num_classes, height, width]\n    pred_masks = tf.transpose(pred_masks, [0, 3, 1, 2])\n\n    # Only positive ROIs contribute to the loss. And only\n    # the class specific mask of each ROI.\n    positive_ix = tf.where(target_class_ids > 0)[:, 0]\n    positive_class_ids = tf.cast(\n        tf.gather(target_class_ids, positive_ix), tf.int64)\n    indices = tf.stack([positive_ix, positive_class_ids], axis=1)\n\n    # Gather the masks (predicted and true) that contribute to loss\n    y_true = tf.gather(target_masks, positive_ix)\n    y_pred = tf.gather_nd(pred_masks, indices)\n\n    # Compute binary cross entropy. If no positive ROIs, then return 0.\n    # shape: [batch, roi, num_classes]\n    loss = K.switch(tf.size(y_true) > 0,\n                    K.binary_crossentropy(target=y_true, output=y_pred),\n                    tf.constant(0.0))\n    loss = K.mean(loss)\n    return loss\n\n\n############################################################\n#  Data Generator\n############################################################\n\ndef load_image_gt(dataset, config, image_id, augment=False, augmentation=None,\n                  use_mini_mask=False):\n    \"\"\"Load and return ground truth data for an image (image, mask, bounding boxes).\n\n    augment: (deprecated. Use augmentation instead). If true, apply random\n        image augmentation. Currently, only horizontal flipping is offered.\n    augmentation: Optional. An imgaug (https://github.com/aleju/imgaug) augmentation.\n        For example, passing imgaug.augmenters.Fliplr(0.5) flips images\n        right/left 50% of the time.\n    use_mini_mask: If False, returns full-size masks that are the same height\n        and width as the original image. These can be big, for example\n        1024x1024x100 (for 100 instances). Mini masks are smaller, typically,\n        224x224 and are generated by extracting the bounding box of the\n        object and resizing it to MINI_MASK_SHAPE.\n\n    Returns:\n    image: [height, width, 3]\n    shape: the original shape of the image before resizing and cropping.\n    class_ids: [instance_count] Integer class IDs\n    bbox: [instance_count, (y1, x1, y2, x2)]\n    mask: [height, width, instance_count]. The height and width are those\n        of the image unless use_mini_mask is True, in which case they are\n        defined in MINI_MASK_SHAPE.\n    \"\"\"\n    # Load image and mask\n    image = dataset.load_image(image_id)\n    mask, class_ids = dataset.load_mask(image_id)\n    original_shape = image.shape\n    image, window, scale, padding, crop = utils.resize_image(\n        image,\n        min_dim=config.IMAGE_MIN_DIM,\n        min_scale=config.IMAGE_MIN_SCALE,\n        max_dim=config.IMAGE_MAX_DIM,\n        mode=config.IMAGE_RESIZE_MODE)\n    mask = utils.resize_mask(mask, scale, padding, crop)\n\n    # Random horizontal flips.\n    # TODO: will be removed in a future update in favor of augmentation\n    if augment:\n        logging.warning(\"'augment' is deprecated. Use 'augmentation' instead.\")\n        if random.randint(0, 1):\n            image = np.fliplr(image)\n            mask = np.fliplr(mask)\n\n    # Augmentation\n    # This requires the imgaug lib (https://github.com/aleju/imgaug)\n    if augmentation:\n        import imgaug\n\n        # Augmenters that are safe to apply to masks\n        # Some, such as Affine, have settings that make them unsafe, so always\n        # test your augmentation on masks\n        MASK_AUGMENTERS = [\"Sequential\", \"SomeOf\", \"OneOf\", \"Sometimes\",\n                           \"Fliplr\", \"Flipud\", \"CropAndPad\",\n                           \"Affine\", \"PiecewiseAffine\"]\n\n        def hook(images, augmenter, parents, default):\n            \"\"\"Determines which augmenters to apply to masks.\"\"\"\n            return augmenter.__class__.__name__ in MASK_AUGMENTERS\n\n        # Store shapes before augmentation to compare\n        image_shape = image.shape\n        mask_shape = mask.shape\n        # Make augmenters deterministic to apply similarly to images and masks\n        det = augmentation.to_deterministic()\n        image = det.augment_image(image)\n        # Change mask to np.uint8 because imgaug doesn't support np.bool\n        mask = det.augment_image(mask.astype(np.uint8),\n                                 hooks=imgaug.HooksImages(activator=hook))\n        # Verify that shapes didn't change\n        assert image.shape == image_shape, \"Augmentation shouldn't change image size\"\n        assert mask.shape == mask_shape, \"Augmentation shouldn't change mask size\"\n        # Change mask back to bool\n        mask = mask.astype(np.bool)\n\n    # Note that some boxes might be all zeros if the corresponding mask got cropped out.\n    # and here is to filter them out\n    _idx = np.sum(mask, axis=(0, 1)) > 0\n    mask = mask[:, :, _idx]\n    class_ids = class_ids[_idx]\n    # Bounding boxes. Note that some boxes might be all zeros\n    # if the corresponding mask got cropped out.\n    # bbox: [num_instances, (y1, x1, y2, x2)]\n    bbox = utils.extract_bboxes(mask)\n\n    # Active classes\n    # Different datasets have different classes, so track the\n    # classes supported in the dataset of this image.\n    active_class_ids = np.zeros([dataset.num_classes], dtype=np.int32)\n    source_class_ids = dataset.source_class_ids[dataset.image_info[image_id][\"source\"]]\n    active_class_ids[source_class_ids] = 1\n\n    # Resize masks to smaller size to reduce memory usage\n    if use_mini_mask:\n        mask = utils.minimize_mask(bbox, mask, config.MINI_MASK_SHAPE)\n\n    # Image meta data\n    image_meta = compose_image_meta(image_id, original_shape, image.shape,\n                                    window, scale, active_class_ids)\n\n    return image, image_meta, class_ids, bbox, mask\n\n\ndef build_detection_targets(rpn_rois, gt_class_ids, gt_boxes, gt_masks, config):\n    \"\"\"Generate targets for training Stage 2 classifier and mask heads.\n    This is not used in normal training. It's useful for debugging or to train\n    the Mask RCNN heads without using the RPN head.\n\n    Inputs:\n    rpn_rois: [N, (y1, x1, y2, x2)] proposal boxes.\n    gt_class_ids: [instance count] Integer class IDs\n    gt_boxes: [instance count, (y1, x1, y2, x2)]\n    gt_masks: [height, width, instance count] Ground truth masks. Can be full\n              size or mini-masks.\n\n    Returns:\n    rois: [TRAIN_ROIS_PER_IMAGE, (y1, x1, y2, x2)]\n    class_ids: [TRAIN_ROIS_PER_IMAGE]. Integer class IDs.\n    bboxes: [TRAIN_ROIS_PER_IMAGE, NUM_CLASSES, (y, x, log(h), log(w))]. Class-specific\n            bbox refinements.\n    masks: [TRAIN_ROIS_PER_IMAGE, height, width, NUM_CLASSES). Class specific masks cropped\n           to bbox boundaries and resized to neural network output size.\n    \"\"\"\n    assert rpn_rois.shape[0] > 0\n    assert gt_class_ids.dtype == np.int32, \"Expected int but got {}\".format(\n        gt_class_ids.dtype)\n    assert gt_boxes.dtype == np.int32, \"Expected int but got {}\".format(\n        gt_boxes.dtype)\n    assert gt_masks.dtype == np.bool_, \"Expected bool but got {}\".format(\n        gt_masks.dtype)\n\n    # It's common to add GT Boxes to ROIs but we don't do that here because\n    # according to XinLei Chen's paper, it doesn't help.\n\n    # Trim empty padding in gt_boxes and gt_masks parts\n    instance_ids = np.where(gt_class_ids > 0)[0]\n    assert instance_ids.shape[0] > 0, \"Image must contain instances.\"\n    gt_class_ids = gt_class_ids[instance_ids]\n    gt_boxes = gt_boxes[instance_ids]\n    gt_masks = gt_masks[:, :, instance_ids]\n\n    # Compute areas of ROIs and ground truth boxes.\n    rpn_roi_area = (rpn_rois[:, 2] - rpn_rois[:, 0]) * \\\n        (rpn_rois[:, 3] - rpn_rois[:, 1])\n    gt_box_area = (gt_boxes[:, 2] - gt_boxes[:, 0]) * \\\n        (gt_boxes[:, 3] - gt_boxes[:, 1])\n\n    # Compute overlaps [rpn_rois, gt_boxes]\n    overlaps = np.zeros((rpn_rois.shape[0], gt_boxes.shape[0]))\n    for i in range(overlaps.shape[1]):\n        gt = gt_boxes[i]\n        overlaps[:, i] = utils.compute_iou(\n            gt, rpn_rois, gt_box_area[i], rpn_roi_area)\n\n    # Assign ROIs to GT boxes\n    rpn_roi_iou_argmax = np.argmax(overlaps, axis=1)\n    rpn_roi_iou_max = overlaps[np.arange(\n        overlaps.shape[0]), rpn_roi_iou_argmax]\n    # GT box assigned to each ROI\n    rpn_roi_gt_boxes = gt_boxes[rpn_roi_iou_argmax]\n    rpn_roi_gt_class_ids = gt_class_ids[rpn_roi_iou_argmax]\n\n    # Positive ROIs are those with >= 0.5 IoU with a GT box.\n    fg_ids = np.where(rpn_roi_iou_max > 0.5)[0]\n\n    # Negative ROIs are those with max IoU 0.1-0.5 (hard example mining)\n    # TODO: To hard example mine or not to hard example mine, that's the question\n    # bg_ids = np.where((rpn_roi_iou_max >= 0.1) & (rpn_roi_iou_max < 0.5))[0]\n    bg_ids = np.where(rpn_roi_iou_max < 0.5)[0]\n\n    # Subsample ROIs. Aim for 33% foreground.\n    # FG\n    fg_roi_count = int(config.TRAIN_ROIS_PER_IMAGE * config.ROI_POSITIVE_RATIO)\n    if fg_ids.shape[0] > fg_roi_count:\n        keep_fg_ids = np.random.choice(fg_ids, fg_roi_count, replace=False)\n    else:\n        keep_fg_ids = fg_ids\n    # BG\n    remaining = config.TRAIN_ROIS_PER_IMAGE - keep_fg_ids.shape[0]\n    if bg_ids.shape[0] > remaining:\n        keep_bg_ids = np.random.choice(bg_ids, remaining, replace=False)\n    else:\n        keep_bg_ids = bg_ids\n    # Combine indices of ROIs to keep\n    keep = np.concatenate([keep_fg_ids, keep_bg_ids])\n    # Need more?\n    remaining = config.TRAIN_ROIS_PER_IMAGE - keep.shape[0]\n    if remaining > 0:\n        # Looks like we don't have enough samples to maintain the desired\n        # balance. Reduce requirements and fill in the rest. This is\n        # likely different from the Mask RCNN paper.\n\n        # There is a small chance we have neither fg nor bg samples.\n        if keep.shape[0] == 0:\n            # Pick bg regions with easier IoU threshold\n            bg_ids = np.where(rpn_roi_iou_max < 0.5)[0]\n            assert bg_ids.shape[0] >= remaining\n            keep_bg_ids = np.random.choice(bg_ids, remaining, replace=False)\n            assert keep_bg_ids.shape[0] == remaining\n            keep = np.concatenate([keep, keep_bg_ids])\n        else:\n            # Fill the rest with repeated bg rois.\n            keep_extra_ids = np.random.choice(\n                keep_bg_ids, remaining, replace=True)\n            keep = np.concatenate([keep, keep_extra_ids])\n    assert keep.shape[0] == config.TRAIN_ROIS_PER_IMAGE, \\\n        \"keep doesn't match ROI batch size {}, {}\".format(\n            keep.shape[0], config.TRAIN_ROIS_PER_IMAGE)\n\n    # Reset the gt boxes assigned to BG ROIs.\n    rpn_roi_gt_boxes[keep_bg_ids, :] = 0\n    rpn_roi_gt_class_ids[keep_bg_ids] = 0\n\n    # For each kept ROI, assign a class_id, and for FG ROIs also add bbox refinement.\n    rois = rpn_rois[keep]\n    roi_gt_boxes = rpn_roi_gt_boxes[keep]\n    roi_gt_class_ids = rpn_roi_gt_class_ids[keep]\n    roi_gt_assignment = rpn_roi_iou_argmax[keep]\n\n    # Class-aware bbox deltas. [y, x, log(h), log(w)]\n    bboxes = np.zeros((config.TRAIN_ROIS_PER_IMAGE,\n                       config.NUM_CLASSES, 4), dtype=np.float32)\n    pos_ids = np.where(roi_gt_class_ids > 0)[0]\n    bboxes[pos_ids, roi_gt_class_ids[pos_ids]] = utils.box_refinement(\n        rois[pos_ids], roi_gt_boxes[pos_ids, :4])\n    # Normalize bbox refinements\n    bboxes /= config.BBOX_STD_DEV\n\n    # Generate class-specific target masks\n    masks = np.zeros((config.TRAIN_ROIS_PER_IMAGE, config.MASK_SHAPE[0], config.MASK_SHAPE[1], config.NUM_CLASSES),\n                     dtype=np.float32)\n    for i in pos_ids:\n        class_id = roi_gt_class_ids[i]\n        assert class_id > 0, \"class id must be greater than 0\"\n        gt_id = roi_gt_assignment[i]\n        class_mask = gt_masks[:, :, gt_id]\n\n        if config.USE_MINI_MASK:\n            # Create a mask placeholder, the size of the image\n            placeholder = np.zeros(config.IMAGE_SHAPE[:2], dtype=bool)\n            # GT box\n            gt_y1, gt_x1, gt_y2, gt_x2 = gt_boxes[gt_id]\n            gt_w = gt_x2 - gt_x1\n            gt_h = gt_y2 - gt_y1\n            # Resize mini mask to size of GT box\n            placeholder[gt_y1:gt_y2, gt_x1:gt_x2] = \\\n                np.round(utils.resize(class_mask, (gt_h, gt_w))).astype(bool)\n            # Place the mini batch in the placeholder\n            class_mask = placeholder\n\n        # Pick part of the mask and resize it\n        y1, x1, y2, x2 = rois[i].astype(np.int32)\n        m = class_mask[y1:y2, x1:x2]\n        mask = utils.resize(m, config.MASK_SHAPE)\n        masks[i, :, :, class_id] = mask\n\n    return rois, roi_gt_class_ids, bboxes, masks\n\n\ndef build_rpn_targets(image_shape, anchors, gt_class_ids, gt_boxes, config):\n    \"\"\"Given the anchors and GT boxes, compute overlaps and identify positive\n    anchors and deltas to refine them to match their corresponding GT boxes.\n\n    anchors: [num_anchors, (y1, x1, y2, x2)]\n    gt_class_ids: [num_gt_boxes] Integer class IDs.\n    gt_boxes: [num_gt_boxes, (y1, x1, y2, x2)]\n\n    Returns:\n    rpn_match: [N] (int32) matches between anchors and GT boxes.\n               1 = positive anchor, -1 = negative anchor, 0 = neutral\n    rpn_bbox: [N, (dy, dx, log(dh), log(dw))] Anchor bbox deltas.\n    \"\"\"\n    # RPN Match: 1 = positive anchor, -1 = negative anchor, 0 = neutral\n    rpn_match = np.zeros([anchors.shape[0]], dtype=np.int32)\n    # RPN bounding boxes: [max anchors per image, (dy, dx, log(dh), log(dw))]\n    rpn_bbox = np.zeros((config.RPN_TRAIN_ANCHORS_PER_IMAGE, 4))\n\n    # Handle COCO crowds\n    # A crowd box in COCO is a bounding box around several instances. Exclude\n    # them from training. A crowd box is given a negative class ID.\n    crowd_ix = np.where(gt_class_ids < 0)[0]\n    if crowd_ix.shape[0] > 0:\n        # Filter out crowds from ground truth class IDs and boxes\n        non_crowd_ix = np.where(gt_class_ids > 0)[0]\n        crowd_boxes = gt_boxes[crowd_ix]\n        gt_class_ids = gt_class_ids[non_crowd_ix]\n        gt_boxes = gt_boxes[non_crowd_ix]\n        # Compute overlaps with crowd boxes [anchors, crowds]\n        crowd_overlaps = utils.compute_overlaps(anchors, crowd_boxes)\n        crowd_iou_max = np.amax(crowd_overlaps, axis=1)\n        no_crowd_bool = (crowd_iou_max < 0.001)\n    else:\n        # All anchors don't intersect a crowd\n        no_crowd_bool = np.ones([anchors.shape[0]], dtype=bool)\n\n    # Compute overlaps [num_anchors, num_gt_boxes]\n    overlaps = utils.compute_overlaps(anchors, gt_boxes)\n\n    # Match anchors to GT Boxes\n    # If an anchor overlaps a GT box with IoU >= 0.7 then it's positive.\n    # If an anchor overlaps a GT box with IoU < 0.3 then it's negative.\n    # Neutral anchors are those that don't match the conditions above,\n    # and they don't influence the loss function.\n    # However, don't keep any GT box unmatched (rare, but happens). Instead,\n    # match it to the closest anchor (even if its max IoU is < 0.3).\n    #\n    # 1. Set negative anchors first. They get overwritten below if a GT box is\n    # matched to them. Skip boxes in crowd areas.\n    anchor_iou_argmax = np.argmax(overlaps, axis=1)\n    anchor_iou_max = overlaps[np.arange(overlaps.shape[0]), anchor_iou_argmax]\n    rpn_match[(anchor_iou_max < 0.3) & (no_crowd_bool)] = -1\n    # 2. Set an anchor for each GT box (regardless of IoU value).\n    # TODO: If multiple anchors have the same IoU match all of them\n    gt_iou_argmax = np.argmax(overlaps, axis=0)\n    rpn_match[gt_iou_argmax] = 1\n    # 3. Set anchors with high overlap as positive.\n    rpn_match[anchor_iou_max >= 0.7] = 1\n\n    # Subsample to balance positive and negative anchors\n    # Don't let positives be more than half the anchors\n    ids = np.where(rpn_match == 1)[0]\n    extra = len(ids) - (config.RPN_TRAIN_ANCHORS_PER_IMAGE // 2)\n    if extra > 0:\n        # Reset the extra ones to neutral\n        ids = np.random.choice(ids, extra, replace=False)\n        rpn_match[ids] = 0\n    # Same for negative proposals\n    ids = np.where(rpn_match == -1)[0]\n    extra = len(ids) - (config.RPN_TRAIN_ANCHORS_PER_IMAGE -\n                        np.sum(rpn_match == 1))\n    if extra > 0:\n        # Rest the extra ones to neutral\n        ids = np.random.choice(ids, extra, replace=False)\n        rpn_match[ids] = 0\n\n    # For positive anchors, compute shift and scale needed to transform them\n    # to match the corresponding GT boxes.\n    ids = np.where(rpn_match == 1)[0]\n    ix = 0  # index into rpn_bbox\n    # TODO: use box_refinement() rather than duplicating the code here\n    for i, a in zip(ids, anchors[ids]):\n        # Closest gt box (it might have IoU < 0.7)\n        gt = gt_boxes[anchor_iou_argmax[i]]\n\n        # Convert coordinates to center plus width/height.\n        # GT Box\n        gt_h = gt[2] - gt[0]\n        gt_w = gt[3] - gt[1]\n        gt_center_y = gt[0] + 0.5 * gt_h\n        gt_center_x = gt[1] + 0.5 * gt_w\n        # Anchor\n        a_h = a[2] - a[0]\n        a_w = a[3] - a[1]\n        a_center_y = a[0] + 0.5 * a_h\n        a_center_x = a[1] + 0.5 * a_w\n\n        # Compute the bbox refinement that the RPN should predict.\n        rpn_bbox[ix] = [\n            (gt_center_y - a_center_y) / a_h,\n            (gt_center_x - a_center_x) / a_w,\n            np.log(gt_h / a_h),\n            np.log(gt_w / a_w),\n        ]\n        # Normalize\n        rpn_bbox[ix] /= config.RPN_BBOX_STD_DEV\n        ix += 1\n\n    return rpn_match, rpn_bbox\n\n\ndef generate_random_rois(image_shape, count, gt_class_ids, gt_boxes):\n    \"\"\"Generates ROI proposals similar to what a region proposal network\n    would generate.\n\n    image_shape: [Height, Width, Depth]\n    count: Number of ROIs to generate\n    gt_class_ids: [N] Integer ground truth class IDs\n    gt_boxes: [N, (y1, x1, y2, x2)] Ground truth boxes in pixels.\n\n    Returns: [count, (y1, x1, y2, x2)] ROI boxes in pixels.\n    \"\"\"\n    # placeholder\n    rois = np.zeros((count, 4), dtype=np.int32)\n\n    # Generate random ROIs around GT boxes (90% of count)\n    rois_per_box = int(0.9 * count / gt_boxes.shape[0])\n    for i in range(gt_boxes.shape[0]):\n        gt_y1, gt_x1, gt_y2, gt_x2 = gt_boxes[i]\n        h = gt_y2 - gt_y1\n        w = gt_x2 - gt_x1\n        # random boundaries\n        r_y1 = max(gt_y1 - h, 0)\n        r_y2 = min(gt_y2 + h, image_shape[0])\n        r_x1 = max(gt_x1 - w, 0)\n        r_x2 = min(gt_x2 + w, image_shape[1])\n\n        # To avoid generating boxes with zero area, we generate double what\n        # we need and filter out the extra. If we get fewer valid boxes\n        # than we need, we loop and try again.\n        while True:\n            y1y2 = np.random.randint(r_y1, r_y2, (rois_per_box * 2, 2))\n            x1x2 = np.random.randint(r_x1, r_x2, (rois_per_box * 2, 2))\n            # Filter out zero area boxes\n            threshold = 1\n            y1y2 = y1y2[np.abs(y1y2[:, 0] - y1y2[:, 1]) >=\n                        threshold][:rois_per_box]\n            x1x2 = x1x2[np.abs(x1x2[:, 0] - x1x2[:, 1]) >=\n                        threshold][:rois_per_box]\n            if y1y2.shape[0] == rois_per_box and x1x2.shape[0] == rois_per_box:\n                break\n\n        # Sort on axis 1 to ensure x1 <= x2 and y1 <= y2 and then reshape\n        # into x1, y1, x2, y2 order\n        x1, x2 = np.split(np.sort(x1x2, axis=1), 2, axis=1)\n        y1, y2 = np.split(np.sort(y1y2, axis=1), 2, axis=1)\n        box_rois = np.hstack([y1, x1, y2, x2])\n        rois[rois_per_box * i:rois_per_box * (i + 1)] = box_rois\n\n    # Generate random ROIs anywhere in the image (10% of count)\n    remaining_count = count - (rois_per_box * gt_boxes.shape[0])\n    # To avoid generating boxes with zero area, we generate double what\n    # we need and filter out the extra. If we get fewer valid boxes\n    # than we need, we loop and try again.\n    while True:\n        y1y2 = np.random.randint(0, image_shape[0], (remaining_count * 2, 2))\n        x1x2 = np.random.randint(0, image_shape[1], (remaining_count * 2, 2))\n        # Filter out zero area boxes\n        threshold = 1\n        y1y2 = y1y2[np.abs(y1y2[:, 0] - y1y2[:, 1]) >=\n                    threshold][:remaining_count]\n        x1x2 = x1x2[np.abs(x1x2[:, 0] - x1x2[:, 1]) >=\n                    threshold][:remaining_count]\n        if y1y2.shape[0] == remaining_count and x1x2.shape[0] == remaining_count:\n            break\n\n    # Sort on axis 1 to ensure x1 <= x2 and y1 <= y2 and then reshape\n    # into x1, y1, x2, y2 order\n    x1, x2 = np.split(np.sort(x1x2, axis=1), 2, axis=1)\n    y1, y2 = np.split(np.sort(y1y2, axis=1), 2, axis=1)\n    global_rois = np.hstack([y1, x1, y2, x2])\n    rois[-remaining_count:] = global_rois\n    return rois\n\n\ndef data_generator(dataset, config, shuffle=True, augment=False, augmentation=None,\n                   random_rois=0, batch_size=1, detection_targets=False,\n                   no_augmentation_sources=None):\n    \"\"\"A generator that returns images and corresponding target class ids,\n    bounding box deltas, and masks.\n\n    dataset: The Dataset object to pick data from\n    config: The model config object\n    shuffle: If True, shuffles the samples before every epoch\n    augment: (deprecated. Use augmentation instead). If true, apply random\n        image augmentation. Currently, only horizontal flipping is offered.\n    augmentation: Optional. An imgaug (https://github.com/aleju/imgaug) augmentation.\n        For example, passing imgaug.augmenters.Fliplr(0.5) flips images\n        right/left 50% of the time.\n    random_rois: If > 0 then generate proposals to be used to train the\n                 network classifier and mask heads. Useful if training\n                 the Mask RCNN part without the RPN.\n    batch_size: How many images to return in each call\n    detection_targets: If True, generate detection targets (class IDs, bbox\n        deltas, and masks). Typically for debugging or visualizations because\n        in trainig detection targets are generated by DetectionTargetLayer.\n    no_augmentation_sources: Optional. List of sources to exclude for\n        augmentation. A source is string that identifies a dataset and is\n        defined in the Dataset class.\n\n    Returns a Python generator. Upon calling next() on it, the\n    generator returns two lists, inputs and outputs. The contents\n    of the lists differs depending on the received arguments:\n    inputs list:\n    - images: [batch, H, W, C]\n    - image_meta: [batch, (meta data)] Image details. See compose_image_meta()\n    - rpn_match: [batch, N] Integer (1=positive anchor, -1=negative, 0=neutral)\n    - rpn_bbox: [batch, N, (dy, dx, log(dh), log(dw))] Anchor bbox deltas.\n    - gt_class_ids: [batch, MAX_GT_INSTANCES] Integer class IDs\n    - gt_boxes: [batch, MAX_GT_INSTANCES, (y1, x1, y2, x2)]\n    - gt_masks: [batch, height, width, MAX_GT_INSTANCES]. The height and width\n                are those of the image unless use_mini_mask is True, in which\n                case they are defined in MINI_MASK_SHAPE.\n\n    outputs list: Usually empty in regular training. But if detection_targets\n        is True then the outputs list contains target class_ids, bbox deltas,\n        and masks.\n    \"\"\"\n    b = 0  # batch item index\n    image_index = -1\n    image_ids = np.copy(dataset.image_ids)\n    error_count = 0\n    no_augmentation_sources = no_augmentation_sources or []\n\n    # Anchors\n    # [anchor_count, (y1, x1, y2, x2)]\n    backbone_shapes = compute_backbone_shapes(config, config.IMAGE_SHAPE)\n    anchors = utils.generate_pyramid_anchors(config.RPN_ANCHOR_SCALES,\n                                             config.RPN_ANCHOR_RATIOS,\n                                             backbone_shapes,\n                                             config.BACKBONE_STRIDES,\n                                             config.RPN_ANCHOR_STRIDE)\n\n    # Keras requires a generator to run indefinitely.\n    while True:\n        try:\n            # Increment index to pick next image. Shuffle if at the start of an epoch.\n            image_index = (image_index + 1) % len(image_ids)\n            if shuffle and image_index == 0:\n                np.random.shuffle(image_ids)\n\n            # Get GT bounding boxes and masks for image.\n            image_id = image_ids[image_index]\n\n            # If the image source is not to be augmented pass None as augmentation\n            if dataset.image_info[image_id]['source'] in no_augmentation_sources:\n                image, image_meta, gt_class_ids, gt_boxes, gt_masks = \\\n                load_image_gt(dataset, config, image_id, augment=augment,\n                              augmentation=None,\n                              use_mini_mask=config.USE_MINI_MASK)\n            else:\n                image, image_meta, gt_class_ids, gt_boxes, gt_masks = \\\n                    load_image_gt(dataset, config, image_id, augment=augment,\n                                augmentation=augmentation,\n                                use_mini_mask=config.USE_MINI_MASK)\n\n            # Skip images that have no instances. This can happen in cases\n            # where we train on a subset of classes and the image doesn't\n            # have any of the classes we care about.\n            if not np.any(gt_class_ids > 0):\n                continue\n\n            # RPN Targets\n            rpn_match, rpn_bbox = build_rpn_targets(image.shape, anchors,\n                                                    gt_class_ids, gt_boxes, config)\n\n            # Mask R-CNN Targets\n            if random_rois:\n                rpn_rois = generate_random_rois(\n                    image.shape, random_rois, gt_class_ids, gt_boxes)\n                if detection_targets:\n                    rois, mrcnn_class_ids, mrcnn_bbox, mrcnn_mask =\\\n                        build_detection_targets(\n                            rpn_rois, gt_class_ids, gt_boxes, gt_masks, config)\n\n            # Init batch arrays\n            if b == 0:\n                batch_image_meta = np.zeros(\n                    (batch_size,) + image_meta.shape, dtype=image_meta.dtype)\n                batch_rpn_match = np.zeros(\n                    [batch_size, anchors.shape[0], 1], dtype=rpn_match.dtype)\n                batch_rpn_bbox = np.zeros(\n                    [batch_size, config.RPN_TRAIN_ANCHORS_PER_IMAGE, 4], dtype=rpn_bbox.dtype)\n                batch_images = np.zeros(\n                    (batch_size,) + image.shape, dtype=np.float32)\n                batch_gt_class_ids = np.zeros(\n                    (batch_size, config.MAX_GT_INSTANCES), dtype=np.int32)\n                batch_gt_boxes = np.zeros(\n                    (batch_size, config.MAX_GT_INSTANCES, 4), dtype=np.int32)\n                batch_gt_masks = np.zeros(\n                    (batch_size, gt_masks.shape[0], gt_masks.shape[1],\n                     config.MAX_GT_INSTANCES), dtype=gt_masks.dtype)\n                if random_rois:\n                    batch_rpn_rois = np.zeros(\n                        (batch_size, rpn_rois.shape[0], 4), dtype=rpn_rois.dtype)\n                    if detection_targets:\n                        batch_rois = np.zeros(\n                            (batch_size,) + rois.shape, dtype=rois.dtype)\n                        batch_mrcnn_class_ids = np.zeros(\n                            (batch_size,) + mrcnn_class_ids.shape, dtype=mrcnn_class_ids.dtype)\n                        batch_mrcnn_bbox = np.zeros(\n                            (batch_size,) + mrcnn_bbox.shape, dtype=mrcnn_bbox.dtype)\n                        batch_mrcnn_mask = np.zeros(\n                            (batch_size,) + mrcnn_mask.shape, dtype=mrcnn_mask.dtype)\n\n            # If more instances than fits in the array, sub-sample from them.\n            if gt_boxes.shape[0] > config.MAX_GT_INSTANCES:\n                ids = np.random.choice(\n                    np.arange(gt_boxes.shape[0]), config.MAX_GT_INSTANCES, replace=False)\n                gt_class_ids = gt_class_ids[ids]\n                gt_boxes = gt_boxes[ids]\n                gt_masks = gt_masks[:, :, ids]\n\n            # Add to batch\n            batch_image_meta[b] = image_meta\n            batch_rpn_match[b] = rpn_match[:, np.newaxis]\n            batch_rpn_bbox[b] = rpn_bbox\n            batch_images[b] = mold_image(image.astype(np.float32), config)\n            batch_gt_class_ids[b, :gt_class_ids.shape[0]] = gt_class_ids\n            batch_gt_boxes[b, :gt_boxes.shape[0]] = gt_boxes\n            batch_gt_masks[b, :, :, :gt_masks.shape[-1]] = gt_masks\n            if random_rois:\n                batch_rpn_rois[b] = rpn_rois\n                if detection_targets:\n                    batch_rois[b] = rois\n                    batch_mrcnn_class_ids[b] = mrcnn_class_ids\n                    batch_mrcnn_bbox[b] = mrcnn_bbox\n                    batch_mrcnn_mask[b] = mrcnn_mask\n            b += 1\n\n            # Batch full?\n            if b >= batch_size:\n                inputs = [batch_images, batch_image_meta, batch_rpn_match, batch_rpn_bbox,\n                          batch_gt_class_ids, batch_gt_boxes, batch_gt_masks]\n                outputs = []\n\n                if random_rois:\n                    inputs.extend([batch_rpn_rois])\n                    if detection_targets:\n                        inputs.extend([batch_rois])\n                        # Keras requires that output and targets have the same number of dimensions\n                        batch_mrcnn_class_ids = np.expand_dims(\n                            batch_mrcnn_class_ids, -1)\n                        outputs.extend(\n                            [batch_mrcnn_class_ids, batch_mrcnn_bbox, batch_mrcnn_mask])\n\n                yield inputs, outputs\n\n                # start a new batch\n                b = 0\n        except (GeneratorExit, KeyboardInterrupt):\n            raise\n        except:\n            # Log it and skip the image\n            logging.exception(\"Error processing image {}\".format(\n                dataset.image_info[image_id]))\n            error_count += 1\n            if error_count > 5:\n                raise\n\n############################################################\n#  MaskRCNN Class\n############################################################\n\nclass MaskRCNN():\n    \"\"\"Encapsulates the Mask RCNN model functionality.\n\n    The actual Keras model is in the keras_model property.\n    \"\"\"\n\n    def __init__(self, mode, config, model_dir):\n        \"\"\"\n        mode: Either \"training\" or \"inference\"\n        config: A Sub-class of the Config class\n        model_dir: Directory to save training logs and trained weights\n        \"\"\"\n        assert mode in ['training', 'inference']\n        self.mode = mode\n        self.config = config\n        self.model_dir = model_dir\n        self.set_log_dir()\n        self.keras_model = self.build(mode=mode, config=config)\n\n    def build(self, mode, config):\n        \"\"\"Build Mask R-CNN architecture.\n            input_shape: The shape of the input image.\n            mode: Either \"training\" or \"inference\". The inputs and\n                outputs of the model differ accordingly.\n        \"\"\"\n        assert mode in ['training', 'inference']\n\n        # Image size must be dividable by 2 multiple times\n        h, w = config.IMAGE_SHAPE[:2]\n        if h / 2**6 != int(h / 2**6) or w / 2**6 != int(w / 2**6):\n            raise Exception(\"Image size must be dividable by 2 at least 6 times \"\n                            \"to avoid fractions when downscaling and upscaling.\"\n                            \"For example, use 256, 320, 384, 448, 512, ... etc. \")\n\n        # Inputs\n        input_image = KL.Input(\n            shape=[None, None, config.IMAGE_SHAPE[2]], name=\"input_image\")\n        input_image_meta = KL.Input(shape=[config.IMAGE_META_SIZE],\n                                    name=\"input_image_meta\")\n        if mode == \"training\":\n            # RPN GT\n            input_rpn_match = KL.Input(\n                shape=[None, 1], name=\"input_rpn_match\", dtype=tf.int32)\n            input_rpn_bbox = KL.Input(\n                shape=[None, 4], name=\"input_rpn_bbox\", dtype=tf.float32)\n\n            # Detection GT (class IDs, bounding boxes, and masks)\n            # 1. GT Class IDs (zero padded)\n            input_gt_class_ids = KL.Input(\n                shape=[None], name=\"input_gt_class_ids\", dtype=tf.int32)\n            # 2. GT Boxes in pixels (zero padded)\n            # [batch, MAX_GT_INSTANCES, (y1, x1, y2, x2)] in image coordinates\n            input_gt_boxes = KL.Input(\n                shape=[None, 4], name=\"input_gt_boxes\", dtype=tf.float32)\n            # Normalize coordinates\n            gt_boxes = KL.Lambda(lambda x: norm_boxes_graph(\n                x, K.shape(input_image)[1:3]))(input_gt_boxes)\n            # 3. GT Masks (zero padded)\n            # [batch, height, width, MAX_GT_INSTANCES]\n            if config.USE_MINI_MASK:\n                input_gt_masks = KL.Input(\n                    shape=[config.MINI_MASK_SHAPE[0],\n                           config.MINI_MASK_SHAPE[1], None],\n                    name=\"input_gt_masks\", dtype=bool)\n            else:\n                input_gt_masks = KL.Input(\n                    shape=[config.IMAGE_SHAPE[0], config.IMAGE_SHAPE[1], None],\n                    name=\"input_gt_masks\", dtype=bool)\n        elif mode == \"inference\":\n            # Anchors in normalized coordinates\n            input_anchors = KL.Input(shape=[None, 4], name=\"input_anchors\")\n\n        # Build the shared convolutional layers.\n        # Bottom-up Layers\n        # Returns a list of the last layers of each stage, 5 in total.\n        # Don't create the thead (stage 5), so we pick the 4th item in the list.\n        if callable(config.BACKBONE):\n            _, C2, C3, C4, C5 = config.BACKBONE(input_image, stage5=True,\n                                                train_bn=config.TRAIN_BN)\n        else:\n            _, C2, C3, C4, C5 = resnet_graph(input_image, config.BACKBONE,\n                                             stage5=True, train_bn=config.TRAIN_BN)\n        # Top-down Layers\n        # TODO: add assert to varify feature map sizes match what's in config\n        P5 = KL.Conv2D(config.TOP_DOWN_PYRAMID_SIZE, (1, 1), name='fpn_c5p5')(C5)\n        P4 = KL.Add(name=\"fpn_p4add\")([\n            KL.UpSampling2D(size=(2, 2), name=\"fpn_p5upsampled\")(P5),\n            KL.Conv2D(config.TOP_DOWN_PYRAMID_SIZE, (1, 1), name='fpn_c4p4')(C4)])\n        P3 = KL.Add(name=\"fpn_p3add\")([\n            KL.UpSampling2D(size=(2, 2), name=\"fpn_p4upsampled\")(P4),\n            KL.Conv2D(config.TOP_DOWN_PYRAMID_SIZE, (1, 1), name='fpn_c3p3')(C3)])\n        P2 = KL.Add(name=\"fpn_p2add\")([\n            KL.UpSampling2D(size=(2, 2), name=\"fpn_p3upsampled\")(P3),\n            KL.Conv2D(config.TOP_DOWN_PYRAMID_SIZE, (1, 1), name='fpn_c2p2')(C2)])\n        # Attach 3x3 conv to all P layers to get the final feature maps.\n        P2 = KL.Conv2D(config.TOP_DOWN_PYRAMID_SIZE, (3, 3), padding=\"SAME\", name=\"fpn_p2\")(P2)\n        P3 = KL.Conv2D(config.TOP_DOWN_PYRAMID_SIZE, (3, 3), padding=\"SAME\", name=\"fpn_p3\")(P3)\n        P4 = KL.Conv2D(config.TOP_DOWN_PYRAMID_SIZE, (3, 3), padding=\"SAME\", name=\"fpn_p4\")(P4)\n        P5 = KL.Conv2D(config.TOP_DOWN_PYRAMID_SIZE, (3, 3), padding=\"SAME\", name=\"fpn_p5\")(P5)\n        # P6 is used for the 5th anchor scale in RPN. Generated by\n        # subsampling from P5 with stride of 2.\n        P6 = KL.MaxPooling2D(pool_size=(1, 1), strides=2, name=\"fpn_p6\")(P5)\n\n        # Note that P6 is used in RPN, but not in the classifier heads.\n        rpn_feature_maps = [P2, P3, P4, P5, P6]\n        mrcnn_feature_maps = [P2, P3, P4, P5]\n\n        # Anchors\n        if mode == \"training\":\n            anchors = self.get_anchors(config.IMAGE_SHAPE)\n            # Duplicate across the batch dimension because Keras requires it\n            # TODO: can this be optimized to avoid duplicating the anchors?\n            anchors = np.broadcast_to(anchors, (config.BATCH_SIZE,) + anchors.shape)\n            # A hack to get around Keras's bad support for constants\n            anchors = KL.Lambda(lambda x: tf.Variable(anchors), name=\"anchors\")(input_image)\n        else:\n            anchors = input_anchors\n\n        # RPN Model\n        rpn = build_rpn_model(config.RPN_ANCHOR_STRIDE,\n                              len(config.RPN_ANCHOR_RATIOS), config.TOP_DOWN_PYRAMID_SIZE)\n        # Loop through pyramid layers\n        layer_outputs = []  # list of lists\n        for p in rpn_feature_maps:\n            layer_outputs.append(rpn([p]))\n        # Concatenate layer outputs\n        # Convert from list of lists of level outputs to list of lists\n        # of outputs across levels.\n        # e.g. [[a1, b1, c1], [a2, b2, c2]] => [[a1, a2], [b1, b2], [c1, c2]]\n        output_names = [\"rpn_class_logits\", \"rpn_class\", \"rpn_bbox\"]\n        outputs = list(zip(*layer_outputs))\n        outputs = [KL.Concatenate(axis=1, name=n)(list(o))\n                   for o, n in zip(outputs, output_names)]\n\n        rpn_class_logits, rpn_class, rpn_bbox = outputs\n\n        # Generate proposals\n        # Proposals are [batch, N, (y1, x1, y2, x2)] in normalized coordinates\n        # and zero padded.\n        proposal_count = config.POST_NMS_ROIS_TRAINING if mode == \"training\"\\\n            else config.POST_NMS_ROIS_INFERENCE\n        rpn_rois = ProposalLayer(\n            proposal_count=proposal_count,\n            nms_threshold=config.RPN_NMS_THRESHOLD,\n            name=\"ROI\",\n            config=config)([rpn_class, rpn_bbox, anchors])\n\n        if mode == \"training\":\n            # Class ID mask to mark class IDs supported by the dataset the image\n            # came from.\n            active_class_ids = KL.Lambda(\n                lambda x: parse_image_meta_graph(x)[\"active_class_ids\"]\n                )(input_image_meta)\n\n            if not config.USE_RPN_ROIS:\n                # Ignore predicted ROIs and use ROIs provided as an input.\n                input_rois = KL.Input(shape=[config.POST_NMS_ROIS_TRAINING, 4],\n                                      name=\"input_roi\", dtype=np.int32)\n                # Normalize coordinates\n                target_rois = KL.Lambda(lambda x: norm_boxes_graph(\n                    x, K.shape(input_image)[1:3]))(input_rois)\n            else:\n                target_rois = rpn_rois\n\n            # Generate detection targets\n            # Subsamples proposals and generates target outputs for training\n            # Note that proposal class IDs, gt_boxes, and gt_masks are zero\n            # padded. Equally, returned rois and targets are zero padded.\n            rois, target_class_ids, target_bbox, target_mask =\\\n                DetectionTargetLayer(config, name=\"proposal_targets\")([\n                    target_rois, input_gt_class_ids, gt_boxes, input_gt_masks])\n\n            # Network Heads\n            # TODO: verify that this handles zero padded ROIs\n            mrcnn_class_logits, mrcnn_class, mrcnn_bbox =\\\n                fpn_classifier_graph(rois, mrcnn_feature_maps, input_image_meta,\n                                     config.POOL_SIZE, config.NUM_CLASSES,\n                                     train_bn=config.TRAIN_BN,\n                                     fc_layers_size=config.FPN_CLASSIF_FC_LAYERS_SIZE)\n\n            mrcnn_mask = build_fpn_mask_graph(rois, mrcnn_feature_maps,\n                                              input_image_meta,\n                                              config.MASK_POOL_SIZE,\n                                              config.NUM_CLASSES,\n                                              train_bn=config.TRAIN_BN)\n\n            # TODO: clean up (use tf.identify if necessary)\n            output_rois = KL.Lambda(lambda x: x * 1, name=\"output_rois\")(rois)\n\n            # Losses\n            rpn_class_loss = KL.Lambda(lambda x: rpn_class_loss_graph(*x), name=\"rpn_class_loss\")(\n                [input_rpn_match, rpn_class_logits])\n            rpn_bbox_loss = KL.Lambda(lambda x: rpn_bbox_loss_graph(config, *x), name=\"rpn_bbox_loss\")(\n                [input_rpn_bbox, input_rpn_match, rpn_bbox])\n            class_loss = KL.Lambda(lambda x: mrcnn_class_loss_graph(*x), name=\"mrcnn_class_loss\")(\n                [target_class_ids, mrcnn_class_logits, active_class_ids])\n            bbox_loss = KL.Lambda(lambda x: mrcnn_bbox_loss_graph(*x), name=\"mrcnn_bbox_loss\")(\n                [target_bbox, target_class_ids, mrcnn_bbox])\n            mask_loss = KL.Lambda(lambda x: mrcnn_mask_loss_graph(*x), name=\"mrcnn_mask_loss\")(\n                [target_mask, target_class_ids, mrcnn_mask])\n\n            # Model\n            inputs = [input_image, input_image_meta,\n                      input_rpn_match, input_rpn_bbox, input_gt_class_ids, input_gt_boxes, input_gt_masks]\n            if not config.USE_RPN_ROIS:\n                inputs.append(input_rois)\n            outputs = [rpn_class_logits, rpn_class, rpn_bbox,\n                       mrcnn_class_logits, mrcnn_class, mrcnn_bbox, mrcnn_mask,\n                       rpn_rois, output_rois,\n                       rpn_class_loss, rpn_bbox_loss, class_loss, bbox_loss, mask_loss]\n            model = KM.Model(inputs, outputs, name='mask_rcnn')\n        else:\n            # Network Heads\n            # Proposal classifier and BBox regressor heads\n            mrcnn_class_logits, mrcnn_class, mrcnn_bbox =\\\n                fpn_classifier_graph(rpn_rois, mrcnn_feature_maps, input_image_meta,\n                                     config.POOL_SIZE, config.NUM_CLASSES,\n                                     train_bn=config.TRAIN_BN,\n                                     fc_layers_size=config.FPN_CLASSIF_FC_LAYERS_SIZE)\n\n            # Detections\n            # output is [batch, num_detections, (y1, x1, y2, x2, class_id, score)] in\n            # normalized coordinates\n            detections = DetectionLayer(config, name=\"mrcnn_detection\")(\n                [rpn_rois, mrcnn_class, mrcnn_bbox, input_image_meta])\n\n            # Create masks for detections\n            detection_boxes = KL.Lambda(lambda x: x[..., :4])(detections)\n            mrcnn_mask = build_fpn_mask_graph(detection_boxes, mrcnn_feature_maps,\n                                              input_image_meta,\n                                              config.MASK_POOL_SIZE,\n                                              config.NUM_CLASSES,\n                                              train_bn=config.TRAIN_BN)\n\n            model = KM.Model([input_image, input_image_meta, input_anchors],\n                             [detections, mrcnn_class, mrcnn_bbox,\n                                 mrcnn_mask, rpn_rois, rpn_class, rpn_bbox],\n                             name='mask_rcnn')\n\n        # Add multi-GPU support.\n        if config.GPU_COUNT > 1:\n            from mrcnn.parallel_model import ParallelModel\n            model = ParallelModel(model, config.GPU_COUNT)\n\n        return model\n\n    def find_last(self):\n        \"\"\"Finds the last checkpoint file of the last trained model in the\n        model directory.\n        Returns:\n            The path of the last checkpoint file\n        \"\"\"\n        # Get directory names. Each directory corresponds to a model\n        dir_names = next(os.walk(self.model_dir))[1]\n        key = self.config.NAME.lower()\n        dir_names = filter(lambda f: f.startswith(key), dir_names)\n        dir_names = sorted(dir_names)\n        if not dir_names:\n            import errno\n            raise FileNotFoundError(\n                errno.ENOENT,\n                \"Could not find model directory under {}\".format(self.model_dir))\n        # Pick last directory\n        dir_name = os.path.join(self.model_dir, dir_names[-1])\n        # Find the last checkpoint\n        checkpoints = next(os.walk(dir_name))[2]\n        checkpoints = filter(lambda f: f.startswith(\"mask_rcnn\"), checkpoints)\n        checkpoints = sorted(checkpoints)\n        if not checkpoints:\n            import errno\n            raise FileNotFoundError(\n                errno.ENOENT, \"Could not find weight files in {}\".format(dir_name))\n        checkpoint = os.path.join(dir_name, checkpoints[-1])\n        return checkpoint\n\n    def load_weights(self, filepath, by_name=False, exclude=None):\n        \"\"\"Modified version of the corresponding Keras function with\n        the addition of multi-GPU support and the ability to exclude\n        some layers from loading.\n        exclude: list of layer names to exclude\n        \"\"\"\n        import h5py\n        # Conditional import to support versions of Keras before 2.2\n        # TODO: remove in about 6 months (end of 2018)\n        try:\n            from keras.engine import saving\n        except ImportError:\n            # Keras before 2.2 used the 'topology' namespace.\n            from keras.engine import topology as saving\n\n        if exclude:\n            by_name = True\n\n        if h5py is None:\n            raise ImportError('`load_weights` requires h5py.')\n        f = h5py.File(filepath, mode='r')\n        if 'layer_names' not in f.attrs and 'model_weights' in f:\n            f = f['model_weights']\n\n        # In multi-GPU training, we wrap the model. Get layers\n        # of the inner model because they have the weights.\n        keras_model = self.keras_model\n        layers = keras_model.inner_model.layers if hasattr(keras_model, \"inner_model\")\\\n            else keras_model.layers\n\n        # Exclude some layers\n        if exclude:\n            layers = filter(lambda l: l.name not in exclude, layers)\n\n        if by_name:\n            saving.load_weights_from_hdf5_group_by_name(f, layers)\n        else:\n            saving.load_weights_from_hdf5_group(f, layers)\n        if hasattr(f, 'close'):\n            f.close()\n\n        # Update the log directory\n        self.set_log_dir(filepath)\n\n    def get_imagenet_weights(self):\n        \"\"\"Downloads ImageNet trained weights from Keras.\n        Returns path to weights file.\n        \"\"\"\n        from keras.utils.data_utils import get_file\n        TF_WEIGHTS_PATH_NO_TOP = 'https://github.com/fchollet/deep-learning-models/'\\\n                                 'releases/download/v0.2/'\\\n                                 'resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5'\n        weights_path = get_file('resnet50_weights_tf_dim_ordering_tf_kernels_notop.h5',\n                                TF_WEIGHTS_PATH_NO_TOP,\n                                cache_subdir='models',\n                                md5_hash='a268eb855778b3df3c7506639542a6af')\n        return weights_path\n\n    def compile(self, learning_rate, momentum):\n        \"\"\"Gets the model ready for training. Adds losses, regularization, and\n        metrics. Then calls the Keras compile() function.\n        \"\"\"\n        # Optimizer object\n        optimizer = keras.optimizers.SGD(\n            lr=learning_rate, momentum=momentum,\n            clipnorm=self.config.GRADIENT_CLIP_NORM)\n        # Add Losses\n        # First, clear previously set losses to avoid duplication\n        self.keras_model._losses = []\n        self.keras_model._per_input_losses = {}\n        loss_names = [\n            \"rpn_class_loss\",  \"rpn_bbox_loss\",\n            \"mrcnn_class_loss\", \"mrcnn_bbox_loss\", \"mrcnn_mask_loss\"]\n        for name in loss_names:\n            layer = self.keras_model.get_layer(name)\n            if layer.output in self.keras_model.losses:\n                continue\n            loss = (\n                tf.reduce_mean(layer.output, keepdims=True)\n                * self.config.LOSS_WEIGHTS.get(name, 1.))\n            self.keras_model.add_loss(loss)\n\n        # Add L2 Regularization\n        # Skip gamma and beta weights of batch normalization layers.\n        reg_losses = [\n            keras.regularizers.l2(self.config.WEIGHT_DECAY)(w) / tf.cast(tf.size(w), tf.float32)\n            for w in self.keras_model.trainable_weights\n            if 'gamma' not in w.name and 'beta' not in w.name]\n        self.keras_model.add_loss(tf.add_n(reg_losses))\n\n        # Compile\n        self.keras_model.compile(\n            optimizer=optimizer,\n            loss=[None] * len(self.keras_model.outputs))\n\n        # Add metrics for losses\n        for name in loss_names:\n            if name in self.keras_model.metrics_names:\n                continue\n            layer = self.keras_model.get_layer(name)\n            self.keras_model.metrics_names.append(name)\n            loss = (\n                tf.reduce_mean(layer.output, keepdims=True)\n                * self.config.LOSS_WEIGHTS.get(name, 1.))\n            self.keras_model.metrics_tensors.append(loss)\n\n    def set_trainable(self, layer_regex, keras_model=None, indent=0, verbose=1):\n        \"\"\"Sets model layers as trainable if their names match\n        the given regular expression.\n        \"\"\"\n        # Print message on the first call (but not on recursive calls)\n        if verbose > 0 and keras_model is None:\n            log(\"Selecting layers to train\")\n\n        keras_model = keras_model or self.keras_model\n\n        # In multi-GPU training, we wrap the model. Get layers\n        # of the inner model because they have the weights.\n        layers = keras_model.inner_model.layers if hasattr(keras_model, \"inner_model\")\\\n            else keras_model.layers\n\n        for layer in layers:\n            # Is the layer a model?\n            if layer.__class__.__name__ == 'Model':\n                print(\"In model: \", layer.name)\n                self.set_trainable(\n                    layer_regex, keras_model=layer, indent=indent + 4)\n                continue\n\n            if not layer.weights:\n                continue\n            # Is it trainable?\n            trainable = bool(re.fullmatch(layer_regex, layer.name))\n            # Update layer. If layer is a container, update inner layer.\n            if layer.__class__.__name__ == 'TimeDistributed':\n                layer.layer.trainable = trainable\n            else:\n                layer.trainable = trainable\n            # Print trainable layer names\n            if trainable and verbose > 0:\n                log(\"{}{:20}   ({})\".format(\" \" * indent, layer.name,\n                                            layer.__class__.__name__))\n\n    def set_log_dir(self, model_path=None):\n        \"\"\"Sets the model log directory and epoch counter.\n\n        model_path: If None, or a format different from what this code uses\n            then set a new log directory and start epochs from 0. Otherwise,\n            extract the log directory and the epoch counter from the file\n            name.\n        \"\"\"\n        # Set date and epoch counter as if starting a new model\n        self.epoch = 0\n        now = datetime.datetime.now()\n\n        # If we have a model path with date and epochs use them\n        if model_path:\n            # Continue from we left of. Get epoch and date from the file name\n            # A sample model path might look like:\n            # \\path\\to\\logs\\coco20171029T2315\\mask_rcnn_coco_0001.h5 (Windows)\n            # /path/to/logs/coco20171029T2315/mask_rcnn_coco_0001.h5 (Linux)\n            regex = r\".*[/\\\\][\\w-]+(\\d{4})(\\d{2})(\\d{2})T(\\d{2})(\\d{2})[/\\\\]mask\\_rcnn\\_[\\w-]+(\\d{4})\\.h5\"\n            m = re.match(regex, model_path)\n            if m:\n                now = datetime.datetime(int(m.group(1)), int(m.group(2)), int(m.group(3)),\n                                        int(m.group(4)), int(m.group(5)))\n                # Epoch number in file is 1-based, and in Keras code it's 0-based.\n                # So, adjust for that then increment by one to start from the next epoch\n                self.epoch = int(m.group(6)) - 1 + 1\n                print('Re-starting from epoch %d' % self.epoch)\n\n        # Directory for training logs\n        self.log_dir = os.path.join(self.model_dir, \"{}{:%Y%m%dT%H%M}\".format(\n            self.config.NAME.lower(), now))\n\n        # Path to save after each epoch. Include placeholders that get filled by Keras.\n        self.checkpoint_path = os.path.join(self.log_dir, \"mask_rcnn_{}_*epoch*.h5\".format(\n            self.config.NAME.lower()))\n        self.checkpoint_path = self.checkpoint_path.replace(\n            \"*epoch*\", \"{epoch:04d}\")\n\n    def train(self, train_dataset, val_dataset, learning_rate, epochs, layers,\n              augmentation=None, custom_callbacks=None, no_augmentation_sources=None):\n        \"\"\"Train the model.\n        train_dataset, val_dataset: Training and validation Dataset objects.\n        learning_rate: The learning rate to train with\n        epochs: Number of training epochs. Note that previous training epochs\n                are considered to be done alreay, so this actually determines\n                the epochs to train in total rather than in this particaular\n                call.\n        layers: Allows selecting wich layers to train. It can be:\n            - A regular expression to match layer names to train\n            - One of these predefined values:\n              heads: The RPN, classifier and mask heads of the network\n              all: All the layers\n              3+: Train Resnet stage 3 and up\n              4+: Train Resnet stage 4 and up\n              5+: Train Resnet stage 5 and up\n        augmentation: Optional. An imgaug (https://github.com/aleju/imgaug)\n            augmentation. For example, passing imgaug.augmenters.Fliplr(0.5)\n            flips images right/left 50% of the time. You can pass complex\n            augmentations as well. This augmentation applies 50% of the\n            time, and when it does it flips images right/left half the time\n            and adds a Gaussian blur with a random sigma in range 0 to 5.\n\n                augmentation = imgaug.augmenters.Sometimes(0.5, [\n                    imgaug.augmenters.Fliplr(0.5),\n                    imgaug.augmenters.GaussianBlur(sigma=(0.0, 5.0))\n                ])\n\t    custom_callbacks: Optional. Add custom callbacks to be called\n\t        with the keras fit_generator method. Must be list of type keras.callbacks.\n        no_augmentation_sources: Optional. List of sources to exclude for\n            augmentation. A source is string that identifies a dataset and is\n            defined in the Dataset class.\n        \"\"\"\n        assert self.mode == \"training\", \"Create model in training mode.\"\n\n        # Pre-defined layer regular expressions\n        layer_regex = {\n            # all layers but the backbone\n            \"heads\": r\"(mrcnn\\_.*)|(rpn\\_.*)|(fpn\\_.*)\",\n            # From a specific Resnet stage and up\n            \"3+\": r\"(res3.*)|(bn3.*)|(res4.*)|(bn4.*)|(res5.*)|(bn5.*)|(mrcnn\\_.*)|(rpn\\_.*)|(fpn\\_.*)\",\n            \"4+\": r\"(res4.*)|(bn4.*)|(res5.*)|(bn5.*)|(mrcnn\\_.*)|(rpn\\_.*)|(fpn\\_.*)\",\n            \"5+\": r\"(res5.*)|(bn5.*)|(mrcnn\\_.*)|(rpn\\_.*)|(fpn\\_.*)\",\n            # All layers\n            \"all\": \".*\",\n        }\n        if layers in layer_regex.keys():\n            layers = layer_regex[layers]\n\n        # Data generators\n        train_generator = data_generator(train_dataset, self.config, shuffle=True,\n                                         augmentation=augmentation,\n                                         batch_size=self.config.BATCH_SIZE,\n                                         no_augmentation_sources=no_augmentation_sources)\n        val_generator = data_generator(val_dataset, self.config, shuffle=True,\n                                       batch_size=self.config.BATCH_SIZE)\n\n        # Create log_dir if it does not exist\n        if not os.path.exists(self.log_dir):\n            os.makedirs(self.log_dir)\n\n        # Callbacks\n        callbacks = [\n            keras.callbacks.TensorBoard(log_dir=self.log_dir,\n                                        histogram_freq=0, write_graph=True, write_images=False),\n            keras.callbacks.ModelCheckpoint(self.checkpoint_path,\n                                            verbose=0, save_weights_only=True),\n        ]\n\n        # Add custom callbacks to the list\n        if custom_callbacks:\n            callbacks += custom_callbacks\n\n        # Train\n        log(\"\\nStarting at epoch {}. LR={}\\n\".format(self.epoch, learning_rate))\n        log(\"Checkpoint Path: {}\".format(self.checkpoint_path))\n        self.set_trainable(layers)\n        self.compile(learning_rate, self.config.LEARNING_MOMENTUM)\n\n        # Work-around for Windows: Keras fails on Windows when using\n        # multiprocessing workers. See discussion here:\n        # https://github.com/matterport/Mask_RCNN/issues/13#issuecomment-353124009\n        if os.name is 'nt':\n            workers = 0\n        else:\n            workers = multiprocessing.cpu_count()\n\n        self.keras_model.fit_generator(\n            train_generator,\n            initial_epoch=self.epoch,\n            epochs=epochs,\n            steps_per_epoch=self.config.STEPS_PER_EPOCH,\n            callbacks=callbacks,\n            validation_data=val_generator,\n            validation_steps=self.config.VALIDATION_STEPS,\n            max_queue_size=100,\n            workers=workers,\n            use_multiprocessing=True,\n        )\n        self.epoch = max(self.epoch, epochs)\n\n    def mold_inputs(self, images):\n        \"\"\"Takes a list of images and modifies them to the format expected\n        as an input to the neural network.\n        images: List of image matrices [height,width,depth]. Images can have\n            different sizes.\n\n        Returns 3 Numpy matrices:\n        molded_images: [N, h, w, 3]. Images resized and normalized.\n        image_metas: [N, length of meta data]. Details about each image.\n        windows: [N, (y1, x1, y2, x2)]. The portion of the image that has the\n            original image (padding excluded).\n        \"\"\"\n        molded_images = []\n        image_metas = []\n        windows = []\n        for image in images:\n            # Resize image\n            # TODO: move resizing to mold_image()\n            molded_image, window, scale, padding, crop = utils.resize_image(\n                image,\n                min_dim=self.config.IMAGE_MIN_DIM,\n                min_scale=self.config.IMAGE_MIN_SCALE,\n                max_dim=self.config.IMAGE_MAX_DIM,\n                mode=self.config.IMAGE_RESIZE_MODE)\n            molded_image = mold_image(molded_image, self.config)\n            # Build image_meta\n            image_meta = compose_image_meta(\n                0, image.shape, molded_image.shape, window, scale,\n                np.zeros([self.config.NUM_CLASSES], dtype=np.int32))\n            # Append\n            molded_images.append(molded_image)\n            windows.append(window)\n            image_metas.append(image_meta)\n        # Pack into arrays\n        molded_images = np.stack(molded_images)\n        image_metas = np.stack(image_metas)\n        windows = np.stack(windows)\n        return molded_images, image_metas, windows\n\n    def unmold_detections(self, detections, mrcnn_mask, original_image_shape,\n                          image_shape, window):\n        \"\"\"Reformats the detections of one image from the format of the neural\n        network output to a format suitable for use in the rest of the\n        application.\n\n        detections: [N, (y1, x1, y2, x2, class_id, score)] in normalized coordinates\n        mrcnn_mask: [N, height, width, num_classes]\n        original_image_shape: [H, W, C] Original image shape before resizing\n        image_shape: [H, W, C] Shape of the image after resizing and padding\n        window: [y1, x1, y2, x2] Pixel coordinates of box in the image where the real\n                image is excluding the padding.\n\n        Returns:\n        boxes: [N, (y1, x1, y2, x2)] Bounding boxes in pixels\n        class_ids: [N] Integer class IDs for each bounding box\n        scores: [N] Float probability scores of the class_id\n        masks: [height, width, num_instances] Instance masks\n        \"\"\"\n        # How many detections do we have?\n        # Detections array is padded with zeros. Find the first class_id == 0.\n        zero_ix = np.where(detections[:, 4] == 0)[0]\n        N = zero_ix[0] if zero_ix.shape[0] > 0 else detections.shape[0]\n\n        # Extract boxes, class_ids, scores, and class-specific masks\n        boxes = detections[:N, :4]\n        class_ids = detections[:N, 4].astype(np.int32)\n        scores = detections[:N, 5]\n        masks = mrcnn_mask[np.arange(N), :, :, class_ids]\n\n        # Translate normalized coordinates in the resized image to pixel\n        # coordinates in the original image before resizing\n        window = utils.norm_boxes(window, image_shape[:2])\n        wy1, wx1, wy2, wx2 = window\n        shift = np.array([wy1, wx1, wy1, wx1])\n        wh = wy2 - wy1  # window height\n        ww = wx2 - wx1  # window width\n        scale = np.array([wh, ww, wh, ww])\n        # Convert boxes to normalized coordinates on the window\n        boxes = np.divide(boxes - shift, scale)\n        # Convert boxes to pixel coordinates on the original image\n        boxes = utils.denorm_boxes(boxes, original_image_shape[:2])\n\n        # Filter out detections with zero area. Happens in early training when\n        # network weights are still random\n        exclude_ix = np.where(\n            (boxes[:, 2] - boxes[:, 0]) * (boxes[:, 3] - boxes[:, 1]) <= 0)[0]\n        if exclude_ix.shape[0] > 0:\n            boxes = np.delete(boxes, exclude_ix, axis=0)\n            class_ids = np.delete(class_ids, exclude_ix, axis=0)\n            scores = np.delete(scores, exclude_ix, axis=0)\n            masks = np.delete(masks, exclude_ix, axis=0)\n            N = class_ids.shape[0]\n\n        # Resize masks to original image size and set boundary threshold.\n        full_masks = []\n        for i in range(N):\n            # Convert neural network mask to full size mask\n            full_mask = utils.unmold_mask(masks[i], boxes[i], original_image_shape)\n            full_masks.append(full_mask)\n        full_masks = np.stack(full_masks, axis=-1)\\\n            if full_masks else np.empty(original_image_shape[:2] + (0,))\n\n        return boxes, class_ids, scores, full_masks\n\n    def detect(self, images, verbose=0):\n        \"\"\"Runs the detection pipeline.\n\n        images: List of images, potentially of different sizes.\n\n        Returns a list of dicts, one dict per image. The dict contains:\n        rois: [N, (y1, x1, y2, x2)] detection bounding boxes\n        class_ids: [N] int class IDs\n        scores: [N] float probability scores for the class IDs\n        masks: [H, W, N] instance binary masks\n        \"\"\"\n        \n        assert self.mode == \"inference\", \"Create model in inference mode.\"\n        assert len(\n            images) == self.config.BATCH_SIZE, \"len(images) must be equal to BATCH_SIZE\"\n\n        if verbose:\n            log(\"Processing {} images\".format(len(images)))\n            for image in images:\n                log(\"image\", image)\n\n        # Mold inputs to format expected by the neural network\n        molded_images, image_metas, windows = self.mold_inputs(images)\n\n        # Validate image sizes\n        # All images in a batch MUST be of the same size\n        image_shape = molded_images[0].shape\n        for g in molded_images[1:]:\n            assert g.shape == image_shape,\\\n                \"After resizing, all images must have the same size. Check IMAGE_RESIZE_MODE and image sizes.\"\n\n        # Anchors\n        anchors = self.get_anchors(image_shape)\n        # Duplicate across the batch dimension because Keras requires it\n        # TODO: can this be optimized to avoid duplicating the anchors?\n        anchors = np.broadcast_to(anchors, (self.config.BATCH_SIZE,) + anchors.shape)\n\n        if verbose:\n            log(\"molded_images\", molded_images)\n            log(\"image_metas\", image_metas)\n            log(\"anchors\", anchors)\n        # Run object detection\n        detections, _, _, mrcnn_mask, _, _, _ =\\\n            self.keras_model.predict([molded_images, image_metas, anchors], verbose=0)\n        # Process detections\n        results = []\n        for i, image in enumerate(images):\n            final_rois, final_class_ids, final_scores, final_masks =\\\n                self.unmold_detections(detections[i], mrcnn_mask[i],\n                                       image.shape, molded_images[i].shape,\n                                       windows[i])\n            results.append({\n                \"rois\": final_rois,\n                \"class_ids\": final_class_ids,\n                \"scores\": final_scores,\n                \"masks\": final_masks,\n            })\n        return results\n\n    def detect_molded(self, molded_images, image_metas, verbose=0):\n        \"\"\"Runs the detection pipeline, but expect inputs that are\n        molded already. Used mostly for debugging and inspecting\n        the model.\n\n        molded_images: List of images loaded using load_image_gt()\n        image_metas: image meta data, also returned by load_image_gt()\n\n        Returns a list of dicts, one dict per image. The dict contains:\n        rois: [N, (y1, x1, y2, x2)] detection bounding boxes\n        class_ids: [N] int class IDs\n        scores: [N] float probability scores for the class IDs\n        masks: [H, W, N] instance binary masks\n        \"\"\"\n        assert self.mode == \"inference\", \"Create model in inference mode.\"\n        assert len(molded_images) == self.config.BATCH_SIZE,\\\n            \"Number of images must be equal to BATCH_SIZE\"\n\n        if verbose:\n            log(\"Processing {} images\".format(len(molded_images)))\n            for image in molded_images:\n                log(\"image\", image)\n\n        # Validate image sizes\n        # All images in a batch MUST be of the same size\n        image_shape = molded_images[0].shape\n        for g in molded_images[1:]:\n            assert g.shape == image_shape, \"Images must have the same size\"\n\n        # Anchors\n        anchors = self.get_anchors(image_shape)\n        # Duplicate across the batch dimension because Keras requires it\n        # TODO: can this be optimized to avoid duplicating the anchors?\n        anchors = np.broadcast_to(anchors, (self.config.BATCH_SIZE,) + anchors.shape)\n\n        if verbose:\n            log(\"molded_images\", molded_images)\n            log(\"image_metas\", image_metas)\n            log(\"anchors\", anchors)\n        # Run object detection\n        detections, _, _, mrcnn_mask, _, _, _ =\\\n            self.keras_model.predict([molded_images, image_metas, anchors], verbose=0)\n        # Process detections\n        results = []\n        for i, image in enumerate(molded_images):\n            window = [0, 0, image.shape[0], image.shape[1]]\n            final_rois, final_class_ids, final_scores, final_masks =\\\n                self.unmold_detections(detections[i], mrcnn_mask[i],\n                                       image.shape, molded_images[i].shape,\n                                       window)\n            results.append({\n                \"rois\": final_rois,\n                \"class_ids\": final_class_ids,\n                \"scores\": final_scores,\n                \"masks\": final_masks,\n            })\n        return results\n\n    def get_anchors(self, image_shape):\n        \"\"\"Returns anchor pyramid for the given image size.\"\"\"\n        backbone_shapes = compute_backbone_shapes(self.config, image_shape)\n        # Cache anchors and reuse if image shape is the same\n        if not hasattr(self, \"_anchor_cache\"):\n            self._anchor_cache = {}\n        if not tuple(image_shape) in self._anchor_cache:\n            # Generate Anchors\n            a = utils.generate_pyramid_anchors(\n                self.config.RPN_ANCHOR_SCALES,\n                self.config.RPN_ANCHOR_RATIOS,\n                backbone_shapes,\n                self.config.BACKBONE_STRIDES,\n                self.config.RPN_ANCHOR_STRIDE)\n            # Keep a copy of the latest anchors in pixel coordinates because\n            # it's used in inspect_model notebooks.\n            # TODO: Remove this after the notebook are refactored to not use it\n            self.anchors = a\n            # Normalize coordinates\n            self._anchor_cache[tuple(image_shape)] = utils.norm_boxes(a, image_shape[:2])\n        return self._anchor_cache[tuple(image_shape)]\n\n    def ancestor(self, tensor, name, checked=None):\n        \"\"\"Finds the ancestor of a TF tensor in the computation graph.\n        tensor: TensorFlow symbolic tensor.\n        name: Name of ancestor tensor to find\n        checked: For internal use. A list of tensors that were already\n                 searched to avoid loops in traversing the graph.\n        \"\"\"\n        checked = checked if checked is not None else []\n        # Put a limit on how deep we go to avoid very long loops\n        if len(checked) > 500:\n            return None\n        # Convert name to a regex and allow matching a number prefix\n        # because Keras adds them automatically\n        if isinstance(name, str):\n            name = re.compile(name.replace(\"/\", r\"(\\_\\d+)*/\"))\n\n        parents = tensor.op.inputs\n        for p in parents:\n            if p in checked:\n                continue\n            if bool(re.fullmatch(name, p.name)):\n                return p\n            checked.append(p)\n            a = self.ancestor(p, name, checked)\n            if a is not None:\n                return a\n        return None\n\n    def find_trainable_layer(self, layer):\n        \"\"\"If a layer is encapsulated by another layer, this function\n        digs through the encapsulation and returns the layer that holds\n        the weights.\n        \"\"\"\n        if layer.__class__.__name__ == 'TimeDistributed':\n            return self.find_trainable_layer(layer.layer)\n        return layer\n\n    def get_trainable_layers(self):\n        \"\"\"Returns a list of layers that have weights.\"\"\"\n        layers = []\n        # Loop through all layers\n        for l in self.keras_model.layers:\n            # If layer is a wrapper, find inner trainable layer\n            l = self.find_trainable_layer(l)\n            # Include layer if it has weights\n            if l.get_weights():\n                layers.append(l)\n        return layers\n\n    def run_graph(self, images, outputs, image_metas=None):\n        \"\"\"Runs a sub-set of the computation graph that computes the given\n        outputs.\n\n        image_metas: If provided, the images are assumed to be already\n            molded (i.e. resized, padded, and normalized)\n\n        outputs: List of tuples (name, tensor) to compute. The tensors are\n            symbolic TensorFlow tensors and the names are for easy tracking.\n\n        Returns an ordered dict of results. Keys are the names received in the\n        input and values are Numpy arrays.\n        \"\"\"\n        model = self.keras_model\n\n        # Organize desired outputs into an ordered dict\n        outputs = OrderedDict(outputs)\n        for o in outputs.values():\n            assert o is not None\n\n        # Build a Keras function to run parts of the computation graph\n        inputs = model.inputs\n        if model.uses_learning_phase and not isinstance(K.learning_phase(), int):\n            inputs += [K.learning_phase()]\n        kf = K.function(model.inputs, list(outputs.values()))\n\n        # Prepare inputs\n        if image_metas is None:\n            molded_images, image_metas, _ = self.mold_inputs(images)\n        else:\n            molded_images = images\n        image_shape = molded_images[0].shape\n        # Anchors\n        anchors = self.get_anchors(image_shape)\n        # Duplicate across the batch dimension because Keras requires it\n        # TODO: can this be optimized to avoid duplicating the anchors?\n        anchors = np.broadcast_to(anchors, (self.config.BATCH_SIZE,) + anchors.shape)\n        model_in = [molded_images, image_metas, anchors]\n\n        # Run inference\n        if model.uses_learning_phase and not isinstance(K.learning_phase(), int):\n            model_in.append(0.)\n        outputs_np = kf(model_in)\n\n        # Pack the generated Numpy arrays into a a dict and log the results.\n        outputs_np = OrderedDict([(k, v)\n                                  for k, v in zip(outputs.keys(), outputs_np)])\n        for k, v in outputs_np.items():\n            log(k, v)\n        return outputs_np\n\n\n############################################################\n#  Data Formatting\n############################################################\n\ndef compose_image_meta(image_id, original_image_shape, image_shape,\n                       window, scale, active_class_ids):\n    \"\"\"Takes attributes of an image and puts them in one 1D array.\n\n    image_id: An int ID of the image. Useful for debugging.\n    original_image_shape: [H, W, C] before resizing or padding.\n    image_shape: [H, W, C] after resizing and padding\n    window: (y1, x1, y2, x2) in pixels. The area of the image where the real\n            image is (excluding the padding)\n    scale: The scaling factor applied to the original image (float32)\n    active_class_ids: List of class_ids available in the dataset from which\n        the image came. Useful if training on images from multiple datasets\n        where not all classes are present in all datasets.\n    \"\"\"\n    meta = np.array(\n        [image_id] +                  # size=1\n        list(original_image_shape) +  # size=3\n        list(image_shape) +           # size=3\n        list(window) +                # size=4 (y1, x1, y2, x2) in image cooredinates\n        [scale] +                     # size=1\n        list(active_class_ids)        # size=num_classes\n    )\n    return meta\n\n\ndef parse_image_meta(meta):\n    \"\"\"Parses an array that contains image attributes to its components.\n    See compose_image_meta() for more details.\n\n    meta: [batch, meta length] where meta length depends on NUM_CLASSES\n\n    Returns a dict of the parsed values.\n    \"\"\"\n    image_id = meta[:, 0]\n    original_image_shape = meta[:, 1:4]\n    image_shape = meta[:, 4:7]\n    window = meta[:, 7:11]  # (y1, x1, y2, x2) window of image in in pixels\n    scale = meta[:, 11]\n    active_class_ids = meta[:, 12:]\n    return {\n        \"image_id\": image_id.astype(np.int32),\n        \"original_image_shape\": original_image_shape.astype(np.int32),\n        \"image_shape\": image_shape.astype(np.int32),\n        \"window\": window.astype(np.int32),\n        \"scale\": scale.astype(np.float32),\n        \"active_class_ids\": active_class_ids.astype(np.int32),\n    }\n\n\ndef parse_image_meta_graph(meta):\n    \"\"\"Parses a tensor that contains image attributes to its components.\n    See compose_image_meta() for more details.\n\n    meta: [batch, meta length] where meta length depends on NUM_CLASSES\n\n    Returns a dict of the parsed tensors.\n    \"\"\"\n    image_id = meta[:, 0]\n    original_image_shape = meta[:, 1:4]\n    image_shape = meta[:, 4:7]\n    window = meta[:, 7:11]  # (y1, x1, y2, x2) window of image in in pixels\n    scale = meta[:, 11]\n    active_class_ids = meta[:, 12:]\n    return {\n        \"image_id\": image_id,\n        \"original_image_shape\": original_image_shape,\n        \"image_shape\": image_shape,\n        \"window\": window,\n        \"scale\": scale,\n        \"active_class_ids\": active_class_ids,\n    }\n\n\ndef mold_image(images, config):\n    \"\"\"Expects an RGB image (or array of images) and subtracts\n    the mean pixel and converts it to float. Expects image\n    colors in RGB order.\n    \"\"\"\n    return images.astype(np.float32) - config.MEAN_PIXEL\n\n\ndef unmold_image(normalized_images, config):\n    \"\"\"Takes a image normalized with mold() and returns the original.\"\"\"\n    return (normalized_images + config.MEAN_PIXEL).astype(np.uint8)\n\n\n############################################################\n#  Miscellenous Graph Functions\n############################################################\n\ndef trim_zeros_graph(boxes, name=None):\n    \"\"\"Often boxes are represented with matrices of shape [N, 4] and\n    are padded with zeros. This removes zero boxes.\n\n    boxes: [N, 4] matrix of boxes.\n    non_zeros: [N] a 1D boolean mask identifying the rows to keep\n    \"\"\"\n    non_zeros = tf.cast(tf.reduce_sum(tf.abs(boxes), axis=1), tf.bool)\n    boxes = tf.boolean_mask(boxes, non_zeros, name=name)\n    return boxes, non_zeros\n\n\ndef batch_pack_graph(x, counts, num_rows):\n    \"\"\"Picks different number of values from each row\n    in x depending on the values in counts.\n    \"\"\"\n    outputs = []\n    for i in range(num_rows):\n        outputs.append(x[i, :counts[i]])\n    return tf.concat(outputs, axis=0)\n\n\ndef norm_boxes_graph(boxes, shape):\n    \"\"\"Converts boxes from pixel coordinates to normalized coordinates.\n    boxes: [..., (y1, x1, y2, x2)] in pixel coordinates\n    shape: [..., (height, width)] in pixels\n\n    Note: In pixel coordinates (y2, x2) is outside the box. But in normalized\n    coordinates it's inside the box.\n\n    Returns:\n        [..., (y1, x1, y2, x2)] in normalized coordinates\n    \"\"\"\n    h, w = tf.split(tf.cast(shape, tf.float32), 2)\n    scale = tf.concat([h, w, h, w], axis=-1) - tf.constant(1.0)\n    shift = tf.constant([0., 0., 1., 1.])\n    return tf.divide(boxes - shift, scale)\n\n\ndef denorm_boxes_graph(boxes, shape):\n    \"\"\"Converts boxes from normalized coordinates to pixel coordinates.\n    boxes: [..., (y1, x1, y2, x2)] in normalized coordinates\n    shape: [..., (height, width)] in pixels\n\n    Note: In pixel coordinates (y2, x2) is outside the box. But in normalized\n    coordinates it's inside the box.\n\n    Returns:\n        [..., (y1, x1, y2, x2)] in pixel coordinates\n    \"\"\"\n    h, w = tf.split(tf.cast(shape, tf.float32), 2)\n    scale = tf.concat([h, w, h, w], axis=-1) - tf.constant(1.0)\n    shift = tf.constant([0., 0., 1., 1.])\n    return tf.cast(tf.round(tf.multiply(boxes, scale) + shift), tf.int32)\n"
  },
  {
    "path": "Mask_RCNN/mrcnn/parallel_model.py",
    "content": "\"\"\"\nMask R-CNN\nMulti-GPU Support for Keras.\n\nCopyright (c) 2017 Matterport, Inc.\nLicensed under the MIT License (see LICENSE for details)\nWritten by Waleed Abdulla\n\nIdeas and a small code snippets from these sources:\nhttps://github.com/fchollet/keras/issues/2436\nhttps://medium.com/@kuza55/transparent-multi-gpu-training-on-tensorflow-with-keras-8b0016fd9012\nhttps://github.com/avolkov1/keras_experiments/blob/master/keras_exp/multigpu/\nhttps://github.com/fchollet/keras/blob/master/keras/utils/training_utils.py\n\"\"\"\n\nimport tensorflow as tf\nimport keras.backend as K\nimport keras.layers as KL\nimport keras.models as KM\n\n\nclass ParallelModel(KM.Model):\n    \"\"\"Subclasses the standard Keras Model and adds multi-GPU support.\n    It works by creating a copy of the model on each GPU. Then it slices\n    the inputs and sends a slice to each copy of the model, and then\n    merges the outputs together and applies the loss on the combined\n    outputs.\n    \"\"\"\n\n    def __init__(self, keras_model, gpu_count):\n        \"\"\"Class constructor.\n        keras_model: The Keras model to parallelize\n        gpu_count: Number of GPUs. Must be > 1\n        \"\"\"\n        self.inner_model = keras_model\n        self.gpu_count = gpu_count\n        merged_outputs = self.make_parallel()\n        super(ParallelModel, self).__init__(inputs=self.inner_model.inputs,\n                                            outputs=merged_outputs)\n\n    def __getattribute__(self, attrname):\n        \"\"\"Redirect loading and saving methods to the inner model. That's where\n        the weights are stored.\"\"\"\n        if 'load' in attrname or 'save' in attrname:\n            return getattr(self.inner_model, attrname)\n        return super(ParallelModel, self).__getattribute__(attrname)\n\n    def summary(self, *args, **kwargs):\n        \"\"\"Override summary() to display summaries of both, the wrapper\n        and inner models.\"\"\"\n        super(ParallelModel, self).summary(*args, **kwargs)\n        self.inner_model.summary(*args, **kwargs)\n\n    def make_parallel(self):\n        \"\"\"Creates a new wrapper model that consists of multiple replicas of\n        the original model placed on different GPUs.\n        \"\"\"\n        # Slice inputs. Slice inputs on the CPU to avoid sending a copy\n        # of the full inputs to all GPUs. Saves on bandwidth and memory.\n        input_slices = {name: tf.split(x, self.gpu_count)\n                        for name, x in zip(self.inner_model.input_names,\n                                           self.inner_model.inputs)}\n\n        output_names = self.inner_model.output_names\n        outputs_all = []\n        for i in range(len(self.inner_model.outputs)):\n            outputs_all.append([])\n\n        # Run the model call() on each GPU to place the ops there\n        for i in range(self.gpu_count):\n            with tf.device('/gpu:%d' % i):\n                with tf.name_scope('tower_%d' % i):\n                    # Run a slice of inputs through this replica\n                    zipped_inputs = zip(self.inner_model.input_names,\n                                        self.inner_model.inputs)\n                    inputs = [\n                        KL.Lambda(lambda s: input_slices[name][i],\n                                  output_shape=lambda s: (None,) + s[1:])(tensor)\n                        for name, tensor in zipped_inputs]\n                    # Create the model replica and get the outputs\n                    outputs = self.inner_model(inputs)\n                    if not isinstance(outputs, list):\n                        outputs = [outputs]\n                    # Save the outputs for merging back together later\n                    for l, o in enumerate(outputs):\n                        outputs_all[l].append(o)\n\n        # Merge outputs on CPU\n        with tf.device('/cpu:0'):\n            merged = []\n            for outputs, name in zip(outputs_all, output_names):\n                # Concatenate or average outputs?\n                # Outputs usually have a batch dimension and we concatenate\n                # across it. If they don't, then the output is likely a loss\n                # or a metric value that gets averaged across the batch.\n                # Keras expects losses and metrics to be scalars.\n                if K.int_shape(outputs[0]) == ():\n                    # Average\n                    m = KL.Lambda(lambda o: tf.add_n(o) / len(outputs), name=name)(outputs)\n                else:\n                    # Concatenate\n                    m = KL.Concatenate(axis=0, name=name)(outputs)\n                merged.append(m)\n        return merged\n\n\nif __name__ == \"__main__\":\n    # Testing code below. It creates a simple model to train on MNIST and\n    # tries to run it on 2 GPUs. It saves the graph so it can be viewed\n    # in TensorBoard. Run it as:\n    #\n    # python3 parallel_model.py\n\n    import os\n    import numpy as np\n    import keras.optimizers\n    from keras.datasets import mnist\n    from keras.preprocessing.image import ImageDataGenerator\n\n    GPU_COUNT = 2\n\n    # Root directory of the project\n    ROOT_DIR = os.path.abspath(\"../\")\n\n    # Directory to save logs and trained model\n    MODEL_DIR = os.path.join(ROOT_DIR, \"logs\")\n\n    def build_model(x_train, num_classes):\n        # Reset default graph. Keras leaves old ops in the graph,\n        # which are ignored for execution but clutter graph\n        # visualization in TensorBoard.\n        tf.reset_default_graph()\n\n        inputs = KL.Input(shape=x_train.shape[1:], name=\"input_image\")\n        x = KL.Conv2D(32, (3, 3), activation='relu', padding=\"same\",\n                      name=\"conv1\")(inputs)\n        x = KL.Conv2D(64, (3, 3), activation='relu', padding=\"same\",\n                      name=\"conv2\")(x)\n        x = KL.MaxPooling2D(pool_size=(2, 2), name=\"pool1\")(x)\n        x = KL.Flatten(name=\"flat1\")(x)\n        x = KL.Dense(128, activation='relu', name=\"dense1\")(x)\n        x = KL.Dense(num_classes, activation='softmax', name=\"dense2\")(x)\n\n        return KM.Model(inputs, x, \"digit_classifier_model\")\n\n    # Load MNIST Data\n    (x_train, y_train), (x_test, y_test) = mnist.load_data()\n    x_train = np.expand_dims(x_train, -1).astype('float32') / 255\n    x_test = np.expand_dims(x_test, -1).astype('float32') / 255\n\n    print('x_train shape:', x_train.shape)\n    print('x_test shape:', x_test.shape)\n\n    # Build data generator and model\n    datagen = ImageDataGenerator()\n    model = build_model(x_train, 10)\n\n    # Add multi-GPU support.\n    model = ParallelModel(model, GPU_COUNT)\n\n    optimizer = keras.optimizers.SGD(lr=0.01, momentum=0.9, clipnorm=5.0)\n\n    model.compile(loss='sparse_categorical_crossentropy',\n                  optimizer=optimizer, metrics=['accuracy'])\n\n    model.summary()\n\n    # Train\n    model.fit_generator(\n        datagen.flow(x_train, y_train, batch_size=64),\n        steps_per_epoch=50, epochs=10, verbose=1,\n        validation_data=(x_test, y_test),\n        callbacks=[keras.callbacks.TensorBoard(log_dir=MODEL_DIR,\n                                               write_graph=True)]\n    )\n"
  },
  {
    "path": "Mask_RCNN/mrcnn/utils.py",
    "content": "\"\"\"\nMask R-CNN\nCommon utility functions and classes.\n\nCopyright (c) 2017 Matterport, Inc.\nLicensed under the MIT License (see LICENSE for details)\nWritten by Waleed Abdulla\n\"\"\"\n\nimport sys\nimport os\nimport math\nimport random\nimport numpy as np\nimport tensorflow as tf\nimport scipy\nimport skimage.color\nimport skimage.io\nimport skimage.transform\nimport urllib.request\nimport shutil\nimport warnings\nfrom distutils.version import LooseVersion\n\n# URL from which to download the latest COCO trained weights\nCOCO_MODEL_URL = \"https://github.com/matterport/Mask_RCNN/releases/download/v2.0/mask_rcnn_coco.h5\"\n\n\n############################################################\n#  Bounding Boxes\n############################################################\n\ndef extract_bboxes(mask):\n    \"\"\"Compute bounding boxes from masks.\n    mask: [height, width, num_instances]. Mask pixels are either 1 or 0.\n\n    Returns: bbox array [num_instances, (y1, x1, y2, x2)].\n    \"\"\"\n    boxes = np.zeros([mask.shape[-1], 4], dtype=np.int32)\n    for i in range(mask.shape[-1]):\n        m = mask[:, :, i]\n        # Bounding box.\n        horizontal_indicies = np.where(np.any(m, axis=0))[0]\n        vertical_indicies = np.where(np.any(m, axis=1))[0]\n        if horizontal_indicies.shape[0]:\n            x1, x2 = horizontal_indicies[[0, -1]]\n            y1, y2 = vertical_indicies[[0, -1]]\n            # x2 and y2 should not be part of the box. Increment by 1.\n            x2 += 1\n            y2 += 1\n        else:\n            # No mask for this instance. Might happen due to\n            # resizing or cropping. Set bbox to zeros\n            x1, x2, y1, y2 = 0, 0, 0, 0\n        boxes[i] = np.array([y1, x1, y2, x2])\n    return boxes.astype(np.int32)\n\n\ndef compute_iou(box, boxes, box_area, boxes_area):\n    \"\"\"Calculates IoU of the given box with the array of the given boxes.\n    box: 1D vector [y1, x1, y2, x2]\n    boxes: [boxes_count, (y1, x1, y2, x2)]\n    box_area: float. the area of 'box'\n    boxes_area: array of length boxes_count.\n\n    Note: the areas are passed in rather than calculated here for\n    efficiency. Calculate once in the caller to avoid duplicate work.\n    \"\"\"\n    # Calculate intersection areas\n    y1 = np.maximum(box[0], boxes[:, 0])\n    y2 = np.minimum(box[2], boxes[:, 2])\n    x1 = np.maximum(box[1], boxes[:, 1])\n    x2 = np.minimum(box[3], boxes[:, 3])\n    intersection = np.maximum(x2 - x1, 0) * np.maximum(y2 - y1, 0)\n    union = box_area + boxes_area[:] - intersection[:]\n    iou = intersection / union\n    return iou\n\n\ndef compute_overlaps(boxes1, boxes2):\n    \"\"\"Computes IoU overlaps between two sets of boxes.\n    boxes1, boxes2: [N, (y1, x1, y2, x2)].\n\n    For better performance, pass the largest set first and the smaller second.\n    \"\"\"\n    # Areas of anchors and GT boxes\n    area1 = (boxes1[:, 2] - boxes1[:, 0]) * (boxes1[:, 3] - boxes1[:, 1])\n    area2 = (boxes2[:, 2] - boxes2[:, 0]) * (boxes2[:, 3] - boxes2[:, 1])\n\n    # Compute overlaps to generate matrix [boxes1 count, boxes2 count]\n    # Each cell contains the IoU value.\n    overlaps = np.zeros((boxes1.shape[0], boxes2.shape[0]))\n    for i in range(overlaps.shape[1]):\n        box2 = boxes2[i]\n        overlaps[:, i] = compute_iou(box2, boxes1, area2[i], area1)\n    return overlaps\n\n\ndef compute_overlaps_masks(masks1, masks2):\n    \"\"\"Computes IoU overlaps between two sets of masks.\n    masks1, masks2: [Height, Width, instances]\n    \"\"\"\n    \n    # If either set of masks is empty return empty result\n    if masks1.shape[0] == 0 or masks2.shape[0] == 0:\n        return np.zeros((masks1.shape[0], masks2.shape[-1]))\n    # flatten masks and compute their areas\n    masks1 = np.reshape(masks1 > .5, (-1, masks1.shape[-1])).astype(np.float32)\n    masks2 = np.reshape(masks2 > .5, (-1, masks2.shape[-1])).astype(np.float32)\n    area1 = np.sum(masks1, axis=0)\n    area2 = np.sum(masks2, axis=0)\n\n    # intersections and union\n    intersections = np.dot(masks1.T, masks2)\n    union = area1[:, None] + area2[None, :] - intersections\n    overlaps = intersections / union\n\n    return overlaps\n\n\ndef non_max_suppression(boxes, scores, threshold):\n    \"\"\"Performs non-maximum suppression and returns indices of kept boxes.\n    boxes: [N, (y1, x1, y2, x2)]. Notice that (y2, x2) lays outside the box.\n    scores: 1-D array of box scores.\n    threshold: Float. IoU threshold to use for filtering.\n    \"\"\"\n    assert boxes.shape[0] > 0\n    if boxes.dtype.kind != \"f\":\n        boxes = boxes.astype(np.float32)\n\n    # Compute box areas\n    y1 = boxes[:, 0]\n    x1 = boxes[:, 1]\n    y2 = boxes[:, 2]\n    x2 = boxes[:, 3]\n    area = (y2 - y1) * (x2 - x1)\n\n    # Get indicies of boxes sorted by scores (highest first)\n    ixs = scores.argsort()[::-1]\n\n    pick = []\n    while len(ixs) > 0:\n        # Pick top box and add its index to the list\n        i = ixs[0]\n        pick.append(i)\n        # Compute IoU of the picked box with the rest\n        iou = compute_iou(boxes[i], boxes[ixs[1:]], area[i], area[ixs[1:]])\n        # Identify boxes with IoU over the threshold. This\n        # returns indices into ixs[1:], so add 1 to get\n        # indices into ixs.\n        remove_ixs = np.where(iou > threshold)[0] + 1\n        # Remove indices of the picked and overlapped boxes.\n        ixs = np.delete(ixs, remove_ixs)\n        ixs = np.delete(ixs, 0)\n    return np.array(pick, dtype=np.int32)\n\n\ndef apply_box_deltas(boxes, deltas):\n    \"\"\"Applies the given deltas to the given boxes.\n    boxes: [N, (y1, x1, y2, x2)]. Note that (y2, x2) is outside the box.\n    deltas: [N, (dy, dx, log(dh), log(dw))]\n    \"\"\"\n    boxes = boxes.astype(np.float32)\n    # Convert to y, x, h, w\n    height = boxes[:, 2] - boxes[:, 0]\n    width = boxes[:, 3] - boxes[:, 1]\n    center_y = boxes[:, 0] + 0.5 * height\n    center_x = boxes[:, 1] + 0.5 * width\n    # Apply deltas\n    center_y += deltas[:, 0] * height\n    center_x += deltas[:, 1] * width\n    height *= np.exp(deltas[:, 2])\n    width *= np.exp(deltas[:, 3])\n    # Convert back to y1, x1, y2, x2\n    y1 = center_y - 0.5 * height\n    x1 = center_x - 0.5 * width\n    y2 = y1 + height\n    x2 = x1 + width\n    return np.stack([y1, x1, y2, x2], axis=1)\n\n\ndef box_refinement_graph(box, gt_box):\n    \"\"\"Compute refinement needed to transform box to gt_box.\n    box and gt_box are [N, (y1, x1, y2, x2)]\n    \"\"\"\n    box = tf.cast(box, tf.float32)\n    gt_box = tf.cast(gt_box, tf.float32)\n\n    height = box[:, 2] - box[:, 0]\n    width = box[:, 3] - box[:, 1]\n    center_y = box[:, 0] + 0.5 * height\n    center_x = box[:, 1] + 0.5 * width\n\n    gt_height = gt_box[:, 2] - gt_box[:, 0]\n    gt_width = gt_box[:, 3] - gt_box[:, 1]\n    gt_center_y = gt_box[:, 0] + 0.5 * gt_height\n    gt_center_x = gt_box[:, 1] + 0.5 * gt_width\n\n    dy = (gt_center_y - center_y) / height\n    dx = (gt_center_x - center_x) / width\n    dh = tf.log(gt_height / height)\n    dw = tf.log(gt_width / width)\n\n    result = tf.stack([dy, dx, dh, dw], axis=1)\n    return result\n\n\ndef box_refinement(box, gt_box):\n    \"\"\"Compute refinement needed to transform box to gt_box.\n    box and gt_box are [N, (y1, x1, y2, x2)]. (y2, x2) is\n    assumed to be outside the box.\n    \"\"\"\n    box = box.astype(np.float32)\n    gt_box = gt_box.astype(np.float32)\n\n    height = box[:, 2] - box[:, 0]\n    width = box[:, 3] - box[:, 1]\n    center_y = box[:, 0] + 0.5 * height\n    center_x = box[:, 1] + 0.5 * width\n\n    gt_height = gt_box[:, 2] - gt_box[:, 0]\n    gt_width = gt_box[:, 3] - gt_box[:, 1]\n    gt_center_y = gt_box[:, 0] + 0.5 * gt_height\n    gt_center_x = gt_box[:, 1] + 0.5 * gt_width\n\n    dy = (gt_center_y - center_y) / height\n    dx = (gt_center_x - center_x) / width\n    dh = np.log(gt_height / height)\n    dw = np.log(gt_width / width)\n\n    return np.stack([dy, dx, dh, dw], axis=1)\n\n\n############################################################\n#  Dataset\n############################################################\n\nclass Dataset(object):\n    \"\"\"The base class for dataset classes.\n    To use it, create a new class that adds functions specific to the dataset\n    you want to use. For example:\n\n    class CatsAndDogsDataset(Dataset):\n        def load_cats_and_dogs(self):\n            ...\n        def load_mask(self, image_id):\n            ...\n        def image_reference(self, image_id):\n            ...\n\n    See COCODataset and ShapesDataset as examples.\n    \"\"\"\n\n    def __init__(self, class_map=None):\n        self._image_ids = []\n        self.image_info = []\n        # Background is always the first class\n        self.class_info = [{\"source\": \"\", \"id\": 0, \"name\": \"BG\"}]\n        self.source_class_ids = {}\n\n    def add_class(self, source, class_id, class_name):\n        assert \".\" not in source, \"Source name cannot contain a dot\"\n        # Does the class exist already?\n        for info in self.class_info:\n            if info['source'] == source and info[\"id\"] == class_id:\n                # source.class_id combination already available, skip\n                return\n        # Add the class\n        self.class_info.append({\n            \"source\": source,\n            \"id\": class_id,\n            \"name\": class_name,\n        })\n\n    def add_image(self, source, image_id, path, **kwargs):\n        image_info = {\n            \"id\": image_id,\n            \"source\": source,\n            \"path\": path,\n        }\n        image_info.update(kwargs)\n        self.image_info.append(image_info)\n\n    def image_reference(self, image_id):\n        \"\"\"Return a link to the image in its source Website or details about\n        the image that help looking it up or debugging it.\n\n        Override for your dataset, but pass to this function\n        if you encounter images not in your dataset.\n        \"\"\"\n        return \"\"\n\n    def prepare(self, class_map=None):\n        \"\"\"Prepares the Dataset class for use.\n\n        TODO: class map is not supported yet. When done, it should handle mapping\n              classes from different datasets to the same class ID.\n        \"\"\"\n\n        def clean_name(name):\n            \"\"\"Returns a shorter version of object names for cleaner display.\"\"\"\n            return \",\".join(name.split(\",\")[:1])\n\n        # Build (or rebuild) everything else from the info dicts.\n        self.num_classes = len(self.class_info)\n        #print (\"num_classes \")\n        #print num_classes\n        self.class_ids = np.arange(self.num_classes)\n        self.class_names = [clean_name(c[\"name\"]) for c in self.class_info]\n        self.num_images = len(self.image_info)\n        self._image_ids = np.arange(self.num_images)\n\n        # Mapping from source class and image IDs to internal IDs\n        self.class_from_source_map = {\"{}.{}\".format(info['source'], info['id']): id\n                                      for info, id in zip(self.class_info, self.class_ids)}\n        self.image_from_source_map = {\"{}.{}\".format(info['source'], info['id']): id\n                                      for info, id in zip(self.image_info, self.image_ids)}\n\n        # Map sources to class_ids they support\n        self.sources = list(set([i['source'] for i in self.class_info]))\n        self.source_class_ids = {}\n        # Loop over datasets\n        for source in self.sources:\n            self.source_class_ids[source] = []\n            # Find classes that belong to this dataset\n            for i, info in enumerate(self.class_info):\n                # Include BG class in all datasets\n                if i == 0 or source == info['source']:\n                    self.source_class_ids[source].append(i)\n\n    def map_source_class_id(self, source_class_id):\n        \"\"\"Takes a source class ID and returns the int class ID assigned to it.\n\n        For example:\n        dataset.map_source_class_id(\"coco.12\") -> 23\n        \"\"\"\n        return self.class_from_source_map[source_class_id]\n\n    def get_source_class_id(self, class_id, source):\n        \"\"\"Map an internal class ID to the corresponding class ID in the source dataset.\"\"\"\n        info = self.class_info[class_id]\n        assert info['source'] == source\n        return info['id']\n\n    @property\n    def image_ids(self):\n        return self._image_ids\n\n    def source_image_link(self, image_id):\n        \"\"\"Returns the path or URL to the image.\n        Override this to return a URL to the image if it's available online for easy\n        debugging.\n        \"\"\"\n        return self.image_info[image_id][\"path\"]\n\n    def load_image(self, image_id):\n        \"\"\"Load the specified image and return a [H,W,3] Numpy array.\n        \"\"\"\n        # Load image\n        image = skimage.io.imread(self.image_info[image_id]['path'])\n        # If grayscale. Convert to RGB for consistency.\n        if image.ndim != 3:\n            image = skimage.color.gray2rgb(image)\n        # If has an alpha channel, remove it for consistency\n        if image.shape[-1] == 4:\n            image = image[..., :3]\n        return image\n\n    def load_mask(self, image_id):\n        \"\"\"Load instance masks for the given image.\n\n        Different datasets use different ways to store masks. Override this\n        method to load instance masks and return them in the form of am\n        array of binary masks of shape [height, width, instances].\n\n        Returns:\n            masks: A bool array of shape [height, width, instance count] with\n                a binary mask per instance.\n            class_ids: a 1D array of class IDs of the instance masks.\n        \"\"\"\n        # Override this function to load a mask from your dataset.\n        # Otherwise, it returns an empty mask.\n        mask = np.empty([0, 0, 0])\n        class_ids = np.empty([0], np.int32)\n        return mask, class_ids\n\n\ndef resize_image(image, min_dim=None, max_dim=None, min_scale=None, mode=\"square\"):\n    \"\"\"Resizes an image keeping the aspect ratio unchanged.\n\n    min_dim: if provided, resizes the image such that it's smaller\n        dimension == min_dim\n    max_dim: if provided, ensures that the image longest side doesn't\n        exceed this value.\n    min_scale: if provided, ensure that the image is scaled up by at least\n        this percent even if min_dim doesn't require it.\n    mode: Resizing mode.\n        none: No resizing. Return the image unchanged.\n        square: Resize and pad with zeros to get a square image\n            of size [max_dim, max_dim].\n        pad64: Pads width and height with zeros to make them multiples of 64.\n               If min_dim or min_scale are provided, it scales the image up\n               before padding. max_dim is ignored in this mode.\n               The multiple of 64 is needed to ensure smooth scaling of feature\n               maps up and down the 6 levels of the FPN pyramid (2**6=64).\n        crop: Picks random crops from the image. First, scales the image based\n              on min_dim and min_scale, then picks a random crop of\n              size min_dim x min_dim. Can be used in training only.\n              max_dim is not used in this mode.\n\n    Returns:\n    image: the resized image\n    window: (y1, x1, y2, x2). If max_dim is provided, padding might\n        be inserted in the returned image. If so, this window is the\n        coordinates of the image part of the full image (excluding\n        the padding). The x2, y2 pixels are not included.\n    scale: The scale factor used to resize the image\n    padding: Padding added to the image [(top, bottom), (left, right), (0, 0)]\n    \"\"\"\n    # Keep track of image dtype and return results in the same dtype\n    image_dtype = image.dtype\n    # Default window (y1, x1, y2, x2) and default scale == 1.\n    h, w = image.shape[:2]\n    window = (0, 0, h, w)\n    scale = 1\n    padding = [(0, 0), (0, 0), (0, 0)]\n    crop = None\n\n    if mode == \"none\":\n        return image, window, scale, padding, crop\n\n    # Scale?\n    if min_dim:\n        # Scale up but not down\n        scale = max(1, min_dim / min(h, w))\n    if min_scale and scale < min_scale:\n        scale = min_scale\n\n    # Does it exceed max dim?\n    if max_dim and mode == \"square\":\n        image_max = max(h, w)\n        if round(image_max * scale) > max_dim:\n            scale = max_dim / image_max\n\n    # Resize image using bilinear interpolation\n    if scale != 1:\n        image = resize(image, (round(h * scale), round(w * scale)),\n                       preserve_range=True)\n\n    # Need padding or cropping?\n    if mode == \"square\":\n        # Get new height and width\n        h, w = image.shape[:2]\n        top_pad = (max_dim - h) // 2\n        bottom_pad = max_dim - h - top_pad\n        left_pad = (max_dim - w) // 2\n        right_pad = max_dim - w - left_pad\n        padding = [(top_pad, bottom_pad), (left_pad, right_pad), (0, 0)]\n        image = np.pad(image, padding, mode='constant', constant_values=0)\n        window = (top_pad, left_pad, h + top_pad, w + left_pad)\n    elif mode == \"pad64\":\n        h, w = image.shape[:2]\n        # Both sides must be divisible by 64\n        assert min_dim % 64 == 0, \"Minimum dimension must be a multiple of 64\"\n        # Height\n        if h % 64 > 0:\n            max_h = h - (h % 64) + 64\n            top_pad = (max_h - h) // 2\n            bottom_pad = max_h - h - top_pad\n        else:\n            top_pad = bottom_pad = 0\n        # Width\n        if w % 64 > 0:\n            max_w = w - (w % 64) + 64\n            left_pad = (max_w - w) // 2\n            right_pad = max_w - w - left_pad\n        else:\n            left_pad = right_pad = 0\n        padding = [(top_pad, bottom_pad), (left_pad, right_pad), (0, 0)]\n        image = np.pad(image, padding, mode='constant', constant_values=0)\n        window = (top_pad, left_pad, h + top_pad, w + left_pad)\n    elif mode == \"crop\":\n        # Pick a random crop\n        h, w = image.shape[:2]\n        y = random.randint(0, (h - min_dim))\n        x = random.randint(0, (w - min_dim))\n        crop = (y, x, min_dim, min_dim)\n        image = image[y:y + min_dim, x:x + min_dim]\n        window = (0, 0, min_dim, min_dim)\n    else:\n        raise Exception(\"Mode {} not supported\".format(mode))\n    return image.astype(image_dtype), window, scale, padding, crop\n\n\ndef resize_mask(mask, scale, padding, crop=None):\n    \"\"\"Resizes a mask using the given scale and padding.\n    Typically, you get the scale and padding from resize_image() to\n    ensure both, the image and the mask, are resized consistently.\n\n    scale: mask scaling factor\n    padding: Padding to add to the mask in the form\n            [(top, bottom), (left, right), (0, 0)]\n    \"\"\"\n    # Suppress warning from scipy 0.13.0, the output shape of zoom() is\n    # calculated with round() instead of int()\n    with warnings.catch_warnings():\n        warnings.simplefilter(\"ignore\")\n        mask = scipy.ndimage.zoom(mask, zoom=[scale, scale, 1], order=0)\n    if crop is not None:\n        y, x, h, w = crop\n        mask = mask[y:y + h, x:x + w]\n    else:\n        mask = np.pad(mask, padding, mode='constant', constant_values=0)\n    return mask\n\n\ndef minimize_mask(bbox, mask, mini_shape):\n    \"\"\"Resize masks to a smaller version to reduce memory load.\n    Mini-masks can be resized back to image scale using expand_masks()\n\n    See inspect_data.ipynb notebook for more details.\n    \"\"\"\n    mini_mask = np.zeros(mini_shape + (mask.shape[-1],), dtype=bool)\n    for i in range(mask.shape[-1]):\n        # Pick slice and cast to bool in case load_mask() returned wrong dtype\n        m = mask[:, :, i].astype(bool)\n        y1, x1, y2, x2 = bbox[i][:4]\n        m = m[y1:y2, x1:x2]\n        if m.size == 0:\n            raise Exception(\"Invalid bounding box with area of zero\")\n        # Resize with bilinear interpolation\n        m = resize(m, mini_shape)\n        mini_mask[:, :, i] = np.around(m).astype(np.bool)\n    return mini_mask\n\n\ndef expand_mask(bbox, mini_mask, image_shape):\n    \"\"\"Resizes mini masks back to image size. Reverses the change\n    of minimize_mask().\n\n    See inspect_data.ipynb notebook for more details.\n    \"\"\"\n    mask = np.zeros(image_shape[:2] + (mini_mask.shape[-1],), dtype=bool)\n    for i in range(mask.shape[-1]):\n        m = mini_mask[:, :, i]\n        y1, x1, y2, x2 = bbox[i][:4]\n        h = y2 - y1\n        w = x2 - x1\n        # Resize with bilinear interpolation\n        m = resize(m, (h, w))\n        mask[y1:y2, x1:x2, i] = np.around(m).astype(np.bool)\n    return mask\n\n\n# TODO: Build and use this function to reduce code duplication\ndef mold_mask(mask, config):\n    pass\n\n\ndef unmold_mask(mask, bbox, image_shape):\n    \"\"\"Converts a mask generated by the neural network to a format similar\n    to its original shape.\n    mask: [height, width] of type float. A small, typically 28x28 mask.\n    bbox: [y1, x1, y2, x2]. The box to fit the mask in.\n\n    Returns a binary mask with the same size as the original image.\n    \"\"\"\n    threshold = 0.5\n    y1, x1, y2, x2 = bbox\n    mask = resize(mask, (y2 - y1, x2 - x1))\n    mask = np.where(mask >= threshold, 1, 0).astype(np.bool)\n\n    # Put the mask in the right location.\n    full_mask = np.zeros(image_shape[:2], dtype=np.bool)\n    full_mask[y1:y2, x1:x2] = mask\n    return full_mask\n\n\n############################################################\n#  Anchors\n############################################################\n\ndef generate_anchors(scales, ratios, shape, feature_stride, anchor_stride):\n    \"\"\"\n    scales: 1D array of anchor sizes in pixels. Example: [32, 64, 128]\n    ratios: 1D array of anchor ratios of width/height. Example: [0.5, 1, 2]\n    shape: [height, width] spatial shape of the feature map over which\n            to generate anchors.\n    feature_stride: Stride of the feature map relative to the image in pixels.\n    anchor_stride: Stride of anchors on the feature map. For example, if the\n        value is 2 then generate anchors for every other feature map pixel.\n    \"\"\"\n    # Get all combinations of scales and ratios\n    scales, ratios = np.meshgrid(np.array(scales), np.array(ratios))\n    scales = scales.flatten()\n    ratios = ratios.flatten()\n\n    # Enumerate heights and widths from scales and ratios\n    heights = scales / np.sqrt(ratios)\n    widths = scales * np.sqrt(ratios)\n\n    # Enumerate shifts in feature space\n    shifts_y = np.arange(0, shape[0], anchor_stride) * feature_stride\n    shifts_x = np.arange(0, shape[1], anchor_stride) * feature_stride\n    shifts_x, shifts_y = np.meshgrid(shifts_x, shifts_y)\n\n    # Enumerate combinations of shifts, widths, and heights\n    box_widths, box_centers_x = np.meshgrid(widths, shifts_x)\n    box_heights, box_centers_y = np.meshgrid(heights, shifts_y)\n\n    # Reshape to get a list of (y, x) and a list of (h, w)\n    box_centers = np.stack(\n        [box_centers_y, box_centers_x], axis=2).reshape([-1, 2])\n    box_sizes = np.stack([box_heights, box_widths], axis=2).reshape([-1, 2])\n\n    # Convert to corner coordinates (y1, x1, y2, x2)\n    boxes = np.concatenate([box_centers - 0.5 * box_sizes,\n                            box_centers + 0.5 * box_sizes], axis=1)\n    return boxes\n\n\ndef generate_pyramid_anchors(scales, ratios, feature_shapes, feature_strides,\n                             anchor_stride):\n    \"\"\"Generate anchors at different levels of a feature pyramid. Each scale\n    is associated with a level of the pyramid, but each ratio is used in\n    all levels of the pyramid.\n\n    Returns:\n    anchors: [N, (y1, x1, y2, x2)]. All generated anchors in one array. Sorted\n        with the same order of the given scales. So, anchors of scale[0] come\n        first, then anchors of scale[1], and so on.\n    \"\"\"\n    # Anchors\n    # [anchor_count, (y1, x1, y2, x2)]\n    anchors = []\n    for i in range(len(scales)):\n        anchors.append(generate_anchors(scales[i], ratios, feature_shapes[i],\n                                        feature_strides[i], anchor_stride))\n    return np.concatenate(anchors, axis=0)\n\n\n############################################################\n#  Miscellaneous\n############################################################\n\ndef trim_zeros(x):\n    \"\"\"It's common to have tensors larger than the available data and\n    pad with zeros. This function removes rows that are all zeros.\n\n    x: [rows, columns].\n    \"\"\"\n    assert len(x.shape) == 2\n    return x[~np.all(x == 0, axis=1)]\n\n\ndef compute_matches(gt_boxes, gt_class_ids, gt_masks,\n                    pred_boxes, pred_class_ids, pred_scores, pred_masks,\n                    iou_threshold=0.5, score_threshold=0.0):\n    \"\"\"Finds matches between prediction and ground truth instances.\n\n    Returns:\n        gt_match: 1-D array. For each GT box it has the index of the matched\n                  predicted box.\n        pred_match: 1-D array. For each predicted box, it has the index of\n                    the matched ground truth box.\n        overlaps: [pred_boxes, gt_boxes] IoU overlaps.\n    \"\"\"\n    # Trim zero padding\n    # TODO: cleaner to do zero unpadding upstream\n    gt_boxes = trim_zeros(gt_boxes)\n    gt_masks = gt_masks[..., :gt_boxes.shape[0]]\n    pred_boxes = trim_zeros(pred_boxes)\n    pred_scores = pred_scores[:pred_boxes.shape[0]]\n    # Sort predictions by score from high to low\n    indices = np.argsort(pred_scores)[::-1]\n    pred_boxes = pred_boxes[indices]\n    pred_class_ids = pred_class_ids[indices]\n    pred_scores = pred_scores[indices]\n    pred_masks = pred_masks[..., indices]\n\n    # Compute IoU overlaps [pred_masks, gt_masks]\n    overlaps = compute_overlaps_masks(pred_masks, gt_masks)\n\n    # Loop through predictions and find matching ground truth boxes\n    match_count = 0\n    pred_match = -1 * np.ones([pred_boxes.shape[0]])\n    gt_match = -1 * np.ones([gt_boxes.shape[0]])\n    for i in range(len(pred_boxes)):\n        # Find best matching ground truth box\n        # 1. Sort matches by score\n        sorted_ixs = np.argsort(overlaps[i])[::-1]\n        # 2. Remove low scores\n        low_score_idx = np.where(overlaps[i, sorted_ixs] < score_threshold)[0]\n        if low_score_idx.size > 0:\n            sorted_ixs = sorted_ixs[:low_score_idx[0]]\n        # 3. Find the match\n        for j in sorted_ixs:\n            # If ground truth box is already matched, go to next one\n            if gt_match[j] > 0:\n                continue\n            # If we reach IoU smaller than the threshold, end the loop\n            iou = overlaps[i, j]\n            if iou < iou_threshold:\n                break\n            # Do we have a match?\n            if pred_class_ids[i] == gt_class_ids[j]:\n                match_count += 1\n                gt_match[j] = i\n                pred_match[i] = j\n                break\n\n    return gt_match, pred_match, overlaps\n\n\ndef compute_ap(gt_boxes, gt_class_ids, gt_masks,\n               pred_boxes, pred_class_ids, pred_scores, pred_masks,\n               iou_threshold=0.5):\n    \"\"\"Compute Average Precision at a set IoU threshold (default 0.5).\n\n    Returns:\n    mAP: Mean Average Precision\n    precisions: List of precisions at different class score thresholds.\n    recalls: List of recall values at different class score thresholds.\n    overlaps: [pred_boxes, gt_boxes] IoU overlaps.\n    \"\"\"\n    # Get matches and overlaps\n    gt_match, pred_match, overlaps = compute_matches(\n        gt_boxes, gt_class_ids, gt_masks,\n        pred_boxes, pred_class_ids, pred_scores, pred_masks,\n        iou_threshold)\n\n    # Compute precision and recall at each prediction box step\n    precisions = np.cumsum(pred_match > -1) / (np.arange(len(pred_match)) + 1)\n    recalls = np.cumsum(pred_match > -1).astype(np.float32) / len(gt_match)\n\n    # Pad with start and end values to simplify the math\n    precisions = np.concatenate([[0], precisions, [0]])\n    recalls = np.concatenate([[0], recalls, [1]])\n\n    # Ensure precision values decrease but don't increase. This way, the\n    # precision value at each recall threshold is the maximum it can be\n    # for all following recall thresholds, as specified by the VOC paper.\n    for i in range(len(precisions) - 2, -1, -1):\n        precisions[i] = np.maximum(precisions[i], precisions[i + 1])\n\n    # Compute mean AP over recall range\n    indices = np.where(recalls[:-1] != recalls[1:])[0] + 1\n    mAP = np.sum((recalls[indices] - recalls[indices - 1]) *\n                 precisions[indices])\n\n    return mAP, precisions, recalls, overlaps\n\n\ndef compute_ap_range(gt_box, gt_class_id, gt_mask,\n                     pred_box, pred_class_id, pred_score, pred_mask,\n                     iou_thresholds=None, verbose=1):\n    \"\"\"Compute AP over a range or IoU thresholds. Default range is 0.5-0.95.\"\"\"\n    # Default is 0.5 to 0.95 with increments of 0.05\n    iou_thresholds = iou_thresholds or np.arange(0.5, 1.0, 0.05)\n    \n    # Compute AP over range of IoU thresholds\n    AP = []\n    for iou_threshold in iou_thresholds:\n        ap, precisions, recalls, overlaps =\\\n            compute_ap(gt_box, gt_class_id, gt_mask,\n                        pred_box, pred_class_id, pred_score, pred_mask,\n                        iou_threshold=iou_threshold)\n        if verbose:\n            print(\"AP @{:.2f}:\\t {:.3f}\".format(iou_threshold, ap))\n        AP.append(ap)\n    AP = np.array(AP).mean()\n    if verbose:\n        print(\"AP @{:.2f}-{:.2f}:\\t {:.3f}\".format(\n            iou_thresholds[0], iou_thresholds[-1], AP))\n    return AP\n\n\ndef compute_recall(pred_boxes, gt_boxes, iou):\n    \"\"\"Compute the recall at the given IoU threshold. It's an indication\n    of how many GT boxes were found by the given prediction boxes.\n\n    pred_boxes: [N, (y1, x1, y2, x2)] in image coordinates\n    gt_boxes: [N, (y1, x1, y2, x2)] in image coordinates\n    \"\"\"\n    # Measure overlaps\n    overlaps = compute_overlaps(pred_boxes, gt_boxes)\n    iou_max = np.max(overlaps, axis=1)\n    iou_argmax = np.argmax(overlaps, axis=1)\n    positive_ids = np.where(iou_max >= iou)[0]\n    matched_gt_boxes = iou_argmax[positive_ids]\n\n    recall = len(set(matched_gt_boxes)) / gt_boxes.shape[0]\n    return recall, positive_ids\n\n\n# ## Batch Slicing\n# Some custom layers support a batch size of 1 only, and require a lot of work\n# to support batches greater than 1. This function slices an input tensor\n# across the batch dimension and feeds batches of size 1. Effectively,\n# an easy way to support batches > 1 quickly with little code modification.\n# In the long run, it's more efficient to modify the code to support large\n# batches and getting rid of this function. Consider this a temporary solution\ndef batch_slice(inputs, graph_fn, batch_size, names=None):\n    \"\"\"Splits inputs into slices and feeds each slice to a copy of the given\n    computation graph and then combines the results. It allows you to run a\n    graph on a batch of inputs even if the graph is written to support one\n    instance only.\n\n    inputs: list of tensors. All must have the same first dimension length\n    graph_fn: A function that returns a TF tensor that's part of a graph.\n    batch_size: number of slices to divide the data into.\n    names: If provided, assigns names to the resulting tensors.\n    \"\"\"\n    if not isinstance(inputs, list):\n        inputs = [inputs]\n\n    outputs = []\n    for i in range(batch_size):\n        inputs_slice = [x[i] for x in inputs]\n        output_slice = graph_fn(*inputs_slice)\n        if not isinstance(output_slice, (tuple, list)):\n            output_slice = [output_slice]\n        outputs.append(output_slice)\n    # Change outputs from a list of slices where each is\n    # a list of outputs to a list of outputs and each has\n    # a list of slices\n    outputs = list(zip(*outputs))\n\n    if names is None:\n        names = [None] * len(outputs)\n\n    result = [tf.stack(o, axis=0, name=n)\n              for o, n in zip(outputs, names)]\n    if len(result) == 1:\n        result = result[0]\n\n    return result\n\n\ndef download_trained_weights(coco_model_path, verbose=1):\n    \"\"\"Download COCO trained weights from Releases.\n\n    coco_model_path: local path of COCO trained weights\n    \"\"\"\n    if verbose > 0:\n        print(\"Downloading pretrained model to \" + coco_model_path + \" ...\")\n    with urllib.request.urlopen(COCO_MODEL_URL) as resp, open(coco_model_path, 'wb') as out:\n        shutil.copyfileobj(resp, out)\n    if verbose > 0:\n        print(\"... done downloading pretrained model!\")\n\n\ndef norm_boxes(boxes, shape):\n    \"\"\"Converts boxes from pixel coordinates to normalized coordinates.\n    boxes: [N, (y1, x1, y2, x2)] in pixel coordinates\n    shape: [..., (height, width)] in pixels\n\n    Note: In pixel coordinates (y2, x2) is outside the box. But in normalized\n    coordinates it's inside the box.\n\n    Returns:\n        [N, (y1, x1, y2, x2)] in normalized coordinates\n    \"\"\"\n    h, w = shape\n    scale = np.array([h - 1, w - 1, h - 1, w - 1])\n    shift = np.array([0, 0, 1, 1])\n    return np.divide((boxes - shift), scale).astype(np.float32)\n\n\ndef denorm_boxes(boxes, shape):\n    \"\"\"Converts boxes from normalized coordinates to pixel coordinates.\n    boxes: [N, (y1, x1, y2, x2)] in normalized coordinates\n    shape: [..., (height, width)] in pixels\n\n    Note: In pixel coordinates (y2, x2) is outside the box. But in normalized\n    coordinates it's inside the box.\n\n    Returns:\n        [N, (y1, x1, y2, x2)] in pixel coordinates\n    \"\"\"\n    h, w = shape\n    scale = np.array([h - 1, w - 1, h - 1, w - 1])\n    shift = np.array([0, 0, 1, 1])\n    return np.around(np.multiply(boxes, scale) + shift).astype(np.int32)\n\n\ndef resize(image, output_shape, order=1, mode='constant', cval=0, clip=True,\n           preserve_range=False, anti_aliasing=False, anti_aliasing_sigma=None):\n    \"\"\"A wrapper for Scikit-Image resize().\n\n    Scikit-Image generates warnings on every call to resize() if it doesn't\n    receive the right parameters. The right parameters depend on the version\n    of skimage. This solves the problem by using different parameters per\n    version. And it provides a central place to control resizing defaults.\n    \"\"\"\n    if LooseVersion(skimage.__version__) >= LooseVersion(\"0.14\"):\n        # New in 0.14: anti_aliasing. Default it to False for backward\n        # compatibility with skimage 0.13.\n        return skimage.transform.resize(\n            image, output_shape,\n            order=order, mode=mode, cval=cval, clip=clip,\n            preserve_range=preserve_range, anti_aliasing=anti_aliasing,\n            anti_aliasing_sigma=anti_aliasing_sigma)\n    else:\n        return skimage.transform.resize(\n            image, output_shape,\n            order=order, mode=mode, cval=cval, clip=clip,\n            preserve_range=preserve_range)\n"
  },
  {
    "path": "Mask_RCNN/mrcnn/visualize.py",
    "content": "\"\"\"\nMask R-CNN\nDisplay and Visualization Functions.\n\nCopyright (c) 2017 Matterport, Inc.\nLicensed under the MIT License (see LICENSE for details)\nWritten by Waleed Abdulla\n\"\"\"\n\nimport os\nimport sys\nimport random\nimport itertools\nimport colorsys\n\nimport numpy as np\nfrom skimage.measure import find_contours\nimport matplotlib.pyplot as plt\nfrom matplotlib import patches,  lines\nfrom matplotlib.patches import Polygon\nimport IPython.display\n\n# Root directory of the project\nROOT_DIR = os.path.abspath(\"../\")\n\n# Import Mask RCNN\nsys.path.append(ROOT_DIR)  # To find local version of the library\nfrom mrcnn import utils\n\n\n############################################################\n#  Visualization\n############################################################\n\ndef display_images(images, titles=None, cols=4, cmap=None, norm=None,\n                   interpolation=None):\n    \"\"\"Display the given set of images, optionally with titles.\n    images: list or array of image tensors in HWC format.\n    titles: optional. A list of titles to display with each image.\n    cols: number of images per row\n    cmap: Optional. Color map to use. For example, \"Blues\".\n    norm: Optional. A Normalize instance to map values to colors.\n    interpolation: Optional. Image interpolation to use for display.\n    \"\"\"\n    titles = titles if titles is not None else [\"\"] * len(images)\n    rows = len(images) // cols + 1\n    plt.figure(figsize=(14, 14 * rows // cols))\n    i = 1\n    for image, title in zip(images, titles):\n        plt.subplot(rows, cols, i)\n        plt.title(title, fontsize=9)\n        plt.axis('off')\n        plt.imshow(image.astype(np.uint8), cmap=cmap,\n                   norm=norm, interpolation=interpolation)\n        i += 1\n    plt.show()\n\n\ndef random_colors(N, bright=True):\n    \"\"\"\n    Generate random colors.\n    To get visually distinct colors, generate them in HSV space then\n    convert to RGB.\n    \"\"\"\n    brightness = 1.0 if bright else 0.7\n    hsv = [(i / N, 1, brightness) for i in range(N)]\n    colors = list(map(lambda c: colorsys.hsv_to_rgb(*c), hsv))\n    random.shuffle(colors)\n    return colors\n\n\ndef apply_mask(image, mask, color, alpha=0.5):\n    \"\"\"Apply the given mask to the image.\n    \"\"\"\n    for c in range(3):\n        image[:, :, c] = np.where(mask == 1,\n                                  image[:, :, c] *\n                                  (1 - alpha) + alpha * color[c] * 255,\n                                  image[:, :, c])\n    return image\n\n\ndef display_instances(image, boxes, masks, class_ids, class_names,\n                      scores=None, title=\"\",\n                      figsize=(16, 16), ax=None,\n                      show_mask=True, show_bbox=True,\n                      colors=None, captions=None):\n    \"\"\"\n    boxes: [num_instance, (y1, x1, y2, x2, class_id)] in image coordinates.\n    masks: [height, width, num_instances]\n    class_ids: [num_instances]\n    class_names: list of class names of the dataset\n    scores: (optional) confidence scores for each box\n    title: (optional) Figure title\n    show_mask, show_bbox: To show masks and bounding boxes or not\n    figsize: (optional) the size of the image\n    colors: (optional) An array or colors to use with each object\n    captions: (optional) A list of strings to use as captions for each object\n    \"\"\"\n    # Number of instances\n    N = boxes.shape[0]\n    if not N:\n        print(\"\\n*** No instances to display *** \\n\")\n    else:\n        assert boxes.shape[0] == masks.shape[-1] == class_ids.shape[0]\n\n    # If no axis is passed, create one and automatically call show()\n    auto_show = False\n    if not ax:\n        _, ax = plt.subplots(1, figsize=figsize)\n        auto_show = True\n\n    # Generate random colors\n    colors = colors or random_colors(N)\n\n    # Show area outside image boundaries.\n    height, width = image.shape[:2]\n    ax.set_ylim(height + 10, -10)\n    ax.set_xlim(-10, width + 10)\n    ax.axis('off')\n    ax.set_title(title)\n\n    masked_image = image.astype(np.uint32).copy()\n    for i in range(N):\n        color = colors[i]\n\n        # Bounding box\n        if not np.any(boxes[i]):\n            # Skip this instance. Has no bbox. Likely lost in image cropping.\n            continue\n        y1, x1, y2, x2 = boxes[i]\n        if show_bbox:\n            p = patches.Rectangle((x1, y1), x2 - x1, y2 - y1, linewidth=2,\n                                alpha=0.7, linestyle=\"dashed\",\n                                edgecolor=color, facecolor='none')\n            ax.add_patch(p)\n\n        # Label\n        if not captions:\n            class_id = class_ids[i]\n            score = scores[i] if scores is not None else None\n            label = class_names[class_id]\n            x = random.randint(x1, (x1 + x2) // 2)\n            caption = \"{} {:.3f}\".format(label, score) if score else label\n        else:\n            caption = captions[i]\n        ax.text(x1, y1 + 8, caption,\n                color='w', size=11, backgroundcolor=\"none\")\n\n        # Mask\n        mask = masks[:, :, i]\n        if show_mask:\n            masked_image = apply_mask(masked_image, mask, color)\n\n        # Mask Polygon\n        # Pad to ensure proper polygons for masks that touch image edges.\n        padded_mask = np.zeros(\n            (mask.shape[0] + 2, mask.shape[1] + 2), dtype=np.uint8)\n        padded_mask[1:-1, 1:-1] = mask\n        contours = find_contours(padded_mask, 0.5)\n        for verts in contours:\n            # Subtract the padding and flip (y, x) to (x, y)\n            verts = np.fliplr(verts) - 1\n            p = Polygon(verts, facecolor=\"none\", edgecolor=color)\n            ax.add_patch(p)\n    ax.imshow(masked_image.astype(np.uint8))\n    if auto_show:\n        plt.show()\n\n\ndef display_differences(image,\n                        gt_box, gt_class_id, gt_mask,\n                        pred_box, pred_class_id, pred_score, pred_mask,\n                        class_names, title=\"\", ax=None,\n                        show_mask=True, show_box=True,\n                        iou_threshold=0.5, score_threshold=0.5):\n    \"\"\"Display ground truth and prediction instances on the same image.\"\"\"\n    # Match predictions to ground truth\n    gt_match, pred_match, overlaps = utils.compute_matches(\n        gt_box, gt_class_id, gt_mask,\n        pred_box, pred_class_id, pred_score, pred_mask,\n        iou_threshold=iou_threshold, score_threshold=score_threshold)\n    # Ground truth = green. Predictions = red\n    colors = [(0, 1, 0, .8)] * len(gt_match)\\\n           + [(1, 0, 0, 1)] * len(pred_match)\n    # Concatenate GT and predictions\n    class_ids = np.concatenate([gt_class_id, pred_class_id])\n    scores = np.concatenate([np.zeros([len(gt_match)]), pred_score])\n    boxes = np.concatenate([gt_box, pred_box])\n    masks = np.concatenate([gt_mask, pred_mask], axis=-1)\n    # Captions per instance show score/IoU\n    captions = [\"\" for m in gt_match] + [\"{:.2f} / {:.2f}\".format(\n        pred_score[i],\n        (overlaps[i, int(pred_match[i])]\n            if pred_match[i] > -1 else overlaps[i].max()))\n            for i in range(len(pred_match))]\n    # Set title if not provided\n    title = title or \"Ground Truth and Detections\\n GT=green, pred=red, captions: score/IoU\"\n    # Display\n    display_instances(\n        image,\n        boxes, masks, class_ids,\n        class_names, scores, ax=ax,\n        show_bbox=show_box, show_mask=show_mask,\n        colors=colors, captions=captions,\n        title=title)\n\n\ndef draw_rois(image, rois, refined_rois, mask, class_ids, class_names, limit=10):\n    \"\"\"\n    anchors: [n, (y1, x1, y2, x2)] list of anchors in image coordinates.\n    proposals: [n, 4] the same anchors but refined to fit objects better.\n    \"\"\"\n    masked_image = image.copy()\n\n    # Pick random anchors in case there are too many.\n    ids = np.arange(rois.shape[0], dtype=np.int32)\n    ids = np.random.choice(\n        ids, limit, replace=False) if ids.shape[0] > limit else ids\n\n    fig, ax = plt.subplots(1, figsize=(12, 12))\n    if rois.shape[0] > limit:\n        plt.title(\"Showing {} random ROIs out of {}\".format(\n            len(ids), rois.shape[0]))\n    else:\n        plt.title(\"{} ROIs\".format(len(ids)))\n\n    # Show area outside image boundaries.\n    ax.set_ylim(image.shape[0] + 20, -20)\n    ax.set_xlim(-50, image.shape[1] + 20)\n    ax.axis('off')\n\n    for i, id in enumerate(ids):\n        color = np.random.rand(3)\n        class_id = class_ids[id]\n        # ROI\n        y1, x1, y2, x2 = rois[id]\n        p = patches.Rectangle((x1, y1), x2 - x1, y2 - y1, linewidth=2,\n                              edgecolor=color if class_id else \"gray\",\n                              facecolor='none', linestyle=\"dashed\")\n        ax.add_patch(p)\n        # Refined ROI\n        if class_id:\n            ry1, rx1, ry2, rx2 = refined_rois[id]\n            p = patches.Rectangle((rx1, ry1), rx2 - rx1, ry2 - ry1, linewidth=2,\n                                  edgecolor=color, facecolor='none')\n            ax.add_patch(p)\n            # Connect the top-left corners of the anchor and proposal for easy visualization\n            ax.add_line(lines.Line2D([x1, rx1], [y1, ry1], color=color))\n\n            # Label\n            label = class_names[class_id]\n            ax.text(rx1, ry1 + 8, \"{}\".format(label),\n                    color='w', size=11, backgroundcolor=\"none\")\n\n            # Mask\n            m = utils.unmold_mask(mask[id], rois[id]\n                                  [:4].astype(np.int32), image.shape)\n            masked_image = apply_mask(masked_image, m, color)\n\n    ax.imshow(masked_image)\n\n    # Print stats\n    print(\"Positive ROIs: \", class_ids[class_ids > 0].shape[0])\n    print(\"Negative ROIs: \", class_ids[class_ids == 0].shape[0])\n    print(\"Positive Ratio: {:.2f}\".format(\n        class_ids[class_ids > 0].shape[0] / class_ids.shape[0]))\n\n\n# TODO: Replace with matplotlib equivalent?\ndef draw_box(image, box, color):\n    \"\"\"Draw 3-pixel width bounding boxes on the given image array.\n    color: list of 3 int values for RGB.\n    \"\"\"\n    y1, x1, y2, x2 = box\n    image[y1:y1 + 2, x1:x2] = color\n    image[y2:y2 + 2, x1:x2] = color\n    image[y1:y2, x1:x1 + 2] = color\n    image[y1:y2, x2:x2 + 2] = color\n    return image\n\n\ndef display_top_masks(image, mask, class_ids, class_names, limit=4):\n    \"\"\"Display the given image and the top few class masks.\"\"\"\n    to_display = []\n    titles = []\n    to_display.append(image)\n    titles.append(\"H x W={}x{}\".format(image.shape[0], image.shape[1]))\n    # Pick top prominent classes in this image\n    unique_class_ids = np.unique(class_ids)\n    mask_area = [np.sum(mask[:, :, np.where(class_ids == i)[0]])\n                 for i in unique_class_ids]\n    top_ids = [v[0] for v in sorted(zip(unique_class_ids, mask_area),\n                                    key=lambda r: r[1], reverse=True) if v[1] > 0]\n    # Generate images and titles\n    for i in range(limit):\n        class_id = top_ids[i] if i < len(top_ids) else -1\n        # Pull masks of instances belonging to the same class.\n        m = mask[:, :, np.where(class_ids == class_id)[0]]\n        m = np.sum(m * np.arange(1, m.shape[-1] + 1), -1)\n        to_display.append(m)\n        titles.append(class_names[class_id] if class_id != -1 else \"-\")\n    display_images(to_display, titles=titles, cols=limit + 1, cmap=\"Blues_r\")\n\n\ndef plot_precision_recall(AP, precisions, recalls):\n    \"\"\"Draw the precision-recall curve.\n\n    AP: Average precision at IoU >= 0.5\n    precisions: list of precision values\n    recalls: list of recall values\n    \"\"\"\n    # Plot the Precision-Recall curve\n    _, ax = plt.subplots(1)\n    ax.set_title(\"Precision-Recall Curve. AP@50 = {:.3f}\".format(AP))\n    ax.set_ylim(0, 1.1)\n    ax.set_xlim(0, 1.1)\n    _ = ax.plot(recalls, precisions)\n\n\ndef plot_overlaps(gt_class_ids, pred_class_ids, pred_scores,\n                  overlaps, class_names, threshold=0.5):\n    \"\"\"Draw a grid showing how ground truth objects are classified.\n    gt_class_ids: [N] int. Ground truth class IDs\n    pred_class_id: [N] int. Predicted class IDs\n    pred_scores: [N] float. The probability scores of predicted classes\n    overlaps: [pred_boxes, gt_boxes] IoU overlaps of predictions and GT boxes.\n    class_names: list of all class names in the dataset\n    threshold: Float. The prediction probability required to predict a class\n    \"\"\"\n    gt_class_ids = gt_class_ids[gt_class_ids != 0]\n    pred_class_ids = pred_class_ids[pred_class_ids != 0]\n\n    plt.figure(figsize=(12, 10))\n    plt.imshow(overlaps, interpolation='nearest', cmap=plt.cm.Blues)\n    plt.yticks(np.arange(len(pred_class_ids)),\n               [\"{} ({:.2f})\".format(class_names[int(id)], pred_scores[i])\n                for i, id in enumerate(pred_class_ids)])\n    plt.xticks(np.arange(len(gt_class_ids)),\n               [class_names[int(id)] for id in gt_class_ids], rotation=90)\n\n    thresh = overlaps.max() / 2.\n    for i, j in itertools.product(range(overlaps.shape[0]),\n                                  range(overlaps.shape[1])):\n        text = \"\"\n        if overlaps[i, j] > threshold:\n            text = \"match\" if gt_class_ids[j] == pred_class_ids[i] else \"wrong\"\n        color = (\"white\" if overlaps[i, j] > thresh\n                 else \"black\" if overlaps[i, j] > 0\n                 else \"grey\")\n        plt.text(j, i, \"{:.3f}\\n{}\".format(overlaps[i, j], text),\n                 horizontalalignment=\"center\", verticalalignment=\"center\",\n                 fontsize=9, color=color)\n\n    plt.tight_layout()\n    plt.xlabel(\"Ground Truth\")\n    plt.ylabel(\"Predictions\")\n\n\ndef draw_boxes(image, boxes=None, refined_boxes=None,\n               masks=None, captions=None, visibilities=None,\n               title=\"\", ax=None):\n    \"\"\"Draw bounding boxes and segmentation masks with different\n    customizations.\n\n    boxes: [N, (y1, x1, y2, x2, class_id)] in image coordinates.\n    refined_boxes: Like boxes, but draw with solid lines to show\n        that they're the result of refining 'boxes'.\n    masks: [N, height, width]\n    captions: List of N titles to display on each box\n    visibilities: (optional) List of values of 0, 1, or 2. Determine how\n        prominent each bounding box should be.\n    title: An optional title to show over the image\n    ax: (optional) Matplotlib axis to draw on.\n    \"\"\"\n    # Number of boxes\n    assert boxes is not None or refined_boxes is not None\n    N = boxes.shape[0] if boxes is not None else refined_boxes.shape[0]\n\n    # Matplotlib Axis\n    if not ax:\n        _, ax = plt.subplots(1, figsize=(12, 12))\n\n    # Generate random colors\n    colors = random_colors(N)\n\n    # Show area outside image boundaries.\n    margin = image.shape[0] // 10\n    ax.set_ylim(image.shape[0] + margin, -margin)\n    ax.set_xlim(-margin, image.shape[1] + margin)\n    ax.axis('off')\n\n    ax.set_title(title)\n\n    masked_image = image.astype(np.uint32).copy()\n    for i in range(N):\n        # Box visibility\n        visibility = visibilities[i] if visibilities is not None else 1\n        if visibility == 0:\n            color = \"gray\"\n            style = \"dotted\"\n            alpha = 0.5\n        elif visibility == 1:\n            color = colors[i]\n            style = \"dotted\"\n            alpha = 1\n        elif visibility == 2:\n            color = colors[i]\n            style = \"solid\"\n            alpha = 1\n\n        # Boxes\n        if boxes is not None:\n            if not np.any(boxes[i]):\n                # Skip this instance. Has no bbox. Likely lost in cropping.\n                continue\n            y1, x1, y2, x2 = boxes[i]\n            p = patches.Rectangle((x1, y1), x2 - x1, y2 - y1, linewidth=2,\n                                  alpha=alpha, linestyle=style,\n                                  edgecolor=color, facecolor='none')\n            ax.add_patch(p)\n\n        # Refined boxes\n        if refined_boxes is not None and visibility > 0:\n            ry1, rx1, ry2, rx2 = refined_boxes[i].astype(np.int32)\n            p = patches.Rectangle((rx1, ry1), rx2 - rx1, ry2 - ry1, linewidth=2,\n                                  edgecolor=color, facecolor='none')\n            ax.add_patch(p)\n            # Connect the top-left corners of the anchor and proposal\n            if boxes is not None:\n                ax.add_line(lines.Line2D([x1, rx1], [y1, ry1], color=color))\n\n        # Captions\n        if captions is not None:\n            caption = captions[i]\n            # If there are refined boxes, display captions on them\n            if refined_boxes is not None:\n                y1, x1, y2, x2 = ry1, rx1, ry2, rx2\n            x = random.randint(x1, (x1 + x2) // 2)\n            ax.text(x1, y1, caption, size=11, verticalalignment='top',\n                    color='w', backgroundcolor=\"none\",\n                    bbox={'facecolor': color, 'alpha': 0.5,\n                          'pad': 2, 'edgecolor': 'none'})\n\n        # Masks\n        if masks is not None:\n            mask = masks[:, :, i]\n            masked_image = apply_mask(masked_image, mask, color)\n            # Mask Polygon\n            # Pad to ensure proper polygons for masks that touch image edges.\n            padded_mask = np.zeros(\n                (mask.shape[0] + 2, mask.shape[1] + 2), dtype=np.uint8)\n            padded_mask[1:-1, 1:-1] = mask\n            contours = find_contours(padded_mask, 0.5)\n            for verts in contours:\n                # Subtract the padding and flip (y, x) to (x, y)\n                verts = np.fliplr(verts) - 1\n                p = Polygon(verts, facecolor=\"none\", edgecolor=color)\n                ax.add_patch(p)\n    ax.imshow(masked_image.astype(np.uint8))\n\n\ndef display_table(table):\n    \"\"\"Display values in a table format.\n    table: an iterable of rows, and each row is an iterable of values.\n    \"\"\"\n    html = \"\"\n    for row in table:\n        row_html = \"\"\n        for col in row:\n            row_html += \"<td>{:40}</td>\".format(str(col))\n        html += \"<tr>\" + row_html + \"</tr>\"\n    html = \"<table>\" + html + \"</table>\"\n    IPython.display.display(IPython.display.HTML(html))\n\n\ndef display_weight_stats(model):\n    \"\"\"Scans all the weights in the model and returns a list of tuples\n    that contain stats about each weight.\n    \"\"\"\n    layers = model.get_trainable_layers()\n    table = [[\"WEIGHT NAME\", \"SHAPE\", \"MIN\", \"MAX\", \"STD\"]]\n    for l in layers:\n        weight_values = l.get_weights()  # list of Numpy arrays\n        weight_tensors = l.weights  # list of TF tensors\n        for i, w in enumerate(weight_values):\n            weight_name = weight_tensors[i].name\n            # Detect problematic layers. Exclude biases of conv layers.\n            alert = \"\"\n            if w.min() == w.max() and not (l.__class__.__name__ == \"Conv2D\" and i == 1):\n                alert += \"<span style='color:red'>*** dead?</span>\"\n            if np.abs(w.min()) > 1000 or np.abs(w.max()) > 1000:\n                alert += \"<span style='color:red'>*** Overflow?</span>\"\n            # Add row\n            table.append([\n                weight_name + alert,\n                str(w.shape),\n                \"{:+9.4f}\".format(w.min()),\n                \"{:+10.4f}\".format(w.max()),\n                \"{:+9.4f}\".format(w.std()),\n            ])\n    display_table(table)\n"
  },
  {
    "path": "Mask_RCNN/requirements.txt",
    "content": "numpy\nscipy\nPillow\ncython\nmatplotlib\nscikit-image\ntensorflow-gpu==1.11\nkeras>=2.0.8\nopencv-python\nh5py\nimgaug\nIPython[all]\n"
  },
  {
    "path": "Mask_RCNN/samples/warehouse/eval.py",
    "content": "\"\"\"\nMask R-CNN\nBased on the work of Waleed Abdulla (Matterport)\nModified by Dinh-Cuong Hoang\n------------------------------------------------------------\npython3 eval.py\nIt will read rgb and ground-truth images from /rgb and gt/ folders in .../Object-RPE/data\nthen save results in .../Object-RPE/data/mask\n\"\"\"\n\nimport os\nimport sys\nimport json\nimport datetime\nimport numpy as np\nimport skimage.draw\nimport glob\n\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\n\n# Root directory of the project\nROOT_DIR = os.path.abspath(\"../../\")\n\n# Import Mask RCNN\nsys.path.append(ROOT_DIR)  # To find local version of the library\nfrom mrcnn.config import Config\nfrom mrcnn import model as modellib, utils\n\n# Path to trained weights file\nCOCO_WEIGHTS_PATH = os.path.join(ROOT_DIR, \"mask_rcnn_coco.h5\")\nDEFAULT_LOGS_DIR = os.path.join(ROOT_DIR, \"logs\")\n\nclass WarehouseConfig(Config):\n    \"\"\"Configuration for training on the toy  dataset.\n    Derives from the base Config class and overrides some values.\n    \"\"\"\n    # Give the configuration a recognizable name\n    NAME = \"Warehouse\"\n\n    # We use a GPU with 12GB memory, which can fit two images.\n    # Adjust down if you use a smaller GPU.\n    IMAGES_PER_GPU = 1\n\n    # Number of classes (including background)\n    NUM_CLASSES = 1 + 13  # Background + objects\n\n    # Number of training steps per epoch\n    STEPS_PER_EPOCH = 400\n\n    # Skip detections with < 90% confidence\n    DETECTION_MIN_CONFIDENCE = 0.6\n\ndef color_map():\n    color_map_dic = {\n    0:  [0, 0, 0],\n    1:  [128, 128,   0],\n    2:  [  0, 128, 128],\n    3:  [128,   0, 128],\n    4:  [128,   0,   0], \n    5:  [  0, 128,   0],\n    6:  [  0,   0, 128],\n    7:  [255, 255,   0],\n    8:  [255,   0, 255],\n    9:  [  0, 255, 255],\n    10: [255,   0,   0],\n    11: [  0, 255,   0],\n    12: [  0,   0, 255],\n    13: [ 92,  112, 92],\n    14: [  0,   0,  70],\n    15: [  0,  60, 100],\n    16: [  0,  80, 100],\n    17: [  0,   0, 230],\n    18: [119,  11,  32],\n    19: [  0,   0, 121]\n    }\n    return color_map_dic\n\ndef get_masks(image, mask, class_ids):\n    gray = skimage.color.gray2rgb(skimage.color.rgb2gray(image)) * 255\n\n    instance_masks = np.zeros((image.shape[0], image.shape[1]), dtype=np.uint8)\n    semantic_masks = np.zeros((image.shape[0], image.shape[1]), dtype=np.uint8)\n    \n    if mask.shape[-1] > 0:\n        mask_zero = np.zeros((image.shape[0], image.shape[1]), dtype=np.uint8)\n\n        for i in range(mask.shape[-1]):\n            semantic_mask_one = np.ones((image.shape[0], image.shape[1]), dtype=np.uint8)            \n            semantic_mask_one = semantic_mask_one * class_ids[i]\n            semantic_masks = np.where(mask[:, :, i], semantic_mask_one, semantic_masks).astype(np.uint8)\n            instance_mask_one = np.ones((image.shape[0], image.shape[1]), dtype=np.uint8)            \n            instance_mask_one = instance_mask_one * (i+1)\n            instance_masks = np.where(mask[:, :, i], instance_mask_one, instance_masks).astype(np.uint8)           \n    \n    instance_to_color = color_map()\n    color_masks = np.zeros((image.shape[0], image.shape[1], 3), dtype=np.uint8)\n    for key in instance_to_color.keys():\n        color_masks[instance_masks == key] = instance_to_color[key]\n    \n    return semantic_masks, instance_masks, color_masks\n\ndef detect_and_get_masks(model):\n    data_dir = os.path.abspath(\"../../../\") + '/data/'\n    rgb_dir = data_dir + 'rgb/'\n    mask_dir = data_dir + 'mask/'\n    gt_dir = data_dir + 'gt/'\n    rgb_addrs = glob.glob(rgb_dir + '*.png')\n    global_accuracy = 0\n    accur_dir = data_dir + 'mask/accuracy.txt'\n    accur_file = open(accur_dir, 'w')\n    count = 0\n\n    for i in range(len(rgb_addrs)):\n        str_num = rgb_addrs[i][len(rgb_dir):len(rgb_dir)+6]\n        # Read image\n        image = skimage.io.imread(rgb_addrs[i])\n        # Detect objects\n        r = model.detect([image], verbose=1)[0]\n        # get instance_masks\n        semantic_masks, instance_masks, color_masks  = get_masks(image, r['masks'], r['class_ids'])\n        # save mask image\n        mask_addr = data_dir + 'mask/' + rgb_addrs[i][len(rgb_dir):]\n        skimage.io.imsave(mask_addr, color_masks)\n        # evaluation\n        gt_addr = gt_dir + str_num + '-label.png' \n        if os.path.isfile(gt_addr) == False: \n            continue;\n        gt = skimage.io.imread(gt_addr)\n        dif = semantic_masks - gt\n        accuracy = 1 - np.count_nonzero(dif) / (gt.shape[0]*gt.shape[1])\n        accur_file.write('%s %f\\n' % (str_num, accuracy))\n        global_accuracy = global_accuracy + accuracy\n        count +=1\n    if count:\n        accur_file.write('Mean accuracy: %f' % (global_accuracy / count))\n    accur_file.close()\n        \n    \nif __name__ == '__main__':\n\n    class InferenceConfig(WarehouseConfig):\n        GPU_COUNT = 1\n        IMAGES_PER_GPU = 1\n    config = InferenceConfig()\n    config.display()\n\n    weights_dir = os.path.abspath(\"../../../\") + '/data/trained_models/warehouse/mask_rcnn.h5'\n    model = modellib.MaskRCNN(mode=\"inference\", config=config, model_dir=weights_dir)\n    model.load_weights(weights_dir, by_name=True)\n    \n    detect_and_get_masks(model)"
  },
  {
    "path": "Mask_RCNN/samples/warehouse/iliad.py",
    "content": "\"\"\"\nMask R-CNN for Object_RPE\n------------------------------------------------------------\n\"\"\"\n\nimport os\nimport sys\nimport json\nimport datetime\nimport numpy as np\nimport skimage.draw\nimport glob\n\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\n\n# Root directory of the project\nROOT_DIR = os.path.abspath(\"../../\")\n\n# Import Mask RCNN\nsys.path.append(ROOT_DIR)  # To find local version of the library\nfrom mrcnn.config import Config\nfrom mrcnn import model as modellib, utils\n\n# Path to trained weights file\nDEFAULT_LOGS_DIR = os.path.join(ROOT_DIR, \"logs\")\n\nclass WarehouseConfig(Config):\n    \"\"\"Configuration for training on the toy  dataset.\n    Derives from the base Config class and overrides some values.\n    \"\"\"\n    # Give the configuration a recognizable name\n    NAME = \"Warehouse\"\n\n    # We use a GPU with 12GB memory, which can fit two images.\n    # Adjust down if you use a smaller GPU.\n    IMAGES_PER_GPU = 1\n\n    # Number of classes (including background)\n    NUM_CLASSES = 1 + 13  # Background + objects\n\n    # Number of training steps per epoch\n    STEPS_PER_EPOCH = 400\n\n    # Skip detections with < 90% confidence\n    DETECTION_MIN_CONFIDENCE = 0.7\n\ndef seq_get_masks(image, cur_detection):\n\n    cur_masks = cur_detection['masks']\n    cur_class_ids = cur_detection['class_ids']\n    cur_rois = cur_detection['rois']\n\n    instance_masks = np.zeros((image.shape[0], image.shape[1]), dtype=np.uint8)\n    semantic_masks = np.zeros((image.shape[0], image.shape[1]), dtype=np.uint8)\n\n    semantic_mask_one = np.ones((image.shape[0], image.shape[1]), dtype=np.uint8)\n    instance_mask_one = np.ones((image.shape[0], image.shape[1]), dtype=np.uint8)\n\n    print('cur_masks.shape: {}'.format(cur_masks.shape[-1]))\n\n    if cur_masks.shape[-1] > 0:\n        mask_zero = np.zeros((image.shape[0], image.shape[1]), dtype=np.uint8)\n\n        for i in range(cur_masks.shape[-1]):\n            semantic_mask = semantic_mask_one * cur_class_ids[i]\n            semantic_masks = np.where(cur_masks[:, :, i], semantic_mask, semantic_masks).astype(np.uint8)\n\n            instance_mask = instance_mask_one * (i+1)\n            instance_masks = np.where(cur_masks[:, :, i], instance_mask, instance_masks).astype(np.uint8)\n\n    return semantic_masks, instance_masks\n\ndef detect_and_get_masks(model, data_path, num_frames, num_keyframes):\n    incr = num_frames//num_keyframes\n    if incr < 1:\n        return;\n\n    for i in range(0, num_frames, incr):\n        num = 1000001 + i\n        str_num = str(num)[1:]\n        rgb_addr = \"rgb/\" + str_num + \"-color.png\"\n        rgb_addr = os.path.join(data_path, rgb_addr)\n        depth_addr = \"depth/\" + str_num + \"-depth.png\"\n        depth_addr = os.path.join(data_path, depth_addr)         \n\n        if os.path.isfile(rgb_addr) == False: \n            continue;\n        if os.path.isfile(depth_addr) == False: \n            continue;\n\n        # Read image\n        image = skimage.io.imread(rgb_addr)\n        depth = skimage.io.imread(depth_addr)\n        \n        # Detect objects\n        cur_detect = model.detect([image], verbose=1)[0]\n            \n        file_name = 'mask/' + str_num + '-class_ids.txt'\n        file_dir = os.path.join(data_path, file_name)\n        with open(file_dir, 'w') as the_file:\n            for j in range (cur_detect['class_ids'].shape[0]):\n                the_file.write(str(cur_detect['class_ids'][j]))\n                the_file.write('\\n')\n        \n        # get instance_masks\n        semantic_masks, instance_masks  = seq_get_masks(image, cur_detect)\n        \n        file_name = 'mask/' + str_num + '-mask.png'\n        mask_addr = os.path.join(data_path, file_name) \n        skimage.io.imsave(mask_addr, instance_masks)\n        \n        plt.subplot(2, 2, 1)\n        plt.title('rgb')\n        plt.imshow(image)\n        plt.subplot(2, 2, 2)\n        plt.title('depth')\n        plt.imshow(depth)\n        plt.subplot(2, 2, 3)\n        plt.title('mask')\n        plt.imshow(instance_masks)\n        plt.subplot(2, 2, 4)\n        plt.title('label')\n        plt.imshow(semantic_masks)\n        plt.draw()\n        plt.pause(0.001)\n    #plt.show()\n\n    \nif __name__ == '__main__':\n    import argparse\n\n    # Parse command line arguments\n    parser = argparse.ArgumentParser(\n                        description='Train Mask R-CNN to detect Warehouses.')\n    parser.add_argument('--data', required=False,\n                        metavar=\"/path/to/data/\",\n                        help='Directory of the Warehouse dataset')\n    parser.add_argument('--weights', required=True,\n                        metavar=\"/path/to/weights.h5\",\n                        help=\"Path to weights .h5 file or 'coco'\")\n    parser.add_argument('--logs', required=False,\n                        default=DEFAULT_LOGS_DIR,\n                        metavar=\"/path/to/logs/\",\n                        help='Logs and checkpoints directory (default=logs/)')\n    parser.add_argument('--num_frames', type=int, default = 100, help='number of images')\n    parser.add_argument('--num_keyframes', type=int, default = 10, help='real number of images applied')\n    \n    args = parser.parse_args()\n\n    class InferenceConfig(WarehouseConfig):\n        GPU_COUNT = 1\n        IMAGES_PER_GPU = 1\n    config = InferenceConfig()\n    config.display()\n\n    model = modellib.MaskRCNN(mode=\"inference\", config=config, model_dir=args.logs)\n    weights_path = args.weights\n    model.load_weights(weights_path, by_name=True)\n    \n    detect_and_get_masks(model, args.data, args.num_frames, args.num_keyframes)"
  },
  {
    "path": "Mask_RCNN/samples/warehouse/note.txt",
    "content": "# To train\npython3 train.py --dataset=/Warehouse_Dataset/data --weights=coco\npython3 train.py --dataset=/Warehouse_Dataset/data --weights=last\n\n# To evaluate\npython3 eval.py\nIt will read rgb and ground-truth images from /rgb and gt/ folders in .../Object-RPE/data\nthen save results in .../Object-RPE/data/mask"
  },
  {
    "path": "Mask_RCNN/samples/warehouse/train.py",
    "content": "\"\"\"\nMask R-CNN\nTrain on the Warehouse dataset and implement color splash effect.\n\nBased on the work of Waleed Abdulla (Matterport)\nModified by Dinh-Cuong Hoang\n\n------------------------------------------------------------\n\npython3 train.py --dataset=/Warehouse_Dataset/data --weights=coco\npython3 train.py --dataset=/Warehouse_Dataset/data --weights=last\n\n\"\"\"\n\nimport os\nimport sys\nimport json\nimport datetime\nimport numpy as np\nimport skimage.draw\n\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\n\n# Root directory of the project\nROOT_DIR = os.path.abspath(\"../../\")\n\n# Import Mask RCNN\nsys.path.append(ROOT_DIR)  # To find local version of the library\nfrom mrcnn.config import Config\nfrom mrcnn import model as modellib, utils\n\n# Path to trained weights file\nCOCO_WEIGHTS_PATH = os.path.join(ROOT_DIR, \"mask_rcnn_coco.h5\")\n\n# Directory to save logs and model checkpoints, if not provided\n# through the command line argument --logs\nDEFAULT_LOGS_DIR = os.path.join(ROOT_DIR, \"logs\")\n\n############################################################\n#  Configurations\n############################################################\n\n\nclass WarehouseConfig(Config):\n    \"\"\"Configuration for training on the toy  dataset.\n    Derives from the base Config class and overrides some values.\n    \"\"\"\n    # Give the configuration a recognizable name\n    NAME = \"Warehouse\"\n\n    # We use a GPU with 12GB memory, which can fit two images.\n    # Adjust down if you use a smaller GPU.\n    IMAGES_PER_GPU = 1\n\n    # Number of classes (including background)\n    NUM_CLASSES = 1 + 13  # Background + objects\n\n    # Number of training steps per epoch\n    STEPS_PER_EPOCH = 400\n\n    # Skip detections with < 90% confidence\n    DETECTION_MIN_CONFIDENCE = 0.9\n\n\n############################################################\n#  Dataset\n############################################################\n\nclass WarehouseDataset(utils.Dataset):\n\n    def load_Warehouse(self, dataset_dir, subset):\n        \"\"\"Load a subset of the Warehouse dataset.\n        dataset_dir: Root directory of the dataset.\n        subset: Subset to load: train or val\n        \"\"\"\n        # Add classes. We have only one class to add.\n        self.add_class(\"Warehouse\", 1, \"pallet_free\")\n        self.add_class(\"Warehouse\", 2, \"half_pallet_free\")\n        self.add_class(\"Warehouse\", 3, \"pallet_occluded\")\n        self.add_class(\"Warehouse\", 4, \"half_pallet_occluded\")\n        self.add_class(\"Warehouse\", 5, \"jacky\")\n        self.add_class(\"Warehouse\", 6, \"frasvaf\")\n        self.add_class(\"Warehouse\", 7, \"onos\")\n        self.add_class(\"Warehouse\", 8, \"pauluns\")\n        self.add_class(\"Warehouse\", 9, \"risi_frutti\")\n        self.add_class(\"Warehouse\", 10, \"skansk\")\n        self.add_class(\"Warehouse\", 11, \"sotstark\")\n        self.add_class(\"Warehouse\", 12, \"tomatpure\")\n        self.add_class(\"Warehouse\", 13, \"small_jacky\")\n\n        # Train or validation dataset?\n        assert subset in [\"train\", \"val\"]\n        dataset_path = os.path.join(dataset_dir, 'via_region_data_train.json')\n        dataset_path = os.path.join(dataset_dir, 'via_region_data_val.json')\n\n        annotations = json.load(open(dataset_path))\n        annotations = list(annotations.values())  # don't need the dict keys\n\n        # The VIA tool saves images in the JSON even if they don't have any\n        # annotations. Skip unannotated images.\n        annotations = [a for a in annotations if a['regions']]\n\n        # Add images\n        for a in annotations:\n            # Get the x, y coordinaets of points of the polygons that make up\n            # the outline of each object instance. These are stores in the\n            # shape_attributes (see json format above)\n            # The if condition is needed to support VIA versions 1.x and 2.x.\n            if type(a['regions']) is dict:\n                polygons = [r['shape_attributes'] for r in a['regions'].values()]\n            else:\n                polygons = [r['shape_attributes'] for r in a['regions']] \n\n            # the image. This is only managable since the dataset is tiny.\n            image_path = os.path.join(dataset_dir, a['filename'])\n            image = skimage.io.imread(image_path)\n            height, width = image.shape[:2]\n\n            self.add_image(\n                \"Warehouse\",\n                image_id=a['filename'],  # use file name as a unique image id\n                path=image_path,\n                width=width, height=height,\n                polygons=polygons)\n\n    def load_mask(self, image_id):\n        \"\"\"Generate instance masks for an image.\n       Returns:\n        masks: A bool array of shape [height, width, instance count] with\n            one mask per instance.\n        class_ids: a 1D array of class IDs of the instance masks.\n        \"\"\"\n        # If not a Warehouse dataset image, delegate to parent class.\n        image_info = self.image_info[image_id]\n        if image_info[\"source\"] != \"Warehouse\":\n            return super(self.__class__, self).load_mask(image_id)\n\n        # Convert polygons to a bitmap mask of shape\n        # [height, width, instance_count]\n        info = self.image_info[image_id]\n        mask = np.zeros([info[\"height\"], info[\"width\"], len(info[\"polygons\"])],\n                        dtype=np.uint8)\n        class_IDs = np.zeros([len(info[\"polygons\"])], dtype=np.int32)\n        for i, p in enumerate(info[\"polygons\"]):\n            # Get indexes of pixels inside the polygon and set them to 1\n            rr, cc = skimage.draw.polygon(p['all_points_y'], p['all_points_x'])\n            mask[rr, cc, i] = 1\n            class_IDs[i] = p['class_id']\n\n        # Return mask, and array of class IDs of each instance. Since we have\n        # one class ID only, we return an array of 1s\n        return mask.astype(np.bool), class_IDs\n\n    def image_reference(self, image_id):\n        \"\"\"Return the path of the image.\"\"\"\n        info = self.image_info[image_id]\n        if info[\"source\"] == \"Warehouse\":\n            return info[\"path\"]\n        else:\n            super(self.__class__, self).image_reference(image_id)\n\ndef train(model):\n    \"\"\"Train the model.\"\"\"\n    # Training dataset.\n    dataset_train = WarehouseDataset()\n    dataset_train.load_Warehouse(args.dataset, \"train\")\n    dataset_train.prepare()\n\n    # Validation dataset\n    dataset_val = WarehouseDataset()\n    dataset_val.load_Warehouse(args.dataset, \"val\")\n    dataset_val.prepare()\n\n    # *** This training schedule is an example. Update to your needs ***\n    # Since we're using a very small dataset, and starting from\n    # COCO trained weights, we don't need to train too long. Also,\n    # no need to train all layers, just the heads should do it.\n\n    # Training - Stage 1\n    print(\"Training network heads\")\n    model.train(dataset_train, dataset_val,\n                learning_rate=config.LEARNING_RATE,\n                epochs=100,\n                layers='heads')\n\n    #Training - Stage 2\n    #Finetune layers from ResNet stage 4 and up\n    ''' print(\"Fine tune Resnet stage 4 and up\")\n    model.train(dataset_train, dataset_val,\n                learning_rate=config.LEARNING_RATE,\n                epochs=60,\n                layers='4+') '''\n\n    # Training - Stage 3\n    # Fine tune all layers\n    ''' print(\"Fine tune all layers\")\n    model.train(dataset_train, dataset_val,\n                learning_rate=config.LEARNING_RATE / 10,\n                epochs=80,\n                layers='all') '''\n\n############################################################\n#  Training\n############################################################\n\nif __name__ == '__main__':\n    import argparse\n\n    # Parse command line arguments\n    parser = argparse.ArgumentParser(\n        description='Train Mask R-CNN to detect Warehouses.')\n    parser.add_argument('--dataset', required=False,\n                        metavar=\"/path/to/Warehouse/dataset/\",\n                        help='Directory of the Warehouse dataset')\n    parser.add_argument('--weights', required=True,\n                        metavar=\"/path/to/weights.h5\",\n                        help=\"Path to weights .h5 file or 'coco'\")\n    parser.add_argument('--logs', required=False,\n                        default=DEFAULT_LOGS_DIR,\n                        metavar=\"/path/to/logs/\",\n                        help='Logs and checkpoints directory (default=logs/)')\n    args = parser.parse_args()\n\n    # Validate arguments\n    assert args.dataset, \"Argument --dataset is required for training\"\n    \n    print(\"Weights: \", args.weights)\n    print(\"Dataset: \", args.dataset)\n    print(\"Logs: \", args.logs)\n\n    # Configurations\n    config = WarehouseConfig()\n\n    # Create model\n    model = modellib.MaskRCNN(mode=\"training\", config=config, model_dir=args.logs)\n\n    # Select weights file to load\n    if args.weights.lower() == \"coco\":\n        weights_path = COCO_WEIGHTS_PATH\n        # Download weights file\n        if not os.path.exists(weights_path):\n            utils.download_trained_weights(weights_path)\n    elif args.weights.lower() == \"last\":\n        # Find last trained weights\n        weights_path = model.find_last()\n    elif args.weights.lower() == \"imagenet\":\n        # Start from ImageNet trained weights\n        weights_path = model.get_imagenet_weights()\n    else:\n        weights_path = args.weights\n\n    # Load weights\n    print(\"Loading weights \", weights_path)\n    if args.weights.lower() == \"coco\":\n        # Exclude the last layers because they require a matching\n        # number of classes\n        model.load_weights(weights_path, by_name=True, exclude=[\n            \"mrcnn_class_logits\", \"mrcnn_bbox_fc\",\n            \"mrcnn_bbox\", \"mrcnn_mask\"])\n    else:\n        model.load_weights(weights_path, by_name=True)\n\n    # Train or evaluate\n    train(model)"
  },
  {
    "path": "Mask_RCNN/setup.cfg",
    "content": "[metadata]\ndescription-file = README.md\nlicense-file = LICENSE\nrequirements-file = requirements.txt"
  },
  {
    "path": "Mask_RCNN/setup.py",
    "content": "\"\"\"\nThe build/compilations setup\n\n>> pip install -r requirements.txt\n>> python setup.py install\n\"\"\"\nimport pip\nimport logging\nimport pkg_resources\ntry:\n    from setuptools import setup\nexcept ImportError:\n    from distutils.core import setup\n\n\ndef _parse_requirements(file_path):\n    pip_ver = pkg_resources.get_distribution('pip').version\n    pip_version = list(map(int, pip_ver.split('.')[:2]))\n    if pip_version >= [6, 0]:\n        raw = pip.req.parse_requirements(file_path,\n                                         session=pip.download.PipSession())\n    else:\n        raw = pip.req.parse_requirements(file_path)\n    return [str(i.req) for i in raw]\n\n\n# parse_requirements() returns generator of pip.req.InstallRequirement objects\ntry:\n    install_reqs = _parse_requirements(\"requirements.txt\")\nexcept Exception:\n    logging.warning('Fail load requirements file, so using default ones.')\n    install_reqs = []\n\nsetup(\n    name='mask-rcnn',\n    version='2.1',\n    url='https://github.com/matterport/Mask_RCNN',\n    author='Matterport',\n    author_email='waleed.abdulla@gmail.com',\n    license='MIT',\n    description='Mask R-CNN for object detection and instance segmentation',\n    packages=[\"mrcnn\"],\n    install_requires=install_reqs,\n    include_package_data=True,\n    python_requires='>=3.4',\n    long_description=\"\"\"This is an implementation of Mask R-CNN on Python 3, Keras, and TensorFlow. \nThe model generates bounding boxes and segmentation masks for each instance of an object in the image. \nIt's based on Feature Pyramid Network (FPN) and a ResNet101 backbone.\"\"\",\n    classifiers=[\n        \"Development Status :: 5 - Production/Stable\",\n        \"Environment :: Console\",\n        \"Intended Audience :: Developers\",\n        \"Intended Audience :: Information Technology\",\n        \"Intended Audience :: Education\",\n        \"Intended Audience :: Science/Research\",\n        \"License :: OSI Approved :: MIT License\",\n        \"Natural Language :: English\",\n        \"Operating System :: OS Independent\",\n        \"Topic :: Scientific/Engineering :: Artificial Intelligence\",\n        \"Topic :: Scientific/Engineering :: Image Recognition\",\n        \"Topic :: Scientific/Engineering :: Visualization\",\n        \"Topic :: Scientific/Engineering :: Image Segmentation\",\n        'Programming Language :: Python :: 3.4',\n        'Programming Language :: Python :: 3.5',\n        'Programming Language :: Python :: 3.6',\n    ],\n    keywords=\"image instance segmentation object detection mask rcnn r-cnn tensorflow keras\",\n)\n"
  },
  {
    "path": "README.md",
    "content": "# 6D Object Pose Estimation (D6.4 [ILIAD](https://iliad-project.eu))\nThis contains a brief guide how to install / run the ROS-based simplified [Object-RPE](https://sites.google.com/view/object-rpe) developed at ORU in D6.4 [ILIAD](https://iliad-project.eu) project.\n\n## The set of 11 objects in our warehouse dataset.\n![The set of 11 objects](figs/ex1.png)\n\n## Installation and compile the source\nThe tools require full ROS installation. The installation assumes you have Ubuntu 16.04 LTS [ROS Kinetic]\n1. Clone the repository and switch to iliad branch\n   ```bash\n   $ https://github.com/hoangcuongbk80/Object-RPE.git\n   $ git checkout iliad\n   ```\n2. ROS\n   ```bash\n   $ cd ~/catkin_ws\n   $ catkin_make install\n   ```\n3. Segmentation [here](https://github.com/hoangcuongbk80/Object-RPE/tree/iliad/Mask_RCNN)\n4. 3D mapping [here](https://github.com/hoangcuongbk80/Object-RPE/tree/iliad/obj_pose_est/mapping)\n5. 6D object pose estimation [here](https://github.com/hoangcuongbk80/Object-RPE/tree/iliad/DenseFusion)\n\n## Testing\n\n1. Download data folder [here](https://drive.google.com/file/d/1dzwcLOiakkSLiUoJXkPD8-QkIBFTJMXQ/view?usp=sharing) and copy to ~/catkin_ws/src/Object-RPE\n\n2. To test segmenation module:\n   ```bash\n   $ cd ~/catkin_ws/src/Object_RPE/Mask-RCNN/samples/warehouse\n   $ python3 eval.py\n   ```\n   It will read rgb and ground-truth images from /rgb and gt/ folders in .../Object-RPE/data\n   then save results (mask and accuracy.txt file) into .../Object-RPE/data/mask\n\n   <img src=\"figs/ex_rgb.png\" width=\"290\" /><img src=\"figs/ex_mask.png\" width=\"290\" />\n\n3. To test 3D mapping module:\n   ```bash\n   $ cd ~/catkin_ws/src/Object-RPE/obj_pose_est/mapping/app\n   $ ./obj_pose_est/mapping/app/build/mapping -l data/ 100\n   ```\n   <img src=\"figs/mapping.png\" width=\"350\" />\n\n4. To test pose estimation module ([Video](https://www.youtube.com/watch?v=1CSoOjFgP-I)): \n   ```bash\n   $ roscore\n   ```\n   In an other terminal:\n   ```bash\n   $ rosrun obj_pose_est ObjectRPE_srv.py\n   ```\n   In an other terminal:\n   ```bash\n   $ roslaunch obj_pose_est launch_object_rpe.launch\n   ```\n   <img src=\"figs/rviz.png\" width=\"600\" />\n\n## How to operate the system?\n\n   ```bash\n   $ roscore\n   $ rosrun obj_pose_est ObjectRPE_srv.py\n   $ roslaunch obj_pose_est launch_rpe_cam.launch\n   $ roslaunch openni2_launch openni2.launch\n   ```\n"
  },
  {
    "path": "obj_pose_est/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 2.8.3)\nproject(obj_pose_est)\n\n## Compile as C++11, supported in ROS Kinetic and newer\nadd_compile_options(-std=c++11)\n\n## Find catkin macros and libraries\n## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)\n## is used, also find other catkin packages\nfind_package(OpenCV 3 REQUIRED\n\tCOMPONENTS\n\topencv_core\n\topencv_imgproc\n\topencv_imgcodecs\n\topencv_highgui\n  opencv_calib3d\n\tCONFIG\n)\nfind_package(Boost REQUIRED COMPONENTS system)\nfind_package(catkin REQUIRED COMPONENTS\n  cv_bridge\n  pcl_conversions\n  pcl_ros\n  roscpp\n  rospy\n  sensor_msgs\n  std_msgs\n  std_srvs\n  visualization_msgs\n  message_generation\n)\n\nfind_package(PCL REQUIRED)\n\n## System dependencies are found with CMake's conventions\n# find_package(Boost REQUIRED COMPONENTS system)\n\n\n## Uncomment this if the package has a setup.py. This macro ensures\n## modules and global scripts declared therein get installed\n## See http://ros.org/doc/api/catkin/html/user_guide/setup_dot_py.html\n# catkin_python_setup()\n\n################################################\n## Declare ROS messages, services and actions ##\n################################################\n\n## To declare and build messages, services or actions from within this\n## package, follow these steps:\n## * Let MSG_DEP_SET be the set of packages whose message types you use in\n##   your messages/services/actions (e.g. std_msgs, actionlib_msgs, ...).\n## * In the file package.xml:\n##   * add a build_depend tag for \"message_generation\"\n##   * add a build_depend and a exec_depend tag for each package in MSG_DEP_SET\n##   * If MSG_DEP_SET isn't empty the following dependency has been pulled in\n##     but can be declared for certainty nonetheless:\n##     * add a exec_depend tag for \"message_runtime\"\n## * In this file (CMakeLists.txt):\n##   * add \"message_generation\" and every package in MSG_DEP_SET to\n##     find_package(catkin REQUIRED COMPONENTS ...)\n##   * add \"message_runtime\" and every package in MSG_DEP_SET to\n##     catkin_package(CATKIN_DEPENDS ...)\n##   * uncomment the add_*_files sections below as needed\n##     and list every .msg/.srv/.action file to be processed\n##   * uncomment the generate_messages entry below\n##   * add every package in MSG_DEP_SET to generate_messages(DEPENDENCIES ...)\n\n## Generate messages in the 'msg' folder\n# add_message_files(\n#   FILES\n#   Message1.msg\n#   Message2.msg\n# )\n\n## Generate services in the 'srv' folder\n# add_service_files(\n#   FILES\n#   Service1.srv\n#   Service2.srv\n# )\n\nadd_service_files(\n  FILES\n  ObjectRPE.srv\n)\n\n## Generate actions in the 'action' folder\n# add_action_files(\n#   FILES\n#   Action1.action\n#   Action2.action\n# )\n\n## Generate added messages and services with any dependencies listed here\n# generate_messages(\n#   DEPENDENCIES\n#   sensor_msgs#   std_msgs#   visualization_msgs\n# )\n\ngenerate_messages(\n  DEPENDENCIES\n  std_msgs\n)\n\n################################################\n## Declare ROS dynamic reconfigure parameters ##\n################################################\n\n## To declare and build dynamic reconfigure parameters within this\n## package, follow these steps:\n## * In the file package.xml:\n##   * add a build_depend and a exec_depend tag for \"dynamic_reconfigure\"\n## * In this file (CMakeLists.txt):\n##   * add \"dynamic_reconfigure\" to\n##     find_package(catkin REQUIRED COMPONENTS ...)\n##   * uncomment the \"generate_dynamic_reconfigure_options\" section below\n##     and list every .cfg file to be processed\n\n## Generate dynamic reconfigure parameters in the 'cfg' folder\n# generate_dynamic_reconfigure_options(\n#   cfg/DynReconf1.cfg\n#   cfg/DynReconf2.cfg\n# )\n\n###################################\n## catkin specific configuration ##\n###################################\n## The catkin_package macro generates cmake config files for your package\n## Declare things to be passed to dependent projects\n## INCLUDE_DIRS: uncomment this if your package contains header files\n## LIBRARIES: libraries you create in this project that dependent projects also need\n## CATKIN_DEPENDS: catkin_packages dependent projects also need\n## DEPENDS: system dependencies of this project that dependent projects also need\ncatkin_package(\n  INCLUDE_DIRS include\n  LIBRARIES obj_pose_est\n  CATKIN_DEPENDS message_runtime cv_bridge pcl_conversions pcl_ros roscpp rospy sensor_msgs std_msgs std_srvs visualization_msgs\n  DEPENDS system_lib\n)\n\n###########\n## Build ##\n###########\n\n## Specify additional locations of header files\n## Your package locations should be listed before other locations\ninclude_directories(\n  include\n  ${catkin_INCLUDE_DIRS}\n  ${PCL_INCLUDE_DIRS}\n)\n\n## Declare a C++ library\n add_library(${PROJECT_NAME} src/model_to_scene.cpp src/kalman_filter.cpp)\n\n## Add cmake target dependencies of the library\n## as an example, code may need to be generated before libraries\n## either from message generation or dynamic reconfigure\n# add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})\n\n## Declare a C++ executable\n## With catkin_make all packages are built within a single CMake context\n## The recommended prefix ensures that target names across packages don't collide\n# add_executable(${PROJECT_NAME}_node src/obj_pose_est_node.cpp)\n\nadd_executable(iliad_rpe_node src/iliad_rpe_node.cpp)\nadd_executable(iliad_rpe_cam_node src/iliad_rpe_cam_node.cpp)\n\n\n## Rename C++ executable without prefix\n## The above recommended prefix causes long target names, the following renames the\n## target back to the shorter version for ease of user use\n## e.g. \"rosrun someones_pkg node\" instead of \"rosrun someones_pkg someones_pkg_node\"\n# set_target_properties(${PROJECT_NAME}_node PROPERTIES OUTPUT_NAME node PREFIX \"\")\n\n## Add cmake target dependencies of the executable\n## same as for the library above\n# add_dependencies(${PROJECT_NAME}_node ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})\n\n## Specify libraries to link a library or executable target against\n# target_link_libraries(${PROJECT_NAME}_node\n#   ${catkin_LIBRARIES}\n# )\n\ntarget_link_libraries(iliad_rpe_node ${catkin_LIBRARIES} ${OpenCV_LIBS} ${PROJECT_NAME} ${PCL_LIBRARIES})\ntarget_link_libraries(iliad_rpe_cam_node ${catkin_LIBRARIES} ${OpenCV_LIBS} ${PROJECT_NAME} ${PCL_LIBRARIES})\n\n\n#############\n## Install ##\n#############\n\n# all install targets should use catkin DESTINATION variables\n# See http://ros.org/doc/api/catkin/html/adv_user_guide/variables.html\n\n## Mark executable scripts (Python etc.) for installation\n## in contrast to setup.py, you can choose the destination\n# install(PROGRAMS\n#   scripts/my_python_script\n#   DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}\n# )\n\n## Mark executables and/or libraries for installation\n# install(TARGETS ${PROJECT_NAME} ${PROJECT_NAME}_node\n#   ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}\n#   LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}\n#   RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}\n# )\n\n## Mark cpp header files for installation\n# install(DIRECTORY include/${PROJECT_NAME}/\n#   DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}\n#   FILES_MATCHING PATTERN \"*.h\"\n#   PATTERN \".svn\" EXCLUDE\n# )\n\n## Mark other files for installation (e.g. launch and bag files, etc.)\n# install(FILES\n#   # myfile1\n#   # myfile2\n#   DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}\n# )\n\n#############\n## Testing ##\n#############\n\n## Add gtest based cpp test target and link libraries\n# catkin_add_gtest(${PROJECT_NAME}-test test/test_obj_pose_est.cpp)\n# if(TARGET ${PROJECT_NAME}-test)\n#   target_link_libraries(${PROJECT_NAME}-test ${PROJECT_NAME})\n# endif()\n\n## Add folders to be run by python nosetests\n# catkin_add_nosetests(test)\n"
  },
  {
    "path": "obj_pose_est/include/obj_pose_est/kalman_filter.h",
    "content": "#include <stdio.h>\n#include <stdlib.h>\n#include <string>\n#include <cmath>\n\n// PCL\n#include <pcl_conversions/pcl_conversions.h>\n#include <pcl/point_cloud.h>\n#include <pcl/point_types.h>\n#include <pcl/conversions.h>\n#include <pcl/io/ply_io.h>\n\nusing namespace std;\nusing namespace Eigen;\n\n\ntypedef Eigen::Matrix<float, 6, 1> Vector6f;\ntypedef Eigen::Matrix<float, 6, 6> Matrix6f;\n\n#ifndef KALMAN_FILTER_H\n#define KALMAN_FILTER_H\n\nclass kalman_filter\n{\n  public:\n    kalman_filter();\n    virtual ~kalman_filter();\n\n    bool Kalman_update(const Vector6f &measure_X, const Matrix6f &measure_cov, Vector6f &est_X, Matrix6f &est_cov);\n    inline Vector6f addPose(const Vector6f &origin, const Vector6f &pose);\n    inline Vector6f subPose(const Vector6f &origin, const Vector6f &pose);\n};\n\n#endif"
  },
  {
    "path": "obj_pose_est/include/obj_pose_est/model_to_scene.h",
    "content": "#include <ros/package.h>\n#include<vector>\n\n// OpenCV specific includes\n#include <opencv2/highgui/highgui.hpp>\n\n// PCL specific includes\n#include <sensor_msgs/PointCloud2.h>\n#include <pcl_conversions/pcl_conversions.h>\n#include <pcl/point_cloud.h>\n#include <pcl/point_types.h>\n#include <pcl/filters/voxel_grid.h>\n#include <pcl/conversions.h>\n#include <pcl/common/transforms.h>\n#include <pcl/common/common.h>\n#include <pcl/visualization/pcl_visualizer.h>\n#include <pcl/features/vfh.h>\n#include <pcl/features/normal_3d.h>\n//plane fitting\n#include <pcl/sample_consensus/method_types.h>\n#include <pcl/sample_consensus/model_types.h>\n#include <pcl/segmentation/sac_segmentation.h>\n#include <pcl/sample_consensus/sac_model_plane.h>\n#include <pcl/common/geometry.h>\n\n#include <pcl/search/search.h>\n#include <pcl/search/kdtree.h>\n#include <pcl/segmentation/extract_clusters.h>\n#include <pcl/filters/passthrough.h>\n#include <pcl/segmentation/region_growing.h>\n#include <pcl/filters/filter.h>\n#include <pcl/registration/icp.h>\n#include <pcl/filters/statistical_outlier_removal.h>\n#include <pcl/io/ply_io.h>\n\n\n#ifndef MODEL_TO_SCENE_H\n#define MODEL_TO_SCENE_H\n\nstruct boundingBBox\n{\n    double length[3];\n    pcl::PointXYZ minPoint, maxPoint; //min max Point after trasferring to origin\n    pcl::PointXYZ center;\n    Eigen::Matrix4f toOrigin; //pcl::transformPointCloud(input, output, toOrigin);\n    pcl::PointCloud<pcl::PointXYZ> cornerPoints;\n\n};\n\nstruct ObjectModel\n{\n    std::string name;\n\tpcl::PointCloud<pcl::PointXYZRGB> points_full;\n    pcl::PointCloud<pcl::PointXYZRGB> points_view; \n    boundingBBox OBB;   \n};\n\nstruct ObjectInstance\n{\n    std::string name;\n\tpcl::PointCloud<pcl::PointXYZRGB> points;\n    boundingBBox OBB;   \n};\n\nclass model_to_scene\n{\n  public:\n    model_to_scene();\n    virtual ~model_to_scene();\n\n    std::vector<ObjectInstance> instances;\n    std::vector<ObjectModel> models;\n    \n    void computeOBB(const pcl::PointCloud<pcl::PointXYZ> &input, boundingBBox &OBB);\n    void processCloud(const std::string cloud_path, \n                      const std::string detected_class_ids_path, \n                      const std::string class_list_path,\n                      const std::string model_dir);\n    \n    void coarseToFineRegistration(const pcl::PointCloud<pcl::PointXYZ> &sourceCloud,\n                                  const pcl::PointCloud<pcl::PointXYZ> &modelCloud, \n                                  const pcl::PointCloud<pcl::PointXYZ> &targetCloud,\n                                  pcl::PointCloud<pcl::PointXYZ> &registed_source);\n    void cloud_to_instances(const pcl::PointCloud<pcl::PointXYZRGB> &input, \n                            std::vector<ObjectInstance> &objects);\n    int color_to_instanceID(unsigned char r, unsigned char g, unsigned char b);\n    void noiseRemoval(std::vector<ObjectInstance> &objects);\n    void load_models(const std::string model_dir,\n                     const std::string detected_class_ids_path, \n                     const std::string class_list_path,\n                     std::vector<ObjectModel> &models);\n    \n    double overlapPortion(const pcl::PointCloud<pcl::PointXYZ> &source, \n                          const pcl::PointCloud<pcl::PointXYZ> &target, \n                          const double &max_dist);\n};\n\n#endif"
  },
  {
    "path": "obj_pose_est/launch/launch_iliad_cam.launch",
    "content": "<?xml version=\"1.0\"?>\n<launch>\n  <node name=\"object_pose_estimation\" pkg=\"obj_pose_est\" type=\"iliad_rpe_cam_node\" cwd=\"node\">\n  \n  <param name=\"ObjectRPE_dir\" value=\"/home/aass/catkin_ws/src/Object-RPE\"/>  \n  <param name=\"dataset\" value=\"Warehouse\"/> <!-- YCB-Video or Warehouse -->  \n  <param name=\"data_dir\" value=\"/home/aass/catkin_ws/src/Object-RPE/data\"/>\n  <param name=\"num_frames\" value=\"150\"/> <!-- Number of RGB-D frames will be processed in 3D mapping-->\n  <param name=\"num_keyframes\" value=\"10\"/> <!-- Number of RGB-D keyframes will be applied for Mask-RCNN and DenseFusion -->\n  <param name=\"call_service\" value=\"true\"/>\n  <param name=\"dst_thresh\" value=\"0.05\"/> <!-- maximum distance between two points considered as overlapped, unit meter -->\n  <param name=\"overlap_thresh\" value=\"0.3\"/> <!-- minimum overlap portion between two poinclouds considered as the same instance, unit pecent -->\n  <param name=\"confidence_thresh\" value=\"2.5\"/> <!-- minimum confidence score of pose estimation for picking, score = score*(1+overlap_portion) -->\n\n  \n  <param name=\"only_save_frames\" value=\"false\"/>\n  <param name=\"depth_topsub\" value=\"/camera/depth/image\"/>\n  <param name=\"rgb_topsub\" value=\"/camera/rgb/image_rect_color\"/>\n  \n  </node>\n</launch>"
  },
  {
    "path": "obj_pose_est/launch/launch_iliad_rpe.launch",
    "content": "<?xml version=\"1.0\"?>\n<launch>\n  <node name=\"object_pose_estimation\" pkg=\"obj_pose_est\" type=\"iliad_rpe_node\" cwd=\"node\">\n  <param name=\"ObjectRPE_dir\" value=\"/home/aass/catkin_ws/src/Object-RPE\"/>  \n  <param name=\"dataset\" value=\"Warehouse\"/> <!-- YCB-Video or Warehouse -->  \n  <param name=\"data_dir\" value=\"/home/aass/catkin_ws/src/Object-RPE/data\"/>\n  <param name=\"num_frames\" value=\"150\"/> <!-- Number of RGB-D frames will be processed in 3D mapping-->\n  <param name=\"num_keyframes\" value=\"10\"/> <!-- Number of RGB-D keyframes will be applied for Mask-RCNN and DenseFusion -->\n  <param name=\"call_service\" value=\"true\"/>\n  <param name=\"dst_thresh\" value=\"0.05\"/> <!-- maximum distance between two points considered as overlapped, unit meter -->\n  <param name=\"overlap_thresh\" value=\"0.3\"/> <!-- minimum overlap portion between two poinclouds considered as the same instance, unit pecent -->\n  <param name=\"confidence_thresh\" value=\"2.0\"/> <!-- minimum confidence score of pose estimation for picking, score = score*(1+overlap_portion) -->\n\n  </node>\n</launch>"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 2.6.0)\n\nproject(libefusion)\n\nset(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} \"${CMAKE_CURRENT_SOURCE_DIR}\")\n\nfind_package(Pangolin 0.1 REQUIRED)\nfind_package(CUDA REQUIRED)\nfind_package(SuiteSparse REQUIRED)\nfind_package(OpenCV 3.1 REQUIRED)\n\nset(efusion_SHADER_DIR \"${CMAKE_CURRENT_SOURCE_DIR}/Shaders\" CACHE PATH \"Where the shaders live\")\n\ninclude_directories(${Pangolin_INCLUDE_DIRS})\ninclude_directories(${CUDA_INCLUDE_DIRS})\ninclude_directories(${EIGEN_INCLUDE_DIRS})\ninclude_directories(${SUITESPARSE_INCLUDE_DIRS})\ninclude_directories(${OpenCV_INCLUDE_DIRS})\n\nfile(GLOB srcs *.cpp)\nfile(GLOB utils_srcs Utils/*.cpp)\nfile(GLOB shader_srcs Shaders/*.cpp)\nfile(GLOB cuda Cuda/*.cu)\nfile(GLOB containers Cuda/containers/*.cpp)\n\nif(WIN32)\n  file(GLOB hdrs *.h)\n  file(GLOB utils_hdrs Utils/*.h)\n  file(GLOB shader_hdrs Shaders/*.h)\n  file(GLOB cuda_hdrs Cuda/*.cuh)\n  file(GLOB containers_hdrs Cuda/containers/*.hpp)\nendif()\n\nset(CUDA_ARCH_BIN \"30 35 50 52 61\" CACHE STRING \"Specify 'real' GPU arch to build binaries for, BIN(PTX) format is supported. Example: 1.3 2.1(1.3) or 13 21(13)\")\nset(CUDA_ARCH_PTX \"\" CACHE STRING \"Specify 'virtual' PTX arch to build PTX intermediate code for. Example: 1.0 1.2 or 10 12\")              \n\nSET(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${CMAKE_CURRENT_SOURCE_DIR})\ninclude(CudaComputeTargetFlags.cmake)                  \nAPPEND_TARGET_ARCH_FLAGS()\n\nset(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS}  \"-Xcompiler;-fPIC;\")           \nset(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} \"--ftz=true;--prec-div=false;--prec-sqrt=false\") \n\nCUDA_COMPILE(cuda_objs ${cuda})\n\nif(WIN32)\n  set(ADDITIONAL_CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})\nendif()\n\nset(CMAKE_CXX_FLAGS ${ADDITIONAL_CMAKE_CXX_FLAGS} \"-O3 -msse2 -msse3 -Wall -std=c++11 -DSHADER_DIR=${efusion_SHADER_DIR}\")\n#set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -g -Wall -std=c++11 -DSHADER_DIR=${efusion_SHADER_DIR}\")\n  \nif(WIN32)\n  add_definitions(-DWIN32_LEAN_AND_MEAN)\n  add_definitions(-DNOMINMAX)\n  set (EXTRA_WINDOWS_LIBS ${EXTRA_WINDOWS_LIBS} ws2_32)\nendif()\n\nadd_library(efusion SHARED \n            ${srcs}\n            ${utils_srcs}\n            ${shader_srcs}\n            ${cuda} \n            ${cuda_objs} \n            ${containers}\n            ${hdrs}\n            ${utils_hdrs}\n            ${shader_hdrs}\n            ${cuda_hdrs} \n            ${containers_hdrs}\n)\n\ntarget_link_libraries(efusion\n                      ${Eigen_LIBRARIES}\n                      ${Pangolin_LIBRARIES}\n                      ${CUDA_LIBRARIES}\n                      ${SUITESPARSE_LIBRARIES}\n                      ${OpenCV_LIBRARIES}\n\t\t\t\t\t  ${EXTRA_WINDOWS_LIBS}\n)\n\nINSTALL(TARGETS efusion\n            RUNTIME DESTINATION bin\n            LIBRARY DESTINATION lib\n            ARCHIVE DESTINATION lib\n)\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Cuda/containers/device_array.hpp",
    "content": "/*\r\n * Software License Agreement (BSD License)\r\n *\r\n *  Copyright (c) 2011, Willow Garage, Inc.\r\n *  All rights reserved.\r\n *\r\n *  Redistribution and use in source and binary forms, with or without\r\n *  modification, are permitted provided that the following conditions\r\n *  are met:\r\n *\r\n *   * Redistributions of source code must retain the above copyright\r\n *     notice, this list of conditions and the following disclaimer.\r\n *   * Redistributions in binary form must reproduce the above\r\n *     copyright notice, this list of conditions and the following\r\n *     disclaimer in the documentation and/or other materials provided\r\n *     with the distribution.\r\n *   * Neither the name of Willow Garage, Inc. nor the names of its\r\n *     contributors may be used to endorse or promote products derived\r\n *     from this software without specific prior written permission.\r\n *\r\n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r\n *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\r\n *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\r\n *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\r\n *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r\n *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r\n *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\r\n *  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r\n *  POSSIBILITY OF SUCH DAMAGE.\r\n *\r\n *  Author: Anatoly Baskeheev, Itseez Ltd, (myname.mysurname@mycompany.com)\r\n */\r\n\r\n#ifndef DEVICE_ARRAY_HPP_\r\n#define DEVICE_ARRAY_HPP_\r\n\r\n#include \"device_memory.hpp\"\r\n\r\n#include <vector>\r\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\r\n/** \\brief @b DeviceArray class\r\n  *\r\n  * \\note Typed container for GPU memory with reference counting.\r\n  *\r\n  * \\author Anatoly Baksheev\r\n  */\r\ntemplate<class T>\r\nclass DeviceArray : public DeviceMemory\r\n{\r\n    public:\r\n        /** \\brief Element type. */\r\n        typedef T type;\r\n\r\n        /** \\brief Element size. */\r\n        enum { elem_size = sizeof(T) };\r\n\r\n        /** \\brief Empty constructor. */\r\n        DeviceArray();\r\n\r\n        /** \\brief Allocates internal buffer in GPU memory\r\n          * \\param size_t: number of elements to allocate\r\n          * */\r\n        DeviceArray(size_t size);\r\n\r\n        /** \\brief Initializes with user allocated buffer. Reference counting is disabled in this case.\r\n          * \\param ptr: pointer to buffer\r\n          * \\param size: elemens number\r\n          * */\r\n        DeviceArray(T *ptr, size_t size);\r\n\r\n        /** \\brief Copy constructor. Just increments reference counter. */\r\n        DeviceArray(const DeviceArray& other);\r\n\r\n        /** \\brief Assigment operator. Just increments reference counter. */\r\n        DeviceArray& operator = (const DeviceArray& other);\r\n\r\n        /** \\brief Allocates internal buffer in GPU memory. If internal buffer was created before the function recreates it with new size. If new and old sizes are equal it does nothing.\r\n          * \\param size: elemens number\r\n          * */\r\n        void create(size_t size);\r\n\r\n        /** \\brief Decrements reference counter and releases internal buffer if needed. */\r\n        void release();\r\n\r\n        /** \\brief Performs data copying. If destination size differs it will be reallocated.\r\n          * \\param other_arg: destination container\r\n          * */\r\n        void copyTo(DeviceArray& other) const;\r\n\r\n        /** \\brief Uploads data to internal buffer in GPU memory. It calls create() inside to ensure that intenal buffer size is enough.\r\n          * \\param host_ptr_arg: pointer to buffer to upload\r\n          * \\param size: elemens number\r\n          * */\r\n        void upload(const T *host_ptr, size_t size);\r\n\r\n        /** \\brief Downloads data from internal buffer to CPU memory\r\n          * \\param host_ptr_arg: pointer to buffer to download\r\n          * */\r\n        void download(T *host_ptr) const;\r\n\r\n        /** \\brief Uploads data to internal buffer in GPU memory. It calls create() inside to ensure that intenal buffer size is enough.\r\n          * \\param data: host vector to upload from\r\n          * */\r\n        template<class A>\r\n        void upload(const std::vector<T, A>& data);\r\n\r\n         /** \\brief Downloads data from internal buffer to CPU memory\r\n           * \\param data:  host vector to download to\r\n           * */\r\n        template<typename A>\r\n        void download(std::vector<T, A>& data) const;\r\n\r\n        /** \\brief Performs swap of data pointed with another device array.\r\n          * \\param other: device array to swap with\r\n          * */\r\n        void swap(DeviceArray& other_arg);\r\n\r\n        /** \\brief Returns pointer for internal buffer in GPU memory. */\r\n        T* ptr();\r\n\r\n        /** \\brief Returns const pointer for internal buffer in GPU memory. */\r\n        const T* ptr() const;\r\n\r\n        //using DeviceMemory::ptr;\r\n\r\n        /** \\brief Returns pointer for internal buffer in GPU memory. */\r\n        operator T*();\r\n\r\n        /** \\brief Returns const pointer for internal buffer in GPU memory. */\r\n        operator const T*() const;\r\n\r\n        /** \\brief Returns size in elements. */\r\n        size_t size() const;\r\n};\r\n\r\n\r\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\r\n/** \\brief @b DeviceArray2D class\r\n  *\r\n  * \\note Typed container for pitched GPU memory with reference counting.\r\n  *\r\n  * \\author Anatoly Baksheev\r\n  */\r\ntemplate<class T>\r\nclass DeviceArray2D : public DeviceMemory2D\r\n{\r\n    public:\r\n        /** \\brief Element type. */\r\n        typedef T type;\r\n\r\n        /** \\brief Element size. */\r\n        enum { elem_size = sizeof(T) };\r\n\r\n        /** \\brief Empty constructor. */\r\n        DeviceArray2D();\r\n\r\n        /** \\brief Allocates internal buffer in GPU memory\r\n          * \\param rows: number of rows to allocate\r\n          * \\param cols: number of elements in each row\r\n          * */\r\n        DeviceArray2D(int rows, int cols);\r\n\r\n         /** \\brief Initializes with user allocated buffer. Reference counting is disabled in this case.\r\n          * \\param rows: number of rows\r\n          * \\param cols: number of elements in each row\r\n          * \\param data: pointer to buffer\r\n          * \\param stepBytes: stride between two consecutive rows in bytes\r\n          * */\r\n        DeviceArray2D(int rows, int cols, void *data, size_t stepBytes);\r\n\r\n        /** \\brief Copy constructor. Just increments reference counter. */\r\n        DeviceArray2D(const DeviceArray2D& other);\r\n\r\n        /** \\brief Assigment operator. Just increments reference counter. */\r\n        DeviceArray2D& operator = (const DeviceArray2D& other);\r\n\r\n        /** \\brief Allocates internal buffer in GPU memory. If internal buffer was created before the function recreates it with new size. If new and old sizes are equal it does nothing.\r\n           * \\param rows: number of rows to allocate\r\n           * \\param cols: number of elements in each row\r\n           * */\r\n        void create(int rows, int cols);\r\n\r\n        /** \\brief Decrements reference counter and releases internal buffer if needed. */\r\n        void release();\r\n\r\n        /** \\brief Performs data copying. If destination size differs it will be reallocated.\r\n          * \\param other: destination container\r\n          * */\r\n        void copyTo(DeviceArray2D& other) const;\r\n\r\n        /** \\brief Uploads data to internal buffer in GPU memory. It calls create() inside to ensure that intenal buffer size is enough.\r\n          * \\param host_ptr: pointer to host buffer to upload\r\n          * \\param host_step: stride between two consecutive rows in bytes for host buffer\r\n          * \\param rows: number of rows to upload\r\n          * \\param cols: number of elements in each row\r\n          * */\r\n        void upload(const void *host_ptr, size_t host_step, int rows, int cols);\r\n\r\n        /** \\brief Downloads data from internal buffer to CPU memory. User is resposible for correct host buffer size.\r\n          * \\param host_ptr: pointer to host buffer to download\r\n          * \\param host_step: stride between two consecutive rows in bytes for host buffer\r\n          * */\r\n        void download(void *host_ptr, size_t host_step) const;\r\n\r\n        /** \\brief Performs swap of data pointed with another device array.\r\n          * \\param other: device array to swap with\r\n          * */\r\n        void swap(DeviceArray2D& other_arg);\r\n\r\n        /** \\brief Uploads data to internal buffer in GPU memory. It calls create() inside to ensure that intenal buffer size is enough.\r\n          * \\param data: host vector to upload from\r\n          * \\param cols: stride in elements between  two consecutive rows in bytes for host buffer\r\n          * */\r\n        template<class A>\r\n        void upload(const std::vector<T, A>& data, int cols);\r\n\r\n        /** \\brief Downloads data from internal buffer to CPU memory\r\n           * \\param data: host vector to download to\r\n           * \\param cols: Output stride in elements between two consecutive rows in bytes for host vector.\r\n           * */\r\n        template<class A>\r\n        void download(std::vector<T, A>& data, int& cols) const;\r\n\r\n        /** \\brief Returns pointer to given row in internal buffer.\r\n          * \\param y_arg: row index\r\n          * */\r\n        T* ptr(int y = 0);\r\n\r\n        /** \\brief Returns const pointer to given row in internal buffer.\r\n          * \\param y_arg: row index\r\n          * */\r\n        const T* ptr(int y = 0) const;\r\n        \r\n        //using DeviceMemory2D::ptr;\r\n\r\n        /** \\brief Returns pointer for internal buffer in GPU memory. */\r\n        operator T*();\r\n\r\n        /** \\brief Returns const pointer for internal buffer in GPU memory. */\r\n        operator const T*() const;\r\n        \r\n        /** \\brief Returns number of elements in each row. */\r\n        int cols() const;\r\n\r\n        /** \\brief Returns number of rows. */\r\n        int rows() const;\r\n\r\n        /** \\brief Returns step in elements. */\r\n        size_t elem_step() const;\r\n};\r\n\r\n#include \"device_array_impl.hpp\"\r\n\r\n#endif /* DEVICE_ARRAY_HPP_ */\r\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Cuda/containers/device_array_impl.hpp",
    "content": "/*\r\n * Software License Agreement (BSD License)\r\n *\r\n *  Copyright (c) 2011, Willow Garage, Inc.\r\n *  All rights reserved.\r\n *\r\n *  Redistribution and use in source and binary forms, with or without\r\n *  modification, are permitted provided that the following conditions\r\n *  are met:\r\n *\r\n *   * Redistributions of source code must retain the above copyright\r\n *     notice, this list of conditions and the following disclaimer.\r\n *   * Redistributions in binary form must reproduce the above\r\n *     copyright notice, this list of conditions and the following\r\n *     disclaimer in the documentation and/or other materials provided\r\n *     with the distribution.\r\n *   * Neither the name of Willow Garage, Inc. nor the names of its\r\n *     contributors may be used to endorse or promote products derived\r\n *     from this software without specific prior written permission.\r\n *\r\n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r\n *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\r\n *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\r\n *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\r\n *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r\n *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r\n *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\r\n *  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r\n *  POSSIBILITY OF SUCH DAMAGE.\r\n *\r\n *  Author: Anatoly Baskeheev, Itseez Ltd, (myname.mysurname@mycompany.com)\r\n */\r\n\r\n#ifndef DEVICE_ARRAY_IMPL_HPP_\r\n#define DEVICE_ARRAY_IMPL_HPP_\r\n\r\n\r\n/////////////////////  Inline implementations of DeviceArray ////////////////////////////////////////////\r\n\r\ntemplate<class T> inline DeviceArray<T>::DeviceArray() {}\r\ntemplate<class T> inline DeviceArray<T>::DeviceArray(size_t size) : DeviceMemory(size * elem_size) {}\r\ntemplate<class T> inline DeviceArray<T>::DeviceArray(T *ptr, size_t size) : DeviceMemory(ptr, size * elem_size) {}\r\ntemplate<class T> inline DeviceArray<T>::DeviceArray(const DeviceArray& other) : DeviceMemory(other) {}\r\ntemplate<class T> inline DeviceArray<T>& DeviceArray<T>::operator=(const DeviceArray& other)\r\n{ DeviceMemory::operator=(other); return *this; }\r\n\r\ntemplate<class T> inline void DeviceArray<T>::create(size_t size)\r\n{ DeviceMemory::create(size * elem_size); }\r\ntemplate<class T> inline void DeviceArray<T>::release()\r\n{ DeviceMemory::release(); }\r\n\r\ntemplate<class T> inline void DeviceArray<T>::copyTo(DeviceArray& other) const\r\n{ DeviceMemory::copyTo(other); }\r\ntemplate<class T> inline void DeviceArray<T>::upload(const T *host_ptr, size_t size)\r\n{ DeviceMemory::upload(host_ptr, size * elem_size); }\r\ntemplate<class T> inline void DeviceArray<T>::download(T *host_ptr) const\r\n{ DeviceMemory::download( host_ptr ); }\r\n\r\ntemplate<class T> void DeviceArray<T>::swap(DeviceArray& other_arg) { DeviceMemory::swap(other_arg); }\r\n\r\ntemplate<class T> inline DeviceArray<T>::operator T*() { return ptr(); }\r\ntemplate<class T> inline DeviceArray<T>::operator const T*() const { return ptr(); }\r\ntemplate<class T> inline size_t DeviceArray<T>::size() const { return sizeBytes() / elem_size; }\r\n\r\ntemplate<class T> inline       T* DeviceArray<T>::ptr()       { return DeviceMemory::ptr<T>(); }\r\ntemplate<class T> inline const T* DeviceArray<T>::ptr() const { return DeviceMemory::ptr<T>(); }\r\n\r\ntemplate<class T> template<class A> inline void DeviceArray<T>::upload(const std::vector<T, A>& data) { upload(&data[0], data.size()); }\r\ntemplate<class T> template<class A> inline void DeviceArray<T>::download(std::vector<T, A>& data) const { data.resize(size()); if (!data.empty()) download(&data[0]); }\r\n\r\n/////////////////////  Inline implementations of DeviceArray2D ////////////////////////////////////////////\r\n\r\ntemplate<class T> inline DeviceArray2D<T>::DeviceArray2D() {}\r\ntemplate<class T> inline DeviceArray2D<T>::DeviceArray2D(int rows, int cols) : DeviceMemory2D(rows, cols * elem_size) {}\r\ntemplate<class T> inline DeviceArray2D<T>::DeviceArray2D(int rows, int cols, void *data, size_t stepBytes) : DeviceMemory2D(rows, cols * elem_size, data, stepBytes) {}\r\ntemplate<class T> inline DeviceArray2D<T>::DeviceArray2D(const DeviceArray2D& other) : DeviceMemory2D(other) {}\r\ntemplate<class T> inline DeviceArray2D<T>& DeviceArray2D<T>::operator=(const DeviceArray2D& other)\r\n{ DeviceMemory2D::operator=(other); return *this; }\r\n\r\ntemplate<class T> inline void DeviceArray2D<T>::create(int rows, int cols)\r\n{ DeviceMemory2D::create(rows, cols * elem_size); }\r\ntemplate<class T> inline void DeviceArray2D<T>::release()\r\n{ DeviceMemory2D::release(); }\r\n\r\ntemplate<class T> inline void DeviceArray2D<T>::copyTo(DeviceArray2D& other) const\r\n{ DeviceMemory2D::copyTo(other); }\r\ntemplate<class T> inline void DeviceArray2D<T>::upload(const void *host_ptr, size_t host_step, int rows, int cols)\r\n{ DeviceMemory2D::upload(host_ptr, host_step, rows, cols * elem_size); }\r\ntemplate<class T> inline void DeviceArray2D<T>::download(void *host_ptr, size_t host_step) const\r\n{ DeviceMemory2D::download( host_ptr, host_step ); }\r\n\r\ntemplate<class T> template<class A> inline void DeviceArray2D<T>::upload(const std::vector<T, A>& data, int cols)\r\n{ upload(&data[0], cols * elem_size, data.size()/cols, cols); }\r\n\r\ntemplate<class T> template<class A> inline void DeviceArray2D<T>::download(std::vector<T, A>& data, int& elem_step) const\r\n{ elem_step = cols(); data.resize(cols() * rows()); if (!data.empty()) download(&data[0], colsBytes());  }\r\n\r\ntemplate<class T> void  DeviceArray2D<T>::swap(DeviceArray2D& other_arg) { DeviceMemory2D::swap(other_arg); }\r\n\r\ntemplate<class T> inline       T* DeviceArray2D<T>::ptr(int y)       { return DeviceMemory2D::ptr<T>(y); }\r\ntemplate<class T> inline const T* DeviceArray2D<T>::ptr(int y) const { return DeviceMemory2D::ptr<T>(y); }\r\n            \r\ntemplate<class T> inline DeviceArray2D<T>::operator T*() { return ptr(); }\r\ntemplate<class T> inline DeviceArray2D<T>::operator const T*() const { return ptr(); }\r\n\r\ntemplate<class T> inline int DeviceArray2D<T>::cols() const { return DeviceMemory2D::colsBytes()/elem_size; }\r\ntemplate<class T> inline int DeviceArray2D<T>::rows() const { return DeviceMemory2D::rows(); }\r\n\r\ntemplate<class T> inline size_t DeviceArray2D<T>::elem_step() const { return DeviceMemory2D::step()/elem_size; }\r\n\r\n\r\n#endif /* DEVICE_ARRAY_IMPL_HPP_ */\r\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Cuda/containers/device_memory.cpp",
    "content": " /*\r\n * Software License Agreement (BSD License)\r\n *\r\n *  Copyright (c) 2011, Willow Garage, Inc.\r\n *  All rights reserved.\r\n *\r\n *  Redistribution and use in source and binary forms, with or without\r\n *  modification, are permitted provided that the following conditions\r\n *  are met:\r\n *\r\n *   * Redistributions of source code must retain the above copyright\r\n *     notice, this list of conditions and the following disclaimer.\r\n *   * Redistributions in binary form must reproduce the above\r\n *     copyright notice, this list of conditions and the following\r\n *     disclaimer in the documentation and/or other materials provided\r\n *     with the distribution.\r\n *   * Neither the name of Willow Garage, Inc. nor the names of its\r\n *     contributors may be used to endorse or promote products derived\r\n *     from this software without specific prior written permission.\r\n *\r\n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r\n *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\r\n *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\r\n *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\r\n *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r\n *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r\n *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\r\n *  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r\n *  POSSIBILITY OF SUCH DAMAGE.\r\n *\r\n *  Author: Anatoly Baskeheev, Itseez Ltd, (myname.mysurname@mycompany.com)\r\n */\r\n\r\n#include \"device_memory.hpp\"\r\n#include \"../convenience.cuh\"\r\n\r\n#include \"cuda_runtime_api.h\"\r\n#include \"assert.h\"\r\n\r\n//////////////////////////    XADD    ///////////////////////////////\r\n\r\n#ifdef __GNUC__\r\n    \r\n    #if __GNUC__*10 + __GNUC_MINOR__ >= 42\r\n\r\n        #if !defined WIN32 && (defined __i486__ || defined __i586__ || defined __i686__ || defined __MMX__ || defined __SSE__  || defined __ppc__)\r\n            #define CV_XADD __sync_fetch_and_add\r\n        #else\r\n            #include <ext/atomicity.h>\r\n            #define CV_XADD __gnu_cxx::__exchange_and_add\r\n        #endif\r\n    #else\r\n        #include <bits/atomicity.h>\r\n        #if __GNUC__*10 + __GNUC_MINOR__ >= 34\r\n            #define CV_XADD __gnu_cxx::__exchange_and_add\r\n        #else\r\n            #define CV_XADD __exchange_and_add\r\n        #endif\r\n  #endif\r\n    \r\n#elif defined WIN32 || defined _WIN32\r\n    #include <intrin.h>\r\n    #define CV_XADD(addr,delta) _InterlockedExchangeAdd((long volatile*)(addr), (delta))\r\n#else\r\n\r\n    template<typename _Tp> static inline _Tp CV_XADD(_Tp* addr, _Tp delta)\r\n    { int tmp = *addr; *addr += delta; return tmp; }\r\n    \r\n#endif\r\n\r\n////////////////////////    DeviceArray    /////////////////////////////\r\n    \r\nDeviceMemory::DeviceMemory() : data_(0), sizeBytes_(0), refcount_(0) {}\r\nDeviceMemory::DeviceMemory(void *ptr_arg, size_t sizeBytes_arg) : data_(ptr_arg), sizeBytes_(sizeBytes_arg), refcount_(0){}\r\nDeviceMemory::DeviceMemory(size_t sizeBtes_arg)  : data_(0), sizeBytes_(0), refcount_(0) { create(sizeBtes_arg); }\r\nDeviceMemory::~DeviceMemory() { release(); }\r\n\r\nDeviceMemory::DeviceMemory(const DeviceMemory& other_arg)\r\n    : data_(other_arg.data_), sizeBytes_(other_arg.sizeBytes_), refcount_(other_arg.refcount_)\r\n{\r\n    if( refcount_ )\r\n        CV_XADD(refcount_, 1);\r\n}\r\n\r\nDeviceMemory& DeviceMemory::operator = (const DeviceMemory& other_arg)\r\n{\r\n    if( this != &other_arg )\r\n    {\r\n        if( other_arg.refcount_ )\r\n            CV_XADD(other_arg.refcount_, 1);\r\n        release();\r\n        \r\n        data_      = other_arg.data_;\r\n        sizeBytes_ = other_arg.sizeBytes_;                \r\n        refcount_  = other_arg.refcount_;\r\n    }\r\n    return *this;\r\n}\r\n\r\nvoid DeviceMemory::create(size_t sizeBytes_arg)\r\n{\r\n    if (sizeBytes_arg == sizeBytes_)\r\n        return;\r\n            \r\n    if( sizeBytes_arg > 0)\r\n    {        \r\n        if( data_ )\r\n            release();\r\n\r\n        sizeBytes_ = sizeBytes_arg;\r\n                        \r\n        cudaSafeCall( cudaMalloc(&data_, sizeBytes_) );        \r\n\r\n        refcount_ = new int;\r\n        *refcount_ = 1;\r\n    }\r\n}\r\n\r\nvoid DeviceMemory::copyTo(DeviceMemory& other) const\r\n{\r\n    if (empty())\r\n        other.release();\r\n    else\r\n    {    \r\n        other.create(sizeBytes_);    \r\n        cudaSafeCall( cudaMemcpy(other.data_, data_, sizeBytes_, cudaMemcpyDeviceToDevice) );\r\n        cudaSafeCall( cudaDeviceSynchronize() );\r\n    }\r\n}\r\n\r\nvoid DeviceMemory::release()\r\n{\r\n    if( refcount_ && CV_XADD(refcount_, -1) == 1 )\r\n    {\r\n        delete refcount_;\r\n        cudaSafeCall( cudaFree(data_) );\r\n    }\r\n    data_ = 0;\r\n    sizeBytes_ = 0;\r\n    refcount_ = 0;\r\n}\r\n\r\nvoid DeviceMemory::upload(const void *host_ptr_arg, size_t sizeBytes_arg)\r\n{\r\n    create(sizeBytes_arg);\r\n    cudaSafeCall( cudaMemcpy(data_, host_ptr_arg, sizeBytes_, cudaMemcpyHostToDevice) );\r\n    cudaSafeCall( cudaDeviceSynchronize() );\r\n}\r\n\r\nvoid DeviceMemory::download(void *host_ptr_arg) const\r\n{    \r\n    cudaSafeCall( cudaMemcpy(host_ptr_arg, data_, sizeBytes_, cudaMemcpyDeviceToHost) );\r\n    cudaSafeCall( cudaDeviceSynchronize() );\r\n}          \r\n\r\nvoid DeviceMemory::swap(DeviceMemory& other_arg)\r\n{\r\n    std::swap(data_, other_arg.data_);\r\n    std::swap(sizeBytes_, other_arg.sizeBytes_);\r\n    std::swap(refcount_, other_arg.refcount_);\r\n}\r\n\r\nbool DeviceMemory::empty() const { return !data_; }\r\nsize_t DeviceMemory::sizeBytes() const { return sizeBytes_; }\r\n\r\n\r\n////////////////////////    DeviceArray2D    /////////////////////////////\r\n\r\nDeviceMemory2D::DeviceMemory2D() : data_(0), step_(0), colsBytes_(0), rows_(0), refcount_(0) {}\r\n\r\nDeviceMemory2D::DeviceMemory2D(int rows_arg, int colsBytes_arg)\r\n    : data_(0), step_(0), colsBytes_(0), rows_(0), refcount_(0)\r\n{ \r\n    create(rows_arg, colsBytes_arg); \r\n}\r\n\r\nDeviceMemory2D::DeviceMemory2D(int rows_arg, int colsBytes_arg, void *data_arg, size_t step_arg)\r\n    :  data_(data_arg), step_(step_arg), colsBytes_(colsBytes_arg), rows_(rows_arg), refcount_(0) {}\r\n\r\nDeviceMemory2D::~DeviceMemory2D() { release(); }\r\n\r\n\r\nDeviceMemory2D::DeviceMemory2D(const DeviceMemory2D& other_arg) :\r\n    data_(other_arg.data_), step_(other_arg.step_), colsBytes_(other_arg.colsBytes_), rows_(other_arg.rows_), refcount_(other_arg.refcount_)\r\n{\r\n    if( refcount_ )\r\n        CV_XADD(refcount_, 1);\r\n}\r\n\r\nDeviceMemory2D& DeviceMemory2D::operator = (const DeviceMemory2D& other_arg)\r\n{\r\n    if( this != &other_arg )\r\n    {\r\n        if( other_arg.refcount_ )\r\n            CV_XADD(other_arg.refcount_, 1);\r\n        release();\r\n        \r\n        colsBytes_ = other_arg.colsBytes_;\r\n        rows_ = other_arg.rows_;\r\n        data_ = other_arg.data_;\r\n        step_ = other_arg.step_;\r\n                \r\n        refcount_ = other_arg.refcount_;\r\n    }\r\n    return *this;\r\n}\r\n\r\nvoid DeviceMemory2D::create(int rows_arg, int colsBytes_arg)\r\n{\r\n    if (colsBytes_ == colsBytes_arg && rows_ == rows_arg)\r\n        return;\r\n            \r\n    if( rows_arg > 0 && colsBytes_arg > 0)\r\n    {        \r\n        if( data_ )\r\n            release();\r\n              \r\n        colsBytes_ = colsBytes_arg;\r\n        rows_ = rows_arg;\r\n                        \r\n        cudaSafeCall( cudaMallocPitch( (void**)&data_, &step_, colsBytes_, rows_) );        \r\n\r\n        refcount_ = new int;\r\n        *refcount_ = 1;\r\n    }\r\n}\r\n\r\nvoid DeviceMemory2D::release()\r\n{\r\n    if( refcount_ && CV_XADD(refcount_, -1) == 1 )\r\n    {\r\n        delete refcount_;\r\n        cudaSafeCall( cudaFree(data_) );\r\n    }\r\n\r\n    colsBytes_ = 0;\r\n    rows_ = 0;    \r\n    data_ = 0;    \r\n    step_ = 0;\r\n    refcount_ = 0;\r\n}\r\n\r\nvoid DeviceMemory2D::copyTo(DeviceMemory2D& other) const\r\n{\r\n    if (empty())\r\n        other.release();\r\n    else\r\n    {\r\n        other.create(rows_, colsBytes_);    \r\n        cudaSafeCall( cudaMemcpy2D(other.data_, other.step_, data_, step_, colsBytes_, rows_, cudaMemcpyDeviceToDevice) );\r\n        cudaSafeCall( cudaDeviceSynchronize() );\r\n    }\r\n}\r\n\r\nvoid DeviceMemory2D::upload(const void *host_ptr_arg, size_t host_step_arg, int rows_arg, int colsBytes_arg)\r\n{\r\n    create(rows_arg, colsBytes_arg);\r\n    cudaSafeCall( cudaMemcpy2D(data_, step_, host_ptr_arg, host_step_arg, colsBytes_, rows_, cudaMemcpyHostToDevice) );        \r\n}\r\n\r\nvoid DeviceMemory2D::download(void *host_ptr_arg, size_t host_step_arg) const\r\n{    \r\n    cudaSafeCall( cudaMemcpy2D(host_ptr_arg, host_step_arg, data_, step_, colsBytes_, rows_, cudaMemcpyDeviceToHost) );\r\n}      \r\n\r\nvoid DeviceMemory2D::swap(DeviceMemory2D& other_arg)\r\n{    \r\n    std::swap(data_, other_arg.data_);\r\n    std::swap(step_, other_arg.step_);\r\n\r\n    std::swap(colsBytes_, other_arg.colsBytes_);\r\n    std::swap(rows_, other_arg.rows_);\r\n    std::swap(refcount_, other_arg.refcount_);                 \r\n}\r\n\r\nbool DeviceMemory2D::empty() const { return !data_; }\r\nint DeviceMemory2D::colsBytes() const { return colsBytes_; }\r\nint DeviceMemory2D::rows() const { return rows_; }\r\nsize_t DeviceMemory2D::step() const { return step_; }\r\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Cuda/containers/device_memory.hpp",
    "content": "/*\r\n * Software License Agreement (BSD License)\r\n *\r\n *  Copyright (c) 2011, Willow Garage, Inc.\r\n *  All rights reserved.\r\n *\r\n *  Redistribution and use in source and binary forms, with or without\r\n *  modification, are permitted provided that the following conditions\r\n *  are met:\r\n *\r\n *   * Redistributions of source code must retain the above copyright\r\n *     notice, this list of conditions and the following disclaimer.\r\n *   * Redistributions in binary form must reproduce the above\r\n *     copyright notice, this list of conditions and the following\r\n *     disclaimer in the documentation and/or other materials provided\r\n *     with the distribution.\r\n *   * Neither the name of Willow Garage, Inc. nor the names of its\r\n *     contributors may be used to endorse or promote products derived\r\n *     from this software without specific prior written permission.\r\n *\r\n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r\n *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\r\n *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\r\n *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\r\n *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r\n *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r\n *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\r\n *  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r\n *  POSSIBILITY OF SUCH DAMAGE.\r\n *\r\n *  Author: Anatoly Baskeheev, Itseez Ltd, (myname.mysurname@mycompany.com)\r\n */\r\n\r\n#ifndef DEVICE_MEMORY_HPP_\r\n#define DEVICE_MEMORY_HPP_\r\n\r\n#include \"kernel_containers.hpp\"\r\n\r\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\r\n/** \\brief @b DeviceMemory class\r\n  *\r\n  * \\note This is a BLOB container class with reference counting for GPU memory.\r\n  *\r\n  * \\author Anatoly Baksheev\r\n  */\r\n\r\nclass DeviceMemory\r\n{\r\n    public:\r\n        /** \\brief Empty constructor. */\r\n        DeviceMemory();\r\n\r\n        /** \\brief Destructor. */\r\n        ~DeviceMemory();\r\n\r\n        /** \\brief Allocates internal buffer in GPU memory\r\n          * \\param sizeBytes_arg: amount of memory to allocate\r\n          * */\r\n        DeviceMemory(size_t sizeBytes_arg);\r\n\r\n        /** \\brief Initializes with user allocated buffer. Reference counting is disabled in this case.\r\n          * \\param ptr_arg: pointer to buffer\r\n          * \\param sizeBytes_arg: buffer size\r\n          * */\r\n        DeviceMemory(void *ptr_arg, size_t sizeBytes_arg);\r\n\r\n        /** \\brief Copy constructor. Just increments reference counter. */\r\n        DeviceMemory(const DeviceMemory& other_arg);\r\n\r\n        /** \\brief Assigment operator. Just increments reference counter. */\r\n        DeviceMemory& operator=(const DeviceMemory& other_arg);\r\n\r\n         /** \\brief Allocates internal buffer in GPU memory. If internal buffer was created before the function recreates it with new size. If new and old sizes are equal it does nothing.\r\n           * \\param sizeBytes_arg: buffer size\r\n           * */\r\n        void create(size_t sizeBytes_arg);\r\n\r\n        /** \\brief Decrements reference counter and releases internal buffer if needed. */\r\n        void release();\r\n\r\n        /** \\brief Performs data copying. If destination size differs it will be reallocated.\r\n          * \\param other_arg: destination container\r\n          * */\r\n        void copyTo(DeviceMemory& other) const;\r\n\r\n        /** \\brief Uploads data to internal buffer in GPU memory. It calls create() inside to ensure that intenal buffer size is enough.\r\n          * \\param host_ptr_arg: pointer to buffer to upload\r\n          * \\param sizeBytes_arg: buffer size\r\n          * */\r\n        void upload(const void *host_ptr_arg, size_t sizeBytes_arg);\r\n\r\n        /** \\brief Downloads data from internal buffer to CPU memory\r\n          * \\param host_ptr_arg: pointer to buffer to download\r\n          * */\r\n        void download(void *host_ptr_arg) const;\r\n\r\n        /** \\brief Performs swap of data pointed with another device memory.\r\n          * \\param other: device memory to swap with\r\n          * */\r\n        void swap(DeviceMemory& other_arg);\r\n\r\n        /** \\brief Returns pointer for internal buffer in GPU memory. */\r\n        template<class T> T* ptr();\r\n\r\n        /** \\brief Returns constant pointer for internal buffer in GPU memory. */\r\n        template<class T> const T* ptr() const;\r\n\r\n        /** \\brief Conversion to PtrSz for passing to kernel functions. */\r\n        template <class U> operator PtrSz<U>() const;\r\n\r\n        /** \\brief Returns true if unallocated otherwise false. */\r\n        bool empty() const;\r\n\r\n        size_t sizeBytes() const;\r\n\r\n    private:\r\n        /** \\brief Device pointer. */\r\n        void *data_;\r\n\r\n        /** \\brief Allocated size in bytes. */\r\n        size_t sizeBytes_;\r\n\r\n        /** \\brief Pointer to reference counter in CPU memory. */\r\n        int* refcount_;\r\n};\r\n\r\n//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////\r\n/** \\brief @b DeviceMemory2D class\r\n  *\r\n  * \\note This is a BLOB container class with reference counting for pitched GPU memory.\r\n  *\r\n  * \\author Anatoly Baksheev\r\n  */\r\n\r\nclass DeviceMemory2D\r\n{\r\n    public:\r\n        /** \\brief Empty constructor. */\r\n        DeviceMemory2D();\r\n\r\n        /** \\brief Destructor. */\r\n        ~DeviceMemory2D();\r\n\r\n        /** \\brief Allocates internal buffer in GPU memory\r\n          * \\param rows_arg: number of rows to allocate\r\n          * \\param colsBytes_arg: width of the buffer in bytes\r\n          * */\r\n        DeviceMemory2D(int rows_arg, int colsBytes_arg);\r\n\r\n\r\n        /** \\brief Initializes with user allocated buffer. Reference counting is disabled in this case.\r\n          * \\param rows_arg: number of rows\r\n          * \\param colsBytes_arg: width of the buffer in bytes\r\n          * \\param data_arg: pointer to buffer\r\n          * \\param stepBytes_arg: stride between two consecutive rows in bytes\r\n          * */\r\n        DeviceMemory2D(int rows_arg, int colsBytes_arg, void *data_arg, size_t step_arg);\r\n\r\n        /** \\brief Copy constructor. Just increments reference counter. */\r\n        DeviceMemory2D(const DeviceMemory2D& other_arg);\r\n\r\n        /** \\brief Assigment operator. Just increments reference counter. */\r\n        DeviceMemory2D& operator=(const DeviceMemory2D& other_arg);\r\n\r\n        /** \\brief Allocates internal buffer in GPU memory. If internal buffer was created before the function recreates it with new size. If new and old sizes are equal it does nothing.\r\n           * \\param ptr_arg: number of rows to allocate\r\n           * \\param sizeBytes_arg: width of the buffer in bytes\r\n           * */\r\n        void create(int rows_arg, int colsBytes_arg);\r\n\r\n        /** \\brief Decrements reference counter and releases internal buffer if needed. */\r\n        void release();\r\n\r\n        /** \\brief Performs data copying. If destination size differs it will be reallocated.\r\n          * \\param other_arg: destination container\r\n          * */\r\n        void copyTo(DeviceMemory2D& other) const;\r\n\r\n        /** \\brief Uploads data to internal buffer in GPU memory. It calls create() inside to ensure that intenal buffer size is enough.\r\n          * \\param host_ptr_arg: pointer to host buffer to upload\r\n          * \\param host_step_arg: stride between two consecutive rows in bytes for host buffer\r\n          * \\param rows_arg: number of rows to upload\r\n          * \\param sizeBytes_arg: width of host buffer in bytes\r\n          * */\r\n        void upload(const void *host_ptr_arg, size_t host_step_arg, int rows_arg, int colsBytes_arg);\r\n\r\n        /** \\brief Downloads data from internal buffer to CPU memory. User is resposible for correct host buffer size.\r\n          * \\param host_ptr_arg: pointer to host buffer to download\r\n          * \\param host_step_arg: stride between two consecutive rows in bytes for host buffer\r\n          * */\r\n        void download(void *host_ptr_arg, size_t host_step_arg) const;\r\n\r\n        /** \\brief Performs swap of data pointed with another device memory.\r\n          * \\param other: device memory to swap with\r\n          * */\r\n        void swap(DeviceMemory2D& other_arg);\r\n\r\n        /** \\brief Returns pointer to given row in internal buffer.\r\n          * \\param y_arg: row index\r\n          * */\r\n        template<class T> T* ptr(int y_arg = 0);\r\n\r\n        /** \\brief Returns constant pointer to given row in internal buffer.\r\n          * \\param y_arg: row index\r\n          * */\r\n        template<class T> const T* ptr(int y_arg = 0) const;\r\n\r\n         /** \\brief Conversion to PtrStep for passing to kernel functions. */\r\n        template <class U> operator PtrStep<U>() const;\r\n\r\n        /** \\brief Conversion to PtrStepSz for passing to kernel functions. */\r\n        template <class U> operator PtrStepSz<U>() const;\r\n\r\n        /** \\brief Returns true if unallocated otherwise false. */\r\n        bool empty() const;\r\n\r\n        /** \\brief Returns number of bytes in each row. */\r\n        int colsBytes() const;\r\n\r\n        /** \\brief Returns number of rows. */\r\n        int rows() const;\r\n\r\n        /** \\brief Returns stride between two consecutive rows in bytes for internal buffer. Step is stored always and everywhere in bytes!!! */\r\n        size_t step() const;\r\n    private:\r\n        /** \\brief Device pointer. */\r\n        void *data_;\r\n\r\n        /** \\brief Stride between two consecutive rows in bytes for internal buffer. Step is stored always and everywhere in bytes!!! */\r\n        size_t step_;\r\n\r\n        /** \\brief Width of the buffer in bytes. */\r\n        int colsBytes_;\r\n\r\n        /** \\brief Number of rows. */\r\n        int rows_;\r\n\r\n        /** \\brief Pointer to reference counter in CPU memory. */\r\n        int* refcount_;\r\n};\r\n\r\n#include \"device_memory_impl.hpp\"\r\n\r\n#endif /* DEVICE_MEMORY_HPP_ */\r\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Cuda/containers/device_memory_impl.hpp",
    "content": "/*\r\n * Software License Agreement (BSD License)\r\n *\r\n *  Copyright (c) 2011, Willow Garage, Inc.\r\n *  All rights reserved.\r\n *\r\n *  Redistribution and use in source and binary forms, with or without\r\n *  modification, are permitted provided that the following conditions\r\n *  are met:\r\n *\r\n *   * Redistributions of source code must retain the above copyright\r\n *     notice, this list of conditions and the following disclaimer.\r\n *   * Redistributions in binary form must reproduce the above\r\n *     copyright notice, this list of conditions and the following\r\n *     disclaimer in the documentation and/or other materials provided\r\n *     with the distribution.\r\n *   * Neither the name of Willow Garage, Inc. nor the names of its\r\n *     contributors may be used to endorse or promote products derived\r\n *     from this software without specific prior written permission.\r\n *\r\n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r\n *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\r\n *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\r\n *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\r\n *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r\n *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r\n *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\r\n *  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r\n *  POSSIBILITY OF SUCH DAMAGE.\r\n *\r\n *  Author: Anatoly Baskeheev, Itseez Ltd, (myname.mysurname@mycompany.com)\r\n */\r\n\r\n#ifndef DEVICE_MEMORY_IMPL_HPP_\r\n#define DEVICE_MEMORY_IMPL_HPP_\r\n\r\n/////////////////////  Inline implementations of DeviceMemory ////////////////////////////////////////////\r\n\r\ntemplate<class T> inline       T* DeviceMemory::ptr()       { return (      T*)data_; }\r\ntemplate<class T> inline const T* DeviceMemory::ptr() const { return (const T*)data_; }\r\n                        \r\ntemplate <class U> inline DeviceMemory::operator PtrSz<U>() const\r\n{\r\n    PtrSz<U> result;\r\n    result.data = (U*)ptr<U>();\r\n    result.size = sizeBytes_/sizeof(U);\r\n    return result; \r\n}\r\n\r\n/////////////////////  Inline implementations of DeviceMemory2D ////////////////////////////////////////////\r\n               \r\ntemplate<class T>        T* DeviceMemory2D::ptr(int y_arg)       { return (      T*)((      char*)data_ + y_arg * step_); }\r\ntemplate<class T>  const T* DeviceMemory2D::ptr(int y_arg) const { return (const T*)((const char*)data_ + y_arg * step_); }\r\n  \r\ntemplate <class U> DeviceMemory2D::operator PtrStep<U>() const\r\n{\r\n    PtrStep<U> result;\r\n    result.data = (U*)ptr<U>();\r\n    result.step = step_;\r\n    return result;\r\n}\r\n\r\ntemplate <class U> DeviceMemory2D::operator PtrStepSz<U>() const\r\n{\r\n    PtrStepSz<U> result;\r\n    result.data = (U*)ptr<U>();\r\n    result.step = step_;\r\n    result.cols = colsBytes_/sizeof(U);\r\n    result.rows = rows_;\r\n    return result;\r\n}\r\n\r\n#endif /* DEVICE_MEMORY_IMPL_HPP_ */\r\n\r\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Cuda/containers/kernel_containers.hpp",
    "content": "/*\r\n * Software License Agreement (BSD License)\r\n *\r\n *  Copyright (c) 2011, Willow Garage, Inc.\r\n *  All rights reserved.\r\n *\r\n *  Redistribution and use in source and binary forms, with or without\r\n *  modification, are permitted provided that the following conditions\r\n *  are met:\r\n *\r\n *   * Redistributions of source code must retain the above copyright\r\n *     notice, this list of conditions and the following disclaimer.\r\n *   * Redistributions in binary form must reproduce the above\r\n *     copyright notice, this list of conditions and the following\r\n *     disclaimer in the documentation and/or other materials provided\r\n *     with the distribution.\r\n *   * Neither the name of Willow Garage, Inc. nor the names of its\r\n *     contributors may be used to endorse or promote products derived\r\n *     from this software without specific prior written permission.\r\n *\r\n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\r\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\r\n *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\r\n *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\r\n *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\r\n *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\r\n *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\r\n *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\r\n *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\r\n *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\r\n *  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\r\n *  POSSIBILITY OF SUCH DAMAGE.\r\n *\r\n *  Author: Anatoly Baskeheev, Itseez Ltd, (myname.mysurname@mycompany.com)\r\n */\r\n\r\n\r\n#ifndef KERNEL_CONTAINERS_HPP_\r\n#define KERNEL_CONTAINERS_HPP_\r\n\r\n#include <cstddef>\r\n\r\n#if defined(__CUDACC__)\r\n    #define GPU_HOST_DEVICE__ __host__ __device__ __forceinline__\r\n#else\r\n    #define GPU_HOST_DEVICE__\r\n#endif\r\n\r\ntemplate<typename T> struct DevPtr\r\n{\r\n    typedef T elem_type;\r\n    const static size_t elem_size = sizeof(elem_type);\r\n\r\n    T* data;\r\n\r\n    GPU_HOST_DEVICE__ DevPtr() : data(0) {}\r\n    GPU_HOST_DEVICE__ DevPtr(T* data_arg) : data(data_arg) {}\r\n\r\n    GPU_HOST_DEVICE__ size_t elemSize() const { return elem_size; }\r\n    GPU_HOST_DEVICE__ operator       T*()       { return data; }\r\n    GPU_HOST_DEVICE__ operator const T*() const { return data; }\r\n};\r\n\r\ntemplate<typename T> struct PtrSz : public DevPtr<T>\r\n{\r\n    GPU_HOST_DEVICE__ PtrSz() : size(0) {}\r\n    GPU_HOST_DEVICE__ PtrSz(T* data_arg, size_t size_arg) : DevPtr<T>(data_arg), size(size_arg) {}\r\n\r\n    size_t size;\r\n};\r\n\r\ntemplate<typename T>  struct PtrStep : public DevPtr<T>\r\n{\r\n    GPU_HOST_DEVICE__ PtrStep() : step(0) {}\r\n    GPU_HOST_DEVICE__ PtrStep(T* data_arg, size_t step_arg) : DevPtr<T>(data_arg), step(step_arg) {}\r\n\r\n    /** \\brief stride between two consecutive rows in bytes. Step is stored always and everywhere in bytes!!! */\r\n    size_t step;\r\n\r\n    GPU_HOST_DEVICE__       T* ptr(int y = 0)       { return (      T*)( (      char*)DevPtr<T>::data + y * step); }\r\n    GPU_HOST_DEVICE__ const T* ptr(int y = 0) const { return (const T*)( (const char*)DevPtr<T>::data + y * step); }\r\n};\r\n\r\ntemplate <typename T> struct PtrStepSz : public PtrStep<T>\r\n{\r\n    GPU_HOST_DEVICE__ PtrStepSz() : cols(0), rows(0) {}\r\n    GPU_HOST_DEVICE__ PtrStepSz(int rows_arg, int cols_arg, T* data_arg, size_t step_arg)\r\n        : PtrStep<T>(data_arg, step_arg), cols(cols_arg), rows(rows_arg) {}\r\n\r\n    int cols;\r\n    int rows;\r\n};\r\n\r\n#endif /* KERNEL_CONTAINERS_HPP_ */\r\n\r\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Cuda/convenience.cuh",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n * Software License Agreement (BSD License)\n *\n *  Copyright (c) 2011, Willow Garage, Inc.\n *  All rights reserved.\n *\n *  Redistribution and use in source and binary forms, with or without\n *  modification, are permitted provided that the following conditions\n *  are met:\n *\n *   * Redistributions of source code must retain the above copyright\n *     notice, this list of conditions and the following disclaimer.\n *   * Redistributions in binary form must reproduce the above\n *     copyright notice, this list of conditions and the following\n *     disclaimer in the documentation and/or other materials provided\n *     with the distribution.\n *   * Neither the name of Willow Garage, Inc. nor the names of its\n *     contributors may be used to endorse or promote products derived\n *     from this software without specific prior written permission.\n *\n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n *  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n *  POSSIBILITY OF SUCH DAMAGE.\n *\n *  Author: Anatoly Baskeheev, Itseez Ltd, (myname.mysurname@mycompany.com)\n */\n\n#ifndef CUDA_CONVENIENCE_CUH_\n#define CUDA_CONVENIENCE_CUH_\n\n#include <cuda_runtime_api.h>\n#include <cstdlib>\n#include <iostream>\n\nstatic inline int getGridDim(int x, int y)\n{\n    return (x + y - 1) / y;\n}\n\nstatic inline void cudaSafeCall(cudaError_t err)\n{\n    if(cudaSuccess != err)\n    {\n        std::cout << \"Error: \" << cudaGetErrorString(err) << \": \" << __FILE__ << \":\" << __LINE__ << std::endl;\n        exit(0);\n    }\n}\n\n#endif /* CUDA_CONVENIENCE_CUH_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Cuda/cudafuncs.cu",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n * Software License Agreement (BSD License)\n *\n *  Copyright (c) 2011, Willow Garage, Inc.\n *  All rights reserved.\n *\n *  Redistribution and use in source and binary forms, with or without\n *  modification, are permitted provided that the following conditions\n *  are met:\n *\n *   * Redistributions of source code must retain the above copyright\n *     notice, this list of conditions and the following disclaimer.\n *   * Redistributions in binary form must reproduce the above\n *     copyright notice, this list of conditions and the following\n *     disclaimer in the documentation and/or other materials provided\n *     with the distribution.\n *   * Neither the name of Willow Garage, Inc. nor the names of its\n *     contributors may be used to endorse or promote products derived\n *     from this software without specific prior written permission.\n *\n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n *  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n *  POSSIBILITY OF SUCH DAMAGE.\n *\n *  Author: Anatoly Baskeheev, Itseez Ltd, (myname.mysurname@mycompany.com)\n */\n\n#include \"cudafuncs.cuh\"\n#include \"convenience.cuh\"\n#include \"operators.cuh\"\n\n\n__global__ void pyrDownGaussKernel (const PtrStepSz<unsigned short> src, PtrStepSz<unsigned short> dst, float sigma_color)\n{\n    int x = blockIdx.x * blockDim.x + threadIdx.x;\n    int y = blockIdx.y * blockDim.y + threadIdx.y;\n\n    if (x >= dst.cols || y >= dst.rows)\n        return;\n\n    const int D = 5;\n\n    int center = src.ptr (2 * y)[2 * x];\n\n    int x_mi = max(0, 2*x - D/2) - 2*x;\n    int y_mi = max(0, 2*y - D/2) - 2*y;\n\n    int x_ma = min(src.cols, 2*x -D/2+D) - 2*x;\n    int y_ma = min(src.rows, 2*y -D/2+D) - 2*y;\n\n    float sum = 0;\n    float wall = 0;\n\n    float weights[] = {0.375f, 0.25f, 0.0625f} ;\n\n    for(int yi = y_mi; yi < y_ma; ++yi)\n        for(int xi = x_mi; xi < x_ma; ++xi)\n        {\n            int val = src.ptr (2*y + yi)[2*x + xi];\n\n            if (abs (val - center) < 3 * sigma_color)\n            {\n                sum += val * weights[abs(xi)] * weights[abs(yi)];\n                wall += weights[abs(xi)] * weights[abs(yi)];\n            }\n        }\n\n\n    dst.ptr (y)[x] = static_cast<int>(sum /wall);\n}\n\nvoid pyrDown(const DeviceArray2D<unsigned short> & src, DeviceArray2D<unsigned short> & dst)\n{\n    dst.create (src.rows () / 2, src.cols () / 2);\n\n    dim3 block (32, 8);\n    dim3 grid (getGridDim (dst.cols (), block.x), getGridDim (dst.rows (), block.y));\n\n    const float sigma_color = 30;\n\n    pyrDownGaussKernel<<<grid, block>>>(src, dst, sigma_color);\n    cudaSafeCall ( cudaGetLastError () );\n};\n\n__global__ void computeVmapKernel(const PtrStepSz<unsigned short> depth, PtrStep<float> vmap, float fx_inv, float fy_inv, float cx, float cy, float depthCutoff)\n{\n    int u = threadIdx.x + blockIdx.x * blockDim.x;\n    int v = threadIdx.y + blockIdx.y * blockDim.y;\n\n    if(u < depth.cols && v < depth.rows)\n    {\n        float z = depth.ptr (v)[u] / 1000.f; // load and convert: mm -> meters\n\n        if(z != 0 && z < depthCutoff)\n        {\n            float vx = z * (u - cx) * fx_inv;\n            float vy = z * (v - cy) * fy_inv;\n            float vz = z;\n\n            vmap.ptr (v                 )[u] = vx;\n            vmap.ptr (v + depth.rows    )[u] = vy;\n            vmap.ptr (v + depth.rows * 2)[u] = vz;\n        }\n        else\n        {\n            vmap.ptr (v)[u] = __int_as_float(0x7fffffff); /*CUDART_NAN_F*/\n        }\n    }\n}\n\nvoid createVMap(const CameraModel& intr, const DeviceArray2D<unsigned short> & depth, DeviceArray2D<float> & vmap, const float depthCutoff)\n{\n    vmap.create (depth.rows () * 3, depth.cols ());\n\n    dim3 block (32, 8);\n    dim3 grid (1, 1, 1);\n    grid.x = getGridDim (depth.cols (), block.x);\n    grid.y = getGridDim (depth.rows (), block.y);\n\n    float fx = intr.fx, cx = intr.cx;\n    float fy = intr.fy, cy = intr.cy;\n\n    computeVmapKernel<<<grid, block>>>(depth, vmap, 1.f / fx, 1.f / fy, cx, cy, depthCutoff);\n    cudaSafeCall (cudaGetLastError ());\n}\n\n__global__ void computeNmapKernel(int rows, int cols, const PtrStep<float> vmap, PtrStep<float> nmap)\n{\n    int u = threadIdx.x + blockIdx.x * blockDim.x;\n    int v = threadIdx.y + blockIdx.y * blockDim.y;\n\n    if (u >= cols || v >= rows)\n        return;\n\n    if (u == cols - 1 || v == rows - 1)\n    {\n        nmap.ptr (v)[u] = __int_as_float(0x7fffffff); /*CUDART_NAN_F*/\n        return;\n    }\n\n    float3 v00, v01, v10;\n    v00.x = vmap.ptr (v  )[u];\n    v01.x = vmap.ptr (v  )[u + 1];\n    v10.x = vmap.ptr (v + 1)[u];\n\n    if (!isnan (v00.x) && !isnan (v01.x) && !isnan (v10.x))\n    {\n        v00.y = vmap.ptr (v + rows)[u];\n        v01.y = vmap.ptr (v + rows)[u + 1];\n        v10.y = vmap.ptr (v + 1 + rows)[u];\n\n        v00.z = vmap.ptr (v + 2 * rows)[u];\n        v01.z = vmap.ptr (v + 2 * rows)[u + 1];\n        v10.z = vmap.ptr (v + 1 + 2 * rows)[u];\n\n        float3 r = normalized (cross (v01 - v00, v10 - v00));\n\n        nmap.ptr (v       )[u] = r.x;\n        nmap.ptr (v + rows)[u] = r.y;\n        nmap.ptr (v + 2 * rows)[u] = r.z;\n    }\n    else\n        nmap.ptr (v)[u] = __int_as_float(0x7fffffff); /*CUDART_NAN_F*/\n}\n\nvoid createNMap(const DeviceArray2D<float>& vmap, DeviceArray2D<float>& nmap)\n{\n    nmap.create (vmap.rows (), vmap.cols ());\n\n    int rows = vmap.rows () / 3;\n    int cols = vmap.cols ();\n\n    dim3 block (32, 8);\n    dim3 grid (1, 1, 1);\n    grid.x = getGridDim (cols, block.x);\n    grid.y = getGridDim (rows, block.y);\n\n    computeNmapKernel<<<grid, block>>>(rows, cols, vmap, nmap);\n    cudaSafeCall (cudaGetLastError ());\n}\n\n__global__ void tranformMapsKernel(int rows, int cols, const PtrStep<float> vmap_src, const PtrStep<float> nmap_src,\n                                   const mat33 Rmat, const float3 tvec, PtrStepSz<float> vmap_dst, PtrStep<float> nmap_dst)\n{\n    int x = threadIdx.x + blockIdx.x * blockDim.x;\n    int y = threadIdx.y + blockIdx.y * blockDim.y;\n\n    if (x < cols && y < rows)\n    {\n        //vertexes\n        float3 vsrc, vdst = make_float3 (__int_as_float(0x7fffffff), __int_as_float(0x7fffffff), __int_as_float(0x7fffffff));\n        vsrc.x = vmap_src.ptr (y)[x];\n\n        if (!isnan (vsrc.x))\n        {\n            vsrc.y = vmap_src.ptr (y + rows)[x];\n            vsrc.z = vmap_src.ptr (y + 2 * rows)[x];\n\n            vdst = Rmat * vsrc + tvec;\n\n            vmap_dst.ptr (y + rows)[x] = vdst.y;\n            vmap_dst.ptr (y + 2 * rows)[x] = vdst.z;\n        }\n\n        vmap_dst.ptr (y)[x] = vdst.x;\n\n        //normals\n        float3 nsrc, ndst = make_float3 (__int_as_float(0x7fffffff), __int_as_float(0x7fffffff), __int_as_float(0x7fffffff));\n        nsrc.x = nmap_src.ptr (y)[x];\n\n        if (!isnan (nsrc.x))\n        {\n            nsrc.y = nmap_src.ptr (y + rows)[x];\n            nsrc.z = nmap_src.ptr (y + 2 * rows)[x];\n\n            ndst = Rmat * nsrc;\n\n            nmap_dst.ptr (y + rows)[x] = ndst.y;\n            nmap_dst.ptr (y + 2 * rows)[x] = ndst.z;\n        }\n\n        nmap_dst.ptr (y)[x] = ndst.x;\n    }\n}\n\nvoid tranformMaps(const DeviceArray2D<float>& vmap_src,\n                  const DeviceArray2D<float>& nmap_src,\n                  const mat33& Rmat, const float3& tvec,\n                  DeviceArray2D<float>& vmap_dst, DeviceArray2D<float>& nmap_dst)\n{\n    int cols = vmap_src.cols();\n    int rows = vmap_src.rows() / 3;\n\n    vmap_dst.create(rows * 3, cols);\n    nmap_dst.create(rows * 3, cols);\n\n    dim3 block(32, 8);\n    dim3 grid(1, 1, 1);\n    grid.x = getGridDim(cols, block.x);\n    grid.y = getGridDim(rows, block.y);\n\n    tranformMapsKernel<<<grid, block>>>(rows, cols, vmap_src, nmap_src, Rmat, tvec, vmap_dst, nmap_dst);\n    cudaSafeCall(cudaGetLastError());\n}\n\n__global__ void copyMapsKernel(int rows, int cols, const float * vmap_src, const float * nmap_src,\n                               PtrStepSz<float> vmap_dst, PtrStep<float> nmap_dst)\n{\n    int x = threadIdx.x + blockIdx.x * blockDim.x;\n    int y = threadIdx.y + blockIdx.y * blockDim.y;\n\n    if (x < cols && y < rows)\n    {\n        //vertexes\n        float3 vsrc, vdst = make_float3 (__int_as_float(0x7fffffff), __int_as_float(0x7fffffff), __int_as_float(0x7fffffff));\n\n        vsrc.x = vmap_src[y * cols * 4 + (x * 4) + 0];\n        vsrc.y = vmap_src[y * cols * 4 + (x * 4) + 1];\n        vsrc.z = vmap_src[y * cols * 4 + (x * 4) + 2];\n\n        if(!(vsrc.z == 0))\n        {\n            vdst = vsrc;\n        }\n\n        vmap_dst.ptr (y)[x] = vdst.x;\n        vmap_dst.ptr (y + rows)[x] = vdst.y;\n        vmap_dst.ptr (y + 2 * rows)[x] = vdst.z;\n\n        //normals\n        float3 nsrc, ndst = make_float3 (__int_as_float(0x7fffffff), __int_as_float(0x7fffffff), __int_as_float(0x7fffffff));\n\n        nsrc.x = nmap_src[y * cols * 4 + (x * 4) + 0];\n        nsrc.y = nmap_src[y * cols * 4 + (x * 4) + 1];\n        nsrc.z = nmap_src[y * cols * 4 + (x * 4) + 2];\n\n        if(!(vsrc.z == 0))\n        {\n            ndst = nsrc;\n        }\n\n        nmap_dst.ptr (y)[x] = ndst.x;\n        nmap_dst.ptr (y + rows)[x] = ndst.y;\n        nmap_dst.ptr (y + 2 * rows)[x] = ndst.z;\n    }\n}\n\nvoid copyMaps(const DeviceArray<float>& vmap_src,\n              const DeviceArray<float>& nmap_src,\n              DeviceArray2D<float>& vmap_dst,\n              DeviceArray2D<float>& nmap_dst)\n{\n    int cols = vmap_dst.cols();\n    int rows = vmap_dst.rows() / 3;\n\n    vmap_dst.create(rows * 3, cols);\n    nmap_dst.create(rows * 3, cols);\n\n    dim3 block(32, 8);\n    dim3 grid(1, 1, 1);\n    grid.x = getGridDim(cols, block.x);\n    grid.y = getGridDim(rows, block.y);\n\n    copyMapsKernel<<<grid, block>>>(rows, cols, vmap_src, nmap_src, vmap_dst, nmap_dst);\n    cudaSafeCall(cudaGetLastError());\n}\n\n__global__ void pyrDownKernelGaussF(const PtrStepSz<float> src, PtrStepSz<float> dst, float * gaussKernel)\n{\n    int x = blockIdx.x * blockDim.x + threadIdx.x;\n    int y = blockIdx.y * blockDim.y + threadIdx.y;\n\n    if (x >= dst.cols || y >= dst.rows)\n        return;\n\n    const int D = 5;\n\n    float center = src.ptr (2 * y)[2 * x];\n\n    int tx = min (2 * x - D / 2 + D, src.cols - 1);\n    int ty = min (2 * y - D / 2 + D, src.rows - 1);\n    int cy = max (0, 2 * y - D / 2);\n\n    float sum = 0;\n    int count = 0;\n\n    for (; cy < ty; ++cy)\n    {\n        for (int cx = max (0, 2 * x - D / 2); cx < tx; ++cx)\n        {\n            if(!isnan(src.ptr (cy)[cx]))\n            {\n                sum += src.ptr (cy)[cx] * gaussKernel[(ty - cy - 1) * 5 + (tx - cx - 1)];\n                count += gaussKernel[(ty - cy - 1) * 5 + (tx - cx - 1)];\n            }\n        }\n    }\n    dst.ptr (y)[x] = (float)(sum / (float)count);\n}\n\ntemplate<bool normalize>\n__global__ void resizeMapKernel(int drows, int dcols, int srows, const PtrStep<float> input, PtrStep<float> output)\n{\n    int x = threadIdx.x + blockIdx.x * blockDim.x;\n    int y = threadIdx.y + blockIdx.y * blockDim.y;\n\n    if (x >= dcols || y >= drows)\n        return;\n\n    const float qnan = __int_as_float(0x7fffffff);\n\n    int xs = x * 2;\n    int ys = y * 2;\n\n    float x00 = input.ptr (ys + 0)[xs + 0];\n    float x01 = input.ptr (ys + 0)[xs + 1];\n    float x10 = input.ptr (ys + 1)[xs + 0];\n    float x11 = input.ptr (ys + 1)[xs + 1];\n\n    if (isnan (x00) || isnan (x01) || isnan (x10) || isnan (x11))\n    {\n        output.ptr (y)[x] = qnan;\n        return;\n    }\n    else\n    {\n        float3 n;\n\n        n.x = (x00 + x01 + x10 + x11) / 4;\n\n        float y00 = input.ptr (ys + srows + 0)[xs + 0];\n        float y01 = input.ptr (ys + srows + 0)[xs + 1];\n        float y10 = input.ptr (ys + srows + 1)[xs + 0];\n        float y11 = input.ptr (ys + srows + 1)[xs + 1];\n\n        n.y = (y00 + y01 + y10 + y11) / 4;\n\n        float z00 = input.ptr (ys + 2 * srows + 0)[xs + 0];\n        float z01 = input.ptr (ys + 2 * srows + 0)[xs + 1];\n        float z10 = input.ptr (ys + 2 * srows + 1)[xs + 0];\n        float z11 = input.ptr (ys + 2 * srows + 1)[xs + 1];\n\n        n.z = (z00 + z01 + z10 + z11) / 4;\n\n        if (normalize)\n            n = normalized (n);\n\n        output.ptr (y        )[x] = n.x;\n        output.ptr (y + drows)[x] = n.y;\n        output.ptr (y + 2 * drows)[x] = n.z;\n    }\n}\n\ntemplate<bool normalize>\nvoid resizeMap(const DeviceArray2D<float>& input, DeviceArray2D<float>& output)\n{\n    int in_cols = input.cols ();\n    int in_rows = input.rows () / 3;\n\n    int out_cols = in_cols / 2;\n    int out_rows = in_rows / 2;\n\n    output.create (out_rows * 3, out_cols);\n\n    dim3 block (32, 8);\n    dim3 grid (getGridDim (out_cols, block.x), getGridDim (out_rows, block.y));\n    resizeMapKernel<normalize><< < grid, block>>>(out_rows, out_cols, in_rows, input, output);\n    cudaSafeCall ( cudaGetLastError () );\n    cudaSafeCall (cudaDeviceSynchronize ());\n}\n\nvoid resizeVMap(const DeviceArray2D<float>& input, DeviceArray2D<float>& output)\n{\n    resizeMap<false>(input, output);\n}\n\nvoid resizeNMap(const DeviceArray2D<float>& input, DeviceArray2D<float>& output)\n{\n    resizeMap<true>(input, output);\n}\n\nvoid pyrDownGaussF(const DeviceArray2D<float>& src, DeviceArray2D<float> & dst)\n{\n    dst.create (src.rows () / 2, src.cols () / 2);\n\n    dim3 block (32, 8);\n    dim3 grid (getGridDim (dst.cols (), block.x), getGridDim (dst.rows (), block.y));\n\n    const float gaussKernel[25] = {1, 4, 6, 4, 1,\n                    4, 16, 24, 16, 4,\n                    6, 24, 36, 24, 6,\n                    4, 16, 24, 16, 4,\n                    1, 4, 6, 4, 1};\n\n    float * gauss_cuda;\n\n    cudaMalloc((void**) &gauss_cuda, sizeof(float) * 25);\n    cudaMemcpy(gauss_cuda, &gaussKernel[0], sizeof(float) * 25, cudaMemcpyHostToDevice);\n\n    pyrDownKernelGaussF<<<grid, block>>>(src, dst, gauss_cuda);\n    cudaSafeCall ( cudaGetLastError () );\n\n    cudaFree(gauss_cuda);\n};\n\n__global__ void pyrDownKernelIntensityGauss(const PtrStepSz<unsigned char> src, PtrStepSz<unsigned char> dst, float * gaussKernel)\n{\n    int x = blockIdx.x * blockDim.x + threadIdx.x;\n    int y = blockIdx.y * blockDim.y + threadIdx.y;\n\n    if (x >= dst.cols || y >= dst.rows)\n        return;\n\n    const int D = 5;\n\n    int center = src.ptr (2 * y)[2 * x];\n\n    int tx = min (2 * x - D / 2 + D, src.cols - 1);\n    int ty = min (2 * y - D / 2 + D, src.rows - 1);\n    int cy = max (0, 2 * y - D / 2);\n\n    float sum = 0;\n    int count = 0;\n\n    for (; cy < ty; ++cy)\n        for (int cx = max (0, 2 * x - D / 2); cx < tx; ++cx)\n        {\n            //This might not be right, but it stops incomplete model images from making up colors\n            if(src.ptr (cy)[cx] > 0)\n            {\n                sum += src.ptr (cy)[cx] * gaussKernel[(ty - cy - 1) * 5 + (tx - cx - 1)];\n                count += gaussKernel[(ty - cy - 1) * 5 + (tx - cx - 1)];\n            }\n        }\n    dst.ptr (y)[x] = (sum / (float)count);\n}\n\nvoid pyrDownUcharGauss(const DeviceArray2D<unsigned char>& src, DeviceArray2D<unsigned char> & dst)\n{\n    dst.create (src.rows () / 2, src.cols () / 2);\n\n    dim3 block (32, 8);\n    dim3 grid (getGridDim (dst.cols (), block.x), getGridDim (dst.rows (), block.y));\n\n    const float gaussKernel[25] = {1, 4, 6, 4, 1,\n                    4, 16, 24, 16, 4,\n                    6, 24, 36, 24, 6,\n                    4, 16, 24, 16, 4,\n                    1, 4, 6, 4, 1};\n\n    float * gauss_cuda;\n\n    cudaMalloc((void**) &gauss_cuda, sizeof(float) * 25);\n    cudaMemcpy(gauss_cuda, &gaussKernel[0], sizeof(float) * 25, cudaMemcpyHostToDevice);\n\n    pyrDownKernelIntensityGauss<<<grid, block>>>(src, dst, gauss_cuda);\n    cudaSafeCall ( cudaGetLastError () );\n\n    cudaFree(gauss_cuda);\n};\n\n__global__ void verticesToDepthKernel(const float * vmap_src, PtrStepSz<float> dst, float cutOff)\n{\n    int x = blockIdx.x * blockDim.x + threadIdx.x;\n    int y = blockIdx.y * blockDim.y + threadIdx.y;\n\n    if (x >= dst.cols || y >= dst.rows)\n        return;\n\n    float z = vmap_src[y * dst.cols * 4 + (x * 4) + 2];\n\n    dst.ptr(y)[x] = z > cutOff || z <= 0 ? __int_as_float(0x7fffffff)/*CUDART_NAN_F*/ : z;\n}\n\nvoid verticesToDepth(DeviceArray<float>& vmap_src, DeviceArray2D<float> & dst, float cutOff)\n{\n    dim3 block (32, 8);\n    dim3 grid (getGridDim (dst.cols (), block.x), getGridDim (dst.rows (), block.y));\n\n    verticesToDepthKernel<<<grid, block>>>(vmap_src, dst, cutOff);\n    cudaSafeCall ( cudaGetLastError () );\n};\n\ntexture<uchar4, 2, cudaReadModeElementType> inTex;\n\n__global__ void bgr2IntensityKernel(PtrStepSz<unsigned char> dst)\n{\n    int x = blockIdx.x * blockDim.x + threadIdx.x;\n    int y = blockIdx.y * blockDim.y + threadIdx.y;\n\n    if (x >= dst.cols || y >= dst.rows)\n        return;\n\n    uchar4 src = tex2D(inTex, x, y);\n\n    int value = (float)src.x * 0.114f + (float)src.y * 0.299f + (float)src.z * 0.587f;\n\n    dst.ptr (y)[x] = value;\n}\n\nvoid imageBGRToIntensity(cudaArray * cuArr, DeviceArray2D<unsigned char> & dst)\n{\n    dim3 block (32, 8);\n    dim3 grid (getGridDim (dst.cols (), block.x), getGridDim (dst.rows (), block.y));\n\n    cudaSafeCall(cudaBindTextureToArray(inTex, cuArr));\n\n    bgr2IntensityKernel<<<grid, block>>>(dst);\n\n    cudaSafeCall(cudaGetLastError());\n\n    cudaSafeCall(cudaUnbindTexture(inTex));\n};\n\n__constant__ float gsobel_x3x3[9];\n__constant__ float gsobel_y3x3[9];\n\n__global__ void applyKernel(const PtrStepSz<unsigned char> src, PtrStep<short> dx, PtrStep<short> dy)\n{\n  int x = threadIdx.x + blockIdx.x * blockDim.x;\n  int y = threadIdx.y + blockIdx.y * blockDim.y;\n\n  if(x >= src.cols || y >= src.rows)\n    return;\n\n  float dxVal = 0;\n  float dyVal = 0;\n\n  int kernelIndex = 8;\n  for(int j = max(y - 1, 0); j <= min(y + 1, src.rows - 1); j++)\n  {\n      for(int i = max(x - 1, 0); i <= min(x + 1, src.cols - 1); i++)\n      {\n          dxVal += (float)src.ptr(j)[i] * gsobel_x3x3[kernelIndex];\n          dyVal += (float)src.ptr(j)[i] * gsobel_y3x3[kernelIndex];\n          --kernelIndex;\n      }\n  }\n\n  dx.ptr(y)[x] = dxVal;\n  dy.ptr(y)[x] = dyVal;\n}\n\nvoid computeDerivativeImages(DeviceArray2D<unsigned char>& src, DeviceArray2D<short>& dx, DeviceArray2D<short>& dy)\n{\n    static bool once = false;\n\n    if(!once)\n    {\n        float gsx3x3[9] = {0.52201,  0.00000, -0.52201,\n                           0.79451, -0.00000, -0.79451,\n                           0.52201,  0.00000, -0.52201};\n\n        float gsy3x3[9] = {0.52201, 0.79451, 0.52201,\n                           0.00000, 0.00000, 0.00000,\n                           -0.52201, -0.79451, -0.52201};\n\n        cudaMemcpyToSymbol(gsobel_x3x3, gsx3x3, sizeof(float) * 9);\n        cudaMemcpyToSymbol(gsobel_y3x3, gsy3x3, sizeof(float) * 9);\n\n        cudaSafeCall(cudaGetLastError());\n        cudaSafeCall(cudaDeviceSynchronize());\n\n        once = true;\n    }\n\n    dim3 block(32, 8);\n    dim3 grid(getGridDim (src.cols (), block.x), getGridDim (src.rows (), block.y));\n\n    applyKernel<<<grid, block>>>(src, dx, dy);\n\n    cudaSafeCall(cudaGetLastError());\n    cudaSafeCall(cudaDeviceSynchronize());\n}\n\n__global__ void projectPointsKernel(const PtrStepSz<float> depth,\n                                    PtrStepSz<float3> cloud,\n                                    const float invFx,\n                                    const float invFy,\n                                    const float cx,\n                                    const float cy)\n{\n    int x = threadIdx.x + blockIdx.x * blockDim.x;\n    int y = threadIdx.y + blockIdx.y * blockDim.y;\n\n    if (x >= depth.cols || y >= depth.rows)\n        return;\n\n    float z = depth.ptr(y)[x];\n\n    cloud.ptr(y)[x].x = (float)((x - cx) * z * invFx);\n    cloud.ptr(y)[x].y = (float)((y - cy) * z * invFy);\n    cloud.ptr(y)[x].z = z;\n}\n\nvoid projectToPointCloud(const DeviceArray2D<float> & depth,\n                         const DeviceArray2D<float3> & cloud,\n                         CameraModel & intrinsics,\n                         const int & level)\n{\n    dim3 block (32, 8);\n    dim3 grid (getGridDim (depth.cols (), block.x), getGridDim (depth.rows (), block.y));\n\n    CameraModel intrinsicsLevel = intrinsics(level);\n\n    projectPointsKernel<<<grid, block>>>(depth, cloud, 1.0f / intrinsicsLevel.fx, 1.0f / intrinsicsLevel.fy, intrinsicsLevel.cx, intrinsicsLevel.cy);\n    cudaSafeCall ( cudaGetLastError () );\n    cudaSafeCall (cudaDeviceSynchronize ());\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Cuda/cudafuncs.cuh",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n * Software License Agreement (BSD License)\n *\n *  Copyright (c) 2011, Willow Garage, Inc.\n *  All rights reserved.\n *\n *  Redistribution and use in source and binary forms, with or without\n *  modification, are permitted provided that the following conditions\n *  are met:\n *\n *   * Redistributions of source code must retain the above copyright\n *     notice, this list of conditions and the following disclaimer.\n *   * Redistributions in binary form must reproduce the above\n *     copyright notice, this list of conditions and the following\n *     disclaimer in the documentation and/or other materials provided\n *     with the distribution.\n *   * Neither the name of Willow Garage, Inc. nor the names of its\n *     contributors may be used to endorse or promote products derived\n *     from this software without specific prior written permission.\n *\n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n *  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n *  POSSIBILITY OF SUCH DAMAGE.\n *\n *  Author: Anatoly Baskeheev, Itseez Ltd, (myname.mysurname@mycompany.com)\n */\n\n#ifndef CUDA_CUDAFUNCS_CUH_\n#define CUDA_CUDAFUNCS_CUH_\n\n#if __CUDA_ARCH__ < 300\n#define MAX_THREADS 512\n#else\n#define MAX_THREADS 1024\n#endif\n\n#include \"containers/device_array.hpp\"\n#include \"types.cuh\"\n\nvoid icpStep(const mat33& Rcurr,\n             const float3& tcurr,\n             const DeviceArray2D<float>& vmap_curr,\n             const DeviceArray2D<float>& nmap_curr,\n             const mat33& Rprev_inv,\n             const float3& tprev,\n             const CameraModel& intr,\n             const DeviceArray2D<float>& vmap_g_prev,\n             const DeviceArray2D<float>& nmap_g_prev,\n             float distThres,\n             float angleThres,\n             DeviceArray<JtJJtrSE3> & sum,\n             DeviceArray<JtJJtrSE3> & out,\n             float * matrixA_host,\n             float * vectorB_host,\n             float * residual_host,\n             int threads,\n             int blocks);\n\nvoid rgbStep(const DeviceArray2D<DataTerm> & corresImg,\n             const float & sigma,\n             const DeviceArray2D<float3> & cloud,\n             const float & fx,\n             const float & fy,\n             const DeviceArray2D<short> & dIdx,\n             const DeviceArray2D<short> & dIdy,\n             const float & sobelScale,\n             DeviceArray<JtJJtrSE3> & sum,\n             DeviceArray<JtJJtrSE3> & out,\n             float * matrixA_host,\n             float * vectorB_host,\n             int threads,\n             int blocks);\n\nvoid so3Step(const DeviceArray2D<unsigned char> & lastImage,\n             const DeviceArray2D<unsigned char> & nextImage,\n             const mat33 & imageBasis,\n             const mat33 & kinv,\n             const mat33 & krlr,\n             DeviceArray<JtJJtrSO3> & sum,\n             DeviceArray<JtJJtrSO3> & out,\n             float * matrixA_host,\n             float * vectorB_host,\n             float * residual_host,\n             int threads,\n             int blocks);\n\nvoid computeRgbResidual(const float & minScale,\n                        const DeviceArray2D<short> & dIdx,\n                        const DeviceArray2D<short> & dIdy,\n                        const DeviceArray2D<float> & lastDepth,\n                        const DeviceArray2D<float> & nextDepth,\n                        const DeviceArray2D<unsigned char> & lastImage,\n                        const DeviceArray2D<unsigned char> & nextImage,\n                        DeviceArray2D<DataTerm> & corresImg,\n                        DeviceArray<int2> & sumResidual,\n                        const float maxDepthDelta,\n                        const float3 & kt,\n                        const mat33 & krkinv,\n                        int & sigmaSum,\n                        int & count,\n                        int threads,\n                        int blocks);\n\nvoid createVMap(const CameraModel& intr,\n                const DeviceArray2D<unsigned short> & depth,\n                DeviceArray2D<float> & vmap,\n                const float depthCutoff);\n\nvoid createNMap(const DeviceArray2D<float>& vmap,\n                DeviceArray2D<float>& nmap);\n\nvoid tranformMaps(const DeviceArray2D<float>& vmap_src,\n                  const DeviceArray2D<float>& nmap_src,\n                  const mat33& Rmat,\n                  const float3& tvec,\n                  DeviceArray2D<float>& vmap_dst,\n                  DeviceArray2D<float>& nmap_dst);\n\nvoid copyMaps(const DeviceArray<float>& vmap_src,\n              const DeviceArray<float>& nmap_src,\n              DeviceArray2D<float>& vmap_dst,\n              DeviceArray2D<float>& nmap_dst);\n\nvoid resizeVMap(const DeviceArray2D<float>& input,\n                DeviceArray2D<float>& output);\n\nvoid resizeNMap(const DeviceArray2D<float>& input,\n                DeviceArray2D<float>& output);\n\nvoid imageBGRToIntensity(cudaArray * cuArr,\n                         DeviceArray2D<unsigned char> & dst);\n\nvoid verticesToDepth(DeviceArray<float>& vmap_src,\n                     DeviceArray2D<float> & dst,\n                     float cutOff);\n\nvoid projectToPointCloud(const DeviceArray2D<float> & depth,\n                         const DeviceArray2D<float3> & cloud,\n                         CameraModel & intrinsics,\n                         const int & level);\n\nvoid pyrDown(const DeviceArray2D<unsigned short> & src,\n             DeviceArray2D<unsigned short> & dst);\n\nvoid pyrDownGaussF(const DeviceArray2D<float> & src,\n                   DeviceArray2D<float> & dst);\n\nvoid pyrDownUcharGauss(const DeviceArray2D<unsigned char>& src,\n                       DeviceArray2D<unsigned char> & dst);\n\nvoid computeDerivativeImages(DeviceArray2D<unsigned char>& src,\n                             DeviceArray2D<short>& dx,\n                             DeviceArray2D<short>& dy);\n\n#endif /* CUDA_CUDAFUNCS_CUH_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Cuda/operators.cuh",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n * Software License Agreement (BSD License)\n *\n *  Copyright (c) 2011, Willow Garage, Inc.\n *  All rights reserved.\n *\n *  Redistribution and use in source and binary forms, with or without\n *  modification, are permitted provided that the following conditions\n *  are met:\n *\n *   * Redistributions of source code must retain the above copyright\n *     notice, this list of conditions and the following disclaimer.\n *   * Redistributions in binary form must reproduce the above\n *     copyright notice, this list of conditions and the following\n *     disclaimer in the documentation and/or other materials provided\n *     with the distribution.\n *   * Neither the name of Willow Garage, Inc. nor the names of its\n *     contributors may be used to endorse or promote products derived\n *     from this software without specific prior written permission.\n *\n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n *  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n *  POSSIBILITY OF SUCH DAMAGE.\n *\n *  Author: Anatoly Baskeheev, Itseez Ltd, (myname.mysurname@mycompany.com)\n */\n\n#include <vector_functions.h>\n\n#ifndef CUDA_OPERATORS_CUH_\n#define CUDA_OPERATORS_CUH_\n\n__device__ __host__ __forceinline__ float3 operator-(const float3& a, const float3& b)\n{\n    return make_float3(a.x - b.x, a.y - b.y, a.z - b.z);\n}\n\n__device__ __host__ __forceinline__ float3 operator+(const float3& a, const float3& b)\n{\n    return make_float3(a.x + b.x, a.y + b.y, a.z + b.z);\n}\n\n__device__ __host__ __forceinline__ float3 cross(const float3& a, const float3& b)\n{\n    return make_float3(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x);\n}\n\n__device__ __host__ __forceinline__ float dot(const float3& a, const float3& b)\n{\n    return a.x * b.x + a.y * b.y + a.z * b.z;\n}\n\n__device__ __host__ __forceinline__ float norm(const float3& a)\n{\n    return sqrtf(dot(a, a));\n}\n\n__device__ __host__ __forceinline__ float3 normalized(const float3& a)\n{\n    const float rn = rsqrtf(dot(a, a));\n    return make_float3(a.x * rn, a.y * rn, a.z * rn);\n}\n\n__device__ __forceinline__ float3 operator*(const mat33& m, const float3& a)\n{\n  return make_float3(dot(m.data[0], a), dot(m.data[1], a), dot(m.data[2], a));\n}\n\n#endif /* CUDA_OPERATORS_CUH_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Cuda/reduce.cu",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n * Software License Agreement (BSD License)\n *\n *  Copyright (c) 2011, Willow Garage, Inc.\n *  All rights reserved.\n *\n *  Redistribution and use in source and binary forms, with or without\n *  modification, are permitted provided that the following conditions\n *  are met:\n *\n *   * Redistributions of source code must retain the above copyright\n *     notice, this list of conditions and the following disclaimer.\n *   * Redistributions in binary form must reproduce the above\n *     copyright notice, this list of conditions and the following\n *     disclaimer in the documentation and/or other materials provided\n *     with the distribution.\n *   * Neither the name of Willow Garage, Inc. nor the names of its\n *     contributors may be used to endorse or promote products derived\n *     from this software without specific prior written permission.\n *\n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n *  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n *  POSSIBILITY OF SUCH DAMAGE.\n *\n *  Author: Anatoly Baskeheev, Itseez Ltd, (myname.mysurname@mycompany.com)\n */\n\n#include \"cudafuncs.cuh\"\n#include \"convenience.cuh\"\n#include \"operators.cuh\"\n\n#if __CUDA_ARCH__ < 300\n__inline__ __device__\nfloat __shfl_down(float val, int offset, int width = 32)\n{\n    static __shared__ float shared[MAX_THREADS];\n    int lane = threadIdx.x % 32;\n    shared[threadIdx.x] = val;\n    __syncthreads();\n    val = (lane + offset < width) ? shared[threadIdx.x + offset] : 0;\n    __syncthreads();\n    return val;\n}\n\n__inline__ __device__\nint __shfl_down(int val, int offset, int width = 32)\n{\n    static __shared__ int shared[MAX_THREADS];\n    int lane = threadIdx.x % 32;\n    shared[threadIdx.x] = val;\n    __syncthreads();\n    val = (lane + offset < width) ? shared[threadIdx.x + offset] : 0;\n    __syncthreads();\n    return val;\n}\n#endif\n\n#if __CUDA_ARCH__ < 350\ntemplate<typename T>\n__device__ __forceinline__ T __ldg(const T* ptr)\n{\n    return *ptr;\n}\n#endif\n\n__inline__  __device__ JtJJtrSE3 warpReduceSum(JtJJtrSE3 val)\n{\n    for(int offset = warpSize / 2; offset > 0; offset /= 2)\n    {\n        val.aa += __shfl_down(val.aa, offset);\n        val.ab += __shfl_down(val.ab, offset);\n        val.ac += __shfl_down(val.ac, offset);\n        val.ad += __shfl_down(val.ad, offset);\n        val.ae += __shfl_down(val.ae, offset);\n        val.af += __shfl_down(val.af, offset);\n        val.ag += __shfl_down(val.ag, offset);\n\n        val.bb += __shfl_down(val.bb, offset);\n        val.bc += __shfl_down(val.bc, offset);\n        val.bd += __shfl_down(val.bd, offset);\n        val.be += __shfl_down(val.be, offset);\n        val.bf += __shfl_down(val.bf, offset);\n        val.bg += __shfl_down(val.bg, offset);\n\n        val.cc += __shfl_down(val.cc, offset);\n        val.cd += __shfl_down(val.cd, offset);\n        val.ce += __shfl_down(val.ce, offset);\n        val.cf += __shfl_down(val.cf, offset);\n        val.cg += __shfl_down(val.cg, offset);\n\n        val.dd += __shfl_down(val.dd, offset);\n        val.de += __shfl_down(val.de, offset);\n        val.df += __shfl_down(val.df, offset);\n        val.dg += __shfl_down(val.dg, offset);\n\n        val.ee += __shfl_down(val.ee, offset);\n        val.ef += __shfl_down(val.ef, offset);\n        val.eg += __shfl_down(val.eg, offset);\n\n        val.ff += __shfl_down(val.ff, offset);\n        val.fg += __shfl_down(val.fg, offset);\n\n        val.residual += __shfl_down(val.residual, offset);\n        val.inliers += __shfl_down(val.inliers, offset);\n    }\n\n    return val;\n}\n\n__inline__  __device__ JtJJtrSE3 blockReduceSum(JtJJtrSE3 val)\n{\n    static __shared__ JtJJtrSE3 shared[32];\n\n    int lane = threadIdx.x % warpSize;\n\n    int wid = threadIdx.x / warpSize;\n\n    val = warpReduceSum(val);\n\n    //write reduced value to shared memory\n    if(lane == 0)\n    {\n        shared[wid] = val;\n    }\n    __syncthreads();\n\n    const JtJJtrSE3 zero = {0, 0, 0, 0, 0, 0, 0, 0,\n                            0, 0, 0, 0, 0, 0, 0, 0,\n                            0, 0, 0, 0, 0, 0, 0, 0,\n                            0, 0, 0, 0, 0};\n\n    //ensure we only grab a value from shared memory if that warp existed\n    val = (threadIdx.x < blockDim.x / warpSize) ? shared[lane] : zero;\n\n    if(wid == 0)\n    {\n        val = warpReduceSum(val);\n    }\n\n    return val;\n}\n\n__global__ void reduceSum(JtJJtrSE3 * in, JtJJtrSE3 * out, int N)\n{\n    JtJJtrSE3 sum = {0, 0, 0, 0, 0, 0, 0, 0,\n                     0, 0, 0, 0, 0, 0, 0, 0,\n                     0, 0, 0, 0, 0, 0, 0, 0,\n                     0, 0, 0, 0, 0};\n\n    for(int i = blockIdx.x * blockDim.x + threadIdx.x; i < N; i += blockDim.x * gridDim.x)\n    {\n        sum.add(in[i]);\n    }\n\n    sum = blockReduceSum(sum);\n\n    if(threadIdx.x == 0)\n    {\n        out[blockIdx.x] = sum;\n    }\n}\n\n__inline__  __device__ JtJJtrSO3 warpReduceSum(JtJJtrSO3 val)\n{\n    for(int offset = warpSize / 2; offset > 0; offset /= 2)\n    {\n        val.aa += __shfl_down(val.aa, offset);\n        val.ab += __shfl_down(val.ab, offset);\n        val.ac += __shfl_down(val.ac, offset);\n        val.ad += __shfl_down(val.ad, offset);\n\n        val.bb += __shfl_down(val.bb, offset);\n        val.bc += __shfl_down(val.bc, offset);\n        val.bd += __shfl_down(val.bd, offset);\n\n        val.cc += __shfl_down(val.cc, offset);\n        val.cd += __shfl_down(val.cd, offset);\n\n        val.residual += __shfl_down(val.residual, offset);\n        val.inliers += __shfl_down(val.inliers, offset);\n    }\n\n    return val;\n}\n\n__inline__  __device__ JtJJtrSO3 blockReduceSum(JtJJtrSO3 val)\n{\n    static __shared__ JtJJtrSO3 shared[32];\n\n    int lane = threadIdx.x % warpSize;\n\n    int wid = threadIdx.x / warpSize;\n\n    val = warpReduceSum(val);\n\n    //write reduced value to shared memory\n    if(lane == 0)\n    {\n        shared[wid] = val;\n    }\n    __syncthreads();\n\n    const JtJJtrSO3 zero = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};\n\n    //ensure we only grab a value from shared memory if that warp existed\n    val = (threadIdx.x < blockDim.x / warpSize) ? shared[lane] : zero;\n\n    if(wid == 0)\n    {\n        val = warpReduceSum(val);\n    }\n\n    return val;\n}\n\n__global__ void reduceSum(JtJJtrSO3 * in, JtJJtrSO3 * out, int N)\n{\n    JtJJtrSO3 sum = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};\n\n    for(int i = blockIdx.x * blockDim.x + threadIdx.x; i < N; i += blockDim.x * gridDim.x)\n    {\n        sum.add(in[i]);\n    }\n\n    sum = blockReduceSum(sum);\n\n    if(threadIdx.x == 0)\n    {\n        out[blockIdx.x] = sum;\n    }\n}\n\nstruct ICPReduction\n{\n    mat33 Rcurr;\n    float3 tcurr;\n\n    PtrStep<float> vmap_curr;\n    PtrStep<float> nmap_curr;\n\n    mat33 Rprev_inv;\n    float3 tprev;\n\n    CameraModel intr;\n\n    PtrStep<float> vmap_g_prev;\n    PtrStep<float> nmap_g_prev;\n\n    float distThres;\n    float angleThres;\n\n    int cols;\n    int rows;\n    int N;\n\n    JtJJtrSE3 * out;\n\n    __device__ __forceinline__ bool\n    search (int & x, int & y, float3& n, float3& d, float3& s) const\n    {\n        float3 vcurr;\n        vcurr.x = vmap_curr.ptr (y       )[x];\n        vcurr.y = vmap_curr.ptr (y + rows)[x];\n        vcurr.z = vmap_curr.ptr (y + 2 * rows)[x];\n\n        float3 vcurr_g = Rcurr * vcurr + tcurr;\n        float3 vcurr_cp = Rprev_inv * (vcurr_g - tprev);\n\n        int2 ukr;\n        ukr.x = __float2int_rn (vcurr_cp.x * intr.fx / vcurr_cp.z + intr.cx);\n        ukr.y = __float2int_rn (vcurr_cp.y * intr.fy / vcurr_cp.z + intr.cy);\n\n        if(ukr.x < 0 || ukr.y < 0 || ukr.x >= cols || ukr.y >= rows || vcurr_cp.z < 0)\n            return false;\n\n        float3 vprev_g;\n        vprev_g.x = __ldg(&vmap_g_prev.ptr (ukr.y       )[ukr.x]);\n        vprev_g.y = __ldg(&vmap_g_prev.ptr (ukr.y + rows)[ukr.x]);\n        vprev_g.z = __ldg(&vmap_g_prev.ptr (ukr.y + 2 * rows)[ukr.x]);\n\n        float3 ncurr;\n        ncurr.x = nmap_curr.ptr (y)[x];\n        ncurr.y = nmap_curr.ptr (y + rows)[x];\n        ncurr.z = nmap_curr.ptr (y + 2 * rows)[x];\n\n        float3 ncurr_g = Rcurr * ncurr;\n\n        float3 nprev_g;\n        nprev_g.x =  __ldg(&nmap_g_prev.ptr (ukr.y)[ukr.x]);\n        nprev_g.y = __ldg(&nmap_g_prev.ptr (ukr.y + rows)[ukr.x]);\n        nprev_g.z = __ldg(&nmap_g_prev.ptr (ukr.y + 2 * rows)[ukr.x]);\n\n        float dist = norm (vprev_g - vcurr_g);\n        float sine = norm (cross (ncurr_g, nprev_g));\n\n        n = nprev_g;\n        d = vprev_g;\n        s = vcurr_g;\n\n        return (sine < angleThres && dist <= distThres && !isnan (ncurr.x) && !isnan (nprev_g.x));\n    }\n\n    __device__ __forceinline__ JtJJtrSE3\n    getProducts(int & i) const\n    {\n        int y = i / cols;\n        int x = i - (y * cols);\n\n        float3 n_cp, d_cp, s_cp;\n\n        bool found_coresp = search (x, y, n_cp, d_cp, s_cp);\n\n        float row[7] = {0, 0, 0, 0, 0, 0, 0};\n\n        if(found_coresp)\n        {\n            s_cp = Rprev_inv * (s_cp - tprev);\n            d_cp = Rprev_inv * (d_cp - tprev);\n            n_cp = Rprev_inv * (n_cp);\n\n            *(float3*)&row[0] = n_cp;\n            *(float3*)&row[3] = cross (s_cp, n_cp);\n            row[6] = dot (n_cp, s_cp - d_cp);\n        }\n\n        JtJJtrSE3 values = {row[0] * row[0],\n                            row[0] * row[1],\n                            row[0] * row[2],\n                            row[0] * row[3],\n                            row[0] * row[4],\n                            row[0] * row[5],\n                            row[0] * row[6],\n\n                            row[1] * row[1],\n                            row[1] * row[2],\n                            row[1] * row[3],\n                            row[1] * row[4],\n                            row[1] * row[5],\n                            row[1] * row[6],\n\n                            row[2] * row[2],\n                            row[2] * row[3],\n                            row[2] * row[4],\n                            row[2] * row[5],\n                            row[2] * row[6],\n\n                            row[3] * row[3],\n                            row[3] * row[4],\n                            row[3] * row[5],\n                            row[3] * row[6],\n\n                            row[4] * row[4],\n                            row[4] * row[5],\n                            row[4] * row[6],\n\n                            row[5] * row[5],\n                            row[5] * row[6],\n\n                            row[6] * row[6],\n                            found_coresp};\n\n        return values;\n    }\n\n    __device__ __forceinline__ void\n    operator () () const\n    {\n        JtJJtrSE3 sum = {0, 0, 0, 0, 0, 0, 0, 0,\n                         0, 0, 0, 0, 0, 0, 0, 0,\n                         0, 0, 0, 0, 0, 0, 0, 0,\n                         0, 0, 0, 0, 0};\n\n        for(int i = blockIdx.x * blockDim.x + threadIdx.x; i < N; i += blockDim.x * gridDim.x)\n        {\n            JtJJtrSE3 val = getProducts(i);\n\n            sum.add(val);\n        }\n\n        sum = blockReduceSum(sum);\n\n        if(threadIdx.x == 0)\n        {\n            out[blockIdx.x] = sum;\n        }\n    }\n};\n\n__global__ void icpKernel(const ICPReduction icp)\n{\n    icp();\n}\n\nvoid icpStep(const mat33& Rcurr,\n             const float3& tcurr,\n             const DeviceArray2D<float>& vmap_curr,\n             const DeviceArray2D<float>& nmap_curr,\n             const mat33& Rprev_inv,\n             const float3& tprev,\n             const CameraModel& intr,\n             const DeviceArray2D<float>& vmap_g_prev,\n             const DeviceArray2D<float>& nmap_g_prev,\n             float distThres,\n             float angleThres,\n             DeviceArray<JtJJtrSE3> & sum,\n             DeviceArray<JtJJtrSE3> & out,\n             float * matrixA_host,\n             float * vectorB_host,\n             float * residual_host,\n             int threads,\n             int blocks)\n{\n    int cols = vmap_curr.cols ();\n    int rows = vmap_curr.rows () / 3;\n\n    ICPReduction icp;\n\n    icp.Rcurr = Rcurr;\n    icp.tcurr = tcurr;\n\n    icp.vmap_curr = vmap_curr;\n    icp.nmap_curr = nmap_curr;\n\n    icp.Rprev_inv = Rprev_inv;\n    icp.tprev = tprev;\n\n    icp.intr = intr;\n\n    icp.vmap_g_prev = vmap_g_prev;\n    icp.nmap_g_prev = nmap_g_prev;\n\n    icp.distThres = distThres;\n    icp.angleThres = angleThres;\n\n    icp.cols = cols;\n    icp.rows = rows;\n\n    icp.N = cols * rows;\n    icp.out = sum;\n\n    icpKernel<<<blocks, threads>>>(icp);\n\n    reduceSum<<<1, MAX_THREADS>>>(sum, out, blocks);\n\n    cudaSafeCall(cudaGetLastError());\n    cudaSafeCall(cudaDeviceSynchronize());\n\n    float host_data[32];\n    out.download((JtJJtrSE3 *)&host_data[0]);\n\n    int shift = 0;\n    for (int i = 0; i < 6; ++i)\n    {\n        for (int j = i; j < 7; ++j)\n        {\n            float value = host_data[shift++];\n            if (j == 6)\n                vectorB_host[i] = value;\n            else\n                matrixA_host[j * 6 + i] = matrixA_host[i * 6 + j] = value;\n        }\n    }\n\n    residual_host[0] = host_data[27];\n    residual_host[1] = host_data[28];\n}\n\n#define FLT_EPSILON ((float)1.19209290E-07F)\n\nstruct RGBReduction\n{\n    PtrStepSz<DataTerm> corresImg;\n\n    float sigma;\n    PtrStepSz<float3> cloud;\n    float fx;\n    float fy;\n    PtrStepSz<short> dIdx;\n    PtrStepSz<short> dIdy;\n    float sobelScale;\n\n    int cols;\n    int rows;\n    int N;\n\n    JtJJtrSE3 * out;\n\n    __device__ __forceinline__ JtJJtrSE3\n    getProducts(int & i) const\n    {\n        const DataTerm & corresp = corresImg.data[i];\n\n        bool found_coresp = corresp.valid;\n\n        float row[7];\n\n        if(found_coresp)\n        {\n            float w = sigma + std::abs(corresp.diff);\n\n            w = w > FLT_EPSILON ? 1.0f / w : 1.0f;\n\n            //Signals RGB only tracking, so we should only\n            if(sigma == -1)\n            {\n                w = 1;\n            }\n\n            row[6] = -w * corresp.diff;\n\n            float3 cloudPoint = {cloud.ptr(corresp.zero.y)[corresp.zero.x].x,\n                                 cloud.ptr(corresp.zero.y)[corresp.zero.x].y,\n                                 cloud.ptr(corresp.zero.y)[corresp.zero.x].z};\n\n            float invz = 1.0 / cloudPoint.z;\n            float dI_dx_val = w * sobelScale * dIdx.ptr(corresp.one.y)[corresp.one.x];\n            float dI_dy_val = w * sobelScale * dIdy.ptr(corresp.one.y)[corresp.one.x];\n            float v0 = dI_dx_val * fx * invz;\n            float v1 = dI_dy_val * fy * invz;\n            float v2 = -(v0 * cloudPoint.x + v1 * cloudPoint.y) * invz;\n\n            row[0] = v0;\n            row[1] = v1;\n            row[2] = v2;\n            row[3] = -cloudPoint.z * v1 + cloudPoint.y * v2;\n            row[4] =  cloudPoint.z * v0 - cloudPoint.x * v2;\n            row[5] = -cloudPoint.y * v0 + cloudPoint.x * v1;\n        }\n        else\n        {\n            row[0] = row[1] = row[2] = row[3] = row[4] = row[5] = row[6] = 0.f;\n        }\n\n        JtJJtrSE3 values = {row[0] * row[0],\n                            row[0] * row[1],\n                            row[0] * row[2],\n                            row[0] * row[3],\n                            row[0] * row[4],\n                            row[0] * row[5],\n                            row[0] * row[6],\n\n                            row[1] * row[1],\n                            row[1] * row[2],\n                            row[1] * row[3],\n                            row[1] * row[4],\n                            row[1] * row[5],\n                            row[1] * row[6],\n\n                            row[2] * row[2],\n                            row[2] * row[3],\n                            row[2] * row[4],\n                            row[2] * row[5],\n                            row[2] * row[6],\n\n                            row[3] * row[3],\n                            row[3] * row[4],\n                            row[3] * row[5],\n                            row[3] * row[6],\n\n                            row[4] * row[4],\n                            row[4] * row[5],\n                            row[4] * row[6],\n\n                            row[5] * row[5],\n                            row[5] * row[6],\n\n                            row[6] * row[6],\n                            found_coresp};\n\n        return values;\n    }\n\n    __device__ __forceinline__ void\n    operator () () const\n    {\n        JtJJtrSE3 sum = {0, 0, 0, 0, 0, 0, 0, 0,\n                         0, 0, 0, 0, 0, 0, 0, 0,\n                         0, 0, 0, 0, 0, 0, 0, 0,\n                         0, 0, 0, 0, 0};\n\n        for(int i = blockIdx.x * blockDim.x + threadIdx.x; i < N; i += blockDim.x * gridDim.x)\n        {\n            JtJJtrSE3 val = getProducts(i);\n\n            sum.add(val);\n        }\n\n        sum = blockReduceSum(sum);\n\n        if(threadIdx.x == 0)\n        {\n            out[blockIdx.x] = sum;\n        }\n    }\n};\n\n__global__ void rgbKernel (const RGBReduction rgb)\n{\n    rgb();\n}\n\nvoid rgbStep(const DeviceArray2D<DataTerm> & corresImg,\n             const float & sigma,\n             const DeviceArray2D<float3> & cloud,\n             const float & fx,\n             const float & fy,\n             const DeviceArray2D<short> & dIdx,\n             const DeviceArray2D<short> & dIdy,\n             const float & sobelScale,\n             DeviceArray<JtJJtrSE3> & sum,\n             DeviceArray<JtJJtrSE3> & out,\n             float * matrixA_host,\n             float * vectorB_host,\n             int threads,\n             int blocks)\n{\n    RGBReduction rgb;\n\n    rgb.corresImg = corresImg;\n    rgb.cols = corresImg.cols();\n    rgb.rows = corresImg.rows();\n    rgb.sigma = sigma;\n    rgb.cloud = cloud;\n    rgb.fx = fx;\n    rgb.fy = fy;\n    rgb.dIdx = dIdx;\n    rgb.dIdy = dIdy;\n    rgb.sobelScale = sobelScale;\n    rgb.N = rgb.cols * rgb.rows;\n    rgb.out = sum;\n\n    rgbKernel<<<blocks, threads>>>(rgb);\n\n    reduceSum<<<1, MAX_THREADS>>>(sum, out, blocks);\n\n    cudaSafeCall(cudaGetLastError());\n    cudaSafeCall(cudaDeviceSynchronize());\n\n    float host_data[32];\n    out.download((JtJJtrSE3 *)&host_data[0]);\n\n    int shift = 0;\n    for (int i = 0; i < 6; ++i)\n    {\n        for (int j = i; j < 7; ++j)\n        {\n            float value = host_data[shift++];\n            if (j == 6)\n                vectorB_host[i] = value;\n            else\n                matrixA_host[j * 6 + i] = matrixA_host[i * 6 + j] = value;\n        }\n    }\n}\n\n__inline__  __device__ int2 warpReduceSum(int2 val)\n{\n    for(int offset = warpSize / 2; offset > 0; offset /= 2)\n    {\n        val.x += __shfl_down(val.x, offset);\n        val.y += __shfl_down(val.y, offset);\n    }\n\n    return val;\n}\n\n__inline__  __device__ int2 blockReduceSum(int2 val)\n{\n    static __shared__ int2 shared[32];\n\n    int lane = threadIdx.x % warpSize;\n\n    int wid = threadIdx.x / warpSize;\n\n    val = warpReduceSum(val);\n\n    //write reduced value to shared memory\n    if(lane == 0)\n    {\n        shared[wid] = val;\n    }\n    __syncthreads();\n\n    const int2 zero = {0, 0};\n\n    //ensure we only grab a value from shared memory if that warp existed\n    val = (threadIdx.x < blockDim.x / warpSize) ? shared[lane] : zero;\n\n    if(wid == 0)\n    {\n        val = warpReduceSum(val);\n    }\n\n    return val;\n}\n\n__global__ void reduceSum(int2 * in, int2 * out, int N)\n{\n    int2 sum = {0, 0};\n\n    for(int i = blockIdx.x * blockDim.x + threadIdx.x; i < N; i += blockDim.x * gridDim.x)\n    {\n        sum.x += in[i].x;\n        sum.y += in[i].y;\n    }\n\n    sum = blockReduceSum(sum);\n\n    if(threadIdx.x == 0)\n    {\n        out[blockIdx.x] = sum;\n    }\n}\n\nstruct RGBResidual\n{\n    float minScale;\n\n    PtrStepSz<short> dIdx;\n    PtrStepSz<short> dIdy;\n\n    PtrStepSz<float> lastDepth;\n    PtrStepSz<float> nextDepth;\n\n    PtrStepSz<unsigned char> lastImage;\n    PtrStepSz<unsigned char> nextImage;\n\n    mutable PtrStepSz<DataTerm> corresImg;\n\n    float maxDepthDelta;\n\n    float3 kt;\n    mat33 krkinv;\n\n    int cols;\n    int rows;\n    int N;\n\n    int pitch;\n    int imgPitch;\n\n    int2 * out;\n\n    __device__ __forceinline__ int2\n    getProducts(int k) const\n    {\n        int i = k / cols;\n        int j0 = k - (i * cols);\n\n        int2 value = {0, 0};\n\n        DataTerm corres;\n\n        corres.valid = false;\n\n        if(i >= 0 && i < rows && j0 >= 0 && j0 < cols)\n        {\n            if(j0 < cols - 5 && i < rows - 1)\n            {\n                bool valid = true;\n\n                for(int u = max(i - 2, 0); u < min(i + 2, rows); u++)\n                {\n                    for(int v = max(j0 - 2, 0); v < min(j0 + 2, cols); v++)\n                    {\n                        valid = valid && (nextImage.ptr(u)[v] > 0);\n                    }\n                }\n\n                if(valid)\n                {\n                    short * ptr_input_x = (short*) ((unsigned char*) dIdx.data + i * pitch);\n                    short * ptr_input_y = (short*) ((unsigned char*) dIdy.data + i * pitch);\n\n                    short valx = ptr_input_x[j0];\n                    short valy = ptr_input_y[j0];\n                    float mTwo = (valx * valx) + (valy * valy);\n\n                    if(mTwo >= minScale)\n                    {\n                        int y = i;\n                        int x = j0;\n\n                        float d1 = nextDepth.ptr(y)[x];\n\n                        if(!isnan(d1))\n                        {\n                            float transformed_d1 = (float)(d1 * (krkinv.data[2].x * x + krkinv.data[2].y * y + krkinv.data[2].z) + kt.z);\n                            int u0 = __float2int_rn((d1 * (krkinv.data[0].x * x + krkinv.data[0].y * y + krkinv.data[0].z) + kt.x) / transformed_d1);\n                            int v0 = __float2int_rn((d1 * (krkinv.data[1].x * x + krkinv.data[1].y * y + krkinv.data[1].z) + kt.y) / transformed_d1);\n\n                            if(u0 >= 0 && v0 >= 0 && u0 < lastDepth.cols && v0 < lastDepth.rows)\n                            {\n                                float d0 = lastDepth.ptr(v0)[u0];\n\n                                if(d0 > 0 && std::abs(transformed_d1 - d0) <= maxDepthDelta && lastImage.ptr(v0)[u0] != 0)\n                                {\n                                    corres.zero.x = u0;\n                                    corres.zero.y = v0;\n                                    corres.one.x = x;\n                                    corres.one.y = y;\n                                    corres.diff = static_cast<float>(nextImage.ptr(y)[x]) - static_cast<float>(lastImage.ptr(v0)[u0]);\n                                    corres.valid = true;\n                                    value.x = 1;\n                                    value.y = corres.diff * corres.diff;\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n\n        corresImg.data[k] = corres;\n\n        return value;\n    }\n\n    __device__ __forceinline__ void\n    operator () () const\n    {\n        int2 sum = {0, 0};\n\n        for(int i = blockIdx.x * blockDim.x + threadIdx.x; i < N; i += blockDim.x * gridDim.x)\n        {\n            int2 val = getProducts(i);\n            sum.x += val.x;\n            sum.y += val.y;\n        }\n\n        sum = blockReduceSum(sum);\n\n        if(threadIdx.x == 0)\n        {\n            out[blockIdx.x] = sum;\n        }\n    }\n};\n\n__global__ void residualKernel (const RGBResidual rgb)\n{\n    rgb();\n}\n\nvoid computeRgbResidual(const float & minScale,\n                        const DeviceArray2D<short> & dIdx,\n                        const DeviceArray2D<short> & dIdy,\n                        const DeviceArray2D<float> & lastDepth,\n                        const DeviceArray2D<float> & nextDepth,\n                        const DeviceArray2D<unsigned char> & lastImage,\n                        const DeviceArray2D<unsigned char> & nextImage,\n                        DeviceArray2D<DataTerm> & corresImg,\n                        DeviceArray<int2> & sumResidual,\n                        const float maxDepthDelta,\n                        const float3 & kt,\n                        const mat33 & krkinv,\n                        int & sigmaSum,\n                        int & count,\n                        int threads,\n                        int blocks)\n{\n    int cols = nextImage.cols ();\n    int rows = nextImage.rows ();\n\n    RGBResidual rgb;\n\n    rgb.minScale = minScale;\n\n    rgb.dIdx = dIdx;\n    rgb.dIdy = dIdy;\n\n    rgb.lastDepth = lastDepth;\n    rgb.nextDepth = nextDepth;\n\n    rgb.lastImage = lastImage;\n    rgb.nextImage = nextImage;\n\n    rgb.corresImg = corresImg;\n\n    rgb.maxDepthDelta = maxDepthDelta;\n\n    rgb.kt = kt;\n    rgb.krkinv = krkinv;\n\n    rgb.cols = cols;\n    rgb.rows = rows;\n    rgb.pitch = dIdx.step();\n    rgb.imgPitch = nextImage.step();\n\n    rgb.N = cols * rows;\n    rgb.out = sumResidual;\n\n    residualKernel<<<blocks, threads>>>(rgb);\n\n    int2 out_host = {0, 0};\n    int2 * out;\n\n    cudaMalloc(&out, sizeof(int2));\n    cudaMemcpy(out, &out_host, sizeof(int2), cudaMemcpyHostToDevice);\n\n    reduceSum<<<1, MAX_THREADS>>>(sumResidual, out, blocks);\n\n    cudaSafeCall(cudaGetLastError());\n    cudaSafeCall(cudaDeviceSynchronize());\n\n    cudaMemcpy(&out_host, out, sizeof(int2), cudaMemcpyDeviceToHost);\n    cudaFree(out);\n\n    count = out_host.x;\n    sigmaSum = out_host.y;\n}\n\nstruct SO3Reduction\n{\n    PtrStepSz<unsigned char> lastImage;\n    PtrStepSz<unsigned char> nextImage;\n\n    mat33 imageBasis;\n    mat33 kinv;\n    mat33 krlr;\n    bool gradCheck;\n\n    int cols;\n    int rows;\n    int N;\n\n    JtJJtrSO3 * out;\n\n    __device__ __forceinline__ float2\n    getGradient(const PtrStepSz<unsigned char> img, int x, int y) const\n    {\n        float2 gradient;\n\n        float actu = static_cast<float>(img.ptr(y)[x]);\n\n        float back = static_cast<float>(img.ptr(y)[x - 1]);\n        float fore = static_cast<float>(img.ptr(y)[x + 1]);\n        gradient.x = ((back + actu) / 2.0f) - ((fore + actu) / 2.0f);\n\n        back = static_cast<float>(img.ptr(y - 1)[x]);\n        fore = static_cast<float>(img.ptr(y + 1)[x]);\n        gradient.y = ((back + actu) / 2.0f) - ((fore + actu) / 2.0f);\n\n        return gradient;\n    }\n\n    __device__ __forceinline__ JtJJtrSO3\n    getProducts(int k) const\n    {\n        int y = k / cols;\n        int x = k - (y * cols);\n\n        bool found_coresp = false;\n\n        float3 unwarpedReferencePoint = {x, y, 1.0f};\n\n        float3 warpedReferencePoint = imageBasis * unwarpedReferencePoint;\n\n        int2 warpedReferencePixel = {__float2int_rn(warpedReferencePoint.x / warpedReferencePoint.z),\n                                     __float2int_rn(warpedReferencePoint.y / warpedReferencePoint.z)};\n\n        if(warpedReferencePixel.x >= 1 &&\n           warpedReferencePixel.x < cols - 1 &&\n           warpedReferencePixel.y >= 1 &&\n           warpedReferencePixel.y < rows - 1 &&\n           x >= 1 &&\n           x < cols - 1 &&\n           y >= 1 &&\n           y < rows - 1)\n        {\n            found_coresp = true;\n        }\n\n        float row[4];\n        row[0] = row[1] = row[2] = row[3] = 0.f;\n\n        if(found_coresp)\n        {\n            float2 gradNext = getGradient(nextImage, warpedReferencePixel.x, warpedReferencePixel.y);\n            float2 gradLast = getGradient(lastImage, x, y);\n\n            float gx = (gradNext.x + gradLast.x) / 2.0f;\n            float gy = (gradNext.y + gradLast.y) / 2.0f;\n\n            float3 point = kinv * unwarpedReferencePoint;\n\n            float z2 = point.z * point.z;\n\n            float a = krlr.data[0].x;\n            float b = krlr.data[0].y;\n            float c = krlr.data[0].z;\n\n            float d = krlr.data[1].x;\n            float e = krlr.data[1].y;\n            float f = krlr.data[1].z;\n\n            float g = krlr.data[2].x;\n            float h = krlr.data[2].y;\n            float i = krlr.data[2].z;\n\n            //Aren't jacobians great fun\n            float3 leftProduct = {((point.z * (d * gy + a * gx)) - (gy * g * y) - (gx * g * x)) / z2,\n                                  ((point.z * (e * gy + b * gx)) - (gy * h * y) - (gx * h * x)) / z2,\n                                  ((point.z * (f * gy + c * gx)) - (gy * i * y) - (gx * i * x)) / z2};\n\n            float3 jacRow = cross(leftProduct, point);\n\n            row[0] = jacRow.x;\n            row[1] = jacRow.y;\n            row[2] = jacRow.z;\n            row[3] = -(static_cast<float>(nextImage.ptr(warpedReferencePixel.y)[warpedReferencePixel.x]) - static_cast<float>(lastImage.ptr(y)[x]));\n        }\n\n        JtJJtrSO3 values = {row[0] * row[0],\n                            row[0] * row[1],\n                            row[0] * row[2],\n                            row[0] * row[3],\n\n                            row[1] * row[1],\n                            row[1] * row[2],\n                            row[1] * row[3],\n\n                            row[2] * row[2],\n                            row[2] * row[3],\n\n                            row[3] * row[3],\n                            found_coresp};\n\n        return values;\n    }\n\n    __device__ __forceinline__ void\n    operator () () const\n    {\n        JtJJtrSO3 sum = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};\n\n        for(int i = blockIdx.x * blockDim.x + threadIdx.x; i < N; i += blockDim.x * gridDim.x)\n        {\n            JtJJtrSO3 val = getProducts(i);\n\n            sum.add(val);\n        }\n\n        sum = blockReduceSum(sum);\n\n        if(threadIdx.x == 0)\n        {\n            out[blockIdx.x] = sum;\n        }\n    }\n};\n\n__global__ void so3Kernel (const SO3Reduction so3)\n{\n    so3();\n}\n\nvoid so3Step(const DeviceArray2D<unsigned char> & lastImage,\n             const DeviceArray2D<unsigned char> & nextImage,\n             const mat33 & imageBasis,\n             const mat33 & kinv,\n             const mat33 & krlr,\n             DeviceArray<JtJJtrSO3> & sum,\n             DeviceArray<JtJJtrSO3> & out,\n             float * matrixA_host,\n             float * vectorB_host,\n             float * residual_host,\n             int threads,\n             int blocks)\n{\n    int cols = nextImage.cols();\n    int rows = nextImage.rows();\n\n    SO3Reduction so3;\n\n    so3.lastImage = lastImage;\n\n    so3.nextImage = nextImage;\n\n    so3.imageBasis = imageBasis;\n    so3.kinv = kinv;\n    so3.krlr = krlr;\n\n    so3.cols = cols;\n    so3.rows = rows;\n\n    so3.N = cols * rows;\n\n    so3.out = sum;\n\n    so3Kernel<<<blocks, threads>>>(so3);\n\n    reduceSum<<<1, MAX_THREADS>>>(sum, out, blocks);\n\n    cudaSafeCall(cudaGetLastError());\n    cudaSafeCall(cudaDeviceSynchronize());\n\n    float host_data[11];\n    out.download((JtJJtrSO3 *)&host_data[0]);\n\n    int shift = 0;\n    for (int i = 0; i < 3; ++i)\n    {\n        for (int j = i; j < 4; ++j)\n        {\n            float value = host_data[shift++];\n            if (j == 3)\n                vectorB_host[i] = value;\n            else\n                matrixA_host[j * 3 + i] = matrixA_host[i * 3 + j] = value;\n        }\n    }\n\n    residual_host[0] = host_data[9];\n    residual_host[1] = host_data[10];\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Cuda/types.cuh",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n * Software License Agreement (BSD License)\n *\n *  Copyright (c) 2011, Willow Garage, Inc.\n *  All rights reserved.\n *\n *  Redistribution and use in source and binary forms, with or without\n *  modification, are permitted provided that the following conditions\n *  are met:\n *\n *   * Redistributions of source code must retain the above copyright\n *     notice, this list of conditions and the following disclaimer.\n *   * Redistributions in binary form must reproduce the above\n *     copyright notice, this list of conditions and the following\n *     disclaimer in the documentation and/or other materials provided\n *     with the distribution.\n *   * Neither the name of Willow Garage, Inc. nor the names of its\n *     contributors may be used to endorse or promote products derived\n *     from this software without specific prior written permission.\n *\n *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n *  \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n *  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n *  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n *  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n *  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n *  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;\n *  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER\n *  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n *  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN\n *  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n *  POSSIBILITY OF SUCH DAMAGE.\n *\n *  Author: Anatoly Baskeheev, Itseez Ltd, (myname.mysurname@mycompany.com)\n */\n\n#ifndef CUDA_TYPES_CUH_\n#define CUDA_TYPES_CUH_\n\n#include <vector_types.h>\n\n#if !defined(__CUDACC__)\n#include <Eigen/Core>\n#endif\n\nstruct mat33\n{\n    mat33() {}\n\n#if !defined(__CUDACC__)\n    mat33(Eigen::Matrix<float, 3, 3, Eigen::RowMajor> & e)\n    {\n        memcpy(data, e.data(), sizeof(mat33));\n    }\n#endif\n\n    float3 data[3];\n};\n\nstruct DataTerm\n{\n    short2 zero;\n    short2 one;\n    float diff;\n    bool valid;\n};\n\nstruct CameraModel\n{\n    float fx, fy, cx, cy;\n    CameraModel()\n     : fx(0), fy(0), cx(0), cy(0)\n    {}\n\n    CameraModel(float fx_, float fy_, float cx_, float cy_)\n     : fx(fx_), fy(fy_), cx(cx_), cy(cy_)\n    {}\n\n    CameraModel operator()(int level) const\n    {\n        int div = 1 << level;\n        return (CameraModel (fx / div, fy / div, cx / div, cy / div));\n    }\n};\n\nstruct JtJJtrSE3\n{\n    //27 floats for each product (27)\n    float aa, ab, ac, ad, ae, af, ag,\n              bb, bc, bd, be, bf, bg,\n                  cc, cd, ce, cf, cg,\n                      dd, de, df, dg,\n                          ee, ef, eg,\n                              ff, fg;\n\n    //Extra data needed (29)\n    float residual, inliers;\n\n    __device__ inline void add(const JtJJtrSE3 & a)\n    {\n        aa += a.aa;\n        ab += a.ab;\n        ac += a.ac;\n        ad += a.ad;\n        ae += a.ae;\n        af += a.af;\n        ag += a.ag;\n\n        bb += a.bb;\n        bc += a.bc;\n        bd += a.bd;\n        be += a.be;\n        bf += a.bf;\n        bg += a.bg;\n\n        cc += a.cc;\n        cd += a.cd;\n        ce += a.ce;\n        cf += a.cf;\n        cg += a.cg;\n\n        dd += a.dd;\n        de += a.de;\n        df += a.df;\n        dg += a.dg;\n\n        ee += a.ee;\n        ef += a.ef;\n        eg += a.eg;\n\n        ff += a.ff;\n        fg += a.fg;\n\n        residual += a.residual;\n        inliers += a.inliers;\n    }\n};\n\nstruct JtJJtrSO3\n{\n    //9 floats for each product (9)\n    float aa, ab, ac, ad,\n              bb, bc, bd,\n                  cc, cd;\n\n    //Extra data needed (11)\n    float residual, inliers;\n\n    __device__ inline void add(const JtJJtrSO3 & a)\n    {\n        aa += a.aa;\n        ab += a.ab;\n        ac += a.ac;\n        ad += a.ad;\n\n        bb += a.bb;\n        bc += a.bc;\n        bd += a.bd;\n\n        cc += a.cc;\n        cd += a.cd;\n\n        residual += a.residual;\n        inliers += a.inliers;\n    }\n};\n\n#endif /* CUDA_TYPES_CUH_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/CudaComputeTargetFlags.cmake",
    "content": "#\n#  Compute target flags macros by Anatoly Baksheev\n# \n#  Usage in CmakeLists.txt:\n#   \tinclude(CudaComputeTargetFlags.cmake)\n#\t\tAPPEND_TARGET_ARCH_FLAGS() \n\n#compute flags macros\nMACRO(CUDA_COMPUTE_TARGET_FLAGS arch_bin arch_ptx cuda_nvcc_target_flags)\n\tstring(REGEX REPLACE \"\\\\.\" \"\" ARCH_BIN_WITHOUT_DOTS \"${${arch_bin}}\")\n\tstring(REGEX REPLACE \"\\\\.\" \"\" ARCH_PTX_WITHOUT_DOTS \"${${arch_ptx}}\")\n\t\t\t\t\t\t\t\t\n\tset(cuda_computer_target_flags_temp \"\") \n\t\n\t# Tell NVCC to add binaries for the specified GPUs\n\tstring(REGEX MATCHALL \"[0-9()]+\" ARCH_LIST \"${ARCH_BIN_WITHOUT_DOTS}\")\n\tforeach(ARCH IN LISTS ARCH_LIST)\n\t\tif (ARCH MATCHES \"([0-9]+)\\\\(([0-9]+)\\\\)\")\n\t\t\t# User explicitly specified PTX for the concrete BIN\t\t\t\t\t\n\t\t\tset(cuda_computer_target_flags_temp ${cuda_computer_target_flags_temp} -gencode arch=compute_${CMAKE_MATCH_2},code=sm_${CMAKE_MATCH_1})\t\t\t\t\t\n\t\telse()\t\t\t\t\t\n\t\t\t# User didn't explicitly specify PTX for the concrete BIN, we assume PTX=BIN                \t\t\t\t\n\t\t\tset(cuda_computer_target_flags_temp ${cuda_computer_target_flags_temp} -gencode arch=compute_${ARCH},code=sm_${ARCH})\t\t\t\t\t\n\t\tendif()\n\tendforeach()\n\t\t\t\t\n\t# Tell NVCC to add PTX intermediate code for the specified architectures\n\tstring(REGEX MATCHALL \"[0-9]+\" ARCH_LIST \"${ARCH_PTX_WITHOUT_DOTS}\")\n\tforeach(ARCH IN LISTS ARCH_LIST)\t\t\t\t\n\t\tset(cuda_computer_target_flags_temp ${cuda_computer_target_flags_temp} -gencode arch=compute_${ARCH},code=compute_${ARCH})\t\t\t\t\n\tendforeach()\t\n\t\t\t\t\t\t\t\n\tset(${cuda_nvcc_target_flags} ${cuda_computer_target_flags_temp})\t\t\nENDMACRO()\n\nMACRO(APPEND_TARGET_ARCH_FLAGS)\n\tset(cuda_nvcc_target_flags \"\")\n\tCUDA_COMPUTE_TARGET_FLAGS(CUDA_ARCH_BIN CUDA_ARCH_PTX cuda_nvcc_target_flags)\t\t\n\tif (cuda_nvcc_target_flags)\n\t\tmessage(STATUS \"CUDA NVCC target flags: ${cuda_nvcc_target_flags}\")\n\t\tlist(APPEND CUDA_NVCC_FLAGS ${cuda_nvcc_target_flags})\n\tendif()\nENDMACRO()"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Defines.h",
    "content": "/*\n* This file was written for porting ElasticFusion to windows\n* by Filip Srajer (filip.srajer@inf.ethz.ch).\n*\n*/\n\n#pragma once\n\n#ifndef WIN32\n#  define EFUSION_API\n#else\n#  ifdef efusion_EXPORTS\n#    define EFUSION_API __declspec(dllexport)\n#  else\n#    define EFUSION_API __declspec(dllimport)\n#  endif\n#endif\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Deformation.cpp",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#include \"Deformation.h\"\n\nDeformation::Deformation()\n : def(4, &pointPool),\n   originalPointPool(0),\n   firstGraphNode(0),\n   sampleProgram(loadProgramGeomFromFile(\"sample.vert\", \"sample.geom\")),\n   bufferSize(1024), //max nodes basically\n   count(0),\n   vertices(new Eigen::Vector4f[bufferSize]),\n   graphPosePoints(new std::vector<Eigen::Vector3f>),\n   lastDeformTime(0)\n{\n    //x, y, z and init time\n    memset(&vertices[0], 0, bufferSize);\n\n    glGenTransformFeedbacks(1, &fid);\n    glGenBuffers(1, &vbo);\n    glBindBuffer(GL_ARRAY_BUFFER, vbo);\n    glBufferData(GL_ARRAY_BUFFER, bufferSize * sizeof(Eigen::Vector4f), &vertices[0], GL_STREAM_DRAW);\n    glBindBuffer(GL_ARRAY_BUFFER, 0);\n\n    sampleProgram->Bind();\n\n    int loc[1] =\n    {\n        glGetVaryingLocationNV(sampleProgram->programId(), \"vData\"),\n    };\n\n    glTransformFeedbackVaryingsNV(sampleProgram->programId(), 1, loc, GL_INTERLEAVED_ATTRIBS);\n\n    sampleProgram->Unbind();\n\n    glGenQueries(1, &countQuery);\n}\n\nDeformation::~Deformation()\n{\n    delete [] vertices;\n    glDeleteTransformFeedbacks(1, &fid);\n    glDeleteBuffers(1, &vbo);\n    glDeleteQueries(1, &countQuery);\n    delete graphPosePoints;\n}\n\nstd::vector<GraphNode*> & Deformation::getGraph()\n{\n    return def.getGraph();\n}\n\nvoid Deformation::addConstraint(const Constraint & constraint)\n{\n    constraints.push_back(constraint);\n}\n\nvoid Deformation::addConstraint(const Eigen::Vector4f & src,\n                                const Eigen::Vector4f & target,\n                                const uint64_t & srcTime,\n                                const uint64_t & targetTime,\n                                const bool pinConstraints)\n{\n    //Add the new constraint\n    constraints.push_back(Constraint(src.head(3), target.head(3), srcTime, targetTime, false));\n\n    if(pinConstraints)\n    {\n        constraints.push_back(Constraint(target.head(3), target.head(3), targetTime, targetTime, false, true));\n    }\n}\n\nbool Deformation::constrain(std::vector<Ferns::Frame*> & ferns,\n                            std::vector<float> & rawGraph,\n                            int time,\n                            const bool fernMatch,\n                            std::vector<std::pair<unsigned long long int, Eigen::Matrix4f> > & poseGraph,\n                            const bool relaxGraph,\n                            std::vector<Constraint> * newRelativeCons)\n{\n    if(def.isInit())\n    {\n        std::vector<unsigned long long int> times;\n        std::vector<Eigen::Matrix4f> poses;\n        std::vector<Eigen::Matrix4f*> rawPoses;\n\n        //Deform the set of ferns\n        for(size_t i = 0; i < ferns.size(); i++)\n        {\n            times.push_back(ferns.at(i)->srcTime);\n            poses.push_back(ferns.at(i)->pose);\n            rawPoses.push_back(&ferns.at(i)->pose);\n        }\n\n        if(fernMatch)\n        {\n            //Also apply to the current full pose graph (this might be silly :D)\n            for(size_t i = 0; i < poseGraph.size(); i++)\n            {\n                times.push_back(poseGraph.at(i).first);\n                poses.push_back(poseGraph.at(i).second);\n                rawPoses.push_back(&poseGraph.at(i).second);\n            }\n        }\n\n        def.setPosesSeq(&times, poses);\n\n        int originalPointPool = pointPool.size();\n\n        //Target to source\n        for(size_t i = 0; i < constraints.size(); i++)\n        {\n            pointPool.push_back(constraints.at(i).src);\n            vertexTimes.push_back(constraints.at(i).srcTime);\n            constraints.at(i).srcPointPoolId = pointPool.size() - 1;\n\n            if(constraints.at(i).relative)\n            {\n                pointPool.push_back(constraints.at(i).target);\n                vertexTimes.push_back(constraints.at(i).targetTime);\n                constraints.at(i).tarPointPoolId = pointPool.size() - 1;\n            }\n        }\n\n        def.appendVertices(&vertexTimes, originalPointPool);\n        def.clearConstraints();\n\n        for(size_t i = 0; i < constraints.size(); i++)\n        {\n            if(constraints.at(i).relative)\n            {\n                def.addRelativeConstraint(constraints.at(i).srcPointPoolId, constraints.at(i).tarPointPoolId);\n            }\n            else\n            {\n                Eigen::Vector3f targetPoint = constraints.at(i).target;\n                def.addConstraint(constraints.at(i).srcPointPoolId, targetPoint);\n            }\n        }\n\n        float error = 0;\n        float meanConsError = 0;\n        bool optimised = def.optimiseGraphSparse(error, meanConsError, fernMatch, (fernMatch || relaxGraph) ? 0 : lastDeformTime);\n\n        bool poseUpdated = false;\n\n        if(!fernMatch || (fernMatch && optimised && meanConsError < 0.0003 && error < 0.12))\n        {\n            def.applyGraphToPoses(rawPoses);\n\n            def.applyGraphToVertices();\n\n            if(!fernMatch && newRelativeCons)\n            {\n                newRelativeCons->clear();\n\n                //Target to source\n                for(size_t i = 0; i < constraints.size(); i++)\n                {\n                    if(!constraints.at(i).relative && !constraints.at(i).pin)\n                    {\n                        newRelativeCons->push_back(Constraint(pointPool.at(constraints.at(i).srcPointPoolId),\n                                                              constraints.at(i).target,\n                                                              constraints.at(i).srcTime,\n                                                              constraints.at(i).targetTime,\n                                                              true));\n                    }\n                }\n            }\n\n            std::vector<GraphNode*> & graphNodes = def.getGraph();\n            std::vector<unsigned long long int> graphTimes = def.getGraphTimes();\n\n            //16 floats per node...\n            rawGraph.resize(graphNodes.size() * 16);\n\n            for(size_t i = 0; i < graphNodes.size(); i++)\n            {\n                memcpy(&rawGraph.at(i * 16), graphNodes.at(i)->position.data(), sizeof(float) * 3);\n                memcpy(&rawGraph.at(i * 16 + 3), graphNodes.at(i)->rotation.data(), sizeof(float) * 9);\n                memcpy(&rawGraph.at(i * 16 + 12), graphNodes.at(i)->translation.data(), sizeof(float) * 3);\n                rawGraph.at(i * 16 + 15) = (float)graphTimes.at(i);\n            }\n\n            if(!fernMatch && !relaxGraph)\n            {\n                lastDeformTime = time;\n            }\n\n            poseUpdated = true;\n        }\n\n        vertexTimes.resize(originalPointPool);\n        pointPool.resize(originalPointPool);\n\n        constraints.clear();\n\n        return poseUpdated;\n    }\n\n    return false;\n}\n\nvoid Deformation::sampleGraphFrom(Deformation & other)\n{\n    Eigen::Vector4f * otherVerts = other.getVertices();\n\n    int sampleRate = 5;\n\n    if(other.getCount() / sampleRate > def.k)\n    {\n        for(int i = 0; i < other.getCount(); i += sampleRate)\n        {\n            Eigen::Vector3f newPoint = otherVerts[i].head<3>();\n\n            graphPosePoints->push_back(newPoint);\n\n            if(i > 0 && otherVerts[i](3) < graphPoseTimes.back())\n            {\n                assert(false && \"Assumption failed\");\n            }\n\n            graphPoseTimes.push_back(otherVerts[i](3));\n        }\n\n        def.initialiseGraph(graphPosePoints, &graphPoseTimes);\n\n        graphPoseTimes.clear();\n        graphPosePoints->clear();\n    }\n}\n\nvoid Deformation::sampleGraphModel(const std::pair<GLuint, GLuint> & model)\n{\n    sampleProgram->Bind();\n\n    glBindBuffer(GL_ARRAY_BUFFER, model.first);\n\n    glEnableVertexAttribArray(0);\n    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, 0);\n\n    glEnableVertexAttribArray(1);\n    glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, reinterpret_cast<GLvoid*>(sizeof(Eigen::Vector4f)));\n\n    glEnableVertexAttribArray(2);\n    glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, reinterpret_cast<GLvoid*>(sizeof(Eigen::Vector4f) * 2));\n\n    glEnable(GL_RASTERIZER_DISCARD);\n\n    glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, fid);\n\n    glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, vbo);\n\n    glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, countQuery);\n\n    glBeginTransformFeedback(GL_POINTS);\n\n    glDrawTransformFeedback(GL_POINTS, model.second);\n\n    glEndTransformFeedback();\n\n    glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);\n\n    glGetQueryObjectuiv(countQuery, GL_QUERY_RESULT, &count);\n\n    glDisable(GL_RASTERIZER_DISCARD);\n\n    glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);\n\n    glDisableVertexAttribArray(0);\n    glDisableVertexAttribArray(1);\n    glDisableVertexAttribArray(2);\n    glBindBuffer(GL_ARRAY_BUFFER, 0);\n\n    sampleProgram->Unbind();\n\n    glFinish();\n\n    if((int)count > def.k)\n    {\n        glBindBuffer(GL_ARRAY_BUFFER, vbo);\n\n        glGetBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(Eigen::Vector4f) * count, vertices);\n\n        glBindBuffer(GL_ARRAY_BUFFER, 0);\n\n        for(size_t i = 0; i < count; i++)\n        {\n            Eigen::Vector3f newPoint = vertices[i].head<3>();\n\n            graphPosePoints->push_back(newPoint);\n\n            if(i > 0 && vertices[i](3) < graphPoseTimes.back())\n            {\n                assert(false && \"Assumption failed\");\n            }\n\n            graphPoseTimes.push_back(vertices[i](3));\n        }\n\n        def.initialiseGraph(graphPosePoints, &graphPoseTimes);\n\n        graphPoseTimes.clear();\n        graphPosePoints->clear();\n    }\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Deformation.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef DEFORMATION_H_\n#define DEFORMATION_H_\n\n#include \"Utils/DeformationGraph.h\"\n#include \"Shaders/Shaders.h\"\n#include \"Shaders/Uniform.h\"\n#include \"Shaders/Vertex.h\"\n#include \"GPUTexture.h\"\n#include \"Utils/Resolution.h\"\n#include \"Utils/Intrinsics.h\"\n#include \"Ferns.h\"\n#include \"Defines.h\"\n\n#include <pangolin/gl/gl.h>\n\nclass Deformation\n{\n    public:\n        Deformation();\n        virtual ~Deformation();\n\n        EFUSION_API std::vector<GraphNode*> & getGraph();\n\n        void getRawGraph(std::vector<float> & graph);\n\n        void sampleGraphModel(const std::pair<GLuint, GLuint> & model);\n\n        void sampleGraphFrom(Deformation & other);\n\n        class Constraint\n        {\n            public:\n                Constraint(const Eigen::Vector3f & src,\n                           const Eigen::Vector3f & target,\n                           const uint64_t & srcTime,\n                           const uint64_t & targetTime,\n                           const bool relative,\n                           const bool pin = false)\n                 : src(src),\n                   target(target),\n                   srcTime(srcTime),\n                   targetTime(targetTime),\n                   relative(relative),\n                   pin(pin),\n                   srcPointPoolId(-1),\n                   tarPointPoolId(-1)\n                {}\n\n                Eigen::Vector3f src;\n                Eigen::Vector3f target;\n                uint64_t srcTime;\n                uint64_t targetTime;\n                bool relative;\n                bool pin;\n                int srcPointPoolId;\n                int tarPointPoolId;\n        };\n\n        void addConstraint(const Eigen::Vector4f & src,\n                           const Eigen::Vector4f & target,\n                           const uint64_t & srcTime,\n                           const uint64_t & targetTime,\n                           const bool pinConstraints);\n\n        void addConstraint(const Constraint & constraint);\n\n        bool constrain(std::vector<Ferns::Frame*> & ferns,\n                       std::vector<float> & rawGraph,\n                       int time,\n                       const bool fernMatch,\n                       std::vector<std::pair<unsigned long long int, Eigen::Matrix4f> > & poseGraph,\n                       const bool relaxGraph,\n                       std::vector<Constraint> * newRelativeCons = 0);\n\n        Eigen::Vector4f * getVertices()\n        {\n            return vertices;\n        }\n\n        int getCount()\n        {\n            return int(count);\n        }\n\n        int getLastDeformTime()\n        {\n            return lastDeformTime;\n        }\n\n    private:\n        DeformationGraph def;\n\n        std::vector<unsigned long long int> vertexTimes;\n        std::vector<Eigen::Vector3f> pointPool;\n        int originalPointPool;\n        int firstGraphNode;\n\n        std::shared_ptr<Shader> sampleProgram;\n        GLuint vbo;\n        GLuint fid;\n        const int bufferSize;\n        GLuint countQuery;\n        unsigned int count;\n        Eigen::Vector4f * vertices;\n\n        std::vector<std::pair<uint64_t, Eigen::Vector3f> > poseGraphPoints;\n        std::vector<unsigned long long int> graphPoseTimes;\n        std::vector<Eigen::Vector3f> * graphPosePoints;\n\n        std::vector<Constraint> constraints;\n        int lastDeformTime;\n};\n\n#endif /* DEFORMATION_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/ElasticFusion.cpp",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n \n#include \"ElasticFusion.h\"\n\nElasticFusion::ElasticFusion(const int timeDelta,\n                             const int countThresh,\n                             const float errThresh,\n                             const float covThresh,\n                             const bool closeLoops,\n                             const bool iclnuim,\n                             const bool reloc,\n                             const float photoThresh,\n                             const float confidence,\n                             const float depthCut,\n                             const float icpThresh,\n                             const bool fastOdom,\n                             const float fernThresh,\n                             const bool so3,\n                             const bool frameToFrameRGB,\n                             const std::string fileName)\n : frameToModel(Resolution::getInstance().width(),\n                Resolution::getInstance().height(),\n                Intrinsics::getInstance().cx(),\n                Intrinsics::getInstance().cy(),\n                Intrinsics::getInstance().fx(),\n                Intrinsics::getInstance().fy()),\n   modelToModel(Resolution::getInstance().width(),\n                Resolution::getInstance().height(),\n                Intrinsics::getInstance().cx(),\n                Intrinsics::getInstance().cy(),\n                Intrinsics::getInstance().fx(),\n                Intrinsics::getInstance().fy()),\n   ferns(500, depthCut * 1000, photoThresh),\n   saveFilename(fileName),\n   currPose(Eigen::Matrix4f::Identity()),\n   tick(1),\n   timeDelta(timeDelta),\n   icpCountThresh(countThresh),\n   icpErrThresh(errThresh),\n   covThresh(covThresh),\n   deforms(0),\n   fernDeforms(0),\n   consSample(20),\n   resize(Resolution::getInstance().width(),\n          Resolution::getInstance().height(),\n          Resolution::getInstance().width() / consSample,\n          Resolution::getInstance().height() / consSample),\n   imageBuff(Resolution::getInstance().rows() / consSample, Resolution::getInstance().cols() / consSample),\n   consBuff(Resolution::getInstance().rows() / consSample, Resolution::getInstance().cols() / consSample),\n   timesBuff(Resolution::getInstance().rows() / consSample, Resolution::getInstance().cols() / consSample),\n   closeLoops(closeLoops),\n   iclnuim(iclnuim),\n   reloc(reloc),\n   lost(false),\n   lastFrameRecovery(false),\n   trackingCount(0),\n   maxDepthProcessed(20.0f),\n   rgbOnly(false),\n   icpWeight(icpThresh),\n   pyramid(true),\n   fastOdom(fastOdom),\n   confidenceThreshold(confidence),\n   fernThresh(fernThresh),\n   so3(so3),\n   frameToFrameRGB(frameToFrameRGB),\n   depthCutoff(depthCut)\n{\n    createTextures();\n    createCompute();\n    createFeedbackBuffers();\n\n    std::string filename = fileName;\n    filename.append(\".freiburg\");\n\n    std::ofstream file;\n    file.open(filename.c_str(), std::fstream::out);\n    file.close();\n\n    Stopwatch::getInstance().setCustomSignature(12431231);\n}\n\nElasticFusion::~ElasticFusion()\n{\n    if(iclnuim)\n    {\n        savePly();\n    }\n\n    //Output deformed pose graph\n    std::string fname = saveFilename;\n    fname.append(\".freiburg\");\n\n    std::ofstream f;\n    f.open(fname.c_str(), std::fstream::out);\n\n    for(size_t i = 0; i < poseGraph.size(); i++)\n    {\n        std::stringstream strs;\n\n        if(iclnuim)\n        {\n            strs << std::setprecision(6) << std::fixed << (double)poseLogTimes.at(i) << \" \";\n        }\n        else\n        {\n            strs << std::setprecision(6) << std::fixed << (double)poseLogTimes.at(i) / 1000000.0 << \" \";\n        }\n\n        Eigen::Vector3f trans = poseGraph.at(i).second.topRightCorner(3, 1);\n        Eigen::Matrix3f rot = poseGraph.at(i).second.topLeftCorner(3, 3);\n\n        f << strs.str() << trans(0) << \" \" << trans(1) << \" \" << trans(2) << \" \";\n\n        Eigen::Quaternionf currentCameraRotation(rot);\n\n        f << currentCameraRotation.x() << \" \" << currentCameraRotation.y() << \" \" << currentCameraRotation.z() << \" \" << currentCameraRotation.w() << \"\\n\";\n    }\n\n    f.close();\n\n    for(std::map<std::string, GPUTexture*>::iterator it = textures.begin(); it != textures.end(); ++it)\n    {\n        delete it->second;\n    }\n\n    textures.clear();\n\n    for(std::map<std::string, ComputePack*>::iterator it = computePacks.begin(); it != computePacks.end(); ++it)\n    {\n        delete it->second;\n    }\n\n    computePacks.clear();\n\n    for(std::map<std::string, FeedbackBuffer*>::iterator it = feedbackBuffers.begin(); it != feedbackBuffers.end(); ++it)\n    {\n        delete it->second;\n    }\n\n    feedbackBuffers.clear();\n}\n\nvoid ElasticFusion::createTextures()\n{\n    textures[GPUTexture::RGB] = new GPUTexture(Resolution::getInstance().width(),\n                                               Resolution::getInstance().height(),\n                                               GL_RGBA,\n                                               GL_RGB,\n                                               GL_UNSIGNED_BYTE,\n                                               true,\n                                               true);\n\n    textures[GPUTexture::DEPTH_RAW] = new GPUTexture(Resolution::getInstance().width(),\n                                                     Resolution::getInstance().height(),\n                                                     GL_LUMINANCE16UI_EXT,\n                                                     GL_LUMINANCE_INTEGER_EXT,\n                                                     GL_UNSIGNED_SHORT);\n\n    textures[GPUTexture::DEPTH_FILTERED] = new GPUTexture(Resolution::getInstance().width(),\n                                                          Resolution::getInstance().height(),\n                                                          GL_LUMINANCE16UI_EXT,\n                                                          GL_LUMINANCE_INTEGER_EXT,\n                                                          GL_UNSIGNED_SHORT,\n                                                          false,\n                                                          true);\n\n    textures[GPUTexture::DEPTH_METRIC] = new GPUTexture(Resolution::getInstance().width(),\n                                                        Resolution::getInstance().height(),\n                                                        GL_LUMINANCE32F_ARB,\n                                                        GL_LUMINANCE,\n                                                        GL_FLOAT);\n\n    textures[GPUTexture::DEPTH_METRIC_FILTERED] = new GPUTexture(Resolution::getInstance().width(),\n                                                                 Resolution::getInstance().height(),\n                                                                 GL_LUMINANCE32F_ARB,\n                                                                 GL_LUMINANCE,\n                                                                 GL_FLOAT);\n\n    textures[GPUTexture::DEPTH_NORM] = new GPUTexture(Resolution::getInstance().width(),\n                                                      Resolution::getInstance().height(),\n                                                      GL_LUMINANCE,\n                                                      GL_LUMINANCE,\n                                                      GL_FLOAT,\n                                                      true);\n}\n\nvoid ElasticFusion::createCompute()\n{\n    computePacks[ComputePack::NORM] = new ComputePack(loadProgramFromFile(\"empty.vert\", \"depth_norm.frag\", \"quad.geom\"),\n                                                      textures[GPUTexture::DEPTH_NORM]->texture);\n\n    computePacks[ComputePack::FILTER] = new ComputePack(loadProgramFromFile(\"empty.vert\", \"depth_bilateral.frag\", \"quad.geom\"),\n                                                        textures[GPUTexture::DEPTH_FILTERED]->texture);\n\n    computePacks[ComputePack::METRIC] = new ComputePack(loadProgramFromFile(\"empty.vert\", \"depth_metric.frag\", \"quad.geom\"),\n                                                        textures[GPUTexture::DEPTH_METRIC]->texture);\n\n    computePacks[ComputePack::METRIC_FILTERED] = new ComputePack(loadProgramFromFile(\"empty.vert\", \"depth_metric.frag\", \"quad.geom\"),\n                                                                 textures[GPUTexture::DEPTH_METRIC_FILTERED]->texture);\n}\n\nvoid ElasticFusion::createFeedbackBuffers()\n{\n    feedbackBuffers[FeedbackBuffer::RAW] = new FeedbackBuffer(loadProgramGeomFromFile(\"vertex_feedback.vert\", \"vertex_feedback.geom\"));\n    feedbackBuffers[FeedbackBuffer::FILTERED] = new FeedbackBuffer(loadProgramGeomFromFile(\"vertex_feedback.vert\", \"vertex_feedback.geom\"));\n}\n\nvoid ElasticFusion::computeFeedbackBuffers()\n{\n    TICK(\"feedbackBuffers\");\n    feedbackBuffers[FeedbackBuffer::RAW]->compute(textures[GPUTexture::RGB]->texture,\n                                                  textures[GPUTexture::DEPTH_METRIC]->texture,\n                                                  tick,\n                                                  maxDepthProcessed);\n\n    feedbackBuffers[FeedbackBuffer::FILTERED]->compute(textures[GPUTexture::RGB]->texture,\n                                                       textures[GPUTexture::DEPTH_METRIC_FILTERED]->texture,\n                                                       tick,\n                                                       maxDepthProcessed);\n    TOCK(\"feedbackBuffers\");\n}\n\nbool ElasticFusion::denseEnough(const Img<Eigen::Matrix<unsigned char, 3, 1>> & img)\n{\n    int sum = 0;\n\n    for(int i = 0; i < img.rows; i++)\n    {\n        for(int j = 0; j < img.cols; j++)\n        {\n            sum += img.at<Eigen::Matrix<unsigned char, 3, 1>>(i, j)(0) > 0 &&\n                   img.at<Eigen::Matrix<unsigned char, 3, 1>>(i, j)(1) > 0 &&\n                   img.at<Eigen::Matrix<unsigned char, 3, 1>>(i, j)(2) > 0;\n        }\n    }\n\n    return float(sum) / float(img.rows * img.cols) > 0.75f;\n}\n\nvoid ElasticFusion::processFrame(const unsigned char * rgb,\n                                 const unsigned short * depth,\n                                 const int64_t & timestamp,\n                                 const Eigen::Matrix4f * inPose,\n                                 const float weightMultiplier,\n                                 const bool bootstrap)\n{\n    TICK(\"Run\");\n\n    textures[GPUTexture::DEPTH_RAW]->texture->Upload(depth, GL_LUMINANCE_INTEGER_EXT, GL_UNSIGNED_SHORT);\n    textures[GPUTexture::RGB]->texture->Upload(rgb, GL_RGB, GL_UNSIGNED_BYTE);\n\n    TICK(\"Preprocess\");\n\n    filterDepth();\n    metriciseDepth();\n\n    TOCK(\"Preprocess\");\n\n    //First run\n    if(tick == 1)\n    {\n        computeFeedbackBuffers();\n\n        globalModel.initialise(*feedbackBuffers[FeedbackBuffer::RAW], *feedbackBuffers[FeedbackBuffer::FILTERED]);\n\n        frameToModel.initFirstRGB(textures[GPUTexture::RGB]);\n    }\n    else\n    {\n        Eigen::Matrix4f lastPose = currPose;\n\n        bool trackingOk = true;\n\n        if(bootstrap || !inPose)\n        {\n            TICK(\"autoFill\");\n            resize.image(indexMap.imageTex(), imageBuff);\n            bool shouldFillIn = !denseEnough(imageBuff);\n            TOCK(\"autoFill\");\n\n            TICK(\"odomInit\");\n            //WARNING initICP* must be called before initRGB*\n            frameToModel.initICPModel(shouldFillIn ? &fillIn.vertexTexture : indexMap.vertexTex(),\n                                      shouldFillIn ? &fillIn.normalTexture : indexMap.normalTex(),\n                                      maxDepthProcessed, currPose);\n            frameToModel.initRGBModel((shouldFillIn || frameToFrameRGB) ? &fillIn.imageTexture : indexMap.imageTex());\n\n            frameToModel.initICP(textures[GPUTexture::DEPTH_FILTERED], maxDepthProcessed);\n            frameToModel.initRGB(textures[GPUTexture::RGB]);\n            TOCK(\"odomInit\");\n\n            if(bootstrap)\n            {\n                assert(inPose);\n                currPose = currPose * (*inPose);\n            }\n\n            Eigen::Vector3f trans = currPose.topRightCorner(3, 1);\n            Eigen::Matrix<float, 3, 3, Eigen::RowMajor> rot = currPose.topLeftCorner(3, 3);\n\n            TICK(\"odom\");\n            frameToModel.getIncrementalTransformation(trans,\n                                                      rot,\n                                                      rgbOnly,\n                                                      icpWeight,\n                                                      pyramid,\n                                                      fastOdom,\n                                                      so3);\n            TOCK(\"odom\");\n\n            trackingOk = !reloc || frameToModel.lastICPError < 1e-04;\n\n            if(reloc)\n            {\n                if(!lost)\n                {\n                    Eigen::MatrixXd covariance = frameToModel.getCovariance();\n\n                    for(int i = 0; i < 6; i++)\n                    {\n                        if(covariance(i, i) > 1e-04)\n                        {\n                            trackingOk = false;\n                            break;\n                        }\n                    }\n\n                    if(!trackingOk)\n                    {\n                        trackingCount++;\n\n                        if(trackingCount > 10)\n                        {\n                            lost = true;\n                        }\n                    }\n                    else\n                    {\n                        trackingCount = 0;\n                    }\n                }\n                else if(lastFrameRecovery)\n                {\n                    Eigen::MatrixXd covariance = frameToModel.getCovariance();\n\n                    for(int i = 0; i < 6; i++)\n                    {\n                        if(covariance(i, i) > 1e-04)\n                        {\n                            trackingOk = false;\n                            break;\n                        }\n                    }\n\n                    if(trackingOk)\n                    {\n                        lost = false;\n                        trackingCount = 0;\n                    }\n\n                    lastFrameRecovery = false;\n                }\n            }\n            currPose.topRightCorner(3, 1) = trans;\n            currPose.topLeftCorner(3, 3) = rot;\n        }\n        else\n        {\n            currPose = *inPose;\n        }\n\n        //std::cout << trackingOk << \" \" << lost << \" \" << trackingCount << \" \" << lastFrameRecovery << \"\\n\";\n\n\n        Eigen::Matrix4f diff = currPose.inverse() * lastPose;\n\n        Eigen::Vector3f diffTrans = diff.topRightCorner(3, 1);\n        Eigen::Matrix3f diffRot = diff.topLeftCorner(3, 3);\n\n        //Weight by velocity\n        float weighting = std::max(diffTrans.norm(), rodrigues2(diffRot).norm());\n\n        float largest = 0.01;\n        float minWeight = 0.5;\n\n        if(weighting > largest)\n        {\n            weighting = largest;\n        }\n\n        weighting = std::max(1.0f - (weighting / largest), minWeight) * weightMultiplier;\n\n        std::vector<Ferns::SurfaceConstraint> constraints;\n\n        predict();\n\n        Eigen::Matrix4f recoveryPose = currPose;\n\n        if(closeLoops)\n        {\n            lastFrameRecovery = false;\n\n            TICK(\"Ferns::findFrame\");\n            recoveryPose = ferns.findFrame(constraints,\n                                           currPose,\n                                           &fillIn.vertexTexture,\n                                           &fillIn.normalTexture,\n                                           &fillIn.imageTexture,\n                                           tick,\n                                           lost);\n            TOCK(\"Ferns::findFrame\");\n        }\n\n        std::vector<float> rawGraph;\n\n        bool fernAccepted = false;\n\n        if(closeLoops && ferns.lastClosest != -1)\n        {\n            if(lost)\n            {\n                currPose = recoveryPose;\n                lastFrameRecovery = true;\n            }\n            else\n            {\n                for(size_t i = 0; i < constraints.size(); i++)\n                {\n                    globalDeformation.addConstraint(constraints.at(i).sourcePoint,\n                                                    constraints.at(i).targetPoint,\n                                                    tick,\n                                                    ferns.frames.at(ferns.lastClosest)->srcTime,\n                                                    true);\n                }\n\n                for(size_t i = 0; i < relativeCons.size(); i++)\n                {\n                    globalDeformation.addConstraint(relativeCons.at(i));\n                }\n\n                if(globalDeformation.constrain(ferns.frames, rawGraph, tick, true, poseGraph, true))\n                {\n                    currPose = recoveryPose;\n\n                    poseMatches.push_back(PoseMatch(ferns.lastClosest, ferns.frames.size(), ferns.frames.at(ferns.lastClosest)->pose, currPose, constraints, true));\n\n                    fernDeforms += rawGraph.size() > 0;\n\n                    fernAccepted = true;\n                }\n            }\n        }\n\n        //If we didn't match to a fern\n        if(!lost && closeLoops && rawGraph.size() == 0)\n        {\n            //Only predict old view, since we just predicted the current view for the ferns (which failed!)\n            TICK(\"IndexMap::INACTIVE\");\n            indexMap.combinedPredict(currPose,\n                                     globalModel.model(),\n                                     maxDepthProcessed,\n                                     confidenceThreshold,\n                                     0,\n                                     tick - timeDelta,\n                                     timeDelta,\n                                     IndexMap::INACTIVE);\n            TOCK(\"IndexMap::INACTIVE\");\n\n            //WARNING initICP* must be called before initRGB*\n            modelToModel.initICPModel(indexMap.oldVertexTex(), indexMap.oldNormalTex(), maxDepthProcessed, currPose);\n            modelToModel.initRGBModel(indexMap.oldImageTex());\n\n            modelToModel.initICP(indexMap.vertexTex(), indexMap.normalTex(), maxDepthProcessed);\n            modelToModel.initRGB(indexMap.imageTex());\n\n            Eigen::Vector3f trans = currPose.topRightCorner(3, 1);\n            Eigen::Matrix<float, 3, 3, Eigen::RowMajor> rot = currPose.topLeftCorner(3, 3);\n\n            modelToModel.getIncrementalTransformation(trans,\n                                                      rot,\n                                                      false,\n                                                      10,\n                                                      pyramid,\n                                                      fastOdom,\n                                                      false);\n\n            Eigen::MatrixXd covar = modelToModel.getCovariance();\n            bool covOk = true;\n\n            for(int i = 0; i < 6; i++)\n            {\n                if(covar(i, i) > covThresh)\n                {\n                    covOk = false;\n                    break;\n                }\n            }\n\n            Eigen::Matrix4f estPose = Eigen::Matrix4f::Identity();\n\n            estPose.topRightCorner(3, 1) = trans;\n            estPose.topLeftCorner(3, 3) = rot;\n\n            if(covOk && modelToModel.lastICPCount > icpCountThresh && modelToModel.lastICPError < icpErrThresh)\n            {\n                resize.vertex(indexMap.vertexTex(), consBuff);\n                resize.time(indexMap.oldTimeTex(), timesBuff);\n\n                for(int i = 0; i < consBuff.cols; i++)\n                {\n                    for(int j = 0; j < consBuff.rows; j++)\n                    {\n                        if(consBuff.at<Eigen::Vector4f>(j, i)(2) > 0 &&\n                           consBuff.at<Eigen::Vector4f>(j, i)(2) < maxDepthProcessed &&\n                           timesBuff.at<unsigned short>(j, i) > 0)\n                        {\n                            Eigen::Vector4f worldRawPoint = currPose * Eigen::Vector4f(consBuff.at<Eigen::Vector4f>(j, i)(0),\n                                                                                       consBuff.at<Eigen::Vector4f>(j, i)(1),\n                                                                                       consBuff.at<Eigen::Vector4f>(j, i)(2),\n                                                                                       1.0f);\n\n                            Eigen::Vector4f worldModelPoint = estPose * Eigen::Vector4f(consBuff.at<Eigen::Vector4f>(j, i)(0),\n                                                                                        consBuff.at<Eigen::Vector4f>(j, i)(1),\n                                                                                        consBuff.at<Eigen::Vector4f>(j, i)(2),\n                                                                                        1.0f);\n\n                            constraints.push_back(Ferns::SurfaceConstraint(worldRawPoint, worldModelPoint));\n\n                            localDeformation.addConstraint(worldRawPoint,\n                                                           worldModelPoint,\n                                                           tick,\n                                                           timesBuff.at<unsigned short>(j, i),\n                                                           deforms == 0);\n                        }\n                    }\n                }\n\n                std::vector<Deformation::Constraint> newRelativeCons;\n\n                if(localDeformation.constrain(ferns.frames, rawGraph, tick, false, poseGraph, false, &newRelativeCons))\n                {\n                    poseMatches.push_back(PoseMatch(ferns.frames.size() - 1, ferns.frames.size(), estPose, currPose, constraints, false));\n\n                    deforms += rawGraph.size() > 0;\n\n                    currPose = estPose;\n\n                    for(size_t i = 0; i < newRelativeCons.size(); i += newRelativeCons.size() / 3)\n                    {\n                        relativeCons.push_back(newRelativeCons.at(i));\n                    }\n                }\n            }\n        }\n\n        if(!rgbOnly && trackingOk && !lost)\n        {\n            TICK(\"indexMap\");\n            indexMap.predictIndices(currPose, tick, globalModel.model(), maxDepthProcessed, timeDelta);\n            TOCK(\"indexMap\");\n\n            globalModel.fuse(currPose,\n                             tick,\n                             textures[GPUTexture::RGB],\n                             textures[GPUTexture::DEPTH_METRIC],\n                             textures[GPUTexture::DEPTH_METRIC_FILTERED],\n                             indexMap.indexTex(),\n                             indexMap.vertConfTex(),\n                             indexMap.colorTimeTex(),\n                             indexMap.normalRadTex(),\n                             maxDepthProcessed,\n                             confidenceThreshold,\n                             weighting);\n\n            TICK(\"indexMap\");\n            indexMap.predictIndices(currPose, tick, globalModel.model(), maxDepthProcessed, timeDelta);\n            TOCK(\"indexMap\");\n\n            //If we're deforming we need to predict the depth again to figure out which\n            //points to update the timestamp's of, since a deformation means a second pose update\n            //this loop\n            if(rawGraph.size() > 0 && !fernAccepted)\n            {\n                indexMap.synthesizeDepth(currPose,\n                                         globalModel.model(),\n                                         maxDepthProcessed,\n                                         confidenceThreshold,\n                                         tick,\n                                         tick - timeDelta,\n                                         std::numeric_limits<unsigned short>::max());\n            }\n\n            globalModel.clean(currPose,\n                              tick,\n                              indexMap.indexTex(),\n                              indexMap.vertConfTex(),\n                              indexMap.colorTimeTex(),\n                              indexMap.normalRadTex(),\n                              indexMap.depthTex(),\n                              confidenceThreshold,\n                              rawGraph,\n                              timeDelta,\n                              maxDepthProcessed,\n                              fernAccepted);\n        }\n    }\n\n    poseGraph.push_back(std::pair<unsigned long long int, Eigen::Matrix4f>(tick, currPose));\n    poseLogTimes.push_back(timestamp);\n\n    TICK(\"sampleGraph\");\n\n    localDeformation.sampleGraphModel(globalModel.model());\n\n    globalDeformation.sampleGraphFrom(localDeformation);\n\n    TOCK(\"sampleGraph\");\n\n    predict();\n\n    if(!lost)\n    {\n        processFerns();\n        tick++;\n    }\n\n    TOCK(\"Run\");\n}\n\nvoid ElasticFusion::processFrame_withseg(const unsigned char * rgb,\n                                 const unsigned short * depth,\n                                 const unsigned short * seg,\n                                 const float weight_rgb,\n                                 const float weight_seg,\n                                 const int64_t & timestamp,\n                                 const Eigen::Matrix4f * inPose,\n                                 const float weightMultiplier,\n                                 const bool bootstrap)\n{\n    TICK(\"Run\");\n\n    textures[GPUTexture::DEPTH_RAW]->texture->Upload(depth, GL_LUMINANCE_INTEGER_EXT, GL_UNSIGNED_SHORT);\n    textures[GPUTexture::RGB]->texture->Upload(rgb, GL_RGB, GL_UNSIGNED_BYTE);\n\n    TICK(\"Preprocess\");\n\n    filterDepth();\n    metriciseDepth();\n\n    TOCK(\"Preprocess\");\n\n    //First run\n    if(tick == 1)\n    {\n        computeFeedbackBuffers();\n\n        globalModel.initialise(*feedbackBuffers[FeedbackBuffer::RAW], *feedbackBuffers[FeedbackBuffer::FILTERED]);\n\n        frameToModel.initFirstRGB(textures[GPUTexture::RGB]);\n    }\n    else\n    {\n        Eigen::Matrix4f lastPose = currPose;\n\n        bool trackingOk = true;\n\n        if(bootstrap || !inPose)\n        {\n            TICK(\"autoFill\");\n            resize.image(indexMap.imageTex(), imageBuff);\n            bool shouldFillIn = !denseEnough(imageBuff);\n            TOCK(\"autoFill\");\n\n            TICK(\"odomInit\");\n            //WARNING initICP* must be called before initRGB*\n            frameToModel.initICPModel(shouldFillIn ? &fillIn.vertexTexture : indexMap.vertexTex(),\n                                      shouldFillIn ? &fillIn.normalTexture : indexMap.normalTex(),\n                                      maxDepthProcessed, currPose);\n            frameToModel.initRGBModel((shouldFillIn || frameToFrameRGB) ? &fillIn.imageTexture : indexMap.imageTex());\n\n            frameToModel.initICP(textures[GPUTexture::DEPTH_FILTERED], maxDepthProcessed);\n            frameToModel.initRGB(textures[GPUTexture::RGB]);\n            TOCK(\"odomInit\");\n\n            if(bootstrap)\n            {\n                assert(inPose);\n                currPose = currPose * (*inPose);\n            }\n\n            Eigen::Vector3f trans = currPose.topRightCorner(3, 1);\n            Eigen::Matrix<float, 3, 3, Eigen::RowMajor> rot = currPose.topLeftCorner(3, 3);\n\n            TICK(\"odom\");\n            frameToModel.getIncrementalTransformation_withseg(trans,\n                                                      rot,\n                                                      rgbOnly,\n                                                      weight_rgb,\n                                                      weight_seg,\n                                                      icpWeight,\n                                                      pyramid,\n                                                      fastOdom,\n                                                      so3);\n            TOCK(\"odom\");\n\n            trackingOk = !reloc || frameToModel.lastICPError < 1e-04;\n\n            if(reloc)\n            {\n                if(!lost)\n                {\n                    Eigen::MatrixXd covariance = frameToModel.getCovariance();\n\n                    for(int i = 0; i < 6; i++)\n                    {\n                        if(covariance(i, i) > 1e-04)\n                        {\n                            trackingOk = false;\n                            break;\n                        }\n                    }\n\n                    if(!trackingOk)\n                    {\n                        trackingCount++;\n\n                        if(trackingCount > 10)\n                        {\n                            lost = true;\n                        }\n                    }\n                    else\n                    {\n                        trackingCount = 0;\n                    }\n                }\n                else if(lastFrameRecovery)\n                {\n                    Eigen::MatrixXd covariance = frameToModel.getCovariance();\n\n                    for(int i = 0; i < 6; i++)\n                    {\n                        if(covariance(i, i) > 1e-04)\n                        {\n                            trackingOk = false;\n                            break;\n                        }\n                    }\n\n                    if(trackingOk)\n                    {\n                        lost = false;\n                        trackingCount = 0;\n                    }\n\n                    lastFrameRecovery = false;\n                }\n            }\n            currPose.topRightCorner(3, 1) = trans;\n            currPose.topLeftCorner(3, 3) = rot;\n        }\n        else\n        {\n            currPose = *inPose;\n        }\n\n        //std::cout << trackingOk << \" \" << lost << \" \" << trackingCount << \" \" << lastFrameRecovery << \"\\n\";\n\n\n        Eigen::Matrix4f diff = currPose.inverse() * lastPose;\n\n        Eigen::Vector3f diffTrans = diff.topRightCorner(3, 1);\n        Eigen::Matrix3f diffRot = diff.topLeftCorner(3, 3);\n\n        //Weight by velocity\n        float weighting = std::max(diffTrans.norm(), rodrigues2(diffRot).norm());\n\n        float largest = 0.01;\n        float minWeight = 0.5;\n\n        if(weighting > largest)\n        {\n            weighting = largest;\n        }\n\n        weighting = std::max(1.0f - (weighting / largest), minWeight) * weightMultiplier;\n\n        std::vector<Ferns::SurfaceConstraint> constraints;\n\n        predict();\n\n        Eigen::Matrix4f recoveryPose = currPose;\n\n        if(closeLoops)\n        {\n            lastFrameRecovery = false;\n\n            TICK(\"Ferns::findFrame\");\n            recoveryPose = ferns.findFrame(constraints,\n                                           currPose,\n                                           &fillIn.vertexTexture,\n                                           &fillIn.normalTexture,\n                                           &fillIn.imageTexture,\n                                           tick,\n                                           lost);\n            TOCK(\"Ferns::findFrame\");\n        }\n\n        std::vector<float> rawGraph;\n\n        bool fernAccepted = false;\n\n        if(closeLoops && ferns.lastClosest != -1)\n        {\n            if(lost)\n            {\n                currPose = recoveryPose;\n                lastFrameRecovery = true;\n            }\n            else\n            {\n                for(size_t i = 0; i < constraints.size(); i++)\n                {\n                    globalDeformation.addConstraint(constraints.at(i).sourcePoint,\n                                                    constraints.at(i).targetPoint,\n                                                    tick,\n                                                    ferns.frames.at(ferns.lastClosest)->srcTime,\n                                                    true);\n                }\n\n                for(size_t i = 0; i < relativeCons.size(); i++)\n                {\n                    globalDeformation.addConstraint(relativeCons.at(i));\n                }\n\n                if(globalDeformation.constrain(ferns.frames, rawGraph, tick, true, poseGraph, true))\n                {\n                    currPose = recoveryPose;\n\n                    poseMatches.push_back(PoseMatch(ferns.lastClosest, ferns.frames.size(), ferns.frames.at(ferns.lastClosest)->pose, currPose, constraints, true));\n\n                    fernDeforms += rawGraph.size() > 0;\n\n                    fernAccepted = true;\n                }\n            }\n        }\n\n        //If we didn't match to a fern\n        if(!lost && closeLoops && rawGraph.size() == 0)\n        {\n            //Only predict old view, since we just predicted the current view for the ferns (which failed!)\n            TICK(\"IndexMap::INACTIVE\");\n            indexMap.combinedPredict(currPose,\n                                     globalModel.model(),\n                                     maxDepthProcessed,\n                                     confidenceThreshold,\n                                     0,\n                                     tick - timeDelta,\n                                     timeDelta,\n                                     IndexMap::INACTIVE);\n            TOCK(\"IndexMap::INACTIVE\");\n\n            //WARNING initICP* must be called before initRGB*\n            modelToModel.initICPModel(indexMap.oldVertexTex(), indexMap.oldNormalTex(), maxDepthProcessed, currPose);\n            modelToModel.initRGBModel(indexMap.oldImageTex());\n\n            modelToModel.initICP(indexMap.vertexTex(), indexMap.normalTex(), maxDepthProcessed);\n            modelToModel.initRGB(indexMap.imageTex());\n\n            Eigen::Vector3f trans = currPose.topRightCorner(3, 1);\n            Eigen::Matrix<float, 3, 3, Eigen::RowMajor> rot = currPose.topLeftCorner(3, 3);\n\n            modelToModel.getIncrementalTransformation(trans,\n                                                      rot,\n                                                      false,\n                                                      10,\n                                                      pyramid,\n                                                      fastOdom,\n                                                      false);\n\n            Eigen::MatrixXd covar = modelToModel.getCovariance();\n            bool covOk = true;\n\n            for(int i = 0; i < 6; i++)\n            {\n                if(covar(i, i) > covThresh)\n                {\n                    covOk = false;\n                    break;\n                }\n            }\n\n            Eigen::Matrix4f estPose = Eigen::Matrix4f::Identity();\n\n            estPose.topRightCorner(3, 1) = trans;\n            estPose.topLeftCorner(3, 3) = rot;\n\n            if(covOk && modelToModel.lastICPCount > icpCountThresh && modelToModel.lastICPError < icpErrThresh)\n            {\n                resize.vertex(indexMap.vertexTex(), consBuff);\n                resize.time(indexMap.oldTimeTex(), timesBuff);\n\n                for(int i = 0; i < consBuff.cols; i++)\n                {\n                    for(int j = 0; j < consBuff.rows; j++)\n                    {\n                        if(consBuff.at<Eigen::Vector4f>(j, i)(2) > 0 &&\n                           consBuff.at<Eigen::Vector4f>(j, i)(2) < maxDepthProcessed &&\n                           timesBuff.at<unsigned short>(j, i) > 0)\n                        {\n                            Eigen::Vector4f worldRawPoint = currPose * Eigen::Vector4f(consBuff.at<Eigen::Vector4f>(j, i)(0),\n                                                                                       consBuff.at<Eigen::Vector4f>(j, i)(1),\n                                                                                       consBuff.at<Eigen::Vector4f>(j, i)(2),\n                                                                                       1.0f);\n\n                            Eigen::Vector4f worldModelPoint = estPose * Eigen::Vector4f(consBuff.at<Eigen::Vector4f>(j, i)(0),\n                                                                                        consBuff.at<Eigen::Vector4f>(j, i)(1),\n                                                                                        consBuff.at<Eigen::Vector4f>(j, i)(2),\n                                                                                        1.0f);\n\n                            constraints.push_back(Ferns::SurfaceConstraint(worldRawPoint, worldModelPoint));\n\n                            localDeformation.addConstraint(worldRawPoint,\n                                                           worldModelPoint,\n                                                           tick,\n                                                           timesBuff.at<unsigned short>(j, i),\n                                                           deforms == 0);\n                        }\n                    }\n                }\n\n                std::vector<Deformation::Constraint> newRelativeCons;\n\n                if(localDeformation.constrain(ferns.frames, rawGraph, tick, false, poseGraph, false, &newRelativeCons))\n                {\n                    poseMatches.push_back(PoseMatch(ferns.frames.size() - 1, ferns.frames.size(), estPose, currPose, constraints, false));\n\n                    deforms += rawGraph.size() > 0;\n\n                    currPose = estPose;\n\n                    for(size_t i = 0; i < newRelativeCons.size(); i += newRelativeCons.size() / 3)\n                    {\n                        relativeCons.push_back(newRelativeCons.at(i));\n                    }\n                }\n            }\n        }\n\n        if(!rgbOnly && trackingOk && !lost)\n        {\n            TICK(\"indexMap\");\n            indexMap.predictIndices(currPose, tick, globalModel.model(), maxDepthProcessed, timeDelta);\n            TOCK(\"indexMap\");\n\n            globalModel.fuse(currPose,\n                             tick,\n                             textures[GPUTexture::RGB],\n                             textures[GPUTexture::DEPTH_METRIC],\n                             textures[GPUTexture::DEPTH_METRIC_FILTERED],\n                             indexMap.indexTex(),\n                             indexMap.vertConfTex(),\n                             indexMap.colorTimeTex(),\n                             indexMap.normalRadTex(),\n                             maxDepthProcessed,\n                             confidenceThreshold,\n                             weighting);\n\n            TICK(\"indexMap\");\n            indexMap.predictIndices(currPose, tick, globalModel.model(), maxDepthProcessed, timeDelta);\n            TOCK(\"indexMap\");\n\n            //If we're deforming we need to predict the depth again to figure out which\n            //points to update the timestamp's of, since a deformation means a second pose update\n            //this loop\n            if(rawGraph.size() > 0 && !fernAccepted)\n            {\n                indexMap.synthesizeDepth(currPose,\n                                         globalModel.model(),\n                                         maxDepthProcessed,\n                                         confidenceThreshold,\n                                         tick,\n                                         tick - timeDelta,\n                                         std::numeric_limits<unsigned short>::max());\n            }\n\n            globalModel.clean(currPose,\n                              tick,\n                              indexMap.indexTex(),\n                              indexMap.vertConfTex(),\n                              indexMap.colorTimeTex(),\n                              indexMap.normalRadTex(),\n                              indexMap.depthTex(),\n                              confidenceThreshold,\n                              rawGraph,\n                              timeDelta,\n                              maxDepthProcessed,\n                              fernAccepted);\n        }\n    }\n\n    poseGraph.push_back(std::pair<unsigned long long int, Eigen::Matrix4f>(tick, currPose));\n    poseLogTimes.push_back(timestamp);\n\n    TICK(\"sampleGraph\");\n\n    localDeformation.sampleGraphModel(globalModel.model());\n\n    globalDeformation.sampleGraphFrom(localDeformation);\n\n    TOCK(\"sampleGraph\");\n\n    predict();\n\n    if(!lost)\n    {\n        processFerns();\n        tick++;\n    }\n\n    TOCK(\"Run\");\n}\n\nvoid ElasticFusion::processFerns()\n{\n    TICK(\"Ferns::addFrame\");\n    ferns.addFrame(&fillIn.imageTexture, &fillIn.vertexTexture, &fillIn.normalTexture, currPose, tick, fernThresh);\n    TOCK(\"Ferns::addFrame\");\n}\n\nvoid ElasticFusion::predict()\n{\n    TICK(\"IndexMap::ACTIVE\");\n\n    if(lastFrameRecovery)\n    {\n        indexMap.combinedPredict(currPose,\n                                 globalModel.model(),\n                                 maxDepthProcessed,\n                                 confidenceThreshold,\n                                 0,\n                                 tick,\n                                 timeDelta,\n                                 IndexMap::ACTIVE);\n    }\n    else\n    {\n        indexMap.combinedPredict(currPose,\n                                 globalModel.model(),\n                                 maxDepthProcessed,\n                                 confidenceThreshold,\n                                 tick,\n                                 tick,\n                                 timeDelta,\n                                 IndexMap::ACTIVE);\n    }\n\n    TICK(\"FillIn\");\n    fillIn.vertex(indexMap.vertexTex(), textures[GPUTexture::DEPTH_FILTERED], lost);\n    fillIn.normal(indexMap.normalTex(), textures[GPUTexture::DEPTH_FILTERED], lost);\n    fillIn.image(indexMap.imageTex(), textures[GPUTexture::RGB], lost || frameToFrameRGB);\n    TOCK(\"FillIn\");\n\n    TOCK(\"IndexMap::ACTIVE\");\n}\n\nvoid ElasticFusion::metriciseDepth()\n{\n    std::vector<Uniform> uniforms;\n\n    uniforms.push_back(Uniform(\"maxD\", depthCutoff));\n\n    computePacks[ComputePack::METRIC]->compute(textures[GPUTexture::DEPTH_RAW]->texture, &uniforms);\n    computePacks[ComputePack::METRIC_FILTERED]->compute(textures[GPUTexture::DEPTH_FILTERED]->texture, &uniforms);\n}\n\nvoid ElasticFusion::filterDepth()\n{\n    std::vector<Uniform> uniforms;\n\n    uniforms.push_back(Uniform(\"cols\", (float)Resolution::getInstance().cols()));\n    uniforms.push_back(Uniform(\"rows\", (float)Resolution::getInstance().rows()));\n    uniforms.push_back(Uniform(\"maxD\", depthCutoff));\n\n    computePacks[ComputePack::FILTER]->compute(textures[GPUTexture::DEPTH_RAW]->texture, &uniforms);\n}\n\nvoid ElasticFusion::normaliseDepth(const float & minVal, const float & maxVal)\n{\n    std::vector<Uniform> uniforms;\n\n    uniforms.push_back(Uniform(\"maxVal\", maxVal * 1000.f));\n    uniforms.push_back(Uniform(\"minVal\", minVal * 1000.f));\n\n    computePacks[ComputePack::NORM]->compute(textures[GPUTexture::DEPTH_RAW]->texture, &uniforms);\n}\n\nvoid ElasticFusion::savePly()\n{\n    std::string filename = saveFilename;\n    filename.append(\".ply\");\n\n    // Open file\n    std::ofstream fs;\n    fs.open (filename.c_str ());\n\n    Eigen::Vector4f * mapData = globalModel.downloadMap();\n\n    int validCount = 0;\n\n    for(unsigned int i = 0; i < globalModel.lastCount(); i++)\n    {\n        Eigen::Vector4f pos = mapData[(i * 3) + 0];\n\n        if(pos[3] > confidenceThreshold)\n        {\n            validCount++;\n        }\n    }\n\n    // Write header\n    fs << \"ply\";\n    fs << \"\\nformat \" << \"binary_little_endian\" << \" 1.0\";\n\n    // Vertices\n    fs << \"\\nelement vertex \"<< validCount;\n    fs << \"\\nproperty float x\"\n          \"\\nproperty float y\"\n          \"\\nproperty float z\";\n\n    fs << \"\\nproperty uchar red\"\n          \"\\nproperty uchar green\"\n          \"\\nproperty uchar blue\";\n\n    fs << \"\\nproperty float nx\"\n          \"\\nproperty float ny\"\n          \"\\nproperty float nz\";\n\n    fs << \"\\nproperty float radius\";\n\n    fs << \"\\nend_header\\n\";\n\n    // Close the file\n    fs.close ();\n\n    // Open file in binary appendable\n    std::ofstream fpout (filename.c_str (), std::ios::app | std::ios::binary);\n\n    for(unsigned int i = 0; i < globalModel.lastCount(); i++)\n    {\n        Eigen::Vector4f pos = mapData[(i * 3) + 0];\n\n        if(pos[3] > confidenceThreshold)\n        {\n            Eigen::Vector4f col = mapData[(i * 3) + 1];\n            Eigen::Vector4f nor = mapData[(i * 3) + 2];\n\n            nor[0] *= -1;\n            nor[1] *= -1;\n            nor[2] *= -1;\n\n            float value;\n            memcpy (&value, &pos[0], sizeof (float));\n            fpout.write (reinterpret_cast<const char*> (&value), sizeof (float));\n\n            memcpy (&value, &pos[1], sizeof (float));\n            fpout.write (reinterpret_cast<const char*> (&value), sizeof (float));\n\n            memcpy (&value, &pos[2], sizeof (float));\n            fpout.write (reinterpret_cast<const char*> (&value), sizeof (float));\n\n            unsigned char r = int(col[0]) >> 16 & 0xFF;\n            unsigned char g = int(col[0]) >> 8 & 0xFF;\n            unsigned char b = int(col[0]) & 0xFF;\n\n            fpout.write (reinterpret_cast<const char*> (&r), sizeof (unsigned char));\n            fpout.write (reinterpret_cast<const char*> (&g), sizeof (unsigned char));\n            fpout.write (reinterpret_cast<const char*> (&b), sizeof (unsigned char));\n\n            memcpy (&value, &nor[0], sizeof (float));\n            fpout.write (reinterpret_cast<const char*> (&value), sizeof (float));\n\n            memcpy (&value, &nor[1], sizeof (float));\n            fpout.write (reinterpret_cast<const char*> (&value), sizeof (float));\n\n            memcpy (&value, &nor[2], sizeof (float));\n            fpout.write (reinterpret_cast<const char*> (&value), sizeof (float));\n\n            memcpy (&value, &nor[3], sizeof (float));\n            fpout.write (reinterpret_cast<const char*> (&value), sizeof (float));\n        }\n    }\n\n    // Close file\n    fs.close ();\n\n    delete [] mapData;\n}\n\nEigen::Vector3f ElasticFusion::rodrigues2(const Eigen::Matrix3f& matrix)\n{\n    Eigen::JacobiSVD<Eigen::Matrix3f> svd(matrix, Eigen::ComputeFullV | Eigen::ComputeFullU);\n    Eigen::Matrix3f R = svd.matrixU() * svd.matrixV().transpose();\n\n    double rx = R(2, 1) - R(1, 2);\n    double ry = R(0, 2) - R(2, 0);\n    double rz = R(1, 0) - R(0, 1);\n\n    double s = sqrt((rx*rx + ry*ry + rz*rz)*0.25);\n    double c = (R.trace() - 1) * 0.5;\n    c = c > 1. ? 1. : c < -1. ? -1. : c;\n\n    double theta = acos(c);\n\n    if( s < 1e-5 )\n    {\n        double t;\n\n        if( c > 0 )\n            rx = ry = rz = 0;\n        else\n        {\n            t = (R(0, 0) + 1)*0.5;\n            rx = sqrt( std::max(t, 0.0) );\n            t = (R(1, 1) + 1)*0.5;\n            ry = sqrt( std::max(t, 0.0) ) * (R(0, 1) < 0 ? -1.0 : 1.0);\n            t = (R(2, 2) + 1)*0.5;\n            rz = sqrt( std::max(t, 0.0) ) * (R(0, 2) < 0 ? -1.0 : 1.0);\n\n            if( fabs(rx) < fabs(ry) && fabs(rx) < fabs(rz) && (R(1, 2) > 0) != (ry*rz > 0) )\n                rz = -rz;\n            theta /= sqrt(rx*rx + ry*ry + rz*rz);\n            rx *= theta;\n            ry *= theta;\n            rz *= theta;\n        }\n    }\n    else\n    {\n        double vth = 1/(2*s);\n        vth *= theta;\n        rx *= vth; ry *= vth; rz *= vth;\n    }\n    return Eigen::Vector3d(rx, ry, rz).cast<float>();\n}\n\n//Sad times ahead\nIndexMap & ElasticFusion::getIndexMap()\n{\n    return indexMap;\n}\n\nGlobalModel & ElasticFusion::getGlobalModel()\n{\n    return globalModel;\n}\n\nFerns & ElasticFusion::getFerns()\n{\n    return ferns;\n}\n\nDeformation & ElasticFusion::getLocalDeformation()\n{\n    return localDeformation;\n}\n\nstd::map<std::string, GPUTexture*> & ElasticFusion::getTextures()\n{\n    return textures;\n}\n\nconst std::vector<PoseMatch> & ElasticFusion::getPoseMatches()\n{\n    return poseMatches;\n}\n\nconst RGBDOdometry & ElasticFusion::getModelToModel()\n{\n    return modelToModel;\n}\n\nconst float & ElasticFusion::getConfidenceThreshold()\n{\n    return confidenceThreshold;\n}\n\nvoid ElasticFusion::setRgbOnly(const bool & val)\n{\n    rgbOnly = val;\n}\n\nvoid ElasticFusion::setIcpWeight(const float & val)\n{\n    icpWeight = val;\n}\n\nvoid ElasticFusion::setPyramid(const bool & val)\n{\n    pyramid = val;\n}\n\nvoid ElasticFusion::setFastOdom(const bool & val)\n{\n    fastOdom = val;\n}\n\nvoid ElasticFusion::setSo3(const bool & val)\n{\n    so3 = val;\n}\n\nvoid ElasticFusion::setFrameToFrameRGB(const bool & val)\n{\n    frameToFrameRGB = val;\n}\n\nvoid ElasticFusion::setConfidenceThreshold(const float & val)\n{\n    confidenceThreshold = val;\n}\n\nvoid ElasticFusion::setFernThresh(const float & val)\n{\n    fernThresh = val;\n}\n\nvoid ElasticFusion::setDepthCutoff(const float & val)\n{\n    depthCutoff = val;\n}\n\nconst bool & ElasticFusion::getLost() //lel\n{\n    return lost;\n}\n\nconst int & ElasticFusion::getTick()\n{\n    return tick;\n}\n\nconst int & ElasticFusion::getTimeDelta()\n{\n    return timeDelta;\n}\n\nvoid ElasticFusion::setTick(const int & val)\n{\n    tick = val;\n}\n\nconst float & ElasticFusion::getMaxDepthProcessed()\n{\n    return maxDepthProcessed;\n}\n\nconst Eigen::Matrix4f & ElasticFusion::getCurrPose()\n{\n    return currPose;\n}\n\nconst int & ElasticFusion::getDeforms()\n{\n    return deforms;\n}\n\nconst int & ElasticFusion::getFernDeforms()\n{\n    return fernDeforms;\n}\n\nstd::map<std::string, FeedbackBuffer*> & ElasticFusion::getFeedbackBuffers()\n{\n    return feedbackBuffers;\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/ElasticFusion.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef ELASTICFUSION_H_\n#define ELASTICFUSION_H_\n\n#include \"Utils/RGBDOdometry.h\"\n#include \"Utils/Resolution.h\"\n#include \"Utils/Intrinsics.h\"\n#include \"Utils/Stopwatch.h\"\n#include \"Shaders/Shaders.h\"\n#include \"Shaders/ComputePack.h\"\n#include \"Shaders/FeedbackBuffer.h\"\n#include \"Shaders/FillIn.h\"\n#include \"Deformation.h\"\n#include \"GlobalModel.h\"\n#include \"IndexMap.h\"\n#include \"Ferns.h\"\n#include \"PoseMatch.h\"\n#include \"Defines.h\"\n\n#include <iomanip>\n#include <pangolin/gl/glcuda.h>\n\nclass ElasticFusion\n{\n    public:\n        EFUSION_API ElasticFusion(const int timeDelta = 200,\n                      const int countThresh = 35000,\n                      const float errThresh = 5e-05,\n                      const float covThresh = 1e-05,\n                      const bool closeLoops = true,\n                      const bool iclnuim = false,\n                      const bool reloc = false,\n                      const float photoThresh = 115,\n                      const float confidence = 10,\n                      const float depthCut = 3,\n                      const float icpThresh = 10,\n                      const bool fastOdom = false,\n                      const float fernThresh = 0.3095,\n                      const bool so3 = true,\n                      const bool frameToFrameRGB = false,\n                      const std::string fileName = \"\");\n\n        virtual ~ElasticFusion();\n\n        /**\n         * Process an rgb/depth map pair\n         * @param rgb unsigned char row major order\n         * @param depth unsigned short z-depth in millimeters, invalid depths are 0\n         * @param timestamp nanoseconds (actually only used for the output poses, not important otherwise)\n         * @param inPose optional input SE3 pose (if provided, we don't attempt to perform tracking)\n         * @param weightMultiplier optional full frame fusion weight\n         * @param bootstrap if true, use inPose as a pose guess rather than replacement\n         */\n        EFUSION_API void processFrame(const unsigned char * rgb,\n                          const unsigned short * depth,\n                          const int64_t & timestamp,\n                          const Eigen::Matrix4f * inPose = 0,\n                          const float weightMultiplier = 1.f,\n                          const bool bootstrap = false);\n\n        EFUSION_API void processFrame_withseg(const unsigned char * rgb,\n                          const unsigned short * depth,\n                          const unsigned short * seg,\n                          const float weight_rgb,\n                          const float weight_seg,\n                          const int64_t & timestamp,\n                          const Eigen::Matrix4f * inPose = 0,\n                          const float weightMultiplier = 1.f,\n                          const bool bootstrap = false);\n        \n\n        /**\n         * Predicts the current view of the scene, updates the [vertex/normal/image]Tex() members\n         * of the indexMap class\n         */\n        EFUSION_API void predict();\n\n        /**\n         * This class contains all of the predicted renders\n         * @return reference\n         */\n        EFUSION_API IndexMap & getIndexMap();\n\n        /**\n         * This class contains the surfel map\n         * @return\n         */\n        EFUSION_API GlobalModel & getGlobalModel();\n\n        /**\n         * This class contains the fern keyframe database\n         * @return\n         */\n        EFUSION_API Ferns & getFerns();\n\n        /**\n         * This class contains the local deformation graph\n         * @return\n         */\n        EFUSION_API Deformation & getLocalDeformation();\n\n        /**\n         * This is the map of raw input textures (you can display these)\n         * @return\n         */\n        EFUSION_API std::map<std::string, GPUTexture*> & getTextures();\n\n        /**\n         * This is the list of deformation constraints\n         * @return\n         */\n        EFUSION_API const std::vector<PoseMatch> & getPoseMatches();\n\n        /**\n         * This is the tracking class, if you want access\n         * @return\n         */\n        EFUSION_API const RGBDOdometry & getModelToModel();\n\n        /**\n         * The point fusion confidence threshold\n         * @return\n         */\n        EFUSION_API const float & getConfidenceThreshold();\n\n        /**\n         * If you set this to true we just do 2.5D RGB-only Lucas–Kanade tracking (no fusion)\n         * @param val\n         */\n        EFUSION_API void setRgbOnly(const bool & val);\n\n        /**\n         * Weight for ICP in tracking\n         * @param val if 100, only use depth for tracking, if 0, only use RGB. Best value is 10\n         */\n        EFUSION_API void setIcpWeight(const float & val);\n\n        /**\n         * Whether or not to use a pyramid for tracking\n         * @param val default is true\n         */\n        EFUSION_API void setPyramid(const bool & val);\n\n        /**\n         * Controls the number of tracking iterations\n         * @param val default is false\n         */\n        EFUSION_API void setFastOdom(const bool & val);\n\n        /**\n         * Turns on or off SO(3) alignment bootstrapping\n         * @param val\n         */\n        EFUSION_API void setSo3(const bool & val);\n\n        /**\n         * Turns on or off frame to frame tracking for RGB\n         * @param val\n         */\n        EFUSION_API void setFrameToFrameRGB(const bool & val);\n\n        /**\n         * Raw data fusion confidence threshold\n         * @param val default value is 10, but you can play around with this\n         */\n        EFUSION_API void setConfidenceThreshold(const float & val);\n\n        /**\n         * Threshold for sampling new keyframes\n         * @param val default is some magic value, change at your own risk\n         */\n        EFUSION_API void setFernThresh(const float & val);\n\n        /**\n         * Cut raw depth input off at this point\n         * @param val default is 3 meters\n         */\n        EFUSION_API void setDepthCutoff(const float & val);\n\n        /**\n         * Returns whether or not the camera is lost, if relocalisation mode is on\n         * @return\n         */\n        EFUSION_API const bool & getLost();\n\n        /**\n         * Get the internal clock value of the fusion process\n         * @return monotonically increasing integer value (not real-world time)\n         */\n        EFUSION_API const int & getTick();\n\n        /**\n         * Get the time window length for model matching\n         * @return\n         */\n        EFUSION_API const int & getTimeDelta();\n\n        /**\n         * Cheat the clock, only useful for multisession/log fast forwarding\n         * @param val control time itself!\n         */\n        EFUSION_API void setTick(const int & val);\n\n        /**\n         * Internal maximum depth processed, this is defaulted to 20 (for rescaling depth buffers)\n         * @return\n         */\n        EFUSION_API const float & getMaxDepthProcessed();\n\n        /**\n         * The current global camera pose estimate\n         * @return SE3 pose\n         */\n        EFUSION_API const Eigen::Matrix4f & getCurrPose();\n\n        /**\n         * The number of local deformations that have occurred\n         * @return\n         */\n        EFUSION_API const int & getDeforms();\n\n        /**\n         * The number of global deformations that have occured\n         * @return\n         */\n        EFUSION_API const int & getFernDeforms();\n\n        /**\n         * These are the vertex buffers computed from the raw input data\n         * @return can be rendered\n         */\n        EFUSION_API std::map<std::string, FeedbackBuffer*> & getFeedbackBuffers();\n\n        /**\n         * Calculate the above for the current frame (only done on the first frame normally)\n         */\n        EFUSION_API void computeFeedbackBuffers();\n\n        /**\n         * Saves out a .ply mesh file of the current model\n         */\n        EFUSION_API void savePly();\n\n        /**\n         * Renders a normalised view of the input raw depth for displaying as an OpenGL texture\n         * (this is stored under textures[GPUTexture::DEPTH_NORM]\n         * @param minVal minimum depth value to render\n         * @param maxVal maximum depth value to render\n         */\n        EFUSION_API void normaliseDepth(const float & minVal, const float & maxVal);\n\n        //Here be dragons\n        //cuong\n        std::string saveFilename;\n\n    private:\n        IndexMap indexMap;\n        RGBDOdometry frameToModel;\n        RGBDOdometry modelToModel;\n        GlobalModel globalModel;\n        FillIn fillIn;\n        Ferns ferns;\n        Deformation localDeformation;\n        Deformation globalDeformation;\n\n        std::map<std::string, GPUTexture*> textures;\n        std::map<std::string, ComputePack*> computePacks;\n        std::map<std::string, FeedbackBuffer*> feedbackBuffers;\n\n        void createTextures();\n        void createCompute();\n        void createFeedbackBuffers();\n\n        void filterDepth();\n        void metriciseDepth();\n\n        bool denseEnough(const Img<Eigen::Matrix<unsigned char, 3, 1>> & img);\n\n        void processFerns();\n\n        Eigen::Vector3f rodrigues2(const Eigen::Matrix3f& matrix);\n\n        Eigen::Matrix4f currPose;\n\n        int tick;\n        const int timeDelta;\n        const int icpCountThresh;\n        const float icpErrThresh;\n        const float covThresh;\n\n        int deforms;\n        int fernDeforms;\n        const int consSample;\n        Resize resize;\n\n        std::vector<PoseMatch> poseMatches;\n        std::vector<Deformation::Constraint> relativeCons;\n\n        std::vector<std::pair<unsigned long long int, Eigen::Matrix4f> > poseGraph;\n        std::vector<unsigned long long int> poseLogTimes;\n\n        Img<Eigen::Matrix<unsigned char, 3, 1>> imageBuff;\n        Img<Eigen::Vector4f> consBuff;\n        Img<unsigned short> timesBuff;\n\n        const bool closeLoops;\n        const bool iclnuim;\n\n        const bool reloc;\n        bool lost;\n        bool lastFrameRecovery;\n        int trackingCount;\n        const float maxDepthProcessed;\n\n        bool rgbOnly;\n        float icpWeight;\n        bool pyramid;\n        bool fastOdom;\n        float confidenceThreshold;\n        float fernThresh;\n        bool so3;\n        bool frameToFrameRGB;\n        float depthCutoff;\n};\n\n#endif /* ELASTICFUSION_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Ferns.cpp",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#include \"Ferns.h\"\n\nFerns::Ferns(int n, int maxDepth, const float photoThresh)\n : num(n),\n   factor(8),\n   width(Resolution::getInstance().width() / factor),\n   height(Resolution::getInstance().height() / factor),\n   maxDepth(maxDepth),\n   photoThresh(photoThresh),\n   widthDist(0, width - 1),\n   heightDist(0, height - 1),\n   rgbDist(0, 255),\n   dDist(400, maxDepth),\n   lastClosest(-1),\n   badCode(255),\n   rgbd(Resolution::getInstance().width() / factor,\n        Resolution::getInstance().height() / factor,\n        Intrinsics::getInstance().cx() / factor,\n        Intrinsics::getInstance().cy() / factor,\n        Intrinsics::getInstance().fx() / factor,\n        Intrinsics::getInstance().fy() / factor),\n   vertFern(width, height, GL_RGBA32F, GL_LUMINANCE, GL_FLOAT, false, true),\n   vertCurrent(width, height, GL_RGBA32F, GL_LUMINANCE, GL_FLOAT, false, true),\n   normFern(width, height, GL_RGBA32F, GL_LUMINANCE, GL_FLOAT, false, true),\n   normCurrent(width, height, GL_RGBA32F, GL_LUMINANCE, GL_FLOAT, false, true),\n   colorFern(width, height, GL_RGBA, GL_RGB, GL_UNSIGNED_BYTE, false, true),\n   colorCurrent(width, height, GL_RGBA, GL_RGB, GL_UNSIGNED_BYTE, false, true),\n   resize(Resolution::getInstance().width(), Resolution::getInstance().height(), width, height),\n   imageBuff(width, height),\n   vertBuff(width, height),\n   normBuff(width, height)\n{\n    random.seed(time(0));\n    generateFerns();\n}\n\nFerns::~Ferns()\n{\n    for(size_t i = 0; i < frames.size(); i++)\n    {\n        delete frames.at(i);\n    }\n}\n\nvoid Ferns::generateFerns()\n{\n    for(int i = 0; i < num; i++)\n    {\n        Fern f;\n\n        f.pos(0) = widthDist(random);\n        f.pos(1) = heightDist(random);\n\n        f.rgbd(0) = rgbDist(random);\n        f.rgbd(1) = rgbDist(random);\n        f.rgbd(2) = rgbDist(random);\n        f.rgbd(3) = dDist(random);\n\n        conservatory.push_back(f);\n    }\n}\n\nbool Ferns::addFrame(GPUTexture * imageTexture, GPUTexture * vertexTexture, GPUTexture * normalTexture, const Eigen::Matrix4f & pose, int srcTime, const float threshold)\n{\n    Img<Eigen::Matrix<unsigned char, 3, 1>> img(height, width);\n    Img<Eigen::Vector4f> verts(height, width);\n    Img<Eigen::Vector4f> norms(height, width);\n\n    resize.image(imageTexture, img);\n    resize.vertex(vertexTexture, verts);\n    resize.vertex(normalTexture, norms);\n\n    Frame * frame = new Frame(num,\n                              frames.size(),\n                              pose,\n                              srcTime,\n                              width * height,\n                              (unsigned char *)img.data,\n                              (Eigen::Vector4f *)verts.data,\n                              (Eigen::Vector4f *)norms.data);\n\n    int * coOccurrences = new int[frames.size()];\n\n    memset(coOccurrences, 0, sizeof(int) * frames.size());\n\n    for(int i = 0; i < num; i++)\n    {\n        unsigned char code = badCode;\n\n        if(verts.at<Eigen::Vector4f>(conservatory.at(i).pos(1), conservatory.at(i).pos(0))(2) > 0)\n        {\n            const Eigen::Matrix<unsigned char, 3, 1> & pix = img.at<Eigen::Matrix<unsigned char, 3, 1>>(conservatory.at(i).pos(1), conservatory.at(i).pos(0));\n\n            code = (pix(0) > conservatory.at(i).rgbd(0)) << 3 |\n                   (pix(1) > conservatory.at(i).rgbd(1)) << 2 |\n                   (pix(2) > conservatory.at(i).rgbd(2)) << 1 |\n                   (int(verts.at<Eigen::Vector4f>(conservatory.at(i).pos(1), conservatory.at(i).pos(0))(2) * 1000.0f) > conservatory.at(i).rgbd(3));\n\n            frame->goodCodes++;\n\n            for(size_t j = 0; j < conservatory.at(i).ids[code].size(); j++)\n            {\n                coOccurrences[conservatory.at(i).ids[code].at(j)]++;\n            }\n        }\n\n        frame->codes[i] = code;\n    }\n\n    float minimum = std::numeric_limits<float>::max();\n\n    if(frame->goodCodes > 0)\n    {\n        for(size_t i = 0; i < frames.size(); i++)\n        {\n            float maxCo = std::min(frame->goodCodes, frames.at(i)->goodCodes);\n\n            float dissim = (float)(maxCo - coOccurrences[i]) / (float)maxCo;\n\n            if(dissim < minimum)\n            {\n                minimum = dissim;\n            }\n        }\n    }\n\n    delete [] coOccurrences;\n\n    if((minimum > threshold || frames.size() == 0) && frame->goodCodes > 0)\n    {\n        for(int i = 0; i < num; i++)\n        {\n            if(frame->codes[i] != badCode)\n            {\n                conservatory.at(i).ids[frame->codes[i]].push_back(frame->id);\n            }\n        }\n\n        frames.push_back(frame);\n\n        return true;\n    }\n    else\n    {\n        delete frame;\n\n        return false;\n    }\n}\n\nEigen::Matrix4f Ferns::findFrame(std::vector<SurfaceConstraint> & constraints,\n                                 const Eigen::Matrix4f & currPose,\n                                 GPUTexture * vertexTexture,\n                                 GPUTexture * normalTexture,\n                                 GPUTexture * imageTexture,\n                                 const int time,\n                                 const bool lost)\n{\n    lastClosest = -1;\n\n    Img<Eigen::Matrix<unsigned char, 3, 1>> imgSmall(height, width);\n    Img<Eigen::Vector4f> vertSmall(height, width);\n    Img<Eigen::Vector4f> normSmall(height, width);\n\n    resize.image(imageTexture, imgSmall);\n    resize.vertex(vertexTexture, vertSmall);\n    resize.vertex(normalTexture, normSmall);\n\n    Frame * frame = new Frame(num, 0, Eigen::Matrix4f::Identity(), 0, width * height);\n\n    int * coOccurrences = new int[frames.size()];\n\n    memset(coOccurrences, 0, sizeof(int) * frames.size());\n\n    for(int i = 0; i < num; i++)\n    {\n        unsigned char code = badCode;\n\n        if(vertSmall.at<Eigen::Vector4f>(conservatory.at(i).pos(1), conservatory.at(i).pos(0))(2) > 0)\n        {\n            const Eigen::Matrix<unsigned char, 3, 1> & pix = imgSmall.at<Eigen::Matrix<unsigned char, 3, 1>>(conservatory.at(i).pos(1), conservatory.at(i).pos(0));\n\n            code = (pix(0) > conservatory.at(i).rgbd(0)) << 3 |\n                   (pix(1) > conservatory.at(i).rgbd(1)) << 2 |\n                   (pix(2) > conservatory.at(i).rgbd(2)) << 1 |\n                   (int(vertSmall.at<Eigen::Vector4f>(conservatory.at(i).pos(1), conservatory.at(i).pos(0))(2) * 1000.0f) > conservatory.at(i).rgbd(3));\n\n            frame->goodCodes++;\n\n            for(size_t j = 0; j < conservatory.at(i).ids[code].size(); j++)\n            {\n                coOccurrences[conservatory.at(i).ids[code].at(j)]++;\n            }\n        }\n\n        frame->codes[i] = code;\n    }\n\n    float minimum = std::numeric_limits<float>::max();\n    int minId = -1;\n\n    for(size_t i = 0; i < frames.size(); i++)\n    {\n        float maxCo = std::min(frame->goodCodes, frames.at(i)->goodCodes);\n\n        float dissim = (float)(maxCo - coOccurrences[i]) / (float)maxCo;\n\n        if(dissim < minimum && time - frames.at(i)->srcTime > 300)\n        {\n            minimum = dissim;\n            minId = i;\n        }\n    }\n\n    delete [] coOccurrences;\n\n    Eigen::Matrix4f estPose = Eigen::Matrix4f::Identity();\n\n    if(minId != -1 && blockHDAware(frame, frames.at(minId)) > 0.3)\n    {\n        Eigen::Matrix4f fernPose = frames.at(minId)->pose;\n\n        vertFern.texture->Upload(frames.at(minId)->initVerts, GL_RGBA, GL_FLOAT);\n        vertCurrent.texture->Upload(vertSmall.data, GL_RGBA, GL_FLOAT);\n\n        normFern.texture->Upload(frames.at(minId)->initNorms, GL_RGBA, GL_FLOAT);\n        normCurrent.texture->Upload(normSmall.data, GL_RGBA, GL_FLOAT);\n\n//        colorFern.texture->Upload(frames.at(minId)->initRgb, GL_RGB, GL_UNSIGNED_BYTE);\n//        colorCurrent.texture->Upload(imgSmall.data, GL_RGB, GL_UNSIGNED_BYTE);\n\n        //WARNING initICP* must be called before initRGB*\n        rgbd.initICPModel(&vertFern, &normFern, (float)maxDepth / 1000.0f, fernPose);\n//        rgbd.initRGBModel(&colorFern);\n\n        rgbd.initICP(&vertCurrent, &normCurrent, (float)maxDepth / 1000.0f);\n//        rgbd.initRGB(&colorCurrent);\n\n        Eigen::Vector3f trans = fernPose.topRightCorner(3, 1);\n        Eigen::Matrix<float, 3, 3, Eigen::RowMajor> rot = fernPose.topLeftCorner(3, 3);\n\n        TICK(\"fernOdom\");\n        rgbd.getIncrementalTransformation(trans,\n                                          rot,\n                                          false,\n                                          100,\n                                          false,\n                                          false,\n                                          false);\n        TOCK(\"fernOdom\");\n\n        estPose.topRightCorner(3, 1) = trans;\n        estPose.topLeftCorner(3, 3) = rot;\n\n        float photoError = photometricCheck(vertSmall, imgSmall, estPose, fernPose, frames.at(minId)->initRgb);\n\n        int icpCountThresh = lost ? 1400 : 2400;\n\n//        std::cout << rgbd.lastICPError << \", \" << rgbd.lastICPCount << \", \" << photoError << std::endl;\n\n        if(rgbd.lastICPError < 0.0003 && rgbd.lastICPCount > icpCountThresh && photoError < photoThresh)\n        {\n            lastClosest = minId;\n\n            for(int i = 0; i < num; i += num / 50)\n            {\n                if(vertSmall.at<Eigen::Vector4f>(conservatory.at(i).pos(1), conservatory.at(i).pos(0))(2) > 0 &&\n                   int(vertSmall.at<Eigen::Vector4f>(conservatory.at(i).pos(1), conservatory.at(i).pos(0))(2) * 1000.0f) < maxDepth)\n                {\n                    Eigen::Vector4f worldRawPoint = currPose * Eigen::Vector4f(vertSmall.at<Eigen::Vector4f>(conservatory.at(i).pos(1), conservatory.at(i).pos(0))(0),\n                                                                               vertSmall.at<Eigen::Vector4f>(conservatory.at(i).pos(1), conservatory.at(i).pos(0))(1),\n                                                                               vertSmall.at<Eigen::Vector4f>(conservatory.at(i).pos(1), conservatory.at(i).pos(0))(2),\n                                                                               1.0f);\n\n                    Eigen::Vector4f worldModelPoint = estPose * Eigen::Vector4f(vertSmall.at<Eigen::Vector4f>(conservatory.at(i).pos(1), conservatory.at(i).pos(0))(0),\n                                                                                vertSmall.at<Eigen::Vector4f>(conservatory.at(i).pos(1), conservatory.at(i).pos(0))(1),\n                                                                                vertSmall.at<Eigen::Vector4f>(conservatory.at(i).pos(1), conservatory.at(i).pos(0))(2),\n                                                                                1.0f);\n\n                    constraints.push_back(SurfaceConstraint(worldRawPoint, worldModelPoint));\n                }\n            }\n        }\n    }\n\n    delete frame;\n\n    return estPose;\n}\n\nfloat Ferns::photometricCheck(const Img<Eigen::Vector4f> & vertSmall,\n                              const Img<Eigen::Matrix<unsigned char, 3, 1>> & imgSmall,\n                              const Eigen::Matrix4f & estPose,\n                              const Eigen::Matrix4f & fernPose,\n                              const unsigned char * fernRgb)\n{\n    float cx = Intrinsics::getInstance().cx() / factor;\n    float cy = Intrinsics::getInstance().cy() / factor;\n    float invfx = 1.0f / float(Intrinsics::getInstance().fx() / factor);\n    float invfy = 1.0f / float(Intrinsics::getInstance().fy() / factor);\n\n    Img<Eigen::Matrix<unsigned char, 3, 1>> imgFern(height, width, (Eigen::Matrix<unsigned char, 3, 1> *)fernRgb);\n\n    float photoSum = 0;\n    int photoCount = 0;\n\n    for(int i = 0; i < num; i++)\n    {\n        if(vertSmall.at<Eigen::Vector4f>(conservatory.at(i).pos(1), conservatory.at(i).pos(0))(2) > 0 &&\n           int(vertSmall.at<Eigen::Vector4f>(conservatory.at(i).pos(1), conservatory.at(i).pos(0))(2) * 1000.0f) < maxDepth)\n        {\n            Eigen::Vector4f vertPoint = Eigen::Vector4f(vertSmall.at<Eigen::Vector4f>(conservatory.at(i).pos(1), conservatory.at(i).pos(0))(0),\n                                                        vertSmall.at<Eigen::Vector4f>(conservatory.at(i).pos(1), conservatory.at(i).pos(0))(1),\n                                                        vertSmall.at<Eigen::Vector4f>(conservatory.at(i).pos(1), conservatory.at(i).pos(0))(2),\n                                                        1.0f);\n\n            Eigen::Matrix4f diff = fernPose.inverse() * estPose;\n\n            Eigen::Vector4f worldCorrPoint = diff * vertPoint;\n\n            Eigen::Vector2i correspondence((worldCorrPoint(0) * (1/invfx) / worldCorrPoint(2) + cx), (worldCorrPoint(1) * (1/invfy) / worldCorrPoint(2) + cy));\n\n            if(correspondence(0) >= 0 && correspondence(1) >= 0 && correspondence(0) < width && correspondence(1) < height &&\n               (imgFern.at<Eigen::Matrix<unsigned char, 3, 1>>(correspondence(1), correspondence(0))(0) > 0 ||\n                imgFern.at<Eigen::Matrix<unsigned char, 3, 1>>(correspondence(1), correspondence(0))(1) > 0 ||\n                imgFern.at<Eigen::Matrix<unsigned char, 3, 1>>(correspondence(1), correspondence(0))(2) > 0))\n            {\n                photoSum += abs((int)imgFern.at<Eigen::Matrix<unsigned char, 3, 1>>(correspondence(1), correspondence(0))(0) - (int)imgSmall.at<Eigen::Matrix<unsigned char, 3, 1>>(conservatory.at(i).pos(1), conservatory.at(i).pos(0))(0));\n                photoSum += abs((int)imgFern.at<Eigen::Matrix<unsigned char, 3, 1>>(correspondence(1), correspondence(0))(1) - (int)imgSmall.at<Eigen::Matrix<unsigned char, 3, 1>>(conservatory.at(i).pos(1), conservatory.at(i).pos(0))(1));\n                photoSum += abs((int)imgFern.at<Eigen::Matrix<unsigned char, 3, 1>>(correspondence(1), correspondence(0))(2) - (int)imgSmall.at<Eigen::Matrix<unsigned char, 3, 1>>(conservatory.at(i).pos(1), conservatory.at(i).pos(0))(2));\n                photoCount++;\n            }\n        }\n    }\n\n    return photoSum / float(photoCount);\n}\n\nfloat Ferns::blockHD(const Frame * f1, const Frame * f2)\n{\n    float sum = 0.0f;\n\n    for(int i = 0; i < num; i++)\n    {\n        sum += f1->codes[i] == f2->codes[i];\n    }\n\n    sum /= (float)num;\n\n    return sum;\n}\n\nfloat Ferns::blockHDAware(const Frame * f1, const Frame * f2)\n{\n    int count = 0;\n    float val = 0;\n\n    for(int i = 0; i < num; i++)\n    {\n        if(f1->codes[i] != badCode && f2->codes[i] != badCode)\n        {\n            count++;\n\n            if(f1->codes[i] == f2->codes[i])\n            {\n                val += 1.0f;\n            }\n        }\n    }\n\n    return val / (float)count;\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Ferns.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef FERNS_H_\n#define FERNS_H_\n\n#include <random>\n#include <Eigen/Core>\n#include <Eigen/LU>\n#include <vector>\n#include <limits>\n\n#include \"Utils/Resolution.h\"\n#include \"Utils/Intrinsics.h\"\n#include \"Utils/RGBDOdometry.h\"\n#include \"Shaders/Resize.h\"\n\nclass Ferns\n{\n    public:\n        Ferns(int n, int maxDepth, const float photoThresh);\n        virtual ~Ferns();\n\n        bool addFrame(GPUTexture * imageTexture, GPUTexture * vertexTexture, GPUTexture * normalTexture, const Eigen::Matrix4f & pose, int srcTime, const float threshold);\n\n        class SurfaceConstraint\n        {\n            public:\n                SurfaceConstraint(const Eigen::Vector4f & sourcePoint,\n                                  const Eigen::Vector4f & targetPoint)\n                 : sourcePoint(sourcePoint),\n                   targetPoint(targetPoint)\n                {}\n\n                Eigen::Vector4f sourcePoint;\n                Eigen::Vector4f targetPoint;\n        };\n\n        Eigen::Matrix4f findFrame(std::vector<SurfaceConstraint> & constraints,\n                                  const Eigen::Matrix4f & currPose,\n                                  GPUTexture * vertexTexture,\n                                  GPUTexture * normalTexture,\n                                  GPUTexture * imageTexture,\n                                  const int time,\n                                  const bool lost);\n\n        class Fern\n        {\n            public:\n                Fern()\n                {}\n\n                Eigen::Vector2i pos;\n                Eigen::Vector4i rgbd;\n                std::vector<int> ids[16];\n        };\n\n        std::vector<Fern> conservatory;\n\n        class Frame\n        {\n            public:\n                Frame(int n,\n                      int id,\n                      const Eigen::Matrix4f & pose,\n                      const int srcTime,\n                      const int numPixels,\n                      unsigned char * rgb = 0,\n                      Eigen::Vector4f * verts = 0,\n                      Eigen::Vector4f * norms = 0)\n                 : goodCodes(0),\n                   id(id),\n                   pose(pose),\n                   srcTime(srcTime),\n                   initRgb(rgb),\n                   initVerts(verts),\n                   initNorms(norms)\n                {\n                    codes = new unsigned char[n];\n\n                    if(rgb)\n                    {\n                        this->initRgb = new unsigned char[numPixels * 3];\n                        memcpy(this->initRgb, rgb, numPixels * 3);\n                    }\n\n                    if(verts)\n                    {\n                        this->initVerts = new Eigen::Vector4f[numPixels];\n                        memcpy(this->initVerts, verts, numPixels * sizeof(Eigen::Vector4f));\n                    }\n\n                    if(norms)\n                    {\n                        this->initNorms = new Eigen::Vector4f[numPixels];\n                        memcpy(this->initNorms, norms, numPixels * sizeof(Eigen::Vector4f));\n                    }\n                }\n\n                virtual ~Frame()\n                {\n                    delete [] codes;\n\n                    if(initRgb)\n                        delete [] initRgb;\n\n                    if(initVerts)\n                        delete [] initVerts;\n\n                    if(initNorms)\n                        delete [] initNorms;\n                }\n\n                unsigned char * codes;\n                int goodCodes;\n                const int id;\n                Eigen::Matrix4f pose;\n                const int srcTime;\n                unsigned char * initRgb;\n                Eigen::Vector4f * initVerts;\n                Eigen::Vector4f * initNorms;\n        };\n\n        std::vector<Frame*> frames;\n\n        const int num;\n        std::mt19937 random;\n        const int factor;\n        const int width;\n        const int height;\n        const int maxDepth;\n        const float photoThresh;\n        std::uniform_int_distribution<int32_t> widthDist;\n        std::uniform_int_distribution<int32_t> heightDist;\n        std::uniform_int_distribution<int32_t> rgbDist;\n        std::uniform_int_distribution<int32_t> dDist;\n\n        int lastClosest;\n        const unsigned char badCode;\n        RGBDOdometry rgbd;\n\n    private:\n        void generateFerns();\n\n        float blockHD(const Frame * f1, const Frame * f2);\n        float blockHDAware(const Frame * f1, const Frame * f2);\n\n        float photometricCheck(const Img<Eigen::Vector4f> & vertSmall,\n                               const Img<Eigen::Matrix<unsigned char, 3, 1>> & imgSmall,\n                               const Eigen::Matrix4f & estPose,\n                               const Eigen::Matrix4f & fernPose,\n                               const unsigned char * fernRgb);\n\n        GPUTexture vertFern;\n        GPUTexture vertCurrent;\n\n        GPUTexture normFern;\n        GPUTexture normCurrent;\n\n        GPUTexture colorFern;\n        GPUTexture colorCurrent;\n\n        Resize resize;\n\n        Img<Eigen::Matrix<unsigned char, 3, 1>> imageBuff;\n        Img<Eigen::Vector4f> vertBuff;\n        Img<Eigen::Vector4f> normBuff;\n};\n\n#endif /* FERNS_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/FindSuiteSparse.cmake",
    "content": "# - Try to find SUITESPARSE\n# Once done this will define\n#  \n#  SUITESPARSE_FOUND            - system has SUITESPARSE\n#  SUITESPARSE_INCLUDE_DIRS     - the SUITESPARSE include directory\n#  SUITESPARSE_LIBRARIES        - Link these to use SUITESPARSE\n#  SUITESPARSE_SPQR_LIBRARY     - name of spqr library (necessary due to error in debian package)\n#  SUITESPARSE_SPQR_LIBRARY_DIR - name of spqr library (necessary due to error in debian package)\n#  SUITESPARSE_LIBRARY_DIR      - Library main directory containing suitesparse libs\n#  SUITESPARSE_LIBRARY_DIRS     - all Library directories containing suitesparse libs\n#  SUITESPARSE_SPQR_VALID       - automatic identification whether or not spqr package is installed correctly\n\nIF (SUITESPARSE_INCLUDE_DIRS)\n  # Already in cache, be silent\n  SET(SUITESPARSE_FIND_QUIETLY TRUE)\nENDIF (SUITESPARSE_INCLUDE_DIRS)\n\nif (WIN32)\n  # the libraries may have lib prefix\n  set(ORIGINAL_CMAKE_FIND_LIBRARY_PREFIXES \"${CMAKE_FIND_LIBRARY_PREFIXES}\")\n  set(CMAKE_FIND_LIBRARY_PREFIXES \"lib\" \"\" \"${CMAKE_FIND_LIBRARY_PREFIXES}\")\nendif ()\n  \nFIND_PATH( SUITESPARSE_INCLUDE_DIR cholmod.h\n\t      PATHS /usr/local/include \n\t            /usr/include \n\t            /usr/include/suitesparse/ \n\t            ${CMAKE_SOURCE_DIR}/MacOS/Libs/cholmod\n      \t      PATH_SUFFIXES cholmod/ CHOLMOD/ )\n   \t\nFIND_PATH( SUITESPARSE_LIBRARY_DIR\n          NAMES libcholmod.so libcholmod.a\n          PATHS /usr/lib \n                /usr/lib64\n                /usr/lib/x86_64-linux-gnu\n                /usr/lib/i386-linux-gnu\n                /usr/local/lib )\n\n   # Add cholmod include directory to collection include directories\n   IF ( SUITESPARSE_INCLUDE_DIR )\n\tlist ( APPEND SUITESPARSE_INCLUDE_DIRS ${SUITESPARSE_INCLUDE_DIR} )\n   ENDIF( SUITESPARSE_INCLUDE_DIR )\n\n   # if we found the library, add it to the defined libraries\n   IF ( SUITESPARSE_LIBRARY_DIR )\n\t\tFIND_LIBRARY( SUITESPARSE_AMD_LIBRARY\n                     NAMES amd\n                     PATHS ${SUITESPARSE_LIBRARY_DIR} )\n\t\tFIND_LIBRARY( SUITESPARSE_CAMD_LIBRARY\n                     NAMES camd\n                     PATHS ${SUITESPARSE_LIBRARY_DIR} )\n\t\tFIND_LIBRARY( SUITESPARSE_CCOLAMD_LIBRARY\n                     NAMES ccolamd\n                     PATHS ${SUITESPARSE_LIBRARY_DIR} )\n\t\tFIND_LIBRARY( SUITESPARSE_CHOLMOD_LIBRARY\n                     NAMES cholmod\n                     PATHS ${SUITESPARSE_LIBRARY_DIR} )\n\t\tFIND_LIBRARY( SUITESPARSE_COLAMD_LIBRARY\n                     NAMES colamd\n                     PATHS ${SUITESPARSE_LIBRARY_DIR} )\n\t\tFIND_LIBRARY( SUITESPARSE_CXSPARSE_LIBRARY\n                     NAMES cxsparse\n                     PATHS ${SUITESPARSE_LIBRARY_DIR} )\n\t\tIF ( WIN32 )\n\t\t  FIND_LIBRARY( SUITESPARSE_SUITESPARSECONFIG_LIBRARY\n                     NAMES suitesparseconfig\n                     PATHS ${SUITESPARSE_LIBRARY_DIR} )\n\t\t  FIND_LIBRARY( SUITESPARSE_BLAS_LIBRARY\n                     NAMES blas\n                     PATHS ${SUITESPARSE_LIBRARY_DIR}/lapack_blas_windows )\n\t\t  FIND_LIBRARY( SUITESPARSE_LAPACK_LIBRARY\n                     NAMES lapack\n                     PATHS ${SUITESPARSE_LIBRARY_DIR}/lapack_blas_windows )\n\t\tENDIF ()\t\t\t \n\t\t\t\t\t \n       list ( APPEND SUITESPARSE_LIBRARIES ${SUITESPARSE_AMD_LIBRARY}\n         ${SUITESPARSE_CAMD_LIBRARY}\n         ${SUITESPARSE_CCOLAMD_LIBRARY}\n         ${SUITESPARSE_CHOLMOD_LIBRARY}\n         ${SUITESPARSE_COLAMD_LIBRARY}\n         ${SUITESPARSE_CXSPARSE_LIBRARY}\n         ${SUITESPARSE_SUITESPARSECONFIG_LIBRARY}\n         ${SUITESPARSE_BLAS_LIBRARY}\n         ${SUITESPARSE_LAPACK_LIBRARY})\n\n       # Metis and spqr are optional\n       FIND_LIBRARY( SUITESPARSE_METIS_LIBRARY\n                     NAMES metis\n                     PATHS ${SUITESPARSE_LIBRARY_DIR} )\n       IF (SUITESPARSE_METIS_LIBRARY)\t\t\t\n\t     list ( APPEND SUITESPARSE_LIBRARIES ${SUITESPARSE_METIS_LIBRARY})\n       ENDIF(SUITESPARSE_METIS_LIBRARY)\n\n       if(EXISTS  \"${SUITESPARSE_INCLUDE_DIR}/SuiteSparseQR.hpp\")\n\t     SET(SUITESPARSE_SPQR_VALID TRUE CACHE BOOL \"SuiteSparseSPQR valid\")\n       else()\n\t     SET(SUITESPARSE_SPQR_VALID false CACHE BOOL \"SuiteSparseSPQR valid\")\n       endif()\n\n       if(SUITESPARSE_SPQR_VALID)\n\t     FIND_LIBRARY( SUITESPARSE_SPQR_LIBRARY\n\t\t      NAMES spqr\n\t\t      PATHS ${SUITESPARSE_LIBRARY_DIR} )\n\t     IF (SUITESPARSE_SPQR_LIBRARY)\t\t\t\n\t       list ( APPEND SUITESPARSE_LIBRARIES ${SUITESPARSE_SPQR_LIBRARY})\n\t     ENDIF (SUITESPARSE_SPQR_LIBRARY)\n       endif()\n    ENDIF( SUITESPARSE_LIBRARY_DIR )  \n   \nIF (SUITESPARSE_INCLUDE_DIRS AND SUITESPARSE_LIBRARIES)\n   SET(SUITESPARSE_FOUND TRUE)\n   MESSAGE(STATUS \"Found SuiteSparse\")\nELSE (SUITESPARSE_INCLUDE_DIRS AND SUITESPARSE_LIBRARIES)\n   SET( SUITESPARSE_FOUND FALSE )\n   MESSAGE(FATAL_ERROR \"Unable to find SuiteSparse\")\nENDIF (SUITESPARSE_INCLUDE_DIRS AND SUITESPARSE_LIBRARIES)\n\nif (WIN32)\n  set(CMAKE_FIND_LIBRARY_PREFIXES \"${ORIGINAL_CMAKE_FIND_LIBRARY_PREFIXES}\")\nendif ()\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/GPUTexture.cpp",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n \n#include \"GPUTexture.h\"\n\nconst std::string GPUTexture::RGB = \"RGB\";\nconst std::string GPUTexture::DEPTH_RAW = \"DEPTH\";\nconst std::string GPUTexture::DEPTH_FILTERED = \"DEPTH_FILTERED\";\nconst std::string GPUTexture::DEPTH_METRIC = \"DEPTH_METRIC\";\nconst std::string GPUTexture::DEPTH_METRIC_FILTERED = \"DEPTH_METRIC_FILTERED\";\nconst std::string GPUTexture::DEPTH_NORM = \"DEPTH_NORM\";\n\nGPUTexture::GPUTexture(const int width,\n                       const int height,\n                       const GLenum internalFormat,\n                       const GLenum format,\n                       const GLenum dataType,\n                       const bool draw,\n                       const bool cuda)\n : texture(new pangolin::GlTexture(width, height, internalFormat, draw, 0, format, dataType)),\n   draw(draw),\n   width(width),\n   height(height),\n   internalFormat(internalFormat),\n   format(format),\n   dataType(dataType)\n{\n    if(cuda)\n    {\n        cudaGraphicsGLRegisterImage(&cudaRes, texture->tid, GL_TEXTURE_2D, cudaGraphicsRegisterFlagsReadOnly);\n    }\n    else\n    {\n        cudaRes = 0;\n    }\n}\n\nGPUTexture::~GPUTexture()\n{\n    if(texture)\n    {\n        delete texture;\n    }\n\n    if(cudaRes)\n    {\n        cudaGraphicsUnregisterResource(cudaRes);\n    }\n}\n\nvoid GPUTexture::save(const std::string& file) {\n    // cudaDeviceSynchronize();\n    if (cudaRes) cudaSafeCall(cudaGraphicsUnmapResources(1, &cudaRes));\n    texture->Save(file);\n    if (cudaRes) cudaSafeCall(cudaGraphicsMapResources(1, &cudaRes));\n}"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/GPUTexture.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef GPUTEXTURE_H_\n#define GPUTEXTURE_H_\n\n#include <pangolin/pangolin.h>\n#include <driver_types.h>\n#include <cuda_gl_interop.h>\n#include <cuda_runtime_api.h>\n\n#include \"Cuda/convenience.cuh\"\n\n#include <opencv2/highgui/highgui.hpp>\n#include <opencv2/imgproc/imgproc.hpp>\n\n#include \"Defines.h\"\n\nclass GPUTexture\n{\n    public:\n        EFUSION_API GPUTexture(const int width,\n                   const int height,\n                   const GLenum internalFormat,\n                   const GLenum format,\n                   const GLenum dataType,\n                   const bool draw = false,\n                   const bool cuda = false);\n\n        virtual ~GPUTexture();\n\n        void save(const std::string& file);\n\n\n        EFUSION_API static const std::string RGB, DEPTH_RAW, DEPTH_FILTERED, DEPTH_METRIC, DEPTH_METRIC_FILTERED, DEPTH_NORM;\n\n        pangolin::GlTexture * texture;\n\n        cudaGraphicsResource * cudaRes;\n\n        const bool draw;\n\n    private:\n        GPUTexture() : texture(0), cudaRes(0), draw(false), width(0), height(0), internalFormat(0), format(0), dataType(0) {}\n        const int width;\n        const int height;\n        const GLenum internalFormat;\n        const GLenum format;\n        const GLenum dataType;\n};\n\n#endif /* GPUTEXTURE_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/GlobalModel.cpp",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#include \"GlobalModel.h\"\n\nconst int GlobalModel::TEXTURE_DIMENSION = 3072;\nconst int GlobalModel::MAX_VERTICES = GlobalModel::TEXTURE_DIMENSION * GlobalModel::TEXTURE_DIMENSION;\nconst int GlobalModel::NODE_TEXTURE_DIMENSION = 16384;\nconst int GlobalModel::MAX_NODES = GlobalModel::NODE_TEXTURE_DIMENSION / 16; //16 floats per node\n\nGlobalModel::GlobalModel()\n : target(0),\n   renderSource(1),\n   bufferSize(MAX_VERTICES * Vertex::SIZE),\n   count(0),\n   initProgram(loadProgramFromFile(\"init_unstable.vert\")),\n   drawProgram(loadProgramFromFile(\"draw_feedback.vert\", \"draw_feedback.frag\")),\n   drawSurfelProgram(loadProgramFromFile(\"draw_global_surface.vert\", \"draw_global_surface.frag\", \"draw_global_surface.geom\")),\n   dataProgram(loadProgramFromFile(\"data.vert\", \"data.frag\", \"data.geom\")),\n   updateProgram(loadProgramFromFile(\"update.vert\")),\n   unstableProgram(loadProgramGeomFromFile(\"copy_unstable.vert\", \"copy_unstable.geom\")),\n   renderBuffer(TEXTURE_DIMENSION, TEXTURE_DIMENSION),\n   updateMapVertsConfs(TEXTURE_DIMENSION, TEXTURE_DIMENSION, GL_RGBA32F, GL_LUMINANCE, GL_FLOAT),\n   updateMapColorsTime(TEXTURE_DIMENSION, TEXTURE_DIMENSION, GL_RGBA32F, GL_LUMINANCE, GL_FLOAT),\n   updateMapNormsRadii(TEXTURE_DIMENSION, TEXTURE_DIMENSION, GL_RGBA32F, GL_LUMINANCE, GL_FLOAT),\n   deformationNodes(NODE_TEXTURE_DIMENSION, 1, GL_LUMINANCE32F_ARB, GL_LUMINANCE, GL_FLOAT)\n{\n    vbos = new std::pair<GLuint, GLuint>[2];\n\n    float * vertices = new float[bufferSize];\n\n    memset(&vertices[0], 0, bufferSize);\n\n    glGenTransformFeedbacks(1, &vbos[0].second);\n    glGenBuffers(1, &vbos[0].first);\n    glBindBuffer(GL_ARRAY_BUFFER, vbos[0].first);\n    glBufferData(GL_ARRAY_BUFFER, bufferSize, &vertices[0], GL_STREAM_DRAW);\n    glBindBuffer(GL_ARRAY_BUFFER, 0);\n\n    glGenTransformFeedbacks(1, &vbos[1].second);\n    glGenBuffers(1, &vbos[1].first);\n    glBindBuffer(GL_ARRAY_BUFFER, vbos[1].first);\n    glBufferData(GL_ARRAY_BUFFER, bufferSize, &vertices[0], GL_STREAM_DRAW);\n    glBindBuffer(GL_ARRAY_BUFFER, 0);\n\n    delete [] vertices;\n\n    vertices = new float[Resolution::getInstance().numPixels() * Vertex::SIZE];\n\n    memset(&vertices[0], 0, Resolution::getInstance().numPixels() * Vertex::SIZE);\n\n    glGenTransformFeedbacks(1, &newUnstableFid);\n    glGenBuffers(1, &newUnstableVbo);\n    glBindBuffer(GL_ARRAY_BUFFER, newUnstableVbo);\n    glBufferData(GL_ARRAY_BUFFER, Resolution::getInstance().numPixels() * Vertex::SIZE, &vertices[0], GL_STREAM_DRAW);\n    glBindBuffer(GL_ARRAY_BUFFER, 0);\n\n    delete [] vertices;\n\n    std::vector<Eigen::Vector2f> uv;\n\n    for(int i = 0; i < Resolution::getInstance().width(); i++)\n    {\n        for(int j = 0; j < Resolution::getInstance().height(); j++)\n        {\n            uv.push_back(Eigen::Vector2f(((float)i / (float)Resolution::getInstance().width()) + 1.0 / (2 * (float)Resolution::getInstance().width()),\n                                   ((float)j / (float)Resolution::getInstance().height()) + 1.0 / (2 * (float)Resolution::getInstance().height())));\n        }\n    }\n\n    uvSize = uv.size();\n\n    glGenBuffers(1, &uvo);\n    glBindBuffer(GL_ARRAY_BUFFER, uvo);\n    glBufferData(GL_ARRAY_BUFFER, uvSize * sizeof(Eigen::Vector2f), &uv[0], GL_STATIC_DRAW);\n    glBindBuffer(GL_ARRAY_BUFFER, 0);\n\n    frameBuffer.AttachColour(*updateMapVertsConfs.texture);\n    frameBuffer.AttachColour(*updateMapColorsTime.texture);\n    frameBuffer.AttachColour(*updateMapNormsRadii.texture);\n    frameBuffer.AttachDepth(renderBuffer);\n\n    updateProgram->Bind();\n\n    int locUpdate[3] =\n    {\n        glGetVaryingLocationNV(updateProgram->programId(), \"vPosition0\"),\n        glGetVaryingLocationNV(updateProgram->programId(), \"vColor0\"),\n        glGetVaryingLocationNV(updateProgram->programId(), \"vNormRad0\"),\n    };\n\n    glTransformFeedbackVaryingsNV(updateProgram->programId(), 3, locUpdate, GL_INTERLEAVED_ATTRIBS);\n\n    updateProgram->Unbind();\n\n    dataProgram->Bind();\n\n    int dataUpdate[3] =\n    {\n        glGetVaryingLocationNV(dataProgram->programId(), \"vPosition0\"),\n        glGetVaryingLocationNV(dataProgram->programId(), \"vColor0\"),\n        glGetVaryingLocationNV(dataProgram->programId(), \"vNormRad0\"),\n    };\n\n    glTransformFeedbackVaryingsNV(dataProgram->programId(), 3, dataUpdate, GL_INTERLEAVED_ATTRIBS);\n\n    dataProgram->Unbind();\n\n    unstableProgram->Bind();\n\n    int unstableUpdate[3] =\n    {\n        glGetVaryingLocationNV(unstableProgram->programId(), \"vPosition0\"),\n        glGetVaryingLocationNV(unstableProgram->programId(), \"vColor0\"),\n        glGetVaryingLocationNV(unstableProgram->programId(), \"vNormRad0\"),\n    };\n\n    glTransformFeedbackVaryingsNV(unstableProgram->programId(), 3, unstableUpdate, GL_INTERLEAVED_ATTRIBS);\n\n    unstableProgram->Unbind();\n\n    initProgram->Bind();\n\n    int locInit[3] =\n    {\n        glGetVaryingLocationNV(initProgram->programId(), \"vPosition0\"),\n        glGetVaryingLocationNV(initProgram->programId(), \"vColor0\"),\n        glGetVaryingLocationNV(initProgram->programId(), \"vNormRad0\"),\n    };\n\n    glTransformFeedbackVaryingsNV(initProgram->programId(), 3, locInit, GL_INTERLEAVED_ATTRIBS);\n\n    glGenQueries(1, &countQuery);\n\n    //Empty both transform feedbacks\n    glEnable(GL_RASTERIZER_DISCARD);\n\n    glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, vbos[0].second);\n\n    glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, vbos[0].first);\n\n    glBeginTransformFeedback(GL_POINTS);\n\n    glDrawArrays(GL_POINTS, 0, 0);\n\n    glEndTransformFeedback();\n\n    glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);\n\n    glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, vbos[1].second);\n\n    glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, vbos[1].first);\n\n    glBeginTransformFeedback(GL_POINTS);\n\n    glDrawArrays(GL_POINTS, 0, 0);\n\n    glEndTransformFeedback();\n\n    glDisable(GL_RASTERIZER_DISCARD);\n\n    glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);\n\n    initProgram->Unbind();\n}\n\nGlobalModel::~GlobalModel()\n{\n    glDeleteBuffers(1, &vbos[0].first);\n    glDeleteTransformFeedbacks(1, &vbos[0].second);\n\n    glDeleteBuffers(1, &vbos[1].first);\n    glDeleteTransformFeedbacks(1, &vbos[1].second);\n\n    glDeleteQueries(1, &countQuery);\n\n    glDeleteBuffers(1, &uvo);\n\n    glDeleteTransformFeedbacks(1, &newUnstableFid);\n    glDeleteBuffers(1, &newUnstableVbo);\n\n    delete [] vbos;\n}\n\nvoid GlobalModel::initialise(const FeedbackBuffer & rawFeedback,\n                             const FeedbackBuffer & filteredFeedback)\n{\n    initProgram->Bind();\n\n    glBindBuffer(GL_ARRAY_BUFFER, rawFeedback.vbo);\n\n    glEnableVertexAttribArray(0);\n    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, 0);\n\n    glEnableVertexAttribArray(1);\n    glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, reinterpret_cast<GLvoid*>(sizeof(Eigen::Vector4f)));\n\n    glBindBuffer(GL_ARRAY_BUFFER, filteredFeedback.vbo);\n\n    glEnableVertexAttribArray(2);\n    glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, reinterpret_cast<GLvoid*>(sizeof(Eigen::Vector4f) * 2));\n\n    glEnable(GL_RASTERIZER_DISCARD);\n\n    glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, vbos[target].second);\n\n    glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, vbos[target].first);\n\n    glBeginTransformFeedback(GL_POINTS);\n\n    glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, countQuery);\n\n    //It's ok to use either fid because both raw and filtered have the same amount of vertices\n    glDrawTransformFeedback(GL_POINTS, rawFeedback.fid);\n\n    glEndTransformFeedback();\n\n    glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);\n\n    glGetQueryObjectuiv(countQuery, GL_QUERY_RESULT, &count);\n\n    glDisable(GL_RASTERIZER_DISCARD);\n\n    glDisableVertexAttribArray(0);\n    glDisableVertexAttribArray(1);\n    glDisableVertexAttribArray(2);\n    glBindBuffer(GL_ARRAY_BUFFER, 0);\n    glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);\n\n    initProgram->Unbind();\n\n    glFinish();\n}\n\nvoid GlobalModel::renderPointCloud(pangolin::OpenGlMatrix mvp,\n                                   const float threshold,\n                                   const bool drawUnstable,\n                                   const bool drawNormals,\n                                   const bool drawColors,\n                                   const bool drawPoints,\n                                   const bool drawWindow,\n                                   const bool drawTimes,\n                                   const int time,\n                                   const int timeDelta)\n{\n    std::shared_ptr<Shader> program = drawPoints ? drawProgram : drawSurfelProgram;\n\n    program->Bind();\n\n    program->setUniform(Uniform(\"MVP\", mvp));\n\n    program->setUniform(Uniform(\"threshold\", threshold));\n\n    program->setUniform(Uniform(\"colorType\", (drawNormals ? 1 : drawColors ? 2 : drawTimes ? 3 : 0)));\n\n    program->setUniform(Uniform(\"unstable\", drawUnstable));\n\n    program->setUniform(Uniform(\"drawWindow\", drawWindow));\n\n    program->setUniform(Uniform(\"time\", time));\n\n    program->setUniform(Uniform(\"timeDelta\", timeDelta));\n\n    Eigen::Matrix4f pose = Eigen::Matrix4f::Identity();\n    //This is for the point shader\n    program->setUniform(Uniform(\"pose\", pose));\n\n    glBindBuffer(GL_ARRAY_BUFFER, vbos[target].first);\n\n    glEnableVertexAttribArray(0);\n    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, 0);\n\n    glEnableVertexAttribArray(1);\n    glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, reinterpret_cast<GLvoid*>(sizeof(Eigen::Vector4f) * 1));\n\n    glEnableVertexAttribArray(2);\n    glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, reinterpret_cast<GLvoid*>(sizeof(Eigen::Vector4f) * 2));\n\n    glDrawTransformFeedback(GL_POINTS, vbos[target].second);\n\n    glDisableVertexAttribArray(0);\n    glDisableVertexAttribArray(1);\n    glDisableVertexAttribArray(2);\n    glBindBuffer(GL_ARRAY_BUFFER, 0);\n\n    program->Unbind();\n}\n\nconst std::pair<GLuint, GLuint> & GlobalModel::model()\n{\n    return vbos[target];\n}\n\nvoid GlobalModel::fuse(const Eigen::Matrix4f & pose,\n                       const int & time,\n                       GPUTexture * rgb,\n                       GPUTexture * depthRaw,\n                       GPUTexture * depthFiltered,\n                       GPUTexture * indexMap,\n                       GPUTexture * vertConfMap,\n                       GPUTexture * colorTimeMap,\n                       GPUTexture * normRadMap,\n                       const float depthCutoff,\n                       const float confThreshold,\n                       const float weighting)\n{\n    TICK(\"Fuse::Data\");\n    //This first part does data association and computes the vertex to merge with, storing\n    //in an array that sets which vertices to update by index\n    frameBuffer.Bind();\n\n    glPushAttrib(GL_VIEWPORT_BIT);\n\n    glViewport(0, 0, renderBuffer.width, renderBuffer.height);\n\n    glClearColor(0, 0, 0, 0);\n    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n\n    dataProgram->Bind();\n\n    dataProgram->setUniform(Uniform(\"cSampler\", 0));\n    dataProgram->setUniform(Uniform(\"drSampler\", 1));\n    dataProgram->setUniform(Uniform(\"drfSampler\", 2));\n    dataProgram->setUniform(Uniform(\"indexSampler\", 3));\n    dataProgram->setUniform(Uniform(\"vertConfSampler\", 4));\n    dataProgram->setUniform(Uniform(\"colorTimeSampler\", 5));\n    dataProgram->setUniform(Uniform(\"normRadSampler\", 6));\n    dataProgram->setUniform(Uniform(\"time\", (float)time));\n    dataProgram->setUniform(Uniform(\"weighting\", weighting));\n\n    dataProgram->setUniform(Uniform(\"cam\", Eigen::Vector4f(Intrinsics::getInstance().cx(),\n                                                     Intrinsics::getInstance().cy(),\n                                                     1.0 / Intrinsics::getInstance().fx(),\n                                                     1.0 / Intrinsics::getInstance().fy())));\n    dataProgram->setUniform(Uniform(\"cols\", (float)Resolution::getInstance().cols()));\n    dataProgram->setUniform(Uniform(\"rows\", (float)Resolution::getInstance().rows()));\n    dataProgram->setUniform(Uniform(\"scale\", (float)IndexMap::FACTOR));\n    dataProgram->setUniform(Uniform(\"texDim\", (float)TEXTURE_DIMENSION));\n    dataProgram->setUniform(Uniform(\"pose\", pose));\n    dataProgram->setUniform(Uniform(\"maxDepth\", depthCutoff));\n\n    glEnableVertexAttribArray(0);\n    glBindBuffer(GL_ARRAY_BUFFER, uvo);\n    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);\n\n    glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, newUnstableFid);\n\n    glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, newUnstableVbo);\n\n    glActiveTexture(GL_TEXTURE0);\n    glBindTexture(GL_TEXTURE_2D, rgb->texture->tid);\n\n    glActiveTexture(GL_TEXTURE1);\n    glBindTexture(GL_TEXTURE_2D, depthRaw->texture->tid);\n\n    glActiveTexture(GL_TEXTURE2);\n    glBindTexture(GL_TEXTURE_2D, depthFiltered->texture->tid);\n\n    glActiveTexture(GL_TEXTURE3);\n    glBindTexture(GL_TEXTURE_2D, indexMap->texture->tid);\n\n    glActiveTexture(GL_TEXTURE4);\n    glBindTexture(GL_TEXTURE_2D, vertConfMap->texture->tid);\n\n    glActiveTexture(GL_TEXTURE5);\n    glBindTexture(GL_TEXTURE_2D, colorTimeMap->texture->tid);\n\n    glActiveTexture(GL_TEXTURE6);\n    glBindTexture(GL_TEXTURE_2D, normRadMap->texture->tid);\n\n    glBeginTransformFeedback(GL_POINTS);\n\n    glDrawArrays(GL_POINTS, 0, uvSize);\n\n    glEndTransformFeedback();\n\n    frameBuffer.Unbind();\n\n    glBindTexture(GL_TEXTURE_2D, 0);\n\n    glActiveTexture(GL_TEXTURE0);\n\n    glDisableVertexAttribArray(0);\n    glBindBuffer(GL_ARRAY_BUFFER, 0);\n    glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);\n\n    dataProgram->Unbind();\n\n    glPopAttrib();\n\n    glFinish();\n    TOCK(\"Fuse::Data\");\n\n    TICK(\"Fuse::Update\");\n    //Next we update the vertices at the indexes stored in the update textures\n    //Using a transform feedback conditional on a texture sample\n    updateProgram->Bind();\n\n    updateProgram->setUniform(Uniform(\"vertSamp\", 0));\n    updateProgram->setUniform(Uniform(\"colorSamp\", 1));\n    updateProgram->setUniform(Uniform(\"normSamp\", 2));\n    updateProgram->setUniform(Uniform(\"texDim\", (float)TEXTURE_DIMENSION));\n    updateProgram->setUniform(Uniform(\"time\", time));\n\n    glBindBuffer(GL_ARRAY_BUFFER, vbos[target].first);\n\n    glEnableVertexAttribArray(0);\n    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, 0);\n\n    glEnableVertexAttribArray(1);\n    glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, reinterpret_cast<GLvoid*>(sizeof(Eigen::Vector4f)));\n\n    glEnableVertexAttribArray(2);\n    glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, reinterpret_cast<GLvoid*>(sizeof(Eigen::Vector4f) * 2));\n\n    glEnable(GL_RASTERIZER_DISCARD);\n\n    glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, vbos[renderSource].second);\n\n    glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, vbos[renderSource].first);\n\n    glBeginTransformFeedback(GL_POINTS);\n\n    glActiveTexture(GL_TEXTURE0);\n    glBindTexture(GL_TEXTURE_2D, updateMapVertsConfs.texture->tid);\n\n    glActiveTexture(GL_TEXTURE1);\n    glBindTexture(GL_TEXTURE_2D, updateMapColorsTime.texture->tid);\n\n    glActiveTexture(GL_TEXTURE2);\n    glBindTexture(GL_TEXTURE_2D, updateMapNormsRadii.texture->tid);\n\n    glDrawTransformFeedback(GL_POINTS, vbos[target].second);\n\n    glEndTransformFeedback();\n\n    glDisable(GL_RASTERIZER_DISCARD);\n\n    glBindTexture(GL_TEXTURE_2D, 0);\n    glActiveTexture(GL_TEXTURE0);\n\n    glDisableVertexAttribArray(0);\n    glDisableVertexAttribArray(1);\n    glDisableVertexAttribArray(2);\n    glBindBuffer(GL_ARRAY_BUFFER, 0);\n    glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);\n\n    updateProgram->Unbind();\n\n    std::swap(target, renderSource);\n\n    glFinish();\n    TOCK(\"Fuse::Update\");\n}\n\nvoid GlobalModel::clean(const Eigen::Matrix4f & pose,\n                        const int & time,\n                        GPUTexture * indexMap,\n                        GPUTexture * vertConfMap,\n                        GPUTexture * colorTimeMap,\n                        GPUTexture * normRadMap,\n                        GPUTexture * depthMap,\n                        const float confThreshold,\n                        std::vector<float> & graph,\n                        const int timeDelta,\n                        const float maxDepth,\n                        const bool isFern)\n{\n    assert(graph.size() / 16 < MAX_NODES);\n\n    if(graph.size() > 0)\n    {\n        //Can be optimised by only uploading new nodes with offset\n        glBindTexture(GL_TEXTURE_2D, deformationNodes.texture->tid);\n        glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, graph.size(), 1, GL_LUMINANCE, GL_FLOAT, graph.data());\n    }\n\n    TICK(\"Fuse::Copy\");\n    //Next we copy the new unstable vertices from the newUnstableFid transform feedback into the global map\n    unstableProgram->Bind();\n    unstableProgram->setUniform(Uniform(\"time\", time));\n    unstableProgram->setUniform(Uniform(\"confThreshold\", confThreshold));\n    unstableProgram->setUniform(Uniform(\"scale\", (float)IndexMap::FACTOR));\n    unstableProgram->setUniform(Uniform(\"indexSampler\", 0));\n    unstableProgram->setUniform(Uniform(\"vertConfSampler\", 1));\n    unstableProgram->setUniform(Uniform(\"colorTimeSampler\", 2));\n    unstableProgram->setUniform(Uniform(\"normRadSampler\", 3));\n    unstableProgram->setUniform(Uniform(\"nodeSampler\", 4));\n    unstableProgram->setUniform(Uniform(\"depthSampler\", 5));\n    unstableProgram->setUniform(Uniform(\"nodes\", (float)(graph.size() / 16)));\n    unstableProgram->setUniform(Uniform(\"nodeCols\", (float)NODE_TEXTURE_DIMENSION));\n    unstableProgram->setUniform(Uniform(\"timeDelta\", timeDelta));\n    unstableProgram->setUniform(Uniform(\"maxDepth\", maxDepth));\n    unstableProgram->setUniform(Uniform(\"isFern\", (int)isFern));\n\n    Eigen::Matrix4f t_inv = pose.inverse();\n    unstableProgram->setUniform(Uniform(\"t_inv\", t_inv));\n\n    unstableProgram->setUniform(Uniform(\"cam\", Eigen::Vector4f(Intrinsics::getInstance().cx(),\n                                                         Intrinsics::getInstance().cy(),\n                                                         Intrinsics::getInstance().fx(),\n                                                         Intrinsics::getInstance().fy())));\n    unstableProgram->setUniform(Uniform(\"cols\", (float)Resolution::getInstance().cols()));\n    unstableProgram->setUniform(Uniform(\"rows\", (float)Resolution::getInstance().rows()));\n\n    glBindBuffer(GL_ARRAY_BUFFER, vbos[target].first);\n\n    glEnableVertexAttribArray(0);\n    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, 0);\n\n    glEnableVertexAttribArray(1);\n    glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, reinterpret_cast<GLvoid*>(sizeof(Eigen::Vector4f)));\n\n    glEnableVertexAttribArray(2);\n    glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, reinterpret_cast<GLvoid*>(sizeof(Eigen::Vector4f) * 2));\n\n    glEnable(GL_RASTERIZER_DISCARD);\n\n    glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, vbos[renderSource].second);\n\n    glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, vbos[renderSource].first);\n\n    glBeginTransformFeedback(GL_POINTS);\n\n    glActiveTexture(GL_TEXTURE0);\n    glBindTexture(GL_TEXTURE_2D, indexMap->texture->tid);\n\n    glActiveTexture(GL_TEXTURE1);\n    glBindTexture(GL_TEXTURE_2D, vertConfMap->texture->tid);\n\n    glActiveTexture(GL_TEXTURE2);\n    glBindTexture(GL_TEXTURE_2D, colorTimeMap->texture->tid);\n\n    glActiveTexture(GL_TEXTURE3);\n    glBindTexture(GL_TEXTURE_2D, normRadMap->texture->tid);\n\n    glActiveTexture(GL_TEXTURE4);\n    glBindTexture(GL_TEXTURE_2D, deformationNodes.texture->tid);\n\n    glActiveTexture(GL_TEXTURE5);\n    glBindTexture(GL_TEXTURE_2D, depthMap->texture->tid);\n\n    glBeginQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN, countQuery);\n\n    glDrawTransformFeedback(GL_POINTS, vbos[target].second);\n\n    glBindBuffer(GL_ARRAY_BUFFER, newUnstableVbo);\n\n    glEnableVertexAttribArray(0);\n    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, 0);\n\n    glEnableVertexAttribArray(1);\n    glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, reinterpret_cast<GLvoid*>(sizeof(Eigen::Vector4f)));\n\n    glEnableVertexAttribArray(2);\n    glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, reinterpret_cast<GLvoid*>(sizeof(Eigen::Vector4f) * 2));\n\n    glDrawTransformFeedback(GL_POINTS, newUnstableFid);\n\n    glEndQuery(GL_TRANSFORM_FEEDBACK_PRIMITIVES_WRITTEN);\n\n    glGetQueryObjectuiv(countQuery, GL_QUERY_RESULT, &count);\n\n    glEndTransformFeedback();\n\n    glDisable(GL_RASTERIZER_DISCARD);\n\n    glBindTexture(GL_TEXTURE_2D, 0);\n    glActiveTexture(GL_TEXTURE0);\n\n    glDisableVertexAttribArray(0);\n    glDisableVertexAttribArray(1);\n    glDisableVertexAttribArray(2);\n    glBindBuffer(GL_ARRAY_BUFFER, 0);\n    glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);\n\n    unstableProgram->Unbind();\n\n    std::swap(target, renderSource);\n\n    glFinish();\n    TOCK(\"Fuse::Copy\");\n}\n\nunsigned int GlobalModel::lastCount()\n{\n    return count;\n}\n\nEigen::Vector4f * GlobalModel::downloadMap()\n{\n    glFinish();\n\n    Eigen::Vector4f * vertices = new Eigen::Vector4f[count * 3];\n\n    memset(&vertices[0], 0, count * Vertex::SIZE);\n\n    GLuint downloadVbo;\n\n    glGenBuffers(1, &downloadVbo);\n    glBindBuffer(GL_ARRAY_BUFFER, downloadVbo);\n    glBufferData(GL_ARRAY_BUFFER, bufferSize, 0, GL_STREAM_DRAW);\n    glBindBuffer(GL_ARRAY_BUFFER, 0);\n\n    glBindBuffer(GL_COPY_READ_BUFFER, vbos[renderSource].first);\n    glBindBuffer(GL_COPY_WRITE_BUFFER, downloadVbo);\n\n    glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, count * Vertex::SIZE);\n    glGetBufferSubData(GL_COPY_WRITE_BUFFER, 0, count * Vertex::SIZE, vertices);\n\n    glBindBuffer(GL_COPY_READ_BUFFER, 0);\n    glBindBuffer(GL_COPY_WRITE_BUFFER, 0);\n    glDeleteBuffers(1, &downloadVbo);\n\n    glFinish();\n\n    return vertices;\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/GlobalModel.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef GLOBALMODEL_H_\n#define GLOBALMODEL_H_\n\n#include \"Shaders/Shaders.h\"\n#include \"Shaders/Uniform.h\"\n#include \"Shaders/FeedbackBuffer.h\"\n#include \"GPUTexture.h\"\n#include \"Utils/Resolution.h\"\n#include \"IndexMap.h\"\n#include \"Utils/Stopwatch.h\"\n#include \"Utils/Intrinsics.h\"\n#include <pangolin/gl/gl.h>\n#include <Eigen/LU>\n\n#include \"Defines.h\"\n\nclass GlobalModel\n{\n    public:\n        GlobalModel();\n        virtual ~GlobalModel();\n\n        void initialise(const FeedbackBuffer & rawFeedback,\n                        const FeedbackBuffer & filteredFeedback);\n\n        static const int TEXTURE_DIMENSION;\n        static const int MAX_VERTICES;\n        static const int NODE_TEXTURE_DIMENSION;\n        static const int MAX_NODES;\n\n        EFUSION_API void renderPointCloud(pangolin::OpenGlMatrix mvp,\n                              const float threshold,\n                              const bool drawUnstable,\n                              const bool drawNormals,\n                              const bool drawColors,\n                              const bool drawPoints,\n                              const bool drawWindow,\n                              const bool drawTimes,\n                              const int time,\n                              const int timeDelta);\n\n        EFUSION_API const std::pair<GLuint, GLuint> & model();\n\n        void fuse(const Eigen::Matrix4f & pose,\n                  const int & time,\n                  GPUTexture * rgb,\n                  GPUTexture * depthRaw,\n                  GPUTexture * depthFiltered,\n                  GPUTexture * indexMap,\n                  GPUTexture * vertConfMap,\n                  GPUTexture * colorTimeMap,\n                  GPUTexture * normRadMap,\n                  const float depthCutoff,\n                  const float confThreshold,\n                  const float weighting);\n\n        void clean(const Eigen::Matrix4f & pose,\n                   const int & time,\n                   GPUTexture * indexMap,\n                   GPUTexture * vertConfMap,\n                   GPUTexture * colorTimeMap,\n                   GPUTexture * normRadMap,\n                   GPUTexture * depthMap,\n                   const float confThreshold,\n                   std::vector<float> & graph,\n                   const int timeDelta,\n                   const float maxDepth,\n                   const bool isFern);\n\n        EFUSION_API unsigned int lastCount();\n\n        Eigen::Vector4f * downloadMap();\n\n    private:\n        //First is the vbo, second is the fid\n        std::pair<GLuint, GLuint> * vbos;\n        int target, renderSource;\n\n        const int bufferSize;\n\n        GLuint countQuery;\n        unsigned int count;\n\n        std::shared_ptr<Shader> initProgram;\n        std::shared_ptr<Shader> drawProgram;\n        std::shared_ptr<Shader> drawSurfelProgram;\n\n        //For supersample fusing\n        std::shared_ptr<Shader> dataProgram;\n        std::shared_ptr<Shader> updateProgram;\n        std::shared_ptr<Shader> unstableProgram;\n        pangolin::GlRenderBuffer renderBuffer;\n\n        //We render updated vertices vec3 + confidences to one texture\n        GPUTexture updateMapVertsConfs;\n\n        //We render updated colors vec3 + timestamps to another\n        GPUTexture updateMapColorsTime;\n\n        //We render updated normals vec3 + radii to another\n        GPUTexture updateMapNormsRadii;\n\n        //16 floats stored column-major yo'\n        GPUTexture deformationNodes;\n\n        GLuint newUnstableVbo, newUnstableFid;\n\n        pangolin::GlFramebuffer frameBuffer;\n        GLuint uvo;\n        int uvSize;\n};\n\n#endif /* GLOBALMODEL_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/IndexMap.cpp",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#include \"IndexMap.h\"\n\nconst int IndexMap::FACTOR = 1;\n\nIndexMap::IndexMap()\n: indexProgram(loadProgramFromFile(\"index_map.vert\", \"index_map.frag\")),\n  indexRenderBuffer(Resolution::getInstance().width() * IndexMap::FACTOR, Resolution::getInstance().height() * IndexMap::FACTOR),\n  indexTexture(Resolution::getInstance().width() * IndexMap::FACTOR,\n               Resolution::getInstance().height() * IndexMap::FACTOR,\n               GL_LUMINANCE32UI_EXT,\n               GL_LUMINANCE_INTEGER_EXT,\n               GL_UNSIGNED_INT),\n  vertConfTexture(Resolution::getInstance().width() * IndexMap::FACTOR,\n                  Resolution::getInstance().height() * IndexMap::FACTOR,\n                  GL_RGBA32F, GL_LUMINANCE, GL_FLOAT),\n  colorTimeTexture(Resolution::getInstance().width() * IndexMap::FACTOR,\n                   Resolution::getInstance().height() * IndexMap::FACTOR,\n                   GL_RGBA32F, GL_LUMINANCE, GL_FLOAT),\n  normalRadTexture(Resolution::getInstance().width() * IndexMap::FACTOR,\n                   Resolution::getInstance().height() * IndexMap::FACTOR,\n                   GL_RGBA32F, GL_LUMINANCE, GL_FLOAT),\n  drawDepthProgram(loadProgramFromFile(\"empty.vert\", \"visualise_textures.frag\", \"quad.geom\")),\n  drawRenderBuffer(Resolution::getInstance().width(), Resolution::getInstance().height()),\n  drawTexture(Resolution::getInstance().width(),\n              Resolution::getInstance().height(),\n              GL_RGBA,\n              GL_RGB,\n              GL_UNSIGNED_BYTE,\n              false),\n  depthProgram(loadProgramFromFile(\"splat.vert\", \"depth_splat.frag\")),\n  depthRenderBuffer(Resolution::getInstance().width(), Resolution::getInstance().height()),\n  depthTexture(Resolution::getInstance().width(),\n               Resolution::getInstance().height(),\n               GL_LUMINANCE32F_ARB,\n               GL_LUMINANCE,\n               GL_FLOAT,\n               false,\n               true),\n  combinedProgram(loadProgramFromFile(\"splat.vert\", \"combo_splat.frag\")),\n  combinedRenderBuffer(Resolution::getInstance().width(), Resolution::getInstance().height()),\n  imageTexture(Resolution::getInstance().width(),\n               Resolution::getInstance().height(),\n               GL_RGBA,\n               GL_RGB,\n               GL_UNSIGNED_BYTE,\n               false,\n               true),\n  vertexTexture(Resolution::getInstance().width(),\n                Resolution::getInstance().height(),\n                GL_RGBA32F, GL_LUMINANCE, GL_FLOAT, false, true),\n  normalTexture(Resolution::getInstance().width(),\n                Resolution::getInstance().height(),\n                GL_RGBA32F, GL_LUMINANCE, GL_FLOAT, false, true),\n  timeTexture(Resolution::getInstance().width(),\n              Resolution::getInstance().height(),\n              GL_LUMINANCE16UI_EXT,\n              GL_LUMINANCE_INTEGER_EXT,\n              GL_UNSIGNED_SHORT,\n              false,\n              true),\n  oldRenderBuffer(Resolution::getInstance().width(), Resolution::getInstance().height()),\n  oldImageTexture(Resolution::getInstance().width(),\n                  Resolution::getInstance().height(),\n                  GL_RGBA,\n                  GL_RGB,\n                  GL_UNSIGNED_BYTE,\n                  false,\n                  true),\n  oldVertexTexture(Resolution::getInstance().width(),\n                   Resolution::getInstance().height(),\n                   GL_RGBA32F, GL_LUMINANCE, GL_FLOAT, false, true),\n  oldNormalTexture(Resolution::getInstance().width(),\n                   Resolution::getInstance().height(),\n                   GL_RGBA32F, GL_LUMINANCE, GL_FLOAT, false, true),\n  oldTimeTexture(Resolution::getInstance().width(),\n                 Resolution::getInstance().height(),\n                 GL_LUMINANCE16UI_EXT,\n                 GL_LUMINANCE_INTEGER_EXT,\n                 GL_UNSIGNED_SHORT,\n                 false,\n                 true),\n  infoRenderBuffer(Resolution::getInstance().width(), Resolution::getInstance().height()),\n  colorInfoTexture(Resolution::getInstance().width() * IndexMap::FACTOR,\n                   Resolution::getInstance().height() * IndexMap::FACTOR,\n                   GL_RGBA32F, GL_LUMINANCE, GL_FLOAT),\n  vertexInfoTexture(Resolution::getInstance().width() * IndexMap::FACTOR,\n                   Resolution::getInstance().height() * IndexMap::FACTOR,\n                   GL_RGBA32F, GL_LUMINANCE, GL_FLOAT),\n  normalInfoTexture(Resolution::getInstance().width() * IndexMap::FACTOR,\n                    Resolution::getInstance().height() * IndexMap::FACTOR,\n                    GL_RGBA32F, GL_LUMINANCE, GL_FLOAT)\n\n{\n   indexFrameBuffer.AttachColour(*indexTexture.texture);\n   indexFrameBuffer.AttachColour(*vertConfTexture.texture);\n   indexFrameBuffer.AttachColour(*colorTimeTexture.texture);\n   indexFrameBuffer.AttachColour(*normalRadTexture.texture);\n   indexFrameBuffer.AttachDepth(indexRenderBuffer);\n\n   drawFrameBuffer.AttachColour(*drawTexture.texture);\n   drawFrameBuffer.AttachDepth(drawRenderBuffer);\n\n   depthFrameBuffer.AttachColour(*depthTexture.texture);\n   depthFrameBuffer.AttachDepth(depthRenderBuffer);\n\n   combinedFrameBuffer.AttachColour(*imageTexture.texture);\n   combinedFrameBuffer.AttachColour(*vertexTexture.texture);\n   combinedFrameBuffer.AttachColour(*normalTexture.texture);\n   combinedFrameBuffer.AttachColour(*timeTexture.texture);\n   combinedFrameBuffer.AttachDepth(combinedRenderBuffer);\n\n   oldFrameBuffer.AttachDepth(oldRenderBuffer);\n   oldFrameBuffer.AttachColour(*oldImageTexture.texture);\n   oldFrameBuffer.AttachColour(*oldVertexTexture.texture);\n   oldFrameBuffer.AttachColour(*oldNormalTexture.texture);\n   oldFrameBuffer.AttachColour(*oldTimeTexture.texture);\n\n   infoFrameBuffer.AttachColour(*colorInfoTexture.texture);\n   infoFrameBuffer.AttachColour(*vertexInfoTexture.texture);\n   infoFrameBuffer.AttachColour(*normalInfoTexture.texture);\n   infoFrameBuffer.AttachDepth(infoRenderBuffer);\n}\n\nIndexMap::~IndexMap()\n{\n}\n\nvoid IndexMap::predictIndices(const Eigen::Matrix4f & pose,\n                              const int & time,\n                              const std::pair<GLuint, GLuint> & model,\n                              const float depthCutoff,\n                              const int timeDelta)\n{\n    indexFrameBuffer.Bind();\n\n    glPushAttrib(GL_VIEWPORT_BIT);\n\n    glViewport(0, 0, indexRenderBuffer.width, indexRenderBuffer.height);\n\n    glClearColor(0, 0, 0, 0);\n\n    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n\n    indexProgram->Bind();\n\n    Eigen::Matrix4f t_inv = pose.inverse();\n\n    Eigen::Vector4f cam(Intrinsics::getInstance().cx() * IndexMap::FACTOR,\n                  Intrinsics::getInstance().cy() * IndexMap::FACTOR,\n                  Intrinsics::getInstance().fx() * IndexMap::FACTOR,\n                  Intrinsics::getInstance().fy() * IndexMap::FACTOR);\n\n    indexProgram->setUniform(Uniform(\"t_inv\", t_inv));\n    indexProgram->setUniform(Uniform(\"cam\", cam));\n    indexProgram->setUniform(Uniform(\"maxDepth\", depthCutoff));\n    indexProgram->setUniform(Uniform(\"cols\", (float)Resolution::getInstance().cols() * IndexMap::FACTOR));\n    indexProgram->setUniform(Uniform(\"rows\", (float)Resolution::getInstance().rows() * IndexMap::FACTOR));\n    indexProgram->setUniform(Uniform(\"time\", time));\n    indexProgram->setUniform(Uniform(\"timeDelta\", timeDelta));\n\n    glBindBuffer(GL_ARRAY_BUFFER, model.first);\n\n    glEnableVertexAttribArray(0);\n    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, 0);\n\n    glEnableVertexAttribArray(1);\n    glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, reinterpret_cast<GLvoid*>(sizeof(Eigen::Vector4f)));\n\n    glEnableVertexAttribArray(2);\n    glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, reinterpret_cast<GLvoid*>(sizeof(Eigen::Vector4f) * 2));\n\n    glDrawTransformFeedback(GL_POINTS, model.second);\n\n    glDisableVertexAttribArray(0);\n    glDisableVertexAttribArray(1);\n    glDisableVertexAttribArray(2);\n    glBindBuffer(GL_ARRAY_BUFFER, 0);\n\n    indexFrameBuffer.Unbind();\n\n    indexProgram->Unbind();\n\n    glPopAttrib();\n\n    glFinish();\n}\n\nvoid IndexMap::renderDepth(const float depthCutoff)\n{\n    drawFrameBuffer.Bind();\n\n    glPushAttrib(GL_VIEWPORT_BIT);\n\n    glViewport(0, 0, drawRenderBuffer.width, drawRenderBuffer.height);\n\n    glClearColor(0, 0, 0, 0);\n\n    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n\n    drawDepthProgram->Bind();\n\n    drawDepthProgram->setUniform(Uniform(\"maxDepth\", depthCutoff));\n\n    glActiveTexture(GL_TEXTURE0);\n    glBindTexture(GL_TEXTURE_2D, vertexTexture.texture->tid);\n\n    drawDepthProgram->setUniform(Uniform(\"texVerts\", 0));\n\n    glDrawArrays(GL_POINTS, 0, 1);\n\n    drawFrameBuffer.Unbind();\n\n    drawDepthProgram->Unbind();\n\n    glBindTexture(GL_TEXTURE_2D, 0);\n\n    glPopAttrib();\n\n    glFinish();\n}\n\nvoid IndexMap::combinedPredict(const Eigen::Matrix4f & pose,\n                               const std::pair<GLuint, GLuint> & model,\n                               const float depthCutoff,\n                               const float confThreshold,\n                               const int time,\n                               const int maxTime,\n                               const int timeDelta,\n                               IndexMap::Prediction predictionType)\n{\n    glEnable(GL_PROGRAM_POINT_SIZE);\n    glEnable(GL_POINT_SPRITE);\n\n    if(predictionType == IndexMap::ACTIVE)\n    {\n        combinedFrameBuffer.Bind();\n    }\n    else if(predictionType == IndexMap::INACTIVE)\n    {\n        oldFrameBuffer.Bind();\n    }\n    else\n    {\n        assert(false);\n    }\n\n    glPushAttrib(GL_VIEWPORT_BIT);\n\n    if(predictionType == IndexMap::ACTIVE)\n    {\n        glViewport(0, 0, combinedRenderBuffer.width, combinedRenderBuffer.height);\n    }\n    else if(predictionType == IndexMap::INACTIVE)\n    {\n        glViewport(0, 0, oldRenderBuffer.width, oldRenderBuffer.height);\n    }\n    else\n    {\n        assert(false);\n    }\n\n    glClearColor(0, 0, 0, 0);\n\n    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n\n    combinedProgram->Bind();\n\n    Eigen::Matrix4f t_inv = pose.inverse();\n\n    Eigen::Vector4f cam(Intrinsics::getInstance().cx(),\n                  Intrinsics::getInstance().cy(),\n                  Intrinsics::getInstance().fx(),\n                  Intrinsics::getInstance().fy());\n\n    combinedProgram->setUniform(Uniform(\"t_inv\", t_inv));\n    combinedProgram->setUniform(Uniform(\"cam\", cam));\n    combinedProgram->setUniform(Uniform(\"maxDepth\", depthCutoff));\n    combinedProgram->setUniform(Uniform(\"confThreshold\", confThreshold));\n    combinedProgram->setUniform(Uniform(\"cols\", (float)Resolution::getInstance().cols()));\n    combinedProgram->setUniform(Uniform(\"rows\", (float)Resolution::getInstance().rows()));\n    combinedProgram->setUniform(Uniform(\"time\", time));\n    combinedProgram->setUniform(Uniform(\"maxTime\", maxTime));\n    combinedProgram->setUniform(Uniform(\"timeDelta\", timeDelta));\n\n    glBindBuffer(GL_ARRAY_BUFFER, model.first);\n\n    glEnableVertexAttribArray(0);\n    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, 0);\n\n    glEnableVertexAttribArray(1);\n    glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, reinterpret_cast<GLvoid*>(sizeof(Eigen::Vector4f) * 1));\n\n    glEnableVertexAttribArray(2);\n    glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, reinterpret_cast<GLvoid*>(sizeof(Eigen::Vector4f) * 2));\n\n    glDrawTransformFeedback(GL_POINTS, model.second);\n\n    glDisableVertexAttribArray(0);\n    glDisableVertexAttribArray(1);\n    glDisableVertexAttribArray(2);\n    glBindBuffer(GL_ARRAY_BUFFER, 0);\n\n    if(predictionType == IndexMap::ACTIVE)\n    {\n        combinedFrameBuffer.Unbind();\n    }\n    else if(predictionType == IndexMap::INACTIVE)\n    {\n        oldFrameBuffer.Unbind();\n    }\n    else\n    {\n        assert(false);\n    }\n\n    combinedProgram->Unbind();\n\n    glDisable(GL_PROGRAM_POINT_SIZE);\n    glDisable(GL_POINT_SPRITE);\n\n    glPopAttrib();\n\n    glFinish();\n}\n\nvoid IndexMap::synthesizeDepth(const Eigen::Matrix4f & pose,\n                               const std::pair<GLuint, GLuint> & model,\n                               const float depthCutoff,\n                               const float confThreshold,\n                               const int time,\n                               const int maxTime,\n                               const int timeDelta)\n{\n    glEnable(GL_PROGRAM_POINT_SIZE);\n    glEnable(GL_POINT_SPRITE);\n\n    depthFrameBuffer.Bind();\n\n    glPushAttrib(GL_VIEWPORT_BIT);\n\n    glViewport(0, 0, depthRenderBuffer.width, depthRenderBuffer.height);\n\n    glClearColor(0, 0, 0, 0);\n\n    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n\n    depthProgram->Bind();\n\n    Eigen::Matrix4f t_inv = pose.inverse();\n\n    Eigen::Vector4f cam(Intrinsics::getInstance().cx(),\n                  Intrinsics::getInstance().cy(),\n                  Intrinsics::getInstance().fx(),\n                  Intrinsics::getInstance().fy());\n\n    depthProgram->setUniform(Uniform(\"t_inv\", t_inv));\n    depthProgram->setUniform(Uniform(\"cam\", cam));\n    depthProgram->setUniform(Uniform(\"maxDepth\", depthCutoff));\n    depthProgram->setUniform(Uniform(\"confThreshold\", confThreshold));\n    depthProgram->setUniform(Uniform(\"cols\", (float)Resolution::getInstance().cols()));\n    depthProgram->setUniform(Uniform(\"rows\", (float)Resolution::getInstance().rows()));\n    depthProgram->setUniform(Uniform(\"time\", time));\n    depthProgram->setUniform(Uniform(\"maxTime\", maxTime));\n    depthProgram->setUniform(Uniform(\"timeDelta\", timeDelta));\n\n    glBindBuffer(GL_ARRAY_BUFFER, model.first);\n\n    glEnableVertexAttribArray(0);\n    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, 0);\n\n    glEnableVertexAttribArray(1);\n    glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, reinterpret_cast<GLvoid*>(sizeof(Eigen::Vector4f) * 1));\n\n    glEnableVertexAttribArray(2);\n    glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, reinterpret_cast<GLvoid*>(sizeof(Eigen::Vector4f) * 2));\n\n    glDrawTransformFeedback(GL_POINTS, model.second);\n\n    glDisableVertexAttribArray(0);\n    glDisableVertexAttribArray(1);\n    glDisableVertexAttribArray(2);\n    glBindBuffer(GL_ARRAY_BUFFER, 0);\n\n    depthFrameBuffer.Unbind();\n\n    depthProgram->Unbind();\n\n    glDisable(GL_PROGRAM_POINT_SIZE);\n    glDisable(GL_POINT_SPRITE);\n\n    glPopAttrib();\n\n    glFinish();\n}\n\nvoid IndexMap::synthesizeInfo(const Eigen::Matrix4f & pose,\n                              const std::pair<GLuint, GLuint> & model,\n                              const float depthCutoff,\n                              const float confThreshold)\n{\n    glEnable(GL_PROGRAM_POINT_SIZE);\n    glEnable(GL_POINT_SPRITE);\n\n    infoFrameBuffer.Bind();\n\n    glPushAttrib(GL_VIEWPORT_BIT);\n\n    glViewport(0, 0, infoRenderBuffer.width, infoRenderBuffer.height);\n\n    glClearColor(0, 0, 0, 0);\n\n    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n\n    combinedProgram->Bind();\n\n    Eigen::Matrix4f t_inv = pose.inverse();\n\n    Eigen::Vector4f cam(Intrinsics::getInstance().cx(),\n                  Intrinsics::getInstance().cy(),\n                  Intrinsics::getInstance().fx(),\n                  Intrinsics::getInstance().fy());\n\n    combinedProgram->setUniform(Uniform(\"t_inv\", t_inv));\n    combinedProgram->setUniform(Uniform(\"cam\", cam));\n    combinedProgram->setUniform(Uniform(\"maxDepth\", depthCutoff));\n    combinedProgram->setUniform(Uniform(\"confThreshold\", confThreshold));\n    combinedProgram->setUniform(Uniform(\"cols\", (float)Resolution::getInstance().cols()));\n    combinedProgram->setUniform(Uniform(\"rows\", (float)Resolution::getInstance().rows()));\n    combinedProgram->setUniform(Uniform(\"time\", 0));\n    combinedProgram->setUniform(Uniform(\"maxTime\", std::numeric_limits<int>::max()));\n    combinedProgram->setUniform(Uniform(\"timeDelta\", std::numeric_limits<int>::max()));\n\n    glBindBuffer(GL_ARRAY_BUFFER, model.first);\n\n    glEnableVertexAttribArray(0);\n    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, 0);\n\n    glEnableVertexAttribArray(1);\n    glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, reinterpret_cast<GLvoid*>(sizeof(Eigen::Vector4f) * 1));\n\n    glEnableVertexAttribArray(2);\n    glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, reinterpret_cast<GLvoid*>(sizeof(Eigen::Vector4f) * 2));\n\n    glDrawTransformFeedback(GL_POINTS, model.second);\n\n    glDisableVertexAttribArray(0);\n    glDisableVertexAttribArray(1);\n    glDisableVertexAttribArray(2);\n    glBindBuffer(GL_ARRAY_BUFFER, 0);\n\n    infoFrameBuffer.Unbind();\n\n    combinedProgram->Unbind();\n\n    glDisable(GL_PROGRAM_POINT_SIZE);\n    glDisable(GL_POINT_SPRITE);\n\n    glPopAttrib();\n\n    glFinish();\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/IndexMap.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef INDEXMAP_H_\n#define INDEXMAP_H_\n\n#include \"Shaders/Shaders.h\"\n#include \"Shaders/Uniform.h\"\n#include \"Shaders/Vertex.h\"\n#include \"GPUTexture.h\"\n#include \"Utils/Resolution.h\"\n#include \"Utils/Intrinsics.h\"\n#include <pangolin/gl/gl.h>\n#include <Eigen/LU>\n\n#include \"Defines.h\"\n\nclass IndexMap\n{\n    public:\n        IndexMap();\n        virtual ~IndexMap();\n\n        void predictIndices(const Eigen::Matrix4f & pose,\n                            const int & time,\n                            const std::pair<GLuint, GLuint> & model,\n                            const float depthCutoff,\n                            const int timeDelta);\n\n        EFUSION_API void renderDepth(const float depthCutoff);\n\n        enum Prediction\n        {\n            ACTIVE,\n            INACTIVE\n        };\n\n        void combinedPredict(const Eigen::Matrix4f & pose,\n                             const std::pair<GLuint, GLuint> & model,\n                             const float depthCutoff,\n                             const float confThreshold,\n                             const int time,\n                             const int maxTime,\n                             const int timeDelta,\n                             IndexMap::Prediction predictionType);\n\n        void synthesizeInfo(const Eigen::Matrix4f & pose,\n                            const std::pair<GLuint, GLuint> & model,\n                            const float depthCutoff,\n                            const float confThreshold);\n\n        void synthesizeDepth(const Eigen::Matrix4f & pose,\n                             const std::pair<GLuint, GLuint> & model,\n                             const float depthCutoff,\n                             const float confThreshold,\n                             const int time,\n                             const int maxTime,\n                             const int timeDelta);\n\n        GPUTexture * indexTex()\n        {\n            return &indexTexture;\n        }\n\n        GPUTexture * vertConfTex()\n        {\n            return &vertConfTexture;\n        }\n\n        GPUTexture * colorTimeTex()\n        {\n            return &colorTimeTexture;\n        }\n\n        GPUTexture * normalRadTex()\n        {\n            return &normalRadTexture;\n        }\n\n        GPUTexture * drawTex()\n        {\n            return &drawTexture;\n        }\n\n        GPUTexture * depthTex()\n        {\n            return &depthTexture;\n        }\n\n        GPUTexture * imageTex()\n        {\n            return &imageTexture;\n        }\n\n        GPUTexture * vertexTex()\n        {\n            return &vertexTexture;\n        }\n\n        GPUTexture * normalTex()\n        {\n            return &normalTexture;\n        }\n\n        GPUTexture * timeTex()\n        {\n            return &timeTexture;\n        }\n\n        GPUTexture * oldImageTex()\n        {\n            return &oldImageTexture;\n        }\n\n        GPUTexture * oldVertexTex()\n        {\n            return &oldVertexTexture;\n        }\n\n        GPUTexture * oldNormalTex()\n        {\n            return &oldNormalTexture;\n        }\n\n        GPUTexture * oldTimeTex()\n        {\n            return &oldTimeTexture;\n        }\n\n        GPUTexture * colorInfoTex()\n        {\n            return &colorInfoTexture;\n        }\n\n        GPUTexture * vertexInfoTex()\n        {\n            return &vertexInfoTexture;\n        }\n\n        GPUTexture * normalInfoTex()\n        {\n            return &normalInfoTexture;\n        }\n\n        static const int FACTOR;\n\n    private:\n        std::shared_ptr<Shader> indexProgram;\n        pangolin::GlFramebuffer indexFrameBuffer;\n        pangolin::GlRenderBuffer indexRenderBuffer;\n        GPUTexture indexTexture;\n        GPUTexture vertConfTexture;\n        GPUTexture colorTimeTexture;\n        GPUTexture normalRadTexture;\n\n        std::shared_ptr<Shader> drawDepthProgram;\n        pangolin::GlFramebuffer drawFrameBuffer;\n        pangolin::GlRenderBuffer drawRenderBuffer;\n        GPUTexture drawTexture;\n\n        std::shared_ptr<Shader> depthProgram;\n        pangolin::GlFramebuffer depthFrameBuffer;\n        pangolin::GlRenderBuffer depthRenderBuffer;\n        GPUTexture depthTexture;\n\n        std::shared_ptr<Shader> combinedProgram;\n        pangolin::GlFramebuffer combinedFrameBuffer;\n        pangolin::GlRenderBuffer combinedRenderBuffer;\n        GPUTexture imageTexture;\n        GPUTexture vertexTexture;\n        GPUTexture normalTexture;\n        GPUTexture timeTexture;\n\n        pangolin::GlFramebuffer oldFrameBuffer;\n        pangolin::GlRenderBuffer oldRenderBuffer;\n        GPUTexture oldImageTexture;\n        GPUTexture oldVertexTexture;\n        GPUTexture oldNormalTexture;\n        GPUTexture oldTimeTexture;\n\n        pangolin::GlFramebuffer infoFrameBuffer;\n        pangolin::GlRenderBuffer infoRenderBuffer;\n        GPUTexture colorInfoTexture;\n        GPUTexture vertexInfoTexture;\n        GPUTexture normalInfoTexture;\n};\n\n#endif /* INDEXMAP_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/PoseMatch.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef POSEMATCH_H_\n#define POSEMATCH_H_\n\n#include <Eigen/Core>\n#include \"Ferns.h\"\n\nclass PoseMatch\n{\n    public:\n        PoseMatch(int firstId,\n                  int secondId,\n                  const Eigen::Matrix4f & first,\n                  const Eigen::Matrix4f & second,\n                  const std::vector<Ferns::SurfaceConstraint> & constraints,\n                  const bool & fern)\n     : firstId(firstId),\n       secondId(secondId),\n       first(first),\n       second(second),\n       constraints(constraints),\n       fern(fern)\n    {}\n\n    int firstId;\n    int secondId;\n    Eigen::Matrix4f first;\n    Eigen::Matrix4f second;\n    std::vector<Ferns::SurfaceConstraint> constraints;\n    bool fern;\n};\n\n#endif /* POSEMATCH_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/ComputePack.cpp",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#include \"ComputePack.h\"\n\nconst std::string ComputePack::NORM = \"NORM\";\nconst std::string ComputePack::FILTER = \"FILTER\";\nconst std::string ComputePack::METRIC = \"METRIC\";\nconst std::string ComputePack::METRIC_FILTERED = \"METRIC_FILTERED\";\n\nComputePack::ComputePack(std::shared_ptr<Shader> program,\n                         pangolin::GlTexture * target)\n : program(program),\n   renderBuffer(Resolution::getInstance().width(), Resolution::getInstance().height()),\n   target(target)\n{\n    frameBuffer.AttachColour(*target);\n    frameBuffer.AttachDepth(renderBuffer);\n}\n\nComputePack::~ComputePack()\n{\n\n}\n\nvoid ComputePack::compute(pangolin::GlTexture * input, const std::vector<Uniform> * const uniforms)\n{\n    input->Bind();\n\n    frameBuffer.Bind();\n\n    glPushAttrib(GL_VIEWPORT_BIT);\n\n    glViewport(0, 0, renderBuffer.width, renderBuffer.height);\n\n    glClearColor(0, 0, 0, 0);\n    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n\n    program->Bind();\n\n    if(uniforms)\n    {\n        for(size_t i = 0; i < uniforms->size(); i++)\n        {\n            program->setUniform(uniforms->at(i));\n        }\n    }\n\n    glDrawArrays(GL_POINTS, 0, 1);\n\n    frameBuffer.Unbind();\n\n    program->Unbind();\n\n    glPopAttrib();\n\n    glFinish();\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/ComputePack.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef COMPUTEPACK_H_\n#define COMPUTEPACK_H_\n\n#include \"Shaders.h\"\n#include \"../Utils/Resolution.h\"\n#include \"Uniform.h\"\n#include <pangolin/gl/gl.h>\n\nclass ComputePack\n{\n    public:\n        ComputePack(std::shared_ptr<Shader> program,\n                    pangolin::GlTexture * target);\n\n        virtual ~ComputePack();\n\n        static const std::string NORM, FILTER, METRIC, METRIC_FILTERED;\n\n        void compute(pangolin::GlTexture * input, const std::vector<Uniform> * const uniforms = 0);\n\n    private:\n        std::shared_ptr<Shader> program;\n        pangolin::GlRenderBuffer renderBuffer;\n        pangolin::GlTexture * target;\n        pangolin::GlFramebuffer frameBuffer;\n};\n\n#endif /* COMPUTEPACK_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/FeedbackBuffer.cpp",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#include \"FeedbackBuffer.h\"\n\nconst std::string FeedbackBuffer::RAW = \"RAW\";\nconst std::string FeedbackBuffer::FILTERED = \"FILTERED\";\n\nFeedbackBuffer::FeedbackBuffer(std::shared_ptr<Shader> program)\n : program(program),\n   drawProgram(loadProgramFromFile(\"draw_feedback.vert\", \"draw_feedback.frag\")),\n   bufferSize(Resolution::getInstance().numPixels() * Vertex::SIZE),\n   count(0)\n{\n    float * vertices = new float[bufferSize];\n\n    memset(&vertices[0], 0, bufferSize);\n\n    glGenTransformFeedbacks(1, &fid);\n    glGenBuffers(1, &vbo);\n    glBindBuffer(GL_ARRAY_BUFFER, vbo);\n    glBufferData(GL_ARRAY_BUFFER, bufferSize, &vertices[0], GL_STREAM_DRAW);\n    glBindBuffer(GL_ARRAY_BUFFER, 0);\n\n    delete [] vertices;\n\n    std::vector<Eigen::Vector2f> uv;\n\n    for(int i = 0; i < Resolution::getInstance().width(); i++)\n    {\n        for(int j = 0; j < Resolution::getInstance().height(); j++)\n        {\n            uv.push_back(Eigen::Vector2f(((float)i / (float)Resolution::getInstance().width()) + 1.0 / (2 * (float)Resolution::getInstance().width()),\n                                   ((float)j / (float)Resolution::getInstance().height()) + 1.0 / (2 * (float)Resolution::getInstance().height())));\n        }\n    }\n\n    glGenBuffers(1, &uvo);\n    glBindBuffer(GL_ARRAY_BUFFER, uvo);\n    glBufferData(GL_ARRAY_BUFFER, uv.size() * sizeof(Eigen::Vector2f), &uv[0], GL_STATIC_DRAW);\n    glBindBuffer(GL_ARRAY_BUFFER, 0);\n\n    program->Bind();\n\n    int loc[3] =\n    {\n        glGetVaryingLocationNV(program->programId(), \"vPosition0\"),\n        glGetVaryingLocationNV(program->programId(), \"vColor0\"),\n        glGetVaryingLocationNV(program->programId(), \"vNormRad0\"),\n    };\n\n    glTransformFeedbackVaryingsNV(program->programId(), 3, loc, GL_INTERLEAVED_ATTRIBS);\n\n    program->Unbind();\n\n    glGenQueries(1, &countQuery);\n}\n\nFeedbackBuffer::~FeedbackBuffer()\n{\n    glDeleteTransformFeedbacks(1, &fid);\n    glDeleteBuffers(1, &vbo);\n    glDeleteBuffers(1, &uvo);\n    glDeleteQueries(1, &countQuery);\n}\n\nvoid FeedbackBuffer::compute(pangolin::GlTexture * color,\n                             pangolin::GlTexture * depth,\n                             const int & time,\n                             const float depthCutoff)\n{\n    program->Bind();\n\n    Eigen::Vector4f cam(Intrinsics::getInstance().cx(),\n                  Intrinsics::getInstance().cy(),\n                  1.0f / Intrinsics::getInstance().fx(),\n                  1.0f / Intrinsics::getInstance().fy());\n\n    program->setUniform(Uniform(\"cam\", cam));\n    program->setUniform(Uniform(\"threshold\", 0.0f));\n    program->setUniform(Uniform(\"cols\", (float)Resolution::getInstance().cols()));\n    program->setUniform(Uniform(\"rows\", (float)Resolution::getInstance().rows()));\n    program->setUniform(Uniform(\"time\", time));\n    program->setUniform(Uniform(\"gSampler\", 0));\n    program->setUniform(Uniform(\"cSampler\", 1));\n    program->setUniform(Uniform(\"maxDepth\", depthCutoff));\n\n    glEnableVertexAttribArray(0);\n    glBindBuffer(GL_ARRAY_BUFFER, uvo);\n    glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 0, 0);\n\n    glEnable(GL_RASTERIZER_DISCARD);\n\n    glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, fid);\n\n    glBindBufferBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0, vbo);\n\n    glBeginTransformFeedback(GL_POINTS);\n\n    glActiveTexture(GL_TEXTURE0);\n    glBindTexture(GL_TEXTURE_2D, depth->tid);\n\n    glActiveTexture(GL_TEXTURE1);\n    glBindTexture(GL_TEXTURE_2D, color->tid);\n\n    glDrawArrays(GL_POINTS, 0, Resolution::getInstance().numPixels());\n\n    glBindTexture(GL_TEXTURE_2D, 0);\n\n    glActiveTexture(GL_TEXTURE0);\n\n    glEndTransformFeedback();\n\n    glDisable(GL_RASTERIZER_DISCARD);\n\n    glDisableVertexAttribArray(0);\n    glBindBuffer(GL_ARRAY_BUFFER, 0);\n    glBindTransformFeedback(GL_TRANSFORM_FEEDBACK, 0);\n\n    program->Unbind();\n\n    glFinish();\n}\n\nvoid FeedbackBuffer::render(pangolin::OpenGlMatrix mvp,\n                            const Eigen::Matrix4f & pose,\n                            const bool drawNormals,\n                            const bool drawColors)\n{\n    drawProgram->Bind();\n\n    drawProgram->setUniform(Uniform(\"MVP\", mvp));\n    drawProgram->setUniform(Uniform(\"pose\", pose));\n    drawProgram->setUniform(Uniform(\"colorType\", (drawNormals ? 1 : drawColors ? 2 : 0)));\n\n    glBindBuffer(GL_ARRAY_BUFFER, vbo);\n\n    glEnableVertexAttribArray(0);\n    glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, 0);\n\n    glEnableVertexAttribArray(1);\n    glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, reinterpret_cast<GLvoid*>(sizeof(Eigen::Vector4f) * 1));\n\n    glEnableVertexAttribArray(2);\n    glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, reinterpret_cast<GLvoid*>(sizeof(Eigen::Vector4f) * 2));\n\n    glDrawTransformFeedback(GL_POINTS, fid);\n\n    glDisableVertexAttribArray(0);\n    glDisableVertexAttribArray(1);\n    glDisableVertexAttribArray(2);\n    glBindBuffer(GL_ARRAY_BUFFER, 0);\n\n    drawProgram->Unbind();\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/FeedbackBuffer.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef FEEDBACKBUFFER_H_\n#define FEEDBACKBUFFER_H_\n\n#include \"Shaders.h\"\n#include \"Uniform.h\"\n#include \"Vertex.h\"\n#include \"../Utils/Resolution.h\"\n#include \"../Utils/Intrinsics.h\"\n#include <pangolin/gl/gl.h>\n#include <pangolin/display/opengl_render_state.h>\n\n#include \"../Defines.h\"\n\nclass FeedbackBuffer\n{\n    public:\n        FeedbackBuffer(std::shared_ptr<Shader> program);\n        virtual ~FeedbackBuffer();\n\n        std::shared_ptr<Shader> program;\n\n        void compute(pangolin::GlTexture * color,\n                     pangolin::GlTexture * depth,\n                     const int & time,\n                     const float depthCutoff);\n\n        EFUSION_API void render(pangolin::OpenGlMatrix mvp, const Eigen::Matrix4f & pose, const bool drawNormals, const bool drawColors);\n\n        EFUSION_API static const std::string RAW, FILTERED;\n\n        GLuint vbo;\n        GLuint fid;\n\n    private:\n        std::shared_ptr<Shader> drawProgram;\n        GLuint uvo;\n        GLuint countQuery;\n        const int bufferSize;\n        unsigned int count;\n};\n\n#endif /* FEEDBACKBUFFER_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/FillIn.cpp",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#include \"FillIn.h\"\n\nFillIn::FillIn()\n : imageTexture(Resolution::getInstance().width(),\n                Resolution::getInstance().height(),\n                GL_RGBA,\n                GL_RGB,\n                GL_UNSIGNED_BYTE,\n                false,\n                true),\n   vertexTexture(Resolution::getInstance().width(),\n                 Resolution::getInstance().height(),\n                 GL_RGBA32F,\n                 GL_LUMINANCE,\n                 GL_FLOAT,\n                 false,\n                 true),\n   normalTexture(Resolution::getInstance().width(),\n                 Resolution::getInstance().height(),\n                 GL_RGBA32F,\n                 GL_LUMINANCE,\n                 GL_FLOAT,\n                 false,\n                 true),\n   imageProgram(loadProgramFromFile(\"empty.vert\", \"fill_rgb.frag\", \"quad.geom\")),\n   imageRenderBuffer(Resolution::getInstance().width(), Resolution::getInstance().height()),\n   vertexProgram(loadProgramFromFile(\"empty.vert\", \"fill_vertex.frag\", \"quad.geom\")),\n   vertexRenderBuffer(Resolution::getInstance().width(), Resolution::getInstance().height()),\n   normalProgram(loadProgramFromFile(\"empty.vert\", \"fill_normal.frag\", \"quad.geom\")),\n   normalRenderBuffer(Resolution::getInstance().width(), Resolution::getInstance().height())\n{\n    imageFrameBuffer.AttachColour(*imageTexture.texture);\n    imageFrameBuffer.AttachDepth(imageRenderBuffer);\n\n    vertexFrameBuffer.AttachColour(*vertexTexture.texture);\n    vertexFrameBuffer.AttachDepth(vertexRenderBuffer);\n\n    normalFrameBuffer.AttachColour(*normalTexture.texture);\n    normalFrameBuffer.AttachDepth(normalRenderBuffer);\n}\n\nFillIn::~FillIn()\n{\n\n}\n\nvoid FillIn::image(GPUTexture * existingRgb, GPUTexture * rawRgb, bool passthrough)\n{\n    imageFrameBuffer.Bind();\n\n    glPushAttrib(GL_VIEWPORT_BIT);\n\n    glViewport(0, 0, imageRenderBuffer.width, imageRenderBuffer.height);\n\n    glClearColor(0, 0, 0, 0);\n    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n\n    imageProgram->Bind();\n\n    imageProgram->setUniform(Uniform(\"eSampler\", 0));\n    imageProgram->setUniform(Uniform(\"rSampler\", 1));\n    imageProgram->setUniform(Uniform(\"passthrough\", (int)passthrough));\n\n    glActiveTexture(GL_TEXTURE0);\n    glBindTexture(GL_TEXTURE_2D, existingRgb->texture->tid);\n\n    glActiveTexture(GL_TEXTURE1);\n    glBindTexture(GL_TEXTURE_2D, rawRgb->texture->tid);\n\n    glDrawArrays(GL_POINTS, 0, 1);\n\n    imageFrameBuffer.Unbind();\n\n    glBindTexture(GL_TEXTURE_2D, 0);\n\n    glActiveTexture(GL_TEXTURE0);\n\n    imageProgram->Unbind();\n\n    glPopAttrib();\n\n    glFinish();\n}\n\nvoid FillIn::vertex(GPUTexture * existingVertex, GPUTexture * rawDepth, bool passthrough)\n{\n    vertexFrameBuffer.Bind();\n\n    glPushAttrib(GL_VIEWPORT_BIT);\n\n    glViewport(0, 0, vertexRenderBuffer.width, vertexRenderBuffer.height);\n\n    glClearColor(0, 0, 0, 0);\n    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n\n    vertexProgram->Bind();\n\n    vertexProgram->setUniform(Uniform(\"eSampler\", 0));\n    vertexProgram->setUniform(Uniform(\"rSampler\", 1));\n    vertexProgram->setUniform(Uniform(\"passthrough\", (int)passthrough));\n\n    Eigen::Vector4f cam(Intrinsics::getInstance().cx(),\n                  Intrinsics::getInstance().cy(),\n                  1.0f / Intrinsics::getInstance().fx(),\n                  1.0f / Intrinsics::getInstance().fy());\n\n    vertexProgram->setUniform(Uniform(\"cam\", cam));\n    vertexProgram->setUniform(Uniform(\"cols\", (float)Resolution::getInstance().cols()));\n    vertexProgram->setUniform(Uniform(\"rows\", (float)Resolution::getInstance().rows()));\n\n    glActiveTexture(GL_TEXTURE0);\n    glBindTexture(GL_TEXTURE_2D, existingVertex->texture->tid);\n\n    glActiveTexture(GL_TEXTURE1);\n    glBindTexture(GL_TEXTURE_2D, rawDepth->texture->tid);\n\n    glDrawArrays(GL_POINTS, 0, 1);\n\n    vertexFrameBuffer.Unbind();\n\n    glBindTexture(GL_TEXTURE_2D, 0);\n\n    glActiveTexture(GL_TEXTURE0);\n\n    vertexProgram->Unbind();\n\n    glPopAttrib();\n\n    glFinish();\n}\n\nvoid FillIn::normal(GPUTexture * existingNormal, GPUTexture * rawDepth, bool passthrough)\n{\n    normalFrameBuffer.Bind();\n\n    glPushAttrib(GL_VIEWPORT_BIT);\n\n    glViewport(0, 0, normalRenderBuffer.width, normalRenderBuffer.height);\n\n    glClearColor(0, 0, 0, 0);\n    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n\n    normalProgram->Bind();\n\n    normalProgram->setUniform(Uniform(\"eSampler\", 0));\n    normalProgram->setUniform(Uniform(\"rSampler\", 1));\n    normalProgram->setUniform(Uniform(\"passthrough\", (int)passthrough));\n\n    Eigen::Vector4f cam(Intrinsics::getInstance().cx(),\n                  Intrinsics::getInstance().cy(),\n                  1.0f / Intrinsics::getInstance().fx(),\n                  1.0f / Intrinsics::getInstance().fy());\n\n    normalProgram->setUniform(Uniform(\"cam\", cam));\n    normalProgram->setUniform(Uniform(\"cols\", (float)Resolution::getInstance().cols()));\n    normalProgram->setUniform(Uniform(\"rows\", (float)Resolution::getInstance().rows()));\n\n    glActiveTexture(GL_TEXTURE0);\n    glBindTexture(GL_TEXTURE_2D, existingNormal->texture->tid);\n\n    glActiveTexture(GL_TEXTURE1);\n    glBindTexture(GL_TEXTURE_2D, rawDepth->texture->tid);\n\n    glDrawArrays(GL_POINTS, 0, 1);\n\n    normalFrameBuffer.Unbind();\n\n    glBindTexture(GL_TEXTURE_2D, 0);\n\n    glActiveTexture(GL_TEXTURE0);\n\n    normalProgram->Unbind();\n\n    glPopAttrib();\n\n    glFinish();\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/FillIn.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef FILLIN_H_\n#define FILLIN_H_\n\n#include \"Shaders.h\"\n#include \"Uniform.h\"\n#include \"../Utils/Resolution.h\"\n#include \"../Utils/Intrinsics.h\"\n#include \"../GPUTexture.h\"\n\nclass FillIn\n{\n    public:\n        FillIn();\n        virtual ~FillIn();\n\n        void image(GPUTexture * existingRgb, GPUTexture * rawRgb, bool passthrough);\n        void vertex(GPUTexture * existingVertex, GPUTexture * rawDepth, bool passthrough);\n        void normal(GPUTexture * existingNormal, GPUTexture * rawDepth, bool passthrough);\n\n        GPUTexture imageTexture;\n        GPUTexture vertexTexture;\n        GPUTexture normalTexture;\n\n        std::shared_ptr<Shader> imageProgram;\n        pangolin::GlRenderBuffer imageRenderBuffer;\n        pangolin::GlFramebuffer imageFrameBuffer;\n\n        std::shared_ptr<Shader> vertexProgram;\n        pangolin::GlRenderBuffer vertexRenderBuffer;\n        pangolin::GlFramebuffer vertexFrameBuffer;\n\n        std::shared_ptr<Shader> normalProgram;\n        pangolin::GlRenderBuffer normalRenderBuffer;\n        pangolin::GlFramebuffer normalFrameBuffer;\n};\n\n#endif /* FILLIN_H_ */\n\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/Resize.cpp",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#include \"Resize.h\"\n\nResize::Resize(int srcWidth,\n               int srcHeight,\n               int destWidth,\n               int destHeight)\n: imageTexture(destWidth,\n               destHeight,\n               GL_RGBA,\n               GL_RGB,\n               GL_UNSIGNED_BYTE,\n               false,\n               true),\n  vertexTexture(destWidth,\n                destHeight,\n                GL_RGBA32F,\n                GL_LUMINANCE,\n                GL_FLOAT,\n                false,\n                true),\n  timeTexture(destWidth,\n              destHeight,\n              GL_LUMINANCE16UI_EXT,\n              GL_LUMINANCE_INTEGER_EXT,\n              GL_UNSIGNED_SHORT,\n              false,\n              true),\n  imageProgram(loadProgramFromFile(\"empty.vert\", \"resize.frag\", \"quad.geom\")),\n  imageRenderBuffer(destWidth, destHeight),\n  vertexProgram(loadProgramFromFile(\"empty.vert\", \"resize.frag\", \"quad.geom\")),\n  vertexRenderBuffer(destWidth, destHeight),\n  timeProgram(loadProgramFromFile(\"empty.vert\", \"resize.frag\", \"quad.geom\")),\n  timeRenderBuffer(destWidth, destHeight)\n{\n   imageFrameBuffer.AttachColour(*imageTexture.texture);\n   imageFrameBuffer.AttachDepth(imageRenderBuffer);\n\n   vertexFrameBuffer.AttachColour(*vertexTexture.texture);\n   vertexFrameBuffer.AttachDepth(vertexRenderBuffer);\n\n   timeFrameBuffer.AttachColour(*timeTexture.texture);\n   timeFrameBuffer.AttachDepth(timeRenderBuffer);\n}\n\nResize::~Resize()\n{\n}\n\nvoid Resize::image(GPUTexture * source, Img<Eigen::Matrix<unsigned char, 3, 1>> & dest)\n{\n    imageFrameBuffer.Bind();\n\n    glPushAttrib(GL_VIEWPORT_BIT);\n\n    glViewport(0, 0, imageRenderBuffer.width, imageRenderBuffer.height);\n\n    glClearColor(0, 0, 0, 0);\n    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n\n    imageProgram->Bind();\n\n    imageProgram->setUniform(Uniform(\"eSampler\", 0));\n\n    glActiveTexture(GL_TEXTURE0);\n    glBindTexture(GL_TEXTURE_2D, source->texture->tid);\n\n    glDrawArrays(GL_POINTS, 0, 1);\n\n    glReadPixels(0, 0, imageRenderBuffer.width, imageRenderBuffer.height, GL_RGB, GL_UNSIGNED_BYTE, dest.data);\n\n    imageFrameBuffer.Unbind();\n\n    glBindTexture(GL_TEXTURE_2D, 0);\n\n    glActiveTexture(GL_TEXTURE0);\n\n    imageProgram->Unbind();\n\n    glPopAttrib();\n\n    glFinish();\n}\n\nvoid Resize::vertex(GPUTexture * source, Img<Eigen::Vector4f> & dest)\n{\n    vertexFrameBuffer.Bind();\n\n    glPushAttrib(GL_VIEWPORT_BIT);\n\n    glViewport(0, 0, vertexRenderBuffer.width, vertexRenderBuffer.height);\n\n    glClearColor(0, 0, 0, 0);\n    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n\n    vertexProgram->Bind();\n\n    vertexProgram->setUniform(Uniform(\"eSampler\", 0));\n\n    glActiveTexture(GL_TEXTURE0);\n    glBindTexture(GL_TEXTURE_2D, source->texture->tid);\n\n    glDrawArrays(GL_POINTS, 0, 1);\n\n    glReadPixels(0, 0, vertexRenderBuffer.width, vertexRenderBuffer.height, GL_RGBA, GL_FLOAT, dest.data);\n\n    vertexFrameBuffer.Unbind();\n\n    glBindTexture(GL_TEXTURE_2D, 0);\n\n    glActiveTexture(GL_TEXTURE0);\n\n    vertexProgram->Unbind();\n\n    glPopAttrib();\n\n    glFinish();\n}\n\nvoid Resize::time(GPUTexture * source, Img<unsigned short> & dest)\n{\n    timeFrameBuffer.Bind();\n\n    glPushAttrib(GL_VIEWPORT_BIT);\n\n    glViewport(0, 0, timeRenderBuffer.width, timeRenderBuffer.height);\n\n    glClearColor(0, 0, 0, 0);\n    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n\n    timeProgram->Bind();\n\n    timeProgram->setUniform(Uniform(\"eSampler\", 0));\n\n    glActiveTexture(GL_TEXTURE0);\n    glBindTexture(GL_TEXTURE_2D, source->texture->tid);\n\n    glDrawArrays(GL_POINTS, 0, 1);\n\n    glReadPixels(0, 0, timeRenderBuffer.width, timeRenderBuffer.height, GL_LUMINANCE_INTEGER_EXT, GL_UNSIGNED_SHORT, dest.data);\n\n    timeFrameBuffer.Unbind();\n\n    glBindTexture(GL_TEXTURE_2D, 0);\n\n    glActiveTexture(GL_TEXTURE0);\n\n    timeProgram->Unbind();\n\n    glPopAttrib();\n\n    glFinish();\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/Resize.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n \n#ifndef RESIZE_H_\n#define RESIZE_H_\n\n#include \"Shaders.h\"\n#include \"Uniform.h\"\n#include \"../Utils/Resolution.h\"\n#include \"../Utils/Intrinsics.h\"\n#include \"../GPUTexture.h\"\n#include \"../Utils/Img.h\"\n#include \"../Defines.h\"\n\nclass Resize\n{\n    public:\n        EFUSION_API Resize(int srcWidth,\n               int srcHeight,\n               int destWidth,\n               int destHeight);\n        virtual ~Resize();\n\n        void image(GPUTexture * source, Img<Eigen::Matrix<unsigned char, 3, 1>> & dest);\n        void vertex(GPUTexture * source, Img<Eigen::Vector4f> & dest);\n        void time(GPUTexture * source, Img<unsigned short> & dest);\n\n        GPUTexture imageTexture;\n        GPUTexture vertexTexture;\n        GPUTexture timeTexture;\n\n        std::shared_ptr<Shader> imageProgram;\n        pangolin::GlRenderBuffer imageRenderBuffer;\n        pangolin::GlFramebuffer imageFrameBuffer;\n\n        std::shared_ptr<Shader> vertexProgram;\n        pangolin::GlRenderBuffer vertexRenderBuffer;\n        pangolin::GlFramebuffer vertexFrameBuffer;\n\n        std::shared_ptr<Shader> timeProgram;\n        pangolin::GlRenderBuffer timeRenderBuffer;\n        pangolin::GlFramebuffer timeFrameBuffer;\n};\n\n#endif /* RESIZE_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/Shaders.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef SHADERS_SHADERS_H_\n#define SHADERS_SHADERS_H_\n\n#include <pangolin/gl/glsl.h>\n#include <memory>\n#include \"../Utils/Parse.h\"\n#include \"Uniform.h\"\n\nclass Shader : public pangolin::GlSlProgram\n{\n    public:\n        Shader()\n        {}\n\n        GLuint programId()\n        {\n            return prog;\n        }\n\n        void setUniform(const Uniform & v)\n        {\n            GLuint loc = glGetUniformLocation(prog, v.id.c_str());\n\n            switch(v.t)\n            {\n                case Uniform::INT:\n                    glUniform1i(loc, v.i);\n                    break;\n                case Uniform::FLOAT:\n                    glUniform1f(loc, v.f);\n                    break;\n                case Uniform::VEC2:\n                    glUniform2f(loc, v.v2(0), v.v2(1));\n                    break;\n                case Uniform::VEC3:\n                    glUniform3f(loc, v.v3(0), v.v3(1), v.v3(2));\n                    break;\n                case Uniform::VEC4:\n                    glUniform4f(loc, v.v4(0), v.v4(1), v.v4(2), v.v4(3));\n                    break;\n                case Uniform::MAT4:\n                    glUniformMatrix4fv(loc, 1, false, v.m4.data());\n                    break;\n                default:\n                    assert(false && \"Uniform type not implemented!\");\n                    break;\n            }\n        }\n};\n\nstatic inline std::shared_ptr<Shader> loadProgramGeomFromFile(const std::string& vertex_shader_file, const std::string& geometry_shader_file)\n{\n    std::shared_ptr<Shader> program = std::make_shared<Shader>();\n\n    program->AddShaderFromFile(pangolin::GlSlVertexShader, Parse::get().shaderDir() + \"/\" + vertex_shader_file, {}, {Parse::get().shaderDir()});\n    program->AddShaderFromFile(pangolin::GlSlGeometryShader, Parse::get().shaderDir() + \"/\" + geometry_shader_file, {}, {Parse::get().shaderDir()});\n    program->Link();\n\n    return program;\n}\n\nstatic inline std::shared_ptr<Shader> loadProgramFromFile(const std::string& vertex_shader_file)\n{\n    std::shared_ptr<Shader> program = std::make_shared<Shader>();\n\n    program->AddShaderFromFile(pangolin::GlSlVertexShader, Parse::get().shaderDir() + \"/\" + vertex_shader_file, {}, {Parse::get().shaderDir()});\n    program->Link();\n\n    return program;\n}\n\nstatic inline std::shared_ptr<Shader> loadProgramFromFile(const std::string& vertex_shader_file, const std::string& fragment_shader_file)\n{\n    std::shared_ptr<Shader> program = std::make_shared<Shader>();\n\n    program->AddShaderFromFile(pangolin::GlSlVertexShader, Parse::get().shaderDir() + \"/\" + vertex_shader_file, {}, {Parse::get().shaderDir()});\n    program->AddShaderFromFile(pangolin::GlSlFragmentShader, Parse::get().shaderDir() + \"/\" + fragment_shader_file, {}, {Parse::get().shaderDir()});\n    program->Link();\n\n    return program;\n}\n\nstatic inline std::shared_ptr<Shader> loadProgramFromFile(const std::string& vertex_shader_file, const std::string& fragment_shader_file, const std::string& geometry_shader_file)\n{\n    std::shared_ptr<Shader> program = std::make_shared<Shader>();\n\n    program->AddShaderFromFile(pangolin::GlSlVertexShader, Parse::get().shaderDir() + \"/\" + vertex_shader_file, {}, {Parse::get().shaderDir()});\n    program->AddShaderFromFile(pangolin::GlSlGeometryShader, Parse::get().shaderDir() + \"/\" + geometry_shader_file, {}, {Parse::get().shaderDir()});\n    program->AddShaderFromFile(pangolin::GlSlFragmentShader, Parse::get().shaderDir() + \"/\" + fragment_shader_file, {}, {Parse::get().shaderDir()});\n    program->Link();\n\n    return program;\n}\n\n#endif /* SHADERS_SHADERS_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/Uniform.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n \n#ifndef UNIFORM_H_\n#define UNIFORM_H_\n\n#include <string>\n#include <Eigen/Core>\n\nclass Uniform\n{\n    public:\n        Uniform(const std::string & id, const int & v)\n         : id(id),\n           i(v),\n           t(INT)\n        {}\n\n        Uniform(const std::string & id, const float & v)\n         : id(id),\n           f(v),\n           t(FLOAT)\n        {}\n\n        Uniform(const std::string & id, const Eigen::Vector2f & v)\n         : id(id),\n           v2(v),\n           t(VEC2)\n        {}\n\n        Uniform(const std::string & id, const Eigen::Vector3f & v)\n         : id(id),\n           v3(v),\n           t(VEC3)\n        {}\n\n        Uniform(const std::string & id, const Eigen::Vector4f & v)\n         : id(id),\n           v4(v),\n           t(VEC4)\n        {}\n\n        Uniform(const std::string & id, const Eigen::Matrix4f & v)\n         : id(id),\n           m4(v),\n           t(MAT4)\n        {}\n\n        std::string id;\n\n        int i;\n        float f;\n        Eigen::Vector2f v2;\n        Eigen::Vector3f v3;\n        Eigen::Vector4f v4;\n        Eigen::Matrix4f m4;\n\n        enum Type\n        {\n            INT,\n            FLOAT,\n            VEC2,\n            VEC3,\n            VEC4,\n            MAT4,\n            NONE\n        };\n\n        Type t;\n};\n\n\n#endif /* UNIFORM_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/Vertex.cpp",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#include \"Vertex.h\"\n\n/*\n * OK this is the structure\n *\n *--------------------\n * vec3 position\n * float confidence\n *\n * float color (encoded as a 24-bit integer)\n * float <unused>\n * float initTime\n * float timestamp\n *\n * vec3 normal\n * float radius\n *--------------------\n\n * Which is three vec4s\n */\n\nconst int Vertex::SIZE = sizeof(Eigen::Vector4f) * 3;\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/Vertex.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef VERTEX_H_\n#define VERTEX_H_\n\n#include <Eigen/Core>\n\n#include \"../Defines.h\"\n\nclass Vertex\n{\n    public:\n        EFUSION_API static const int SIZE;\n\n    private:\n        Vertex(){}\n};\n\n\n#endif /* VERTEX_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/color.glsl",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\nfloat encodeColor(vec3 c)\n{\n    int rgb = int(round(c.x * 255.0f));\n    rgb = (rgb << 8) + int(round(c.y * 255.0f));\n    rgb = (rgb << 8) + int(round(c.z * 255.0f));\n    return float(rgb);\n}\n\nvec3 decodeColor(float c)\n{\n    vec3 col;\n    col.x = float(int(c) >> 16 & 0xFF) / 255.0f;\n    col.y = float(int(c) >> 8 & 0xFF) / 255.0f;\n    col.z = float(int(c) & 0xFF) / 255.0f;\n    return col;\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/combo_splat.frag",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330 core\n\nuniform vec4 cam; //cx, cy, fx, fy\nuniform float maxDepth;\n\nin vec4 position;\nin vec4 normRad;\nin vec4 colTime;\n\nlayout(location = 0) out vec4 image;\nlayout(location = 1) out vec4 vertex;\nlayout(location = 2) out vec4 normal;\nlayout(location = 3) out uint time;\n\n#include \"color.glsl\"\n\nvoid main()\n{\n    vec3 l = normalize(vec3((vec2(gl_FragCoord) - cam.xy) / cam.zw, 1.0f));\n    \n    vec3 corrected_pos = (dot(position.xyz, normRad.xyz) / dot(l, normRad.xyz)) * l; \n\n    //check if the intersection is inside the surfel\n    float sqrRad = pow(normRad.w, 2);\n    vec3 diff = corrected_pos - position.xyz;\n\n    if(dot(diff, diff) > sqrRad)\n    {\n        discard;\n    }\n\n    image = vec4(decodeColor(colTime.x), 1);\n    \n    float z = corrected_pos.z;\n    \n    vertex = vec4((gl_FragCoord.x - cam.x) * z * (1.f / cam.z), (gl_FragCoord.y - cam.y) * z * (1.f / cam.w), z, position.w);\n    \n    normal = normRad;\n    \n    time = uint(colTime.z);\n    \n    gl_FragDepth = (corrected_pos.z / (2 * maxDepth)) + 0.5f;\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/copy_unstable.geom",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330 core\n\nlayout(points) in;\nlayout(points, max_vertices = 1) out;\n\nin vec4 vPosition[];\nin vec4 vColor[];\nin vec4 vNormRad[];\nflat in int test[];\n\nout vec4 vPosition0;\nout vec4 vColor0;\nout vec4 vNormRad0;\n\nvoid main() \n{\n    if(test[0] > 0)\n    {\n        vPosition0 = vPosition[0];\n        vColor0 = vColor[0];\n        vNormRad0 = vNormRad[0];\n        EmitVertex();\n        EndPrimitive(); \n    }\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/copy_unstable.vert",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330 core\n\nlayout (location = 0) in vec4 vPos;\nlayout (location = 1) in vec4 vCol;\nlayout (location = 2) in vec4 vNormR;\n\nout vec4 vPosition;\nout vec4 vColor;\nout vec4 vNormRad;\nflat out int test;\n\nuniform int time;\nuniform float scale;\nuniform mat4 t_inv;\nuniform vec4 cam; //cx, cy, fx, fy\nuniform float cols;\nuniform float rows;\nuniform float confThreshold;\nuniform usampler2D indexSampler;\nuniform sampler2D vertConfSampler;\nuniform sampler2D colorTimeSampler;\nuniform sampler2D normRadSampler;\nuniform sampler2D nodeSampler;\nuniform sampler2D depthSampler;\nuniform float nodes;\nuniform float nodeCols;\nuniform float maxDepth;\nuniform int timeDelta;\nuniform int isFern;\n\nvoid main()\n{\n    vPosition = vPos;\n    vColor = vCol;\n    vNormRad = vNormR;\n    \n    test = 1;\n\n    vec3 localPos = (t_inv * vec4(vPosition.xyz, 1.0f)).xyz;\n    \n    float x = ((cam.z * localPos.x) / localPos.z) + cam.x;\n    float y = ((cam.w * localPos.y) / localPos.z) + cam.y;\n    \n    vec3 localNorm = normalize(mat3(t_inv) * vNormRad.xyz);\n\n    float indexXStep = (1.0f / (cols * scale)) * 0.5f;\n    float indexYStep = (1.0f / (rows * scale)) * 0.5f;\n\n    float windowMultiplier = 2;\n\n    int count = 0;\n    int zCount = 0;\n\n    if(//abs(localNorm.z) > 0.85f &&\n       time - vColor.w < timeDelta && localPos.z > 0 && x > 0 && y > 0 && x < cols && y < rows)\n    {\n        for(float i = x / cols - (scale * indexXStep * windowMultiplier); i < x / cols + (scale * indexXStep * windowMultiplier); i += indexXStep)\n        {\n            for(float j = y / rows - (scale * indexYStep * windowMultiplier); j < y / rows + (scale * indexYStep * windowMultiplier); j += indexYStep)\n            {\n               uint current = uint(textureLod(indexSampler, vec2(i, j), 0));\n               \n               if(current > 0U)\n               {\n                   vec4 vertConf = textureLod(vertConfSampler, vec2(i, j), 0);\n                   vec4 colorTime = textureLod(colorTimeSampler, vec2(i, j), 0);\n\n                   if(colorTime.z < vColor.z && \n                      vertConf.w > confThreshold && \n                      vertConf.z > localPos.z && \n                      vertConf.z - localPos.z < 0.01 &&\n                      sqrt(dot(vertConf.xy - localPos.xy, vertConf.xy - localPos.xy)) < vNormRad.w * 1.4)\n                   {\n                       count++;\n                   }\n                   \n                   if(colorTime.w == time &&\n                      vertConf.w > confThreshold && \n                      vertConf.z > localPos.z && \n                      vertConf.z - localPos.z > 0.01 &&\n                      abs(localNorm.z) > 0.85f)\n                   {\n                       zCount++;\n                   }\n               }\n            }\n        }\n    }\n    \n    if(count > 8 || zCount > 4)\n    {\n        test = 0;\n    }\n    \n    //New unstable point\n    if(vColor.w == -2)\n    {\n        vColor.w = time;\n    }\n    \n    //Degenerate case or too unstable\n    if((vColor.w == -1 || ((time - vColor.w) > 20 && vPosition.w < confThreshold)))\n    {\n        test = 0;\n    }\n    \n    if(vColor.w > 0 && time - vColor.w > timeDelta)\n    {\n        test = 1;\n    }\n    \n    //This is probably really slow\n    //We don't deform vColor.z == time because they were fused with the updated pose already!\n    if(test == 1 && nodes > 0 && vColor.z != time)\n    {\n        const int k = 4;\n        const int lookBack = 20;\n        int nearNodes[lookBack];\n        float nearDists[lookBack];\n        \n        for(int i = 0; i < lookBack; i++)\n        {\n            nearNodes[i] = -1;\n            nearDists[i] = 16777216.0f;\n        }\n        \n        int poseTime = int(vColor.z);\n\n        int foundIndex = 0;\n\n        int imin = 0;\n        int imax = int(nodes) - 1;\n        int imid = (imin + imax) / 2;\n\n        while(imax >= imin)\n        {\n            imid = (imin + imax) / 2;\n\n            int nodeTime = int(textureLod(nodeSampler, vec2(((imid * 16 + 15) / nodeCols) + (1.0 / (nodeCols * 2)), 0.5), 0).x);\n\n            if(nodeTime < poseTime)\n            {\n                imin = imid + 1;\n            }\n            else if(nodeTime > poseTime)\n            {\n                imax = imid - 1;\n            }\n            else\n            {\n                break;\n            }\n        }\n\n        imin = min(imin, int(nodes) - 1);\n\n        int nodeMin = int(textureLod(nodeSampler, vec2(((imin * 16 + 15) / nodeCols) + (1.0 / (nodeCols * 2)), 0.5), 0).x);\n        int nodeMid = int(textureLod(nodeSampler, vec2(((imid * 16 + 15) / nodeCols) + (1.0 / (nodeCols * 2)), 0.5), 0).x);\n        int nodeMax = int(textureLod(nodeSampler, vec2(((imax * 16 + 15) / nodeCols) + (1.0 / (nodeCols * 2)), 0.5), 0).x);\n\n        if(abs(nodeMin - poseTime) <= abs(nodeMid - poseTime) &&\n           abs(nodeMin - poseTime) <= abs(nodeMax - poseTime))\n        {\n            foundIndex = imin;\n        }\n        else if(abs(nodeMid - poseTime) <= abs(nodeMin - poseTime) &&\n                abs(nodeMid - poseTime) <= abs(nodeMax - poseTime))\n        {\n            foundIndex = imid;\n        }\n        else\n        {\n            foundIndex = imax;\n        }\n\n        if(foundIndex == int(nodes))\n        {\n            foundIndex = int(nodes) - 1;\n        }\n\n        int nearNodeIndex = 0;\n\n        int distanceBack = 0;\n        \n        for(int j = foundIndex; j >= 0; j--)\n        {\n            vec3 position = vec3(textureLod(nodeSampler, vec2(((j * 16) / nodeCols) + (1.0 / (nodeCols * 2)), 0.5), 0).x, \n                                 textureLod(nodeSampler, vec2(((j * 16 + 1) / nodeCols) + (1.0 / (nodeCols * 2)), 0.5), 0).x, \n                                 textureLod(nodeSampler, vec2(((j * 16 + 2) / nodeCols) + (1.0 / (nodeCols * 2)), 0.5), 0).x);\n\n            nearNodes[nearNodeIndex] = j;\n            nearDists[nearNodeIndex] = sqrt(dot(vPosition.xyz - position, vPosition.xyz - position));\n            nearNodeIndex++;\n            \n            if(++distanceBack == lookBack / 2)\n            {\n                break;\n            }\n        }\n\n        for(int j = foundIndex + 1; j < int(nodes); j++)\n        {\n            vec3 position = vec3(textureLod(nodeSampler, vec2(((j * 16) / nodeCols) + (1.0 / (nodeCols * 2)), 0.5), 0).x, \n                                 textureLod(nodeSampler, vec2(((j * 16 + 1) / nodeCols) + (1.0 / (nodeCols * 2)), 0.5), 0).x, \n                                 textureLod(nodeSampler, vec2(((j * 16 + 2) / nodeCols) + (1.0 / (nodeCols * 2)), 0.5), 0).x);\n\n            nearNodes[nearNodeIndex] = j;\n            nearDists[nearNodeIndex] = sqrt(dot(vPosition.xyz - position, vPosition.xyz - position));\n            nearNodeIndex++;\n\n            if(++distanceBack == lookBack)\n            {\n                break;\n            }\n        }\n\n        for(int i = 0; i < lookBack - 1; ++i)\n        {\n            for(int j = i + 1; j < lookBack; ++j)\n            {\n                if(nearDists[j] < nearDists[i])\n                {\n                    float t = nearDists[i];\n                    nearDists[i] = nearDists[j];\n                    nearDists[j] = t;\n                    \n                    int t2 = nearNodes[i];\n                    nearNodes[i] = nearNodes[j];\n                    nearNodes[j] = t2;\n                }\n            }\n        }\n        \n        float dMax = nearDists[k];\n        float nodeWeights[k];\n        float weightSum = 0;\n\n        for(int j = 0; j < k; j++)\n        {\n            vec3 position = vec3(textureLod(nodeSampler, vec2(((nearNodes[j] * 16) / nodeCols) + (1.0 / (nodeCols * 2)), 0.5), 0).x, \n                                 textureLod(nodeSampler, vec2(((nearNodes[j] * 16 + 1) / nodeCols) + (1.0 / (nodeCols * 2)), 0.5), 0).x, \n                                 textureLod(nodeSampler, vec2(((nearNodes[j] * 16 + 2) / nodeCols) + (1.0 / (nodeCols * 2)), 0.5), 0).x);\n    \n            nodeWeights[j] = pow(1.0f - (sqrt(dot(vPosition.xyz - position, vPosition.xyz - position)) / dMax), 2);\n            weightSum += nodeWeights[j];\n        }\n\n        for(int j = 0; j < k; j++)\n        {\n            nodeWeights[j] /= weightSum;\n        }\n        \n        vec3 newPos = vec3(0, 0, 0);\n        vec3 newNorm = vec3(0, 0, 0);\n        \n        for(int i = 0; i < k; i++)\n        {\n            vec3 position = vec3(textureLod(nodeSampler, vec2(((nearNodes[i] * 16) / nodeCols) + (1.0 / (nodeCols * 2)), 0.5), 0).x, \n                                 textureLod(nodeSampler, vec2(((nearNodes[i] * 16 + 1) / nodeCols) + (1.0 / (nodeCols * 2)), 0.5), 0).x, \n                                 textureLod(nodeSampler, vec2(((nearNodes[i] * 16 + 2) / nodeCols) + (1.0 / (nodeCols * 2)), 0.5), 0).x);\n                                 \n\t\t\tvec3 column0 = vec3(textureLod(nodeSampler, vec2(((nearNodes[i] * 16 + 3) / nodeCols) + (1.0 / (nodeCols * 2)), 0.5), 0).x, \n\t                            textureLod(nodeSampler, vec2(((nearNodes[i] * 16 + 4) / nodeCols) + (1.0 / (nodeCols * 2)), 0.5), 0).x,\n\t                            textureLod(nodeSampler, vec2(((nearNodes[i] * 16 + 5) / nodeCols) + (1.0 / (nodeCols * 2)), 0.5), 0).x);\n\t                            \n\t\t\tvec3 column1 = vec3(textureLod(nodeSampler, vec2(((nearNodes[i] * 16 + 6) / nodeCols) + (1.0 / (nodeCols * 2)), 0.5), 0).x, \n\t                            textureLod(nodeSampler, vec2(((nearNodes[i] * 16 + 7) / nodeCols) + (1.0 / (nodeCols * 2)), 0.5), 0).x,\n\t                            textureLod(nodeSampler, vec2(((nearNodes[i] * 16 + 8) / nodeCols) + (1.0 / (nodeCols * 2)), 0.5), 0).x);\n\t                            \n\t\t\tvec3 column2 = vec3(textureLod(nodeSampler, vec2(((nearNodes[i] * 16 + 9) / nodeCols) + (1.0 / (nodeCols * 2)), 0.5), 0).x, \n\t                            textureLod(nodeSampler, vec2(((nearNodes[i] * 16 + 10) / nodeCols) + (1.0 / (nodeCols * 2)), 0.5), 0).x,\n\t                            textureLod(nodeSampler, vec2(((nearNodes[i] * 16 + 11) / nodeCols) + (1.0 / (nodeCols * 2)), 0.5), 0).x);\n\t\n\t        mat3 rotation = mat3(column0, column1, column2);\n\t                      \n\t        vec3 translation = vec3(textureLod(nodeSampler, vec2(((nearNodes[i] * 16 + 12) / nodeCols) + (1.0 / (nodeCols * 2)), 0.5), 0).x, \n\t                                textureLod(nodeSampler, vec2(((nearNodes[i] * 16 + 13) / nodeCols) + (1.0 / (nodeCols * 2)), 0.5), 0).x,\n\t                                textureLod(nodeSampler, vec2(((nearNodes[i] * 16 + 14) / nodeCols) + (1.0 / (nodeCols * 2)), 0.5), 0).x);\n\t\n\t        newPos += nodeWeights[i] * (rotation * (vPosition.xyz - position) + position + translation);\n\t        newNorm += nodeWeights[i] * (transpose(inverse(rotation)) * vNormRad.xyz);\n        }\n        \n        vPosition.xyz = newPos;\n        vNormRad.xyz = normalize(newNorm);\n\n        if(vPosition.w > confThreshold && isFern == 0)\n        {\n            localPos = (t_inv * vec4(vPosition.xyz, 1.0f)).xyz;\n            \n            x = ((cam.z * localPos.x) / localPos.z) + cam.x;\n            y = ((cam.w * localPos.y) / localPos.z) + cam.y;\n            \n            if(localPos.z > 0 && localPos.z < maxDepth && x > 0 && y > 0 && x < cols && y < rows)\n            {\n                float currentDepth = float(textureLod(depthSampler, vec2(x / cols, y / rows), 0));\n            \n                if(currentDepth > 0.0f && localPos.z < currentDepth + 0.1f)\n                {\n\t                vColor.w = time;\n                }\n            }\n        }\n    }\n}\n\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/data.frag",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330 core\n\nin vec4 vPosition0;\nin vec4 vColor0;\nin vec4 vNormRad0;\nflat in int updateId0;\n\nlayout(location = 0) out vec4 vPosition1;\nlayout(location = 1) out vec4 vColor1;\nlayout(location = 2) out vec4 vNormRad1;\n\nvoid main() \n{\n    //If we have a point to update in the existing model, store that\n    if(updateId0 == 1)\n    {\n        vPosition1 = vPosition0;\n        vColor1 = vColor0;\n        vNormRad1 = vNormRad0;\n    }\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/data.geom",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330 core\n\nlayout(points) in;\nlayout(points, max_vertices = 1) out;\n\nin vec4 vPosition[];\nin vec4 vColor[];\nin vec4 vNormRad[];\nflat in int updateId[];\n\nout vec4 vPosition0;\nout vec4 vColor0;\nout vec4 vNormRad0;\nflat out int updateId0;\n\nvoid main() \n{\n    //Emit a vertex if either we have an update to store, or a new unstable vertex to store\n    if(updateId[0] > 0)\n    {\n\t    vPosition0 = vPosition[0];\n\t    vColor0 = vColor[0];\n\t    vNormRad0 = vNormRad[0];\n\t    updateId0 = updateId[0];\n\t    \n\t    //This will be -10, -10 (offscreen) for new unstable vertices, so they don't show in the fragment shader\n\t    gl_Position = gl_in[0].gl_Position;\n\n\t    EmitVertex();\n\t    EndPrimitive(); \n    }\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/data.vert",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330 core\n\nlayout (location = 0) in vec2 texcoord;\n\nout vec4 vPosition;\nout vec4 vColor;\nout vec4 vNormRad;\nflat out int updateId;\n\nuniform sampler2D cSampler;\nuniform sampler2D drSampler;\nuniform sampler2D drfSampler;\nuniform usampler2D indexSampler;\nuniform sampler2D vertConfSampler;\nuniform sampler2D colorTimeSampler;\nuniform sampler2D normRadSampler;\n\nuniform vec4 cam; //cx, cy, 1/fx, 1/fy\nuniform float cols;\nuniform float rows;\nuniform float scale;\nuniform float texDim;\nuniform mat4 pose;\nuniform float maxDepth;\nuniform float time;\nuniform float weighting;\n\n#include \"surfels.glsl\"\n#include \"color.glsl\"\n#include \"geometry.glsl\"\n\nbool checkNeighbours(vec2 texCoord, sampler2D depth)\n{\n    float z = float(textureLod(depth, vec2(texCoord.x - (1.0 / cols), texCoord.y), 0.0));\n    if(z == 0)\n        return false;\n        \n    z = float(textureLod(depth, vec2(texCoord.x, texCoord.y - (1.0 / rows)), 0.0));\n    if(z == 0)\n        return false;\n\n    z = float(textureLod(depth, vec2(texCoord.x + (1.0 / cols), texCoord.y), 0.0));\n    if(z == 0)\n        return false;\n        \n    z = float(textureLod(depth, vec2(texCoord.x, texCoord.y + (1.0 / rows)), 0.0));\n    if(z == 0)\n        return false;\n        \n    return true;\n}\n\nfloat angleBetween(vec3 a, vec3 b)\n{\n    return acos(dot(a, b) / (length(a) * length(b)));\n}\n\nvoid main()\n{\n    //Should be guaranteed to be in bounds and centred on pixels\n    float x = texcoord.x * cols;\n    float y = texcoord.y * rows;\n\n    //Vertex position integrated into model transformed to global coords\n    vec3 vPosLocal = getVertex(texcoord.xy, x, y, cam, drSampler);\n    vPosition = pose * vec4(vPosLocal, 1);\n    \n    //Filtered position ONLY used for normal and radius calculation\n    vec3 vPosition_f = getVertex(texcoord.xy, x, y, cam, drfSampler);\n    \n    //Color for color, obviously\n    vColor = textureLod(cSampler, texcoord.xy, 0.0);\n    //cuong\n    vec3 vColor_cuong = vColor.xyz;\n    \n    vColor.x = encodeColor(vColor.xyz);\n    vColor.y = 0;\n    vColor.z = time;\n    \n    //Normal and radius computed with filtered position / depth map transformed to global coords\n    vec3 vNormLocal = getNormal(vPosition_f, texcoord.xy, x, y, cam, drfSampler);\n    vNormRad = vec4(mat3(pose) * vNormLocal, getRadius(vPosition_f.z, vNormLocal.z));\n    \n    //Confidence\n    vPosition.w = confidence(x, y, weighting);\n    \n    //Timestamp\n    //We update this in update.vert, because it's used to signal new points later on\n    vColor.w = 0;\n    \n    updateId = 0;\n    \n    uint best = 0U;\n    \n    //If this point is actually a valid vertex (i.e. has depth)\n    //cuong\n    if(vColor_cuong.x != 0 || vColor_cuong.y != 0 || vColor_cuong.z != 0)\n        if(int(x) % 2 == int(time) % 2 && int(y) % 2 == int(time) % 2 && \n        checkNeighbours(texcoord.xy, drSampler) && vPosLocal.z > 0 && \n        vPosLocal.z <= maxDepth)\n        {\n            int counter = 0;\n            \n            float indexXStep = (1.0f / (cols * scale)) * 0.5f;\n            float indexYStep = (1.0f / (rows * scale)) * 0.5f;\n            \n            float bestDist = 1000;\n            \n            float windowMultiplier = 2;\n            \n            float xl = (x - cam.x) * cam.z;\n            float yl = (y - cam.y) * cam.w;\n            \n            float lambda = sqrt(xl * xl + yl * yl + 1);\n            \n            vec3 ray = vec3(xl, yl, 1);\n            \n            for(float i = texcoord.x - (scale * indexXStep * windowMultiplier); i < texcoord.x + (scale * indexXStep * windowMultiplier); i += indexXStep)\n            {\n                for(float j = texcoord.y - (scale * indexYStep * windowMultiplier); j < texcoord.y + (scale * indexYStep * windowMultiplier); j += indexYStep)\n                {\n                uint current = uint(textureLod(indexSampler, vec2(i, j), 0.0));\n                \n                if(current > 0U)\n                {\n                    vec4 vertConf = textureLod(vertConfSampler, vec2(i, j), 0.0);\n\n                    if(abs((vertConf.z * lambda) - (vPosLocal.z * lambda)) < 0.05)\n                    {\n                        float dist = length(cross(ray, vertConf.xyz)) / length(ray);\n                        \n                        vec4 normRad = textureLod(normRadSampler, vec2(i, j), 0.0);\n                        \n                        if(dist < bestDist && (abs(normRad.z) < 0.75f || abs(angleBetween(normRad.xyz, vNormLocal.xyz)) < 0.5f))\n                        {\n                            counter++;\n                            bestDist = dist;\n                            best = current;\n                        }\n                    }\n                \n                }\n                }\n            }\n            \n            //We found a point to merge with\n            if(counter > 0)\n            {\n            updateId = 1;\n            vColor.w = -1;\n            }\n            else\n            {\n            //New unstable vertex\n            updateId = 2;\n            vColor.w = -2;\n            }\n        }\n\n\n\n    //Output vertex id of the existing point to update\n    if(updateId == 1)\n    {\n\t    uint intY = best / uint(texDim);\n\t    uint intX = best - (intY * uint(texDim));\n\t    \n\t    float halfPixel = 0.5 * (1.0f / texDim);\n\t    \n\t    //should set gl_Position here to the 2D index for the updated vertex ID\n\t    gl_Position = vec4(float(int(intX) - (int(texDim) / 2)) / (texDim / 2.0) + halfPixel, \n\t                       float(int(intY) - (int(texDim) / 2)) / (texDim / 2.0) + halfPixel, \n\t                       0, \n\t                       1.0);\n    }\n    else\n    {\n        //Either don't render anything, or output a new unstable vertex offscreen\n        gl_Position = vec4(-10, -10, 0, 1);\n    }\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/depth_bilateral.frag",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330 core\n\nin vec2 texcoord;\n\nout uint FragColor;\n\nuniform usampler2D gSampler;\nuniform float cols;\nuniform float rows;\nuniform float maxD;\n\nvoid main()\n{\n    uint value = uint(texture(gSampler, texcoord.xy));\n    \n    if(value > uint(maxD * 1000.0f) || value < 300U)\n    {\n        FragColor = 0U;\n    }\n    else\n    {\n\t    int x = int(texcoord.x * cols);\n\t    int y = int(texcoord.y * rows);\n\t    \n\t    const float sigma_space2_inv_half = 0.024691358; // 0.5 / (sigma_space * sigma_space)\n\t    const float sigma_color2_inv_half = 0.000555556; // 0.5 / (sigma_color * sigma_color)\n\t        \n\t    const int R = 6;\n\t    const int D = R * 2 + 1;\n\t    \n\t    int tx = min(x - D / 2 + D, int(cols));\n\t    int ty = min(y - D / 2 + D, int(rows));\n\t\n\t    float sum1 = 0;\n\t    float sum2 = 0;\n\t    \n\t    for(int cy = max(y - D / 2, 0); cy < ty; ++cy)\n\t    {\n\t        for(int cx = max(x - D / 2, 0); cx < tx; ++cx)\n\t        {\n\t            float texX = float(cx) / cols;\n\t            float texY = float(cy) / rows;\n\t            \n\t            uint tmp = uint(texture(gSampler, vec2(texX, texY)));\n\t            \n\t            float space2 = (float(x) - float(cx)) * (float(x) - float(cx)) + (float(y) - float(cy)) * (float(y) - float(cy));\n\t            float color2 = (float(value) - float(tmp)) * (float(value) - float(tmp));\n\t\n\t            float weight = exp(-(space2 * sigma_space2_inv_half + color2 * sigma_color2_inv_half));\n\t\n\t            sum1 += float(tmp) * weight;\n\t            sum2 += weight;\n\t        }\n\t    }\n\t\n\t    FragColor = uint(round(sum1/sum2));\n    }\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/depth_metric.frag",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330 core\n\nin vec2 texcoord;\n\nout float FragColor;\n\nuniform usampler2D gSampler;\nuniform float maxD;\n\nvoid main()\n{\n    uint value = uint(texture(gSampler, texcoord.xy));\n    \n    if(value > uint(maxD * 1000.0f) || value < 300U)\n    {\n        FragColor = 0U;\n    }\n    else\n    {\n\t    FragColor = float(value) / 1000.0f;\n    }\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/depth_norm.frag",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n \n#version 330 core\n\nin vec2 texcoord;\n\nout float FragColor;\n\nuniform usampler2D gSampler;\nuniform float minVal;\nuniform float maxVal;\n\nvoid main()\n{\n    uint value = uint(texture(gSampler, texcoord.xy));\n    if(value > uint(minVal) && value < uint(maxVal))\n        FragColor = 1.0f - (value / maxVal);\n    else \n        FragColor = 0;\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/depth_splat.frag",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330 core\n\nuniform vec4 cam; //cx, cy, fx, fy\nuniform float maxDepth;\n\nin vec4 position;\nin vec4 normRad;\n\nout float FragColor;\n\nvoid main()\n{\n    vec3 l = normalize(vec3((vec2(gl_FragCoord) - cam.xy) / cam.zw, 1.0f));\n    \n    vec3 corrected_pos = (dot(position.xyz, normRad.xyz) / dot(l, normRad.xyz)) * l; \n\n    //check if the intersection is inside the surfel\n    float sqrRad = pow(normRad.w, 2);\n    vec3 diff = corrected_pos - position.xyz;\n\n    if(dot(diff, diff) > sqrRad)\n    {\n        discard;\n    }\n\n    FragColor = corrected_pos.z;\n    \n    gl_FragDepth = (corrected_pos.z / (2 * maxDepth)) + 0.5f;\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/draw_feedback.frag",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330 core\n\nin vec4 vColor;\n\nout vec4 FragColor;\n\nvoid main()\n{\n    FragColor = vColor;\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/draw_feedback.vert",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330 core\n\nlayout (location = 0) in vec4 position;\nlayout (location = 1) in vec4 color;\nlayout (location = 2) in vec4 normal;\n\nuniform mat4 MVP;\nuniform mat4 pose;\nuniform float threshold;\nuniform int colorType;\n\nout vec4 vColor;\n\n#include \"color.glsl\"\n\nvoid main()\n{\n    if(position.w > threshold)\n    {\n        if(colorType == 1)\n        {\n            vColor = vec4(normal.xyz, 1.0);\n        }\n        else if(colorType == 2)\n        {\n            vColor = vec4(decodeColor(color.x), 1.0);\n        }\n        else\n        {\n            vColor = vec4((vec3(.5f, .5f, .5f) * abs(dot(normal.xyz, vec3(1.0, 1.0, 1.0)))) + vec3(0.1f, 0.1f, 0.1f), 1.0f);\n        }\n\t    gl_Position = MVP * pose * vec4(position.xyz, 1.0);\n    }\n    else\n    {\n        gl_Position = vec4(-10, -10, 0, 1);\n    }\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/draw_global_surface.frag",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330 core\n\nin vec3 vColor0;\nin vec2 texcoord;\nin float radius;\nflat in int unstablePoint;\n\nout vec4 FragColor;\n\nvoid main()\n{\n    if(dot(texcoord, texcoord) > 1.0)\n        discard;\n        \n    FragColor = vec4(vColor0, 1.0f);\n    \n    if(unstablePoint == 1)\n\t{\n\t\tgl_FragDepth = gl_FragCoord.z + radius;\n\t}\n    else\n   \t{\n   \t\tgl_FragDepth = gl_FragCoord.z;\n   \t}\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/draw_global_surface.geom",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330 core\n\nlayout(points) in;\nlayout(triangle_strip, max_vertices = 4) out;\n\nuniform float threshold;\nuniform float signMult;\n\nin vec4 vColor[];\nin vec4 vPosition[];\nin vec4 vNormRad[];\nin mat4 vMVP[];\nin int colorType0[];\nin int drawWindow0[];\nin int vTime[];\nin int timeDelta0[];\n\nout vec3 vColor0;\nout vec3 v;\nout vec3 n;\nout vec2 texcoord;\nout float radius;\nflat out int unstablePoint;\n\n#include \"color.glsl\"\n\nvoid main() \n{\n    if(colorType0[0] != -1)\n    {\n        if(colorType0[0] == 1)\n        {\n            vColor0 = vNormRad[0].xyz;\n        }\n        else if(colorType0[0] == 2)\n        {\n            vColor0 = decodeColor(vColor[0].x);\n        }\n        else if(colorType0[0] == 3)\n        {\n            vColor0 = vec3(vColor[0].z / float(vTime[0]));\n            \n            float minimum = 1.0f;\n            float maximum = float(vTime[0]);\n            \n            float ratio = 2 * (vColor[0].z - minimum) / (maximum - minimum);\n            vColor0.x = max(0, (1 - ratio));\n            vColor0.y = max(0, (ratio - 1));\n            vColor0.z = 1.0f - vColor0.x - vColor0.y;\n            \n            vColor0.xyz *= abs(dot(vNormRad[0].xyz, vec3(1.0, 1.0, 1.0))) + vec3(0.1f, 0.1f, 0.1f);\n        }\n        else\n        {\n            vColor0 = (vec3(.5f, .5f, .5f) * abs(dot(vNormRad[0].xyz, vec3(1.0, 1.0, 1.0)))) + vec3(0.1f, 0.1f, 0.1f);\n        }\n    \n        if(drawWindow0[0] == 1 && vTime[0] - vColor[0].w > timeDelta0[0])\n        {\n            vColor0 *= 0.25;\n        }\n\n\t\tunstablePoint = (vPosition[0].w <= threshold ? 1 : 0);\n\t\t\n\t\tradius = vNormRad[0].w;\n        \n        vec3 x = normalize(vec3((vNormRad[0].y - vNormRad[0].z), -vNormRad[0].x, vNormRad[0].x)) * vNormRad[0].w * 1.41421356;\n        \n        vec3 y = cross(vNormRad[0].xyz, x);\n\n        n = signMult * vNormRad[0].xyz;\n\n        texcoord = vec2(-1.0, -1.0);\n        gl_Position = vMVP[0] * vec4(vPosition[0].xyz + x, 1.0);\n        v = vPosition[0].xyz + x;\n        EmitVertex();\n\n        texcoord = vec2(1.0, -1.0);\n        gl_Position = vMVP[0] * vec4(vPosition[0].xyz + y, 1.0);\n        v = vPosition[0].xyz + y;\n        EmitVertex();\n\n        texcoord = vec2(-1.0, 1.0);\n        gl_Position = vMVP[0] * vec4(vPosition[0].xyz - y, 1.0);\n        v = vPosition[0].xyz - y;\n        EmitVertex();\n\n        texcoord = vec2(1.0, 1.0);\n        gl_Position = vMVP[0] * vec4(vPosition[0].xyz - x, 1.0);\n        v = vPosition[0].xyz - x;\n        EmitVertex();\n        EndPrimitive();\n    }\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/draw_global_surface.vert",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330 core\n\nlayout (location = 0) in vec4 position;\nlayout (location = 1) in vec4 color;\nlayout (location = 2) in vec4 normal;\n\nuniform mat4 MVP;\nuniform float threshold;\nuniform int colorType;\nuniform int unstable;\nuniform int drawWindow;\nuniform int time;\nuniform int timeDelta;\n\nout vec4 vColor;\nout vec4 vPosition;\nout vec4 vNormRad;\nout mat4 vMVP;\nout int vTime;\nout int colorType0;\nout int drawWindow0;\nout int timeDelta0;\n\nvoid main()\n{\n    if(position.w > threshold || unstable == 1)\n    {\n        colorType0 = colorType;\n        drawWindow0 = drawWindow;\n\t    vColor = color;\n\t    vPosition = position;\n\t    vNormRad = normal;\n\t    vMVP = MVP;\n\t    vTime = time;\n\t    timeDelta0 = timeDelta;\n\t    gl_Position = MVP * vec4(position.xyz, 1.0);\n    }\n    else\n    {\n        colorType0 = -1;\n    }\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/draw_global_surface_phong.frag",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330 core\n\nin vec3 n;\nin vec3 v;\nin vec3 vColor0;\nin vec2 texcoord;\nin float radius;\nflat in int unstablePoint;\n\nout vec4 FragColor;\n\nuniform vec3 lightpos;\n\nvoid main()\n{\n    if(dot(texcoord, texcoord) > 1.0)\n        discard;\n    \n    vec4 diffuse = vec4(0.0);\n    vec4 specular = vec4(0.0);\n    \n    // ambient term\n    vec4 ambient = vec4(0.3 * vColor0, 1);\n    \n    // diffuse color\n    vec4 kd = vec4(vColor0, 1.0);\n    \n    // specular color\n    vec4 ks = vec4(1.0, 1.0, 1.0, 1.0);\n    \n    // diffuse term\n    vec3 lightDir = normalize(lightpos - v);\n    float NdotL = dot(n, lightDir);\n    \n    if (NdotL > 0.0)\n        diffuse = kd * NdotL;\n    \n    // specular term\n    vec3 rVector = normalize(2.0 * n * dot(n, lightDir) - lightDir);\n    vec3 viewVector = normalize(-v);\n    float RdotV = dot(rVector, viewVector);\n    \n    if (RdotV > 0.0)\n        specular = ks * pow(RdotV, 32);\n\n    FragColor = ambient + diffuse + specular;\n    \n    if(unstablePoint == 1)\n\t{\n\t\tgl_FragDepth = gl_FragCoord.z + radius;\n\t}\n    else\n   \t{\n   \t\tgl_FragDepth = gl_FragCoord.z;\n   \t}\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/empty.vert",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330\n\nvoid main()\n{ \n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/fill_normal.frag",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330 core\n\nin vec2 texcoord;\n\nout vec4 FragColor;\n\nuniform sampler2D eSampler;\nuniform usampler2D rSampler;\nuniform vec4 cam; //cx, cy, 1/fx, 1/fy\nuniform float cols;\nuniform float rows;\nuniform int passthrough;\n\n#include \"geometry.glsl\"\n\nvoid main()\n{\n    float halfPixX = 0.5 * (1.0 / cols);\n    float halfPixY = 0.5 * (1.0 / rows);\n    \n     vec4 sample = textureLod(eSampler, texcoord, 0.0);\n    \n    if(sample.z == 0 || passthrough == 1)\n    {\n\t    vec4 vPos = vec4(getVertex(texcoord, int(texcoord.x * cols), int(texcoord.y * rows), cam, rSampler), 1);\n        FragColor = vec4(getNormal(vPos.xyz, texcoord, int(texcoord.x * cols), int(texcoord.y * rows), cam, rSampler), 1);\n    }\n    else\n    {\n        FragColor = sample;\n    }\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/fill_rgb.frag",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330 core\n\nin vec2 texcoord;\n\nout vec4 FragColor;\n\nuniform sampler2D eSampler;\nuniform sampler2D rSampler;\nuniform int passthrough;\n\nvoid main()\n{\n    vec4 sample = texture2D(eSampler, texcoord.xy);\n    \n    if(sample.x + sample.y + sample.z == 0 || passthrough == 1)\n        FragColor = texture2D(rSampler, texcoord.xy);\n    else\n        FragColor = sample;\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/fill_vertex.frag",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330 core\n\nin vec2 texcoord;\n\nout vec4 FragColor;\n\nuniform sampler2D eSampler;\nuniform usampler2D rSampler;\nuniform vec4 cam; //cx, cy, 1/fx, 1/fy\nuniform float cols;\nuniform float rows;\nuniform int passthrough;\n\nvec3 getVertex(int x, int y, float z)\n{\n    return vec3((x - cam.x) * z * cam.z, (y - cam.y) * z * cam.w, z);\n}\n\nvoid main()\n{\n    float halfPixX = 0.5 * (1.0 / cols);\n    float halfPixY = 0.5 * (1.0 / rows);\n    \n    vec4 sample = textureLod(eSampler, texcoord, 0.0);\n    \n    if(sample.z == 0 || passthrough == 1)\n    {\n        float z = float(textureLod(rSampler, texcoord, 0.0)) / 1000.0f;\n        FragColor = vec4(getVertex(int(texcoord.x * cols), int(texcoord.y * rows), z), 1);\n    }\n    else\n    {\n        FragColor = sample;\n    }\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/fxaa.frag",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330 core\n\n#define FXAA_REDUCE_MIN   (1.0/ 128.0)\n#define FXAA_REDUCE_MUL   (1.0 / 8.0)\n#define FXAA_SPAN_MAX     8.0\n\nuniform sampler2D tex;\nuniform vec2 resolution;\n\nin vec2 texcoord;\n\nout vec4 FragColor;\n\nvoid main()\n{\n    vec4 color;\n    \n    vec2 inverseVP = 1.0 / resolution.xy;\n    vec2 v_rgbNW = texcoord + (vec2(-1.0, -1.0) * inverseVP);\n    vec2 v_rgbNE = texcoord + (vec2(1.0, -1.0) * inverseVP);\n    vec2 v_rgbSW = texcoord + (vec2(-1.0, 1.0) * inverseVP);\n    vec2 v_rgbSE = texcoord + (vec2(1.0, 1.0) * inverseVP);\n    \n    vec2 v_rgbN = texcoord + (vec2(-1.0, 0.0) * inverseVP);\n    vec2 v_rgbE = texcoord + (vec2(1.0, 0.0) * inverseVP);\n    vec2 v_rgbW = texcoord + (vec2(0.0, -1.0) * inverseVP);\n    vec2 v_rgbS = texcoord + (vec2(0.0, 1.0) * inverseVP);\n    \n    vec2 v_rgbM = texcoord;\n    \n    vec3 rgbNW = texture2D(tex, v_rgbNW).xyz;\n    vec3 rgbNE = texture2D(tex, v_rgbNE).xyz;\n    vec3 rgbSW = texture2D(tex, v_rgbSW).xyz;\n    vec3 rgbSE = texture2D(tex, v_rgbSE).xyz;\n    \n    vec3 rgbN = texture2D(tex, v_rgbN).xyz;\n    vec3 rgbE = texture2D(tex, v_rgbE).xyz;\n    vec3 rgbW = texture2D(tex, v_rgbW).xyz;\n    vec3 rgbS = texture2D(tex, v_rgbS).xyz;\n    \n    vec3 rgbM  = texture2D(tex, v_rgbM).xyz;\n    vec3 luma = vec3(0.299, 0.587, 0.114);\n    float lumaNW = dot(rgbNW, luma);\n    float lumaNE = dot(rgbNE, luma);\n    float lumaSW = dot(rgbSW, luma);\n    float lumaSE = dot(rgbSE, luma);\n    float lumaM  = dot(rgbM,  luma);\n    float lumaMin = min(lumaM, min(min(lumaNW, lumaNE), min(lumaSW, lumaSE)));\n    float lumaMax = max(lumaM, max(max(lumaNW, lumaNE), max(lumaSW, lumaSE)));\n    \n    vec2 dir;\n    dir.x = -((lumaNW + lumaNE) - (lumaSW + lumaSE));\n    dir.y =  ((lumaNW + lumaSW) - (lumaNE + lumaSE));\n    \n    float dirReduce = max((lumaNW + lumaNE + lumaSW + lumaSE) * (0.25 * FXAA_REDUCE_MUL), FXAA_REDUCE_MIN);\n    \n    float rcpDirMin = 1.0 / (min(abs(dir.x), abs(dir.y)) + dirReduce);\n    \n    dir = min(vec2(FXAA_SPAN_MAX, FXAA_SPAN_MAX), max(vec2(-FXAA_SPAN_MAX, -FXAA_SPAN_MAX), dir * rcpDirMin)) * inverseVP;\n    \n    vec3 rgbA = 0.5 * (texture2D(tex, texcoord + dir * (1.0 / 3.0 - 0.5)).xyz + texture2D(tex, texcoord + dir * (2.0 / 3.0 - 0.5)).xyz);\n    \n    vec3 rgbB = rgbA * 0.5 + 0.25 * (texture2D(tex, texcoord + dir * -0.5).xyz + texture2D(tex, texcoord + dir * 0.5).xyz);\n\n    float lumaB = dot(rgbB, luma);\n    \n    if ((lumaB < lumaMin) || (lumaB > lumaMax))\n        FragColor = vec4(rgbA, 1);\n    else\n        FragColor = vec4(rgbB, 1);\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/geometry.glsl",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n//Central difference on floating point depth maps\n//Cam is //cx, cy, 1 / fx, 1 / fy\nvec3 getVertex(vec2 texCoord, float x, float y, vec4 cam, sampler2D depth)\n{\n    float z = float(textureLod(depth, texCoord, 0.0));\n    return vec3((x - cam.x) * z * cam.z, (y - cam.y) * z * cam.w, z);\n}\n\n//Cam is //cx, cy, 1 / fx, 1 / fy\nvec3 getNormal(vec3 vPosition, vec2 texCoord, float x, float y, vec4 cam, sampler2D depth)\n{\n    vec3 vPosition_xf = getVertex(vec2(texCoord.x + (1.0 / cols), texCoord.y), x + 1, y, cam, depth);\n    vec3 vPosition_xb = getVertex(vec2(texCoord.x - (1.0 / cols), texCoord.y), x - 1, y, cam, depth);\n    \n    vec3 vPosition_yf = getVertex(vec2(texCoord.x, texCoord.y + (1.0 / rows)), x, y + 1, cam, depth);\n    vec3 vPosition_yb = getVertex(vec2(texCoord.x, texCoord.y - (1.0 / rows)), x, y - 1, cam, depth);\n    \n    vec3 del_x = ((vPosition_xb + vPosition) / 2) - ((vPosition_xf + vPosition) / 2);\n    vec3 del_y = ((vPosition_yb + vPosition) / 2) - ((vPosition_yf + vPosition) / 2);\n    \n    return normalize(cross(del_x, del_y));\n}\n\n//Forward difference on raw depth maps still in ushort mm\n//Cam is //cx, cy, 1 / fx, 1 / fy\nvec3 getVertex(vec2 texcoord, int x, int y, vec4 cam, usampler2D depth)\n{\n    float z = float(textureLod(depth, texcoord, 0.0)) / 1000.0f;\n    return vec3((x - cam.x) * z * cam.z, (y - cam.y) * z * cam.w, z);\n}\n\n//Cam is //cx, cy, 1 / fx, 1 / fy\nvec3 getNormal(vec3 vPosition, vec2 texcoord, int x, int y, vec4 cam, usampler2D depth)\n{\n    vec3 vPosition_x = getVertex(vec2(texcoord.x + (1.0 / cols), texcoord.y), x + 1, y, cam, depth);\n    vec3 vPosition_y = getVertex(vec2(texcoord.x, texcoord.y + (1.0 / rows)), x, y + 1, cam, depth);\n    \n    vec3 del_x = vPosition_x - vPosition;\n    vec3 del_y = vPosition_y - vPosition;\n    \n    return normalize(cross(del_x, del_y));\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/index_map.frag",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330 core\n\nin vec4 vPosition0;\nin vec4 vColorTime0;\nin vec4 vNormRad0;\nflat in int vertexId;\n\nlayout(location = 0) out int FragColor;\nlayout(location = 1) out vec4 vPosition1;\nlayout(location = 2) out vec4 vColorTime1;\nlayout(location = 3) out vec4 vNormRad1;\n\nvoid main()\n{\n    vPosition1 = vPosition0;\n    vColorTime1 = vColorTime0;\n    vNormRad1 = vNormRad0; \n    FragColor = vertexId;\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/index_map.vert",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n \n#version 330 core\n\nlayout (location = 0) in vec4 vPosition;\nlayout (location = 1) in vec4 vColorTime;\nlayout (location = 2) in vec4 vNormRad;\n\nout vec4 vPosition0;\nout vec4 vColorTime0;\nout vec4 vNormRad0;\nflat out int vertexId;\n\nuniform mat4 t_inv;\nuniform vec4 cam; //cx, cy, fx, fy\nuniform float cols;\nuniform float rows;\nuniform float maxDepth;\nuniform int time;\nuniform int timeDelta;\n\nvoid main()\n{\n    vec4 vPosHome = t_inv * vec4(vPosition.xyz, 1.0);\n    \n    float x = 0;\n    float y = 0;\n        \n    if(vPosHome.z > maxDepth || vPosHome.z < 0 || time - vColorTime.w > timeDelta)\n    {\n        x = -10;\n        y = -10;\n        vertexId = 0;\n    }\n    else\n    {\n        x = ((((cam.z * vPosHome.x) / vPosHome.z) + cam.x) - (cols * 0.5)) / (cols * 0.5);\n        y = ((((cam.w * vPosHome.y) / vPosHome.z) + cam.y) - (rows * 0.5)) / (rows * 0.5);\n        vertexId = gl_VertexID;\n    }\n    \n    gl_Position = vec4(x, y, vPosHome.z / maxDepth, 1.0);\n\n    vPosition0 = vec4(vPosHome.xyz, vPosition.w);\n    vColorTime0 = vColorTime;\n    vNormRad0 = vec4(normalize(mat3(t_inv) * vNormRad.xyz), vNormRad.w);\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/init_unstable.vert",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330 core\n\nlayout (location = 0) in vec4 vPosition;\nlayout (location = 1) in vec4 vColor;\nlayout (location = 2) in vec4 vNormRad;\n\nout vec4 vPosition0;\nout vec4 vColor0;\nout vec4 vNormRad0;\n\nvoid main()\n{\n    vPosition0 = vPosition;\n    vColor0 = vColor;\n    vColor0.y = 0; //Unused\n    vColor0.z = 1; //This sets the vertex's initialisation time\n    vNormRad0 = vNormRad;\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/quad.geom",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330 core\n\nlayout(points) in;\nlayout(triangle_strip, max_vertices = 4) out;\n\nout vec2 texcoord;\n\nvoid main() \n{\n    gl_Position = vec4(1.0, 1.0, 0.0, 1.0);\n    texcoord = vec2(1.0, 1.0);\n    EmitVertex();\n\n    gl_Position = vec4(-1.0, 1.0, 0.0, 1.0);\n    texcoord = vec2(0.0, 1.0); \n    EmitVertex();\n\n    gl_Position = vec4(1.0,-1.0, 0.0, 1.0);\n    texcoord = vec2(1.0, 0.0); \n    EmitVertex();\n\n    gl_Position = vec4(-1.0,-1.0, 0.0, 1.0);\n    texcoord = vec2(0.0, 0.0); \n    EmitVertex();\n\n    EndPrimitive(); \n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/resize.frag",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330 core\n\nin vec2 texcoord;\n\nout vec4 FragColor;\n\nuniform sampler2D eSampler;\n \nvoid main()\n{\n    FragColor = texture2D(eSampler, texcoord.xy);\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/sample.geom",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330 core\n\nlayout(points) in;\nlayout(points, max_vertices = 1) out;\n\nin vec4 vPosition0[];\nin vec4 vColorTime0[];\nin vec4 vNormRad0[];\nflat in int id[];\n\nout vec4 vData;\n\nvoid main() \n{\n    if(id[0] % 5000 == 0)\n    {\n        vData.xyz = vPosition0[0].xyz;\n        vData.w = vColorTime0[0].z;\n        EmitVertex();\n        EndPrimitive(); \n    }\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/sample.vert",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330 core\n\nlayout (location = 0) in vec4 vPosition;\nlayout (location = 1) in vec4 vColorTime;\nlayout (location = 2) in vec4 vNormRad;\n\nout vec4 vPosition0;\nout vec4 vColorTime0;\nout vec4 vNormRad0;\nflat out int id;\n\nvoid main()\n{\n    vPosition0 = vPosition;\n    vColorTime0 = vColorTime;\n    vNormRad0 = vNormRad;\n    id = gl_VertexID;    \n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/splat.vert",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330 core\n\nlayout (location = 0) in vec4 vPosition;\nlayout (location = 1) in vec4 vColor;\nlayout (location = 2) in vec4 vNormRad;\n\nuniform mat4 t_inv;\nuniform vec4 cam; //cx, cy, fx, fy\nuniform float cols;\nuniform float rows;\nuniform float maxDepth;\nuniform float confThreshold;\nuniform int time;\nuniform int maxTime;\nuniform int timeDelta;\n\nout vec4 position;\nout vec4 normRad;\nout vec4 colTime;\n\nvec3 projectPoint(vec3 p)\n{\n    return vec3(((((cam.z * p.x) / p.z) + cam.x) - (cols * 0.5)) / (cols * 0.5),\n                ((((cam.w * p.y) / p.z) + cam.y) - (rows * 0.5)) / (rows * 0.5),\n                p.z / maxDepth);\n}\n\nvec3 projectPointImage(vec3 p)\n{\n    return vec3(((cam.z * p.x) / p.z) + cam.x,\n                ((cam.w * p.y) / p.z) + cam.y,\n                p.z);\n}\n\nvoid main()\n{\n    vec4 vPosHome = t_inv * vec4(vPosition.xyz, 1.0);\n    \n    if(vPosHome.z > maxDepth || vPosHome.z < 0 || vPosition.w < confThreshold || time - vColor.w > timeDelta || vColor.w > maxTime)\n    {\n        gl_Position = vec4(1000.0f, 1000.0f, 1000.0f, 1000.0f);\n        gl_PointSize = 0;\n    }\n    else\n    {\n\t    gl_Position = vec4(projectPoint(vPosHome.xyz), 1.0);\n\t    \n        colTime = vColor;\n\t    position = vec4(vPosHome.xyz, vPosition.w);\n\t    normRad = vec4(normalize(mat3(t_inv) * vNormRad.xyz), vNormRad.w);\n\t    \n\t    vec3 x1 = normalize(vec3((normRad.y - normRad.z), -normRad.x, normRad.x)) * normRad.w * 1.41421356;\n\t    \n\t    vec3 y1 = cross(normRad.xyz, x1);\n\t\n\t    vec4 proj1 = vec4(projectPointImage(vPosHome.xyz + x1), 1.0);\n\t    vec4 proj2 = vec4(projectPointImage(vPosHome.xyz + y1), 1.0);\n\t    vec4 proj3 = vec4(projectPointImage(vPosHome.xyz - y1), 1.0);\n\t    vec4 proj4 = vec4(projectPointImage(vPosHome.xyz - x1), 1.0);\n\t                \n\t    vec2 xs = vec2(min(proj1.x, min(proj2.x, min(proj3.x, proj4.x))), max(proj1.x, max(proj2.x, max(proj3.x, proj4.x))));\n\t    vec2 ys = vec2(min(proj1.y, min(proj2.y, min(proj3.y, proj4.y))), max(proj1.y, max(proj2.y, max(proj3.y, proj4.y))));\n\t\n\t    float xDiff = abs(xs.y - xs.x);\n\t    float yDiff = abs(ys.y - ys.x);\n\t\n\t    gl_PointSize = max(0, max(xDiff, yDiff));\n    }\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/surfels.glsl",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\nfloat getRadius(float depth, float norm_z)\n{\n    float meanFocal = ((1.0 / abs(cam.z)) + (1.0 / abs(cam.w))) / 2.0;\n    \n    const float sqrt2 = 1.41421356237f;\n    \n    float radius = (depth / meanFocal) * sqrt2;\n\n    float radius_n = radius;\n\n    radius_n = radius_n / abs(norm_z);\n\n    radius_n = min(2.0f * radius, radius_n);\n\n    return radius_n;\n}\n\nfloat confidence(float x, float y, float weighting)\n{\n    const float maxRadDist = 400; //sqrt((width * 0.5)^2 + (height * 0.5)^2)\n    const float twoSigmaSquared = 0.72; //2*(0.6^2) from paper\n    \n    vec2 pixelPosCentered = vec2(x, y) - cam.xy;\n    \n    float radialDist = sqrt(dot(pixelPosCentered, pixelPosCentered)) / maxRadDist;\n    \n    return exp((-(radialDist * radialDist) / twoSigmaSquared)) * weighting;\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/update.vert",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330 core\n\nlayout (location = 0) in vec4 vPosition;\nlayout (location = 1) in vec4 vColor;\nlayout (location = 2) in vec4 vNormRad;\n\nout vec4 vPosition0;\nout vec4 vColor0;\nout vec4 vNormRad0;\nuniform float texDim;\nuniform int time;\n\nuniform sampler2D vertSamp;\nuniform sampler2D colorSamp;\nuniform sampler2D normSamp;\n\n#include \"color.glsl\"\n\nvoid main()\n{\n    int intY = gl_VertexID / int(texDim);\n    int intX = gl_VertexID - (intY * int(texDim));\n\n    float halfPixel = 0.5 * (1.0f / texDim);\n    float y = (float(intY) / texDim) + halfPixel;\n    float x = (float(intX) / texDim) + halfPixel;\n    \n    vec4 newColor = textureLod(colorSamp, vec2(x, y), 0);\n\n    //Do averaging here\n    if(newColor.w == -1)\n    {\n        vec4 newPos = textureLod(vertSamp, vec2(x, y), 0);\n        vec4 newNorm = textureLod(normSamp, vec2(x, y), 0);\n        \n        float c_k = vPosition.w;\n        vec3 v_k = vPosition.xyz;\n        \n        float a = newPos.w;\n        vec3 v_g = newPos.xyz;\n        \n        if(newNorm.w < (1.0 + 0.5) * vNormRad.w)\n        {\n\t        vPosition0 = vec4(((c_k * v_k) + (a * v_g)) / (c_k + a), c_k + a);\n\t        \n\t        vec3 oldCol = decodeColor(vColor.x);\n\t        vec3 newCol = decodeColor(newColor.x);\n           \n            vec3 avgColor = ((c_k * oldCol.xyz) + (a * newCol.xyz)) / (c_k + a);\n            \n\t        vColor0 = vec4(encodeColor(avgColor), vColor.y, vColor.z, time);\n\t        \n\t        vNormRad0 = ((c_k * vNormRad) + (a * newNorm)) / (c_k + a);\n\t        \n\t        vNormRad0.xyz = normalize(vNormRad0.xyz);\n        }\n        else\n        {\n            vPosition0 = vPosition;\n            vColor0 = vColor;\n            vNormRad0 = vNormRad;\n            \n            vPosition0.w = c_k + a;\n            vColor0.w = time;\n        }\n    }\n    else\n    {\n        //This point isn't being updated, so just transfer it\n\t    vPosition0 = vPosition;\n\t    vColor0 = vColor;\n\t    vNormRad0 = vNormRad;\n    }\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/vertex_feedback.geom",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330 core\n\nlayout(points) in;\nlayout(points, max_vertices = 1) out;\n\nin vec4 vPosition[];\nin vec4 vColor[];\nin vec4 vNormRad[];\nin float zVal[];\n\nout vec4 vPosition0;\nout vec4 vColor0;\nout vec4 vNormRad0;\n\nvoid main() \n{\n    if(zVal[0] > 0)\n    {\n        vPosition0 = vPosition[0];\n        vColor0 = vColor[0];\n        vNormRad0 = vNormRad[0];\n        EmitVertex();\n        EndPrimitive(); \n    }\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/vertex_feedback.vert",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330 core\n\nlayout (location = 0) in vec2 texcoord;\n\nout vec4 vPosition;\nout vec4 vColor;\nout vec4 vNormRad;\nout float zVal;\n\nuniform sampler2D gSampler;\nuniform sampler2D cSampler;\nuniform vec4 cam; //cx, cy, 1/fx, 1/fy\nuniform float cols;\nuniform float rows;\nuniform int time;\nuniform float maxDepth;\n\n#include \"surfels.glsl\"\n#include \"color.glsl\"\n#include \"geometry.glsl\"\n\nvoid main()\n{\n    //Should be guaranteed to be in bounds\n    float x = texcoord.x * cols;\n    float y = texcoord.y * rows;\n\n    vPosition = vec4(getVertex(texcoord.xy, x, y, cam, gSampler), 1);\n    vColor = textureLod(cSampler, texcoord.xy, 0.0);\n    \n    vec3 vNormLocal = getNormal(vPosition.xyz, texcoord.xy, x, y, cam, gSampler);\n    vNormRad = vec4(vNormLocal, getRadius(vPosition.z, vNormLocal.z));\n    \n    if(vPosition.z <= 0 || vPosition.z > maxDepth)\n    {\n\t    zVal = 0;\n    }\n    else\n    {\n        zVal = vPosition.z;\n    }\n    \n    vPosition.w = confidence(x, y, 1.0f);\n    \n    vColor.x = encodeColor(vColor.xyz);\n    \n    vColor.y = 0;\n    //Timestamp\n    vColor.w = float(time);\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Shaders/visualise_textures.frag",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#version 330 core\n\nuniform sampler2D texVerts;\nuniform float maxDepth;\n\nin vec2 texcoord;\n\nout vec4 FragColor;\n\nvoid main()\n{\n    vec4 vertex = texture2D(texVerts, texcoord);\n    \n    if(vertex.z > maxDepth || vertex.z <= 0)\n    {\n        discard;\n    }\n    else\n    {\n        FragColor = 1.0f - vec4(vertex.z / maxDepth);\n    }\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Utils/CholeskyDecomp.cpp",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#include \"CholeskyDecomp.h\"\n\nCholeskyDecomp::CholeskyDecomp()\n : L(0)\n{\n    cholmod_start(&Common);\n}\n\nCholeskyDecomp::~CholeskyDecomp()\n{\n    cholmod_finish(&Common);\n}\n\nvoid CholeskyDecomp::freeFactor()\n{\n    assert(L);\n    cholmod_free_factor(&L, &Common);\n    L = 0;\n}\n\nEigen::VectorXd CholeskyDecomp::solve(const Jacobian & jacobian, const Eigen::VectorXd & residual, const bool firstRun)\n{\n    cholmod_sparse * At = cholmod_allocate_sparse(jacobian.cols(), jacobian.rows.size(), jacobian.nonZero(), true, true, 0, CHOLMOD_REAL, &Common);\n\n    int* p = (int*) At->p;\n    int* i = (int*) At->i;\n    double* x = (double*) At->x;\n    int n = 0;\n    *p = n;\n\n    for(size_t r = 0; r < jacobian.rows.size(); r++)\n    {\n        memcpy(i, jacobian.rows.at(r)->indices, jacobian.rows.at(r)->nonZeros() * sizeof(int));\n        memcpy(x, jacobian.rows.at(r)->vals, jacobian.rows.at(r)->nonZeros()* sizeof(double));\n\n        i += jacobian.rows.at(r)->nonZeros();\n        x += jacobian.rows.at(r)->nonZeros();\n        n += jacobian.rows.at(r)->nonZeros();\n        p++;\n        *p = n;\n    }\n\n    if(firstRun)\n    {\n        assert(!L);\n\n        L = cholmod_analyze(At, &Common);\n    }\n\n    cholmod_factor * L_factor = cholmod_copy_factor(L, &Common);\n\n    cholmod_factorize(At, L_factor, &Common);\n\n    cholmod_change_factor(CHOLMOD_REAL, true, false, true, true, L_factor, &Common);\n\n    cholmod_dense* Arhs = cholmod_zeros(At->ncol, 1, CHOLMOD_REAL, &Common);\n\n    memcpy(Arhs->x, residual.data(), At->ncol * sizeof(double));\n\n    cholmod_dense* Atb = cholmod_zeros(At->nrow, 1, CHOLMOD_REAL, &Common);\n\n    double alpha[2] = { 1., 0. };\n    double beta[2] = { 0., 0. };\n\n    cholmod_sdmult(At, 0, alpha, beta, Arhs, Atb, &Common);\n\n    cholmod_dense* Atb_perm = cholmod_solve(CHOLMOD_P, L_factor, Atb, &Common);\n\n    cholmod_dense * rhs = cholmod_solve(CHOLMOD_L, L_factor, Atb_perm, &Common);\n\n    cholmod_dense* delta_cm = cholmod_solve(CHOLMOD_Lt, L_factor, rhs, &Common);\n\n    Eigen::VectorXd delta(rhs->nrow);\n\n    for(size_t i = 0; i < At->nrow; i++)\n    {\n        delta(((int *)L_factor->Perm)[i]) = ((double*)delta_cm->x)[i];\n    }\n\n    cholmod_free_dense(&delta_cm, &Common);\n    cholmod_free_dense(&Atb_perm, &Common);\n    cholmod_free_dense(&Atb, &Common);\n    cholmod_free_dense(&Arhs, &Common);\n    cholmod_free_sparse(&At, &Common);\n    cholmod_free_dense(&rhs, &Common);\n    cholmod_free_factor(&L_factor, &Common);\n\n    return delta;\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Utils/CholeskyDecomp.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef UTILS_CHOLESKYDECOMP_H_\n#define UTILS_CHOLESKYDECOMP_H_\n\n#include <cholmod.h>\n#include <Eigen/Core>\n\n#include \"Jacobian.h\"\n\nclass CholeskyDecomp\n{\n    public:\n        CholeskyDecomp();\n        virtual ~CholeskyDecomp();\n\n        void freeFactor();\n\n        Eigen::VectorXd solve(const Jacobian & jacobian, const Eigen::VectorXd & residual, const bool firstRun);\n\n    private:\n        cholmod_common Common;\n        cholmod_factor * L;\n};\n\n#endif /* UTILS_CHOLESKYDECOMP_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Utils/DeformationGraph.cpp",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#include \"CholeskyDecomp.h\"\n#include \"DeformationGraph.h\"\n\nDeformationGraph::DeformationGraph(int k, std::vector<Eigen::Vector3f> * sourceVertices)\n : k(k),\n   initialised(false),\n   wRot(1),\n   wReg(10),\n   wCon(100),\n   sourceVertices(sourceVertices),\n   graphCloud(new std::vector<Eigen::Vector3f>),\n   lastPointCount(0),\n   cholesky(new CholeskyDecomp)\n{}\n\nDeformationGraph::~DeformationGraph()\n{\n    if(initialised)\n    {\n        graphNodes.clear();\n    }\n\n    delete graphCloud;\n\n    delete cholesky;\n}\n\nstd::vector<GraphNode *> & DeformationGraph::getGraph()\n{\n    return graph;\n}\n\nstd::vector<unsigned long long int> & DeformationGraph::getGraphTimes()\n{\n    return sampledGraphTimes;\n}\n\nvoid DeformationGraph::initialiseGraph(std::vector<Eigen::Vector3f> * customGraph,\n                                       std::vector<unsigned long long int> * graphTimeMap)\n{\n    graphCloud->clear();\n\n    sampledGraphTimes.clear();\n\n    sampledGraphTimes.insert(sampledGraphTimes.end(), graphTimeMap->begin(), graphTimeMap->end());\n\n    graphCloud->insert(graphCloud->end(), customGraph->begin(), customGraph->end());\n\n    graphNodes.clear();\n\n    graph.clear();\n\n    graphNodes.resize(graphCloud->size());\n\n    for(unsigned int i = 0; i < graphCloud->size(); i++)\n    {\n        graphNodes[i].id = i;\n\n        graphNodes[i].enabled = true;\n\n        graphNodes[i].position = graphCloud->at(i);\n\n        graphNodes[i].translation = Eigen::Vector3f::Zero();\n\n        graphNodes[i].rotation.setIdentity();\n\n        graph.push_back(&graphNodes[i]);\n    }\n\n    connectGraphSeq();\n\n    initialised = true;\n}\n\nvoid DeformationGraph::appendVertices(std::vector<unsigned long long int> * vertexTimeMap, unsigned int originalPointEnd)\n{\n    vertexMap.resize(lastPointCount);\n\n    weightVerticesSeq(vertexTimeMap);\n\n    lastPointCount = originalPointEnd;\n}\n\nvoid DeformationGraph::applyGraphToPoses(std::vector<Eigen::Matrix4f*> & poses)\n{\n    assert(poses.size() == poseMap.size() && initialised);\n\n    Eigen::Vector3f newPosition;\n    Eigen::Matrix3f rotation;\n\n    for(size_t i = 0; i < poses.size(); i++)\n    {\n        std::vector<VertexWeightMap> & weightMap = poseMap.at(i);\n\n        newPosition = Eigen::Vector3f::Zero();\n        rotation = Eigen::Matrix3f::Zero();\n\n        for(size_t j = 0; j < weightMap.size(); j++)\n        {\n            newPosition += weightMap.at(j).weight * (graph.at(weightMap.at(j).node)->rotation * (poses.at(i)->topRightCorner(3, 1) - graph.at(weightMap.at(j).node)->position) +\n                                                     graph.at(weightMap.at(j).node)->position + graph.at(weightMap.at(j).node)->translation);\n\n            rotation += weightMap.at(j).weight * graph.at(weightMap.at(j).node)->rotation;\n        }\n\n        Eigen::Matrix3f newRotation = rotation * poses.at(i)->topLeftCorner(3, 3);\n\n        Eigen::JacobiSVD<Eigen::Matrix3f> svd(newRotation, Eigen::ComputeFullU | Eigen::ComputeFullV);\n\n        poses.at(i)->topRightCorner(3, 1) = newPosition;\n        poses.at(i)->topLeftCorner(3, 3) = svd.matrixU() * svd.matrixV().transpose();\n    }\n}\n\nvoid DeformationGraph::setPosesSeq(std::vector<unsigned long long int> * poseTimeMap, const std::vector<Eigen::Matrix4f> & poses)\n{\n    poseMap.clear();\n\n    const unsigned int lookBack = 20;\n\n    std::vector<int> pointIdxNKNSearch(k + 1);\n    std::vector<float> pointNKNSquaredDistance(k + 1);\n\n    for(unsigned int i = 0; i < poses.size(); i++)\n    {\n        unsigned long long int poseTime = poseTimeMap->at(i);\n\n        unsigned int foundIndex = 0;\n\n        int imin = 0;\n        int imax = sampledGraphTimes.size() - 1;\n        int imid = (imin + imax) / 2;\n\n        while(imax >= imin)\n        {\n            imid = (imin + imax) / 2;\n\n            if (sampledGraphTimes[imid] < poseTime)\n            {\n                imin = imid + 1;\n            }\n            else if(sampledGraphTimes[imid] > poseTime)\n            {\n                imax = imid - 1;\n            }\n            else\n            {\n                break;\n            }\n        }\n\n        imin = std::min(imin, (int)sampledGraphTimes.size() - 1);\n\n        if(abs(int64_t(sampledGraphTimes[imin]) - int64_t(poseTime)) <= abs(int64_t(sampledGraphTimes[imid]) - int64_t(poseTime)) &&\n          abs(int64_t(sampledGraphTimes[imin]) - int64_t(poseTime)) <= abs(int64_t(sampledGraphTimes[imax]) - int64_t(poseTime)))\n        {\n            foundIndex = imin;\n        }\n        else if(abs(int64_t(sampledGraphTimes[imid]) - int64_t(poseTime)) <= abs(int64_t(sampledGraphTimes[imin]) - int64_t(poseTime)) &&\n          abs(int64_t(sampledGraphTimes[imid]) - int64_t(poseTime)) <= abs(int64_t(sampledGraphTimes[imax]) - int64_t(poseTime)))\n        {\n            foundIndex = imid;\n        }\n        else\n        {\n            foundIndex = imax;\n        }\n\n        std::vector<std::pair<float, int> > nearNodes;\n\n        if(foundIndex == graphCloud->size())\n        {\n            foundIndex = graphCloud->size() - 1;\n        }\n\n        unsigned int distanceBack = 0;\n        for(int j = (int)foundIndex; j >= 0; j--)\n        {\n            std::pair<float, int> newNode;\n            newNode.first = (graphCloud->at(j) - poses.at(i).topRightCorner(3, 1)).norm();\n            newNode.second = j;\n\n            nearNodes.push_back(newNode);\n\n            if(++distanceBack == lookBack)\n            {\n                break;\n            }\n        }\n\n        if(distanceBack != lookBack)\n        {\n            for(unsigned int j = foundIndex + 1; j < sampledGraphTimes.size(); j++)\n            {\n                std::pair<float, int> newNode;\n                newNode.first = (graphCloud->at(j) - poses.at(i).topRightCorner(3, 1)).norm();\n                newNode.second = j;\n\n                nearNodes.push_back(newNode);\n\n                if(++distanceBack == lookBack)\n                {\n                    break;\n                }\n            }\n        }\n\n        std::sort(nearNodes.begin(), nearNodes.end(), [](const std::pair<float, int> &left, const std::pair<float, int> &right) {return left.first < right.first;});\n\n        Eigen::Vector3f vertexPosition = poses.at(i).topRightCorner(3, 1);\n        double dMax = nearNodes.at(k).first;\n\n        std::vector<VertexWeightMap> newMap;\n\n        double weightSum = 0;\n\n        for(unsigned int j = 0; j < (unsigned int)k; j++)\n        {\n            newMap.push_back(VertexWeightMap(pow(1.0f - (vertexPosition - graphNodes[nearNodes.at(j).second].position).norm() / dMax, 2), nearNodes.at(j).second));\n            weightSum += newMap.back().weight;\n        }\n\n        for(unsigned int j = 0; j < newMap.size(); j++)\n        {\n            newMap.at(j).weight /= weightSum;\n        }\n\n        VertexWeightMap::sort(newMap, graph);\n\n        poseMap.push_back(newMap);\n    }\n}\n\nvoid DeformationGraph::connectGraphSeq()\n{\n    for(int i = 0; i < k / 2; i++)\n    {\n        for(int n = 0; n < k + 1; n++)\n        {\n            if(i == n)\n            {\n                continue;\n            }\n\n            graphNodes[i].neighbours.push_back(n);\n        }\n    }\n\n    for(unsigned int i = k / 2; i < graphCloud->size() - (k / 2); i++)\n    {\n        for(int n = 0; n < k / 2; n++)\n        {\n            graphNodes[i].neighbours.push_back(i - (n + 1));\n            graphNodes[i].neighbours.push_back(i + (n + 1));\n        }\n    }\n\n    for(unsigned int i = graphCloud->size() - (k / 2); i < graphCloud->size(); i++)\n    {\n        for(unsigned int n = graphCloud->size() - (k + 1); n < graphCloud->size(); n++)\n        {\n            if(i == n)\n            {\n                continue;\n            }\n\n            graphNodes[i].neighbours.push_back(n);\n        }\n    }\n}\n\nvoid DeformationGraph::weightVerticesSeq(std::vector<unsigned long long int> * vertexTimeMap)\n{\n    const unsigned int lookBack = 20;\n\n    std::vector<int> pointIdxNKNSearch(k + 1);\n    std::vector<float> pointNKNSquaredDistance(k + 1);\n\n    for(unsigned int i = lastPointCount; i < sourceVertices->size(); i++)\n    {\n        unsigned long long int vertexTime = vertexTimeMap->at(i);\n\n        unsigned int foundIndex = 0;\n\n        int imin = 0;\n        int imax = sampledGraphTimes.size() - 1;\n        int imid = (imin + imax) / 2;\n\n        while(imax >= imin)\n        {\n            imid = (imin + imax) / 2;\n\n            if (sampledGraphTimes[imid] < vertexTime)\n            {\n                imin = imid + 1;\n            }\n            else if(sampledGraphTimes[imid] > vertexTime)\n            {\n                imax = imid - 1;\n            }\n            else\n            {\n                break;\n            }\n        }\n\n        imin = std::min(imin, (int)sampledGraphTimes.size() - 1);\n\n        if(abs(int64_t(sampledGraphTimes[imin]) - int64_t(vertexTime)) <= abs(int64_t(sampledGraphTimes[imid]) - int64_t(vertexTime)) &&\n          abs(int64_t(sampledGraphTimes[imin]) - int64_t(vertexTime)) <= abs(int64_t(sampledGraphTimes[imax]) - int64_t(vertexTime)))\n        {\n            foundIndex = imin;\n        }\n        else if(abs(int64_t(sampledGraphTimes[imid]) - int64_t(vertexTime)) <= abs(int64_t(sampledGraphTimes[imin]) - int64_t(vertexTime)) &&\n          abs(int64_t(sampledGraphTimes[imid]) - int64_t(vertexTime)) <= abs(int64_t(sampledGraphTimes[imax]) - int64_t(vertexTime)))\n        {\n            foundIndex = imid;\n        }\n        else\n        {\n            foundIndex = imax;\n        }\n\n        std::vector<std::pair<float, int> > nearNodes;\n\n        if(foundIndex == graphCloud->size())\n        {\n            foundIndex = graphCloud->size() - 1;\n        }\n\n        unsigned int distanceBack = 0;\n        for(int j = (int)foundIndex; j >= 0; j--)\n        {\n            std::pair<float, int> newNode;\n            newNode.first = (graphCloud->at(j) - sourceVertices->at(i)).norm();\n            newNode.second = j;\n\n            nearNodes.push_back(newNode);\n\n            if(++distanceBack == lookBack)\n            {\n                break;\n            }\n        }\n\n        if(distanceBack != lookBack)\n        {\n            for(unsigned int j = foundIndex + 1; j < sampledGraphTimes.size(); j++)\n            {\n                std::pair<float, int> newNode;\n                newNode.first = (graphCloud->at(j) - sourceVertices->at(i)).norm();\n                newNode.second = j;\n\n                nearNodes.push_back(newNode);\n\n                if(++distanceBack == lookBack)\n                {\n                    break;\n                }\n            }\n        }\n\n        std::sort(nearNodes.begin(), nearNodes.end(), [](const std::pair<float, int> &left, const std::pair<float, int> &right) {return left.first < right.first;});\n\n        Eigen::Vector3f vertexPosition = sourceVertices->at(i);\n        double dMax = nearNodes.at(k).first;\n\n        std::vector<VertexWeightMap> newMap;\n\n        double weightSum = 0;\n\n        for(unsigned int j = 0; j < (unsigned int)k; j++)\n        {\n            newMap.push_back(VertexWeightMap(pow(1.0f - (vertexPosition - graphNodes[nearNodes.at(j).second].position).norm() / dMax, 2), nearNodes.at(j).second));\n            weightSum += newMap.back().weight;\n        }\n\n        for(unsigned int j = 0; j < newMap.size(); j++)\n        {\n            newMap.at(j).weight /= weightSum;\n        }\n\n        VertexWeightMap::sort(newMap, graph);\n\n        vertexMap.push_back(newMap);\n    }\n}\n\nvoid DeformationGraph::applyGraphToVertices()\n{\n    Eigen::Vector3f position;\n\n    for(unsigned int i = 0; i < sourceVertices->size(); i++)\n    {\n        computeVertexPosition(i, position);\n        sourceVertices->at(i) = position;\n    }\n}\n\nvoid DeformationGraph::addConstraint(int vertexId, Eigen::Vector3f & target)\n{\n    assert(initialised);\n\n    //Overwrites old constraint\n    for(unsigned int i = 0; i < constraints.size(); i++)\n    {\n        if(constraints.at(i).vertexId == vertexId)\n        {\n            constraints.at(i) = Constraint(vertexId, target);\n            return;\n        }\n    }\n\n    constraints.push_back(Constraint(vertexId, target));\n}\n\nvoid DeformationGraph::addRelativeConstraint(int vertexId, int targetId)\n{\n    assert(initialised);\n\n    //Overwrites old constraint\n    for(unsigned int i = 0; i < constraints.size(); i++)\n    {\n        if(constraints.at(i).vertexId == vertexId)\n        {\n            constraints.at(i) = Constraint(vertexId, targetId);\n            return;\n        }\n    }\n\n    constraints.push_back(Constraint(vertexId, targetId));\n}\n\nvoid DeformationGraph::clearConstraints()\n{\n    constraints.clear();\n}\n\nbool DeformationGraph::optimiseGraphSparse(float & error, float & meanConsErr, const bool fernMatch, const unsigned long long int lastDeformTime)\n{\n    assert(initialised);\n\n    TICK(\"opt\");\n\n    meanConsErr = nonRelativeConstraintError();\n\n    if(fernMatch && meanConsErr < 0.06)\n    {\n        TOCK(\"opt\");\n        return false;\n    }\n\n    int maxRows = (eRotRows + eRegRows * k) * graph.size() + eConRows * constraints.size();\n    int numCols = 0;\n    int backSet = graph.size() * numVariables;\n\n    for(size_t i = 0; i < graph.size(); i++)\n    {\n        graph.at(i)->enabled = sampledGraphTimes.at(i) > lastDeformTime;\n\n        if(graph.at(i)->enabled)\n        {\n            numCols += numVariables;\n            backSet -= numVariables;\n        }\n    }\n\n    Eigen::VectorXd residual = sparseResidual(maxRows);\n\n    Jacobian jacobian;\n\n    sparseJacobian(jacobian, residual.rows(), numCols, backSet);\n\n    error = residual.squaredNorm();\n\n    double lastError = error;\n    double errorDiff = 0;\n\n//    std::cout << \"Initial error: \" << error << \", \" << meanConsErr << std::endl;\n\n    int iter = 0;\n\n    while(iter++ < 3)\n    {\n        Eigen::VectorXd delta = cholesky->solve(jacobian, -residual, iter == 1);\n\n        applyDeltaSparse(delta);\n\n        residual = sparseResidual(maxRows);\n\n        error = residual.squaredNorm();\n\n        errorDiff = error - lastError;\n\n//        std::cout << \"Iteration \" << iter << \": \" << error << std::endl;\n\n        if(error > lastError || delta.norm() < 1e-2 || error < 1e-3 || fabs(errorDiff) < 1e-5 * error ||\n           (iter == 1 && fernMatch && error > 10.0f))\n        {\n            break;\n        }\n\n        lastError = error;\n\n        sparseJacobian(jacobian, residual.rows(), numCols, backSet);\n    }\n\n    cholesky->freeFactor();\n\n    TOCK(\"opt\");\n\n    meanConsErr = nonRelativeConstraintError();\n\n//    std::cout << \"Final error: \" << error << \", \" << meanConsErr << std::endl;\n\n    return true;\n}\n\nvoid DeformationGraph::sparseJacobian(Jacobian & jacobian, const int numRows, const int numCols, const int backSet)\n{\n    std::vector<OrderedJacobianRow*> rows(numRows);\n\n    //We know exact counts per row...\n    int lastRow = 0;\n\n    for(unsigned int j = 0; j < graph.size(); j++)\n    {\n        if(graph.at(j)->enabled)\n        {\n            int colOffset = graph.at(j)->id * numVariables;\n\n            //No weights for rotation as rotation weight = 1\n            const Eigen::Matrix3f & rotation = graph.at(j)->rotation;\n\n            rows[lastRow] = new OrderedJacobianRow(6);\n            rows[lastRow + 1] = new OrderedJacobianRow(6);\n            rows[lastRow + 2] = new OrderedJacobianRow(6);\n            rows[lastRow + 3] = new OrderedJacobianRow(3);\n            rows[lastRow + 4] = new OrderedJacobianRow(3);\n            rows[lastRow + 5] = new OrderedJacobianRow(3);\n\n            rows[lastRow]->append(colOffset - backSet, rotation(0, 1));\n            rows[lastRow]->append(colOffset + 1 - backSet, rotation(1, 1));\n            rows[lastRow]->append(colOffset + 2 - backSet, rotation(2, 1));\n            rows[lastRow]->append(colOffset + 3 - backSet, rotation(0, 0));\n            rows[lastRow]->append(colOffset + 4 - backSet, rotation(1, 0));\n            rows[lastRow]->append(colOffset + 5 - backSet, rotation(2, 0));\n\n            rows[lastRow + 1]->append(colOffset - backSet, rotation(0, 2));\n            rows[lastRow + 1]->append(colOffset + 1 - backSet, rotation(1, 2));\n            rows[lastRow + 1]->append(colOffset + 2 - backSet, rotation(2, 2));\n            rows[lastRow + 1]->append(colOffset + 6 - backSet, rotation(0, 0));\n            rows[lastRow + 1]->append(colOffset + 7 - backSet, rotation(1, 0));\n            rows[lastRow + 1]->append(colOffset + 8 - backSet, rotation(2, 0));\n\n            rows[lastRow + 2]->append(colOffset + 3 - backSet, rotation(0, 2));\n            rows[lastRow + 2]->append(colOffset + 4 - backSet, rotation(1, 2));\n            rows[lastRow + 2]->append(colOffset + 5 - backSet, rotation(2, 2));\n            rows[lastRow + 2]->append(colOffset + 6 - backSet, rotation(0, 1));\n            rows[lastRow + 2]->append(colOffset + 7 - backSet, rotation(1, 1));\n            rows[lastRow + 2]->append(colOffset + 8 - backSet, rotation(2, 1));\n\n            rows[lastRow + 3]->append(colOffset - backSet, 2*rotation(0, 0));\n            rows[lastRow + 3]->append(colOffset + 1 - backSet, 2*rotation(1, 0));\n            rows[lastRow + 3]->append(colOffset + 2 - backSet, 2*rotation(2, 0));\n\n            rows[lastRow + 4]->append(colOffset + 3 - backSet, 2*rotation(0, 1));\n            rows[lastRow + 4]->append(colOffset + 4 - backSet, 2*rotation(1, 1));\n            rows[lastRow + 4]->append(colOffset + 5 - backSet, 2*rotation(2, 1));\n\n            rows[lastRow + 5]->append(colOffset + 6 - backSet, 2*rotation(0, 2));\n            rows[lastRow + 5]->append(colOffset + 7 - backSet, 2*rotation(1, 2));\n            rows[lastRow + 5]->append(colOffset + 8 - backSet, 2*rotation(2, 2));\n\n            lastRow += eRotRows;\n        }\n    }\n\n    for(unsigned int j = 0; j < graph.size(); j++)\n    {\n        int colOffset = graph.at(j)->id * numVariables;\n\n        //For each neighbour\n        for(unsigned int n = 0; n < graph.at(j)->neighbours.size(); n++)\n        {\n            if(graph.at(graph.at(j)->neighbours.at(n))->enabled || graph.at(j)->enabled)\n            {\n                rows[lastRow] = new OrderedJacobianRow(5);\n                rows[lastRow + 1] = new OrderedJacobianRow(5);\n                rows[lastRow + 2] = new OrderedJacobianRow(5);\n\n                Eigen::Vector3f delta = graph.at(graph.at(j)->neighbours.at(n))->position - graph.at(j)->position;\n\n                int colOffsetN = graph.at(graph.at(j)->neighbours.at(n))->id * numVariables;\n\n                assert(colOffset != colOffsetN);\n\n                if(colOffsetN < colOffset && graph.at(graph.at(j)->neighbours.at(n))->enabled)\n                {\n                    rows[lastRow]->append(colOffsetN + 9 - backSet, -1.0 * sqrt(wReg));\n                    rows[lastRow + 1]->append(colOffsetN + 10 - backSet, -1.0 * sqrt(wReg));\n                    rows[lastRow + 2]->append(colOffsetN + 11 - backSet, -1.0 * sqrt(wReg));\n                }\n\n                if(graph.at(j)->enabled)\n                {\n                    rows[lastRow]->append(colOffset - backSet, delta(0) * sqrt(wReg));\n                    rows[lastRow]->append(colOffset + 3 - backSet, delta(1) * sqrt(wReg));\n                    rows[lastRow]->append(colOffset + 6 - backSet, delta(2) * sqrt(wReg));\n                    rows[lastRow]->append(colOffset + 9 - backSet, 1.0 * sqrt(wReg));\n\n                    rows[lastRow + 1]->append(colOffset + 1 - backSet, delta(0) * sqrt(wReg));\n                    rows[lastRow + 1]->append(colOffset + 4 - backSet, delta(1) * sqrt(wReg));\n                    rows[lastRow + 1]->append(colOffset + 7 - backSet, delta(2) * sqrt(wReg));\n                    rows[lastRow + 1]->append(colOffset + 10 - backSet, 1.0 * sqrt(wReg));\n\n                    rows[lastRow + 2]->append(colOffset + 2 - backSet, delta(0) * sqrt(wReg));\n                    rows[lastRow + 2]->append(colOffset + 5 - backSet, delta(1) * sqrt(wReg));\n                    rows[lastRow + 2]->append(colOffset + 8 - backSet, delta(2) * sqrt(wReg));\n                    rows[lastRow + 2]->append(colOffset + 11 - backSet, 1.0 * sqrt(wReg));\n                }\n\n                if(colOffsetN > colOffset && graph.at(graph.at(j)->neighbours.at(n))->enabled)\n                {\n                    rows[lastRow]->append(colOffsetN + 9 - backSet, -1.0 * sqrt(wReg));\n                    rows[lastRow + 1]->append(colOffsetN + 10 - backSet, -1.0 * sqrt(wReg));\n                    rows[lastRow + 2]->append(colOffsetN + 11 - backSet, -1.0 * sqrt(wReg));\n                }\n\n                lastRow += eRegRows;\n            }\n        }\n    }\n\n    for(unsigned int l = 0; l < constraints.size(); l++)\n    {\n        const std::vector<VertexWeightMap> & weightMap = vertexMap.at(constraints.at(l).vertexId);\n\n        bool nodeInfluences = false;\n\n        for(size_t i = 0; i < weightMap.size(); i++)\n        {\n            if(graph.at(weightMap.at(i).node)->enabled)\n            {\n                nodeInfluences = true;\n                break;\n            }\n        }\n\n        if(constraints.at(l).relative && !nodeInfluences)\n        {\n            const std::vector<VertexWeightMap> & relWeightMap = vertexMap.at(constraints.at(l).targetId);\n\n            for(size_t i = 0; i < relWeightMap.size(); i++)\n            {\n                if(graph.at(relWeightMap.at(i).node)->enabled)\n                {\n                    nodeInfluences = true;\n                    break;\n                }\n            }\n        }\n\n        if(nodeInfluences)\n        {\n            Eigen::Vector3f sourcePosition = sourceVertices->at(constraints.at(l).vertexId);\n\n            rows[lastRow] = new OrderedJacobianRow(4 * k * 2);\n            rows[lastRow + 1] = new OrderedJacobianRow(4 * k * 2);\n            rows[lastRow + 2] = new OrderedJacobianRow(4 * k * 2);\n\n            assert(graph.at(weightMap.at(0).node)->id < graph.at(weightMap.at(1).node)->id);\n\n            if(constraints.at(l).relative)\n            {\n                Eigen::Vector3f targetPosition = sourceVertices->at(constraints.at(l).targetId);\n\n                std::vector<VertexWeightMap> & relWeightMap = vertexMap.at(constraints.at(l).targetId);\n\n                for(unsigned int i = 0; i < relWeightMap.size(); i++)\n                {\n                    relWeightMap.at(i).relative = true;\n                }\n\n                std::vector<VertexWeightMap> weightMapMixed;\n\n                weightMapMixed.insert(weightMapMixed.end(), weightMap.begin(), weightMap.end());\n                weightMapMixed.insert(weightMapMixed.end(), relWeightMap.begin(), relWeightMap.end());\n\n                VertexWeightMap::sort(weightMapMixed, graph);\n\n                std::map<int, bool> checkList;\n\n                for(unsigned int i = 0; i < weightMapMixed.size(); i++)\n                {\n                    if(graph.at(weightMapMixed.at(i).node)->enabled)\n                    {\n                        int colOffset = graph.at(weightMapMixed.at(i).node)->id * numVariables;\n\n                        if(weightMapMixed.at(i).relative)\n                        {\n                            Eigen::Vector3f delta = (graph.at(weightMapMixed.at(i).node)->position - targetPosition) * weightMapMixed.at(i).weight;\n\n                            //We have to sum the Jacobian entries in this case\n                            if(checkList[graph.at(weightMapMixed.at(i).node)->id])\n                            {\n                                rows[lastRow]->addTo(colOffset - backSet, delta(0), sqrt(wCon));\n                                rows[lastRow]->addTo(colOffset + 3 - backSet, delta(1), sqrt(wCon));\n                                rows[lastRow]->addTo(colOffset + 6 - backSet, delta(2), sqrt(wCon));\n                                rows[lastRow]->addTo(colOffset + 9 - backSet, -weightMapMixed.at(i).weight, sqrt(wCon));\n\n                                rows[lastRow + 1]->addTo(colOffset + 1 - backSet, delta(0), sqrt(wCon));\n                                rows[lastRow + 1]->addTo(colOffset + 4 - backSet, delta(1), sqrt(wCon));\n                                rows[lastRow + 1]->addTo(colOffset + 7 - backSet, delta(2), sqrt(wCon));\n                                rows[lastRow + 1]->addTo(colOffset + 10 - backSet, -weightMapMixed.at(i).weight, sqrt(wCon));\n\n                                rows[lastRow + 2]->addTo(colOffset + 2 - backSet, delta(0), sqrt(wCon));\n                                rows[lastRow + 2]->addTo(colOffset + 5 - backSet, delta(1), sqrt(wCon));\n                                rows[lastRow + 2]->addTo(colOffset + 8 - backSet, delta(2), sqrt(wCon));\n                                rows[lastRow + 2]->addTo(colOffset + 11 - backSet, -weightMapMixed.at(i).weight, sqrt(wCon));\n                            }\n                            else\n                            {\n                                rows[lastRow]->append(colOffset - backSet, delta(0) * sqrt(wCon));\n                                rows[lastRow]->append(colOffset + 3 - backSet, delta(1) * sqrt(wCon));\n                                rows[lastRow]->append(colOffset + 6 - backSet, delta(2) * sqrt(wCon));\n                                rows[lastRow]->append(colOffset + 9 - backSet, -weightMapMixed.at(i).weight * sqrt(wCon));\n\n                                rows[lastRow + 1]->append(colOffset + 1 - backSet, delta(0) * sqrt(wCon));\n                                rows[lastRow + 1]->append(colOffset + 4 - backSet, delta(1) * sqrt(wCon));\n                                rows[lastRow + 1]->append(colOffset + 7 - backSet, delta(2) * sqrt(wCon));\n                                rows[lastRow + 1]->append(colOffset + 10 - backSet, -weightMapMixed.at(i).weight * sqrt(wCon));\n\n                                rows[lastRow + 2]->append(colOffset + 2 - backSet, delta(0) * sqrt(wCon));\n                                rows[lastRow + 2]->append(colOffset + 5 - backSet, delta(1) * sqrt(wCon));\n                                rows[lastRow + 2]->append(colOffset + 8 - backSet, delta(2) * sqrt(wCon));\n                                rows[lastRow + 2]->append(colOffset + 11 - backSet, -weightMapMixed.at(i).weight * sqrt(wCon));\n                            }\n                        }\n                        else\n                        {\n                            Eigen::Vector3f delta = (sourcePosition - graph.at(weightMapMixed.at(i).node)->position) * weightMapMixed.at(i).weight;\n\n                            //We have to sum the Jacobian entries in this case\n                            if(checkList[graph.at(weightMapMixed.at(i).node)->id])\n                            {\n                                rows[lastRow]->addTo(colOffset - backSet, delta(0), sqrt(wCon));\n                                rows[lastRow]->addTo(colOffset + 3 - backSet, delta(1), sqrt(wCon));\n                                rows[lastRow]->addTo(colOffset + 6 - backSet, delta(2), sqrt(wCon));\n                                rows[lastRow]->addTo(colOffset + 9 - backSet, weightMapMixed.at(i).weight, sqrt(wCon));\n\n                                rows[lastRow + 1]->addTo(colOffset + 1 - backSet, delta(0), sqrt(wCon));\n                                rows[lastRow + 1]->addTo(colOffset + 4 - backSet, delta(1), sqrt(wCon));\n                                rows[lastRow + 1]->addTo(colOffset + 7 - backSet, delta(2), sqrt(wCon));\n                                rows[lastRow + 1]->addTo(colOffset + 10 - backSet, weightMapMixed.at(i).weight, sqrt(wCon));\n\n                                rows[lastRow + 2]->addTo(colOffset + 2 - backSet, delta(0), sqrt(wCon));\n                                rows[lastRow + 2]->addTo(colOffset + 5 - backSet, delta(1), sqrt(wCon));\n                                rows[lastRow + 2]->addTo(colOffset + 8 - backSet, delta(2), sqrt(wCon));\n                                rows[lastRow + 2]->addTo(colOffset + 11 - backSet, weightMapMixed.at(i).weight, sqrt(wCon));\n                            }\n                            else\n                            {\n                                rows[lastRow]->append(colOffset - backSet, delta(0) * sqrt(wCon));\n                                rows[lastRow]->append(colOffset + 3 - backSet, delta(1) * sqrt(wCon));\n                                rows[lastRow]->append(colOffset + 6 - backSet, delta(2) * sqrt(wCon));\n                                rows[lastRow]->append(colOffset + 9 - backSet, weightMapMixed.at(i).weight * sqrt(wCon));\n\n                                rows[lastRow + 1]->append(colOffset + 1 - backSet, delta(0) * sqrt(wCon));\n                                rows[lastRow + 1]->append(colOffset + 4 - backSet, delta(1) * sqrt(wCon));\n                                rows[lastRow + 1]->append(colOffset + 7 - backSet, delta(2) * sqrt(wCon));\n                                rows[lastRow + 1]->append(colOffset + 10 - backSet, weightMapMixed.at(i).weight * sqrt(wCon));\n\n                                rows[lastRow + 2]->append(colOffset + 2 - backSet, delta(0) * sqrt(wCon));\n                                rows[lastRow + 2]->append(colOffset + 5 - backSet, delta(1) * sqrt(wCon));\n                                rows[lastRow + 2]->append(colOffset + 8 - backSet, delta(2) * sqrt(wCon));\n                                rows[lastRow + 2]->append(colOffset + 11 - backSet, weightMapMixed.at(i).weight * sqrt(wCon));\n                            }\n                        }\n\n                        checkList[graph.at(weightMapMixed.at(i).node)->id] = true;\n                    }\n                }\n            }\n            else\n            {\n                //Populate each column on the current Jacobian block rows\n                //WARNING: Assumes weightMap is sorted by id!\n                for(unsigned int i = 0; i < weightMap.size(); i++)\n                {\n                    if(graph.at(weightMap.at(i).node)->enabled)\n                    {\n                        int colOffset = graph.at(weightMap.at(i).node)->id * numVariables;\n\n                        Eigen::Vector3f delta = (sourcePosition - graph.at(weightMap.at(i).node)->position) * weightMap.at(i).weight;\n\n                        rows[lastRow]->append(colOffset - backSet, delta(0) * sqrt(wCon));\n                        rows[lastRow]->append(colOffset + 3 - backSet, delta(1) * sqrt(wCon));\n                        rows[lastRow]->append(colOffset + 6 - backSet, delta(2) * sqrt(wCon));\n                        rows[lastRow]->append(colOffset + 9 - backSet, weightMap.at(i).weight * sqrt(wCon));\n\n                        rows[lastRow + 1]->append(colOffset + 1 - backSet, delta(0) * sqrt(wCon));\n                        rows[lastRow + 1]->append(colOffset + 4 - backSet, delta(1) * sqrt(wCon));\n                        rows[lastRow + 1]->append(colOffset + 7 - backSet, delta(2) * sqrt(wCon));\n                        rows[lastRow + 1]->append(colOffset + 10 - backSet, weightMap.at(i).weight * sqrt(wCon));\n\n                        rows[lastRow + 2]->append(colOffset + 2 - backSet, delta(0) * sqrt(wCon));\n                        rows[lastRow + 2]->append(colOffset + 5 - backSet, delta(1) * sqrt(wCon));\n                        rows[lastRow + 2]->append(colOffset + 8 - backSet, delta(2) * sqrt(wCon));\n                        rows[lastRow + 2]->append(colOffset + 11 - backSet, weightMap.at(i).weight * sqrt(wCon));\n                    }\n                }\n            }\n\n            lastRow += eConRows;\n        }\n    }\n\n    assert(lastRow == numRows);\n\n    jacobian.assign(rows, numCols);\n}\n\nEigen::VectorXd DeformationGraph::sparseResidual(const int maxRows)\n{\n    //Now the residual\n    Eigen::VectorXd residual(maxRows);\n\n    int numRows = 0;\n\n    for(unsigned int j = 0; j < graph.size(); j++)\n    {\n        if(graph.at(j)->enabled)\n        {\n            //No weights for rotation as rotation weight = 1\n            const Eigen::Matrix3f & rotation = graph.at(j)->rotation;\n\n            //ab + de + gh\n            residual(numRows) = rotation.col(0).dot(rotation.col(1));\n\n            //ac + df + gi\n            residual(numRows + 1) = rotation.col(0).dot(rotation.col(2));\n\n            //bc + ef + hi\n            residual(numRows + 2) = rotation.col(1).dot(rotation.col(2));\n\n            //a^2 + d^2 + g^2 - 1\n            residual(numRows + 3) = (rotation.col(0).dot(rotation.col(0)) - 1.0);\n\n            //b^2 + e^2 + h^2 - 1\n            residual(numRows + 4) = (rotation.col(1).dot(rotation.col(1)) - 1.0);\n\n            //c^2 + f^2 + i^2 - 1\n            residual(numRows + 5) = (rotation.col(2).dot(rotation.col(2)) - 1.0);\n\n            numRows += eRotRows;\n        }\n    }\n\n    for(unsigned int j = 0; j < graph.size(); j++)\n    {\n        for(unsigned int n = 0; n < graph.at(j)->neighbours.size(); n++)\n        {\n            if(graph.at(graph.at(j)->neighbours.at(n))->enabled || graph.at(j)->enabled)\n            {\n                residual.segment(numRows, 3) = (graph.at(j)->rotation * (graph.at(graph.at(j)->neighbours.at(n))->position - graph.at(j)->position) +\n                                                                         graph.at(j)->position + graph.at(j)->translation -\n                                                                        (graph.at(graph.at(j)->neighbours.at(n))->position + graph.at(graph.at(j)->neighbours.at(n))->translation)).cast<double>() * sqrt(wReg);\n                numRows += eRegRows;\n            }\n        }\n    }\n\n    for(unsigned int l = 0; l < constraints.size(); l++)\n    {\n        const std::vector<VertexWeightMap> & weightMap = vertexMap.at(constraints.at(l).vertexId);\n\n        bool nodeInfluences = false;\n\n        for(size_t i = 0; i < weightMap.size(); i++)\n        {\n            if(graph.at(weightMap.at(i).node)->enabled)\n            {\n                nodeInfluences = true;\n                break;\n            }\n        }\n\n        if(constraints.at(l).relative && !nodeInfluences)\n        {\n            const std::vector<VertexWeightMap> & relWeightMap = vertexMap.at(constraints.at(l).targetId);\n\n            for(size_t i = 0; i < relWeightMap.size(); i++)\n            {\n                if(graph.at(relWeightMap.at(i).node)->enabled)\n                {\n                    nodeInfluences = true;\n                    break;\n                }\n            }\n        }\n\n        if(nodeInfluences)\n        {\n            if(constraints.at(l).relative)\n            {\n                Eigen::Vector3f srcPos, tarPos;\n\n                computeVertexPosition(constraints.at(l).vertexId, srcPos);\n\n                computeVertexPosition(constraints.at(l).targetId, tarPos);\n\n                residual.segment(numRows, 3) = (srcPos - tarPos).cast<double>() * sqrt(wCon);\n            }\n            else\n            {\n                Eigen::Vector3f position;\n\n                computeVertexPosition(constraints.at(l).vertexId, position);\n\n                residual.segment(numRows, 3) = (position - constraints.at(l).targetPosition).cast<double>() * sqrt(wCon);\n            }\n\n            numRows += eConRows;\n        }\n    }\n\n    residual.conservativeResize(numRows);\n\n    return residual;\n}\n\nvoid DeformationGraph::resetGraph()\n{\n    for(unsigned int j = 0; j < graph.size(); j++)\n    {\n        graph.at(j)->rotation.setIdentity();\n        graph.at(j)->translation.setIdentity();\n    }\n}\n\nvoid DeformationGraph::applyDeltaSparse(Eigen::VectorXd & delta)\n{\n    assert(initialised);\n\n    //Current row\n    int z = 0;\n\n    for(unsigned int j = 0; j < graph.size(); j++)\n    {\n        if(graph.at(j)->enabled)\n        {\n            const_cast<float *>(graph.at(j)->rotation.data())[0] += delta(z + 0);\n            const_cast<float *>(graph.at(j)->rotation.data())[1] += delta(z + 1);\n            const_cast<float *>(graph.at(j)->rotation.data())[2] += delta(z + 2);\n\n            const_cast<float *>(graph.at(j)->rotation.data())[3] += delta(z + 3);\n            const_cast<float *>(graph.at(j)->rotation.data())[4] += delta(z + 4);\n            const_cast<float *>(graph.at(j)->rotation.data())[5] += delta(z + 5);\n\n            const_cast<float *>(graph.at(j)->rotation.data())[6] += delta(z + 6);\n            const_cast<float *>(graph.at(j)->rotation.data())[7] += delta(z + 7);\n            const_cast<float *>(graph.at(j)->rotation.data())[8] += delta(z + 8);\n\n            const_cast<float *>(graph.at(j)->translation.data())[0] += delta(z + 9);\n            const_cast<float *>(graph.at(j)->translation.data())[1] += delta(z + 10);\n            const_cast<float *>(graph.at(j)->translation.data())[2] += delta(z + 11);\n\n            z += numVariables;\n        }\n    }\n}\n\nvoid DeformationGraph::computeVertexPosition(int vertexId, Eigen::Vector3f & position)\n{\n    assert(initialised);\n\n    std::vector<VertexWeightMap> & weightMap = vertexMap.at(vertexId);\n\n    position(0) = 0;\n    position(1) = 0;\n    position(2) = 0;\n\n    Eigen::Vector3f sourcePosition = sourceVertices->at(vertexId);\n\n    for(unsigned int i = 0; i < weightMap.size(); i++)\n    {\n        position += weightMap.at(i).weight * (graph.at(weightMap.at(i).node)->rotation * (sourcePosition - graph.at(weightMap.at(i).node)->position) +\n                                              graph.at(weightMap.at(i).node)->position + graph.at(weightMap.at(i).node)->translation);\n    }\n}\n\nfloat DeformationGraph::nonRelativeConstraintError()\n{\n    float result = 0;\n\n    for(unsigned int l = 0; l < constraints.size(); l++)\n    {\n        if(!constraints.at(l).relative)\n        {\n            Eigen::Vector3f position;\n            computeVertexPosition(constraints.at(l).vertexId, position);\n            result += (position - constraints.at(l).targetPosition).norm();\n        }\n    }\n\n    return result / constraints.size();\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Utils/DeformationGraph.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef DEFORMATIONGRAPH_H_\n#define DEFORMATIONGRAPH_H_\n\n#include <vector>\n\n#include \"Stopwatch.h\"\n#include \"GraphNode.h\"\n#include \"Jacobian.h\"\n\n/**\n * This is basically and object-oriented type approach. Using an array based approach would be faster...\n */\n\nclass CholeskyDecomp;\n\nclass DeformationGraph\n{\n    public:\n        DeformationGraph(int k, std::vector<Eigen::Vector3f> * sourceVertices);\n        virtual ~DeformationGraph();\n\n        void initialiseGraph(std::vector<Eigen::Vector3f> * customGraph,\n                             std::vector<unsigned long long int> * graphTimeMap);\n\n        void appendVertices(std::vector<unsigned long long int> * vertexTimeMap, unsigned int originalPointEnd);\n\n        //This clears the pose map...\n        void setPosesSeq(std::vector<unsigned long long int> * poseTimeMap, const std::vector<Eigen::Matrix4f> & poses);\n\n        //Stores a weight and node pointer for a vertex\n        class VertexWeightMap\n        {\n            public:\n                VertexWeightMap(double weight, int node)\n                : weight(weight),\n                  node(node),\n                  relative(false)\n                {}\n\n                double weight;\n                int node;\n                bool relative;\n\n                /**\n                 * BubblesortLOL\n                 * @param list\n                 * @param graph\n                 */\n                static void sort(std::vector<VertexWeightMap> & list, std::vector<GraphNode *> & graph)\n                {\n                    bool done = false;\n\n                    int size = list.size();\n\n                    while(!done)\n                    {\n                        done = true;\n                        for(int i = 0; i < size - 1; i++)\n                        {\n                            if(graph.at(list[i].node)->id > graph.at(list[i + 1].node)->id)\n                            {\n                                done = false;\n                                std::swap(list[i], list[i + 1]);\n                            }\n                        }\n                        size--;\n                    }\n                }\n        };\n\n        std::vector<GraphNode *> & getGraph();\n        std::vector<unsigned long long int> & getGraphTimes();\n\n        void addConstraint(int vertexId, Eigen::Vector3f & target);\n        void addRelativeConstraint(int vertexId, int targetId);\n\n        void clearConstraints();\n\n        void applyGraphToVertices();\n        void applyGraphToPoses(std::vector<Eigen::Matrix4f*> & poses);\n\n        bool optimiseGraphSparse(float & error, float & meanConsErr, const bool fernMatch, const unsigned long long int lastDeformTime);\n        void resetGraph();\n\n        bool isInit()\n        {\n            return initialised;\n        }\n\n        //Number of neighbours\n        const int k;\n\n    private:\n        bool initialised;\n\n        //From paper\n        const double wRot;\n        const double wReg;\n        const double wCon;\n\n        static const int numVariables = 12;\n        static const int eRotRows = 6;\n        static const int eRegRows = 3;\n        static const int eConRows = 3;\n\n        //Graph itself\n        std::vector<GraphNode> graphNodes;\n        std::vector<GraphNode *> graph;\n\n        //Maps vertex indices to neighbours and weights\n        std::vector<std::vector<VertexWeightMap> > vertexMap;\n        std::vector<Eigen::Vector3f> * sourceVertices;\n\n        //Maps pose indices to neighbours and weights\n        std::vector<std::vector<VertexWeightMap> > poseMap;\n\n        //Stores a vertex constraint\n        class Constraint\n        {\n            public:\n                Constraint(int vertexId,\n                           Eigen::Vector3f & targetPosition)\n                 : vertexId(vertexId),\n                   targetPosition(targetPosition),\n                   relative(false),\n                   targetId(-1)\n                {}\n\n                Constraint(int vertexId,\n                           int targetId)\n                 : vertexId(vertexId),\n                   targetPosition(Eigen::Vector3f::Zero()),\n                   relative(true),\n                   targetId(targetId)\n                {}\n\n                int vertexId;\n                Eigen::Vector3f targetPosition;\n                bool relative;\n                int targetId;\n        };\n\n        std::vector<Constraint> constraints;\n\n        std::vector<Eigen::Vector3f> * graphCloud;\n        std::vector<unsigned long long int> sampledGraphTimes;\n        unsigned int lastPointCount;\n\n        void connectGraphSeq();\n\n        void weightVerticesSeq(std::vector<unsigned long long int> * vertexTimeMap);\n\n        void computeVertexPosition(int vertexId, Eigen::Vector3f & position);\n\n        void sparseJacobian(Jacobian & jacobian, const int numRows, const int numCols, const int backSet);\n\n        Eigen::VectorXd sparseResidual(const int maxRows);\n\n        void applyDeltaSparse(Eigen::VectorXd & delta);\n\n        CholeskyDecomp * cholesky;\n\n        float nonRelativeConstraintError();\n};\n\n#endif /* DEFORMATIONGRAPH_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Utils/GPUConfig.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n * This file contains a mapping between GPU identifier strings given by CUDA\n * and optimal thread/block pairs for the tracking reductions. If your GPU\n * isn't here, run the GPUTest program I've included in the code base.\n */\n\n#ifndef GPUCONFIG_H_\n#define GPUCONFIG_H_\n\n#include <cassert>\n#include <map>\n#include <cuda_runtime_api.h>\n#include \"../Cuda/convenience.cuh\"\n\nclass GPUConfig\n{\n    public:\n        static GPUConfig & getInstance()\n        {\n            static GPUConfig instance;\n            return instance;\n        }\n\n        int icpStepThreads;\n        int icpStepBlocks;\n\n        int rgbStepThreads;\n        int rgbStepBlocks;\n\n        int rgbResThreads;\n        int rgbResBlocks;\n\n        int so3StepThreads;\n        int so3StepBlocks;\n\n    private:\n        GPUConfig()\n         : icpStepThreads(128),\n           icpStepBlocks(112),\n           rgbStepThreads(128),\n           rgbStepBlocks(112),\n           rgbResThreads(256),\n           rgbResBlocks(336),\n           so3StepThreads(160),\n           so3StepBlocks(64)\n        {\n            cudaDeviceProp prop;\n\n            cudaSafeCall(cudaGetDeviceProperties(&prop, 0));\n\n            std::string dev(prop.name);\n\n            icpStepMap[\"GeForce GTX 780 Ti\"] = std::pair<int, int>(128, 112);\n            rgbStepMap[\"GeForce GTX 780 Ti\"] = std::pair<int, int>(128, 112);\n            rgbResMap[\"GeForce GTX 780 Ti\"] = std::pair<int, int>(256, 336);\n            so3StepMap[\"GeForce GTX 780 Ti\"] = std::pair<int, int>(160, 64);\n\n            icpStepMap[\"GeForce GTX 880M\"] = std::pair<int, int>(512, 16);\n            rgbStepMap[\"GeForce GTX 880M\"] = std::pair<int, int>(512, 16);\n            rgbResMap[\"GeForce GTX 880M\"] = std::pair<int, int>(256, 64);\n            so3StepMap[\"GeForce GTX 880M\"] = std::pair<int, int>(384, 16);\n\n            icpStepMap[\"GeForce GTX 980\"] = std::pair<int, int>(512, 32);\n            rgbStepMap[\"GeForce GTX 980\"] = std::pair<int, int>(160, 64);\n            rgbResMap[\"GeForce GTX 980\"] = std::pair<int, int>(128, 512);\n            so3StepMap[\"GeForce GTX 980\"] = std::pair<int, int>(240, 48);\n\n            icpStepMap[\"GeForce GTX 970\"] = std::pair<int, int>(128, 48);\n            rgbStepMap[\"GeForce GTX 970\"] = std::pair<int, int>(160, 64);\n            rgbResMap[\"GeForce GTX 970\"] = std::pair<int, int>(128, 272);\n            so3StepMap[\"GeForce GTX 970\"] = std::pair<int, int>(96, 64);\n               \n            icpStepMap[\"GeForce GTX 965M\"] = std::pair<int, int>(256, 32);\n            rgbStepMap[\"GeForce GTX 965M\"] = std::pair<int, int>(224, 16);\n            rgbResMap[\"GeForce GTX 965M\"] = std::pair<int, int>(384, 480);\n            so3StepMap[\"GeForce GTX 965M\"] = std::pair<int, int>(160, 32);\n\n            icpStepMap[\"GeForce GTX 675MX\"] = std::pair<int, int>(128, 80);\n            rgbStepMap[\"GeForce GTX 675MX\"] = std::pair<int, int>(128, 48);\n            rgbResMap[\"GeForce GTX 675MX\"] = std::pair<int, int>(128, 80);\n            so3StepMap[\"GeForce GTX 675MX\"] = std::pair<int, int>(128, 32);\n\n            icpStepMap[\"Quadro K620M\"] = std::pair<int, int>(32, 48);\n            rgbStepMap[\"Quadro K620M\"] = std::pair<int, int>(128, 16);\n            rgbResMap[\"Quadro K620M\"] = std::pair<int, int>(448, 48);\n            so3StepMap[\"Quadro K620M\"] = std::pair<int, int>(32, 48);\n\n            icpStepMap[\"GeForce GTX TITAN\"] = std::pair<int, int>(128, 96);\n            rgbStepMap[\"GeForce GTX TITAN\"] = std::pair<int, int>(112, 96);\n            rgbResMap[\"GeForce GTX TITAN\"] = std::pair<int, int>(256, 416);\n            so3StepMap[\"GeForce GTX TITAN\"] = std::pair<int, int>(128, 64);\n\n            icpStepMap[\"GeForce GTX TITAN X\"] = std::pair<int, int>(256, 96);\n            rgbStepMap[\"GeForce GTX TITAN X\"] = std::pair<int, int>(256, 64);\n            rgbResMap[\"GeForce GTX TITAN X\"] = std::pair<int, int>(96, 496);\n            so3StepMap[\"GeForce GTX TITAN X\"] = std::pair<int, int>(432, 48);\n\n            icpStepMap[\"GeForce GTX 980 Ti\"] = std::pair<int, int>(320, 64);\n            rgbStepMap[\"GeForce GTX 980 Ti\"] = std::pair<int, int>(128, 96);\n            rgbResMap[\"GeForce GTX 980 Ti\"] = std::pair<int, int>(224, 384);\n            so3StepMap[\"GeForce GTX 980 Ti\"] = std::pair<int, int>(432, 48);\n\n            icpStepMap[\"GeForce GTX 1070\"] = std::pair<int, int>(64, 240);\n            rgbStepMap[\"GeForce GTX 1070\"] = std::pair<int, int>(128, 96);\n            rgbResMap[\"GeForce GTX 1070\"] = std::pair<int, int>(256, 464);\n            so3StepMap[\"GeForce GTX 1070\"] = std::pair<int, int>(256, 48);\n\n            if(icpStepMap.find(dev) == icpStepMap.end())\n            {\n                std::stringstream strs;\n                strs << \"Your GPU \\\"\" << dev << \"\\\" isn't in the ICP Step performance database, please add it\";\n                std::cout << strs.str() << std::endl;\n            }\n            else\n            {\n                icpStepThreads = icpStepMap[dev].first;\n                icpStepBlocks = icpStepMap[dev].second;\n            }\n\n            if(rgbStepMap.find(dev) == rgbStepMap.end())\n            {\n                std::stringstream strs;\n                strs << \"Your GPU \\\"\" << dev << \"\\\" isn't in the RGB Step performance database, please add it\";\n                std::cout << strs.str() << std::endl;\n            }\n            else\n            {\n                rgbStepThreads = rgbStepMap[dev].first;\n                rgbStepBlocks = rgbStepMap[dev].second;\n            }\n\n            if(rgbResMap.find(dev) == rgbResMap.end())\n            {\n                std::stringstream strs;\n                strs << \"Your GPU \\\"\" << dev << \"\\\" isn't in the RGB Res performance database, please add it\";\n                std::cout << strs.str() << std::endl;\n            }\n            else\n            {\n                rgbResThreads = rgbResMap[dev].first;\n                rgbResBlocks = rgbResMap[dev].second;\n            }\n\n            if(so3StepMap.find(dev) == so3StepMap.end())\n            {\n                std::stringstream strs;\n                strs << \"Your GPU \\\"\" << dev << \"\\\" isn't in the SO3 Step performance database, please add it\";\n                std::cout << strs.str() << std::endl;\n            }\n            else\n            {\n                so3StepThreads = so3StepMap[dev].first;\n                so3StepBlocks = so3StepMap[dev].second;\n            }\n        }\n\n        std::map<std::string, std::pair<int, int> > icpStepMap, rgbStepMap, rgbResMap, so3StepMap;\n};\n\n#endif /* GPUCONFIG_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Utils/GraphNode.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef GRAPHNODE_H_\n#define GRAPHNODE_H_\n\n#include <Eigen/Dense>\n\nclass GraphNode\n{\n    public:\n        EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n        GraphNode()\n        {}\n\n        int id;\n        Eigen::Vector3f position;\n        Eigen::Matrix3f rotation;\n        Eigen::Vector3f translation;\n        std::vector<int> neighbours;\n        bool enabled;\n};\n\n#endif /* GRAPHNODE_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Utils/Img.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef UTILS_IMG_H_\n#define UTILS_IMG_H_\n\n#include <Eigen/Core>\n\ntemplate <class T>\nclass Img\n{\n    public:\n        Img(const int rows, const int cols)\n         : rows(rows),\n           cols(cols),\n           data(new unsigned char[rows * cols * sizeof(T)]),\n           owned(true)\n        {}\n\n        Img(const int rows, const int cols, T * data)\n         : rows(rows),\n           cols(cols),\n           data((unsigned char *)data),\n           owned(false)\n        {}\n\n        virtual ~Img()\n        {\n            if(owned)\n            {\n                delete [] data;\n            }\n        }\n\n        const int rows;\n        const int cols;\n        unsigned char * data;\n        const bool owned;\n\n        template<typename V> inline\n        V & at(const int i)\n        {\n            return ((V*)data)[i];\n        }\n\n        template<typename V> inline\n        V & at(const int row, const int col)\n        {\n            return ((V*)data)[cols * row + col];\n        }\n\n        template<typename V> inline const\n        V & at(const int row, const int col) const\n        {\n            return ((const V*)data)[cols * row + col];\n        }\n};\n\n#endif /* UTILS_IMG_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Utils/Intrinsics.cpp",
    "content": "/*\n* This file was written for porting ElasticFusion to windows\n* by Filip Srajer (filip.srajer@inf.ethz.ch).\n*\n*/\n\n#include \"Intrinsics.h\"\n\nconst Intrinsics & Intrinsics::getInstance(float fx,float fy,float cx,float cy)\n{\n  static const Intrinsics instance(fx,fy,cx,cy);\n  return instance;\n}\n\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Utils/Intrinsics.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef INTRINSICS_H_\n#define INTRINSICS_H_\n\n#include <cassert>\n\n#include \"../Defines.h\"\n\nclass Intrinsics\n{\n    public:\n        EFUSION_API static const Intrinsics & getInstance(float fx = 0,float fy = 0,float cx = 0,float cy = 0);\n\n        const float & fx() const\n        {\n            return fx_;\n        }\n\n        const float & fy() const\n        {\n            return fy_;\n        }\n\n        const float & cx() const\n        {\n            return cx_;\n        }\n\n        const float & cy() const\n        {\n            return cy_;\n        }\n\n    private:\n        Intrinsics(float fx, float fy, float cx, float cy)\n         : fx_(fx),\n           fy_(fy),\n           cx_(cx),\n           cy_(cy)\n        {\n            assert(fx != 0 && fy != 0 && \"You haven't initialised the Intrinsics class!\");\n        }\n\n        const float fx_, fy_, cx_, cy_;\n};\n\n#endif /* INTRINSICS_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Utils/Jacobian.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef UTILS_JACOBIAN_H_\n#define UTILS_JACOBIAN_H_\n\n#include <vector>\n\n#include \"OrderedJacobianRow.h\"\n\nclass Jacobian\n{\n    public:\n        Jacobian()\n         : columns(0)\n        {}\n\n        virtual ~Jacobian()\n        {\n            reset();\n        }\n\n        void assign(std::vector<OrderedJacobianRow*> & rows, const int columns)\n        {\n            reset();\n            this->rows = rows;\n            this->columns = columns;\n        }\n\n        int cols() const\n        {\n            return columns;\n        }\n\n        int nonZero() const\n        {\n            int count = 0;\n            for(size_t i = 0; i < rows.size(); i++)\n            {\n                count += rows[i]->nonZeros();\n            }\n            return count;\n        }\n\n        std::vector<OrderedJacobianRow*> rows;\n\n    private:\n        int columns;\n\n        void reset()\n        {\n            for(size_t i = 0; i < rows.size(); i++)\n            {\n                delete rows[i];\n            }\n            rows.clear();\n        }\n};\n\n\n\n#endif /* UTILS_JACOBIAN_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Utils/OdometryProvider.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef ODOMETRYPROVIDER_H_\n#define ODOMETRYPROVIDER_H_\n\n#include <Eigen/Core>\n#include <Eigen/Dense>\n#include <float.h>\n\nclass OdometryProvider\n{\n    public:\n        OdometryProvider()\n        {}\n\n        virtual ~OdometryProvider()\n        {}\n\n        static inline Eigen::Matrix<double, 3, 3, Eigen::RowMajor> rodrigues(const Eigen::Vector3d & src)\n        {\n            Eigen::Matrix<double, 3, 3, Eigen::RowMajor> dst = Eigen::Matrix<double, 3, 3, Eigen::RowMajor>::Identity();\n\n            double rx, ry, rz, theta;\n\n            rx = src(0);\n            ry = src(1);\n            rz = src(2);\n\n            theta = src.norm();\n\n            if(theta >= DBL_EPSILON)\n            {\n                const double I[] = { 1, 0, 0, 0, 1, 0, 0, 0, 1 };\n\n                double c = cos(theta);\n                double s = sin(theta);\n                double c1 = 1. - c;\n                double itheta = theta ? 1./theta : 0.;\n\n                rx *= itheta; ry *= itheta; rz *= itheta;\n\n                double rrt[] = { rx*rx, rx*ry, rx*rz, rx*ry, ry*ry, ry*rz, rx*rz, ry*rz, rz*rz };\n                double _r_x_[] = { 0, -rz, ry, rz, 0, -rx, -ry, rx, 0 };\n                double R[9];\n\n                for(int k = 0; k < 9; k++)\n                {\n                    R[k] = c*I[k] + c1*rrt[k] + s*_r_x_[k];\n                }\n\n                memcpy(dst.data(), &R[0], sizeof(Eigen::Matrix<double, 3, 3, Eigen::RowMajor>));\n            }\n\n            return dst;\n        }\n\n        static inline void computeUpdateSE3(Eigen::Matrix<double, 4, 4, Eigen::RowMajor> & resultRt, const Eigen::Matrix<double, 6, 1> & result, Eigen::Isometry3f & rgbOdom)\n        {\n            // for infinitesimal transformation\n            Eigen::Matrix<double, 4, 4, Eigen::RowMajor> Rt = Eigen::Matrix<double, 4, 4, Eigen::RowMajor>::Identity();\n\n            Eigen::Vector3d rvec(result(3), result(4), result(5));\n\n            Eigen::Matrix<double, 3, 3, Eigen::RowMajor> R = rodrigues(rvec);\n\n            Rt.topLeftCorner(3, 3) = R;\n            Rt(0, 3) = result(0);\n            Rt(1, 3) = result(1);\n            Rt(2, 3) = result(2);\n\n            resultRt = Rt * resultRt;\n\n            Eigen::Matrix<double, 3, 3, Eigen::RowMajor> rotation = resultRt.topLeftCorner(3, 3);\n            rgbOdom.setIdentity();\n            rgbOdom.rotate(rotation.cast<float>().eval());\n            rgbOdom.translation() = resultRt.cast<float>().eval().topRightCorner(3, 1);\n        }\n};\n\n#endif /* ODOMETRYPROVIDER_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Utils/OrderedJacobianRow.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef UTILS_ORDEREDJACOBIANROW_H_\n#define UTILS_ORDEREDJACOBIANROW_H_\n\n#include <cassert>\n#include <unordered_map>\n\nclass OrderedJacobianRow\n{\n    public:\n        OrderedJacobianRow(const int nonZeros)\n         : indices(new int[nonZeros]),\n           vals(new double[nonZeros]),\n           lastSlot(0),\n           lastIndex(-1),\n           maxNonZero(nonZeros)\n        {}\n\n        virtual ~OrderedJacobianRow()\n        {\n            delete [] indices;\n            delete [] vals;\n        }\n\n        //You have to use this in an ordered fashion for efficiency :)\n        void append(const int index, const double value)\n        {\n            assert(index > lastIndex);\n            indexSlotMap[index] = lastSlot;\n            indices[lastSlot] = index;\n            vals[lastSlot] = value;\n            lastSlot++;\n            lastIndex = index;\n        }\n\n        //To add to an existing and already weighted value\n        void addTo(const int index, const double value, const double weight)\n        {\n            double & val = vals[indexSlotMap[index]];\n            val = ((val / weight) + value) * weight;\n        }\n\n        int nonZeros()\n        {\n            return lastSlot;\n        }\n\n        int * indices;\n        double * vals;\n\n    private:\n        int lastSlot;\n        int lastIndex;\n        const int maxNonZero;\n        std::unordered_map<int, int> indexSlotMap;\n};\n\n\n#endif /* UTILS_ORDEREDJACOBIANROW_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Utils/Parse.cpp",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#include \"Parse.h\"\n\nParse::Parse()\n{\n\n}\n\nconst Parse & Parse::get()\n{\n  static const Parse instance;\n  return instance;\n}\n\nint Parse::arg(int argc, char** argv, const char* str, std::string &val) const\n{\n    int index = findArg(argc, argv, str) + 1;\n\n    if(index > 0 && index < argc)\n    {\n        val = argv[index];\n    }\n\n    return index - 1;\n}\n\nint Parse::arg(int argc, char** argv, const char* str, float &val) const\n{\n    int index = findArg(argc, argv, str) + 1;\n\n    if(index > 0 && index < argc)\n    {\n        val = atof(argv[index]);\n    }\n\n    return index - 1;\n}\n\nint Parse::arg(int argc, char** argv, const char* str, int &val) const\n{\n    int index = findArg(argc, argv, str) + 1;\n\n    if(index > 0 && index < argc)\n    {\n        val = atoi(argv[index]);\n    }\n\n    return index - 1;\n}\n\nstd::string Parse::shaderDir() const\n{\n    std::string currentVal = STR(SHADER_DIR);\n\n    assert(pangolin::FileExists(currentVal) && \"Shader directory not found!\");\n\n    return currentVal;\n}\n\nstd::string Parse::baseDir() const\n{\n    char buf[256];\n#ifdef WIN32\n    int length = GetModuleFileName(NULL,buf,sizeof(buf));\n#else\n    int length = readlink(\"/proc/self/exe\",buf,sizeof(buf));\n#endif\n    std::string currentVal;\n    currentVal.append((char *)&buf, length);\n\n    currentVal = currentVal.substr(0, currentVal\n#ifdef WIN32\n      .rfind(\"\\\\build\\\\\"));\n#else\n      .rfind(\"/build/\"));\n#endif\n    return currentVal;\n}\n\nint Parse::findArg(int argc, char** argv, const char* argument_name) const\n{\n    for(int i = 1; i < argc; ++i)\n    {\n        // Search for the string\n        if(strcmp(argv[i], argument_name) == 0)\n        {\n            return i;\n        }\n    }\n    return -1;\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Utils/Parse.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n#ifndef PARSE_H_\n#define PARSE_H_\n\n#ifdef WIN32\n#  include <Windows.h>\n#else\n#  include <dirent.h>\n#endif\n\n#include <string>\n#include <cassert>\n#ifndef WIN32\n#  include <unistd.h>\n#endif\n#include <string.h>\n#include <pangolin/utils/file_utils.h>\n\n#include \"../Defines.h\"\n\n#define XSTR(x) #x\n#define STR(x) XSTR(x)\n\nclass Parse\n{\n    public:\n        EFUSION_API static const Parse & get();\n\n        EFUSION_API int arg(int argc, char** argv, const char* str, std::string &val) const;\n\n        EFUSION_API int arg(int argc, char** argv, const char* str, float &val) const;\n\n        EFUSION_API int arg(int argc, char** argv, const char* str, int &val) const;\n\n        EFUSION_API std::string shaderDir() const;\n\n        EFUSION_API std::string baseDir() const;\n\n    private:\n        EFUSION_API Parse();\n\n        EFUSION_API int findArg(int argc,char** argv,const char* argument_name) const;\n};\n\n#endif /* PARSE_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Utils/RGBDOdometry.cpp",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#include \"RGBDOdometry.h\"\n\nRGBDOdometry::RGBDOdometry(int width,\n                           int height,\n                           float cx, float cy, float fx, float fy,\n                           float distThresh,\n                           float angleThresh)\n: lastICPError(0),\n  lastICPCount(width * height),\n  lastRGBError(0),\n  lastRGBCount(width * height),\n  lastSO3Error(0),\n  lastSO3Count(width * height),\n  lastA(Eigen::Matrix<double, 6, 6, Eigen::RowMajor>::Zero()),\n  lastb(Eigen::Matrix<double, 6, 1>::Zero()),\n  sobelSize(3),\n  sobelScale(1.0 / pow(2.0, sobelSize)),\n  maxDepthDeltaRGB(0.07),\n  maxDepthRGB(6.0),\n  distThres_(distThresh),\n  angleThres_(angleThresh),\n  width(width),\n  height(height),\n  cx(cx), cy(cy), fx(fx), fy(fy)\n{\n    sumDataSE3.create(MAX_THREADS);\n    outDataSE3.create(1);\n    sumResidualRGB.create(MAX_THREADS);\n\n    sumDataSO3.create(MAX_THREADS);\n    outDataSO3.create(1);\n\n    for(int i = 0; i < NUM_PYRS; i++)\n    {\n        int2 nextDim = {height >> i, width >> i};\n        pyrDims.push_back(nextDim);\n    }\n\n    for(int i = 0; i < NUM_PYRS; i++)\n    {\n        lastDepth[i].create(pyrDims.at(i).x, pyrDims.at(i).y);\n        lastImage[i].create(pyrDims.at(i).x, pyrDims.at(i).y);\n\n        nextDepth[i].create(pyrDims.at(i).x, pyrDims.at(i).y);\n        nextImage[i].create(pyrDims.at(i).x, pyrDims.at(i).y);\n\n        lastNextImage[i].create(pyrDims.at(i).x, pyrDims.at(i).y);\n\n        nextdIdx[i].create(pyrDims.at(i).x, pyrDims.at(i).y);\n        nextdIdy[i].create(pyrDims.at(i).x, pyrDims.at(i).y);\n\n        pointClouds[i].create(pyrDims.at(i).x, pyrDims.at(i).y);\n\n        corresImg[i].create(pyrDims.at(i).x, pyrDims.at(i).y);\n    }\n\n    intr.cx = cx;\n    intr.cy = cy;\n    intr.fx = fx;\n    intr.fy = fy;\n\n    iterations.resize(NUM_PYRS);\n\n    depth_tmp.resize(NUM_PYRS);\n\n    vmaps_g_prev_.resize(NUM_PYRS);\n    nmaps_g_prev_.resize(NUM_PYRS);\n\n    vmaps_curr_.resize(NUM_PYRS);\n    nmaps_curr_.resize(NUM_PYRS);\n\n    for (int i = 0; i < NUM_PYRS; ++i)\n    {\n        int pyr_rows = height >> i;\n        int pyr_cols = width >> i;\n\n        depth_tmp[i].create (pyr_rows, pyr_cols);\n\n        vmaps_g_prev_[i].create (pyr_rows*3, pyr_cols);\n        nmaps_g_prev_[i].create (pyr_rows*3, pyr_cols);\n\n        vmaps_curr_[i].create (pyr_rows*3, pyr_cols);\n        nmaps_curr_[i].create (pyr_rows*3, pyr_cols);\n    }\n\n    vmaps_tmp.create(height * 4 * width);\n    nmaps_tmp.create(height * 4 * width);\n\n    minimumGradientMagnitudes.resize(NUM_PYRS);\n    minimumGradientMagnitudes[0] = 5;\n    minimumGradientMagnitudes[1] = 3;\n    minimumGradientMagnitudes[2] = 1;\n}\n\nRGBDOdometry::~RGBDOdometry()\n{\n\n}\n\nvoid RGBDOdometry::initICP(GPUTexture * filteredDepth, const float depthCutoff)\n{\n    cudaArray * textPtr;\n\n    cudaGraphicsMapResources(1, &filteredDepth->cudaRes);\n\n    cudaGraphicsSubResourceGetMappedArray(&textPtr, filteredDepth->cudaRes, 0, 0);\n\n    cudaMemcpy2DFromArray(depth_tmp[0].ptr(0), depth_tmp[0].step(), textPtr, 0, 0, depth_tmp[0].colsBytes(), depth_tmp[0].rows(), cudaMemcpyDeviceToDevice);\n\n    cudaGraphicsUnmapResources(1, &filteredDepth->cudaRes);\n\n    for(int i = 1; i < NUM_PYRS; ++i)\n    {\n        pyrDown(depth_tmp[i - 1], depth_tmp[i]);\n    }\n\n    for(int i = 0; i < NUM_PYRS; ++i)\n    {\n        createVMap(intr(i), depth_tmp[i], vmaps_curr_[i], depthCutoff);\n        createNMap(vmaps_curr_[i], nmaps_curr_[i]);\n    }\n\n    cudaDeviceSynchronize();\n}\n\nvoid RGBDOdometry::initICP(GPUTexture * predictedVertices, GPUTexture * predictedNormals, const float depthCutoff)\n{\n    cudaArray * textPtr;\n\n    cudaGraphicsMapResources(1, &predictedVertices->cudaRes);\n    cudaGraphicsSubResourceGetMappedArray(&textPtr, predictedVertices->cudaRes, 0, 0);\n    cudaMemcpyFromArray(vmaps_tmp.ptr(), textPtr, 0, 0, vmaps_tmp.sizeBytes(), cudaMemcpyDeviceToDevice);\n    cudaGraphicsUnmapResources(1, &predictedVertices->cudaRes);\n\n    cudaGraphicsMapResources(1, &predictedNormals->cudaRes);\n    cudaGraphicsSubResourceGetMappedArray(&textPtr, predictedNormals->cudaRes, 0, 0);\n    cudaMemcpyFromArray(nmaps_tmp.ptr(), textPtr, 0, 0, nmaps_tmp.sizeBytes(), cudaMemcpyDeviceToDevice);\n    cudaGraphicsUnmapResources(1, &predictedNormals->cudaRes);\n\n    copyMaps(vmaps_tmp, nmaps_tmp, vmaps_curr_[0], nmaps_curr_[0]);\n\n    for(int i = 1; i < NUM_PYRS; ++i)\n    {\n        resizeVMap(vmaps_curr_[i - 1], vmaps_curr_[i]);\n        resizeNMap(nmaps_curr_[i - 1], nmaps_curr_[i]);\n    }\n\n    cudaDeviceSynchronize();\n}\n\nvoid RGBDOdometry::initICPModel(GPUTexture * predictedVertices,\n                                GPUTexture * predictedNormals,\n                                const float depthCutoff,\n                                const Eigen::Matrix4f & modelPose)\n{\n    cudaArray * textPtr;\n\n    cudaGraphicsMapResources(1, &predictedVertices->cudaRes);\n    cudaGraphicsSubResourceGetMappedArray(&textPtr, predictedVertices->cudaRes, 0, 0);\n    cudaMemcpyFromArray(vmaps_tmp.ptr(), textPtr, 0, 0, vmaps_tmp.sizeBytes(), cudaMemcpyDeviceToDevice);\n    cudaGraphicsUnmapResources(1, &predictedVertices->cudaRes);\n\n    cudaGraphicsMapResources(1, &predictedNormals->cudaRes);\n    cudaGraphicsSubResourceGetMappedArray(&textPtr, predictedNormals->cudaRes, 0, 0);\n    cudaMemcpyFromArray(nmaps_tmp.ptr(), textPtr, 0, 0, nmaps_tmp.sizeBytes(), cudaMemcpyDeviceToDevice);\n    cudaGraphicsUnmapResources(1, &predictedNormals->cudaRes);\n\n    copyMaps(vmaps_tmp, nmaps_tmp, vmaps_g_prev_[0], nmaps_g_prev_[0]);\n\n    for(int i = 1; i < NUM_PYRS; ++i)\n    {\n        resizeVMap(vmaps_g_prev_[i - 1], vmaps_g_prev_[i]);\n        resizeNMap(nmaps_g_prev_[i - 1], nmaps_g_prev_[i]);\n    }\n\n    Eigen::Matrix<float, 3, 3, Eigen::RowMajor> Rcam = modelPose.topLeftCorner(3, 3);\n    Eigen::Vector3f tcam = modelPose.topRightCorner(3, 1);\n\n    mat33 device_Rcam = Rcam;\n    float3 device_tcam = *reinterpret_cast<float3*>(tcam.data());\n\n    for(int i = 0; i < NUM_PYRS; ++i)\n    {\n        tranformMaps(vmaps_g_prev_[i], nmaps_g_prev_[i], device_Rcam, device_tcam, vmaps_g_prev_[i], nmaps_g_prev_[i]);\n    }\n\n    cudaDeviceSynchronize();\n}\n\nvoid RGBDOdometry::populateRGBDData(GPUTexture * rgb,\n                                    DeviceArray2D<float> * destDepths,\n                                    DeviceArray2D<unsigned char> * destImages)\n{\n    verticesToDepth(vmaps_tmp, destDepths[0], maxDepthRGB);\n\n    for(int i = 0; i + 1 < NUM_PYRS; i++)\n    {\n        pyrDownGaussF(destDepths[i], destDepths[i + 1]);\n    }\n\n    cudaArray * textPtr;\n\n    cudaGraphicsMapResources(1, &rgb->cudaRes);\n\n    cudaGraphicsSubResourceGetMappedArray(&textPtr, rgb->cudaRes, 0, 0);\n\n    imageBGRToIntensity(textPtr, destImages[0]);\n\n    cudaGraphicsUnmapResources(1, &rgb->cudaRes);\n\n    for(int i = 0; i + 1 < NUM_PYRS; i++)\n    {\n        pyrDownUcharGauss(destImages[i], destImages[i + 1]);\n    }\n\n    cudaDeviceSynchronize();\n}\n\nvoid RGBDOdometry::initRGBModel(GPUTexture * rgb)\n{\n    //NOTE: This depends on vmaps_tmp containing the corresponding depth from initICPModel\n    populateRGBDData(rgb, &lastDepth[0], &lastImage[0]);\n}\n\nvoid RGBDOdometry::initRGB(GPUTexture * rgb)\n{\n    //NOTE: This depends on vmaps_tmp containing the corresponding depth from initICP\n    populateRGBDData(rgb, &nextDepth[0], &nextImage[0]);\n}\n\nvoid RGBDOdometry::initFirstRGB(GPUTexture * rgb)\n{\n    cudaArray * textPtr;\n\n    cudaGraphicsMapResources(1, &rgb->cudaRes);\n\n    cudaGraphicsSubResourceGetMappedArray(&textPtr, rgb->cudaRes, 0, 0);\n\n    imageBGRToIntensity(textPtr, lastNextImage[0]);\n\n    cudaGraphicsUnmapResources(1, &rgb->cudaRes);\n\n    for(int i = 0; i + 1 < NUM_PYRS; i++)\n    {\n        pyrDownUcharGauss(lastNextImage[i], lastNextImage[i + 1]);\n    }\n}\n\nvoid RGBDOdometry::getIncrementalTransformation(Eigen::Vector3f & trans,\n                                                Eigen::Matrix<float, 3, 3, Eigen::RowMajor> & rot,\n                                                const bool & rgbOnly,\n                                                const float & icpWeight,\n                                                const bool & pyramid,\n                                                const bool & fastOdom,\n                                                const bool & so3)\n{\n    bool icp = !rgbOnly && icpWeight > 0;\n    bool rgb = rgbOnly || icpWeight < 100;\n\n    Eigen::Matrix<float, 3, 3, Eigen::RowMajor> Rprev = rot;\n    Eigen::Vector3f tprev = trans;\n\n    Eigen::Matrix<float, 3, 3, Eigen::RowMajor> Rcurr = Rprev;\n    Eigen::Vector3f tcurr = tprev;\n\n    if(rgb)\n    {\n        for(int i = 0; i < NUM_PYRS; i++)\n        {\n            computeDerivativeImages(nextImage[i], nextdIdx[i], nextdIdy[i]);\n        }\n    }\n\n    Eigen::Matrix<double, 3, 3, Eigen::RowMajor> resultR = Eigen::Matrix<double, 3, 3, Eigen::RowMajor>::Identity();\n\n    if(so3)\n    {\n        int pyramidLevel = 2;\n\n        Eigen::Matrix<float, 3, 3, Eigen::RowMajor> R_lr = Eigen::Matrix<float, 3, 3, Eigen::RowMajor>::Identity();\n\n        Eigen::Matrix<double, 3, 3, Eigen::RowMajor> K = Eigen::Matrix<double, 3, 3, Eigen::RowMajor>::Zero();\n\n        K(0, 0) = intr(pyramidLevel).fx;\n        K(1, 1) = intr(pyramidLevel).fy;\n        K(0, 2) = intr(pyramidLevel).cx;\n        K(1, 2) = intr(pyramidLevel).cy;\n        K(2, 2) = 1;\n\n        float lastError = std::numeric_limits<float>::max() / 2;\n        float lastCount = std::numeric_limits<float>::max() / 2;\n\n        Eigen::Matrix<double, 3, 3, Eigen::RowMajor> lastResultR = Eigen::Matrix<double, 3, 3, Eigen::RowMajor>::Identity();\n\n        for(int i = 0; i < 10; i++)\n        {\n            Eigen::Matrix<float, 3, 3, Eigen::RowMajor> jtj;\n            Eigen::Matrix<float, 3, 1> jtr;\n\n            Eigen::Matrix<double, 3, 3, Eigen::RowMajor> homography = K * resultR * K.inverse();\n\n            mat33 imageBasis;\n            memcpy(&imageBasis.data[0], homography.cast<float>().eval().data(), sizeof(mat33));\n\n            Eigen::Matrix<double, 3, 3, Eigen::RowMajor> K_inv = K.inverse();\n            mat33 kinv;\n            memcpy(&kinv.data[0], K_inv.cast<float>().eval().data(), sizeof(mat33));\n\n            Eigen::Matrix<double, 3, 3, Eigen::RowMajor> K_R_lr = K * resultR;\n            mat33 krlr;\n            memcpy(&krlr.data[0], K_R_lr.cast<float>().eval().data(), sizeof(mat33));\n\n            float residual[2];\n\n            TICK(\"so3Step\");\n            so3Step(lastNextImage[pyramidLevel],\n                    nextImage[pyramidLevel],\n                    imageBasis,\n                    kinv,\n                    krlr,\n                    sumDataSO3,\n                    outDataSO3,\n                    jtj.data(),\n                    jtr.data(),\n                    &residual[0],\n                    GPUConfig::getInstance().so3StepThreads,\n                    GPUConfig::getInstance().so3StepBlocks);\n            TOCK(\"so3Step\");\n\n            lastSO3Error = sqrt(residual[0]) / residual[1];\n            lastSO3Count = residual[1];\n\n            //Converged\n            if(lastSO3Error < lastError && lastCount == lastSO3Count)\n            {\n                break;\n            }\n            else if(lastSO3Error > lastError + 0.001) //Diverging\n            {\n                lastSO3Error = lastError;\n                lastSO3Count = lastCount;\n                resultR = lastResultR;\n                break;\n            }\n\n            lastError = lastSO3Error;\n            lastCount = lastSO3Count;\n            lastResultR = resultR;\n\n            Eigen::Vector3f delta = jtj.ldlt().solve(jtr);\n\n            Eigen::Matrix<double, 3, 3, Eigen::RowMajor> rotUpdate = OdometryProvider::rodrigues(delta.cast<double>());\n\n            R_lr = rotUpdate.cast<float>() * R_lr;\n\n            for(int x = 0; x < 3; x++)\n            {\n                for(int y = 0; y < 3; y++)\n                {\n                    resultR(x, y) = R_lr(x, y);\n                }\n            }\n        }\n    }\n\n    iterations[0] = fastOdom ? 3 : 10;\n    iterations[1] = pyramid ? 5 : 0;\n    iterations[2] = pyramid ? 4 : 0;\n\n    Eigen::Matrix<float, 3, 3, Eigen::RowMajor> Rprev_inv = Rprev.inverse();\n    mat33 device_Rprev_inv = Rprev_inv;\n    float3 device_tprev = *reinterpret_cast<float3*>(tprev.data());\n\n    Eigen::Matrix<double, 4, 4, Eigen::RowMajor> resultRt = Eigen::Matrix<double, 4, 4, Eigen::RowMajor>::Identity();\n\n    if(so3)\n    {\n        for(int x = 0; x < 3; x++)\n        {\n            for(int y = 0; y < 3; y++)\n            {\n                resultRt(x, y) = resultR(x, y);\n            }\n        }\n    }\n\n    for(int i = NUM_PYRS - 1; i >= 0; i--)\n    {\n        if(rgb)\n        {\n            projectToPointCloud(lastDepth[i], pointClouds[i], intr, i);\n        }\n\n        Eigen::Matrix<double, 3, 3, Eigen::RowMajor> K = Eigen::Matrix<double, 3, 3, Eigen::RowMajor>::Zero();\n\n        K(0, 0) = intr(i).fx;\n        K(1, 1) = intr(i).fy;\n        K(0, 2) = intr(i).cx;\n        K(1, 2) = intr(i).cy;\n        K(2, 2) = 1;\n\n        lastRGBError = std::numeric_limits<float>::max();\n\n        for(int j = 0; j < iterations[i]; j++)\n        {\n            Eigen::Matrix<double, 4, 4, Eigen::RowMajor> Rt = resultRt.inverse();\n\n            Eigen::Matrix<double, 3, 3, Eigen::RowMajor> R = Rt.topLeftCorner(3, 3);\n\n            Eigen::Matrix<double, 3, 3, Eigen::RowMajor> KRK_inv = K * R * K.inverse();\n            mat33 krkInv;\n            memcpy(&krkInv.data[0], KRK_inv.cast<float>().eval().data(), sizeof(mat33));\n\n            Eigen::Vector3d Kt = Rt.topRightCorner(3, 1);\n            Kt = K * Kt;\n            float3 kt = {(float)Kt(0), (float)Kt(1), (float)Kt(2)};\n\n            int sigma = 0;\n            int rgbSize = 0;\n\n            if(rgb)\n            {\n                TICK(\"computeRgbResidual\");\n                computeRgbResidual(pow(minimumGradientMagnitudes[i], 2.0) / pow(sobelScale, 2.0),\n                                   nextdIdx[i],\n                                   nextdIdy[i],\n                                   lastDepth[i],\n                                   nextDepth[i],\n                                   lastImage[i],\n                                   nextImage[i],\n                                   corresImg[i],\n                                   sumResidualRGB,\n                                   maxDepthDeltaRGB,\n                                   kt,\n                                   krkInv,\n                                   sigma,\n                                   rgbSize,\n                                   GPUConfig::getInstance().rgbResThreads,\n                                   GPUConfig::getInstance().rgbResBlocks);\n                TOCK(\"computeRgbResidual\");\n            }\n\n            float sigmaVal = std::sqrt((float)sigma / rgbSize == 0 ? 1 : rgbSize);\n            float rgbError = std::sqrt(sigma) / (rgbSize == 0 ? 1 : rgbSize);\n\n            if(rgbOnly && rgbError > lastRGBError)\n            {\n                break;\n            }\n\n            lastRGBError = rgbError;\n            lastRGBCount = rgbSize;\n\n            if(rgbOnly)\n            {\n                sigmaVal = -1; //Signals the internal optimisation to weight evenly\n            }\n\n            Eigen::Matrix<float, 6, 6, Eigen::RowMajor> A_icp;\n            Eigen::Matrix<float, 6, 1> b_icp;\n\n            mat33 device_Rcurr = Rcurr;\n            float3 device_tcurr = *reinterpret_cast<float3*>(tcurr.data());\n\n            DeviceArray2D<float>& vmap_curr = vmaps_curr_[i];\n            DeviceArray2D<float>& nmap_curr = nmaps_curr_[i];\n\n            DeviceArray2D<float>& vmap_g_prev = vmaps_g_prev_[i];\n            DeviceArray2D<float>& nmap_g_prev = nmaps_g_prev_[i];\n\n            float residual[2];\n\n            if(icp)\n            {\n                TICK(\"icpStep\");\n                icpStep(device_Rcurr,\n                        device_tcurr,\n                        vmap_curr,\n                        nmap_curr,\n                        device_Rprev_inv,\n                        device_tprev,\n                        intr(i),\n                        vmap_g_prev,\n                        nmap_g_prev,\n                        distThres_,\n                        angleThres_,\n                        sumDataSE3,\n                        outDataSE3,\n                        A_icp.data(),\n                        b_icp.data(),\n                        &residual[0],\n                        GPUConfig::getInstance().icpStepThreads,\n                        GPUConfig::getInstance().icpStepBlocks);\n                TOCK(\"icpStep\");\n            }\n\n            lastICPError = sqrt(residual[0]) / residual[1];\n            lastICPCount = residual[1];\n\n            Eigen::Matrix<float, 6, 6, Eigen::RowMajor> A_rgbd;\n            Eigen::Matrix<float, 6, 1> b_rgbd;\n\n            if(rgb)\n            {\n                TICK(\"rgbStep\");\n                rgbStep(corresImg[i],\n                        sigmaVal,\n                        pointClouds[i],\n                        intr(i).fx,\n                        intr(i).fy,\n                        nextdIdx[i],\n                        nextdIdy[i],\n                        sobelScale,\n                        sumDataSE3,\n                        outDataSE3,\n                        A_rgbd.data(),\n                        b_rgbd.data(),\n                        GPUConfig::getInstance().rgbStepThreads,\n                        GPUConfig::getInstance().rgbStepBlocks);\n                TOCK(\"rgbStep\");\n            }\n\n            Eigen::Matrix<double, 6, 1> result;\n            Eigen::Matrix<double, 6, 6, Eigen::RowMajor> dA_rgbd = A_rgbd.cast<double>();\n            Eigen::Matrix<double, 6, 6, Eigen::RowMajor> dA_icp = A_icp.cast<double>();\n            Eigen::Matrix<double, 6, 1> db_rgbd = b_rgbd.cast<double>();\n            Eigen::Matrix<double, 6, 1> db_icp = b_icp.cast<double>();\n\n            if(icp && rgb)\n            {\n                double w = icpWeight;\n                lastA = dA_rgbd + w * w * dA_icp;\n                lastb = db_rgbd + w * db_icp;\n                result = lastA.ldlt().solve(lastb);\n            }\n            else if(icp)\n            {\n                lastA = dA_icp;\n                lastb = db_icp;\n                result = lastA.ldlt().solve(lastb);\n            }\n            else if(rgb)\n            {\n                lastA = dA_rgbd;\n                lastb = db_rgbd;\n                result = lastA.ldlt().solve(lastb);\n            }\n            else\n            {\n                assert(false && \"Control shouldn't reach here\");\n            }\n\n            Eigen::Isometry3f rgbOdom;\n\n            OdometryProvider::computeUpdateSE3(resultRt, result, rgbOdom);\n\n            Eigen::Isometry3f currentT;\n            currentT.setIdentity();\n            currentT.rotate(Rprev);\n            currentT.translation() = tprev;\n\n            currentT = currentT * rgbOdom.inverse();\n\n            tcurr = currentT.translation();\n            Rcurr = currentT.rotation();\n        }\n    }\n\n    if(rgb && (tcurr - tprev).norm() > 0.3)\n    {\n        Rcurr = Rprev;\n        tcurr = tprev;\n    }\n\n    if(so3)\n    {\n        for(int i = 0; i < NUM_PYRS; i++)\n        {\n            std::swap(lastNextImage[i], nextImage[i]);\n        }\n    }\n\n    trans = tcurr;\n    rot = Rcurr;\n}\n\nvoid RGBDOdometry::getIncrementalTransformation_withseg(Eigen::Vector3f & trans,\n                                                        Eigen::Matrix<float, 3, 3, Eigen::RowMajor> & rot,\n                                                        const bool & rgbOnly,\n                                                        const float & weight_rgb,\n                                                        const float & weight_seg,\n                                                        const float & icpWeight,\n                                                        const bool & pyramid,\n                                                        const bool & fastOdom,\n                                                        const bool & so3)\n{\n    bool icp = !rgbOnly && icpWeight > 0;\n    bool rgb = rgbOnly || icpWeight < 100;\n\n    Eigen::Matrix<float, 3, 3, Eigen::RowMajor> Rprev = rot;\n    Eigen::Vector3f tprev = trans;\n\n    Eigen::Matrix<float, 3, 3, Eigen::RowMajor> Rcurr = Rprev;\n    Eigen::Vector3f tcurr = tprev;\n\n    if(rgb)\n    {\n        for(int i = 0; i < NUM_PYRS; i++)\n        {\n            computeDerivativeImages(nextImage[i], nextdIdx[i], nextdIdy[i]);\n        }\n    }\n\n    Eigen::Matrix<double, 3, 3, Eigen::RowMajor> resultR = Eigen::Matrix<double, 3, 3, Eigen::RowMajor>::Identity();\n\n    if(so3)\n    {\n        int pyramidLevel = 2;\n\n        Eigen::Matrix<float, 3, 3, Eigen::RowMajor> R_lr = Eigen::Matrix<float, 3, 3, Eigen::RowMajor>::Identity();\n\n        Eigen::Matrix<double, 3, 3, Eigen::RowMajor> K = Eigen::Matrix<double, 3, 3, Eigen::RowMajor>::Zero();\n\n        K(0, 0) = intr(pyramidLevel).fx;\n        K(1, 1) = intr(pyramidLevel).fy;\n        K(0, 2) = intr(pyramidLevel).cx;\n        K(1, 2) = intr(pyramidLevel).cy;\n        K(2, 2) = 1;\n\n        float lastError = std::numeric_limits<float>::max() / 2;\n        float lastCount = std::numeric_limits<float>::max() / 2;\n\n        Eigen::Matrix<double, 3, 3, Eigen::RowMajor> lastResultR = Eigen::Matrix<double, 3, 3, Eigen::RowMajor>::Identity();\n\n        for(int i = 0; i < 10; i++)\n        {\n            Eigen::Matrix<float, 3, 3, Eigen::RowMajor> jtj;\n            Eigen::Matrix<float, 3, 1> jtr;\n\n            Eigen::Matrix<double, 3, 3, Eigen::RowMajor> homography = K * resultR * K.inverse();\n\n            mat33 imageBasis;\n            memcpy(&imageBasis.data[0], homography.cast<float>().eval().data(), sizeof(mat33));\n\n            Eigen::Matrix<double, 3, 3, Eigen::RowMajor> K_inv = K.inverse();\n            mat33 kinv;\n            memcpy(&kinv.data[0], K_inv.cast<float>().eval().data(), sizeof(mat33));\n\n            Eigen::Matrix<double, 3, 3, Eigen::RowMajor> K_R_lr = K * resultR;\n            mat33 krlr;\n            memcpy(&krlr.data[0], K_R_lr.cast<float>().eval().data(), sizeof(mat33));\n\n            float residual[2];\n\n            TICK(\"so3Step\");\n            so3Step(lastNextImage[pyramidLevel],\n                    nextImage[pyramidLevel],\n                    imageBasis,\n                    kinv,\n                    krlr,\n                    sumDataSO3,\n                    outDataSO3,\n                    jtj.data(),\n                    jtr.data(),\n                    &residual[0],\n                    GPUConfig::getInstance().so3StepThreads,\n                    GPUConfig::getInstance().so3StepBlocks);\n            TOCK(\"so3Step\");\n\n            lastSO3Error = sqrt(residual[0]) / residual[1];\n            lastSO3Count = residual[1];\n\n            //Converged\n            if(lastSO3Error < lastError && lastCount == lastSO3Count)\n            {\n                break;\n            }\n            else if(lastSO3Error > lastError + 0.001) //Diverging\n            {\n                lastSO3Error = lastError;\n                lastSO3Count = lastCount;\n                resultR = lastResultR;\n                break;\n            }\n\n            lastError = lastSO3Error;\n            lastCount = lastSO3Count;\n            lastResultR = resultR;\n\n            Eigen::Vector3f delta = jtj.ldlt().solve(jtr);\n\n            Eigen::Matrix<double, 3, 3, Eigen::RowMajor> rotUpdate = OdometryProvider::rodrigues(delta.cast<double>());\n\n            R_lr = rotUpdate.cast<float>() * R_lr;\n\n            for(int x = 0; x < 3; x++)\n            {\n                for(int y = 0; y < 3; y++)\n                {\n                    resultR(x, y) = R_lr(x, y);\n                }\n            }\n        }\n    }\n\n    iterations[0] = fastOdom ? 3 : 10;\n    iterations[1] = pyramid ? 5 : 0;\n    iterations[2] = pyramid ? 4 : 0;\n\n    Eigen::Matrix<float, 3, 3, Eigen::RowMajor> Rprev_inv = Rprev.inverse();\n    mat33 device_Rprev_inv = Rprev_inv;\n    float3 device_tprev = *reinterpret_cast<float3*>(tprev.data());\n\n    Eigen::Matrix<double, 4, 4, Eigen::RowMajor> resultRt = Eigen::Matrix<double, 4, 4, Eigen::RowMajor>::Identity();\n\n    if(so3)\n    {\n        for(int x = 0; x < 3; x++)\n        {\n            for(int y = 0; y < 3; y++)\n            {\n                resultRt(x, y) = resultR(x, y);\n            }\n        }\n    }\n\n    for(int i = NUM_PYRS - 1; i >= 0; i--)\n    {\n        if(rgb)\n        {\n            projectToPointCloud(lastDepth[i], pointClouds[i], intr, i);\n        }\n\n        Eigen::Matrix<double, 3, 3, Eigen::RowMajor> K = Eigen::Matrix<double, 3, 3, Eigen::RowMajor>::Zero();\n\n        K(0, 0) = intr(i).fx;\n        K(1, 1) = intr(i).fy;\n        K(0, 2) = intr(i).cx;\n        K(1, 2) = intr(i).cy;\n        K(2, 2) = 1;\n\n        lastRGBError = std::numeric_limits<float>::max();\n\n        for(int j = 0; j < iterations[i]; j++)\n        {\n            Eigen::Matrix<double, 4, 4, Eigen::RowMajor> Rt = resultRt.inverse();\n\n            Eigen::Matrix<double, 3, 3, Eigen::RowMajor> R = Rt.topLeftCorner(3, 3);\n\n            Eigen::Matrix<double, 3, 3, Eigen::RowMajor> KRK_inv = K * R * K.inverse();\n            mat33 krkInv;\n            memcpy(&krkInv.data[0], KRK_inv.cast<float>().eval().data(), sizeof(mat33));\n\n            Eigen::Vector3d Kt = Rt.topRightCorner(3, 1);\n            Kt = K * Kt;\n            float3 kt = {(float)Kt(0), (float)Kt(1), (float)Kt(2)};\n\n            int sigma = 0;\n            int rgbSize = 0;\n\n            if(rgb)\n            {\n                TICK(\"computeRgbResidual\");\n                computeRgbResidual(pow(minimumGradientMagnitudes[i], 2.0) / pow(sobelScale, 2.0),\n                                   nextdIdx[i],\n                                   nextdIdy[i],\n                                   lastDepth[i],\n                                   nextDepth[i],\n                                   lastImage[i],\n                                   nextImage[i],\n                                   corresImg[i],\n                                   sumResidualRGB,\n                                   maxDepthDeltaRGB,\n                                   kt,\n                                   krkInv,\n                                   sigma,\n                                   rgbSize,\n                                   GPUConfig::getInstance().rgbResThreads,\n                                   GPUConfig::getInstance().rgbResBlocks);\n                TOCK(\"computeRgbResidual\");\n            }\n\n            float sigmaVal = std::sqrt((float)sigma / rgbSize == 0 ? 1 : rgbSize);\n            float rgbError = std::sqrt(sigma) / (rgbSize == 0 ? 1 : rgbSize);\n\n            if(rgbOnly && rgbError > lastRGBError)\n            {\n                break;\n            }\n\n            lastRGBError = rgbError;\n            lastRGBCount = rgbSize;\n\n            if(rgbOnly)\n            {\n                sigmaVal = -1; //Signals the internal optimisation to weight evenly\n            }\n\n            Eigen::Matrix<float, 6, 6, Eigen::RowMajor> A_icp;\n            Eigen::Matrix<float, 6, 1> b_icp;\n\n            mat33 device_Rcurr = Rcurr;\n            float3 device_tcurr = *reinterpret_cast<float3*>(tcurr.data());\n\n            DeviceArray2D<float>& vmap_curr = vmaps_curr_[i];\n            DeviceArray2D<float>& nmap_curr = nmaps_curr_[i];\n\n            DeviceArray2D<float>& vmap_g_prev = vmaps_g_prev_[i];\n            DeviceArray2D<float>& nmap_g_prev = nmaps_g_prev_[i];\n\n            float residual[2];\n\n            if(icp)\n            {\n                TICK(\"icpStep\");\n                icpStep(device_Rcurr,\n                        device_tcurr,\n                        vmap_curr,\n                        nmap_curr,\n                        device_Rprev_inv,\n                        device_tprev,\n                        intr(i),\n                        vmap_g_prev,\n                        nmap_g_prev,\n                        distThres_,\n                        angleThres_,\n                        sumDataSE3,\n                        outDataSE3,\n                        A_icp.data(),\n                        b_icp.data(),\n                        &residual[0],\n                        GPUConfig::getInstance().icpStepThreads,\n                        GPUConfig::getInstance().icpStepBlocks);\n                TOCK(\"icpStep\");\n            }\n\n            lastICPError = sqrt(residual[0]) / residual[1];\n            lastICPCount = residual[1];\n\n            Eigen::Matrix<float, 6, 6, Eigen::RowMajor> A_rgbd;\n            Eigen::Matrix<float, 6, 1> b_rgbd;\n\n            if(rgb)\n            {\n                TICK(\"rgbStep\");\n                rgbStep(corresImg[i],\n                        sigmaVal,\n                        pointClouds[i],\n                        intr(i).fx,\n                        intr(i).fy,\n                        nextdIdx[i],\n                        nextdIdy[i],\n                        sobelScale,\n                        sumDataSE3,\n                        outDataSE3,\n                        A_rgbd.data(),\n                        b_rgbd.data(),\n                        GPUConfig::getInstance().rgbStepThreads,\n                        GPUConfig::getInstance().rgbStepBlocks);\n                TOCK(\"rgbStep\");\n            }\n\n            Eigen::Matrix<double, 6, 1> result;\n            Eigen::Matrix<double, 6, 6, Eigen::RowMajor> dA_rgbd = A_rgbd.cast<double>();\n            Eigen::Matrix<double, 6, 6, Eigen::RowMajor> dA_icp = A_icp.cast<double>();\n            Eigen::Matrix<double, 6, 1> db_rgbd = b_rgbd.cast<double>();\n            Eigen::Matrix<double, 6, 1> db_icp = b_icp.cast<double>();\n\n            if(icp && rgb)\n            {\n                double w = icpWeight;\n                lastA = dA_rgbd + w * w * dA_icp;\n                lastb = db_rgbd + w * db_icp;\n                result = lastA.ldlt().solve(lastb);\n            }\n            else if(icp)\n            {\n                lastA = dA_icp;\n                lastb = db_icp;\n                result = lastA.ldlt().solve(lastb);\n            }\n            else if(rgb)\n            {\n                lastA = dA_rgbd;\n                lastb = db_rgbd;\n                result = lastA.ldlt().solve(lastb);\n            }\n            else\n            {\n                assert(false && \"Control shouldn't reach here\");\n            }\n\n            Eigen::Isometry3f rgbOdom;\n\n            OdometryProvider::computeUpdateSE3(resultRt, result, rgbOdom);\n\n            Eigen::Isometry3f currentT;\n            currentT.setIdentity();\n            currentT.rotate(Rprev);\n            currentT.translation() = tprev;\n\n            currentT = currentT * rgbOdom.inverse();\n\n            tcurr = currentT.translation();\n            Rcurr = currentT.rotation();\n        }\n    }\n\n    if(rgb && (tcurr - tprev).norm() > 0.3)\n    {\n        Rcurr = Rprev;\n        tcurr = tprev;\n    }\n\n    if(so3)\n    {\n        for(int i = 0; i < NUM_PYRS; i++)\n        {\n            std::swap(lastNextImage[i], nextImage[i]);\n        }\n    }\n\n    trans = tcurr;\n    rot = Rcurr;\n}\n\nEigen::MatrixXd RGBDOdometry::getCovariance()\n{\n    return lastA.cast<double>().lu().inverse();\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Utils/RGBDOdometry.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef RGBDODOMETRY_H_\n#define RGBDODOMETRY_H_\n\n#include \"Stopwatch.h\"\n#include \"../GPUTexture.h\"\n#include \"../Cuda/cudafuncs.cuh\"\n#include \"OdometryProvider.h\"\n#include \"GPUConfig.h\"\n\n#include <vector>\n#include <vector_types.h>\n\nclass RGBDOdometry\n{\n    public:\n        EIGEN_MAKE_ALIGNED_OPERATOR_NEW\n        RGBDOdometry(int width,\n                     int height,\n                     float cx, float cy, float fx, float fy,\n                     float distThresh = 0.10f,\n                     float angleThresh = sin(20.f * 3.14159254f / 180.f));\n\n        virtual ~RGBDOdometry();\n\n        void initICP(GPUTexture * filteredDepth, const float depthCutoff);\n\n        void initICP(GPUTexture * predictedVertices, GPUTexture * predictedNormals, const float depthCutoff);\n\n        void initICPModel(GPUTexture * predictedVertices, GPUTexture * predictedNormals, const float depthCutoff, const Eigen::Matrix4f & modelPose);\n\n        void initRGB(GPUTexture * rgb);\n\n        void initRGBModel(GPUTexture * rgb);\n\n        void initFirstRGB(GPUTexture * rgb);\n\n        void getIncrementalTransformation(Eigen::Vector3f & trans,\n                                          Eigen::Matrix<float, 3, 3, Eigen::RowMajor> & rot,\n                                          const bool & rgbOnly,\n                                          const float & icpWeight,\n                                          const bool & pyramid,\n                                          const bool & fastOdom,\n                                          const bool & so3);\n\n        void getIncrementalTransformation_withseg(Eigen::Vector3f & trans,\n                                          Eigen::Matrix<float, 3, 3, Eigen::RowMajor> & rot,\n                                          const bool & rgbOnly,\n                                          const float & weight_rgb,\n                                          const float & weight_seg,\n                                          const float & icpWeight,\n                                          const bool & pyramid,\n                                          const bool & fastOdom,\n                                          const bool & so3);\n\n        Eigen::MatrixXd getCovariance();\n\n        float lastICPError;\n        float lastICPCount;\n        float lastRGBError;\n        float lastRGBCount;\n        float lastSO3Error;\n        float lastSO3Count;\n\n        Eigen::Matrix<double, 6, 6, Eigen::RowMajor> lastA;\n        Eigen::Matrix<double, 6, 1> lastb;\n\n    private:\n        void populateRGBDData(GPUTexture * rgb,\n                              DeviceArray2D<float> * destDepths,\n                              DeviceArray2D<unsigned char> * destImages);\n\n        std::vector<DeviceArray2D<unsigned short> > depth_tmp;\n\n        DeviceArray<float> vmaps_tmp;\n        DeviceArray<float> nmaps_tmp;\n\n        std::vector<DeviceArray2D<float> > vmaps_g_prev_;\n        std::vector<DeviceArray2D<float> > nmaps_g_prev_;\n\n        std::vector<DeviceArray2D<float> > vmaps_curr_;\n        std::vector<DeviceArray2D<float> > nmaps_curr_;\n\n        CameraModel intr;\n\n        DeviceArray<JtJJtrSE3> sumDataSE3;\n        DeviceArray<JtJJtrSE3> outDataSE3;\n        DeviceArray<int2> sumResidualRGB;\n\n        DeviceArray<JtJJtrSO3> sumDataSO3;\n        DeviceArray<JtJJtrSO3> outDataSO3;\n\n        const int sobelSize;\n        const float sobelScale;\n        const float maxDepthDeltaRGB;\n        const float maxDepthRGB;\n\n        std::vector<int2> pyrDims;\n\n        static const int NUM_PYRS = 3;\n\n        DeviceArray2D<float> lastDepth[NUM_PYRS];\n        DeviceArray2D<unsigned char> lastImage[NUM_PYRS];\n\n        DeviceArray2D<float> nextDepth[NUM_PYRS];\n        DeviceArray2D<unsigned char> nextImage[NUM_PYRS];\n        DeviceArray2D<short> nextdIdx[NUM_PYRS];\n        DeviceArray2D<short> nextdIdy[NUM_PYRS];\n\n        DeviceArray2D<unsigned char> lastNextImage[NUM_PYRS];\n\n        DeviceArray2D<DataTerm> corresImg[NUM_PYRS];\n\n        DeviceArray2D<float3> pointClouds[NUM_PYRS];\n\n        std::vector<int> iterations;\n        std::vector<float> minimumGradientMagnitudes;\n\n        float distThres_;\n        float angleThres_;\n\n        Eigen::Matrix<double, 6, 6> lastCov;\n\n        const int width;\n        const int height;\n        const float cx, cy, fx, fy;\n};\n\n#endif /* RGBDODOMETRY_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Utils/Resolution.cpp",
    "content": "/*\n* This file was written for porting ElasticFusion to windows\n* by Filip Srajer (filip.srajer@inf.ethz.ch).\n*\n*/\n\n#include \"Resolution.h\"\n\nconst Resolution & Resolution::getInstance(int width,int height)\n{\n  static const Resolution instance(width,height);\n  return instance;\n}\n\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Utils/Resolution.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef RESOLUTION_H_\n#define RESOLUTION_H_\n\n#include <cassert>\n\n#include \"../Defines.h\"\n\nclass Resolution\n{\n    public:\n        EFUSION_API static const Resolution & getInstance(int width = 0,int height = 0);\n\n        const int & width() const\n        {\n            return imgWidth;\n        }\n\n        const int & height() const\n        {\n            return imgHeight;\n        }\n\n        const int & cols() const\n        {\n            return imgWidth;\n        }\n\n        const int & rows() const\n        {\n            return imgHeight;\n        }\n\n        const int & numPixels() const\n        {\n            return imgNumPixels;\n        }\n\n    private:\n        Resolution(int width, int height)\n         : imgWidth(width),\n           imgHeight(height),\n           imgNumPixels(width * height)\n        {\n            assert(width > 0 && height > 0 && \"You haven't initialised the Resolution class!\");\n        }\n\n        const int imgWidth;\n        const int imgHeight;\n        const int imgNumPixels;\n};\n\n#endif /* RESOLUTION_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Utils/Stopwatch.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef STOPWATCH_H_\n#define STOPWATCH_H_\n\n#include <stdio.h>\n#include <stdlib.h>\n\n#ifdef WIN32\n#  define far\n#  include <Windows.h>\n#  include <WinSock2.h>\n#  include <stdint.h> // portable: uint64_t   MSVC: __int64 \n#  include <time.h>\n#  include \"WindowsExtras.h\"\n#else\n#  include <sys/socket.h>\n#  include <netinet/in.h>\n#  include <arpa/inet.h>\n#endif\n\n#include <string.h>\n#include <vector>\n#include <string>\n#include <iostream>\n#include <map>\n#ifndef WIN32\n#  include <sys/time.h>\n#  include <unistd.h>\n#endif\n\n#include \"../Defines.h\"\n\n#define SEND_INTERVAL_MS 10000\n\n#ifdef WIN32\ntypedef char stopwatchPacketType;\n#else\ntypedef unsigned char stopwatchPacketType;\n#endif\n\n#ifndef DISABLE_STOPWATCH\n#define STOPWATCH(name, expression) \\\n    do \\\n    { \\\n        const unsigned long long int startTime = Stopwatch::getInstance().getCurrentSystemTime(); \\\n        expression \\\n        const unsigned long long int endTime = Stopwatch::getInstance().getCurrentSystemTime(); \\\n        Stopwatch::getInstance().addStopwatchTiming(name, endTime - startTime); \\\n    } \\\n    while(false)\n\n#define TICK(name) \\\n    do \\\n    { \\\n        Stopwatch::getInstance().tick(name, Stopwatch::getInstance().getCurrentSystemTime()); \\\n    } \\\n    while(false)\n\n#define TOCK(name) \\\n    do \\\n    { \\\n        Stopwatch::getInstance().tock(name, Stopwatch::getInstance().getCurrentSystemTime()); \\\n    } \\\n    while(false)\n#else\n#define STOPWATCH(name, expression) \\\n    expression\n\n#define TOCK(name) ((void)0)\n\n#define TICK(name) ((void)0)\n\n#endif\n\nclass Stopwatch\n{\n    public:\n        static Stopwatch & getInstance()\n        {\n            static Stopwatch instance;\n            return instance;\n        }\n\n        void addStopwatchTiming(std::string name, unsigned long long int duration)\n        {\n            if(duration > 0)\n            {\n                timings[name] = (float)(duration) / 1000.0f;\n            }\n        }\n\n        void setCustomSignature(unsigned long long int newSignature)\n        {\n          signature = newSignature;\n        }\n\n        const std::map<std::string, float> & getTimings()\n        {\n            return timings;\n        }\n\n        void printAll()\n        {\n            for(std::map<std::string, float>::const_iterator it = timings.begin(); it != timings.end(); it++)\n            {\n                std::cout << it->first << \": \" << it->second  << \"ms\" << std::endl;\n            }\n\n            std::cout << std::endl;\n        }\n\n        void pulse(std::string name)\n        {\n            timings[name] = 1;\n        }\n\n        void sendAll()\n        {\n            gettimeofday(&clock, 0);\n\n            if((currentSend = (clock.tv_sec * 1000000 + clock.tv_usec)) - lastSend > SEND_INTERVAL_MS)\n            {\n                int size = 0;\n                stopwatchPacketType * data = serialiseTimings(size);\n                sendto(sockfd, data, size, 0, (struct sockaddr *) &servaddr, sizeof(servaddr));\n\n                free(data);\n\n                lastSend = currentSend;\n            }\n        }\n\n        static unsigned long long int getCurrentSystemTime()\n        {\n            timeval tv;\n            gettimeofday(&tv, 0);\n            unsigned long long int time = (unsigned long long int)(tv.tv_sec * 1000000 + tv.tv_usec);\n            return time;\n        }\n\n        void tick(std::string name, unsigned long long int start)\n        {\n        \ttickTimings[name] = start;\n        }\n\n        void tock(std::string name, unsigned long long int end)\n        {\n        \tfloat duration = (float)(end - tickTimings[name]) / 1000.0f;\n\n            if(duration > 0)\n            {\n                timings[name] = duration;\n            }\n        }\n\n    private:\n        Stopwatch()\n        {\n            memset(&servaddr, 0, sizeof(servaddr));\n            servaddr.sin_family = AF_INET;\n            servaddr.sin_addr.s_addr = inet_addr(\"127.0.0.1\");\n            servaddr.sin_port = htons(45454);\n            sockfd = socket(AF_INET, SOCK_DGRAM, 0);\n\n            gettimeofday(&clock, 0);\n\n            signature = clock.tv_sec * 1000000 + clock.tv_usec;\n\n            currentSend = lastSend = clock.tv_sec * 1000000 + clock.tv_usec;\n        }\n\n        virtual ~Stopwatch()\n        {\n#ifdef WIN32\n            closesocket(sockfd);\n#else\n            close(sockfd);\n#endif\n        }\n\n        stopwatchPacketType * serialiseTimings(int & packetSize)\n        {\n            packetSize = sizeof(int) + sizeof(unsigned long long int);\n\n            for(std::map<std::string, float>::const_iterator it = timings.begin(); it != timings.end(); it++)\n            {\n                packetSize += it->first.length() + 1 + sizeof(float);\n            }\n\n            int * dataPacket = (int *)calloc(packetSize, sizeof(unsigned char));\n\n            dataPacket[0] = packetSize * sizeof(unsigned char);\n\n            *((unsigned long long int *)&dataPacket[1]) = signature;\n\n            float * valuePointer = (float *)&((unsigned long long int *)&dataPacket[1])[1];\n\n            for(std::map<std::string, float>::const_iterator it = timings.begin(); it != timings.end(); it++)\n            {\n                valuePointer = (float *)mempcpy(valuePointer, it->first.c_str(), it->first.length() + 1);\n                *valuePointer++ = it->second;\n            }\n\n            return (stopwatchPacketType *)dataPacket;\n        }\n\n        timeval clock;\n        long long int currentSend, lastSend;\n        unsigned long long int signature;\n        int sockfd;\n        struct sockaddr_in servaddr;\n        std::map<std::string, float> timings;\n        std::map<std::string, unsigned long long int> tickTimings;\n};\n\n#endif /* STOPWATCH_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Utils/WindowsExtras.cpp",
    "content": "/*\n* This file was written for porting ElasticFusion to windows\n* by Filip Srajer (filip.srajer@inf.ethz.ch).\n*\n*/\n\n#include \"WindowsExtras.h\"\n\n#ifdef WIN32\n\n#include <stdint.h>\n#include <string.h>\n#define far\n#include <Windows.h>\n#include <WinSock2.h>\n\nint gettimeofday(struct timeval * tp,struct timezone * tzp)\n{\n  // Note: some broken versions only have 8 trailing zero's, the correct epoch has 9 trailing zero's\n  static const uint64_t EPOCH = ((uint64_t)116444736000000000ULL);\n\n  SYSTEMTIME  system_time;\n  FILETIME    file_time;\n  uint64_t    time;\n\n  GetSystemTime(&system_time);\n  SystemTimeToFileTime(&system_time,&file_time);\n  time = ((uint64_t)file_time.dwLowDateTime);\n  time += ((uint64_t)file_time.dwHighDateTime) << 32;\n\n  tp->tv_sec = (long)((time - EPOCH) / 10000000L);\n  tp->tv_usec = (long)(system_time.wMilliseconds * 1000);\n  return 0;\n}\n\nvoid *mempcpy(void *dest,const void *src,size_t n)\n{\n  return (char *)memcpy(dest,src,n) + n;\n}\n\n#endif // WIN32"
  },
  {
    "path": "obj_pose_est/mapping/Core/src/Utils/WindowsExtras.h",
    "content": "/*\n* This file was written for porting ElasticFusion to windows\n* by Filip Srajer (filip.srajer@inf.ethz.ch).\n* \n*/\n\n#pragma once\n\n#include \"../Defines.h\"\n\n#ifdef WIN32\n\nEFUSION_API int gettimeofday(struct timeval * tp,struct timezone * tzp);\n\nEFUSION_API void *mempcpy(void *dest,const void *src,size_t n);\n\n#endif // WIN32"
  },
  {
    "path": "obj_pose_est/mapping/LICENSE.txt",
    "content": "WE (Imperial College of Science, Technology and Medicine, (“Imperial College London”)) ARE WILLING TO LICENSE THIS SOFTWARE TO YOU (a licensee “You”) ONLY ON THE CONDITION THAT YOU ACCEPT ALL OF THE TERMS CONTAINED IN THE FOLLOWING AGREEMENT. PLEASE READ THE AGREEMENT CAREFULLY BEFORE DOWNLOADING THE SOFTWARE. BY EXERCISING THE OPTION TO DOWNLOAD THE SOFTWARE YOU AGREE TO BE BOUND BY THE TERMS OF THE AGREEMENT.\n\nSOFTWARE LICENSE AGREEMENT (EXCLUDING BSD COMPONENTS)\n\n1. This Agreement pertains to a worldwide, non-exclusive, temporary, fully paid-up, royalty free, non-transferable, non-sub- licensable license (the “License”) to use the ElasticFusion source code, including any modification, part or derivative (the “Software”).\n\nOwnership and License. Your rights to use and download the Software onto your computer, and all other copies that You are authorised to make, are specified in this Agreement. However, we (or our licensors) retain all rights, including but not limited to all copyright and other intellectual property rights anywhere in the world, in the Software not expressly granted to You in this Agreement.\n\n2. Permitted use of the License:\n\n(a) You may download and install the Software onto one computer or server for use in accordance with Clause 2(b) of this Agreement provided that You ensure that the Software is not accessible by other users unless they have themselves accepted the terms of this license agreement.\n\n(b) You may use the Software solely for non-commercial, internal  or academic research purposes and only in accordance with the terms of this Agreement. You may not use the Software for commercial purposes, including but not limited to (1) integration of all or part of the source code or the Software into a product for sale or license by or on behalf of You to third parties or (2) use of the Software or any derivative of it for research to develop software products for sale or license to a third party or (3) use of the Software or any derivative of it for research to develop non-software products for sale or license to a third party, or (4) use of the Software to provide any service to an external organisation for which payment is received.\n\nShould You wish to use the Software for commercial purposes, You shall email researchcontracts.engineering@imperial.ac.uk.\n\n(c) Right to Copy. You may copy the Software for back-up and archival purposes, provided that each copy is kept in your possession and provided You reproduce our copyright notice (set out in Schedule 1) on each copy.\n\n(d) Transfer and sub-licensing. You may not rent, lend, or lease the Software and You may not transmit, transfer or sub-license this license to use the Software or any of your rights or obligations under this Agreement to another party.\n\n(e) Identity of Licensee. The license granted herein is personal to You. You shall not permit any third party to access, modify or otherwise use the Software nor shall You access modify or otherwise use the Software on behalf of any third party. If You wish to obtain a license for mutiple users or a site license for the Software please contact us at researchcontracts.engineering@imperial.ac.uk.\n\n(f) Publications and presentations. You may make public, results or data obtained from, dependent on or arising from research carried out using the Software, provided that any such presentation or publication identifies the Software as the source of the results or the data, including the Copyright Notice given in each element of the Software, and stating that the Software has been made available for use by You under license from Imperial College London and You provide a copy of any such publication to Imperial College London.\n\n3. Prohibited Uses. You may not, without written permission from us at researchcontracts.engineering@imperial.ac.uk:\n\n(a) Use, copy, modify, merge, or transfer copies of the Software or any documentation provided by us which relates to the Software except as provided in this Agreement;\n\n(b) Use any back-up or archival copies of the Software (or allow anyone else to use such copies) for any purpose other than to replace the original copy in the event it is destroyed or becomes defective; or\n\n(c) Disassemble, decompile or \"unlock\", reverse translate, or in any manner decode the Software for any reason.\n\n4. Warranty Disclaimer\n\n(a) Disclaimer. The Software has been developed for research purposes only. You acknowledge that we are providing the Software to You under this license agreement free of charge and on condition that the disclaimer set out below shall apply. We do not represent or warrant that the Software as to: (i) the quality, accuracy or reliability of the Software; (ii) the suitability of the Software for any particular use or for use under any specific conditions; and (iii) whether use of the Software will infringe third-party rights.\n\nYou acknowledge that You have reviewed and evaluated the Software to determine that it meets your needs and that You assume all responsibility and liability for determining the suitability of the Software as fit for your particular purposes and requirements. Subject to Clause 4(b), we exclude and expressly disclaim all express and implied representations, warranties, conditions and terms not stated herein (including the implied conditions or warranties of satisfactory quality, merchantable quality, merchantability and fitness for purpose).\n\n(b) Savings. Some jurisdictions may imply warranties, conditions or terms or impose obligations upon us which cannot, in whole or in part, be excluded, restricted or modified or otherwise do not allow the exclusion of implied warranties, conditions or terms, in which case the above warranty disclaimer and exclusion will only apply to You to the extent permitted in the relevant jurisdiction and does not in any event exclude any implied warranties, conditions or terms which may not under applicable law be excluded.\n\n(c) Imperial College London disclaims all responsibility for the use which is made of the Software and any liability for the outcomes arising from using the Software.\n\n5. Limitation of Liability\n\n(a) You acknowledge that we are providing the Software to You under this license agreement free of charge and on condition that the limitation of liability set out below shall apply. Accordingly, subject to Clause 5(b), we exclude all liability whether in contract, tort, negligence or otherwise, in respect of the Software and/or any related documentation provided to You by us including, but not limited to, liability for loss or corruption of data, loss of contracts, loss of income, loss of profits, loss of cover and any consequential or indirect loss or damage of any kind arising out of or in connection with this license agreement, however caused. This exclusion shall apply even if we have been advised of the possibility of such loss or damage.\n\n(b) You agree to indemnify Imperial College London and hold it harmless from and against any and all claims, damages and liabilities asserted by third parties (including claims for negligence) which arise directly or indirectly from the use of the Software or any derivative of it or the sale of any products based on the Software. You undertake to make no liability claim against any employee, student, agent or appointee of Imperial College London, in connection with this License or the Software.\n\n(c) Nothing in this Agreement shall have the effect of excluding or limiting our statutory liability.\n\n(d) Some jurisdictions do not allow these limitations or exclusions either wholly or in part, and, to that extent, they may not apply to you. Nothing in this license agreement will affect your statutory rights or other relevant statutory provisions which cannot be excluded, restricted or modified, and its terms and conditions must be read and construed subject to any such statutory rights and/or provisions.\n\n6. Confidentiality. You agree not to disclose any confidential information provided to You by us pursuant to this Agreement to any third party without our prior written consent. The obligations in this Clause 6 shall survive the termination of this Agreement for any reason.\n\n7. Termination.\n\n(a) We may terminate this license agreement and your right to use the Software at any time with immediate effect upon written notice to You.\n\n(b) This license agreement and your right to use the Software automatically terminate if You:\n\n(i) fail to comply with any provisions of this Agreement; or\n\n(ii) destroy the copies of the Software in your possession, or voluntarily return the Software to us.\n\n(c) Upon termination You will destroy all copies of the Software.\n\n(d) Otherwise, the restrictions on your rights to use the Software will expire 10 (ten) years after first use of the Software under this license agreement.\n\n8. Miscellaneous Provisions.\n\n(a) This Agreement will be governed by and construed in accordance with the substantive laws of England and Wales whose courts shall have exclusive jurisdiction over all disputes which may arise between us.\n\n(b) This is the entire agreement between us relating to the Software, and supersedes any prior purchase order, communications, advertising or representations concerning the Software.\n\n(c) No change or modification of this Agreement will be valid unless it is in writing, and is signed by us.\n\n(d) The unenforceability or invalidity of any part of this Agreement will not affect the enforceability or validity of the remaining parts.\n\nBSD Elements of the Software\n\nFor BSD elements of the Software, the following terms shall apply:\n\nCopyright as indicated in the header of the individual element of the Software.\n\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n\n3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nSchedule 1\n\nThe Software\n\nElasticFusion is a Real-time dense visual SLAM system capable of capturing comprehensive dense globally consistent surfel-based maps of room scale environments explored using an RGB-D camera.  It is based on the techniques described in the following publication:\n\n    ElasticFusion: Dense SLAM Without A Pose Graph, T. Whelan, S. Leutenegger, R. F. Salas-Moreno, B. Glocker and A. J. Davison, RSS '15\n\nCopyright Notice\n\nThis file is part of ElasticFusion.\n\nCopyright (C) 2015 Imperial College London\n\nThe use of the code within this file and all code within files that make up the software that is ElasticFusion is permitted for non-commercial purposes only.  The full terms and conditions that apply to the code within this file are detailed within the LICENSE.txt file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> unless explicitly stated.  By downloading this file you agree to comply with these terms.\n\nIf you wish to use any of this code for commercial purposes then please email researchcontracts.engineering@imperial.ac.uk.\n\nAcknowledgements\n\nIf You use the software You should reference the following paper in any publication:\n\n    ElasticFusion: Dense SLAM Without A Pose Graph, T. Whelan, S. Leutenegger, R. F. Salas-Moreno, B. Glocker and A. J. Davison, RSS '15\n\n"
  },
  {
    "path": "obj_pose_est/mapping/README.md",
    "content": "# 3D Mapping #\nThis is an implementation of 3D mapping in [Object-RPE](https://sites.google.com/view/object-rpe) based on the work of [ElasticFusion](https://github.com/mp3guy/ElasticFusion). \n\n## 1. What do I need to build it? #\n\n* Ubuntu 16.04 (Though many other linux distros will work fine)\n* CMake\n* OpenGL\n* [CUDA >= 7.0](https://developer.nvidia.com/cuda-downloads)\n* OpenCV 3.1\n* [OpenNI2](https://github.com/occipital/OpenNI2)\n* SuiteSparse\n* Eigen\n* zlib\n* libjpeg\n* [Pangolin](https://github.com/stevenlovegrove/Pangolin)\n\n```bash\nsudo apt-get install -y cmake-qt-gui git build-essential libusb-1.0-0-dev libudev-dev openjdk-7-jdk freeglut3-dev libglew-dev cuda-7-5 libsuitesparse-dev libeigen3-dev zlib1g-dev libjpeg-dev\n```\n\nAfterwards install [OpenNI2](https://github.com/occipital/OpenNI2) and [Pangolin](https://github.com/stevenlovegrove/Pangolin) from source. Note, you may need to manually tell CMake where OpenNI2 is since Occipital's fork does not have an install option. It is important to build Pangolin last so that it can find some of the libraries it has optional dependencies on. \n\nOpenNI2:\n```bash\ncd ~/catkin_ws/src/Object-RPE/obj_pose_est/mapping\nmkdir deps\ncd deps\ngit clone https://github.com/occipital/OpenNI2.git\ncd OpenNI2\nmake -j8\n```\n\nPangolin:\n```bash\ncd ~/catkin_ws/src/Object-RPE/obj_pose_est/mapping/deps\ngit clone https://github.com/stevenlovegrove/Pangolin.git\ncd Pangolin\nmkdir build\ncd build\ncmake ../ -DAVFORMAT_INCLUDE_DIR=\"\" -DCPP11_NO_BOOST=ON\nmake -j8\ncd ../..\n```\n\nPangolin must be installed AFTER all the other libraries to make use of optional dependencies.\n\nWhen you have all of the dependencies installed, build the Core followed by the app.\n\n## 2. Build core and app\n\nBuild core:\n```bash\ncd Core/\nmkdir build\ncd build\ncmake ../src\nmake -j8\n```\n\nBuild mapping app:\n```bash\ncd app/\nmkdir build\ncd build/\ncmake ../src\nmake -j8\n```"
  },
  {
    "path": "obj_pose_est/mapping/app/note",
    "content": "mkdir build\ncd build/\ncmake ../src\nmake -j8\n./mapping -l /home/aass/catkin_ws/src/Object-RPE/data/\n"
  },
  {
    "path": "obj_pose_est/mapping/app/src/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 2.6.0)\n\nproject(mapping)\n\nset(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} \"${CMAKE_CURRENT_SOURCE_DIR}\")\n\nif(WIN32)\n  macro(CANONIFY_BOOL var)\n    if(${var})\n      set(${var} TRUE)\n    else()\n      set(${var} FALSE)\n    endif()\n  endmacro()\nendif()\n\nif(WIN32)\n  find_package(JPEG REQUIRED)\nendif()\n\nfind_package(LAPACK REQUIRED)\nfind_package(BLAS REQUIRED)\nfind_package(ZLIB REQUIRED)\nfind_package(Pangolin 0.1 REQUIRED)\nfind_package(CUDA REQUIRED)\nfind_package(OpenNI2 REQUIRED)\nfind_package(efusion REQUIRED)\nfind_package(SuiteSparse REQUIRED)\nfind_package(OpenCV 3.1 REQUIRED )\n\n\nif(WIN32)\n  find_package(RealSense QUIET)\n  CANONIFY_BOOL(REALSENSE_FOUND)\n  message(STATUS \"librealsense found: ${REALSENSE_FOUND}\")\n  option(WITH_REALSENSE \"Build with Intel RealSense support?\" ${REALSENSE_FOUND})\nendif()\n\nif(WIN32)\n  include_directories(${JPEG_INCLUDE_DIR})\nendif()\n\ninclude_directories(${ZLIB_INCLUDE_DIR})\ninclude_directories(${EIGEN_INCLUDE_DIRS})\ninclude_directories(${Pangolin_INCLUDE_DIRS})\ninclude_directories(${CUDA_INCLUDE_DIRS})\ninclude_directories(${EFUSION_INCLUDE_DIR})\ninclude_directories(${OPENNI2_INCLUDE_DIR})\ninclude_directories(${OpenCV_INCLUDE_DIRS})\n\n\nif(WITH_REALSENSE)\n  include_directories(${REALSENSE_INCLUDE_DIR})\n  add_definitions(-DWITH_REALSENSE)\n  set(EXTRA_LIBS ${EXTRA_LIBS} ${REALSENSE_LIBRARY})\nendif()\n\nfile(GLOB srcs *.cpp)\nfile(GLOB tools_srcs Tools/*.cpp)\n\nif(WIN32)\n  file(GLOB hdrs *.h)\n  file(GLOB tools_hdrs Tools/*.h)\nendif()\n\nif(WIN32)\n  add_definitions(-Dlinux=0)\n  add_definitions(-DWIN32_LEAN_AND_MEAN)\n  add_definitions(-DNOMINMAX)\n  set(ADDITIONAL_CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS})\n  set(EXTRA_WINDOWS_LIBS ${EXTRA_WINDOWS_LIBS} ws2_32 ${JPEG_LIBRARY})\nelse()\n  add_definitions(-Dlinux=1)\nendif()\n\nset(CMAKE_CXX_FLAGS ${ADDITIONAL_CMAKE_CXX_FLAGS} \"-O3 -msse2 -msse3 -Wall -std=c++11\")\n#set(CMAKE_CXX_FLAGS \"${CMAKE_CXX_FLAGS} -g -Wall -std=c++11\")\n\nadd_executable(mapping \n               ${srcs}\n               ${tools_srcs}\n               ${hdrs}\n               ${tools_hdrs}\n)\n\ntarget_link_libraries(mapping\n\t\t\t\t\t  ${EXTRA_WINDOWS_LIBS}\n                      ${ZLIB_LIBRARY}\n                      ${Pangolin_LIBRARIES}\n                      ${CUDA_LIBRARIES}\n                      ${EXTRA_LIBS}\n                      ${EFUSION_LIBRARY}\n                      ${OPENNI2_LIBRARY}\n                      ${SUITESPARSE_LIBRARIES}\n                      ${BLAS_LIBRARIES}\n                      ${LAPACK_LIBRARIES}\n                      ${OpenCV_LIBRARIES}\n)\n\n\nINSTALL(TARGETS mapping\n        RUNTIME DESTINATION bin\n        LIBRARY DESTINATION lib\n        ARCHIVE DESTINATION lib\n)\n"
  },
  {
    "path": "obj_pose_est/mapping/app/src/FindBLAS.cmake",
    "content": "# Find BLAS library\n#\n# This module finds an installed library that implements the BLAS\n# linear-algebra interface (see http://www.netlib.org/blas/).\n# The list of libraries searched for is mainly taken\n# from the autoconf macro file, acx_blas.m4 (distributed at\n# http://ac-archive.sourceforge.net/ac-archive/acx_blas.html).\n#\n# This module sets the following variables:\n#  BLAS_FOUND - set to true if a library implementing the BLAS interface\n#    is found\n#  BLAS_INCLUDE_DIR - Directories containing the BLAS header files\n#  BLAS_DEFINITIONS - Compilation options to use BLAS\n#  BLAS_LINKER_FLAGS - Linker flags to use BLAS (excluding -l\n#    and -L).\n#  BLAS_LIBRARIES_DIR - Directories containing the BLAS libraries.\n#     May be null if BLAS_LIBRARIES contains libraries name using full path.\n#  BLAS_LIBRARIES - List of libraries to link against BLAS interface.\n#     May be null if the compiler supports auto-link (e.g. VC++).\n#  BLAS_USE_FILE - The name of the cmake module to include to compile\n#     applications or libraries using BLAS.\n#\n# The following variables control the behaviour of this module:\n#\n# BLAS_DIR:         Specify a custom directory where suitesparse is located\n#                   libraries and headers will be searched for in\n#                   ${BLAS_DIR}/include and ${BLAS_DIR}/lib\n#\n# This module was modified by CGAL team:\n# - find BLAS library shipped with TAUCS\n# - find libraries for a C++ compiler, instead of Fortran\n# - added BLAS_INCLUDE_DIR, BLAS_DEFINITIONS and BLAS_LIBRARIES_DIR\n# - removed BLAS95_LIBRARIES\n#\n# TODO (CGAL):\n# - find CBLAS (http://www.netlib.org/cblas) on Unix?\n\n\ninclude(CheckFunctionExists)\n\n\n# This macro checks for the existence of the combination of fortran libraries\n# given by _list.  If the combination is found, this macro checks (using the\n# check_function_exists macro) whether can link against that library\n# combination using the name of a routine given by _name using the linker\n# flags given by _flags.  If the combination of libraries is found and passes\n# the link test, LIBRARIES is set to the list of complete library paths that\n# have been found and DEFINITIONS to the required definitions.\n# Otherwise, LIBRARIES is set to FALSE.\n# N.B. _prefix is the prefix applied to the names of all cached variables that\n# are generated internally and marked advanced by this macro.\nmacro(check_fortran_libraries DEFINITIONS LIBRARIES _prefix _name _flags _list _path)\n  #message(\"DEBUG: check_fortran_libraries(${_list} in ${_path})\")\n\n  # Check for the existence of the libraries given by _list\n  set(_libraries_found TRUE)\n  set(_libraries_work FALSE)\n  set(${DEFINITIONS} \"\")\n  set(${LIBRARIES} \"\")\n  set(_combined_name)\n  foreach(_library ${_list})\n    set(_combined_name ${_combined_name}_${_library})\n\n    if(_libraries_found)\n      # search first in ${_path}\n      find_library(${_prefix}_${_library}_LIBRARY\n                  NAMES ${_library}\n                  PATHS ${_path} NO_DEFAULT_PATH\n                  )\n      # if not found, search in environment variables and system\n      if ( WIN32 )\n        find_library(${_prefix}_${_library}_LIBRARY\n                    NAMES ${_library}\n                    PATHS ${BLAS_DIR}/lib ${BLAS_DIR} ENV LIB\n                    )\n      elseif ( APPLE )\n        find_library(${_prefix}_${_library}_LIBRARY\n                    NAMES ${_library}\n                    PATHS ${BLAS_DIR}/lib /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 ENV DYLD_LIBRARY_PATH\n                    )\n      else ()\n        find_library(${_prefix}_${_library}_LIBRARY\n                    NAMES ${_library}\n                    PATHS ${BLAS_DIR}/lib ~/.linuxbrew/lib /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 ENV LD_LIBRARY_PATH\n                    )\n      endif()\n      #message(\"DEBUG: find_library(${_library}) = ${${_prefix}_${_library}_LIBRARY}\")\n      mark_as_advanced(${_prefix}_${_library}_LIBRARY)\n      set(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_library}_LIBRARY})\n      set(_libraries_found ${${_prefix}_${_library}_LIBRARY})\n    endif(_libraries_found)\n  endforeach(_library ${_list})\n  if(_libraries_found)\n    set(_libraries_found ${${LIBRARIES}})\n  endif()\n\n  # Test this combination of libraries with the Fortran/f2c interface.\n  # We test the Fortran interface first as it is well standardized.\n  if(_libraries_found AND NOT _libraries_work)\n    set(${DEFINITIONS}  \"-D${_prefix}_USE_F2C\")\n    set(${LIBRARIES}    ${_libraries_found})\n    # Some C++ linkers require the f2c library to link with Fortran libraries.\n    # I do not know which ones, thus I just add the f2c library if it is available.\n    find_package( F2C QUIET )\n    if ( F2C_FOUND )\n      set(${DEFINITIONS}  ${${DEFINITIONS}} ${F2C_DEFINITIONS})\n      set(${LIBRARIES}    ${${LIBRARIES}} ${F2C_LIBRARIES})\n    endif()\n    set(CMAKE_REQUIRED_DEFINITIONS  ${${DEFINITIONS}})\n    set(CMAKE_REQUIRED_LIBRARIES    ${_flags} ${${LIBRARIES}})\n    #message(\"DEBUG: CMAKE_REQUIRED_DEFINITIONS = ${CMAKE_REQUIRED_DEFINITIONS}\")\n    #message(\"DEBUG: CMAKE_REQUIRED_LIBRARIES = ${CMAKE_REQUIRED_LIBRARIES}\")\n    # Check if function exists with f2c calling convention (ie a trailing underscore)\n    check_function_exists(${_name}_ ${_prefix}_${_name}_${_combined_name}_f2c_WORKS)\n    #message(\"DEBUG: check_function_exists(${_name}_) = ${${_prefix}_${_name}_${_combined_name}_f2c_WORKS}\")\n    set(CMAKE_REQUIRED_DEFINITIONS} \"\")\n    set(CMAKE_REQUIRED_LIBRARIES    \"\")\n    mark_as_advanced(${_prefix}_${_name}_${_combined_name}_f2c_WORKS)\n    set(_libraries_work ${${_prefix}_${_name}_${_combined_name}_f2c_WORKS})\n  endif(_libraries_found AND NOT _libraries_work)\n\n  # If not found, test this combination of libraries with a C interface.\n  # A few implementations (ie ACML) provide a C interface. Unfortunately, there is no standard.\n  if(_libraries_found AND NOT _libraries_work)\n    set(${DEFINITIONS} \"\")\n    set(${LIBRARIES}   ${_libraries_found})\n    set(CMAKE_REQUIRED_DEFINITIONS \"\")\n    set(CMAKE_REQUIRED_LIBRARIES   ${_flags} ${${LIBRARIES}})\n    #message(\"DEBUG: CMAKE_REQUIRED_LIBRARIES = ${CMAKE_REQUIRED_LIBRARIES}\")\n    check_function_exists(${_name} ${_prefix}_${_name}${_combined_name}_WORKS)\n    #message(\"DEBUG: check_function_exists(${_name}) = ${${_prefix}_${_name}${_combined_name}_WORKS}\")\n    set(CMAKE_REQUIRED_LIBRARIES \"\")\n    mark_as_advanced(${_prefix}_${_name}${_combined_name}_WORKS)\n    set(_libraries_work ${${_prefix}_${_name}${_combined_name}_WORKS})\n  endif(_libraries_found AND NOT _libraries_work)\n\n  # on failure\n  if(NOT _libraries_work)\n    set(${DEFINITIONS} \"\")\n    set(${LIBRARIES}   FALSE)\n  endif()\n  #message(\"DEBUG: ${DEFINITIONS} = ${${DEFINITIONS}}\")\n  #message(\"DEBUG: ${LIBRARIES} = ${${LIBRARIES}}\")\nendmacro(check_fortran_libraries)\n\n\n#\n# main\n#\n\n# Is it already configured?\nif (BLAS_LIBRARIES_DIR OR BLAS_LIBRARIES)\n\n  set(BLAS_FOUND TRUE)\n\nelse()\n\n  # reset variables\n  set( BLAS_INCLUDE_DIR \"\" )\n  set( BLAS_DEFINITIONS \"\" )\n  set( BLAS_LINKER_FLAGS \"\" )\n  set( BLAS_LIBRARIES \"\" )\n  set( BLAS_LIBRARIES_DIR \"\" )\n\n  # Look first for the TAUCS library distributed with CGAL in auxiliary/taucs.\n  # Set CGAL_TAUCS_FOUND, CGAL_TAUCS_INCLUDE_DIR and CGAL_TAUCS_LIBRARIES_DIR.\n  #include(CGAL_Locate_CGAL_TAUCS)\n\n  # Search for BLAS in CGAL_TAUCS_INCLUDE_DIR/CGAL_TAUCS_LIBRARIES_DIR (TAUCS shipped with CGAL)...\n  if(CGAL_TAUCS_FOUND AND CGAL_AUTO_LINK_ENABLED)\n\n    # if VC++: done\n    set( BLAS_INCLUDE_DIR    \"${CGAL_TAUCS_INCLUDE_DIR}\" )\n    set( BLAS_LIBRARIES_DIR  \"${CGAL_TAUCS_LIBRARIES_DIR}\" )\n\n  # ...else search for BLAS in $BLAS_LIB_DIR environment variable\n  else(CGAL_TAUCS_FOUND AND CGAL_AUTO_LINK_ENABLED)\n\n    #\n    # Search for BLAS in possible libraries\n    # in $BLAS_LIB_DIR environment variable and in usual places.\n    #\n\n    # BLAS in ATLAS library? (http://math-atlas.sourceforge.net/)\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      cblas_dgemm\n      \"\"\n      \"cblas;f77blas;atlas\"\n      \"${BLAS_LIB_DIR}\"\n      )\n    endif()\n\n    # BLAS in PhiPACK libraries? (requires generic BLAS lib, too)\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"sgemm;dgemm;blas\"\n      \"${BLAS_LIB_DIR}\"\n      )\n    endif()\n\n    # BLAS in Alpha CXML library?\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"cxml\"\n      \"${BLAS_LIB_DIR}\"\n      )\n    endif()\n\n    # BLAS in Alpha DXML library? (now called CXML, see above)\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"dxml\"\n      \"${BLAS_LIB_DIR}\"\n      )\n    endif()\n\n    # BLAS in Sun Performance library?\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"-xlic_lib=sunperf\"\n      \"sunperf;sunmath\"\n      \"${BLAS_LIB_DIR}\"\n      )\n      if(BLAS_LIBRARIES)\n        # Extra linker flag\n        set(BLAS_LINKER_FLAGS \"-xlic_lib=sunperf\")\n      endif()\n    endif()\n\n    # BLAS in SCSL library?  (SGI/Cray Scientific Library)\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"scsl\"\n      \"${BLAS_LIB_DIR}\"\n      )\n    endif()\n\n    # BLAS in SGIMATH library?\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"complib.sgimath\"\n      \"${BLAS_LIB_DIR}\"\n      )\n    endif()\n\n    # BLAS in IBM ESSL library? (requires generic BLAS lib, too)\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"essl;blas\"\n      \"${BLAS_LIB_DIR}\"\n      )\n    endif()\n\n    # intel mkl 10 library?\n  # TODO: add shared variants\n    if (WIN32)\n      # intel mkl library? (static, 32bit)\n      if(NOT BLAS_LIBRARIES)\n        check_fortran_libraries(\n        BLAS_DEFINITIONS\n        BLAS_LIBRARIES\n        BLAS\n        SGEMM\n        \"\"\n        \"mkl_intel_c;mkl_intel_thread;mkl_core;libiomp5md\"\n        \"${MKL_LIB_DIR} ${BLAS_LIB_DIR}\"\n        )\n      endif()\n\n    # intel mkl library? (static, ia64 and em64t 64 bit)\n      if(NOT BLAS_LIBRARIES)\n        check_fortran_libraries(\n        BLAS_DEFINITIONS\n        BLAS_LIBRARIES\n        BLAS\n        SGEMM\n        \"\"\n        \"mkl_intel_lp64;mkl_intel_thread_lp64;mkl_core;libiomp5md\"\n        \"${MKL_LIB_DIR} ${BLAS_LIB_DIR}\"\n        )\n      endif()\n    else(WIN32)\n      # intel mkl library? (static, 32bit)\n      if(NOT BLAS_LIBRARIES)\n        check_fortran_libraries(\n        BLAS_DEFINITIONS\n        BLAS_LIBRARIES\n        BLAS\n        sgemm\n        \"\"\n        \"mkl_intel;mkl_intel_thread;mkl_core;iomp5;pthread\"\n        \"${MKL_LIB_DIR} ${BLAS_LIB_DIR}\"\n        )\n      endif()\n      \n    # intel mkl library? (static, ia64 and em64t 64 bit)\n      if(NOT BLAS_LIBRARIES)\n        check_fortran_libraries(\n        BLAS_DEFINITIONS\n        BLAS_LIBRARIES\n        BLAS\n        sgemm\n        \"\"\n        \"mkl_intel_lp64;mkl_intel_thread_lp64;mkl_core;iomp5;pthread\"\n        \"${MKL_LIB_DIR} ${BLAS_LIB_DIR}\"\n        )\n      endif()\n    endif (WIN32)\n\n    # older versions of intel mkl libs\n\n    # intel mkl library? (shared)\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"mkl;guide;pthread\"\n      \"${MKL_LIB_DIR} ${BLAS_LIB_DIR}\"\n      )\n    endif()\n\n    # intel mkl library? (static, 32bit)\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"mkl_ia32;guide;pthread\"\n      \"${MKL_LIB_DIR} ${BLAS_LIB_DIR}\"\n      )\n    endif()\n\n  # intel mkl library? (static, ia64 64bit)\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"mkl_ipf;guide;pthread\"\n      \"${MKL_LIB_DIR} ${BLAS_LIB_DIR}\"\n      )\n    endif()\n\n    # intel mkl library? (static, em64t 64bit)\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"mkl_em64t;guide;pthread\"\n      \"${MKL_LIB_DIR} ${BLAS_LIB_DIR}\"\n      )\n    endif()\n\n    #BLAS in acml library?\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"acml\"\n      \"${BLAS_LIB_DIR}\"\n      )\n    endif()\n\n    # Apple BLAS library?\n    if(NOT BLAS_LIBRARIES)\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"Accelerate\"\n      \"${BLAS_LIB_DIR}\"\n      )\n    endif()\n\n    if ( NOT BLAS_LIBRARIES )\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"vecLib\"\n      \"${BLAS_LIB_DIR}\"\n      )\n    endif ( NOT BLAS_LIBRARIES )\n\n    # Generic BLAS library?\n    # This configuration *must* be the last try as this library is notably slow.\n    if ( NOT BLAS_LIBRARIES )\n      check_fortran_libraries(\n      BLAS_DEFINITIONS\n      BLAS_LIBRARIES\n      BLAS\n      sgemm\n      \"\"\n      \"blas\"\n      \"${BLAS_LIB_DIR}\"\n      )\n    endif()\n\n  endif(CGAL_TAUCS_FOUND AND CGAL_AUTO_LINK_ENABLED)\n\n  if(BLAS_LIBRARIES_DIR OR BLAS_LIBRARIES)\n    set(BLAS_FOUND TRUE)\n  else()\n    find_package(OpenBLAS)\n    if(OpenBLAS_FOUND)\n        set(BLAS_FOUND TRUE)\n        set(BLAS_INCLUDE_DIR ${OpenBLAS_INCLUDE_DIRS})\n        set(BLAS_LIBRARIES ${OpenBLAS_LIBRARIES})\n    else()\n        set(BLAS_FOUND FALSE)\n    endif()\n  endif()\n\n  if(NOT BLAS_FIND_QUIETLY)\n    if(BLAS_FOUND)\n      message(STATUS \"A library with BLAS API found.\")\n    else(BLAS_FOUND)\n      if(BLAS_FIND_REQUIRED)\n        message(FATAL_ERROR \"A required library with BLAS API not found. Please specify library location.\")\n      else()\n        message(STATUS \"A library with BLAS API not found. Please specify library location.\")\n      endif()\n    endif(BLAS_FOUND)\n  endif(NOT BLAS_FIND_QUIETLY)\n\n  # Add variables to cache\n  set( BLAS_INCLUDE_DIR   \"${BLAS_INCLUDE_DIR}\" \n                          CACHE PATH \"Directories containing the BLAS header files\" FORCE )\n  set( BLAS_DEFINITIONS   \"${BLAS_DEFINITIONS}\" \n                          CACHE STRING \"Compilation options to use BLAS\" FORCE )\n  set( BLAS_LINKER_FLAGS  \"${BLAS_LINKER_FLAGS}\" \n                          CACHE STRING \"Linker flags to use BLAS\" FORCE )\n  set( BLAS_LIBRARIES     \"${BLAS_LIBRARIES}\" \n                          CACHE FILEPATH \"BLAS libraries name\" FORCE )\n  set( BLAS_LIBRARIES_DIR \"${BLAS_LIBRARIES_DIR}\" \n                          CACHE PATH \"Directories containing the BLAS libraries\" FORCE )\n\n  #message(\"DEBUG: BLAS_INCLUDE_DIR = ${BLAS_INCLUDE_DIR}\")\n  #message(\"DEBUG: BLAS_DEFINITIONS = ${BLAS_DEFINITIONS}\")\n  #message(\"DEBUG: BLAS_LINKER_FLAGS = ${BLAS_LINKER_FLAGS}\")\n  #message(\"DEBUG: BLAS_LIBRARIES = ${BLAS_LIBRARIES}\")\n  #message(\"DEBUG: BLAS_LIBRARIES_DIR = ${BLAS_LIBRARIES_DIR}\")\n  #message(\"DEBUG: BLAS_FOUND = ${BLAS_FOUND}\")\n\nendif(BLAS_LIBRARIES_DIR OR BLAS_LIBRARIES)\n\nif(BLAS_FOUND)\n  set(BLAS_FOUND ${BLAS_FOUND} CACHE INTERNAL \"\")\n  set(BLAS_USE_FILE \"CGAL_UseBLAS\")\nendif(BLAS_FOUND)\n"
  },
  {
    "path": "obj_pose_est/mapping/app/src/FindLAPACK.cmake",
    "content": "# Find LAPACK library\n#\n# This module finds an installed library that implements the LAPACK\n# linear-algebra interface (see http://www.netlib.org/lapack/).\n# The approach follows mostly that taken for the autoconf macro file, acx_lapack.m4\n# (distributed at http://ac-archive.sourceforge.net/ac-archive/acx_lapack.html).\n#\n# This module sets the following variables:\n#  LAPACK_FOUND - set to true if a library implementing the LAPACK interface\n#    is found\n#  LAPACK_INCLUDE_DIR - Directories containing the LAPACK header files\n#  LAPACK_DEFINITIONS - Compilation options to use LAPACK\n#  LAPACK_LINKER_FLAGS - Linker flags to use LAPACK (excluding -l\n#    and -L).\n#  LAPACK_LIBRARIES_DIR - Directories containing the LAPACK libraries.\n#     May be null if LAPACK_LIBRARIES contains libraries name using full path.\n#  LAPACK_LIBRARIES - List of libraries to link against LAPACK interface.\n#     May be null if the compiler supports auto-link (e.g. VC++).\n#  LAPACK_USE_FILE - The name of the cmake module to include to compile\n#     applications or libraries using LAPACK.\n#\n# This module was modified by CGAL team:\n# - find LAPACK library shipped with TAUCS\n# - find libraries for a C++ compiler, instead of Fortran\n# - added LAPACK_INCLUDE_DIR, LAPACK_DEFINITIONS and LAPACK_LIBRARIES_DIR\n# - removed LAPACK95_LIBRARIES\n#\n# TODO (CGAL):\n# - find CLAPACK (http://www.netlib.org/clapack) on Unix?\n\n\ninclude(CheckFunctionExists)\ninclude(CheckFortranFunctionExists)\n\n# This macro checks for the existence of the combination of fortran libraries\n# given by _list.  If the combination is found, this macro checks (using the\n# check_function_exists macro) whether can link against that library\n# combination using the name of a routine given by _name using the linker\n# flags given by _flags.  If the combination of libraries is found and passes\n# the link test, LIBRARIES is set to the list of complete library paths that\n# have been found and DEFINITIONS to the required definitions.\n# Otherwise, LIBRARIES is set to FALSE.\n# N.B. _prefix is the prefix applied to the names of all cached variables that\n# are generated internally and marked advanced by this macro.\nmacro(check_lapack_libraries DEFINITIONS LIBRARIES _prefix _name _flags _list _blas _path)\n  #message(\"DEBUG: check_lapack_libraries(${_list} in ${_path} with ${_blas})\")\n\n  # Check for the existence of the libraries given by _list\n  set(_libraries_found TRUE)\n  set(_libraries_work TRUE)\n  set(${DEFINITIONS} \"\")\n  set(${LIBRARIES} \"\")\n  set(_combined_name)\n  foreach(_library ${_list})\n    set(_combined_name ${_combined_name}_${_library})\n\n    if(_libraries_found)\n      # search first in ${_path}\n      find_library(${_prefix}_${_library}_LIBRARY\n                  NAMES ${_library}\n                  PATHS ${LAPACK_DIR} ${LAPACK_DIR}/lib ${_path} NO_DEFAULT_PATH\n                  )\n      # if not found, search in environment variables and system\n      if ( WIN32 )\n        find_library(${_prefix}_${_library}_LIBRARY\n                    NAMES ${_library}\n                    PATHS ${LAPACK_DIR} ${LAPACK_DIR}/lib ENV LIB\n                    )\n      elseif ( APPLE )\n        find_library(${_prefix}_${_library}_LIBRARY\n                    NAMES ${_library}\n                    PATHS ${LAPACK_DIR} ${LAPACK_DIR}/lib /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 ENV DYLD_LIBRARY_PATH\n                    )\n      else ()\n        find_library(${_prefix}_${_library}_LIBRARY\n                    NAMES ${_library}\n                    PATHS ${LAPACK_DIR} ${LAPACK_DIR}/lib ~/.linuxbrew/lib /usr/local/lib /usr/lib /usr/local/lib64 /usr/lib64 ENV LD_LIBRARY_PATH\n                    )\n      endif()\n      mark_as_advanced(${_prefix}_${_library}_LIBRARY)\n      set(${LIBRARIES} ${${LIBRARIES}} ${${_prefix}_${_library}_LIBRARY})\n      set(_libraries_found ${${_prefix}_${_library}_LIBRARY})\n    endif(_libraries_found)\n  endforeach(_library ${_list})\n  if(_libraries_found)\n    set(_libraries_found ${${LIBRARIES}})\n  endif()\n\n  # Test this combination of libraries with the Fortran/f2c interface.\n  # We test the Fortran interface first as it is well standardized.\n  if(_libraries_found AND NOT _libraries_work)\n    set(${DEFINITIONS}  \"-D${_prefix}_USE_F2C\")\n    set(${LIBRARIES}    ${_libraries_found})\n    # Some C++ linkers require the f2c library to link with Fortran libraries.\n    # I do not know which ones, thus I just add the f2c library if it is available.\n    find_package( F2C QUIET )\n    if ( F2C_FOUND )\n      set(${DEFINITIONS}  ${${DEFINITIONS}} ${F2C_DEFINITIONS})\n      set(${LIBRARIES}    ${${LIBRARIES}} ${F2C_LIBRARIES})\n    endif()\n    set(CMAKE_REQUIRED_DEFINITIONS  ${${DEFINITIONS}})\n    set(CMAKE_REQUIRED_LIBRARIES    ${_flags} ${${LIBRARIES}} ${_blas})\n    #message(\"DEBUG: CMAKE_REQUIRED_DEFINITIONS = ${CMAKE_REQUIRED_DEFINITIONS}\")\n    #message(\"DEBUG: CMAKE_REQUIRED_LIBRARIES = ${CMAKE_REQUIRED_LIBRARIES}\")\n    # Check if function exists with f2c calling convention (ie a trailing underscore)\n    check_function_exists(${_name}_ ${_prefix}_${_name}_${_combined_name}_f2c_WORKS)\n    set(CMAKE_REQUIRED_DEFINITIONS} \"\")\n    set(CMAKE_REQUIRED_LIBRARIES    \"\")\n    mark_as_advanced(${_prefix}_${_name}_${_combined_name}_f2c_WORKS)\n    set(_libraries_work ${${_prefix}_${_name}_${_combined_name}_f2c_WORKS})\n  endif(_libraries_found AND NOT _libraries_work)\n\n  # If not found, test this combination of libraries with a C interface.\n  # A few implementations (ie ACML) provide a C interface. Unfortunately, there is no standard.\n  if(_libraries_found AND NOT _libraries_work)\n    set(${DEFINITIONS} \"\")\n    set(${LIBRARIES}   ${_libraries_found})\n    set(CMAKE_REQUIRED_DEFINITIONS \"\")\n    set(CMAKE_REQUIRED_LIBRARIES   ${_flags} ${${LIBRARIES}} ${_blas})\n    #message(\"DEBUG: CMAKE_REQUIRED_LIBRARIES = ${CMAKE_REQUIRED_LIBRARIES}\")\n    check_function_exists(${_name} ${_prefix}_${_name}${_combined_name}_WORKS)\n    set(CMAKE_REQUIRED_LIBRARIES \"\")\n    mark_as_advanced(${_prefix}_${_name}${_combined_name}_WORKS)\n    set(_libraries_work ${${_prefix}_${_name}${_combined_name}_WORKS})\n  endif(_libraries_found AND NOT _libraries_work)\n\n  # on failure\n  if(NOT _libraries_work)\n    set(${DEFINITIONS} \"\")\n    set(${LIBRARIES}   FALSE)\n  endif()\n  #message(\"DEBUG: ${DEFINITIONS} = ${${DEFINITIONS}}\")\n  #message(\"DEBUG: ${LIBRARIES} = ${${LIBRARIES}}\")\nendmacro(check_lapack_libraries)\n\n\n#\n# main\n#\n\n# LAPACK requires BLAS\nif(LAPACK_FIND_QUIETLY OR NOT LAPACK_FIND_REQUIRED)\n  find_package(BLAS)\nelse()\n  find_package(BLAS REQUIRED)\nendif()\n\nif (NOT BLAS_FOUND)\n\n  message(STATUS \"LAPACK requires BLAS.\")\n  set(LAPACK_FOUND FALSE)\n\n# Is it already configured?\nelseif (LAPACK_LIBRARIES_DIR OR LAPACK_LIBRARIES)\n\n  set(LAPACK_FOUND TRUE)\n\nelse()\n\n  # reset variables\n  set( LAPACK_INCLUDE_DIR \"\" )\n  set( LAPACK_DEFINITIONS \"\" )\n  set( LAPACK_LINKER_FLAGS \"\" ) # unused (yet)\n  set( LAPACK_LIBRARIES \"\" )\n  set( LAPACK_LIBRARIES_DIR \"\" )\n\n  # Look first for the TAUCS library distributed with CGAL in auxiliary/taucs.\n  # Set CGAL_TAUCS_FOUND, CGAL_TAUCS_INCLUDE_DIR and CGAL_TAUCS_LIBRARIES_DIR.\n  #include(CGAL_Locate_CGAL_TAUCS)\n\n  # Search for LAPACK in CGAL_TAUCS_INCLUDE_DIR/CGAL_TAUCS_LIBRARIES_DIR (TAUCS shipped with CGAL),\n  # else in $LAPACK_INC_DIR/$LAPACK_LIB_DIR environment variables.\n  if(CGAL_TAUCS_FOUND AND CGAL_AUTO_LINK_ENABLED)\n\n    # if VC++: done\n    set( LAPACK_INCLUDE_DIR    \"${CGAL_TAUCS_INCLUDE_DIR}\" )\n    set( LAPACK_LIBRARIES_DIR  \"${CGAL_TAUCS_LIBRARIES_DIR}\" )\n\n  else(CGAL_TAUCS_FOUND AND CGAL_AUTO_LINK_ENABLED)\n\n    #\n    # If Unix, search for LAPACK function in possible libraries\n    #\n\n    #intel mkl lapack?\n    if(NOT LAPACK_LIBRARIES)\n      check_lapack_libraries(\n      LAPACK_DEFINITIONS\n      LAPACK_LIBRARIES\n      LAPACK\n      cheev\n      \"\"\n      \"mkl_lapack\"\n      \"${BLAS_LIBRARIES}\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV LAPACK_LIB_DIR\"\n      )\n    endif()\n\n    #acml lapack?\n    if(NOT LAPACK_LIBRARIES)\n      check_lapack_libraries(\n      LAPACK_DEFINITIONS\n      LAPACK_LIBRARIES\n      LAPACK\n      cheev\n      \"\"\n      \"acml\"\n      \"${BLAS_LIBRARIES}\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV LAPACK_LIB_DIR\"\n      )\n    endif()\n\n    # Apple LAPACK library?\n    if(NOT LAPACK_LIBRARIES)\n      check_lapack_libraries(\n      LAPACK_DEFINITIONS\n      LAPACK_LIBRARIES\n      LAPACK\n      cheev\n      \"\"\n      \"Accelerate\"\n      \"${BLAS_LIBRARIES}\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV LAPACK_LIB_DIR\"\n      )\n    endif()\n\n    if ( NOT LAPACK_LIBRARIES )\n      check_lapack_libraries(\n      LAPACK_DEFINITIONS\n      LAPACK_LIBRARIES\n      LAPACK\n      cheev\n      \"\"\n      \"vecLib\"\n      \"${BLAS_LIBRARIES}\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV LAPACK_LIB_DIR\"\n      )\n    endif ( NOT LAPACK_LIBRARIES )\n\n    # Generic LAPACK library?\n    # This configuration *must* be the last try as this library is notably slow.\n    if ( NOT LAPACK_LIBRARIES )\n      check_lapack_libraries(\n      LAPACK_DEFINITIONS\n      LAPACK_LIBRARIES\n      LAPACK\n      cheev\n      \"\"\n      \"lapack\"\n      \"${BLAS_LIBRARIES}\"\n      \"${CGAL_TAUCS_LIBRARIES_DIR} ENV LAPACK_LIB_DIR\"\n      )\n    endif()\n\n    check_lapack_libraries(\n    LAPACKE_DEFINITIONS\n    LAPACKE_LIBRARIES\n    LAPACK\n    cheev\n    \"\"\n    \"lapacke\"\n    \"${BLAS_LIBRARIES}\"\n    \"${CGAL_TAUCS_LIBRARIES_DIR} ENV LAPACK_LIB_DIR\"\n    )\n\n  endif(CGAL_TAUCS_FOUND AND CGAL_AUTO_LINK_ENABLED)\n\n  if(LAPACK_LIBRARIES_DIR OR LAPACK_LIBRARIES)\n    set(LAPACK_FOUND TRUE)\n  else()\n    find_package(OpenBLAS)\n    if(OpenBLAS_FOUND)\n        set(LAPACK_FOUND TRUE)\n        set(LAPACK_INCLUDE_DIR ${OpenBLAS_INCLUDE_DIRS})\n        set(LAPACK_LIBRARIES ${OpenBLAS_LIBRARIES})\n    else()\n        set(LAPACK_FOUND FALSE)\n    endif()\n  endif()\n\n  if(NOT LAPACK_FIND_QUIETLY)\n    if(LAPACK_FOUND)\n      message(STATUS \"A library with LAPACK API found.\")\n    else(LAPACK_FOUND)\n      if(LAPACK_FIND_REQUIRED)\n        message(FATAL_ERROR \"A required library with LAPACK API not found. Please specify library location.\")\n      else()\n        message(STATUS \"A library with LAPACK API not found. Please specify library location.\")\n      endif()\n    endif(LAPACK_FOUND)\n  endif(NOT LAPACK_FIND_QUIETLY)\n\n  # Add variables to cache\n  set( LAPACK_INCLUDE_DIR   \"${LAPACK_INCLUDE_DIR}\"\n                            CACHE PATH \"Directories containing the LAPACK header files\" FORCE )\n  set( LAPACK_DEFINITIONS   \"${LAPACK_DEFINITIONS}\"\n                            CACHE STRING \"Compilation options to use LAPACK\" FORCE )\n  set( LAPACK_LINKER_FLAGS  \"${LAPACK_LINKER_FLAGS}\"\n                            CACHE STRING \"Linker flags to use LAPACK\" FORCE )\n  set( LAPACK_LIBRARIES     \"${LAPACK_LIBRARIES}\"\n                            CACHE FILEPATH \"LAPACK libraries name\" FORCE )\n  set( LAPACK_LIBRARIES_DIR \"${LAPACK_LIBRARIES_DIR}\"\n                            CACHE PATH \"Directories containing the LAPACK libraries\" FORCE )\n\n  #message(\"DEBUG: LAPACK_INCLUDE_DIR = ${LAPACK_INCLUDE_DIR}\")\n  #message(\"DEBUG: LAPACK_DEFINITIONS = ${LAPACK_DEFINITIONS}\")\n  #message(\"DEBUG: LAPACK_LINKER_FLAGS = ${LAPACK_LINKER_FLAGS}\")\n  #message(\"DEBUG: LAPACK_LIBRARIES = ${LAPACK_LIBRARIES}\")\n  #message(\"DEBUG: LAPACK_LIBRARIES_DIR = ${LAPACK_LIBRARIES_DIR}\")\n  #message(\"DEBUG: LAPACK_FOUND = ${LAPACK_FOUND}\")\n\nendif(NOT BLAS_FOUND)\n\nif(LAPACK_FOUND)\n  set(LAPACK_FOUND ${LAPACK_FOUND} CACHE INTERNAL \"\")\n  set(LAPACK_USE_FILE \"CGAL_UseLAPACK\")\nendif(LAPACK_FOUND)\n"
  },
  {
    "path": "obj_pose_est/mapping/app/src/FindOpenNI2.cmake",
    "content": "###############################################################################\n# Find OpenNI2\n#\n# This sets the following variables:\n# OPENNI2_FOUND - True if OPENNI was found.\n# OPENNI2_INCLUDE_DIRS - Directories containing the OPENNI include files.\n# OPENNI2_LIBRARIES - Libraries needed to use OPENNI.\n\nfind_package(PkgConfig)\nif(${CMAKE_VERSION} VERSION_LESS 2.8.2)\n  pkg_check_modules(PC_OPENNI openni2-dev)\nelse()\n  pkg_check_modules(PC_OPENNI QUIET openni2-dev)\nendif()\n\nset(OPENNI2_DEFINITIONS ${PC_OPENNI_CFLAGS_OTHER})\n\n#add a hint so that it can find it without the pkg-config\nfind_path(OPENNI2_INCLUDE_DIR OpenNI.h\n          HINTS\n            ${PC_OPENNI_INCLUDEDIR}\n            ${PC_OPENNI_INCLUDE_DIRS}\n          PATHS\n            \"${PROGRAM_FILES}/OpenNI2/Include\"\n            \"${CMAKE_SOURCE_DIR}/../OpenNI2/Include\"\n            \"${CMAKE_SOURCE_DIR}/../../OpenNI2/Include\"\n            \"${CMAKE_SOURCE_DIR}/../../../OpenNI2/Include\"\n            \"${CMAKE_SOURCE_DIR}/../../../../OpenNI2/Include\"\n            \"${CMAKE_SOURCE_DIR}/../../../code/OpenNI2/Include\"\n            \"${CMAKE_SOURCE_DIR}/../../../../code/OpenNI2/Include\"\n            \"${CMAKE_SOURCE_DIR}/../deps/OpenNI2/Include\"\n            \"${CMAKE_SOURCE_DIR}/../../deps/OpenNI2/Include\"\n            \"${CMAKE_SOURCE_DIR}/../../../deps/OpenNI2/Include\"\n            \"${CMAKE_SOURCE_DIR}/../../../../deps/OpenNI2/Include\"\n            /usr/include\n            /user/include\n          PATH_SUFFIXES openni2 ni2\n)\n\nif(${CMAKE_CL_64})\n    set(OPENNI_PATH_SUFFIXES lib64)\nelse()\n    set(OPENNI_PATH_SUFFIXES lib)\nendif()\n\n#add a hint so that it can find it without the pkg-config\nfind_library(OPENNI2_LIBRARY\n             NAMES OpenNI2\n             HINTS\n               ${PC_OPENNI_LIBDIR}\n               ${PC_OPENNI_LIBRARY_DIRS}\n             PATHS\n               \"${PROGRAM_FILES}}/OpenNI2/Redist\"\n               \"${PROGRAM_FILES}/OpenNI2\"\n               \"${CMAKE_SOURCE_DIR}/../OpenNI2/Bin/x64-Release\"\n               \"${CMAKE_SOURCE_DIR}/../../OpenNI2/Bin/x64-Release\"\n               \"${CMAKE_SOURCE_DIR}/../../../OpenNI2/Bin/x64-Release\"\n               \"${CMAKE_SOURCE_DIR}/../../../../OpenNI2/Bin/x64-Release\"\n               \"${CMAKE_SOURCE_DIR}/../../../code/OpenNI2/Bin/x64-Release\"\n               \"${CMAKE_SOURCE_DIR}/../../../../code/OpenNI2/Bin/x64-Release\"\n               \"${CMAKE_SOURCE_DIR}/../deps/OpenNI2/Bin/x64-Release\"\n               \"${CMAKE_SOURCE_DIR}/../../deps/OpenNI2/Bin/x64-Release\"\n               \"${CMAKE_SOURCE_DIR}/../../../deps/OpenNI2/Bin/x64-Release\"\n               \"${CMAKE_SOURCE_DIR}/../../../../deps/OpenNI2/Bin/x64-Release\"\n               /usr/lib\n               /user/lib\n             PATH_SUFFIXES ${OPENNI_PATH_SUFFIXES}\n)\n\nset(OPENNI2_INCLUDE_DIRS ${OPENNI2_INCLUDE_DIR})\nset(OPENNI2_LIBRARIES ${OPENNI2_LIBRARY})\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(OpenNI2 DEFAULT_MSG\n    OPENNI2_LIBRARY OPENNI2_INCLUDE_DIR)\n\nmark_as_advanced(OPENNI2_LIBRARY OPENNI2_INCLUDE_DIR)\n"
  },
  {
    "path": "obj_pose_est/mapping/app/src/FindRealSense.cmake",
    "content": "set(REALSENSE_ROOT \"/usr/local\" CACHE PATH \"Root directory of libREALSENSE\")\n\nFIND_PATH(REALSENSE_INCLUDE_DIR libREALSENSE HINTS \"${REALSENSE_ROOT}/include\")\nFIND_LIBRARY(REALSENSE_LIBRARY REALSENSE HINTS \"${REALSENSE_ROOT}/bin/x64\" \"${REALSENSE_ROOT}/lib\")\n\nfind_package_handle_standard_args(REALSENSE DEFAULT_MSG REALSENSE_LIBRARY REALSENSE_INCLUDE_DIR)\n\nmark_as_advanced(REALSENSE_LIBRARY REALSENSE_INCLUDE_DIR)\n\n"
  },
  {
    "path": "obj_pose_est/mapping/app/src/FindSuiteSparse.cmake",
    "content": "# - Try to find SUITESPARSE\n# Once done this will define\n#  \n#  SUITESPARSE_FOUND            - system has SUITESPARSE\n#  SUITESPARSE_INCLUDE_DIRS     - the SUITESPARSE include directory\n#  SUITESPARSE_LIBRARIES        - Link these to use SUITESPARSE\n#  SUITESPARSE_SPQR_LIBRARY     - name of spqr library (necessary due to error in debian package)\n#  SUITESPARSE_SPQR_LIBRARY_DIR - name of spqr library (necessary due to error in debian package)\n#  SUITESPARSE_LIBRARY_DIR      - Library main directory containing suitesparse libs\n#  SUITESPARSE_LIBRARY_DIRS     - all Library directories containing suitesparse libs\n#  SUITESPARSE_SPQR_VALID       - automatic identification whether or not spqr package is installed correctly\n\nIF (SUITESPARSE_INCLUDE_DIRS)\n  # Already in cache, be silent\n  SET(SUITESPARSE_FIND_QUIETLY TRUE)\nENDIF (SUITESPARSE_INCLUDE_DIRS)\n\nif (WIN32)\n  # the libraries may have lib prefix\n  set(ORIGINAL_CMAKE_FIND_LIBRARY_PREFIXES \"${CMAKE_FIND_LIBRARY_PREFIXES}\")\n  set(CMAKE_FIND_LIBRARY_PREFIXES \"lib\" \"\" \"${CMAKE_FIND_LIBRARY_PREFIXES}\")\nendif ()\n  \nFIND_PATH( SUITESPARSE_INCLUDE_DIR cholmod.h\n\t      PATHS /usr/local/include \n\t            /usr/include \n\t            /usr/include/suitesparse/ \n\t            ${CMAKE_SOURCE_DIR}/MacOS/Libs/cholmod\n      \t      PATH_SUFFIXES cholmod/ CHOLMOD/ )\n   \t\nFIND_PATH( SUITESPARSE_LIBRARY_DIR\n          NAMES libcholmod.so libcholmod.a\n          PATHS /usr/lib \n                /usr/lib64\n                /usr/lib/x86_64-linux-gnu\n                /usr/lib/i386-linux-gnu\n                /usr/local/lib )\n\n   # Add cholmod include directory to collection include directories\n   IF ( SUITESPARSE_INCLUDE_DIR )\n\tlist ( APPEND SUITESPARSE_INCLUDE_DIRS ${SUITESPARSE_INCLUDE_DIR} )\n   ENDIF( SUITESPARSE_INCLUDE_DIR )\n\n   # if we found the library, add it to the defined libraries\n   IF ( SUITESPARSE_LIBRARY_DIR )\n\t\tFIND_LIBRARY( SUITESPARSE_AMD_LIBRARY\n                     NAMES amd\n                     PATHS ${SUITESPARSE_LIBRARY_DIR} )\n\t\tFIND_LIBRARY( SUITESPARSE_CAMD_LIBRARY\n                     NAMES camd\n                     PATHS ${SUITESPARSE_LIBRARY_DIR} )\n\t\tFIND_LIBRARY( SUITESPARSE_CCOLAMD_LIBRARY\n                     NAMES ccolamd\n                     PATHS ${SUITESPARSE_LIBRARY_DIR} )\n\t\tFIND_LIBRARY( SUITESPARSE_CHOLMOD_LIBRARY\n                     NAMES cholmod\n                     PATHS ${SUITESPARSE_LIBRARY_DIR} )\n\t\tFIND_LIBRARY( SUITESPARSE_COLAMD_LIBRARY\n                     NAMES colamd\n                     PATHS ${SUITESPARSE_LIBRARY_DIR} )\n\t\tFIND_LIBRARY( SUITESPARSE_CXSPARSE_LIBRARY\n                     NAMES cxsparse\n                     PATHS ${SUITESPARSE_LIBRARY_DIR} )\n    FIND_LIBRARY( SUITESPARSE_SUITESPARSECONFIG_LIBRARY\n                   NAMES suitesparseconfig\n                   PATHS ${SUITESPARSE_LIBRARY_DIR} )\n\t\tIF ( WIN32 )\n\t\t  FIND_LIBRARY( SUITESPARSE_BLAS_LIBRARY\n                     NAMES blas\n                     PATHS ${SUITESPARSE_LIBRARY_DIR}/lapack_blas_windows )\n\t\t  FIND_LIBRARY( SUITESPARSE_LAPACK_LIBRARY\n                     NAMES lapack\n                     PATHS ${SUITESPARSE_LIBRARY_DIR}/lapack_blas_windows )\n\t\tENDIF ()\t\t\t \n\t\t\t\t\t \n       list ( APPEND SUITESPARSE_LIBRARIES ${SUITESPARSE_AMD_LIBRARY}\n         ${SUITESPARSE_CAMD_LIBRARY}\n         ${SUITESPARSE_CCOLAMD_LIBRARY}\n         ${SUITESPARSE_CHOLMOD_LIBRARY}\n         ${SUITESPARSE_COLAMD_LIBRARY}\n         ${SUITESPARSE_CXSPARSE_LIBRARY}\n         ${SUITESPARSE_SUITESPARSECONFIG_LIBRARY}\n         ${SUITESPARSE_BLAS_LIBRARY}\n         ${SUITESPARSE_LAPACK_LIBRARY})\n\n       # Metis and spqr are optional\n       FIND_LIBRARY( SUITESPARSE_METIS_LIBRARY\n                     NAMES metis\n                     PATHS ${SUITESPARSE_LIBRARY_DIR} )\n       IF (SUITESPARSE_METIS_LIBRARY)\t\t\t\n\t     list ( APPEND SUITESPARSE_LIBRARIES ${SUITESPARSE_METIS_LIBRARY})\n       ENDIF(SUITESPARSE_METIS_LIBRARY)\n\n       if(EXISTS  \"${SUITESPARSE_INCLUDE_DIR}/SuiteSparseQR.hpp\")\n\t     SET(SUITESPARSE_SPQR_VALID TRUE CACHE BOOL \"SuiteSparseSPQR valid\")\n       else()\n\t     SET(SUITESPARSE_SPQR_VALID false CACHE BOOL \"SuiteSparseSPQR valid\")\n       endif()\n\n       if(SUITESPARSE_SPQR_VALID)\n\t     FIND_LIBRARY( SUITESPARSE_SPQR_LIBRARY\n\t\t      NAMES spqr\n\t\t      PATHS ${SUITESPARSE_LIBRARY_DIR} )\n\t     IF (SUITESPARSE_SPQR_LIBRARY)\t\t\t\n\t       list ( APPEND SUITESPARSE_LIBRARIES ${SUITESPARSE_SPQR_LIBRARY})\n\t     ENDIF (SUITESPARSE_SPQR_LIBRARY)\n       endif()\n    ENDIF( SUITESPARSE_LIBRARY_DIR )  \n   \nIF (SUITESPARSE_INCLUDE_DIRS AND SUITESPARSE_LIBRARIES)\n   SET(SUITESPARSE_FOUND TRUE)\n   MESSAGE(STATUS \"Found SuiteSparse\")\nELSE (SUITESPARSE_INCLUDE_DIRS AND SUITESPARSE_LIBRARIES)\n   SET( SUITESPARSE_FOUND FALSE )\n   MESSAGE(FATAL_ERROR \"Unable to find SuiteSparse\")\nENDIF (SUITESPARSE_INCLUDE_DIRS AND SUITESPARSE_LIBRARIES)\n\nif (WIN32)\n  set(CMAKE_FIND_LIBRARY_PREFIXES \"${ORIGINAL_CMAKE_FIND_LIBRARY_PREFIXES}\")\nendif ()\n"
  },
  {
    "path": "obj_pose_est/mapping/app/src/Findefusion.cmake",
    "content": "###############################################################################\n# Find efusion\n#\n# This sets the following variables:\n# EFUSION_FOUND - True if EFUSION was found.\n# EFUSION_INCLUDE_DIRS - Directories containing the EFUSION include files.\n# EFUSION_LIBRARIES - Libraries needed to use EFUSION.\n\nfind_path(EFUSION_INCLUDE_DIR ElasticFusion.h\n          PATHS\n            ${CMAKE_CURRENT_SOURCE_DIR}/../../Core/src\n          PATH_SUFFIXES Core\n)\n\nfind_library(EFUSION_LIBRARY\n             NAMES libefusion.so\n             PATHS\n               ${CMAKE_CURRENT_SOURCE_DIR}/../../Core/build\n               ${CMAKE_CURRENT_SOURCE_DIR}/../../Core/src/build\n             PATH_SUFFIXES ${EFUSION_PATH_SUFFIXES}\n)\n\nset(EFUSION_INCLUDE_DIRS ${EFUSION_INCLUDE_DIR})\nset(EFUSION_LIBRARIES ${EFUSION_LIBRARY})\n\ninclude(FindPackageHandleStandardArgs)\nfind_package_handle_standard_args(EFUSION DEFAULT_MSG EFUSION_LIBRARY EFUSION_INCLUDE_DIR)\n\nif(NOT WIN32)\n  mark_as_advanced(EFUSION_LIBRARY EFUSION_INCLUDE_DIR)\nendif()\n"
  },
  {
    "path": "obj_pose_est/mapping/app/src/Main.cpp",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#include \"MainController.h\"\n\nint main(int argc, char * argv[])\n{\n    MainController mainController(argc, argv);\n\n    mainController.launch();\n\n    return 0;\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/app/src/MainController.cpp",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n \n#include \"MainController.h\"\n\nMainController::MainController(int argc, char * argv[])\n : good(true),\n   eFusion(0),\n   gui(0),\n   groundTruthOdometry(0),\n   logReader(0),\n   framesToSkip(0),\n   img_count(0),\n   img_num(100),\n   resetButton(false),\n   resizeStream(0)\n{\n    Parse::get().arg(argc, argv, \"-num_frames\", img_num);\n\n    std::string empty;\n    iclnuim = Parse::get().arg(argc, argv, \"-icl\", empty) > -1;\n\n    std::string calibrationFile;\n    Parse::get().arg(argc, argv, \"-cal\", calibrationFile);\n\n    Resolution::getInstance(640, 480);\n\n    if(calibrationFile.length())\n    {\n        loadCalibration(calibrationFile);\n    }\n    else\n    {\n        Intrinsics::getInstance(528, 528, 320, 240);\n    }\n\n    //Parse::get().arg(argc, argv, \"-l\", logFile);\n    Parse::get().arg(argc, argv, \"-l\", data_dir);\n\n    logFile = data_dir + \"map.klg\";\n\n    if(logFile.length())\n    {\n        logReader = new RawLogReader(logFile, Parse::get().arg(argc, argv, \"-f\", empty) > -1);\n    }\n    else\n    {\n        bool flipColors = Parse::get().arg(argc,argv,\"-f\",empty) > -1;\n        logReader = new LiveLogReader(logFile, flipColors, LiveLogReader::CameraType::OpenNI2);\n\n        good = ((LiveLogReader *)logReader)->cam->ok();\n\n#ifdef WITH_REALSENSE\n        if(!good)\n        {\n          delete logReader;\n          logReader = new LiveLogReader(logFile, flipColors, LiveLogReader::CameraType::RealSense);\n\n          good = ((LiveLogReader *)logReader)->cam->ok();\n        }\n#endif\n    }\n\n    if(Parse::get().arg(argc, argv, \"-p\", poseFile) > 0)\n    {\n        groundTruthOdometry = new GroundTruthOdometry(poseFile);\n    }\n\n    confidence = 10.0f;\n    depth = 3.0f;\n    icp = 10.0f;\n    icpErrThresh = 5e-05;\n    covThresh = 1e-05;\n    photoThresh = 115;\n    fernThresh = 0.3095f;\n\n    timeDelta = 200;\n    icpCountThresh = 40000;\n    start = 1;\n    so3 = !(Parse::get().arg(argc, argv, \"-nso\", empty) > -1);\n    end = std::numeric_limits<unsigned short>::max(); //Funny bound, since we predict times in this format really!\n\n    Parse::get().arg(argc, argv, \"-c\", confidence);\n    Parse::get().arg(argc, argv, \"-d\", depth);\n    Parse::get().arg(argc, argv, \"-i\", icp);\n    Parse::get().arg(argc, argv, \"-ie\", icpErrThresh);\n    Parse::get().arg(argc, argv, \"-cv\", covThresh);\n    Parse::get().arg(argc, argv, \"-pt\", photoThresh);\n    Parse::get().arg(argc, argv, \"-ft\", fernThresh);\n    Parse::get().arg(argc, argv, \"-t\", timeDelta);\n    Parse::get().arg(argc, argv, \"-ic\", icpCountThresh);\n    Parse::get().arg(argc, argv, \"-s\", start);\n    Parse::get().arg(argc, argv, \"-e\", end);\n\n    logReader->flipColors = Parse::get().arg(argc, argv, \"-f\", empty) > -1;\n\n    openLoop = !groundTruthOdometry && Parse::get().arg(argc, argv, \"-o\", empty) > -1;\n    reloc = Parse::get().arg(argc, argv, \"-rl\", empty) > -1;\n    frameskip = Parse::get().arg(argc, argv, \"-fs\", empty) > -1;\n    quiet = Parse::get().arg(argc, argv, \"-q\", empty) > -1;\n    fastOdom = Parse::get().arg(argc, argv, \"-fo\", empty) > -1;\n    rewind = Parse::get().arg(argc, argv, \"-r\", empty) > -1;\n    frameToFrameRGB = Parse::get().arg(argc, argv, \"-ftf\", empty) > -1;\n\n    gui = new GUI(logFile.length() == 0, Parse::get().arg(argc, argv, \"-sc\", empty) > -1);\n\n    gui->flipColors->Ref().Set(logReader->flipColors);\n    gui->rgbOnly->Ref().Set(false);\n    gui->pyramid->Ref().Set(true);\n    gui->fastOdom->Ref().Set(fastOdom);\n    gui->confidenceThreshold->Ref().Set(confidence);\n    gui->depthCutoff->Ref().Set(depth);\n    gui->icpWeight->Ref().Set(icp);\n    gui->so3->Ref().Set(so3);\n    gui->frameToFrameRGB->Ref().Set(frameToFrameRGB);\n\n    resizeStream = new Resize(Resolution::getInstance().width(),\n                              Resolution::getInstance().height(),\n                              Resolution::getInstance().width() / 2,\n                              Resolution::getInstance().height() / 2);\n    \n}\n\nMainController::~MainController()\n{\n    if(eFusion)\n    {\n        delete eFusion;\n    }\n\n    if(gui)\n    {\n        delete gui;\n    }\n\n    if(groundTruthOdometry)\n    {\n        delete groundTruthOdometry;\n    }\n\n    if(logReader)\n    {\n        delete logReader;\n    }\n\n    if(resizeStream)\n    {\n        delete resizeStream;\n    }\n}\n\nvoid MainController::loadCalibration(const std::string & filename)\n{\n    std::ifstream file(filename);\n    std::string line;\n\n    assert(!file.eof());\n\n    double fx, fy, cx, cy;\n\n    std::getline(file, line);\n\n    int n = sscanf(line.c_str(), \"%lg %lg %lg %lg\", &fx, &fy, &cx, &cy);\n\n    assert(n == 4 && \"Ooops, your calibration file should contain a single line with fx fy cx cy!\");\n\n    Intrinsics::getInstance(fx, fy, cx, cy);\n}\n\nvoid MainController::launch()\n{\n    while(good)\n    {\n        if(eFusion)\n        {\n            run();\n        }\n\n        if(eFusion == 0 || resetButton)\n        {\n            resetButton = false;\n            img_count = 0;\n\n            if(eFusion)\n            {\n                delete eFusion;\n            }\n\n            logReader->rewind();\n            eFusion = new ElasticFusion(openLoop ? std::numeric_limits<int>::max() / 2 : timeDelta,\n                                        icpCountThresh,\n                                        icpErrThresh,\n                                        covThresh,\n                                        !openLoop,\n                                        iclnuim,\n                                        reloc,\n                                        photoThresh,\n                                        confidence,\n                                        depth,\n                                        icp,\n                                        fastOdom,\n                                        fernThresh,\n                                        so3,\n                                        frameToFrameRGB,\n                                        logReader->getFile());\n        }\n        else\n        {\n            break;\n        }\n\n    }\n}\n\nvoid MainController::run()\n{\n    cv::Mat rgb_img, depth_img;\n\n    while(!pangolin::ShouldQuit() && img_count <= img_num  && !(eFusion->getTick() == end && quiet))\n    {\n\n        img_count++;\n        int index = 1000000 + img_count;\n        std::string index_str = std::to_string(index);\n\n        std::string rgb_dir = data_dir + \"rgb/\" + index_str.substr(1,6) + \"-color.png\";\n        std::string depth_dir = data_dir + \"depth/\" + index_str.substr(1,6) + \"-depth.png\";\n\n        rgb_img = cv::imread(rgb_dir, -1);\n        depth_img = cv::imread(depth_dir, -1);\n        if(!rgb_img.data || !depth_img.data)\n        {\n            if(img_count == img_num)\n            {\n                eFusion->saveFilename = data_dir + \"map\";  \n                eFusion->savePly();\n                break;\n            }\n            continue;\n        }\n        cv::cvtColor(rgb_img, rgb_img, CV_BGR2RGB);\n\n        if(!gui->pause->Get() || pangolin::Pushed(*gui->step))\n        {\n            if(true/* (logReader->hasMore() || rewind) && eFusion->getTick() < end */)\n            {\n                TICK(\"LogRead\");\n                /* if(rewind)\n                {\n                    if(!logReader->hasMore())\n                    {\n                        logReader->getBack();\n                    }\n                    else\n                    {\n                        logReader->getNext();\n                    }\n\n                    if(logReader->rewound())\n                    {\n                        logReader->currentFrame = 0;\n                    }\n                }\n                else\n                {\n                    logReader->getNext();\n                } */\n                TOCK(\"LogRead\");\n\n                if(eFusion->getTick() < start)\n                {\n                    eFusion->setTick(start);\n                    logReader->fastForward(start);\n                }\n\n                float weightMultiplier = framesToSkip + 1;\n\n                if(framesToSkip > 0)\n                {\n                    eFusion->setTick(eFusion->getTick() + framesToSkip);\n                    logReader->fastForward(logReader->currentFrame + framesToSkip);\n                    framesToSkip = 0;\n                }\n\n                Eigen::Matrix4f * currentPose = 0;\n\n                if(groundTruthOdometry)\n                {\n                    currentPose = new Eigen::Matrix4f;\n                    currentPose->setIdentity();\n                    *currentPose = groundTruthOdometry->getTransformation(logReader->timestamp);\n                }\n\n                \n                trajectory.push_back(eFusion->getCurrPose());\n                eFusion->processFrame(rgb_img.data, (unsigned short*)depth_img.data, img_count, currentPose, weightMultiplier);\n\n                if(currentPose)\n                {\n                    delete currentPose;\n                }\n\n                if(frameskip && Stopwatch::getInstance().getTimings().at(\"Run\") > 1000.f / 30.f)\n                {\n                    framesToSkip = int(Stopwatch::getInstance().getTimings().at(\"Run\") / (1000.f / 30.f));\n                }\n            }\n        }\n        else\n        {\n            eFusion->predict();\n        }\n\n        TICK(\"GUI\");\n\n        if(gui->followPose->Get())\n        {\n            pangolin::OpenGlMatrix mv;\n\n            Eigen::Matrix4f currPose = eFusion->getCurrPose();\n            Eigen::Matrix3f currRot = currPose.topLeftCorner(3, 3);\n\n            Eigen::Quaternionf currQuat(currRot);\n            Eigen::Vector3f forwardVector(0, 0, 1);\n            Eigen::Vector3f upVector(0, iclnuim ? 1 : -1, 0);\n\n            Eigen::Vector3f forward = (currQuat * forwardVector).normalized();\n            Eigen::Vector3f up = (currQuat * upVector).normalized();\n\n            Eigen::Vector3f eye(currPose(0, 3), currPose(1, 3), currPose(2, 3));\n\n            eye -= forward;\n\n            Eigen::Vector3f at = eye + forward;\n\n            Eigen::Vector3f z = (eye - at).normalized();  // Forward\n            Eigen::Vector3f x = up.cross(z).normalized(); // Right\n            Eigen::Vector3f y = z.cross(x);\n\n            Eigen::Matrix4d m;\n            m << x(0),  x(1),  x(2),  -(x.dot(eye)),\n                 y(0),  y(1),  y(2),  -(y.dot(eye)),\n                 z(0),  z(1),  z(2),  -(z.dot(eye)),\n                    0,     0,     0,              1;\n\n            memcpy(&mv.m[0], m.data(), sizeof(Eigen::Matrix4d));\n\n            gui->s_cam.SetModelViewMatrix(mv);\n        }\n\n        gui->preCall();\n\n        std::stringstream stri;\n        stri << eFusion->getModelToModel().lastICPCount;\n        gui->trackInliers->Ref().Set(stri.str());\n\n        std::stringstream stre;\n        stre << (std::isnan(eFusion->getModelToModel().lastICPError) ? 0 : eFusion->getModelToModel().lastICPError);\n        gui->trackRes->Ref().Set(stre.str());\n\n        if(!gui->pause->Get())\n        {\n            gui->resLog.Log((std::isnan(eFusion->getModelToModel().lastICPError) ? std::numeric_limits<float>::max() : eFusion->getModelToModel().lastICPError), icpErrThresh);\n            gui->inLog.Log(eFusion->getModelToModel().lastICPCount, icpCountThresh);\n        }\n\n        Eigen::Matrix4f pose = eFusion->getCurrPose();\n\n        if(gui->drawRawCloud->Get() || gui->drawFilteredCloud->Get())\n        {\n            eFusion->computeFeedbackBuffers();\n        }\n\n        if(gui->drawRawCloud->Get())\n        {\n            eFusion->getFeedbackBuffers().at(FeedbackBuffer::RAW)->render(gui->s_cam.GetProjectionModelViewMatrix(), pose, gui->drawNormals->Get(), gui->drawColors->Get());\n        }\n\n        if(gui->drawFilteredCloud->Get())\n        {\n            eFusion->getFeedbackBuffers().at(FeedbackBuffer::FILTERED)->render(gui->s_cam.GetProjectionModelViewMatrix(), pose, gui->drawNormals->Get(), gui->drawColors->Get());\n        }\n\n        if(gui->drawGlobalModel->Get())\n        {\n            glFinish();\n            TICK(\"Global\");\n\n            if(gui->drawFxaa->Get())\n            {\n                gui->drawFXAA(gui->s_cam.GetProjectionModelViewMatrix(),\n                              gui->s_cam.GetModelViewMatrix(),\n                              eFusion->getGlobalModel().model(),\n                              eFusion->getConfidenceThreshold(),\n                              eFusion->getTick(),\n                              eFusion->getTimeDelta(),\n                              iclnuim);\n            }\n            else\n            {\n                eFusion->getGlobalModel().renderPointCloud(gui->s_cam.GetProjectionModelViewMatrix(),\n                                                           eFusion->getConfidenceThreshold(),\n                                                           gui->drawUnstable->Get(),\n                                                           gui->drawNormals->Get(),\n                                                           gui->drawColors->Get(),\n                                                           gui->drawPoints->Get(),\n                                                           gui->drawWindow->Get(),\n                                                           gui->drawTimes->Get(),\n                                                           eFusion->getTick(),\n                                                           eFusion->getTimeDelta());\n            }\n            glFinish();\n            TOCK(\"Global\");\n        }\n\n        if(eFusion->getLost())\n        {\n            glColor3f(1, 1, 0);\n        }\n        else\n        {\n            glColor3f(1, 0, 1);\n        }\n        gui->drawFrustum(pose);\n        glColor3f(1, 1, 1);\n\n        if(gui->drawFerns->Get())\n        {\n            glColor3f(0, 0, 0);\n            for(size_t i = 0; i < eFusion->getFerns().frames.size(); i++)\n            {\n                if((int)i == eFusion->getFerns().lastClosest)\n                    continue;\n\n                gui->drawFrustum(eFusion->getFerns().frames.at(i)->pose);\n            }\n            glColor3f(1, 1, 1);\n        }\n\n        if(gui->drawDefGraph->Get())\n        {\n            const std::vector<GraphNode*> & graph = eFusion->getLocalDeformation().getGraph();\n\n            for(size_t i = 0; i < graph.size(); i++)\n            {\n                pangolin::glDrawCross(graph.at(i)->position(0),\n                                      graph.at(i)->position(1),\n                                      graph.at(i)->position(2),\n                                      0.1);\n\n                for(size_t j = 0; j < graph.at(i)->neighbours.size(); j++)\n                {\n                    pangolin::glDrawLine(graph.at(i)->position(0),\n                                         graph.at(i)->position(1),\n                                         graph.at(i)->position(2),\n                                         graph.at(graph.at(i)->neighbours.at(j))->position(0),\n                                         graph.at(graph.at(i)->neighbours.at(j))->position(1),\n                                         graph.at(graph.at(i)->neighbours.at(j))->position(2));\n                }\n            }\n        }\n\n        if(eFusion->getFerns().lastClosest != -1)\n        {\n            glColor3f(1, 0, 0);\n            gui->drawFrustum(eFusion->getFerns().frames.at(eFusion->getFerns().lastClosest)->pose);\n            glColor3f(1, 1, 1);\n        }\n\n        const std::vector<PoseMatch> & poseMatches = eFusion->getPoseMatches();\n\n        int maxDiff = 0;\n        for(size_t i = 0; i < poseMatches.size(); i++)\n        {\n            if(poseMatches.at(i).secondId - poseMatches.at(i).firstId > maxDiff)\n            {\n                maxDiff = poseMatches.at(i).secondId - poseMatches.at(i).firstId;\n            }\n        }\n\n        for(size_t i = 0; i < poseMatches.size(); i++)\n        {\n            if(gui->drawDeforms->Get())\n            {\n                if(poseMatches.at(i).fern)\n                {\n                    glColor3f(1, 0, 0);\n                }\n                else\n                {\n                    glColor3f(0, 1, 0);\n                }\n                for(size_t j = 0; j < poseMatches.at(i).constraints.size(); j++)\n                {\n                    pangolin::glDrawLine(poseMatches.at(i).constraints.at(j).sourcePoint(0), poseMatches.at(i).constraints.at(j).sourcePoint(1), poseMatches.at(i).constraints.at(j).sourcePoint(2),\n                                         poseMatches.at(i).constraints.at(j).targetPoint(0), poseMatches.at(i).constraints.at(j).targetPoint(1), poseMatches.at(i).constraints.at(j).targetPoint(2));\n                }\n            }\n        }\n        glColor3f(1, 1, 1);\n\n        eFusion->normaliseDepth(0.3f, gui->depthCutoff->Get());\n\n        for(std::map<std::string, GPUTexture*>::const_iterator it = eFusion->getTextures().begin(); it != eFusion->getTextures().end(); ++it)\n        {\n            if(it->second->draw)\n            {\n                gui->displayImg(it->first, it->second);\n            }\n        }\n\n        eFusion->getIndexMap().renderDepth(gui->depthCutoff->Get());\n\n        gui->displayImg(\"ModelImg\", eFusion->getIndexMap().imageTex());\n        gui->displayImg(\"Model\", eFusion->getIndexMap().drawTex());\n\n        std::stringstream strs;\n        strs << eFusion->getGlobalModel().lastCount();\n\n        gui->totalPoints->operator=(strs.str());\n\n        std::stringstream strs2;\n        strs2 << eFusion->getLocalDeformation().getGraph().size();\n\n        gui->totalNodes->operator=(strs2.str());\n\n        std::stringstream strs3;\n        strs3 << eFusion->getFerns().frames.size();\n\n        gui->totalFerns->operator=(strs3.str());\n\n        std::stringstream strs4;\n        strs4 << eFusion->getDeforms();\n\n        gui->totalDefs->operator=(strs4.str());\n\n        std::stringstream strs5;\n        strs5 << eFusion->getTick() << \"/\" << img_num;\n\n        gui->logProgress->operator=(strs5.str());\n\n        std::stringstream strs6;\n        strs6 << eFusion->getFernDeforms();\n\n        gui->totalFernDefs->operator=(strs6.str());\n\n        gui->postCall();\n\n        logReader->flipColors = gui->flipColors->Get();\n        eFusion->setRgbOnly(gui->rgbOnly->Get());\n        eFusion->setPyramid(gui->pyramid->Get());\n        eFusion->setFastOdom(gui->fastOdom->Get());\n        eFusion->setConfidenceThreshold(gui->confidenceThreshold->Get());\n        eFusion->setDepthCutoff(gui->depthCutoff->Get());\n        eFusion->setIcpWeight(gui->icpWeight->Get());\n        eFusion->setSo3(gui->so3->Get());\n        eFusion->setFrameToFrameRGB(gui->frameToFrameRGB->Get());\n\n        resetButton = pangolin::Pushed(*gui->reset);\n\n        if(gui->autoSettings)\n        {\n            static bool last = gui->autoSettings->Get();\n\n            if(gui->autoSettings->Get() != last)\n            {\n                last = gui->autoSettings->Get();\n                static_cast<LiveLogReader *>(logReader)->setAuto(last);\n            }\n        }\n\n        Stopwatch::getInstance().sendAll();\n\n        if(resetButton)\n        {\n            break;\n        }\n\n        if(img_count == img_num)\n        {\n            eFusion->saveFilename = data_dir + \"map\";  \n            eFusion->savePly();\n            break;\n        }\n\n        if(pangolin::Pushed(*gui->save))\n        {\n            eFusion->savePly();\n        }\n\n        TOCK(\"GUI\");\n    }\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/app/src/MainController.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#include <ElasticFusion.h>\n#include <Utils/Parse.h>\n\n#include \"Tools/GUI.h\"\n#include \"Tools/GroundTruthOdometry.h\"\n#include \"Tools/RawLogReader.h\"\n#include \"Tools/LiveLogReader.h\"\n\n#include <iostream>\n#include <string>\n\n#include <opencv2/highgui/highgui.hpp>\n#include <opencv2/imgproc/imgproc.hpp>\n\nusing namespace std;\nusing namespace cv;\n\n#ifndef MAINCONTROLLER_H_\n#define MAINCONTROLLER_H_\n\nclass MainController\n{\n    public:\n        MainController(int argc, char * argv[]);\n        virtual ~MainController();\n\n        void launch();\n\n    private:\n        void run();\n\n        void loadCalibration(const std::string & filename);\n\n        bool good;\n        ElasticFusion * eFusion;\n        GUI * gui;\n        GroundTruthOdometry * groundTruthOdometry;\n        LogReader * logReader;\n        int img_count;\n        int img_num;\n\n        bool iclnuim;\n        std::string logFile;\n        std::string poseFile;\n        std::string data_dir;\n\n        float confidence,\n              depth,\n              icp,\n              icpErrThresh,\n              covThresh,\n              photoThresh,\n              fernThresh;\n\n        int timeDelta,\n            icpCountThresh,\n            start,\n            end;\n\n        bool fillIn,\n             openLoop,\n             reloc,\n             frameskip,\n             quiet,\n             fastOdom,\n             so3,\n             rewind,\n             frameToFrameRGB;\n\n        int framesToSkip;\n        bool streaming;\n        bool resetButton;\n\n        std::vector<Eigen::Matrix4f> trajectory;\n\n        Resize * resizeStream;\n};\n\n#endif /* MAINCONTROLLER_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/app/src/Tools/CameraInterface.h",
    "content": "#pragma once\n\n#include <string>\n#include <iostream>\n#include <algorithm>\n#include <map>\n\n#include \"ThreadMutexObject.h\"\n\nclass CameraInterface\n{\n    public:\n      virtual ~CameraInterface() {}\n\n      virtual bool ok() = 0;\n      virtual std::string error() = 0;\n\n      static const int numBuffers = 10;\n      ThreadMutexObject<int> latestDepthIndex;\n      std::pair<std::pair<uint8_t *,uint8_t *>,int64_t> frameBuffers[numBuffers];\n\n      virtual void setAutoExposure(bool value) = 0;\n      virtual void setAutoWhiteBalance(bool value) = 0;\n};\n"
  },
  {
    "path": "obj_pose_est/mapping/app/src/Tools/GUI.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef GUI_H_\n#define GUI_H_\n\n#include <pangolin/pangolin.h>\n#include <pangolin/gl/gl.h>\n#include <pangolin/gl/gldraw.h>\n#include <map>\n#include <GPUTexture.h>\n#include <Utils/Intrinsics.h>\n#include <Shaders/Shaders.h>\n\n#define GL_GPU_MEM_INFO_CURRENT_AVAILABLE_MEM_NVX 0x9049\n\nclass GUI\n{\n    public:\n        GUI(bool liveCap, bool showcaseMode)\n         : showcaseMode(showcaseMode)\n        {\n            width = 1280;\n            height = 980;\n            panel = 205;\n\n            width += panel;\n\n            pangolin::Params windowParams;\n\n            windowParams.Set(\"SAMPLE_BUFFERS\", 0);\n            windowParams.Set(\"SAMPLES\", 0);\n\n            pangolin::CreateWindowAndBind(\"Main\", width, height, windowParams);\n\n            glPixelStorei(GL_UNPACK_ALIGNMENT, 1);\n            glPixelStorei(GL_PACK_ALIGNMENT, 1);\n\n            //Internally render at 3840x2160\n            renderBuffer = new pangolin::GlRenderBuffer(3840, 2160),\n            colorTexture = new GPUTexture(renderBuffer->width, renderBuffer->height, GL_RGBA32F, GL_LUMINANCE, GL_FLOAT, true);\n\n            colorFrameBuffer = new pangolin::GlFramebuffer;\n            colorFrameBuffer->AttachColour(*colorTexture->texture);\n            colorFrameBuffer->AttachDepth(*renderBuffer);\n\n            colorProgram = std::shared_ptr<Shader>(loadProgramFromFile(\"draw_global_surface.vert\", \"draw_global_surface_phong.frag\", \"draw_global_surface.geom\"));\n            fxaaProgram = std::shared_ptr<Shader>(loadProgramFromFile(\"empty.vert\", \"fxaa.frag\", \"quad.geom\"));\n\n            pangolin::SetFullscreen(showcaseMode);\n\n            glEnable(GL_DEPTH_TEST);\n            glDepthMask(GL_TRUE);\n            glDepthFunc(GL_LESS);\n\n            s_cam = pangolin::OpenGlRenderState(pangolin::ProjectionMatrix(640, 480, 420, 420, 320, 240, 0.1, 1000),\n                                                pangolin::ModelViewLookAt(0, 0, -1, 0, 0, 1, pangolin::AxisNegY));\n\n            pangolin::Display(\"cam\").SetBounds(0, 1.0f, 0, 1.0f, -640 / 480.0)\n                                    .SetHandler(new pangolin::Handler3D(s_cam));\n\n            pangolin::Display(GPUTexture::RGB).SetAspect(640.0f / 480.0f);\n\n            pangolin::Display(GPUTexture::DEPTH_NORM).SetAspect(640.0f / 480.0f);\n\n            pangolin::Display(\"ModelImg\").SetAspect(640.0f / 480.0f);\n\n            pangolin::Display(\"Model\").SetAspect(640.0f / 480.0f);\n\n            std::vector<std::string> labels;\n            labels.push_back(std::string(\"residual\"));\n            labels.push_back(std::string(\"threshold\"));\n            resLog.SetLabels(labels);\n\n            resPlot = new pangolin::Plotter(&resLog, 0, 300, 0, 0.0005, 30, 0.5);\n            resPlot->Track(\"$i\");\n\n            std::vector<std::string> labels2;\n            labels2.push_back(std::string(\"inliers\"));\n            labels2.push_back(std::string(\"threshold\"));\n            inLog.SetLabels(labels2);\n\n            inPlot = new pangolin::Plotter(&inLog, 0, 300, 0, 40000, 30, 0.5);\n            inPlot->Track(\"$i\");\n\n            if(!showcaseMode)\n            {\n                pangolin::CreatePanel(\"ui\").SetBounds(0.0, 1.0, 0.0, pangolin::Attach::Pix(panel));\n                pangolin::Display(\"multi\").SetBounds(pangolin::Attach::Pix(0), 1 / 4.0f, showcaseMode ? 0 : pangolin::Attach::Pix(180), 1.0)\n                                          .SetLayout(pangolin::LayoutEqualHorizontal)\n                                          .AddDisplay(pangolin::Display(GPUTexture::RGB))\n                                          .AddDisplay(pangolin::Display(GPUTexture::DEPTH_NORM))\n                                          .AddDisplay(pangolin::Display(\"ModelImg\"))\n                                          .AddDisplay(pangolin::Display(\"Model\"))\n                                          .AddDisplay(*resPlot)\n                                          .AddDisplay(*inPlot);\n            }\n\n            pause = new pangolin::Var<bool>(\"ui.Pause\", false, true);\n            step = new pangolin::Var<bool>(\"ui.Step\", false, false);\n            save = new pangolin::Var<bool>(\"ui.Save\", false, false);\n            reset = new pangolin::Var<bool>(\"ui.Reset\", false, false);\n            flipColors = new pangolin::Var<bool>(\"ui.Flip RGB\", false, true);\n\n            if(liveCap)\n            {\n                autoSettings = new pangolin::Var<bool>(\"ui.Auto Settings\", true, true);\n            }\n            else\n            {\n                autoSettings = 0;\n            }\n\n            pyramid = new pangolin::Var<bool>(\"ui.Pyramid\", true, true);\n            so3 = new pangolin::Var<bool>(\"ui.SO(3)\", true, true);\n            frameToFrameRGB = new pangolin::Var<bool>(\"ui.Frame to frame RGB\", false, true);\n            fastOdom = new pangolin::Var<bool>(\"ui.Fast Odometry\", false, true);\n            rgbOnly = new pangolin::Var<bool>(\"ui.RGB only tracking\", false, true);\n            confidenceThreshold = new pangolin::Var<float>(\"ui.Confidence threshold\", 10.0, 0.0, 24.0);\n            depthCutoff = new pangolin::Var<float>(\"ui.Depth cutoff\", 3.0, 0.0, 12.0);\n            icpWeight = new pangolin::Var<float>(\"ui.ICP weight\", 10.0, 0.0, 100.0);\n\n            followPose = new pangolin::Var<bool>(\"ui.Follow pose\", true, true);\n            drawRawCloud = new pangolin::Var<bool>(\"ui.Draw raw\", false, true);\n            drawFilteredCloud = new pangolin::Var<bool>(\"ui.Draw filtered\", false, true);\n            drawGlobalModel = new pangolin::Var<bool>(\"ui.Draw global model\", true, true);\n            drawUnstable = new pangolin::Var<bool>(\"ui.Draw unstable points\", false, true);\n            drawPoints = new pangolin::Var<bool>(\"ui.Draw points\", false, true);\n            drawColors = new pangolin::Var<bool>(\"ui.Draw colors\", showcaseMode, true);\n            drawFxaa = new pangolin::Var<bool>(\"ui.Draw FXAA\", showcaseMode, true);\n            drawWindow = new pangolin::Var<bool>(\"ui.Draw time window\", false, true);\n            drawNormals = new pangolin::Var<bool>(\"ui.Draw normals\", false, true);\n            drawTimes = new pangolin::Var<bool>(\"ui.Draw times\", false, true);\n            drawDefGraph = new pangolin::Var<bool>(\"ui.Draw deformation graph\", false, true);\n            drawFerns = new pangolin::Var<bool>(\"ui.Draw ferns\", false, true);\n            drawDeforms = new pangolin::Var<bool>(\"ui.Draw deformations\", true, true);\n\n            gpuMem = new pangolin::Var<int>(\"ui.GPU memory free\", 0);\n\n            totalPoints = new pangolin::Var<std::string>(\"ui.Total points\", \"0\");\n            totalNodes = new pangolin::Var<std::string>(\"ui.Total nodes\", \"0\");\n            totalFerns = new pangolin::Var<std::string>(\"ui.Total ferns\", \"0\");\n            totalDefs = new pangolin::Var<std::string>(\"ui.Total deforms\", \"0\");\n            totalFernDefs = new pangolin::Var<std::string>(\"ui.Total fern deforms\", \"0\");\n\n            trackInliers = new pangolin::Var<std::string>(\"ui.Inliers\", \"0\");\n            trackRes = new pangolin::Var<std::string>(\"ui.Residual\", \"0\");\n            logProgress = new pangolin::Var<std::string>(\"ui.Log\", \"0\");\n\n            if(showcaseMode)\n            {\n                pangolin::RegisterKeyPressCallback(' ', pangolin::SetVarFunctor<bool>(\"ui.Reset\", true));\n            }\n        }\n\n        virtual ~GUI()\n        {\n            delete pause;\n            delete reset;\n            delete inPlot;\n            delete resPlot;\n\n            if(autoSettings)\n            {\n                delete autoSettings;\n\n            }\n            delete step;\n            delete save;\n            delete trackInliers;\n            delete trackRes;\n            delete confidenceThreshold;\n            delete totalNodes;\n            delete drawWindow;\n            delete so3;\n            delete totalFerns;\n            delete totalDefs;\n            delete depthCutoff;\n            delete logProgress;\n            delete drawTimes;\n            delete drawFxaa;\n            delete fastOdom;\n            delete icpWeight;\n            delete pyramid;\n            delete rgbOnly;\n            delete totalFernDefs;\n            delete drawFerns;\n            delete followPose;\n            delete drawDeforms;\n            delete drawRawCloud;\n            delete totalPoints;\n            delete frameToFrameRGB;\n            delete flipColors;\n            delete drawFilteredCloud;\n            delete drawNormals;\n            delete drawColors;\n            delete drawGlobalModel;\n            delete drawUnstable;\n            delete drawPoints;\n            delete drawDefGraph;\n            delete gpuMem;\n\n            delete renderBuffer;\n            delete colorFrameBuffer;\n            delete colorTexture;\n        }\n\n        void preCall()\n        {\n            glClearColor(0.05 * !showcaseMode, 0.05 * !showcaseMode, 0.3 * !showcaseMode, 0.0f);\n            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n\n            width = pangolin::DisplayBase().v.w;\n            height = pangolin::DisplayBase().v.h;\n\n            pangolin::Display(\"cam\").Activate(s_cam);\n        }\n\n        inline void drawFrustum(const Eigen::Matrix4f & pose)\n        {\n            if(showcaseMode)\n                return;\n\n            Eigen::Matrix3f K = Eigen::Matrix3f::Identity();\n            K(0, 0) = Intrinsics::getInstance().fx();\n            K(1, 1) = Intrinsics::getInstance().fy();\n            K(0, 2) = Intrinsics::getInstance().cx();\n            K(1, 2) = Intrinsics::getInstance().cy();\n\n            Eigen::Matrix3f Kinv = K.inverse();\n\n            pangolin::glDrawFrustum(Kinv,\n                                     Resolution::getInstance().width(),\n                                     Resolution::getInstance().height(),\n                                     pose,\n                                     0.1f);\n        }\n\n        void displayImg(const std::string & id, GPUTexture * img)\n        {\n            if(showcaseMode)\n                return;\n\n            glDisable(GL_DEPTH_TEST);\n\n            pangolin::Display(id).Activate();\n            img->texture->RenderToViewport(true);\n\n            glEnable(GL_DEPTH_TEST);\n        }\n\n        void postCall()\n        {\n            GLint cur_avail_mem_kb = 0;\n            glGetIntegerv(GL_GPU_MEM_INFO_CURRENT_AVAILABLE_MEM_NVX, &cur_avail_mem_kb);\n\n            int memFree = cur_avail_mem_kb / 1024;\n\n            gpuMem->operator=(memFree);\n\n            pangolin::FinishFrame();\n\n            glFinish();\n        }\n\n        void drawFXAA(pangolin::OpenGlMatrix mvp,\n                      pangolin::OpenGlMatrix mv,\n                      const std::pair<GLuint, GLuint> & model,\n                      const float threshold,\n                      const int time,\n                      const int timeDelta,\n                      const bool invertNormals)\n        {\n            //First pass computes positions, colors and normals per pixel\n            colorFrameBuffer->Bind();\n\n            glPushAttrib(GL_VIEWPORT_BIT);\n\n            glViewport(0, 0, renderBuffer->width, renderBuffer->height);\n\n            glClearColor(0.05 * !showcaseMode, 0.05 * !showcaseMode, 0.3 * !showcaseMode, 0);\n\n            glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);\n\n            colorProgram->Bind();\n\n            colorProgram->setUniform(Uniform(\"MVP\", mvp));\n\n            colorProgram->setUniform(Uniform(\"threshold\", threshold));\n\n            colorProgram->setUniform(Uniform(\"time\", time));\n\n            colorProgram->setUniform(Uniform(\"timeDelta\", timeDelta));\n\n            colorProgram->setUniform(Uniform(\"signMult\", invertNormals ? 1.0f : -1.0f));\n\n            colorProgram->setUniform(Uniform(\"colorType\", (drawNormals->Get() ? 1 : drawColors->Get() ? 2 : drawTimes->Get() ? 3 : 0)));\n\n            colorProgram->setUniform(Uniform(\"unstable\", drawUnstable->Get()));\n\n            colorProgram->setUniform(Uniform(\"drawWindow\", drawWindow->Get()));\n\n            Eigen::Matrix4f pose = Eigen::Matrix4f::Identity();\n            //This is for the point shader\n            colorProgram->setUniform(Uniform(\"pose\", pose));\n\n            Eigen::Matrix4f modelView = mv;\n\n            Eigen::Vector3f lightpos = modelView.topRightCorner(3, 1);\n\n            colorProgram->setUniform(Uniform(\"lightpos\", lightpos));\n\n            glBindBuffer(GL_ARRAY_BUFFER, model.first);\n\n            glEnableVertexAttribArray(0);\n            glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, 0);\n\n            glEnableVertexAttribArray(1);\n            glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, reinterpret_cast<GLvoid*>(sizeof(Eigen::Vector4f) * 1));\n\n            glEnableVertexAttribArray(2);\n            glVertexAttribPointer(2, 4, GL_FLOAT, GL_FALSE, Vertex::SIZE, reinterpret_cast<GLvoid*>(sizeof(Eigen::Vector4f) * 2));\n\n            glDrawTransformFeedback(GL_POINTS, model.second);\n\n            glDisableVertexAttribArray(0);\n            glDisableVertexAttribArray(1);\n            glDisableVertexAttribArray(2);\n            glBindBuffer(GL_ARRAY_BUFFER, 0);\n\n            colorFrameBuffer->Unbind();\n\n            colorProgram->Unbind();\n\n            glPopAttrib();\n\n            fxaaProgram->Bind();\n\n            glActiveTexture(GL_TEXTURE0);\n            glBindTexture(GL_TEXTURE_2D, colorTexture->texture->tid);\n\n            Eigen::Vector2f resolution(renderBuffer->width, renderBuffer->height);\n\n            fxaaProgram->setUniform(Uniform(\"tex\", 0));\n            fxaaProgram->setUniform(Uniform(\"resolution\", resolution));\n\n            glDrawArrays(GL_POINTS, 0, 1);\n\n            fxaaProgram->Unbind();\n\n            glBindFramebuffer(GL_READ_FRAMEBUFFER, colorFrameBuffer->fbid);\n\n            glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);\n\n            glBlitFramebuffer(0, 0, renderBuffer->width, renderBuffer->height, 0, 0, width, height, GL_DEPTH_BUFFER_BIT, GL_NEAREST);\n\n            glBindTexture(GL_TEXTURE_2D, 0);\n\n            glFinish();\n        }\n\n        bool showcaseMode;\n        int width;\n        int height;\n        int panel;\n\n        pangolin::Var<bool> * pause,\n                            * step,\n                            * save,\n                            * reset,\n                            * flipColors,\n                            * rgbOnly,\n                            * pyramid,\n                            * so3,\n                            * frameToFrameRGB,\n                            * fastOdom,\n                            * followPose,\n                            * drawRawCloud,\n                            * drawFilteredCloud,\n                            * drawNormals,\n                            * autoSettings,\n                            * drawDefGraph,\n                            * drawColors,\n                            * drawFxaa,\n                            * drawGlobalModel,\n                            * drawUnstable,\n                            * drawPoints,\n                            * drawTimes,\n                            * drawFerns,\n                            * drawDeforms,\n                            * drawWindow;\n        pangolin::Var<int> * gpuMem;\n        pangolin::Var<std::string> * totalPoints,\n                                   * totalNodes,\n                                   * totalFerns,\n                                   * totalDefs,\n                                   * totalFernDefs,\n                                   * trackInliers,\n                                   * trackRes,\n                                   * logProgress;\n        pangolin::Var<float> * confidenceThreshold,\n                             * depthCutoff,\n                             * icpWeight;\n\n        pangolin::DataLog resLog, inLog;\n        pangolin::Plotter * resPlot,\n                          * inPlot;\n\n        pangolin::OpenGlRenderState s_cam;\n\n        pangolin::GlRenderBuffer * renderBuffer;\n        pangolin::GlFramebuffer * colorFrameBuffer;\n        GPUTexture * colorTexture;\n        std::shared_ptr<Shader> colorProgram;\n        std::shared_ptr<Shader> fxaaProgram;\n};\n\n\n#endif /* GUI_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/app/src/Tools/GroundTruthOdometry.cpp",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#include \"GroundTruthOdometry.h\"\n\nGroundTruthOdometry::GroundTruthOdometry(const std::string & filename)\n : last_utime(0)\n{\n    loadTrajectory(filename);\n}\n\nGroundTruthOdometry::~GroundTruthOdometry()\n{\n\n}\n\nvoid GroundTruthOdometry::loadTrajectory(const std::string & filename)\n{\n    std::ifstream file;\n    std::string line;\n    file.open(filename.c_str());\n    while (!file.eof())\n    {\n        unsigned long long int utime;\n        float x, y, z, qx, qy, qz, qw;\n        std::getline(file, line);\n        int n = sscanf(line.c_str(), \"%llu,%f,%f,%f,%f,%f,%f,%f\", &utime, &x, &y, &z, &qx, &qy, &qz, &qw);\n\n        if(file.eof())\n            break;\n\n        assert(n == 8);\n\n        Eigen::Quaternionf q(qw, qx, qy, qz);\n        Eigen::Vector3f t(x, y, z);\n\n        Eigen::Isometry3f T;\n        T.setIdentity();\n        T.pretranslate(t).rotate(q);\n        camera_trajectory[utime] = T;\n    }\n}\n\nEigen::Matrix4f GroundTruthOdometry::getTransformation(uint64_t timestamp)\n{\n    Eigen::Matrix4f pose = Eigen::Matrix4f::Identity();\n\n    if(last_utime != 0)\n    {\n        std::map<uint64_t, Eigen::Isometry3f>::const_iterator it = camera_trajectory.find(last_utime);\n        if (it == camera_trajectory.end())\n        {\n            last_utime = timestamp;\n            return pose;\n        }\n\n        //Poses are stored in the file in iSAM basis, undo it\n        Eigen::Matrix4f M;\n        M <<  0,  0, 1, 0,\n             -1,  0, 0, 0,\n              0, -1, 0, 0,\n              0,  0, 0, 1;\n\n        pose = M.inverse() * camera_trajectory[timestamp] * M;\n    }\n    else\n    {\n        std::map<uint64_t, Eigen::Isometry3f>::const_iterator it = camera_trajectory.find(timestamp);\n        Eigen::Isometry3f ident = it->second;\n        pose = Eigen::Matrix4f::Identity();\n        camera_trajectory[last_utime] = ident;\n    }\n\n    last_utime = timestamp;\n\n    return pose;\n}\n\nEigen::MatrixXd GroundTruthOdometry::getCovariance()\n{\n    Eigen::MatrixXd cov(6, 6);\n    cov.setIdentity();\n    cov(0, 0) = 0.1;\n    cov(1, 1) = 0.1;\n    cov(2, 2) = 0.1;\n    cov(3, 3) = 0.5;\n    cov(4, 4) = 0.5;\n    cov(5, 5) = 0.5;\n    return cov;\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/app/src/Tools/GroundTruthOdometry.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef GROUNDTRUTHODOMETRY_H_\n#define GROUNDTRUTHODOMETRY_H_\n\n#ifdef WIN32\n#  include <cstdint>\n#endif \n\n#include <Eigen/Core>\n#include <Eigen/SVD>\n#include <Eigen/Cholesky>\n#include <Eigen/Geometry>\n#include <Eigen/LU>\n#include <iostream>\n#include <fstream>\n#include <map>\n#include <Utils/OdometryProvider.h>\n\nclass GroundTruthOdometry\n{\n    public:\n        GroundTruthOdometry(const std::string & filename);\n\n        virtual ~GroundTruthOdometry();\n\n        Eigen::Matrix4f getTransformation(uint64_t timestamp);\n\n        Eigen::MatrixXd getCovariance();\n\n    private:\n        void loadTrajectory(const std::string & filename);\n\n        std::map<uint64_t, Eigen::Isometry3f, std::less<int>, Eigen::aligned_allocator<std::pair<const uint64_t, Eigen::Isometry3f> > > camera_trajectory;\n        uint64_t last_utime;\n};\n\n#endif /* GROUNDTRUTHODOMETRY_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/app/src/Tools/JPEGLoader.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef TOOLS_JPEGLOADER_H_\n#define TOOLS_JPEGLOADER_H_\n\nextern \"C\"\n{\n#include \"jpeglib.h\"\n}\n\n#include <stdio.h>\n#include <string>\n\nstatic void jpegFail(j_common_ptr cinfo)\n{\n    assert(false && \"JPEG decoding error!\");\n}\n\nstatic void doNothing(j_decompress_ptr)\n{\n\n}\n\nclass JPEGLoader\n{\n    public:\n        JPEGLoader()\n        {}\n\n        void readData(unsigned char * src, const int numBytes, unsigned char * data)\n        {\n            jpeg_decompress_struct cinfo; // IJG JPEG codec structure\n\n            jpeg_error_mgr errorMgr;\n\n            errorMgr.error_exit = jpegFail;\n\n            cinfo.err = jpeg_std_error(&errorMgr);\n\n            jpeg_create_decompress(&cinfo);\n\n            jpeg_source_mgr srcMgr;\n\n            cinfo.src = &srcMgr;\n\n            // Prepare for suspending reader\n            srcMgr.init_source = doNothing;\n            srcMgr.resync_to_restart = jpeg_resync_to_restart;\n            srcMgr.term_source = doNothing;\n            srcMgr.next_input_byte = src;\n            srcMgr.bytes_in_buffer = numBytes;\n\n            jpeg_read_header(&cinfo, TRUE);\n\n            jpeg_calc_output_dimensions(&cinfo);\n\n            jpeg_start_decompress(&cinfo);\n\n            int width = cinfo.output_width;\n            int height = cinfo.output_height;\n\n            JSAMPARRAY buffer = (*cinfo.mem->alloc_sarray)((j_common_ptr)&cinfo, JPOOL_IMAGE, width * 4, 1);\n\n            for(; height--; data += (width * 3))\n            {\n                jpeg_read_scanlines(&cinfo, buffer, 1);\n\n                unsigned char * bgr = (unsigned char *)buffer[0];\n                unsigned char * rgb = (unsigned char *)data;\n\n                for(int i = 0; i < width; i++, bgr += 3, rgb += 3)\n                {\n                    unsigned char t0 = bgr[0], t1 = bgr[1], t2 = bgr[2];\n                    rgb[2] = t0; rgb[1] = t1; rgb[0] = t2;\n                }\n            }\n\n            jpeg_finish_decompress(&cinfo);\n\n            jpeg_destroy_decompress(&cinfo);\n        }\n};\n\n\n#endif /* TOOLS_JPEGLOADER_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/app/src/Tools/LiveLogReader.cpp",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#include \"LiveLogReader.h\"\n\n#include \"OpenNI2Interface.h\"\n#include \"RealSenseInterface.h\"\n\nLiveLogReader::LiveLogReader(std::string file, bool flipColors, CameraType type)\n : LogReader(file, flipColors),\n   lastFrameTime(-1),\n   lastGot(-1)\n{\n    std::cout << \"Creating live capture... \"; std::cout.flush();\n\n    if(type == CameraType::OpenNI2)\n      cam = new OpenNI2Interface(Resolution::getInstance().width(),Resolution::getInstance().height());\n    else if(type == CameraType::RealSense)\n      cam = new RealSenseInterface(Resolution::getInstance().width(), Resolution::getInstance().height());\n    else\n      cam = nullptr;\n\n\tdecompressionBufferDepth = new Bytef[Resolution::getInstance().numPixels() * 2];\n\n\tdecompressionBufferImage = new Bytef[Resolution::getInstance().numPixels() * 3];\n\n    if(!cam || !cam->ok())\n    {\n        std::cout << \"failed!\" << std::endl;\n        std::cout << cam->error();\n    }\n    else\n    {\n        std::cout << \"success!\" << std::endl;\n\n        std::cout << \"Waiting for first frame\"; std::cout.flush();\n\n        int lastDepth = cam->latestDepthIndex.getValue();\n\n        do\n        {\n          std::this_thread::sleep_for(std::chrono::microseconds(33333));\n            std::cout << \".\"; std::cout.flush();\n            lastDepth = cam->latestDepthIndex.getValue();\n        } while(lastDepth == -1);\n\n        std::cout << \" got it!\" << std::endl;\n    }\n}\n\nLiveLogReader::~LiveLogReader()\n{\n    delete [] decompressionBufferDepth;\n\n    delete [] decompressionBufferImage;\n\n\tdelete cam;\n}\n\nvoid LiveLogReader::getNext()\n{\n    int lastDepth = cam->latestDepthIndex.getValue();\n\n    assert(lastDepth != -1);\n\n    int bufferIndex = lastDepth % CameraInterface::numBuffers;\n\n    if(bufferIndex == lastGot)\n    {\n        return;\n    }\n\n    if(lastFrameTime == cam->frameBuffers[bufferIndex].second)\n    {\n        return;\n    }\n\n    memcpy(&decompressionBufferDepth[0], cam->frameBuffers[bufferIndex].first.first, Resolution::getInstance().numPixels() * 2);\n    memcpy(&decompressionBufferImage[0], cam->frameBuffers[bufferIndex].first.second,Resolution::getInstance().numPixels() * 3);\n\n    lastFrameTime = cam->frameBuffers[bufferIndex].second;\n\n    timestamp = lastFrameTime;\n\n    rgb = (unsigned char *)&decompressionBufferImage[0];\n    depth = (unsigned short *)&decompressionBufferDepth[0];\n\n    imageReadBuffer = 0;\n    depthReadBuffer = 0;\n\n    imageSize = Resolution::getInstance().numPixels() * 3;\n    depthSize = Resolution::getInstance().numPixels() * 2;\n\n    if(flipColors)\n    {\n        for(int i = 0; i < Resolution::getInstance().numPixels() * 3; i += 3)\n        {\n            std::swap(rgb[i + 0], rgb[i + 2]);\n        }\n    }\n}\n\nconst std::string LiveLogReader::getFile()\n{\n    return Parse::get().baseDir().append(\"live\");\n}\n\nint LiveLogReader::getNumFrames()\n{\n    return std::numeric_limits<int>::max();\n}\n\nbool LiveLogReader::hasMore()\n{\n    return true;\n}\n\nvoid LiveLogReader::setAuto(bool value)\n{\n    cam->setAutoExposure(value);\n    cam->setAutoWhiteBalance(value);\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/app/src/Tools/LiveLogReader.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n *\n * The use of the code within this file and all code within files that\n * make up the software that is ElasticFusion is permitted for\n * non-commercial purposes only.  The full terms and conditions that\n * apply to the code within this file are detailed within the LICENSE.txt\n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/>\n * unless explicitly stated.  By downloading this file you agree to\n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then\n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef LIVELOGREADER_H_\n#define LIVELOGREADER_H_\n\n#include <stdio.h>\n#include <stdlib.h>\n#ifndef WIN32\n#  include <poll.h>\n#endif\n#include <signal.h>\n#include <chrono>\n#include <thread>\n\n#include <Utils/Parse.h>\n\n#include \"LogReader.h\"\n#include \"CameraInterface.h\"\n\nclass LiveLogReader : public LogReader\n{\n\tpublic:\n    enum CameraType\n    {\n      OpenNI2,RealSense\n    };\n\n\t\tLiveLogReader(std::string file, bool flipColors, CameraType type);\n\n\t\tvirtual ~LiveLogReader();\n\n        void getNext();\n\n        int getNumFrames();\n\n        bool hasMore();\n\n        bool rewound()\n        {\n            return false;\n        }\n\n        void rewind()\n        {\n\n        }\n\n        void getBack()\n        {\n\n        }\n\n        void fastForward(int frame)\n        {\n\n        }\n\n        const std::string getFile();\n\n        void setAuto(bool value);\n\n\t\tCameraInterface * cam;\n\n\tprivate:\n\t\tint64_t lastFrameTime;\n\t\tint lastGot;\n};\n\n#endif /* LIVELOGREADER_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/app/src/Tools/LogReader.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n *\n * The use of the code within this file and all code within files that\n * make up the software that is ElasticFusion is permitted for\n * non-commercial purposes only.  The full terms and conditions that\n * apply to the code within this file are detailed within the LICENSE.txt\n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/>\n * unless explicitly stated.  By downloading this file you agree to\n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then\n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef LOGREADER_H_\n#define LOGREADER_H_\n\n#ifdef WIN32\n#  include <cstdint>\n#endif\n#include <string>\n#if (defined WIN32) && (defined FAR)\n#  undef FAR\n#endif\n#include <zlib.h>\n#ifndef WIN32\n#  include <poll.h>\n#endif\n#include <Utils/Img.h>\n#include <Utils/Resolution.h>\n\n#include \"JPEGLoader.h\"\n\nclass LogReader\n{\n    public:\n        LogReader(std::string file, bool flipColors)\n         : flipColors(flipColors),\n           timestamp(0),\n           depth(0),\n           rgb(0),\n           currentFrame(0),\n           decompressionBufferDepth(0),\n           decompressionBufferImage(0),\n           file(file),\n           width(Resolution::getInstance().width()),\n           height(Resolution::getInstance().height()),\n           numPixels(width * height)\n        {}\n\n        virtual ~LogReader()\n        {}\n\n        virtual void getNext() = 0;\n\n        virtual int getNumFrames() = 0;\n\n        virtual bool hasMore() = 0;\n\n        virtual bool rewound() = 0;\n\n        virtual void rewind() = 0;\n\n        virtual void getBack() = 0;\n\n        virtual void fastForward(int frame) = 0;\n\n        virtual const std::string getFile() = 0;\n\n        virtual void setAuto(bool value) = 0;\n\n        bool flipColors;\n        int64_t timestamp;\n\n        unsigned short * depth;\n        unsigned char * rgb;\n        int currentFrame;\n\n    protected:\n        Bytef * decompressionBufferDepth;\n        Bytef * decompressionBufferImage;\n        unsigned char * depthReadBuffer;\n        unsigned char * imageReadBuffer;\n        int32_t depthSize;\n        int32_t imageSize;\n\n        const std::string file;\n        FILE * fp;\n        int32_t numFrames;\n        int width;\n        int height;\n        int numPixels;\n\n        JPEGLoader jpeg;\n};\n\n#endif /* LOGREADER_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/app/src/Tools/OpenNI2Interface.cpp",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#include \"OpenNI2Interface.h\"\n\nOpenNI2Interface::OpenNI2Interface(int inWidth, int inHeight, int fps)\n : width(inWidth),\n   height(inHeight),\n   fps(fps),\n   initSuccessful(true)\n{\n    //Setup\n    openni::Status rc = openni::STATUS_OK;\n\n    const char * deviceURI = openni::ANY_DEVICE;\n\n    rc = openni::OpenNI::initialize();\n\n    std::string errorString(openni::OpenNI::getExtendedError());\n\n    if(errorString.length() > 0)\n    {\n        errorText.append(errorString);\n        initSuccessful = false;\n    }\n    else\n    {\n        rc = device.open(deviceURI);\n        if (rc != openni::STATUS_OK)\n        {\n            errorText.append(openni::OpenNI::getExtendedError());\n            openni::OpenNI::shutdown();\n            initSuccessful = false;\n        }\n        else\n        {\n            openni::VideoMode depthMode;\n            depthMode.setFps(fps);\n            depthMode.setPixelFormat(openni::PIXEL_FORMAT_DEPTH_1_MM);\n            depthMode.setResolution(width, height);\n\n            openni::VideoMode colorMode;\n            colorMode.setFps(fps);\n            colorMode.setPixelFormat(openni::PIXEL_FORMAT_RGB888);\n            colorMode.setResolution(width, height);\n\n            rc = depthStream.create(device, openni::SENSOR_DEPTH);\n            if (rc == openni::STATUS_OK)\n            {\n                depthStream.setVideoMode(depthMode);\n                rc = depthStream.start();\n                if (rc != openni::STATUS_OK)\n                {\n                    errorText.append(openni::OpenNI::getExtendedError());\n                    depthStream.destroy();\n                    initSuccessful = false;\n                }\n            }\n            else\n            {\n                errorText.append(openni::OpenNI::getExtendedError());\n                initSuccessful = false;\n            }\n\n            rc = rgbStream.create(device, openni::SENSOR_COLOR);\n            if (rc == openni::STATUS_OK)\n            {\n                rgbStream.setVideoMode(colorMode);\n                rc = rgbStream.start();\n                if (rc != openni::STATUS_OK)\n                {\n                    errorText.append(openni::OpenNI::getExtendedError());\n                    rgbStream.destroy();\n                    initSuccessful = false;\n                }\n            }\n            else\n            {\n                errorText.append(openni::OpenNI::getExtendedError());\n                initSuccessful = false;\n            }\n\n            if (!depthStream.isValid() || !rgbStream.isValid())\n            {\n                errorText.append(openni::OpenNI::getExtendedError());\n                openni::OpenNI::shutdown();\n                initSuccessful = false;\n            }\n\n            if(initSuccessful)\n            {\n                //For printing out\n                formatMap[openni::PIXEL_FORMAT_DEPTH_1_MM] = \"1mm\";\n                formatMap[openni::PIXEL_FORMAT_DEPTH_100_UM] = \"100um\";\n                formatMap[openni::PIXEL_FORMAT_SHIFT_9_2] = \"Shift 9 2\";\n                formatMap[openni::PIXEL_FORMAT_SHIFT_9_3] = \"Shift 9 3\";\n\n                formatMap[openni::PIXEL_FORMAT_RGB888] = \"RGB888\";\n                formatMap[openni::PIXEL_FORMAT_YUV422] = \"YUV422\";\n                formatMap[openni::PIXEL_FORMAT_GRAY8] = \"GRAY8\";\n                formatMap[openni::PIXEL_FORMAT_GRAY16] = \"GRAY16\";\n                formatMap[openni::PIXEL_FORMAT_JPEG] = \"JPEG\";\n\n                assert(findMode(width, height, fps) && \"Sorry, mode not supported!\");\n\n                latestDepthIndex.assign(-1);\n                latestRgbIndex.assign(-1);\n\n                for(int i = 0; i < numBuffers; i++)\n                {\n                    uint8_t * newImage = (uint8_t *)calloc(width * height * 3, sizeof(uint8_t));\n                    rgbBuffers[i] = std::pair<uint8_t *, int64_t>(newImage, 0);\n                }\n\n                for(int i = 0; i < numBuffers; i++)\n                {\n                    uint8_t * newDepth = (uint8_t *)calloc(width * height * 2, sizeof(uint8_t));\n                    uint8_t * newImage = (uint8_t *)calloc(width * height * 3, sizeof(uint8_t));\n                    frameBuffers[i] = std::pair<std::pair<uint8_t *, uint8_t *>, int64_t>(std::pair<uint8_t *, uint8_t *>(newDepth, newImage), 0);\n                }\n\n                rgbCallback = new RGBCallback(lastRgbTime,\n                                              latestRgbIndex,\n                                              rgbBuffers);\n\n                depthCallback = new DepthCallback(lastDepthTime,\n                                                  latestDepthIndex,\n                                                  latestRgbIndex,\n                                                  rgbBuffers,\n                                                  frameBuffers);\n\n                depthStream.setMirroringEnabled(false);\n                rgbStream.setMirroringEnabled(false);\n\n                device.setDepthColorSyncEnabled(true);\n                device.setImageRegistrationMode(openni::IMAGE_REGISTRATION_DEPTH_TO_COLOR);\n\n                setAutoExposure(true);\n                setAutoWhiteBalance(true);\n\n                rgbStream.addNewFrameListener(rgbCallback);\n                depthStream.addNewFrameListener(depthCallback);\n            }\n        }\n    }\n}\n\nOpenNI2Interface::~OpenNI2Interface()\n{\n    if(initSuccessful)\n    {\n        rgbStream.removeNewFrameListener(rgbCallback);\n        depthStream.removeNewFrameListener(depthCallback);\n\n        depthStream.stop();\n        rgbStream.stop();\n        depthStream.destroy();\n        rgbStream.destroy();\n        device.close();\n        openni::OpenNI::shutdown();\n\n        for(int i = 0; i < numBuffers; i++)\n        {\n            free(rgbBuffers[i].first);\n        }\n\n        for(int i = 0; i < numBuffers; i++)\n        {\n            free(frameBuffers[i].first.first);\n            free(frameBuffers[i].first.second);\n        }\n\n        delete rgbCallback;\n        delete depthCallback;\n    }\n}\n\nbool OpenNI2Interface::findMode(int x, int y, int fps)\n{\n    const openni::Array<openni::VideoMode> & depthModes = depthStream.getSensorInfo().getSupportedVideoModes();\n\n    bool found = false;\n\n    for(int i = 0; i < depthModes.getSize(); i++)\n    {\n        if(depthModes[i].getResolutionX() == x &&\n           depthModes[i].getResolutionY() == y &&\n           depthModes[i].getFps() == fps)\n        {\n            found = true;\n            break;\n        }\n    }\n\n    if(!found)\n    {\n        return false;\n    }\n\n    found = false;\n\n    const openni::Array<openni::VideoMode> & rgbModes = rgbStream.getSensorInfo().getSupportedVideoModes();\n\n    for(int i = 0; i < rgbModes.getSize(); i++)\n    {\n        if(rgbModes[i].getResolutionX() == x &&\n           rgbModes[i].getResolutionY() == y &&\n           rgbModes[i].getFps() == fps)\n        {\n            found = true;\n            break;\n        }\n    }\n\n    return found;\n}\n\nvoid OpenNI2Interface::printModes()\n{\n    const openni::Array<openni::VideoMode> & depthModes = depthStream.getSensorInfo().getSupportedVideoModes();\n\n    openni::VideoMode currentDepth = depthStream.getVideoMode();\n\n    std::cout << \"Depth Modes: (\" << currentDepth.getResolutionX() <<\n                                     \"x\" <<\n                                     currentDepth.getResolutionY() <<\n                                     \" @ \" <<\n                                     currentDepth.getFps() <<\n                                     \"fps \" <<\n                                     formatMap[currentDepth.getPixelFormat()] << \")\" << std::endl;\n\n    for(int i = 0; i < depthModes.getSize(); i++)\n    {\n        std::cout << depthModes[i].getResolutionX() <<\n                     \"x\" <<\n                     depthModes[i].getResolutionY() <<\n                     \" @ \" <<\n                     depthModes[i].getFps() <<\n                     \"fps \" <<\n                     formatMap[depthModes[i].getPixelFormat()] << std::endl;\n    }\n\n    const openni::Array<openni::VideoMode> & rgbModes = rgbStream.getSensorInfo().getSupportedVideoModes();\n\n    openni::VideoMode currentRGB = depthStream.getVideoMode();\n\n    std::cout << \"RGB Modes: (\" << currentRGB.getResolutionX() <<\n                                   \"x\" <<\n                                   currentRGB.getResolutionY() <<\n                                   \" @ \" <<\n                                   currentRGB.getFps() <<\n                                   \"fps \" <<\n                                   formatMap[currentRGB.getPixelFormat()] << \")\" << std::endl;\n\n    for(int i = 0; i < rgbModes.getSize(); i++)\n    {\n        std::cout << rgbModes[i].getResolutionX() <<\n                     \"x\" <<\n                     rgbModes[i].getResolutionY() <<\n                     \" @ \" <<\n                     rgbModes[i].getFps() <<\n                     \"fps \" <<\n                     formatMap[rgbModes[i].getPixelFormat()] << std::endl;\n    }\n}\n\nvoid OpenNI2Interface::setAutoExposure(bool value)\n{\n    rgbStream.getCameraSettings()->setAutoExposureEnabled(value);\n}\n\nvoid OpenNI2Interface::setAutoWhiteBalance(bool value)\n{\n    rgbStream.getCameraSettings()->setAutoWhiteBalanceEnabled(value);\n}\n\nbool OpenNI2Interface::getAutoExposure()\n{\n    return rgbStream.getCameraSettings()->getAutoExposureEnabled();\n}\n\nbool OpenNI2Interface::getAutoWhiteBalance()\n{\n    return rgbStream.getCameraSettings()->getAutoWhiteBalanceEnabled();\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/app/src/Tools/OpenNI2Interface.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef OPENNI2INTERFACE_H_\n#define OPENNI2INTERFACE_H_\n\n#include <OpenNI.h>\n#include <PS1080.h>\n#include <string>\n#include <iostream>\n#include <algorithm>\n#include <map>\n\n#include \"ThreadMutexObject.h\"\n#include \"CameraInterface.h\"\n\nclass OpenNI2Interface : public CameraInterface\n{\n    public:\n        OpenNI2Interface(int inWidth = 640, int inHeight = 480, int fps = 30);\n        virtual ~OpenNI2Interface();\n\n        const int width, height, fps;\n\n        void printModes();\n        bool findMode(int x, int y, int fps);\n        virtual void setAutoExposure(bool value);\n        virtual void setAutoWhiteBalance(bool value);\n        bool getAutoExposure();\n        bool getAutoWhiteBalance();\n\n        virtual bool ok()\n        {\n            return initSuccessful;\n        }\n\n        virtual std::string error()\n        {\n            errorText.erase(std::remove_if(errorText.begin(), errorText.end(), &OpenNI2Interface::isTab), errorText.end());\n            return errorText;\n        }\n\n        class RGBCallback : public openni::VideoStream::NewFrameListener\n        {\n            public:\n                RGBCallback(int64_t & lastRgbTime,\n                            ThreadMutexObject<int> & latestRgbIndex,\n                            std::pair<uint8_t *, int64_t> * rgbBuffers)\n                 : lastRgbTime(lastRgbTime),\n                   latestRgbIndex(latestRgbIndex),\n                   rgbBuffers(rgbBuffers)\n                {}\n\n                virtual ~RGBCallback() {}\n\n                void onNewFrame(openni::VideoStream& stream)\n                {\n                    stream.readFrame(&frame);\n\n                    lastRgbTime = std::chrono::duration_cast<std::chrono::milliseconds>(\n                      std::chrono::system_clock::now().time_since_epoch()).count();\n\n                    int bufferIndex = (latestRgbIndex.getValue() + 1) % numBuffers;\n\n                    memcpy(rgbBuffers[bufferIndex].first, frame.getData(), frame.getWidth() * frame.getHeight() * 3);\n\n                    rgbBuffers[bufferIndex].second = lastRgbTime;\n\n                    latestRgbIndex++;\n                }\n\n            private:\n                openni::VideoFrameRef frame;\n                int64_t & lastRgbTime;\n                ThreadMutexObject<int> & latestRgbIndex;\n                std::pair<uint8_t *, int64_t> * rgbBuffers;\n        };\n\n        class DepthCallback : public openni::VideoStream::NewFrameListener\n        {\n            public:\n                DepthCallback(int64_t & lastDepthTime,\n                              ThreadMutexObject<int> & latestDepthIndex,\n                              ThreadMutexObject<int> & latestRgbIndex,\n                              std::pair<uint8_t *, int64_t> * rgbBuffers,\n                              std::pair<std::pair<uint8_t *, uint8_t *>, int64_t> * frameBuffers)\n                 : lastDepthTime(lastDepthTime),\n                   latestDepthIndex(latestDepthIndex),\n                   latestRgbIndex(latestRgbIndex),\n                   rgbBuffers(rgbBuffers),\n                   frameBuffers(frameBuffers)\n                {}\n\n                virtual ~DepthCallback() {}\n\n                void onNewFrame(openni::VideoStream& stream)\n                {\n                    stream.readFrame(&frame);\n\n                    lastDepthTime = std::chrono::duration_cast<std::chrono::milliseconds>(\n                      std::chrono::system_clock::now().time_since_epoch()).count();\n\n                    int bufferIndex = (latestDepthIndex.getValue() + 1) % numBuffers;\n\n                    memcpy(frameBuffers[bufferIndex].first.first, frame.getData(), frame.getWidth() * frame.getHeight() * 2);\n\n                    frameBuffers[bufferIndex].second = lastDepthTime;\n\n                    int lastImageVal = latestRgbIndex.getValue();\n\n                    if(lastImageVal == -1)\n                    {\n                        return;\n                    }\n\n                    lastImageVal %= numBuffers;\n\n                    memcpy(frameBuffers[bufferIndex].first.second, rgbBuffers[lastImageVal].first, frame.getWidth() * frame.getHeight() * 3);\n\n                    latestDepthIndex++;\n                }\n\n            private:\n                openni::VideoFrameRef frame;\n                int64_t & lastDepthTime;\n                ThreadMutexObject<int> & latestDepthIndex;\n                ThreadMutexObject<int> & latestRgbIndex;\n\n                std::pair<uint8_t *, int64_t> * rgbBuffers;\n                std::pair<std::pair<uint8_t *, uint8_t *>, int64_t> * frameBuffers;\n        };\n\n    private:\n        openni::Device device;\n\n        openni::VideoStream depthStream;\n        openni::VideoStream rgbStream;\n\n        //Map for formats from OpenNI2\n        std::map<int, std::string> formatMap;\n\n        int64_t lastRgbTime;\n        int64_t lastDepthTime;\n\n        ThreadMutexObject<int> latestRgbIndex;\n        std::pair<uint8_t *, int64_t> rgbBuffers[numBuffers];\n\n        RGBCallback * rgbCallback;\n        DepthCallback * depthCallback;\n\n        bool initSuccessful;\n        std::string errorText;\n\n        //For removing tabs from OpenNI's error messages\n        static bool isTab(char c)\n        {\n            switch(c)\n            {\n                case '\\t':\n                    return true;\n                default:\n                    return false;\n            }\n        }\n};\n\n#endif /* OPENNI2INTERFACE_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/app/src/Tools/RawLogReader.cpp",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n *\n * The use of the code within this file and all code within files that\n * make up the software that is ElasticFusion is permitted for\n * non-commercial purposes only.  The full terms and conditions that\n * apply to the code within this file are detailed within the LICENSE.txt\n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/>\n * unless explicitly stated.  By downloading this file you agree to\n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then\n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#include \"RawLogReader.h\"\n\nRawLogReader::RawLogReader(std::string file, bool flipColors)\n : LogReader(file, flipColors)\n{\n    assert(pangolin::FileExists(file.c_str()));\n\n    fp = fopen(file.c_str(), \"rb\");\n\n    currentFrame = 0;\n\n    auto tmp = fread(&numFrames,sizeof(int32_t),1,fp);\n    assert(tmp);\n\n    depthReadBuffer = new unsigned char[numPixels * 2];\n    imageReadBuffer = new unsigned char[numPixels * 3];\n    decompressionBufferDepth = new Bytef[Resolution::getInstance().numPixels() * 2];\n    decompressionBufferImage = new Bytef[Resolution::getInstance().numPixels() * 3];\n}\n\nRawLogReader::~RawLogReader()\n{\n    delete [] depthReadBuffer;\n    delete [] imageReadBuffer;\n    delete [] decompressionBufferDepth;\n    delete [] decompressionBufferImage;\n\n    fclose(fp);\n}\n\nvoid RawLogReader::getBack()\n{\n    assert(filePointers.size() > 0);\n\n    fseek(fp, filePointers.top(), SEEK_SET);\n\n    filePointers.pop();\n\n    getCore();\n}\n\nvoid RawLogReader::getNext()\n{\n    filePointers.push(ftell(fp));\n\n    getCore();\n}\n\nvoid RawLogReader::getCore()\n{\n    auto tmp = fread(&timestamp,sizeof(int64_t),1,fp);\n    assert(tmp);\n\n    tmp = fread(&depthSize,sizeof(int32_t),1,fp);\n    assert(tmp);\n    tmp = fread(&imageSize,sizeof(int32_t),1,fp);\n    assert(tmp);\n\n    tmp = fread(depthReadBuffer,depthSize,1,fp);\n    assert(tmp);\n\n    if(imageSize > 0)\n    {\n        tmp = fread(imageReadBuffer,imageSize,1,fp);\n        assert(tmp);\n    }\n\n    if(depthSize == numPixels * 2)\n    {\n        memcpy(&decompressionBufferDepth[0], depthReadBuffer, numPixels * 2);\n    }\n    else\n    {\n        unsigned long decompLength = numPixels * 2;\n        uncompress(&decompressionBufferDepth[0], (unsigned long *)&decompLength, (const Bytef *)depthReadBuffer, depthSize);\n    }\n\n    if(imageSize == numPixels * 3)\n    {\n        memcpy(&decompressionBufferImage[0], imageReadBuffer, numPixels * 3);\n    }\n    else if(imageSize > 0)\n    {\n        jpeg.readData(imageReadBuffer, imageSize, (unsigned char *)&decompressionBufferImage[0]);\n    }\n    else\n    {\n        memset(&decompressionBufferImage[0], 0, numPixels * 3);\n    }\n\n    depth = (unsigned short *)decompressionBufferDepth;\n    rgb = (unsigned char *)&decompressionBufferImage[0];\n\n    if(flipColors)\n    {\n        for(int i = 0; i < Resolution::getInstance().numPixels() * 3; i += 3)\n        {\n            std::swap(rgb[i + 0], rgb[i + 2]);\n        }\n    }\n\n    currentFrame++;\n}\n\nvoid RawLogReader::fastForward(int frame)\n{\n    while(currentFrame < frame && hasMore())\n    {\n        filePointers.push(ftell(fp));\n\n        auto tmp = fread(&timestamp,sizeof(int64_t),1,fp);\n        assert(tmp);\n\n        tmp = fread(&depthSize,sizeof(int32_t),1,fp);\n        assert(tmp);\n        tmp = fread(&imageSize,sizeof(int32_t),1,fp);\n        assert(tmp);\n\n        tmp = fread(depthReadBuffer,depthSize,1,fp);\n        assert(tmp);\n\n        if(imageSize > 0)\n        {\n            tmp = fread(imageReadBuffer,imageSize,1,fp);\n            assert(tmp);\n        }\n\n        currentFrame++;\n    }\n}\n\nint RawLogReader::getNumFrames()\n{\n    return numFrames;\n}\n\nbool RawLogReader::hasMore()\n{\n    return currentFrame + 1 < numFrames;\n}\n\n\nvoid RawLogReader::rewind()\n{\n    if (filePointers.size() != 0)\n    {\n        std::stack<int> empty;\n        std::swap(empty, filePointers);\n    }\n\n    fclose(fp);\n    fp = fopen(file.c_str(), \"rb\");\n\n    auto tmp = fread(&numFrames,sizeof(int32_t),1,fp);\n    assert(tmp);\n\n    currentFrame = 0;\n}\n\nbool RawLogReader::rewound()\n{\n    return filePointers.size() == 0;\n}\n\nconst std::string RawLogReader::getFile()\n{\n    return file;\n}\n\nvoid RawLogReader::setAuto(bool value)\n{\n\n}\n"
  },
  {
    "path": "obj_pose_est/mapping/app/src/Tools/RawLogReader.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n *\n * The use of the code within this file and all code within files that\n * make up the software that is ElasticFusion is permitted for\n * non-commercial purposes only.  The full terms and conditions that\n * apply to the code within this file are detailed within the LICENSE.txt\n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/>\n * unless explicitly stated.  By downloading this file you agree to\n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then\n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef RAWLOGREADER_H_\n#define RAWLOGREADER_H_\n\n#include <Utils/Resolution.h>\n#include <Utils/Stopwatch.h>\n#include <pangolin/utils/file_utils.h>\n\n#include \"LogReader.h\"\n\n#include <cassert>\n#include <zlib.h>\n#include <iostream>\n#include <stdio.h>\n#include <string>\n#include <stack>\n\nclass RawLogReader : public LogReader\n{\n    public:\n        RawLogReader(std::string file, bool flipColors);\n\n        virtual ~RawLogReader();\n\n        void getNext();\n\n        void getBack();\n\n        int getNumFrames();\n\n        bool hasMore();\n\n        bool rewound();\n\n        void rewind();\n\n        void fastForward(int frame);\n\n        const std::string getFile();\n\n        void setAuto(bool value);\n\n        std::stack<int> filePointers;\n\n    private:\n        void getCore();\n};\n\n#endif /* RAWLOGREADER_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/app/src/Tools/RealSenseInterface.cpp",
    "content": "#include \"RealSenseInterface.h\"\n#include <functional>\n\n#ifdef WITH_REALSENSE\nRealSenseInterface::RealSenseInterface(int inWidth,int inHeight,int inFps)\n  : width(inWidth),\n  height(inHeight),\n  fps(inFps),\n  dev(nullptr),\n  initSuccessful(true)\n{\n  if(ctx.get_device_count() == 0)\n  {\n    errorText = \"No device connected.\";\n    initSuccessful = false;\n    return;\n  }\n\n  dev = ctx.get_device(0);\n  dev->enable_stream(rs::stream::depth,width,height,rs::format::z16,fps);\n  dev->enable_stream(rs::stream::color,width,height,rs::format::rgb8,fps);\n\n  latestDepthIndex.assign(-1);\n  latestRgbIndex.assign(-1);\n\n  for(int i = 0; i < numBuffers; i++)\n  {\n    uint8_t * newImage = (uint8_t *)calloc(width * height * 3,sizeof(uint8_t));\n    rgbBuffers[i] = std::pair<uint8_t *,int64_t>(newImage,0);\n  }\n\n  for(int i = 0; i < numBuffers; i++)\n  {\n    uint8_t * newDepth = (uint8_t *)calloc(width * height * 2,sizeof(uint8_t));\n    uint8_t * newImage = (uint8_t *)calloc(width * height * 3,sizeof(uint8_t));\n    frameBuffers[i] = std::pair<std::pair<uint8_t *,uint8_t *>,int64_t>(std::pair<uint8_t *,uint8_t *>(newDepth,newImage),0);\n  }\n\n  setAutoExposure(true);\n  setAutoWhiteBalance(true);\n\n  rgbCallback = new RGBCallback(lastRgbTime,\n    latestRgbIndex,\n    rgbBuffers);\n\n  depthCallback = new DepthCallback(lastDepthTime,\n    latestDepthIndex,\n    latestRgbIndex,\n    rgbBuffers,\n    frameBuffers);\n\n  dev->set_frame_callback(rs::stream::depth,*depthCallback);\n  dev->set_frame_callback(rs::stream::color,*rgbCallback);\n\n  dev->start();\n}\n\nRealSenseInterface::~RealSenseInterface()\n{\n  if(initSuccessful)\n  {\n    dev->stop();\n\n    for(int i = 0; i < numBuffers; i++)\n    {\n      free(rgbBuffers[i].first);\n    }\n\n    for(int i = 0; i < numBuffers; i++)\n    {\n      free(frameBuffers[i].first.first);\n      free(frameBuffers[i].first.second);\n    }\n\n    delete rgbCallback;\n    delete depthCallback;\n  }\n}\n\nvoid RealSenseInterface::setAutoExposure(bool value)\n{\n  dev->set_option(rs::option::color_enable_auto_exposure,value);\n}\n\nvoid RealSenseInterface::setAutoWhiteBalance(bool value)\n{\n  dev->set_option(rs::option::color_enable_auto_white_balance,value);\n}\n\nbool RealSenseInterface::getAutoExposure()\n{\n  return dev->get_option(rs::option::color_enable_auto_exposure);\n}\n\nbool RealSenseInterface::getAutoWhiteBalance()\n{\n  return dev->get_option(rs::option::color_enable_auto_white_balance);\n}\n#else\n\nRealSenseInterface::RealSenseInterface(int inWidth,int inHeight,int inFps)\n  : width(inWidth),\n  height(inHeight),\n  fps(inFps),\n  initSuccessful(false)\n{\n  errorText = \"Compiled without Intel RealSense library\";\n}\n\nRealSenseInterface::~RealSenseInterface()\n{\n}\n\nvoid RealSenseInterface::setAutoExposure(bool value)\n{\n}\n\nvoid RealSenseInterface::setAutoWhiteBalance(bool value)\n{\n}\n\nbool RealSenseInterface::getAutoExposure()\n{\n  return false;\n}\n\nbool RealSenseInterface::getAutoWhiteBalance()\n{\n  return false;\n}\n#endif"
  },
  {
    "path": "obj_pose_est/mapping/app/src/Tools/RealSenseInterface.h",
    "content": "#pragma once\n\n#include <string>\n#include <iostream>\n#include <algorithm>\n#include <map>\n\n#ifdef WITH_REALSENSE\n#include \"librealsense/rs.hpp\"\n#endif\n\n#include \"ThreadMutexObject.h\"\n#include \"CameraInterface.h\"\n\nclass RealSenseInterface : public CameraInterface\n{\npublic:\n  RealSenseInterface(int width = 640,int height = 480,int fps = 30);\n  virtual ~RealSenseInterface();\n\n  const int width,height,fps;\n\n  bool getAutoExposure();\n  bool getAutoWhiteBalance();\n  virtual void setAutoExposure(bool value);\n  virtual void setAutoWhiteBalance(bool value);\n\n  virtual bool ok()\n  {\n    return initSuccessful;\n  }\n\n  virtual std::string error()\n  {\n    return errorText;\n  }\n\n#ifdef WITH_REALSENSE\n  struct RGBCallback\n  {\n  public:\n    RGBCallback(int64_t & lastRgbTime,\n      ThreadMutexObject<int> & latestRgbIndex,\n      std::pair<uint8_t *,int64_t> * rgbBuffers)\n      : lastRgbTime(lastRgbTime),\n      latestRgbIndex(latestRgbIndex),\n      rgbBuffers(rgbBuffers)\n    {\n    }\n\n    void operator()(rs::frame frame)\n    {\n      lastRgbTime = std::chrono::duration_cast<std::chrono::milliseconds>(\n        std::chrono::system_clock::now().time_since_epoch()).count();\n\n      int bufferIndex = (latestRgbIndex.getValue() + 1) % numBuffers;\n\n      memcpy(rgbBuffers[bufferIndex].first,frame.get_data(),\n        frame.get_width() * frame.get_height() * 3);\n\n      rgbBuffers[bufferIndex].second = lastRgbTime;\n\n      latestRgbIndex++;\n    }\n\n  private:\n    int64_t & lastRgbTime;\n    ThreadMutexObject<int> & latestRgbIndex;\n    std::pair<uint8_t *,int64_t> * rgbBuffers;\n  };\n\n  struct DepthCallback\n  {\n  public:\n    DepthCallback(int64_t & lastDepthTime,\n      ThreadMutexObject<int> & latestDepthIndex,\n      ThreadMutexObject<int> & latestRgbIndex,\n      std::pair<uint8_t *,int64_t> * rgbBuffers,\n      std::pair<std::pair<uint8_t *,uint8_t *>,int64_t> * frameBuffers)\n      : lastDepthTime(lastDepthTime),\n      latestDepthIndex(latestDepthIndex),\n      latestRgbIndex(latestRgbIndex),\n      rgbBuffers(rgbBuffers),\n      frameBuffers(frameBuffers)\n    {\n    }\n\n    void operator()(rs::frame frame)\n    {\n      lastDepthTime = std::chrono::duration_cast<std::chrono::milliseconds>(\n        std::chrono::system_clock::now().time_since_epoch()).count();\n\n      int bufferIndex = (latestDepthIndex.getValue() + 1) % numBuffers;\n\n      // The multiplication by 2 is here because the depth is actually uint16_t\n      memcpy(frameBuffers[bufferIndex].first.first,frame.get_data(),\n        frame.get_width() * frame.get_height() * 2);\n\n      frameBuffers[bufferIndex].second = lastDepthTime;\n\n      int lastImageVal = latestRgbIndex.getValue();\n\n      if(lastImageVal == -1)\n      {\n        return;\n      }\n\n      lastImageVal %= numBuffers;\n\n      memcpy(frameBuffers[bufferIndex].first.second,rgbBuffers[lastImageVal].first,\n        frame.get_width() * frame.get_height() * 3);\n\n      latestDepthIndex++;\n    }\n\n  private:\n    int64_t & lastDepthTime;\n    ThreadMutexObject<int> & latestDepthIndex;\n    ThreadMutexObject<int> & latestRgbIndex;\n\n    std::pair<uint8_t *,int64_t> * rgbBuffers;\n    std::pair<std::pair<uint8_t *,uint8_t *>,int64_t> * frameBuffers;\n  };\n#endif\n\nprivate:\n#ifdef WITH_REALSENSE\n  rs::device *dev;\n  rs::context ctx;\n\n  RGBCallback * rgbCallback;\n  DepthCallback * depthCallback;\n#endif\n\n  bool initSuccessful;\n  std::string errorText;\n  \n  ThreadMutexObject<int> latestRgbIndex;\n  std::pair<uint8_t *,int64_t> rgbBuffers[numBuffers];\n\n  int64_t lastRgbTime;\n  int64_t lastDepthTime;\n\n};\n"
  },
  {
    "path": "obj_pose_est/mapping/app/src/Tools/ThreadMutexObject.h",
    "content": "/*\n * This file is part of ElasticFusion.\n *\n * Copyright (C) 2015 Imperial College London\n * \n * The use of the code within this file and all code within files that \n * make up the software that is ElasticFusion is permitted for \n * non-commercial purposes only.  The full terms and conditions that \n * apply to the code within this file are detailed within the LICENSE.txt \n * file and at <http://www.imperial.ac.uk/dyson-robotics-lab/downloads/elastic-fusion/elastic-fusion-license/> \n * unless explicitly stated.  By downloading this file you agree to \n * comply with these terms.\n *\n * If you wish to use any of this code for commercial purposes then \n * please email researchcontracts.engineering@imperial.ac.uk.\n *\n */\n\n#ifndef THREADMUTEXOBJECT_H_\n#define THREADMUTEXOBJECT_H_\n\n#include <thread>\n#include <mutex>\n#include <condition_variable>\n#include <chrono>\n\ntemplate <class T>\nclass ThreadMutexObject\n{\n    public:\n        ThreadMutexObject()\n        {}\n\n        ThreadMutexObject(T initialValue)\n         : object(initialValue),\n           lastCopy(initialValue)\n        {}\n\n        void assign(T newValue)\n        {\n            mutex.lock();\n\n            object = lastCopy = newValue;\n\n            mutex.unlock();\n        }\n\n        std::mutex & getMutex()\n        {\n            return mutex;\n        }\n\n        T & getReference()\n        {\n            return object;\n        }\n\n        void assignAndNotifyAll(T newValue)\n        {\n            mutex.lock();\n\n            object = newValue;\n\n            signal.notify_all();\n\n            mutex.unlock();\n        }\n        \n        void notifyAll()\n        {\n            mutex.lock();\n\n            signal.notify_all();\n\n            mutex.unlock();\n        }\n\n        T getValue()\n        {\n            mutex.lock();\n\n            lastCopy = object;\n\n            mutex.unlock();\n\n            return lastCopy;\n        }\n\n        T waitForSignal()\n        {\n            mutex.lock();\n\n            signal.wait(mutex);\n\n            lastCopy = object;\n\n            mutex.unlock();\n\n            return lastCopy;\n        }\n\n        T getValueWait(int wait = 33000)\n        {\n            std::this_thread::sleep_for(std::chrono::microseconds(wait));\n\n            mutex.lock();\n\n            lastCopy = object;\n\n            mutex.unlock();\n\n            return lastCopy;\n        }\n\n        T & getReferenceWait(int wait = 33000)\n        {\n            std::this_thread::sleep_for(std::chrono::microseconds(wait));\n\n            mutex.lock();\n\n            lastCopy = object;\n\n            mutex.unlock();\n\n            return lastCopy;\n        }\n\n        void operator++(int)\n        {\n            mutex.lock();\n\n            object++;\n\n            mutex.unlock();\n        }\n\n    private:\n        T object;\n        T lastCopy;\n        std::mutex mutex;\n        std::condition_variable_any signal;\n};\n\n#endif /* THREADMUTEXOBJECT_H_ */\n"
  },
  {
    "path": "obj_pose_est/mapping/build.sh",
    "content": "#!/bin/bash\n\nmkdir deps &> /dev/null\ncd deps\n\n#Add necessary extra repos\nversion=$(lsb_release -a 2>&1)\nif [[ $version == *\"14.04\"* ]] ; then\n    wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1404/x86_64/cuda-repo-ubuntu1404_7.5-18_amd64.deb\n    sudo dpkg -i cuda-repo-ubuntu1404_7.5-18_amd64.deb\n    rm cuda-repo-ubuntu1404_7.5-18_amd64.deb\n    sudo apt-get update\n    sudo apt-get install cuda-7-5\nelif [[ $version == *\"15.04\"* ]] ; then\n    wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1504/x86_64/cuda-repo-ubuntu1504_7.5-18_amd64.deb\n    sudo dpkg -i cuda-repo-ubuntu1504_7.5-18_amd64.deb\n    rm cuda-repo-ubuntu1504_7.5-18_amd64.deb\n    sudo apt-get update\n    sudo apt-get install cuda-7-5\nelif [[ $version == *\"16.04\"* ]] ; then\n    wget http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1604/x86_64/cuda-repo-ubuntu1604_8.0.44-1_amd64.deb\n    sudo dpkg -i cuda-repo-ubuntu1604_8.0.44-1_amd64.deb\n    rm cuda-repo-ubuntu1604_8.0.44-1_amd64.deb\n    sudo add-apt-repository ppa:openjdk-r/ppa \n    sudo apt-get update\n    sudo apt-get install cuda-8-0\nelse\n    echo \"Don't use this on anything except 14.04, 15.04, or 16.04\"\n    exit\nfi\n\nsudo apt-get install -y cmake-qt-gui git build-essential libusb-1.0-0-dev libudev-dev openjdk-7-jdk freeglut3-dev libglew-dev libsuitesparse-dev libeigen3-dev zlib1g-dev libjpeg-dev\n\n#Installing Pangolin\ngit clone https://github.com/stevenlovegrove/Pangolin.git\ncd Pangolin\nmkdir build\ncd build\ncmake ../ -DAVFORMAT_INCLUDE_DIR=\"\" -DCPP11_NO_BOOST=ON\nmake -j8\ncd ../..\n\n#Up to date OpenNI2\ngit clone https://github.com/occipital/OpenNI2.git\ncd OpenNI2\nmake -j8\ncd ..\n\n#Actually build ElasticFusion\ncd ../Core\nmkdir build\ncd build\ncmake ../src\nmake -j8\ncd ../../GPUTest\nmkdir build\ncd build\ncmake ../src\nmake -j8\ncd ../../GUI\nmkdir build\ncd build\ncmake ../src\nmake -j8\n"
  },
  {
    "path": "obj_pose_est/package.xml",
    "content": "<?xml version=\"1.0\"?>\n<package format=\"2\">\n  <name>obj_pose_est</name>\n  <version>0.0.0</version>\n  <description>The obj_pose_est package</description>\n\n  <!-- One maintainer tag required, multiple allowed, one person per tag -->\n  <!-- Example:  -->\n  <!-- <maintainer email=\"jane.doe@example.com\">Jane Doe</maintainer> -->\n  <maintainer email=\"hoang@todo.todo\">hoang</maintainer>\n\n\n  <!-- One license tag required, multiple allowed, one license per tag -->\n  <!-- Commonly used license strings: -->\n  <!--   BSD, MIT, Boost Software License, GPLv2, GPLv3, LGPLv2.1, LGPLv3 -->\n  <license>TODO</license>\n\n\n  <!-- Url tags are optional, but multiple are allowed, one per tag -->\n  <!-- Optional attribute type can be: website, bugtracker, or repository -->\n  <!-- Example: -->\n  <!-- <url type=\"website\">http://wiki.ros.org/obj_pose_est</url> -->\n\n\n  <!-- Author tags are optional, multiple are allowed, one per tag -->\n  <!-- Authors do not have to be maintainers, but could be -->\n  <!-- Example: -->\n  <!-- <author email=\"jane.doe@example.com\">Jane Doe</author> -->\n\n\n  <!-- The *depend tags are used to specify dependencies -->\n  <!-- Dependencies can be catkin packages or system dependencies -->\n  <!-- Examples: -->\n  <!-- Use depend as a shortcut for packages that are both build and exec dependencies -->\n  <!--   <depend>roscpp</depend> -->\n  <!--   Note that this is equivalent to the following: -->\n  <!--   <build_depend>roscpp</build_depend> -->\n  <!--   <exec_depend>roscpp</exec_depend> -->\n  <!-- Use build_depend for packages you need at compile time: -->\n  <!--   <build_depend>message_generation</build_depend> -->\n  <!-- Use build_export_depend for packages you need in order to build against this package: -->\n  <!--   <build_export_depend>message_generation</build_export_depend> -->\n  <!-- Use buildtool_depend for build tool packages: -->\n  <!--   <buildtool_depend>catkin</buildtool_depend> -->\n  <!-- Use exec_depend for packages you need at runtime: -->\n  <!--   <exec_depend>message_runtime</exec_depend> -->\n  <!-- Use test_depend for packages you need only for testing: -->\n  <!--   <test_depend>gtest</test_depend> -->\n  <!-- Use doc_depend for packages you need only for building documentation: -->\n  <!--   <doc_depend>doxygen</doc_depend> -->\n  <buildtool_depend>catkin</buildtool_depend>\n  <build_depend>cv_bridge</build_depend>\n  <build_depend>pcl_conversions</build_depend>\n  <build_depend>pcl_ros</build_depend>\n  <build_depend>roscpp</build_depend>\n  <build_depend>rospy</build_depend>\n  <build_depend>sensor_msgs</build_depend>\n  <build_depend>std_msgs</build_depend>\n  <build_depend>std_srvs</build_depend>\n  <build_depend>visualization_msgs</build_depend>\n  <build_depend>message_generation</build_depend>\n  \n  <build_export_depend>cv_bridge</build_export_depend>\n  <build_export_depend>pcl_conversions</build_export_depend>\n  <build_export_depend>pcl_ros</build_export_depend>\n  <build_export_depend>roscpp</build_export_depend>\n  <build_export_depend>rospy</build_export_depend>\n  <build_export_depend>sensor_msgs</build_export_depend>\n  <build_export_depend>std_msgs</build_export_depend>\n  <build_export_depend>std_srvs</build_export_depend>\n  <build_export_depend>visualization_msgs</build_export_depend>\n  <build_export_depend>message_generation</build_export_depend>\n\n  <exec_depend>cv_bridge</exec_depend>\n  <exec_depend>pcl_conversions</exec_depend>\n  <exec_depend>pcl_ros</exec_depend>\n  <exec_depend>roscpp</exec_depend>\n  <exec_depend>rospy</exec_depend>\n  <exec_depend>sensor_msgs</exec_depend>\n  <exec_depend>std_msgs</exec_depend>\n  <exec_depend>std_srvs</exec_depend>\n  <exec_depend>visualization_msgs</exec_depend>\n  <exec_depend>message_runtime</exec_depend>\n\n\n  <!-- The export tag contains other, unspecified, tags -->\n  <export>\n    <!-- Other tools can request additional information be placed here -->\n\n  </export>\n</package>\n"
  },
  {
    "path": "obj_pose_est/scripts/ObjectRPE_srv.py",
    "content": "#!/usr/bin/env python\n\nfrom obj_pose_est.srv import *\nimport rospy\nimport os\n\ndef handle_ObjectRPE(req):\n    mask_dir = req.data_dir + '/mask/*'\n    mask_color_dir = req.data_dir + '/mask-color/*'\n\n    os.system('rm -r ' + mask_dir)\n    os.system('rm -r ' + mask_color_dir)\n\n    #--------------------------Start DenseFusion---------------------------\n    print \"Mask-RCNN running ...\"\n\n    executed_file = os.path.join(req.ObjectRPE_dir, 'Mask_RCNN/samples/warehouse/iliad.py') \n    maskrcnn_model_dir = ' --weights=' + os.path.join(req.data_dir, 'trained_models/warehouse/mask_rcnn.h5')\n    num_frames = ' --num_frames=' + str(req.num_frames)\n    num_keyframes = ' --num_keyframes=' + str(req.num_keyframes)\n    data_dir = ' --data=' + req.data_dir\n    aa = os.popen('python3 ' + executed_file  + maskrcnn_model_dir + data_dir + num_frames + num_keyframes).read()\n\n    #--------------------------End DenseFusion---------------------------\n\n    print \"3D mapping running ...\"\n    executed_file = os.path.join(req.ObjectRPE_dir, 'obj_pose_est/mapping/app/build/mapping')\n    data_dir = ' -l ' + req.data_dir + '/'\n    num_frames = ' -num_frames ' + str(req.num_frames)\n    aa = os.popen(executed_file + data_dir + num_frames).read()\n\n    #--------------------------Start DenseFusion---------------------------\n    print(\"DenseFusion running ...\")\n\n    densefusion_dir = req.ObjectRPE_dir + '/DenseFusion' \n    executed_file = ' ./tools/iliad.py'  \n\n    dataset_root = ' --dataset_root ' + req.data_dir + '/dataset/warehouse'\n    saved_root = ' --saved_root ' + req.data_dir\n    pose_model = ' --model ' + os.path.join(req.data_dir, 'trained_models/warehouse/pose_model.pth')\n    pose_refine_model = ' --refine_model ' + os.path.join(req.data_dir, 'trained_models/warehouse/pose_refine_model.pth')\n    num_frames = ' --num_frames ' + str(req.num_frames)\n    num_keyframes = ' --num_keyframes=' + str(req.num_keyframes)\n\n    os.chdir(densefusion_dir)\n    aa = os.popen('python3' + executed_file + dataset_root + saved_root + pose_model + pose_refine_model + num_frames + num_keyframes).read()\n    #--------------------------End DenseFusion---------------------------\n    \n    return 1;\n\ndef ObjectRPE_server():\n    rospy.init_node('ObjectRPE_server')\n    s = rospy.Service('Seg_Reconst_PoseEst', ObjectRPE, handle_ObjectRPE)\n    print \"Ready to run ObjectRPE.\"\n    rospy.spin()\n\nif __name__ == \"__main__\":\n    print('The current working directory:')\n    print(os.getcwd())\n    ObjectRPE_server()"
  },
  {
    "path": "obj_pose_est/src/iliad_rpe_cam_node.cpp",
    "content": "#include <ros/ros.h>\n#include <sensor_msgs/Image.h>\n#include <cv_bridge/cv_bridge.h>\n#include <sensor_msgs/PointCloud2.h>\n\n#include <opencv2/imgproc/imgproc.hpp>\n#include <opencv2/highgui/highgui.hpp>\n\n#include <pcl_conversions/pcl_conversions.h>\n#include <pcl/point_cloud.h>\n#include <pcl/point_types.h>\n#include <pcl/conversions.h>\n\n#include \"obj_pose_est/model_to_scene.h\"\n#include \"obj_pose_est/ObjectRPE.h\"\n\nusing namespace cv;\nusing namespace std;\n\nclass rpeCamNode\n{\n  public:\n    rpeCamNode();\n    virtual ~rpeCamNode();\n    void subcribeTopics();\n    void advertiseTopics();\n    void depthCallback(const sensor_msgs::Image::ConstPtr& msg);\n    void rgbCallback(const sensor_msgs::Image::ConstPtr& msg);\n    \n    // Process object poses\n    double overlapPortion(const pcl::PointCloud<pcl::PointXYZRGB> &source, \n                          const pcl::PointCloud<pcl::PointXYZRGB> &target, \n                          const double &max_dist);\n    bool depthToClould();\n    void colorMap(int i, pcl::PointXYZRGB &point);\n    void extract_cam_pose(std::string line);\n    void processModels();\n    void getCalibrationParas(std::string dataset);\n    void extract_transform_from_quaternion(std::string line, Eigen::Matrix4f &T, int class_index);\n    void pose_process();\n    \n    // Save data\n    bool only_save_frames, call_service;\n    int depth_now, rgb_now;\n    int num_frames, num_keyframes;\n    std::string data_dir, dataset, ObjectRPE_dir;\n    std::string depth_topsub, rgb_topsub;\n    std::string saved_rgb_dir, saved_depth_dir;\n\n    // Process object poses\n    pcl::PointCloud<pcl::PointXYZRGB>::Ptr  scene_cloud, transformed_scene;\n    pcl::PointCloud<pcl::PointXYZRGB>::Ptr  pub_cloud;\n\n    std::string depth_path, rgb_path;\n    cv::Mat rgb_img, depth_img;\n    double fx, fy, cx, cy, depth_factor;\n    double dst_thresh; // minimum distance between two points considered as overlapped\n    double overlap_thresh; // minimum overlap portion between two poinclouds considered as the same instance\n    double confidence_thresh; // minimum confidence score of pose estimation for picking\n\n    std::vector<string> model_paths; // path to model of object detected\n    std::vector<string> full_items; // full list of item names in dataset\n    std::vector<Eigen::Matrix4f> transforms;\n    Eigen::Matrix4f cam_T;\n\n    // Multi prediction process\n    std::vector<pcl::PointCloud<pcl::PointXYZRGB>> curr_models;\n    std::vector<string> curr_objects; // names of object detected in the current image\n    std::vector<int> curr_clsIDs; // class ID of object detected in the current image\n\n    std::vector<pcl::PointCloud<pcl::PointXYZRGB>> global_models;\n    std::vector<string> global_objects; // names of object detected in the current image\n    std::vector<int> global_clsIDs; // class ID of object detected in the current image\n    std::vector<Eigen::Matrix4f> global_transforms;\n    std::vector<double> confidence_scores;\n\n\n  private:\n   ros::NodeHandle nh_, nh_rgb, nh_depth, nh_cloud, nh_srv;\n   ros::Subscriber depth_sub, rgb_sub;\n   ros::Publisher cloud_pub;\n   ros::ServiceClient client;\n   obj_pose_est::ObjectRPE srv;\n\n};\n\nrpeCamNode::rpeCamNode()\n{\n  nh_ = ros::NodeHandle(\"~\");\n  nh_rgb = ros::NodeHandle(\"~\");\n  nh_depth = ros::NodeHandle(\"~\");\n  nh_cloud = ros::NodeHandle(\"~\");\n\n  nh_depth.getParam(\"depth_topsub\", depth_topsub);\n  nh_rgb.getParam(\"rgb_topsub\", rgb_topsub);\n\n  nh_.getParam(\"only_save_frames\", only_save_frames);\n  nh_.getParam(\"ObjectRPE_dir\", ObjectRPE_dir);\n  nh_.getParam(\"dataset\", dataset);\n  nh_.getParam(\"data_dir\", data_dir);\n  nh_.getParam(\"num_frames\", num_frames);\n  nh_.getParam(\"num_keyframes\", num_keyframes);  \n  nh_.getParam(\"call_service\", call_service);  \n  nh_.getParam(\"dst_thresh\", dst_thresh);\n  nh_.getParam(\"overlap_thresh\", overlap_thresh);\n  nh_.getParam(\"confidence_thresh\", confidence_thresh);\n\n  client = nh_srv.serviceClient<obj_pose_est::ObjectRPE>(\"Seg_Reconst_PoseEst\");\n  srv.request.ObjectRPE_dir = ObjectRPE_dir;\n  srv.request.dataset = dataset;\n  srv.request.data_dir = data_dir;\n  srv.request.num_frames = num_frames;\n  srv.request.num_keyframes = num_keyframes;\n\n  scene_cloud.reset(new pcl::PointCloud<pcl::PointXYZRGB>);\n  transformed_scene.reset(new pcl::PointCloud<pcl::PointXYZRGB>);\n  pub_cloud.reset(new pcl::PointCloud<pcl::PointXYZRGB>);\n\n  depth_now = 0; rgb_now = 0;\n\n  if(num_keyframes > num_frames) std::cerr << \"The number of keyframes cannot larger than the number of frames!\";\n  getCalibrationParas(dataset);\n}\n\nrpeCamNode::~rpeCamNode()\n{\n};\n\nvoid rpeCamNode::subcribeTopics()\n{\n  depth_sub = nh_depth.subscribe (depth_topsub, 1, &rpeCamNode::depthCallback, this);\n  rgb_sub = nh_rgb.subscribe (rgb_topsub, 1, &rpeCamNode::rgbCallback, this);  \n}\n\nvoid rpeCamNode::advertiseTopics()\n{\n  cloud_pub = nh_cloud.advertise<sensor_msgs::PointCloud2> (\"myCloud\", 1);\n}\n\nvoid rpeCamNode::depthCallback (const sensor_msgs::Image::ConstPtr& msg)\n{\n  cv_bridge::CvImageConstPtr bridge;\n\n  try\n  {\n    bridge = cv_bridge::toCvCopy(msg, \"32FC1\");\n  }\n  catch (cv_bridge::Exception& e)\n  {\n    ROS_ERROR(\"Failed to transform depth image.\");\n    return;\n  }\n\n  if(depth_now < num_frames & depth_now == rgb_now) \n  {\n    cv::Mat depth = bridge->image;\n    depth.convertTo(depth, CV_16UC1, 1000.0);\n    int now = 1000001 + depth_now;\n    saved_depth_dir = data_dir + \"/depth/\" + std::to_string(now).substr(1, 6) + \"-depth.png\";\n    std::cerr << \"Save \" << saved_depth_dir << \"\\n\";\n    cv::imwrite( saved_depth_dir, depth );\n    depth_now++;\n  }\n\n  if(only_save_frames) return;\n\n  if(depth_now==num_frames & rgb_now==num_frames)\n  {\n    //-----------------------Call service for MaskRCNN and DenseFusion---------------------------\n    \n    ROS_INFO(\"ObjectRPE running\");\n    \n    if (client.call(srv))\n    {\n        ROS_INFO(\"Result: %ld\", (long int)srv.response.ouput);\n    }\n    else\n    {\n        ROS_ERROR(\"Failed to call service ObjectRPE\");\n    }\n    pose_process();\n    depth_now=0; rgb_now=0;\n  }\n\n  if(pub_cloud->size())\n  {\n    pcl::PCLPointCloud2 cloud_filtered;\n    sensor_msgs::PointCloud2 output;\n    pub_cloud->header.frame_id = \"camera_depth_optical_frame\";  \n    pcl::toPCLPointCloud2(*pub_cloud, cloud_filtered);\n    pcl_conversions::fromPCL(cloud_filtered, output);\n    cloud_pub.publish (output);\n  }\n}\n\nvoid rpeCamNode::rgbCallback (const sensor_msgs::Image::ConstPtr& msg)\n{\n  cv_bridge::CvImageConstPtr bridge;\n  try\n  {\n    bridge = cv_bridge::toCvCopy(msg, \"bgr8\");    \n  }\n  catch (cv_bridge::Exception& e)\n  {\n    ROS_ERROR(\"Failed to transform rgb image.\");\n    return;\n  }\n\n  if(rgb_now < num_frames & rgb_now < depth_now)\n  {\n      cv::Mat rgb_image;\n      rgb_image = bridge->image;\n      int now = 1000001 + rgb_now;\n      saved_rgb_dir = data_dir + \"/rgb/\" + std::to_string(now).substr(1, 6) + \"-color.png\";\n      std::cerr << \"Save \" << saved_rgb_dir << \"\\n\";\n      cv::imwrite( saved_rgb_dir, rgb_image );\n      rgb_now++;\n      //cv::imshow(\"RGB image\", rgb_image);\n      //cv::waitKey(3);\n  }\n}\n\nvoid rpeCamNode::getCalibrationParas(std::string dataset)\n{\n  if(dataset == \"YCB-Video\")\n  {\n\n  }\n  if(dataset == \"Warehouse\")\n  {\n    fx=580.0; fy=580.0;\n    cx=319.0; cy=237.0;\n    depth_factor = 1000;\n  }\n}\n\nvoid rpeCamNode::extract_transform_from_quaternion(std::string line, Eigen::Matrix4f &T, int class_index)\n{\n\t  Eigen::Vector3f trans;\n    float rot_quaternion[4];\n    vector<string> st;\n    boost::trim(line);\n\t\tboost::split(st, line, boost::is_any_of(\"\\t\\r \"), boost::token_compress_on);\n    trans(0) = std::stof(st[4]); trans(1) = std::stof(st[5]); trans(2) = std::stof(st[6]); //translaton\n    rot_quaternion[0] = std::stof(st[0]); rot_quaternion[1] = std::stof(st[1]); //rotation\n    rot_quaternion[2] = std::stof(st[2]); rot_quaternion[3] = std::stof(st[3]); //rotation\n\n    Eigen::Quaternionf q(rot_quaternion[0], rot_quaternion[1], rot_quaternion[2], rot_quaternion[3]); //w x y z\n    \n    T.block(0, 3, 3, 1) = trans;\n    T.block(0, 0, 3, 3) = q.normalized().toRotationMatrix();\n}\n\nvoid rpeCamNode::extract_cam_pose(std::string line)\n{\n\t  Eigen::Vector3f trans;\n    float rot_quaternion[4];\n    vector<string> st;\n    boost::trim(line);\n\t\tboost::split(st, line, boost::is_any_of(\"\\t\\r \"), boost::token_compress_on);\n    trans(0) = std::stof(st[1]); trans(1) = std::stof(st[2]); trans(2) = std::stof(st[3]); //translaton\n    rot_quaternion[0] = std::stof(st[7]); rot_quaternion[1] = std::stof(st[4]); //rotation\n    rot_quaternion[2] = std::stof(st[5]); rot_quaternion[3] = std::stof(st[6]); //rotation\n\n    Eigen::Quaternionf q(rot_quaternion[0], rot_quaternion[1], rot_quaternion[2], rot_quaternion[3]); //w x y z\n    \n    cam_T.setIdentity();\n    cam_T.block(0, 3, 3, 1) = trans;\n    cam_T.block(0, 0, 3, 3) = q.normalized().toRotationMatrix();\n}\n\nbool rpeCamNode::depthToClould()\n{\n  depth_img = cv::imread(depth_path, -1);\n  rgb_img = cv::imread(rgb_path, -1);\n\n  if(!rgb_img.data || !depth_img.data)\n  {\n      if(!rgb_img.data) std::cerr << \"Cannot read image from \" << rgb_path << \"\\n\"; \n      else std::cerr << \"Cannot read image from \" << depth_path << \"\\n\";\n      return false;\n  }\n\n\n  cv::imshow(\"rgb\", rgb_img);\n  cv::waitKey(300);\n\n   scene_cloud.reset(new pcl::PointCloud<pcl::PointXYZRGB>);\n   pcl::PointXYZRGB point;\n   for(int row=0; row < depth_img.rows; row++)\n    {\n       for(int col=0; col < depth_img.cols; col++)       \n        {\n          if(isnan(depth_img.at<ushort>(row, col))) continue;\n          double depth = depth_img.at<ushort>(row, col) / depth_factor;\n          point.x = (col-cx) * depth / fx;\n          point.y = (row-cy) * depth / fy;\n          point.z = depth;\n          point.b = rgb_img.at<cv::Vec3b>(row, col)[0];\n          point.g = rgb_img.at<cv::Vec3b>(row, col)[1];\n          point.r = rgb_img.at<cv::Vec3b>(row, col)[2];\n         scene_cloud->push_back(point);\n        }\n    }\n    return true;\n}\n\nvoid rpeCamNode::colorMap(int i, pcl::PointXYZRGB &point)\n{\n  if (i == 1) // red  \n  {\n    point.r = 255; point.g = 0; point.b = 0; \n  }\n  else if (i == 2) //line\n  {\n    point.r = 0; point.g = 255; point.b = 0;\n  }\n  else if ( i == 3) //blue\n  { \n    point.r = 0; point.g = 0; point.b = 255;\n  } \n  else if ( i == 4) //maroon\n  {\n    point.r = 128; point.g = 0; point.b = 0;\n\n  }\n  else if ( i == 5) //green\n  {\n    point.r = 0; point.g = 128; point.b = 0;\n  }  \n  else if ( i == 6) //navy\n  {\n    point.r = 0; point.g = 0; point.b = 128;\n  }\n  else if ( i == 7) //yellow\n  {\n    point.r = 255; point.g = 255; point.b = 0;\n  }\n  else if ( i == 8) //magenta\n  {\n    point.r = 255; point.g = 0; point.b = 255;\n  }\n  else if ( i == 9) //cyan\n  {\n    point.r = 0; point.g = 255; point.b = 255;\n  }    \n  else if ( i == 10) //olive\n  {\n    point.r = 128; point.g = 128; point.b = 0;\n  }\n  else if ( i == 11) //purple\n  {\n    point.r = 128; point.g = 0; point.b = 128;\n  } \n    \n  else if ( i == 12) //teal\n  {\n    point.r = 0; point.g = 128; point.b = 128;\n  }\n    \n  else if ( i == 13) \n  {\n    point.r = 92; point.g = 112; point.b = 92;\n  }\n  else if ( i == 14) //brown\n  {\n    point.r = 165; point.g = 42; point.b = 42;\n  }    \n  else //silver\n  {\n    point.r = 192; point.g = 192; point.b = 192;\n  }                   \n}\n\ndouble rpeCamNode::overlapPortion(const pcl::PointCloud<pcl::PointXYZRGB> &source, \n                                          const pcl::PointCloud<pcl::PointXYZRGB> &target, \n                                          const double &max_dist)\n{\n\tif (source.size() == 0 || target.size() == 0) return -1;\n\tpcl::PointCloud<pcl::PointXYZ>::Ptr target_cloud(new pcl::PointCloud<pcl::PointXYZ>);\n\tpcl::PointCloud<pcl::PointXYZ>::Ptr source_cloud(new pcl::PointCloud<pcl::PointXYZ>);\n\tpcl::copyPointCloud(target, *target_cloud);\n\tpcl::copyPointCloud(source, *source_cloud);\n\t\n\tpcl::KdTreeFLANN<pcl::PointXYZ> kdtree;\n\tkdtree.setInputCloud(target_cloud);\n\tstd::vector<int> pointIdxNKNSearch(1);\n\tstd::vector<float> pointNKNSquaredDistance(1);\n\n\tint overlap_Points = 0;\n\tfor (int i = 0; i < source.size(); ++i)\n\t{\n\t\tif (kdtree.nearestKSearch(source_cloud->points[i], 1, pointIdxNKNSearch, pointNKNSquaredDistance) > 0)\n\t\t{\n            if(sqrt(pointNKNSquaredDistance[0]) < max_dist)\n\t\t\t    overlap_Points++;\n\t\t}\n\t}\n\n\t//calculating the mean distance\n\tdouble portion = (double) overlap_Points / source.size();\n\treturn portion;\n}\n\nvoid rpeCamNode::processModels()\n{\n  pcl::PointCloud<pcl::PointXYZ>::Ptr  model_cloud (new pcl::PointCloud<pcl::PointXYZ>);\n  std::vector<pcl::PointCloud<pcl::PointXYZRGB>> original_models;\n  pcl::PointCloud<pcl::PointXYZRGB>::Ptr  color_model_cloud (new pcl::PointCloud<pcl::PointXYZRGB>);\n  \n  for(int i=0; i < model_paths.size(); i++)\n  {\n    pcl::io::loadPLYFile<pcl::PointXYZ> (model_paths[i], *model_cloud);\n    copyPointCloud(*model_cloud, *color_model_cloud);\n    original_models.push_back(*color_model_cloud);\n    pcl::transformPointCloud(*color_model_cloud, *color_model_cloud, transforms[i]);\n    for(int k=0; k < color_model_cloud->size(); k++)\n    {\n      colorMap(i+1, color_model_cloud->points[k]);\n    }    \n    curr_models.push_back(*color_model_cloud);\n  }\n  \n  if(!curr_models.size()) return;\n  if(!global_models.size())\n  {\n    for(int i=0; i < curr_models.size(); i++)\n    {\n      pcl::PointCloud<pcl::PointXYZRGB>::Ptr  transformed_model (new pcl::PointCloud<pcl::PointXYZRGB>);\n      pcl::transformPointCloud(curr_models[i], *transformed_model, cam_T);\n      global_models.push_back(*transformed_model);\n      global_objects.push_back(curr_objects[i]);\n      global_clsIDs.push_back(curr_clsIDs[i]);\n      confidence_scores.push_back(1);\n      Eigen::Matrix4f global_T = cam_T * transforms[i];\n      global_transforms.push_back(global_T);\n    }\n    return;\n  }\n\n  for(int i=0; i < curr_models.size(); i++)\n  {\n    pcl::PointCloud<pcl::PointXYZRGB>::Ptr  transformed_model (new pcl::PointCloud<pcl::PointXYZRGB>);\n    pcl::transformPointCloud(curr_models[i], *transformed_model, cam_T);\n    int numOfGlobalObjects = global_models.size();\n    bool new_object = true;\n    \n    for(int j=0; j < numOfGlobalObjects; j++)\n    {\n      if(curr_clsIDs[i] == global_clsIDs[j])\n      {\n        double overlap = overlapPortion(*transformed_model, global_models[i], dst_thresh);\n        if(overlap > overlap_thresh)\n        {\n          Eigen::Matrix4f global_T = cam_T * transforms[i];\n          global_T = (global_transforms[j] * confidence_scores[i] + global_T) / (confidence_scores[i]+1);\n          pcl::transformPointCloud(original_models[i], *transformed_model, global_T);\n\n          for(int k=0; k < transformed_model->size(); k++)\n          {\n            colorMap(j+1, transformed_model->points[k]);\n          }\n          global_models[j] = *transformed_model;\n          confidence_scores[j] = confidence_scores[i] * (1+overlap);\n        }\n        new_object = false;\n      }\n    }\n\n    if(new_object)\n    {\n      for(int k=0; k < transformed_model->size(); k++)\n      {\n        colorMap(global_models.size()+1, transformed_model->points[k]);\n      }\n      global_models.push_back(*transformed_model);\n      global_clsIDs.push_back(curr_clsIDs[i]);\n      global_objects.push_back(curr_objects[i]);\n      confidence_scores.push_back(1);\n      Eigen::Matrix4f global_T = cam_T * transforms[i];\n      global_transforms.push_back(global_T);\n    }\n\n  }\n}\n\nvoid rpeCamNode::pose_process()\n{\n  std::string classes_path = data_dir + \"/dataset/warehouse/image_sets/classes.txt\";\n  std::string model_dir = data_dir + \"/dataset/warehouse/models\";\n  \n  pcl::PCLPointCloud2 cloud_filtered;\n  sensor_msgs::PointCloud2 output;\n  \n  ifstream classes_file (classes_path);\n  if (classes_file.is_open())                     \n    {\n      while (!classes_file.eof())                 \n      {\n        string cls;\n        getline (classes_file, cls);\n        full_items.push_back(cls);\n      }\n    }\n    else \n    {\n      std::cerr << \"Unable to open \" << classes_path  << \" file\" << \"\\n\";\n      exit(0);\n    }\n  classes_file.close();\n\n  std::string cam_traject_path = data_dir + \"/map.freiburg\";\n  ifstream cam_traject_file (cam_traject_path);\n  if(cam_traject_file.fail())\n  {\n    std::cerr << \"Cannot read \" << cam_traject_path << \"n\";\n    return;\n  }\n\n  cam_traject_file.clear();\n  cam_traject_file.seekg(0, ios::beg);\n  global_models.clear();\n  global_objects.clear();\n  global_clsIDs.clear();\n  confidence_scores.clear();\n  global_transforms.clear();\n\n  for(int now=0; now < num_frames; now++)\n  {\n    string cam_line;\n    if(!cam_traject_file.eof()) getline (cam_traject_file, cam_line);\n    \n    int num = 1000001 + now;\n    std::string str_num = std::to_string(num).substr(1, 6);\n    std::string pose_path = data_dir + \"/mask/\" + str_num + \"-object_poses.txt\";\n\n    ifstream posefile (pose_path);\n    if(posefile.fail()) continue;\n\n    pub_cloud.reset(new pcl::PointCloud<pcl::PointXYZRGB>);\n    scene_cloud.reset(new pcl::PointCloud<pcl::PointXYZRGB>);\n    transformed_scene.reset(new pcl::PointCloud<pcl::PointXYZRGB>);\n    model_paths.clear();\n    transforms.clear();\n    curr_objects.clear();\n    curr_clsIDs.clear();\n    curr_models.clear();\n\n    depth_path = data_dir + \"/depth/\" + str_num + \"-depth.png\";\n    rgb_path = data_dir + \"/rgb/\" + str_num + \"-color.png\";            \n\n    string line;\n\n    if (posefile.is_open())            \n    {\n      while(!posefile.eof())\n      {\n        if(!posefile.eof()) getline (posefile, line);\n        if(line==\"\") continue;\n        curr_clsIDs.push_back(std::stoi(line));\n        int cls_index = std::stoi(line) - 1;\n        std::string model_path = model_dir + \"/\" + full_items[cls_index] + \"/points.ply\";\n        \n        curr_objects.push_back(full_items[cls_index]);\n        model_paths.push_back(model_path);\n        if(!posefile.eof()) getline (posefile, line);\n        if(line==\"\") continue;\n\n        Eigen::Matrix4f T(Eigen::Matrix4f::Identity());\n        extract_transform_from_quaternion(line, T, cls_index);          \n        transforms.push_back(T);\n      }\n    }\n    else \n    {\n      std::cerr << \"Unable to open file\";\n      exit(0);\n    }\n    if(model_paths.size())\n    {\n      if(!depthToClould()) continue ;\n      if(cam_line!=\"\")\n      {\n        extract_cam_pose(cam_line);\n        pcl::transformPointCloud(*scene_cloud, *transformed_scene, cam_T);\n      }\n      else continue;\n      processModels();\n    }\n\n    if(cam_line!=\"\")\n    {\n      extract_cam_pose(cam_line);\n      pcl::transformPointCloud(*scene_cloud, *transformed_scene, cam_T);\n    }\n    posefile.close();\n  }\n  cam_traject_file.close();\n\n  pub_cloud.reset(new pcl::PointCloud<pcl::PointXYZRGB>);\n  *pub_cloud += *transformed_scene;\n  pub_cloud->header.frame_id = \"camera_depth_optical_frame\";  \n  if(global_models.size())\n  {\n    for(int i=0; i < global_models.size(); i++)\n    {\n      if(confidence_scores[i] > confidence_thresh)\n        *pub_cloud += global_models[i];\n    }\n  }\n}\n\nint main(int argc, char** argv)\n{\n  ros::init(argc, argv, \"find_transform\");\n  rpeCamNode mainNode;\n  mainNode.subcribeTopics();\n  mainNode.advertiseTopics();\n  ros::spin();\n  return 0;\n}"
  },
  {
    "path": "obj_pose_est/src/iliad_rpe_node.cpp",
    "content": "#include <iostream> \n#include <cstdlib> \n#include <stdio.h>\n#include <stdlib.h>\n\n#include <ros/ros.h>\n#include <sensor_msgs/Image.h>\n#include <cv_bridge/cv_bridge.h>\n#include <sensor_msgs/PointCloud2.h>\n#include <visualization_msgs/Marker.h>\n#include <visualization_msgs/MarkerArray.h>\n\n#include <opencv2/imgproc/imgproc.hpp>\n#include <opencv2/highgui/highgui.hpp>\n\n#include <pcl_conversions/pcl_conversions.h>\n#include <pcl/point_cloud.h>\n#include <pcl/point_types.h>\n#include <pcl/conversions.h>\n#include <pcl/io/ply_io.h>\n\n#include \"obj_pose_est/model_to_scene.h\"\n#include \"obj_pose_est/ObjectRPE.h\"\n\nusing namespace std;\nusing namespace cv;\n\npcl::PointCloud<pcl::PointXYZRGB>::Ptr  scene_cloud (new pcl::PointCloud<pcl::PointXYZRGB>);\npcl::PointCloud<pcl::PointXYZRGB>::Ptr transformed_scene (new pcl::PointCloud<pcl::PointXYZRGB>);\npcl::PointCloud<pcl::PointXYZRGB>::Ptr  pub_one_pred (new pcl::PointCloud<pcl::PointXYZRGB>);\npcl::PointCloud<pcl::PointXYZRGB>::Ptr  pub_multi_pred (new pcl::PointCloud<pcl::PointXYZRGB>);\n\nstd::string depth_path, rgb_path;\ncv::Mat rgb_img, depth_img;\ndouble fx, fy, cx, cy, depth_factor;\ndouble dst_thresh; // minimum distance between two points considered as overlapped\ndouble overlap_thresh; // minimum overlap portion between two poinclouds considered as the same instance\ndouble confidence_thresh; // minimum confidence score of pose estimation for picking\n\nstd::vector<string> model_paths; // path to model of object detected\nstd::vector<string> full_items; // full list of item names in dataset\nstd::vector<Eigen::Matrix4f> transforms;\nEigen::Matrix4f cam_T;\n\nstd::vector<pcl::PointCloud<pcl::PointXYZRGB>> curr_models;\nstd::vector<string> curr_objects; // names of object detected in the current image\nstd::vector<int> curr_clsIDs; // class ID of object detected in the current image\n\nstd::vector<pcl::PointCloud<pcl::PointXYZRGB>> global_models;\nstd::vector<string> global_objects; // names of object detected in the current image\nstd::vector<int> global_clsIDs; // class ID of object detected in the current image\nstd::vector<Eigen::Matrix4f> global_transforms;\nstd::vector<double> confidence_scores;\n\nbool depthToClould()\n{\n  depth_img = cv::imread(depth_path, -1);\n  rgb_img = cv::imread(rgb_path, -1);\n\n  if(!rgb_img.data || !depth_img.data)\n  {\n      if(!rgb_img.data) std::cerr << \"Cannot read image from \" << rgb_path << \"\\n\"; \n      else std::cerr << \"Cannot read image from \" << depth_path << \"\\n\";\n      return false;\n  }\n\n\n  cv::imshow(\"rgb\", rgb_img);\n  cv::waitKey(300);\n\n   scene_cloud.reset(new pcl::PointCloud<pcl::PointXYZRGB>);\n   pcl::PointXYZRGB point;\n   for(int row=0; row < depth_img.rows; row++)\n    {\n       for(int col=0; col < depth_img.cols; col++)       \n        {\n          if(isnan(depth_img.at<ushort>(row, col))) continue;\n          double depth = depth_img.at<ushort>(row, col) / depth_factor;\n          point.x = (col-cx) * depth / fx;\n          point.y = (row-cy) * depth / fy;\n          point.z = depth;\n          point.b = rgb_img.at<cv::Vec3b>(row, col)[0];\n          point.g = rgb_img.at<cv::Vec3b>(row, col)[1];\n          point.r = rgb_img.at<cv::Vec3b>(row, col)[2];\n         scene_cloud->push_back(point);\n        }\n    }\n    return true;\n}\n\nvoid colorMap(int i, pcl::PointXYZRGB &point)\n{\n  if (i == 1) // red  \n  {\n    point.r = 255; point.g = 0; point.b = 0; \n  }\n  else if (i == 2) //line\n  {\n    point.r = 0; point.g = 255; point.b = 0;\n  }\n  else if ( i == 3) //blue\n  { \n    point.r = 0; point.g = 0; point.b = 255;\n  } \n  else if ( i == 4) //maroon\n  {\n    point.r = 128; point.g = 0; point.b = 0;\n\n  }\n  else if ( i == 5) //green\n  {\n    point.r = 0; point.g = 128; point.b = 0;\n  }  \n  else if ( i == 6) //navy\n  {\n    point.r = 0; point.g = 0; point.b = 128;\n  }\n  else if ( i == 7) //yellow\n  {\n    point.r = 255; point.g = 255; point.b = 0;\n  }\n  else if ( i == 8) //magenta\n  {\n    point.r = 255; point.g = 0; point.b = 255;\n  }\n  else if ( i == 9) //cyan\n  {\n    point.r = 0; point.g = 255; point.b = 255;\n  }    \n  else if ( i == 10) //olive\n  {\n    point.r = 128; point.g = 128; point.b = 0;\n  }\n  else if ( i == 11) //purple\n  {\n    point.r = 128; point.g = 0; point.b = 128;\n  } \n    \n  else if ( i == 12) //teal\n  {\n    point.r = 0; point.g = 128; point.b = 128;\n  }\n    \n  else if ( i == 13) \n  {\n    point.r = 92; point.g = 112; point.b = 92;\n  }\n  else if ( i == 14) //brown\n  {\n    point.r = 165; point.g = 42; point.b = 42;\n  }    \n  else //silver\n  {\n    point.r = 192; point.g = 192; point.b = 192;\n  }                   \n}\n\ndouble overlapPortion(const pcl::PointCloud<pcl::PointXYZRGB> &source, \n                                          const pcl::PointCloud<pcl::PointXYZRGB> &target, \n                                          const double &max_dist)\n{\n\tif (source.size() == 0 || target.size() == 0) return -1;\n\tpcl::PointCloud<pcl::PointXYZ>::Ptr target_cloud(new pcl::PointCloud<pcl::PointXYZ>);\n\tpcl::PointCloud<pcl::PointXYZ>::Ptr source_cloud(new pcl::PointCloud<pcl::PointXYZ>);\n\tpcl::copyPointCloud(target, *target_cloud);\n\tpcl::copyPointCloud(source, *source_cloud);\n\t\n\tpcl::KdTreeFLANN<pcl::PointXYZ> kdtree;\n\tkdtree.setInputCloud(target_cloud);\n\tstd::vector<int> pointIdxNKNSearch(1);\n\tstd::vector<float> pointNKNSquaredDistance(1);\n\n\tint overlap_Points = 0;\n\tfor (int i = 0; i < source.size(); ++i)\n\t{\n\t\tif (kdtree.nearestKSearch(source_cloud->points[i], 1, pointIdxNKNSearch, pointNKNSquaredDistance) > 0)\n\t\t{\n            if(sqrt(pointNKNSquaredDistance[0]) < max_dist)\n\t\t\t    overlap_Points++;\n\t\t}\n\t}\n\n\t//calculating the mean distance\n\tdouble portion = (double) overlap_Points / source.size();\n\treturn portion;\n}\n\nvoid processModels()\n{\n  pcl::PointCloud<pcl::PointXYZ>::Ptr  model_cloud (new pcl::PointCloud<pcl::PointXYZ>);\n  std::vector<pcl::PointCloud<pcl::PointXYZRGB>> original_models;\n  pcl::PointCloud<pcl::PointXYZRGB>::Ptr  color_model_cloud (new pcl::PointCloud<pcl::PointXYZRGB>);\n  \n  for(int i=0; i < model_paths.size(); i++)\n  {\n    pcl::io::loadPLYFile<pcl::PointXYZ> (model_paths[i], *model_cloud);\n    copyPointCloud(*model_cloud, *color_model_cloud);\n    original_models.push_back(*color_model_cloud);\n    pcl::transformPointCloud(*color_model_cloud, *color_model_cloud, transforms[i]);\n    for(int k=0; k < color_model_cloud->size(); k++)\n    {\n      colorMap(i+1, color_model_cloud->points[k]);\n    }    \n    curr_models.push_back(*color_model_cloud);\n  }\n  \n  if(!curr_models.size()) return;\n  if(!global_models.size())\n  {\n    for(int i=0; i < curr_models.size(); i++)\n    {\n      pcl::PointCloud<pcl::PointXYZRGB>::Ptr  transformed_model (new pcl::PointCloud<pcl::PointXYZRGB>);\n      pcl::transformPointCloud(curr_models[i], *transformed_model, cam_T);\n      global_models.push_back(*transformed_model);\n      global_objects.push_back(curr_objects[i]);\n      global_clsIDs.push_back(curr_clsIDs[i]);\n      confidence_scores.push_back(1);\n      Eigen::Matrix4f global_T = cam_T * transforms[i];\n      global_transforms.push_back(global_T);\n    }\n    return;\n  }\n\n  for(int i=0; i < curr_models.size(); i++)\n  {\n    pcl::PointCloud<pcl::PointXYZRGB>::Ptr  transformed_model (new pcl::PointCloud<pcl::PointXYZRGB>);\n    pcl::transformPointCloud(curr_models[i], *transformed_model, cam_T);\n    int numOfGlobalObjects = global_models.size();\n    bool new_object = true;\n    \n    for(int j=0; j < numOfGlobalObjects; j++)\n    {\n      if(curr_clsIDs[i] == global_clsIDs[j])\n      {\n        double overlap = overlapPortion(*transformed_model, global_models[i], dst_thresh);\n        if(overlap > overlap_thresh)\n        {\n          Eigen::Matrix4f global_T = cam_T * transforms[i];\n          global_T = (global_transforms[j] * confidence_scores[i] + global_T) / (confidence_scores[i]+1);\n          pcl::transformPointCloud(original_models[i], *transformed_model, global_T);\n\n          for(int k=0; k < transformed_model->size(); k++)\n          {\n            colorMap(j+1, transformed_model->points[k]);\n          }\n          global_models[j] = *transformed_model;\n          confidence_scores[j] = confidence_scores[i] * (1+overlap);\n        }\n        new_object = false;\n      }\n    }\n\n    if(new_object)\n    {\n      for(int k=0; k < transformed_model->size(); k++)\n      {\n        colorMap(global_models.size()+1, transformed_model->points[k]);\n      }\n      global_models.push_back(*transformed_model);\n      global_clsIDs.push_back(curr_clsIDs[i]);\n      global_objects.push_back(curr_objects[i]);\n      confidence_scores.push_back(1);\n      Eigen::Matrix4f global_T = cam_T * transforms[i];\n      global_transforms.push_back(global_T);\n    }\n\n  }\n}\n\nvoid getCalibrationParas(std::string dataset)\n{\n  if(dataset == \"YCB-Video\")\n  {\n\n  }\n  if(dataset == \"Warehouse\")\n  {\n    fx=580.0; fy=580.0;\n    cx=319.0; cy=237.0;\n    depth_factor = 1000;\n  }\n}\n\nvoid extract_transform_from_quaternion(std::string line, Eigen::Matrix4f &T, int class_index)\n{\n\t  Eigen::Vector3f trans;\n    float rot_quaternion[4];\n    vector<string> st;\n    boost::trim(line);\n\t\tboost::split(st, line, boost::is_any_of(\"\\t\\r \"), boost::token_compress_on);\n    trans(0) = std::stof(st[4]); trans(1) = std::stof(st[5]); trans(2) = std::stof(st[6]); //translaton\n    rot_quaternion[0] = std::stof(st[0]); rot_quaternion[1] = std::stof(st[1]); //rotation\n    rot_quaternion[2] = std::stof(st[2]); rot_quaternion[3] = std::stof(st[3]); //rotation\n\n    Eigen::Quaternionf q(rot_quaternion[0], rot_quaternion[1], rot_quaternion[2], rot_quaternion[3]); //w x y z\n    \n    T.block(0, 3, 3, 1) = trans;\n    T.block(0, 0, 3, 3) = q.normalized().toRotationMatrix();\n}\n\nvoid extract_cam_pose(std::string line)\n{\n\t  Eigen::Vector3f trans;\n    float rot_quaternion[4];\n    vector<string> st;\n    boost::trim(line);\n\t\tboost::split(st, line, boost::is_any_of(\"\\t\\r \"), boost::token_compress_on);\n    trans(0) = std::stof(st[1]); trans(1) = std::stof(st[2]); trans(2) = std::stof(st[3]); //translaton\n    rot_quaternion[0] = std::stof(st[7]); rot_quaternion[1] = std::stof(st[4]); //rotation\n    rot_quaternion[2] = std::stof(st[5]); rot_quaternion[3] = std::stof(st[6]); //rotation\n\n    Eigen::Quaternionf q(rot_quaternion[0], rot_quaternion[1], rot_quaternion[2], rot_quaternion[3]); //w x y z\n    \n    cam_T.setIdentity();\n    cam_T.block(0, 3, 3, 1) = trans;\n    cam_T.block(0, 0, 3, 3) = q.normalized().toRotationMatrix();\n}\n\nint main(int argc, char** argv)\n{\n  ros::init(argc, argv, \"ObjectRPE\");\n\n  ros::NodeHandle nh_, nh_srv, nh_cloud, cloud_mul_n;\n  ros::Publisher cloud_pub_one_pred = nh_cloud.advertise<sensor_msgs::PointCloud2> (\"one_pred\", 1);\n  ros::Publisher cloud_pub_multi_pred = cloud_mul_n.advertise<sensor_msgs::PointCloud2> (\"multi_pred\", 1);\n  ros::Rate loop_rate(10);\n\n  std::string dataset, ObjectRPE_dir, data_dir; \n  int num_frames, num_keyframes;\n  bool call_service;\n\n  nh_ = ros::NodeHandle(\"~\");\n  nh_.getParam(\"ObjectRPE_dir\", ObjectRPE_dir);\n  nh_.getParam(\"dataset\", dataset);\n  nh_.getParam(\"data_dir\", data_dir);\n  nh_.getParam(\"num_frames\", num_frames);\n  nh_.getParam(\"num_keyframes\", num_keyframes);  \n  nh_.getParam(\"call_service\", call_service);  \n  nh_.getParam(\"dst_thresh\", dst_thresh);\n  nh_.getParam(\"overlap_thresh\", overlap_thresh);\n  nh_.getParam(\"confidence_thresh\", confidence_thresh);\n\n  if(num_keyframes > num_frames) std::cerr << \"The number of keyframes cannot larger than the number of frames!\";\n  getCalibrationParas(dataset);\n\n  //-----------------------Call service for MaskRCNN and DenseFusion---------------------------\n\n  if(call_service)\n  {\n    ros::ServiceClient client = nh_srv.serviceClient<obj_pose_est::ObjectRPE>(\"Seg_Reconst_PoseEst\");\n    obj_pose_est::ObjectRPE srv;\n\n    srv.request.ObjectRPE_dir = ObjectRPE_dir;\n    srv.request.dataset = dataset;\n    srv.request.data_dir = data_dir;\n    srv.request.num_frames = num_frames;\n    srv.request.num_keyframes = num_keyframes;\n\n    ROS_INFO(\"ObjectRPE running\");\n    \n    if (client.call(srv))\n    {\n      ROS_INFO(\"Result: %ld\", (long int)srv.response.ouput);\n    }\n    else\n    {\n      ROS_ERROR(\"Failed to call service ObjectRPE\");\n      return 1;\n    }\n  }\n \n  //-----------------------------------Process predictions-------------------------------------\n  \n  std::string classes_path = data_dir + \"/dataset/warehouse/image_sets/classes.txt\";\n  std::string model_dir = data_dir + \"/dataset/warehouse/models\";\n  pcl::PCLPointCloud2 cloud_filtered;\n  sensor_msgs::PointCloud2 output;\n  \n  ifstream classes_file (classes_path);\n  if (classes_file.is_open())                     \n    {\n      while (!classes_file.eof())                 \n      {\n        string cls;\n        getline (classes_file, cls);\n        full_items.push_back(cls);\n      }\n    }\n    else \n    {\n      std::cerr << \"Unable to open \" << classes_path  << \" file\" << \"\\n\";\n      exit(0);\n    }\n  classes_file.close();\n\n  std::string cam_traject_path = data_dir + \"/map.freiburg\";\n  ifstream cam_traject_file (cam_traject_path);\n  if(cam_traject_file.fail())\n  {\n    std::cerr << \"Cannot read \" << cam_traject_path << \"n\";\n    return 1;\n  }\n\n  int now = 0;\n  while (ros::ok())\n  {\n    if(now < num_frames) now++;\n    else \n    {\n      now = 0;\n      pub_multi_pred.reset(new pcl::PointCloud<pcl::PointXYZRGB>);\n      cam_traject_file.clear();\n      cam_traject_file.seekg(0, ios::beg);\n      global_models.clear();\n      global_objects.clear();\n      global_clsIDs.clear();\n      confidence_scores.clear();\n      global_transforms.clear();\n      continue;\n    }\n\n    string cam_line;\n    if(!cam_traject_file.eof()) getline (cam_traject_file, cam_line);\n    \n    int num = 1000000 + now;\n    std::string str_num = std::to_string(num).substr(1, 6);\n    std::string pose_path = data_dir + \"/mask/\" + str_num + \"-object_poses.txt\";\n\n    ifstream posefile (pose_path);\n    if(posefile.fail()) continue;\n\n    pub_one_pred.reset(new pcl::PointCloud<pcl::PointXYZRGB>);\n    pub_multi_pred.reset(new pcl::PointCloud<pcl::PointXYZRGB>);\n    scene_cloud.reset(new pcl::PointCloud<pcl::PointXYZRGB>);\n    transformed_scene.reset(new pcl::PointCloud<pcl::PointXYZRGB>);\n    model_paths.clear();\n    transforms.clear();\n    curr_objects.clear();\n    curr_clsIDs.clear();\n    curr_models.clear();\n\n    depth_path = data_dir + \"/depth/\" + str_num + \"-depth.png\";\n    rgb_path = data_dir + \"/rgb/\" + str_num + \"-color.png\";            \n\n    string line;\n\n    if (posefile.is_open())            \n    {\n      while(!posefile.eof())\n      {\n        if(!posefile.eof()) getline (posefile, line);\n        if(line==\"\") continue;\n        curr_clsIDs.push_back(std::stoi(line));\n        int cls_index = std::stoi(line) - 1;\n        std::string model_path = model_dir + \"/\" + full_items[cls_index] + \"/points.ply\";\n        \n        curr_objects.push_back(full_items[cls_index]);\n        model_paths.push_back(model_path);\n        if(!posefile.eof()) getline (posefile, line);\n        if(line==\"\") continue;\n\n        Eigen::Matrix4f T(Eigen::Matrix4f::Identity());\n        extract_transform_from_quaternion(line, T, cls_index);          \n        transforms.push_back(T);\n      }\n    }\n    else \n    {\n      std::cerr << \"Unable to open file\";\n      exit(0);\n    }\n    if(model_paths.size())\n    {\n      if(!depthToClould()) continue ;\n      if(cam_line!=\"\")\n      {\n        extract_cam_pose(cam_line);\n        pcl::transformPointCloud(*scene_cloud, *transformed_scene, cam_T);\n      }\n      else continue;\n      processModels();\n    }\n\n    if(cam_line!=\"\")\n    {\n      extract_cam_pose(cam_line);\n      pcl::transformPointCloud(*scene_cloud, *transformed_scene, cam_T);\n    }\n\n    if(curr_models.size())\n    {\n      for(int i=0; i < curr_models.size(); i++)\n        *pub_one_pred += curr_models[i];\n    }\n    if(global_models.size())\n    {\n      for(int i=0; i < global_models.size(); i++)\n      {\n        if(confidence_scores[i] > confidence_thresh)\n          *pub_multi_pred += global_models[i];\n      }\n    }\n\n    *pub_one_pred += *scene_cloud;\n    pub_one_pred->header.frame_id = \"camera_depth_optical_frame\";  \n\n    *pub_multi_pred += *transformed_scene;\n    pub_multi_pred->header.frame_id = \"camera_depth_optical_frame\";  \n\n    pcl::toPCLPointCloud2(*pub_one_pred, cloud_filtered);\n    pcl_conversions::fromPCL(cloud_filtered, output);\n    cloud_pub_one_pred.publish (output);\n\n    pcl::toPCLPointCloud2(*pub_multi_pred, cloud_filtered);\n    pcl_conversions::fromPCL(cloud_filtered, output);\n    cloud_pub_multi_pred.publish (output);\n\n    ros::spinOnce();\n    loop_rate.sleep();\n    posefile.close();\n  }\n  cam_traject_file.close();\n\n  return 0;\n}"
  },
  {
    "path": "obj_pose_est/src/kalman_filter.cpp",
    "content": "#include \"obj_pose_est/kalman_filter.h\"\n\nkalman_filter::kalman_filter()\n{\n    std::cerr << \"Start Kalman Filter!!!\\n\";\n}\n\nkalman_filter::~kalman_filter()\n{\n}\n\n\ninline Vector6f kalman_filter::subPose(const Vector6f &origin, const Vector6f &pose)\n{\n    Eigen::Affine3f origin_A = Eigen::Affine3f::Identity();\n    origin_A.translation() << origin(0), origin(1), origin(2);\n    origin_A.rotate (Eigen::AngleAxisf (origin(3), Eigen::Vector3f::UnitX()));\n    origin_A.rotate (Eigen::AngleAxisf (origin(4), Eigen::Vector3f::UnitY()));\n    origin_A.rotate (Eigen::AngleAxisf (origin(5), Eigen::Vector3f::UnitZ()));\n\n    Eigen::Affine3f pose_A = Eigen::Affine3f::Identity();\n    pose_A.translation() << pose(0), pose(1), pose(2);\n    pose_A.rotate (Eigen::AngleAxisf (origin(3), Eigen::Vector3f::UnitX()));\n    pose_A.rotate (Eigen::AngleAxisf (origin(4), Eigen::Vector3f::UnitY()));\n    pose_A.rotate (Eigen::AngleAxisf (origin(5), Eigen::Vector3f::UnitZ()));\n\n    Eigen::Affine3f result_A;\n    result_A.matrix() = origin_A.matrix()*pose_A.matrix().inverse();\n    Vector3f rot = result_A.rotation().eulerAngles(0, 1, 2);\n\n    Vector6f result;\n    result(0) = result_A.translation()(0); result(1) = result_A.translation()(1); result(2) = result_A.translation()(2);\n    result(3) = rot(0); result(4) = rot(1); result(5) = rot(3);\n    return result;\n}\n\ninline Vector6f kalman_filter::addPose(const Vector6f &origin, const Vector6f &pose)\n{\n    Eigen::Affine3f origin_A = Eigen::Affine3f::Identity();\n    origin_A.translation() << origin(0), origin(1), origin(2);\n    origin_A.rotate (Eigen::AngleAxisf (origin(3), Eigen::Vector3f::UnitX()));\n    origin_A.rotate (Eigen::AngleAxisf (origin(4), Eigen::Vector3f::UnitY()));\n    origin_A.rotate (Eigen::AngleAxisf (origin(5), Eigen::Vector3f::UnitZ()));\n\n    Eigen::Affine3f pose_A = Eigen::Affine3f::Identity();\n    pose_A.translation() << pose(0), pose(1), pose(2);\n    pose_A.rotate (Eigen::AngleAxisf (origin(3), Eigen::Vector3f::UnitX()));\n    pose_A.rotate (Eigen::AngleAxisf (origin(4), Eigen::Vector3f::UnitY()));\n    pose_A.rotate (Eigen::AngleAxisf (origin(5), Eigen::Vector3f::UnitZ()));\n\n    Eigen::Affine3f result_A;\n    result_A.matrix() = origin_A.matrix()*pose_A.matrix();\n    Vector3f rot = result_A.rotation().eulerAngles(0, 1, 2);\n\n    Vector6f result;\n    result(0) = result_A.translation()(0); result(1) = result_A.translation()(1); result(2) = result_A.translation()(2);\n    result(3) = rot(0); result(4) = rot(1); result(5) = rot(3);\n    return result;\n}\n\nbool kalman_filter::Kalman_update(const Vector6f &measure_X, const Matrix6f &measure_cov, \n                    Vector6f &est_X, Matrix6f &est_cov)\n{\n    Matrix6f Rk, Sk, Kk, Ik, Sk_inv;\n    Ik.setIdentity();\n    Vector6f yk;   \n\n    Vector6f measured, estimated, residual, corrected, correction;\n\n    measured(0) = measure_X(0); measured(1) = measure_X(1); measured(2) = measure_X(2);\n    measured(3) = measure_X(3); measured(4) = measure_X(4); measured(5) = measure_X(5);\n\n    estimated(0) = est_X(0); estimated(1) = est_X(1); estimated(2) = est_X(2);\n    estimated(3) = est_X(3); estimated(4) = est_X(4); estimated(5) = est_X(5);\n \n    bool invertible;\n    double det;\n\n    residual = subPose(estimated, measured); \n\n    Rk = measure_cov;\n    Sk = est_cov + Rk;\n    FullPivLU<Matrix6f> lu_decomp(Sk);\n    invertible = lu_decomp.isInvertible();\n\n    if (!invertible) \n    {\n      std::cerr << \"Matrix not invertible \\n\";\n    }\n    else\n    {\n      Sk_inv = Sk.inverse();\n    }\n    yk(0) = residual(0); yk(1) = residual(1); yk(2) = residual(2);\n    yk(3) = residual(3); yk(4) = residual(4); yk(5) = residual(5);\n\n    Kk = est_cov*Sk_inv;\n    yk = Kk*yk;\n    correction(0) = yk(0); correction(1) = yk(1); correction(2) = yk(2);\n    correction(3) = yk(3); correction(4) = yk(4); correction(5) = yk(5);  \n    corrected = addPose(estimated, correction);\n    \n    //est_X(0) = corrected(0); est_X(1) = corrected(1); est_X(2) = corrected(2);\n    //est_X(3) = corrected(3); est_X(4) = corrected(4); est_X(5) = corrected(5);\n    est_X = corrected;\n    est_cov = (Ik - Kk)*est_cov;\n}\n"
  },
  {
    "path": "obj_pose_est/src/model_to_scene.cpp",
    "content": "#include \"obj_pose_est/model_to_scene.h\"\n\nmodel_to_scene::model_to_scene()\n{\n    std::cerr << \"Start model to scene!!!\\n\";\n}\n\nmodel_to_scene::~model_to_scene()\n{\n}\n\nint model_to_scene::color_to_instanceID(unsigned char r, unsigned char g, unsigned char b)\n{\n    if(r==128 & g==128 & b==0)   return 1;\n    else if(r==0   & g==128 & b==128) return 2;\n    else if(r==128 & g==0   & b==128) return 3;\n    else if(r==128 & g==0   & b==0)   return 4;\n    else if(r==0   & g==128 & b==0)   return 5;\n    else if(r==0   & g==0   & b==128) return 6;\n    else if(r==255 & g==255 & b==0)   return 7;\n    else if(r==255 & g==0   & b==255) return 8;\n    else if(r==0   & g==255 & b==255) return 9;\n    else if(r==255 & g==0   & b==0)   return 10;\n    else if(r==0   & g==255 & b==0)   return 11;\n    else if(r==0   & g==0   & b==255) return 12;\n    else if(r==92  & g==112 & b==92)  return 13;\n    else if(r==0   & g==0   & b==70)  return 14;\n    else if(r==0   & g==60  & b==100) return 15;\n    else if(r==0   & g==80  & b==100) return 16;\n    else if(r==0   & g==0   & b==230) return 17;\n    else if(r==119 & g==11  & b==32)  return 18;\n    else if(r==0   & g==0   & b==121) return 19;    \n    else return 0;\n}\n\nvoid model_to_scene::cloud_to_instances(const pcl::PointCloud<pcl::PointXYZRGB> &input, std::vector<ObjectInstance> &objects)\n{\n    for(int i=0; i < input.size(); i++)\n    {\n        pcl::PointXYZRGB point;\n        point = input.points[i]; \n        int objID;\n\n        if(point.r==192 & point.g==192 & point.b==192) continue;\n        else objID = color_to_instanceID(point.r, point.g, point.b);\n        if(!objID) continue;\n\n        pcl::PointXYZ pointXYZ;\n        pointXYZ.x=point.x; pointXYZ.y=point.y; pointXYZ.z=point.z;\n        objects[objID-1].points.push_back(point);\n    }\n}\n\nvoid model_to_scene::noiseRemoval(std::vector<ObjectInstance> &objects)\n{\n    for(int i=0 ; i < objects.size(); i++)\n    {\n        if(objects[i].points.size() == 0) continue;\n        pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGB>());\n        pcl::copyPointCloud(objects[i].points, *cloud);\n        \n        pcl::search::KdTree<pcl::PointXYZRGB>::Ptr tree(new pcl::search::KdTree<pcl::PointXYZRGB>);\n        std::vector<pcl::PointIndices> cluster_indices;\n        tree->setInputCloud(cloud);\n        pcl::EuclideanClusterExtraction<pcl::PointXYZRGB> ec;\n        ec.setClusterTolerance(0.02);\n        ec.setMinClusterSize(500);\n        ec.setMaxClusterSize(9999999);\n        ec.setSearchMethod(tree);\n        ec.setInputCloud(cloud);\n        ec.extract(cluster_indices);\n\n        objects[i].points.clear();\n        for (std::vector<pcl::PointIndices>::const_iterator it = cluster_indices.begin(); it != cluster_indices.end(); ++it)\n\t    {\n            for (std::vector<int>::const_iterator pit = it->indices.begin(); pit != it->indices.end(); ++pit)\n            {\n                objects[i].points.push_back(cloud->points[*pit]);\n            }\n        }\n\n    }\n}\n\nvoid model_to_scene::load_models(const std::string model_dir,\n                 const std::string detected_class_ids_dir, \n                 const std::string class_list_dir,\n                 std::vector<ObjectModel> &models)\n{\n    std::vector<std::string> object_name_list;\n    std::ifstream class_file(class_list_dir);\n    std::string str; \n    while (std::getline(class_file, str))\n    {\n        object_name_list.push_back(str);\n    }\n\n    std::vector<int> detected_object_ids;\n    std::ifstream file(detected_class_ids_dir);\n    while (std::getline(file, str))\n    {\n        detected_object_ids.push_back(stoi(str));\n    }\n\n    ObjectModel model;\n    if(!models.empty()) models.clear();\n    for(int i=0 ; i < detected_object_ids.size(); i++) models.push_back(model);\n\n    for(int i=0; i < models.size(); i++)\n    {\n        int class_id = detected_object_ids[i];\n        std::string model_path = model_dir + object_name_list[class_id-1] + \"/points_view1.ply\";\n        pcl::io::loadPLYFile<pcl::PointXYZRGB> (model_path, models[i].points_view);\n        model_path = model_dir + object_name_list[class_id-1] + \"/points.ply\";\n        pcl::io::loadPLYFile<pcl::PointXYZRGB> (model_path, models[i].points_full);\n    }\n}\n\nvoid model_to_scene::processCloud(const std::string cloud_path, \n                                  const std::string detected_class_ids_path, \n                                  const std::string class_list_path,\n                                  const std::string model_dir)\n{\n    load_models(model_dir, detected_class_ids_path, class_list_path, models);\n\n    pcl::PointCloud<pcl::PointXYZRGB>::Ptr  cloud (new pcl::PointCloud<pcl::PointXYZRGB>);\n    pcl::io::loadPLYFile<pcl::PointXYZRGB> (cloud_path, *cloud);\n\n    ObjectInstance instance;\n    if(!instances.empty()) instances.clear();\n    for(int i=0 ; i < models.size(); i++) instances.push_back(instance);\n    cloud_to_instances(*cloud, instances);\n    noiseRemoval(instances);\n\n    for (int i=0; i < instances.size(); i++)\n    {\n        pcl::PointCloud<pcl::PointXYZ>::Ptr source (new pcl::PointCloud<pcl::PointXYZ>);\n        pcl::PointCloud<pcl::PointXYZ>::Ptr model (new pcl::PointCloud<pcl::PointXYZ>);\n        pcl::PointCloud<pcl::PointXYZ>::Ptr target (new pcl::PointCloud<pcl::PointXYZ>);\n        pcl::PointCloud<pcl::PointXYZ>::Ptr registed_source (new pcl::PointCloud<pcl::PointXYZ>);\n        \n        pcl::copyPointCloud(instances[i].points, *target);\n        pcl::copyPointCloud(models[i].points_view, *source);\n        pcl::copyPointCloud(models[i].points_full, *model);\n        coarseToFineRegistration(*source, *model, *target, *registed_source);\n        pcl::copyPointCloud(*registed_source, models[i].points_full);\n        std::cerr << \"Instance \" << i << \"\\n\"  << \"Registed!\\n\";\n    }\n    std::cerr << \"Object Poses Estimation Done!\\n\";\n}\n\nvoid model_to_scene::computeOBB(const pcl::PointCloud<pcl::PointXYZ> &input, boundingBBox &OBB)\n{\n    // Compute principal directions\n    Eigen::Vector4f pcaCentroid;\n    pcl::compute3DCentroid(input, pcaCentroid);\n    Eigen::Matrix3f covariance;\n    computeCovarianceMatrixNormalized(input, pcaCentroid, covariance);\n    Eigen::SelfAdjointEigenSolver<Eigen::Matrix3f> eigen_solver(covariance, Eigen::ComputeEigenvectors);\n    Eigen::Matrix3f eigenVectorsPCA = eigen_solver.eigenvectors();\n    eigenVectorsPCA.col(2) = eigenVectorsPCA.col(0).cross(eigenVectorsPCA.col(1));\n\n    // Transform the original cloud to the origin where the principal components correspond to the axes.\n    Eigen::Matrix4f projectionTransform(Eigen::Matrix4f::Identity());\n    projectionTransform.block<3,3>(0,0) = eigenVectorsPCA.transpose();\n    projectionTransform.block<3,1>(0,3) = -1.f * (projectionTransform.block<3,3>(0,0) * pcaCentroid.head<3>());\n\n    // Transform the original cloud to the origin where the principal components correspond to the axes.\n    pcl::PointCloud<pcl::PointXYZ>::Ptr cloudPointsProjected (new pcl::PointCloud<pcl::PointXYZ>);\n    pcl::transformPointCloud(input, *cloudPointsProjected, projectionTransform);\n\n    // Get the minimum and maximum points of the transformed cloud.\n    pcl::PointXYZ minPoint, maxPoint;\n    pcl::getMinMax3D(*cloudPointsProjected, minPoint, maxPoint);\n    \n    OBB.length[0] = maxPoint.x - minPoint.x; //MAX length OBB\n    OBB.length[1] = maxPoint.y - minPoint.y; //MID length OBB\n    OBB.length[2] = maxPoint.z - minPoint.z; //MIN length OBB\n\n    if(OBB.length[0] < OBB.length[1])\n    {\n        float buf = OBB.length[0]; OBB.length[0] = OBB.length[1]; \n        OBB.length[1] = buf;\n\n        Eigen::Affine3f transform_2 = Eigen::Affine3f::Identity();\n        transform_2.rotate (Eigen::AngleAxisf (M_PI/2.0, Eigen::Vector3f::UnitZ()));\n        pcl::transformPointCloud (*cloudPointsProjected, *cloudPointsProjected, transform_2);\n        projectionTransform = transform_2.matrix()*projectionTransform;\n    }\n    if(OBB.length[0] < OBB.length[2])\n    {\n        float buf = OBB.length[0]; OBB.length[0] = OBB.length[2]; \n        OBB.length[2] = buf;\n\n        Eigen::Affine3f transform_2 = Eigen::Affine3f::Identity();\n        transform_2.rotate (Eigen::AngleAxisf (M_PI/2.0, Eigen::Vector3f::UnitY()));\n        pcl::transformPointCloud (*cloudPointsProjected, *cloudPointsProjected, transform_2);\n        projectionTransform = transform_2.matrix()*projectionTransform;\n    }\n    if(OBB.length[1] < OBB.length[2])\n    {\n        float buf = OBB.length[1]; OBB.length[1] = OBB.length[2]; \n        OBB.length[2] = buf;\n\n        Eigen::Affine3f transform_2 = Eigen::Affine3f::Identity();\n        transform_2.rotate (Eigen::AngleAxisf (M_PI/2.0, Eigen::Vector3f::UnitX()));\n        pcl::transformPointCloud (*cloudPointsProjected, *cloudPointsProjected, transform_2);\n        projectionTransform = transform_2.matrix()*projectionTransform;\n    }\n\n    pcl::getMinMax3D(*cloudPointsProjected, OBB.minPoint, OBB.maxPoint);\n    OBB.toOrigin = projectionTransform;\n\n    pcl::PointXYZ OBB_points;\n\n    OBB.cornerPoints.push_back(OBB.minPoint); // Min Point\n    OBB_points.x = OBB.minPoint.x; OBB_points.y = OBB.maxPoint.y; OBB_points.z = OBB.minPoint.z;\n    OBB.cornerPoints.push_back(OBB_points);\n    OBB_points.x = OBB.minPoint.x; OBB_points.y = OBB.maxPoint.y; OBB_points.z = OBB.maxPoint.z;\n    OBB.cornerPoints.push_back(OBB_points);\n    OBB_points.x = OBB.minPoint.x; OBB_points.y = OBB.minPoint.y; OBB_points.z = OBB.maxPoint.z;\n    OBB.cornerPoints.push_back(OBB_points);\n\n    OBB.cornerPoints.push_back(OBB.maxPoint); //Max point\n    OBB_points.x = OBB.maxPoint.x; OBB_points.y = OBB.minPoint.y; OBB_points.z = OBB.maxPoint.z;\n    OBB.cornerPoints.push_back(OBB_points);\n    OBB_points.x = OBB.maxPoint.x; OBB_points.y = OBB.minPoint.y; OBB_points.z = OBB.minPoint.z;\n    OBB.cornerPoints.push_back(OBB_points);\n    OBB_points.x = OBB.maxPoint.x; OBB_points.y = OBB.maxPoint.y; OBB_points.z = OBB.minPoint.z;\n    OBB.cornerPoints.push_back(OBB_points);\n\n    pcl::transformPointCloud(OBB.cornerPoints, OBB.cornerPoints, projectionTransform.inverse());\n\n    OBB.center.x = 0; OBB.center.y = 0; OBB.center.z = 0;\n    for (int i = 0; i < OBB.cornerPoints.size(); i++)\n    {\n        OBB.center.x += OBB.cornerPoints[i].x;\n        OBB.center.y += OBB.cornerPoints[i].y;\n        OBB.center.z += OBB.cornerPoints[i].z;\n    }\n    OBB.center.x = OBB.center.x / OBB.cornerPoints.size();\n    OBB.center.y = OBB.center.y / OBB.cornerPoints.size();\n    OBB.center.z = OBB.center.z / OBB.cornerPoints.size();\n}\n\n\ndouble model_to_scene::overlapPortion(const pcl::PointCloud<pcl::PointXYZ> &source, \n                                          const pcl::PointCloud<pcl::PointXYZ> &target, \n                                          const double &max_dist)\n{\n\tif (source.size() == 0 || target.size() == 0) return -1;\n\tpcl::PointCloud<pcl::PointXYZ>::Ptr target_cloud(new pcl::PointCloud<pcl::PointXYZ>);\n\tpcl::PointCloud<pcl::PointXYZ>::Ptr source_cloud(new pcl::PointCloud<pcl::PointXYZ>);\n\tpcl::copyPointCloud(target, *target_cloud);\n\tpcl::copyPointCloud(source, *source_cloud);\n\t\n\tpcl::KdTreeFLANN<pcl::PointXYZ> kdtree;\n\tkdtree.setInputCloud(target_cloud);\n\tstd::vector<int> pointIdxNKNSearch(1);\n\tstd::vector<float> pointNKNSquaredDistance(1);\n\n\tint overlap_Points = 0;\n\tfor (int i = 0; i < source.size(); ++i)\n\t{\n\t\tif (kdtree.nearestKSearch(source_cloud->points[i], 1, pointIdxNKNSearch, pointNKNSquaredDistance) > 0)\n\t\t{\n            if(sqrt(pointNKNSquaredDistance[0]) < max_dist)\n\t\t\t    overlap_Points++;\n\t\t}\n\t}\n\n\t//calculating the mean distance\n\tdouble portion = (double) overlap_Points / source.size();\n\treturn portion;\n}\n\nvoid model_to_scene::coarseToFineRegistration(const pcl::PointCloud<pcl::PointXYZ> &sourceCloud,\n                                              const pcl::PointCloud<pcl::PointXYZ> &modelCloud,\n                                              const pcl::PointCloud<pcl::PointXYZ> &targetCloud,\n                                              pcl::PointCloud<pcl::PointXYZ> &registed_source)\n{\n    pcl::PointCloud<pcl::PointXYZ>::Ptr source (new pcl::PointCloud<pcl::PointXYZ>);\n    pcl::PointCloud<pcl::PointXYZ>::Ptr model (new pcl::PointCloud<pcl::PointXYZ>);\n    pcl::PointCloud<pcl::PointXYZ>::Ptr target (new pcl::PointCloud<pcl::PointXYZ>);\n\n    //pcl::copyPointCloud(model, *targetCloud);\n\n    boundingBBox source_OBB, target_OBB;\n    computeOBB(sourceCloud, source_OBB);\n    computeOBB(targetCloud, target_OBB);\n    pcl::transformPointCloud(sourceCloud, *source, source_OBB.toOrigin);\n    pcl::transformPointCloud(modelCloud, *model, source_OBB.toOrigin);\n    pcl::transformPointCloud(targetCloud, *target, target_OBB.toOrigin);\n\n    \n    double bestScore = -9999999;\n    Eigen::Matrix4f bestCoarseMat (Eigen::Matrix4f::Identity());;\n    Eigen::Matrix4f bestFineMat (Eigen::Matrix4f::Identity());;\n\n    for(double RX = 0; RX <= M_PI; RX+=M_PI/2)\n    for(double RY = 0; RY <= M_PI; RY+=M_PI/2)\n    for(double RZ = 0; RZ <= M_PI; RZ+=M_PI)\n    {\n        pcl::PointCloud<pcl::PointXYZ>::Ptr rot_source (new pcl::PointCloud<pcl::PointXYZ>);\n        \n        Eigen::Affine3f ROT = Eigen::Affine3f::Identity();\n        ROT.rotate (Eigen::AngleAxisf (RX, Eigen::Vector3f::UnitX()));\n        ROT.rotate (Eigen::AngleAxisf (RY, Eigen::Vector3f::UnitY()));\n        ROT.rotate (Eigen::AngleAxisf (RZ, Eigen::Vector3f::UnitZ()));                        \n        pcl::transformPointCloud (*source, *rot_source, ROT);\n    \n        pcl::IterativeClosestPoint<pcl::PointXYZ, pcl::PointXYZ> icp;\n        icp.setInputSource(rot_source);\n        icp.setInputTarget(target);\n        icp.setMaximumIterations (100);\n        icp.setMaxCorrespondenceDistance(0.2);\n        icp.setRANSACOutlierRejectionThreshold(1);\n        icp.align(registed_source);\n\n        double overlap_dst_thresh = 0.03;\n        double overlapScore = overlapPortion(*target, registed_source, overlap_dst_thresh);\n        std::cerr << \"overlap score: \" << overlapScore << \"\\n\";\n        //if(overlapScore < overlap_score_thresh) continue; \n\n        if(bestScore < overlapScore)                                             \n        {\n            bestCoarseMat = ROT.matrix();\n            bestFineMat = icp.getFinalTransformation();\n            bestScore = overlapScore;\n        }\n    }\n    Eigen::Matrix4f finalMat = bestFineMat*bestCoarseMat*target_OBB.toOrigin;\n    pcl::transformPointCloud(*model, registed_source, finalMat.inverse());\n}"
  },
  {
    "path": "obj_pose_est/srv/ObjectRPE.srv",
    "content": "string ObjectRPE_dir\nstring dataset\nstring data_dir\nint64 num_frames\nint64 num_keyframes\n---\nint64 ouput\n"
  }
]