Files
files/server-repomix-context.xml/repomix-output.xml

8317 lines
236 KiB
XML

This file is a merged representation of the entire codebase, combined into a single document by Repomix.
The content has been processed where comments have been removed, empty lines have been removed, line numbers have been added.
<file_summary>
This section contains a summary of this file.
<purpose>
This file contains a packed representation of the entire repository's contents.
It is designed to be easily consumable by AI systems for analysis, code review,
or other automated processes.
</purpose>
<file_format>
The content is organized as follows:
1. This summary section
2. Repository information
3. Directory structure
4. Repository files (if enabled)
5. Multiple file entries, each consisting of:
- File path as an attribute
- Full contents of the file
</file_format>
<usage_guidelines>
- This file should be treated as read-only. Any changes should be made to the
original repository files, not this packed version.
- When processing this file, use the file path to distinguish
between different files in the repository.
- Be aware that this file may contain sensitive information. Handle it with
the same level of security as you would the original repository.
</usage_guidelines>
<notes>
- Some files may have been excluded based on .gitignore rules and Repomix's configuration
- Binary files are not included in this packed representation. Please refer to the Repository Structure section for a complete list of file paths, including binary files
- Files matching patterns in .gitignore are excluded
- Files matching default ignore patterns are excluded
- Code comments have been removed from supported file types
- Empty lines have been removed from all files
- Line numbers have been added to the beginning of each line
- Files are sorted by Git change count (files with more changes are at the bottom)
</notes>
</file_summary>
<directory_structure>
database/index.ts
database/relations/address-predefined.relations.ts
database/relations/address.relations.ts
database/relations/attribute.relations.ts
database/relations/brand.relations.ts
database/relations/campaign.relations.ts
database/relations/category.relations.ts
database/relations/country.relations.ts
database/relations/index.ts
database/relations/option.relations.ts
database/relations/price-history.relations.ts
database/relations/product-attribute.relations.ts
database/relations/product-variant-option.relations.ts
database/relations/product-variant.relations.ts
database/relations/product.relations.ts
database/relations/stock-movement.relations.ts
database/relations/upload.relations.ts
database/relations/user-avatar.relations.ts
database/relations/user.relations.ts
database/schemas/address-predefined.schema.ts
database/schemas/address.schema.ts
database/schemas/attribute.schema.ts
database/schemas/base.schema.ts
database/schemas/brand.schema.ts
database/schemas/campaign-product.schema.ts
database/schemas/campaign.schema.ts
database/schemas/category.schema.ts
database/schemas/country.schema.ts
database/schemas/index.ts
database/schemas/option.schema.ts
database/schemas/otp.schema.ts
database/schemas/price-history.schema.ts
database/schemas/product-attribute.schema.ts
database/schemas/product-image.schema.ts
database/schemas/product-variant-option.schema.ts
database/schemas/product-variant.schema.ts
database/schemas/product.schema.ts
database/schemas/stock-movement.schema.ts
database/schemas/upload.schema.ts
database/schemas/user-avatar.schema.ts
database/schemas/user.schema.ts
database/seeders/address-predefined.seeder.ts
database/seeders/country.seeder.ts
database/seeders/data/address-predefined.de.seed.json
database/seeders/data/address-predefined.ir.seed.json
database/seeders/data/countries.seed.json
database/seeders/index.ts
database/seeders/schemas.ts
database/seeders/truncate.ts
infra/postgres.ts
infra/redis.ts
services/auth/backoffice/auth.service.ts
services/auth/backoffice/constants.ts
services/auth/credentials.service.ts
services/session/session.service.ts
services/translation/load.ts
services/translation/types.ts
services/translation/watch.ts
services/upload/upload.errors.ts
services/upload/upload.helpers.ts
services/upload/upload.service.ts
services/upload/upload.types.ts
tests/setup/db.ts
tests/setup/global.ts
tests/setup/reset.ts
validators/auth.validator.ts
</directory_structure>
<files>
This section contains the contents of the repository's files.
<file path="database/index.ts">
1: import {postgres} from "@/server/infra/postgres";
2: export const db = postgres
</file>
<file path="database/relations/address-predefined.relations.ts">
1: import { defineRelationsPart } from 'drizzle-orm';
2: import * as schema from '@/server/database/schemas';
3: export const addressPredefinedValueRelations = defineRelationsPart(schema, (r) => ({
4: addressPredefined: {
5: country: r.one.countries({
6: from: r.addressPredefined.countryCode,
7: to: r.countries.code,
8: }),
9: parent: r.one.addressPredefined({
10: from: r.addressPredefined.parentId,
11: to: r.addressPredefined.id,
12: alias: 'address_predefined_value_hierarchy',
13: }),
14: children: r.many.addressPredefined({
15: from: r.addressPredefined.id,
16: to: r.addressPredefined.parentId,
17: alias: 'address_predefined_value_hierarchy',
18: }),
19: },
20: }));
</file>
<file path="database/relations/address.relations.ts">
1: import { defineRelationsPart } from 'drizzle-orm';
2: import * as schema from '@/server/database/schemas';
3: export const addressRelations = defineRelationsPart(schema, (r) => ({
4: addresses: {
5: user: r.one.users({
6: from: r.addresses.userId,
7: to: r.users.id,
8: }),
9: country: r.one.countries({
10: from: r.addresses.countryCode,
11: to: r.countries.code,
12: }),
13: },
14: }));
</file>
<file path="database/relations/attribute.relations.ts">
1: import { defineRelations } from 'drizzle-orm';
2: import * as schema from '@/server/database/schemas';
3: export const attributeRelations = defineRelations(schema, (r) => ({
4: attributes: {
5: options: r.many.options({
6: from: r.attributes.id,
7: to: r.options.attributeId,
8: }),
9: productAttributes: r.many.productAttributes({
10: from: r.attributes.id,
11: to: r.productAttributes.attributeId,
12: }),
13: },
14: }));
</file>
<file path="database/relations/brand.relations.ts">
1: import { defineRelations } from 'drizzle-orm';
2: import * as schema from '@/server/database/schemas';
3: export const brandRelations = defineRelations(schema, (r) => ({
4: brands: {
5: country: r.one.countries({
6: from: r.brands.countryCode,
7: to: r.countries.code,
8: }),
9: logo: r.one.uploads({
10: from: r.brands.logoUploadId,
11: to: r.uploads.id,
12: }),
13: products: r.many.products({
14: from: r.brands.id,
15: to: r.products.brandId,
16: }),
17: },
18: }));
</file>
<file path="database/relations/campaign.relations.ts">
1: import { defineRelations } from 'drizzle-orm';
2: import * as schema from '@/server/database/schemas';
3: export const campaignRelations = defineRelations(schema, (r) => ({
4: campaigns: {
5: campaignProducts: r.many.campaignProducts({
6: from: r.campaigns.id,
7: to: r.campaignProducts.campaignId,
8: }),
9: },
10: campaignProducts: {
11: campaign: r.one.campaigns({
12: from: r.campaignProducts.campaignId,
13: to: r.campaigns.id,
14: }),
15: variant: r.one.productVariants({
16: from: r.campaignProducts.variantId,
17: to: r.productVariants.id,
18: }),
19: },
20: }));
</file>
<file path="database/relations/category.relations.ts">
1: import { defineRelations } from 'drizzle-orm';
2: import * as schema from '@/server/database/schemas';
3: export const categoryRelations = defineRelations(schema, (r) => ({
4: categories: {
5: parent: r.one.categories({
6: from: r.categories.parentId,
7: to: r.categories.id,
8: }),
9: children: r.many.categories({
10: from: r.categories.id,
11: to: r.categories.parentId,
12: }),
13: products: r.many.products({
14: from: r.categories.id,
15: to: r.products.categoryId,
16: }),
17: },
18: }));
</file>
<file path="database/relations/country.relations.ts">
1: import { defineRelationsPart } from 'drizzle-orm';
2: import * as schema from '@/server/database/schemas';
3: export const countryRelations = defineRelationsPart(schema, (r) => ({
4: countries: {
5: addresses: r.many.addresses({
6: from: r.countries.code,
7: to: r.addresses.countryCode,
8: }),
9: addressPredefined: r.many.addressPredefined({
10: from: r.countries.code,
11: to: r.addressPredefined.countryCode,
12: }),
13: },
14: }));
</file>
<file path="database/relations/index.ts">
1: import { defineRelations } from 'drizzle-orm';
2: import * as schema from '@/server/database/schemas';
3: import { userRelations } from './user.relations';
4: import { countryRelations } from './country.relations';
5: import { addressRelations } from './address.relations';
6: import { addressPredefinedValueRelations } from './address-predefined.relations';
7: import { uploadsRelations } from './upload.relations';
8: import { userAvatarRelations } from './user-avatar.relations';
9: import { productRelations } from './product.relations';
10: import { productVariantOptionRelations } from './product-variant-option.relations';
11: import { categoryRelations } from './category.relations';
12: import { brandRelations } from './brand.relations';
13: import { attributeRelations } from './attribute.relations';
14: import { optionRelations } from './option.relations';
15: import { productAttributeRelations } from './product-attribute.relations';
16: import {priceHistoryRelations} from "./price-history.relations";
17: import {stockMovementRelations} from "./stock-movement.relations";
18: import {campaignRelations} from "./campaign.relations";
19: const mainRelations = defineRelations(schema, () => ({}));
20: export const relations = {
21: ...mainRelations,
22: ...uploadsRelations,
23: ...userRelations,
24: ...userAvatarRelations,
25: ...countryRelations,
26: ...addressRelations,
27: ...addressPredefinedValueRelations,
28: ...productRelations,
29: ...productVariantOptionRelations,
30: ...categoryRelations,
31: ...brandRelations,
32: ...attributeRelations,
33: ...optionRelations,
34: ...productAttributeRelations,
35: ...priceHistoryRelations,
36: ...stockMovementRelations,
37: ...campaignRelations,
38: };
</file>
<file path="database/relations/option.relations.ts">
1: import { defineRelations } from 'drizzle-orm';
2: import * as schema from '@/server/database/schemas';
3: export const optionRelations = defineRelations(schema, (r) => ({
4: options: {
5: attribute: r.one.attributes({
6: from: r.options.attributeId,
7: to: r.attributes.id,
8: }),
9: productAttributes: r.many.productAttributes({
10: from: r.options.id,
11: to: r.productAttributes.optionId,
12: }),
13: variantOptions: r.many.productVariantOptions({
14: from: r.options.id,
15: to: r.productVariantOptions.optionId,
16: }),
17: },
18: }));
</file>
<file path="database/relations/price-history.relations.ts">
1: import { defineRelations } from 'drizzle-orm';
2: import * as schema from '@/server/database/schemas';
3: export const priceHistoryRelations = defineRelations(schema, (r) => ({
4: priceHistory: {
5: variant: r.one.productVariants({ from: r.priceHistory.variantId, to: r.productVariants.id }),
6: changedByUser: r.one.users({ from: r.priceHistory.changedBy, to: r.users.id }),
7: },
8: }));
</file>
<file path="database/relations/product-attribute.relations.ts">
1: import { defineRelations } from 'drizzle-orm';
2: import * as schema from '@/server/database/schemas';
3: export const productAttributeRelations = defineRelations(schema, (r) => ({
4: productAttributes: {
5: product: r.one.products({
6: from: r.productAttributes.productId,
7: to: r.products.id,
8: }),
9: attribute: r.one.attributes({
10: from: r.productAttributes.attributeId,
11: to: r.attributes.id,
12: }),
13: option: r.one.options({
14: from: r.productAttributes.optionId,
15: to: r.options.id,
16: }),
17: },
18: }));
</file>
<file path="database/relations/product-variant-option.relations.ts">
1: import { defineRelations } from 'drizzle-orm';
2: import * as schema from '@/server/database/schemas';
3: export const productVariantOptionRelations = defineRelations(schema, (r) => ({
4: productVariantOptions: {
5: variant: r.one.productVariants({
6: from: r.productVariantOptions.variantId,
7: to: r.productVariants.id,
8: }),
9: option: r.one.options({
10: from: r.productVariantOptions.optionId,
11: to: r.options.id,
12: }),
13: },
14: }));
</file>
<file path="database/relations/product-variant.relations.ts">
1: import { defineRelations } from 'drizzle-orm';
2: import * as schema from '@/server/database/schemas';
3: export const productVariantRelations = defineRelations(schema, (r) => ({
4: products: {
5: variants: r.many.productVariants({
6: from: r.products.id,
7: to: r.productVariants.productId,
8: }),
9: },
10: productVariants: {
11: product: r.one.products({
12: from: r.productVariants.productId,
13: to: r.products.id,
14: }),
15: variantOptions: r.many.productVariantOptions({
16: from: r.productVariants.id,
17: to: r.productVariantOptions.variantId,
18: }),
19: },
20: }));
</file>
<file path="database/relations/product.relations.ts">
1: import {defineRelations} from 'drizzle-orm';
2: import * as schema from '@/server/database/schemas';
3: export const productRelations = defineRelations(schema, (r) => ({
4: products: {
5: category: r.one.categories({
6: from: r.products.categoryId,
7: to: r.categories.id,
8: }),
9: brand: r.one.brands({
10: from: r.products.brandId,
11: to: r.brands.id,
12: }),
13: images: r.many.productImages({
14: from: r.products.id,
15: to: r.productImages.productId,
16: }),
17: attributes: r.many.productAttributes({
18: from: r.products.id,
19: to: r.productAttributes.productId,
20: }),
21: variants: r.many.productVariants({
22: from: r.products.id,
23: to: r.productVariants.productId,
24: }),
25: },
26: productVariants: {
27: product: r.one.products({
28: from: r.productVariants.productId,
29: to: r.products.id,
30: }),
31: variantOptions: r.many.productVariantOptions({
32: from: r.productVariants.id,
33: to: r.productVariantOptions.variantId,
34: }),
35: priceHistory: r.many.priceHistory({
36: from: r.productVariants.id,
37: to: r.priceHistory.variantId
38: }),
39: stockMovements: r.many.stockMovements({
40: from: r.productVariants.id,
41: to: r.stockMovements.variantId
42: }),
43: campaignProducts: r.many.campaignProducts({
44: from: r.productVariants.id,
45: to: r.campaignProducts.variantId
46: }),
47: },
48: }));
</file>
<file path="database/relations/stock-movement.relations.ts">
1: import { defineRelations } from 'drizzle-orm';
2: import * as schema from '@/server/database/schemas';
3: export const stockMovementRelations = defineRelations(schema, (r) => ({
4: stockMovements: {
5: variant: r.one.productVariants({
6: from: r.stockMovements.variantId,
7: to: r.productVariants.id,
8: }),
9: createdByUser: r.one.users({
10: from: r.stockMovements.createdBy,
11: to: r.users.id,
12: }),
13: },
14: }));
</file>
<file path="database/relations/upload.relations.ts">
1: import { defineRelationsPart } from "drizzle-orm";
2: import * as schema from '@/server/database/schemas';
3: export const uploadsRelations = defineRelationsPart(schema, (r) => ({
4: uploads: {
5: uploadedByUser: r.one.users({
6: from: r.uploads.uploadedBy,
7: to: r.users.id,
8: }),
9: },
10: }));
</file>
<file path="database/relations/user-avatar.relations.ts">
1: import { defineRelationsPart } from 'drizzle-orm';
2: import * as schema from '@/server/database/schemas';
3: export const userAvatarRelations = defineRelationsPart(schema, (r) => ({
4: userAvatars: {
5: user: r.one.users({
6: from: r.userAvatars.userId,
7: to: r.users.id,
8: }),
9: upload: r.one.uploads({
10: from: r.userAvatars.uploadId,
11: to: r.uploads.id,
12: }),
13: },
14: }));
</file>
<file path="database/relations/user.relations.ts">
1: import { defineRelationsPart } from 'drizzle-orm';
2: import * as schema from '@/server/database/schemas';
3: export const userRelations = defineRelationsPart(schema, (r) => ({
4: users: {
5: addresses: r.many.addresses({
6: from: r.users.id,
7: to: r.addresses.userId,
8: }),
9: avatar: r.one.userAvatars({
10: from: r.users.id,
11: to: r.userAvatars.userId,
12: }),
13: },
14: }));
</file>
<file path="database/schemas/address-predefined.schema.ts">
1: import { sql } from 'drizzle-orm';
2: import { pgEnum, uuid, varchar, jsonb, char, uniqueIndex } from 'drizzle-orm/pg-core';
3: import type { AnyPgColumn } from 'drizzle-orm/pg-core';
4: import {baseTable, LocalizedLabel} from './base.schema';
5: import { countries } from './country.schema';
6: export const addressFieldEnum = pgEnum('address_field', [
7: 'administrative_area',
8: 'locality',
9: 'dependent_locality',
10: ]);
11: export const addressPredefined = baseTable(
12: 'address_predefined',
13: {
14: parentId: uuid('parent_id').references((): AnyPgColumn => addressPredefined.id),
15: field: addressFieldEnum('field').notNull(),
16: key: varchar('key', { length: 255 }).notNull(),
17: name: jsonb('name').$type<LocalizedLabel>().notNull(),
18: countryCode: char('country_code', { length: 2 })
19: .notNull()
20: .references(() => countries.code),
21: },
22: (table) => [
23: uniqueIndex('address_predefined_scope_key_idx').on(
24: table.countryCode,
25: table.field,
26: table.parentId,
27: table.key
28: ),
29: uniqueIndex('address_predefined_values_root_key_idx')
30: .on(table.countryCode, table.field, table.key)
31: .where(sql`${table.parentId} IS NULL`),
32: ]
33: );
34: export type AddressPredefined = typeof addressPredefined.$inferSelect;
35: export type NewAddressPredefined = typeof addressPredefined.$inferInsert;
</file>
<file path="database/schemas/address.schema.ts">
1: import { boolean, char, decimal, text, uuid, varchar } from 'drizzle-orm/pg-core';
2: import { baseTable } from './base.schema';
3: import { users } from './user.schema';
4: import { countries } from './country.schema';
5: export const addresses = baseTable('addresses', {
6: userId: uuid('user_id').references(() => users.id),
7: countryCode: char('country_code', { length: 2 })
8: .notNull()
9: .references(() => countries.code),
10: recipientName: varchar('recipient_name', { length: 255 }),
11: organization: varchar('organization', { length: 255 }),
12: addressLine1: varchar('address_line1', { length: 255 }),
13: addressLine2: varchar('address_line2', { length: 255 }),
14: dependentLocality: varchar('dependent_locality', { length: 255 }),
15: locality: varchar('locality', { length: 255 }),
16: administrativeArea: varchar('administrative_area', { length: 255 }),
17: postalCode: varchar('postal_code', { length: 20 }),
18: sortingCode: varchar('sorting_code', { length: 20 }),
19: formattedAddress: text('formatted_address'),
20: latitude: decimal('latitude', { precision: 10, scale: 7 }),
21: longitude: decimal('longitude', { precision: 10, scale: 7 }),
22: phone: varchar('phone', { length: 30 }),
23: email: varchar('email', { length: 255 }),
24: label: varchar('label', { length: 50 }),
25: isVerified: boolean('is_verified').default(false),
26: isDefault: boolean('is_default').default(false).notNull(),
27: });
28: export type Address = typeof addresses.$inferSelect;
29: export type NewAddress = typeof addresses.$inferInsert;
</file>
<file path="database/schemas/attribute.schema.ts">
1: import { jsonb } from 'drizzle-orm/pg-core';
2: import { baseTable, type LocalizedLabel } from './base.schema';
3: export const attributes = baseTable('attributes', {
4: name: jsonb('name').$type<LocalizedLabel>().notNull(),
5: });
6: export type Attribute = typeof attributes.$inferSelect;
7: export type NewAttribute = typeof attributes.$inferInsert;
</file>
<file path="database/schemas/base.schema.ts">
1: import { pgTable } from 'drizzle-orm/pg-core';
2: import type { AnyPgColumnBuilder } from 'drizzle-orm/pg-core';
3: import { uuidv7 } from 'uuidv7';
4: import { uuid, timestamp } from 'drizzle-orm/pg-core';
5: export const idColumn = {
6: id: uuid('id').primaryKey().$defaultFn(() => uuidv7()),
7: };
8: export const timestampColumns = {
9: createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),
10: updatedAt: timestamp('updated_at', { withTimezone: true })
11: .defaultNow()
12: .notNull()
13: .$onUpdate(() => new Date()),
14: deletedAt: timestamp('deleted_at', { withTimezone: true }),
15: };
16: export function baseTable<T extends Record<string, AnyPgColumnBuilder>>(
17: name: string,
18: columns: T,
19: extraConfig?: (table: ReturnType<typeof pgTable<string, T & typeof idColumn & typeof timestampColumns>>) => unknown
20: ) {
21: return pgTable(
22: name,
23: {
24: ...idColumn,
25: ...columns,
26: ...timestampColumns,
27: },
28: extraConfig as never
29: );
30: }
31: export type LocalizedLabel = Record<string, string>;
</file>
<file path="database/schemas/brand.schema.ts">
1: import {jsonb, char, uuid} from 'drizzle-orm/pg-core';
2: import { baseTable, type LocalizedLabel } from './base.schema';
3: import { countries } from './country.schema';
4: import {uploads} from "@/server/database/schemas/upload.schema";
5: export const brands = baseTable('brands', {
6: name: jsonb('name').$type<LocalizedLabel>().notNull(),
7: description: jsonb('description').$type<LocalizedLabel>(),
8: countryCode: char('country_code', { length: 2 }).references(() => countries.code, {
9: onDelete: 'set null',
10: }),
11: logoUploadId: uuid("logo_upload_id").references(() => uploads.id),
12: });
13: export type Brand = typeof brands.$inferSelect;
14: export type NewBrand = typeof brands.$inferInsert;
</file>
<file path="database/schemas/campaign-product.schema.ts">
1: import { uuid, varchar, integer, unique } from 'drizzle-orm/pg-core';
2: import { baseTable } from './base.schema';
3: import { campaigns } from './campaign.schema';
4: import { productVariants } from './product-variant.schema';
5: import { type DiscountType } from './campaign.schema';
6: export const campaignProducts = baseTable(
7: 'campaign_products',
8: {
9: campaignId: uuid('campaign_id').notNull().references(() => campaigns.id),
10: variantId: uuid('variant_id').notNull().references(() => productVariants.id),
11: discountType: varchar('discount_type', { length: 20 }).$type<DiscountType>(),
12: discountValue: integer('discount_value'),
13: },
14: (table) => [
15: unique('campaign_variant_unique').on(table.campaignId, table.variantId),
16: ]
17: );
18: export type CampaignProduct = typeof campaignProducts.$inferSelect;
19: export type NewCampaignProduct = typeof campaignProducts.$inferInsert;
</file>
<file path="database/schemas/campaign.schema.ts">
1: import { varchar, timestamp, integer, boolean, jsonb } from 'drizzle-orm/pg-core';
2: import { baseTable, type LocalizedLabel } from './base.schema';
3: export const discountTypeValues = ["percentage", "fixed_amount"] as const;
4: export type DiscountType = (typeof discountTypeValues)[number];
5: export const campaigns = baseTable('campaigns', {
6: name: jsonb('name').$type<LocalizedLabel>().notNull(),
7: slug: varchar('slug', { length: 255 }).notNull().unique(),
8: startsAt: timestamp('starts_at', { withTimezone: true }).notNull(),
9: endsAt: timestamp('ends_at', { withTimezone: true }).notNull(),
10: isActive: boolean('is_active').notNull().default(true),
11: defaultDiscountType: varchar('default_discount_type', { length: 20 }).$type<DiscountType>(),
12: defaultDiscountValue: integer('default_discount_value'),
13: });
14: export type Campaign = typeof campaigns.$inferSelect;
15: export type NewCampaign = typeof campaigns.$inferInsert;
</file>
<file path="database/schemas/category.schema.ts">
1: import { varchar, jsonb, uuid, index, unique } from 'drizzle-orm/pg-core';
2: import type { AnyPgColumn } from 'drizzle-orm/pg-core';
3: import { baseTable, type LocalizedLabel } from './base.schema';
4: export const categories = baseTable(
5: 'categories',
6: {
7: name: jsonb('name').$type<LocalizedLabel>().notNull(),
8: parentId: uuid('parent_id').references((): AnyPgColumn => categories.id),
9: slug: varchar('slug', { length: 255 }).notNull().unique(),
10: },
11: (table) => [
12: index('categories_parent_id_idx').on(table.parentId),
13: unique('categories_id_parent_id_unique').on(table.id, table.parentId),
14: ]
15: );
16: export type Category = typeof categories.$inferSelect;
17: export type NewCategory = typeof categories.$inferInsert;
</file>
<file path="database/schemas/country.schema.ts">
1: import { pgTable, char, varchar, jsonb, uniqueIndex } from 'drizzle-orm/pg-core';
2: import { sql } from 'drizzle-orm';
3: import type { LocalizedLabel } from './base.schema';
4: export type AddressFieldLabels = {
5: administrativeArea?: LocalizedLabel;
6: locality?: LocalizedLabel;
7: dependentLocality?: LocalizedLabel;
8: postalCode?: LocalizedLabel;
9: sortingCode?: LocalizedLabel;
10: };
11: export const countries = pgTable(
12: 'countries',
13: {
14: code: char('code', { length: 2 }).primaryKey(),
15: name: jsonb('name').$type<LocalizedLabel>().notNull(),
16: phoneCode: varchar('phone_code', { length: 5 }).notNull(),
17: addressLabels: jsonb('address_labels').$type<AddressFieldLabels>(),
18: },
19: (table) => [uniqueIndex('countries_name_en_idx').on(sql`(${table.name}->>'en')`)]
20: );
21: export type Country = typeof countries.$inferSelect;
22: export type NewCountry = typeof countries.$inferInsert;
</file>
<file path="database/schemas/index.ts">
1: export * from './base.schema';
2: export * from './user.schema';
3: export * from './upload.schema';
4: export * from './user-avatar.schema';
5: export * from './country.schema';
6: export * from './address.schema';
7: export * from './address-predefined.schema';
8: export * from './category.schema';
9: export * from './brand.schema';
10: export * from './product.schema';
11: export * from './product-image.schema';
12: export * from './attribute.schema';
13: export * from './option.schema';
14: export * from './product-attribute.schema';
15: export * from './product-variant.schema';
16: export * from './product-variant-option.schema';
17: export * from './price-history.schema';
18: export * from './stock-movement.schema';
19: export * from './campaign.schema';
20: export * from './campaign-product.schema';
</file>
<file path="database/schemas/option.schema.ts">
1: import { jsonb, uuid } from 'drizzle-orm/pg-core';
2: import { baseTable, type LocalizedLabel } from './base.schema';
3: import { attributes } from './attribute.schema';
4: export const options = baseTable('options', {
5: attributeId: uuid('attribute_id')
6: .notNull()
7: .references(() => attributes.id),
8: name: jsonb('name').$type<LocalizedLabel>().notNull(),
9: });
10: export type Option = typeof options.$inferSelect;
11: export type NewOption = typeof options.$inferInsert;
</file>
<file path="database/schemas/otp.schema.ts">
1: import { pgEnum, uuid, varchar, integer, timestamp, index } from 'drizzle-orm/pg-core';
2: import { baseTable } from './base.schema';
3: import { users } from './user.schema';
4: export const otpChannelEnum = pgEnum('otp_channel', ['email', 'phone']);
5: export const otpPurposeEnum = pgEnum('otp_purpose', [
6: 'email_verification',
7: 'phone_verification',
8: 'password_reset',
9: ]);
10: export const otps = baseTable(
11: 'otps',
12: {
13: userId: uuid('user_id').references(() => users.id),
14: identifier: varchar('identifier', { length: 255 }).notNull(),
15: channel: otpChannelEnum('channel').notNull(),
16: purpose: otpPurposeEnum('purpose').notNull(),
17: codeHash: varchar('code_hash', { length: 255 }).notNull(),
18: attempts: integer('attempts').notNull().default(0),
19: expiresAt: timestamp('expires_at', { withTimezone: true }).notNull(),
20: consumedAt: timestamp('consumed_at', { withTimezone: true }),
21: },
22: (table) => [
23: index('otps_lookup_idx').on(table.identifier, table.channel, table.purpose),
24: ]
25: );
26: export type Otp = typeof otps.$inferSelect;
27: export type NewOtp = typeof otps.$inferInsert;
</file>
<file path="database/schemas/price-history.schema.ts">
1: import { bigint, uuid } from 'drizzle-orm/pg-core';
2: import { baseTable } from './base.schema';
3: import { productVariants } from './product-variant.schema';
4: import { users } from './user.schema';
5: export const priceHistory = baseTable('price_history', {
6: variantId: uuid('variant_id')
7: .notNull()
8: .references(() => productVariants.id),
9: oldPrice: bigint('old_price', { mode: 'number' }).notNull(),
10: newPrice: bigint('new_price', { mode: 'number' }).notNull(),
11: changedBy: uuid('changed_by').references(() => users.id),
12: });
13: export type PriceHistory = typeof priceHistory.$inferSelect;
14: export type NewPriceHistory = typeof priceHistory.$inferInsert;
</file>
<file path="database/schemas/product-attribute.schema.ts">
1: import { varchar, uuid } from 'drizzle-orm/pg-core';
2: import { baseTable } from './base.schema';
3: import { products } from './product.schema';
4: import { attributes } from './attribute.schema';
5: import { options } from './option.schema';
6: export const productAttributes = baseTable('product_attributes', {
7: productId: uuid('product_id')
8: .notNull()
9: .references(() => products.id),
10: attributeId: uuid('attribute_id')
11: .notNull()
12: .references(() => attributes.id),
13: optionId: uuid('option_id').references(() => options.id),
14: value: varchar('value', { length: 255 }),
15: });
16: export type ProductAttribute = typeof productAttributes.$inferSelect;
17: export type NewProductAttribute = typeof productAttributes.$inferInsert;
</file>
<file path="database/schemas/product-image.schema.ts">
1: import {boolean, uuid, integer} from 'drizzle-orm/pg-core';
2: import { baseTable } from './base.schema';
3: import { products } from './product.schema';
4: import {uploads} from "@/server/database/schemas/upload.schema";
5: export const productImages = baseTable('product_images', {
6: productId: uuid('product_id')
7: .notNull()
8: .references(() => products.id),
9: uploadId: uuid("upload_id").notNull().references(() => uploads.id),
10: position: integer("position").notNull().default(0),
11: isMain: boolean('is_main').notNull().default(false),
12: });
13: export type ProductImage = typeof productImages.$inferSelect;
14: export type NewProductImage = typeof productImages.$inferInsert;
</file>
<file path="database/schemas/product-variant-option.schema.ts">
1: import { uuid, unique } from 'drizzle-orm/pg-core';
2: import { baseTable } from './base.schema';
3: import { productVariants } from './product-variant.schema';
4: import { options } from './option.schema';
5: export const productVariantOptions = baseTable(
6: 'product_variant_options',
7: {
8: variantId: uuid('variant_id')
9: .notNull()
10: .references(() => productVariants.id),
11: optionId: uuid('option_id')
12: .notNull()
13: .references(() => options.id),
14: },
15: (table) => [
16: unique('variant_option_unique').on(table.variantId, table.optionId),
17: ]
18: );
19: export type ProductVariantOption = typeof productVariantOptions.$inferSelect;
20: export type NewProductVariantOption = typeof productVariantOptions.$inferInsert;
</file>
<file path="database/schemas/product-variant.schema.ts">
1: import { varchar, bigint, uuid } from 'drizzle-orm/pg-core';
2: import { baseTable } from './base.schema';
3: import { products } from './product.schema';
4: export const productVariants = baseTable('product_variants', {
5: productId: uuid('product_id')
6: .notNull()
7: .references(() => products.id),
8: sku: varchar('sku', { length: 100 }).notNull().unique(),
9: price: bigint('price', { mode: 'number' }).notNull(),
10: stock: bigint('stock', { mode: 'number' }).notNull().default(0),
11: });
12: export type ProductVariant = typeof productVariants.$inferSelect;
13: export type NewProductVariant = typeof productVariants.$inferInsert;
</file>
<file path="database/schemas/product.schema.ts">
1: import { jsonb, bigint, uuid } from 'drizzle-orm/pg-core';
2: import { baseTable, type LocalizedLabel } from './base.schema';
3: import { categories } from './category.schema';
4: import { brands } from './brand.schema';
5: export const products = baseTable('products', {
6: code: bigint('code', { mode: 'number' }).notNull(),
7: name: jsonb('name').$type<LocalizedLabel>().notNull(),
8: description: jsonb('description').$type<LocalizedLabel>(),
9: categoryId: uuid('category_id')
10: .notNull()
11: .references(() => categories.id),
12: brandId: uuid('brand_id').references(() => brands.id),
13: });
14: export type Product = typeof products.$inferSelect;
15: export type NewProduct = typeof products.$inferInsert;
</file>
<file path="database/schemas/stock-movement.schema.ts">
1: import { integer, uuid, varchar } from 'drizzle-orm/pg-core';
2: import { baseTable } from './base.schema';
3: import { productVariants } from './product-variant.schema';
4: import { users } from './user.schema';
5: export const stockMovementReasonValues = [
6: "sale",
7: "restock",
8: "damaged",
9: "returned",
10: "manual_adjustment",
11: ] as const;
12: export type StockMovementReason = (typeof stockMovementReasonValues)[number];
13: export const stockMovements = baseTable('stock_movements', {
14: variantId: uuid('variant_id')
15: .notNull()
16: .references(() => productVariants.id),
17: quantity: integer('quantity').notNull(),
18: balanceAfter: integer('balance_after').notNull(),
19: reason: varchar('reason', { length: 30 }).$type<StockMovementReason>().notNull(),
20: referenceId: uuid('reference_id'),
21: createdBy: uuid('created_by').references(() => users.id),
22: });
23: export type StockMovement = typeof stockMovements.$inferSelect;
24: export type NewStockMovement = typeof stockMovements.$inferInsert;
</file>
<file path="database/schemas/upload.schema.ts">
1: import {varchar, bigint, uuid} from "drizzle-orm/pg-core";
2: import {baseTable} from "./base.schema";
3: import {users} from "./user.schema";
4: export const uploadStatusValues = ["pending", "completed", "failed"] as const;
5: export type UploadStatus = (typeof uploadStatusValues)[number];
6: export const uploads = baseTable("uploads",
7: {
8: bucket: varchar("bucket", {length: 100}).notNull().default("shop-storage"),
9: storageKey: varchar("storage_key", {length: 500}).notNull(),
10: checksum: varchar("checksum", {length: 64}),
11: originalName: varchar("original_name", {length: 255}).notNull(),
12: mimeType: varchar("mime_type", {length: 100}).notNull(),
13: sizeBytes: bigint("size_bytes", {mode: "number"}).notNull(),
14: status: varchar("status", {length: 20})
15: .$type<UploadStatus>()
16: .notNull()
17: .default("pending"),
18: uploadedBy: uuid('uploaded_by')
19: .notNull()
20: .references(() => users.id),
21: }
22: );
23: export type Upload = typeof uploads.$inferSelect;
24: export type NewUpload = typeof uploads.$inferInsert;
</file>
<file path="database/schemas/user-avatar.schema.ts">
1: import {uuid, uniqueIndex} from "drizzle-orm/pg-core";
2: import {baseTable} from "./base.schema";
3: import {users} from "./user.schema";
4: import {uploads} from "./upload.schema";
5: export const userAvatars = baseTable("user_avatars",
6: {
7: userId: uuid("user_id")
8: .notNull()
9: .references(() => users.id),
10: uploadId: uuid("upload_id")
11: .notNull()
12: .references(() => uploads.id),
13: },
14: (table) => [
15: uniqueIndex('user_avatars_user_id_idx').on(table.userId),
16: ]
17: );
18: export type UserAvatar = typeof userAvatars.$inferSelect;
19: export type NewUserAvatar = typeof userAvatars.$inferInsert;
</file>
<file path="database/schemas/user.schema.ts">
1: import {varchar, timestamp, uniqueIndex, check} from 'drizzle-orm/pg-core';
2: import { sql } from 'drizzle-orm';
3: import { baseTable } from './base.schema';
4: export const users = baseTable(
5: 'users',
6: {
7: name: varchar('name', { length: 255 }).notNull(),
8: email: varchar('email', { length: 255 }),
9: password: varchar('password', { length: 255 }),
10: emailVerifiedAt: timestamp('email_verified_at', { withTimezone: true }),
11: phone: varchar('phone', { length: 20 }),
12: phoneVerifiedAt: timestamp('phone_verified_at', { withTimezone: true }),
13: },
14: (table) => [
15: uniqueIndex('users_email_idx').on(table.email),
16: uniqueIndex('users_phone_idx').on(table.phone),
17: check('users_email_or_phone_check', sql`${table.email} IS NOT NULL OR ${table.phone} IS NOT NULL`),
18: ]
19: );
20: export type User = typeof users.$inferSelect;
21: export type NewUser = typeof users.$inferInsert;
</file>
<file path="database/seeders/address-predefined.seeder.ts">
1: import { z } from 'zod';
2: import { db } from '@/server/database';
3: import { addressPredefined } from '@/server/database/schemas';
4: import { LocalizedLabelSchema } from '@/server/database/seeders/schemas';
5: import deAddressPredefinedSeedData from './data/address-predefined.de.seed.json';
6: import irAddressPredefinedSeedData from './data/address-predefined.ir.seed.json';
7: const fieldEnumSchema = z.enum(['administrative_area', 'locality', 'dependent_locality']);
8: type SeedNode = {
9: field: z.infer<typeof fieldEnumSchema>;
10: key: string;
11: name: z.infer<typeof LocalizedLabelSchema>;
12: children?: SeedNode[];
13: };
14: const seedNodeSchema: z.ZodType<SeedNode> = z.lazy(() =>
15: z.object({
16: field: fieldEnumSchema,
17: key: z.string(),
18: name: LocalizedLabelSchema,
19: children: z.array(seedNodeSchema).optional(),
20: })
21: );
22: const addressPredefinedSeedSchema = z.array(
23: seedNodeSchema.and(z.object({ countryCode: z.string().length(2) }))
24: );
25: async function insertNode(
26: node: SeedNode,
27: countryCode: string,
28: parentId: string | null
29: ): Promise<number> {
30: const [inserted] = await db
31: .insert(addressPredefined)
32: .values({
33: countryCode,
34: field: node.field,
35: key: node.key,
36: name: node.name,
37: parentId: parentId ?? undefined,
38: })
39: .onConflictDoNothing()
40: .returning({ id: addressPredefined.id });
41: const id =
42: inserted?.id ??
43: (
44: await db.query.addressPredefined.findFirst({
45: where: {
46: countryCode: countryCode,
47: field: node.field,
48: key: node.key,
49: parentId: parentId ? parentId : { isNull: true },
50: },
51: })
52: )?.id;
53: if (!id) {
54: throw new Error(`Failed to resolve id for ${countryCode}/${node.field}/${node.key}`);
55: }
56: let count = 1;
57: for (const child of node.children ?? []) {
58: count += await insertNode(child, countryCode, id);
59: }
60: return count;
61: }
62: const ADDRESS_PREDEFINED_SEED_SOURCES = [
63: deAddressPredefinedSeedData,
64: irAddressPredefinedSeedData,
65: ] as const;
66: export async function seedAddressPredefined() {
67: const roots = ADDRESS_PREDEFINED_SEED_SOURCES.flatMap(
68: (data) => addressPredefinedSeedSchema.parse(data)
69: );
70: const counts = await Promise.all(
71: roots.map((root) => insertNode(root, root.countryCode, null))
72: );
73: const total = counts.reduce((sum, n) => sum + n, 0);
74: console.log(`Seeded ${total} address predefined values`);
75: }
</file>
<file path="database/seeders/country.seeder.ts">
1: import { z } from 'zod';
2: import { db } from '@/server/database';
3: import { countries } from '@/server/database/schemas';
4: import countrySeedData from './data/countries.seed.json';
5: import { LocalizedLabelSchema } from '@/server/database/seeders/schemas';
6: const countrySeedSchema = z.array(z.object({
7: code: z.string().length(2),
8: name: z.record(z.string(), z.string()),
9: phoneCode: z.string(),
10: addressLabels: z.object({
11: administrativeArea: LocalizedLabelSchema.optional(),
12: locality: LocalizedLabelSchema.optional(),
13: dependentLocality: LocalizedLabelSchema.optional(),
14: postalCode: LocalizedLabelSchema.optional(),
15: sortingCode: LocalizedLabelSchema.optional(),
16: }).optional(),
17: }));
18: export async function seedCountries() {
19: const data = countrySeedSchema.parse(countrySeedData);
20: await db
21: .insert(countries)
22: .values(data)
23: .onConflictDoUpdate({
24: target: countries.code,
25: set: {
26: name: countries.name,
27: phoneCode: countries.phoneCode,
28: addressLabels: countries.addressLabels,
29: },
30: });
31: console.log(`Seeded ${data.length} countries`);
32: }
</file>
<file path="database/seeders/data/address-predefined.de.seed.json">
1: [
2: {
3: "countryCode": "DE",
4: "field": "administrative_area",
5: "key": "baden_wuerttemberg",
6: "name": {
7: "en": "Baden-Württemberg",
8: "fa": "بادن-وورتمبرگ",
9: "de": "Baden-Württemberg"
10: }
11: },
12: {
13: "countryCode": "DE",
14: "field": "administrative_area",
15: "key": "berlin",
16: "name": {
17: "en": "Berlin",
18: "fa": "برلین",
19: "de": "Berlin"
20: }
21: },
22: {
23: "countryCode": "DE",
24: "field": "administrative_area",
25: "key": "brandenburg",
26: "name": {
27: "en": "Brandenburg",
28: "fa": "براندنبورگ",
29: "de": "Brandenburg"
30: }
31: },
32: {
33: "countryCode": "DE",
34: "field": "administrative_area",
35: "key": "bremen",
36: "name": {
37: "en": "Bremen",
38: "fa": "برمن",
39: "de": "Bremen"
40: }
41: },
42: {
43: "countryCode": "DE",
44: "field": "administrative_area",
45: "key": "hamburg",
46: "name": {
47: "en": "Hamburg",
48: "fa": "هامبورگ",
49: "de": "Hamburg"
50: }
51: },
52: {
53: "countryCode": "DE",
54: "field": "administrative_area",
55: "key": "hesse",
56: "name": {
57: "en": "Hesse",
58: "fa": "هسن",
59: "de": "Hessen"
60: }
61: },
62: {
63: "countryCode": "DE",
64: "field": "administrative_area",
65: "key": "lower_saxony",
66: "name": {
67: "en": "Lower Saxony",
68: "fa": "نیدرزاکسن",
69: "de": "Niedersachsen"
70: }
71: },
72: {
73: "countryCode": "DE",
74: "field": "administrative_area",
75: "key": "mecklenburg_vorpommern",
76: "name": {
77: "en": "Mecklenburg-Vorpommern",
78: "fa": "مکلنبورگ-فورپومرن",
79: "de": "Mecklenburg-Vorpommern"
80: }
81: },
82: {
83: "countryCode": "DE",
84: "field": "administrative_area",
85: "key": "north_rhine_westphalia",
86: "name": {
87: "en": "North Rhine-Westphalia",
88: "fa": "نوردراین-وستفالن",
89: "de": "Nordrhein-Westfalen"
90: }
91: },
92: {
93: "countryCode": "DE",
94: "field": "administrative_area",
95: "key": "rhineland_palatinate",
96: "name": {
97: "en": "Rhineland-Palatinate",
98: "fa": "راینلاند-فالتس",
99: "de": "Rheinland-Pfalz"
100: }
101: },
102: {
103: "countryCode": "DE",
104: "field": "administrative_area",
105: "key": "saarland",
106: "name": {
107: "en": "Saarland",
108: "fa": "زارلاند",
109: "de": "Saarland"
110: }
111: },
112: {
113: "countryCode": "DE",
114: "field": "administrative_area",
115: "key": "saxony",
116: "name": {
117: "en": "Saxony",
118: "fa": "زاکسن",
119: "de": "Sachsen"
120: }
121: },
122: {
123: "countryCode": "DE",
124: "field": "administrative_area",
125: "key": "saxony_anhalt",
126: "name": {
127: "en": "Saxony-Anhalt",
128: "fa": "زاکسن-آنهالت",
129: "de": "Sachsen-Anhalt"
130: }
131: },
132: {
133: "countryCode": "DE",
134: "field": "administrative_area",
135: "key": "schleswig_holstein",
136: "name": {
137: "en": "Schleswig-Holstein",
138: "fa": "اشلسویگ-هولشتاین",
139: "de": "Schleswig-Holstein"
140: }
141: },
142: {
143: "countryCode": "DE",
144: "field": "administrative_area",
145: "key": "thuringia",
146: "name": {
147: "en": "Thuringia",
148: "fa": "تورینگن",
149: "de": "Thüringen"
150: }
151: },
152: {
153: "countryCode": "DE",
154: "field": "administrative_area",
155: "key": "bavaria",
156: "name": { "en": "Bavaria", "fa": "باواریا", "de": "Bayern" }
157: }
158: ]
</file>
<file path="database/seeders/data/address-predefined.ir.seed.json">
1: [
2: {
3: "countryCode": "IR",
4: "field": "administrative_area",
5: "key": "alborz",
6: "name": {
7: "en": "Alborz",
8: "fa": "البرز",
9: "de": "Alborz"
10: },
11: "children": [
12: {
13: "field": "locality",
14: "key": "chaharbagh",
15: "name": {
16: "en": "Chaharbagh",
17: "fa": "چهارباغ",
18: "de": "Chaharbagh"
19: }
20: },
21: {
22: "field": "locality",
23: "key": "eshtehard",
24: "name": {
25: "en": "Eshtehard",
26: "fa": "اشتهارد",
27: "de": "Eshtehard"
28: }
29: },
30: {
31: "field": "locality",
32: "key": "fardis",
33: "name": {
34: "en": "Fardis",
35: "fa": "فردیس",
36: "de": "Fardis"
37: }
38: },
39: {
40: "field": "locality",
41: "key": "karaj",
42: "name": {
43: "en": "Karaj",
44: "fa": "کرج",
45: "de": "Karaj"
46: }
47: },
48: {
49: "field": "locality",
50: "key": "nazarabad",
51: "name": {
52: "en": "Nazarabad",
53: "fa": "نظرآباد",
54: "de": "Nazarabad"
55: }
56: },
57: {
58: "field": "locality",
59: "key": "savojbolagh",
60: "name": {
61: "en": "Savojbolagh",
62: "fa": "ساوجبلاغ",
63: "de": "Savojbolagh"
64: }
65: },
66: {
67: "field": "locality",
68: "key": "taleqan",
69: "name": {
70: "en": "Taleqan",
71: "fa": "طالقان",
72: "de": "Taleqan"
73: }
74: }
75: ]
76: },
77: {
78: "countryCode": "IR",
79: "field": "administrative_area",
80: "key": "ardabil",
81: "name": {
82: "en": "Ardabil",
83: "fa": "اردبیل",
84: "de": "Ardabil"
85: },
86: "children": [
87: {
88: "field": "locality",
89: "key": "ardabil",
90: "name": {
91: "en": "Ardabil",
92: "fa": "اردبیل",
93: "de": "Ardabil"
94: }
95: },
96: {
97: "field": "locality",
98: "key": "aslanduz",
99: "name": {
100: "en": "Aslan Duz",
101: "fa": "اصلاندوز",
102: "de": "Aslan Duz"
103: }
104: },
105: {
106: "field": "locality",
107: "key": "bilehsavar",
108: "name": {
109: "en": "Bileh Savar",
110: "fa": "بیله‌سوار",
111: "de": "Bileh Savar"
112: }
113: },
114: {
115: "field": "locality",
116: "key": "germi",
117: "name": {
118: "en": "Germi",
119: "fa": "گرمی",
120: "de": "Germi"
121: }
122: },
123: {
124: "field": "locality",
125: "key": "khalkhal",
126: "name": {
127: "en": "Khalkhal",
128: "fa": "خلخال",
129: "de": "Khalkhal"
130: }
131: },
132: {
133: "field": "locality",
134: "key": "kowsar",
135: "name": {
136: "en": "Kowsar",
137: "fa": "کوثر",
138: "de": "Kowsar"
139: }
140: },
141: {
142: "field": "locality",
143: "key": "meshginshahr",
144: "name": {
145: "en": "Meshgin Shahr",
146: "fa": "مشگین‌شهر",
147: "de": "Meshgin Shahr"
148: }
149: },
150: {
151: "field": "locality",
152: "key": "namin",
153: "name": {
154: "en": "Namin",
155: "fa": "نمین",
156: "de": "Namin"
157: }
158: },
159: {
160: "field": "locality",
161: "key": "nir",
162: "name": {
163: "en": "Nir",
164: "fa": "نیر",
165: "de": "Nir"
166: }
167: },
168: {
169: "field": "locality",
170: "key": "parsabad",
171: "name": {
172: "en": "Parsabad",
173: "fa": "پارس‌آباد",
174: "de": "Parsabad"
175: }
176: },
177: {
178: "field": "locality",
179: "key": "sareyn",
180: "name": {
181: "en": "Sareyn",
182: "fa": "سرعین",
183: "de": "Sareyn"
184: }
185: },
186: {
187: "field": "locality",
188: "key": "ungut",
189: "name": {
190: "en": "Ungut",
191: "fa": "انگوت",
192: "de": "Ungut"
193: }
194: }
195: ]
196: },
197: {
198: "countryCode": "IR",
199: "field": "administrative_area",
200: "key": "bushehr",
201: "name": {
202: "en": "Bushehr",
203: "fa": "بوشهر",
204: "de": "Buschehr"
205: },
206: "children": [
207: {
208: "field": "locality",
209: "key": "asaluyeh",
210: "name": {
211: "en": "Asaluyeh",
212: "fa": "عسلویه",
213: "de": "Asaluyeh"
214: }
215: },
216: {
217: "field": "locality",
218: "key": "bushehr",
219: "name": {
220: "en": "Bushehr",
221: "fa": "بوشهر",
222: "de": "Buschehr"
223: }
224: },
225: {
226: "field": "locality",
227: "key": "dashtestan",
228: "name": {
229: "en": "Dashtestan",
230: "fa": "دشتستان",
231: "de": "Dashtestan"
232: }
233: },
234: {
235: "field": "locality",
236: "key": "dashti",
237: "name": {
238: "en": "Dashti",
239: "fa": "دشتی",
240: "de": "Dashti"
241: }
242: },
243: {
244: "field": "locality",
245: "key": "deylam",
246: "name": {
247: "en": "Deylam",
248: "fa": "دیلم",
249: "de": "Deylam"
250: }
251: },
252: {
253: "field": "locality",
254: "key": "deyr",
255: "name": {
256: "en": "Deyr",
257: "fa": "دیر",
258: "de": "Deyr"
259: }
260: },
261: {
262: "field": "locality",
263: "key": "ganaveh",
264: "name": {
265: "en": "Ganaveh",
266: "fa": "گناوه",
267: "de": "Ganaveh"
268: }
269: },
270: {
271: "field": "locality",
272: "key": "jam",
273: "name": {
274: "en": "Jam",
275: "fa": "جم",
276: "de": "Jam"
277: }
278: },
279: {
280: "field": "locality",
281: "key": "kangan",
282: "name": {
283: "en": "Kangan",
284: "fa": "کنگان",
285: "de": "Kangan"
286: }
287: },
288: {
289: "field": "locality",
290: "key": "tangestan",
291: "name": {
292: "en": "Tangestan",
293: "fa": "تنگستان",
294: "de": "Tangestan"
295: }
296: }
297: ]
298: },
299: {
300: "countryCode": "IR",
301: "field": "administrative_area",
302: "key": "chaharmahalandbakhtiari",
303: "name": {
304: "en": "Chaharmahal and Bakhtiari",
305: "fa": "چهارمحال و بختیاری",
306: "de": "Tschahar Mahal und Bachtiari"
307: },
308: "children": [
309: {
310: "field": "locality",
311: "key": "ardal",
312: "name": {
313: "en": "Ardal",
314: "fa": "اردل",
315: "de": "Ardal"
316: }
317: },
318: {
319: "field": "locality",
320: "key": "ben",
321: "name": {
322: "en": "Ben",
323: "fa": "بن",
324: "de": "Ben"
325: }
326: },
327: {
328: "field": "locality",
329: "key": "borujen",
330: "name": {
331: "en": "Borujen",
332: "fa": "بروجن",
333: "de": "Borujen"
334: }
335: },
336: {
337: "field": "locality",
338: "key": "falard",
339: "name": {
340: "en": "Falard",
341: "fa": "فلارد",
342: "de": "Falard"
343: }
344: },
345: {
346: "field": "locality",
347: "key": "farrokhshahr",
348: "name": {
349: "en": "Farrokhshahr",
350: "fa": "فرخ‌شهر",
351: "de": "Farrokhshahr"
352: }
353: },
354: {
355: "field": "locality",
356: "key": "farsan",
357: "name": {
358: "en": "Farsan",
359: "fa": "فارسان",
360: "de": "Farsan"
361: }
362: },
363: {
364: "field": "locality",
365: "key": "khanmirza",
366: "name": {
367: "en": "Khanmirza",
368: "fa": "خانمیرزا",
369: "de": "Khanmirza"
370: }
371: },
372: {
373: "field": "locality",
374: "key": "kiar",
375: "name": {
376: "en": "Kiar",
377: "fa": "کیار",
378: "de": "Kiar"
379: }
380: },
381: {
382: "field": "locality",
383: "key": "kuhrang",
384: "name": {
385: "en": "Kuhrang",
386: "fa": "کوهرنگ",
387: "de": "Kuhrang"
388: }
389: },
390: {
391: "field": "locality",
392: "key": "lordegan",
393: "name": {
394: "en": "Lordegan",
395: "fa": "لردگان",
396: "de": "Lordegan"
397: }
398: },
399: {
400: "field": "locality",
401: "key": "saman",
402: "name": {
403: "en": "Saman",
404: "fa": "سامان",
405: "de": "Saman"
406: }
407: },
408: {
409: "field": "locality",
410: "key": "shahrekord",
411: "name": {
412: "en": "Shahrekord",
413: "fa": "شهرکرد",
414: "de": "Shahrekord"
415: }
416: }
417: ]
418: },
419: {
420: "countryCode": "IR",
421: "field": "administrative_area",
422: "key": "eastazerbaijan",
423: "name": {
424: "en": "East Azerbaijan",
425: "fa": "آذربایجان شرقی",
426: "de": "Ost-Aserbaidschan"
427: },
428: "children": [
429: {
430: "field": "locality",
431: "key": "ahar",
432: "name": {
433: "en": "Ahar",
434: "fa": "اهر",
435: "de": "Ahar"
436: }
437: },
438: {
439: "field": "locality",
440: "key": "ajabshir",
441: "name": {
442: "en": "Ajab Shir",
443: "fa": "عجب‌شیر",
444: "de": "Ajab Shir"
445: }
446: },
447: {
448: "field": "locality",
449: "key": "azarshahr",
450: "name": {
451: "en": "Azarshahr",
452: "fa": "آذرشهر",
453: "de": "Azarshahr"
454: }
455: },
456: {
457: "field": "locality",
458: "key": "bonab",
459: "name": {
460: "en": "Bonab",
461: "fa": "بناب",
462: "de": "Bonab"
463: }
464: },
465: {
466: "field": "locality",
467: "key": "bostanabad",
468: "name": {
469: "en": "Bostanabad",
470: "fa": "بستان‌آباد",
471: "de": "Bostanabad"
472: }
473: },
474: {
475: "field": "locality",
476: "key": "charuymaq",
477: "name": {
478: "en": "Charuymaq",
479: "fa": "چاروایماق",
480: "de": "Charuymaq"
481: }
482: },
483: {
484: "field": "locality",
485: "key": "hashtrud",
486: "name": {
487: "en": "Hashtrud",
488: "fa": "هشترود",
489: "de": "Hashtrud"
490: }
491: },
492: {
493: "field": "locality",
494: "key": "heris",
495: "name": {
496: "en": "Heris",
497: "fa": "هریس",
498: "de": "Heris"
499: }
500: },
501: {
502: "field": "locality",
503: "key": "hurand",
504: "name": {
505: "en": "Hurand",
506: "fa": "هوراند",
507: "de": "Hurand"
508: }
509: },
510: {
511: "field": "locality",
512: "key": "jolfa",
513: "name": {
514: "en": "Jolfa",
515: "fa": "جلفا",
516: "de": "Jolfa"
517: }
518: },
519: {
520: "field": "locality",
521: "key": "kaleybar",
522: "name": {
523: "en": "Kaleybar",
524: "fa": "کلیبر",
525: "de": "Kaleybar"
526: }
527: },
528: {
529: "field": "locality",
530: "key": "khodaafarin",
531: "name": {
532: "en": "Khoda Afarin",
533: "fa": "خداآفرین",
534: "de": "Khoda Afarin"
535: }
536: },
537: {
538: "field": "locality",
539: "key": "malekan",
540: "name": {
541: "en": "Malekan",
542: "fa": "ملکان",
543: "de": "Malekan"
544: }
545: },
546: {
547: "field": "locality",
548: "key": "maragheh",
549: "name": {
550: "en": "Maragheh",
551: "fa": "مراغه",
552: "de": "Maragheh"
553: }
554: },
555: {
556: "field": "locality",
557: "key": "marand",
558: "name": {
559: "en": "Marand",
560: "fa": "مرند",
561: "de": "Marand"
562: }
563: },
564: {
565: "field": "locality",
566: "key": "mianeh",
567: "name": {
568: "en": "Mianeh",
569: "fa": "میانه",
570: "de": "Mianeh"
571: }
572: },
573: {
574: "field": "locality",
575: "key": "osku",
576: "name": {
577: "en": "Osku",
578: "fa": "اسکو",
579: "de": "Osku"
580: }
581: },
582: {
583: "field": "locality",
584: "key": "sarab",
585: "name": {
586: "en": "Sarab",
587: "fa": "سراب",
588: "de": "Sarab"
589: }
590: },
591: {
592: "field": "locality",
593: "key": "shabestar",
594: "name": {
595: "en": "Shabestar",
596: "fa": "شبستر",
597: "de": "Shabestar"
598: }
599: },
600: {
601: "field": "locality",
602: "key": "tabriz",
603: "name": {
604: "en": "Tabriz",
605: "fa": "تبریز",
606: "de": "Täbris"
607: }
608: },
609: {
610: "field": "locality",
611: "key": "varzaqan",
612: "name": {
613: "en": "Varzaqan",
614: "fa": "ورزقان",
615: "de": "Varzaqan"
616: }
617: }
618: ]
619: },
620: {
621: "countryCode": "IR",
622: "field": "administrative_area",
623: "key": "fars",
624: "name": {
625: "en": "Fars",
626: "fa": "فارس",
627: "de": "Fars"
628: },
629: "children": [
630: {
631: "field": "locality",
632: "key": "abadeh",
633: "name": {
634: "en": "Abadeh",
635: "fa": "آباده",
636: "de": "Abadeh"
637: }
638: },
639: {
640: "field": "locality",
641: "key": "arsanjan",
642: "name": {
643: "en": "Arsanjan",
644: "fa": "ارسنجان",
645: "de": "Arsanjan"
646: }
647: },
648: {
649: "field": "locality",
650: "key": "bakhtegan",
651: "name": {
652: "en": "Bakhtegan",
653: "fa": "بختگان",
654: "de": "Bakhtegan"
655: }
656: },
657: {
658: "field": "locality",
659: "key": "bavanat",
660: "name": {
661: "en": "Bavanat",
662: "fa": "بوانات",
663: "de": "Bavanat"
664: }
665: },
666: {
667: "field": "locality",
668: "key": "beyza",
669: "name": {
670: "en": "Beyza",
671: "fa": "بیضا",
672: "de": "Beyza"
673: }
674: },
675: {
676: "field": "locality",
677: "key": "darab",
678: "name": {
679: "en": "Darab",
680: "fa": "داراب",
681: "de": "Darab"
682: }
683: },
684: {
685: "field": "locality",
686: "key": "eqlid",
687: "name": {
688: "en": "Eqlid",
689: "fa": "اقلید",
690: "de": "Eqlid"
691: }
692: },
693: {
694: "field": "locality",
695: "key": "estahban",
696: "name": {
697: "en": "Estahban",
698: "fa": "استهبان",
699: "de": "Estahban"
700: }
701: },
702: {
703: "field": "locality",
704: "key": "evaz",
705: "name": {
706: "en": "Evaz",
707: "fa": "اوز",
708: "de": "Evaz"
709: }
710: },
711: {
712: "field": "locality",
713: "key": "farashband",
714: "name": {
715: "en": "Farashband",
716: "fa": "فراشبند",
717: "de": "Farashband"
718: }
719: },
720: {
721: "field": "locality",
722: "key": "fasa",
723: "name": {
724: "en": "Fasa",
725: "fa": "فسا",
726: "de": "Fasa"
727: }
728: },
729: {
730: "field": "locality",
731: "key": "firuzabad",
732: "name": {
733: "en": "Firuzabad",
734: "fa": "فیروزآباد",
735: "de": "Firuzabad"
736: }
737: },
738: {
739: "field": "locality",
740: "key": "gerash",
741: "name": {
742: "en": "Gerash",
743: "fa": "گراش",
744: "de": "Gerash"
745: }
746: },
747: {
748: "field": "locality",
749: "key": "jahrom",
750: "name": {
751: "en": "Jahrom",
752: "fa": "جهرم",
753: "de": "Jahrom"
754: }
755: },
756: {
757: "field": "locality",
758: "key": "juyom",
759: "name": {
760: "en": "Juyom",
761: "fa": "جویم",
762: "de": "Juyom"
763: }
764: },
765: {
766: "field": "locality",
767: "key": "kavar",
768: "name": {
769: "en": "Kavar",
770: "fa": "کوار",
771: "de": "Kavar"
772: }
773: },
774: {
775: "field": "locality",
776: "key": "kazerun",
777: "name": {
778: "en": "Kazerun",
779: "fa": "کازرون",
780: "de": "Kazerun"
781: }
782: },
783: {
784: "field": "locality",
785: "key": "khafr",
786: "name": {
787: "en": "Khafr",
788: "fa": "خفر",
789: "de": "Khafr"
790: }
791: },
792: {
793: "field": "locality",
794: "key": "kharameh",
795: "name": {
796: "en": "Kharameh",
797: "fa": "خرامه",
798: "de": "Kharameh"
799: }
800: },
801: {
802: "field": "locality",
803: "key": "khonj",
804: "name": {
805: "en": "Khonj",
806: "fa": "خنج",
807: "de": "Khonj"
808: }
809: },
810: {
811: "field": "locality",
812: "key": "khorrambid",
813: "name": {
814: "en": "Khorrambid",
815: "fa": "خرم‌بید",
816: "de": "Khorrambid"
817: }
818: },
819: {
820: "field": "locality",
821: "key": "kuhchenar",
822: "name": {
823: "en": "Kuhchenar",
824: "fa": "کوه‌چنار",
825: "de": "Kuhchenar"
826: }
827: },
828: {
829: "field": "locality",
830: "key": "lamerd",
831: "name": {
832: "en": "Lamerd",
833: "fa": "لامرد",
834: "de": "Lamerd"
835: }
836: },
837: {
838: "field": "locality",
839: "key": "larestan",
840: "name": {
841: "en": "Larestan",
842: "fa": "لارستان",
843: "de": "Larestan"
844: }
845: },
846: {
847: "field": "locality",
848: "key": "mamasani",
849: "name": {
850: "en": "Mamasani",
851: "fa": "ممسنی",
852: "de": "Mamasani"
853: }
854: },
855: {
856: "field": "locality",
857: "key": "marvdasht",
858: "name": {
859: "en": "Marvdasht",
860: "fa": "مرودشت",
861: "de": "Marvdasht"
862: }
863: },
864: {
865: "field": "locality",
866: "key": "mohr",
867: "name": {
868: "en": "Mohr",
869: "fa": "مهر",
870: "de": "Mohr"
871: }
872: },
873: {
874: "field": "locality",
875: "key": "neyriz",
876: "name": {
877: "en": "Neyriz",
878: "fa": "نی‌ریز",
879: "de": "Neyriz"
880: }
881: },
882: {
883: "field": "locality",
884: "key": "pasargad",
885: "name": {
886: "en": "Pasargad",
887: "fa": "پاسارگاد",
888: "de": "Pasargad"
889: }
890: },
891: {
892: "field": "locality",
893: "key": "qirandkarzin",
894: "name": {
895: "en": "Qir and Karzin",
896: "fa": "قیر و کارزین",
897: "de": "Qir and Karzin"
898: }
899: },
900: {
901: "field": "locality",
902: "key": "rostam",
903: "name": {
904: "en": "Rostam",
905: "fa": "رستم",
906: "de": "Rostam"
907: }
908: },
909: {
910: "field": "locality",
911: "key": "sarchehan",
912: "name": {
913: "en": "Sarchehan",
914: "fa": "سرچهان",
915: "de": "Sarchehan"
916: }
917: },
918: {
919: "field": "locality",
920: "key": "sarvestan",
921: "name": {
922: "en": "Sarvestan",
923: "fa": "سروستان",
924: "de": "Sarvestan"
925: }
926: },
927: {
928: "field": "locality",
929: "key": "sepidan",
930: "name": {
931: "en": "Sepidan",
932: "fa": "سپیدان",
933: "de": "Sepidan"
934: }
935: },
936: {
937: "field": "locality",
938: "key": "shiraz",
939: "name": {
940: "en": "Shiraz",
941: "fa": "شیراز",
942: "de": "Schiras"
943: }
944: },
945: {
946: "field": "locality",
947: "key": "zarqan",
948: "name": {
949: "en": "Zarqan",
950: "fa": "زرقان",
951: "de": "Zarqan"
952: }
953: },
954: {
955: "field": "locality",
956: "key": "zarrindasht",
957: "name": {
958: "en": "Zarrin Dasht",
959: "fa": "زرین‌دشت",
960: "de": "Zarrin Dasht"
961: }
962: }
963: ]
964: },
965: {
966: "countryCode": "IR",
967: "field": "administrative_area",
968: "key": "gilan",
969: "name": {
970: "en": "Gilan",
971: "fa": "گیلان",
972: "de": "Gilan"
973: },
974: "children": [
975: {
976: "field": "locality",
977: "key": "amlash",
978: "name": {
979: "en": "Amlash",
980: "fa": "املش",
981: "de": "Amlash"
982: }
983: },
984: {
985: "field": "locality",
986: "key": "astanehyeashrafiyeh",
987: "name": {
988: "en": "Astaneh-ye Ashrafiyeh",
989: "fa": "آستانه‌اشرفیه",
990: "de": "Astaneh-ye Ashrafiyeh"
991: }
992: },
993: {
994: "field": "locality",
995: "key": "astara",
996: "name": {
997: "en": "Astara",
998: "fa": "آستارا",
999: "de": "Astara"
1000: }
1001: },
1002: {
1003: "field": "locality",
1004: "key": "bandareanzali",
1005: "name": {
1006: "en": "Bandar-e Anzali",
1007: "fa": "بندر انزلی",
1008: "de": "Bandar-e Anzali"
1009: }
1010: },
1011: {
1012: "field": "locality",
1013: "key": "fuman",
1014: "name": {
1015: "en": "Fuman",
1016: "fa": "فومن",
1017: "de": "Fuman"
1018: }
1019: },
1020: {
1021: "field": "locality",
1022: "key": "khomam",
1023: "name": {
1024: "en": "Khomam",
1025: "fa": "خمام",
1026: "de": "Khomam"
1027: }
1028: },
1029: {
1030: "field": "locality",
1031: "key": "lahijan",
1032: "name": {
1033: "en": "Lahijan",
1034: "fa": "لاهیجان",
1035: "de": "Lahijan"
1036: }
1037: },
1038: {
1039: "field": "locality",
1040: "key": "langarud",
1041: "name": {
1042: "en": "Langarud",
1043: "fa": "لنگرود",
1044: "de": "Langarud"
1045: }
1046: },
1047: {
1048: "field": "locality",
1049: "key": "masal",
1050: "name": {
1051: "en": "Masal",
1052: "fa": "ماسال",
1053: "de": "Masal"
1054: }
1055: },
1056: {
1057: "field": "locality",
1058: "key": "rasht",
1059: "name": {
1060: "en": "Rasht",
1061: "fa": "رشت",
1062: "de": "Rasht"
1063: }
1064: },
1065: {
1066: "field": "locality",
1067: "key": "rezvanshahr",
1068: "name": {
1069: "en": "Rezvanshahr",
1070: "fa": "رضوانشهر",
1071: "de": "Rezvanshahr"
1072: }
1073: },
1074: {
1075: "field": "locality",
1076: "key": "rudbar",
1077: "name": {
1078: "en": "Rudbar",
1079: "fa": "رودبار",
1080: "de": "Rudbar"
1081: }
1082: },
1083: {
1084: "field": "locality",
1085: "key": "rudsar",
1086: "name": {
1087: "en": "Rudsar",
1088: "fa": "رودسر",
1089: "de": "Rudsar"
1090: }
1091: },
1092: {
1093: "field": "locality",
1094: "key": "shaft",
1095: "name": {
1096: "en": "Shaft",
1097: "fa": "شفت",
1098: "de": "Shaft"
1099: }
1100: },
1101: {
1102: "field": "locality",
1103: "key": "siahkal",
1104: "name": {
1105: "en": "Siahkal",
1106: "fa": "سیاهکل",
1107: "de": "Siahkal"
1108: }
1109: },
1110: {
1111: "field": "locality",
1112: "key": "sowmeehsara",
1113: "name": {
1114: "en": "Sowme'eh Sara",
1115: "fa": "صومعه‌سرا",
1116: "de": "Sowme'eh Sara"
1117: }
1118: },
1119: {
1120: "field": "locality",
1121: "key": "talesh",
1122: "name": {
1123: "en": "Talesh",
1124: "fa": "تالش",
1125: "de": "Talesh"
1126: }
1127: }
1128: ]
1129: },
1130: {
1131: "countryCode": "IR",
1132: "field": "administrative_area",
1133: "key": "golestan",
1134: "name": {
1135: "en": "Golestan",
1136: "fa": "گلستان",
1137: "de": "Golestan"
1138: },
1139: "children": [
1140: {
1141: "field": "locality",
1142: "key": "aliabad",
1143: "name": {
1144: "en": "Aliabad",
1145: "fa": "علی‌آباد کتول",
1146: "de": "Aliabad"
1147: }
1148: },
1149: {
1150: "field": "locality",
1151: "key": "aqqala",
1152: "name": {
1153: "en": "Aqqala",
1154: "fa": "آق‌قلا",
1155: "de": "Aqqala"
1156: }
1157: },
1158: {
1159: "field": "locality",
1160: "key": "azadshahr",
1161: "name": {
1162: "en": "Azadshahr",
1163: "fa": "آزادشهر",
1164: "de": "Azadshahr"
1165: }
1166: },
1167: {
1168: "field": "locality",
1169: "key": "bandaregaz",
1170: "name": {
1171: "en": "Bandar-e Gaz",
1172: "fa": "بندر گز",
1173: "de": "Bandar-e Gaz"
1174: }
1175: },
1176: {
1177: "field": "locality",
1178: "key": "galikash",
1179: "name": {
1180: "en": "Galikash",
1181: "fa": "گالیکش",
1182: "de": "Galikash"
1183: }
1184: },
1185: {
1186: "field": "locality",
1187: "key": "gomishan",
1188: "name": {
1189: "en": "Gomishan",
1190: "fa": "گمیشان",
1191: "de": "Gomishan"
1192: }
1193: },
1194: {
1195: "field": "locality",
1196: "key": "gonbadekavus",
1197: "name": {
1198: "en": "Gonbad-e Kavus",
1199: "fa": "گنبد کاووس",
1200: "de": "Gonbad-e Kavus"
1201: }
1202: },
1203: {
1204: "field": "locality",
1205: "key": "gorgan",
1206: "name": {
1207: "en": "Gorgan",
1208: "fa": "گرگان",
1209: "de": "Gorgan"
1210: }
1211: },
1212: {
1213: "field": "locality",
1214: "key": "kalaleh",
1215: "name": {
1216: "en": "Kalaleh",
1217: "fa": "کلاله",
1218: "de": "Kalaleh"
1219: }
1220: },
1221: {
1222: "field": "locality",
1223: "key": "kordkuy",
1224: "name": {
1225: "en": "Kordkuy",
1226: "fa": "کردکوی",
1227: "de": "Kordkuy"
1228: }
1229: },
1230: {
1231: "field": "locality",
1232: "key": "maravehtappeh",
1233: "name": {
1234: "en": "Maraveh Tappeh",
1235: "fa": "مراوه‌تپه",
1236: "de": "Maraveh Tappeh"
1237: }
1238: },
1239: {
1240: "field": "locality",
1241: "key": "minudasht",
1242: "name": {
1243: "en": "Minudasht",
1244: "fa": "مینودشت",
1245: "de": "Minudasht"
1246: }
1247: },
1248: {
1249: "field": "locality",
1250: "key": "ramian",
1251: "name": {
1252: "en": "Ramian",
1253: "fa": "رامیان",
1254: "de": "Ramian"
1255: }
1256: },
1257: {
1258: "field": "locality",
1259: "key": "torkaman",
1260: "name": {
1261: "en": "Torkaman",
1262: "fa": "ترکمن",
1263: "de": "Torkaman"
1264: }
1265: }
1266: ]
1267: },
1268: {
1269: "countryCode": "IR",
1270: "field": "administrative_area",
1271: "key": "hamadan",
1272: "name": {
1273: "en": "Hamadan",
1274: "fa": "همدان",
1275: "de": "Hamadan"
1276: },
1277: "children": [
1278: {
1279: "field": "locality",
1280: "key": "asadabad",
1281: "name": {
1282: "en": "Asadabad",
1283: "fa": "اسدآباد",
1284: "de": "Asadabad"
1285: }
1286: },
1287: {
1288: "field": "locality",
1289: "key": "bahar",
1290: "name": {
1291: "en": "Bahar",
1292: "fa": "بهار",
1293: "de": "Bahar"
1294: }
1295: },
1296: {
1297: "field": "locality",
1298: "key": "dargazin",
1299: "name": {
1300: "en": "Dargazin",
1301: "fa": "درگزین",
1302: "de": "Dargazin"
1303: }
1304: },
1305: {
1306: "field": "locality",
1307: "key": "famenin",
1308: "name": {
1309: "en": "Famenin",
1310: "fa": "فامنین",
1311: "de": "Famenin"
1312: }
1313: },
1314: {
1315: "field": "locality",
1316: "key": "hamadan",
1317: "name": {
1318: "en": "Hamadan",
1319: "fa": "همدان",
1320: "de": "Hamadan"
1321: }
1322: },
1323: {
1324: "field": "locality",
1325: "key": "kabudarahang",
1326: "name": {
1327: "en": "Kabudarahang",
1328: "fa": "کبودراهنگ",
1329: "de": "Kabudarahang"
1330: }
1331: },
1332: {
1333: "field": "locality",
1334: "key": "malayer",
1335: "name": {
1336: "en": "Malayer",
1337: "fa": "ملایر",
1338: "de": "Malayer"
1339: }
1340: },
1341: {
1342: "field": "locality",
1343: "key": "nahavand",
1344: "name": {
1345: "en": "Nahavand",
1346: "fa": "نهاوند",
1347: "de": "Nahavand"
1348: }
1349: },
1350: {
1351: "field": "locality",
1352: "key": "razan",
1353: "name": {
1354: "en": "Razan",
1355: "fa": "رزن",
1356: "de": "Razan"
1357: }
1358: },
1359: {
1360: "field": "locality",
1361: "key": "tuyserkan",
1362: "name": {
1363: "en": "Tuyserkan",
1364: "fa": "تویسرکان",
1365: "de": "Tuyserkan"
1366: }
1367: }
1368: ]
1369: },
1370: {
1371: "countryCode": "IR",
1372: "field": "administrative_area",
1373: "key": "hormozgan",
1374: "name": {
1375: "en": "Hormozgan",
1376: "fa": "هرمزگان",
1377: "de": "Hormozgan"
1378: },
1379: "children": [
1380: {
1381: "field": "locality",
1382: "key": "abumusa",
1383: "name": {
1384: "en": "Abumusa",
1385: "fa": "ابوموسی",
1386: "de": "Abumusa"
1387: }
1388: },
1389: {
1390: "field": "locality",
1391: "key": "bandarabbas",
1392: "name": {
1393: "en": "Bandar Abbas",
1394: "fa": "بندرعباس",
1395: "de": "Bandar Abbas"
1396: }
1397: },
1398: {
1399: "field": "locality",
1400: "key": "bandarlengeh",
1401: "name": {
1402: "en": "Bandar Lengeh",
1403: "fa": "بندر لنگه",
1404: "de": "Bandar Lengeh"
1405: }
1406: },
1407: {
1408: "field": "locality",
1409: "key": "bashagard",
1410: "name": {
1411: "en": "Bashagard",
1412: "fa": "بشاگرد",
1413: "de": "Bashagard"
1414: }
1415: },
1416: {
1417: "field": "locality",
1418: "key": "bastak",
1419: "name": {
1420: "en": "Bastak",
1421: "fa": "بستک",
1422: "de": "Bastak"
1423: }
1424: },
1425: {
1426: "field": "locality",
1427: "key": "hajjiabad",
1428: "name": {
1429: "en": "Hajjiabad",
1430: "fa": "حاجی‌آباد",
1431: "de": "Hajjiabad"
1432: }
1433: },
1434: {
1435: "field": "locality",
1436: "key": "jask",
1437: "name": {
1438: "en": "Jask",
1439: "fa": "جاسک",
1440: "de": "Jask"
1441: }
1442: },
1443: {
1444: "field": "locality",
1445: "key": "khamir",
1446: "name": {
1447: "en": "Khamir",
1448: "fa": "بندر خمیر",
1449: "de": "Khamir"
1450: }
1451: },
1452: {
1453: "field": "locality",
1454: "key": "minab",
1455: "name": {
1456: "en": "Minab",
1457: "fa": "میناب",
1458: "de": "Minab"
1459: }
1460: },
1461: {
1462: "field": "locality",
1463: "key": "parsian",
1464: "name": {
1465: "en": "Parsian",
1466: "fa": "پارسیان",
1467: "de": "Parsian"
1468: }
1469: },
1470: {
1471: "field": "locality",
1472: "key": "qeshm",
1473: "name": {
1474: "en": "Qeshm",
1475: "fa": "قشم",
1476: "de": "Qeshm"
1477: }
1478: },
1479: {
1480: "field": "locality",
1481: "key": "rudan",
1482: "name": {
1483: "en": "Rudan",
1484: "fa": "رودان",
1485: "de": "Rudan"
1486: }
1487: },
1488: {
1489: "field": "locality",
1490: "key": "sirik",
1491: "name": {
1492: "en": "Sirik",
1493: "fa": "سیریک",
1494: "de": "Sirik"
1495: }
1496: }
1497: ]
1498: },
1499: {
1500: "countryCode": "IR",
1501: "field": "administrative_area",
1502: "key": "ilam",
1503: "name": {
1504: "en": "Ilam",
1505: "fa": "ایلام",
1506: "de": "Ilam"
1507: },
1508: "children": [
1509: {
1510: "field": "locality",
1511: "key": "abdanan",
1512: "name": {
1513: "en": "Abdanan",
1514: "fa": "آبدانان",
1515: "de": "Abdanan"
1516: }
1517: },
1518: {
1519: "field": "locality",
1520: "key": "badreh",
1521: "name": {
1522: "en": "Badreh",
1523: "fa": "بدره",
1524: "de": "Badreh"
1525: }
1526: },
1527: {
1528: "field": "locality",
1529: "key": "chardavol",
1530: "name": {
1531: "en": "Chardavol",
1532: "fa": "چرداول",
1533: "de": "Chardavol"
1534: }
1535: },
1536: {
1537: "field": "locality",
1538: "key": "chavar",
1539: "name": {
1540: "en": "Chavar",
1541: "fa": "چوار",
1542: "de": "Chavar"
1543: }
1544: },
1545: {
1546: "field": "locality",
1547: "key": "darrehshahr",
1548: "name": {
1549: "en": "Darreh Shahr",
1550: "fa": "دره‌شهر",
1551: "de": "Darreh Shahr"
1552: }
1553: },
1554: {
1555: "field": "locality",
1556: "key": "dehloran",
1557: "name": {
1558: "en": "Dehloran",
1559: "fa": "دهلران",
1560: "de": "Dehloran"
1561: }
1562: },
1563: {
1564: "field": "locality",
1565: "key": "eyvan",
1566: "name": {
1567: "en": "Eyvan",
1568: "fa": "ایوان",
1569: "de": "Eyvan"
1570: }
1571: },
1572: {
1573: "field": "locality",
1574: "key": "holeylan",
1575: "name": {
1576: "en": "Holeylan",
1577: "fa": "هلیلان",
1578: "de": "Holeylan"
1579: }
1580: },
1581: {
1582: "field": "locality",
1583: "key": "ilam",
1584: "name": {
1585: "en": "Ilam",
1586: "fa": "ایلام",
1587: "de": "Ilam"
1588: }
1589: },
1590: {
1591: "field": "locality",
1592: "key": "malekshahi",
1593: "name": {
1594: "en": "Malekshahi",
1595: "fa": "ملکشاهی",
1596: "de": "Malekshahi"
1597: }
1598: },
1599: {
1600: "field": "locality",
1601: "key": "mehran",
1602: "name": {
1603: "en": "Mehran",
1604: "fa": "مهران",
1605: "de": "Mehran"
1606: }
1607: },
1608: {
1609: "field": "locality",
1610: "key": "sirvan",
1611: "name": {
1612: "en": "Sirvan",
1613: "fa": "سیروان",
1614: "de": "Sirvan"
1615: }
1616: }
1617: ]
1618: },
1619: {
1620: "countryCode": "IR",
1621: "field": "administrative_area",
1622: "key": "isfahan",
1623: "name": {
1624: "en": "Isfahan",
1625: "fa": "اصفهان",
1626: "de": "Isfahan"
1627: },
1628: "children": [
1629: {
1630: "field": "locality",
1631: "key": "aranvabidgol",
1632: "name": {
1633: "en": "Aran va Bidgol",
1634: "fa": "آران و بیدگل",
1635: "de": "Aran va Bidgol"
1636: }
1637: },
1638: {
1639: "field": "locality",
1640: "key": "ardestan",
1641: "name": {
1642: "en": "Ardestan",
1643: "fa": "اردستان",
1644: "de": "Ardestan"
1645: }
1646: },
1647: {
1648: "field": "locality",
1649: "key": "borkhar",
1650: "name": {
1651: "en": "Borkhar",
1652: "fa": "برخوار",
1653: "de": "Borkhar"
1654: }
1655: },
1656: {
1657: "field": "locality",
1658: "key": "buinmiandasht",
1659: "name": {
1660: "en": "Buin Miandasht",
1661: "fa": "بویین‌میاندشت",
1662: "de": "Buin Miandasht"
1663: }
1664: },
1665: {
1666: "field": "locality",
1667: "key": "chadegan",
1668: "name": {
1669: "en": "Chadegan",
1670: "fa": "چادگان",
1671: "de": "Chadegan"
1672: }
1673: },
1674: {
1675: "field": "locality",
1676: "key": "dehaqan",
1677: "name": {
1678: "en": "Dehaqan",
1679: "fa": "دهاقان",
1680: "de": "Dehaqan"
1681: }
1682: },
1683: {
1684: "field": "locality",
1685: "key": "falavarjan",
1686: "name": {
1687: "en": "Falavarjan",
1688: "fa": "فلاورجان",
1689: "de": "Falavarjan"
1690: }
1691: },
1692: {
1693: "field": "locality",
1694: "key": "faridan",
1695: "name": {
1696: "en": "Faridan",
1697: "fa": "فریدن",
1698: "de": "Faridan"
1699: }
1700: },
1701: {
1702: "field": "locality",
1703: "key": "fereydunshahr",
1704: "name": {
1705: "en": "Fereydunshahr",
1706: "fa": "فریدون‌شهر",
1707: "de": "Fereydunshahr"
1708: }
1709: },
1710: {
1711: "field": "locality",
1712: "key": "golpayegan",
1713: "name": {
1714: "en": "Golpayegan",
1715: "fa": "گلپایگان",
1716: "de": "Golpayegan"
1717: }
1718: },
1719: {
1720: "field": "locality",
1721: "key": "harand",
1722: "name": {
1723: "en": "Harand",
1724: "fa": "هرند",
1725: "de": "Harand"
1726: }
1727: },
1728: {
1729: "field": "locality",
1730: "key": "isfahan",
1731: "name": {
1732: "en": "Isfahan",
1733: "fa": "اصفهان",
1734: "de": "Isfahan"
1735: }
1736: },
1737: {
1738: "field": "locality",
1739: "key": "jarqavieh",
1740: "name": {
1741: "en": "Jarqavieh",
1742: "fa": "جرقویه",
1743: "de": "Jarqavieh"
1744: }
1745: },
1746: {
1747: "field": "locality",
1748: "key": "kashan",
1749: "name": {
1750: "en": "Kashan",
1751: "fa": "کاشان",
1752: "de": "Kashan"
1753: }
1754: },
1755: {
1756: "field": "locality",
1757: "key": "khansar",
1758: "name": {
1759: "en": "Khansar",
1760: "fa": "خوانسار",
1761: "de": "Khansar"
1762: }
1763: },
1764: {
1765: "field": "locality",
1766: "key": "khomeynishahr",
1767: "name": {
1768: "en": "Khomeyni Shahr",
1769: "fa": "خمینی‌شهر",
1770: "de": "Khomeyni Shahr"
1771: }
1772: },
1773: {
1774: "field": "locality",
1775: "key": "khurandbiabanak",
1776: "name": {
1777: "en": "Khur and Biabanak",
1778: "fa": "خور و بیابانک",
1779: "de": "Khur and Biabanak"
1780: }
1781: },
1782: {
1783: "field": "locality",
1784: "key": "kuhpayeh",
1785: "name": {
1786: "en": "Kuhpayeh",
1787: "fa": "کوهپایه",
1788: "de": "Kuhpayeh"
1789: }
1790: },
1791: {
1792: "field": "locality",
1793: "key": "lenjan",
1794: "name": {
1795: "en": "Lenjan",
1796: "fa": "لنجان",
1797: "de": "Lenjan"
1798: }
1799: },
1800: {
1801: "field": "locality",
1802: "key": "mobarakeh",
1803: "name": {
1804: "en": "Mobarakeh",
1805: "fa": "مبارکه",
1806: "de": "Mobarakeh"
1807: }
1808: },
1809: {
1810: "field": "locality",
1811: "key": "nain",
1812: "name": {
1813: "en": "Nain",
1814: "fa": "نایین",
1815: "de": "Nain"
1816: }
1817: },
1818: {
1819: "field": "locality",
1820: "key": "najafabad",
1821: "name": {
1822: "en": "Najafabad",
1823: "fa": "نجف‌آباد",
1824: "de": "Najafabad"
1825: }
1826: },
1827: {
1828: "field": "locality",
1829: "key": "natanz",
1830: "name": {
1831: "en": "Natanz",
1832: "fa": "نطنز",
1833: "de": "Natanz"
1834: }
1835: },
1836: {
1837: "field": "locality",
1838: "key": "semirom",
1839: "name": {
1840: "en": "Semirom",
1841: "fa": "سمیرم",
1842: "de": "Semirom"
1843: }
1844: },
1845: {
1846: "field": "locality",
1847: "key": "shahinshahrandmeymeh",
1848: "name": {
1849: "en": "Shahin Shahr and Meymeh",
1850: "fa": "شاهین‌شهر و میمه",
1851: "de": "Shahin Shahr and Meymeh"
1852: }
1853: },
1854: {
1855: "field": "locality",
1856: "key": "shahreza",
1857: "name": {
1858: "en": "Shahreza",
1859: "fa": "شهرضا",
1860: "de": "Shahreza"
1861: }
1862: },
1863: {
1864: "field": "locality",
1865: "key": "tiranandkarvan",
1866: "name": {
1867: "en": "Tiran and Karvan",
1868: "fa": "تیران و کرون",
1869: "de": "Tiran and Karvan"
1870: }
1871: },
1872: {
1873: "field": "locality",
1874: "key": "varzaneh",
1875: "name": {
1876: "en": "Varzaneh",
1877: "fa": "ورزنه",
1878: "de": "Varzaneh"
1879: }
1880: }
1881: ]
1882: },
1883: {
1884: "countryCode": "IR",
1885: "field": "administrative_area",
1886: "key": "kerman",
1887: "name": {
1888: "en": "Kerman",
1889: "fa": "کرمان",
1890: "de": "Kerman"
1891: },
1892: "children": [
1893: {
1894: "field": "locality",
1895: "key": "anar",
1896: "name": {
1897: "en": "Anar",
1898: "fa": "انار",
1899: "de": "Anar"
1900: }
1901: },
1902: {
1903: "field": "locality",
1904: "key": "anbarabad",
1905: "name": {
1906: "en": "Anbarabad",
1907: "fa": "عنبرآباد",
1908: "de": "Anbarabad"
1909: }
1910: },
1911: {
1912: "field": "locality",
1913: "key": "arzuiyeh",
1914: "name": {
1915: "en": "Arzuiyeh",
1916: "fa": "ارزوئیه",
1917: "de": "Arzuiyeh"
1918: }
1919: },
1920: {
1921: "field": "locality",
1922: "key": "baft",
1923: "name": {
1924: "en": "Baft",
1925: "fa": "بافت",
1926: "de": "Baft"
1927: }
1928: },
1929: {
1930: "field": "locality",
1931: "key": "bam",
1932: "name": {
1933: "en": "Bam",
1934: "fa": "بم",
1935: "de": "Bam"
1936: }
1937: },
1938: {
1939: "field": "locality",
1940: "key": "bardsir",
1941: "name": {
1942: "en": "Bardsir",
1943: "fa": "بردسیر",
1944: "de": "Bardsir"
1945: }
1946: },
1947: {
1948: "field": "locality",
1949: "key": "fahraj",
1950: "name": {
1951: "en": "Fahraj",
1952: "fa": "فهرج",
1953: "de": "Fahraj"
1954: }
1955: },
1956: {
1957: "field": "locality",
1958: "key": "faryab",
1959: "name": {
1960: "en": "Faryab",
1961: "fa": "فاریاب",
1962: "de": "Faryab"
1963: }
1964: },
1965: {
1966: "field": "locality",
1967: "key": "gonbaki",
1968: "name": {
1969: "en": "Gonbaki",
1970: "fa": "گنبکی",
1971: "de": "Gonbaki"
1972: }
1973: },
1974: {
1975: "field": "locality",
1976: "key": "jazmurian",
1977: "name": {
1978: "en": "Jazmurian",
1979: "fa": "جازموریان",
1980: "de": "Jazmurian"
1981: }
1982: },
1983: {
1984: "field": "locality",
1985: "key": "jiroft",
1986: "name": {
1987: "en": "Jiroft",
1988: "fa": "جیرفت",
1989: "de": "Jiroft"
1990: }
1991: },
1992: {
1993: "field": "locality",
1994: "key": "kahnuj",
1995: "name": {
1996: "en": "Kahnuj",
1997: "fa": "کهنوج",
1998: "de": "Kahnuj"
1999: }
2000: },
2001: {
2002: "field": "locality",
2003: "key": "kerman",
2004: "name": {
2005: "en": "Kerman",
2006: "fa": "کرمان",
2007: "de": "Kerman"
2008: }
2009: },
2010: {
2011: "field": "locality",
2012: "key": "kuhbanan",
2013: "name": {
2014: "en": "Kuhbanan",
2015: "fa": "کوهبنان",
2016: "de": "Kuhbanan"
2017: }
2018: },
2019: {
2020: "field": "locality",
2021: "key": "manujan",
2022: "name": {
2023: "en": "Manujan",
2024: "fa": "منوجان",
2025: "de": "Manujan"
2026: }
2027: },
2028: {
2029: "field": "locality",
2030: "key": "narmashir",
2031: "name": {
2032: "en": "Narmashir",
2033: "fa": "نرماشیر",
2034: "de": "Narmashir"
2035: }
2036: },
2037: {
2038: "field": "locality",
2039: "key": "qalehganj",
2040: "name": {
2041: "en": "Qaleh Ganj",
2042: "fa": "قلعه‌گنج",
2043: "de": "Qaleh Ganj"
2044: }
2045: },
2046: {
2047: "field": "locality",
2048: "key": "rabor",
2049: "name": {
2050: "en": "Rabor",
2051: "fa": "رابر",
2052: "de": "Rabor"
2053: }
2054: },
2055: {
2056: "field": "locality",
2057: "key": "rafsanjan",
2058: "name": {
2059: "en": "Rafsanjan",
2060: "fa": "رفسنجان",
2061: "de": "Rafsanjan"
2062: }
2063: },
2064: {
2065: "field": "locality",
2066: "key": "ravar",
2067: "name": {
2068: "en": "Ravar",
2069: "fa": "راور",
2070: "de": "Ravar"
2071: }
2072: },
2073: {
2074: "field": "locality",
2075: "key": "rigan",
2076: "name": {
2077: "en": "Rigan",
2078: "fa": "ریگان",
2079: "de": "Rigan"
2080: }
2081: },
2082: {
2083: "field": "locality",
2084: "key": "rudbarejonubi",
2085: "name": {
2086: "en": "Rudbar-e Jonubi",
2087: "fa": "رودبار جنوب",
2088: "de": "Rudbar-e Jonubi"
2089: }
2090: },
2091: {
2092: "field": "locality",
2093: "key": "shahrebabak",
2094: "name": {
2095: "en": "Shahr-e Babak",
2096: "fa": "شهر بابک",
2097: "de": "Shahr-e Babak"
2098: }
2099: },
2100: {
2101: "field": "locality",
2102: "key": "sirjan",
2103: "name": {
2104: "en": "Sirjan",
2105: "fa": "سیرجان",
2106: "de": "Sirjan"
2107: }
2108: },
2109: {
2110: "field": "locality",
2111: "key": "zarand",
2112: "name": {
2113: "en": "Zarand",
2114: "fa": "زرند",
2115: "de": "Zarand"
2116: }
2117: }
2118: ]
2119: },
2120: {
2121: "countryCode": "IR",
2122: "field": "administrative_area",
2123: "key": "kermanshah",
2124: "name": {
2125: "en": "Kermanshah",
2126: "fa": "کرمانشاه",
2127: "de": "Kermanschah"
2128: },
2129: "children": [
2130: {
2131: "field": "locality",
2132: "key": "dalahu",
2133: "name": {
2134: "en": "Dalahu",
2135: "fa": "دالاهو",
2136: "de": "Dalahu"
2137: }
2138: },
2139: {
2140: "field": "locality",
2141: "key": "gilanegharb",
2142: "name": {
2143: "en": "Gilan-e Gharb",
2144: "fa": "گیلان غرب",
2145: "de": "Gilan-e Gharb"
2146: }
2147: },
2148: {
2149: "field": "locality",
2150: "key": "harsin",
2151: "name": {
2152: "en": "Harsin",
2153: "fa": "هرسین",
2154: "de": "Harsin"
2155: }
2156: },
2157: {
2158: "field": "locality",
2159: "key": "javanrud",
2160: "name": {
2161: "en": "Javanrud",
2162: "fa": "جوانرود",
2163: "de": "Javanrud"
2164: }
2165: },
2166: {
2167: "field": "locality",
2168: "key": "kangavar",
2169: "name": {
2170: "en": "Kangavar",
2171: "fa": "کنگاور",
2172: "de": "Kangavar"
2173: }
2174: },
2175: {
2176: "field": "locality",
2177: "key": "kermanshah",
2178: "name": {
2179: "en": "Kermanshah",
2180: "fa": "کرمانشاه",
2181: "de": "Kermanschah"
2182: }
2183: },
2184: {
2185: "field": "locality",
2186: "key": "paveh",
2187: "name": {
2188: "en": "Paveh",
2189: "fa": "پاوه",
2190: "de": "Paveh"
2191: }
2192: },
2193: {
2194: "field": "locality",
2195: "key": "qasreshirin",
2196: "name": {
2197: "en": "Qasr-e Shirin",
2198: "fa": "قصر شیرین",
2199: "de": "Qasr-e Shirin"
2200: }
2201: },
2202: {
2203: "field": "locality",
2204: "key": "ravansar",
2205: "name": {
2206: "en": "Ravansar",
2207: "fa": "روانسر",
2208: "de": "Ravansar"
2209: }
2210: },
2211: {
2212: "field": "locality",
2213: "key": "sahneh",
2214: "name": {
2215: "en": "Sahneh",
2216: "fa": "صحنه",
2217: "de": "Sahneh"
2218: }
2219: },
2220: {
2221: "field": "locality",
2222: "key": "salasebabajani",
2223: "name": {
2224: "en": "Salas-e Babajani",
2225: "fa": "ثلاث باباجانی",
2226: "de": "Salas-e Babajani"
2227: }
2228: },
2229: {
2230: "field": "locality",
2231: "key": "sarpolezahab",
2232: "name": {
2233: "en": "Sarpol-e Zahab",
2234: "fa": "سرپل ذهاب",
2235: "de": "Sarpol-e Zahab"
2236: }
2237: },
2238: {
2239: "field": "locality",
2240: "key": "shahabadegharb",
2241: "name": {
2242: "en": "Shahabad-e Gharb",
2243: "fa": "شاه‌آباد غرب",
2244: "de": "Shahabad-e Gharb"
2245: }
2246: },
2247: {
2248: "field": "locality",
2249: "key": "sonqor",
2250: "name": {
2251: "en": "Sonqor",
2252: "fa": "سنقر",
2253: "de": "Sonqor"
2254: }
2255: }
2256: ]
2257: },
2258: {
2259: "countryCode": "IR",
2260: "field": "administrative_area",
2261: "key": "khuzestan",
2262: "name": {
2263: "en": "Khuzestan",
2264: "fa": "خوزستان",
2265: "de": "Chuzestan"
2266: },
2267: "children": [
2268: {
2269: "field": "locality",
2270: "key": "abadan",
2271: "name": {
2272: "en": "Abadan",
2273: "fa": "آبادان",
2274: "de": "Abadan"
2275: }
2276: },
2277: {
2278: "field": "locality",
2279: "key": "aghajri",
2280: "name": {
2281: "en": "Aghajri",
2282: "fa": "آغاجاری",
2283: "de": "Aghajri"
2284: }
2285: },
2286: {
2287: "field": "locality",
2288: "key": "ahvaz",
2289: "name": {
2290: "en": "Ahvaz",
2291: "fa": "اهواز",
2292: "de": "Ahvaz"
2293: }
2294: },
2295: {
2296: "field": "locality",
2297: "key": "andika",
2298: "name": {
2299: "en": "Andika",
2300: "fa": "اندیکا",
2301: "de": "Andika"
2302: }
2303: },
2304: {
2305: "field": "locality",
2306: "key": "andimeshk",
2307: "name": {
2308: "en": "Andimeshk",
2309: "fa": "اندیمشک",
2310: "de": "Andimeshk"
2311: }
2312: },
2313: {
2314: "field": "locality",
2315: "key": "baghemalek",
2316: "name": {
2317: "en": "Bagh-e Malek",
2318: "fa": "باغ‌ملک",
2319: "de": "Bagh-e Malek"
2320: }
2321: },
2322: {
2323: "field": "locality",
2324: "key": "bavi",
2325: "name": {
2326: "en": "Bavi",
2327: "fa": "باوی",
2328: "de": "Bavi"
2329: }
2330: },
2331: {
2332: "field": "locality",
2333: "key": "behbahan",
2334: "name": {
2335: "en": "Behbahan",
2336: "fa": "بهبهان",
2337: "de": "Behbahan"
2338: }
2339: },
2340: {
2341: "field": "locality",
2342: "key": "dashteazadegan",
2343: "name": {
2344: "en": "Dasht-e Azadegan",
2345: "fa": "دشت آزادگان",
2346: "de": "Dasht-e Azadegan"
2347: }
2348: },
2349: {
2350: "field": "locality",
2351: "key": "dezful",
2352: "name": {
2353: "en": "Dezful",
2354: "fa": "دزفول",
2355: "de": "Dezful"
2356: }
2357: },
2358: {
2359: "field": "locality",
2360: "key": "dezpart",
2361: "name": {
2362: "en": "Dezpart",
2363: "fa": "دزپارت",
2364: "de": "Dezpart"
2365: }
2366: },
2367: {
2368: "field": "locality",
2369: "key": "gotvand",
2370: "name": {
2371: "en": "Gotvand",
2372: "fa": "گتوند",
2373: "de": "Gotvand"
2374: }
2375: },
2376: {
2377: "field": "locality",
2378: "key": "haftkel",
2379: "name": {
2380: "en": "Haftkel",
2381: "fa": "هفتکل",
2382: "de": "Haftkel"
2383: }
2384: },
2385: {
2386: "field": "locality",
2387: "key": "hamidiyeh",
2388: "name": {
2389: "en": "Hamidiyeh",
2390: "fa": "حمیدیه",
2391: "de": "Hamidiyeh"
2392: }
2393: },
2394: {
2395: "field": "locality",
2396: "key": "hendijan",
2397: "name": {
2398: "en": "Hendijan",
2399: "fa": "هندیجان",
2400: "de": "Hendijan"
2401: }
2402: },
2403: {
2404: "field": "locality",
2405: "key": "hoveyzeh",
2406: "name": {
2407: "en": "Hoveyzeh",
2408: "fa": "هویزه",
2409: "de": "Hoveyzeh"
2410: }
2411: },
2412: {
2413: "field": "locality",
2414: "key": "izeh",
2415: "name": {
2416: "en": "Izeh",
2417: "fa": "ایذه",
2418: "de": "Izeh"
2419: }
2420: },
2421: {
2422: "field": "locality",
2423: "key": "karkheh",
2424: "name": {
2425: "en": "Karkheh",
2426: "fa": "کرخه",
2427: "de": "Karkheh"
2428: }
2429: },
2430: {
2431: "field": "locality",
2432: "key": "karun",
2433: "name": {
2434: "en": "Karun",
2435: "fa": "کارون",
2436: "de": "Karun"
2437: }
2438: },
2439: {
2440: "field": "locality",
2441: "key": "khorramshahr",
2442: "name": {
2443: "en": "Khorramshahr",
2444: "fa": "خرمشهر",
2445: "de": "Khorramshahr"
2446: }
2447: },
2448: {
2449: "field": "locality",
2450: "key": "lali",
2451: "name": {
2452: "en": "Lali",
2453: "fa": "لالی",
2454: "de": "Lali"
2455: }
2456: },
2457: {
2458: "field": "locality",
2459: "key": "mahshahr",
2460: "name": {
2461: "en": "Mahshahr",
2462: "fa": "بندر ماهشهر",
2463: "de": "Mahshahr"
2464: }
2465: },
2466: {
2467: "field": "locality",
2468: "key": "masjedsoleyman",
2469: "name": {
2470: "en": "Masjed Soleyman",
2471: "fa": "مسجدسلیمان",
2472: "de": "Masjed Soleyman"
2473: }
2474: },
2475: {
2476: "field": "locality",
2477: "key": "omidiyeh",
2478: "name": {
2479: "en": "Omidiyeh",
2480: "fa": "امیدیه",
2481: "de": "Omidiyeh"
2482: }
2483: },
2484: {
2485: "field": "locality",
2486: "key": "ramhormoz",
2487: "name": {
2488: "en": "Ramhormoz",
2489: "fa": "رامهرمز",
2490: "de": "Ramhormoz"
2491: }
2492: },
2493: {
2494: "field": "locality",
2495: "key": "ramshir",
2496: "name": {
2497: "en": "Ramshir",
2498: "fa": "رامشیر",
2499: "de": "Ramshir"
2500: }
2501: },
2502: {
2503: "field": "locality",
2504: "key": "seydun",
2505: "name": {
2506: "en": "Seydun",
2507: "fa": "سیدون",
2508: "de": "Seydun"
2509: }
2510: },
2511: {
2512: "field": "locality",
2513: "key": "shadegan",
2514: "name": {
2515: "en": "Shadegan",
2516: "fa": "شادگان",
2517: "de": "Shadegan"
2518: }
2519: },
2520: {
2521: "field": "locality",
2522: "key": "shush",
2523: "name": {
2524: "en": "Shush",
2525: "fa": "شوش",
2526: "de": "Shush"
2527: }
2528: },
2529: {
2530: "field": "locality",
2531: "key": "shushtar",
2532: "name": {
2533: "en": "Shushtar",
2534: "fa": "شوشتر",
2535: "de": "Shushtar"
2536: }
2537: }
2538: ]
2539: },
2540: {
2541: "countryCode": "IR",
2542: "field": "administrative_area",
2543: "key": "kohgiluyehandboyerahmad",
2544: "name": {
2545: "en": "Kohgiluyeh and Boyer-Ahmad",
2546: "fa": "کهگیلویه و بویراحمد",
2547: "de": "Kohgiluye und Buyer Ahmad"
2548: },
2549: "children": [
2550: {
2551: "field": "locality",
2552: "key": "bahmai",
2553: "name": {
2554: "en": "Bahmai",
2555: "fa": "بهمئی",
2556: "de": "Bahmai"
2557: }
2558: },
2559: {
2560: "field": "locality",
2561: "key": "basht",
2562: "name": {
2563: "en": "Basht",
2564: "fa": "باشت",
2565: "de": "Basht"
2566: }
2567: },
2568: {
2569: "field": "locality",
2570: "key": "boyerahmad",
2571: "name": {
2572: "en": "Boyer-Ahmad",
2573: "fa": "بویراحمد",
2574: "de": "Boyer-Ahmad"
2575: }
2576: },
2577: {
2578: "field": "locality",
2579: "key": "charam",
2580: "name": {
2581: "en": "Charam",
2582: "fa": "چرام",
2583: "de": "Charam"
2584: }
2585: },
2586: {
2587: "field": "locality",
2588: "key": "dana",
2589: "name": {
2590: "en": "Dana",
2591: "fa": "دنا",
2592: "de": "Dana"
2593: }
2594: },
2595: {
2596: "field": "locality",
2597: "key": "gachsaran",
2598: "name": {
2599: "en": "Gachsaran",
2600: "fa": "گچساران",
2601: "de": "Gachsaran"
2602: }
2603: },
2604: {
2605: "field": "locality",
2606: "key": "kohgiluyeh",
2607: "name": {
2608: "en": "Kohgiluyeh",
2609: "fa": "کهگیلویه",
2610: "de": "Kohgiluyeh"
2611: }
2612: },
2613: {
2614: "field": "locality",
2615: "key": "landeh",
2616: "name": {
2617: "en": "Landeh",
2618: "fa": "لنده",
2619: "de": "Landeh"
2620: }
2621: },
2622: {
2623: "field": "locality",
2624: "key": "margown",
2625: "name": {
2626: "en": "Margown",
2627: "fa": "مارگون",
2628: "de": "Margown"
2629: }
2630: }
2631: ]
2632: },
2633: {
2634: "countryCode": "IR",
2635: "field": "administrative_area",
2636: "key": "kurdistan",
2637: "name": {
2638: "en": "Kurdistan",
2639: "fa": "کردستان",
2640: "de": "Kurdistan"
2641: },
2642: "children": [
2643: {
2644: "field": "locality",
2645: "key": "baneh",
2646: "name": {
2647: "en": "Baneh",
2648: "fa": "بانه",
2649: "de": "Baneh"
2650: }
2651: },
2652: {
2653: "field": "locality",
2654: "key": "bijar",
2655: "name": {
2656: "en": "Bijar",
2657: "fa": "بیجار",
2658: "de": "Bijar"
2659: }
2660: },
2661: {
2662: "field": "locality",
2663: "key": "dehgolan",
2664: "name": {
2665: "en": "Dehgolan",
2666: "fa": "دهگلان",
2667: "de": "Dehgolan"
2668: }
2669: },
2670: {
2671: "field": "locality",
2672: "key": "divandarreh",
2673: "name": {
2674: "en": "Divandarreh",
2675: "fa": "دیواندره",
2676: "de": "Divandarreh"
2677: }
2678: },
2679: {
2680: "field": "locality",
2681: "key": "kamyaran",
2682: "name": {
2683: "en": "Kamyaran",
2684: "fa": "کامیاران",
2685: "de": "Kamyaran"
2686: }
2687: },
2688: {
2689: "field": "locality",
2690: "key": "marivan",
2691: "name": {
2692: "en": "Marivan",
2693: "fa": "مریوان",
2694: "de": "Marivan"
2695: }
2696: },
2697: {
2698: "field": "locality",
2699: "key": "qorveh",
2700: "name": {
2701: "en": "Qorveh",
2702: "fa": "قروه",
2703: "de": "Qorveh"
2704: }
2705: },
2706: {
2707: "field": "locality",
2708: "key": "sanandaj",
2709: "name": {
2710: "en": "Sanandaj",
2711: "fa": "سنندج",
2712: "de": "Sanandaj"
2713: }
2714: },
2715: {
2716: "field": "locality",
2717: "key": "saqqez",
2718: "name": {
2719: "en": "Saqqez",
2720: "fa": "سقز",
2721: "de": "Saqqez"
2722: }
2723: },
2724: {
2725: "field": "locality",
2726: "key": "sarvabad",
2727: "name": {
2728: "en": "Sarvabad",
2729: "fa": "سروآباد",
2730: "de": "Sarvabad"
2731: }
2732: }
2733: ]
2734: },
2735: {
2736: "countryCode": "IR",
2737: "field": "administrative_area",
2738: "key": "lorestan",
2739: "name": {
2740: "en": "Lorestan",
2741: "fa": "لرستان",
2742: "de": "Lorestan"
2743: },
2744: "children": [
2745: {
2746: "field": "locality",
2747: "key": "aligudarz",
2748: "name": {
2749: "en": "Aligudarz",
2750: "fa": "الیگودرز",
2751: "de": "Aligudarz"
2752: }
2753: },
2754: {
2755: "field": "locality",
2756: "key": "azna",
2757: "name": {
2758: "en": "Azna",
2759: "fa": "ازنا",
2760: "de": "Azna"
2761: }
2762: },
2763: {
2764: "field": "locality",
2765: "key": "borujerd",
2766: "name": {
2767: "en": "Borujerd",
2768: "fa": "بروجرد",
2769: "de": "Borujerd"
2770: }
2771: },
2772: {
2773: "field": "locality",
2774: "key": "delfan",
2775: "name": {
2776: "en": "Delfan",
2777: "fa": "دلفان",
2778: "de": "Delfan"
2779: }
2780: },
2781: {
2782: "field": "locality",
2783: "key": "dorud",
2784: "name": {
2785: "en": "Dorud",
2786: "fa": "دورود",
2787: "de": "Dorud"
2788: }
2789: },
2790: {
2791: "field": "locality",
2792: "key": "dowreh",
2793: "name": {
2794: "en": "Dowreh",
2795: "fa": "دوره",
2796: "de": "Dowreh"
2797: }
2798: },
2799: {
2800: "field": "locality",
2801: "key": "khorramabad",
2802: "name": {
2803: "en": "Khorramabad",
2804: "fa": "خرم‌آباد",
2805: "de": "Khorramabad"
2806: }
2807: },
2808: {
2809: "field": "locality",
2810: "key": "kuhdasht",
2811: "name": {
2812: "en": "Kuhdasht",
2813: "fa": "کوهدشت",
2814: "de": "Kuhdasht"
2815: }
2816: },
2817: {
2818: "field": "locality",
2819: "key": "poledokhtar",
2820: "name": {
2821: "en": "Pol-e Dokhtar",
2822: "fa": "پل‌دختر",
2823: "de": "Pol-e Dokhtar"
2824: }
2825: },
2826: {
2827: "field": "locality",
2828: "key": "rumeshkan",
2829: "name": {
2830: "en": "Rumeshkan",
2831: "fa": "رومشکان",
2832: "de": "Rumeshkan"
2833: }
2834: },
2835: {
2836: "field": "locality",
2837: "key": "selseleh",
2838: "name": {
2839: "en": "Selseleh",
2840: "fa": "سلسله",
2841: "de": "Selseleh"
2842: }
2843: }
2844: ]
2845: },
2846: {
2847: "countryCode": "IR",
2848: "field": "administrative_area",
2849: "key": "markazi",
2850: "name": {
2851: "en": "Markazi",
2852: "fa": "مرکزی",
2853: "de": "Markazi"
2854: },
2855: "children": [
2856: {
2857: "field": "locality",
2858: "key": "arak",
2859: "name": {
2860: "en": "Arak",
2861: "fa": "اراک",
2862: "de": "Arak"
2863: }
2864: },
2865: {
2866: "field": "locality",
2867: "key": "ashtian",
2868: "name": {
2869: "en": "Ashtian",
2870: "fa": "آشتیان",
2871: "de": "Ashtian"
2872: }
2873: },
2874: {
2875: "field": "locality",
2876: "key": "delijan",
2877: "name": {
2878: "en": "Delijan",
2879: "fa": "دلیجان",
2880: "de": "Delijan"
2881: }
2882: },
2883: {
2884: "field": "locality",
2885: "key": "farahan",
2886: "name": {
2887: "en": "Farahan",
2888: "fa": "فراهان",
2889: "de": "Farahan"
2890: }
2891: },
2892: {
2893: "field": "locality",
2894: "key": "khomeyn",
2895: "name": {
2896: "en": "Khomeyn",
2897: "fa": "خمین",
2898: "de": "Khomeyn"
2899: }
2900: },
2901: {
2902: "field": "locality",
2903: "key": "khondab",
2904: "name": {
2905: "en": "Khondab",
2906: "fa": "خنداب",
2907: "de": "Khondab"
2908: }
2909: },
2910: {
2911: "field": "locality",
2912: "key": "komijan",
2913: "name": {
2914: "en": "Komijan",
2915: "fa": "کمیجان",
2916: "de": "Komijan"
2917: }
2918: },
2919: {
2920: "field": "locality",
2921: "key": "mahallat",
2922: "name": {
2923: "en": "Mahallat",
2924: "fa": "محلات",
2925: "de": "Mahallat"
2926: }
2927: },
2928: {
2929: "field": "locality",
2930: "key": "saveh",
2931: "name": {
2932: "en": "Saveh",
2933: "fa": "ساوه",
2934: "de": "Saveh"
2935: }
2936: },
2937: {
2938: "field": "locality",
2939: "key": "shazand",
2940: "name": {
2941: "en": "Shazand",
2942: "fa": "شازند",
2943: "de": "Shazand"
2944: }
2945: },
2946: {
2947: "field": "locality",
2948: "key": "tafresh",
2949: "name": {
2950: "en": "Tafresh",
2951: "fa": "تفرش",
2952: "de": "Tafresh"
2953: }
2954: },
2955: {
2956: "field": "locality",
2957: "key": "zarandiyeh",
2958: "name": {
2959: "en": "Zarandiyeh",
2960: "fa": "زرندیه",
2961: "de": "Zarandiyeh"
2962: }
2963: }
2964: ]
2965: },
2966: {
2967: "countryCode": "IR",
2968: "field": "administrative_area",
2969: "key": "mazandaran",
2970: "name": {
2971: "en": "Mazandaran",
2972: "fa": "مازندران",
2973: "de": "Mazandaran"
2974: },
2975: "children": [
2976: {
2977: "field": "locality",
2978: "key": "abbasabad",
2979: "name": {
2980: "en": "Abbasabad",
2981: "fa": "عباس‌آباد",
2982: "de": "Abbasabad"
2983: }
2984: },
2985: {
2986: "field": "locality",
2987: "key": "amol",
2988: "name": {
2989: "en": "Amol",
2990: "fa": "آمل",
2991: "de": "Amol"
2992: }
2993: },
2994: {
2995: "field": "locality",
2996: "key": "babol",
2997: "name": {
2998: "en": "Babol",
2999: "fa": "بابل",
3000: "de": "Babol"
3001: }
3002: },
3003: {
3004: "field": "locality",
3005: "key": "babolsar",
3006: "name": {
3007: "en": "Babolsar",
3008: "fa": "بابلسر",
3009: "de": "Babolsar"
3010: }
3011: },
3012: {
3013: "field": "locality",
3014: "key": "behshahr",
3015: "name": {
3016: "en": "Behshahr",
3017: "fa": "بهشهر",
3018: "de": "Behshahr"
3019: }
3020: },
3021: {
3022: "field": "locality",
3023: "key": "chalus",
3024: "name": {
3025: "en": "Chalus",
3026: "fa": "چالوس",
3027: "de": "Chalus"
3028: }
3029: },
3030: {
3031: "field": "locality",
3032: "key": "fereydunkenar",
3033: "name": {
3034: "en": "Fereydunkenar",
3035: "fa": "فریدونکنار",
3036: "de": "Fereydunkenar"
3037: }
3038: },
3039: {
3040: "field": "locality",
3041: "key": "galugah",
3042: "name": {
3043: "en": "Galugah",
3044: "fa": "گلوگاه",
3045: "de": "Galugah"
3046: }
3047: },
3048: {
3049: "field": "locality",
3050: "key": "juybar",
3051: "name": {
3052: "en": "Juybar",
3053: "fa": "جویبار",
3054: "de": "Juybar"
3055: }
3056: },
3057: {
3058: "field": "locality",
3059: "key": "kelardasht",
3060: "name": {
3061: "en": "Kelardasht",
3062: "fa": "کلاردشت",
3063: "de": "Kelardasht"
3064: }
3065: },
3066: {
3067: "field": "locality",
3068: "key": "mahmudabad",
3069: "name": {
3070: "en": "Mahmudabad",
3071: "fa": "محمودآباد",
3072: "de": "Mahmudabad"
3073: }
3074: },
3075: {
3076: "field": "locality",
3077: "key": "miandorud",
3078: "name": {
3079: "en": "Miandorud",
3080: "fa": "میاندورود",
3081: "de": "Miandorud"
3082: }
3083: },
3084: {
3085: "field": "locality",
3086: "key": "neka",
3087: "name": {
3088: "en": "Neka",
3089: "fa": "نکا",
3090: "de": "Neka"
3091: }
3092: },
3093: {
3094: "field": "locality",
3095: "key": "northsavadkuh",
3096: "name": {
3097: "en": "North Savadkuh",
3098: "fa": "سوادکوه شمالی",
3099: "de": "North Savadkuh"
3100: }
3101: },
3102: {
3103: "field": "locality",
3104: "key": "nowshahr",
3105: "name": {
3106: "en": "Nowshahr",
3107: "fa": "نوشهر",
3108: "de": "Nowshahr"
3109: }
3110: },
3111: {
3112: "field": "locality",
3113: "key": "nur",
3114: "name": {
3115: "en": "Nur",
3116: "fa": "نور",
3117: "de": "Nur"
3118: }
3119: },
3120: {
3121: "field": "locality",
3122: "key": "qaemshahr",
3123: "name": {
3124: "en": "Qaem Shahr",
3125: "fa": "قائم‌شهر",
3126: "de": "Qaem Shahr"
3127: }
3128: },
3129: {
3130: "field": "locality",
3131: "key": "ramsar",
3132: "name": {
3133: "en": "Ramsar",
3134: "fa": "رامسر",
3135: "de": "Ramsar"
3136: }
3137: },
3138: {
3139: "field": "locality",
3140: "key": "sari",
3141: "name": {
3142: "en": "Sari",
3143: "fa": "ساری",
3144: "de": "Sari"
3145: }
3146: },
3147: {
3148: "field": "locality",
3149: "key": "savadkuh",
3150: "name": {
3151: "en": "Savadkuh",
3152: "fa": "سوادکوه",
3153: "de": "Savadkuh"
3154: }
3155: },
3156: {
3157: "field": "locality",
3158: "key": "simorgh",
3159: "name": {
3160: "en": "Simorgh",
3161: "fa": "سیمرغ",
3162: "de": "Simorgh"
3163: }
3164: },
3165: {
3166: "field": "locality",
3167: "key": "tonekabon",
3168: "name": {
3169: "en": "Tonekabon",
3170: "fa": "تنکابن",
3171: "de": "Tonekabon"
3172: }
3173: }
3174: ]
3175: },
3176: {
3177: "countryCode": "IR",
3178: "field": "administrative_area",
3179: "key": "northkhorasan",
3180: "name": {
3181: "en": "North Khorasan",
3182: "fa": "خراسان شمالی",
3183: "de": "Nordchorasan"
3184: },
3185: "children": [
3186: {
3187: "field": "locality",
3188: "key": "bamandsafiabad",
3189: "name": {
3190: "en": "Bam and Safiabad",
3191: "fa": "بام و صفی‌آباد",
3192: "de": "Bam and Safiabad"
3193: }
3194: },
3195: {
3196: "field": "locality",
3197: "key": "bojnord",
3198: "name": {
3199: "en": "Bojnord",
3200: "fa": "بجنورد",
3201: "de": "Bojnord"
3202: }
3203: },
3204: {
3205: "field": "locality",
3206: "key": "esfarayen",
3207: "name": {
3208: "en": "Esfarayen",
3209: "fa": "اسفراین",
3210: "de": "Esfarayen"
3211: }
3212: },
3213: {
3214: "field": "locality",
3215: "key": "faruj",
3216: "name": {
3217: "en": "Faruj",
3218: "fa": "فاروج",
3219: "de": "Faruj"
3220: }
3221: },
3222: {
3223: "field": "locality",
3224: "key": "garmeh",
3225: "name": {
3226: "en": "Garmeh",
3227: "fa": "گرمه",
3228: "de": "Garmeh"
3229: }
3230: },
3231: {
3232: "field": "locality",
3233: "key": "jajrom",
3234: "name": {
3235: "en": "Jajrom",
3236: "fa": "جاجرم",
3237: "de": "Jajrom"
3238: }
3239: },
3240: {
3241: "field": "locality",
3242: "key": "maneh",
3243: "name": {
3244: "en": "Maneh",
3245: "fa": "مانه و سملقان",
3246: "de": "Maneh"
3247: }
3248: },
3249: {
3250: "field": "locality",
3251: "key": "razandjargalan",
3252: "name": {
3253: "en": "Raz and Jargalan",
3254: "fa": "راز و جرگلان",
3255: "de": "Raz and Jargalan"
3256: }
3257: },
3258: {
3259: "field": "locality",
3260: "key": "samalqan",
3261: "name": {
3262: "en": "Samalqan",
3263: "fa": "سملقان",
3264: "de": "Samalqan"
3265: }
3266: },
3267: {
3268: "field": "locality",
3269: "key": "shirvan",
3270: "name": {
3271: "en": "Shirvan",
3272: "fa": "شیروان",
3273: "de": "Shirvan"
3274: }
3275: }
3276: ]
3277: },
3278: {
3279: "countryCode": "IR",
3280: "field": "administrative_area",
3281: "key": "qazvin",
3282: "name": {
3283: "en": "Qazvin",
3284: "fa": "قزوین",
3285: "de": "Ghazvin"
3286: },
3287: "children": [
3288: {
3289: "field": "locality",
3290: "key": "abyek",
3291: "name": {
3292: "en": "Abyek",
3293: "fa": "آبیک",
3294: "de": "Abyek"
3295: }
3296: },
3297: {
3298: "field": "locality",
3299: "key": "alborz",
3300: "name": {
3301: "en": "Alborz",
3302: "fa": "البرز",
3303: "de": "Alborz"
3304: }
3305: },
3306: {
3307: "field": "locality",
3308: "key": "avaj",
3309: "name": {
3310: "en": "Avaj",
3311: "fa": "آوج",
3312: "de": "Avaj"
3313: }
3314: },
3315: {
3316: "field": "locality",
3317: "key": "buinzahra",
3318: "name": {
3319: "en": "Buin Zahra",
3320: "fa": "بوئین‌زهرا",
3321: "de": "Buin Zahra"
3322: }
3323: },
3324: {
3325: "field": "locality",
3326: "key": "qazvin",
3327: "name": {
3328: "en": "Qazvin",
3329: "fa": "قزوین",
3330: "de": "Ghazvin"
3331: }
3332: },
3333: {
3334: "field": "locality",
3335: "key": "takestan",
3336: "name": {
3337: "en": "Takestan",
3338: "fa": "تاکستان",
3339: "de": "Takestan"
3340: }
3341: }
3342: ]
3343: },
3344: {
3345: "countryCode": "IR",
3346: "field": "administrative_area",
3347: "key": "qom",
3348: "name": {
3349: "en": "Qom",
3350: "fa": "قم",
3351: "de": "Ghom"
3352: },
3353: "children": [
3354: {
3355: "field": "locality",
3356: "key": "jafarabad",
3357: "name": {
3358: "en": "Jafarabad",
3359: "fa": "جعفرآباد",
3360: "de": "Jafarabad"
3361: }
3362: },
3363: {
3364: "field": "locality",
3365: "key": "kahak",
3366: "name": {
3367: "en": "Kahak",
3368: "fa": "کهک",
3369: "de": "Kahak"
3370: }
3371: },
3372: {
3373: "field": "locality",
3374: "key": "qom",
3375: "name": {
3376: "en": "Qom",
3377: "fa": "قم",
3378: "de": "Ghom"
3379: }
3380: }
3381: ]
3382: },
3383: {
3384: "countryCode": "IR",
3385: "field": "administrative_area",
3386: "key": "razavikhorasan",
3387: "name": {
3388: "en": "Razavi Khorasan",
3389: "fa": "خراسان رضوی",
3390: "de": "Chorasan-e Razawi"
3391: },
3392: "children": [
3393: {
3394: "field": "locality",
3395: "key": "bajestan",
3396: "name": {
3397: "en": "Bajestan",
3398: "fa": "بجستان",
3399: "de": "Bajestan"
3400: }
3401: },
3402: {
3403: "field": "locality",
3404: "key": "bakharz",
3405: "name": {
3406: "en": "Bakharz",
3407: "fa": "باخرز",
3408: "de": "Bakharz"
3409: }
3410: },
3411: {
3412: "field": "locality",
3413: "key": "bardaskan",
3414: "name": {
3415: "en": "Bardaskan",
3416: "fa": "بردسکن",
3417: "de": "Bardaskan"
3418: }
3419: },
3420: {
3421: "field": "locality",
3422: "key": "chenaran",
3423: "name": {
3424: "en": "Chenaran",
3425: "fa": "چناران",
3426: "de": "Chenaran"
3427: }
3428: },
3429: {
3430: "field": "locality",
3431: "key": "dargaz",
3432: "name": {
3433: "en": "Dargaz",
3434: "fa": "درگز",
3435: "de": "Dargaz"
3436: }
3437: },
3438: {
3439: "field": "locality",
3440: "key": "davarzan",
3441: "name": {
3442: "en": "Davarzan",
3443: "fa": "داورزن",
3444: "de": "Davarzan"
3445: }
3446: },
3447: {
3448: "field": "locality",
3449: "key": "fariman",
3450: "name": {
3451: "en": "Fariman",
3452: "fa": "فریمان",
3453: "de": "Fariman"
3454: }
3455: },
3456: {
3457: "field": "locality",
3458: "key": "firuzeh",
3459: "name": {
3460: "en": "Firuzeh",
3461: "fa": "فیروزه",
3462: "de": "Firuzeh"
3463: }
3464: },
3465: {
3466: "field": "locality",
3467: "key": "golbahar",
3468: "name": {
3469: "en": "Golbahar",
3470: "fa": "گلبهار",
3471: "de": "Golbahar"
3472: }
3473: },
3474: {
3475: "field": "locality",
3476: "key": "gonabad",
3477: "name": {
3478: "en": "Gonabad",
3479: "fa": "گناباد",
3480: "de": "Gonabad"
3481: }
3482: },
3483: {
3484: "field": "locality",
3485: "key": "joghatai",
3486: "name": {
3487: "en": "Joghatai",
3488: "fa": "جغتای",
3489: "de": "Joghatai"
3490: }
3491: },
3492: {
3493: "field": "locality",
3494: "key": "joveyn",
3495: "name": {
3496: "en": "Joveyn",
3497: "fa": "جوین",
3498: "de": "Joveyn"
3499: }
3500: },
3501: {
3502: "field": "locality",
3503: "key": "kalat",
3504: "name": {
3505: "en": "Kalat",
3506: "fa": "کلات",
3507: "de": "Kalat"
3508: }
3509: },
3510: {
3511: "field": "locality",
3512: "key": "kashmar",
3513: "name": {
3514: "en": "Kashmar",
3515: "fa": "کاشمر",
3516: "de": "Kashmar"
3517: }
3518: },
3519: {
3520: "field": "locality",
3521: "key": "khaf",
3522: "name": {
3523: "en": "Khaf",
3524: "fa": "خواف",
3525: "de": "Khaf"
3526: }
3527: },
3528: {
3529: "field": "locality",
3530: "key": "khalilabad",
3531: "name": {
3532: "en": "Khalilabad",
3533: "fa": "خلیل‌آباد",
3534: "de": "Khalilabad"
3535: }
3536: },
3537: {
3538: "field": "locality",
3539: "key": "khoshab",
3540: "name": {
3541: "en": "Khoshab",
3542: "fa": "خوشاب",
3543: "de": "Khoshab"
3544: }
3545: },
3546: {
3547: "field": "locality",
3548: "key": "kuhsorkh",
3549: "name": {
3550: "en": "Kuhsorkh",
3551: "fa": "کوهسرخ",
3552: "de": "Kuhsorkh"
3553: }
3554: },
3555: {
3556: "field": "locality",
3557: "key": "mahvelat",
3558: "name": {
3559: "en": "Mahvelat",
3560: "fa": "مه‌ولات",
3561: "de": "Mahvelat"
3562: }
3563: },
3564: {
3565: "field": "locality",
3566: "key": "mashhad",
3567: "name": {
3568: "en": "Mashhad",
3569: "fa": "مشهد",
3570: "de": "Mashhad"
3571: }
3572: },
3573: {
3574: "field": "locality",
3575: "key": "miyanjolgeh",
3576: "name": {
3577: "en": "Miyan Jolgeh",
3578: "fa": "میان‌جلگه",
3579: "de": "Miyan Jolgeh"
3580: }
3581: },
3582: {
3583: "field": "locality",
3584: "key": "nishapur",
3585: "name": {
3586: "en": "Nishapur",
3587: "fa": "نیشابور",
3588: "de": "Nishapur"
3589: }
3590: },
3591: {
3592: "field": "locality",
3593: "key": "quchan",
3594: "name": {
3595: "en": "Quchan",
3596: "fa": "قوچان",
3597: "de": "Quchan"
3598: }
3599: },
3600: {
3601: "field": "locality",
3602: "key": "roshtkhar",
3603: "name": {
3604: "en": "Roshtkhar",
3605: "fa": "رشتخوار",
3606: "de": "Roshtkhar"
3607: }
3608: },
3609: {
3610: "field": "locality",
3611: "key": "sabzevar",
3612: "name": {
3613: "en": "Sabzevar",
3614: "fa": "سبزوار",
3615: "de": "Sabzevar"
3616: }
3617: },
3618: {
3619: "field": "locality",
3620: "key": "salehabad",
3621: "name": {
3622: "en": "Salehabad",
3623: "fa": "صالح‌آباد",
3624: "de": "Salehabad"
3625: }
3626: },
3627: {
3628: "field": "locality",
3629: "key": "sarakhs",
3630: "name": {
3631: "en": "Sarakhs",
3632: "fa": "سرخس",
3633: "de": "Sarakhs"
3634: }
3635: },
3636: {
3637: "field": "locality",
3638: "key": "sheshtamad",
3639: "name": {
3640: "en": "Sheshtamad",
3641: "fa": "ششتمد",
3642: "de": "Sheshtamad"
3643: }
3644: },
3645: {
3646: "field": "locality",
3647: "key": "taybad",
3648: "name": {
3649: "en": "Taybad",
3650: "fa": "تایباد",
3651: "de": "Taybad"
3652: }
3653: },
3654: {
3655: "field": "locality",
3656: "key": "torbateheydarieh",
3657: "name": {
3658: "en": "Torbat-e Heydarieh",
3659: "fa": "تربت حیدریه",
3660: "de": "Torbat-e Heydarieh"
3661: }
3662: },
3663: {
3664: "field": "locality",
3665: "key": "torbatejam",
3666: "name": {
3667: "en": "Torbat-e Jam",
3668: "fa": "تربت جام",
3669: "de": "Torbat-e Jam"
3670: }
3671: },
3672: {
3673: "field": "locality",
3674: "key": "torqabehandshandiz",
3675: "name": {
3676: "en": "Torqabeh and Shandiz",
3677: "fa": "طرقبه و شاندیز",
3678: "de": "Torqabeh and Shandiz"
3679: }
3680: },
3681: {
3682: "field": "locality",
3683: "key": "zaveh",
3684: "name": {
3685: "en": "Zaveh",
3686: "fa": "زاوه",
3687: "de": "Zaveh"
3688: }
3689: },
3690: {
3691: "field": "locality",
3692: "key": "zeberkhan",
3693: "name": {
3694: "en": "Zeberkhan",
3695: "fa": "زبرخان",
3696: "de": "Zeberkhan"
3697: }
3698: }
3699: ]
3700: },
3701: {
3702: "countryCode": "IR",
3703: "field": "administrative_area",
3704: "key": "semnan",
3705: "name": {
3706: "en": "Semnan",
3707: "fa": "سمنان",
3708: "de": "Semnan"
3709: },
3710: "children": [
3711: {
3712: "field": "locality",
3713: "key": "aradan",
3714: "name": {
3715: "en": "Aradan",
3716: "fa": "آرادان",
3717: "de": "Aradan"
3718: }
3719: },
3720: {
3721: "field": "locality",
3722: "key": "damghan",
3723: "name": {
3724: "en": "Damghan",
3725: "fa": "دامغان",
3726: "de": "Damghan"
3727: }
3728: },
3729: {
3730: "field": "locality",
3731: "key": "garmsar",
3732: "name": {
3733: "en": "Garmsar",
3734: "fa": "گرمسار",
3735: "de": "Garmsar"
3736: }
3737: },
3738: {
3739: "field": "locality",
3740: "key": "mehdishahr",
3741: "name": {
3742: "en": "Mehdishahr",
3743: "fa": "مهدی‌شهر",
3744: "de": "Mehdishahr"
3745: }
3746: },
3747: {
3748: "field": "locality",
3749: "key": "meyami",
3750: "name": {
3751: "en": "Meyami",
3752: "fa": "میامی",
3753: "de": "Meyami"
3754: }
3755: },
3756: {
3757: "field": "locality",
3758: "key": "semnan",
3759: "name": {
3760: "en": "Semnan",
3761: "fa": "سمنان",
3762: "de": "Semnan"
3763: }
3764: },
3765: {
3766: "field": "locality",
3767: "key": "shahrud",
3768: "name": {
3769: "en": "Shahrud",
3770: "fa": "شاهرود",
3771: "de": "Shahrud"
3772: }
3773: },
3774: {
3775: "field": "locality",
3776: "key": "sorkheh",
3777: "name": {
3778: "en": "Sorkheh",
3779: "fa": "سرخه",
3780: "de": "Sorkheh"
3781: }
3782: }
3783: ]
3784: },
3785: {
3786: "countryCode": "IR",
3787: "field": "administrative_area",
3788: "key": "sistanandbaluchistan",
3789: "name": {
3790: "en": "Sistan and Baluchistan",
3791: "fa": "سیستان و بلوچستان",
3792: "de": "Sistan und Belutschistan"
3793: },
3794: "children": [
3795: {
3796: "field": "locality",
3797: "key": "bampur",
3798: "name": {
3799: "en": "Bampur",
3800: "fa": "بمپور",
3801: "de": "Bampur"
3802: }
3803: },
3804: {
3805: "field": "locality",
3806: "key": "chabahar",
3807: "name": {
3808: "en": "Chabahar",
3809: "fa": "چابهار",
3810: "de": "Chabahar"
3811: }
3812: },
3813: {
3814: "field": "locality",
3815: "key": "dalgan",
3816: "name": {
3817: "en": "Dalgan",
3818: "fa": "دلگان",
3819: "de": "Dalgan"
3820: }
3821: },
3822: {
3823: "field": "locality",
3824: "key": "dashtiari",
3825: "name": {
3826: "en": "Dashtiari",
3827: "fa": "دشتیاری",
3828: "de": "Dashtiari"
3829: }
3830: },
3831: {
3832: "field": "locality",
3833: "key": "fanuj",
3834: "name": {
3835: "en": "Fanuj",
3836: "fa": "فنوج",
3837: "de": "Fanuj"
3838: }
3839: },
3840: {
3841: "field": "locality",
3842: "key": "golshan",
3843: "name": {
3844: "en": "Golshan",
3845: "fa": "گلشن",
3846: "de": "Golshan"
3847: }
3848: },
3849: {
3850: "field": "locality",
3851: "key": "hamun",
3852: "name": {
3853: "en": "Hamun",
3854: "fa": "هامون",
3855: "de": "Hamun"
3856: }
3857: },
3858: {
3859: "field": "locality",
3860: "key": "hirmand",
3861: "name": {
3862: "en": "Hirmand",
3863: "fa": "هیرمند",
3864: "de": "Hirmand"
3865: }
3866: },
3867: {
3868: "field": "locality",
3869: "key": "iranshahr",
3870: "name": {
3871: "en": "Iranshahr",
3872: "fa": "ایرانشهر",
3873: "de": "Iranshahr"
3874: }
3875: },
3876: {
3877: "field": "locality",
3878: "key": "khash",
3879: "name": {
3880: "en": "Khash",
3881: "fa": "خاش",
3882: "de": "Khash"
3883: }
3884: },
3885: {
3886: "field": "locality",
3887: "key": "konarak",
3888: "name": {
3889: "en": "Konarak",
3890: "fa": "کنارک",
3891: "de": "Konarak"
3892: }
3893: },
3894: {
3895: "field": "locality",
3896: "key": "lashar",
3897: "name": {
3898: "en": "Lashar",
3899: "fa": "لاشار",
3900: "de": "Lashar"
3901: }
3902: },
3903: {
3904: "field": "locality",
3905: "key": "mehrestan",
3906: "name": {
3907: "en": "Mehrestan",
3908: "fa": "مهرستان",
3909: "de": "Mehrestan"
3910: }
3911: },
3912: {
3913: "field": "locality",
3914: "key": "mirjaveh",
3915: "name": {
3916: "en": "Mirjaveh",
3917: "fa": "میرجاوه",
3918: "de": "Mirjaveh"
3919: }
3920: },
3921: {
3922: "field": "locality",
3923: "key": "nikshahr",
3924: "name": {
3925: "en": "Nik Shahr",
3926: "fa": "نیک‌شهر",
3927: "de": "Nik Shahr"
3928: }
3929: },
3930: {
3931: "field": "locality",
3932: "key": "nimruz",
3933: "name": {
3934: "en": "Nimruz",
3935: "fa": "نیمروز",
3936: "de": "Nimruz"
3937: }
3938: },
3939: {
3940: "field": "locality",
3941: "key": "qasreqand",
3942: "name": {
3943: "en": "Qasr-e Qand",
3944: "fa": "قصرقند",
3945: "de": "Qasr-e Qand"
3946: }
3947: },
3948: {
3949: "field": "locality",
3950: "key": "rask",
3951: "name": {
3952: "en": "Rask",
3953: "fa": "راسک",
3954: "de": "Rask"
3955: }
3956: },
3957: {
3958: "field": "locality",
3959: "key": "saravan",
3960: "name": {
3961: "en": "Saravan",
3962: "fa": "سراوان",
3963: "de": "Saravan"
3964: }
3965: },
3966: {
3967: "field": "locality",
3968: "key": "sarbaz",
3969: "name": {
3970: "en": "Sarbaz",
3971: "fa": "سرباز",
3972: "de": "Sarbaz"
3973: }
3974: },
3975: {
3976: "field": "locality",
3977: "key": "sibandsuran",
3978: "name": {
3979: "en": "Sib and Suran",
3980: "fa": "سیب و سوران",
3981: "de": "Sib and Suran"
3982: }
3983: },
3984: {
3985: "field": "locality",
3986: "key": "taftan",
3987: "name": {
3988: "en": "Taftan",
3989: "fa": "تفتان",
3990: "de": "Taftan"
3991: }
3992: },
3993: {
3994: "field": "locality",
3995: "key": "zabol",
3996: "name": {
3997: "en": "Zabol",
3998: "fa": "زابل",
3999: "de": "Zabol"
4000: }
4001: },
4002: {
4003: "field": "locality",
4004: "key": "zahedan",
4005: "name": {
4006: "en": "Zahedan",
4007: "fa": "زاهدان",
4008: "de": "Zahedan"
4009: }
4010: },
4011: {
4012: "field": "locality",
4013: "key": "zarabad",
4014: "name": {
4015: "en": "Zarabad",
4016: "fa": "زرآباد",
4017: "de": "Zarabad"
4018: }
4019: },
4020: {
4021: "field": "locality",
4022: "key": "zehak",
4023: "name": {
4024: "en": "Zehak",
4025: "fa": "زهک",
4026: "de": "Zehak"
4027: }
4028: }
4029: ]
4030: },
4031: {
4032: "countryCode": "IR",
4033: "field": "administrative_area",
4034: "key": "southkhorasan",
4035: "name": {
4036: "en": "South Khorasan",
4037: "fa": "خراسان جنوبی",
4038: "de": "Südchorasan"
4039: },
4040: "children": [
4041: {
4042: "field": "locality",
4043: "key": "birjand",
4044: "name": {
4045: "en": "Birjand",
4046: "fa": "بیرجند",
4047: "de": "Birjand"
4048: }
4049: },
4050: {
4051: "field": "locality",
4052: "key": "boshruyeh",
4053: "name": {
4054: "en": "Boshruyeh",
4055: "fa": "بشرویه",
4056: "de": "Boshruyeh"
4057: }
4058: },
4059: {
4060: "field": "locality",
4061: "key": "darmian",
4062: "name": {
4063: "en": "Darmian",
4064: "fa": "درمیان",
4065: "de": "Darmian"
4066: }
4067: },
4068: {
4069: "field": "locality",
4070: "key": "ferdows",
4071: "name": {
4072: "en": "Ferdows",
4073: "fa": "فردوس",
4074: "de": "Ferdows"
4075: }
4076: },
4077: {
4078: "field": "locality",
4079: "key": "khusf",
4080: "name": {
4081: "en": "Khusf",
4082: "fa": "خوسف",
4083: "de": "Khusf"
4084: }
4085: },
4086: {
4087: "field": "locality",
4088: "key": "nehbandan",
4089: "name": {
4090: "en": "Nehbandan",
4091: "fa": "نهبندان",
4092: "de": "Nehbandan"
4093: }
4094: },
4095: {
4096: "field": "locality",
4097: "key": "qaen",
4098: "name": {
4099: "en": "Qaen",
4100: "fa": "قائنات",
4101: "de": "Qaen"
4102: }
4103: },
4104: {
4105: "field": "locality",
4106: "key": "sarayan",
4107: "name": {
4108: "en": "Sarayan",
4109: "fa": "سرایان",
4110: "de": "Sarayan"
4111: }
4112: },
4113: {
4114: "field": "locality",
4115: "key": "sarbisheh",
4116: "name": {
4117: "en": "Sarbisheh",
4118: "fa": "سربیشه",
4119: "de": "Sarbisheh"
4120: }
4121: },
4122: {
4123: "field": "locality",
4124: "key": "tabas",
4125: "name": {
4126: "en": "Tabas",
4127: "fa": "طبس",
4128: "de": "Tabas"
4129: }
4130: },
4131: {
4132: "field": "locality",
4133: "key": "zirkuh",
4134: "name": {
4135: "en": "Zirkuh",
4136: "fa": "زیرکوه",
4137: "de": "Zirkuh"
4138: }
4139: }
4140: ]
4141: },
4142: {
4143: "countryCode": "IR",
4144: "field": "administrative_area",
4145: "key": "tehran",
4146: "name": {
4147: "en": "Tehran",
4148: "fa": "تهران",
4149: "de": "Teheran"
4150: },
4151: "children": [
4152: {
4153: "field": "locality",
4154: "key": "baharestan",
4155: "name": {
4156: "en": "Baharestan",
4157: "fa": "بهارستان",
4158: "de": "Baharestan"
4159: }
4160: },
4161: {
4162: "field": "locality",
4163: "key": "damavand",
4164: "name": {
4165: "en": "Damavand",
4166: "fa": "دماوند",
4167: "de": "Damavand"
4168: }
4169: },
4170: {
4171: "field": "locality",
4172: "key": "eslamshahr",
4173: "name": {
4174: "en": "Eslamshahr",
4175: "fa": "اسلامشهر",
4176: "de": "Eslamshahr"
4177: }
4178: },
4179: {
4180: "field": "locality",
4181: "key": "firuzkuh",
4182: "name": {
4183: "en": "Firuzkuh",
4184: "fa": "فیروزکوه",
4185: "de": "Firuzkuh"
4186: }
4187: },
4188: {
4189: "field": "locality",
4190: "key": "malard",
4191: "name": {
4192: "en": "Malard",
4193: "fa": "ملارد",
4194: "de": "Malard"
4195: }
4196: },
4197: {
4198: "field": "locality",
4199: "key": "pakdasht",
4200: "name": {
4201: "en": "Pakdasht",
4202: "fa": "پاکدشت",
4203: "de": "Pakdasht"
4204: }
4205: },
4206: {
4207: "field": "locality",
4208: "key": "pardis",
4209: "name": {
4210: "en": "Pardis",
4211: "fa": "پردیس",
4212: "de": "Pardis"
4213: }
4214: },
4215: {
4216: "field": "locality",
4217: "key": "pishva",
4218: "name": {
4219: "en": "Pishva",
4220: "fa": "پیشوا",
4221: "de": "Pishva"
4222: }
4223: },
4224: {
4225: "field": "locality",
4226: "key": "qarchak",
4227: "name": {
4228: "en": "Qarchak",
4229: "fa": "قرچک",
4230: "de": "Qarchak"
4231: }
4232: },
4233: {
4234: "field": "locality",
4235: "key": "qods",
4236: "name": {
4237: "en": "Qods",
4238: "fa": "قدس",
4239: "de": "Qods"
4240: }
4241: },
4242: {
4243: "field": "locality",
4244: "key": "ray",
4245: "name": {
4246: "en": "Ray",
4247: "fa": "ری",
4248: "de": "Ray"
4249: }
4250: },
4251: {
4252: "field": "locality",
4253: "key": "robatkarim",
4254: "name": {
4255: "en": "Robat Karim",
4256: "fa": "رباط‌کریم",
4257: "de": "Robat Karim"
4258: }
4259: },
4260: {
4261: "field": "locality",
4262: "key": "shahriar",
4263: "name": {
4264: "en": "Shahriar",
4265: "fa": "شهریار",
4266: "de": "Shahriar"
4267: }
4268: },
4269: {
4270: "field": "locality",
4271: "key": "shemiranat",
4272: "name": {
4273: "en": "Shemiranat",
4274: "fa": "شمیرانات",
4275: "de": "Shemiranat"
4276: }
4277: },
4278: {
4279: "field": "locality",
4280: "key": "tehran",
4281: "name": {
4282: "en": "Tehran",
4283: "fa": "تهران",
4284: "de": "Teheran"
4285: }
4286: },
4287: {
4288: "field": "locality",
4289: "key": "varamin",
4290: "name": {
4291: "en": "Varamin",
4292: "fa": "ورامین",
4293: "de": "Varamin"
4294: }
4295: }
4296: ]
4297: },
4298: {
4299: "countryCode": "IR",
4300: "field": "administrative_area",
4301: "key": "westazerbaijan",
4302: "name": {
4303: "en": "West Azerbaijan",
4304: "fa": "آذربایجان غربی",
4305: "de": "West-Aserbaidschan"
4306: },
4307: "children": [
4308: {
4309: "field": "locality",
4310: "key": "baruq",
4311: "name": {
4312: "en": "Baruq",
4313: "fa": "باروق",
4314: "de": "Baruq"
4315: }
4316: },
4317: {
4318: "field": "locality",
4319: "key": "bukan",
4320: "name": {
4321: "en": "Bukan",
4322: "fa": "بوکان",
4323: "de": "Bukan"
4324: }
4325: },
4326: {
4327: "field": "locality",
4328: "key": "chaharborj",
4329: "name": {
4330: "en": "Chaharborj",
4331: "fa": "چهاربرج",
4332: "de": "Chaharborj"
4333: }
4334: },
4335: {
4336: "field": "locality",
4337: "key": "chaldoran",
4338: "name": {
4339: "en": "Chaldoran",
4340: "fa": "چالدران",
4341: "de": "Chaldoran"
4342: }
4343: },
4344: {
4345: "field": "locality",
4346: "key": "chaypareh",
4347: "name": {
4348: "en": "Chaypareh",
4349: "fa": "چایپاره",
4350: "de": "Chaypareh"
4351: }
4352: },
4353: {
4354: "field": "locality",
4355: "key": "khoy",
4356: "name": {
4357: "en": "Khoy",
4358: "fa": "خوی",
4359: "de": "Khoy"
4360: }
4361: },
4362: {
4363: "field": "locality",
4364: "key": "mahabad",
4365: "name": {
4366: "en": "Mahabad",
4367: "fa": "مهاباد",
4368: "de": "Mahabad"
4369: }
4370: },
4371: {
4372: "field": "locality",
4373: "key": "maku",
4374: "name": {
4375: "en": "Maku",
4376: "fa": "ماکو",
4377: "de": "Maku"
4378: }
4379: },
4380: {
4381: "field": "locality",
4382: "key": "miandoab",
4383: "name": {
4384: "en": "Miandoab",
4385: "fa": "میاندوآب",
4386: "de": "Miandoab"
4387: }
4388: },
4389: {
4390: "field": "locality",
4391: "key": "mirabad",
4392: "name": {
4393: "en": "Mirabad",
4394: "fa": "میرآباد",
4395: "de": "Mirabad"
4396: }
4397: },
4398: {
4399: "field": "locality",
4400: "key": "naqadeh",
4401: "name": {
4402: "en": "Naqadeh",
4403: "fa": "نقده",
4404: "de": "Naqadeh"
4405: }
4406: },
4407: {
4408: "field": "locality",
4409: "key": "oshnavieh",
4410: "name": {
4411: "en": "Oshnavieh",
4412: "fa": "اشنویه",
4413: "de": "Oshnavieh"
4414: }
4415: },
4416: {
4417: "field": "locality",
4418: "key": "piranshahr",
4419: "name": {
4420: "en": "Piranshahr",
4421: "fa": "پیرانشهر",
4422: "de": "Piranshahr"
4423: }
4424: },
4425: {
4426: "field": "locality",
4427: "key": "poldasht",
4428: "name": {
4429: "en": "Poldasht",
4430: "fa": "پلدشت",
4431: "de": "Poldasht"
4432: }
4433: },
4434: {
4435: "field": "locality",
4436: "key": "salmas",
4437: "name": {
4438: "en": "Salmas",
4439: "fa": "سلماس",
4440: "de": "Salmas"
4441: }
4442: },
4443: {
4444: "field": "locality",
4445: "key": "sardasht",
4446: "name": {
4447: "en": "Sardasht",
4448: "fa": "سردشت",
4449: "de": "Sardasht"
4450: }
4451: },
4452: {
4453: "field": "locality",
4454: "key": "shahindezh",
4455: "name": {
4456: "en": "Shahin Dezh",
4457: "fa": "شاهین‌دژ",
4458: "de": "Shahin Dezh"
4459: }
4460: },
4461: {
4462: "field": "locality",
4463: "key": "showt",
4464: "name": {
4465: "en": "Showt",
4466: "fa": "شوط",
4467: "de": "Showt"
4468: }
4469: },
4470: {
4471: "field": "locality",
4472: "key": "takab",
4473: "name": {
4474: "en": "Takab",
4475: "fa": "تکاب",
4476: "de": "Takab"
4477: }
4478: },
4479: {
4480: "field": "locality",
4481: "key": "urmia",
4482: "name": {
4483: "en": "Urmia",
4484: "fa": "ارومیه",
4485: "de": "Urmia"
4486: }
4487: }
4488: ]
4489: },
4490: {
4491: "countryCode": "IR",
4492: "field": "administrative_area",
4493: "key": "yazd",
4494: "name": {
4495: "en": "Yazd",
4496: "fa": "یزد",
4497: "de": "Yazd"
4498: },
4499: "children": [
4500: {
4501: "field": "locality",
4502: "key": "abarkuh",
4503: "name": {
4504: "en": "Abarkuh",
4505: "fa": "ابرکوه",
4506: "de": "Abarkuh"
4507: }
4508: },
4509: {
4510: "field": "locality",
4511: "key": "ardakan",
4512: "name": {
4513: "en": "Ardakan",
4514: "fa": "اردکان",
4515: "de": "Ardakan"
4516: }
4517: },
4518: {
4519: "field": "locality",
4520: "key": "ashkezar",
4521: "name": {
4522: "en": "Ashkezar",
4523: "fa": "اشکذر",
4524: "de": "Ashkezar"
4525: }
4526: },
4527: {
4528: "field": "locality",
4529: "key": "bafq",
4530: "name": {
4531: "en": "Bafq",
4532: "fa": "بافق",
4533: "de": "Bafq"
4534: }
4535: },
4536: {
4537: "field": "locality",
4538: "key": "behabad",
4539: "name": {
4540: "en": "Behabad",
4541: "fa": "بهاباد",
4542: "de": "Behabad"
4543: }
4544: },
4545: {
4546: "field": "locality",
4547: "key": "khatam",
4548: "name": {
4549: "en": "Khatam",
4550: "fa": "خاتم",
4551: "de": "Khatam"
4552: }
4553: },
4554: {
4555: "field": "locality",
4556: "key": "marvast",
4557: "name": {
4558: "en": "Marvast",
4559: "fa": "مروست",
4560: "de": "Marvast"
4561: }
4562: },
4563: {
4564: "field": "locality",
4565: "key": "mehriz",
4566: "name": {
4567: "en": "Mehriz",
4568: "fa": "مهریز",
4569: "de": "Mehriz"
4570: }
4571: },
4572: {
4573: "field": "locality",
4574: "key": "meybod",
4575: "name": {
4576: "en": "Meybod",
4577: "fa": "میبد",
4578: "de": "Meybod"
4579: }
4580: },
4581: {
4582: "field": "locality",
4583: "key": "taft",
4584: "name": {
4585: "en": "Taft",
4586: "fa": "تفت",
4587: "de": "Taft"
4588: }
4589: },
4590: {
4591: "field": "locality",
4592: "key": "yazd",
4593: "name": {
4594: "en": "Yazd",
4595: "fa": "یزد",
4596: "de": "Yazd"
4597: }
4598: },
4599: {
4600: "field": "locality",
4601: "key": "zarach",
4602: "name": {
4603: "en": "Zarach",
4604: "fa": "زارچ",
4605: "de": "Zarach"
4606: }
4607: }
4608: ]
4609: },
4610: {
4611: "countryCode": "IR",
4612: "field": "administrative_area",
4613: "key": "zanjan",
4614: "name": {
4615: "en": "Zanjan",
4616: "fa": "زنجان",
4617: "de": "Zanjan"
4618: },
4619: "children": [
4620: {
4621: "field": "locality",
4622: "key": "abhar",
4623: "name": {
4624: "en": "Abhar",
4625: "fa": "ابهر",
4626: "de": "Abhar"
4627: }
4628: },
4629: {
4630: "field": "locality",
4631: "key": "ijrud",
4632: "name": {
4633: "en": "Ijrud",
4634: "fa": "ایجرود",
4635: "de": "Ijrud"
4636: }
4637: },
4638: {
4639: "field": "locality",
4640: "key": "khodabandeh",
4641: "name": {
4642: "en": "Khodabandeh",
4643: "fa": "خدابنده",
4644: "de": "Khodabandeh"
4645: }
4646: },
4647: {
4648: "field": "locality",
4649: "key": "khorramdarreh",
4650: "name": {
4651: "en": "Khorramdarreh",
4652: "fa": "خرمدره",
4653: "de": "Khorramdarreh"
4654: }
4655: },
4656: {
4657: "field": "locality",
4658: "key": "mahneshan",
4659: "name": {
4660: "en": "Mahneshan",
4661: "fa": "ماه‌نشان",
4662: "de": "Mahneshan"
4663: }
4664: },
4665: {
4666: "field": "locality",
4667: "key": "soltaniyeh",
4668: "name": {
4669: "en": "Soltaniyeh",
4670: "fa": "سلطانیه",
4671: "de": "Soltaniyeh"
4672: }
4673: },
4674: {
4675: "field": "locality",
4676: "key": "tarom",
4677: "name": {
4678: "en": "Tarom",
4679: "fa": "طارم",
4680: "de": "Tarom"
4681: }
4682: },
4683: {
4684: "field": "locality",
4685: "key": "zanjan",
4686: "name": {
4687: "en": "Zanjan",
4688: "fa": "زنجان",
4689: "de": "Zanjan"
4690: }
4691: }
4692: ]
4693: }
4694: ]
</file>
<file path="database/seeders/data/countries.seed.json">
1: [
2: {
3: "code": "IR",
4: "name": {
5: "en": "Iran",
6: "fa": "ایران",
7: "de": "Iran"
8: },
9: "phoneCode": "98",
10: "addressLabels": {
11: "administrativeArea": {
12: "en": "Province",
13: "fa": "استان",
14: "de": "Provinz"
15: },
16: "locality": {
17: "en": "County",
18: "fa": "شهرستان",
19: "de": "Landkreis"
20: },
21: "postalCode": {
22: "en": "Postal Code",
23: "fa": "کد پستی",
24: "de": "Postleitzahl"
25: }
26: }
27: },
28: {
29: "code": "TR",
30: "name": {
31: "en": "Turkey",
32: "fa": "ترکیه",
33: "de": "Türkei"
34: },
35: "phoneCode": "90"
36: },
37: {
38: "code": "SA",
39: "name": {
40: "en": "Saudi Arabia",
41: "fa": "عربستان سعودی",
42: "de": "Saudi-Arabien"
43: },
44: "phoneCode": "966"
45: },
46: {
47: "code": "AE",
48: "name": {
49: "en": "United Arab Emirates",
50: "fa": "امارات متحده عربی",
51: "de": "Vereinigte Arabische Emirate"
52: },
53: "phoneCode": "971"
54: },
55: {
56: "code": "IQ",
57: "name": {
58: "en": "Iraq",
59: "fa": "عراق",
60: "de": "Irak"
61: },
62: "phoneCode": "964"
63: },
64: {
65: "code": "AF",
66: "name": {
67: "en": "Afghanistan",
68: "fa": "افغانستان",
69: "de": "Afghanistan"
70: },
71: "phoneCode": "93"
72: },
73: {
74: "code": "PK",
75: "name": {
76: "en": "Pakistan",
77: "fa": "پاکستان",
78: "de": "Pakistan"
79: },
80: "phoneCode": "92"
81: },
82: {
83: "code": "KZ",
84: "name": {
85: "en": "Kazakhstan",
86: "fa": "قزاقستان",
87: "de": "Kasachstan"
88: },
89: "phoneCode": "7"
90: },
91: {
92: "code": "UZ",
93: "name": {
94: "en": "Uzbekistan",
95: "fa": "ازبکستان",
96: "de": "Usbekistan"
97: },
98: "phoneCode": "998"
99: },
100: {
101: "code": "TM",
102: "name": {
103: "en": "Turkmenistan",
104: "fa": "ترکمنستان",
105: "de": "Turkmenistan"
106: },
107: "phoneCode": "993"
108: },
109: {
110: "code": "TJ",
111: "name": {
112: "en": "Tajikistan",
113: "fa": "تاجیکستان",
114: "de": "Tadschikistan"
115: },
116: "phoneCode": "992"
117: },
118: {
119: "code": "KG",
120: "name": {
121: "en": "Kyrgyzstan",
122: "fa": "قرقیزستان",
123: "de": "Kirgisistan"
124: },
125: "phoneCode": "996"
126: },
127: {
128: "code": "US",
129: "name": {
130: "en": "United States",
131: "fa": "ایالات متحده آمریکا",
132: "de": "Vereinigte Staaten"
133: },
134: "phoneCode": "1"
135: },
136: {
137: "code": "CA",
138: "name": {
139: "en": "Canada",
140: "fa": "کانادا",
141: "de": "Kanada"
142: },
143: "phoneCode": "1"
144: },
145: {
146: "code": "MX",
147: "name": {
148: "en": "Mexico",
149: "fa": "مکزیک",
150: "de": "Mexiko"
151: },
152: "phoneCode": "52"
153: },
154: {
155: "code": "GB",
156: "name": {
157: "en": "United Kingdom",
158: "fa": "انگلستان",
159: "de": "Vereinigtes Königreich"
160: },
161: "phoneCode": "44"
162: },
163: {
164: "code": "DE",
165: "name": {
166: "en": "Germany",
167: "fa": "آلمان",
168: "de": "Deutschland"
169: },
170: "phoneCode": "49",
171: "addressLabels": {
172: "administrativeArea": {
173: "en": "State",
174: "fa": "ایالت",
175: "de": "Bundesland"
176: },
177: "locality": {
178: "en": "Ort",
179: "fa": "موقعیت مکانی (Ort)",
180: "de": "Ort"
181: },
182: "postalCode": {
183: "en": "PLZ Code",
184: "fa": "کد PLZ",
185: "de": "PLZ Code"
186: }
187: }
188: },
189: {
190: "code": "FR",
191: "name": {
192: "en": "France",
193: "fa": "فرانسه",
194: "de": "Frankreich"
195: },
196: "phoneCode": "33"
197: },
198: {
199: "code": "IT",
200: "name": {
201: "en": "Italy",
202: "fa": "ایتالیا",
203: "de": "Italien"
204: },
205: "phoneCode": "39"
206: },
207: {
208: "code": "ES",
209: "name": {
210: "en": "Spain",
211: "fa": "اسپانیا",
212: "de": "Spanien"
213: },
214: "phoneCode": "34"
215: },
216: {
217: "code": "NL",
218: "name": {
219: "en": "Netherlands",
220: "fa": "هلند",
221: "de": "Niederlande"
222: },
223: "phoneCode": "31"
224: },
225: {
226: "code": "SE",
227: "name": {
228: "en": "Sweden",
229: "fa": "سوئد",
230: "de": "Schweden"
231: },
232: "phoneCode": "46"
233: },
234: {
235: "code": "NO",
236: "name": {
237: "en": "Norway",
238: "fa": "نروژ",
239: "de": "Norwegen"
240: },
241: "phoneCode": "47"
242: },
243: {
244: "code": "DK",
245: "name": {
246: "en": "Denmark",
247: "fa": "دانمارک",
248: "de": "Dänemark"
249: },
250: "phoneCode": "45"
251: },
252: {
253: "code": "FI",
254: "name": {
255: "en": "Finland",
256: "fa": "فنلاند",
257: "de": "Finnland"
258: },
259: "phoneCode": "358"
260: },
261: {
262: "code": "CH",
263: "name": {
264: "en": "Switzerland",
265: "fa": "سوئیس",
266: "de": "Schweiz"
267: },
268: "phoneCode": "41"
269: },
270: {
271: "code": "AT",
272: "name": {
273: "en": "Austria",
274: "fa": "اتریش",
275: "de": "Österreich"
276: },
277: "phoneCode": "43"
278: },
279: {
280: "code": "BE",
281: "name": {
282: "en": "Belgium",
283: "fa": "بلژیک",
284: "de": "Belgien"
285: },
286: "phoneCode": "32"
287: },
288: {
289: "code": "PL",
290: "name": {
291: "en": "Poland",
292: "fa": "لهستان",
293: "de": "Polen"
294: },
295: "phoneCode": "48"
296: },
297: {
298: "code": "RU",
299: "name": {
300: "en": "Russia",
301: "fa": "روسیه",
302: "de": "Russland"
303: },
304: "phoneCode": "7"
305: },
306: {
307: "code": "UA",
308: "name": {
309: "en": "Ukraine",
310: "fa": "اوکراین",
311: "de": "Ukraine"
312: },
313: "phoneCode": "380"
314: },
315: {
316: "code": "CZ",
317: "name": {
318: "en": "Czech Republic",
319: "fa": "جمهوری چک",
320: "de": "Tschechien"
321: },
322: "phoneCode": "420"
323: },
324: {
325: "code": "HU",
326: "name": {
327: "en": "Hungary",
328: "fa": "مجارستان",
329: "de": "Ungarn"
330: },
331: "phoneCode": "36"
332: },
333: {
334: "code": "RO",
335: "name": {
336: "en": "Romania",
337: "fa": "رومانی",
338: "de": "Rumänien"
339: },
340: "phoneCode": "40"
341: },
342: {
343: "code": "BG",
344: "name": {
345: "en": "Bulgaria",
346: "fa": "بلغارستان",
347: "de": "Bulgarien"
348: },
349: "phoneCode": "359"
350: },
351: {
352: "code": "GR",
353: "name": {
354: "en": "Greece",
355: "fa": "یونان",
356: "de": "Griechenland"
357: },
358: "phoneCode": "30"
359: },
360: {
361: "code": "PT",
362: "name": {
363: "en": "Portugal",
364: "fa": "پرتغال",
365: "de": "Portugal"
366: },
367: "phoneCode": "351"
368: },
369: {
370: "code": "IE",
371: "name": {
372: "en": "Ireland",
373: "fa": "ایرلند",
374: "de": "Irland"
375: },
376: "phoneCode": "353"
377: },
378: {
379: "code": "AU",
380: "name": {
381: "en": "Australia",
382: "fa": "استرالیا",
383: "de": "Australien"
384: },
385: "phoneCode": "61"
386: },
387: {
388: "code": "NZ",
389: "name": {
390: "en": "New Zealand",
391: "fa": "نیوزیلند",
392: "de": "Neuseeland"
393: },
394: "phoneCode": "64"
395: },
396: {
397: "code": "JP",
398: "name": {
399: "en": "Japan",
400: "fa": "ژاپن",
401: "de": "Japan"
402: },
403: "phoneCode": "81"
404: },
405: {
406: "code": "KR",
407: "name": {
408: "en": "South Korea",
409: "fa": "کره جنوبی",
410: "de": "Südkorea"
411: },
412: "phoneCode": "82"
413: },
414: {
415: "code": "CN",
416: "name": {
417: "en": "China",
418: "fa": "چین",
419: "de": "China"
420: },
421: "phoneCode": "86"
422: },
423: {
424: "code": "IN",
425: "name": {
426: "en": "India",
427: "fa": "هند",
428: "de": "Indien"
429: },
430: "phoneCode": "91"
431: },
432: {
433: "code": "TH",
434: "name": {
435: "en": "Thailand",
436: "fa": "تایلند",
437: "de": "Thailand"
438: },
439: "phoneCode": "66"
440: },
441: {
442: "code": "VN",
443: "name": {
444: "en": "Vietnam",
445: "fa": "ویتنام",
446: "de": "Vietnam"
447: },
448: "phoneCode": "84"
449: },
450: {
451: "code": "MY",
452: "name": {
453: "en": "Malaysia",
454: "fa": "مالزی",
455: "de": "Malaysia"
456: },
457: "phoneCode": "60"
458: },
459: {
460: "code": "SG",
461: "name": {
462: "en": "Singapore",
463: "fa": "سنگاپور",
464: "de": "Singapur"
465: },
466: "phoneCode": "65"
467: },
468: {
469: "code": "ID",
470: "name": {
471: "en": "Indonesia",
472: "fa": "اندونزی",
473: "de": "Indonesien"
474: },
475: "phoneCode": "62"
476: },
477: {
478: "code": "PH",
479: "name": {
480: "en": "Philippines",
481: "fa": "فیلیپین",
482: "de": "Philippinen"
483: },
484: "phoneCode": "63"
485: },
486: {
487: "code": "BD",
488: "name": {
489: "en": "Bangladesh",
490: "fa": "بنگلادش",
491: "de": "Bangladesch"
492: },
493: "phoneCode": "880"
494: },
495: {
496: "code": "LK",
497: "name": {
498: "en": "Sri Lanka",
499: "fa": "سری‌لانکا",
500: "de": "Sri Lanka"
501: },
502: "phoneCode": "94"
503: },
504: {
505: "code": "NP",
506: "name": {
507: "en": "Nepal",
508: "fa": "نپال",
509: "de": "Nepal"
510: },
511: "phoneCode": "977"
512: },
513: {
514: "code": "BT",
515: "name": {
516: "en": "Bhutan",
517: "fa": "بوتان",
518: "de": "Bhutan"
519: },
520: "phoneCode": "975"
521: },
522: {
523: "code": "MV",
524: "name": {
525: "en": "Maldives",
526: "fa": "مالدیو",
527: "de": "Malediven"
528: },
529: "phoneCode": "960"
530: },
531: {
532: "code": "BR",
533: "name": {
534: "en": "Brazil",
535: "fa": "برزیل",
536: "de": "Brasilien"
537: },
538: "phoneCode": "55"
539: },
540: {
541: "code": "AR",
542: "name": {
543: "en": "Argentina",
544: "fa": "آرژانتین",
545: "de": "Argentinien"
546: },
547: "phoneCode": "54"
548: },
549: {
550: "code": "CL",
551: "name": {
552: "en": "Chile",
553: "fa": "شیلی",
554: "de": "Chile"
555: },
556: "phoneCode": "56"
557: },
558: {
559: "code": "CO",
560: "name": {
561: "en": "Colombia",
562: "fa": "کلمبیا",
563: "de": "Kolumbien"
564: },
565: "phoneCode": "57"
566: },
567: {
568: "code": "PE",
569: "name": {
570: "en": "Peru",
571: "fa": "پرو",
572: "de": "Peru"
573: },
574: "phoneCode": "51"
575: },
576: {
577: "code": "VE",
578: "name": {
579: "en": "Venezuela",
580: "fa": "ونزوئلا",
581: "de": "Venezuela"
582: },
583: "phoneCode": "58"
584: },
585: {
586: "code": "EC",
587: "name": {
588: "en": "Ecuador",
589: "fa": "اکوادور",
590: "de": "Ecuador"
591: },
592: "phoneCode": "593"
593: },
594: {
595: "code": "BO",
596: "name": {
597: "en": "Bolivia",
598: "fa": "بولیوی",
599: "de": "Bolivien"
600: },
601: "phoneCode": "591"
602: },
603: {
604: "code": "PY",
605: "name": {
606: "en": "Paraguay",
607: "fa": "پاراگوئه",
608: "de": "Paraguay"
609: },
610: "phoneCode": "595"
611: },
612: {
613: "code": "UY",
614: "name": {
615: "en": "Uruguay",
616: "fa": "اروگوئه",
617: "de": "Uruguay"
618: },
619: "phoneCode": "598"
620: },
621: {
622: "code": "GY",
623: "name": {
624: "en": "Guyana",
625: "fa": "گویان",
626: "de": "Guyana"
627: },
628: "phoneCode": "592"
629: },
630: {
631: "code": "SR",
632: "name": {
633: "en": "Suriname",
634: "fa": "سورینام",
635: "de": "Suriname"
636: },
637: "phoneCode": "597"
638: },
639: {
640: "code": "ZA",
641: "name": {
642: "en": "South Africa",
643: "fa": "آفریقای جنوبی",
644: "de": "Südafrika"
645: },
646: "phoneCode": "27"
647: },
648: {
649: "code": "NG",
650: "name": {
651: "en": "Nigeria",
652: "fa": "نیجریه",
653: "de": "Nigeria"
654: },
655: "phoneCode": "234"
656: },
657: {
658: "code": "KE",
659: "name": {
660: "en": "Kenya",
661: "fa": "کنیا",
662: "de": "Kenia"
663: },
664: "phoneCode": "254"
665: },
666: {
667: "code": "MA",
668: "name": {
669: "en": "Morocco",
670: "fa": "مراکش",
671: "de": "Marokko"
672: },
673: "phoneCode": "212"
674: },
675: {
676: "code": "TN",
677: "name": {
678: "en": "Tunisia",
679: "fa": "تونس",
680: "de": "Tunesien"
681: },
682: "phoneCode": "216"
683: },
684: {
685: "code": "DZ",
686: "name": {
687: "en": "Algeria",
688: "fa": "الجزایر",
689: "de": "Algerien"
690: },
691: "phoneCode": "213"
692: },
693: {
694: "code": "LY",
695: "name": {
696: "en": "Libya",
697: "fa": "لیبی",
698: "de": "Libyen"
699: },
700: "phoneCode": "218"
701: },
702: {
703: "code": "EG",
704: "name": {
705: "en": "Egypt",
706: "fa": "مصر",
707: "de": "Ägypten"
708: },
709: "phoneCode": "20"
710: },
711: {
712: "code": "SD",
713: "name": {
714: "en": "Sudan",
715: "fa": "سودان",
716: "de": "Sudan"
717: },
718: "phoneCode": "249"
719: },
720: {
721: "code": "ET",
722: "name": {
723: "en": "Ethiopia",
724: "fa": "اتیوپی",
725: "de": "Äthiopien"
726: },
727: "phoneCode": "251"
728: },
729: {
730: "code": "GH",
731: "name": {
732: "en": "Ghana",
733: "fa": "غنا",
734: "de": "Ghana"
735: },
736: "phoneCode": "233"
737: },
738: {
739: "code": "UG",
740: "name": {
741: "en": "Uganda",
742: "fa": "اوگاندا",
743: "de": "Uganda"
744: },
745: "phoneCode": "256"
746: },
747: {
748: "code": "TZ",
749: "name": {
750: "en": "Tanzania",
751: "fa": "تانزانیا",
752: "de": "Tansania"
753: },
754: "phoneCode": "255"
755: },
756: {
757: "code": "ZW",
758: "name": {
759: "en": "Zimbabwe",
760: "fa": "زیمبابوه",
761: "de": "Simbabwe"
762: },
763: "phoneCode": "263"
764: },
765: {
766: "code": "BW",
767: "name": {
768: "en": "Botswana",
769: "fa": "بوتسوانا",
770: "de": "Botswana"
771: },
772: "phoneCode": "267"
773: },
774: {
775: "code": "NA",
776: "name": {
777: "en": "Namibia",
778: "fa": "نامیبیا",
779: "de": "Namibia"
780: },
781: "phoneCode": "264"
782: },
783: {
784: "code": "ZM",
785: "name": {
786: "en": "Zambia",
787: "fa": "زامبیا",
788: "de": "Sambia"
789: },
790: "phoneCode": "260"
791: },
792: {
793: "code": "MW",
794: "name": {
795: "en": "Malawi",
796: "fa": "مالاوی",
797: "de": "Malawi"
798: },
799: "phoneCode": "265"
800: },
801: {
802: "code": "MZ",
803: "name": {
804: "en": "Mozambique",
805: "fa": "موزامبیک",
806: "de": "Mosambik"
807: },
808: "phoneCode": "258"
809: },
810: {
811: "code": "MG",
812: "name": {
813: "en": "Madagascar",
814: "fa": "ماداگاسکار",
815: "de": "Madagaskar"
816: },
817: "phoneCode": "261"
818: },
819: {
820: "code": "MU",
821: "name": {
822: "en": "Mauritius",
823: "fa": "موریس",
824: "de": "Mauritius"
825: },
826: "phoneCode": "230"
827: },
828: {
829: "code": "SC",
830: "name": {
831: "en": "Seychelles",
832: "fa": "سیشل",
833: "de": "Seychellen"
834: },
835: "phoneCode": "248"
836: },
837: {
838: "code": "RE",
839: "name": {
840: "en": "Réunion",
841: "fa": "رئونیون",
842: "de": "Réunion"
843: },
844: "phoneCode": "262"
845: },
846: {
847: "code": "YT",
848: "name": {
849: "en": "Mayotte",
850: "fa": "مایوت",
851: "de": "Mayotte"
852: },
853: "phoneCode": "262"
854: },
855: {
856: "code": "KM",
857: "name": {
858: "en": "Comoros",
859: "fa": "کومور",
860: "de": "Komoren"
861: },
862: "phoneCode": "269"
863: },
864: {
865: "code": "DJ",
866: "name": {
867: "en": "Djibouti",
868: "fa": "جیبوتی",
869: "de": "Dschibuti"
870: },
871: "phoneCode": "253"
872: },
873: {
874: "code": "SO",
875: "name": {
876: "en": "Somalia",
877: "fa": "سومالی",
878: "de": "Somalia"
879: },
880: "phoneCode": "252"
881: },
882: {
883: "code": "ER",
884: "name": {
885: "en": "Eritrea",
886: "fa": "اریتره",
887: "de": "Eritrea"
888: },
889: "phoneCode": "291"
890: },
891: {
892: "code": "SS",
893: "name": {
894: "en": "South Sudan",
895: "fa": "سودان جنوبی",
896: "de": "Südsudan"
897: },
898: "phoneCode": "211"
899: },
900: {
901: "code": "CF",
902: "name": {
903: "en": "Central African Republic",
904: "fa": "جمهوری آفریقای مرکزی",
905: "de": "Zentralafrikanische Republik"
906: },
907: "phoneCode": "236"
908: },
909: {
910: "code": "TD",
911: "name": {
912: "en": "Chad",
913: "fa": "چاد",
914: "de": "Tschad"
915: },
916: "phoneCode": "235"
917: },
918: {
919: "code": "NE",
920: "name": {
921: "en": "Niger",
922: "fa": "نیجر",
923: "de": "Niger"
924: },
925: "phoneCode": "227"
926: },
927: {
928: "code": "ML",
929: "name": {
930: "en": "Mali",
931: "fa": "مالی",
932: "de": "Mali"
933: },
934: "phoneCode": "223"
935: },
936: {
937: "code": "BF",
938: "name": {
939: "en": "Burkina Faso",
940: "fa": "بورکینافاسو",
941: "de": "Burkina Faso"
942: },
943: "phoneCode": "226"
944: },
945: {
946: "code": "CI",
947: "name": {
948: "en": "Côte d'Ivoire",
949: "fa": "ساحل عاج",
950: "de": "Elfenbeinküste"
951: },
952: "phoneCode": "225"
953: },
954: {
955: "code": "LR",
956: "name": {
957: "en": "Liberia",
958: "fa": "لیبریا",
959: "de": "Liberia"
960: },
961: "phoneCode": "231"
962: },
963: {
964: "code": "SL",
965: "name": {
966: "en": "Sierra Leone",
967: "fa": "سیرالئون",
968: "de": "Sierra Leone"
969: },
970: "phoneCode": "232"
971: },
972: {
973: "code": "GN",
974: "name": {
975: "en": "Guinea",
976: "fa": "گینه",
977: "de": "Guinea"
978: },
979: "phoneCode": "224"
980: },
981: {
982: "code": "GW",
983: "name": {
984: "en": "Guinea-Bissau",
985: "fa": "گینه بیسائو",
986: "de": "Guinea-Bissau"
987: },
988: "phoneCode": "245"
989: },
990: {
991: "code": "GM",
992: "name": {
993: "en": "Gambia",
994: "fa": "گامبیا",
995: "de": "Gambia"
996: },
997: "phoneCode": "220"
998: },
999: {
1000: "code": "SN",
1001: "name": {
1002: "en": "Senegal",
1003: "fa": "سنگال",
1004: "de": "Senegal"
1005: },
1006: "phoneCode": "221"
1007: },
1008: {
1009: "code": "MR",
1010: "name": {
1011: "en": "Mauritania",
1012: "fa": "موریتانی",
1013: "de": "Mauretanien"
1014: },
1015: "phoneCode": "222"
1016: },
1017: {
1018: "code": "CV",
1019: "name": {
1020: "en": "Cape Verde",
1021: "fa": "کیپ‌ورد",
1022: "de": "Kap Verde"
1023: },
1024: "phoneCode": "238"
1025: },
1026: {
1027: "code": "ST",
1028: "name": {
1029: "en": "São Tomé and Príncipe",
1030: "fa": "سائوتومه و پرنسیپ",
1031: "de": "São Tomé und Príncipe"
1032: },
1033: "phoneCode": "239"
1034: },
1035: {
1036: "code": "GQ",
1037: "name": {
1038: "en": "Equatorial Guinea",
1039: "fa": "گینه استوایی",
1040: "de": "Äquatorialguinea"
1041: },
1042: "phoneCode": "240"
1043: },
1044: {
1045: "code": "GA",
1046: "name": {
1047: "en": "Gabon",
1048: "fa": "گابن",
1049: "de": "Gabun"
1050: },
1051: "phoneCode": "241"
1052: },
1053: {
1054: "code": "CG",
1055: "name": {
1056: "en": "Republic of the Congo",
1057: "fa": "جمهوری کنگو",
1058: "de": "Republik Kongo"
1059: },
1060: "phoneCode": "242"
1061: },
1062: {
1063: "code": "CD",
1064: "name": {
1065: "en": "Democratic Republic of the Congo",
1066: "fa": "جمهوری دموکراتیک کنگو",
1067: "de": "Demokratische Republik Kongo"
1068: },
1069: "phoneCode": "243"
1070: },
1071: {
1072: "code": "AO",
1073: "name": {
1074: "en": "Angola",
1075: "fa": "آنگولا",
1076: "de": "Angola"
1077: },
1078: "phoneCode": "244"
1079: },
1080: {
1081: "code": "CM",
1082: "name": {
1083: "en": "Cameroon",
1084: "fa": "کامرون",
1085: "de": "Kamerun"
1086: },
1087: "phoneCode": "237"
1088: },
1089: {
1090: "code": "BI",
1091: "name": {
1092: "en": "Burundi",
1093: "fa": "بوروندی",
1094: "de": "Burundi"
1095: },
1096: "phoneCode": "257"
1097: },
1098: {
1099: "code": "RW",
1100: "name": {
1101: "en": "Rwanda",
1102: "fa": "رواندا",
1103: "de": "Ruanda"
1104: },
1105: "phoneCode": "250"
1106: },
1107: {
1108: "code": "LS",
1109: "name": {
1110: "en": "Lesotho",
1111: "fa": "لسوتو",
1112: "de": "Lesotho"
1113: },
1114: "phoneCode": "266"
1115: },
1116: {
1117: "code": "SZ",
1118: "name": {
1119: "en": "Eswatini",
1120: "fa": "اسواتینی",
1121: "de": "Eswatini"
1122: },
1123: "phoneCode": "268"
1124: },
1125: {
1126: "code": "GT",
1127: "name": {
1128: "en": "Guatemala",
1129: "fa": "گواتمالا",
1130: "de": "Guatemala"
1131: },
1132: "phoneCode": "502"
1133: },
1134: {
1135: "code": "HN",
1136: "name": {
1137: "en": "Honduras",
1138: "fa": "هندوراس",
1139: "de": "Honduras"
1140: },
1141: "phoneCode": "504"
1142: },
1143: {
1144: "code": "SV",
1145: "name": {
1146: "en": "El Salvador",
1147: "fa": "السالوادور",
1148: "de": "El Salvador"
1149: },
1150: "phoneCode": "503"
1151: },
1152: {
1153: "code": "NI",
1154: "name": {
1155: "en": "Nicaragua",
1156: "fa": "نیکاراگوئه",
1157: "de": "Nicaragua"
1158: },
1159: "phoneCode": "505"
1160: },
1161: {
1162: "code": "CR",
1163: "name": {
1164: "en": "Costa Rica",
1165: "fa": "کاستاریکا",
1166: "de": "Costa Rica"
1167: },
1168: "phoneCode": "506"
1169: },
1170: {
1171: "code": "PA",
1172: "name": {
1173: "en": "Panama",
1174: "fa": "پاناما",
1175: "de": "Panama"
1176: },
1177: "phoneCode": "507"
1178: },
1179: {
1180: "code": "BZ",
1181: "name": {
1182: "en": "Belize",
1183: "fa": "بلیز",
1184: "de": "Belize"
1185: },
1186: "phoneCode": "501"
1187: },
1188: {
1189: "code": "CU",
1190: "name": {
1191: "en": "Cuba",
1192: "fa": "کوبا",
1193: "de": "Kuba"
1194: },
1195: "phoneCode": "53"
1196: },
1197: {
1198: "code": "JM",
1199: "name": {
1200: "en": "Jamaica",
1201: "fa": "جامائیکا",
1202: "de": "Jamaika"
1203: },
1204: "phoneCode": "1"
1205: },
1206: {
1207: "code": "DO",
1208: "name": {
1209: "en": "Dominican Republic",
1210: "fa": "جمهوری دومینیکن",
1211: "de": "Dominikanische Republik"
1212: },
1213: "phoneCode": "1"
1214: },
1215: {
1216: "code": "HT",
1217: "name": {
1218: "en": "Haiti",
1219: "fa": "هائیتی",
1220: "de": "Haiti"
1221: },
1222: "phoneCode": "509"
1223: },
1224: {
1225: "code": "BS",
1226: "name": {
1227: "en": "Bahamas",
1228: "fa": "باهاما",
1229: "de": "Bahamas"
1230: },
1231: "phoneCode": "1"
1232: },
1233: {
1234: "code": "TT",
1235: "name": {
1236: "en": "Trinidad and Tobago",
1237: "fa": "ترینیداد و توباگو",
1238: "de": "Trinidad und Tobago"
1239: },
1240: "phoneCode": "1"
1241: },
1242: {
1243: "code": "BB",
1244: "name": {
1245: "en": "Barbados",
1246: "fa": "باربادوس",
1247: "de": "Barbados"
1248: },
1249: "phoneCode": "1"
1250: },
1251: {
1252: "code": "GD",
1253: "name": {
1254: "en": "Grenada",
1255: "fa": "گرنادا",
1256: "de": "Grenada"
1257: },
1258: "phoneCode": "1"
1259: },
1260: {
1261: "code": "LC",
1262: "name": {
1263: "en": "Saint Lucia",
1264: "fa": "سنت لوسیا",
1265: "de": "St. Lucia"
1266: },
1267: "phoneCode": "1"
1268: },
1269: {
1270: "code": "VC",
1271: "name": {
1272: "en": "Saint Vincent and the Grenadines",
1273: "fa": "سنت وینسنت و گرنادین‌ها",
1274: "de": "St. Vincent und die Grenadinen"
1275: },
1276: "phoneCode": "1"
1277: },
1278: {
1279: "code": "AG",
1280: "name": {
1281: "en": "Antigua and Barbuda",
1282: "fa": "آنتیگوا و باربودا",
1283: "de": "Antigua und Barbuda"
1284: },
1285: "phoneCode": "1"
1286: },
1287: {
1288: "code": "DM",
1289: "name": {
1290: "en": "Dominica",
1291: "fa": "دومینیکا",
1292: "de": "Dominica"
1293: },
1294: "phoneCode": "1"
1295: },
1296: {
1297: "code": "KN",
1298: "name": {
1299: "en": "Saint Kitts and Nevis",
1300: "fa": "سنت کیتس و نویس",
1301: "de": "St. Kitts und Nevis"
1302: },
1303: "phoneCode": "1"
1304: },
1305: {
1306: "code": "FJ",
1307: "name": {
1308: "en": "Fiji",
1309: "fa": "فیجی",
1310: "de": "Fidschi"
1311: },
1312: "phoneCode": "679"
1313: },
1314: {
1315: "code": "PG",
1316: "name": {
1317: "en": "Papua New Guinea",
1318: "fa": "پاپوآ گینه نو",
1319: "de": "Papua-Neuguinea"
1320: },
1321: "phoneCode": "675"
1322: },
1323: {
1324: "code": "WS",
1325: "name": {
1326: "en": "Samoa",
1327: "fa": "ساموآ",
1328: "de": "Samoa"
1329: },
1330: "phoneCode": "685"
1331: },
1332: {
1333: "code": "TO",
1334: "name": {
1335: "en": "Tonga",
1336: "fa": "تونگا",
1337: "de": "Tonga"
1338: },
1339: "phoneCode": "676"
1340: },
1341: {
1342: "code": "VU",
1343: "name": {
1344: "en": "Vanuatu",
1345: "fa": "وانواتو",
1346: "de": "Vanuatu"
1347: },
1348: "phoneCode": "678"
1349: },
1350: {
1351: "code": "SB",
1352: "name": {
1353: "en": "Solomon Islands",
1354: "fa": "جزایر سلیمان",
1355: "de": "Salomonen"
1356: },
1357: "phoneCode": "677"
1358: },
1359: {
1360: "code": "KI",
1361: "name": {
1362: "en": "Kiribati",
1363: "fa": "کیریباتی",
1364: "de": "Kiribati"
1365: },
1366: "phoneCode": "686"
1367: },
1368: {
1369: "code": "FM",
1370: "name": {
1371: "en": "Micronesia",
1372: "fa": "میکرونزی",
1373: "de": "Mikronesien"
1374: },
1375: "phoneCode": "691"
1376: },
1377: {
1378: "code": "MH",
1379: "name": {
1380: "en": "Marshall Islands",
1381: "fa": "جزایر مارشال",
1382: "de": "Marshallinseln"
1383: },
1384: "phoneCode": "692"
1385: },
1386: {
1387: "code": "PW",
1388: "name": {
1389: "en": "Palau",
1390: "fa": "پالائو",
1391: "de": "Palau"
1392: },
1393: "phoneCode": "680"
1394: },
1395: {
1396: "code": "NR",
1397: "name": {
1398: "en": "Nauru",
1399: "fa": "نائورو",
1400: "de": "Nauru"
1401: },
1402: "phoneCode": "674"
1403: },
1404: {
1405: "code": "TV",
1406: "name": {
1407: "en": "Tuvalu",
1408: "fa": "تووالو",
1409: "de": "Tuvalu"
1410: },
1411: "phoneCode": "688"
1412: },
1413: {
1414: "code": "RS",
1415: "name": {
1416: "en": "Serbia",
1417: "fa": "صربستان",
1418: "de": "Serbien"
1419: },
1420: "phoneCode": "381"
1421: },
1422: {
1423: "code": "HR",
1424: "name": {
1425: "en": "Croatia",
1426: "fa": "کرواسی",
1427: "de": "Kroatien"
1428: },
1429: "phoneCode": "385"
1430: },
1431: {
1432: "code": "BA",
1433: "name": {
1434: "en": "Bosnia and Herzegovina",
1435: "fa": "بوسنی و هرزگوین",
1436: "de": "Bosnien und Herzegowina"
1437: },
1438: "phoneCode": "387"
1439: },
1440: {
1441: "code": "SI",
1442: "name": {
1443: "en": "Slovenia",
1444: "fa": "اسلوونی",
1445: "de": "Slowenien"
1446: },
1447: "phoneCode": "386"
1448: },
1449: {
1450: "code": "SK",
1451: "name": {
1452: "en": "Slovakia",
1453: "fa": "اسلواکی",
1454: "de": "Slowakei"
1455: },
1456: "phoneCode": "421"
1457: },
1458: {
1459: "code": "AL",
1460: "name": {
1461: "en": "Albania",
1462: "fa": "آلبانی",
1463: "de": "Albanien"
1464: },
1465: "phoneCode": "355"
1466: },
1467: {
1468: "code": "MK",
1469: "name": {
1470: "en": "North Macedonia",
1471: "fa": "مقدونیه شمالی",
1472: "de": "Nordmazedonien"
1473: },
1474: "phoneCode": "389"
1475: },
1476: {
1477: "code": "ME",
1478: "name": {
1479: "en": "Montenegro",
1480: "fa": "مونته‌نگرو",
1481: "de": "Montenegro"
1482: },
1483: "phoneCode": "382"
1484: },
1485: {
1486: "code": "XK",
1487: "name": {
1488: "en": "Kosovo",
1489: "fa": "کوزوو",
1490: "de": "Kosovo"
1491: },
1492: "phoneCode": "383"
1493: },
1494: {
1495: "code": "EE",
1496: "name": {
1497: "en": "Estonia",
1498: "fa": "استونی",
1499: "de": "Estland"
1500: },
1501: "phoneCode": "372"
1502: },
1503: {
1504: "code": "LV",
1505: "name": {
1506: "en": "Latvia",
1507: "fa": "لتونی",
1508: "de": "Lettland"
1509: },
1510: "phoneCode": "371"
1511: },
1512: {
1513: "code": "LT",
1514: "name": {
1515: "en": "Lithuania",
1516: "fa": "لیتوانی",
1517: "de": "Litauen"
1518: },
1519: "phoneCode": "370"
1520: },
1521: {
1522: "code": "GE",
1523: "name": {
1524: "en": "Georgia",
1525: "fa": "گرجستان",
1526: "de": "Georgien"
1527: },
1528: "phoneCode": "995"
1529: },
1530: {
1531: "code": "AM",
1532: "name": {
1533: "en": "Armenia",
1534: "fa": "ارمنستان",
1535: "de": "Armenien"
1536: },
1537: "phoneCode": "374"
1538: },
1539: {
1540: "code": "AZ",
1541: "name": {
1542: "en": "Azerbaijan",
1543: "fa": "آذربایجان",
1544: "de": "Aserbaidschan"
1545: },
1546: "phoneCode": "994"
1547: },
1548: {
1549: "code": "YE",
1550: "name": {
1551: "en": "Yemen",
1552: "fa": "یمن",
1553: "de": "Jemen"
1554: },
1555: "phoneCode": "967"
1556: },
1557: {
1558: "code": "OM",
1559: "name": {
1560: "en": "Oman",
1561: "fa": "عمان",
1562: "de": "Oman"
1563: },
1564: "phoneCode": "968"
1565: },
1566: {
1567: "code": "QA",
1568: "name": {
1569: "en": "Qatar",
1570: "fa": "قطر",
1571: "de": "Katar"
1572: },
1573: "phoneCode": "974"
1574: },
1575: {
1576: "code": "KW",
1577: "name": {
1578: "en": "Kuwait",
1579: "fa": "کویت",
1580: "de": "Kuwait"
1581: },
1582: "phoneCode": "965"
1583: },
1584: {
1585: "code": "BH",
1586: "name": {
1587: "en": "Bahrain",
1588: "fa": "بحرین",
1589: "de": "Bahrain"
1590: },
1591: "phoneCode": "973"
1592: },
1593: {
1594: "code": "JO",
1595: "name": {
1596: "en": "Jordan",
1597: "fa": "اردن",
1598: "de": "Jordanien"
1599: },
1600: "phoneCode": "962"
1601: },
1602: {
1603: "code": "LB",
1604: "name": {
1605: "en": "Lebanon",
1606: "fa": "لبنان",
1607: "de": "Libanon"
1608: },
1609: "phoneCode": "961"
1610: },
1611: {
1612: "code": "SY",
1613: "name": {
1614: "en": "Syria",
1615: "fa": "سوریه",
1616: "de": "Syrien"
1617: },
1618: "phoneCode": "963"
1619: },
1620: {
1621: "code": "PS",
1622: "name": {
1623: "en": "Palestine",
1624: "fa": "فلسطین",
1625: "de": "Palästina"
1626: },
1627: "phoneCode": "970"
1628: },
1629: {
1630: "code": "IL",
1631: "name": {
1632: "en": "Israel",
1633: "fa": "اسرائیل",
1634: "de": "Israel"
1635: },
1636: "phoneCode": "972"
1637: },
1638: {
1639: "code": "CY",
1640: "name": {
1641: "en": "Cyprus",
1642: "fa": "قبرس",
1643: "de": "Zypern"
1644: },
1645: "phoneCode": "357"
1646: },
1647: {
1648: "code": "IS",
1649: "name": {
1650: "en": "Iceland",
1651: "fa": "ایسلند",
1652: "de": "Island"
1653: },
1654: "phoneCode": "354"
1655: },
1656: {
1657: "code": "LU",
1658: "name": {
1659: "en": "Luxembourg",
1660: "fa": "لوکزامبورگ",
1661: "de": "Luxemburg"
1662: },
1663: "phoneCode": "352"
1664: },
1665: {
1666: "code": "MT",
1667: "name": {
1668: "en": "Malta",
1669: "fa": "مالت",
1670: "de": "Malta"
1671: },
1672: "phoneCode": "356"
1673: },
1674: {
1675: "code": "MC",
1676: "name": {
1677: "en": "Monaco",
1678: "fa": "موناکو",
1679: "de": "Monaco"
1680: },
1681: "phoneCode": "377"
1682: },
1683: {
1684: "code": "SM",
1685: "name": {
1686: "en": "San Marino",
1687: "fa": "سان مارینو",
1688: "de": "San Marino"
1689: },
1690: "phoneCode": "378"
1691: },
1692: {
1693: "code": "VA",
1694: "name": {
1695: "en": "Vatican City",
1696: "fa": "واتیکان",
1697: "de": "Vatikanstadt"
1698: },
1699: "phoneCode": "379"
1700: },
1701: {
1702: "code": "AD",
1703: "name": {
1704: "en": "Andorra",
1705: "fa": "آندورا",
1706: "de": "Andorra"
1707: },
1708: "phoneCode": "376"
1709: },
1710: {
1711: "code": "LI",
1712: "name": {
1713: "en": "Liechtenstein",
1714: "fa": "لیختن‌اشتاین",
1715: "de": "Liechtenstein"
1716: },
1717: "phoneCode": "423"
1718: },
1719: {
1720: "code": "MN",
1721: "name": {
1722: "en": "Mongolia",
1723: "fa": "مغولستان",
1724: "de": "Mongolei"
1725: },
1726: "phoneCode": "976"
1727: },
1728: {
1729: "code": "KP",
1730: "name": {
1731: "en": "North Korea",
1732: "fa": "کره شمالی",
1733: "de": "Nordkorea"
1734: },
1735: "phoneCode": "850"
1736: },
1737: {
1738: "code": "MM",
1739: "name": {
1740: "en": "Myanmar",
1741: "fa": "میانمار",
1742: "de": "Myanmar"
1743: },
1744: "phoneCode": "95"
1745: },
1746: {
1747: "code": "KH",
1748: "name": {
1749: "en": "Cambodia",
1750: "fa": "کامبوج",
1751: "de": "Kambodscha"
1752: },
1753: "phoneCode": "855"
1754: },
1755: {
1756: "code": "LA",
1757: "name": {
1758: "en": "Laos",
1759: "fa": "لائوس",
1760: "de": "Laos"
1761: },
1762: "phoneCode": "856"
1763: },
1764: {
1765: "code": "BN",
1766: "name": {
1767: "en": "Brunei",
1768: "fa": "برونئی",
1769: "de": "Brunei"
1770: },
1771: "phoneCode": "673"
1772: },
1773: {
1774: "code": "TL",
1775: "name": {
1776: "en": "Timor-Leste",
1777: "fa": "تیمور شرقی",
1778: "de": "Osttimor"
1779: },
1780: "phoneCode": "670"
1781: },
1782: {
1783: "code": "TG",
1784: "name": {
1785: "en": "Togo",
1786: "fa": "توگو",
1787: "de": "Togo"
1788: },
1789: "phoneCode": "228"
1790: },
1791: {
1792: "code": "BJ",
1793: "name": {
1794: "en": "Benin",
1795: "fa": "بنین",
1796: "de": "Benin"
1797: },
1798: "phoneCode": "229"
1799: }
1800: ]
</file>
<file path="database/seeders/index.ts">
1: import 'dotenv/config';
2: import { seedCountries } from './country.seeder';
3: import { seedAddressPredefined } from '@/server/database/seeders/address-predefined.seeder';
4: export const seeders = {
5: countries: seedCountries,
6: addressPredefined: seedAddressPredefined,
7: } satisfies Record<string, () => Promise<void>>;
8: type SeederName = keyof typeof seeders;
9: async function run(names: SeederName[]) {
10: for (const name of names) {
11: console.log(`\n▶ Running seeder: ${name}`);
12: await seeders[name]();
13: }
14: }
15: async function main() {
16: const seederArg = process.argv.find((arg) => arg.startsWith('--seeder='));
17: if (seederArg) {
18: const requested = seederArg.replace('--seeder=', '').split(',') as SeederName[];
19: for (const name of requested) {
20: if (!(name in seeders)) {
21: throw new Error(
22: `Unknown seeder "${name}". Available: ${Object.keys(seeders).join(', ')}`
23: );
24: }
25: }
26: await run(requested);
27: } else {
28: await run(Object.keys(seeders) as SeederName[]);
29: }
30: process.exit(0);
31: }
32: main().catch((err) => {
33: console.error(err);
34: process.exit(1);
35: });
</file>
<file path="database/seeders/schemas.ts">
1: import { z } from 'zod';
2: export const LocalizedLabelSchema = z.record(z.string(), z.string());
</file>
<file path="database/seeders/truncate.ts">
1: import 'dotenv/config';
2: import { is, sql } from 'drizzle-orm';
3: import { PgTable, getTableConfig } from 'drizzle-orm/pg-core';
4: import { db } from '@/server/database';
5: import * as schema from '@/server/database/schemas';
6: async function truncateAll() {
7: const tables = Object.values(schema).filter((value) => is(value, PgTable)) as unknown as PgTable[];
8: if (tables.length === 0) {
9: console.log('No tables found to truncate.');
10: return;
11: }
12: const tableNames = tables.map((t) => `"${getTableConfig(t).name}"`).join(', ');
13: await db.execute(sql.raw(`TRUNCATE TABLE ${tableNames} RESTART IDENTITY CASCADE`));
14: console.log(`Truncated: ${tableNames}`);
15: }
16: async function main() {
17: await truncateAll();
18: process.exit(0);
19: }
20: main().catch((err) => {
21: console.error(err);
22: process.exit(1);
23: });
</file>
<file path="infra/postgres.ts">
1: import { drizzle } from 'drizzle-orm/node-postgres';
2: import { Pool } from 'pg';
3: import { relations } from '@/server/database/relations';
4: import {databaseConfig} from "@/config/database.config";
5: const pool = new Pool({
6: connectionString: databaseConfig.url,
7: options: `-c timezone=${databaseConfig.timezone}`,
8: });
9: export const postgres = drizzle({
10: client: pool,
11: relations,
12: });
</file>
<file path="infra/redis.ts">
1: import Redis from "ioredis";
2: import { redisConfig } from "@/config";
3: export const redis = new Redis(redisConfig.url);
</file>
<file path="services/auth/backoffice/auth.service.ts">
1: import { cookies } from 'next/headers';
2: import { verifyCredentials } from '@/server/services/auth/credentials.service';
3: import { createSession, getSession, destroySession, refreshSession } from '@/server/services/session/session.service';
4: import type { LoginInput } from '@/server/validators/auth.validator';
5: import { cookieName as LOCALE_COOKIE, isLocale, type Locale } from '@/lib/i18n/settings';
6: const SESSION_PREFIX = 'backoffice-session';
7: const SESSION_TTL_SECONDS = 60 * 60 * 24 * 7;
8: export type BackofficeSessionData = {
9: userId: string;
10: name: string;
11: email: string | null;
12: phone: string | null;
13: locale?: Locale;
14: };
15: export async function login(input: LoginInput): Promise<{ sessionId: string; user: BackofficeSessionData }> {
16: const user = await verifyCredentials(input);
17: const cookieStore = await cookies();
18: const cookieLocale = cookieStore.get(LOCALE_COOKIE)?.value;
19: const locale = isLocale(cookieLocale) ? cookieLocale : undefined;
20: const sessionData: BackofficeSessionData = {
21: userId: user.id,
22: name: user.name,
23: email: user.email,
24: phone: user.phone,
25: locale,
26: };
27: const sessionId = await createSession(SESSION_PREFIX, sessionData, SESSION_TTL_SECONDS);
28: return { sessionId, user: sessionData };
29: }
30: export async function getCurrentSession(sessionId: string | undefined | null): Promise<BackofficeSessionData | null> {
31: return getSession<BackofficeSessionData>(SESSION_PREFIX, sessionId);
32: }
33: export async function logout(sessionId: string | undefined | null): Promise<void> {
34: return destroySession(SESSION_PREFIX, sessionId);
35: }
36: export async function refreshCurrentSession(sessionId: string): Promise<void> {
37: return refreshSession(SESSION_PREFIX, sessionId, SESSION_TTL_SECONDS);
38: }
</file>
<file path="services/auth/backoffice/constants.ts">
1: export const BACKOFFICE_SESSION_COOKIE = 'backoffice_sid';
</file>
<file path="services/auth/credentials.service.ts">
1: import bcrypt from 'bcrypt';
2: import { eq, or } from 'drizzle-orm';
3: import { db } from '@/server/database';
4: import { users, type User } from '@/server/database/schemas/user.schema';
5: import { loginSchema, type LoginInput } from '@/server/validators/auth.validator';
6: export class AuthError extends Error {}
7: export async function verifyCredentials(input: LoginInput): Promise<User> {
8: const parsed = loginSchema.parse(input);
9: const conditions = [];
10: if (parsed.email) conditions.push(eq(users.email, parsed.email));
11: if (parsed.phone) conditions.push(eq(users.phone, parsed.phone));
12: const [user]: User[] = await db
13: .select()
14: .from(users)
15: .where(or(...conditions))
16: .limit(1);
17: if (!user || !user.password) {
18: throw new AuthError('invalid_credentials');
19: }
20: const passwordMatches = await bcrypt.compare(parsed.password, user.password);
21: if (!passwordMatches) {
22: throw new AuthError('invalid_credentials');
23: }
24: if (parsed.email && !user.emailVerifiedAt) {
25: throw new AuthError('email_not_verified');
26: }
27: if (parsed.phone && !user.phoneVerifiedAt) {
28: throw new AuthError('phone_not_verified');
29: }
30: return user;
31: }
</file>
<file path="services/session/session.service.ts">
1: import { randomBytes } from 'crypto';
2: import { redis } from '@/server/infra/redis';
3: const DEFAULT_TTL_SECONDS = 60 * 60 * 24 * 7;
4: function buildKey(prefix: string, sessionId: string) {
5: return `${prefix}:${sessionId}`;
6: }
7: export function generateSessionId(): string {
8: return randomBytes(32).toString('hex');
9: }
10: export async function createSession<T>(
11: prefix: string,
12: data: T,
13: ttlSeconds: number = DEFAULT_TTL_SECONDS
14: ): Promise<string> {
15: const sessionId = generateSessionId();
16: await redis.set(buildKey(prefix, sessionId), JSON.stringify(data), 'EX', ttlSeconds);
17: return sessionId;
18: }
19: export async function getSession<T>(prefix: string, sessionId: string | undefined | null): Promise<T | null> {
20: if (!sessionId) return null;
21: const raw = await redis.get(buildKey(prefix, sessionId));
22: if (!raw) return null;
23: return JSON.parse(raw) as T;
24: }
25: export async function destroySession(prefix: string, sessionId: string | undefined | null): Promise<void> {
26: if (!sessionId) return;
27: await redis.del(buildKey(prefix, sessionId));
28: }
29: export async function refreshSession(
30: prefix: string,
31: sessionId: string,
32: ttlSeconds: number = DEFAULT_TTL_SECONDS
33: ): Promise<void> {
34: await redis.expire(buildKey(prefix, sessionId), ttlSeconds);
35: }
36: export async function updateSession<T extends object>(
37: prefix: string,
38: sessionId: string | undefined | null,
39: patch: Partial<T>
40: ): Promise<T | null> {
41: if (!sessionId) return null;
42: const key = buildKey(prefix, sessionId);
43: const raw = await redis.get(key);
44: if (!raw) return null;
45: const current = JSON.parse(raw) as T;
46: const updated = { ...current, ...patch };
47: const ttl = await redis.ttl(key);
48: await redis.set(key, JSON.stringify(updated), 'EX', ttl > 0 ? ttl : DEFAULT_TTL_SECONDS);
49: return updated;
50: }
</file>
<file path="services/translation/load.ts">
1: import { promises as fs } from 'fs';
2: import path from 'path';
3: import { TranslationTree } from './types';
4: const LOCALES_DIR = path.join(process.cwd(), 'locales');
5: const cache = new Map<string, TranslationTree>();
6: export async function loadTranslations(locale: string): Promise<TranslationTree> {
7: if (cache.has(locale)) return cache.get(locale)!;
8: const filePath = path.join(LOCALES_DIR, `${locale}.json`);
9: const raw = await fs.readFile(filePath, 'utf-8');
10: const json: TranslationTree = JSON.parse(raw);
11: cache.set(locale, json);
12: return json;
13: }
14: export function invalidateCache(locale: string) {
15: cache.delete(locale);
16: }
</file>
<file path="services/translation/types.ts">
1: export type TranslationTree = { [key: string]: string | TranslationTree };
</file>
<file path="services/translation/watch.ts">
1: import { watch } from 'fs';
2: import path from 'path';
3: import { invalidateCache } from './load';
4: const LOCALES_DIR = path.join(process.cwd(), 'locales');
5: export function startTranslationWatcher() {
6: watch(LOCALES_DIR, (event, filename) => {
7: if (!filename || !filename.endsWith('.json')) return;
8: const locale = filename.replace('.json', '');
9: invalidateCache(locale);
10: });
11: }
</file>
<file path="services/upload/upload.errors.ts">
1: export class UploadNotFoundError extends Error {
2: constructor(uploadId: string) {
3: super(`Upload not found: ${uploadId}`);
4: this.name = "UploadNotFoundError";
5: }
6: }
7: export class UploadReferencedError extends Error {
8: constructor(uploadId: string) {
9: super(`Upload ${uploadId} is still referenced elsewhere and cannot be hard-deleted`);
10: this.name = "UploadReferencedError";
11: }
12: }
13: export class UploadStorageError extends Error {
14: constructor(message: string, public readonly cause?: unknown) {
15: super(message);
16: this.name = "UploadStorageError";
17: }
18: }
</file>
<file path="services/upload/upload.helpers.ts">
1: import { createHash } from "node:crypto";
2: import path from "node:path";
3: const MIME_EXTENSION_MAP: Record<string, string> = {
4: "image/jpeg": ".jpg",
5: "image/png": ".png",
6: "image/webp": ".webp",
7: "image/gif": ".gif",
8: "image/svg+xml": ".svg",
9: "application/pdf": ".pdf",
10: "application/zip": ".zip",
11: "text/plain": ".txt",
12: "text/csv": ".csv",
13: "application/json": ".json",
14: };
15: export function resolveExtension(originalName: string, mimeType: string): string {
16: const fromName = path.extname(originalName);
17: if (fromName) return fromName.toLowerCase();
18: return MIME_EXTENSION_MAP[mimeType] ?? "";
19: }
20: export function computeChecksum(buffer: Buffer): string {
21: return createHash("sha256").update(buffer).digest("hex");
22: }
23: export function buildStorageKey(uploadId: string, extension: string): string {
24: return `${uploadId}${extension}`;
25: }
</file>
<file path="services/upload/upload.service.ts">
1: import { eq } from "drizzle-orm";
2: import {
3: DeleteObjectCommand,
4: GetObjectCommand,
5: PutObjectCommand,
6: } from "@aws-sdk/client-s3";
7: import { getSignedUrl } from "@aws-sdk/s3-request-presigner";
8: import { db } from "@/server/database";
9: import { uploads, type Upload } from "@/server/database/schemas/upload.schema";
10: import { s3Client } from "@/lib/s3-client";
11: import { storageConfig } from "@/config/storage.config";
12: import {
13: UploadNotFoundError,
14: UploadReferencedError,
15: UploadStorageError,
16: } from "./upload.errors";
17: import {
18: buildStorageKey,
19: computeChecksum,
20: resolveExtension,
21: } from "./upload.helpers";
22: import type { CreateUploadInput, GetUploadUrlOptions } from "./upload.types";
23: const DEFAULT_URL_EXPIRY_SECONDS = 15 * 60;
24: const PG_FOREIGN_KEY_VIOLATION = "23503";
25: export class UploadService {
26: async create(input: CreateUploadInput): Promise<Upload> {
27: const bucket = input.bucket ?? storageConfig.defaultBucket;
28: const extension = resolveExtension(input.originalName, input.mimeType);
29: const checksum = computeChecksum(input.file);
30: const [pending] = await db
31: .insert(uploads)
32: .values({
33: bucket,
34: storageKey: "", // filled in once we know the generated id
35: checksum,
36: originalName: input.originalName,
37: mimeType: input.mimeType,
38: sizeBytes: input.file.byteLength,
39: status: "pending",
40: uploadedBy: input.uploadedBy,
41: })
42: .returning();
43: const storageKey = buildStorageKey(pending.id, extension);
44: try {
45: await s3Client.send(
46: new PutObjectCommand({
47: Bucket: bucket,
48: Key: storageKey,
49: Body: input.file,
50: ContentType: input.mimeType,
51: })
52: );
53: } catch (err) {
54: await db
55: .update(uploads)
56: .set({ status: "failed" })
57: .where(eq(uploads.id, pending.id));
58: throw new UploadStorageError(
59: `Failed to upload object for upload ${pending.id}`,
60: err
61: );
62: }
63: const [completed] = await db
64: .update(uploads)
65: .set({ storageKey, status: "completed" })
66: .where(eq(uploads.id, pending.id))
67: .returning();
68: return completed;
69: }
70: async rename(uploadId: string, newOriginalName: string): Promise<Upload> {
71: const [updated] = await db
72: .update(uploads)
73: .set({ originalName: newOriginalName })
74: .where(eq(uploads.id, uploadId))
75: .returning();
76: if (!updated) throw new UploadNotFoundError(uploadId);
77: return updated;
78: }
79: async softDelete(uploadId: string): Promise<Upload> {
80: const [updated] = await db
81: .update(uploads)
82: .set({ deletedAt: new Date() })
83: .where(eq(uploads.id, uploadId))
84: .returning();
85: if (!updated) throw new UploadNotFoundError(uploadId);
86: return updated;
87: }
88: async restore(uploadId: string): Promise<Upload> {
89: const [updated] = await db
90: .update(uploads)
91: .set({ deletedAt: null })
92: .where(eq(uploads.id, uploadId))
93: .returning();
94: if (!updated) throw new UploadNotFoundError(uploadId);
95: return updated;
96: }
97: async hardDelete(uploadId: string): Promise<void> {
98: const upload = await this.getByIdOrThrow(uploadId);
99: try {
100: await db.delete(uploads).where(eq(uploads.id, uploadId));
101: } catch (err) {
102: if (isForeignKeyViolation(err)) {
103: throw new UploadReferencedError(uploadId);
104: }
105: throw err;
106: }
107: try {
108: await s3Client.send(
109: new DeleteObjectCommand({
110: Bucket: upload.bucket,
111: Key: upload.storageKey,
112: })
113: );
114: } catch (err) {
115: throw new UploadStorageError(
116: `DB row for upload ${uploadId} was deleted, but removing the object from storage failed`,
117: err
118: );
119: }
120: }
121: async getUrl(uploadId: string, options: GetUploadUrlOptions): Promise<string> {
122: const upload = await this.getByIdOrThrow(uploadId);
123: const command = new GetObjectCommand({
124: Bucket: upload.bucket,
125: Key: upload.storageKey,
126: ResponseContentDisposition:
127: options.mode === "download"
128: ? `attachment; filename="${encodeURIComponent(upload.originalName)}"`
129: : "inline",
130: ResponseContentType: upload.mimeType,
131: });
132: return getSignedUrl(s3Client, command, {
133: expiresIn: options.expiresInSeconds ?? DEFAULT_URL_EXPIRY_SECONDS,
134: });
135: }
136: private async getByIdOrThrow(uploadId: string): Promise<Upload> {
137: const upload = await db.query.uploads.findFirst({
138: where: { id: uploadId },
139: });
140: if (!upload) throw new UploadNotFoundError(uploadId);
141: return upload;
142: }
143: }
144: function isForeignKeyViolation(err: unknown): boolean {
145: return (
146: typeof err === "object" &&
147: err !== null &&
148: "code" in err &&
149: (err as { code: unknown }).code === PG_FOREIGN_KEY_VIOLATION
150: );
151: }
152: export const uploadService = new UploadService();
</file>
<file path="services/upload/upload.types.ts">
1: export interface CreateUploadInput {
2: file: Buffer;
3: originalName: string;
4: mimeType: string;
5: uploadedBy: string;
6: bucket?: string;
7: }
8: export interface GetUploadUrlOptions {
9: mode: "read" | "download";
10: expiresInSeconds?: number;
11: }
</file>
<file path="tests/setup/db.ts">
1: import { drizzle } from 'drizzle-orm/node-postgres';
2: import { migrate } from 'drizzle-orm/node-postgres/migrator';
3: import { Pool } from 'pg';
4: import { relations } from '@/server/database/relations';
5: import {databaseConfig} from "@/config";
6: const pool = new Pool({ connectionString: databaseConfig.testUrl });
7: export const testDb = drizzle({
8: client: pool,
9: relations,
10: });
11: export async function runMigrations() {
12: await migrate(testDb, { migrationsFolder: './drizzle/migrations' });
13: }
14: export async function closeTestDb() {
15: await pool.end();
16: }
</file>
<file path="tests/setup/global.ts">
1: import { runMigrations } from './db';
2: import 'dotenv/config';
3: export default async function setup() {
4: await runMigrations();
5: }
</file>
<file path="tests/setup/reset.ts">
1: import { sql } from 'drizzle-orm';
2: import { testDb } from './db';
3: export async function resetDb() {
4: await testDb.execute(sql`TRUNCATE TABLE users RESTART IDENTITY CASCADE`);
5: }
</file>
<file path="validators/auth.validator.ts">
1: import { z } from 'zod';
2: export const loginSchema = z
3: .object({
4: email: z.email().optional(),
5: phone: z.string().min(6).optional(),
6: password: z.string().min(1, 'password_is_required'),
7: })
8: .superRefine((data, ctx) => {
9: if (!data.email && !data.phone) {
10: ctx.addIssue({
11: code: 'custom',
12: message: 'email_or_phone_is_required',
13: path: ['email'],
14: });
15: ctx.addIssue({
16: code: 'custom',
17: message: 'email_or_phone_is_required',
18: path: ['phone'],
19: });
20: }
21: });
22: export type LoginInput = z.infer<typeof loginSchema>;
</file>
</files>